xref: /titanic_51/usr/src/uts/common/io/sata/impl/sata.c (revision 84decf41e1c0970e397cc8710dfcf81db5b8c6da)
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 2007 Sun Microsystems, Inc.  All rights reserved.
24  * Use is subject to license terms.
25  */
26 
27 #pragma ident	"%Z%%M%	%I%	%E% SMI"
28 
29 /*
30  * SATA Framework
31  * Generic SATA Host Adapter Implementation
32  */
33 
34 #include <sys/conf.h>
35 #include <sys/file.h>
36 #include <sys/ddi.h>
37 #include <sys/sunddi.h>
38 #include <sys/modctl.h>
39 #include <sys/cmn_err.h>
40 #include <sys/errno.h>
41 #include <sys/thread.h>
42 #include <sys/kstat.h>
43 #include <sys/note.h>
44 #include <sys/sysevent.h>
45 #include <sys/sysevent/eventdefs.h>
46 #include <sys/sysevent/dr.h>
47 #include <sys/taskq.h>
48 
49 #include <sys/sata/impl/sata.h>
50 #include <sys/sata/sata_hba.h>
51 #include <sys/sata/sata_defs.h>
52 #include <sys/sata/sata_cfgadm.h>
53 
54 /* Debug flags - defined in sata.h */
55 int	sata_debug_flags = 0;
56 
57 /*
58  * Flags enabling selected SATA HBA framework functionality
59  */
60 #define	SATA_ENABLE_QUEUING		1
61 #define	SATA_ENABLE_NCQ			2
62 #define	SATA_ENABLE_PROCESS_EVENTS	4
63 int sata_func_enable =
64 	SATA_ENABLE_PROCESS_EVENTS | SATA_ENABLE_QUEUING | SATA_ENABLE_NCQ;
65 
66 #ifdef SATA_DEBUG
67 
68 #define	SATA_LOG_D(args)	sata_log args
69 uint64_t mbuf_count = 0;
70 uint64_t mbuffail_count = 0;
71 
72 sata_atapi_cmd_t sata_atapi_trace[64];
73 uint32_t sata_atapi_trace_index = 0;
74 int sata_atapi_trace_save = 1;
75 static	void sata_save_atapi_trace(sata_pkt_txlate_t *, int);
76 #define	SATAATAPITRACE(spx, count)	if (sata_atapi_trace_save) \
77     sata_save_atapi_trace(spx, count);
78 
79 #else
80 #define	SATA_LOG_D(arg)
81 #define	SATAATAPITRACE(spx, count)
82 #endif
83 
84 #if 0
85 static void
86 sata_test_atapi_packet_command(sata_hba_inst_t *, int);
87 #endif
88 #define	LEGACY_HWID_LEN	64	/* Model (40) + Serial (20) + pad */
89 
90 
91 /*
92  * SATA cb_ops functions
93  */
94 static 	int sata_hba_open(dev_t *, int, int, cred_t *);
95 static 	int sata_hba_close(dev_t, int, int, cred_t *);
96 static 	int sata_hba_ioctl(dev_t, int, intptr_t, int, cred_t *,	int *);
97 
98 /*
99  * SCSA required entry points
100  */
101 static	int sata_scsi_tgt_init(dev_info_t *, dev_info_t *,
102     scsi_hba_tran_t *, struct scsi_device *);
103 static	int sata_scsi_tgt_probe(struct scsi_device *,
104     int (*callback)(void));
105 static void sata_scsi_tgt_free(dev_info_t *, dev_info_t *,
106     scsi_hba_tran_t *, struct scsi_device *);
107 static 	int sata_scsi_start(struct scsi_address *, struct scsi_pkt *);
108 static 	int sata_scsi_abort(struct scsi_address *, struct scsi_pkt *);
109 static 	int sata_scsi_reset(struct scsi_address *, int);
110 static 	int sata_scsi_getcap(struct scsi_address *, char *, int);
111 static 	int sata_scsi_setcap(struct scsi_address *, char *, int, int);
112 static 	struct scsi_pkt *sata_scsi_init_pkt(struct scsi_address *,
113     struct scsi_pkt *, struct buf *, int, int, int, int, int (*)(caddr_t),
114     caddr_t);
115 static 	void sata_scsi_destroy_pkt(struct scsi_address *, struct scsi_pkt *);
116 static 	void sata_scsi_dmafree(struct scsi_address *, struct scsi_pkt *);
117 static 	void sata_scsi_sync_pkt(struct scsi_address *, struct scsi_pkt *);
118 
119 /*
120  * SATA HBA interface functions are defined in sata_hba.h header file
121  */
122 
123 /* Event processing functions */
124 static	void sata_event_daemon(void *);
125 static	void sata_event_thread_control(int);
126 static	void sata_process_controller_events(sata_hba_inst_t *sata_hba_inst);
127 static	void sata_process_device_reset(sata_hba_inst_t *, sata_address_t *);
128 static	void sata_process_port_failed_event(sata_hba_inst_t *,
129     sata_address_t *);
130 static	void sata_process_port_link_events(sata_hba_inst_t *,
131     sata_address_t *);
132 static	void sata_process_device_detached(sata_hba_inst_t *, sata_address_t *);
133 static	void sata_process_device_attached(sata_hba_inst_t *, sata_address_t *);
134 static	void sata_process_port_pwr_change(sata_hba_inst_t *, sata_address_t *);
135 static	void sata_process_cntrl_pwr_level_change(sata_hba_inst_t *);
136 static	void sata_process_target_node_cleanup(sata_hba_inst_t *,
137     sata_address_t *);
138 
139 
140 /*
141  * Local translation functions
142  */
143 static	int sata_txlt_inquiry(sata_pkt_txlate_t *);
144 static	int sata_txlt_test_unit_ready(sata_pkt_txlate_t *);
145 static	int sata_txlt_start_stop_unit(sata_pkt_txlate_t *);
146 static	int sata_txlt_read_capacity(sata_pkt_txlate_t *);
147 static	int sata_txlt_request_sense(sata_pkt_txlate_t *);
148 static 	int sata_txlt_read(sata_pkt_txlate_t *);
149 static 	int sata_txlt_write(sata_pkt_txlate_t *);
150 static 	int sata_txlt_log_sense(sata_pkt_txlate_t *);
151 static 	int sata_txlt_log_select(sata_pkt_txlate_t *);
152 static 	int sata_txlt_mode_sense(sata_pkt_txlate_t *);
153 static 	int sata_txlt_mode_select(sata_pkt_txlate_t *);
154 static 	int sata_txlt_synchronize_cache(sata_pkt_txlate_t *);
155 static 	int sata_txlt_write_buffer(sata_pkt_txlate_t *);
156 static 	int sata_txlt_nodata_cmd_immediate(sata_pkt_txlate_t *);
157 
158 static 	int sata_hba_start(sata_pkt_txlate_t *, int *);
159 static	int sata_txlt_invalid_command(sata_pkt_txlate_t *);
160 static	int sata_txlt_lba_out_of_range(sata_pkt_txlate_t *);
161 static 	void sata_txlt_rw_completion(sata_pkt_t *);
162 static 	void sata_txlt_nodata_cmd_completion(sata_pkt_t *);
163 static 	void sata_txlt_download_mcode_cmd_completion(sata_pkt_t *);
164 static 	int sata_emul_rw_completion(sata_pkt_txlate_t *);
165 static 	struct scsi_extended_sense *sata_immediate_error_response(
166     sata_pkt_txlate_t *, int);
167 static	struct scsi_extended_sense *sata_arq_sense(sata_pkt_txlate_t *);
168 
169 static 	int sata_txlt_atapi(sata_pkt_txlate_t *);
170 static 	void sata_txlt_atapi_completion(sata_pkt_t *);
171 
172 /*
173  * Local functions for ioctl
174  */
175 static	int32_t sata_get_port_num(sata_hba_inst_t *,  struct devctl_iocdata *);
176 static	void sata_cfgadm_state(sata_hba_inst_t *, int32_t,
177     devctl_ap_state_t *);
178 static	dev_info_t *sata_get_target_dip(dev_info_t *, int32_t);
179 static	dev_info_t *sata_devt_to_devinfo(dev_t);
180 
181 /*
182  * Local functions
183  */
184 static 	void sata_remove_hba_instance(dev_info_t *);
185 static 	int sata_validate_sata_hba_tran(dev_info_t *, sata_hba_tran_t *);
186 static 	void sata_probe_ports(sata_hba_inst_t *);
187 static 	int sata_reprobe_port(sata_hba_inst_t *, sata_device_t *, int);
188 static 	int sata_add_device(dev_info_t *, sata_hba_inst_t *, int cport,
189     int pmport);
190 static 	dev_info_t *sata_create_target_node(dev_info_t *, sata_hba_inst_t *,
191     sata_address_t *);
192 static 	int sata_validate_scsi_address(sata_hba_inst_t *,
193     struct scsi_address *, sata_device_t *);
194 static 	int sata_validate_sata_address(sata_hba_inst_t *, int, int, int);
195 static	sata_pkt_t *sata_pkt_alloc(sata_pkt_txlate_t *, int (*)(caddr_t));
196 static	void sata_pkt_free(sata_pkt_txlate_t *);
197 static	int sata_dma_buf_setup(sata_pkt_txlate_t *, int, int (*)(caddr_t),
198     caddr_t, ddi_dma_attr_t *);
199 static	int sata_probe_device(sata_hba_inst_t *, sata_device_t *);
200 static	sata_drive_info_t *sata_get_device_info(sata_hba_inst_t *,
201     sata_device_t *);
202 static 	int sata_identify_device(sata_hba_inst_t *, sata_drive_info_t *);
203 static	struct buf *sata_alloc_local_buffer(sata_pkt_txlate_t *, int);
204 static 	void sata_free_local_buffer(sata_pkt_txlate_t *);
205 static 	uint64_t sata_check_capacity(sata_drive_info_t *);
206 void 	sata_adjust_dma_attr(sata_drive_info_t *, ddi_dma_attr_t *,
207     ddi_dma_attr_t *);
208 static 	int sata_fetch_device_identify_data(sata_hba_inst_t *,
209     sata_drive_info_t *);
210 static	void sata_update_port_info(sata_hba_inst_t *, sata_device_t *);
211 static	void sata_update_port_scr(sata_port_scr_t *, sata_device_t *);
212 static	int sata_set_dma_mode(sata_hba_inst_t *, sata_drive_info_t *);
213 static	int sata_set_cache_mode(sata_hba_inst_t *, sata_drive_info_t *, int);
214 static	int sata_set_rmsn(sata_hba_inst_t *, sata_drive_info_t *, int);
215 static	int sata_set_drive_features(sata_hba_inst_t *,
216     sata_drive_info_t *, int flag);
217 static	void sata_init_write_cache_mode(sata_drive_info_t *sdinfo);
218 static	int sata_initialize_device(sata_hba_inst_t *, sata_drive_info_t *);
219 static	void sata_identdev_to_inquiry(sata_hba_inst_t *, sata_drive_info_t *,
220     uint8_t *);
221 static	int sata_get_atapi_inquiry_data(sata_hba_inst_t *, sata_address_t *,
222     struct scsi_inquiry *);
223 static	int sata_build_msense_page_1(sata_drive_info_t *, int, uint8_t *);
224 static	int sata_build_msense_page_8(sata_drive_info_t *, int, uint8_t *);
225 static	int sata_build_msense_page_1a(sata_drive_info_t *, int, uint8_t *);
226 static	int sata_build_msense_page_1c(sata_drive_info_t *, int, uint8_t *);
227 static	int sata_mode_select_page_8(sata_pkt_txlate_t *,
228     struct mode_cache_scsi3 *, int, int *, int *, int *);
229 static	int sata_mode_select_page_1c(sata_pkt_txlate_t *,
230     struct mode_info_excpt_page *, int, int *, int *, int *);
231 static	int sata_build_msense_page_30(sata_drive_info_t *, int, uint8_t *);
232 static	int sata_mode_select_page_30(sata_pkt_txlate_t *,
233     struct mode_acoustic_management *, int, int *, int *, int *);
234 
235 static	int sata_build_lsense_page_0(sata_drive_info_t *, uint8_t *);
236 static	int sata_build_lsense_page_10(sata_drive_info_t *, uint8_t *,
237     sata_hba_inst_t *);
238 static	int sata_build_lsense_page_2f(sata_drive_info_t *, uint8_t *,
239     sata_hba_inst_t *);
240 static	int sata_build_lsense_page_30(sata_drive_info_t *, uint8_t *,
241     sata_hba_inst_t *);
242 static	void sata_save_drive_settings(sata_drive_info_t *);
243 static	void sata_show_drive_info(sata_hba_inst_t *, sata_drive_info_t *);
244 static	void sata_log(sata_hba_inst_t *, uint_t, char *fmt, ...);
245 static	int sata_fetch_smart_return_status(sata_hba_inst_t *,
246     sata_drive_info_t *);
247 static	int sata_fetch_smart_data(sata_hba_inst_t *, sata_drive_info_t *,
248     struct smart_data *);
249 static	int sata_smart_selftest_log(sata_hba_inst_t *,
250     sata_drive_info_t *,
251     struct smart_selftest_log *);
252 static	int sata_ext_smart_selftest_read_log(sata_hba_inst_t *,
253     sata_drive_info_t *, struct smart_ext_selftest_log *, uint16_t);
254 static	int sata_smart_read_log(sata_hba_inst_t *, sata_drive_info_t *,
255     uint8_t *, uint8_t, uint8_t);
256 static	int sata_read_log_ext_directory(sata_hba_inst_t *, sata_drive_info_t *,
257     struct read_log_ext_directory *);
258 static	void sata_gen_sysevent(sata_hba_inst_t *, sata_address_t *, int);
259 static	void sata_xlate_errors(sata_pkt_txlate_t *);
260 static	void sata_decode_device_error(sata_pkt_txlate_t *,
261     struct scsi_extended_sense *);
262 static	void sata_set_device_removed(dev_info_t *);
263 static	boolean_t sata_check_device_removed(dev_info_t *);
264 static	void sata_set_target_node_cleanup(sata_hba_inst_t *, int cport);
265 static	int sata_atapi_err_ret_cmd_setup(sata_pkt_txlate_t *,
266     sata_drive_info_t *);
267 static	void sata_atapi_packet_cmd_setup(sata_cmd_t *, sata_drive_info_t *);
268 static	void sata_fixed_sense_data_preset(struct scsi_extended_sense *);
269 static  void sata_target_devid_register(dev_info_t *, sata_drive_info_t *);
270 static  int sata_check_modser(char *, int);
271 
272 
273 
274 /*
275  * SATA Framework will ignore SATA HBA driver cb_ops structure and
276  * register following one with SCSA framework.
277  * Open & close are provided, so scsi framework will not use its own
278  */
279 static struct cb_ops sata_cb_ops = {
280 	sata_hba_open,			/* open */
281 	sata_hba_close,			/* close */
282 	nodev,				/* strategy */
283 	nodev,				/* print */
284 	nodev,				/* dump */
285 	nodev,				/* read */
286 	nodev,				/* write */
287 	sata_hba_ioctl,			/* ioctl */
288 	nodev,				/* devmap */
289 	nodev,				/* mmap */
290 	nodev,				/* segmap */
291 	nochpoll,			/* chpoll */
292 	ddi_prop_op,			/* cb_prop_op */
293 	0,				/* streamtab */
294 	D_NEW | D_MP,			/* cb_flag */
295 	CB_REV,				/* rev */
296 	nodev,				/* aread */
297 	nodev				/* awrite */
298 };
299 
300 
301 extern struct mod_ops mod_miscops;
302 extern uchar_t	scsi_cdb_size[];
303 
304 static struct modlmisc modlmisc = {
305 	&mod_miscops,			/* Type of module */
306 	"SATA Module v%I%"		/* module name */
307 };
308 
309 
310 static struct modlinkage modlinkage = {
311 	MODREV_1,
312 	(void *)&modlmisc,
313 	NULL
314 };
315 
316 /*
317  * Default sata pkt timeout. Used when a target driver scsi_pkt time is zero,
318  * i.e. when scsi_pkt has not timeout specified.
319  */
320 static int sata_default_pkt_time = 60;	/* 60 seconds */
321 
322 /*
323  * Intermediate buffer device access attributes - they are required,
324  * but not necessarily used.
325  */
326 static ddi_device_acc_attr_t sata_acc_attr = {
327 	DDI_DEVICE_ATTR_V0,
328 	DDI_STRUCTURE_LE_ACC,
329 	DDI_STRICTORDER_ACC
330 };
331 
332 
333 /*
334  * Mutexes protecting structures in multithreaded operations.
335  * Because events are relatively rare, a single global mutex protecting
336  * data structures should be sufficient. To increase performance, add
337  * separate mutex per each sata port and use global mutex only to protect
338  * common data structures.
339  */
340 static	kmutex_t sata_mutex;		/* protects sata_hba_list */
341 static	kmutex_t sata_log_mutex;	/* protects log */
342 
343 static 	char sata_log_buf[256];
344 
345 /* Default write cache setting for SATA hard disks */
346 int	sata_write_cache = 1;		/* enabled */
347 
348 /* Default write cache setting for SATA ATAPI CD/DVD */
349 int 	sata_atapicdvd_write_cache = 1; /* enabled */
350 
351 /*
352  * Linked list of HBA instances
353  */
354 static 	sata_hba_inst_t *sata_hba_list = NULL;
355 static 	sata_hba_inst_t *sata_hba_list_tail = NULL;
356 /*
357  * Pointer to per-instance SATA HBA soft structure is stored in sata_hba_tran
358  * structure and in sata soft state.
359  */
360 
361 /*
362  * Event daemon related variables
363  */
364 static 	kmutex_t sata_event_mutex;
365 static 	kcondvar_t sata_event_cv;
366 static 	kthread_t *sata_event_thread = NULL;
367 static 	int sata_event_thread_terminate = 0;
368 static 	int sata_event_pending = 0;
369 static 	int sata_event_thread_active = 0;
370 extern 	pri_t minclsyspri;
371 
372 /*
373  * NCQ error recovery command
374  */
375 static const sata_cmd_t sata_rle_cmd = {
376 	SATA_CMD_REV,
377 	NULL,
378 	{
379 		SATA_DIR_READ
380 	},
381 	ATA_ADDR_LBA48,
382 	0,
383 	0,
384 	0,
385 	0,
386 	0,
387 	1,
388 	READ_LOG_EXT_NCQ_ERROR_RECOVERY,
389 	0,
390 	0,
391 	0,
392 	SATAC_READ_LOG_EXT,
393 	0,
394 	0,
395 	0,
396 };
397 
398 /*
399  * ATAPI error recovery CDB
400  */
401 static const uint8_t sata_rqsense_cdb[SATA_ATAPI_RQSENSE_CDB_LEN] = {
402 	SCMD_REQUEST_SENSE,
403 	0,			/* Only fixed RQ format is supported */
404 	0,
405 	0,
406 	SATA_ATAPI_MIN_RQSENSE_LEN, /* Less data may be returned */
407 	0
408 };
409 
410 
411 /* Warlock directives */
412 
413 _NOTE(SCHEME_PROTECTS_DATA("No Mutex Needed", scsi_hba_tran))
414 _NOTE(SCHEME_PROTECTS_DATA("No Mutex Needed", scsi_device))
415 _NOTE(SCHEME_PROTECTS_DATA("No Mutex Needed", dev_ops))
416 _NOTE(SCHEME_PROTECTS_DATA("No Mutex Needed", scsi_extended_sense))
417 _NOTE(SCHEME_PROTECTS_DATA("No Mutex Needed", scsi_arq_status))
418 _NOTE(SCHEME_PROTECTS_DATA("No Mutex Needed", ddi_dma_attr))
419 _NOTE(SCHEME_PROTECTS_DATA("No Mutex Needed", ddi_dma_cookie_t))
420 _NOTE(SCHEME_PROTECTS_DATA("No Mutex Needed", devctl_ap_state))
421 _NOTE(SCHEME_PROTECTS_DATA("No Mutex Needed", dev_info::devi_state))
422 _NOTE(MUTEX_PROTECTS_DATA(sata_mutex, sata_hba_list))
423 _NOTE(DATA_READABLE_WITHOUT_LOCK(sata_hba_list))
424 _NOTE(MUTEX_PROTECTS_DATA(sata_mutex, sata_hba_inst::satahba_next))
425 _NOTE(MUTEX_PROTECTS_DATA(sata_mutex, sata_hba_inst::satahba_prev))
426 _NOTE(SCHEME_PROTECTS_DATA("No Mutex Needed", \
427     sata_hba_inst::satahba_scsi_tran))
428 _NOTE(SCHEME_PROTECTS_DATA("No Mutex Needed", sata_hba_inst::satahba_tran))
429 _NOTE(SCHEME_PROTECTS_DATA("No Mutex Needed", sata_hba_inst::satahba_dip))
430 _NOTE(SCHEME_PROTECTS_DATA("Scheme", sata_hba_inst::satahba_attached))
431 _NOTE(DATA_READABLE_WITHOUT_LOCK(sata_hba_inst::satahba_dev_port))
432 _NOTE(MUTEX_PROTECTS_DATA(sata_hba_inst::satahba_mutex,
433     sata_hba_inst::satahba_event_flags))
434 _NOTE(MUTEX_PROTECTS_DATA(sata_cport_info::cport_mutex, \
435     sata_cport_info::cport_devp))
436 _NOTE(DATA_READABLE_WITHOUT_LOCK(sata_cport_info::cport_devp))
437 _NOTE(SCHEME_PROTECTS_DATA("Scheme", sata_cport_info::cport_addr))
438 _NOTE(MUTEX_PROTECTS_DATA(sata_cport_info::cport_mutex, \
439     sata_cport_info::cport_dev_type))
440 _NOTE(DATA_READABLE_WITHOUT_LOCK(sata_cport_info::cport_dev_type))
441 _NOTE(MUTEX_PROTECTS_DATA(sata_cport_info::cport_mutex, \
442     sata_cport_info::cport_state))
443 _NOTE(DATA_READABLE_WITHOUT_LOCK(sata_cport_info::cport_state))
444 _NOTE(DATA_READABLE_WITHOUT_LOCK(sata_pmport_info::pmport_dev_type))
445 _NOTE(DATA_READABLE_WITHOUT_LOCK(sata_pmport_info::pmport_sata_drive))
446 _NOTE(DATA_READABLE_WITHOUT_LOCK(sata_pmult_info::pmult_dev_port))
447 _NOTE(DATA_READABLE_WITHOUT_LOCK(sata_pmult_info::pmult_num_dev_ports))
448 #ifdef SATA_DEBUG
449 _NOTE(SCHEME_PROTECTS_DATA("No Mutex Needed", mbuf_count))
450 _NOTE(SCHEME_PROTECTS_DATA("No Mutex Needed", mbuffail_count))
451 _NOTE(SCHEME_PROTECTS_DATA("No Mutex Needed", sata_atapi_trace))
452 _NOTE(SCHEME_PROTECTS_DATA("No Mutex Needed", sata_atapi_trace_index))
453 #endif
454 
455 /* End of warlock directives */
456 
457 /* ************** loadable module configuration functions ************** */
458 
459 int
460 _init()
461 {
462 	int rval;
463 
464 	mutex_init(&sata_mutex, NULL, MUTEX_DRIVER, NULL);
465 	mutex_init(&sata_event_mutex, NULL, MUTEX_DRIVER, NULL);
466 	mutex_init(&sata_log_mutex, NULL, MUTEX_DRIVER, NULL);
467 	cv_init(&sata_event_cv, NULL, CV_DRIVER, NULL);
468 	if ((rval = mod_install(&modlinkage)) != 0) {
469 #ifdef SATA_DEBUG
470 		cmn_err(CE_WARN, "sata: _init: mod_install failed\n");
471 #endif
472 		mutex_destroy(&sata_log_mutex);
473 		cv_destroy(&sata_event_cv);
474 		mutex_destroy(&sata_event_mutex);
475 		mutex_destroy(&sata_mutex);
476 	}
477 	return (rval);
478 }
479 
480 int
481 _fini()
482 {
483 	int rval;
484 
485 	if ((rval = mod_remove(&modlinkage)) != 0)
486 		return (rval);
487 
488 	mutex_destroy(&sata_log_mutex);
489 	cv_destroy(&sata_event_cv);
490 	mutex_destroy(&sata_event_mutex);
491 	mutex_destroy(&sata_mutex);
492 	return (rval);
493 }
494 
495 int
496 _info(struct modinfo *modinfop)
497 {
498 	return (mod_info(&modlinkage, modinfop));
499 }
500 
501 
502 
503 /* ********************* SATA HBA entry points ********************* */
504 
505 
506 /*
507  * Called by SATA HBA from _init().
508  * Registers HBA driver instance/sata framework pair with scsi framework, by
509  * calling scsi_hba_init().
510  *
511  * SATA HBA driver cb_ops are ignored - SATA HBA framework cb_ops are used
512  * instead. SATA HBA framework cb_ops pointer overwrites SATA HBA driver
513  * cb_ops pointer in SATA HBA driver dev_ops structure.
514  * SATA HBA framework cb_ops supplies cb_open cb_close and cb_ioctl vectors.
515  *
516  * Return status of the scsi_hba_init() is returned to a calling SATA HBA
517  * driver.
518  */
519 int
520 sata_hba_init(struct modlinkage *modlp)
521 {
522 	int rval;
523 	struct dev_ops *hba_ops;
524 
525 	SATADBG1(SATA_DBG_HBA_IF, NULL,
526 	    "sata_hba_init: name %s \n",
527 	    ((struct modldrv *)(modlp->ml_linkage[0]))->drv_linkinfo);
528 	/*
529 	 * Fill-up cb_ops and dev_ops when necessary
530 	 */
531 	hba_ops = ((struct modldrv *)(modlp->ml_linkage[0]))->drv_dev_ops;
532 	/*
533 	 * Provide pointer to SATA dev_ops
534 	 */
535 	hba_ops->devo_cb_ops = &sata_cb_ops;
536 
537 	/*
538 	 * Register SATA HBA with SCSI framework
539 	 */
540 	if ((rval = scsi_hba_init(modlp)) != 0) {
541 		SATADBG1(SATA_DBG_HBA_IF, NULL,
542 		    "sata_hba_init: scsi hba init failed\n", NULL);
543 		return (rval);
544 	}
545 
546 	return (0);
547 }
548 
549 
550 /* HBA attach stages */
551 #define	HBA_ATTACH_STAGE_SATA_HBA_INST	1
552 #define	HBA_ATTACH_STAGE_SCSI_ATTACHED	2
553 #define	HBA_ATTACH_STAGE_SETUP		4
554 #define	HBA_ATTACH_STAGE_LINKED		8
555 
556 
557 /*
558  *
559  * Called from SATA HBA driver's attach routine to attach an instance of
560  * the HBA.
561  *
562  * For DDI_ATTACH command:
563  * sata_hba_inst structure is allocated here and initialized with pointers to
564  * SATA framework implementation of required scsi tran functions.
565  * The scsi_tran's tran_hba_private field is used by SATA Framework to point
566  * to the soft structure (sata_hba_inst) allocated by SATA framework for
567  * SATA HBA instance related data.
568  * The scsi_tran's tran_hba_private field is used by SATA framework to
569  * store a pointer to per-HBA-instance of sata_hba_inst structure.
570  * The sata_hba_inst structure is cross-linked to scsi tran structure.
571  * Among other info, a pointer to sata_hba_tran structure is stored in
572  * sata_hba_inst. The sata_hba_inst structures for different HBA instances are
573  * linked together into the list, pointed to by sata_hba_list.
574  * On the first HBA instance attach the sata event thread is initialized.
575  * Attachment points are created for all SATA ports of the HBA being attached.
576  * All HBA instance's SATA ports are probed and type of plugged devices is
577  * determined. For each device of a supported type, a target node is created.
578  *
579  * DDI_SUCCESS is returned when attachment process is successful,
580  * DDI_FAILURE is returned otherwise.
581  *
582  * For DDI_RESUME command:
583  * Not implemented at this time (postponed until phase 2 of the development).
584  */
585 int
586 sata_hba_attach(dev_info_t *dip, sata_hba_tran_t *sata_tran,
587     ddi_attach_cmd_t cmd)
588 {
589 	sata_hba_inst_t	*sata_hba_inst;
590 	scsi_hba_tran_t *scsi_tran = NULL;
591 	int hba_attach_state = 0;
592 	char taskq_name[MAXPATHLEN];
593 
594 	SATADBG3(SATA_DBG_HBA_IF, NULL,
595 	    "sata_hba_attach: node %s (%s%d)\n",
596 	    ddi_node_name(dip), ddi_driver_name(dip),
597 	    ddi_get_instance(dip));
598 
599 	if (cmd == DDI_RESUME) {
600 		/*
601 		 * Postponed until phase 2 of the development
602 		 */
603 		return (DDI_FAILURE);
604 	}
605 
606 	if (cmd != DDI_ATTACH) {
607 		return (DDI_FAILURE);
608 	}
609 
610 	/* cmd == DDI_ATTACH */
611 
612 	if (sata_validate_sata_hba_tran(dip, sata_tran) != SATA_SUCCESS) {
613 		SATA_LOG_D((NULL, CE_WARN,
614 		    "sata_hba_attach: invalid sata_hba_tran"));
615 		return (DDI_FAILURE);
616 	}
617 	/*
618 	 * Allocate and initialize SCSI tran structure.
619 	 * SATA copy of tran_bus_config is provided to create port nodes.
620 	 */
621 	scsi_tran = scsi_hba_tran_alloc(dip, SCSI_HBA_CANSLEEP);
622 	if (scsi_tran == NULL)
623 		return (DDI_FAILURE);
624 	/*
625 	 * Allocate soft structure for SATA HBA instance.
626 	 * There is a separate softstate for each HBA instance.
627 	 */
628 	sata_hba_inst = kmem_zalloc(sizeof (struct sata_hba_inst), KM_SLEEP);
629 	ASSERT(sata_hba_inst != NULL); /* this should not fail */
630 	mutex_init(&sata_hba_inst->satahba_mutex, NULL, MUTEX_DRIVER, NULL);
631 	hba_attach_state |= HBA_ATTACH_STAGE_SATA_HBA_INST;
632 
633 	/*
634 	 * scsi_trans's tran_hba_private is used by SATA Framework to point to
635 	 * soft structure allocated by SATA framework for
636 	 * SATA HBA instance related data.
637 	 */
638 	scsi_tran->tran_hba_private	= sata_hba_inst;
639 	scsi_tran->tran_tgt_private	= NULL;
640 
641 	scsi_tran->tran_tgt_init	= sata_scsi_tgt_init;
642 	scsi_tran->tran_tgt_probe	= sata_scsi_tgt_probe;
643 	scsi_tran->tran_tgt_free	= sata_scsi_tgt_free;
644 
645 	scsi_tran->tran_start		= sata_scsi_start;
646 	scsi_tran->tran_reset		= sata_scsi_reset;
647 	scsi_tran->tran_abort		= sata_scsi_abort;
648 	scsi_tran->tran_getcap		= sata_scsi_getcap;
649 	scsi_tran->tran_setcap		= sata_scsi_setcap;
650 	scsi_tran->tran_init_pkt	= sata_scsi_init_pkt;
651 	scsi_tran->tran_destroy_pkt	= sata_scsi_destroy_pkt;
652 
653 	scsi_tran->tran_dmafree		= sata_scsi_dmafree;
654 	scsi_tran->tran_sync_pkt	= sata_scsi_sync_pkt;
655 
656 	scsi_tran->tran_reset_notify	= NULL;
657 	scsi_tran->tran_get_bus_addr	= NULL;
658 	scsi_tran->tran_quiesce		= NULL;
659 	scsi_tran->tran_unquiesce	= NULL;
660 	scsi_tran->tran_bus_reset	= NULL;
661 
662 	if (scsi_hba_attach_setup(dip, sata_tran->sata_tran_hba_dma_attr,
663 	    scsi_tran, 0) != DDI_SUCCESS) {
664 #ifdef SATA_DEBUG
665 		cmn_err(CE_WARN, "?SATA: %s%d hba scsi attach failed",
666 		    ddi_driver_name(dip), ddi_get_instance(dip));
667 #endif
668 		goto fail;
669 	}
670 	hba_attach_state |= HBA_ATTACH_STAGE_SCSI_ATTACHED;
671 
672 	if (!ddi_prop_exists(DDI_DEV_T_ANY, dip, DDI_PROP_DONTPASS, "sata")) {
673 		if (ddi_prop_update_int(DDI_DEV_T_NONE, dip,
674 		    "sata", 1) != DDI_PROP_SUCCESS) {
675 			SATA_LOG_D((NULL, CE_WARN, "sata_hba_attach: "
676 			    "failed to create hba sata prop"));
677 			goto fail;
678 		}
679 	}
680 
681 	/*
682 	 * Save pointers in hba instance soft state.
683 	 */
684 	sata_hba_inst->satahba_scsi_tran = scsi_tran;
685 	sata_hba_inst->satahba_tran = sata_tran;
686 	sata_hba_inst->satahba_dip = dip;
687 
688 	/*
689 	 * Create a task queue to handle emulated commands completion
690 	 * Use node name, dash, instance number as the queue name.
691 	 */
692 	taskq_name[0] = '\0';
693 	(void) strlcat(taskq_name, DEVI(dip)->devi_node_name,
694 	    sizeof (taskq_name));
695 	(void) snprintf(taskq_name + strlen(taskq_name),
696 	    sizeof (taskq_name) - strlen(taskq_name),
697 	    "-%d", DEVI(dip)->devi_instance);
698 	sata_hba_inst->satahba_taskq = taskq_create(taskq_name, 1,
699 	    minclsyspri, 1, sata_tran->sata_tran_hba_num_cports,
700 	    TASKQ_DYNAMIC);
701 
702 	hba_attach_state |= HBA_ATTACH_STAGE_SETUP;
703 
704 	/*
705 	 * Create events thread if not created yet.
706 	 */
707 	sata_event_thread_control(1);
708 
709 	/*
710 	 * Link this hba instance into the list.
711 	 */
712 	mutex_enter(&sata_mutex);
713 
714 
715 	sata_hba_inst->satahba_next = NULL;
716 	sata_hba_inst->satahba_prev = sata_hba_list_tail;
717 	if (sata_hba_list == NULL) {
718 		sata_hba_list = sata_hba_inst;
719 	}
720 	if (sata_hba_list_tail != NULL) {
721 		sata_hba_list_tail->satahba_next = sata_hba_inst;
722 	}
723 	sata_hba_list_tail = sata_hba_inst;
724 	mutex_exit(&sata_mutex);
725 	hba_attach_state |= HBA_ATTACH_STAGE_LINKED;
726 
727 	/*
728 	 * Create SATA HBA devctl minor node for sata_hba_open, close, ioctl
729 	 * SATA HBA driver should not use its own open/close entry points.
730 	 *
731 	 * Make sure that instance number doesn't overflow
732 	 * when forming minor numbers.
733 	 */
734 	ASSERT(ddi_get_instance(dip) <= (L_MAXMIN >> INST_MINOR_SHIFT));
735 	if (ddi_create_minor_node(dip, "devctl", S_IFCHR,
736 	    INST2DEVCTL(ddi_get_instance(dip)),
737 	    DDI_NT_SATA_NEXUS, 0) != DDI_SUCCESS) {
738 #ifdef SATA_DEBUG
739 		cmn_err(CE_WARN, "sata_hba_attach: "
740 		    "cannot create devctl minor node");
741 #endif
742 		goto fail;
743 	}
744 
745 
746 	/*
747 	 * Set-up kstats here, if necessary.
748 	 * (postponed until phase 2 of the development).
749 	 */
750 
751 
752 	/*
753 	 * Probe controller ports. This operation will describe a current
754 	 * controller/port/multipliers/device configuration and will create
755 	 * attachment points.
756 	 * We may end-up with just a controller with no devices attached.
757 	 * For the ports with a supported device attached, device target nodes
758 	 * are created and devices are initialized.
759 	 */
760 	sata_probe_ports(sata_hba_inst);
761 
762 	sata_hba_inst->satahba_attached = 1;
763 	return (DDI_SUCCESS);
764 
765 fail:
766 	if (hba_attach_state & HBA_ATTACH_STAGE_LINKED) {
767 		(void) sata_remove_hba_instance(dip);
768 		if (sata_hba_list == NULL)
769 			sata_event_thread_control(0);
770 	}
771 
772 	if (hba_attach_state & HBA_ATTACH_STAGE_SETUP) {
773 		(void) ddi_prop_remove(DDI_DEV_T_ANY, dip, "sata");
774 		taskq_destroy(sata_hba_inst->satahba_taskq);
775 	}
776 
777 	if (hba_attach_state & HBA_ATTACH_STAGE_SCSI_ATTACHED)
778 		(void) scsi_hba_detach(dip);
779 
780 	if (hba_attach_state & HBA_ATTACH_STAGE_SATA_HBA_INST) {
781 		mutex_destroy(&sata_hba_inst->satahba_mutex);
782 		kmem_free((void *)sata_hba_inst,
783 		    sizeof (struct sata_hba_inst));
784 		scsi_hba_tran_free(scsi_tran);
785 	}
786 
787 	sata_log(NULL, CE_WARN, "?SATA: %s%d hba attach failed",
788 	    ddi_driver_name(dip), ddi_get_instance(dip));
789 
790 	return (DDI_FAILURE);
791 }
792 
793 
794 /*
795  * Called by SATA HBA from to detach an instance of the driver.
796  *
797  * For DDI_DETACH command:
798  * Free local structures allocated for SATA HBA instance during
799  * sata_hba_attach processing.
800  *
801  * Returns DDI_SUCCESS when HBA was detached, DDI_FAILURE otherwise.
802  *
803  * For DDI_SUSPEND command:
804  * Not implemented at this time (postponed until phase 2 of the development)
805  * Returnd DDI_SUCCESS.
806  *
807  * When the last HBA instance is detached, the event daemon is terminated.
808  *
809  * NOTE: cport support only, no port multiplier support.
810  */
811 int
812 sata_hba_detach(dev_info_t *dip, ddi_detach_cmd_t cmd)
813 {
814 	dev_info_t	*tdip;
815 	sata_hba_inst_t	*sata_hba_inst;
816 	scsi_hba_tran_t *scsi_hba_tran;
817 	sata_cport_info_t *cportinfo;
818 	sata_drive_info_t *sdinfo;
819 	int ncport;
820 
821 	SATADBG3(SATA_DBG_HBA_IF, NULL, "sata_hba_detach: node %s (%s%d)\n",
822 	    ddi_node_name(dip), ddi_driver_name(dip), ddi_get_instance(dip));
823 
824 	switch (cmd) {
825 	case DDI_DETACH:
826 
827 		if ((scsi_hba_tran = ddi_get_driver_private(dip)) == NULL)
828 			return (DDI_FAILURE);
829 
830 		sata_hba_inst = scsi_hba_tran->tran_hba_private;
831 		if (sata_hba_inst == NULL)
832 			return (DDI_FAILURE);
833 
834 		if (scsi_hba_detach(dip) == DDI_FAILURE) {
835 			sata_hba_inst->satahba_attached = 1;
836 			return (DDI_FAILURE);
837 		}
838 
839 		/*
840 		 * Free all target nodes - at this point
841 		 * devices should be at least offlined
842 		 * otherwise scsi_hba_detach() should not be called.
843 		 */
844 		for (ncport = 0; ncport < SATA_NUM_CPORTS(sata_hba_inst);
845 		    ncport++) {
846 			cportinfo = SATA_CPORT_INFO(sata_hba_inst, ncport);
847 			if (cportinfo->cport_dev_type != SATA_DTYPE_PMULT) {
848 				sdinfo = SATA_CPORTINFO_DRV_INFO(cportinfo);
849 				if (sdinfo != NULL) {
850 					tdip = sata_get_target_dip(dip,
851 					    ncport);
852 					if (tdip != NULL) {
853 						if (ndi_devi_offline(tdip,
854 						    NDI_DEVI_REMOVE) !=
855 						    NDI_SUCCESS) {
856 							SATA_LOG_D((
857 							    sata_hba_inst,
858 							    CE_WARN,
859 							    "sata_hba_detach: "
860 							    "Target node not "
861 							    "removed !"));
862 							return (DDI_FAILURE);
863 						}
864 					}
865 				}
866 			}
867 		}
868 		/*
869 		 * Disable sata event daemon processing for this HBA
870 		 */
871 		sata_hba_inst->satahba_attached = 0;
872 
873 		/*
874 		 * Remove event daemon thread, if it is last HBA instance.
875 		 */
876 
877 		mutex_enter(&sata_mutex);
878 		if (sata_hba_list->satahba_next == NULL) {
879 			mutex_exit(&sata_mutex);
880 			sata_event_thread_control(0);
881 			mutex_enter(&sata_mutex);
882 		}
883 		mutex_exit(&sata_mutex);
884 
885 		/* Remove this HBA instance from the HBA list */
886 		sata_remove_hba_instance(dip);
887 
888 		/*
889 		 * At this point there should be no target nodes attached.
890 		 * Detach and destroy device and port info structures.
891 		 */
892 		for (ncport = 0; ncport < SATA_NUM_CPORTS(sata_hba_inst);
893 		    ncport++) {
894 			cportinfo = SATA_CPORT_INFO(sata_hba_inst, ncport);
895 			if (cportinfo->cport_dev_type != SATA_DTYPE_PMULT) {
896 				sdinfo =
897 				    cportinfo->cport_devp.cport_sata_drive;
898 				if (sdinfo != NULL) {
899 					/* Release device structure */
900 					kmem_free(sdinfo,
901 					    sizeof (sata_drive_info_t));
902 				}
903 				/* Release cport info */
904 				mutex_destroy(&cportinfo->cport_mutex);
905 				kmem_free(cportinfo,
906 				    sizeof (sata_cport_info_t));
907 			}
908 		}
909 
910 		scsi_hba_tran_free(sata_hba_inst->satahba_scsi_tran);
911 
912 		(void) ddi_prop_remove(DDI_DEV_T_ANY, dip, "sata");
913 
914 		taskq_destroy(sata_hba_inst->satahba_taskq);
915 
916 		mutex_destroy(&sata_hba_inst->satahba_mutex);
917 		kmem_free((void *)sata_hba_inst,
918 		    sizeof (struct sata_hba_inst));
919 
920 		return (DDI_SUCCESS);
921 
922 	case DDI_SUSPEND:
923 		/*
924 		 * Postponed until phase 2
925 		 */
926 		return (DDI_FAILURE);
927 
928 	default:
929 		return (DDI_FAILURE);
930 	}
931 }
932 
933 
934 /*
935  * Called by an HBA drive from _fini() routine.
936  * Unregisters SATA HBA instance/SATA framework pair from the scsi framework.
937  */
938 void
939 sata_hba_fini(struct modlinkage *modlp)
940 {
941 	SATADBG1(SATA_DBG_HBA_IF, NULL,
942 	    "sata_hba_fini: name %s\n",
943 	    ((struct modldrv *)(modlp->ml_linkage[0]))->drv_linkinfo);
944 
945 	scsi_hba_fini(modlp);
946 }
947 
948 
949 /*
950  * Default open and close routine for sata_hba framework.
951  *
952  */
953 /*
954  * Open devctl node.
955  *
956  * Returns:
957  * 0 if node was open successfully, error code otherwise.
958  *
959  *
960  */
961 
962 static int
963 sata_hba_open(dev_t *devp, int flags, int otyp, cred_t *credp)
964 {
965 #ifndef __lock_lint
966 	_NOTE(ARGUNUSED(credp))
967 #endif
968 	int rv = 0;
969 	dev_info_t *dip;
970 	scsi_hba_tran_t *scsi_hba_tran;
971 	sata_hba_inst_t	*sata_hba_inst;
972 
973 	SATADBG1(SATA_DBG_IOCTL_IF, NULL, "sata_hba_open: entered", NULL);
974 
975 	if (otyp != OTYP_CHR)
976 		return (EINVAL);
977 
978 	dip = sata_devt_to_devinfo(*devp);
979 	if (dip == NULL)
980 		return (ENXIO);
981 
982 	if ((scsi_hba_tran = ddi_get_driver_private(dip)) == NULL)
983 		return (ENXIO);
984 
985 	sata_hba_inst = scsi_hba_tran->tran_hba_private;
986 	if (sata_hba_inst == NULL || sata_hba_inst->satahba_attached == 0)
987 		return (ENXIO);
988 
989 	mutex_enter(&sata_mutex);
990 	if (flags & FEXCL) {
991 		if (sata_hba_inst->satahba_open_flag != 0) {
992 			rv = EBUSY;
993 		} else {
994 			sata_hba_inst->satahba_open_flag =
995 			    SATA_DEVCTL_EXOPENED;
996 		}
997 	} else {
998 		if (sata_hba_inst->satahba_open_flag == SATA_DEVCTL_EXOPENED) {
999 			rv = EBUSY;
1000 		} else {
1001 			sata_hba_inst->satahba_open_flag =
1002 			    SATA_DEVCTL_SOPENED;
1003 		}
1004 	}
1005 	mutex_exit(&sata_mutex);
1006 
1007 	return (rv);
1008 }
1009 
1010 
1011 /*
1012  * Close devctl node.
1013  * Returns:
1014  * 0 if node was closed successfully, error code otherwise.
1015  *
1016  */
1017 
1018 static int
1019 sata_hba_close(dev_t dev, int flag, int otyp, cred_t *credp)
1020 {
1021 #ifndef __lock_lint
1022 	_NOTE(ARGUNUSED(credp))
1023 	_NOTE(ARGUNUSED(flag))
1024 #endif
1025 	dev_info_t *dip;
1026 	scsi_hba_tran_t *scsi_hba_tran;
1027 	sata_hba_inst_t	*sata_hba_inst;
1028 
1029 	SATADBG1(SATA_DBG_IOCTL_IF, NULL, "sata_hba_close: entered", NULL);
1030 
1031 	if (otyp != OTYP_CHR)
1032 		return (EINVAL);
1033 
1034 	dip = sata_devt_to_devinfo(dev);
1035 	if (dip == NULL)
1036 		return (ENXIO);
1037 
1038 	if ((scsi_hba_tran = ddi_get_driver_private(dip)) == NULL)
1039 		return (ENXIO);
1040 
1041 	sata_hba_inst = scsi_hba_tran->tran_hba_private;
1042 	if (sata_hba_inst == NULL || sata_hba_inst->satahba_attached == 0)
1043 		return (ENXIO);
1044 
1045 	mutex_enter(&sata_mutex);
1046 	sata_hba_inst->satahba_open_flag = 0;
1047 	mutex_exit(&sata_mutex);
1048 	return (0);
1049 }
1050 
1051 
1052 
1053 /*
1054  * Standard IOCTL commands for SATA hotplugging.
1055  * Implemented DEVCTL_AP commands:
1056  * DEVCTL_AP_CONNECT
1057  * DEVCTL_AP_DISCONNECT
1058  * DEVCTL_AP_CONFIGURE
1059  * DEVCTL_UNCONFIGURE
1060  * DEVCTL_AP_CONTROL
1061  *
1062  * Commands passed to default ndi ioctl handler:
1063  * DEVCTL_DEVICE_GETSTATE
1064  * DEVCTL_DEVICE_ONLINE
1065  * DEVCTL_DEVICE_OFFLINE
1066  * DEVCTL_DEVICE_REMOVE
1067  * DEVCTL_DEVICE_INSERT
1068  * DEVCTL_BUS_GETSTATE
1069  *
1070  * All other cmds are passed to HBA if it provide ioctl handler, or failed
1071  * if not.
1072  *
1073  * Returns:
1074  * 0 if successful,
1075  * error code if operation failed.
1076  *
1077  * NOTE: Port Multiplier is not supported.
1078  *
1079  */
1080 
1081 static int
1082 sata_hba_ioctl(dev_t dev, int cmd, intptr_t arg, int mode, cred_t *credp,
1083     int *rvalp)
1084 {
1085 #ifndef __lock_lint
1086 	_NOTE(ARGUNUSED(credp))
1087 	_NOTE(ARGUNUSED(rvalp))
1088 #endif
1089 	int rv = 0;
1090 	int32_t	comp_port = -1;
1091 	dev_info_t *dip, *tdip;
1092 	devctl_ap_state_t ap_state;
1093 	struct devctl_iocdata *dcp = NULL;
1094 	scsi_hba_tran_t *scsi_hba_tran;
1095 	sata_hba_inst_t *sata_hba_inst;
1096 	sata_device_t sata_device;
1097 	sata_drive_info_t *sdinfo;
1098 	sata_cport_info_t *cportinfo;
1099 	int cport, pmport, qual;
1100 	int rval = SATA_SUCCESS;
1101 
1102 	dip = sata_devt_to_devinfo(dev);
1103 	if (dip == NULL)
1104 		return (ENXIO);
1105 
1106 	if ((scsi_hba_tran = ddi_get_driver_private(dip)) == NULL)
1107 		return (ENXIO);
1108 
1109 	sata_hba_inst = scsi_hba_tran->tran_hba_private;
1110 	if (sata_hba_inst == NULL)
1111 		return (ENXIO);
1112 
1113 	if (sata_hba_inst->satahba_tran == NULL)
1114 		return (ENXIO);
1115 
1116 	switch (cmd) {
1117 
1118 	case DEVCTL_DEVICE_GETSTATE:
1119 	case DEVCTL_DEVICE_ONLINE:
1120 	case DEVCTL_DEVICE_OFFLINE:
1121 	case DEVCTL_DEVICE_REMOVE:
1122 	case DEVCTL_BUS_GETSTATE:
1123 		/*
1124 		 * There may be more cases that we want to pass to default
1125 		 * handler rather than fail them.
1126 		 */
1127 		return (ndi_devctl_ioctl(dip, cmd, arg, mode, 0));
1128 	}
1129 
1130 	/* read devctl ioctl data */
1131 	if (cmd != DEVCTL_AP_CONTROL) {
1132 		if (ndi_dc_allochdl((void *)arg, &dcp) != NDI_SUCCESS)
1133 			return (EFAULT);
1134 
1135 		if ((comp_port = sata_get_port_num(sata_hba_inst, dcp)) ==
1136 		    -1) {
1137 			if (dcp)
1138 				ndi_dc_freehdl(dcp);
1139 			return (EINVAL);
1140 		}
1141 
1142 		cport = SCSI_TO_SATA_CPORT(comp_port);
1143 		pmport = SCSI_TO_SATA_PMPORT(comp_port);
1144 		/* Only cport is considered now, i.e. SATA_ADDR_CPORT */
1145 		qual = SATA_ADDR_CPORT;
1146 		if (sata_validate_sata_address(sata_hba_inst, cport, pmport,
1147 		    qual) != 0) {
1148 			ndi_dc_freehdl(dcp);
1149 			return (EINVAL);
1150 		}
1151 
1152 		cportinfo = SATA_CPORT_INFO(sata_hba_inst, cport);
1153 		mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, cport)->
1154 		    cport_mutex);
1155 		if (cportinfo->cport_event_flags & SATA_EVNT_LOCK_PORT_BUSY) {
1156 			/*
1157 			 * Cannot process ioctl request now. Come back later.
1158 			 */
1159 			mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, cport)->
1160 			    cport_mutex);
1161 			ndi_dc_freehdl(dcp);
1162 			return (EBUSY);
1163 		}
1164 		/* Block event processing for this port */
1165 		cportinfo->cport_event_flags |= SATA_APCTL_LOCK_PORT_BUSY;
1166 		mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, cport)->cport_mutex);
1167 
1168 		sata_device.satadev_addr.cport = cport;
1169 		sata_device.satadev_addr.pmport = pmport;
1170 		sata_device.satadev_addr.qual = SATA_ADDR_CPORT;
1171 		sata_device.satadev_rev = SATA_DEVICE_REV;
1172 	}
1173 
1174 	switch (cmd) {
1175 
1176 	case DEVCTL_AP_DISCONNECT:
1177 		/*
1178 		 * Normally, cfgadm sata plugin will try to offline
1179 		 * (unconfigure) device before this request. Nevertheless,
1180 		 * if a device is still configured, we need to
1181 		 * attempt to offline and unconfigure device first, and we will
1182 		 * deactivate the port regardless of the unconfigure
1183 		 * operation results.
1184 		 *
1185 		 * DEVCTL_AP_DISCONNECT invokes
1186 		 * sata_hba_inst->satahba_tran->
1187 		 * sata_tran_hotplug_ops->sata_tran_port_deactivate().
1188 		 * If successful, the device structure (if any) attached
1189 		 * to a port is removed and state of the port marked
1190 		 * appropriately.
1191 		 * Failure of the port_deactivate may keep port in
1192 		 * the active state, or may fail the port.
1193 		 */
1194 
1195 		/* Check the current state of the port */
1196 		rval = (*SATA_PROBE_PORT_FUNC(sata_hba_inst))
1197 		    (dip, &sata_device);
1198 		mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, cport)->
1199 		    cport_mutex);
1200 		sata_update_port_info(sata_hba_inst, &sata_device);
1201 		if (rval != SATA_SUCCESS ||
1202 		    (sata_device.satadev_state & SATA_PSTATE_FAILED)) {
1203 			cportinfo->cport_state = SATA_PSTATE_FAILED;
1204 			mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, cport)->
1205 			    cport_mutex);
1206 			rv = EIO;
1207 			break;
1208 		}
1209 		/* Sanity check */
1210 		if (SATA_PORT_DEACTIVATE_FUNC(sata_hba_inst) == NULL) {
1211 			mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, cport)->
1212 			    cport_mutex);
1213 			/* No physical port deactivation supported. */
1214 			break;
1215 		}
1216 
1217 		/*
1218 		 * set port's dev_state to not ready - this will disable
1219 		 * an access to an attached device.
1220 		 */
1221 		cportinfo->cport_state &= ~SATA_STATE_READY;
1222 
1223 		if (cportinfo->cport_dev_type != SATA_DTYPE_NONE) {
1224 			sdinfo = cportinfo->cport_devp.cport_sata_drive;
1225 			ASSERT(sdinfo != NULL);
1226 			if ((sdinfo->satadrv_type &
1227 			    (SATA_VALID_DEV_TYPE))) {
1228 				/*
1229 				 * If a target node exists, try to offline
1230 				 * a device and remove target node.
1231 				 */
1232 				mutex_exit(&SATA_CPORT_INFO(sata_hba_inst,
1233 				    cport)->cport_mutex);
1234 				tdip = sata_get_target_dip(dip, comp_port);
1235 				if (tdip != NULL && ndi_devi_offline(tdip,
1236 				    NDI_DEVI_REMOVE) != NDI_SUCCESS) {
1237 					/*
1238 					 * Problem
1239 					 * A target node remained
1240 					 * attached. This happens when
1241 					 * the file was open or a node
1242 					 * was waiting for resources.
1243 					 * Cannot do anything about it.
1244 					 */
1245 					SATA_LOG_D((sata_hba_inst, CE_WARN,
1246 					    "sata_hba_ioctl: "
1247 					    "disconnect: could not "
1248 					    "unconfigure device before "
1249 					    "disconnecting the SATA "
1250 					    "port %d", cport));
1251 
1252 					/*
1253 					 * Set DEVICE REMOVED state
1254 					 * in the target node. It
1255 					 * will prevent access to
1256 					 * the device even when a
1257 					 * new device is attached,
1258 					 * until the old target node
1259 					 * is released, removed and
1260 					 * recreated for a new
1261 					 * device.
1262 					 */
1263 					sata_set_device_removed(tdip);
1264 					/*
1265 					 * Instruct event daemon to
1266 					 * try the target node cleanup
1267 					 * later.
1268 					 */
1269 					sata_set_target_node_cleanup(
1270 					    sata_hba_inst, cport);
1271 				}
1272 				mutex_enter(&SATA_CPORT_INFO(sata_hba_inst,
1273 				    cport)->cport_mutex);
1274 				/*
1275 				 * Remove and release sata_drive_info
1276 				 * structure.
1277 				 */
1278 				if (SATA_CPORTINFO_DRV_INFO(cportinfo) !=
1279 				    NULL) {
1280 					SATA_CPORTINFO_DRV_INFO(cportinfo) =
1281 					    NULL;
1282 					(void) kmem_free((void *)sdinfo,
1283 					    sizeof (sata_drive_info_t));
1284 					cportinfo->cport_dev_type =
1285 					    SATA_DTYPE_NONE;
1286 				}
1287 			}
1288 			/*
1289 			 * Note: PMult info requires different handling.
1290 			 * Put PMult handling code here, when PMult is
1291 			 * supported.
1292 			 */
1293 
1294 		}
1295 		mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, cport)->cport_mutex);
1296 		/* Just ask HBA driver to deactivate port */
1297 		sata_device.satadev_addr.qual = SATA_ADDR_DCPORT;
1298 
1299 		rval = (*SATA_PORT_DEACTIVATE_FUNC(sata_hba_inst))
1300 		    (dip, &sata_device);
1301 
1302 		/*
1303 		 * Generate sysevent - EC_DR / ESC_DR_AP_STATE_CHANGE
1304 		 * without the hint.
1305 		 */
1306 		sata_gen_sysevent(sata_hba_inst,
1307 		    &sata_device.satadev_addr, SE_NO_HINT);
1308 
1309 		mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, cport)->
1310 		    cport_mutex);
1311 		sata_update_port_info(sata_hba_inst, &sata_device);
1312 
1313 		if (rval != SATA_SUCCESS) {
1314 			/*
1315 			 * Port deactivation failure - do not
1316 			 * change port state unless the state
1317 			 * returned by HBA indicates a port failure.
1318 			 */
1319 			if (sata_device.satadev_state & SATA_PSTATE_FAILED)
1320 				cportinfo->cport_state = SATA_PSTATE_FAILED;
1321 			rv = EIO;
1322 		} else {
1323 			/*
1324 			 * Deactivation succeded. From now on the framework
1325 			 * will not know what is happening to the device, until
1326 			 * the port is activated again.
1327 			 */
1328 			cportinfo->cport_state |= SATA_PSTATE_SHUTDOWN;
1329 		}
1330 		mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, cport)->cport_mutex);
1331 		break;
1332 
1333 	case DEVCTL_AP_UNCONFIGURE:
1334 
1335 		/*
1336 		 * The unconfigure operation uses generic nexus operation to
1337 		 * offline a device. It leaves a target device node attached.
1338 		 * and obviously sata_drive_info attached as well, because
1339 		 * from the hardware point of view nothing has changed.
1340 		 */
1341 		if ((tdip = sata_get_target_dip(dip, comp_port)) != NULL) {
1342 
1343 			if (ndi_devi_offline(tdip, NDI_UNCONFIG) !=
1344 			    NDI_SUCCESS) {
1345 				SATA_LOG_D((sata_hba_inst, CE_WARN,
1346 				    "sata_hba_ioctl: unconfigure: "
1347 				    "failed to unconfigure "
1348 				    "device at SATA port %d", cport));
1349 				rv = EIO;
1350 			}
1351 			/*
1352 			 * The target node devi_state should be marked with
1353 			 * DEVI_DEVICE_OFFLINE by ndi_devi_offline().
1354 			 * This would be the indication for cfgadm that
1355 			 * the AP node occupant state is 'unconfigured'.
1356 			 */
1357 
1358 		} else {
1359 			/*
1360 			 * This would indicate a failure on the part of cfgadm
1361 			 * to detect correct state of the node prior to this
1362 			 * call - one cannot unconfigure non-existing device.
1363 			 */
1364 			SATA_LOG_D((sata_hba_inst, CE_WARN,
1365 			    "sata_hba_ioctl: unconfigure: "
1366 			    "attempt to unconfigure non-existing device "
1367 			    "at SATA port %d", cport));
1368 			rv = ENXIO;
1369 		}
1370 
1371 		break;
1372 
1373 	case DEVCTL_AP_CONNECT:
1374 	{
1375 		/*
1376 		 * The sata cfgadm pluging will invoke this operation only if
1377 		 * port was found in the disconnect state (failed state
1378 		 * is also treated as the disconnected state).
1379 		 * DEVCTL_AP_CONNECT would invoke
1380 		 * sata_hba_inst->satahba_tran->
1381 		 * sata_tran_hotplug_ops->sata_tran_port_activate().
1382 		 * If successful and a device is found attached to the port,
1383 		 * the initialization sequence is executed to attach
1384 		 * a device structure to a port structure. The device is not
1385 		 * set in configured state (system-wise) by this operation.
1386 		 * The state of the port and a device would be set
1387 		 * appropriately.
1388 		 *
1389 		 * Note, that activating the port may generate link events,
1390 		 * so is is important that following processing and the
1391 		 * event processing does not interfere with each other!
1392 		 *
1393 		 * This operation may remove port failed state and will
1394 		 * try to make port active and in good standing.
1395 		 */
1396 
1397 		/* We only care about host sata cport for now */
1398 
1399 		if (SATA_PORT_ACTIVATE_FUNC(sata_hba_inst) != NULL) {
1400 			/* Just let HBA driver to activate port */
1401 
1402 			if ((*SATA_PORT_ACTIVATE_FUNC(sata_hba_inst))
1403 			    (dip, &sata_device) != SATA_SUCCESS) {
1404 				/*
1405 				 * Port activation failure.
1406 				 */
1407 				mutex_enter(&SATA_CPORT_INFO(sata_hba_inst,
1408 				    cport)->cport_mutex);
1409 				sata_update_port_info(sata_hba_inst,
1410 				    &sata_device);
1411 				if (sata_device.satadev_state &
1412 				    SATA_PSTATE_FAILED) {
1413 					cportinfo->cport_state =
1414 					    SATA_PSTATE_FAILED;
1415 				}
1416 				mutex_exit(&SATA_CPORT_INFO(sata_hba_inst,
1417 				    cport)->cport_mutex);
1418 				SATA_LOG_D((sata_hba_inst, CE_WARN,
1419 				    "sata_hba_ioctl: connect: "
1420 				    "failed to activate SATA port %d",
1421 				    cport));
1422 				rv = EIO;
1423 				break;
1424 			}
1425 		}
1426 		/* Virgin port state - will be updated by the port re-probe. */
1427 		mutex_enter(&SATA_CPORT_INFO(sata_hba_inst,
1428 		    cport)->cport_mutex);
1429 		cportinfo->cport_state = 0;
1430 		mutex_exit(&SATA_CPORT_INFO(sata_hba_inst,
1431 		    cport)->cport_mutex);
1432 
1433 		/*
1434 		 * Probe the port to find its state and attached device.
1435 		 */
1436 		if (sata_reprobe_port(sata_hba_inst, &sata_device,
1437 		    SATA_DEV_IDENTIFY_RETRY) == SATA_FAILURE)
1438 			rv = EIO;
1439 		/*
1440 		 * Generate sysevent - EC_DR / ESC_DR_AP_STATE_CHANGE
1441 		 * without the hint
1442 		 */
1443 		sata_gen_sysevent(sata_hba_inst,
1444 		    &sata_device.satadev_addr, SE_NO_HINT);
1445 		/*
1446 		 * If there is a device attached to the port, emit
1447 		 * a message.
1448 		 */
1449 		if (cportinfo->cport_dev_type != SATA_DTYPE_NONE) {
1450 			sata_log(sata_hba_inst, CE_WARN,
1451 			    "SATA device detected at port %d", cport);
1452 		}
1453 		break;
1454 	}
1455 
1456 	case DEVCTL_AP_CONFIGURE:
1457 	{
1458 		boolean_t target = TRUE;
1459 
1460 		/*
1461 		 * A port may be in an active or shutdown state.
1462 		 * If port is in a failed state, operation is aborted - one
1463 		 * has to use explicit connect or port activate request
1464 		 * to try to get a port into non-failed mode.
1465 		 *
1466 		 * If a port is in a shutdown state, arbitrarily invoke
1467 		 * sata_tran_port_activate() prior to any other operation.
1468 		 *
1469 		 * Verify that port state is READY and there is a device
1470 		 * of a supported type attached to this port.
1471 		 * If target node exists, a device was most likely offlined.
1472 		 * If target node does not exist, create a target node an
1473 		 * attempt to online it.
1474 		 *		 *
1475 		 * NO PMult or devices beyond PMult are supported yet.
1476 		 */
1477 
1478 		/* We only care about host controller's sata cport for now. */
1479 		if (cportinfo->cport_state & SATA_PSTATE_FAILED) {
1480 			rv = ENXIO;
1481 			break;
1482 		}
1483 		/* Check the current state of the port */
1484 		sata_device.satadev_addr.qual = SATA_ADDR_CPORT;
1485 
1486 		rval = (*SATA_PROBE_PORT_FUNC(sata_hba_inst))
1487 		    (dip, &sata_device);
1488 		mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, cport)->
1489 		    cport_mutex);
1490 		sata_update_port_info(sata_hba_inst, &sata_device);
1491 		if (rval != SATA_SUCCESS ||
1492 		    (sata_device.satadev_state & SATA_PSTATE_FAILED)) {
1493 			cportinfo->cport_state = SATA_PSTATE_FAILED;
1494 			mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, cport)->
1495 			    cport_mutex);
1496 			rv = EIO;
1497 			break;
1498 		}
1499 		if (cportinfo->cport_state & SATA_PSTATE_SHUTDOWN) {
1500 			target = FALSE;
1501 			mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, cport)->
1502 			    cport_mutex);
1503 
1504 			if (SATA_PORT_ACTIVATE_FUNC(sata_hba_inst) != NULL) {
1505 				/* Just let HBA driver to activate port */
1506 				if ((*SATA_PORT_ACTIVATE_FUNC(sata_hba_inst))
1507 				    (dip, &sata_device) != SATA_SUCCESS) {
1508 					/*
1509 					 * Port activation failure - do not
1510 					 * change port state unless the state
1511 					 * returned by HBA indicates a port
1512 					 * failure.
1513 					 */
1514 					mutex_enter(&SATA_CPORT_INFO(
1515 					    sata_hba_inst, cport)->cport_mutex);
1516 					sata_update_port_info(sata_hba_inst,
1517 					    &sata_device);
1518 					if (sata_device.satadev_state &
1519 					    SATA_PSTATE_FAILED) {
1520 						cportinfo->cport_state =
1521 						    SATA_PSTATE_FAILED;
1522 					}
1523 					mutex_exit(&SATA_CPORT_INFO(
1524 					    sata_hba_inst, cport)->cport_mutex);
1525 					SATA_LOG_D((sata_hba_inst, CE_WARN,
1526 					    "sata_hba_ioctl: configure: "
1527 					    "failed to activate SATA port %d",
1528 					    cport));
1529 					rv = EIO;
1530 					break;
1531 				}
1532 			}
1533 			/*
1534 			 * Generate sysevent - EC_DR / ESC_DR_AP_STATE_CHANGE
1535 			 * without the hint.
1536 			 */
1537 			sata_gen_sysevent(sata_hba_inst,
1538 			    &sata_device.satadev_addr, SE_NO_HINT);
1539 
1540 			mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, cport)->
1541 			    cport_mutex);
1542 			/* Virgin port state */
1543 			cportinfo->cport_state = 0;
1544 		}
1545 		/*
1546 		 * Always reprobe port, to get current device info.
1547 		 */
1548 		mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, cport)->cport_mutex);
1549 		if (sata_reprobe_port(sata_hba_inst, &sata_device,
1550 		    SATA_DEV_IDENTIFY_RETRY) != SATA_SUCCESS) {
1551 			rv = EIO;
1552 			break;
1553 		}
1554 		if (target == FALSE &&
1555 		    cportinfo->cport_dev_type != SATA_DTYPE_NONE) {
1556 			/*
1557 			 * That's the transition from "inactive" port
1558 			 * to active one with device attached.
1559 			 */
1560 			sata_log(sata_hba_inst, CE_WARN,
1561 			    "SATA device detected at port %d",
1562 			    cport);
1563 		}
1564 
1565 		/*
1566 		 * This is where real configure starts.
1567 		 * Change following check for PMult support.
1568 		 */
1569 		if (!(sata_device.satadev_type & SATA_VALID_DEV_TYPE)) {
1570 			/* No device to configure */
1571 			rv = ENXIO; /* No device to configure */
1572 			break;
1573 		}
1574 
1575 		/*
1576 		 * Here we may have a device in reset condition,
1577 		 * but because we are just configuring it, there is
1578 		 * no need to process the reset other than just
1579 		 * to clear device reset condition in the HBA driver.
1580 		 * Setting the flag SATA_EVNT_CLEAR_DEVICE_RESET will
1581 		 * cause a first command sent the HBA driver with the request
1582 		 * to clear device reset condition.
1583 		 */
1584 		mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, cport)->
1585 		    cport_mutex);
1586 		sdinfo = sata_get_device_info(sata_hba_inst, &sata_device);
1587 		if (sdinfo == NULL) {
1588 			rv = ENXIO;
1589 			mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, cport)->
1590 			    cport_mutex);
1591 			break;
1592 		}
1593 		if (sdinfo->satadrv_event_flags &
1594 		    (SATA_EVNT_DEVICE_RESET | SATA_EVNT_INPROC_DEVICE_RESET))
1595 			sdinfo->satadrv_event_flags = 0;
1596 		sdinfo->satadrv_event_flags |= SATA_EVNT_CLEAR_DEVICE_RESET;
1597 		mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, cport)->cport_mutex);
1598 
1599 		if ((tdip = sata_get_target_dip(dip, comp_port)) != NULL) {
1600 			/*
1601 			 * Target node exists. Verify, that it belongs
1602 			 * to existing, attached device and not to
1603 			 * a removed device.
1604 			 */
1605 			if (sata_check_device_removed(tdip) == B_FALSE) {
1606 				if (ndi_devi_online(tdip, 0) != NDI_SUCCESS) {
1607 					SATA_LOG_D((sata_hba_inst, CE_WARN,
1608 					    "sata_hba_ioctl: configure: "
1609 					    "onlining device at SATA port %d "
1610 					    "failed", cport));
1611 					rv = EIO;
1612 					break;
1613 				} else {
1614 					mutex_enter(&SATA_CPORT_INFO(
1615 					    sata_hba_inst, cport)->cport_mutex);
1616 					SATA_CPORT_INFO(sata_hba_inst, cport)->
1617 					    cport_tgtnode_clean = B_TRUE;
1618 					mutex_exit(&SATA_CPORT_INFO(
1619 					    sata_hba_inst, cport)->cport_mutex);
1620 				}
1621 			} else {
1622 				sata_log(sata_hba_inst, CE_WARN,
1623 				    "SATA device at port %d cannot be "
1624 				    "configured. "
1625 				    "Application(s) accessing previously "
1626 				    "attached device "
1627 				    "have to release it before newly inserted "
1628 				    "device can be made accessible.",
1629 				    cport);
1630 				break;
1631 			}
1632 		} else {
1633 			/*
1634 			 * No target node - need to create a new target node.
1635 			 */
1636 			mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, cport)->
1637 			    cport_mutex);
1638 			SATA_CPORT_INFO(sata_hba_inst, cport)->
1639 			    cport_tgtnode_clean = B_TRUE;
1640 			mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, cport)->
1641 			    cport_mutex);
1642 			tdip = sata_create_target_node(dip, sata_hba_inst,
1643 			    &sata_device.satadev_addr);
1644 			if (tdip == NULL) {
1645 				/* configure failed */
1646 				SATA_LOG_D((sata_hba_inst, CE_WARN,
1647 				    "sata_hba_ioctl: configure: "
1648 				    "configuring SATA device at port %d "
1649 				    "failed", cport));
1650 				rv = EIO;
1651 				break;
1652 			}
1653 		}
1654 
1655 		break;
1656 	}
1657 
1658 	case DEVCTL_AP_GETSTATE:
1659 
1660 		sata_cfgadm_state(sata_hba_inst, comp_port, &ap_state);
1661 
1662 		ap_state.ap_last_change = (time_t)-1;
1663 		ap_state.ap_error_code = 0;
1664 		ap_state.ap_in_transition = 0;
1665 
1666 		/* Copy the return AP-state information to the user space */
1667 		if (ndi_dc_return_ap_state(&ap_state, dcp) != NDI_SUCCESS) {
1668 			rv = EFAULT;
1669 		}
1670 		break;
1671 
1672 	case DEVCTL_AP_CONTROL:
1673 	{
1674 		/*
1675 		 * Generic devctl for hardware specific functionality
1676 		 */
1677 		sata_ioctl_data_t	ioc;
1678 
1679 		ASSERT(dcp == NULL);
1680 
1681 		/* Copy in user ioctl data first */
1682 #ifdef _MULTI_DATAMODEL
1683 		if (ddi_model_convert_from(mode & FMODELS) ==
1684 		    DDI_MODEL_ILP32) {
1685 
1686 			sata_ioctl_data_32_t	ioc32;
1687 
1688 			if (ddi_copyin((void *)arg, (void *)&ioc32,
1689 			    sizeof (ioc32), mode) != 0) {
1690 				rv = EFAULT;
1691 				break;
1692 			}
1693 			ioc.cmd 	= (uint_t)ioc32.cmd;
1694 			ioc.port	= (uint_t)ioc32.port;
1695 			ioc.get_size	= (uint_t)ioc32.get_size;
1696 			ioc.buf		= (caddr_t)(uintptr_t)ioc32.buf;
1697 			ioc.bufsiz	= (uint_t)ioc32.bufsiz;
1698 			ioc.misc_arg	= (uint_t)ioc32.misc_arg;
1699 		} else
1700 #endif /* _MULTI_DATAMODEL */
1701 		if (ddi_copyin((void *)arg, (void *)&ioc, sizeof (ioc),
1702 		    mode) != 0) {
1703 			return (EFAULT);
1704 		}
1705 
1706 		SATADBG2(SATA_DBG_IOCTL_IF, sata_hba_inst,
1707 		    "sata_hba_ioctl: DEVCTL_AP_CONTROL "
1708 		    "cmd 0x%x, port 0x%x", ioc.cmd, ioc.port);
1709 
1710 		/*
1711 		 * To avoid BE/LE and 32/64 issues, a get_size always returns
1712 		 * a 32-bit number.
1713 		 */
1714 		if (ioc.get_size != 0 && ioc.bufsiz != (sizeof (uint32_t))) {
1715 			return (EINVAL);
1716 		}
1717 		/* validate address */
1718 		cport = SCSI_TO_SATA_CPORT(ioc.port);
1719 		pmport = SCSI_TO_SATA_PMPORT(ioc.port);
1720 		qual = SCSI_TO_SATA_ADDR_QUAL(ioc.port);
1721 
1722 		/* Override address qualifier - handle cport only for now */
1723 		qual = SATA_ADDR_CPORT;
1724 
1725 		if (sata_validate_sata_address(sata_hba_inst, cport,
1726 		    pmport, qual) != 0)
1727 			return (EINVAL);
1728 
1729 		cportinfo = SATA_CPORT_INFO(sata_hba_inst, cport);
1730 		mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, cport)->
1731 		    cport_mutex);
1732 		/* Is the port locked by event processing daemon ? */
1733 		if (cportinfo->cport_event_flags & SATA_EVNT_LOCK_PORT_BUSY) {
1734 			/*
1735 			 * Cannot process ioctl request now. Come back later
1736 			 */
1737 			mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, cport)->
1738 			    cport_mutex);
1739 			return (EBUSY);
1740 		}
1741 		/* Block event processing for this port */
1742 		cportinfo->cport_event_flags |= SATA_APCTL_LOCK_PORT_BUSY;
1743 		mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, cport)->cport_mutex);
1744 
1745 
1746 		sata_device.satadev_addr.cport = cport;
1747 		sata_device.satadev_addr.pmport = pmport;
1748 		sata_device.satadev_rev = SATA_DEVICE_REV;
1749 
1750 		switch (ioc.cmd) {
1751 
1752 		case SATA_CFGA_RESET_PORT:
1753 			/*
1754 			 * There is no protection here for configured
1755 			 * device.
1756 			 */
1757 
1758 			/* Sanity check */
1759 			if (SATA_RESET_DPORT_FUNC(sata_hba_inst) == NULL) {
1760 				SATA_LOG_D((sata_hba_inst, CE_WARN,
1761 				    "sata_hba_ioctl: "
1762 				    "sata_hba_tran missing required "
1763 				    "function sata_tran_reset_dport"));
1764 				rv = EINVAL;
1765 				break;
1766 			}
1767 
1768 			/* handle cport only for now */
1769 			sata_device.satadev_addr.qual = SATA_ADDR_CPORT;
1770 			if ((*SATA_RESET_DPORT_FUNC(sata_hba_inst))
1771 			    (dip, &sata_device) != SATA_SUCCESS) {
1772 				SATA_LOG_D((sata_hba_inst, CE_WARN,
1773 				    "sata_hba_ioctl: reset port: "
1774 				    "failed cport %d pmport %d",
1775 				    cport, pmport));
1776 				mutex_enter(&SATA_CPORT_INFO(sata_hba_inst,
1777 				    cport)->cport_mutex);
1778 				sata_update_port_info(sata_hba_inst,
1779 				    &sata_device);
1780 				SATA_CPORT_STATE(sata_hba_inst, cport) =
1781 				    SATA_PSTATE_FAILED;
1782 				mutex_exit(&SATA_CPORT_INFO(sata_hba_inst,
1783 				    cport)->cport_mutex);
1784 				rv = EIO;
1785 			}
1786 			/*
1787 			 * Since the port was reset, it should be probed and
1788 			 * attached device reinitialized. At this point the
1789 			 * port state is unknown - it's state is HBA-specific.
1790 			 * Re-probe port to get its state.
1791 			 */
1792 			if (sata_reprobe_port(sata_hba_inst, &sata_device,
1793 			    SATA_DEV_IDENTIFY_RETRY) != SATA_SUCCESS) {
1794 				rv = EIO;
1795 				break;
1796 			}
1797 			break;
1798 
1799 		case SATA_CFGA_RESET_DEVICE:
1800 			/*
1801 			 * There is no protection here for configured
1802 			 * device.
1803 			 */
1804 
1805 			/* Sanity check */
1806 			if (SATA_RESET_DPORT_FUNC(sata_hba_inst) == NULL) {
1807 				SATA_LOG_D((sata_hba_inst, CE_WARN,
1808 				    "sata_hba_ioctl: "
1809 				    "sata_hba_tran missing required "
1810 				    "function sata_tran_reset_dport"));
1811 				rv = EINVAL;
1812 				break;
1813 			}
1814 
1815 			/* handle only device attached to cports, for now */
1816 			sata_device.satadev_addr.qual = SATA_ADDR_DCPORT;
1817 
1818 			mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, cport)->
1819 			    cport_mutex);
1820 			sdinfo = sata_get_device_info(sata_hba_inst,
1821 			    &sata_device);
1822 			if (sdinfo == NULL) {
1823 				mutex_exit(&SATA_CPORT_INFO(sata_hba_inst,
1824 				    cport)->cport_mutex);
1825 				rv = EINVAL;
1826 				break;
1827 			}
1828 			mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, cport)->
1829 			    cport_mutex);
1830 
1831 			/* only handle cport for now */
1832 			sata_device.satadev_addr.qual = SATA_ADDR_DCPORT;
1833 			if ((*SATA_RESET_DPORT_FUNC(sata_hba_inst))
1834 			    (dip, &sata_device) != SATA_SUCCESS) {
1835 				SATA_LOG_D((sata_hba_inst, CE_WARN,
1836 				    "sata_hba_ioctl: reset device: failed "
1837 				    "cport %d pmport %d", cport, pmport));
1838 				mutex_enter(&SATA_CPORT_INFO(sata_hba_inst,
1839 				    cport)->cport_mutex);
1840 				sata_update_port_info(sata_hba_inst,
1841 				    &sata_device);
1842 				/*
1843 				 * Device info structure remains
1844 				 * attached. Another device reset or
1845 				 * port disconnect/connect and re-probing is
1846 				 * needed to change it's state
1847 				 */
1848 				sdinfo->satadrv_state &= ~SATA_STATE_READY;
1849 				sdinfo->satadrv_state |=
1850 				    SATA_DSTATE_FAILED;
1851 				mutex_exit(&SATA_CPORT_INFO(sata_hba_inst,
1852 				    cport)->cport_mutex);
1853 				rv = EIO;
1854 			}
1855 			/*
1856 			 * Since the device was reset, we expect reset event
1857 			 * to be reported and processed.
1858 			 */
1859 			break;
1860 
1861 		case SATA_CFGA_RESET_ALL:
1862 		{
1863 			int tcport;
1864 
1865 			/*
1866 			 * There is no protection here for configured
1867 			 * devices.
1868 			 */
1869 			/* Sanity check */
1870 			if (SATA_RESET_DPORT_FUNC(sata_hba_inst) == NULL) {
1871 				SATA_LOG_D((sata_hba_inst, CE_WARN,
1872 				    "sata_hba_ioctl: "
1873 				    "sata_hba_tran missing required "
1874 				    "function sata_tran_reset_dport"));
1875 				rv = EINVAL;
1876 				break;
1877 			}
1878 
1879 			/*
1880 			 * Need to lock all ports, not just one.
1881 			 * If any port is locked by event processing, fail
1882 			 * the whole operation.
1883 			 * One port is already locked, but for simplicity
1884 			 * lock it again.
1885 			 */
1886 			for (tcport = 0;
1887 			    tcport < SATA_NUM_CPORTS(sata_hba_inst);
1888 			    tcport++) {
1889 				mutex_enter(&SATA_CPORT_INFO(sata_hba_inst,
1890 				    tcport)->cport_mutex);
1891 				if (((SATA_CPORT_INFO(sata_hba_inst, tcport)->
1892 				    cport_event_flags) &
1893 				    SATA_EVNT_LOCK_PORT_BUSY) != 0) {
1894 					rv = EBUSY;
1895 					mutex_exit(
1896 					    &SATA_CPORT_INFO(sata_hba_inst,
1897 					    tcport)->cport_mutex);
1898 					break;
1899 				} else {
1900 					SATA_CPORT_INFO(sata_hba_inst,
1901 					    tcport)->cport_event_flags |=
1902 					    SATA_APCTL_LOCK_PORT_BUSY;
1903 				}
1904 				mutex_exit(&SATA_CPORT_INFO(sata_hba_inst,
1905 				    tcport)->cport_mutex);
1906 			}
1907 
1908 			if (rv == 0) {
1909 				/*
1910 				 * All cports successfully locked.
1911 				 * Reset main SATA controller only for now -
1912 				 * no PMult.
1913 				 */
1914 				sata_device.satadev_addr.qual =
1915 				    SATA_ADDR_CNTRL;
1916 
1917 				if ((*SATA_RESET_DPORT_FUNC(sata_hba_inst))
1918 				    (dip, &sata_device) != SATA_SUCCESS) {
1919 					SATA_LOG_D((sata_hba_inst, CE_WARN,
1920 					    "sata_hba_ioctl: reset controller "
1921 					    "failed"));
1922 					rv = EIO;
1923 				}
1924 
1925 				/*
1926 				 * Since ports were reset, they should be
1927 				 * re-probed and attached devices
1928 				 * reinitialized.
1929 				 * At this point port states are unknown,
1930 				 * Re-probe ports to get their state -
1931 				 * cports only for now.
1932 				 */
1933 				for (tcport = 0;
1934 				    tcport < SATA_NUM_CPORTS(sata_hba_inst);
1935 				    tcport++) {
1936 					sata_device.satadev_addr.cport =
1937 					    tcport;
1938 					sata_device.satadev_addr.qual =
1939 					    SATA_ADDR_CPORT;
1940 
1941 					if (sata_reprobe_port(sata_hba_inst,
1942 					    &sata_device,
1943 					    SATA_DEV_IDENTIFY_RETRY) !=
1944 					    SATA_SUCCESS)
1945 						rv = EIO;
1946 
1947 				}
1948 			}
1949 			/*
1950 			 * Unlock all ports
1951 			 */
1952 			for (tcport = 0;
1953 			    tcport < SATA_NUM_CPORTS(sata_hba_inst);
1954 			    tcport++) {
1955 				mutex_enter(&SATA_CPORT_INFO(sata_hba_inst,
1956 				    tcport)->cport_mutex);
1957 				SATA_CPORT_INFO(sata_hba_inst, tcport)->
1958 				    cport_event_flags &=
1959 				    ~SATA_APCTL_LOCK_PORT_BUSY;
1960 				mutex_exit(&SATA_CPORT_INFO(sata_hba_inst,
1961 				    tcport)->cport_mutex);
1962 			}
1963 
1964 			/*
1965 			 * This operation returns EFAULT if either reset
1966 			 * controller failed or a re-probing of any ports
1967 			 * failed.
1968 			 * We return here, because common return is for
1969 			 * a single cport operation.
1970 			 */
1971 			return (rv);
1972 		}
1973 
1974 		case SATA_CFGA_PORT_DEACTIVATE:
1975 			/* Sanity check */
1976 			if (SATA_PORT_DEACTIVATE_FUNC(sata_hba_inst) == NULL) {
1977 				rv = ENOTSUP;
1978 				break;
1979 			}
1980 			/*
1981 			 * Arbitrarily unconfigure attached device, if any.
1982 			 * Even if the unconfigure fails, proceed with the
1983 			 * port deactivation.
1984 			 */
1985 
1986 			/* Handle only device attached to cports, for now */
1987 			sata_device.satadev_addr.qual = SATA_ADDR_DCPORT;
1988 
1989 			mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, cport)->
1990 			    cport_mutex);
1991 			cportinfo->cport_state &= ~SATA_STATE_READY;
1992 			if (cportinfo->cport_dev_type != SATA_DTYPE_NONE) {
1993 				/*
1994 				 * Handle only device attached to cports,
1995 				 * for now
1996 				 */
1997 				sata_device.satadev_addr.qual =
1998 				    SATA_ADDR_DCPORT;
1999 				sdinfo = sata_get_device_info(sata_hba_inst,
2000 				    &sata_device);
2001 				if (sdinfo != NULL &&
2002 				    (sdinfo->satadrv_type &
2003 				    SATA_VALID_DEV_TYPE)) {
2004 					/*
2005 					 * If a target node exists, try to
2006 					 * offline a device and remove target
2007 					 * node.
2008 					 */
2009 					mutex_exit(&SATA_CPORT_INFO(
2010 					    sata_hba_inst, cport)->cport_mutex);
2011 					tdip = sata_get_target_dip(dip, cport);
2012 					if (tdip != NULL) {
2013 						/* target node exist */
2014 						SATADBG1(SATA_DBG_IOCTL_IF,
2015 						    sata_hba_inst,
2016 						    "sata_hba_ioctl: "
2017 						    "port deactivate: "
2018 						    "target node exists.",
2019 						    NULL);
2020 
2021 						if (ndi_devi_offline(tdip,
2022 						    NDI_DEVI_REMOVE) !=
2023 						    NDI_SUCCESS) {
2024 							SATA_LOG_D((
2025 							    sata_hba_inst,
2026 							    CE_WARN,
2027 							    "sata_hba_ioctl:"
2028 							    "port deactivate: "
2029 							    "failed to "
2030 							    "unconfigure "
2031 							    "device at port "
2032 							    "%d before "
2033 							    "deactivating "
2034 							    "the port", cport));
2035 							/*
2036 							 * Set DEVICE REMOVED
2037 							 * state in the target
2038 							 * node. It will
2039 							 * prevent access to
2040 							 * the device even when
2041 							 * a new device is
2042 							 * attached, until the
2043 							 * old target node is
2044 							 * released, removed and
2045 							 * recreated for a new
2046 							 * device.
2047 							 */
2048 							sata_set_device_removed
2049 							    (tdip);
2050 							/*
2051 							 * Instruct event
2052 							 * daemon to try the
2053 							 * target node cleanup
2054 							 * later.
2055 							 */
2056 						sata_set_target_node_cleanup(
2057 						    sata_hba_inst, cport);
2058 						}
2059 					}
2060 					mutex_enter(&SATA_CPORT_INFO(
2061 					    sata_hba_inst, cport)->cport_mutex);
2062 					/*
2063 					 * In any case,
2064 					 * remove and release sata_drive_info
2065 					 * structure.
2066 					 * (cport attached device ony, for now)
2067 					 */
2068 					SATA_CPORTINFO_DRV_INFO(cportinfo) =
2069 					    NULL;
2070 					(void) kmem_free((void *)sdinfo,
2071 					    sizeof (sata_drive_info_t));
2072 					cportinfo->cport_dev_type =
2073 					    SATA_DTYPE_NONE;
2074 				}
2075 				/*
2076 				 * Note: PMult info requires different
2077 				 * handling. This comment is a placeholder for
2078 				 * a code handling PMult, to be implemented
2079 				 * in phase 2.
2080 				 */
2081 			}
2082 			cportinfo->cport_state &= ~(SATA_STATE_PROBED |
2083 			    SATA_STATE_PROBING);
2084 			mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, cport)->
2085 			    cport_mutex);
2086 			/* handle cport only for now */
2087 			sata_device.satadev_addr.qual = SATA_ADDR_CPORT;
2088 			/* Just let HBA driver to deactivate port */
2089 			rval = (*SATA_PORT_DEACTIVATE_FUNC(sata_hba_inst))
2090 			    (dip, &sata_device);
2091 			/*
2092 			 * Generate sysevent -
2093 			 * EC_DR / ESC_DR_AP_STATE_CHANGE
2094 			 * without the hint
2095 			 */
2096 			sata_gen_sysevent(sata_hba_inst,
2097 			    &sata_device.satadev_addr, SE_NO_HINT);
2098 
2099 			mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, cport)->
2100 			    cport_mutex);
2101 			sata_update_port_info(sata_hba_inst, &sata_device);
2102 			if (rval != SATA_SUCCESS) {
2103 				/*
2104 				 * Port deactivation failure - do not
2105 				 * change port state unless the state
2106 				 * returned by HBA indicates a port failure.
2107 				 */
2108 				if (sata_device.satadev_state &
2109 				    SATA_PSTATE_FAILED) {
2110 					SATA_CPORT_STATE(sata_hba_inst,
2111 					    cport) = SATA_PSTATE_FAILED;
2112 				}
2113 				SATA_LOG_D((sata_hba_inst, CE_WARN,
2114 				    "sata_hba_ioctl: port deactivate: "
2115 				    "cannot deactivate SATA port %d",
2116 				    cport));
2117 				rv = EIO;
2118 			} else {
2119 				cportinfo->cport_state |= SATA_PSTATE_SHUTDOWN;
2120 			}
2121 			mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, cport)->
2122 			    cport_mutex);
2123 
2124 			break;
2125 
2126 		case SATA_CFGA_PORT_ACTIVATE:
2127 		{
2128 			boolean_t dev_existed = TRUE;
2129 
2130 			/* Sanity check */
2131 			if (SATA_PORT_ACTIVATE_FUNC(sata_hba_inst) == NULL) {
2132 				rv = ENOTSUP;
2133 				break;
2134 			}
2135 			/* handle cport only for now */
2136 			if (cportinfo->cport_state & SATA_PSTATE_SHUTDOWN ||
2137 			    cportinfo->cport_dev_type == SATA_DTYPE_NONE)
2138 				dev_existed = FALSE;
2139 
2140 			sata_device.satadev_addr.qual = SATA_ADDR_CPORT;
2141 			/* Just let HBA driver to activate port */
2142 			if ((*SATA_PORT_ACTIVATE_FUNC(sata_hba_inst))
2143 			    (dip, &sata_device) != SATA_SUCCESS) {
2144 				/*
2145 				 * Port activation failure - do not
2146 				 * change port state unless the state
2147 				 * returned by HBA indicates a port failure.
2148 				 */
2149 				mutex_enter(&SATA_CPORT_INFO(sata_hba_inst,
2150 				    cport)->cport_mutex);
2151 				sata_update_port_info(sata_hba_inst,
2152 				    &sata_device);
2153 				if (sata_device.satadev_state &
2154 				    SATA_PSTATE_FAILED) {
2155 					SATA_CPORT_STATE(sata_hba_inst,
2156 					    cport) = SATA_PSTATE_FAILED;
2157 				}
2158 				mutex_exit(&SATA_CPORT_INFO(sata_hba_inst,
2159 				    cport)->cport_mutex);
2160 				SATA_LOG_D((sata_hba_inst, CE_WARN,
2161 				    "sata_hba_ioctl: port activate: "
2162 				    "cannot activate SATA port %d",
2163 				    cport));
2164 				rv = EIO;
2165 				break;
2166 			}
2167 			mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, cport)->
2168 			    cport_mutex);
2169 			cportinfo->cport_state &= ~SATA_PSTATE_SHUTDOWN;
2170 			mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, cport)->
2171 			    cport_mutex);
2172 
2173 			/*
2174 			 * Re-probe port to find its current state and
2175 			 * possibly attached device.
2176 			 * Port re-probing may change the cportinfo device
2177 			 * type if device is found attached.
2178 			 * If port probing failed, the device type would be
2179 			 * set to SATA_DTYPE_NONE.
2180 			 */
2181 			(void) sata_reprobe_port(sata_hba_inst, &sata_device,
2182 			    SATA_DEV_IDENTIFY_RETRY);
2183 
2184 			/*
2185 			 * Generate sysevent -
2186 			 * EC_DR / ESC_DR_AP_STATE_CHANGE
2187 			 * without the hint.
2188 			 */
2189 			sata_gen_sysevent(sata_hba_inst,
2190 			    &sata_device.satadev_addr, SE_NO_HINT);
2191 
2192 			if (dev_existed == FALSE &&
2193 			    cportinfo->cport_dev_type != SATA_DTYPE_NONE) {
2194 				/*
2195 				 * That's the transition from "inactive" port
2196 				 * state or active port without a device
2197 				 * attached to the active port state with
2198 				 * a device attached.
2199 				 */
2200 				sata_log(sata_hba_inst, CE_WARN,
2201 				    "SATA device detected at port %d", cport);
2202 			}
2203 
2204 			break;
2205 		}
2206 
2207 		case SATA_CFGA_PORT_SELF_TEST:
2208 
2209 			/* Sanity check */
2210 			if (SATA_SELFTEST_FUNC(sata_hba_inst) == NULL) {
2211 				rv = ENOTSUP;
2212 				break;
2213 			}
2214 			/*
2215 			 * There is no protection here for a configured
2216 			 * device attached to this port.
2217 			 */
2218 
2219 			/* only handle cport for now */
2220 			sata_device.satadev_addr.qual = SATA_ADDR_CPORT;
2221 
2222 			if ((*SATA_SELFTEST_FUNC(sata_hba_inst))
2223 			    (dip, &sata_device) != SATA_SUCCESS) {
2224 				SATA_LOG_D((sata_hba_inst, CE_WARN,
2225 				    "sata_hba_ioctl: port selftest: "
2226 				    "failed cport %d pmport %d",
2227 				    cport, pmport));
2228 				mutex_enter(&SATA_CPORT_INFO(sata_hba_inst,
2229 				    cport)->cport_mutex);
2230 				sata_update_port_info(sata_hba_inst,
2231 				    &sata_device);
2232 				SATA_CPORT_STATE(sata_hba_inst, cport) =
2233 				    SATA_PSTATE_FAILED;
2234 				mutex_exit(&SATA_CPORT_INFO(sata_hba_inst,
2235 				    cport)->cport_mutex);
2236 				rv = EIO;
2237 				break;
2238 			}
2239 			/*
2240 			 * Since the port was reset, it should be probed and
2241 			 * attached device reinitialized. At this point the
2242 			 * port state is unknown - it's state is HBA-specific.
2243 			 * Force port re-probing to get it into a known state.
2244 			 */
2245 			if (sata_reprobe_port(sata_hba_inst, &sata_device,
2246 			    SATA_DEV_IDENTIFY_RETRY) != SATA_SUCCESS) {
2247 				rv = EIO;
2248 				break;
2249 			}
2250 			break;
2251 
2252 		case SATA_CFGA_GET_DEVICE_PATH:
2253 		{
2254 			char		path[MAXPATHLEN];
2255 			uint32_t	size;
2256 
2257 			(void) strcpy(path, "/devices");
2258 			if ((tdip = sata_get_target_dip(dip, ioc.port)) ==
2259 			    NULL) {
2260 
2261 				/*
2262 				 * No such device.
2263 				 * If this is a request for a size, do not
2264 				 * return EINVAL for non-exisiting target,
2265 				 * because cfgadm will indicate a meaningless
2266 				 * ioctl failure.
2267 				 * If this is a real request for a path,
2268 				 * indicate invalid argument.
2269 				 */
2270 				if (!ioc.get_size) {
2271 					rv = EINVAL;
2272 					break;
2273 				}
2274 			} else {
2275 				(void) ddi_pathname(tdip, path + strlen(path));
2276 			}
2277 			size = strlen(path) + 1;
2278 
2279 			if (ioc.get_size) {
2280 				if (ddi_copyout((void *)&size,
2281 				    ioc.buf, ioc.bufsiz, mode) != 0) {
2282 					rv = EFAULT;
2283 				}
2284 			} else {
2285 				if (ioc.bufsiz != size) {
2286 					rv = EINVAL;
2287 				} else if (ddi_copyout((void *)&path,
2288 				    ioc.buf, ioc.bufsiz, mode) != 0) {
2289 					rv = EFAULT;
2290 				}
2291 			}
2292 			break;
2293 		}
2294 
2295 		case SATA_CFGA_GET_AP_TYPE:
2296 		{
2297 			uint32_t	type_len;
2298 			const char	*ap_type;
2299 
2300 			/* cport only, no port multiplier support */
2301 			switch (SATA_CPORT_DEV_TYPE(sata_hba_inst, cport)) {
2302 			case SATA_DTYPE_NONE:
2303 				ap_type = "port";
2304 				break;
2305 
2306 			case SATA_DTYPE_ATADISK:
2307 				ap_type = "disk";
2308 				break;
2309 
2310 			case SATA_DTYPE_ATAPICD:
2311 				ap_type = "cd/dvd";
2312 				break;
2313 
2314 			case SATA_DTYPE_PMULT:
2315 				ap_type = "pmult";
2316 				break;
2317 
2318 			case SATA_DTYPE_UNKNOWN:
2319 				ap_type = "unknown";
2320 				break;
2321 
2322 			default:
2323 				ap_type = "unsupported";
2324 				break;
2325 
2326 			} /* end of dev_type switch */
2327 
2328 			type_len = strlen(ap_type) + 1;
2329 
2330 			if (ioc.get_size) {
2331 				if (ddi_copyout((void *)&type_len,
2332 				    ioc.buf, ioc.bufsiz, mode) != 0) {
2333 					rv = EFAULT;
2334 					break;
2335 				}
2336 			} else {
2337 				if (ioc.bufsiz != type_len) {
2338 					rv = EINVAL;
2339 					break;
2340 				}
2341 				if (ddi_copyout((void *)ap_type, ioc.buf,
2342 				    ioc.bufsiz, mode) != 0) {
2343 					rv = EFAULT;
2344 					break;
2345 				}
2346 			}
2347 
2348 			break;
2349 		}
2350 
2351 		case SATA_CFGA_GET_MODEL_INFO:
2352 		{
2353 			uint32_t info_len;
2354 			char ap_info[sizeof (sdinfo->satadrv_id.ai_model) + 1];
2355 
2356 			/*
2357 			 * This operation should return to cfgadm the
2358 			 * device model information string
2359 			 */
2360 			mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, cport)->
2361 			    cport_mutex);
2362 			/* only handle device connected to cport for now */
2363 			sata_device.satadev_addr.qual = SATA_ADDR_DCPORT;
2364 			sdinfo = sata_get_device_info(sata_hba_inst,
2365 			    &sata_device);
2366 			if (sdinfo == NULL) {
2367 				rv = EINVAL;
2368 				mutex_exit(&SATA_CPORT_INFO(sata_hba_inst,
2369 				    cport)->cport_mutex);
2370 				break;
2371 			}
2372 			bcopy(sdinfo->satadrv_id.ai_model, ap_info,
2373 			    sizeof (sdinfo->satadrv_id.ai_model));
2374 			swab(ap_info, ap_info,
2375 			    sizeof (sdinfo->satadrv_id.ai_model));
2376 			ap_info[sizeof (sdinfo->satadrv_id.ai_model)] = '\0';
2377 
2378 			mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, cport)->
2379 			    cport_mutex);
2380 
2381 			info_len = strlen(ap_info) + 1;
2382 
2383 			if (ioc.get_size) {
2384 				if (ddi_copyout((void *)&info_len,
2385 				    ioc.buf, ioc.bufsiz, mode) != 0) {
2386 					rv = EFAULT;
2387 					break;
2388 				}
2389 			} else {
2390 				if (ioc.bufsiz < info_len) {
2391 					rv = EINVAL;
2392 					break;
2393 				}
2394 				if (ddi_copyout((void *)ap_info, ioc.buf,
2395 				    ioc.bufsiz, mode) != 0) {
2396 					rv = EFAULT;
2397 					break;
2398 				}
2399 			}
2400 
2401 			break;
2402 		}
2403 
2404 		case SATA_CFGA_GET_REVFIRMWARE_INFO:
2405 		{
2406 			uint32_t info_len;
2407 			char ap_info[
2408 			    sizeof (sdinfo->satadrv_id.ai_fw) + 1];
2409 
2410 			/*
2411 			 * This operation should return to cfgadm the
2412 			 * device firmware revision information string
2413 			 */
2414 			mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, cport)->
2415 			    cport_mutex);
2416 			/* only handle device connected to cport for now */
2417 			sata_device.satadev_addr.qual = SATA_ADDR_DCPORT;
2418 
2419 			sdinfo = sata_get_device_info(sata_hba_inst,
2420 			    &sata_device);
2421 			if (sdinfo == NULL) {
2422 				mutex_exit(&SATA_CPORT_INFO(sata_hba_inst,
2423 				    cport)->cport_mutex);
2424 				rv = EINVAL;
2425 				break;
2426 			}
2427 			bcopy(sdinfo->satadrv_id.ai_fw, ap_info,
2428 			    sizeof (sdinfo->satadrv_id.ai_fw));
2429 			swab(ap_info, ap_info,
2430 			    sizeof (sdinfo->satadrv_id.ai_fw));
2431 			ap_info[sizeof (sdinfo->satadrv_id.ai_fw)] = '\0';
2432 
2433 			mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, cport)->
2434 			    cport_mutex);
2435 
2436 			info_len = strlen(ap_info) + 1;
2437 
2438 			if (ioc.get_size) {
2439 				if (ddi_copyout((void *)&info_len,
2440 				    ioc.buf, ioc.bufsiz, mode) != 0) {
2441 					rv = EFAULT;
2442 					break;
2443 				}
2444 			} else {
2445 				if (ioc.bufsiz < info_len) {
2446 					rv = EINVAL;
2447 					break;
2448 				}
2449 				if (ddi_copyout((void *)ap_info, ioc.buf,
2450 				    ioc.bufsiz, mode) != 0) {
2451 					rv = EFAULT;
2452 					break;
2453 				}
2454 			}
2455 
2456 			break;
2457 		}
2458 
2459 		case SATA_CFGA_GET_SERIALNUMBER_INFO:
2460 		{
2461 			uint32_t info_len;
2462 			char ap_info[
2463 			    sizeof (sdinfo->satadrv_id.ai_drvser) + 1];
2464 
2465 			/*
2466 			 * This operation should return to cfgadm the
2467 			 * device serial number information string
2468 			 */
2469 			mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, cport)->
2470 			    cport_mutex);
2471 			/* only handle device connected to cport for now */
2472 			sata_device.satadev_addr.qual = SATA_ADDR_DCPORT;
2473 
2474 			sdinfo = sata_get_device_info(sata_hba_inst,
2475 			    &sata_device);
2476 			if (sdinfo == NULL) {
2477 				mutex_exit(&SATA_CPORT_INFO(sata_hba_inst,
2478 				    cport)->cport_mutex);
2479 				rv = EINVAL;
2480 				break;
2481 			}
2482 			bcopy(sdinfo->satadrv_id.ai_drvser, ap_info,
2483 			    sizeof (sdinfo->satadrv_id.ai_drvser));
2484 			swab(ap_info, ap_info,
2485 			    sizeof (sdinfo->satadrv_id.ai_drvser));
2486 			ap_info[sizeof (sdinfo->satadrv_id.ai_drvser)] = '\0';
2487 
2488 			mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, cport)->
2489 			    cport_mutex);
2490 
2491 			info_len = strlen(ap_info) + 1;
2492 
2493 			if (ioc.get_size) {
2494 				if (ddi_copyout((void *)&info_len,
2495 				    ioc.buf, ioc.bufsiz, mode) != 0) {
2496 					rv = EFAULT;
2497 					break;
2498 				}
2499 			} else {
2500 				if (ioc.bufsiz < info_len) {
2501 					rv = EINVAL;
2502 					break;
2503 				}
2504 				if (ddi_copyout((void *)ap_info, ioc.buf,
2505 				    ioc.bufsiz, mode) != 0) {
2506 					rv = EFAULT;
2507 					break;
2508 				}
2509 			}
2510 
2511 			break;
2512 		}
2513 
2514 		default:
2515 			rv = EINVAL;
2516 			break;
2517 
2518 		} /* End of DEVCTL_AP_CONTROL cmd switch */
2519 
2520 		break;
2521 	}
2522 
2523 	default:
2524 	{
2525 		/*
2526 		 * If we got here, we got an IOCTL that SATA HBA Framework
2527 		 * does not recognize. Pass ioctl to HBA driver, in case
2528 		 * it could process it.
2529 		 */
2530 		sata_hba_tran_t *sata_tran = sata_hba_inst->satahba_tran;
2531 		dev_info_t	*mydip = SATA_DIP(sata_hba_inst);
2532 
2533 		SATADBG1(SATA_DBG_IOCTL_IF, sata_hba_inst,
2534 		    "IOCTL 0x%2x not supported in SATA framework, "
2535 		    "passthrough to HBA", cmd);
2536 
2537 		if (sata_tran->sata_tran_ioctl == NULL) {
2538 			rv = EINVAL;
2539 			break;
2540 		}
2541 		rval = (*sata_tran->sata_tran_ioctl)(mydip, cmd, arg);
2542 		if (rval != 0) {
2543 			SATADBG1(SATA_DBG_IOCTL_IF, sata_hba_inst,
2544 			    "IOCTL 0x%2x failed in HBA", cmd);
2545 			rv = rval;
2546 		}
2547 		break;
2548 	}
2549 
2550 	} /* End of main IOCTL switch */
2551 
2552 	if (dcp) {
2553 		ndi_dc_freehdl(dcp);
2554 	}
2555 	mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, cport)->cport_mutex);
2556 	cportinfo->cport_event_flags &= ~SATA_APCTL_LOCK_PORT_BUSY;
2557 	mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, cport)->cport_mutex);
2558 
2559 	return (rv);
2560 }
2561 
2562 
2563 /*
2564  * Create error retrieval sata packet
2565  *
2566  * A sata packet is allocated and set-up to contain specified error retrieval
2567  * command and appropriate dma-able data buffer.
2568  * No association with any scsi packet is made and no callback routine is
2569  * specified.
2570  *
2571  * Returns a pointer to sata packet upon successfull packet creation.
2572  * Returns NULL, if packet cannot be created.
2573  */
2574 sata_pkt_t *
2575 sata_get_error_retrieval_pkt(dev_info_t *dip, sata_device_t *sata_device,
2576     int pkt_type)
2577 {
2578 	sata_hba_inst_t	*sata_hba_inst;
2579 	sata_pkt_txlate_t *spx;
2580 	sata_pkt_t *spkt;
2581 	sata_drive_info_t *sdinfo;
2582 
2583 	mutex_enter(&sata_mutex);
2584 	for (sata_hba_inst = sata_hba_list; sata_hba_inst != NULL;
2585 	    sata_hba_inst = sata_hba_inst->satahba_next) {
2586 		if (SATA_DIP(sata_hba_inst) == dip)
2587 			break;
2588 	}
2589 	mutex_exit(&sata_mutex);
2590 	ASSERT(sata_hba_inst != NULL);
2591 
2592 	sdinfo = sata_get_device_info(sata_hba_inst, sata_device);
2593 	if (sdinfo == NULL) {
2594 		sata_log(sata_hba_inst, CE_WARN,
2595 		    "sata: error recovery request for non-attached device at "
2596 		    "cport %d", sata_device->satadev_addr.cport);
2597 		return (NULL);
2598 	}
2599 
2600 	spx = kmem_zalloc(sizeof (sata_pkt_txlate_t), KM_SLEEP);
2601 	spx->txlt_sata_hba_inst = sata_hba_inst;
2602 	spx->txlt_scsi_pkt = NULL;		/* No scsi pkt involved */
2603 	spkt = sata_pkt_alloc(spx, NULL);
2604 	if (spkt == NULL) {
2605 		kmem_free(spx, sizeof (sata_pkt_txlate_t));
2606 		return (NULL);
2607 	}
2608 	/* address is needed now */
2609 	spkt->satapkt_device.satadev_addr = sata_device->satadev_addr;
2610 
2611 	switch (pkt_type) {
2612 	case SATA_ERR_RETR_PKT_TYPE_NCQ:
2613 		/* Placeholder only */
2614 		break;
2615 
2616 	case SATA_ERR_RETR_PKT_TYPE_ATAPI:
2617 		if (sata_atapi_err_ret_cmd_setup(spx, sdinfo) == SATA_SUCCESS)
2618 			return (spkt);
2619 		break;
2620 
2621 	default:
2622 		break;
2623 	}
2624 
2625 	sata_pkt_free(spx);
2626 	kmem_free(spx, sizeof (sata_pkt_txlate_t));
2627 	return (NULL);
2628 
2629 }
2630 
2631 
2632 /*
2633  * Free error retrieval sata packet
2634  *
2635  * Free sata packet and any associated resources allocated previously by
2636  * sata_get_error_retrieval_pkt().
2637  *
2638  * Void return.
2639  */
2640 void
2641 sata_free_error_retrieval_pkt(sata_pkt_t *sata_pkt)
2642 {
2643 	sata_pkt_txlate_t *spx =
2644 	    (sata_pkt_txlate_t *)sata_pkt->satapkt_framework_private;
2645 
2646 	ASSERT(sata_pkt != NULL);
2647 
2648 	sata_free_local_buffer(spx);
2649 	sata_pkt_free(spx);
2650 	kmem_free(spx, sizeof (sata_pkt_txlate_t));
2651 
2652 }
2653 
2654 
2655 /* ****************** SCSA required entry points *********************** */
2656 
2657 /*
2658  * Implementation of scsi tran_tgt_init.
2659  * sata_scsi_tgt_init() initializes scsi_device structure
2660  *
2661  * If successful, DDI_SUCCESS is returned.
2662  * DDI_FAILURE is returned if addressed device does not exist
2663  */
2664 
2665 static int
2666 sata_scsi_tgt_init(dev_info_t *hba_dip, dev_info_t *tgt_dip,
2667     scsi_hba_tran_t *hba_tran, struct scsi_device *sd)
2668 {
2669 #ifndef __lock_lint
2670 	_NOTE(ARGUNUSED(hba_dip))
2671 	_NOTE(ARGUNUSED(tgt_dip))
2672 #endif
2673 	sata_device_t		sata_device;
2674 	sata_drive_info_t	*sdinfo;
2675 	struct sata_id		*sid;
2676 	sata_hba_inst_t		*sata_hba_inst;
2677 	char			model[SATA_ID_MODEL_LEN + 1];
2678 	char			fw[SATA_ID_FW_LEN + 1];
2679 	char			*vid, *pid;
2680 	int			i;
2681 
2682 	sata_hba_inst = (sata_hba_inst_t *)(hba_tran->tran_hba_private);
2683 
2684 	/* Validate scsi device address */
2685 	if (sata_validate_scsi_address(sata_hba_inst, &sd->sd_address,
2686 	    &sata_device) != 0)
2687 		return (DDI_FAILURE);
2688 
2689 	mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst,
2690 	    sata_device.satadev_addr.cport)));
2691 
2692 	/* sata_device now contains a valid sata address */
2693 	sdinfo = sata_get_device_info(sata_hba_inst, &sata_device);
2694 	if (sdinfo == NULL) {
2695 		mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
2696 		    sata_device.satadev_addr.cport)));
2697 		return (DDI_FAILURE);
2698 	}
2699 	mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
2700 	    sata_device.satadev_addr.cport)));
2701 
2702 	/*
2703 	 * Check if we need to create a legacy devid (i.e cmdk style) for
2704 	 * the target disks.
2705 	 *
2706 	 * HBA devinfo node will have the property "use-cmdk-devid-format"
2707 	 * if we need to create cmdk-style devid for all the disk devices
2708 	 * attached to this controller. This property may have been set
2709 	 * from HBA driver's .conf file or by the HBA driver in its
2710 	 * attach(9F) function.
2711 	 */
2712 	if ((sdinfo->satadrv_type == SATA_DTYPE_ATADISK) &&
2713 	    (ddi_getprop(DDI_DEV_T_ANY, hba_dip, DDI_PROP_DONTPASS,
2714 	    "use-cmdk-devid-format", 0) == 1)) {
2715 		/* register a legacy devid for this target node */
2716 		sata_target_devid_register(tgt_dip, sdinfo);
2717 	}
2718 
2719 
2720 	/*
2721 	 * 'Identify Device Data' does not always fit in standard SCSI
2722 	 * INQUIRY data, so establish INQUIRY_* properties with full-form
2723 	 * of information.
2724 	 */
2725 	sid = &sdinfo->satadrv_id;
2726 #ifdef	_LITTLE_ENDIAN
2727 	swab(sid->ai_model, model, SATA_ID_MODEL_LEN);
2728 	swab(sid->ai_fw, fw, SATA_ID_FW_LEN);
2729 #else	/* _LITTLE_ENDIAN */
2730 	bcopy(sid->ai_model, model, SATA_ID_MODEL_LEN);
2731 	bcopy(sid->ai_fw, fw, SATA_ID_FW_LEN);
2732 #endif	/* _LITTLE_ENDIAN */
2733 	model[SATA_ID_MODEL_LEN] = 0;
2734 	fw[SATA_ID_FW_LEN] = 0;
2735 
2736 	/* split model into into vid/pid */
2737 	for (i = 0, pid = model; i < SATA_ID_MODEL_LEN; i++, pid++)
2738 		if ((*pid == ' ') || (*pid == '\t'))
2739 			break;
2740 	if (i < SATA_ID_MODEL_LEN) {
2741 		vid = model;
2742 		*pid++ = 0;		/* terminate vid, establish pid */
2743 	} else {
2744 		vid = NULL;		/* vid will stay "ATA     " */
2745 		pid = model;		/* model is all pid */
2746 	}
2747 
2748 	if (vid)
2749 		(void) scsi_hba_prop_update_inqstring(sd, INQUIRY_VENDOR_ID,
2750 		    vid, strlen(vid));
2751 	if (pid)
2752 		(void) scsi_hba_prop_update_inqstring(sd, INQUIRY_PRODUCT_ID,
2753 		    pid, strlen(pid));
2754 	(void) scsi_hba_prop_update_inqstring(sd, INQUIRY_REVISION_ID,
2755 	    fw, strlen(fw));
2756 
2757 	return (DDI_SUCCESS);
2758 }
2759 
2760 /*
2761  * Implementation of scsi tran_tgt_probe.
2762  * Probe target, by calling default scsi routine scsi_hba_probe()
2763  */
2764 static int
2765 sata_scsi_tgt_probe(struct scsi_device *sd, int (*callback)(void))
2766 {
2767 	sata_hba_inst_t *sata_hba_inst =
2768 	    (sata_hba_inst_t *)(sd->sd_address.a_hba_tran->tran_hba_private);
2769 	int rval;
2770 
2771 	rval = scsi_hba_probe(sd, callback);
2772 
2773 	if (rval == SCSIPROBE_EXISTS) {
2774 		/*
2775 		 * Set property "pm-capable" on the target device node, so that
2776 		 * the target driver will not try to fetch scsi cycle counters
2777 		 * before enabling device power-management.
2778 		 */
2779 		if ((ddi_prop_update_int(DDI_DEV_T_NONE, sd->sd_dev,
2780 		    "pm-capable", 1)) != DDI_PROP_SUCCESS) {
2781 			sata_log(sata_hba_inst, CE_WARN,
2782 			    "SATA device at port %d: "
2783 			    "will not be power-managed ",
2784 			    SCSI_TO_SATA_CPORT(sd->sd_address.a_target));
2785 			SATA_LOG_D((sata_hba_inst, CE_WARN,
2786 			    "failure updating pm-capable property"));
2787 		}
2788 	}
2789 	return (rval);
2790 }
2791 
2792 /*
2793  * Implementation of scsi tran_tgt_free.
2794  * Release all resources allocated for scsi_device
2795  */
2796 static void
2797 sata_scsi_tgt_free(dev_info_t *hba_dip, dev_info_t *tgt_dip,
2798     scsi_hba_tran_t *hba_tran, struct scsi_device *sd)
2799 {
2800 #ifndef __lock_lint
2801 	_NOTE(ARGUNUSED(hba_dip))
2802 #endif
2803 	sata_device_t		sata_device;
2804 	sata_drive_info_t	*sdinfo;
2805 	sata_hba_inst_t		*sata_hba_inst;
2806 	ddi_devid_t		devid;
2807 
2808 	sata_hba_inst = (sata_hba_inst_t *)(hba_tran->tran_hba_private);
2809 
2810 	/* Validate scsi device address */
2811 	if (sata_validate_scsi_address(sata_hba_inst, &sd->sd_address,
2812 	    &sata_device) != 0)
2813 		return;
2814 
2815 	mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst,
2816 	    sata_device.satadev_addr.cport)));
2817 
2818 	/* sata_device now should contain a valid sata address */
2819 	sdinfo = sata_get_device_info(sata_hba_inst, &sata_device);
2820 	if (sdinfo == NULL) {
2821 		mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
2822 		    sata_device.satadev_addr.cport)));
2823 		return;
2824 	}
2825 	/*
2826 	 * We did not allocate any resources in sata_scsi_tgt_init()
2827 	 * other than few properties.
2828 	 * Free them.
2829 	 */
2830 	mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
2831 	    sata_device.satadev_addr.cport)));
2832 	if (ndi_prop_remove(DDI_DEV_T_NONE, tgt_dip, "pm-capable") !=
2833 	    DDI_PROP_SUCCESS)
2834 		SATA_LOG_D((sata_hba_inst, CE_WARN,
2835 		    "sata_scsi_tgt_free: pm-capable "
2836 		    "property could not be removed"));
2837 
2838 	/*
2839 	 * If devid was previously created but not freed up from
2840 	 * sd(7D) driver (i.e during detach(9F)) then do it here.
2841 	 */
2842 	if ((sdinfo->satadrv_type == SATA_DTYPE_ATADISK) &&
2843 	    (ddi_getprop(DDI_DEV_T_ANY, hba_dip, DDI_PROP_DONTPASS,
2844 	    "use-cmdk-devid-format", 0) == 1) &&
2845 	    (ddi_devid_get(tgt_dip, &devid) == DDI_SUCCESS)) {
2846 		ddi_devid_unregister(tgt_dip);
2847 		ddi_devid_free(devid);
2848 	}
2849 }
2850 
2851 /*
2852  * Implementation of scsi tran_init_pkt
2853  * Upon successful return, scsi pkt buffer has DMA resources allocated.
2854  *
2855  * It seems that we should always allocate pkt, even if the address is
2856  * for non-existing device - just use some default for dma_attr.
2857  * The reason is that there is no way to communicate this to a caller here.
2858  * Subsequent call to sata_scsi_start may fail appropriately.
2859  * Simply returning NULL does not seem to discourage a target driver...
2860  *
2861  * Returns a pointer to initialized scsi_pkt, or NULL otherwise.
2862  */
2863 static struct scsi_pkt *
2864 sata_scsi_init_pkt(struct scsi_address *ap, struct scsi_pkt *pkt,
2865     struct buf *bp, int cmdlen, int statuslen, int tgtlen, int flags,
2866     int (*callback)(caddr_t), caddr_t arg)
2867 {
2868 	sata_hba_inst_t *sata_hba_inst =
2869 	    (sata_hba_inst_t *)(ap->a_hba_tran->tran_hba_private);
2870 	dev_info_t *dip = SATA_DIP(sata_hba_inst);
2871 	sata_device_t sata_device;
2872 	sata_drive_info_t *sdinfo;
2873 	sata_pkt_txlate_t *spx;
2874 	ddi_dma_attr_t cur_dma_attr;
2875 	int rval;
2876 	boolean_t new_pkt = TRUE;
2877 
2878 	ASSERT(ap->a_hba_tran->tran_hba_dip == dip);
2879 
2880 	/*
2881 	 * We need to translate the address, even if it could be
2882 	 * a bogus one, for a non-existing device
2883 	 */
2884 	sata_device.satadev_addr.qual = SCSI_TO_SATA_ADDR_QUAL(ap->a_target);
2885 	sata_device.satadev_addr.cport = SCSI_TO_SATA_CPORT(ap->a_target);
2886 	sata_device.satadev_addr.pmport = SCSI_TO_SATA_PMPORT(ap->a_target);
2887 	sata_device.satadev_rev = SATA_DEVICE_REV;
2888 
2889 	if (pkt == NULL) {
2890 		/*
2891 		 * Have to allocate a brand new scsi packet.
2892 		 * We need to operate with auto request sense enabled.
2893 		 */
2894 		pkt = scsi_hba_pkt_alloc(dip, ap, cmdlen,
2895 		    MAX(statuslen, sizeof (struct scsi_arq_status)),
2896 		    tgtlen, sizeof (sata_pkt_txlate_t), callback, arg);
2897 
2898 		if (pkt == NULL)
2899 			return (NULL);
2900 
2901 		/* Fill scsi packet structure */
2902 		pkt->pkt_comp		= (void (*)())NULL;
2903 		pkt->pkt_time		= 0;
2904 		pkt->pkt_resid		= 0;
2905 		pkt->pkt_statistics	= 0;
2906 		pkt->pkt_reason		= 0;
2907 
2908 		/*
2909 		 * pkt_hba_private will point to sata pkt txlate structure
2910 		 */
2911 		spx = (sata_pkt_txlate_t *)pkt->pkt_ha_private;
2912 		bzero(spx, sizeof (sata_pkt_txlate_t));
2913 
2914 		spx->txlt_scsi_pkt = pkt;
2915 		spx->txlt_sata_hba_inst = sata_hba_inst;
2916 
2917 		/* Allocate sata_pkt */
2918 		spx->txlt_sata_pkt = sata_pkt_alloc(spx, callback);
2919 		if (spx->txlt_sata_pkt == NULL) {
2920 			/* Could not allocate sata pkt */
2921 			scsi_hba_pkt_free(ap, pkt);
2922 			return (NULL);
2923 		}
2924 		/* Set sata address */
2925 		spx->txlt_sata_pkt->satapkt_device.satadev_addr =
2926 		    sata_device.satadev_addr;
2927 		spx->txlt_sata_pkt->satapkt_device.satadev_rev =
2928 		    sata_device.satadev_rev;
2929 
2930 		if ((bp == NULL) || (bp->b_bcount == 0))
2931 			return (pkt);
2932 
2933 		spx->txlt_total_residue = bp->b_bcount;
2934 	} else {
2935 		new_pkt = FALSE;
2936 		/*
2937 		 * Packet was preallocated/initialized by previous call
2938 		 */
2939 		spx = (sata_pkt_txlate_t *)pkt->pkt_ha_private;
2940 
2941 		if ((bp == NULL) || (bp->b_bcount == 0)) {
2942 			return (pkt);
2943 		}
2944 		ASSERT(spx->txlt_buf_dma_handle != NULL);
2945 
2946 		/* Pkt is available already: spx->txlt_scsi_pkt == pkt; */
2947 	}
2948 
2949 	spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp = bp;
2950 
2951 	/*
2952 	 * We use an adjusted version of the dma_attr, to account
2953 	 * for device addressing limitations.
2954 	 * sata_adjust_dma_attr() will handle sdinfo == NULL which may
2955 	 * happen when a device is not yet configured.
2956 	 */
2957 	mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst,
2958 	    sata_device.satadev_addr.cport)));
2959 	sdinfo = sata_get_device_info(spx->txlt_sata_hba_inst,
2960 	    &spx->txlt_sata_pkt->satapkt_device);
2961 	/* NULL sdinfo may be passsed to sata_adjust_dma_attr() */
2962 	sata_adjust_dma_attr(sdinfo,
2963 	    SATA_DMA_ATTR(spx->txlt_sata_hba_inst), &cur_dma_attr);
2964 	mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
2965 	    sata_device.satadev_addr.cport)));
2966 	/*
2967 	 * Allocate necessary DMA resources for the packet's data buffer
2968 	 * NOTE:
2969 	 * In case of read/write commands, DMA resource allocation here is
2970 	 * based on the premise that the transfer length specified in
2971 	 * the read/write scsi cdb will match exactly DMA resources -
2972 	 * returning correct packet residue is crucial.
2973 	 */
2974 	if ((rval = sata_dma_buf_setup(spx, flags, callback, arg,
2975 	    &cur_dma_attr)) != DDI_SUCCESS) {
2976 		spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp = NULL;
2977 		sata_pkt_free(spx);
2978 		/*
2979 		 * If a DMA allocation request fails with
2980 		 * DDI_DMA_NOMAPPING, indicate the error by calling
2981 		 * bioerror(9F) with bp and an error code of EFAULT.
2982 		 * If a DMA allocation request fails with
2983 		 * DDI_DMA_TOOBIG, indicate the error by calling
2984 		 * bioerror(9F) with bp and an error code of EINVAL.
2985 		 */
2986 		switch (rval) {
2987 		case DDI_DMA_NORESOURCES:
2988 			bioerror(bp, 0);
2989 			break;
2990 		case DDI_DMA_NOMAPPING:
2991 		case DDI_DMA_BADATTR:
2992 			bioerror(bp, EFAULT);
2993 			break;
2994 		case DDI_DMA_TOOBIG:
2995 		default:
2996 			bioerror(bp, EINVAL);
2997 			break;
2998 		}
2999 		if (new_pkt == TRUE)
3000 			scsi_hba_pkt_free(ap, pkt);
3001 		return (NULL);
3002 	}
3003 	/* Set number of bytes that are not yet accounted for */
3004 	pkt->pkt_resid = spx->txlt_total_residue;
3005 	ASSERT(pkt->pkt_resid >= 0);
3006 
3007 	return (pkt);
3008 }
3009 
3010 /*
3011  * Implementation of scsi tran_start.
3012  * Translate scsi cmd into sata operation and return status.
3013  * Supported scsi commands:
3014  * SCMD_INQUIRY
3015  * SCMD_TEST_UNIT_READY
3016  * SCMD_START_STOP
3017  * SCMD_READ_CAPACITY
3018  * SCMD_REQUEST_SENSE
3019  * SCMD_LOG_SENSE_G1
3020  * SCMD_LOG_SELECT_G1
3021  * SCMD_MODE_SENSE	(specific pages)
3022  * SCMD_MODE_SENSE_G1	(specific pages)
3023  * SCMD_MODE_SELECT	(specific pages)
3024  * SCMD_MODE_SELECT_G1	(specific pages)
3025  * SCMD_SYNCHRONIZE_CACHE
3026  * SCMD_SYNCHRONIZE_CACHE_G1
3027  * SCMD_READ
3028  * SCMD_READ_G1
3029  * SCMD_READ_G4
3030  * SCMD_READ_G5
3031  * SCMD_WRITE
3032  * SCMD_WRITE_BUFFER
3033  * SCMD_WRITE_G1
3034  * SCMD_WRITE_G4
3035  * SCMD_WRITE_G5
3036  * SCMD_SEEK		(noop)
3037  * SCMD_SDIAG
3038  *
3039  * All other commands are rejected as unsupported.
3040  *
3041  * Returns:
3042  * TRAN_ACCEPT if command was executed successfully or accepted by HBA driver
3043  * for execution. TRAN_ACCEPT may be returned also if device was removed but
3044  * a callback could be scheduled.
3045  * TRAN_BADPKT if cmd was directed to invalid address.
3046  * TRAN_FATAL_ERROR is command was rejected due to hardware error, including
3047  * some unspecified error. TRAN_FATAL_ERROR may be also returned if a device
3048  * was removed and there was no callback specified in scsi pkt.
3049  * TRAN_BUSY if command could not be executed becasue HBA driver or SATA
3050  * framework was busy performing some other operation(s).
3051  *
3052  */
3053 static int
3054 sata_scsi_start(struct scsi_address *ap, struct scsi_pkt *pkt)
3055 {
3056 	sata_hba_inst_t *sata_hba_inst =
3057 	    (sata_hba_inst_t *)(ap->a_hba_tran->tran_hba_private);
3058 	sata_pkt_txlate_t *spx = (sata_pkt_txlate_t *)pkt->pkt_ha_private;
3059 	sata_drive_info_t *sdinfo;
3060 	struct buf *bp;
3061 	int cport;
3062 	int rval;
3063 
3064 	SATADBG1(SATA_DBG_SCSI_IF, sata_hba_inst,
3065 	    "sata_scsi_start: cmd 0x%02x\n", pkt->pkt_cdbp[0]);
3066 
3067 	ASSERT(spx != NULL &&
3068 	    spx->txlt_scsi_pkt == pkt && spx->txlt_sata_pkt != NULL);
3069 
3070 	cport = SCSI_TO_SATA_CPORT(ap->a_target);
3071 
3072 	mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst, cport)));
3073 	sdinfo = sata_get_device_info(sata_hba_inst,
3074 	    &spx->txlt_sata_pkt->satapkt_device);
3075 	if (sdinfo == NULL ||
3076 	    SATA_CPORT_INFO(sata_hba_inst, cport)->cport_tgtnode_clean ==
3077 	    B_FALSE) {
3078 		mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst, cport)));
3079 		pkt->pkt_reason = CMD_DEV_GONE;
3080 		/*
3081 		 * The sd target driver is checking CMD_DEV_GONE pkt_reason
3082 		 * only in callback function (for normal requests) and
3083 		 * in the dump code path.
3084 		 * So, if the callback is available, we need to do
3085 		 * the callback rather than returning TRAN_FATAL_ERROR here.
3086 		 */
3087 		if (pkt->pkt_comp != NULL) {
3088 			/* scsi callback required */
3089 			if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
3090 			    (task_func_t *)pkt->pkt_comp,
3091 			    (void *)pkt, TQ_SLEEP) == NULL)
3092 				/* Scheduling the callback failed */
3093 				return (TRAN_BUSY);
3094 			return (TRAN_ACCEPT);
3095 		}
3096 		/* No callback available */
3097 		return (TRAN_FATAL_ERROR);
3098 	}
3099 
3100 	if (sdinfo->satadrv_type == SATA_DTYPE_ATAPICD) {
3101 		mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst, cport)));
3102 		rval = sata_txlt_atapi(spx);
3103 		SATADBG1(SATA_DBG_SCSI_IF, sata_hba_inst,
3104 		    "sata_scsi_start atapi: rval %d\n", rval);
3105 		return (rval);
3106 	}
3107 	mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst, cport)));
3108 
3109 	/* ATA Disk commands processing starts here */
3110 
3111 	bp = spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp;
3112 
3113 	switch (pkt->pkt_cdbp[0]) {
3114 
3115 	case SCMD_INQUIRY:
3116 		/* Mapped to identify device */
3117 		if (bp != NULL && (bp->b_flags & (B_PHYS | B_PAGEIO)))
3118 			bp_mapin(bp);
3119 		rval = sata_txlt_inquiry(spx);
3120 		break;
3121 
3122 	case SCMD_TEST_UNIT_READY:
3123 		/*
3124 		 * SAT "SATA to ATA Translation" doc specifies translation
3125 		 * to ATA CHECK POWER MODE.
3126 		 */
3127 		rval = sata_txlt_test_unit_ready(spx);
3128 		break;
3129 
3130 	case SCMD_START_STOP:
3131 		/* Mapping depends on the command */
3132 		rval = sata_txlt_start_stop_unit(spx);
3133 		break;
3134 
3135 	case SCMD_READ_CAPACITY:
3136 		if (bp != NULL && (bp->b_flags & (B_PHYS | B_PAGEIO)))
3137 			bp_mapin(bp);
3138 		rval = sata_txlt_read_capacity(spx);
3139 		break;
3140 
3141 	case SCMD_REQUEST_SENSE:
3142 		/*
3143 		 * Always No Sense, since we force ARQ
3144 		 */
3145 		if (bp != NULL && (bp->b_flags & (B_PHYS | B_PAGEIO)))
3146 			bp_mapin(bp);
3147 		rval = sata_txlt_request_sense(spx);
3148 		break;
3149 
3150 	case SCMD_LOG_SENSE_G1:
3151 		if (bp != NULL && (bp->b_flags & (B_PHYS | B_PAGEIO)))
3152 			bp_mapin(bp);
3153 		rval = sata_txlt_log_sense(spx);
3154 		break;
3155 
3156 	case SCMD_LOG_SELECT_G1:
3157 		if (bp != NULL && (bp->b_flags & (B_PHYS | B_PAGEIO)))
3158 			bp_mapin(bp);
3159 		rval = sata_txlt_log_select(spx);
3160 		break;
3161 
3162 	case SCMD_MODE_SENSE:
3163 	case SCMD_MODE_SENSE_G1:
3164 		if (bp != NULL && (bp->b_flags & (B_PHYS | B_PAGEIO)))
3165 			bp_mapin(bp);
3166 		rval = sata_txlt_mode_sense(spx);
3167 		break;
3168 
3169 
3170 	case SCMD_MODE_SELECT:
3171 	case SCMD_MODE_SELECT_G1:
3172 		if (bp != NULL && (bp->b_flags & (B_PHYS | B_PAGEIO)))
3173 			bp_mapin(bp);
3174 		rval = sata_txlt_mode_select(spx);
3175 		break;
3176 
3177 	case SCMD_SYNCHRONIZE_CACHE:
3178 	case SCMD_SYNCHRONIZE_CACHE_G1:
3179 		rval = sata_txlt_synchronize_cache(spx);
3180 		break;
3181 
3182 	case SCMD_READ:
3183 	case SCMD_READ_G1:
3184 	case SCMD_READ_G4:
3185 	case SCMD_READ_G5:
3186 		rval = sata_txlt_read(spx);
3187 		break;
3188 	case SCMD_WRITE_BUFFER:
3189 		if (bp != NULL && (bp->b_flags & (B_PHYS | B_PAGEIO)))
3190 			bp_mapin(bp);
3191 		rval = sata_txlt_write_buffer(spx);
3192 		break;
3193 
3194 	case SCMD_WRITE:
3195 	case SCMD_WRITE_G1:
3196 	case SCMD_WRITE_G4:
3197 	case SCMD_WRITE_G5:
3198 		rval = sata_txlt_write(spx);
3199 		break;
3200 
3201 	case SCMD_SEEK:
3202 		rval = sata_txlt_nodata_cmd_immediate(spx);
3203 		break;
3204 
3205 		/* Other cases will be filed later */
3206 		/* postponed until phase 2 of the development */
3207 	default:
3208 		rval = sata_txlt_invalid_command(spx);
3209 		break;
3210 	}
3211 
3212 	SATADBG1(SATA_DBG_SCSI_IF, sata_hba_inst,
3213 	    "sata_scsi_start: rval %d\n", rval);
3214 
3215 	return (rval);
3216 }
3217 
3218 /*
3219  * Implementation of scsi tran_abort.
3220  * Abort specific pkt or all packets.
3221  *
3222  * Returns 1 if one or more packets were aborted, returns 0 otherwise
3223  *
3224  * May be called from an interrupt level.
3225  */
3226 static int
3227 sata_scsi_abort(struct scsi_address *ap, struct scsi_pkt *scsi_pkt)
3228 {
3229 	sata_hba_inst_t *sata_hba_inst =
3230 	    (sata_hba_inst_t *)(ap->a_hba_tran->tran_hba_private);
3231 	sata_device_t	sata_device;
3232 	sata_pkt_t	*sata_pkt;
3233 
3234 	SATADBG2(SATA_DBG_SCSI_IF, sata_hba_inst,
3235 	    "sata_scsi_abort: %s at target: 0x%x\n",
3236 	    scsi_pkt == NULL ? "all packets" : "one pkt", ap->a_target);
3237 
3238 	/* Validate address */
3239 	if (sata_validate_scsi_address(sata_hba_inst, ap, &sata_device) != 0)
3240 		/* Invalid address */
3241 		return (0);
3242 
3243 	mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst,
3244 	    sata_device.satadev_addr.cport)));
3245 	if (sata_get_device_info(sata_hba_inst, &sata_device) == NULL) {
3246 		/* invalid address */
3247 		mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
3248 		    sata_device.satadev_addr.cport)));
3249 		return (0);
3250 	}
3251 	if (scsi_pkt == NULL) {
3252 		/*
3253 		 * Abort all packets.
3254 		 * Although we do not have specific packet, we still need
3255 		 * dummy packet structure to pass device address to HBA.
3256 		 * Allocate one, without sleeping. Fail if pkt cannot be
3257 		 * allocated.
3258 		 */
3259 		sata_pkt = kmem_zalloc(sizeof (sata_pkt_t), KM_NOSLEEP);
3260 		if (sata_pkt == NULL) {
3261 			mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
3262 			    sata_device.satadev_addr.cport)));
3263 			SATA_LOG_D((sata_hba_inst, CE_WARN, "sata_pkt_abort: "
3264 			    "could not allocate sata_pkt"));
3265 			return (0);
3266 		}
3267 		sata_pkt->satapkt_rev = SATA_PKT_REV;
3268 		sata_pkt->satapkt_device = sata_device;
3269 		sata_pkt->satapkt_device.satadev_rev = SATA_DEVICE_REV;
3270 	} else {
3271 		if (scsi_pkt->pkt_ha_private == NULL) {
3272 			mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
3273 			    sata_device.satadev_addr.cport)));
3274 			return (0); /* Bad scsi pkt */
3275 		}
3276 		/* extract pointer to sata pkt */
3277 		sata_pkt = ((sata_pkt_txlate_t *)scsi_pkt->pkt_ha_private)->
3278 		    txlt_sata_pkt;
3279 	}
3280 
3281 	mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
3282 	    sata_device.satadev_addr.cport)));
3283 	/* Send abort request to HBA */
3284 	if ((*SATA_ABORT_FUNC(sata_hba_inst))
3285 	    (SATA_DIP(sata_hba_inst), sata_pkt,
3286 	    scsi_pkt == NULL ? SATA_ABORT_ALL_PACKETS : SATA_ABORT_PACKET) ==
3287 	    SATA_SUCCESS) {
3288 		if (scsi_pkt == NULL)
3289 			kmem_free(sata_pkt, sizeof (sata_pkt_t));
3290 		/* Success */
3291 		return (1);
3292 	}
3293 	/* Else, something did not go right */
3294 	if (scsi_pkt == NULL)
3295 		kmem_free(sata_pkt, sizeof (sata_pkt_t));
3296 	/* Failure */
3297 	return (0);
3298 }
3299 
3300 
3301 /*
3302  * Implementation of scsi tran_reset.
3303  * RESET_ALL request is translated into port reset.
3304  * RESET_TARGET requests is translated into a device reset,
3305  * RESET_LUN request is accepted only for LUN 0 and translated into
3306  * device reset.
3307  * The target reset should cause all HBA active and queued packets to
3308  * be terminated and returned with pkt reason SATA_PKT_RESET prior to
3309  * the return. HBA should report reset event for the device.
3310  *
3311  * Returns 1 upon success, 0 upon failure.
3312  */
3313 static int
3314 sata_scsi_reset(struct scsi_address *ap, int level)
3315 {
3316 	sata_hba_inst_t	*sata_hba_inst =
3317 	    (sata_hba_inst_t *)(ap->a_hba_tran->tran_hba_private);
3318 	sata_device_t	sata_device;
3319 	int		val;
3320 
3321 	SATADBG2(SATA_DBG_SCSI_IF, sata_hba_inst,
3322 	    "sata_scsi_reset: level %d target: 0x%x\n",
3323 	    level, ap->a_target);
3324 
3325 	/* Validate address */
3326 	val = sata_validate_scsi_address(sata_hba_inst, ap, &sata_device);
3327 	if (val == -1)
3328 		/* Invalid address */
3329 		return (0);
3330 
3331 	mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst,
3332 	    sata_device.satadev_addr.cport)));
3333 	if (sata_get_device_info(sata_hba_inst, &sata_device) == NULL) {
3334 		/* invalid address */
3335 		mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
3336 		    sata_device.satadev_addr.cport)));
3337 		return (0);
3338 	}
3339 	mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
3340 	    sata_device.satadev_addr.cport)));
3341 	if (level == RESET_ALL) {
3342 		/* port reset - cport only */
3343 		sata_device.satadev_addr.qual = SATA_ADDR_CPORT;
3344 		if ((*SATA_RESET_DPORT_FUNC(sata_hba_inst))
3345 		    (SATA_DIP(sata_hba_inst), &sata_device) == SATA_SUCCESS)
3346 			return (1);
3347 		else
3348 			return (0);
3349 
3350 	} else if (val == 0 &&
3351 	    (level == RESET_TARGET || level == RESET_LUN)) {
3352 		/* reset device (device attached) */
3353 		if ((*SATA_RESET_DPORT_FUNC(sata_hba_inst))
3354 		    (SATA_DIP(sata_hba_inst), &sata_device) == SATA_SUCCESS)
3355 			return (1);
3356 		else
3357 			return (0);
3358 	}
3359 	return (0);
3360 }
3361 
3362 
3363 /*
3364  * Implementation of scsi tran_getcap (get transport/device capabilities).
3365  * Supported capabilities for SATA hard disks:
3366  * auto-rqsense		(always supported)
3367  * tagged-qing		(supported if HBA supports it)
3368  * untagged-qing	(could be supported if disk supports it, but because
3369  *			 caching behavior allowing untagged queuing actually
3370  *			 results in reduced performance.  sd tries to throttle
3371  *			 back to only 3 outstanding commands, which may
3372  *			 work for real SCSI disks, but with read ahead
3373  *			 caching, having more than 1 outstanding command
3374  *			 results in cache thrashing.)
3375  * sector_size
3376  * dma_max
3377  * interconnect-type	(INTERCONNECT_SATA)
3378  *
3379  * Supported capabilities for ATAPI devices (CD/DVD):
3380  * auto-rqsense		(always supported)
3381  * sector_size
3382  * dma_max
3383  * interconnect-type	(INTERCONNECT_SATA)
3384  *
3385  * Request for other capabilities is rejected as unsupported.
3386  *
3387  * Returns supported capability value, or -1 if capability is unsuppported or
3388  * the address is invalid - no device.
3389  */
3390 
3391 static int
3392 sata_scsi_getcap(struct scsi_address *ap, char *cap, int whom)
3393 {
3394 
3395 	sata_hba_inst_t 	*sata_hba_inst =
3396 	    (sata_hba_inst_t *)(ap->a_hba_tran->tran_hba_private);
3397 	sata_device_t		sata_device;
3398 	sata_drive_info_t	*sdinfo;
3399 	ddi_dma_attr_t		adj_dma_attr;
3400 	int 			rval;
3401 
3402 	SATADBG2(SATA_DBG_SCSI_IF, sata_hba_inst,
3403 	    "sata_scsi_getcap: target: 0x%x, cap: %s\n",
3404 	    ap->a_target, cap);
3405 
3406 	/*
3407 	 * We want to process the capabilities on per port granularity.
3408 	 * So, we are specifically restricting ourselves to whom != 0
3409 	 * to exclude the controller wide handling.
3410 	 */
3411 	if (cap == NULL || whom == 0)
3412 		return (-1);
3413 
3414 	if (sata_validate_scsi_address(sata_hba_inst, ap, &sata_device) != 0) {
3415 		/* Invalid address */
3416 		return (-1);
3417 	}
3418 	mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst,
3419 	    sata_device.satadev_addr.cport)));
3420 	if ((sdinfo = sata_get_device_info(sata_hba_inst, &sata_device)) ==
3421 	    NULL) {
3422 		/* invalid address */
3423 		mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
3424 		    sata_device.satadev_addr.cport)));
3425 		return (-1);
3426 	}
3427 
3428 	switch (scsi_hba_lookup_capstr(cap)) {
3429 	case SCSI_CAP_ARQ:
3430 		rval = 1;		/* ARQ supported, turned on */
3431 		break;
3432 
3433 	case SCSI_CAP_SECTOR_SIZE:
3434 		if (sdinfo->satadrv_type == SATA_DTYPE_ATADISK)
3435 			rval = SATA_DISK_SECTOR_SIZE;	/* fixed size */
3436 		else if (sdinfo->satadrv_type == SATA_DTYPE_ATAPICD)
3437 			rval = SATA_ATAPI_SECTOR_SIZE;
3438 		else rval = -1;
3439 		break;
3440 
3441 	/*
3442 	 * untagged queuing cause a performance inversion because of
3443 	 * the way sd operates.  Because of this reason we do not
3444 	 * use it when available.
3445 	 */
3446 	case SCSI_CAP_UNTAGGED_QING:
3447 		if (sdinfo->satadrv_features_enabled &
3448 		    SATA_DEV_F_E_UNTAGGED_QING)
3449 			rval = 1;	/* Untagged queuing available */
3450 		else
3451 			rval = -1;	/* Untagged queuing not available */
3452 		break;
3453 
3454 	case SCSI_CAP_TAGGED_QING:
3455 		if (sdinfo->satadrv_features_enabled & SATA_DEV_F_E_TAGGED_QING)
3456 			rval = 1;	/* Tagged queuing available */
3457 		else
3458 			rval = -1;	/* Tagged queuing not available */
3459 		break;
3460 
3461 	case SCSI_CAP_DMA_MAX:
3462 		sata_adjust_dma_attr(sdinfo, SATA_DMA_ATTR(sata_hba_inst),
3463 		    &adj_dma_attr);
3464 		rval = (int)adj_dma_attr.dma_attr_maxxfer;
3465 		/* We rely on the fact that dma_attr_maxxfer < 0x80000000 */
3466 		break;
3467 
3468 	case SCSI_CAP_INTERCONNECT_TYPE:
3469 		rval = INTERCONNECT_SATA;	/* SATA interconnect type */
3470 		break;
3471 
3472 	default:
3473 		rval = -1;
3474 		break;
3475 	}
3476 	mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
3477 	    sata_device.satadev_addr.cport)));
3478 	return (rval);
3479 }
3480 
3481 /*
3482  * Implementation of scsi tran_setcap
3483  *
3484  * Only SCSI_CAP_UNTAGGED_QING and  SCSI_CAP_TAGGED_QING are changeable.
3485  *
3486  */
3487 static int
3488 sata_scsi_setcap(struct scsi_address *ap, char *cap, int value, int whom)
3489 {
3490 	sata_hba_inst_t	*sata_hba_inst =
3491 	    (sata_hba_inst_t *)(ap->a_hba_tran->tran_hba_private);
3492 	sata_device_t	sata_device;
3493 	sata_drive_info_t	*sdinfo;
3494 	int		rval;
3495 
3496 	SATADBG2(SATA_DBG_SCSI_IF, sata_hba_inst,
3497 	    "sata_scsi_setcap: target: 0x%x, cap: %s\n", ap->a_target, cap);
3498 
3499 	/*
3500 	 * We want to process the capabilities on per port granularity.
3501 	 * So, we are specifically restricting ourselves to whom != 0
3502 	 * to exclude the controller wide handling.
3503 	 */
3504 	if (cap == NULL || whom == 0) {
3505 		return (-1);
3506 	}
3507 
3508 	if (sata_validate_scsi_address(sata_hba_inst, ap, &sata_device) != 0) {
3509 		/* Invalid address */
3510 		return (-1);
3511 	}
3512 	mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst,
3513 	    sata_device.satadev_addr.cport)));
3514 	if ((sdinfo = sata_get_device_info(sata_hba_inst,
3515 	    &sata_device)) == NULL) {
3516 		/* invalid address */
3517 		mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
3518 		    sata_device.satadev_addr.cport)));
3519 		return (-1);
3520 	}
3521 	mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
3522 	    sata_device.satadev_addr.cport)));
3523 
3524 	switch (scsi_hba_lookup_capstr(cap)) {
3525 	case SCSI_CAP_ARQ:
3526 	case SCSI_CAP_SECTOR_SIZE:
3527 	case SCSI_CAP_DMA_MAX:
3528 	case SCSI_CAP_INTERCONNECT_TYPE:
3529 		rval = 0;
3530 		break;
3531 	case SCSI_CAP_UNTAGGED_QING:
3532 		if (SATA_QDEPTH(sata_hba_inst) > 1) {
3533 			rval = 1;
3534 			if (value == 1) {
3535 				sdinfo->satadrv_features_enabled |=
3536 				    SATA_DEV_F_E_UNTAGGED_QING;
3537 			} else if (value == 0) {
3538 				sdinfo->satadrv_features_enabled &=
3539 				    ~SATA_DEV_F_E_UNTAGGED_QING;
3540 			} else {
3541 				rval = -1;
3542 			}
3543 		} else {
3544 			rval = 0;
3545 		}
3546 		break;
3547 	case SCSI_CAP_TAGGED_QING:
3548 		/* This can TCQ or NCQ */
3549 		if (sata_func_enable & SATA_ENABLE_QUEUING &&
3550 		    ((sdinfo->satadrv_features_support & SATA_DEV_F_TCQ &&
3551 		    SATA_FEATURES(sata_hba_inst) & SATA_CTLF_QCMD) ||
3552 		    (sata_func_enable & SATA_ENABLE_NCQ &&
3553 		    sdinfo->satadrv_features_support & SATA_DEV_F_NCQ &&
3554 		    SATA_FEATURES(sata_hba_inst) & SATA_CTLF_NCQ))) {
3555 			rval = 1;
3556 			if (value == 1) {
3557 				sdinfo->satadrv_features_enabled |=
3558 				    SATA_DEV_F_E_TAGGED_QING;
3559 			} else if (value == 0) {
3560 				sdinfo->satadrv_features_enabled &=
3561 				    ~SATA_DEV_F_E_TAGGED_QING;
3562 			} else {
3563 				rval = -1;
3564 			}
3565 		} else {
3566 			rval = 0;
3567 		}
3568 		break;
3569 	default:
3570 		rval = -1;
3571 		break;
3572 	}
3573 	return (rval);
3574 }
3575 
3576 /*
3577  * Implementations of scsi tran_destroy_pkt.
3578  * Free resources allocated by sata_scsi_init_pkt()
3579  */
3580 static void
3581 sata_scsi_destroy_pkt(struct scsi_address *ap, struct scsi_pkt *pkt)
3582 {
3583 	sata_pkt_txlate_t *spx;
3584 
3585 	spx = (sata_pkt_txlate_t *)pkt->pkt_ha_private;
3586 
3587 	if (spx->txlt_buf_dma_handle != NULL) {
3588 		if (spx->txlt_tmp_buf != NULL)  {
3589 			ASSERT(spx->txlt_tmp_buf_handle != 0);
3590 			/*
3591 			 * Intermediate DMA buffer was allocated.
3592 			 * Free allocated buffer and associated access handle.
3593 			 */
3594 			ddi_dma_mem_free(&spx->txlt_tmp_buf_handle);
3595 			spx->txlt_tmp_buf = NULL;
3596 		}
3597 		/*
3598 		 * Free DMA resources - cookies and handles
3599 		 */
3600 		if (spx->txlt_dma_cookie_list != NULL) {
3601 			if (spx->txlt_dma_cookie_list !=
3602 			    &spx->txlt_dma_cookie) {
3603 				(void) kmem_free(spx->txlt_dma_cookie_list,
3604 				    spx->txlt_dma_cookie_list_len *
3605 				    sizeof (ddi_dma_cookie_t));
3606 				spx->txlt_dma_cookie_list = NULL;
3607 			}
3608 		}
3609 		(void) ddi_dma_unbind_handle(spx->txlt_buf_dma_handle);
3610 		(void) ddi_dma_free_handle(&spx->txlt_buf_dma_handle);
3611 	}
3612 	spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp = NULL;
3613 	sata_pkt_free(spx);
3614 
3615 	scsi_hba_pkt_free(ap, pkt);
3616 }
3617 
3618 /*
3619  * Implementation of scsi tran_dmafree.
3620  * Free DMA resources allocated by sata_scsi_init_pkt()
3621  */
3622 
3623 static void
3624 sata_scsi_dmafree(struct scsi_address *ap, struct scsi_pkt *pkt)
3625 {
3626 #ifndef __lock_lint
3627 	_NOTE(ARGUNUSED(ap))
3628 #endif
3629 	sata_pkt_txlate_t *spx;
3630 
3631 	ASSERT(pkt != NULL);
3632 	spx = (sata_pkt_txlate_t *)pkt->pkt_ha_private;
3633 
3634 	if (spx->txlt_buf_dma_handle != NULL) {
3635 		if (spx->txlt_tmp_buf != NULL)  {
3636 			/*
3637 			 * Intermediate DMA buffer was allocated.
3638 			 * Free allocated buffer and associated access handle.
3639 			 */
3640 			ddi_dma_mem_free(&spx->txlt_tmp_buf_handle);
3641 			spx->txlt_tmp_buf = NULL;
3642 		}
3643 		/*
3644 		 * Free DMA resources - cookies and handles
3645 		 */
3646 		/* ASSERT(spx->txlt_dma_cookie_list != NULL); */
3647 		if (spx->txlt_dma_cookie_list != NULL) {
3648 			if (spx->txlt_dma_cookie_list !=
3649 			    &spx->txlt_dma_cookie) {
3650 				(void) kmem_free(spx->txlt_dma_cookie_list,
3651 				    spx->txlt_dma_cookie_list_len *
3652 				    sizeof (ddi_dma_cookie_t));
3653 				spx->txlt_dma_cookie_list = NULL;
3654 			}
3655 		}
3656 		(void) ddi_dma_unbind_handle(spx->txlt_buf_dma_handle);
3657 		(void) ddi_dma_free_handle(&spx->txlt_buf_dma_handle);
3658 		spx->txlt_buf_dma_handle = NULL;
3659 	}
3660 }
3661 
3662 /*
3663  * Implementation of scsi tran_sync_pkt.
3664  *
3665  * The assumption below is that pkt is unique - there is no need to check ap
3666  *
3667  * Synchronize DMA buffer and, if the intermediate buffer is used, copy data
3668  * into/from the real buffer.
3669  */
3670 static void
3671 sata_scsi_sync_pkt(struct scsi_address *ap, struct scsi_pkt *pkt)
3672 {
3673 #ifndef __lock_lint
3674 	_NOTE(ARGUNUSED(ap))
3675 #endif
3676 	int rval;
3677 	sata_pkt_txlate_t *spx = (sata_pkt_txlate_t *)pkt->pkt_ha_private;
3678 	struct buf *bp;
3679 	int direction;
3680 
3681 	ASSERT(spx != NULL);
3682 	if (spx->txlt_buf_dma_handle != NULL) {
3683 		direction = spx->txlt_sata_pkt->
3684 		    satapkt_cmd.satacmd_flags.sata_data_direction;
3685 		if (spx->txlt_sata_pkt != NULL &&
3686 		    direction != SATA_DIR_NODATA_XFER) {
3687 			if (spx->txlt_tmp_buf != NULL) {
3688 				/* Intermediate DMA buffer used */
3689 				bp = spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp;
3690 
3691 				if (direction & SATA_DIR_WRITE) {
3692 					bcopy(bp->b_un.b_addr,
3693 					    spx->txlt_tmp_buf, bp->b_bcount);
3694 				}
3695 			}
3696 			/* Sync the buffer for device or for CPU */
3697 			rval = ddi_dma_sync(spx->txlt_buf_dma_handle,   0, 0,
3698 			    (direction & SATA_DIR_WRITE) ?
3699 			    DDI_DMA_SYNC_FORDEV :  DDI_DMA_SYNC_FORCPU);
3700 			ASSERT(rval == DDI_SUCCESS);
3701 			if (spx->txlt_tmp_buf != NULL &&
3702 			    !(direction & SATA_DIR_WRITE)) {
3703 				/* Intermediate DMA buffer used for read */
3704 				bcopy(spx->txlt_tmp_buf,
3705 				    bp->b_un.b_addr, bp->b_bcount);
3706 			}
3707 
3708 		}
3709 	}
3710 }
3711 
3712 
3713 
3714 /* *******************  SATA - SCSI Translation functions **************** */
3715 /*
3716  * SCSI to SATA pkt and command translation and SATA to SCSI status/error
3717  * translation.
3718  */
3719 
3720 /*
3721  * Checks if a device exists and can be access and translates common
3722  * scsi_pkt data to sata_pkt data.
3723  *
3724  * Returns TRAN_ACCEPT and scsi pkt_reason CMD_CMPLT if device exists and
3725  * sata_pkt was set-up.
3726  * Returns TRAN_ACCEPT and scsi pkt_reason CMD_DEV_GONE if device does not
3727  * exist and pkt_comp callback was scheduled.
3728  * Returns other TRAN_XXXXX values when error occured and command should be
3729  * rejected with the returned TRAN_XXXXX value.
3730  *
3731  * This function should be called with port mutex held.
3732  */
3733 static int
3734 sata_txlt_generic_pkt_info(sata_pkt_txlate_t *spx)
3735 {
3736 	sata_drive_info_t *sdinfo;
3737 	sata_device_t sata_device;
3738 	const struct sata_cmd_flags sata_initial_cmd_flags = {
3739 		SATA_DIR_NODATA_XFER,
3740 		/* all other values to 0/FALSE */
3741 	};
3742 	/*
3743 	 * Pkt_reason has to be set if the pkt_comp callback is invoked,
3744 	 * and that implies TRAN_ACCEPT return value. Any other returned value
3745 	 * indicates that the scsi packet was not accepted (the reason will not
3746 	 * be checked by the scsi traget driver).
3747 	 * To make debugging easier, we set pkt_reason to know value here.
3748 	 * It may be changed later when different completion reason is
3749 	 * determined.
3750 	 */
3751 	spx->txlt_scsi_pkt->pkt_reason = CMD_TRAN_ERR;
3752 
3753 	/* Validate address */
3754 	switch (sata_validate_scsi_address(spx->txlt_sata_hba_inst,
3755 	    &spx->txlt_scsi_pkt->pkt_address, &sata_device)) {
3756 
3757 	case -1:
3758 		/* Invalid address or invalid device type */
3759 		return (TRAN_BADPKT);
3760 	case 1:
3761 		/* valid address but no device - it has disappeared ? */
3762 		spx->txlt_scsi_pkt->pkt_reason = CMD_DEV_GONE;
3763 		/*
3764 		 * The sd target driver is checking CMD_DEV_GONE pkt_reason
3765 		 * only in callback function (for normal requests) and
3766 		 * in the dump code path.
3767 		 * So, if the callback is available, we need to do
3768 		 * the callback rather than returning TRAN_FATAL_ERROR here.
3769 		 */
3770 		if (spx->txlt_scsi_pkt->pkt_comp != NULL) {
3771 			/* scsi callback required */
3772 			if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
3773 			    (task_func_t *)spx->txlt_scsi_pkt->pkt_comp,
3774 			    (void *)spx->txlt_scsi_pkt,
3775 			    TQ_SLEEP) == NULL)
3776 				/* Scheduling the callback failed */
3777 				return (TRAN_BUSY);
3778 
3779 			return (TRAN_ACCEPT);
3780 		}
3781 		return (TRAN_FATAL_ERROR);
3782 	default:
3783 		/* all OK */
3784 		break;
3785 	}
3786 	sdinfo = sata_get_device_info(spx->txlt_sata_hba_inst,
3787 	    &spx->txlt_sata_pkt->satapkt_device);
3788 
3789 	/*
3790 	 * If device is in reset condition, reject the packet with
3791 	 * TRAN_BUSY, unless:
3792 	 * 1. system is panicking (dumping)
3793 	 * In such case only one thread is running and there is no way to
3794 	 * process reset.
3795 	 * 2. cfgadm operation is is progress (internal APCTL lock is set)
3796 	 * Some cfgadm operations involve drive commands, so reset condition
3797 	 * needs to be ignored for IOCTL operations.
3798 	 */
3799 	if ((sdinfo->satadrv_event_flags &
3800 	    (SATA_EVNT_DEVICE_RESET | SATA_EVNT_INPROC_DEVICE_RESET)) != 0) {
3801 
3802 		if (!ddi_in_panic() &&
3803 		    ((SATA_CPORT_EVENT_FLAGS(spx->txlt_sata_hba_inst,
3804 		    sata_device.satadev_addr.cport) &
3805 		    SATA_APCTL_LOCK_PORT_BUSY) == 0)) {
3806 			spx->txlt_scsi_pkt->pkt_reason = CMD_INCOMPLETE;
3807 			SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
3808 			    "sata_scsi_start: rejecting command because "
3809 			    "of device reset state\n", NULL);
3810 			return (TRAN_BUSY);
3811 		}
3812 	}
3813 
3814 	/*
3815 	 * Fix the dev_type in the sata_pkt->satapkt_device. It was not set by
3816 	 * sata_scsi_pkt_init() because pkt init had to work also with
3817 	 * non-existing devices.
3818 	 * Now we know that the packet was set-up for a real device, so its
3819 	 * type is known.
3820 	 */
3821 	spx->txlt_sata_pkt->satapkt_device.satadev_type = sdinfo->satadrv_type;
3822 
3823 	spx->txlt_sata_pkt->satapkt_cmd.satacmd_flags = sata_initial_cmd_flags;
3824 	if ((SATA_CPORT_INFO(spx->txlt_sata_hba_inst,
3825 	    sata_device.satadev_addr.cport)->cport_event_flags &
3826 	    SATA_APCTL_LOCK_PORT_BUSY) != 0) {
3827 		spx->txlt_sata_pkt->satapkt_cmd.satacmd_flags.
3828 		    sata_ignore_dev_reset = B_TRUE;
3829 	}
3830 	/*
3831 	 * At this point the generic translation routine determined that the
3832 	 * scsi packet should be accepted. Packet completion reason may be
3833 	 * changed later when a different completion reason is determined.
3834 	 */
3835 	spx->txlt_scsi_pkt->pkt_reason = CMD_CMPLT;
3836 
3837 	if ((spx->txlt_scsi_pkt->pkt_flags & FLAG_NOINTR) != 0) {
3838 		/* Synchronous execution */
3839 		spx->txlt_sata_pkt->satapkt_op_mode = SATA_OPMODE_SYNCH |
3840 		    SATA_OPMODE_POLLING;
3841 		spx->txlt_sata_pkt->satapkt_cmd.satacmd_flags.
3842 		    sata_ignore_dev_reset = ddi_in_panic();
3843 	} else {
3844 		/* Asynchronous execution */
3845 		spx->txlt_sata_pkt->satapkt_op_mode = SATA_OPMODE_ASYNCH |
3846 		    SATA_OPMODE_INTERRUPTS;
3847 	}
3848 	/* Convert queuing information */
3849 	if (spx->txlt_scsi_pkt->pkt_flags & FLAG_STAG)
3850 		spx->txlt_sata_pkt->satapkt_cmd.satacmd_flags.sata_queue_stag =
3851 		    B_TRUE;
3852 	else if (spx->txlt_scsi_pkt->pkt_flags &
3853 	    (FLAG_OTAG | FLAG_HTAG | FLAG_HEAD))
3854 		spx->txlt_sata_pkt->satapkt_cmd.satacmd_flags.sata_queue_otag =
3855 		    B_TRUE;
3856 
3857 	/* Always limit pkt time */
3858 	if (spx->txlt_scsi_pkt->pkt_time == 0)
3859 		spx->txlt_sata_pkt->satapkt_time = sata_default_pkt_time;
3860 	else
3861 		/* Pass on scsi_pkt time */
3862 		spx->txlt_sata_pkt->satapkt_time =
3863 		    spx->txlt_scsi_pkt->pkt_time;
3864 
3865 	return (TRAN_ACCEPT);
3866 }
3867 
3868 
3869 /*
3870  * Translate ATA Identify Device data to SCSI Inquiry data.
3871  * This function may be called only for ATA devices.
3872  * This function should not be called for ATAPI devices - they
3873  * respond directly to SCSI Inquiry command.
3874  *
3875  * SATA Identify Device data has to be valid in sata_rive_info.
3876  * Buffer has to accomodate the inquiry length (36 bytes).
3877  *
3878  * This function should be called with a port mutex held.
3879  */
3880 static	void
3881 sata_identdev_to_inquiry(sata_hba_inst_t *sata_hba_inst,
3882     sata_drive_info_t *sdinfo, uint8_t *buf)
3883 {
3884 
3885 	struct scsi_inquiry *inq = (struct scsi_inquiry *)buf;
3886 	struct sata_id *sid = &sdinfo->satadrv_id;
3887 
3888 	/* Start with a nice clean slate */
3889 	bzero((void *)inq, sizeof (struct scsi_inquiry));
3890 
3891 	/*
3892 	 * Rely on the dev_type for setting paripheral qualifier.
3893 	 * Assume that  DTYPE_RODIRECT applies to CD/DVD R/W devices.
3894 	 * It could be that DTYPE_OPTICAL could also qualify in the future.
3895 	 * ATAPI Inquiry may provide more data to the target driver.
3896 	 */
3897 	inq->inq_dtype = sdinfo->satadrv_type == SATA_DTYPE_ATADISK ?
3898 	    DTYPE_DIRECT : DTYPE_RODIRECT; /* DTYPE_UNKNOWN; */
3899 
3900 	inq->inq_rmb = sid->ai_config & SATA_REM_MEDIA ? 1 : 0;
3901 	inq->inq_qual = 0;	/* Device type qualifier (obsolete in SCSI3? */
3902 	inq->inq_iso = 0;	/* ISO version */
3903 	inq->inq_ecma = 0;	/* ECMA version */
3904 	inq->inq_ansi = 3;	/* ANSI version - SCSI 3 */
3905 	inq->inq_aenc = 0;	/* Async event notification cap. */
3906 	inq->inq_trmiop = 0;	/* Supports TERMINATE I/O PROC msg - NO */
3907 	inq->inq_normaca = 0;	/* setting NACA bit supported - NO */
3908 	inq->inq_rdf = RDF_SCSI2; /* Response data format- SPC-3 */
3909 	inq->inq_len = 31;	/* Additional length */
3910 	inq->inq_dualp = 0;	/* dual port device - NO */
3911 	inq->inq_reladdr = 0;	/* Supports relative addressing - NO */
3912 	inq->inq_sync = 0;	/* Supports synchronous data xfers - NO */
3913 	inq->inq_linked = 0;	/* Supports linked commands - NO */
3914 				/*
3915 				 * Queuing support - controller has to
3916 				 * support some sort of command queuing.
3917 				 */
3918 	if (SATA_QDEPTH(sata_hba_inst) > 1)
3919 		inq->inq_cmdque = 1; /* Supports command queueing - YES */
3920 	else
3921 		inq->inq_cmdque = 0; /* Supports command queueing - NO */
3922 	inq->inq_sftre = 0;	/* Supports Soft Reset option - NO ??? */
3923 	inq->inq_wbus32 = 0;	/* Supports 32 bit wide data xfers - NO */
3924 	inq->inq_wbus16 = 0;	/* Supports 16 bit wide data xfers - NO */
3925 
3926 #ifdef	_LITTLE_ENDIAN
3927 	/* Swap text fields to match SCSI format */
3928 	bcopy("ATA     ", inq->inq_vid, 8);		/* Vendor ID */
3929 	swab(sid->ai_model, inq->inq_pid, 16);		/* Product ID */
3930 	if (strncmp(&sid->ai_fw[4], "    ", 4) == 0)
3931 		swab(sid->ai_fw, inq->inq_revision, 4);	/* Revision level */
3932 	else
3933 		swab(&sid->ai_fw[4], inq->inq_revision, 4);	/* Rev. level */
3934 #else	/* _LITTLE_ENDIAN */
3935 	bcopy("ATA     ", inq->inq_vid, 8);		/* Vendor ID */
3936 	bcopy(sid->ai_model, inq->inq_pid, 16);		/* Product ID */
3937 	if (strncmp(&sid->ai_fw[4], "    ", 4) == 0)
3938 		bcopy(sid->ai_fw, inq->inq_revision, 4); /* Revision level */
3939 	else
3940 		bcopy(&sid->ai_fw[4], inq->inq_revision, 4); /* Rev. level */
3941 #endif	/* _LITTLE_ENDIAN */
3942 }
3943 
3944 
3945 /*
3946  * Scsi response set up for invalid command (command not supported)
3947  *
3948  * Returns TRAN_ACCEPT and appropriate values in scsi_pkt fields.
3949  */
3950 static int
3951 sata_txlt_invalid_command(sata_pkt_txlate_t *spx)
3952 {
3953 	struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
3954 	struct scsi_extended_sense *sense;
3955 
3956 	scsipkt->pkt_reason = CMD_CMPLT;
3957 	scsipkt->pkt_state = STATE_GOT_BUS | STATE_GOT_TARGET |
3958 	    STATE_SENT_CMD | STATE_GOT_STATUS;
3959 
3960 	*scsipkt->pkt_scbp = STATUS_CHECK;
3961 
3962 	sense = sata_arq_sense(spx);
3963 	sense->es_key = KEY_ILLEGAL_REQUEST;
3964 	sense->es_add_code = SD_SCSI_ASC_INVALID_COMMAND_CODE;
3965 
3966 	SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
3967 	    "Scsi_pkt completion reason %x\n", scsipkt->pkt_reason);
3968 
3969 	if ((scsipkt->pkt_flags & FLAG_NOINTR) == 0 &&
3970 	    scsipkt->pkt_comp != NULL)
3971 		/* scsi callback required */
3972 		if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
3973 		    (task_func_t *)spx->txlt_scsi_pkt->pkt_comp,
3974 		    (void *)spx->txlt_scsi_pkt,
3975 		    TQ_SLEEP) == NULL)
3976 			/* Scheduling the callback failed */
3977 			return (TRAN_BUSY);
3978 	return (TRAN_ACCEPT);
3979 }
3980 
3981 /*
3982  * Scsi response setup for
3983  * emulated non-data command that requires no action/return data
3984  *
3985  * Returns TRAN_ACCEPT and appropriate values in scsi_pkt fields.
3986  */
3987 static 	int
3988 sata_txlt_nodata_cmd_immediate(sata_pkt_txlate_t *spx)
3989 {
3990 	int rval;
3991 
3992 	mutex_enter(&(SATA_TXLT_CPORT_MUTEX(spx)));
3993 
3994 	if (((rval = sata_txlt_generic_pkt_info(spx)) != TRAN_ACCEPT) ||
3995 	    (spx->txlt_scsi_pkt->pkt_reason == CMD_DEV_GONE)) {
3996 		mutex_exit(&(SATA_TXLT_CPORT_MUTEX(spx)));
3997 		return (rval);
3998 	}
3999 	mutex_exit(&(SATA_TXLT_CPORT_MUTEX(spx)));
4000 
4001 	spx->txlt_scsi_pkt->pkt_state = STATE_GOT_BUS | STATE_GOT_TARGET |
4002 	    STATE_SENT_CMD | STATE_GOT_STATUS;
4003 	spx->txlt_scsi_pkt->pkt_reason = CMD_CMPLT;
4004 	*(spx->txlt_scsi_pkt->pkt_scbp) = STATUS_GOOD;
4005 
4006 	SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
4007 	    "Scsi_pkt completion reason %x\n",
4008 	    spx->txlt_scsi_pkt->pkt_reason);
4009 
4010 	if ((spx->txlt_scsi_pkt->pkt_flags & FLAG_NOINTR) == 0 &&
4011 	    spx->txlt_scsi_pkt->pkt_comp != NULL)
4012 		/* scsi callback required */
4013 		if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
4014 		    (task_func_t *)spx->txlt_scsi_pkt->pkt_comp,
4015 		    (void *)spx->txlt_scsi_pkt,
4016 		    TQ_SLEEP) == NULL)
4017 			/* Scheduling the callback failed */
4018 			return (TRAN_BUSY);
4019 	return (TRAN_ACCEPT);
4020 }
4021 
4022 
4023 /*
4024  * SATA translate command: Inquiry / Identify Device
4025  * Use cached Identify Device data for now, rather than issuing actual
4026  * Device Identify cmd request. If device is detached and re-attached,
4027  * asynchromous event processing should fetch and refresh Identify Device
4028  * data.
4029  * Two VPD pages are supported now:
4030  * Vital Product Data page
4031  * Unit Serial Number page
4032  *
4033  * Returns TRAN_ACCEPT and appropriate values in scsi_pkt fields.
4034  */
4035 
4036 #define	EVPD			1	/* Extended Vital Product Data flag */
4037 #define	CMDDT			2	/* Command Support Data - Obsolete */
4038 #define	INQUIRY_SUP_VPD_PAGE	0	/* Supported VDP Pages Page COde */
4039 #define	INQUIRY_USN_PAGE	0x80	/* Unit Serial Number Page Code */
4040 #define	INQUIRY_DEV_IDENTIFICATION_PAGE 0x83 /* Not needed yet */
4041 
4042 static int
4043 sata_txlt_inquiry(sata_pkt_txlate_t *spx)
4044 {
4045 	struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
4046 	struct buf *bp = spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp;
4047 	sata_drive_info_t *sdinfo;
4048 	struct scsi_extended_sense *sense;
4049 	int count;
4050 	uint8_t *p;
4051 	int i, j;
4052 	uint8_t page_buf[0xff]; /* Max length */
4053 	int rval;
4054 
4055 	mutex_enter(&(SATA_TXLT_CPORT_MUTEX(spx)));
4056 
4057 	if (((rval = sata_txlt_generic_pkt_info(spx)) != TRAN_ACCEPT) ||
4058 	    (spx->txlt_scsi_pkt->pkt_reason == CMD_DEV_GONE)) {
4059 		mutex_exit(&(SATA_TXLT_CPORT_MUTEX(spx)));
4060 		return (rval);
4061 	}
4062 
4063 	sdinfo = sata_get_device_info(spx->txlt_sata_hba_inst,
4064 	    &spx->txlt_sata_pkt->satapkt_device);
4065 
4066 	ASSERT(sdinfo != NULL);
4067 
4068 	scsipkt->pkt_reason = CMD_CMPLT;
4069 	scsipkt->pkt_state = STATE_GOT_BUS | STATE_GOT_TARGET |
4070 	    STATE_SENT_CMD | STATE_GOT_STATUS;
4071 
4072 	/* Reject not supported request */
4073 	if (scsipkt->pkt_cdbp[1] & CMDDT) { /* No support for this bit */
4074 		*scsipkt->pkt_scbp = STATUS_CHECK;
4075 		sense = sata_arq_sense(spx);
4076 		sense->es_key = KEY_ILLEGAL_REQUEST;
4077 		sense->es_add_code = SD_SCSI_ASC_INVALID_FIELD_IN_CDB;
4078 		goto done;
4079 	}
4080 
4081 	/* Valid Inquiry request */
4082 	*scsipkt->pkt_scbp = STATUS_GOOD;
4083 
4084 	if (bp != NULL && bp->b_un.b_addr && bp->b_bcount) {
4085 
4086 		/*
4087 		 * Because it is fully emulated command storing data
4088 		 * programatically in the specified buffer, release
4089 		 * preallocated DMA resources before storing data in the buffer,
4090 		 * so no unwanted DMA sync would take place.
4091 		 */
4092 		sata_scsi_dmafree(NULL, scsipkt);
4093 
4094 		if (!(scsipkt->pkt_cdbp[1] & EVPD)) {
4095 			/* Standard Inquiry Data request */
4096 			struct scsi_inquiry inq;
4097 			unsigned int bufsize;
4098 
4099 			sata_identdev_to_inquiry(spx->txlt_sata_hba_inst,
4100 			    sdinfo, (uint8_t *)&inq);
4101 			/* Copy no more than requested */
4102 			count = MIN(bp->b_bcount,
4103 			    sizeof (struct scsi_inquiry));
4104 			bufsize = scsipkt->pkt_cdbp[4];
4105 			bufsize |= scsipkt->pkt_cdbp[3] << 8;
4106 			count = MIN(count, bufsize);
4107 			bcopy(&inq, bp->b_un.b_addr, count);
4108 
4109 			scsipkt->pkt_state |= STATE_XFERRED_DATA;
4110 			scsipkt->pkt_resid = scsipkt->pkt_cdbp[4] > count ?
4111 			    bufsize - count : 0;
4112 		} else {
4113 			/*
4114 			 * peripheral_qualifier = 0;
4115 			 *
4116 			 * We are dealing only with HD and will be
4117 			 * dealing with CD/DVD devices soon
4118 			 */
4119 			uint8_t peripheral_device_type =
4120 			    sdinfo->satadrv_type == SATA_DTYPE_ATADISK ?
4121 			    DTYPE_DIRECT : DTYPE_RODIRECT;
4122 
4123 			switch ((uint_t)scsipkt->pkt_cdbp[2]) {
4124 			case INQUIRY_SUP_VPD_PAGE:
4125 				/*
4126 				 * Request for suported Vital Product Data
4127 				 * pages - assuming only 2 page codes
4128 				 * supported
4129 				 */
4130 				page_buf[0] = peripheral_device_type;
4131 				page_buf[1] = INQUIRY_SUP_VPD_PAGE;
4132 				page_buf[2] = 0;
4133 				page_buf[3] = 2; /* page length */
4134 				page_buf[4] = INQUIRY_SUP_VPD_PAGE;
4135 				page_buf[5] = INQUIRY_USN_PAGE;
4136 				/* Copy no more than requested */
4137 				count = MIN(bp->b_bcount, 6);
4138 				bcopy(page_buf, bp->b_un.b_addr, count);
4139 				break;
4140 			case INQUIRY_USN_PAGE:
4141 				/*
4142 				 * Request for Unit Serial Number page
4143 				 */
4144 				page_buf[0] = peripheral_device_type;
4145 				page_buf[1] = INQUIRY_USN_PAGE;
4146 				page_buf[2] = 0;
4147 				page_buf[3] = 20; /* remaining page length */
4148 				p = (uint8_t *)(sdinfo->satadrv_id.ai_drvser);
4149 #ifdef	_LITTLE_ENDIAN
4150 				swab(p, &page_buf[4], 20);
4151 #else
4152 				bcopy(p, &page_buf[4], 20);
4153 #endif
4154 				for (i = 0; i < 20; i++) {
4155 					if (page_buf[4 + i] == '\0' ||
4156 					    page_buf[4 + i] == '\040') {
4157 						break;
4158 					}
4159 				}
4160 				/*
4161 				 * 'i' contains string length.
4162 				 *
4163 				 * Least significant character of the serial
4164 				 * number shall appear as the last byte,
4165 				 * according to SBC-3 spec.
4166 				 */
4167 				p = &page_buf[20 + 4 - 1];
4168 				for (j = i; j > 0; j--, p--) {
4169 					*p = *(p - 20 + i);
4170 				}
4171 				p = &page_buf[4];
4172 				for (j = 20 - i; j > 0; j--) {
4173 					*p++ = '\040';
4174 				}
4175 				count = MIN(bp->b_bcount, 24);
4176 				bcopy(page_buf, bp->b_un.b_addr, count);
4177 				break;
4178 
4179 			case INQUIRY_DEV_IDENTIFICATION_PAGE:
4180 				/*
4181 				 * We may want to implement this page, when
4182 				 * identifiers are common for SATA devices
4183 				 * But not now.
4184 				 */
4185 				/*FALLTHROUGH*/
4186 
4187 			default:
4188 				/* Request for unsupported VPD page */
4189 				*scsipkt->pkt_scbp = STATUS_CHECK;
4190 				sense = sata_arq_sense(spx);
4191 				sense->es_key = KEY_ILLEGAL_REQUEST;
4192 				sense->es_add_code =
4193 				    SD_SCSI_ASC_INVALID_FIELD_IN_CDB;
4194 				goto done;
4195 			}
4196 		}
4197 		scsipkt->pkt_state |= STATE_XFERRED_DATA;
4198 		scsipkt->pkt_resid = scsipkt->pkt_cdbp[4] > count ?
4199 		    scsipkt->pkt_cdbp[4] - count : 0;
4200 	}
4201 done:
4202 	mutex_exit(&(SATA_TXLT_CPORT_MUTEX(spx)));
4203 
4204 	SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
4205 	    "Scsi_pkt completion reason %x\n",
4206 	    scsipkt->pkt_reason);
4207 
4208 	if ((scsipkt->pkt_flags & FLAG_NOINTR) == 0 &&
4209 	    scsipkt->pkt_comp != NULL) {
4210 		/* scsi callback required */
4211 		if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
4212 		    (task_func_t *)scsipkt->pkt_comp, (void *) scsipkt,
4213 		    TQ_SLEEP) == NULL)
4214 			/* Scheduling the callback failed */
4215 			return (TRAN_BUSY);
4216 	}
4217 	return (TRAN_ACCEPT);
4218 }
4219 
4220 /*
4221  * SATA translate command: Request Sense.
4222  * Emulated command (ATA version for SATA hard disks)
4223  * Always NO SENSE, because any sense data should be reported by ARQ sense.
4224  *
4225  * Returns TRAN_ACCEPT and appropriate values in scsi_pkt fields.
4226  */
4227 static int
4228 sata_txlt_request_sense(sata_pkt_txlate_t *spx)
4229 {
4230 	struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
4231 	struct scsi_extended_sense sense;
4232 	struct buf *bp = spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp;
4233 	int rval;
4234 
4235 	mutex_enter(&(SATA_TXLT_CPORT_MUTEX(spx)));
4236 
4237 	if (((rval = sata_txlt_generic_pkt_info(spx)) != TRAN_ACCEPT) ||
4238 	    (spx->txlt_scsi_pkt->pkt_reason == CMD_DEV_GONE)) {
4239 		mutex_exit(&(SATA_TXLT_CPORT_MUTEX(spx)));
4240 		return (rval);
4241 	}
4242 	mutex_exit(&(SATA_TXLT_CPORT_MUTEX(spx)));
4243 
4244 
4245 	scsipkt->pkt_reason = CMD_CMPLT;
4246 	scsipkt->pkt_state = STATE_GOT_BUS | STATE_GOT_TARGET |
4247 	    STATE_SENT_CMD | STATE_GOT_STATUS;
4248 	*scsipkt->pkt_scbp = STATUS_GOOD;
4249 
4250 	if (bp != NULL && bp->b_un.b_addr && bp->b_bcount) {
4251 		/*
4252 		 * Because it is fully emulated command storing data
4253 		 * programatically in the specified buffer, release
4254 		 * preallocated DMA resources before storing data in the buffer,
4255 		 * so no unwanted DMA sync would take place.
4256 		 */
4257 		int count = MIN(bp->b_bcount,
4258 		    sizeof (struct scsi_extended_sense));
4259 		sata_scsi_dmafree(NULL, scsipkt);
4260 		bzero(&sense, sizeof (struct scsi_extended_sense));
4261 		sense.es_valid = 0;	/* Valid LBA */
4262 		sense.es_class = 7;	/* Response code 0x70 - current err */
4263 		sense.es_key = KEY_NO_SENSE;
4264 		sense.es_add_len = 6;	/* Additional length */
4265 		/* Copy no more than requested */
4266 		bcopy(&sense, bp->b_un.b_addr, count);
4267 		scsipkt->pkt_state |= STATE_XFERRED_DATA;
4268 		scsipkt->pkt_resid = 0;
4269 	}
4270 
4271 	SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
4272 	    "Scsi_pkt completion reason %x\n",
4273 	    scsipkt->pkt_reason);
4274 
4275 	if ((scsipkt->pkt_flags & FLAG_NOINTR) == 0 &&
4276 	    scsipkt->pkt_comp != NULL)
4277 		/* scsi callback required */
4278 		if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
4279 		    (task_func_t *)scsipkt->pkt_comp, (void *) scsipkt,
4280 		    TQ_SLEEP) == NULL)
4281 			/* Scheduling the callback failed */
4282 			return (TRAN_BUSY);
4283 	return (TRAN_ACCEPT);
4284 }
4285 
4286 /*
4287  * SATA translate command: Test Unit Ready
4288  * At the moment this is an emulated command (ATA version for SATA hard disks).
4289  * May be translated into Check Power Mode command in the future
4290  *
4291  * Returns TRAN_ACCEPT and appropriate values in scsi_pkt fields.
4292  */
4293 static int
4294 sata_txlt_test_unit_ready(sata_pkt_txlate_t *spx)
4295 {
4296 	struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
4297 	struct scsi_extended_sense *sense;
4298 	int power_state;
4299 	int rval;
4300 
4301 	mutex_enter(&(SATA_TXLT_CPORT_MUTEX(spx)));
4302 
4303 	if (((rval = sata_txlt_generic_pkt_info(spx)) != TRAN_ACCEPT) ||
4304 	    (spx->txlt_scsi_pkt->pkt_reason == CMD_DEV_GONE)) {
4305 		mutex_exit(&(SATA_TXLT_CPORT_MUTEX(spx)));
4306 		return (rval);
4307 	}
4308 	mutex_exit(&(SATA_TXLT_CPORT_MUTEX(spx)));
4309 
4310 	/* At this moment, emulate it rather than execute anything */
4311 	power_state = SATA_PWRMODE_ACTIVE;
4312 
4313 	scsipkt->pkt_reason = CMD_CMPLT;
4314 	scsipkt->pkt_state = STATE_GOT_BUS | STATE_GOT_TARGET |
4315 	    STATE_SENT_CMD | STATE_GOT_STATUS;
4316 
4317 	switch (power_state) {
4318 	case SATA_PWRMODE_ACTIVE:
4319 	case SATA_PWRMODE_IDLE:
4320 		*scsipkt->pkt_scbp = STATUS_GOOD;
4321 		break;
4322 	default:
4323 		/* PWR mode standby */
4324 		*scsipkt->pkt_scbp = STATUS_CHECK;
4325 		sense = sata_arq_sense(spx);
4326 		sense->es_key = KEY_NOT_READY;
4327 		sense->es_add_code = SD_SCSI_ASC_LU_NOT_READY;
4328 		break;
4329 	}
4330 
4331 	SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
4332 	    "Scsi_pkt completion reason %x\n", scsipkt->pkt_reason);
4333 
4334 	if ((scsipkt->pkt_flags & FLAG_NOINTR) == 0 &&
4335 	    scsipkt->pkt_comp != NULL)
4336 		/* scsi callback required */
4337 		if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
4338 		    (task_func_t *)scsipkt->pkt_comp, (void *) scsipkt,
4339 		    TQ_SLEEP) == NULL)
4340 			/* Scheduling the callback failed */
4341 			return (TRAN_BUSY);
4342 
4343 	return (TRAN_ACCEPT);
4344 }
4345 
4346 
4347 /*
4348  * SATA translate command: Start Stop Unit
4349  * Translation depends on a command:
4350  *	Start Unit translated into Idle Immediate
4351  *	Stop Unit translated into Standby Immediate
4352  *	Unload Media / NOT SUPPORTED YET
4353  *	Load Media / NOT SUPPROTED YET
4354  * Power condition bits are ignored, so is Immediate bit
4355  * Requesting synchronous execution.
4356  *
4357  * Returns TRAN_ACCEPT or code returned by sata_hba_start() and
4358  * appropriate values in scsi_pkt fields.
4359  */
4360 static int
4361 sata_txlt_start_stop_unit(sata_pkt_txlate_t *spx)
4362 {
4363 	struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
4364 	sata_cmd_t *scmd = &spx->txlt_sata_pkt->satapkt_cmd;
4365 	struct scsi_extended_sense *sense;
4366 	sata_hba_inst_t *shi = SATA_TXLT_HBA_INST(spx);
4367 	int cport = SATA_TXLT_CPORT(spx);
4368 	int rval;
4369 	int synch;
4370 
4371 	SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
4372 	    "sata_txlt_start_stop_unit: %d\n", scsipkt->pkt_scbp[4] & 1);
4373 
4374 	mutex_enter(&SATA_CPORT_MUTEX(shi, cport));
4375 
4376 	if (((rval = sata_txlt_generic_pkt_info(spx)) != TRAN_ACCEPT) ||
4377 	    (spx->txlt_scsi_pkt->pkt_reason == CMD_DEV_GONE)) {
4378 		mutex_exit(&(SATA_TXLT_CPORT_MUTEX(spx)));
4379 		return (rval);
4380 	}
4381 
4382 	if (scsipkt->pkt_cdbp[4] & 2) {
4383 		/* Load/Unload Media - invalid request */
4384 		*scsipkt->pkt_scbp = STATUS_CHECK;
4385 		sense = sata_arq_sense(spx);
4386 		sense->es_key = KEY_ILLEGAL_REQUEST;
4387 		sense->es_add_code = SD_SCSI_ASC_INVALID_FIELD_IN_CDB;
4388 		mutex_exit(&(SATA_TXLT_CPORT_MUTEX(spx)));
4389 
4390 		SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
4391 		    "Scsi_pkt completion reason %x\n", scsipkt->pkt_reason);
4392 
4393 		if ((scsipkt->pkt_flags & FLAG_NOINTR) == 0 &&
4394 		    scsipkt->pkt_comp != NULL)
4395 			/* scsi callback required */
4396 			if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
4397 			    (task_func_t *)scsipkt->pkt_comp, (void *) scsipkt,
4398 			    TQ_SLEEP) == NULL)
4399 				/* Scheduling the callback failed */
4400 				return (TRAN_BUSY);
4401 
4402 		return (TRAN_ACCEPT);
4403 	}
4404 	scmd->satacmd_addr_type = 0;
4405 	scmd->satacmd_sec_count_lsb = 0;
4406 	scmd->satacmd_lba_low_lsb = 0;
4407 	scmd->satacmd_lba_mid_lsb = 0;
4408 	scmd->satacmd_lba_high_lsb = 0;
4409 	scmd->satacmd_features_reg = 0;
4410 	scmd->satacmd_device_reg = 0;
4411 	scmd->satacmd_status_reg = 0;
4412 	if (scsipkt->pkt_cdbp[4] & 1) {
4413 		/* Start Unit */
4414 		scmd->satacmd_cmd_reg = SATAC_IDLE_IM;
4415 	} else {
4416 		/* Stop Unit */
4417 		scmd->satacmd_cmd_reg = SATAC_STANDBY_IM;
4418 	}
4419 
4420 	if (!(spx->txlt_sata_pkt->satapkt_op_mode & SATA_OPMODE_SYNCH)) {
4421 		/* Need to set-up a callback function */
4422 		spx->txlt_sata_pkt->satapkt_comp =
4423 		    sata_txlt_nodata_cmd_completion;
4424 		synch = FALSE;
4425 	} else {
4426 		spx->txlt_sata_pkt->satapkt_op_mode = SATA_OPMODE_SYNCH;
4427 		synch = TRUE;
4428 	}
4429 
4430 	/* Transfer command to HBA */
4431 	if (sata_hba_start(spx, &rval) != 0) {
4432 		/* Pkt not accepted for execution */
4433 		mutex_exit(&SATA_CPORT_MUTEX(shi, cport));
4434 		return (rval);
4435 	}
4436 
4437 	/*
4438 	 * If execution is non-synchronous,
4439 	 * a callback function will handle potential errors, translate
4440 	 * the response and will do a callback to a target driver.
4441 	 * If it was synchronous, check execution status using the same
4442 	 * framework callback.
4443 	 */
4444 	mutex_exit(&SATA_CPORT_MUTEX(shi, cport));
4445 	if (synch) {
4446 		SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
4447 		    "synchronous execution status %x\n",
4448 		    spx->txlt_sata_pkt->satapkt_reason);
4449 
4450 		sata_txlt_nodata_cmd_completion(spx->txlt_sata_pkt);
4451 	}
4452 	return (TRAN_ACCEPT);
4453 
4454 }
4455 
4456 
4457 /*
4458  * SATA translate command:  Read Capacity.
4459  * Emulated command for SATA disks.
4460  * Capacity is retrieved from cached Idenifty Device data.
4461  * Identify Device data shows effective disk capacity, not the native
4462  * capacity, which may be limitted by Set Max Address command.
4463  * This is ATA version for SATA hard disks.
4464  *
4465  * Returns TRAN_ACCEPT and appropriate values in scsi_pkt fields.
4466  */
4467 static int
4468 sata_txlt_read_capacity(sata_pkt_txlate_t *spx)
4469 {
4470 	struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
4471 	struct buf *bp = spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp;
4472 	sata_drive_info_t *sdinfo;
4473 	uint64_t val;
4474 	uchar_t *rbuf;
4475 	int rval;
4476 
4477 	SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
4478 	    "sata_txlt_read_capacity: ", NULL);
4479 
4480 	mutex_enter(&(SATA_TXLT_CPORT_MUTEX(spx)));
4481 
4482 	if (((rval = sata_txlt_generic_pkt_info(spx)) != TRAN_ACCEPT) ||
4483 	    (spx->txlt_scsi_pkt->pkt_reason == CMD_DEV_GONE)) {
4484 		mutex_exit(&(SATA_TXLT_CPORT_MUTEX(spx)));
4485 		return (rval);
4486 	}
4487 
4488 	scsipkt->pkt_reason = CMD_CMPLT;
4489 	scsipkt->pkt_state = STATE_GOT_BUS | STATE_GOT_TARGET |
4490 	    STATE_SENT_CMD | STATE_GOT_STATUS;
4491 	*scsipkt->pkt_scbp = STATUS_GOOD;
4492 	if (bp != NULL && bp->b_un.b_addr && bp->b_bcount) {
4493 		/*
4494 		 * Because it is fully emulated command storing data
4495 		 * programatically in the specified buffer, release
4496 		 * preallocated DMA resources before storing data in the buffer,
4497 		 * so no unwanted DMA sync would take place.
4498 		 */
4499 		sata_scsi_dmafree(NULL, scsipkt);
4500 
4501 		sdinfo = sata_get_device_info(
4502 		    spx->txlt_sata_hba_inst,
4503 		    &spx->txlt_sata_pkt->satapkt_device);
4504 		/* Last logical block address */
4505 		val = sdinfo->satadrv_capacity - 1;
4506 		rbuf = (uchar_t *)bp->b_un.b_addr;
4507 		/* Need to swap endians to match scsi format */
4508 		rbuf[0] = (val >> 24) & 0xff;
4509 		rbuf[1] = (val >> 16) & 0xff;
4510 		rbuf[2] = (val >> 8) & 0xff;
4511 		rbuf[3] = val & 0xff;
4512 		/* block size - always 512 bytes, for now */
4513 		rbuf[4] = 0;
4514 		rbuf[5] = 0;
4515 		rbuf[6] = 0x02;
4516 		rbuf[7] = 0;
4517 		scsipkt->pkt_state |= STATE_XFERRED_DATA;
4518 		scsipkt->pkt_resid = 0;
4519 
4520 		SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst, "%d\n",
4521 		    sdinfo->satadrv_capacity -1);
4522 	}
4523 	mutex_exit(&(SATA_TXLT_CPORT_MUTEX(spx)));
4524 	/*
4525 	 * If a callback was requested, do it now.
4526 	 */
4527 	SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
4528 	    "Scsi_pkt completion reason %x\n", scsipkt->pkt_reason);
4529 
4530 	if ((scsipkt->pkt_flags & FLAG_NOINTR) == 0 &&
4531 	    scsipkt->pkt_comp != NULL)
4532 		/* scsi callback required */
4533 		if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
4534 		    (task_func_t *)scsipkt->pkt_comp, (void *) scsipkt,
4535 		    TQ_SLEEP) == NULL)
4536 			/* Scheduling the callback failed */
4537 			return (TRAN_BUSY);
4538 
4539 	return (TRAN_ACCEPT);
4540 }
4541 
4542 /*
4543  * SATA translate command: Mode Sense.
4544  * Translated into appropriate SATA command or emulated.
4545  * Saved Values Page Control (03) are not supported.
4546  *
4547  * NOTE: only caching mode sense page is currently implemented.
4548  *
4549  * Returns TRAN_ACCEPT and appropriate values in scsi_pkt fields.
4550  */
4551 
4552 static int
4553 sata_txlt_mode_sense(sata_pkt_txlate_t *spx)
4554 {
4555 	struct scsi_pkt	*scsipkt = spx->txlt_scsi_pkt;
4556 	struct buf	*bp = spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp;
4557 	sata_drive_info_t *sdinfo;
4558 	sata_id_t *sata_id;
4559 	struct scsi_extended_sense *sense;
4560 	int 		len, bdlen, count, alc_len;
4561 	int		pc;	/* Page Control code */
4562 	uint8_t		*buf;	/* mode sense buffer */
4563 	int		rval;
4564 
4565 	SATADBG2(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
4566 	    "sata_txlt_mode_sense, pc %x page code 0x%02x\n",
4567 	    spx->txlt_scsi_pkt->pkt_cdbp[2] >> 6,
4568 	    spx->txlt_scsi_pkt->pkt_cdbp[2] & 0x3f);
4569 
4570 	buf = kmem_zalloc(1024, KM_SLEEP);
4571 
4572 	mutex_enter(&(SATA_TXLT_CPORT_MUTEX(spx)));
4573 
4574 	if (((rval = sata_txlt_generic_pkt_info(spx)) != TRAN_ACCEPT) ||
4575 	    (spx->txlt_scsi_pkt->pkt_reason == CMD_DEV_GONE)) {
4576 		mutex_exit(&(SATA_TXLT_CPORT_MUTEX(spx)));
4577 		kmem_free(buf, 1024);
4578 		return (rval);
4579 	}
4580 
4581 	scsipkt->pkt_reason = CMD_CMPLT;
4582 	scsipkt->pkt_state = STATE_GOT_BUS | STATE_GOT_TARGET |
4583 	    STATE_SENT_CMD | STATE_GOT_STATUS;
4584 
4585 	pc = scsipkt->pkt_cdbp[2] >> 6;
4586 
4587 	if (bp != NULL && bp->b_un.b_addr && bp->b_bcount) {
4588 		/*
4589 		 * Because it is fully emulated command storing data
4590 		 * programatically in the specified buffer, release
4591 		 * preallocated DMA resources before storing data in the buffer,
4592 		 * so no unwanted DMA sync would take place.
4593 		 */
4594 		sata_scsi_dmafree(NULL, scsipkt);
4595 
4596 		len = 0;
4597 		bdlen = 0;
4598 		if (!(scsipkt->pkt_cdbp[1] & 8)) {
4599 			if (scsipkt->pkt_cdbp[0] == SCMD_MODE_SENSE_G1 &&
4600 			    (scsipkt->pkt_cdbp[0] & 0x10))
4601 				bdlen = 16;
4602 			else
4603 				bdlen = 8;
4604 		}
4605 		/* Build mode parameter header */
4606 		if (spx->txlt_scsi_pkt->pkt_cdbp[0] == SCMD_MODE_SENSE) {
4607 			/* 4-byte mode parameter header */
4608 			buf[len++] = 0;   	/* mode data length */
4609 			buf[len++] = 0;		/* medium type */
4610 			buf[len++] = 0;		/* dev-specific param */
4611 			buf[len++] = bdlen;	/* Block Descriptor length */
4612 		} else {
4613 			/* 8-byte mode parameter header */
4614 			buf[len++] = 0;		/* mode data length */
4615 			buf[len++] = 0;
4616 			buf[len++] = 0;		/* medium type */
4617 			buf[len++] = 0;		/* dev-specific param */
4618 			if (bdlen == 16)
4619 				buf[len++] = 1;	/* long lba descriptor */
4620 			else
4621 				buf[len++] = 0;
4622 			buf[len++] = 0;
4623 			buf[len++] = 0;		/* Block Descriptor length */
4624 			buf[len++] = bdlen;
4625 		}
4626 
4627 		sdinfo = sata_get_device_info(
4628 		    spx->txlt_sata_hba_inst,
4629 		    &spx->txlt_sata_pkt->satapkt_device);
4630 
4631 		/* Build block descriptor only if not disabled (DBD) */
4632 		if ((scsipkt->pkt_cdbp[1] & 0x08) == 0) {
4633 			/* Block descriptor - direct-access device format */
4634 			if (bdlen == 8) {
4635 				/* build regular block descriptor */
4636 				buf[len++] =
4637 				    (sdinfo->satadrv_capacity >> 24) & 0xff;
4638 				buf[len++] =
4639 				    (sdinfo->satadrv_capacity >> 16) & 0xff;
4640 				buf[len++] =
4641 				    (sdinfo->satadrv_capacity >> 8) & 0xff;
4642 				buf[len++] = sdinfo->satadrv_capacity & 0xff;
4643 				buf[len++] = 0; /* density code */
4644 				buf[len++] = 0;
4645 				if (sdinfo->satadrv_type ==
4646 				    SATA_DTYPE_ATADISK)
4647 					buf[len++] = 2;
4648 				else
4649 					/* ATAPI */
4650 					buf[len++] = 8;
4651 				buf[len++] = 0;
4652 			} else if (bdlen == 16) {
4653 				/* Long LBA Accepted */
4654 				/* build long lba block descriptor */
4655 #ifndef __lock_lint
4656 				buf[len++] =
4657 				    (sdinfo->satadrv_capacity >> 56) & 0xff;
4658 				buf[len++] =
4659 				    (sdinfo->satadrv_capacity >> 48) & 0xff;
4660 				buf[len++] =
4661 				    (sdinfo->satadrv_capacity >> 40) & 0xff;
4662 				buf[len++] =
4663 				    (sdinfo->satadrv_capacity >> 32) & 0xff;
4664 #endif
4665 				buf[len++] =
4666 				    (sdinfo->satadrv_capacity >> 24) & 0xff;
4667 				buf[len++] =
4668 				    (sdinfo->satadrv_capacity >> 16) & 0xff;
4669 				buf[len++] =
4670 				    (sdinfo->satadrv_capacity >> 8) & 0xff;
4671 				buf[len++] = sdinfo->satadrv_capacity & 0xff;
4672 				buf[len++] = 0;
4673 				buf[len++] = 0; /* density code */
4674 				buf[len++] = 0;
4675 				buf[len++] = 0;
4676 				if (sdinfo->satadrv_type ==
4677 				    SATA_DTYPE_ATADISK)
4678 					buf[len++] = 2;
4679 				else
4680 					/* ATAPI */
4681 					buf[len++] = 8;
4682 				buf[len++] = 0;
4683 			}
4684 		}
4685 
4686 		sata_id = &sdinfo->satadrv_id;
4687 
4688 		/*
4689 		 * Add requested pages.
4690 		 * Page 3 and 4 are obsolete and we are not supporting them.
4691 		 * We deal now with:
4692 		 * caching (read/write cache control).
4693 		 * We should eventually deal with following mode pages:
4694 		 * error recovery  (0x01),
4695 		 * power condition (0x1a),
4696 		 * exception control page (enables SMART) (0x1c),
4697 		 * enclosure management (ses),
4698 		 * protocol-specific port mode (port control).
4699 		 */
4700 		switch (scsipkt->pkt_cdbp[2] & 0x3f) {
4701 		case MODEPAGE_RW_ERRRECOV:
4702 			/* DAD_MODE_ERR_RECOV */
4703 			/* R/W recovery */
4704 			len += sata_build_msense_page_1(sdinfo, pc, buf+len);
4705 			break;
4706 		case MODEPAGE_CACHING:
4707 			/* DAD_MODE_CACHE */
4708 			/* Reject not supported request for saved parameters */
4709 			if (pc == 3) {
4710 				*scsipkt->pkt_scbp = STATUS_CHECK;
4711 				sense = sata_arq_sense(spx);
4712 				sense->es_key = KEY_ILLEGAL_REQUEST;
4713 				sense->es_add_code =
4714 				    SD_SCSI_ASC_SAVING_PARAMS_NOT_SUPPORTED;
4715 				goto done;
4716 			}
4717 
4718 			/* caching */
4719 			len += sata_build_msense_page_8(sdinfo, pc, buf+len);
4720 			break;
4721 		case MODEPAGE_INFO_EXCPT:
4722 			/* exception cntrl */
4723 			if (sata_id->ai_cmdset82 & SATA_SMART_SUPPORTED) {
4724 				len += sata_build_msense_page_1c(sdinfo, pc,
4725 				    buf+len);
4726 			}
4727 			else
4728 				goto err;
4729 			break;
4730 		case MODEPAGE_POWER_COND:
4731 			/* DAD_MODE_POWER_COND */
4732 			/* power condition */
4733 			len += sata_build_msense_page_1a(sdinfo, pc, buf+len);
4734 			break;
4735 
4736 		case MODEPAGE_ACOUSTIC_MANAG:
4737 			/* acoustic management */
4738 			len += sata_build_msense_page_30(sdinfo, pc, buf+len);
4739 			break;
4740 		case MODEPAGE_ALLPAGES:
4741 			/* all pages */
4742 			len += sata_build_msense_page_1(sdinfo, pc, buf+len);
4743 			len += sata_build_msense_page_8(sdinfo, pc, buf+len);
4744 			len += sata_build_msense_page_1a(sdinfo, pc, buf+len);
4745 			if (sata_id->ai_cmdset82 & SATA_SMART_SUPPORTED) {
4746 				len += sata_build_msense_page_1c(sdinfo, pc,
4747 				    buf+len);
4748 			}
4749 			len += sata_build_msense_page_30(sdinfo, pc, buf+len);
4750 			break;
4751 		default:
4752 		err:
4753 			/* Invalid request */
4754 			*scsipkt->pkt_scbp = STATUS_CHECK;
4755 			sense = sata_arq_sense(spx);
4756 			sense->es_key = KEY_ILLEGAL_REQUEST;
4757 			sense->es_add_code = SD_SCSI_ASC_INVALID_FIELD_IN_CDB;
4758 			goto done;
4759 		}
4760 
4761 		/* fix total mode data length */
4762 		if (spx->txlt_scsi_pkt->pkt_cdbp[0] == SCMD_MODE_SENSE) {
4763 			/* 4-byte mode parameter header */
4764 			buf[0] = len - 1;   	/* mode data length */
4765 		} else {
4766 			buf[0] = (len -2) >> 8;
4767 			buf[1] = (len -2) & 0xff;
4768 		}
4769 
4770 
4771 		/* Check allocation length */
4772 		if (scsipkt->pkt_cdbp[0] == SCMD_MODE_SENSE) {
4773 			alc_len = scsipkt->pkt_cdbp[4];
4774 		} else {
4775 			alc_len = scsipkt->pkt_cdbp[7];
4776 			alc_len = (len << 8) | scsipkt->pkt_cdbp[8];
4777 		}
4778 		/*
4779 		 * We do not check for possible parameters truncation
4780 		 * (alc_len < len) assuming that the target driver works
4781 		 * correctly. Just avoiding overrun.
4782 		 * Copy no more than requested and possible, buffer-wise.
4783 		 */
4784 		count = MIN(alc_len, len);
4785 		count = MIN(bp->b_bcount, count);
4786 		bcopy(buf, bp->b_un.b_addr, count);
4787 
4788 		scsipkt->pkt_state |= STATE_XFERRED_DATA;
4789 		scsipkt->pkt_resid = alc_len > count ? alc_len - count : 0;
4790 	}
4791 	*scsipkt->pkt_scbp = STATUS_GOOD;
4792 done:
4793 	mutex_exit(&(SATA_TXLT_CPORT_MUTEX(spx)));
4794 	(void) kmem_free(buf, 1024);
4795 
4796 	SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
4797 	    "Scsi_pkt completion reason %x\n", scsipkt->pkt_reason);
4798 
4799 	if ((scsipkt->pkt_flags & FLAG_NOINTR) == 0 &&
4800 	    scsipkt->pkt_comp != NULL)
4801 		/* scsi callback required */
4802 		if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
4803 		    (task_func_t *)scsipkt->pkt_comp, (void *) scsipkt,
4804 		    TQ_SLEEP) == NULL)
4805 			/* Scheduling the callback failed */
4806 			return (TRAN_BUSY);
4807 
4808 	return (TRAN_ACCEPT);
4809 }
4810 
4811 
4812 /*
4813  * SATA translate command: Mode Select.
4814  * Translated into appropriate SATA command or emulated.
4815  * Saving parameters is not supported.
4816  * Changing device capacity is not supported (although theoretically
4817  * possible by executing SET FEATURES/SET MAX ADDRESS)
4818  *
4819  * Assumption is that the target driver is working correctly.
4820  *
4821  * More than one SATA command may be executed to perform operations specified
4822  * by mode select pages. The first error terminates further execution.
4823  * Operations performed successully are not backed-up in such case.
4824  *
4825  * NOTE: only caching mode select page is implemented.
4826  * Caching setup is remembered so it could be re-stored in case of
4827  * an unexpected device reset.
4828  *
4829  * Returns TRAN_ACCEPT and appropriate values in scsi_pkt fields.
4830  */
4831 
4832 static int
4833 sata_txlt_mode_select(sata_pkt_txlate_t *spx)
4834 {
4835 	struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
4836 	struct buf *bp = spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp;
4837 	struct scsi_extended_sense *sense;
4838 	int len, pagelen, count, pllen;
4839 	uint8_t *buf;	/* mode select buffer */
4840 	int rval, stat;
4841 	uint_t nointr_flag;
4842 	int dmod = 0;
4843 
4844 	SATADBG2(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
4845 	    "sata_txlt_mode_select, pc %x page code 0x%02x\n",
4846 	    spx->txlt_scsi_pkt->pkt_cdbp[2] >> 6,
4847 	    spx->txlt_scsi_pkt->pkt_cdbp[2] & 0x3f);
4848 
4849 	mutex_enter(&(SATA_TXLT_CPORT_MUTEX(spx)));
4850 
4851 	if (((rval = sata_txlt_generic_pkt_info(spx)) != TRAN_ACCEPT) ||
4852 	    (spx->txlt_scsi_pkt->pkt_reason == CMD_DEV_GONE)) {
4853 		mutex_exit(&(SATA_TXLT_CPORT_MUTEX(spx)));
4854 		return (rval);
4855 	}
4856 
4857 	rval = TRAN_ACCEPT;
4858 
4859 	scsipkt->pkt_reason = CMD_CMPLT;
4860 	scsipkt->pkt_state = STATE_GOT_BUS | STATE_GOT_TARGET |
4861 	    STATE_SENT_CMD | STATE_GOT_STATUS;
4862 
4863 	/* Reject not supported request */
4864 	if (! (scsipkt->pkt_cdbp[1] & 0x10)) { /* No support for PF bit = 0 */
4865 		*scsipkt->pkt_scbp = STATUS_CHECK;
4866 		sense = sata_arq_sense(spx);
4867 		sense->es_key = KEY_ILLEGAL_REQUEST;
4868 		sense->es_add_code = SD_SCSI_ASC_INVALID_FIELD_IN_CDB;
4869 		goto done;
4870 	}
4871 
4872 	if (scsipkt->pkt_cdbp[0] == SCMD_MODE_SELECT) {
4873 		pllen = scsipkt->pkt_cdbp[4];
4874 	} else {
4875 		pllen = scsipkt->pkt_cdbp[7];
4876 		pllen = (pllen << 8) | scsipkt->pkt_cdbp[7];
4877 	}
4878 
4879 	*scsipkt->pkt_scbp = STATUS_GOOD;	/* Presumed outcome */
4880 
4881 	if (bp != NULL && bp->b_un.b_addr && bp->b_bcount && pllen != 0) {
4882 		buf = (uint8_t *)bp->b_un.b_addr;
4883 		count = MIN(bp->b_bcount, pllen);
4884 		scsipkt->pkt_state |= STATE_XFERRED_DATA;
4885 		scsipkt->pkt_resid = 0;
4886 		pllen = count;
4887 
4888 		/*
4889 		 * Check the header to skip the block descriptor(s) - we
4890 		 * do not support setting device capacity.
4891 		 * Existing macros do not recognize long LBA dscriptor,
4892 		 * hence manual calculation.
4893 		 */
4894 		if (scsipkt->pkt_cdbp[0] == SCMD_MODE_SELECT) {
4895 			/* 6-bytes CMD, 4 bytes header */
4896 			if (count <= 4)
4897 				goto done;		/* header only */
4898 			len = buf[3] + 4;
4899 		} else {
4900 			/* 10-bytes CMD, 8 bytes header */
4901 			if (count <= 8)
4902 				goto done;		/* header only */
4903 			len = buf[6];
4904 			len = (len << 8) + buf[7] + 8;
4905 		}
4906 		if (len >= count)
4907 			goto done;	/* header + descriptor(s) only */
4908 
4909 		pllen -= len;		/* remaining data length */
4910 
4911 		/*
4912 		 * We may be executing SATA command and want to execute it
4913 		 * in SYNCH mode, regardless of scsi_pkt setting.
4914 		 * Save scsi_pkt setting and indicate SYNCH mode
4915 		 */
4916 		nointr_flag = scsipkt->pkt_flags & FLAG_NOINTR;
4917 		if ((scsipkt->pkt_flags & FLAG_NOINTR) == 0 &&
4918 		    scsipkt->pkt_comp != NULL) {
4919 			scsipkt->pkt_flags |= FLAG_NOINTR;
4920 		}
4921 		spx->txlt_sata_pkt->satapkt_op_mode = SATA_OPMODE_SYNCH;
4922 
4923 		/*
4924 		 * len is now the offset to a first mode select page
4925 		 * Process all pages
4926 		 */
4927 		while (pllen > 0) {
4928 			switch ((int)buf[len]) {
4929 			case MODEPAGE_CACHING:
4930 				/* No support for SP (saving) */
4931 				if (scsipkt->pkt_cdbp[1] & 0x01) {
4932 					*scsipkt->pkt_scbp = STATUS_CHECK;
4933 					sense = sata_arq_sense(spx);
4934 					sense->es_key = KEY_ILLEGAL_REQUEST;
4935 					sense->es_add_code =
4936 					    SD_SCSI_ASC_INVALID_FIELD_IN_CDB;
4937 					goto done;
4938 				}
4939 				stat = sata_mode_select_page_8(spx,
4940 				    (struct mode_cache_scsi3 *)&buf[len],
4941 				    pllen, &pagelen, &rval, &dmod);
4942 				/*
4943 				 * The pagelen value indicates the number of
4944 				 * parameter bytes already processed.
4945 				 * The rval is the return value from
4946 				 * sata_tran_start().
4947 				 * The stat indicates the overall status of
4948 				 * the operation(s).
4949 				 */
4950 				if (stat != SATA_SUCCESS)
4951 					/*
4952 					 * Page processing did not succeed -
4953 					 * all error info is already set-up,
4954 					 * just return
4955 					 */
4956 					pllen = 0; /* this breaks the loop */
4957 				else {
4958 					len += pagelen;
4959 					pllen -= pagelen;
4960 				}
4961 				break;
4962 
4963 			case MODEPAGE_INFO_EXCPT:
4964 				stat = sata_mode_select_page_1c(spx,
4965 				    (struct mode_info_excpt_page *)&buf[len],
4966 				    pllen, &pagelen, &rval, &dmod);
4967 				/*
4968 				 * The pagelen value indicates the number of
4969 				 * parameter bytes already processed.
4970 				 * The rval is the return value from
4971 				 * sata_tran_start().
4972 				 * The stat indicates the overall status of
4973 				 * the operation(s).
4974 				 */
4975 				if (stat != SATA_SUCCESS)
4976 					/*
4977 					 * Page processing did not succeed -
4978 					 * all error info is already set-up,
4979 					 * just return
4980 					 */
4981 					pllen = 0; /* this breaks the loop */
4982 				else {
4983 					len += pagelen;
4984 					pllen -= pagelen;
4985 				}
4986 				break;
4987 
4988 			case MODEPAGE_ACOUSTIC_MANAG:
4989 				stat = sata_mode_select_page_30(spx,
4990 				    (struct mode_acoustic_management *)
4991 				    &buf[len], pllen, &pagelen, &rval, &dmod);
4992 				/*
4993 				 * The pagelen value indicates the number of
4994 				 * parameter bytes already processed.
4995 				 * The rval is the return value from
4996 				 * sata_tran_start().
4997 				 * The stat indicates the overall status of
4998 				 * the operation(s).
4999 				 */
5000 				if (stat != SATA_SUCCESS)
5001 					/*
5002 					 * Page processing did not succeed -
5003 					 * all error info is already set-up,
5004 					 * just return
5005 					 */
5006 					pllen = 0; /* this breaks the loop */
5007 				else {
5008 					len += pagelen;
5009 					pllen -= pagelen;
5010 				}
5011 
5012 				break;
5013 			default:
5014 				*scsipkt->pkt_scbp = STATUS_CHECK;
5015 				sense = sata_arq_sense(spx);
5016 				sense->es_key = KEY_ILLEGAL_REQUEST;
5017 				sense->es_add_code =
5018 				    SD_SCSI_ASC_INVALID_FIELD_IN_PARAMS_LIST;
5019 				goto done;
5020 			}
5021 		}
5022 	}
5023 done:
5024 	mutex_exit(&(SATA_TXLT_CPORT_MUTEX(spx)));
5025 	/*
5026 	 * If device parameters were modified, fetch and store the new
5027 	 * Identify Device data. Since port mutex could have been released
5028 	 * for accessing HBA driver, we need to re-check device existence.
5029 	 */
5030 	if (dmod != 0) {
5031 		sata_drive_info_t new_sdinfo, *sdinfo;
5032 		int rv;
5033 
5034 		new_sdinfo.satadrv_addr =
5035 		    spx->txlt_sata_pkt->satapkt_device.satadev_addr;
5036 		rv = sata_fetch_device_identify_data(spx->txlt_sata_hba_inst,
5037 		    &new_sdinfo);
5038 
5039 		mutex_enter(&(SATA_TXLT_CPORT_MUTEX(spx)));
5040 		/*
5041 		 * Since port mutex could have been released when
5042 		 * accessing HBA driver, we need to re-check that the
5043 		 * framework still holds the device info structure.
5044 		 */
5045 		sdinfo = sata_get_device_info(spx->txlt_sata_hba_inst,
5046 		    &spx->txlt_sata_pkt->satapkt_device);
5047 		if (sdinfo != NULL) {
5048 			/*
5049 			 * Device still has info structure in the
5050 			 * sata framework. Copy newly fetched info
5051 			 */
5052 			if (rv == 0) {
5053 				sdinfo->satadrv_id = new_sdinfo.satadrv_id;
5054 				sata_save_drive_settings(sdinfo);
5055 			} else {
5056 				/*
5057 				 * Could not fetch new data - invalidate
5058 				 * sata_drive_info. That makes device
5059 				 * unusable.
5060 				 */
5061 				sdinfo->satadrv_type = SATA_DTYPE_UNKNOWN;
5062 				sdinfo->satadrv_state = SATA_STATE_UNKNOWN;
5063 			}
5064 		}
5065 		if (rv != 0 || sdinfo == NULL) {
5066 			/*
5067 			 * This changes the overall mode select completion
5068 			 * reason to a failed one !!!!!
5069 			 */
5070 			*scsipkt->pkt_scbp = STATUS_CHECK;
5071 			sense = sata_arq_sense(spx);
5072 			scsipkt->pkt_reason = CMD_INCOMPLETE;
5073 			rval = TRAN_ACCEPT;
5074 		}
5075 		mutex_exit(&(SATA_TXLT_CPORT_MUTEX(spx)));
5076 	}
5077 	/* Restore the scsi pkt flags */
5078 	scsipkt->pkt_flags &= ~FLAG_NOINTR;
5079 	scsipkt->pkt_flags |= nointr_flag;
5080 
5081 	SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
5082 	    "Scsi_pkt completion reason %x\n", scsipkt->pkt_reason);
5083 
5084 	if ((scsipkt->pkt_flags & FLAG_NOINTR) == 0 &&
5085 	    scsipkt->pkt_comp != NULL)
5086 		/* scsi callback required */
5087 		if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
5088 		    (task_func_t *)scsipkt->pkt_comp, (void *) scsipkt,
5089 		    TQ_SLEEP) == NULL)
5090 			/* Scheduling the callback failed */
5091 			return (TRAN_BUSY);
5092 
5093 	return (rval);
5094 }
5095 
5096 
5097 
5098 /*
5099  * Translate command: Log Sense
5100  */
5101 static 	int
5102 sata_txlt_log_sense(sata_pkt_txlate_t *spx)
5103 {
5104 	struct scsi_pkt	*scsipkt = spx->txlt_scsi_pkt;
5105 	struct buf	*bp = spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp;
5106 	sata_drive_info_t *sdinfo;
5107 	struct scsi_extended_sense *sense;
5108 	int 		len, count, alc_len;
5109 	int		pc;	/* Page Control code */
5110 	int		page_code;	/* Page code */
5111 	uint8_t		*buf;	/* log sense buffer */
5112 	int		rval;
5113 #define	MAX_LOG_SENSE_PAGE_SIZE	512
5114 
5115 	SATADBG2(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
5116 	    "sata_txlt_log_sense, pc 0x%x, page code 0x%x\n",
5117 	    spx->txlt_scsi_pkt->pkt_cdbp[2] >> 6,
5118 	    spx->txlt_scsi_pkt->pkt_cdbp[2] & 0x3f);
5119 
5120 	buf = kmem_zalloc(MAX_LOG_SENSE_PAGE_SIZE, KM_SLEEP);
5121 
5122 	mutex_enter(&(SATA_TXLT_CPORT_MUTEX(spx)));
5123 
5124 	if (((rval = sata_txlt_generic_pkt_info(spx)) != TRAN_ACCEPT) ||
5125 	    (spx->txlt_scsi_pkt->pkt_reason == CMD_DEV_GONE)) {
5126 		mutex_exit(&(SATA_TXLT_CPORT_MUTEX(spx)));
5127 		kmem_free(buf, MAX_LOG_SENSE_PAGE_SIZE);
5128 		return (rval);
5129 	}
5130 
5131 	scsipkt->pkt_reason = CMD_CMPLT;
5132 	scsipkt->pkt_state = STATE_GOT_BUS | STATE_GOT_TARGET |
5133 	    STATE_SENT_CMD | STATE_GOT_STATUS;
5134 
5135 	pc = scsipkt->pkt_cdbp[2] >> 6;
5136 	page_code = scsipkt->pkt_cdbp[2] & 0x3f;
5137 
5138 	/* Reject not supported request for all but cumulative values */
5139 	switch (pc) {
5140 	case PC_CUMULATIVE_VALUES:
5141 		break;
5142 	default:
5143 		*scsipkt->pkt_scbp = STATUS_CHECK;
5144 		sense = sata_arq_sense(spx);
5145 		sense->es_key = KEY_ILLEGAL_REQUEST;
5146 		sense->es_add_code = SD_SCSI_ASC_INVALID_FIELD_IN_CDB;
5147 		goto done;
5148 	}
5149 
5150 	switch (page_code) {
5151 	case PAGE_CODE_GET_SUPPORTED_LOG_PAGES:
5152 	case PAGE_CODE_SELF_TEST_RESULTS:
5153 	case PAGE_CODE_INFORMATION_EXCEPTIONS:
5154 	case PAGE_CODE_SMART_READ_DATA:
5155 		break;
5156 	default:
5157 		*scsipkt->pkt_scbp = STATUS_CHECK;
5158 		sense = sata_arq_sense(spx);
5159 		sense->es_key = KEY_ILLEGAL_REQUEST;
5160 		sense->es_add_code = SD_SCSI_ASC_INVALID_FIELD_IN_CDB;
5161 		goto done;
5162 	}
5163 
5164 	if (bp != NULL && bp->b_un.b_addr && bp->b_bcount) {
5165 		/*
5166 		 * Because log sense uses local buffers for data retrieval from
5167 		 * the devices and sets the data programatically in the
5168 		 * original specified buffer, release preallocated DMA
5169 		 * resources before storing data in the original buffer,
5170 		 * so no unwanted DMA sync would take place.
5171 		 */
5172 		sata_id_t *sata_id;
5173 
5174 		sata_scsi_dmafree(NULL, scsipkt);
5175 
5176 		len = 0;
5177 
5178 		/* Build log parameter header */
5179 		buf[len++] = page_code;	/* page code as in the CDB */
5180 		buf[len++] = 0;		/* reserved */
5181 		buf[len++] = 0;		/* Zero out page length for now (MSB) */
5182 		buf[len++] = 0;		/* (LSB) */
5183 
5184 		sdinfo = sata_get_device_info(
5185 		    spx->txlt_sata_hba_inst,
5186 		    &spx->txlt_sata_pkt->satapkt_device);
5187 
5188 
5189 		/*
5190 		 * Add requested pages.
5191 		 */
5192 		switch (page_code) {
5193 		case PAGE_CODE_GET_SUPPORTED_LOG_PAGES:
5194 			len = sata_build_lsense_page_0(sdinfo, buf + len);
5195 			break;
5196 		case PAGE_CODE_SELF_TEST_RESULTS:
5197 			sata_id = &sdinfo->satadrv_id;
5198 			if ((! (sata_id->ai_cmdset84 &
5199 			    SATA_SMART_SELF_TEST_SUPPORTED)) ||
5200 			    (! (sata_id->ai_features87 &
5201 			    SATA_SMART_SELF_TEST_SUPPORTED))) {
5202 				*scsipkt->pkt_scbp = STATUS_CHECK;
5203 				sense = sata_arq_sense(spx);
5204 				sense->es_key = KEY_ILLEGAL_REQUEST;
5205 				sense->es_add_code =
5206 				    SD_SCSI_ASC_INVALID_FIELD_IN_CDB;
5207 
5208 				goto done;
5209 			}
5210 			len = sata_build_lsense_page_10(sdinfo, buf + len,
5211 			    spx->txlt_sata_hba_inst);
5212 			break;
5213 		case PAGE_CODE_INFORMATION_EXCEPTIONS:
5214 			sata_id = &sdinfo->satadrv_id;
5215 			if (! (sata_id->ai_cmdset82 & SATA_SMART_SUPPORTED)) {
5216 				*scsipkt->pkt_scbp = STATUS_CHECK;
5217 				sense = sata_arq_sense(spx);
5218 				sense->es_key = KEY_ILLEGAL_REQUEST;
5219 				sense->es_add_code =
5220 				    SD_SCSI_ASC_INVALID_FIELD_IN_CDB;
5221 
5222 				goto done;
5223 			}
5224 			if (! (sata_id->ai_features85 & SATA_SMART_ENABLED)) {
5225 				*scsipkt->pkt_scbp = STATUS_CHECK;
5226 				sense = sata_arq_sense(spx);
5227 				sense->es_key = KEY_ABORTED_COMMAND;
5228 				sense->es_add_code =
5229 				    SCSI_ASC_ATA_DEV_FEAT_NOT_ENABLED;
5230 				sense->es_qual_code =
5231 				    SCSI_ASCQ_ATA_DEV_FEAT_NOT_ENABLED;
5232 
5233 				goto done;
5234 			}
5235 
5236 			len = sata_build_lsense_page_2f(sdinfo, buf + len,
5237 			    spx->txlt_sata_hba_inst);
5238 			break;
5239 		case PAGE_CODE_SMART_READ_DATA:
5240 			sata_id = &sdinfo->satadrv_id;
5241 			if (! (sata_id->ai_cmdset82 & SATA_SMART_SUPPORTED)) {
5242 				*scsipkt->pkt_scbp = STATUS_CHECK;
5243 				sense = sata_arq_sense(spx);
5244 				sense->es_key = KEY_ILLEGAL_REQUEST;
5245 				sense->es_add_code =
5246 				    SD_SCSI_ASC_INVALID_FIELD_IN_CDB;
5247 
5248 				goto done;
5249 			}
5250 			if (! (sata_id->ai_features85 & SATA_SMART_ENABLED)) {
5251 				*scsipkt->pkt_scbp = STATUS_CHECK;
5252 				sense = sata_arq_sense(spx);
5253 				sense->es_key = KEY_ABORTED_COMMAND;
5254 				sense->es_add_code =
5255 				    SCSI_ASC_ATA_DEV_FEAT_NOT_ENABLED;
5256 				sense->es_qual_code =
5257 				    SCSI_ASCQ_ATA_DEV_FEAT_NOT_ENABLED;
5258 
5259 				goto done;
5260 			}
5261 
5262 			/* This page doesn't include a page header */
5263 			len = sata_build_lsense_page_30(sdinfo, buf,
5264 			    spx->txlt_sata_hba_inst);
5265 			goto no_header;
5266 		default:
5267 			/* Invalid request */
5268 			*scsipkt->pkt_scbp = STATUS_CHECK;
5269 			sense = sata_arq_sense(spx);
5270 			sense->es_key = KEY_ILLEGAL_REQUEST;
5271 			sense->es_add_code = SD_SCSI_ASC_INVALID_FIELD_IN_CDB;
5272 			goto done;
5273 		}
5274 
5275 		/* set parameter log sense data length */
5276 		buf[2] = len >> 8;	/* log sense length (MSB) */
5277 		buf[3] = len & 0xff;	/* log sense length (LSB) */
5278 
5279 		len += SCSI_LOG_PAGE_HDR_LEN;
5280 		ASSERT(len <= MAX_LOG_SENSE_PAGE_SIZE);
5281 
5282 no_header:
5283 		/* Check allocation length */
5284 		alc_len = scsipkt->pkt_cdbp[7];
5285 		alc_len = (len << 8) | scsipkt->pkt_cdbp[8];
5286 
5287 		/*
5288 		 * We do not check for possible parameters truncation
5289 		 * (alc_len < len) assuming that the target driver works
5290 		 * correctly. Just avoiding overrun.
5291 		 * Copy no more than requested and possible, buffer-wise.
5292 		 */
5293 		count = MIN(alc_len, len);
5294 		count = MIN(bp->b_bcount, count);
5295 		bcopy(buf, bp->b_un.b_addr, count);
5296 
5297 		scsipkt->pkt_state |= STATE_XFERRED_DATA;
5298 		scsipkt->pkt_resid = alc_len > count ? alc_len - count : 0;
5299 	}
5300 	*scsipkt->pkt_scbp = STATUS_GOOD;
5301 done:
5302 	mutex_exit(&(SATA_TXLT_CPORT_MUTEX(spx)));
5303 	(void) kmem_free(buf, MAX_LOG_SENSE_PAGE_SIZE);
5304 
5305 	SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
5306 	    "Scsi_pkt completion reason %x\n", scsipkt->pkt_reason);
5307 
5308 	if ((scsipkt->pkt_flags & FLAG_NOINTR) == 0 &&
5309 	    scsipkt->pkt_comp != NULL)
5310 		/* scsi callback required */
5311 		if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
5312 		    (task_func_t *)scsipkt->pkt_comp, (void *) scsipkt,
5313 		    TQ_SLEEP) == NULL)
5314 			/* Scheduling the callback failed */
5315 			return (TRAN_BUSY);
5316 
5317 	return (TRAN_ACCEPT);
5318 }
5319 
5320 /*
5321  * Translate command: Log Select
5322  * Not implemented at this time - returns invalid command response.
5323  */
5324 static 	int
5325 sata_txlt_log_select(sata_pkt_txlate_t *spx)
5326 {
5327 	SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
5328 	    "sata_txlt_log_select\n", NULL);
5329 
5330 	return (sata_txlt_invalid_command(spx));
5331 }
5332 
5333 
5334 /*
5335  * Translate command: Read (various types).
5336  * Translated into appropriate type of ATA READ command
5337  * for SATA hard disks.
5338  * Both the device capabilities and requested operation mode are
5339  * considered.
5340  *
5341  * Following scsi cdb fields are ignored:
5342  * rdprotect, dpo, fua, fua_nv, group_number.
5343  *
5344  * If SATA_ENABLE_QUEUING flag is set (in the global SATA HBA framework
5345  * enable variable sata_func_enable), the capability of the controller and
5346  * capability of a device are checked and if both support queueing, read
5347  * request will be translated to READ_DMA_QUEUEING or READ_DMA_QUEUEING_EXT
5348  * command rather than plain READ_XXX command.
5349  * If SATA_ENABLE_NCQ flag is set in addition to SATA_ENABLE_QUEUING flag and
5350  * both the controller and device suport such functionality, the read
5351  * request will be translated to READ_FPDMA_QUEUED command.
5352  *
5353  * Returns TRAN_ACCEPT or code returned by sata_hba_start() and
5354  * appropriate values in scsi_pkt fields.
5355  */
5356 static int
5357 sata_txlt_read(sata_pkt_txlate_t *spx)
5358 {
5359 	struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
5360 	sata_cmd_t *scmd = &spx->txlt_sata_pkt->satapkt_cmd;
5361 	sata_drive_info_t *sdinfo;
5362 	sata_hba_inst_t *shi = SATA_TXLT_HBA_INST(spx);
5363 	int cport = SATA_TXLT_CPORT(spx);
5364 	uint16_t sec_count;
5365 	uint64_t lba;
5366 	int rval;
5367 	int synch;
5368 
5369 	mutex_enter(&(SATA_TXLT_CPORT_MUTEX(spx)));
5370 
5371 	if (((rval = sata_txlt_generic_pkt_info(spx)) != TRAN_ACCEPT) ||
5372 	    (spx->txlt_scsi_pkt->pkt_reason == CMD_DEV_GONE)) {
5373 		mutex_exit(&(SATA_TXLT_CPORT_MUTEX(spx)));
5374 		return (rval);
5375 	}
5376 
5377 	sdinfo = sata_get_device_info(spx->txlt_sata_hba_inst,
5378 	    &spx->txlt_sata_pkt->satapkt_device);
5379 
5380 	scmd->satacmd_flags.sata_data_direction = SATA_DIR_READ;
5381 	/*
5382 	 * Extract LBA and sector count from scsi CDB.
5383 	 */
5384 	switch ((uint_t)scsipkt->pkt_cdbp[0]) {
5385 	case SCMD_READ:
5386 		/* 6-byte scsi read cmd : 0x08 */
5387 		lba = (scsipkt->pkt_cdbp[1] & 0x1f);
5388 		lba = (lba << 8) | scsipkt->pkt_cdbp[2];
5389 		lba = (lba << 8) | scsipkt->pkt_cdbp[3];
5390 		sec_count = scsipkt->pkt_cdbp[4];
5391 		/* sec_count 0 will be interpreted as 256 by a device */
5392 		break;
5393 	case SCMD_READ_G1:
5394 		/* 10-bytes scsi read command : 0x28 */
5395 		lba = scsipkt->pkt_cdbp[2];
5396 		lba = (lba << 8) | scsipkt->pkt_cdbp[3];
5397 		lba = (lba << 8) | scsipkt->pkt_cdbp[4];
5398 		lba = (lba << 8) | scsipkt->pkt_cdbp[5];
5399 		sec_count = scsipkt->pkt_cdbp[7];
5400 		sec_count = (sec_count << 8) | scsipkt->pkt_cdbp[8];
5401 		break;
5402 	case SCMD_READ_G5:
5403 		/* 12-bytes scsi read command : 0xA8 */
5404 		lba = scsipkt->pkt_cdbp[2];
5405 		lba = (lba << 8) | scsipkt->pkt_cdbp[3];
5406 		lba = (lba << 8) | scsipkt->pkt_cdbp[4];
5407 		lba = (lba << 8) | scsipkt->pkt_cdbp[5];
5408 		sec_count = scsipkt->pkt_cdbp[6];
5409 		sec_count = (sec_count << 8) | scsipkt->pkt_cdbp[7];
5410 		sec_count = (sec_count << 8) | scsipkt->pkt_cdbp[8];
5411 		sec_count = (sec_count << 8) | scsipkt->pkt_cdbp[9];
5412 		break;
5413 	case SCMD_READ_G4:
5414 		/* 16-bytes scsi read command : 0x88 */
5415 		lba = scsipkt->pkt_cdbp[2];
5416 		lba = (lba << 8) | scsipkt->pkt_cdbp[3];
5417 		lba = (lba << 8) | scsipkt->pkt_cdbp[4];
5418 		lba = (lba << 8) | scsipkt->pkt_cdbp[5];
5419 		lba = (lba << 8) | scsipkt->pkt_cdbp[6];
5420 		lba = (lba << 8) | scsipkt->pkt_cdbp[7];
5421 		lba = (lba << 8) | scsipkt->pkt_cdbp[8];
5422 		lba = (lba << 8) | scsipkt->pkt_cdbp[9];
5423 		sec_count = scsipkt->pkt_cdbp[10];
5424 		sec_count = (sec_count << 8) | scsipkt->pkt_cdbp[11];
5425 		sec_count = (sec_count << 8) | scsipkt->pkt_cdbp[12];
5426 		sec_count = (sec_count << 8) | scsipkt->pkt_cdbp[13];
5427 		break;
5428 	default:
5429 		/* Unsupported command */
5430 		mutex_exit(&(SATA_TXLT_CPORT_MUTEX(spx)));
5431 		return (sata_txlt_invalid_command(spx));
5432 	}
5433 
5434 	/*
5435 	 * Check if specified address exceeds device capacity
5436 	 */
5437 	if ((lba >= sdinfo->satadrv_capacity) ||
5438 	    ((lba + sec_count) > sdinfo->satadrv_capacity)) {
5439 		/* LBA out of range */
5440 		mutex_exit(&(SATA_TXLT_CPORT_MUTEX(spx)));
5441 		return (sata_txlt_lba_out_of_range(spx));
5442 	}
5443 
5444 	/*
5445 	 * For zero-length transfer, emulate good completion of the command
5446 	 * (reasons for rejecting the command were already checked).
5447 	 * No DMA resources were allocated.
5448 	 */
5449 	if (spx->txlt_dma_cookie_list == NULL) {
5450 		mutex_exit(&(SATA_TXLT_CPORT_MUTEX(spx)));
5451 		return (sata_emul_rw_completion(spx));
5452 	}
5453 
5454 	/*
5455 	 * Build cmd block depending on the device capability and
5456 	 * requested operation mode.
5457 	 * Do not bother with non-dma mode - we are working only with
5458 	 * devices supporting DMA.
5459 	 */
5460 	scmd->satacmd_addr_type = ATA_ADDR_LBA;
5461 	scmd->satacmd_device_reg = SATA_ADH_LBA;
5462 	scmd->satacmd_cmd_reg = SATAC_READ_DMA;
5463 	if (sdinfo->satadrv_features_support & SATA_DEV_F_LBA48) {
5464 		scmd->satacmd_addr_type = ATA_ADDR_LBA48;
5465 		scmd->satacmd_cmd_reg = SATAC_READ_DMA_EXT;
5466 		scmd->satacmd_sec_count_msb = sec_count >> 8;
5467 #ifndef __lock_lint
5468 		scmd->satacmd_lba_low_msb = (lba >> 24) & 0xff;
5469 		scmd->satacmd_lba_mid_msb = (lba >> 32) & 0xff;
5470 		scmd->satacmd_lba_high_msb = lba >> 40;
5471 #endif
5472 	} else if (sdinfo->satadrv_features_support & SATA_DEV_F_LBA28) {
5473 		scmd->satacmd_addr_type = ATA_ADDR_LBA28;
5474 		scmd->satacmd_device_reg = SATA_ADH_LBA | ((lba >> 24) & 0xf);
5475 	}
5476 	scmd->satacmd_sec_count_lsb = sec_count & 0xff;
5477 	scmd->satacmd_lba_low_lsb = lba & 0xff;
5478 	scmd->satacmd_lba_mid_lsb = (lba >> 8) & 0xff;
5479 	scmd->satacmd_lba_high_lsb = (lba >> 16) & 0xff;
5480 	scmd->satacmd_features_reg = 0;
5481 	scmd->satacmd_status_reg = 0;
5482 	scmd->satacmd_error_reg = 0;
5483 
5484 	/*
5485 	 * Check if queueing commands should be used and switch
5486 	 * to appropriate command if possible
5487 	 */
5488 	if (sata_func_enable & SATA_ENABLE_QUEUING) {
5489 		boolean_t using_queuing;
5490 
5491 		/* Queuing supported by controller and device? */
5492 		if ((sata_func_enable & SATA_ENABLE_NCQ) &&
5493 		    (sdinfo->satadrv_features_support &
5494 		    SATA_DEV_F_NCQ) &&
5495 		    (SATA_FEATURES(spx->txlt_sata_hba_inst) &
5496 		    SATA_CTLF_NCQ)) {
5497 			using_queuing = B_TRUE;
5498 
5499 			/* NCQ supported - use FPDMA READ */
5500 			scmd->satacmd_cmd_reg =
5501 			    SATAC_READ_FPDMA_QUEUED;
5502 			scmd->satacmd_features_reg_ext =
5503 			    scmd->satacmd_sec_count_msb;
5504 			scmd->satacmd_sec_count_msb = 0;
5505 		} else if ((sdinfo->satadrv_features_support &
5506 		    SATA_DEV_F_TCQ) &&
5507 		    (SATA_FEATURES(spx->txlt_sata_hba_inst) &
5508 		    SATA_CTLF_QCMD)) {
5509 			using_queuing = B_TRUE;
5510 
5511 			/* Legacy queueing */
5512 			if (sdinfo->satadrv_features_support &
5513 			    SATA_DEV_F_LBA48) {
5514 				scmd->satacmd_cmd_reg =
5515 				    SATAC_READ_DMA_QUEUED_EXT;
5516 				scmd->satacmd_features_reg_ext =
5517 				    scmd->satacmd_sec_count_msb;
5518 				scmd->satacmd_sec_count_msb = 0;
5519 			} else {
5520 				scmd->satacmd_cmd_reg =
5521 				    SATAC_READ_DMA_QUEUED;
5522 			}
5523 		} else	/* Queuing not supported */
5524 			using_queuing = B_FALSE;
5525 
5526 		/*
5527 		 * If queuing, the sector count goes in the features register
5528 		 * and the secount count will contain the tag.
5529 		 */
5530 		if (using_queuing) {
5531 			scmd->satacmd_features_reg =
5532 			    scmd->satacmd_sec_count_lsb;
5533 			scmd->satacmd_sec_count_lsb = 0;
5534 			scmd->satacmd_flags.sata_queued = B_TRUE;
5535 		}
5536 	}
5537 
5538 	SATADBG3(SATA_DBG_HBA_IF, spx->txlt_sata_hba_inst,
5539 	    "sata_txlt_read cmd 0x%2x, lba %llx, sec count %x\n",
5540 	    scmd->satacmd_cmd_reg, lba, sec_count);
5541 
5542 	if (!(spx->txlt_sata_pkt->satapkt_op_mode & SATA_OPMODE_SYNCH)) {
5543 		/* Need callback function */
5544 		spx->txlt_sata_pkt->satapkt_comp = sata_txlt_rw_completion;
5545 		synch = FALSE;
5546 	} else
5547 		synch = TRUE;
5548 
5549 	/* Transfer command to HBA */
5550 	if (sata_hba_start(spx, &rval) != 0) {
5551 		/* Pkt not accepted for execution */
5552 		mutex_exit(&SATA_CPORT_MUTEX(shi, cport));
5553 		return (rval);
5554 	}
5555 	mutex_exit(&SATA_CPORT_MUTEX(shi, cport));
5556 	/*
5557 	 * If execution is non-synchronous,
5558 	 * a callback function will handle potential errors, translate
5559 	 * the response and will do a callback to a target driver.
5560 	 * If it was synchronous, check execution status using the same
5561 	 * framework callback.
5562 	 */
5563 	if (synch) {
5564 		SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
5565 		    "synchronous execution status %x\n",
5566 		    spx->txlt_sata_pkt->satapkt_reason);
5567 		sata_txlt_rw_completion(spx->txlt_sata_pkt);
5568 	}
5569 	return (TRAN_ACCEPT);
5570 }
5571 
5572 
5573 /*
5574  * SATA translate command: Write (various types)
5575  * Translated into appropriate type of ATA WRITE command
5576  * for SATA hard disks.
5577  * Both the device capabilities and requested operation mode are
5578  * considered.
5579  *
5580  * Following scsi cdb fields are ignored:
5581  * rwprotect, dpo, fua, fua_nv, group_number.
5582  *
5583  * Returns TRAN_ACCEPT or code returned by sata_hba_start() and
5584  * appropriate values in scsi_pkt fields.
5585  */
5586 static int
5587 sata_txlt_write(sata_pkt_txlate_t *spx)
5588 {
5589 	struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
5590 	sata_cmd_t *scmd = &spx->txlt_sata_pkt->satapkt_cmd;
5591 	sata_drive_info_t *sdinfo;
5592 	sata_hba_inst_t *shi = SATA_TXLT_HBA_INST(spx);
5593 	int cport = SATA_TXLT_CPORT(spx);
5594 	uint16_t sec_count;
5595 	uint64_t lba;
5596 	int rval;
5597 	int synch;
5598 
5599 	mutex_enter(&(SATA_TXLT_CPORT_MUTEX(spx)));
5600 
5601 	if (((rval = sata_txlt_generic_pkt_info(spx)) != TRAN_ACCEPT) ||
5602 	    (spx->txlt_scsi_pkt->pkt_reason == CMD_DEV_GONE)) {
5603 		mutex_exit(&(SATA_TXLT_CPORT_MUTEX(spx)));
5604 		return (rval);
5605 	}
5606 
5607 	sdinfo = sata_get_device_info(spx->txlt_sata_hba_inst,
5608 	    &spx->txlt_sata_pkt->satapkt_device);
5609 
5610 	scmd->satacmd_flags.sata_data_direction = SATA_DIR_WRITE;
5611 	/*
5612 	 * Extract LBA and sector count from scsi CDB
5613 	 */
5614 	switch ((uint_t)scsipkt->pkt_cdbp[0]) {
5615 	case SCMD_WRITE:
5616 		/* 6-byte scsi read cmd : 0x0A */
5617 		lba = (scsipkt->pkt_cdbp[1] & 0x1f);
5618 		lba = (lba << 8) | scsipkt->pkt_cdbp[2];
5619 		lba = (lba << 8) | scsipkt->pkt_cdbp[3];
5620 		sec_count = scsipkt->pkt_cdbp[4];
5621 		/* sec_count 0 will be interpreted as 256 by a device */
5622 		break;
5623 	case SCMD_WRITE_G1:
5624 		/* 10-bytes scsi write command : 0x2A */
5625 		lba = scsipkt->pkt_cdbp[2];
5626 		lba = (lba << 8) | scsipkt->pkt_cdbp[3];
5627 		lba = (lba << 8) | scsipkt->pkt_cdbp[4];
5628 		lba = (lba << 8) | scsipkt->pkt_cdbp[5];
5629 		sec_count = scsipkt->pkt_cdbp[7];
5630 		sec_count = (sec_count << 8) | scsipkt->pkt_cdbp[8];
5631 		break;
5632 	case SCMD_WRITE_G5:
5633 		/* 12-bytes scsi read command : 0xAA */
5634 		lba = scsipkt->pkt_cdbp[2];
5635 		lba = (lba << 8) | scsipkt->pkt_cdbp[3];
5636 		lba = (lba << 8) | scsipkt->pkt_cdbp[4];
5637 		lba = (lba << 8) | scsipkt->pkt_cdbp[5];
5638 		sec_count = scsipkt->pkt_cdbp[6];
5639 		sec_count = (sec_count << 8) | scsipkt->pkt_cdbp[7];
5640 		sec_count = (sec_count << 8) | scsipkt->pkt_cdbp[8];
5641 		sec_count = (sec_count << 8) | scsipkt->pkt_cdbp[9];
5642 		break;
5643 	case SCMD_WRITE_G4:
5644 		/* 16-bytes scsi write command : 0x8A */
5645 		lba = scsipkt->pkt_cdbp[2];
5646 		lba = (lba << 8) | scsipkt->pkt_cdbp[3];
5647 		lba = (lba << 8) | scsipkt->pkt_cdbp[4];
5648 		lba = (lba << 8) | scsipkt->pkt_cdbp[5];
5649 		lba = (lba << 8) | scsipkt->pkt_cdbp[6];
5650 		lba = (lba << 8) | scsipkt->pkt_cdbp[7];
5651 		lba = (lba << 8) | scsipkt->pkt_cdbp[8];
5652 		lba = (lba << 8) | scsipkt->pkt_cdbp[9];
5653 		sec_count = scsipkt->pkt_cdbp[10];
5654 		sec_count = (sec_count << 8) | scsipkt->pkt_cdbp[11];
5655 		sec_count = (sec_count << 8) | scsipkt->pkt_cdbp[12];
5656 		sec_count = (sec_count << 8) | scsipkt->pkt_cdbp[13];
5657 		break;
5658 	default:
5659 		/* Unsupported command */
5660 		mutex_exit(&(SATA_TXLT_CPORT_MUTEX(spx)));
5661 		return (sata_txlt_invalid_command(spx));
5662 	}
5663 
5664 	/*
5665 	 * Check if specified address and length exceeds device capacity
5666 	 */
5667 	if ((lba >= sdinfo->satadrv_capacity) ||
5668 	    ((lba + sec_count) > sdinfo->satadrv_capacity)) {
5669 		/* LBA out of range */
5670 		mutex_exit(&(SATA_TXLT_CPORT_MUTEX(spx)));
5671 		return (sata_txlt_lba_out_of_range(spx));
5672 	}
5673 
5674 	/*
5675 	 * For zero-length transfer, emulate good completion of the command
5676 	 * (reasons for rejecting the command were already checked).
5677 	 * No DMA resources were allocated.
5678 	 */
5679 	if (spx->txlt_dma_cookie_list == NULL) {
5680 		mutex_exit(&(SATA_TXLT_CPORT_MUTEX(spx)));
5681 		return (sata_emul_rw_completion(spx));
5682 	}
5683 
5684 	/*
5685 	 * Build cmd block depending on the device capability and
5686 	 * requested operation mode.
5687 	 * Do not bother with non-dma mode- we are working only with
5688 	 * devices supporting DMA.
5689 	 */
5690 	scmd->satacmd_addr_type = ATA_ADDR_LBA;
5691 	scmd->satacmd_device_reg = SATA_ADH_LBA;
5692 	scmd->satacmd_cmd_reg = SATAC_WRITE_DMA;
5693 	if (sdinfo->satadrv_features_support & SATA_DEV_F_LBA48) {
5694 		scmd->satacmd_addr_type = ATA_ADDR_LBA48;
5695 		scmd->satacmd_cmd_reg = SATAC_WRITE_DMA_EXT;
5696 		scmd->satacmd_sec_count_msb = sec_count >> 8;
5697 		scmd->satacmd_lba_low_msb = (lba >> 24) & 0xff;
5698 #ifndef __lock_lint
5699 		scmd->satacmd_lba_mid_msb = (lba >> 32) & 0xff;
5700 		scmd->satacmd_lba_high_msb = lba >> 40;
5701 #endif
5702 	} else if (sdinfo->satadrv_features_support & SATA_DEV_F_LBA28) {
5703 		scmd->satacmd_addr_type = ATA_ADDR_LBA28;
5704 		scmd->satacmd_device_reg = SATA_ADH_LBA | ((lba >> 24) & 0xf);
5705 	}
5706 	scmd->satacmd_sec_count_lsb = sec_count & 0xff;
5707 	scmd->satacmd_lba_low_lsb = lba & 0xff;
5708 	scmd->satacmd_lba_mid_lsb = (lba >> 8) & 0xff;
5709 	scmd->satacmd_lba_high_lsb = (lba >> 16) & 0xff;
5710 	scmd->satacmd_features_reg = 0;
5711 	scmd->satacmd_status_reg = 0;
5712 	scmd->satacmd_error_reg = 0;
5713 
5714 	/*
5715 	 * Check if queueing commands should be used and switch
5716 	 * to appropriate command if possible
5717 	 */
5718 	if (sata_func_enable & SATA_ENABLE_QUEUING) {
5719 		boolean_t using_queuing;
5720 
5721 		/* Queuing supported by controller and device? */
5722 		if ((sata_func_enable & SATA_ENABLE_NCQ) &&
5723 		    (sdinfo->satadrv_features_support &
5724 		    SATA_DEV_F_NCQ) &&
5725 		    (SATA_FEATURES(spx->txlt_sata_hba_inst) &
5726 		    SATA_CTLF_NCQ)) {
5727 			using_queuing = B_TRUE;
5728 
5729 			/* NCQ supported - use FPDMA WRITE */
5730 			scmd->satacmd_cmd_reg =
5731 			    SATAC_WRITE_FPDMA_QUEUED;
5732 			scmd->satacmd_features_reg_ext =
5733 			    scmd->satacmd_sec_count_msb;
5734 			scmd->satacmd_sec_count_msb = 0;
5735 		} else if ((sdinfo->satadrv_features_support &
5736 		    SATA_DEV_F_TCQ) &&
5737 		    (SATA_FEATURES(spx->txlt_sata_hba_inst) &
5738 		    SATA_CTLF_QCMD)) {
5739 			using_queuing = B_TRUE;
5740 
5741 			/* Legacy queueing */
5742 			if (sdinfo->satadrv_features_support &
5743 			    SATA_DEV_F_LBA48) {
5744 				scmd->satacmd_cmd_reg =
5745 				    SATAC_WRITE_DMA_QUEUED_EXT;
5746 				scmd->satacmd_features_reg_ext =
5747 				    scmd->satacmd_sec_count_msb;
5748 				scmd->satacmd_sec_count_msb = 0;
5749 			} else {
5750 				scmd->satacmd_cmd_reg =
5751 				    SATAC_WRITE_DMA_QUEUED;
5752 			}
5753 		} else	/* Queuing not supported */
5754 			using_queuing = B_FALSE;
5755 
5756 		if (using_queuing) {
5757 			scmd->satacmd_features_reg =
5758 			    scmd->satacmd_sec_count_lsb;
5759 			scmd->satacmd_sec_count_lsb = 0;
5760 			scmd->satacmd_flags.sata_queued = B_TRUE;
5761 		}
5762 	}
5763 
5764 	SATADBG3(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
5765 	    "sata_txlt_write cmd 0x%2x, lba %llx, sec count %x\n",
5766 	    scmd->satacmd_cmd_reg, lba, sec_count);
5767 
5768 	if (!(spx->txlt_sata_pkt->satapkt_op_mode & SATA_OPMODE_SYNCH)) {
5769 		/* Need callback function */
5770 		spx->txlt_sata_pkt->satapkt_comp = sata_txlt_rw_completion;
5771 		synch = FALSE;
5772 	} else
5773 		synch = TRUE;
5774 
5775 	/* Transfer command to HBA */
5776 	if (sata_hba_start(spx, &rval) != 0) {
5777 		/* Pkt not accepted for execution */
5778 		mutex_exit(&SATA_CPORT_MUTEX(shi, cport));
5779 		return (rval);
5780 	}
5781 	mutex_exit(&SATA_CPORT_MUTEX(shi, cport));
5782 
5783 	/*
5784 	 * If execution is non-synchronous,
5785 	 * a callback function will handle potential errors, translate
5786 	 * the response and will do a callback to a target driver.
5787 	 * If it was synchronous, check execution status using the same
5788 	 * framework callback.
5789 	 */
5790 	if (synch) {
5791 		SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
5792 		    "synchronous execution status %x\n",
5793 		    spx->txlt_sata_pkt->satapkt_reason);
5794 		sata_txlt_rw_completion(spx->txlt_sata_pkt);
5795 	}
5796 	return (TRAN_ACCEPT);
5797 }
5798 
5799 
5800 /*
5801  * Implements SCSI SBC WRITE BUFFER command download microcode option
5802  */
5803 static int
5804 sata_txlt_write_buffer(sata_pkt_txlate_t *spx)
5805 {
5806 #define	WB_DOWNLOAD_MICROCODE_AND_REVERT_MODE			4
5807 #define	WB_DOWNLOAD_MICROCODE_AND_SAVE_MODE			5
5808 
5809 	struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
5810 	sata_cmd_t *scmd = &spx->txlt_sata_pkt->satapkt_cmd;
5811 	struct buf *bp = spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp;
5812 	struct scsi_extended_sense *sense;
5813 	int rval, mode, sector_count;
5814 	sata_hba_inst_t *shi = SATA_TXLT_HBA_INST(spx);
5815 	int cport = SATA_TXLT_CPORT(spx);
5816 	boolean_t synch;
5817 
5818 	synch = (spx->txlt_sata_pkt->satapkt_op_mode & SATA_OPMODE_SYNCH) != 0;
5819 	mode = scsipkt->pkt_cdbp[1] & 0x1f;
5820 
5821 	SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
5822 	    "sata_txlt_write_buffer, mode 0x%x\n", mode);
5823 
5824 	mutex_enter(&(SATA_TXLT_CPORT_MUTEX(spx)));
5825 
5826 	if ((rval = sata_txlt_generic_pkt_info(spx)) != TRAN_ACCEPT) {
5827 		mutex_exit(&(SATA_TXLT_CPORT_MUTEX(spx)));
5828 		return (rval);
5829 	}
5830 
5831 	scmd->satacmd_flags.sata_data_direction = SATA_DIR_WRITE;
5832 
5833 	scsipkt->pkt_reason = CMD_CMPLT;
5834 	scsipkt->pkt_state = STATE_GOT_BUS | STATE_GOT_TARGET |
5835 	    STATE_SENT_CMD | STATE_GOT_STATUS;
5836 
5837 	/*
5838 	 * The SCSI to ATA translation specification only calls
5839 	 * for WB_DOWNLOAD_MICROCODE_AND_SAVE_MODE.
5840 	 * WB_DOWNLOAD_MICROC_AND_REVERT_MODE is implemented, but
5841 	 * ATA 8 (draft) got rid of download microcode for temp
5842 	 * and it is even optional for ATA 7, so it may be aborted.
5843 	 * WB_DOWNLOAD_MICROCODE_WITH_OFFSET is not implemented as
5844 	 * it is not specified and the buffer offset for SCSI is a 16-bit
5845 	 * value in bytes, but for ATA it is a 16-bit offset in 512 byte
5846 	 * sectors.  Thus the offset really doesn't buy us anything.
5847 	 * If and when ATA 8 is stabilized and the SCSI to ATA specification
5848 	 * is revised, this can be revisisted.
5849 	 */
5850 	/* Reject not supported request */
5851 	switch (mode) {
5852 	case WB_DOWNLOAD_MICROCODE_AND_REVERT_MODE:
5853 		scmd->satacmd_features_reg = SATA_DOWNLOAD_MCODE_TEMP;
5854 		break;
5855 	case WB_DOWNLOAD_MICROCODE_AND_SAVE_MODE:
5856 		scmd->satacmd_features_reg = SATA_DOWNLOAD_MCODE_SAVE;
5857 		break;
5858 	default:
5859 		goto bad_param;
5860 	}
5861 
5862 	*scsipkt->pkt_scbp = STATUS_GOOD;	/* Presumed outcome */
5863 
5864 	scmd->satacmd_cmd_reg = SATAC_DOWNLOAD_MICROCODE;
5865 	if ((bp->b_bcount % SATA_DISK_SECTOR_SIZE) != 0)
5866 		goto bad_param;
5867 	sector_count = bp->b_bcount / SATA_DISK_SECTOR_SIZE;
5868 	scmd->satacmd_sec_count_lsb = (uint8_t)sector_count;
5869 	scmd->satacmd_lba_low_lsb = ((uint16_t)sector_count) >> 8;
5870 	scmd->satacmd_lba_mid_lsb = 0;
5871 	scmd->satacmd_lba_high_lsb = 0;
5872 	scmd->satacmd_device_reg = 0;
5873 	spx->txlt_sata_pkt->satapkt_comp =
5874 	    sata_txlt_download_mcode_cmd_completion;
5875 	scmd->satacmd_addr_type = 0;
5876 
5877 	/* Transfer command to HBA */
5878 	if (sata_hba_start(spx, &rval) != 0) {
5879 		/* Pkt not accepted for execution */
5880 		mutex_exit(&SATA_CPORT_MUTEX(shi, cport));
5881 		return (rval);
5882 	}
5883 
5884 	mutex_exit(&SATA_CPORT_MUTEX(shi, cport));
5885 	/*
5886 	 * If execution is non-synchronous,
5887 	 * a callback function will handle potential errors, translate
5888 	 * the response and will do a callback to a target driver.
5889 	 * If it was synchronous, check execution status using the same
5890 	 * framework callback.
5891 	 */
5892 	if (synch) {
5893 		SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
5894 		    "synchronous execution\n", NULL);
5895 		/* Calling pre-set completion routine */
5896 		(*spx->txlt_sata_pkt->satapkt_comp)(spx->txlt_sata_pkt);
5897 	}
5898 	return (TRAN_ACCEPT);
5899 
5900 bad_param:
5901 	mutex_exit(&(SATA_TXLT_CPORT_MUTEX(spx)));
5902 	*scsipkt->pkt_scbp = STATUS_CHECK;
5903 	sense = sata_arq_sense(spx);
5904 	sense->es_key = KEY_ILLEGAL_REQUEST;
5905 	sense->es_add_code = SD_SCSI_ASC_INVALID_FIELD_IN_CDB;
5906 	if ((scsipkt->pkt_flags & FLAG_NOINTR) == 0 &&
5907 	    scsipkt->pkt_comp != NULL) {
5908 		/* scsi callback required */
5909 		if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
5910 		    (task_func_t *)scsipkt->pkt_comp, (void *) scsipkt,
5911 		    TQ_SLEEP) == 0) {
5912 			/* Scheduling the callback failed */
5913 			rval = TRAN_BUSY;
5914 		}
5915 	}
5916 	return (rval);
5917 }
5918 
5919 
5920 /*
5921  * Retry identify device when command returns SATA_INCOMPLETE_DATA
5922  * after doing a firmware download.
5923  */
5924 static void
5925 sata_retry_identify_device(void *arg)
5926 {
5927 #define	DOWNLOAD_WAIT_TIME_SECS	60
5928 #define	DOWNLOAD_WAIT_INTERVAL_SECS	1
5929 	int rval;
5930 	int retry_cnt;
5931 	sata_pkt_t *sata_pkt = (sata_pkt_t *)arg;
5932 	sata_pkt_txlate_t *spx =
5933 	    (sata_pkt_txlate_t *)sata_pkt->satapkt_framework_private;
5934 	struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
5935 	sata_hba_inst_t *sata_hba_inst = spx->txlt_sata_hba_inst;
5936 	sata_device_t sata_device = spx->txlt_sata_pkt->satapkt_device;
5937 	sata_drive_info_t *sdinfo;
5938 
5939 	/*
5940 	 * Before returning good status, probe device.
5941 	 * Device probing will get IDENTIFY DEVICE data, if possible.
5942 	 * The assumption is that the new microcode is applied by the
5943 	 * device. It is a caller responsibility to verify this.
5944 	 */
5945 	for (retry_cnt = 0;
5946 	    retry_cnt < DOWNLOAD_WAIT_TIME_SECS / DOWNLOAD_WAIT_INTERVAL_SECS;
5947 	    retry_cnt++) {
5948 		rval = sata_probe_device(sata_hba_inst, &sata_device);
5949 
5950 		if (rval == SATA_SUCCESS) { /* Set default features */
5951 			sdinfo = sata_get_device_info(sata_hba_inst,
5952 			    &sata_device);
5953 			if (sata_initialize_device(sata_hba_inst, sdinfo) !=
5954 			    SATA_SUCCESS) {
5955 				/* retry */
5956 				(void) sata_initialize_device(sata_hba_inst,
5957 				    sdinfo);
5958 			}
5959 			if ((scsipkt->pkt_flags & FLAG_NOINTR) == 0 &&
5960 			    scsipkt->pkt_comp != NULL)
5961 				(*scsipkt->pkt_comp)(scsipkt);
5962 			return;
5963 		} else if (rval == SATA_RETRY) {
5964 			delay(drv_usectohz(1000000 *
5965 			    DOWNLOAD_WAIT_INTERVAL_SECS));
5966 			continue;
5967 		} else	/* failed - no reason to retry */
5968 			break;
5969 	}
5970 
5971 	/*
5972 	 * Something went wrong, device probing failed.
5973 	 */
5974 	SATA_LOG_D((sata_hba_inst, CE_WARN,
5975 	    "Cannot probe device after downloading microcode\n"));
5976 
5977 	/* Reset device to force retrying the probe. */
5978 	(void) (*SATA_RESET_DPORT_FUNC(sata_hba_inst))
5979 	    (SATA_DIP(sata_hba_inst), &sata_device);
5980 
5981 	if ((scsipkt->pkt_flags & FLAG_NOINTR) == 0 &&
5982 	    scsipkt->pkt_comp != NULL)
5983 		(*scsipkt->pkt_comp)(scsipkt);
5984 }
5985 
5986 /*
5987  * Translate completion status of download microcode command.
5988  * pkt completion_reason is checked to determine the completion status.
5989  * Do scsi callback if necessary (FLAG_NOINTR == 0)
5990  *
5991  * Note: this function may be called also for synchronously executed
5992  * command.
5993  * This function may be used only if scsi_pkt is non-NULL.
5994  */
5995 static void
5996 sata_txlt_download_mcode_cmd_completion(sata_pkt_t *sata_pkt)
5997 {
5998 	sata_pkt_txlate_t *spx =
5999 	    (sata_pkt_txlate_t *)sata_pkt->satapkt_framework_private;
6000 	struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
6001 	struct scsi_extended_sense *sense;
6002 	sata_drive_info_t *sdinfo;
6003 	sata_hba_inst_t *sata_hba_inst = spx->txlt_sata_hba_inst;
6004 	sata_device_t sata_device = spx->txlt_sata_pkt->satapkt_device;
6005 	int rval;
6006 
6007 	scsipkt->pkt_state = STATE_GOT_BUS | STATE_GOT_TARGET |
6008 	    STATE_SENT_CMD | STATE_XFERRED_DATA | STATE_GOT_STATUS;
6009 	if (sata_pkt->satapkt_reason == SATA_PKT_COMPLETED) {
6010 		scsipkt->pkt_reason = CMD_CMPLT;
6011 
6012 		rval = sata_probe_device(sata_hba_inst, &sata_device);
6013 
6014 		if (rval == SATA_SUCCESS) { /* Set default features */
6015 			sdinfo = sata_get_device_info(sata_hba_inst,
6016 			    &sata_device);
6017 			if (sata_initialize_device(sata_hba_inst, sdinfo) !=
6018 			    SATA_SUCCESS) {
6019 				/* retry */
6020 				(void) sata_initialize_device(sata_hba_inst,
6021 				    sdinfo);
6022 			}
6023 			if ((scsipkt->pkt_flags & FLAG_NOINTR) == 0 &&
6024 			    scsipkt->pkt_comp != NULL)
6025 				(*scsipkt->pkt_comp)(scsipkt);
6026 		} else {
6027 			(void) ddi_taskq_dispatch(
6028 			    (ddi_taskq_t *)SATA_TXLT_TASKQ(spx),
6029 			    sata_retry_identify_device,
6030 			    (void *)sata_pkt, TQ_NOSLEEP);
6031 		}
6032 
6033 
6034 	} else {
6035 		/* Something went wrong, microcode download command failed */
6036 		scsipkt->pkt_reason = CMD_INCOMPLETE;
6037 		*scsipkt->pkt_scbp = STATUS_CHECK;
6038 		sense = sata_arq_sense(spx);
6039 		switch (sata_pkt->satapkt_reason) {
6040 		case SATA_PKT_PORT_ERROR:
6041 			/*
6042 			 * We have no device data. Assume no data transfered.
6043 			 */
6044 			sense->es_key = KEY_HARDWARE_ERROR;
6045 			break;
6046 
6047 		case SATA_PKT_DEV_ERROR:
6048 			if (sata_pkt->satapkt_cmd.satacmd_status_reg &
6049 			    SATA_STATUS_ERR) {
6050 				/*
6051 				 * determine dev error reason from error
6052 				 * reg content
6053 				 */
6054 				sata_decode_device_error(spx, sense);
6055 				break;
6056 			}
6057 			/* No extended sense key - no info available */
6058 			break;
6059 
6060 		case SATA_PKT_TIMEOUT:
6061 			/* scsipkt->pkt_reason = CMD_TIMEOUT; */
6062 			scsipkt->pkt_reason = CMD_INCOMPLETE;
6063 			/* No extended sense key ? */
6064 			break;
6065 
6066 		case SATA_PKT_ABORTED:
6067 			scsipkt->pkt_reason = CMD_ABORTED;
6068 			/* No extended sense key ? */
6069 			break;
6070 
6071 		case SATA_PKT_RESET:
6072 			/* pkt aborted by an explicit reset from a host */
6073 			scsipkt->pkt_reason = CMD_RESET;
6074 			break;
6075 
6076 		default:
6077 			SATA_LOG_D((spx->txlt_sata_hba_inst, CE_WARN,
6078 			    "sata_txlt_nodata_cmd_completion: "
6079 			    "invalid packet completion reason %d",
6080 			    sata_pkt->satapkt_reason));
6081 			scsipkt->pkt_reason = CMD_TRAN_ERR;
6082 			break;
6083 		}
6084 
6085 		SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
6086 		    "scsi_pkt completion reason %x\n", scsipkt->pkt_reason);
6087 
6088 		if ((scsipkt->pkt_flags & FLAG_NOINTR) == 0 &&
6089 		    scsipkt->pkt_comp != NULL)
6090 			/* scsi callback required */
6091 			(*scsipkt->pkt_comp)(scsipkt);
6092 	}
6093 }
6094 
6095 
6096 
6097 
6098 /*
6099  * Translate command: Synchronize Cache.
6100  * Translates into Flush Cache command for SATA hard disks.
6101  *
6102  * Returns TRAN_ACCEPT or code returned by sata_hba_start() and
6103  * appropriate values in scsi_pkt fields.
6104  */
6105 static 	int
6106 sata_txlt_synchronize_cache(sata_pkt_txlate_t *spx)
6107 {
6108 	sata_cmd_t *scmd = &spx->txlt_sata_pkt->satapkt_cmd;
6109 	sata_hba_inst_t *shi = SATA_TXLT_HBA_INST(spx);
6110 	int cport = SATA_TXLT_CPORT(spx);
6111 	int rval;
6112 	int synch;
6113 
6114 	mutex_enter(&(SATA_TXLT_CPORT_MUTEX(spx)));
6115 
6116 	if (((rval = sata_txlt_generic_pkt_info(spx)) != TRAN_ACCEPT) ||
6117 	    (spx->txlt_scsi_pkt->pkt_reason == CMD_DEV_GONE)) {
6118 		mutex_exit(&(SATA_TXLT_CPORT_MUTEX(spx)));
6119 		return (rval);
6120 	}
6121 
6122 	scmd->satacmd_addr_type = 0;
6123 	scmd->satacmd_cmd_reg = SATAC_FLUSH_CACHE;
6124 	scmd->satacmd_device_reg = 0;
6125 	scmd->satacmd_sec_count_lsb = 0;
6126 	scmd->satacmd_lba_low_lsb = 0;
6127 	scmd->satacmd_lba_mid_lsb = 0;
6128 	scmd->satacmd_lba_high_lsb = 0;
6129 	scmd->satacmd_features_reg = 0;
6130 	scmd->satacmd_status_reg = 0;
6131 	scmd->satacmd_error_reg = 0;
6132 
6133 	SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
6134 	    "sata_txlt_synchronize_cache\n", NULL);
6135 
6136 	if (!(spx->txlt_sata_pkt->satapkt_op_mode & SATA_OPMODE_SYNCH)) {
6137 		/* Need to set-up a callback function */
6138 		spx->txlt_sata_pkt->satapkt_comp =
6139 		    sata_txlt_nodata_cmd_completion;
6140 		synch = FALSE;
6141 	} else
6142 		synch = TRUE;
6143 
6144 	/* Transfer command to HBA */
6145 	if (sata_hba_start(spx, &rval) != 0) {
6146 		/* Pkt not accepted for execution */
6147 		mutex_exit(&SATA_CPORT_MUTEX(shi, cport));
6148 		return (rval);
6149 	}
6150 	mutex_exit(&SATA_CPORT_MUTEX(shi, cport));
6151 
6152 	/*
6153 	 * If execution non-synchronous, it had to be completed
6154 	 * a callback function will handle potential errors, translate
6155 	 * the response and will do a callback to a target driver.
6156 	 * If it was synchronous, check status, using the same
6157 	 * framework callback.
6158 	 */
6159 	if (synch) {
6160 		SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
6161 		    "synchronous execution status %x\n",
6162 		    spx->txlt_sata_pkt->satapkt_reason);
6163 		sata_txlt_nodata_cmd_completion(spx->txlt_sata_pkt);
6164 	}
6165 	return (TRAN_ACCEPT);
6166 }
6167 
6168 
6169 /*
6170  * Send pkt to SATA HBA driver
6171  *
6172  * This function may be called only if the operation is requested by scsi_pkt,
6173  * i.e. scsi_pkt is not NULL.
6174  *
6175  * This function has to be called with cport mutex held. It does release
6176  * the mutex when it calls HBA driver sata_tran_start function and
6177  * re-acquires it afterwards.
6178  *
6179  * If return value is 0, pkt was accepted, -1 otherwise
6180  * rval is set to appropriate sata_scsi_start return value.
6181  *
6182  * Note 1:If HBA driver returns value other than TRAN_ACCEPT, it should not
6183  * have called the sata_pkt callback function for this packet.
6184  *
6185  * The scsi callback has to be performed by the caller of this routine.
6186  *
6187  * Note 2: No port multiplier support for now.
6188  */
6189 static int
6190 sata_hba_start(sata_pkt_txlate_t *spx, int *rval)
6191 {
6192 	int stat, cport;
6193 	sata_hba_inst_t *sata_hba_inst = spx->txlt_sata_hba_inst;
6194 	sata_drive_info_t *sdinfo;
6195 	sata_device_t *sata_device;
6196 	uint8_t cmd;
6197 	struct sata_cmd_flags cmd_flags;
6198 
6199 	ASSERT(spx->txlt_sata_pkt != NULL);
6200 
6201 	cport = SATA_TXLT_CPORT(spx);
6202 	ASSERT(mutex_owned(&SATA_CPORT_MUTEX(sata_hba_inst, cport)));
6203 
6204 	sdinfo = sata_get_device_info(sata_hba_inst,
6205 	    &spx->txlt_sata_pkt->satapkt_device);
6206 	ASSERT(sdinfo != NULL);
6207 
6208 	/* Clear device reset state? */
6209 	if (sdinfo->satadrv_event_flags & SATA_EVNT_CLEAR_DEVICE_RESET) {
6210 		spx->txlt_sata_pkt->satapkt_cmd.satacmd_flags.
6211 		    sata_clear_dev_reset = B_TRUE;
6212 		sdinfo->satadrv_event_flags &= ~SATA_EVNT_CLEAR_DEVICE_RESET;
6213 		SATADBG1(SATA_DBG_EVENTS, sata_hba_inst,
6214 		    "sata_hba_start: clearing device reset state\n", NULL);
6215 	}
6216 	cmd = spx->txlt_sata_pkt->satapkt_cmd.satacmd_cmd_reg;
6217 	cmd_flags = spx->txlt_sata_pkt->satapkt_cmd.satacmd_flags;
6218 	sata_device = &spx->txlt_sata_pkt->satapkt_device;
6219 
6220 	mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst, cport)));
6221 
6222 	SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
6223 	    "Sata cmd 0x%2x\n", cmd);
6224 
6225 	stat = (*SATA_START_FUNC(sata_hba_inst))(SATA_DIP(sata_hba_inst),
6226 	    spx->txlt_sata_pkt);
6227 
6228 	mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst, cport)));
6229 	sdinfo = sata_get_device_info(sata_hba_inst, sata_device);
6230 	/*
6231 	 * If sata pkt was accepted and executed in asynchronous mode, i.e.
6232 	 * with the sata callback, the sata_pkt could be already destroyed
6233 	 * by the time we check ther return status from the hba_start()
6234 	 * function, because sata_scsi_destroy_pkt() could have been already
6235 	 * called (perhaps in the interrupt context). So, in such case, there
6236 	 * should be no references to it. In other cases, sata_pkt still
6237 	 * exists.
6238 	 */
6239 	switch (stat) {
6240 	case SATA_TRAN_ACCEPTED:
6241 		/*
6242 		 * pkt accepted for execution.
6243 		 * If it was executed synchronously, it is already completed
6244 		 * and pkt completion_reason indicates completion status.
6245 		 */
6246 		*rval = TRAN_ACCEPT;
6247 		return (0);
6248 
6249 	case SATA_TRAN_QUEUE_FULL:
6250 		/*
6251 		 * Controller detected queue full condition.
6252 		 */
6253 		SATADBG1(SATA_DBG_HBA_IF, sata_hba_inst,
6254 		    "sata_hba_start: queue full\n", NULL);
6255 
6256 		spx->txlt_scsi_pkt->pkt_reason = CMD_INCOMPLETE;
6257 		*spx->txlt_scsi_pkt->pkt_scbp = STATUS_QFULL;
6258 
6259 		*rval = TRAN_BUSY;
6260 		break;
6261 
6262 	case SATA_TRAN_PORT_ERROR:
6263 		/*
6264 		 * Communication/link with device or general port error
6265 		 * detected before pkt execution begun.
6266 		 */
6267 		if (spx->txlt_sata_pkt->satapkt_device.satadev_addr.qual ==
6268 		    SATA_ADDR_CPORT ||
6269 		    spx->txlt_sata_pkt->satapkt_device.satadev_addr.qual ==
6270 		    SATA_ADDR_DCPORT)
6271 			sata_log(sata_hba_inst, CE_CONT,
6272 			    "SATA port %d error",
6273 			    sata_device->satadev_addr.cport);
6274 		else
6275 			sata_log(sata_hba_inst, CE_CONT,
6276 			    "SATA port %d pmport %d error\n",
6277 			    sata_device->satadev_addr.cport,
6278 			    sata_device->satadev_addr.pmport);
6279 
6280 		/*
6281 		 * Update the port/device structure.
6282 		 * sata_pkt should be still valid. Since port error is
6283 		 * returned, sata_device content should reflect port
6284 		 * state - it means, that sata address have been changed,
6285 		 * because original packet's sata address refered to a device
6286 		 * attached to some port.
6287 		 */
6288 		sata_update_port_info(sata_hba_inst, sata_device);
6289 		spx->txlt_scsi_pkt->pkt_reason = CMD_TRAN_ERR;
6290 		*rval = TRAN_FATAL_ERROR;
6291 		break;
6292 
6293 	case SATA_TRAN_CMD_UNSUPPORTED:
6294 		/*
6295 		 * Command rejected by HBA as unsupported. It was HBA driver
6296 		 * that rejected the command, command was not sent to
6297 		 * an attached device.
6298 		 */
6299 		if ((sdinfo != NULL) &&
6300 		    (sdinfo->satadrv_state & SATA_DSTATE_RESET))
6301 			SATADBG1(SATA_DBG_EVENTS, sata_hba_inst,
6302 			    "sat_hba_start: cmd 0x%2x rejected "
6303 			    "with SATA_TRAN_CMD_UNSUPPORTED status\n", cmd);
6304 
6305 		mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst, cport)));
6306 		(void) sata_txlt_invalid_command(spx);
6307 		mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst, cport)));
6308 
6309 		*rval = TRAN_ACCEPT;
6310 		break;
6311 
6312 	case SATA_TRAN_BUSY:
6313 		/*
6314 		 * Command rejected by HBA because other operation prevents
6315 		 * accepting the packet, or device is in RESET condition.
6316 		 */
6317 		if (sdinfo != NULL) {
6318 			sdinfo->satadrv_state =
6319 			    spx->txlt_sata_pkt->satapkt_device.satadev_state;
6320 
6321 			if (sdinfo->satadrv_state & SATA_DSTATE_RESET) {
6322 				SATADBG1(SATA_DBG_EVENTS, sata_hba_inst,
6323 				    "sata_hba_start: cmd 0x%2x rejected "
6324 				    "because of device reset condition\n",
6325 				    cmd);
6326 			} else {
6327 				SATADBG1(SATA_DBG_EVENTS, sata_hba_inst,
6328 				    "sata_hba_start: cmd 0x%2x rejected "
6329 				    "with SATA_TRAN_BUSY status\n",
6330 				    cmd);
6331 			}
6332 		}
6333 		spx->txlt_scsi_pkt->pkt_reason = CMD_INCOMPLETE;
6334 		*rval = TRAN_BUSY;
6335 		break;
6336 
6337 	default:
6338 		/* Unrecognized HBA response */
6339 		SATA_LOG_D((sata_hba_inst, CE_WARN,
6340 		    "sata_hba_start: unrecognized HBA response "
6341 		    "to cmd : 0x%2x resp 0x%x", cmd, rval));
6342 		spx->txlt_scsi_pkt->pkt_reason = CMD_TRAN_ERR;
6343 		*rval = TRAN_FATAL_ERROR;
6344 		break;
6345 	}
6346 
6347 	/*
6348 	 * If we got here, the packet was rejected.
6349 	 * Check if we need to remember reset state clearing request
6350 	 */
6351 	if (cmd_flags.sata_clear_dev_reset) {
6352 		/*
6353 		 * Check if device is still configured - it may have
6354 		 * disapeared from the configuration
6355 		 */
6356 		sdinfo = sata_get_device_info(sata_hba_inst, sata_device);
6357 		if (sdinfo != NULL) {
6358 			/*
6359 			 * Restore the flag that requests clearing of
6360 			 * the device reset state,
6361 			 * so the next sata packet may carry it to HBA.
6362 			 */
6363 			sdinfo->satadrv_event_flags |=
6364 			    SATA_EVNT_CLEAR_DEVICE_RESET;
6365 		}
6366 	}
6367 	return (-1);
6368 }
6369 
6370 /*
6371  * Scsi response setup for invalid LBA
6372  *
6373  * Returns TRAN_ACCEPT and appropriate values in scsi_pkt fields.
6374  */
6375 static int
6376 sata_txlt_lba_out_of_range(sata_pkt_txlate_t *spx)
6377 {
6378 	struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
6379 	struct scsi_extended_sense *sense;
6380 
6381 	scsipkt->pkt_reason = CMD_CMPLT;
6382 	scsipkt->pkt_state = STATE_GOT_BUS | STATE_GOT_TARGET |
6383 	    STATE_SENT_CMD | STATE_GOT_STATUS;
6384 	*scsipkt->pkt_scbp = STATUS_CHECK;
6385 
6386 	*scsipkt->pkt_scbp = STATUS_CHECK;
6387 	sense = sata_arq_sense(spx);
6388 	sense->es_key = KEY_ILLEGAL_REQUEST;
6389 	sense->es_add_code = SD_SCSI_ASC_LBA_OUT_OF_RANGE;
6390 
6391 	SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
6392 	    "Scsi_pkt completion reason %x\n", scsipkt->pkt_reason);
6393 
6394 	if ((scsipkt->pkt_flags & FLAG_NOINTR) == 0 &&
6395 	    scsipkt->pkt_comp != NULL)
6396 		/* scsi callback required */
6397 		if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
6398 		    (task_func_t *)scsipkt->pkt_comp, (void *) scsipkt,
6399 		    TQ_SLEEP) == NULL)
6400 			/* Scheduling the callback failed */
6401 			return (TRAN_BUSY);
6402 	return (TRAN_ACCEPT);
6403 }
6404 
6405 
6406 /*
6407  * Analyze device status and error registers and translate them into
6408  * appropriate scsi sense codes.
6409  * NOTE: non-packet commands only for now
6410  */
6411 static void
6412 sata_decode_device_error(sata_pkt_txlate_t *spx,
6413     struct scsi_extended_sense *sense)
6414 {
6415 	uint8_t err_reg = spx->txlt_sata_pkt->satapkt_cmd.satacmd_error_reg;
6416 
6417 	ASSERT(sense != NULL);
6418 	ASSERT(spx->txlt_sata_pkt->satapkt_cmd.satacmd_status_reg &
6419 	    SATA_STATUS_ERR);
6420 
6421 
6422 	if (err_reg & SATA_ERROR_ICRC) {
6423 		sense->es_key = KEY_ABORTED_COMMAND;
6424 		sense->es_add_code = 0x08; /* Communication failure */
6425 		return;
6426 	}
6427 
6428 	if (err_reg & SATA_ERROR_UNC) {
6429 		sense->es_key = KEY_MEDIUM_ERROR;
6430 		/* Information bytes (LBA) need to be set by a caller */
6431 		return;
6432 	}
6433 
6434 	/* ADD HERE: MC error bit handling for ATAPI CD/DVD */
6435 	if (err_reg & (SATA_ERROR_MCR | SATA_ERROR_NM)) {
6436 		sense->es_key = KEY_UNIT_ATTENTION;
6437 		sense->es_add_code = 0x3a; /* No media present */
6438 		return;
6439 	}
6440 
6441 	if (err_reg & SATA_ERROR_IDNF) {
6442 		if (err_reg & SATA_ERROR_ABORT) {
6443 			sense->es_key = KEY_ABORTED_COMMAND;
6444 		} else {
6445 			sense->es_key = KEY_ILLEGAL_REQUEST;
6446 			sense->es_add_code = 0x21; /* LBA out of range */
6447 		}
6448 		return;
6449 	}
6450 
6451 	if (err_reg & SATA_ERROR_ABORT) {
6452 		ASSERT(spx->txlt_sata_pkt != NULL);
6453 		sense->es_key = KEY_ABORTED_COMMAND;
6454 		return;
6455 	}
6456 }
6457 
6458 /*
6459  * Extract error LBA from sata_pkt.satapkt_cmd register fields
6460  */
6461 static void
6462 sata_extract_error_lba(sata_pkt_txlate_t *spx, uint64_t *lba)
6463 {
6464 	sata_cmd_t *sata_cmd = &spx->txlt_sata_pkt->satapkt_cmd;
6465 
6466 	*lba = 0;
6467 	if (sata_cmd->satacmd_addr_type == ATA_ADDR_LBA48) {
6468 		*lba = sata_cmd->satacmd_lba_high_msb;
6469 		*lba = (*lba << 8) | sata_cmd->satacmd_lba_mid_msb;
6470 		*lba = (*lba << 8) | sata_cmd->satacmd_lba_low_msb;
6471 	} else if (sata_cmd->satacmd_addr_type == ATA_ADDR_LBA28) {
6472 		*lba = sata_cmd->satacmd_device_reg & 0xf;
6473 	}
6474 	*lba = (*lba << 8) | sata_cmd->satacmd_lba_high_lsb;
6475 	*lba = (*lba << 8) | sata_cmd->satacmd_lba_mid_lsb;
6476 	*lba = (*lba << 8) | sata_cmd->satacmd_lba_low_lsb;
6477 }
6478 
6479 /*
6480  * This is fixed sense format - if LBA exceeds the info field size,
6481  * no valid info will be returned (valid bit in extended sense will
6482  * be set to 0).
6483  */
6484 static struct scsi_extended_sense *
6485 sata_arq_sense(sata_pkt_txlate_t *spx)
6486 {
6487 	struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
6488 	struct scsi_arq_status *arqs;
6489 	struct scsi_extended_sense *sense;
6490 
6491 	/* Fill ARQ sense data */
6492 	scsipkt->pkt_state |= STATE_ARQ_DONE;
6493 	arqs = (struct scsi_arq_status *)scsipkt->pkt_scbp;
6494 	*(uchar_t *)&arqs->sts_status = STATUS_CHECK;
6495 	*(uchar_t *)&arqs->sts_rqpkt_status = STATUS_GOOD;
6496 	arqs->sts_rqpkt_reason = CMD_CMPLT;
6497 	arqs->sts_rqpkt_state = STATE_GOT_BUS | STATE_GOT_TARGET |
6498 	    STATE_XFERRED_DATA | STATE_SENT_CMD | STATE_GOT_STATUS;
6499 	arqs->sts_rqpkt_resid = 0;
6500 	sense = &arqs->sts_sensedata;
6501 	bzero(sense, sizeof (struct scsi_extended_sense));
6502 	sata_fixed_sense_data_preset(sense);
6503 	return (sense);
6504 }
6505 
6506 
6507 /*
6508  * Emulated SATA Read/Write command completion for zero-length requests.
6509  * This request always succedes, so in synchronous mode it always returns
6510  * TRAN_ACCEPT, and in non-synchronous mode it may return TRAN_BUSY if the
6511  * callback cannot be scheduled.
6512  */
6513 static int
6514 sata_emul_rw_completion(sata_pkt_txlate_t *spx)
6515 {
6516 	struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
6517 
6518 	scsipkt->pkt_state = STATE_GOT_BUS | STATE_GOT_TARGET |
6519 	    STATE_SENT_CMD | STATE_GOT_STATUS;
6520 	scsipkt->pkt_reason = CMD_CMPLT;
6521 	*scsipkt->pkt_scbp = STATUS_GOOD;
6522 	if (!(spx->txlt_sata_pkt->satapkt_op_mode & SATA_OPMODE_SYNCH)) {
6523 		/* scsi callback required - have to schedule it */
6524 		if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
6525 		    (task_func_t *)scsipkt->pkt_comp,
6526 		    (void *)scsipkt, TQ_SLEEP) == NULL)
6527 			/* Scheduling the callback failed */
6528 			return (TRAN_BUSY);
6529 	}
6530 	return (TRAN_ACCEPT);
6531 }
6532 
6533 
6534 /*
6535  * Translate completion status of SATA read/write commands into scsi response.
6536  * pkt completion_reason is checked to determine the completion status.
6537  * Do scsi callback if necessary.
6538  *
6539  * Note: this function may be called also for synchronously executed
6540  * commands.
6541  * This function may be used only if scsi_pkt is non-NULL.
6542  */
6543 static void
6544 sata_txlt_rw_completion(sata_pkt_t *sata_pkt)
6545 {
6546 	sata_pkt_txlate_t *spx =
6547 	    (sata_pkt_txlate_t *)sata_pkt->satapkt_framework_private;
6548 	sata_cmd_t *scmd = &sata_pkt->satapkt_cmd;
6549 	struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
6550 	struct scsi_extended_sense *sense;
6551 	uint64_t lba;
6552 	struct buf *bp;
6553 	int rval;
6554 	if (sata_pkt->satapkt_reason == SATA_PKT_COMPLETED) {
6555 		/* Normal completion */
6556 		scsipkt->pkt_state = STATE_GOT_BUS | STATE_GOT_TARGET |
6557 		    STATE_SENT_CMD | STATE_XFERRED_DATA | STATE_GOT_STATUS;
6558 		scsipkt->pkt_reason = CMD_CMPLT;
6559 		*scsipkt->pkt_scbp = STATUS_GOOD;
6560 		if (spx->txlt_tmp_buf != NULL) {
6561 			/* Temporary buffer was used */
6562 			bp = spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp;
6563 			if (bp->b_flags & B_READ) {
6564 				rval = ddi_dma_sync(
6565 				    spx->txlt_buf_dma_handle, 0, 0,
6566 				    DDI_DMA_SYNC_FORCPU);
6567 				ASSERT(rval == DDI_SUCCESS);
6568 				bcopy(spx->txlt_tmp_buf, bp->b_un.b_addr,
6569 				    bp->b_bcount);
6570 			}
6571 		}
6572 	} else {
6573 		/*
6574 		 * Something went wrong - analyze return
6575 		 */
6576 		scsipkt->pkt_state = STATE_GOT_BUS | STATE_GOT_TARGET |
6577 		    STATE_SENT_CMD | STATE_GOT_STATUS;
6578 		scsipkt->pkt_reason = CMD_INCOMPLETE;
6579 		*scsipkt->pkt_scbp = STATUS_CHECK;
6580 		sense = sata_arq_sense(spx);
6581 		ASSERT(sense != NULL);
6582 
6583 		/*
6584 		 * SATA_PKT_DEV_ERROR is the only case where we may be able to
6585 		 * extract from device registers the failing LBA.
6586 		 */
6587 		if (sata_pkt->satapkt_reason == SATA_PKT_DEV_ERROR) {
6588 			if ((scmd->satacmd_addr_type == ATA_ADDR_LBA48) &&
6589 			    (scmd->satacmd_lba_mid_msb != 0 ||
6590 			    scmd->satacmd_lba_high_msb != 0)) {
6591 				/*
6592 				 * We have problem reporting this cmd LBA
6593 				 * in fixed sense data format, because of
6594 				 * the size of the scsi LBA fields.
6595 				 */
6596 				sense->es_valid = 0;
6597 			} else {
6598 				sata_extract_error_lba(spx, &lba);
6599 				sense->es_info_1 = (lba & 0xFF000000) >> 24;
6600 				sense->es_info_2 = (lba & 0xFF0000) >> 16;
6601 				sense->es_info_3 = (lba & 0xFF00) >> 8;
6602 				sense->es_info_4 = lba & 0xFF;
6603 			}
6604 		} else {
6605 			/* Invalid extended sense info */
6606 			sense->es_valid = 0;
6607 		}
6608 
6609 		switch (sata_pkt->satapkt_reason) {
6610 		case SATA_PKT_PORT_ERROR:
6611 			/* We may want to handle DEV GONE state as well */
6612 			/*
6613 			 * We have no device data. Assume no data transfered.
6614 			 */
6615 			sense->es_key = KEY_HARDWARE_ERROR;
6616 			break;
6617 
6618 		case SATA_PKT_DEV_ERROR:
6619 			if (sata_pkt->satapkt_cmd.satacmd_status_reg &
6620 			    SATA_STATUS_ERR) {
6621 				/*
6622 				 * determine dev error reason from error
6623 				 * reg content
6624 				 */
6625 				sata_decode_device_error(spx, sense);
6626 				if (sense->es_key == KEY_MEDIUM_ERROR) {
6627 					switch (scmd->satacmd_cmd_reg) {
6628 					case SATAC_READ_DMA:
6629 					case SATAC_READ_DMA_EXT:
6630 					case SATAC_READ_DMA_QUEUED:
6631 					case SATAC_READ_DMA_QUEUED_EXT:
6632 					case SATAC_READ_FPDMA_QUEUED:
6633 						/* Unrecovered read error */
6634 						sense->es_add_code =
6635 						SD_SCSI_ASC_UNREC_READ_ERROR;
6636 						break;
6637 					case SATAC_WRITE_DMA:
6638 					case SATAC_WRITE_DMA_EXT:
6639 					case SATAC_WRITE_DMA_QUEUED:
6640 					case SATAC_WRITE_DMA_QUEUED_EXT:
6641 					case SATAC_WRITE_FPDMA_QUEUED:
6642 						/* Write error */
6643 						sense->es_add_code =
6644 						    SD_SCSI_ASC_WRITE_ERROR;
6645 						break;
6646 					default:
6647 						/* Internal error */
6648 						SATA_LOG_D((
6649 						    spx->txlt_sata_hba_inst,
6650 						    CE_WARN,
6651 						    "sata_txlt_rw_completion :"
6652 						    "internal error - invalid "
6653 						    "command 0x%2x",
6654 						    scmd->satacmd_cmd_reg));
6655 						break;
6656 					}
6657 				}
6658 				break;
6659 			}
6660 			/* No extended sense key - no info available */
6661 			scsipkt->pkt_reason = CMD_INCOMPLETE;
6662 			break;
6663 
6664 		case SATA_PKT_TIMEOUT:
6665 			/* scsipkt->pkt_reason = CMD_TIMEOUT; */
6666 			scsipkt->pkt_reason = CMD_INCOMPLETE;
6667 			/* No extended sense key ? */
6668 			break;
6669 
6670 		case SATA_PKT_ABORTED:
6671 			scsipkt->pkt_reason = CMD_ABORTED;
6672 			/* No extended sense key ? */
6673 			break;
6674 
6675 		case SATA_PKT_RESET:
6676 			scsipkt->pkt_reason = CMD_RESET;
6677 			break;
6678 
6679 		default:
6680 			SATA_LOG_D((spx->txlt_sata_hba_inst, CE_WARN,
6681 			    "sata_txlt_rw_completion: "
6682 			    "invalid packet completion reason"));
6683 			scsipkt->pkt_reason = CMD_TRAN_ERR;
6684 			break;
6685 		}
6686 	}
6687 	SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
6688 	    "Scsi_pkt completion reason %x\n", scsipkt->pkt_reason);
6689 
6690 	if ((scsipkt->pkt_flags & FLAG_NOINTR) == 0 &&
6691 	    scsipkt->pkt_comp != NULL)
6692 		/* scsi callback required */
6693 		(*scsipkt->pkt_comp)(scsipkt);
6694 }
6695 
6696 
6697 /*
6698  * Translate completion status of non-data commands (i.e. commands returning
6699  * no data).
6700  * pkt completion_reason is checked to determine the completion status.
6701  * Do scsi callback if necessary (FLAG_NOINTR == 0)
6702  *
6703  * Note: this function may be called also for synchronously executed
6704  * commands.
6705  * This function may be used only if scsi_pkt is non-NULL.
6706  */
6707 
6708 static 	void
6709 sata_txlt_nodata_cmd_completion(sata_pkt_t *sata_pkt)
6710 {
6711 	sata_pkt_txlate_t *spx =
6712 	    (sata_pkt_txlate_t *)sata_pkt->satapkt_framework_private;
6713 	struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
6714 	struct scsi_extended_sense *sense;
6715 
6716 	scsipkt->pkt_state = STATE_GOT_BUS | STATE_GOT_TARGET |
6717 	    STATE_SENT_CMD | STATE_GOT_STATUS;
6718 	if (sata_pkt->satapkt_reason == SATA_PKT_COMPLETED) {
6719 		/* Normal completion */
6720 		scsipkt->pkt_reason = CMD_CMPLT;
6721 		*scsipkt->pkt_scbp = STATUS_GOOD;
6722 	} else {
6723 		/* Something went wrong */
6724 		scsipkt->pkt_reason = CMD_INCOMPLETE;
6725 		*scsipkt->pkt_scbp = STATUS_CHECK;
6726 		sense = sata_arq_sense(spx);
6727 		switch (sata_pkt->satapkt_reason) {
6728 		case SATA_PKT_PORT_ERROR:
6729 			/*
6730 			 * We have no device data. Assume no data transfered.
6731 			 */
6732 			sense->es_key = KEY_HARDWARE_ERROR;
6733 			break;
6734 
6735 		case SATA_PKT_DEV_ERROR:
6736 			if (sata_pkt->satapkt_cmd.satacmd_status_reg &
6737 			    SATA_STATUS_ERR) {
6738 				/*
6739 				 * determine dev error reason from error
6740 				 * reg content
6741 				 */
6742 				sata_decode_device_error(spx, sense);
6743 				break;
6744 			}
6745 			/* No extended sense key - no info available */
6746 			break;
6747 
6748 		case SATA_PKT_TIMEOUT:
6749 			/* scsipkt->pkt_reason = CMD_TIMEOUT; */
6750 			scsipkt->pkt_reason = CMD_INCOMPLETE;
6751 			/* No extended sense key ? */
6752 			break;
6753 
6754 		case SATA_PKT_ABORTED:
6755 			scsipkt->pkt_reason = CMD_ABORTED;
6756 			/* No extended sense key ? */
6757 			break;
6758 
6759 		case SATA_PKT_RESET:
6760 			/* pkt aborted by an explicit reset from a host */
6761 			scsipkt->pkt_reason = CMD_RESET;
6762 			break;
6763 
6764 		default:
6765 			SATA_LOG_D((spx->txlt_sata_hba_inst, CE_WARN,
6766 			    "sata_txlt_nodata_cmd_completion: "
6767 			    "invalid packet completion reason %d",
6768 			    sata_pkt->satapkt_reason));
6769 			scsipkt->pkt_reason = CMD_TRAN_ERR;
6770 			break;
6771 		}
6772 
6773 	}
6774 	SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
6775 	    "Scsi_pkt completion reason %x\n", scsipkt->pkt_reason);
6776 
6777 	if ((scsipkt->pkt_flags & FLAG_NOINTR) == 0 &&
6778 	    scsipkt->pkt_comp != NULL)
6779 		/* scsi callback required */
6780 		(*scsipkt->pkt_comp)(scsipkt);
6781 }
6782 
6783 
6784 /*
6785  * Build Mode sense R/W recovery page
6786  * NOT IMPLEMENTED
6787  */
6788 
6789 static int
6790 sata_build_msense_page_1(sata_drive_info_t *sdinfo, int pcntrl, uint8_t *buf)
6791 {
6792 #ifndef __lock_lint
6793 	_NOTE(ARGUNUSED(sdinfo))
6794 	_NOTE(ARGUNUSED(pcntrl))
6795 	_NOTE(ARGUNUSED(buf))
6796 #endif
6797 	return (0);
6798 }
6799 
6800 /*
6801  * Build Mode sense caching page  -  scsi-3 implementation.
6802  * Page length distinguishes previous format from scsi-3 format.
6803  * buf must have space for 0x12 bytes.
6804  * Only DRA (disable read ahead ) and WCE (write cache enable) are changeable.
6805  *
6806  */
6807 static int
6808 sata_build_msense_page_8(sata_drive_info_t *sdinfo, int pcntrl, uint8_t *buf)
6809 {
6810 	struct mode_cache_scsi3 *page = (struct mode_cache_scsi3 *)buf;
6811 	sata_id_t *sata_id = &sdinfo->satadrv_id;
6812 
6813 	/*
6814 	 * Most of the fields are set to 0, being not supported and/or disabled
6815 	 */
6816 	bzero(buf, PAGELENGTH_DAD_MODE_CACHE_SCSI3);
6817 
6818 	/* Saved paramters not supported */
6819 	if (pcntrl == 3)
6820 		return (0);
6821 	if (pcntrl == 0 || pcntrl == 2) {
6822 		/*
6823 		 * For now treat current and default parameters as same
6824 		 * That may have to change, if target driver will complain
6825 		 */
6826 		page->mode_page.code = MODEPAGE_CACHING;	/* PS = 0 */
6827 		page->mode_page.length = PAGELENGTH_DAD_MODE_CACHE_SCSI3;
6828 
6829 		if ((sata_id->ai_cmdset82 & SATA_LOOK_AHEAD) &&
6830 		    !(sata_id->ai_features85 & SATA_LOOK_AHEAD)) {
6831 			page->dra = 1;		/* Read Ahead disabled */
6832 			page->rcd = 1;		/* Read Cache disabled */
6833 		}
6834 		if ((sata_id->ai_cmdset82 & SATA_WRITE_CACHE) &&
6835 		    (sata_id->ai_features85 & SATA_WRITE_CACHE))
6836 			page->wce = 1;		/* Write Cache enabled */
6837 	} else {
6838 		/* Changeable parameters */
6839 		page->mode_page.code = MODEPAGE_CACHING;
6840 		page->mode_page.length = PAGELENGTH_DAD_MODE_CACHE_SCSI3;
6841 		if (sata_id->ai_cmdset82 & SATA_LOOK_AHEAD) {
6842 			page->dra = 1;
6843 			page->rcd = 1;
6844 		}
6845 		if (sata_id->ai_cmdset82 & SATA_WRITE_CACHE)
6846 			page->wce = 1;
6847 	}
6848 	return (PAGELENGTH_DAD_MODE_CACHE_SCSI3 +
6849 	    sizeof (struct mode_page));
6850 }
6851 
6852 /*
6853  * Build Mode sense exception cntrl page
6854  */
6855 static int
6856 sata_build_msense_page_1c(sata_drive_info_t *sdinfo, int pcntrl, uint8_t *buf)
6857 {
6858 	struct mode_info_excpt_page *page = (struct mode_info_excpt_page *)buf;
6859 	sata_id_t *sata_id = &sdinfo->satadrv_id;
6860 
6861 	/*
6862 	 * Most of the fields are set to 0, being not supported and/or disabled
6863 	 */
6864 	bzero(buf, PAGELENGTH_INFO_EXCPT);
6865 
6866 	page->mode_page.code = MODEPAGE_INFO_EXCPT;
6867 	page->mode_page.length = PAGELENGTH_INFO_EXCPT;
6868 
6869 	/* Indicate that this is page is saveable */
6870 	page->mode_page.ps = 1;
6871 
6872 	/*
6873 	 * We will return the same data for default, current and saved page.
6874 	 * The only changeable bit is dexcpt and that bit is required
6875 	 * by the ATA specification to be preserved across power cycles.
6876 	 */
6877 	if (pcntrl != 1) {
6878 		page->dexcpt = !(sata_id->ai_features85 & SATA_SMART_SUPPORTED);
6879 		page->mrie = MRIE_ONLY_ON_REQUEST;
6880 	}
6881 	else
6882 		page->dexcpt = 1;	/* Only changeable parameter */
6883 
6884 	return (PAGELENGTH_INFO_EXCPT + sizeof (struct mode_info_excpt_page));
6885 }
6886 
6887 
6888 static int
6889 sata_build_msense_page_30(sata_drive_info_t *sdinfo, int pcntrl, uint8_t *buf)
6890 {
6891 	struct mode_acoustic_management *page =
6892 	    (struct mode_acoustic_management *)buf;
6893 	sata_id_t *sata_id = &sdinfo->satadrv_id;
6894 
6895 	/*
6896 	 * Most of the fields are set to 0, being not supported and/or disabled
6897 	 */
6898 	bzero(buf, PAGELENGTH_DAD_MODE_ACOUSTIC_MANAGEMENT);
6899 
6900 	switch (pcntrl) {
6901 	case P_CNTRL_DEFAULT:
6902 		/*  default paramters not supported */
6903 		return (0);
6904 
6905 	case P_CNTRL_CURRENT:
6906 	case P_CNTRL_SAVED:
6907 		/* Saved and current are supported and are identical */
6908 		page->mode_page.code = MODEPAGE_ACOUSTIC_MANAG;
6909 		page->mode_page.length =
6910 		    PAGELENGTH_DAD_MODE_ACOUSTIC_MANAGEMENT;
6911 		page->mode_page.ps = 1;
6912 
6913 		/* Word 83 indicates if feature is supported */
6914 		/* If feature is not supported */
6915 		if (!(sata_id->ai_cmdset83 & SATA_ACOUSTIC_MGMT)) {
6916 			page->acoustic_manag_enable =
6917 			    ACOUSTIC_DISABLED;
6918 		} else {
6919 			page->acoustic_manag_enable =
6920 			    ((sata_id->ai_features86 & SATA_ACOUSTIC_MGMT)
6921 			    != 0);
6922 			/* Word 94 inidicates the value */
6923 #ifdef	_LITTLE_ENDIAN
6924 			page->acoustic_manag_level =
6925 			    (uchar_t)sata_id->ai_acoustic;
6926 			page->vendor_recommended_value =
6927 			    sata_id->ai_acoustic >> 8;
6928 #else
6929 			page->acoustic_manag_level =
6930 			    sata_id->ai_acoustic >> 8;
6931 			page->vendor_recommended_value =
6932 			    (uchar_t)sata_id->ai_acoustic;
6933 #endif
6934 		}
6935 		break;
6936 
6937 	case P_CNTRL_CHANGEABLE:
6938 		page->mode_page.code = MODEPAGE_ACOUSTIC_MANAG;
6939 		page->mode_page.length =
6940 		    PAGELENGTH_DAD_MODE_ACOUSTIC_MANAGEMENT;
6941 		page->mode_page.ps = 1;
6942 
6943 		/* Word 83 indicates if the feature is supported */
6944 		if (sata_id->ai_cmdset83 & SATA_ACOUSTIC_MGMT) {
6945 			page->acoustic_manag_enable =
6946 			    ACOUSTIC_ENABLED;
6947 			page->acoustic_manag_level = 0xff;
6948 		}
6949 		break;
6950 	}
6951 	return (PAGELENGTH_DAD_MODE_ACOUSTIC_MANAGEMENT +
6952 	    sizeof (struct mode_page));
6953 }
6954 
6955 
6956 /*
6957  * Build Mode sense power condition page
6958  * NOT IMPLEMENTED.
6959  */
6960 static int
6961 sata_build_msense_page_1a(sata_drive_info_t *sdinfo, int pcntrl, uint8_t *buf)
6962 {
6963 #ifndef __lock_lint
6964 	_NOTE(ARGUNUSED(sdinfo))
6965 	_NOTE(ARGUNUSED(pcntrl))
6966 	_NOTE(ARGUNUSED(buf))
6967 #endif
6968 	return (0);
6969 }
6970 
6971 
6972 /*
6973  * Process mode select caching page 8 (scsi3 format only).
6974  * Read Ahead (same as read cache) and Write Cache may be turned on and off
6975  * if these features are supported by the device. If these features are not
6976  * supported, quietly ignore them.
6977  * This function fails only if the SET FEATURE command sent to
6978  * the device fails. The page format is not varified, assuming that the
6979  * target driver operates correctly - if parameters length is too short,
6980  * we just drop the page.
6981  * Two command may be sent if both Read Cache/Read Ahead and Write Cache
6982  * setting have to be changed.
6983  * SET FEATURE command is executed synchronously, i.e. we wait here until
6984  * it is completed, regardless of the scsi pkt directives.
6985  *
6986  * Note: Mode Select Caching page RCD and DRA bits are tied together, i.e.
6987  * changing DRA will change RCD.
6988  *
6989  * More than one SATA command may be executed to perform operations specified
6990  * by mode select pages. The first error terminates further execution.
6991  * Operations performed successully are not backed-up in such case.
6992  *
6993  * Return SATA_SUCCESS if operation succeeded, SATA_FAILURE otherwise.
6994  * If operation resulted in changing device setup, dmod flag should be set to
6995  * one (1). If parameters were not changed, dmod flag should be set to 0.
6996  * Upon return, if operation required sending command to the device, the rval
6997  * should be set to the value returned by sata_hba_start. If operation
6998  * did not require device access, rval should be set to TRAN_ACCEPT.
6999  * The pagelen should be set to the length of the page.
7000  *
7001  * This function has to be called with a port mutex held.
7002  *
7003  * Returns SATA_SUCCESS if operation was successful, SATA_FAILURE otherwise.
7004  */
7005 int
7006 sata_mode_select_page_8(sata_pkt_txlate_t *spx, struct mode_cache_scsi3 *page,
7007     int parmlen, int *pagelen, int *rval, int *dmod)
7008 {
7009 	struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
7010 	sata_drive_info_t *sdinfo;
7011 	sata_cmd_t *scmd = &spx->txlt_sata_pkt->satapkt_cmd;
7012 	sata_id_t *sata_id;
7013 	struct scsi_extended_sense *sense;
7014 	int wce, dra;	/* Current settings */
7015 
7016 	sdinfo = sata_get_device_info(spx->txlt_sata_hba_inst,
7017 	    &spx->txlt_sata_pkt->satapkt_device);
7018 	sata_id = &sdinfo->satadrv_id;
7019 	*dmod = 0;
7020 
7021 	/* Verify parameters length. If too short, drop it */
7022 	if (PAGELENGTH_DAD_MODE_CACHE_SCSI3 +
7023 	    sizeof (struct mode_page) < parmlen) {
7024 		*scsipkt->pkt_scbp = STATUS_CHECK;
7025 		sense = sata_arq_sense(spx);
7026 		sense->es_key = KEY_ILLEGAL_REQUEST;
7027 		sense->es_add_code = SD_SCSI_ASC_INVALID_FIELD_IN_PARAMS_LIST;
7028 		*pagelen = parmlen;
7029 		*rval = TRAN_ACCEPT;
7030 		return (SATA_FAILURE);
7031 	}
7032 
7033 	*pagelen = PAGELENGTH_DAD_MODE_CACHE_SCSI3 + sizeof (struct mode_page);
7034 
7035 	/*
7036 	 * We can manipulate only write cache and read ahead
7037 	 * (read cache) setting.
7038 	 */
7039 	if (!(sata_id->ai_cmdset82 & SATA_LOOK_AHEAD) &&
7040 	    !(sata_id->ai_cmdset82 & SATA_WRITE_CACHE)) {
7041 		/*
7042 		 * None of the features is supported - ignore
7043 		 */
7044 		*rval = TRAN_ACCEPT;
7045 		return (SATA_SUCCESS);
7046 	}
7047 
7048 	/* Current setting of Read Ahead (and Read Cache) */
7049 	if (sata_id->ai_features85 & SATA_LOOK_AHEAD)
7050 		dra = 0;	/* 0 == not disabled */
7051 	else
7052 		dra = 1;
7053 	/* Current setting of Write Cache */
7054 	if (sata_id->ai_features85 & SATA_WRITE_CACHE)
7055 		wce = 1;
7056 	else
7057 		wce = 0;
7058 
7059 	if (page->dra == dra && page->wce == wce && page->rcd == dra) {
7060 		/* nothing to do */
7061 		*rval = TRAN_ACCEPT;
7062 		return (SATA_SUCCESS);
7063 	}
7064 	/*
7065 	 * Need to flip some setting
7066 	 * Set-up Internal SET FEATURES command(s)
7067 	 */
7068 	scmd->satacmd_flags.sata_data_direction = SATA_DIR_NODATA_XFER;
7069 	scmd->satacmd_addr_type = 0;
7070 	scmd->satacmd_device_reg = 0;
7071 	scmd->satacmd_status_reg = 0;
7072 	scmd->satacmd_error_reg = 0;
7073 	scmd->satacmd_cmd_reg = SATAC_SET_FEATURES;
7074 	if (page->dra != dra || page->rcd != dra) {
7075 		/* Need to flip read ahead setting */
7076 		if (dra == 0)
7077 			/* Disable read ahead / read cache */
7078 			scmd->satacmd_features_reg =
7079 			    SATAC_SF_DISABLE_READ_AHEAD;
7080 		else
7081 			/* Enable read ahead  / read cache */
7082 			scmd->satacmd_features_reg =
7083 			    SATAC_SF_ENABLE_READ_AHEAD;
7084 
7085 		/* Transfer command to HBA */
7086 		if (sata_hba_start(spx, rval) != 0)
7087 			/*
7088 			 * Pkt not accepted for execution.
7089 			 */
7090 			return (SATA_FAILURE);
7091 
7092 		*dmod = 1;
7093 
7094 		/* Now process return */
7095 		if (spx->txlt_sata_pkt->satapkt_reason !=
7096 		    SATA_PKT_COMPLETED) {
7097 			goto failure;	/* Terminate */
7098 		}
7099 	}
7100 
7101 	/* Note that the packet is not removed, so it could be re-used */
7102 	if (page->wce != wce) {
7103 		/* Need to flip Write Cache setting */
7104 		if (page->wce == 1)
7105 			/* Enable write cache */
7106 			scmd->satacmd_features_reg =
7107 			    SATAC_SF_ENABLE_WRITE_CACHE;
7108 		else
7109 			/* Disable write cache */
7110 			scmd->satacmd_features_reg =
7111 			    SATAC_SF_DISABLE_WRITE_CACHE;
7112 
7113 		/* Transfer command to HBA */
7114 		if (sata_hba_start(spx, rval) != 0)
7115 			/*
7116 			 * Pkt not accepted for execution.
7117 			 */
7118 			return (SATA_FAILURE);
7119 
7120 		*dmod = 1;
7121 
7122 		/* Now process return */
7123 		if (spx->txlt_sata_pkt->satapkt_reason !=
7124 		    SATA_PKT_COMPLETED) {
7125 			goto failure;
7126 		}
7127 	}
7128 	return (SATA_SUCCESS);
7129 
7130 failure:
7131 	sata_xlate_errors(spx);
7132 
7133 	return (SATA_FAILURE);
7134 }
7135 
7136 /*
7137  * Process mode select informational exceptions control page 0x1c
7138  *
7139  * The only changeable bit is dexcpt (disable exceptions).
7140  * MRIE (method of reporting informational exceptions) must be
7141  * "only on request".
7142  *
7143  * Return SATA_SUCCESS if operation succeeded, SATA_FAILURE otherwise.
7144  * If operation resulted in changing device setup, dmod flag should be set to
7145  * one (1). If parameters were not changed, dmod flag should be set to 0.
7146  * Upon return, if operation required sending command to the device, the rval
7147  * should be set to the value returned by sata_hba_start. If operation
7148  * did not require device access, rval should be set to TRAN_ACCEPT.
7149  * The pagelen should be set to the length of the page.
7150  *
7151  * This function has to be called with a port mutex held.
7152  *
7153  * Returns SATA_SUCCESS if operation was successful, SATA_FAILURE otherwise.
7154  */
7155 static	int
7156 sata_mode_select_page_1c(
7157 	sata_pkt_txlate_t *spx,
7158 	struct mode_info_excpt_page *page,
7159 	int parmlen,
7160 	int *pagelen,
7161 	int *rval,
7162 	int *dmod)
7163 {
7164 	struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
7165 	sata_cmd_t *scmd = &spx->txlt_sata_pkt->satapkt_cmd;
7166 	sata_drive_info_t *sdinfo;
7167 	sata_id_t *sata_id;
7168 	struct scsi_extended_sense *sense;
7169 
7170 	sdinfo = sata_get_device_info(spx->txlt_sata_hba_inst,
7171 	    &spx->txlt_sata_pkt->satapkt_device);
7172 	sata_id = &sdinfo->satadrv_id;
7173 
7174 	*dmod = 0;
7175 
7176 	/* Verify parameters length. If too short, drop it */
7177 	if (((PAGELENGTH_INFO_EXCPT + sizeof (struct mode_page)) < parmlen) ||
7178 	    page->perf || page->test || (page->mrie != MRIE_ONLY_ON_REQUEST)) {
7179 		*scsipkt->pkt_scbp = STATUS_CHECK;
7180 		sense = sata_arq_sense(spx);
7181 		sense->es_key = KEY_ILLEGAL_REQUEST;
7182 		sense->es_add_code = SD_SCSI_ASC_INVALID_FIELD_IN_PARAMS_LIST;
7183 		*pagelen = parmlen;
7184 		*rval = TRAN_ACCEPT;
7185 		return (SATA_FAILURE);
7186 	}
7187 
7188 	*pagelen = PAGELENGTH_INFO_EXCPT + sizeof (struct mode_page);
7189 
7190 	if (! (sata_id->ai_cmdset82 & SATA_SMART_SUPPORTED)) {
7191 		*scsipkt->pkt_scbp = STATUS_CHECK;
7192 		sense = sata_arq_sense(spx);
7193 		sense->es_key = KEY_ILLEGAL_REQUEST;
7194 		sense->es_add_code = SD_SCSI_ASC_INVALID_FIELD_IN_CDB;
7195 		*pagelen = parmlen;
7196 		*rval = TRAN_ACCEPT;
7197 		return (SATA_FAILURE);
7198 	}
7199 
7200 	/* If already in the state requested, we are done */
7201 	if (page->dexcpt == ! (sata_id->ai_features85 & SATA_SMART_ENABLED)) {
7202 		/* nothing to do */
7203 		*rval = TRAN_ACCEPT;
7204 		return (SATA_SUCCESS);
7205 	}
7206 
7207 	scmd->satacmd_flags.sata_data_direction = SATA_DIR_NODATA_XFER;
7208 
7209 	/* Build SMART_ENABLE or SMART_DISABLE command */
7210 	scmd->satacmd_addr_type = 0;		/* N/A */
7211 	scmd->satacmd_lba_mid_lsb = SMART_MAGIC_VAL_1;
7212 	scmd->satacmd_lba_high_lsb = SMART_MAGIC_VAL_2;
7213 	scmd->satacmd_features_reg = page->dexcpt ?
7214 	    SATA_SMART_DISABLE_OPS : SATA_SMART_ENABLE_OPS;
7215 	scmd->satacmd_device_reg = 0;		/* Always device 0 */
7216 	scmd->satacmd_cmd_reg = SATAC_SMART;
7217 
7218 	/* Transfer command to HBA */
7219 	if (sata_hba_start(spx, rval) != 0)
7220 		/*
7221 		 * Pkt not accepted for execution.
7222 		 */
7223 		return (SATA_FAILURE);
7224 
7225 	*dmod = 1;	/* At least may have been modified */
7226 
7227 	/* Now process return */
7228 	if (spx->txlt_sata_pkt->satapkt_reason == SATA_PKT_COMPLETED)
7229 		return (SATA_SUCCESS);
7230 
7231 	/* Packet did not complete successfully */
7232 	sata_xlate_errors(spx);
7233 
7234 	return (SATA_FAILURE);
7235 }
7236 
7237 int
7238 sata_mode_select_page_30(sata_pkt_txlate_t *spx, struct
7239     mode_acoustic_management *page, int parmlen, int *pagelen,
7240     int *rval, int *dmod)
7241 {
7242 	struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
7243 	sata_drive_info_t *sdinfo;
7244 	sata_cmd_t *scmd = &spx->txlt_sata_pkt->satapkt_cmd;
7245 	sata_id_t *sata_id;
7246 	struct scsi_extended_sense *sense;
7247 
7248 	sdinfo = sata_get_device_info(spx->txlt_sata_hba_inst,
7249 	    &spx->txlt_sata_pkt->satapkt_device);
7250 	sata_id = &sdinfo->satadrv_id;
7251 	*dmod = 0;
7252 
7253 	/* If parmlen is too short or the feature is not supported, drop it */
7254 	if (((PAGELENGTH_DAD_MODE_ACOUSTIC_MANAGEMENT +
7255 	    sizeof (struct mode_page)) < parmlen) ||
7256 	    (! (sata_id->ai_cmdset83 & SATA_ACOUSTIC_MGMT))) {
7257 		*scsipkt->pkt_scbp = STATUS_CHECK;
7258 		sense = sata_arq_sense(spx);
7259 		sense->es_key = KEY_ILLEGAL_REQUEST;
7260 		sense->es_add_code = SD_SCSI_ASC_INVALID_FIELD_IN_PARAMS_LIST;
7261 		*pagelen = parmlen;
7262 		*rval = TRAN_ACCEPT;
7263 		return (SATA_FAILURE);
7264 	}
7265 
7266 	*pagelen = PAGELENGTH_DAD_MODE_ACOUSTIC_MANAGEMENT +
7267 	    sizeof (struct mode_page);
7268 
7269 	/*
7270 	 * We can enable and disable acoustice management and
7271 	 * set the acoustic management level.
7272 	 */
7273 
7274 	/*
7275 	 * Set-up Internal SET FEATURES command(s)
7276 	 */
7277 	scmd->satacmd_flags.sata_data_direction = SATA_DIR_NODATA_XFER;
7278 	scmd->satacmd_addr_type = 0;
7279 	scmd->satacmd_device_reg = 0;
7280 	scmd->satacmd_status_reg = 0;
7281 	scmd->satacmd_error_reg = 0;
7282 	scmd->satacmd_cmd_reg = SATAC_SET_FEATURES;
7283 	if (page->acoustic_manag_enable) {
7284 		scmd->satacmd_features_reg = SATAC_SF_ENABLE_ACOUSTIC;
7285 		scmd->satacmd_sec_count_lsb = page->acoustic_manag_level;
7286 	} else {	/* disabling acoustic management */
7287 		scmd->satacmd_features_reg = SATAC_SF_DISABLE_ACOUSTIC;
7288 	}
7289 
7290 	/* Transfer command to HBA */
7291 	if (sata_hba_start(spx, rval) != 0)
7292 		/*
7293 		 * Pkt not accepted for execution.
7294 		 */
7295 		return (SATA_FAILURE);
7296 
7297 	/* Now process return */
7298 	if (spx->txlt_sata_pkt->satapkt_reason != SATA_PKT_COMPLETED) {
7299 		sata_xlate_errors(spx);
7300 		return (SATA_FAILURE);
7301 	}
7302 
7303 	*dmod = 1;
7304 
7305 	return (SATA_SUCCESS);
7306 }
7307 
7308 
7309 
7310 
7311 /*
7312  * sata_build_lsense_page0() is used to create the
7313  * SCSI LOG SENSE page 0 (supported log pages)
7314  *
7315  * Currently supported pages are 0, 0x10, 0x2f and 0x30
7316  * (supported log pages, self-test results, informational exceptions
7317  *  and Sun vendor specific ATA SMART data).
7318  *
7319  * Takes a sata_drive_info t * and the address of a buffer
7320  * in which to create the page information.
7321  *
7322  * Returns the number of bytes valid in the buffer.
7323  */
7324 static	int
7325 sata_build_lsense_page_0(sata_drive_info_t *sdinfo, uint8_t *buf)
7326 {
7327 	struct log_parameter *lpp = (struct log_parameter *)buf;
7328 	uint8_t *page_ptr = (uint8_t *)lpp->param_values;
7329 	int num_pages_supported = 1; /* Always have GET_SUPPORTED_LOG_PAGES */
7330 	sata_id_t *sata_id = &sdinfo->satadrv_id;
7331 
7332 	lpp->param_code[0] = 0;
7333 	lpp->param_code[1] = 0;
7334 	lpp->param_ctrl_flags = LOG_CTRL_LP | LOG_CTRL_LBIN;
7335 	*page_ptr++ = PAGE_CODE_GET_SUPPORTED_LOG_PAGES;
7336 
7337 	if (sata_id->ai_cmdset82 & SATA_SMART_SUPPORTED) {
7338 		if (sata_id->ai_cmdset84 & SATA_SMART_SELF_TEST_SUPPORTED) {
7339 			*page_ptr++ = PAGE_CODE_SELF_TEST_RESULTS;
7340 			++num_pages_supported;
7341 		}
7342 		*page_ptr++ = PAGE_CODE_INFORMATION_EXCEPTIONS;
7343 		++num_pages_supported;
7344 		*page_ptr++ = PAGE_CODE_SMART_READ_DATA;
7345 		++num_pages_supported;
7346 	}
7347 
7348 	lpp->param_len = num_pages_supported;
7349 
7350 	return ((&lpp->param_values[0] - (uint8_t *)lpp) +
7351 	    num_pages_supported);
7352 }
7353 
7354 /*
7355  * sata_build_lsense_page_10() is used to create the
7356  * SCSI LOG SENSE page 0x10 (self-test results)
7357  *
7358  * Takes a sata_drive_info t * and the address of a buffer
7359  * in which to create the page information as well as a sata_hba_inst_t *.
7360  *
7361  * Returns the number of bytes valid in the buffer.
7362  */
7363 static	int
7364 sata_build_lsense_page_10(
7365 	sata_drive_info_t *sdinfo,
7366 	uint8_t *buf,
7367 	sata_hba_inst_t *sata_hba_inst)
7368 {
7369 	struct log_parameter *lpp = (struct log_parameter *)buf;
7370 	int rval;
7371 
7372 	if (sdinfo->satadrv_features_support & SATA_DEV_F_LBA48) {
7373 		struct smart_ext_selftest_log *ext_selftest_log;
7374 
7375 		ext_selftest_log = kmem_zalloc(
7376 		    sizeof (struct smart_ext_selftest_log), KM_SLEEP);
7377 
7378 		rval = sata_ext_smart_selftest_read_log(sata_hba_inst, sdinfo,
7379 		    ext_selftest_log, 0);
7380 		if (rval == 0) {
7381 			int index, start_index;
7382 			struct smart_ext_selftest_log_entry *entry;
7383 			static const struct smart_ext_selftest_log_entry empty =
7384 			    {0};
7385 			uint16_t block_num;
7386 			int count;
7387 			boolean_t only_one_block = B_FALSE;
7388 
7389 			index = ext_selftest_log->
7390 			    smart_ext_selftest_log_index[0];
7391 			index |= ext_selftest_log->
7392 			    smart_ext_selftest_log_index[1] << 8;
7393 			if (index == 0)
7394 				goto out;
7395 
7396 			--index;	/* Correct for 0 origin */
7397 			start_index = index;	/* remember where we started */
7398 			block_num = index / ENTRIES_PER_EXT_SELFTEST_LOG_BLK;
7399 			if (block_num != 0) {
7400 				rval = sata_ext_smart_selftest_read_log(
7401 				    sata_hba_inst, sdinfo, ext_selftest_log,
7402 				    block_num);
7403 				if (rval != 0)
7404 					goto out;
7405 			}
7406 			index %= ENTRIES_PER_EXT_SELFTEST_LOG_BLK;
7407 			entry =
7408 			    &ext_selftest_log->
7409 			    smart_ext_selftest_log_entries[index];
7410 
7411 			for (count = 1;
7412 			    count <= SCSI_ENTRIES_IN_LOG_SENSE_SELFTEST_RESULTS;
7413 			    ++count) {
7414 				uint8_t status;
7415 				uint8_t code;
7416 				uint8_t sense_key;
7417 				uint8_t add_sense_code;
7418 				uint8_t add_sense_code_qual;
7419 
7420 				/* If this is an unused entry, we are done */
7421 				if (bcmp(entry, &empty, sizeof (empty)) == 0) {
7422 					/* Broken firmware on some disks */
7423 					if (index + 1 ==
7424 					    ENTRIES_PER_EXT_SELFTEST_LOG_BLK) {
7425 						--entry;
7426 						--index;
7427 						if (bcmp(entry, &empty,
7428 						    sizeof (empty)) == 0)
7429 							goto out;
7430 					} else
7431 						goto out;
7432 				}
7433 
7434 				if (only_one_block &&
7435 				    start_index == index)
7436 					goto out;
7437 
7438 				lpp->param_code[0] = 0;
7439 				lpp->param_code[1] = count;
7440 				lpp->param_ctrl_flags =
7441 				    LOG_CTRL_LP | LOG_CTRL_LBIN;
7442 				lpp->param_len =
7443 				    SCSI_LOG_SENSE_SELFTEST_PARAM_LEN;
7444 
7445 				status = entry->smart_ext_selftest_log_status;
7446 				status >>= 4;
7447 				switch (status) {
7448 				case 0:
7449 				default:
7450 					sense_key = KEY_NO_SENSE;
7451 					add_sense_code =
7452 					    SD_SCSI_ASC_NO_ADD_SENSE;
7453 					add_sense_code_qual = 0;
7454 					break;
7455 				case 1:
7456 					sense_key = KEY_ABORTED_COMMAND;
7457 					add_sense_code =
7458 					    DIAGNOSTIC_FAILURE_ON_COMPONENT;
7459 					add_sense_code_qual = SCSI_COMPONENT_81;
7460 					break;
7461 				case 2:
7462 					sense_key = KEY_ABORTED_COMMAND;
7463 					add_sense_code =
7464 					    DIAGNOSTIC_FAILURE_ON_COMPONENT;
7465 					add_sense_code_qual = SCSI_COMPONENT_82;
7466 					break;
7467 				case 3:
7468 					sense_key = KEY_ABORTED_COMMAND;
7469 					add_sense_code =
7470 					    DIAGNOSTIC_FAILURE_ON_COMPONENT;
7471 					add_sense_code_qual = SCSI_COMPONENT_83;
7472 					break;
7473 				case 4:
7474 					sense_key = KEY_HARDWARE_ERROR;
7475 					add_sense_code =
7476 					    DIAGNOSTIC_FAILURE_ON_COMPONENT;
7477 					add_sense_code_qual = SCSI_COMPONENT_84;
7478 					break;
7479 				case 5:
7480 					sense_key = KEY_HARDWARE_ERROR;
7481 					add_sense_code =
7482 					    DIAGNOSTIC_FAILURE_ON_COMPONENT;
7483 					add_sense_code_qual = SCSI_COMPONENT_85;
7484 					break;
7485 				case 6:
7486 					sense_key = KEY_HARDWARE_ERROR;
7487 					add_sense_code =
7488 					    DIAGNOSTIC_FAILURE_ON_COMPONENT;
7489 					add_sense_code_qual = SCSI_COMPONENT_86;
7490 					break;
7491 				case 7:
7492 					sense_key = KEY_MEDIUM_ERROR;
7493 					add_sense_code =
7494 					    DIAGNOSTIC_FAILURE_ON_COMPONENT;
7495 					add_sense_code_qual = SCSI_COMPONENT_87;
7496 					break;
7497 				case 8:
7498 					sense_key = KEY_HARDWARE_ERROR;
7499 					add_sense_code =
7500 					    DIAGNOSTIC_FAILURE_ON_COMPONENT;
7501 					add_sense_code_qual = SCSI_COMPONENT_88;
7502 					break;
7503 				}
7504 				code = 0;	/* unspecified */
7505 				status |= (code << 4);
7506 				lpp->param_values[0] = status;
7507 				lpp->param_values[1] = 0; /* unspecified */
7508 				lpp->param_values[2] = entry->
7509 				    smart_ext_selftest_log_timestamp[1];
7510 				lpp->param_values[3] = entry->
7511 				    smart_ext_selftest_log_timestamp[0];
7512 				if (status != 0) {
7513 					lpp->param_values[4] = 0;
7514 					lpp->param_values[5] = 0;
7515 					lpp->param_values[6] = entry->
7516 					    smart_ext_selftest_log_failing_lba
7517 					    [5];
7518 					lpp->param_values[7] = entry->
7519 					    smart_ext_selftest_log_failing_lba
7520 					    [4];
7521 					lpp->param_values[8] = entry->
7522 					    smart_ext_selftest_log_failing_lba
7523 					    [3];
7524 					lpp->param_values[9] = entry->
7525 					    smart_ext_selftest_log_failing_lba
7526 					    [2];
7527 					lpp->param_values[10] = entry->
7528 					    smart_ext_selftest_log_failing_lba
7529 					    [1];
7530 					lpp->param_values[11] = entry->
7531 					    smart_ext_selftest_log_failing_lba
7532 					    [0];
7533 				} else {	/* No bad block address */
7534 					lpp->param_values[4] = 0xff;
7535 					lpp->param_values[5] = 0xff;
7536 					lpp->param_values[6] = 0xff;
7537 					lpp->param_values[7] = 0xff;
7538 					lpp->param_values[8] = 0xff;
7539 					lpp->param_values[9] = 0xff;
7540 					lpp->param_values[10] = 0xff;
7541 					lpp->param_values[11] = 0xff;
7542 				}
7543 
7544 				lpp->param_values[12] = sense_key;
7545 				lpp->param_values[13] = add_sense_code;
7546 				lpp->param_values[14] = add_sense_code_qual;
7547 				lpp->param_values[15] = 0; /* undefined */
7548 
7549 				lpp = (struct log_parameter *)
7550 				    (((uint8_t *)lpp) +
7551 				    SCSI_LOG_PARAM_HDR_LEN +
7552 				    SCSI_LOG_SENSE_SELFTEST_PARAM_LEN);
7553 
7554 				--index;	/* Back up to previous entry */
7555 				if (index < 0) {
7556 					if (block_num > 0) {
7557 						--block_num;
7558 					} else {
7559 						struct read_log_ext_directory
7560 						    logdir;
7561 
7562 						rval =
7563 						    sata_read_log_ext_directory(
7564 						    sata_hba_inst, sdinfo,
7565 						    &logdir);
7566 						if (rval == -1)
7567 							goto out;
7568 						if ((logdir.read_log_ext_vers
7569 						    [0] == 0) &&
7570 						    (logdir.read_log_ext_vers
7571 						    [1] == 0))
7572 							goto out;
7573 						block_num =
7574 						    logdir.read_log_ext_nblks
7575 						    [EXT_SMART_SELFTEST_LOG_PAGE
7576 						    - 1][0];
7577 						block_num |= logdir.
7578 						    read_log_ext_nblks
7579 						    [EXT_SMART_SELFTEST_LOG_PAGE
7580 						    - 1][1] << 8;
7581 						--block_num;
7582 						only_one_block =
7583 						    (block_num == 0);
7584 					}
7585 					rval = sata_ext_smart_selftest_read_log(
7586 					    sata_hba_inst, sdinfo,
7587 					    ext_selftest_log, block_num);
7588 					if (rval != 0)
7589 						goto out;
7590 
7591 					index =
7592 					    ENTRIES_PER_EXT_SELFTEST_LOG_BLK -
7593 					    1;
7594 				}
7595 				index %= ENTRIES_PER_EXT_SELFTEST_LOG_BLK;
7596 				entry = &ext_selftest_log->
7597 				    smart_ext_selftest_log_entries[index];
7598 			}
7599 		}
7600 out:
7601 		kmem_free(ext_selftest_log,
7602 		    sizeof (struct smart_ext_selftest_log));
7603 	} else {
7604 		struct smart_selftest_log *selftest_log;
7605 
7606 		selftest_log = kmem_zalloc(sizeof (struct smart_selftest_log),
7607 		    KM_SLEEP);
7608 
7609 		rval = sata_smart_selftest_log(sata_hba_inst, sdinfo,
7610 		    selftest_log);
7611 
7612 		if (rval == 0) {
7613 			int index;
7614 			int count;
7615 			struct smart_selftest_log_entry *entry;
7616 			static const struct smart_selftest_log_entry empty =
7617 			    { 0 };
7618 
7619 			index = selftest_log->smart_selftest_log_index;
7620 			if (index == 0)
7621 				goto done;
7622 			--index;	/* Correct for 0 origin */
7623 			entry = &selftest_log->
7624 			    smart_selftest_log_entries[index];
7625 			for (count = 1;
7626 			    count <= SCSI_ENTRIES_IN_LOG_SENSE_SELFTEST_RESULTS;
7627 			    ++count) {
7628 				uint8_t status;
7629 				uint8_t code;
7630 				uint8_t sense_key;
7631 				uint8_t add_sense_code;
7632 				uint8_t add_sense_code_qual;
7633 
7634 				if (bcmp(entry, &empty, sizeof (empty)) == 0)
7635 					goto done;
7636 
7637 				lpp->param_code[0] = 0;
7638 				lpp->param_code[1] = count;
7639 				lpp->param_ctrl_flags =
7640 				    LOG_CTRL_LP | LOG_CTRL_LBIN;
7641 				lpp->param_len =
7642 				    SCSI_LOG_SENSE_SELFTEST_PARAM_LEN;
7643 
7644 				status = entry->smart_selftest_log_status;
7645 				status >>= 4;
7646 				switch (status) {
7647 				case 0:
7648 				default:
7649 					sense_key = KEY_NO_SENSE;
7650 					add_sense_code =
7651 					    SD_SCSI_ASC_NO_ADD_SENSE;
7652 					break;
7653 				case 1:
7654 					sense_key = KEY_ABORTED_COMMAND;
7655 					add_sense_code =
7656 					    DIAGNOSTIC_FAILURE_ON_COMPONENT;
7657 					add_sense_code_qual = SCSI_COMPONENT_81;
7658 					break;
7659 				case 2:
7660 					sense_key = KEY_ABORTED_COMMAND;
7661 					add_sense_code =
7662 					    DIAGNOSTIC_FAILURE_ON_COMPONENT;
7663 					add_sense_code_qual = SCSI_COMPONENT_82;
7664 					break;
7665 				case 3:
7666 					sense_key = KEY_ABORTED_COMMAND;
7667 					add_sense_code =
7668 					    DIAGNOSTIC_FAILURE_ON_COMPONENT;
7669 					add_sense_code_qual = SCSI_COMPONENT_83;
7670 					break;
7671 				case 4:
7672 					sense_key = KEY_HARDWARE_ERROR;
7673 					add_sense_code =
7674 					    DIAGNOSTIC_FAILURE_ON_COMPONENT;
7675 					add_sense_code_qual = SCSI_COMPONENT_84;
7676 					break;
7677 				case 5:
7678 					sense_key = KEY_HARDWARE_ERROR;
7679 					add_sense_code =
7680 					    DIAGNOSTIC_FAILURE_ON_COMPONENT;
7681 					add_sense_code_qual = SCSI_COMPONENT_85;
7682 					break;
7683 				case 6:
7684 					sense_key = KEY_HARDWARE_ERROR;
7685 					add_sense_code =
7686 					    DIAGNOSTIC_FAILURE_ON_COMPONENT;
7687 					add_sense_code_qual = SCSI_COMPONENT_86;
7688 					break;
7689 				case 7:
7690 					sense_key = KEY_MEDIUM_ERROR;
7691 					add_sense_code =
7692 					    DIAGNOSTIC_FAILURE_ON_COMPONENT;
7693 					add_sense_code_qual = SCSI_COMPONENT_87;
7694 					break;
7695 				case 8:
7696 					sense_key = KEY_HARDWARE_ERROR;
7697 					add_sense_code =
7698 					    DIAGNOSTIC_FAILURE_ON_COMPONENT;
7699 					add_sense_code_qual = SCSI_COMPONENT_88;
7700 					break;
7701 				}
7702 				code = 0;	/* unspecified */
7703 				status |= (code << 4);
7704 				lpp->param_values[0] = status;
7705 				lpp->param_values[1] = 0; /* unspecified */
7706 				lpp->param_values[2] = entry->
7707 				    smart_selftest_log_timestamp[1];
7708 				lpp->param_values[3] = entry->
7709 				    smart_selftest_log_timestamp[0];
7710 				if (status != 0) {
7711 					lpp->param_values[4] = 0;
7712 					lpp->param_values[5] = 0;
7713 					lpp->param_values[6] = 0;
7714 					lpp->param_values[7] = 0;
7715 					lpp->param_values[8] = entry->
7716 					    smart_selftest_log_failing_lba[3];
7717 					lpp->param_values[9] = entry->
7718 					    smart_selftest_log_failing_lba[2];
7719 					lpp->param_values[10] = entry->
7720 					    smart_selftest_log_failing_lba[1];
7721 					lpp->param_values[11] = entry->
7722 					    smart_selftest_log_failing_lba[0];
7723 				} else {	/* No block address */
7724 					lpp->param_values[4] = 0xff;
7725 					lpp->param_values[5] = 0xff;
7726 					lpp->param_values[6] = 0xff;
7727 					lpp->param_values[7] = 0xff;
7728 					lpp->param_values[8] = 0xff;
7729 					lpp->param_values[9] = 0xff;
7730 					lpp->param_values[10] = 0xff;
7731 					lpp->param_values[11] = 0xff;
7732 				}
7733 				lpp->param_values[12] = sense_key;
7734 				lpp->param_values[13] = add_sense_code;
7735 				lpp->param_values[14] = add_sense_code_qual;
7736 				lpp->param_values[15] = 0; /* undefined */
7737 
7738 				lpp = (struct log_parameter *)
7739 				    (((uint8_t *)lpp) +
7740 				    SCSI_LOG_PARAM_HDR_LEN +
7741 				    SCSI_LOG_SENSE_SELFTEST_PARAM_LEN);
7742 				--index;	/* back up to previous entry */
7743 				if (index < 0) {
7744 					index =
7745 					    NUM_SMART_SELFTEST_LOG_ENTRIES - 1;
7746 				}
7747 				entry = &selftest_log->
7748 				    smart_selftest_log_entries[index];
7749 			}
7750 		}
7751 done:
7752 		kmem_free(selftest_log, sizeof (struct smart_selftest_log));
7753 	}
7754 
7755 	return ((SCSI_LOG_PARAM_HDR_LEN + SCSI_LOG_SENSE_SELFTEST_PARAM_LEN) *
7756 	    SCSI_ENTRIES_IN_LOG_SENSE_SELFTEST_RESULTS);
7757 }
7758 
7759 /*
7760  * sata_build_lsense_page_2f() is used to create the
7761  * SCSI LOG SENSE page 0x10 (informational exceptions)
7762  *
7763  * Takes a sata_drive_info t * and the address of a buffer
7764  * in which to create the page information as well as a sata_hba_inst_t *.
7765  *
7766  * Returns the number of bytes valid in the buffer.
7767  */
7768 static	int
7769 sata_build_lsense_page_2f(
7770 	sata_drive_info_t *sdinfo,
7771 	uint8_t *buf,
7772 	sata_hba_inst_t *sata_hba_inst)
7773 {
7774 	struct log_parameter *lpp = (struct log_parameter *)buf;
7775 	int rval;
7776 	uint8_t *smart_data;
7777 	uint8_t temp;
7778 	sata_id_t *sata_id;
7779 #define	SMART_NO_TEMP	0xff
7780 
7781 	lpp->param_code[0] = 0;
7782 	lpp->param_code[1] = 0;
7783 	lpp->param_ctrl_flags = LOG_CTRL_LP | LOG_CTRL_LBIN;
7784 
7785 	/* Now get the SMART status w.r.t. threshold exceeded */
7786 	rval = sata_fetch_smart_return_status(sata_hba_inst, sdinfo);
7787 	switch (rval) {
7788 	case 1:
7789 		lpp->param_values[0] = SCSI_PREDICTED_FAILURE;
7790 		lpp->param_values[1] = SCSI_GENERAL_HD_FAILURE;
7791 		break;
7792 	case 0:
7793 	case -1:	/* failed to get data */
7794 		lpp->param_values[0] = 0;	/* No failure predicted */
7795 		lpp->param_values[1] = 0;
7796 		break;
7797 #if defined(SATA_DEBUG)
7798 	default:
7799 		cmn_err(CE_PANIC, "sata_build_lsense_page_2f bad return value");
7800 		/* NOTREACHED */
7801 #endif
7802 	}
7803 
7804 	sata_id = &sdinfo->satadrv_id;
7805 	if (! (sata_id->ai_sctsupport & SATA_SCT_CMD_TRANS_SUP))
7806 		temp = SMART_NO_TEMP;
7807 	else {
7808 		/* Now get the temperature */
7809 		smart_data = kmem_zalloc(512, KM_SLEEP);
7810 		rval = sata_smart_read_log(sata_hba_inst, sdinfo, smart_data,
7811 		    SCT_STATUS_LOG_PAGE, 1);
7812 		if (rval == -1)
7813 			temp = SMART_NO_TEMP;
7814 		else {
7815 			temp = smart_data[200];
7816 			if (temp & 0x80) {
7817 				if (temp & 0x7f)
7818 					temp = 0;
7819 				else
7820 					temp = SMART_NO_TEMP;
7821 			}
7822 		}
7823 		kmem_free(smart_data, 512);
7824 	}
7825 
7826 	lpp->param_values[2] = temp;	/* most recent temperature */
7827 	lpp->param_values[3] = 0;	/* required vendor specific byte */
7828 
7829 	lpp->param_len = SCSI_INFO_EXCEPTIONS_PARAM_LEN;
7830 
7831 
7832 	return (SCSI_INFO_EXCEPTIONS_PARAM_LEN + SCSI_LOG_PARAM_HDR_LEN);
7833 }
7834 
7835 /*
7836  * sata_build_lsense_page_30() is used to create the
7837  * SCSI LOG SENSE page 0x30 (Sun's vendor specific page for ATA SMART data).
7838  *
7839  * Takes a sata_drive_info t * and the address of a buffer
7840  * in which to create the page information as well as a sata_hba_inst_t *.
7841  *
7842  * Returns the number of bytes valid in the buffer.
7843  */
7844 static int
7845 sata_build_lsense_page_30(
7846 	sata_drive_info_t *sdinfo,
7847 	uint8_t *buf,
7848 	sata_hba_inst_t *sata_hba_inst)
7849 {
7850 	struct smart_data *smart_data = (struct smart_data *)buf;
7851 	int rval;
7852 
7853 	/* Now do the SMART READ DATA */
7854 	rval = sata_fetch_smart_data(sata_hba_inst, sdinfo, smart_data);
7855 	if (rval == -1)
7856 		return (0);
7857 
7858 	return (sizeof (struct smart_data));
7859 }
7860 
7861 /* ************************** ATAPI-SPECIFIC FUNCTIONS ********************** */
7862 
7863 /*
7864  * Start command for ATAPI device.
7865  * This function processes scsi_pkt requests.
7866  * Only CD/DVD devices are supported.
7867  * Most commands are packet without any translation into Packet Command.
7868  * Some may be trapped and executed as SATA commands (not clear which one).
7869  *
7870  * Returns TRAN_ACCEPT if command is accepted for execution (or completed
7871  * execution).
7872  * Returns other TRAN_XXXX codes if command is not accepted or completed
7873  * (see return values for sata_hba_start()).
7874  *
7875  * Note:
7876  * Inquiry cdb format differs between transport version 2 and 3.
7877  * However, the transport version 3 devices that were checked did not adhere
7878  * to the specification (ignored MSB of the allocation length). Therefore,
7879  * the transport version is not checked, but Inquiry allocation length is
7880  * truncated to 255 bytes if the original allocation length set-up by the
7881  * target driver is greater than 255 bytes.
7882  */
7883 static int
7884 sata_txlt_atapi(sata_pkt_txlate_t *spx)
7885 {
7886 	struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
7887 	sata_cmd_t *scmd = &spx->txlt_sata_pkt->satapkt_cmd;
7888 	struct buf *bp = spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp;
7889 	sata_hba_inst_t *sata_hba = SATA_TXLT_HBA_INST(spx);
7890 	sata_drive_info_t *sdinfo = sata_get_device_info(sata_hba,
7891 	    &spx->txlt_sata_pkt->satapkt_device);
7892 	int cport = SATA_TXLT_CPORT(spx);
7893 	int cdblen;
7894 	int rval;
7895 	int synch;
7896 	union scsi_cdb *cdbp = (union scsi_cdb *)scsipkt->pkt_cdbp;
7897 
7898 	mutex_enter(&(SATA_TXLT_CPORT_MUTEX(spx)));
7899 
7900 	if (((rval = sata_txlt_generic_pkt_info(spx)) != TRAN_ACCEPT) ||
7901 	    (spx->txlt_scsi_pkt->pkt_reason == CMD_DEV_GONE)) {
7902 		mutex_exit(&(SATA_TXLT_CPORT_MUTEX(spx)));
7903 		return (rval);
7904 	}
7905 
7906 	/*
7907 	 * ATAPI device executes some ATA commands in addition to MMC command
7908 	 * set. These ATA commands may be executed by the regular SATA
7909 	 * translation functions. None needs to be captured now.
7910 	 * Other commands belong to MMC command set and are delivered
7911 	 * to ATAPI device via Packet Command.
7912 	 */
7913 
7914 	/* Check the size of cdb */
7915 	cdblen = scsi_cdb_size[GETGROUP(cdbp)];
7916 	if (cdblen > sdinfo->satadrv_atapi_cdb_len) {
7917 		sata_log(NULL, CE_WARN,
7918 		    "sata: invalid ATAPI cdb length %d",
7919 		    scsipkt->pkt_cdblen);
7920 		mutex_exit(&(SATA_TXLT_CPORT_MUTEX(spx)));
7921 		return (TRAN_BADPKT);
7922 	}
7923 
7924 	SATAATAPITRACE(spx, cdblen);
7925 
7926 	/*
7927 	 * For non-read/write commands we need to
7928 	 * map buffer
7929 	 */
7930 	switch ((uint_t)scsipkt->pkt_cdbp[0]) {
7931 	case SCMD_READ:
7932 	case SCMD_READ_G1:
7933 	case SCMD_READ_G5:
7934 	case SCMD_READ_G4:
7935 	case SCMD_WRITE:
7936 	case SCMD_WRITE_G1:
7937 	case SCMD_WRITE_G5:
7938 	case SCMD_WRITE_G4:
7939 		break;
7940 	default:
7941 		if (bp != NULL) {
7942 			if (bp->b_flags & (B_PHYS | B_PAGEIO))
7943 				bp_mapin(bp);
7944 		}
7945 		break;
7946 	}
7947 	/*
7948 	 * scmd->satacmd_flags.sata_data_direction default -
7949 	 * SATA_DIR_NODATA_XFER - is set by
7950 	 * sata_txlt_generic_pkt_info().
7951 	 */
7952 	if (scmd->satacmd_bp) {
7953 		if (scmd->satacmd_bp->b_flags & B_READ) {
7954 			scmd->satacmd_flags.sata_data_direction = SATA_DIR_READ;
7955 		} else {
7956 			scmd->satacmd_flags.sata_data_direction =
7957 			    SATA_DIR_WRITE;
7958 		}
7959 	}
7960 
7961 	/*
7962 	 * Set up ATAPI packet command.
7963 	 */
7964 
7965 	sata_atapi_packet_cmd_setup(scmd, sdinfo);
7966 
7967 	/* Copy cdb into sata_cmd */
7968 	scmd->satacmd_acdb_len = sdinfo->satadrv_atapi_cdb_len;
7969 	bzero(scmd->satacmd_acdb, SATA_ATAPI_MAX_CDB_LEN);
7970 	bcopy(cdbp, scmd->satacmd_acdb, cdblen);
7971 
7972 	/* See note in the command header */
7973 	if (scmd->satacmd_acdb[0] == SCMD_INQUIRY) {
7974 		if (scmd->satacmd_acdb[3] != 0)
7975 			scmd->satacmd_acdb[4] = 255;
7976 	}
7977 
7978 #ifdef SATA_DEBUG
7979 	if (sata_debug_flags & SATA_DBG_ATAPI) {
7980 		uint8_t *p = scmd->satacmd_acdb;
7981 		char buf[3 * SATA_ATAPI_MAX_CDB_LEN];
7982 
7983 		(void) snprintf(buf, SATA_ATAPI_MAX_CDB_LEN,
7984 		    "%02x %02x %02x %02x %02x %02x %02x %02x "
7985 		    "%2x %02x %02x %02x %02x %02x %02x %02x",
7986 		    p[0], p[1], p[2], p[3], p[4], p[5], p[6], p[7],
7987 		    p[8], p[9], p[10], p[11], p[12], p[13], p[14], p[15]);
7988 		buf[(3 * SATA_ATAPI_MAX_CDB_LEN) - 1] = '\0';
7989 		cmn_err(CE_NOTE, "ATAPI cdb: %s\n", buf);
7990 	}
7991 #endif
7992 
7993 	/*
7994 	 * Preset request sense data to NO SENSE.
7995 	 * If there is no way to get error information via Request Sense,
7996 	 * the packet request sense data would not have to be modified by HBA,
7997 	 * but it could be returned as is.
7998 	 */
7999 	bzero(scmd->satacmd_rqsense, SATA_ATAPI_RQSENSE_LEN);
8000 	sata_fixed_sense_data_preset(
8001 	    (struct scsi_extended_sense *)scmd->satacmd_rqsense);
8002 
8003 	if (!(spx->txlt_sata_pkt->satapkt_op_mode & SATA_OPMODE_SYNCH)) {
8004 		/* Need callback function */
8005 		spx->txlt_sata_pkt->satapkt_comp = sata_txlt_atapi_completion;
8006 		synch = FALSE;
8007 	} else
8008 		synch = TRUE;
8009 
8010 	/* Transfer command to HBA */
8011 	if (sata_hba_start(spx, &rval) != 0) {
8012 		/* Pkt not accepted for execution */
8013 		mutex_exit(&SATA_CPORT_MUTEX(sata_hba, cport));
8014 		return (rval);
8015 	}
8016 	mutex_exit(&SATA_CPORT_MUTEX(sata_hba, cport));
8017 	/*
8018 	 * If execution is non-synchronous,
8019 	 * a callback function will handle potential errors, translate
8020 	 * the response and will do a callback to a target driver.
8021 	 * If it was synchronous, use the same framework callback to check
8022 	 * an execution status.
8023 	 */
8024 	if (synch) {
8025 		SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
8026 		    "synchronous execution status %x\n",
8027 		    spx->txlt_sata_pkt->satapkt_reason);
8028 		sata_txlt_atapi_completion(spx->txlt_sata_pkt);
8029 	}
8030 	return (TRAN_ACCEPT);
8031 }
8032 
8033 
8034 /*
8035  * ATAPI Packet command completion.
8036  *
8037  * Failure of the command passed via Packet command are considered device
8038  * error. SATA HBA driver would have to retrieve error data (via Request
8039  * Sense command delivered via error retrieval sata packet) and copy it
8040  * to satacmd_rqsense array. From there, it is moved into scsi pkt sense data.
8041  */
8042 static void
8043 sata_txlt_atapi_completion(sata_pkt_t *sata_pkt)
8044 {
8045 	sata_pkt_txlate_t *spx =
8046 	    (sata_pkt_txlate_t *)sata_pkt->satapkt_framework_private;
8047 	struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
8048 	struct scsi_extended_sense *sense;
8049 	struct buf *bp;
8050 	int rval;
8051 
8052 #ifdef SATA_DEBUG
8053 	uint8_t *rqsp = sata_pkt->satapkt_cmd.satacmd_rqsense;
8054 #endif
8055 
8056 	scsipkt->pkt_state = STATE_GOT_BUS | STATE_GOT_TARGET |
8057 	    STATE_SENT_CMD | STATE_GOT_STATUS;
8058 
8059 	if (sata_pkt->satapkt_reason == SATA_PKT_COMPLETED) {
8060 		/* Normal completion */
8061 		if (sata_pkt->satapkt_cmd.satacmd_bp != NULL)
8062 			scsipkt->pkt_state |= STATE_XFERRED_DATA;
8063 		scsipkt->pkt_reason = CMD_CMPLT;
8064 		*scsipkt->pkt_scbp = STATUS_GOOD;
8065 		if (spx->txlt_tmp_buf != NULL) {
8066 			/* Temporary buffer was used */
8067 			bp = spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp;
8068 			if (bp->b_flags & B_READ) {
8069 				rval = ddi_dma_sync(
8070 				    spx->txlt_buf_dma_handle, 0, 0,
8071 				    DDI_DMA_SYNC_FORCPU);
8072 				ASSERT(rval == DDI_SUCCESS);
8073 				bcopy(spx->txlt_tmp_buf, bp->b_un.b_addr,
8074 				    bp->b_bcount);
8075 			}
8076 		}
8077 	} else {
8078 		/*
8079 		 * Something went wrong - analyze return
8080 		 */
8081 		*scsipkt->pkt_scbp = STATUS_CHECK;
8082 		sense = sata_arq_sense(spx);
8083 
8084 		if (sata_pkt->satapkt_reason == SATA_PKT_DEV_ERROR) {
8085 			scsipkt->pkt_reason = CMD_INCOMPLETE;
8086 			/*
8087 			 * We may not have ARQ data if there was a double
8088 			 * error. But sense data in sata packet was pre-set
8089 			 * with NO SENSE so it is valid even if HBA could
8090 			 * not retrieve a real sense data.
8091 			 * Just copy this sense data into scsi pkt sense area.
8092 			 */
8093 			bcopy(sata_pkt->satapkt_cmd.satacmd_rqsense, sense,
8094 			    SATA_ATAPI_MIN_RQSENSE_LEN);
8095 #ifdef SATA_DEBUG
8096 			if (sata_debug_flags & SATA_DBG_SCSI_IF) {
8097 				sata_log(spx->txlt_sata_hba_inst, CE_WARN,
8098 				    "sata_txlt_atapi_completion: %02x\n"
8099 				    "RQSENSE:  %02x %02x %02x %02x %02x %02x "
8100 				    "          %02x %02x %02x %02x %02x %02x "
8101 				    "          %02x %02x %02x %02x %02x %02x\n",
8102 				    scsipkt->pkt_reason,
8103 				    rqsp[0], rqsp[1], rqsp[2], rqsp[3],
8104 				    rqsp[4], rqsp[5], rqsp[6], rqsp[7],
8105 				    rqsp[8], rqsp[9], rqsp[10], rqsp[11],
8106 				    rqsp[12], rqsp[13], rqsp[14], rqsp[15],
8107 				    rqsp[16], rqsp[17]);
8108 			}
8109 #endif
8110 		} else {
8111 			switch (sata_pkt->satapkt_reason) {
8112 			case SATA_PKT_PORT_ERROR:
8113 				/*
8114 				 * We have no device data.
8115 				 */
8116 				scsipkt->pkt_reason = CMD_INCOMPLETE;
8117 				scsipkt->pkt_state &= ~(STATE_GOT_BUS |
8118 				    STATE_GOT_TARGET | STATE_SENT_CMD |
8119 				    STATE_GOT_STATUS);
8120 				sense->es_key = KEY_HARDWARE_ERROR;
8121 
8122 				/* No extended sense key - no info available */
8123 				scsipkt->pkt_reason = CMD_INCOMPLETE;
8124 				break;
8125 
8126 			case SATA_PKT_TIMEOUT:
8127 				/* scsipkt->pkt_reason = CMD_TIMEOUT; */
8128 				/* No extended sense key */
8129 				/*
8130 				 * Need to check if HARDWARE_ERROR/
8131 				 * TIMEOUT_ON_LOGICAL_UNIT 4/3E/2 would be more
8132 				 * appropriate.
8133 				 */
8134 				break;
8135 
8136 			case SATA_PKT_ABORTED:
8137 				scsipkt->pkt_reason = CMD_ABORTED;
8138 				/* Should we set key COMMAND_ABPRTED? */
8139 				break;
8140 
8141 			case SATA_PKT_RESET:
8142 				scsipkt->pkt_reason = CMD_RESET;
8143 				/*
8144 				 * May be we should set Unit Attention /
8145 				 * Reset. Perhaps the same should be
8146 				 * returned for disks....
8147 				 */
8148 				sense->es_key = KEY_UNIT_ATTENTION;
8149 				sense->es_add_code = SD_SCSI_ASC_RESET;
8150 				break;
8151 
8152 			default:
8153 				SATA_LOG_D((spx->txlt_sata_hba_inst, CE_WARN,
8154 				    "sata_txlt_atapi_completion: "
8155 				    "invalid packet completion reason"));
8156 				scsipkt->pkt_reason = CMD_TRAN_ERR;
8157 				scsipkt->pkt_state &= ~(STATE_GOT_BUS |
8158 				    STATE_GOT_TARGET | STATE_SENT_CMD |
8159 				    STATE_GOT_STATUS);
8160 				break;
8161 			}
8162 		}
8163 	}
8164 
8165 	SATAATAPITRACE(spx, 0);
8166 
8167 	if ((scsipkt->pkt_flags & FLAG_NOINTR) == 0 &&
8168 	    scsipkt->pkt_comp != NULL) {
8169 		/* scsi callback required */
8170 		(*scsipkt->pkt_comp)(scsipkt);
8171 	}
8172 }
8173 
8174 /*
8175  * Set up error retrieval sata command for ATAPI Packet Command error data
8176  * recovery.
8177  *
8178  * Returns SATA_SUCCESS when data buffer is allocated and packet set-up,
8179  * returns SATA_FAILURE otherwise.
8180  */
8181 
8182 static int
8183 sata_atapi_err_ret_cmd_setup(sata_pkt_txlate_t *spx, sata_drive_info_t *sdinfo)
8184 {
8185 	sata_pkt_t *spkt = spx->txlt_sata_pkt;
8186 	sata_cmd_t *scmd;
8187 	struct buf *bp;
8188 
8189 	/*
8190 	 * Allocate dma-able buffer error data.
8191 	 * Buffer allocation will take care of buffer alignment and other DMA
8192 	 * attributes.
8193 	 */
8194 	bp = sata_alloc_local_buffer(spx, SATA_ATAPI_MIN_RQSENSE_LEN);
8195 	if (bp == NULL) {
8196 		SATADBG1(SATA_DBG_ATAPI, spx->txlt_sata_hba_inst,
8197 		    "sata_get_err_retrieval_pkt: "
8198 		    "cannot allocate buffer for error data", NULL);
8199 		return (SATA_FAILURE);
8200 	}
8201 	bp_mapin(bp); /* make data buffer accessible */
8202 
8203 	/* Operation modes are up to the caller */
8204 	spkt->satapkt_op_mode = SATA_OPMODE_SYNCH | SATA_OPMODE_INTERRUPTS;
8205 
8206 	/* Synchronous mode, no callback - may be changed by the caller */
8207 	spkt->satapkt_comp = NULL;
8208 	spkt->satapkt_time = sata_default_pkt_time;
8209 
8210 	scmd = &spkt->satapkt_cmd;
8211 	scmd->satacmd_flags.sata_data_direction = SATA_DIR_READ;
8212 	scmd->satacmd_flags.sata_ignore_dev_reset = B_TRUE;
8213 
8214 	sata_atapi_packet_cmd_setup(scmd, sdinfo);
8215 
8216 	/*
8217 	 * Set-up acdb. Request Sense CDB (packet command content) is
8218 	 * not in DMA-able buffer. Its handling is HBA-specific (how
8219 	 * it is transfered into packet FIS).
8220 	 */
8221 	scmd->satacmd_acdb_len = sdinfo->satadrv_atapi_cdb_len;
8222 	bcopy(sata_rqsense_cdb, scmd->satacmd_acdb, SATA_ATAPI_RQSENSE_CDB_LEN);
8223 	/* Following zeroing of pad bytes may not be necessary */
8224 	bzero(&scmd->satacmd_acdb[SATA_ATAPI_RQSENSE_CDB_LEN],
8225 	    sdinfo->satadrv_atapi_cdb_len - SATA_ATAPI_RQSENSE_CDB_LEN);
8226 
8227 	/*
8228 	 * Set-up pointer to the buffer handle, so HBA can sync buffer
8229 	 * before accessing it. Handle is in usual place in translate struct.
8230 	 */
8231 	scmd->satacmd_err_ret_buf_handle = &spx->txlt_buf_dma_handle;
8232 
8233 	/*
8234 	 * Preset request sense data to NO SENSE.
8235 	 * Here it is redundant, only for a symetry with scsi-originated
8236 	 * packets. It should not be used for anything but debugging.
8237 	 */
8238 	bzero(scmd->satacmd_rqsense, SATA_ATAPI_RQSENSE_LEN);
8239 	sata_fixed_sense_data_preset(
8240 	    (struct scsi_extended_sense *)scmd->satacmd_rqsense);
8241 
8242 	ASSERT(scmd->satacmd_num_dma_cookies != 0);
8243 	ASSERT(scmd->satacmd_dma_cookie_list != NULL);
8244 
8245 	return (SATA_SUCCESS);
8246 }
8247 
8248 /*
8249  * Set-up ATAPI packet command.
8250  * Data transfer direction has to be set-up in sata_cmd structure prior to
8251  * calling this function.
8252  *
8253  * Returns void
8254  */
8255 
8256 static void
8257 sata_atapi_packet_cmd_setup(sata_cmd_t *scmd, sata_drive_info_t *sdinfo)
8258 {
8259 	scmd->satacmd_addr_type = 0;		/* N/A */
8260 	scmd->satacmd_sec_count_lsb = 0;	/* no tag */
8261 	scmd->satacmd_lba_low_lsb = 0;		/* N/A */
8262 	scmd->satacmd_lba_mid_lsb = (uint8_t)SATA_ATAPI_MAX_BYTES_PER_DRQ;
8263 	scmd->satacmd_lba_high_lsb =
8264 	    (uint8_t)(SATA_ATAPI_MAX_BYTES_PER_DRQ >> 8);
8265 	scmd->satacmd_cmd_reg = SATAC_PACKET;	/* Command */
8266 
8267 	/*
8268 	 * We want all data to be transfered via DMA.
8269 	 * But specify it only if drive supports DMA and DMA mode is
8270 	 * selected - some drives are sensitive about it.
8271 	 * Hopefully it wil work for all drives....
8272 	 */
8273 	if (sdinfo->satadrv_settings & SATA_DEV_DMA)
8274 		scmd->satacmd_features_reg = SATA_ATAPI_F_DMA;
8275 
8276 	/*
8277 	 * Features register requires special care for devices that use
8278 	 * Serial ATA bridge - they need an explicit specification of
8279 	 * the data transfer direction for Packet DMA commands.
8280 	 * Setting this bit is harmless if DMA is not used.
8281 	 *
8282 	 * Many drives do not implement word 80, specifying what ATA/ATAPI
8283 	 * spec they follow.
8284 	 * We are arbitrarily following the latest SerialATA 2.6 spec,
8285 	 * which uses ATA/ATAPI 6 specification for Identify Data, unless
8286 	 * ATA/ATAPI-7 support is explicitly indicated.
8287 	 */
8288 	if (sdinfo->satadrv_id.ai_majorversion != 0 &&
8289 	    sdinfo->satadrv_id.ai_majorversion != 0xffff &&
8290 	    (sdinfo->satadrv_id.ai_majorversion & SATA_MAJVER_7) != 0) {
8291 		/*
8292 		 * Specification of major version is valid and version 7
8293 		 * is supported. It does automatically imply that all
8294 		 * spec features are supported. For now, we assume that
8295 		 * DMADIR setting is valid. ATA/ATAPI7 spec is incomplete.
8296 		 */
8297 		if ((sdinfo->satadrv_id.ai_dirdma &
8298 		    SATA_ATAPI_ID_DMADIR_REQ) != 0) {
8299 			if (scmd->satacmd_flags.sata_data_direction ==
8300 			    SATA_DIR_READ)
8301 			scmd->satacmd_features_reg |=
8302 			    SATA_ATAPI_F_DATA_DIR_READ;
8303 		}
8304 	}
8305 }
8306 
8307 
8308 #ifdef SATA_DEBUG
8309 
8310 /* Display 18 bytes of Inquiry data */
8311 static void
8312 sata_show_inqry_data(uint8_t *buf)
8313 {
8314 	struct scsi_inquiry *inq = (struct scsi_inquiry *)buf;
8315 	uint8_t *p;
8316 
8317 	cmn_err(CE_NOTE, "Inquiry data:");
8318 	cmn_err(CE_NOTE, "device type %x", inq->inq_dtype);
8319 	cmn_err(CE_NOTE, "removable media %x", inq->inq_rmb);
8320 	cmn_err(CE_NOTE, "version %x", inq->inq_ansi);
8321 	cmn_err(CE_NOTE, "ATAPI transport version %d",
8322 	    SATA_ATAPI_TRANS_VERSION(inq));
8323 	cmn_err(CE_NOTE, "response data format %d, aenc %d",
8324 	    inq->inq_rdf, inq->inq_aenc);
8325 	cmn_err(CE_NOTE, " additional length %d", inq->inq_len);
8326 	cmn_err(CE_NOTE, "tpgs %d", inq->inq_tpgs);
8327 	p = (uint8_t *)inq->inq_vid;
8328 	cmn_err(CE_NOTE, "vendor id (binary): %02x %02x %02x %02x "
8329 	    "%02x %02x %02x %02x",
8330 	    p[0], p[1], p[2], p[3], p[4], p[5], p[6], p[7]);
8331 	p = (uint8_t *)inq->inq_vid;
8332 	cmn_err(CE_NOTE, "vendor id: %c %c %c %c %c %c %c %c",
8333 	    p[0], p[1], p[2], p[3], p[4], p[5], p[6], p[7]);
8334 
8335 	p = (uint8_t *)inq->inq_pid;
8336 	cmn_err(CE_NOTE, "product id (binary): %02x %02x %02x %02x "
8337 	    "%02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x",
8338 	    p[0], p[1], p[2], p[3], p[4], p[5], p[6], p[7],
8339 	    p[8], p[9], p[10], p[11], p[12], p[13], p[14], p[15]);
8340 	p = (uint8_t *)inq->inq_pid;
8341 	cmn_err(CE_NOTE, "product id: %c %c %c %c %c %c %c %c "
8342 	    "%c %c %c %c %c %c %c %c",
8343 	    p[0], p[1], p[2], p[3], p[4], p[5], p[6], p[7],
8344 	    p[8], p[9], p[10], p[11], p[12], p[13], p[14], p[15]);
8345 
8346 	p = (uint8_t *)inq->inq_revision;
8347 	cmn_err(CE_NOTE, "revision (binary): %02x %02x %02x %02x",
8348 	    p[0], p[1], p[2], p[3]);
8349 	p = (uint8_t *)inq->inq_revision;
8350 	cmn_err(CE_NOTE, "revision: %c %c %c %c",
8351 	    p[0], p[1], p[2], p[3]);
8352 
8353 }
8354 
8355 
8356 static void
8357 sata_save_atapi_trace(sata_pkt_txlate_t *spx, int count)
8358 {
8359 	struct scsi_pkt *scsi_pkt = spx->txlt_scsi_pkt;
8360 
8361 	if (scsi_pkt == NULL)
8362 		return;
8363 	if (count != 0) {
8364 		/* saving cdb */
8365 		bzero(sata_atapi_trace[sata_atapi_trace_index].acdb,
8366 		    SATA_ATAPI_MAX_CDB_LEN);
8367 		bcopy(scsi_pkt->pkt_cdbp,
8368 		    sata_atapi_trace[sata_atapi_trace_index].acdb, count);
8369 	} else {
8370 		bcopy(&((struct scsi_arq_status *)scsi_pkt->pkt_scbp)->
8371 		    sts_sensedata,
8372 		    sata_atapi_trace[sata_atapi_trace_index].arqs,
8373 		    SATA_ATAPI_MIN_RQSENSE_LEN);
8374 		sata_atapi_trace[sata_atapi_trace_index].scsi_pkt_reason =
8375 		    scsi_pkt->pkt_reason;
8376 		sata_atapi_trace[sata_atapi_trace_index].sata_pkt_reason =
8377 		    spx->txlt_sata_pkt->satapkt_reason;
8378 
8379 		if (++sata_atapi_trace_index >= 64)
8380 			sata_atapi_trace_index = 0;
8381 	}
8382 }
8383 
8384 #endif
8385 
8386 /*
8387  * Fetch inquiry data from ATAPI device
8388  * Returns SATA_SUCCESS if operation was successfull, SATA_FAILURE otherwise.
8389  *
8390  * inqb pointer does not points to a DMA-able buffer. It is a local buffer
8391  * where the caller expects to see the inquiry data.
8392  *
8393  */
8394 
8395 static int
8396 sata_get_atapi_inquiry_data(sata_hba_inst_t *sata_hba,
8397     sata_address_t *saddr, struct scsi_inquiry *inq)
8398 {
8399 	sata_pkt_txlate_t *spx;
8400 	sata_pkt_t *spkt;
8401 	struct buf *bp;
8402 	sata_drive_info_t *sdinfo;
8403 	sata_cmd_t *scmd;
8404 	int rval;
8405 	uint8_t *rqsp;
8406 
8407 	ASSERT(sata_hba != NULL);
8408 
8409 	spx = kmem_zalloc(sizeof (sata_pkt_txlate_t), KM_SLEEP);
8410 	spx->txlt_sata_hba_inst = sata_hba;
8411 	spx->txlt_scsi_pkt = NULL;		/* No scsi pkt involved */
8412 	spkt = sata_pkt_alloc(spx, NULL);
8413 	if (spkt == NULL) {
8414 		kmem_free(spx, sizeof (sata_pkt_txlate_t));
8415 		return (SATA_FAILURE);
8416 	}
8417 	/* address is needed now */
8418 	spkt->satapkt_device.satadev_addr = *saddr;
8419 
8420 	/* scsi_inquiry size buffer */
8421 	bp = sata_alloc_local_buffer(spx, sizeof (struct scsi_inquiry));
8422 	if (bp == NULL) {
8423 		sata_pkt_free(spx);
8424 		kmem_free(spx, sizeof (sata_pkt_txlate_t));
8425 		SATA_LOG_D((sata_hba, CE_WARN,
8426 		    "sata_get_atapi_inquiry_data: "
8427 		    "cannot allocate data buffer"));
8428 		return (SATA_FAILURE);
8429 	}
8430 	bp_mapin(bp); /* make data buffer accessible */
8431 
8432 	scmd = &spkt->satapkt_cmd;
8433 	ASSERT(scmd->satacmd_num_dma_cookies != 0);
8434 	ASSERT(scmd->satacmd_dma_cookie_list != NULL);
8435 
8436 	/* Use synchronous mode */
8437 	spkt->satapkt_op_mode = SATA_OPMODE_SYNCH | SATA_OPMODE_INTERRUPTS;
8438 	spkt->satapkt_comp = NULL;
8439 	spkt->satapkt_time = sata_default_pkt_time;
8440 
8441 	/* Issue inquiry command - 6 bytes cdb, data transfer, read */
8442 
8443 	scmd->satacmd_flags.sata_data_direction = SATA_DIR_READ;
8444 	scmd->satacmd_flags.sata_ignore_dev_reset = B_TRUE;
8445 
8446 	mutex_enter(&(SATA_TXLT_CPORT_MUTEX(spx)));
8447 	sdinfo = sata_get_device_info(sata_hba,
8448 	    &spx->txlt_sata_pkt->satapkt_device);
8449 	if (sdinfo == NULL) {
8450 		/* we have to be carefull about the disapearing device */
8451 		mutex_exit(&(SATA_TXLT_CPORT_MUTEX(spx)));
8452 		rval = SATA_FAILURE;
8453 		goto cleanup;
8454 	}
8455 	sata_atapi_packet_cmd_setup(scmd, sdinfo);
8456 
8457 	/*
8458 	 * Set-up acdb. This works for atapi transport version 2 and later.
8459 	 */
8460 	scmd->satacmd_acdb_len = sdinfo->satadrv_atapi_cdb_len;
8461 	bzero(scmd->satacmd_acdb, SATA_ATAPI_MAX_CDB_LEN);
8462 	scmd->satacmd_acdb[0] = 0x12;	/* Inquiry */
8463 	scmd->satacmd_acdb[1] = 0x00;
8464 	scmd->satacmd_acdb[2] = 0x00;
8465 	scmd->satacmd_acdb[3] = 0x00;
8466 	scmd->satacmd_acdb[4] = sizeof (struct scsi_inquiry);
8467 	scmd->satacmd_acdb[5] = 0x00;
8468 
8469 	sata_fixed_sense_data_preset(
8470 	    (struct scsi_extended_sense *)scmd->satacmd_rqsense);
8471 
8472 	/* Transfer command to HBA */
8473 	if (sata_hba_start(spx, &rval) != 0) {
8474 		/* Pkt not accepted for execution */
8475 		SATADBG1(SATA_DBG_ATAPI, sata_hba,
8476 		    "sata_get_atapi_inquiry_data: "
8477 		    "Packet not accepted for execution - ret: %02x", rval);
8478 		mutex_exit(&(SATA_TXLT_CPORT_MUTEX(spx)));
8479 		rval = SATA_FAILURE;
8480 		goto cleanup;
8481 	}
8482 	mutex_exit(&(SATA_TXLT_CPORT_MUTEX(spx)));
8483 
8484 	if (spkt->satapkt_reason == SATA_PKT_COMPLETED) {
8485 		SATADBG1(SATA_DBG_ATAPI, sata_hba,
8486 		    "sata_get_atapi_inquiry_data: "
8487 		    "Packet completed successfully - ret: %02x", rval);
8488 		/*
8489 		 * Sync buffer. Handle is in usual place in translate struct.
8490 		 * Normal completion - copy data into caller's buffer
8491 		 */
8492 		rval = ddi_dma_sync(spx->txlt_buf_dma_handle, 0, 0,
8493 		    DDI_DMA_SYNC_FORCPU);
8494 		ASSERT(rval == DDI_SUCCESS);
8495 		bcopy(bp->b_un.b_addr, (uint8_t *)inq,
8496 		    sizeof (struct scsi_inquiry));
8497 #ifdef SATA_DEBUG
8498 		if (sata_debug_flags & SATA_DBG_ATAPI) {
8499 			sata_show_inqry_data((uint8_t *)inq);
8500 		}
8501 #endif
8502 		rval = SATA_SUCCESS;
8503 	} else {
8504 		/*
8505 		 * Something went wrong - analyze return - check rqsense data
8506 		 */
8507 		rval = SATA_FAILURE;
8508 		if (spkt->satapkt_reason == SATA_PKT_DEV_ERROR) {
8509 			/*
8510 			 * ARQ data hopefull show something other than NO SENSE
8511 			 */
8512 			rqsp = scmd->satacmd_rqsense;
8513 			sata_log(spx->txlt_sata_hba_inst, CE_WARN,
8514 			    "ATAPI packet completion reason: %02x\n"
8515 			    "RQSENSE:  %02x %02x %02x %02x %02x %02x "
8516 			    "          %02x %02x %02x %02x %02x %02x "
8517 			    "          %02x %02x %02x %02x %02x %02x\n",
8518 			    spkt->satapkt_reason,
8519 			    rqsp[0], rqsp[1], rqsp[2], rqsp[3],
8520 			    rqsp[4], rqsp[5], rqsp[6], rqsp[7],
8521 			    rqsp[8], rqsp[9], rqsp[10], rqsp[11],
8522 			    rqsp[12], rqsp[13], rqsp[14], rqsp[15],
8523 			    rqsp[16], rqsp[17]);
8524 		} else {
8525 			switch (spkt->satapkt_reason) {
8526 			case SATA_PKT_PORT_ERROR:
8527 				sata_log(sata_hba, CE_WARN,
8528 				    "sata_get_atapi_inquiry_data: "
8529 				    "packet reason: port error\n");
8530 				break;
8531 
8532 			case SATA_PKT_TIMEOUT:
8533 				sata_log(sata_hba, CE_WARN,
8534 				    "sata_get_atapi_inquiry_data: "
8535 				    "packet reason: timeout\n");
8536 				break;
8537 
8538 			case SATA_PKT_ABORTED:
8539 				sata_log(sata_hba, CE_WARN,
8540 				    "sata_get_atapi_inquiry_data: "
8541 				    "packet reason: aborted\n");
8542 				break;
8543 
8544 			case SATA_PKT_RESET:
8545 				sata_log(sata_hba, CE_WARN,
8546 				    "sata_get_atapi_inquiry_data: "
8547 				    "packet reason: reset\n");
8548 				break;
8549 			default:
8550 				sata_log(sata_hba, CE_WARN,
8551 				    "sata_get_atapi_inquiry_data: "
8552 				    "invalid packet reason: %02x\n",
8553 				    spkt->satapkt_reason);
8554 				break;
8555 			}
8556 		}
8557 	}
8558 cleanup:
8559 	sata_free_local_buffer(spx);
8560 	sata_pkt_free(spx);
8561 	kmem_free(spx, sizeof (sata_pkt_txlate_t));
8562 	return (rval);
8563 }
8564 
8565 
8566 
8567 
8568 
8569 #if 0
8570 #ifdef SATA_DEBUG
8571 
8572 /*
8573  * Test ATAPI packet command.
8574  * Single threaded test: send packet command in synch mode, process completion
8575  *
8576  */
8577 static void
8578 sata_test_atapi_packet_command(sata_hba_inst_t *sata_hba_inst, int cport)
8579 {
8580 	sata_pkt_txlate_t *spx;
8581 	sata_pkt_t *spkt;
8582 	struct buf *bp;
8583 	sata_device_t sata_device;
8584 	sata_drive_info_t *sdinfo;
8585 	sata_cmd_t *scmd;
8586 	int rval;
8587 	uint8_t *rqsp;
8588 
8589 	ASSERT(sata_hba_inst != NULL);
8590 	sata_device.satadev_addr.cport = cport;
8591 	sata_device.satadev_addr.pmport = 0;
8592 	sata_device.satadev_addr.qual = SATA_ADDR_DCPORT;
8593 	sata_device.satadev_rev = SATA_DEVICE_REV;
8594 	mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, cport)->cport_mutex);
8595 	sdinfo = sata_get_device_info(sata_hba_inst, &sata_device);
8596 	mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, cport)->cport_mutex);
8597 	if (sdinfo == NULL) {
8598 		sata_log(sata_hba_inst, CE_WARN,
8599 		    "sata_test_atapi_packet_command: "
8600 		    "no device info for cport %d",
8601 		    sata_device.satadev_addr.cport);
8602 		return;
8603 	}
8604 
8605 	spx = kmem_zalloc(sizeof (sata_pkt_txlate_t), KM_SLEEP);
8606 	spx->txlt_sata_hba_inst = sata_hba_inst;
8607 	spx->txlt_scsi_pkt = NULL;		/* No scsi pkt involved */
8608 	spkt = sata_pkt_alloc(spx, NULL);
8609 	if (spkt == NULL) {
8610 		kmem_free(spx, sizeof (sata_pkt_txlate_t));
8611 		return;
8612 	}
8613 	/* address is needed now */
8614 	spkt->satapkt_device.satadev_addr = sata_device.satadev_addr;
8615 
8616 	/* 1024k buffer */
8617 	bp = sata_alloc_local_buffer(spx, 1024);
8618 	if (bp == NULL) {
8619 		sata_pkt_free(spx);
8620 		kmem_free(spx, sizeof (sata_pkt_txlate_t));
8621 		sata_log(sata_hba_inst, CE_WARN,
8622 		    "sata_test_atapi_packet_command: "
8623 		    "cannot allocate data buffer");
8624 		return;
8625 	}
8626 	bp_mapin(bp); /* make data buffer accessible */
8627 
8628 	scmd = &spkt->satapkt_cmd;
8629 	ASSERT(scmd->satacmd_num_dma_cookies != 0);
8630 	ASSERT(scmd->satacmd_dma_cookie_list != NULL);
8631 
8632 	/* Use synchronous mode */
8633 	spkt->satapkt_op_mode = SATA_OPMODE_SYNCH | SATA_OPMODE_INTERRUPTS;
8634 
8635 	/* Synchronous mode, no callback - may be changed by the caller */
8636 	spkt->satapkt_comp = NULL;
8637 	spkt->satapkt_time = sata_default_pkt_time;
8638 
8639 	/* Issue inquiry command - 6 bytes cdb, data transfer, read */
8640 
8641 	scmd->satacmd_flags.sata_data_direction = SATA_DIR_READ;
8642 	scmd->satacmd_flags.sata_ignore_dev_reset = B_TRUE;
8643 
8644 	sata_atapi_packet_cmd_setup(scmd, sdinfo);
8645 
8646 	/* Set-up acdb. */
8647 	scmd->satacmd_acdb_len = sdinfo->satadrv_atapi_cdb_len;
8648 	bzero(scmd->satacmd_acdb, SATA_ATAPI_MAX_CDB_LEN);
8649 	scmd->satacmd_acdb[0] = 0x12;	/* Inquiry */
8650 	scmd->satacmd_acdb[1] = 0x00;
8651 	scmd->satacmd_acdb[2] = 0x00;
8652 	scmd->satacmd_acdb[3] = 0x00;
8653 	scmd->satacmd_acdb[4] = sizeof (struct scsi_inquiry);
8654 	scmd->satacmd_acdb[5] = 0x00;
8655 
8656 	sata_fixed_sense_data_preset(
8657 	    (struct scsi_extended_sense *)scmd->satacmd_rqsense);
8658 
8659 	/* Transfer command to HBA */
8660 	mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, cport)->cport_mutex);
8661 	if (sata_hba_start(spx, &rval) != 0) {
8662 		/* Pkt not accepted for execution */
8663 		sata_log(sata_hba_inst, CE_WARN,
8664 		    "sata_test_atapi_packet_command: "
8665 		    "Packet not accepted for execution - ret: %02x", rval);
8666 		mutex_exit(
8667 		    &SATA_CPORT_INFO(sata_hba_inst, cport)->cport_mutex);
8668 		goto cleanup;
8669 	}
8670 	mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, cport)->cport_mutex);
8671 
8672 	/*
8673 	 * Sync buffer. Handle is in usual place in translate struct.
8674 	 */
8675 	rval = ddi_dma_sync(spx->txlt_buf_dma_handle, 0, 0,
8676 	    DDI_DMA_SYNC_FORCPU);
8677 	ASSERT(rval == DDI_SUCCESS);
8678 	if (spkt->satapkt_reason == SATA_PKT_COMPLETED) {
8679 		sata_log(sata_hba_inst, CE_WARN,
8680 		    "sata_test_atapi_packet_command: "
8681 		    "Packet completed successfully\n");
8682 		/*
8683 		 * Normal completion - show inquiry data
8684 		 */
8685 		sata_show_inqry_data((uint8_t *)bp->b_un.b_addr);
8686 	} else {
8687 		/*
8688 		 * Something went wrong - analyze return - check rqsense data
8689 		 */
8690 		if (spkt->satapkt_reason == SATA_PKT_DEV_ERROR) {
8691 			/*
8692 			 * ARQ data hopefull show something other than NO SENSE
8693 			 */
8694 			rqsp = scmd->satacmd_rqsense;
8695 			sata_log(spx->txlt_sata_hba_inst, CE_WARN,
8696 			    "ATAPI packet completion reason: %02x\n"
8697 			    "RQSENSE:  %02x %02x %02x %02x %02x %02x "
8698 			    "          %02x %02x %02x %02x %02x %02x "
8699 			    "          %02x %02x %02x %02x %02x %02x\n",
8700 			    spkt->satapkt_reason,
8701 			    rqsp[0], rqsp[1], rqsp[2], rqsp[3],
8702 			    rqsp[4], rqsp[5], rqsp[6], rqsp[7],
8703 			    rqsp[8], rqsp[9], rqsp[10], rqsp[11],
8704 			    rqsp[12], rqsp[13], rqsp[14], rqsp[15],
8705 			    rqsp[16], rqsp[17]);
8706 		} else {
8707 			switch (spkt->satapkt_reason) {
8708 			case SATA_PKT_PORT_ERROR:
8709 				sata_log(sata_hba_inst, CE_WARN,
8710 				    "sata_test_atapi_packet_command: "
8711 				    "packet reason: port error\n");
8712 				break;
8713 
8714 			case SATA_PKT_TIMEOUT:
8715 				sata_log(sata_hba_inst, CE_WARN,
8716 				    "sata_test_atapi_packet_command: "
8717 				    "packet reason: timeout\n");
8718 				break;
8719 
8720 			case SATA_PKT_ABORTED:
8721 				sata_log(sata_hba_inst, CE_WARN,
8722 				    "sata_test_atapi_packet_command: "
8723 				    "packet reason: aborted\n");
8724 				break;
8725 
8726 			case SATA_PKT_RESET:
8727 				sata_log(sata_hba_inst, CE_WARN,
8728 				    "sata_test_atapi_packet_command: "
8729 				    "packet reason: reset\n");
8730 				break;
8731 			default:
8732 				sata_log(sata_hba_inst, CE_WARN,
8733 				    "sata_test_atapi_packet_command: "
8734 				    "invalid packet reason: %02x\n",
8735 				    spkt->satapkt_reason);
8736 				break;
8737 			}
8738 		}
8739 	}
8740 cleanup:
8741 	sata_free_local_buffer(spx);
8742 	sata_pkt_free(spx);
8743 	kmem_free(spx, sizeof (sata_pkt_txlate_t));
8744 }
8745 
8746 #endif /* SATA_DEBUG */
8747 #endif /* 1 */
8748 
8749 
8750 /* ************************** LOCAL HELPER FUNCTIONS *********************** */
8751 
8752 /*
8753  * Validate sata_tran info
8754  * SATA_FAILURE returns if structure is inconsistent or structure revision
8755  * does not match one used by the framework.
8756  *
8757  * Returns SATA_SUCCESS if sata_hba_tran has matching revision and contains
8758  * required function pointers.
8759  * Returns SATA_FAILURE otherwise.
8760  */
8761 static int
8762 sata_validate_sata_hba_tran(dev_info_t *dip, sata_hba_tran_t *sata_tran)
8763 {
8764 	/*
8765 	 * SATA_TRAN_HBA_REV is the current (highest) revision number
8766 	 * of the SATA interface.
8767 	 */
8768 	if (sata_tran->sata_tran_hba_rev > SATA_TRAN_HBA_REV) {
8769 		sata_log(NULL, CE_WARN,
8770 		    "sata: invalid sata_hba_tran version %d for driver %s",
8771 		    sata_tran->sata_tran_hba_rev, ddi_driver_name(dip));
8772 		return (SATA_FAILURE);
8773 	}
8774 
8775 	if (dip != sata_tran->sata_tran_hba_dip) {
8776 		SATA_LOG_D((NULL, CE_WARN,
8777 		    "sata: inconsistent sata_tran_hba_dip "
8778 		    "%p / %p", sata_tran->sata_tran_hba_dip, dip));
8779 		return (SATA_FAILURE);
8780 	}
8781 
8782 	if (sata_tran->sata_tran_probe_port == NULL ||
8783 	    sata_tran->sata_tran_start == NULL ||
8784 	    sata_tran->sata_tran_abort == NULL ||
8785 	    sata_tran->sata_tran_reset_dport == NULL ||
8786 	    sata_tran->sata_tran_hotplug_ops == NULL ||
8787 	    sata_tran->sata_tran_hotplug_ops->sata_tran_port_activate == NULL ||
8788 	    sata_tran->sata_tran_hotplug_ops->sata_tran_port_deactivate ==
8789 	    NULL) {
8790 		SATA_LOG_D((NULL, CE_WARN, "sata: sata_hba_tran missing "
8791 		    "required functions"));
8792 	}
8793 	return (SATA_SUCCESS);
8794 }
8795 
8796 /*
8797  * Remove HBA instance from sata_hba_list.
8798  */
8799 static void
8800 sata_remove_hba_instance(dev_info_t *dip)
8801 {
8802 	sata_hba_inst_t	*sata_hba_inst;
8803 
8804 	mutex_enter(&sata_mutex);
8805 	for (sata_hba_inst = sata_hba_list;
8806 	    sata_hba_inst != (struct sata_hba_inst *)NULL;
8807 	    sata_hba_inst = sata_hba_inst->satahba_next) {
8808 		if (sata_hba_inst->satahba_dip == dip)
8809 			break;
8810 	}
8811 
8812 	if (sata_hba_inst == (struct sata_hba_inst *)NULL) {
8813 #ifdef SATA_DEBUG
8814 		cmn_err(CE_WARN, "sata_remove_hba_instance: "
8815 		    "unknown HBA instance\n");
8816 #endif
8817 		ASSERT(FALSE);
8818 	}
8819 	if (sata_hba_inst == sata_hba_list) {
8820 		sata_hba_list = sata_hba_inst->satahba_next;
8821 		if (sata_hba_list) {
8822 			sata_hba_list->satahba_prev =
8823 			    (struct sata_hba_inst *)NULL;
8824 		}
8825 		if (sata_hba_inst == sata_hba_list_tail) {
8826 			sata_hba_list_tail = NULL;
8827 		}
8828 	} else if (sata_hba_inst == sata_hba_list_tail) {
8829 		sata_hba_list_tail = sata_hba_inst->satahba_prev;
8830 		if (sata_hba_list_tail) {
8831 			sata_hba_list_tail->satahba_next =
8832 			    (struct sata_hba_inst *)NULL;
8833 		}
8834 	} else {
8835 		sata_hba_inst->satahba_prev->satahba_next =
8836 		    sata_hba_inst->satahba_next;
8837 		sata_hba_inst->satahba_next->satahba_prev =
8838 		    sata_hba_inst->satahba_prev;
8839 	}
8840 	mutex_exit(&sata_mutex);
8841 }
8842 
8843 
8844 
8845 
8846 
8847 /*
8848  * Probe all SATA ports of the specified HBA instance.
8849  * The assumption is that there are no target and attachment point minor nodes
8850  * created by the boot subsystems, so we do not need to prune device tree.
8851  *
8852  * This function is called only from sata_hba_attach(). It does not have to
8853  * be protected by controller mutex, because the hba_attached flag is not set
8854  * yet and no one would be touching this HBA instance other than this thread.
8855  * Determines if port is active and what type of the device is attached
8856  * (if any). Allocates necessary structures for each port.
8857  *
8858  * An AP (Attachement Point) node is created for each SATA device port even
8859  * when there is no device attached.
8860  */
8861 
8862 static 	void
8863 sata_probe_ports(sata_hba_inst_t *sata_hba_inst)
8864 {
8865 	dev_info_t		*dip = SATA_DIP(sata_hba_inst);
8866 	int			ncport, npmport;
8867 	sata_cport_info_t 	*cportinfo;
8868 	sata_drive_info_t	*drive;
8869 	sata_pmult_info_t	*pminfo;
8870 	sata_pmport_info_t 	*pmportinfo;
8871 	sata_device_t		sata_device;
8872 	int			rval;
8873 	dev_t			minor_number;
8874 	char			name[16];
8875 	clock_t			start_time, cur_time;
8876 
8877 	/*
8878 	 * Probe controller ports first, to find port status and
8879 	 * any port multiplier attached.
8880 	 */
8881 	for (ncport = 0; ncport < SATA_NUM_CPORTS(sata_hba_inst); ncport++) {
8882 		/* allocate cport structure */
8883 		cportinfo = kmem_zalloc(sizeof (sata_cport_info_t), KM_SLEEP);
8884 		ASSERT(cportinfo != NULL);
8885 		mutex_init(&cportinfo->cport_mutex, NULL, MUTEX_DRIVER, NULL);
8886 
8887 		mutex_enter(&cportinfo->cport_mutex);
8888 
8889 		cportinfo->cport_addr.cport = ncport;
8890 		cportinfo->cport_addr.pmport = 0;
8891 		cportinfo->cport_addr.qual = SATA_ADDR_CPORT;
8892 		cportinfo->cport_state &= ~SATA_PORT_STATE_CLEAR_MASK;
8893 		cportinfo->cport_state |= SATA_STATE_PROBING;
8894 		SATA_CPORT_INFO(sata_hba_inst, ncport) = cportinfo;
8895 
8896 		/*
8897 		 * Regardless if a port is usable or not, create
8898 		 * an attachment point
8899 		 */
8900 		mutex_exit(&cportinfo->cport_mutex);
8901 		minor_number =
8902 		    SATA_MAKE_AP_MINOR(ddi_get_instance(dip), ncport, 0, 0);
8903 		(void) sprintf(name, "%d", ncport);
8904 		if (ddi_create_minor_node(dip, name, S_IFCHR,
8905 		    minor_number, DDI_NT_SATA_ATTACHMENT_POINT, 0) !=
8906 		    DDI_SUCCESS) {
8907 			sata_log(sata_hba_inst, CE_WARN, "sata_hba_attach: "
8908 			    "cannot create SATA attachment point for port %d",
8909 			    ncport);
8910 		}
8911 
8912 		/* Probe port */
8913 		start_time = ddi_get_lbolt();
8914 	reprobe_cport:
8915 		sata_device.satadev_addr.cport = ncport;
8916 		sata_device.satadev_addr.pmport = 0;
8917 		sata_device.satadev_addr.qual = SATA_ADDR_CPORT;
8918 		sata_device.satadev_rev = SATA_DEVICE_REV;
8919 
8920 		rval = (*SATA_PROBE_PORT_FUNC(sata_hba_inst))
8921 		    (dip, &sata_device);
8922 
8923 		mutex_enter(&cportinfo->cport_mutex);
8924 		sata_update_port_scr(&cportinfo->cport_scr, &sata_device);
8925 		if (rval != SATA_SUCCESS) {
8926 			/* Something went wrong? Fail the port */
8927 			cportinfo->cport_state = SATA_PSTATE_FAILED;
8928 			mutex_exit(&cportinfo->cport_mutex);
8929 			continue;
8930 		}
8931 		cportinfo->cport_state &= ~SATA_STATE_PROBING;
8932 		cportinfo->cport_state |= SATA_STATE_PROBED;
8933 		cportinfo->cport_dev_type = sata_device.satadev_type;
8934 
8935 		cportinfo->cport_state |= SATA_STATE_READY;
8936 		if (cportinfo->cport_dev_type == SATA_DTYPE_NONE) {
8937 			mutex_exit(&cportinfo->cport_mutex);
8938 			continue;
8939 		}
8940 		if (cportinfo->cport_dev_type != SATA_DTYPE_PMULT) {
8941 			/*
8942 			 * There is some device attached.
8943 			 * Allocate device info structure
8944 			 */
8945 			if (SATA_CPORTINFO_DRV_INFO(cportinfo) == NULL) {
8946 				mutex_exit(&cportinfo->cport_mutex);
8947 				SATA_CPORTINFO_DRV_INFO(cportinfo) =
8948 				    kmem_zalloc(sizeof (sata_drive_info_t),
8949 				    KM_SLEEP);
8950 				mutex_enter(&cportinfo->cport_mutex);
8951 			}
8952 			drive = SATA_CPORTINFO_DRV_INFO(cportinfo);
8953 			drive->satadrv_addr = cportinfo->cport_addr;
8954 			drive->satadrv_addr.qual = SATA_ADDR_DCPORT;
8955 			drive->satadrv_type = cportinfo->cport_dev_type;
8956 			drive->satadrv_state = SATA_STATE_UNKNOWN;
8957 
8958 			mutex_exit(&cportinfo->cport_mutex);
8959 			if (sata_add_device(dip, sata_hba_inst, ncport, 0) !=
8960 			    SATA_SUCCESS) {
8961 				/*
8962 				 * Plugged device was not correctly identified.
8963 				 * Retry, within a SATA_DEV_IDENTIFY_TIMEOUT
8964 				 */
8965 				cur_time = ddi_get_lbolt();
8966 				if ((cur_time - start_time) <
8967 				    drv_usectohz(SATA_DEV_IDENTIFY_TIMEOUT)) {
8968 					/* sleep for a while */
8969 					delay(drv_usectohz(
8970 					    SATA_DEV_IDENTIFY_RETRY_DELAY));
8971 					goto reprobe_cport;
8972 				}
8973 			}
8974 		} else {
8975 			mutex_exit(&cportinfo->cport_mutex);
8976 			ASSERT(cportinfo->cport_dev_type == SATA_DTYPE_PMULT);
8977 			pminfo = kmem_zalloc(sizeof (sata_pmult_info_t),
8978 			    KM_SLEEP);
8979 			mutex_enter(&cportinfo->cport_mutex);
8980 			ASSERT(pminfo != NULL);
8981 			SATA_CPORTINFO_PMULT_INFO(cportinfo) = pminfo;
8982 			pminfo->pmult_addr.cport = cportinfo->cport_addr.cport;
8983 			pminfo->pmult_addr.pmport = SATA_PMULT_HOSTPORT;
8984 			pminfo->pmult_addr.qual = SATA_ADDR_PMPORT;
8985 			pminfo->pmult_num_dev_ports =
8986 			    sata_device.satadev_add_info;
8987 			mutex_init(&pminfo->pmult_mutex, NULL, MUTEX_DRIVER,
8988 			    NULL);
8989 			pminfo->pmult_state = SATA_STATE_PROBING;
8990 			mutex_exit(&cportinfo->cport_mutex);
8991 
8992 			/* Probe Port Multiplier ports */
8993 			for (npmport = 0;
8994 			    npmport < pminfo->pmult_num_dev_ports;
8995 			    npmport++) {
8996 				pmportinfo = kmem_zalloc(
8997 				    sizeof (sata_pmport_info_t), KM_SLEEP);
8998 				mutex_enter(&cportinfo->cport_mutex);
8999 				ASSERT(pmportinfo != NULL);
9000 				pmportinfo->pmport_addr.cport = ncport;
9001 				pmportinfo->pmport_addr.pmport = npmport;
9002 				pmportinfo->pmport_addr.qual =
9003 				    SATA_ADDR_PMPORT;
9004 				pminfo->pmult_dev_port[npmport] = pmportinfo;
9005 
9006 				mutex_init(&pmportinfo->pmport_mutex, NULL,
9007 				    MUTEX_DRIVER, NULL);
9008 
9009 				mutex_exit(&cportinfo->cport_mutex);
9010 
9011 				/* Create an attachment point */
9012 				minor_number = SATA_MAKE_AP_MINOR(
9013 				    ddi_get_instance(dip), ncport, npmport, 1);
9014 				(void) sprintf(name, "%d.%d", ncport, npmport);
9015 				if (ddi_create_minor_node(dip, name, S_IFCHR,
9016 				    minor_number, DDI_NT_SATA_ATTACHMENT_POINT,
9017 				    0) != DDI_SUCCESS) {
9018 					sata_log(sata_hba_inst, CE_WARN,
9019 					    "sata_hba_attach: "
9020 					    "cannot create SATA attachment "
9021 					    "point for port %d pmult port %d",
9022 					    ncport, npmport);
9023 				}
9024 
9025 				start_time = ddi_get_lbolt();
9026 			reprobe_pmport:
9027 				sata_device.satadev_addr.pmport = npmport;
9028 				sata_device.satadev_addr.qual =
9029 				    SATA_ADDR_PMPORT;
9030 
9031 				rval = (*SATA_PROBE_PORT_FUNC(sata_hba_inst))
9032 				    (dip, &sata_device);
9033 				mutex_enter(&cportinfo->cport_mutex);
9034 
9035 				/* sata_update_port_info() */
9036 				sata_update_port_scr(&pmportinfo->pmport_scr,
9037 				    &sata_device);
9038 
9039 				if (rval != SATA_SUCCESS) {
9040 					pmportinfo->pmport_state =
9041 					    SATA_PSTATE_FAILED;
9042 					mutex_exit(&cportinfo->cport_mutex);
9043 					continue;
9044 				}
9045 				pmportinfo->pmport_state &=
9046 				    ~SATA_STATE_PROBING;
9047 				pmportinfo->pmport_state |= SATA_STATE_PROBED;
9048 				pmportinfo->pmport_dev_type =
9049 				    sata_device.satadev_type;
9050 
9051 				pmportinfo->pmport_state |= SATA_STATE_READY;
9052 				if (pmportinfo->pmport_dev_type ==
9053 				    SATA_DTYPE_NONE) {
9054 					mutex_exit(&cportinfo->cport_mutex);
9055 					continue;
9056 				}
9057 				/* Port multipliers cannot be chained */
9058 				ASSERT(pmportinfo->pmport_dev_type !=
9059 				    SATA_DTYPE_PMULT);
9060 				/*
9061 				 * There is something attached to Port
9062 				 * Multiplier device port
9063 				 * Allocate device info structure
9064 				 */
9065 				if (pmportinfo->pmport_sata_drive == NULL) {
9066 					mutex_exit(&cportinfo->cport_mutex);
9067 					pmportinfo->pmport_sata_drive =
9068 					    kmem_zalloc(
9069 					    sizeof (sata_drive_info_t),
9070 					    KM_SLEEP);
9071 					mutex_enter(&cportinfo->cport_mutex);
9072 				}
9073 				drive = pmportinfo->pmport_sata_drive;
9074 				drive->satadrv_addr.cport =
9075 				    pmportinfo->pmport_addr.cport;
9076 				drive->satadrv_addr.pmport = npmport;
9077 				drive->satadrv_addr.qual = SATA_ADDR_DPMPORT;
9078 				drive->satadrv_type = pmportinfo->
9079 				    pmport_dev_type;
9080 				drive->satadrv_state = SATA_STATE_UNKNOWN;
9081 
9082 				mutex_exit(&cportinfo->cport_mutex);
9083 				if (sata_add_device(dip, sata_hba_inst, ncport,
9084 				    npmport) != SATA_SUCCESS) {
9085 					/*
9086 					 * Plugged device was not correctly
9087 					 * identified. Retry, within the
9088 					 * SATA_DEV_IDENTIFY_TIMEOUT
9089 					 */
9090 					cur_time = ddi_get_lbolt();
9091 					if ((cur_time - start_time) <
9092 					    drv_usectohz(
9093 					    SATA_DEV_IDENTIFY_TIMEOUT)) {
9094 						/* sleep for a while */
9095 						delay(drv_usectohz(
9096 						SATA_DEV_IDENTIFY_RETRY_DELAY));
9097 						goto reprobe_pmport;
9098 					}
9099 				}
9100 			}
9101 			pmportinfo->pmport_state =
9102 			    SATA_STATE_PROBED | SATA_STATE_READY;
9103 		}
9104 	}
9105 }
9106 
9107 /*
9108  * Add SATA device for specified HBA instance & port (SCSI target
9109  * device nodes).
9110  * This function is called (indirectly) only from sata_hba_attach().
9111  * A target node is created when there is a supported type device attached,
9112  * but may be removed if it cannot be put online.
9113  *
9114  * This function cannot be called from an interrupt context.
9115  *
9116  * ONLY DISK TARGET NODES ARE CREATED NOW
9117  *
9118  * Returns SATA_SUCCESS when port/device was fully processed, SATA_FAILURE when
9119  * device identification failed - adding a device could be retried.
9120  *
9121  */
9122 static 	int
9123 sata_add_device(dev_info_t *pdip, sata_hba_inst_t *sata_hba_inst, int cport,
9124     int pmport)
9125 {
9126 	sata_cport_info_t 	*cportinfo;
9127 	sata_pmult_info_t	*pminfo;
9128 	sata_pmport_info_t	*pmportinfo;
9129 	dev_info_t		*cdip;		/* child dip */
9130 	sata_device_t		sata_device;
9131 	int			rval;
9132 
9133 
9134 
9135 	cportinfo = SATA_CPORT_INFO(sata_hba_inst, cport);
9136 	ASSERT(cportinfo->cport_dev_type != SATA_DTYPE_NONE);
9137 	mutex_enter(&cportinfo->cport_mutex);
9138 	/*
9139 	 * Some device is attached to a controller port.
9140 	 * We rely on controllers distinquishing between no-device,
9141 	 * attached port multiplier and other kind of attached device.
9142 	 * We need to get Identify Device data and determine
9143 	 * positively the dev type before trying to attach
9144 	 * the target driver.
9145 	 */
9146 	sata_device.satadev_rev = SATA_DEVICE_REV;
9147 	if (cportinfo->cport_dev_type != SATA_DTYPE_PMULT) {
9148 		/*
9149 		 * Not port multiplier.
9150 		 */
9151 		sata_device.satadev_addr = cportinfo->cport_addr;
9152 		sata_device.satadev_addr.qual = SATA_ADDR_DCPORT;
9153 		mutex_exit(&cportinfo->cport_mutex);
9154 
9155 		rval = sata_probe_device(sata_hba_inst, &sata_device);
9156 		if (rval != SATA_SUCCESS ||
9157 		    sata_device.satadev_type == SATA_DTYPE_UNKNOWN)
9158 			return (SATA_FAILURE);
9159 
9160 		mutex_enter(&cportinfo->cport_mutex);
9161 		sata_show_drive_info(sata_hba_inst,
9162 		    SATA_CPORTINFO_DRV_INFO(cportinfo));
9163 
9164 		if ((sata_device.satadev_type & SATA_VALID_DEV_TYPE) == 0) {
9165 			/*
9166 			 * Could not determine device type or
9167 			 * a device is not supported.
9168 			 * Degrade this device to unknown.
9169 			 */
9170 			cportinfo->cport_dev_type = SATA_DTYPE_UNKNOWN;
9171 			mutex_exit(&cportinfo->cport_mutex);
9172 			return (SATA_SUCCESS);
9173 		}
9174 		cportinfo->cport_dev_type = sata_device.satadev_type;
9175 		cportinfo->cport_tgtnode_clean = B_TRUE;
9176 		mutex_exit(&cportinfo->cport_mutex);
9177 
9178 		/*
9179 		 * Initialize device to the desired state. Even if it
9180 		 * fails, the device will still attach but syslog
9181 		 * will show the warning.
9182 		 */
9183 		if (sata_initialize_device(sata_hba_inst,
9184 		    SATA_CPORTINFO_DRV_INFO(cportinfo)) != SATA_SUCCESS)
9185 			/* Retry */
9186 			(void) sata_initialize_device(sata_hba_inst,
9187 			    SATA_CPORTINFO_DRV_INFO(cportinfo));
9188 
9189 		cdip = sata_create_target_node(pdip, sata_hba_inst,
9190 		    &sata_device.satadev_addr);
9191 		mutex_enter(&cportinfo->cport_mutex);
9192 		if (cdip == NULL) {
9193 			/*
9194 			 * Attaching target node failed.
9195 			 * We retain sata_drive_info structure...
9196 			 */
9197 			mutex_exit(&cportinfo->cport_mutex);
9198 			return (SATA_SUCCESS);
9199 		}
9200 		(SATA_CPORTINFO_DRV_INFO(cportinfo))->
9201 		    satadrv_state = SATA_STATE_READY;
9202 	} else {
9203 		/* This must be Port Multiplier type */
9204 		if (cportinfo->cport_dev_type != SATA_DTYPE_PMULT) {
9205 			SATA_LOG_D((sata_hba_inst, CE_WARN,
9206 			    "sata_add_device: "
9207 			    "unrecognized dev type %x",
9208 			    cportinfo->cport_dev_type));
9209 			mutex_exit(&cportinfo->cport_mutex);
9210 			return (SATA_SUCCESS);
9211 		}
9212 		pminfo = SATA_CPORTINFO_PMULT_INFO(cportinfo);
9213 		pmportinfo = pminfo->pmult_dev_port[pmport];
9214 		sata_device.satadev_addr = pmportinfo->pmport_addr;
9215 		sata_device.satadev_addr.qual = SATA_ADDR_DPMPORT;
9216 		mutex_exit(&cportinfo->cport_mutex);
9217 
9218 		rval = sata_probe_device(sata_hba_inst, &sata_device);
9219 		if (rval != SATA_SUCCESS ||
9220 		    sata_device.satadev_type == SATA_DTYPE_UNKNOWN) {
9221 			return (SATA_FAILURE);
9222 		}
9223 		mutex_enter(&cportinfo->cport_mutex);
9224 		sata_show_drive_info(sata_hba_inst,
9225 		    SATA_CPORTINFO_DRV_INFO(cportinfo));
9226 
9227 		if ((sata_device.satadev_type & SATA_VALID_DEV_TYPE) == 0) {
9228 			/*
9229 			 * Could not determine device type.
9230 			 * Degrade this device to unknown.
9231 			 */
9232 			pmportinfo->pmport_dev_type = SATA_DTYPE_UNKNOWN;
9233 			mutex_exit(&cportinfo->cport_mutex);
9234 			return (SATA_SUCCESS);
9235 		}
9236 		pmportinfo->pmport_dev_type = sata_device.satadev_type;
9237 		pmportinfo->pmport_tgtnode_clean = B_TRUE;
9238 		mutex_exit(&cportinfo->cport_mutex);
9239 
9240 		/*
9241 		 * Initialize device to the desired state.
9242 		 * Even if it fails, the device will still
9243 		 * attach but syslog will show the warning.
9244 		 */
9245 		if (sata_initialize_device(sata_hba_inst,
9246 		    pmportinfo->pmport_sata_drive) != SATA_SUCCESS)
9247 			/* Retry */
9248 			(void) sata_initialize_device(sata_hba_inst,
9249 			    pmportinfo->pmport_sata_drive);
9250 
9251 		cdip = sata_create_target_node(pdip, sata_hba_inst,
9252 		    &sata_device.satadev_addr);
9253 		mutex_enter(&cportinfo->cport_mutex);
9254 		if (cdip == NULL) {
9255 			/*
9256 			 * Attaching target node failed.
9257 			 * We retain sata_drive_info structure...
9258 			 */
9259 			mutex_exit(&cportinfo->cport_mutex);
9260 			return (SATA_SUCCESS);
9261 		}
9262 		pmportinfo->pmport_sata_drive->satadrv_state |=
9263 		    SATA_STATE_READY;
9264 	}
9265 	mutex_exit(&cportinfo->cport_mutex);
9266 	return (SATA_SUCCESS);
9267 }
9268 
9269 
9270 
9271 /*
9272  * Create scsi target node for attached device, create node properties and
9273  * attach the node.
9274  * The node could be removed if the device onlining fails.
9275  *
9276  * A dev_info_t pointer is returned if operation is successful, NULL is
9277  * returned otherwise.
9278  *
9279  * No port multiplier support.
9280  */
9281 
9282 static dev_info_t *
9283 sata_create_target_node(dev_info_t *dip, sata_hba_inst_t *sata_hba_inst,
9284 			sata_address_t *sata_addr)
9285 {
9286 	dev_info_t *cdip = NULL;
9287 	int rval;
9288 	char *nname = NULL;
9289 	char **compatible = NULL;
9290 	int ncompatible;
9291 	struct scsi_inquiry inq;
9292 	sata_device_t sata_device;
9293 	sata_drive_info_t *sdinfo;
9294 	int target;
9295 	int i;
9296 
9297 	sata_device.satadev_rev = SATA_DEVICE_REV;
9298 	sata_device.satadev_addr = *sata_addr;
9299 
9300 	mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst, sata_addr->cport)));
9301 
9302 	sdinfo = sata_get_device_info(sata_hba_inst, &sata_device);
9303 
9304 	target = SATA_TO_SCSI_TARGET(sata_addr->cport,
9305 	    sata_addr->pmport, sata_addr->qual);
9306 
9307 	if (sdinfo == NULL) {
9308 		mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
9309 		    sata_addr->cport)));
9310 		SATA_LOG_D((sata_hba_inst, CE_WARN,
9311 		    "sata_create_target_node: no sdinfo for target %x",
9312 		    target));
9313 		return (NULL);
9314 	}
9315 
9316 	/*
9317 	 * create or get scsi inquiry data, expected by
9318 	 * scsi_hba_nodename_compatible_get()
9319 	 * SATA hard disks get Identify Data translated into Inguiry Data.
9320 	 * ATAPI devices respond directly to Inquiry request.
9321 	 */
9322 	if (sdinfo->satadrv_type == SATA_DTYPE_ATADISK) {
9323 		sata_identdev_to_inquiry(sata_hba_inst, sdinfo,
9324 		    (uint8_t *)&inq);
9325 		mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
9326 		    sata_addr->cport)));
9327 	} else { /* Assume supported ATAPI device */
9328 		mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
9329 		    sata_addr->cport)));
9330 		if (sata_get_atapi_inquiry_data(sata_hba_inst, sata_addr,
9331 		    &inq) == SATA_FAILURE)
9332 			return (NULL);
9333 		/*
9334 		 * Save supported ATAPI transport version
9335 		 */
9336 		sdinfo->satadrv_atapi_trans_ver =
9337 		    SATA_ATAPI_TRANS_VERSION(&inq);
9338 	}
9339 
9340 	/* determine the node name and compatible */
9341 	scsi_hba_nodename_compatible_get(&inq, NULL,
9342 	    inq.inq_dtype, NULL, &nname, &compatible, &ncompatible);
9343 
9344 #ifdef SATA_DEBUG
9345 	if (sata_debug_flags & SATA_DBG_NODES) {
9346 		if (nname == NULL) {
9347 			cmn_err(CE_NOTE, "sata_create_target_node: "
9348 			    "cannot determine nodename for target %d\n",
9349 			    target);
9350 		} else {
9351 			cmn_err(CE_WARN, "sata_create_target_node: "
9352 			    "target %d nodename: %s\n", target, nname);
9353 		}
9354 		if (compatible == NULL) {
9355 			cmn_err(CE_WARN,
9356 			    "sata_create_target_node: no compatible name\n");
9357 		} else {
9358 			for (i = 0; i < ncompatible; i++) {
9359 				cmn_err(CE_WARN, "sata_create_target_node: "
9360 				    "compatible name: %s\n", compatible[i]);
9361 			}
9362 		}
9363 	}
9364 #endif
9365 
9366 	/* if nodename can't be determined, log error and exit */
9367 	if (nname == NULL) {
9368 		SATA_LOG_D((sata_hba_inst, CE_WARN,
9369 		    "sata_create_target_node: cannot determine nodename "
9370 		    "for target %d\n", target));
9371 		scsi_hba_nodename_compatible_free(nname, compatible);
9372 		return (NULL);
9373 	}
9374 	/*
9375 	 * Create scsi target node
9376 	 */
9377 	ndi_devi_alloc_sleep(dip, nname, (pnode_t)DEVI_SID_NODEID, &cdip);
9378 	rval = ndi_prop_update_string(DDI_DEV_T_NONE, cdip,
9379 	    "device-type", "scsi");
9380 
9381 	if (rval != DDI_PROP_SUCCESS) {
9382 		SATA_LOG_D((sata_hba_inst, CE_WARN, "sata_create_target_node: "
9383 		    "updating device_type prop failed %d", rval));
9384 		goto fail;
9385 	}
9386 
9387 	/*
9388 	 * Create target node properties: target & lun
9389 	 */
9390 	rval = ndi_prop_update_int(DDI_DEV_T_NONE, cdip, "target", target);
9391 	if (rval != DDI_PROP_SUCCESS) {
9392 		SATA_LOG_D((sata_hba_inst, CE_WARN, "sata_create_target_node: "
9393 		    "updating target prop failed %d", rval));
9394 		goto fail;
9395 	}
9396 	rval = ndi_prop_update_int(DDI_DEV_T_NONE, cdip, "lun", 0);
9397 	if (rval != DDI_PROP_SUCCESS) {
9398 		SATA_LOG_D((sata_hba_inst, CE_WARN, "sata_create_target_node: "
9399 		    "updating target prop failed %d", rval));
9400 		goto fail;
9401 	}
9402 
9403 	if (sdinfo->satadrv_type == SATA_DTYPE_ATAPICD) {
9404 		/*
9405 		 * Add "variant" property
9406 		 */
9407 		rval = ndi_prop_update_string(DDI_DEV_T_NONE, cdip,
9408 		    "variant", "atapi");
9409 		if (rval != DDI_PROP_SUCCESS) {
9410 			SATA_LOG_D((sata_hba_inst, CE_WARN,
9411 			    "sata_create_target_node: variant atapi "
9412 			    "property could not be created: %d", rval));
9413 			goto fail;
9414 		}
9415 	}
9416 	/* decorate the node with compatible */
9417 	if (ndi_prop_update_string_array(DDI_DEV_T_NONE, cdip, "compatible",
9418 	    compatible, ncompatible) != DDI_PROP_SUCCESS) {
9419 		SATA_LOG_D((sata_hba_inst, CE_WARN,
9420 		    "sata_create_target_node: FAIL compatible props cdip 0x%p",
9421 		    (void *)cdip));
9422 		goto fail;
9423 	}
9424 
9425 
9426 	/*
9427 	 * Now, try to attach the driver. If probing of the device fails,
9428 	 * the target node may be removed
9429 	 */
9430 	rval = ndi_devi_online(cdip, NDI_ONLINE_ATTACH);
9431 
9432 	scsi_hba_nodename_compatible_free(nname, compatible);
9433 
9434 	if (rval == NDI_SUCCESS)
9435 		return (cdip);
9436 
9437 	/* target node was removed - are we sure? */
9438 	return (NULL);
9439 
9440 fail:
9441 	scsi_hba_nodename_compatible_free(nname, compatible);
9442 	ddi_prop_remove_all(cdip);
9443 	rval = ndi_devi_free(cdip);
9444 	if (rval != NDI_SUCCESS) {
9445 		SATA_LOG_D((sata_hba_inst, CE_WARN, "sata_create_target_node: "
9446 		    "node removal failed %d", rval));
9447 	}
9448 	sata_log(sata_hba_inst, CE_WARN, "sata_create_target_node: "
9449 	    "cannot create target node for SATA device at port %d",
9450 	    sata_addr->cport);
9451 	return (NULL);
9452 }
9453 
9454 
9455 
9456 /*
9457  * Re-probe sata port, check for a device and attach info
9458  * structures when necessary. Identify Device data is fetched, if possible.
9459  * Assumption: sata address is already validated.
9460  * SATA_SUCCESS is returned if port is re-probed sucessfully, regardless of
9461  * the presence of a device and its type.
9462  *
9463  * flag arg specifies that the function should try multiple times to identify
9464  * device type and to initialize it, or it should return immediately on failure.
9465  * SATA_DEV_IDENTIFY_RETRY - retry
9466  * SATA_DEV_IDENTIFY_NORETRY - no retry
9467  *
9468  * SATA_FAILURE is returned if one of the operations failed.
9469  *
9470  * This function cannot be called in interrupt context - it may sleep.
9471  */
9472 static int
9473 sata_reprobe_port(sata_hba_inst_t *sata_hba_inst, sata_device_t *sata_device,
9474     int flag)
9475 {
9476 	sata_cport_info_t *cportinfo;
9477 	sata_drive_info_t *sdinfo;
9478 	boolean_t init_device = B_FALSE;
9479 	int prev_device_type = SATA_DTYPE_NONE;
9480 	int prev_device_settings = 0;
9481 	clock_t start_time;
9482 	int retry = B_FALSE;
9483 	int rval;
9484 
9485 	/* We only care about host sata cport for now */
9486 	cportinfo = SATA_CPORT_INFO(sata_hba_inst,
9487 	    sata_device->satadev_addr.cport);
9488 	sdinfo = SATA_CPORTINFO_DRV_INFO(cportinfo);
9489 	if (sdinfo != NULL) {
9490 		/*
9491 		 * We are re-probing port with a previously attached device.
9492 		 * Save previous device type and settings
9493 		 */
9494 		prev_device_type = cportinfo->cport_dev_type;
9495 		prev_device_settings = sdinfo->satadrv_settings;
9496 	}
9497 	if (flag == SATA_DEV_IDENTIFY_RETRY) {
9498 		start_time = ddi_get_lbolt();
9499 		retry = B_TRUE;
9500 	}
9501 retry_probe:
9502 
9503 	/* probe port */
9504 	mutex_enter(&cportinfo->cport_mutex);
9505 	cportinfo->cport_state &= ~SATA_PORT_STATE_CLEAR_MASK;
9506 	cportinfo->cport_state |= SATA_STATE_PROBING;
9507 	mutex_exit(&cportinfo->cport_mutex);
9508 
9509 	rval = (*SATA_PROBE_PORT_FUNC(sata_hba_inst))
9510 	    (SATA_DIP(sata_hba_inst), sata_device);
9511 
9512 	mutex_enter(&cportinfo->cport_mutex);
9513 	if (rval != SATA_SUCCESS) {
9514 		cportinfo->cport_state = SATA_PSTATE_FAILED;
9515 		mutex_exit(&cportinfo->cport_mutex);
9516 		SATA_LOG_D((sata_hba_inst, CE_WARN, "sata_reprobe_port: "
9517 		    "SATA port %d probing failed",
9518 		    cportinfo->cport_addr.cport));
9519 		return (SATA_FAILURE);
9520 	}
9521 
9522 	/*
9523 	 * update sata port state and set device type
9524 	 */
9525 	sata_update_port_info(sata_hba_inst, sata_device);
9526 	cportinfo->cport_state &= ~SATA_STATE_PROBING;
9527 
9528 	/*
9529 	 * Sanity check - Port is active? Is the link active?
9530 	 * Is there any device attached?
9531 	 */
9532 	if ((cportinfo->cport_state &
9533 	    (SATA_PSTATE_SHUTDOWN | SATA_PSTATE_FAILED)) ||
9534 	    (cportinfo->cport_scr.sstatus & SATA_PORT_DEVLINK_UP_MASK) !=
9535 	    SATA_PORT_DEVLINK_UP) {
9536 		/*
9537 		 * Port in non-usable state or no link active/no device.
9538 		 * Free info structure if necessary (direct attached drive
9539 		 * only, for now!
9540 		 */
9541 		sdinfo = SATA_CPORTINFO_DRV_INFO(cportinfo);
9542 		SATA_CPORTINFO_DRV_INFO(cportinfo) = NULL;
9543 		/* Add here differentiation for device attached or not */
9544 		cportinfo->cport_dev_type = SATA_DTYPE_NONE;
9545 		mutex_exit(&cportinfo->cport_mutex);
9546 		if (sdinfo != NULL)
9547 			kmem_free(sdinfo, sizeof (sata_drive_info_t));
9548 		return (SATA_SUCCESS);
9549 	}
9550 
9551 	cportinfo->cport_state |= SATA_STATE_READY;
9552 	cportinfo->cport_dev_type = sata_device->satadev_type;
9553 	sdinfo = SATA_CPORTINFO_DRV_INFO(cportinfo);
9554 
9555 	/*
9556 	 * If we are re-probing the port, there may be
9557 	 * sata_drive_info structure attached
9558 	 * (or sata_pm_info, if PMult is supported).
9559 	 */
9560 	if (sata_device->satadev_type == SATA_DTYPE_NONE) {
9561 		/*
9562 		 * There is no device, so remove device info structure,
9563 		 * if necessary. Direct attached drive only!
9564 		 */
9565 		SATA_CPORTINFO_DRV_INFO(cportinfo) = NULL;
9566 		cportinfo->cport_dev_type = SATA_DTYPE_NONE;
9567 		if (sdinfo != NULL) {
9568 			kmem_free(sdinfo, sizeof (sata_drive_info_t));
9569 			sata_log(sata_hba_inst, CE_WARN,
9570 			    "SATA device detached "
9571 			    "from port %d", cportinfo->cport_addr.cport);
9572 		}
9573 		mutex_exit(&cportinfo->cport_mutex);
9574 		return (SATA_SUCCESS);
9575 	}
9576 
9577 	if (sata_device->satadev_type != SATA_DTYPE_PMULT) {
9578 		if (sdinfo == NULL) {
9579 			/*
9580 			 * There is some device attached, but there is
9581 			 * no sata_drive_info structure - allocate one
9582 			 */
9583 			mutex_exit(&cportinfo->cport_mutex);
9584 			sdinfo = kmem_zalloc(
9585 			    sizeof (sata_drive_info_t), KM_SLEEP);
9586 			mutex_enter(&cportinfo->cport_mutex);
9587 			/*
9588 			 * Recheck, that the port state did not change when we
9589 			 * released mutex.
9590 			 */
9591 			if (cportinfo->cport_state & SATA_STATE_READY) {
9592 				SATA_CPORTINFO_DRV_INFO(cportinfo) = sdinfo;
9593 				sdinfo->satadrv_addr = cportinfo->cport_addr;
9594 				sdinfo->satadrv_addr.qual = SATA_ADDR_DCPORT;
9595 				sdinfo->satadrv_type = SATA_DTYPE_UNKNOWN;
9596 				sdinfo->satadrv_state = SATA_STATE_UNKNOWN;
9597 			} else {
9598 				/*
9599 				 * Port is not in ready state, we
9600 				 * cannot attach a device.
9601 				 */
9602 				mutex_exit(&cportinfo->cport_mutex);
9603 				kmem_free(sdinfo, sizeof (sata_drive_info_t));
9604 				return (SATA_SUCCESS);
9605 			}
9606 			/*
9607 			 * Since we are adding device, presumably new one,
9608 			 * indicate that it  should be initalized,
9609 			 * as well as some internal framework states).
9610 			 */
9611 			init_device = B_TRUE;
9612 		}
9613 		cportinfo->cport_dev_type = SATA_DTYPE_UNKNOWN;
9614 		sata_device->satadev_addr.qual = sdinfo->satadrv_addr.qual;
9615 	} else {
9616 		/*
9617 		 * The device is a port multiplier - not handled now.
9618 		 */
9619 		cportinfo->cport_dev_type = SATA_DTYPE_UNKNOWN;
9620 		mutex_exit(&cportinfo->cport_mutex);
9621 		return (SATA_SUCCESS);
9622 	}
9623 	mutex_exit(&cportinfo->cport_mutex);
9624 	/*
9625 	 * Figure out what kind of device we are really
9626 	 * dealing with.
9627 	 */
9628 	rval = sata_probe_device(sata_hba_inst, sata_device);
9629 
9630 	if (rval == SATA_SUCCESS) {
9631 		/*
9632 		 * If we are dealing with the same type of a device as before,
9633 		 * restore its settings flags.
9634 		 */
9635 		if (sata_device->satadev_type == prev_device_type)
9636 			sdinfo->satadrv_settings = prev_device_settings;
9637 
9638 		/* Set initial device features, if necessary */
9639 		if (init_device == B_TRUE) {
9640 			rval = sata_initialize_device(sata_hba_inst, sdinfo);
9641 		}
9642 		if (rval == SATA_SUCCESS)
9643 			return (rval);
9644 	}
9645 
9646 	if (retry) {
9647 		clock_t cur_time = ddi_get_lbolt();
9648 		/*
9649 		 * A device was not successfully identified or initialized.
9650 		 * Track retry time for device identification.
9651 		 */
9652 		if ((cur_time - start_time) <
9653 		    drv_usectohz(SATA_DEV_IDENTIFY_TIMEOUT)) {
9654 			/* sleep for a while */
9655 			delay(drv_usectohz(SATA_DEV_IDENTIFY_RETRY_DELAY));
9656 			goto retry_probe;
9657 		}
9658 	}
9659 	return (rval);
9660 }
9661 
9662 /*
9663  * Initialize device
9664  * Specified device is initialized to a default state.
9665  *
9666  * Returns SATA_SUCCESS if all device features are set successfully,
9667  * SATA_FAILURE otherwise
9668  */
9669 static int
9670 sata_initialize_device(sata_hba_inst_t *sata_hba_inst,
9671     sata_drive_info_t *sdinfo)
9672 {
9673 	int rval;
9674 
9675 	sata_save_drive_settings(sdinfo);
9676 
9677 	sdinfo->satadrv_settings |= SATA_DEV_READ_AHEAD;
9678 
9679 	sata_init_write_cache_mode(sdinfo);
9680 
9681 	rval = sata_set_drive_features(sata_hba_inst, sdinfo, 0);
9682 
9683 	/* Determine current data transfer mode */
9684 	if ((sdinfo->satadrv_id.ai_cap & SATA_DMA_SUPPORT) == 0) {
9685 		sdinfo->satadrv_settings &= ~SATA_DEV_DMA;
9686 	} else if ((sdinfo->satadrv_id.ai_validinfo &
9687 	    SATA_VALIDINFO_88) != 0 &&
9688 	    (sdinfo->satadrv_id.ai_ultradma & SATA_UDMA_SEL_MASK) != 0) {
9689 		sdinfo->satadrv_settings |= SATA_DEV_DMA;
9690 	} else if ((sdinfo->satadrv_id.ai_dworddma &
9691 	    SATA_MDMA_SEL_MASK) != 0) {
9692 		sdinfo->satadrv_settings |= SATA_DEV_DMA;
9693 	} else
9694 		/* DMA supported, not no DMA transfer mode is selected !? */
9695 		sdinfo->satadrv_settings &= ~SATA_DEV_DMA;
9696 
9697 	return (rval);
9698 }
9699 
9700 
9701 /*
9702  * Initialize write cache mode.
9703  *
9704  * The default write cache setting for SATA HDD is provided by sata_write_cache
9705  * static variable. ATAPI CD/DVDs devices have write cache default is
9706  * determined by sata_atapicdvd_write_cache static variable.
9707  * 1 - enable
9708  * 0 - disable
9709  * any other value - current drive setting
9710  *
9711  * Although there is not reason to disable write cache on CD/DVD devices,
9712  * the default setting control is provided for the maximun flexibility.
9713  *
9714  * In the future, it may be overridden by the
9715  * disk-write-cache-enable property setting, if it is defined.
9716  * Returns SATA_SUCCESS if all device features are set successfully,
9717  * SATA_FAILURE otherwise.
9718  */
9719 static void
9720 sata_init_write_cache_mode(sata_drive_info_t *sdinfo)
9721 {
9722 	if (sdinfo->satadrv_type == SATA_DTYPE_ATADISK) {
9723 		if (sata_write_cache == 1)
9724 			sdinfo->satadrv_settings |= SATA_DEV_WRITE_CACHE;
9725 		else if (sata_write_cache == 0)
9726 			sdinfo->satadrv_settings &= ~SATA_DEV_WRITE_CACHE;
9727 		/*
9728 		 * When sata_write_cache value is not 0 or 1,
9729 		 * a current setting of the drive's write cache is used.
9730 		 */
9731 	} else { /* Assume ATAPI CD/DVD device */
9732 		if (sata_atapicdvd_write_cache == 1)
9733 			sdinfo->satadrv_settings |= SATA_DEV_WRITE_CACHE;
9734 		else if (sata_atapicdvd_write_cache == 0)
9735 			sdinfo->satadrv_settings &= ~SATA_DEV_WRITE_CACHE;
9736 		/*
9737 		 * When sata_write_cache value is not 0 or 1,
9738 		 * a current setting of the drive's write cache is used.
9739 		 */
9740 	}
9741 }
9742 
9743 
9744 /*
9745  * Validate sata address.
9746  * Specified cport, pmport and qualifier has to match
9747  * passed sata_scsi configuration info.
9748  * The presence of an attached device is not verified.
9749  *
9750  * Returns 0 when address is valid, -1 otherwise.
9751  */
9752 static int
9753 sata_validate_sata_address(sata_hba_inst_t *sata_hba_inst, int cport,
9754 	int pmport, int qual)
9755 {
9756 	if (qual == SATA_ADDR_DCPORT && pmport != 0)
9757 		goto invalid_address;
9758 	if (cport >= SATA_NUM_CPORTS(sata_hba_inst))
9759 		goto invalid_address;
9760 	if ((qual == SATA_ADDR_DPMPORT || qual == SATA_ADDR_PMPORT) &&
9761 	    ((SATA_CPORT_DEV_TYPE(sata_hba_inst, cport) != SATA_DTYPE_PMULT) ||
9762 	    (SATA_PMULT_INFO(sata_hba_inst, cport) == NULL) ||
9763 	    (pmport >= SATA_NUM_PMPORTS(sata_hba_inst, cport))))
9764 		goto invalid_address;
9765 
9766 	return (0);
9767 
9768 invalid_address:
9769 	return (-1);
9770 
9771 }
9772 
9773 /*
9774  * Validate scsi address
9775  * SCSI target address is translated into SATA cport/pmport and compared
9776  * with a controller port/device configuration. LUN has to be 0.
9777  * Returns 0 if a scsi target refers to an attached device,
9778  * returns 1 if address is valid but device is not attached,
9779  * returns -1 if bad address or device is of an unsupported type.
9780  * Upon return sata_device argument is set.
9781  */
9782 static int
9783 sata_validate_scsi_address(sata_hba_inst_t *sata_hba_inst,
9784 	struct scsi_address *ap, sata_device_t *sata_device)
9785 {
9786 	int cport, pmport, qual, rval;
9787 
9788 	rval = -1;	/* Invalid address */
9789 	if (ap->a_lun != 0)
9790 		goto out;
9791 
9792 	qual = SCSI_TO_SATA_ADDR_QUAL(ap->a_target);
9793 	cport = SCSI_TO_SATA_CPORT(ap->a_target);
9794 	pmport = SCSI_TO_SATA_PMPORT(ap->a_target);
9795 
9796 	if (qual != SATA_ADDR_DCPORT && qual != SATA_ADDR_DPMPORT)
9797 		goto out;
9798 
9799 	if (sata_validate_sata_address(sata_hba_inst, cport, pmport, qual) ==
9800 	    0) {
9801 
9802 		sata_cport_info_t *cportinfo;
9803 		sata_pmult_info_t *pmultinfo;
9804 		sata_drive_info_t *sdinfo = NULL;
9805 
9806 		rval = 1;	/* Valid sata address */
9807 
9808 		cportinfo = SATA_CPORT_INFO(sata_hba_inst, cport);
9809 		if (qual == SATA_ADDR_DCPORT) {
9810 			if (cportinfo == NULL ||
9811 			    cportinfo->cport_dev_type == SATA_DTYPE_NONE)
9812 				goto out;
9813 
9814 			if (cportinfo->cport_dev_type == SATA_DTYPE_PMULT ||
9815 			    (cportinfo->cport_dev_type &
9816 			    SATA_VALID_DEV_TYPE) == 0) {
9817 				rval = -1;
9818 				goto out;
9819 			}
9820 			sdinfo = SATA_CPORTINFO_DRV_INFO(cportinfo);
9821 
9822 		} else if (qual == SATA_ADDR_DPMPORT) {
9823 			pmultinfo = SATA_CPORTINFO_PMULT_INFO(cportinfo);
9824 			if (pmultinfo == NULL) {
9825 				rval = -1;
9826 				goto out;
9827 			}
9828 			if (SATA_PMPORT_INFO(sata_hba_inst, cport, pmport) ==
9829 			    NULL ||
9830 			    SATA_PMPORT_DEV_TYPE(sata_hba_inst, cport,
9831 			    pmport) == SATA_DTYPE_NONE)
9832 				goto out;
9833 
9834 			sdinfo = SATA_PMPORT_DRV_INFO(sata_hba_inst, cport,
9835 			    pmport);
9836 		} else {
9837 			rval = -1;
9838 			goto out;
9839 		}
9840 		if ((sdinfo == NULL) ||
9841 		    (sdinfo->satadrv_type & SATA_VALID_DEV_TYPE) == 0)
9842 			goto out;
9843 
9844 		sata_device->satadev_type = sdinfo->satadrv_type;
9845 		sata_device->satadev_addr.qual = qual;
9846 		sata_device->satadev_addr.cport = cport;
9847 		sata_device->satadev_addr.pmport = pmport;
9848 		sata_device->satadev_rev = SATA_DEVICE_REV_1;
9849 		return (0);
9850 	}
9851 out:
9852 	if (rval == 1) {
9853 		SATADBG2(SATA_DBG_SCSI_IF, sata_hba_inst,
9854 		    "sata_validate_scsi_address: no valid target %x lun %x",
9855 		    ap->a_target, ap->a_lun);
9856 	}
9857 	return (rval);
9858 }
9859 
9860 /*
9861  * Find dip corresponding to passed device number
9862  *
9863  * Returns NULL if invalid device number is passed or device cannot be found,
9864  * Returns dip is device is found.
9865  */
9866 static dev_info_t *
9867 sata_devt_to_devinfo(dev_t dev)
9868 {
9869 	dev_info_t *dip;
9870 #ifndef __lock_lint
9871 	struct devnames *dnp;
9872 	major_t major = getmajor(dev);
9873 	int instance = SATA_MINOR2INSTANCE(getminor(dev));
9874 
9875 	if (major >= devcnt)
9876 		return (NULL);
9877 
9878 	dnp = &devnamesp[major];
9879 	LOCK_DEV_OPS(&(dnp->dn_lock));
9880 	dip = dnp->dn_head;
9881 	while (dip && (ddi_get_instance(dip) != instance)) {
9882 		dip = ddi_get_next(dip);
9883 	}
9884 	UNLOCK_DEV_OPS(&(dnp->dn_lock));
9885 #endif
9886 
9887 	return (dip);
9888 }
9889 
9890 
9891 /*
9892  * Probe device.
9893  * This function issues Identify Device command and initializes local
9894  * sata_drive_info structure if the device can be identified.
9895  * The device type is determined by examining Identify Device
9896  * command response.
9897  * If the sata_hba_inst has linked drive info structure for this
9898  * device address, the Identify Device data is stored into sata_drive_info
9899  * structure linked to the port info structure.
9900  *
9901  * sata_device has to refer to the valid sata port(s) for HBA described
9902  * by sata_hba_inst structure.
9903  *
9904  * Returns:
9905  *	SATA_SUCCESS if device type was successfully probed and port-linked
9906  *		drive info structure was updated;
9907  * 	SATA_FAILURE if there is no device, or device was not probed
9908  *		successully;
9909  *	SATA_RETRY if device probe can be retried later.
9910  * If a device cannot be identified, sata_device's dev_state and dev_type
9911  * fields are set to unknown.
9912  * There are no retries in this function. Any retries should be managed by
9913  * the caller.
9914  */
9915 
9916 
9917 static int
9918 sata_probe_device(sata_hba_inst_t *sata_hba_inst, sata_device_t *sata_device)
9919 {
9920 	sata_drive_info_t *sdinfo;
9921 	sata_drive_info_t new_sdinfo;	/* local drive info struct */
9922 	int rval;
9923 
9924 	ASSERT((SATA_CPORT_STATE(sata_hba_inst,
9925 	    sata_device->satadev_addr.cport) &
9926 	    (SATA_STATE_PROBED | SATA_STATE_READY)) != 0);
9927 
9928 	sata_device->satadev_type = SATA_DTYPE_NONE;
9929 
9930 	mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst,
9931 	    sata_device->satadev_addr.cport)));
9932 
9933 	/* Get pointer to port-linked sata device info structure */
9934 	sdinfo = sata_get_device_info(sata_hba_inst, sata_device);
9935 	if (sdinfo != NULL) {
9936 		sdinfo->satadrv_state &=
9937 		    ~(SATA_STATE_PROBED | SATA_STATE_READY);
9938 		sdinfo->satadrv_state |= SATA_STATE_PROBING;
9939 	} else {
9940 		/* No device to probe */
9941 		mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
9942 		    sata_device->satadev_addr.cport)));
9943 		sata_device->satadev_type = SATA_DTYPE_NONE;
9944 		sata_device->satadev_state = SATA_STATE_UNKNOWN;
9945 		return (SATA_FAILURE);
9946 	}
9947 	/*
9948 	 * Need to issue both types of identify device command and
9949 	 * determine device type by examining retreived data/status.
9950 	 * First, ATA Identify Device.
9951 	 */
9952 	bzero(&new_sdinfo, sizeof (sata_drive_info_t));
9953 	new_sdinfo.satadrv_addr = sata_device->satadev_addr;
9954 	mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
9955 	    sata_device->satadev_addr.cport)));
9956 	new_sdinfo.satadrv_type = SATA_DTYPE_ATADISK;
9957 	rval = sata_identify_device(sata_hba_inst, &new_sdinfo);
9958 	if (rval == SATA_RETRY) {
9959 		/* We may try to check for ATAPI device */
9960 		if (SATA_FEATURES(sata_hba_inst) & SATA_CTLF_ATAPI) {
9961 			/*
9962 			 * HBA supports ATAPI - try to issue Identify Packet
9963 			 * Device command.
9964 			 */
9965 			new_sdinfo.satadrv_type = SATA_DTYPE_ATAPICD;
9966 			rval = sata_identify_device(sata_hba_inst, &new_sdinfo);
9967 		}
9968 	}
9969 	if (rval == SATA_SUCCESS) {
9970 		/*
9971 		 * Got something responding positively to ATA Identify Device
9972 		 * or to Identify Packet Device cmd.
9973 		 * Save last used device type.
9974 		 */
9975 		sata_device->satadev_type = new_sdinfo.satadrv_type;
9976 
9977 		/* save device info, if possible */
9978 		mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst,
9979 		    sata_device->satadev_addr.cport)));
9980 		sdinfo = sata_get_device_info(sata_hba_inst, sata_device);
9981 		if (sdinfo == NULL) {
9982 			mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
9983 			    sata_device->satadev_addr.cport)));
9984 			return (SATA_FAILURE);
9985 		}
9986 		/*
9987 		 * Copy drive info into the port-linked drive info structure.
9988 		 */
9989 		*sdinfo = new_sdinfo;
9990 		sdinfo->satadrv_state &= ~SATA_STATE_PROBING;
9991 		sdinfo->satadrv_state |= SATA_STATE_PROBED;
9992 		if (sata_device->satadev_addr.qual == SATA_ADDR_DCPORT)
9993 			SATA_CPORT_DEV_TYPE(sata_hba_inst,
9994 			    sata_device->satadev_addr.cport) =
9995 			    sdinfo->satadrv_type;
9996 		else /* SATA_ADDR_DPMPORT */
9997 			SATA_PMPORT_DEV_TYPE(sata_hba_inst,
9998 			    sata_device->satadev_addr.cport,
9999 			    sata_device->satadev_addr.pmport) =
10000 			    sdinfo->satadrv_type;
10001 		mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
10002 		    sata_device->satadev_addr.cport)));
10003 		return (SATA_SUCCESS);
10004 	}
10005 
10006 	/*
10007 	 * It may be SATA_RETRY or SATA_FAILURE return.
10008 	 * Looks like we cannot determine the device type at this time.
10009 	 */
10010 	mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst,
10011 	    sata_device->satadev_addr.cport)));
10012 	sdinfo = sata_get_device_info(sata_hba_inst, sata_device);
10013 	if (sdinfo != NULL) {
10014 		sata_device->satadev_type = SATA_DTYPE_UNKNOWN;
10015 		sdinfo->satadrv_type = SATA_DTYPE_UNKNOWN;
10016 		sdinfo->satadrv_state &= ~SATA_STATE_PROBING;
10017 		sdinfo->satadrv_state = SATA_STATE_PROBED;
10018 		if (sata_device->satadev_addr.qual == SATA_ADDR_DCPORT)
10019 			SATA_CPORT_DEV_TYPE(sata_hba_inst,
10020 			    sata_device->satadev_addr.cport) =
10021 			    SATA_DTYPE_UNKNOWN;
10022 		else {
10023 			/* SATA_ADDR_DPMPORT */
10024 			if ((SATA_PMULT_INFO(sata_hba_inst,
10025 			    sata_device->satadev_addr.cport) != NULL) &&
10026 			    (SATA_PMPORT_INFO(sata_hba_inst,
10027 			    sata_device->satadev_addr.cport,
10028 			    sata_device->satadev_addr.pmport) != NULL))
10029 				SATA_PMPORT_DEV_TYPE(sata_hba_inst,
10030 				    sata_device->satadev_addr.cport,
10031 				    sata_device->satadev_addr.pmport) =
10032 				    SATA_DTYPE_UNKNOWN;
10033 		}
10034 	}
10035 	mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
10036 	    sata_device->satadev_addr.cport)));
10037 	return (rval);
10038 }
10039 
10040 
10041 /*
10042  * Get pointer to sata_drive_info structure.
10043  *
10044  * The sata_device has to contain address (cport, pmport and qualifier) for
10045  * specified sata_scsi structure.
10046  *
10047  * Returns NULL if device address is not valid for this HBA configuration.
10048  * Otherwise, returns a pointer to sata_drive_info structure.
10049  *
10050  * This function should be called with a port mutex held.
10051  */
10052 static sata_drive_info_t *
10053 sata_get_device_info(sata_hba_inst_t *sata_hba_inst,
10054     sata_device_t *sata_device)
10055 {
10056 	uint8_t cport = sata_device->satadev_addr.cport;
10057 	uint8_t pmport = sata_device->satadev_addr.pmport;
10058 	uint8_t qual = sata_device->satadev_addr.qual;
10059 
10060 	if (cport >= SATA_NUM_CPORTS(sata_hba_inst))
10061 		return (NULL);
10062 
10063 	if (!(SATA_CPORT_STATE(sata_hba_inst, cport) &
10064 	    (SATA_STATE_PROBED | SATA_STATE_READY)))
10065 		/* Port not probed yet */
10066 		return (NULL);
10067 
10068 	if (SATA_CPORT_DEV_TYPE(sata_hba_inst, cport) == SATA_DTYPE_NONE)
10069 		return (NULL);
10070 
10071 	if (qual == SATA_ADDR_DCPORT) {
10072 		/* Request for a device on a controller port */
10073 		if (SATA_CPORT_DEV_TYPE(sata_hba_inst, cport) ==
10074 		    SATA_DTYPE_PMULT)
10075 			/* Port multiplier attached */
10076 			return (NULL);
10077 		return (SATA_CPORT_DRV_INFO(sata_hba_inst, cport));
10078 	}
10079 	if (qual == SATA_ADDR_DPMPORT) {
10080 		if (SATA_CPORT_DEV_TYPE(sata_hba_inst, cport) !=
10081 		    SATA_DTYPE_PMULT)
10082 			return (NULL);
10083 
10084 		if (pmport > SATA_NUM_PMPORTS(sata_hba_inst, cport))
10085 			return (NULL);
10086 
10087 		return (SATA_PMPORT_DRV_INFO(sata_hba_inst, cport, pmport));
10088 	}
10089 
10090 	/* we should not get here */
10091 	return (NULL);
10092 }
10093 
10094 
10095 /*
10096  * sata_identify_device.
10097  * Send Identify Device command to SATA HBA driver.
10098  * If command executes successfully, update sata_drive_info structure pointed
10099  * to by sdinfo argument, including Identify Device data.
10100  * If command fails, invalidate data in sata_drive_info.
10101  *
10102  * Cannot be called from interrupt level.
10103  *
10104  * Returns:
10105  * SATA_SUCCESS if the device was identified as a supported device,
10106  * SATA_RETRY if the device was not identified but could be retried,
10107  * SATA_FAILURE if the device was not identified and identify attempt
10108  *	should not be retried.
10109  */
10110 static int
10111 sata_identify_device(sata_hba_inst_t *sata_hba_inst,
10112     sata_drive_info_t *sdinfo)
10113 {
10114 	uint16_t cfg_word;
10115 	int rval;
10116 
10117 	/* fetch device identify data */
10118 	if ((rval = sata_fetch_device_identify_data(sata_hba_inst,
10119 	    sdinfo)) != 0)
10120 		goto fail_unknown;
10121 
10122 	cfg_word = sdinfo->satadrv_id.ai_config;
10123 	if (sdinfo->satadrv_type == SATA_DTYPE_ATADISK &&
10124 	    (cfg_word & SATA_ATA_TYPE_MASK) != SATA_ATA_TYPE) {
10125 		/* Change device type to reflect Identify Device data */
10126 		if (((cfg_word & SATA_ATAPI_TYPE_MASK) ==
10127 		    SATA_ATAPI_TYPE) &&
10128 		    ((cfg_word & SATA_ATAPI_ID_DEV_TYPE) ==
10129 		    SATA_ATAPI_CDROM_DEV)) {
10130 			sdinfo->satadrv_type = SATA_DTYPE_ATAPICD;
10131 		} else {
10132 			sdinfo->satadrv_type = SATA_DTYPE_UNKNOWN;
10133 		}
10134 	} else if (sdinfo->satadrv_type == SATA_DTYPE_ATAPICD &&
10135 	    (((cfg_word & SATA_ATAPI_TYPE_MASK) != SATA_ATAPI_TYPE) ||
10136 	    ((cfg_word & SATA_ATAPI_ID_DEV_TYPE) != SATA_ATAPI_CDROM_DEV))) {
10137 		/* Change device type to reflect Identify Device data ! */
10138 		if ((sdinfo->satadrv_id.ai_config & SATA_ATA_TYPE_MASK) ==
10139 		    SATA_ATA_TYPE) {
10140 			sdinfo->satadrv_type = SATA_DTYPE_ATADISK;
10141 		} else {
10142 			sdinfo->satadrv_type = SATA_DTYPE_UNKNOWN;
10143 		}
10144 	}
10145 	if (sdinfo->satadrv_type == SATA_DTYPE_ATADISK) {
10146 		if (sdinfo->satadrv_capacity == 0) {
10147 			/* Non-LBA disk. Too bad... */
10148 			sata_log(sata_hba_inst, CE_WARN,
10149 			    "SATA disk device at port %d does not support LBA",
10150 			    sdinfo->satadrv_addr.cport);
10151 			rval = SATA_FAILURE;
10152 			goto fail_unknown;
10153 		}
10154 	}
10155 #if 0
10156 	/* Left for historical reason */
10157 	/*
10158 	 * Some initial version of SATA spec indicated that at least
10159 	 * UDMA mode 4 has to be supported. It is not metioned in
10160 	 * SerialATA 2.6, so this restriction is removed.
10161 	 */
10162 	/* Check for Ultra DMA modes 6 through 0 being supported */
10163 	for (i = 6; i >= 0; --i) {
10164 		if (sdinfo->satadrv_id.ai_ultradma & (1 << i))
10165 			break;
10166 	}
10167 
10168 	/*
10169 	 * At least UDMA 4 mode has to be supported. If mode 4 or
10170 	 * higher are not supported by the device, fail this
10171 	 * device.
10172 	 */
10173 	if (i < 4) {
10174 		/* No required Ultra DMA mode supported */
10175 		sata_log(sata_hba_inst, CE_WARN,
10176 		    "SATA disk device at port %d does not support UDMA "
10177 		    "mode 4 or higher", sdinfo->satadrv_addr.cport);
10178 		SATA_LOG_D((sata_hba_inst, CE_WARN,
10179 		    "mode 4 or higher required, %d supported", i));
10180 		rval = SATA_FAILURE;
10181 		goto fail_unknown;
10182 	}
10183 #endif
10184 
10185 	return (SATA_SUCCESS);
10186 
10187 fail_unknown:
10188 	/* Invalidate sata_drive_info ? */
10189 	sdinfo->satadrv_type = SATA_DTYPE_UNKNOWN;
10190 	sdinfo->satadrv_state = SATA_STATE_UNKNOWN;
10191 	return (rval);
10192 }
10193 
10194 /*
10195  * Log/display device information
10196  */
10197 static void
10198 sata_show_drive_info(sata_hba_inst_t *sata_hba_inst,
10199     sata_drive_info_t *sdinfo)
10200 {
10201 	int valid_version;
10202 	char msg_buf[MAXPATHLEN];
10203 	int i;
10204 
10205 	/* Show HBA path */
10206 	(void) ddi_pathname(SATA_DIP(sata_hba_inst), msg_buf);
10207 
10208 	cmn_err(CE_CONT, "?%s :\n", msg_buf);
10209 
10210 	if (sdinfo->satadrv_type == SATA_DTYPE_UNKNOWN) {
10211 		(void) sprintf(msg_buf,
10212 		    "Unsupported SATA device type (cfg 0x%x) at ",
10213 		    sdinfo->satadrv_id.ai_config);
10214 	} else {
10215 		(void) sprintf(msg_buf, "SATA %s device at",
10216 		    sdinfo->satadrv_type == SATA_DTYPE_ATADISK ?
10217 		    "disk":"CD/DVD (ATAPI)");
10218 	}
10219 	if (sdinfo->satadrv_addr.qual == SATA_ADDR_DCPORT)
10220 		cmn_err(CE_CONT, "?\t%s port %d\n",
10221 		    msg_buf, sdinfo->satadrv_addr.cport);
10222 	else
10223 		cmn_err(CE_CONT, "?\t%s port %d pmport %d\n",
10224 		    msg_buf, sdinfo->satadrv_addr.cport,
10225 		    sdinfo->satadrv_addr.pmport);
10226 
10227 	bcopy(&sdinfo->satadrv_id.ai_model, msg_buf,
10228 	    sizeof (sdinfo->satadrv_id.ai_model));
10229 	swab(msg_buf, msg_buf, sizeof (sdinfo->satadrv_id.ai_model));
10230 	msg_buf[sizeof (sdinfo->satadrv_id.ai_model)] = '\0';
10231 	cmn_err(CE_CONT, "?\tmodel %s\n", msg_buf);
10232 
10233 	bcopy(&sdinfo->satadrv_id.ai_fw, msg_buf,
10234 	    sizeof (sdinfo->satadrv_id.ai_fw));
10235 	swab(msg_buf, msg_buf, sizeof (sdinfo->satadrv_id.ai_fw));
10236 	msg_buf[sizeof (sdinfo->satadrv_id.ai_fw)] = '\0';
10237 	cmn_err(CE_CONT, "?\tfirmware %s\n", msg_buf);
10238 
10239 	bcopy(&sdinfo->satadrv_id.ai_drvser, msg_buf,
10240 	    sizeof (sdinfo->satadrv_id.ai_drvser));
10241 	swab(msg_buf, msg_buf, sizeof (sdinfo->satadrv_id.ai_drvser));
10242 	msg_buf[sizeof (sdinfo->satadrv_id.ai_drvser)] = '\0';
10243 	if (sdinfo->satadrv_type == SATA_DTYPE_ATADISK) {
10244 		cmn_err(CE_CONT, "?\tserial number %s\n", msg_buf);
10245 	} else {
10246 		/* Assuming ATAPI CD/DVD */
10247 		/*
10248 		 * SOme drives do not implement serial number and may
10249 		 * violate the spec by provinding spaces rather than zeros
10250 		 * in serial number field. Scan the buffer to detect it.
10251 		 */
10252 		for (i = 0; i < sizeof (sdinfo->satadrv_id.ai_drvser); i++) {
10253 			if (msg_buf[i] != '\0' && msg_buf[i] != ' ')
10254 				break;
10255 		}
10256 		if (i == sizeof (sdinfo->satadrv_id.ai_drvser)) {
10257 			cmn_err(CE_CONT, "?\tserial number - none\n");
10258 		} else {
10259 			cmn_err(CE_CONT, "?\tserial number %s\n", msg_buf);
10260 		}
10261 	}
10262 
10263 #ifdef SATA_DEBUG
10264 	if (sdinfo->satadrv_id.ai_majorversion != 0 &&
10265 	    sdinfo->satadrv_id.ai_majorversion != 0xffff) {
10266 		int i;
10267 		for (i = 14; i >= 2; i--) {
10268 			if (sdinfo->satadrv_id.ai_majorversion & (1 << i)) {
10269 				valid_version = i;
10270 				break;
10271 			}
10272 		}
10273 		cmn_err(CE_CONT,
10274 		    "?\tATA/ATAPI-%d supported, majver 0x%x minver 0x%x\n",
10275 		    valid_version,
10276 		    sdinfo->satadrv_id.ai_majorversion,
10277 		    sdinfo->satadrv_id.ai_minorversion);
10278 	}
10279 #endif
10280 	/* Log some info */
10281 	cmn_err(CE_CONT, "?\tsupported features:\n");
10282 	msg_buf[0] = '\0';
10283 	if (sdinfo->satadrv_type == SATA_DTYPE_ATADISK) {
10284 		if (sdinfo->satadrv_features_support & SATA_DEV_F_LBA48)
10285 			(void) strlcat(msg_buf, "48-bit LBA, ", MAXPATHLEN);
10286 		else if (sdinfo->satadrv_features_support & SATA_DEV_F_LBA28)
10287 			(void) strlcat(msg_buf, "28-bit LBA, ", MAXPATHLEN);
10288 	}
10289 	if (sdinfo->satadrv_features_support & SATA_DEV_F_DMA)
10290 		(void) strlcat(msg_buf, "DMA", MAXPATHLEN);
10291 	if (sdinfo->satadrv_features_support & SATA_DEV_F_NCQ)
10292 		(void) strlcat(msg_buf, ", Native Command Queueing",
10293 		    MAXPATHLEN);
10294 	if (sdinfo->satadrv_features_support & SATA_DEV_F_TCQ)
10295 		(void) strlcat(msg_buf, ", Legacy Tagged Queuing", MAXPATHLEN);
10296 	if ((sdinfo->satadrv_id.ai_cmdset82 & SATA_SMART_SUPPORTED) &&
10297 	    (sdinfo->satadrv_id.ai_features85 & SATA_SMART_ENABLED))
10298 		(void) strlcat(msg_buf, ", SMART", MAXPATHLEN);
10299 	if ((sdinfo->satadrv_id.ai_cmdset84 & SATA_SMART_SELF_TEST_SUPPORTED) &&
10300 	    (sdinfo->satadrv_id.ai_features87 & SATA_SMART_SELF_TEST_SUPPORTED))
10301 		(void) strlcat(msg_buf, ", SMART self-test", MAXPATHLEN);
10302 	cmn_err(CE_CONT, "?\t %s\n", msg_buf);
10303 	if (sdinfo->satadrv_features_support & SATA_DEV_F_SATA2)
10304 		cmn_err(CE_CONT, "?\tSATA Gen2 signaling speed (3.0Gbps)\n");
10305 	else if (sdinfo->satadrv_features_support & SATA_DEV_F_SATA1)
10306 		cmn_err(CE_CONT, "?\tSATA Gen1 signaling speed (1.5Gbps)\n");
10307 	if (sdinfo->satadrv_features_support &
10308 	    (SATA_DEV_F_TCQ | SATA_DEV_F_NCQ)) {
10309 		cmn_err(CE_CONT, "?\tQueue depth %d\n",
10310 		    sdinfo->satadrv_queue_depth);
10311 	}
10312 
10313 	if (sdinfo->satadrv_type == SATA_DTYPE_ATADISK) {
10314 #ifdef __i386
10315 		(void) sprintf(msg_buf, "\tcapacity = %llu sectors\n",
10316 		    sdinfo->satadrv_capacity);
10317 #else
10318 		(void) sprintf(msg_buf, "\tcapacity = %lu sectors\n",
10319 		    sdinfo->satadrv_capacity);
10320 #endif
10321 		cmn_err(CE_CONT, "?%s", msg_buf);
10322 	}
10323 }
10324 
10325 
10326 /*
10327  * sata_save_drive_settings extracts current setting of the device and stores
10328  * it for future reference, in case the device setup would need to be restored
10329  * after the device reset.
10330  *
10331  * For all devices read ahead and write cache settings are saved, if the
10332  * device supports these features at all.
10333  * For ATAPI devices the Removable Media Status Notification setting is saved.
10334  */
10335 static void
10336 sata_save_drive_settings(sata_drive_info_t *sdinfo)
10337 {
10338 	if ((sdinfo->satadrv_id.ai_cmdset82 & SATA_LOOK_AHEAD) ||
10339 	    (sdinfo->satadrv_id.ai_cmdset82 & SATA_WRITE_CACHE)) {
10340 
10341 		/* Current setting of Read Ahead (and Read Cache) */
10342 		if (sdinfo->satadrv_id.ai_features85 & SATA_LOOK_AHEAD)
10343 			sdinfo->satadrv_settings |= SATA_DEV_READ_AHEAD;
10344 		else
10345 			sdinfo->satadrv_settings &= ~SATA_DEV_READ_AHEAD;
10346 
10347 		/* Current setting of Write Cache */
10348 		if (sdinfo->satadrv_id.ai_features85 & SATA_WRITE_CACHE)
10349 			sdinfo->satadrv_settings |= SATA_DEV_WRITE_CACHE;
10350 		else
10351 			sdinfo->satadrv_settings &= ~SATA_DEV_WRITE_CACHE;
10352 	}
10353 
10354 	if (sdinfo->satadrv_type == SATA_DTYPE_ATAPICD) {
10355 		if (sdinfo->satadrv_id.ai_cmdset83 & SATA_RM_STATUS_NOTIFIC)
10356 			sdinfo->satadrv_settings |= SATA_DEV_RMSN;
10357 		else
10358 			sdinfo->satadrv_settings &= ~SATA_DEV_RMSN;
10359 	}
10360 }
10361 
10362 
10363 /*
10364  * sata_check_capacity function determines a disk capacity
10365  * and addressing mode (LBA28/LBA48) by examining a disk identify device data.
10366  *
10367  * NOTE: CHS mode is not supported! If a device does not support LBA,
10368  * this function is not called.
10369  *
10370  * Returns device capacity in number of blocks, i.e. largest addressable LBA+1
10371  */
10372 static uint64_t
10373 sata_check_capacity(sata_drive_info_t *sdinfo)
10374 {
10375 	uint64_t capacity = 0;
10376 	int i;
10377 
10378 	if (sdinfo->satadrv_type != SATA_DTYPE_ATADISK ||
10379 	    !sdinfo->satadrv_id.ai_cap & SATA_LBA_SUPPORT)
10380 		/* Capacity valid only for LBA-addressable disk devices */
10381 		return (0);
10382 
10383 	if ((sdinfo->satadrv_id.ai_validinfo & SATA_VALIDINFO_88) &&
10384 	    (sdinfo->satadrv_id.ai_cmdset83 & SATA_EXT48) &&
10385 	    (sdinfo->satadrv_id.ai_features86 & SATA_EXT48)) {
10386 		/* LBA48 mode supported and enabled */
10387 		sdinfo->satadrv_features_support |= SATA_DEV_F_LBA48 |
10388 		    SATA_DEV_F_LBA28;
10389 		for (i = 3;  i >= 0;  --i) {
10390 			capacity <<= 16;
10391 			capacity += sdinfo->satadrv_id.ai_addrsecxt[i];
10392 		}
10393 	} else {
10394 		capacity = sdinfo->satadrv_id.ai_addrsec[1];
10395 		capacity <<= 16;
10396 		capacity += sdinfo->satadrv_id.ai_addrsec[0];
10397 		if (capacity >= 0x1000000)
10398 			/* LBA28 mode */
10399 			sdinfo->satadrv_features_support |= SATA_DEV_F_LBA28;
10400 	}
10401 	return (capacity);
10402 }
10403 
10404 
10405 /*
10406  * Allocate consistent buffer for DMA transfer
10407  *
10408  * Cannot be called from interrupt level or with mutex held - it may sleep.
10409  *
10410  * Returns pointer to allocated buffer structure, or NULL if allocation failed.
10411  */
10412 static struct buf *
10413 sata_alloc_local_buffer(sata_pkt_txlate_t *spx, int len)
10414 {
10415 	struct scsi_address ap;
10416 	struct buf *bp;
10417 	ddi_dma_attr_t	cur_dma_attr;
10418 
10419 	ASSERT(spx->txlt_sata_pkt != NULL);
10420 	ap.a_hba_tran = spx->txlt_sata_hba_inst->satahba_scsi_tran;
10421 	ap.a_target = SATA_TO_SCSI_TARGET(
10422 	    spx->txlt_sata_pkt->satapkt_device.satadev_addr.cport,
10423 	    spx->txlt_sata_pkt->satapkt_device.satadev_addr.pmport,
10424 	    spx->txlt_sata_pkt->satapkt_device.satadev_addr.qual);
10425 	ap.a_lun = 0;
10426 
10427 	bp = scsi_alloc_consistent_buf(&ap, NULL, len,
10428 	    B_READ, SLEEP_FUNC, NULL);
10429 
10430 	if (bp != NULL) {
10431 		/* Allocate DMA resources for this buffer */
10432 		spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp = bp;
10433 		/*
10434 		 * We use a local version of the dma_attr, to account
10435 		 * for a device addressing limitations.
10436 		 * sata_adjust_dma_attr() will handle sdinfo == NULL which
10437 		 * will cause dma attributes to be adjusted to a lowest
10438 		 * acceptable level.
10439 		 */
10440 		sata_adjust_dma_attr(NULL,
10441 		    SATA_DMA_ATTR(spx->txlt_sata_hba_inst), &cur_dma_attr);
10442 
10443 		if (sata_dma_buf_setup(spx, PKT_CONSISTENT,
10444 		    SLEEP_FUNC, NULL, &cur_dma_attr) != DDI_SUCCESS) {
10445 			scsi_free_consistent_buf(bp);
10446 			spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp = NULL;
10447 			bp = NULL;
10448 		}
10449 	}
10450 	return (bp);
10451 }
10452 
10453 /*
10454  * Release local buffer (consistent buffer for DMA transfer) allocated
10455  * via sata_alloc_local_buffer().
10456  */
10457 static void
10458 sata_free_local_buffer(sata_pkt_txlate_t *spx)
10459 {
10460 	ASSERT(spx->txlt_sata_pkt != NULL);
10461 	ASSERT(spx->txlt_dma_cookie_list != NULL);
10462 	ASSERT(spx->txlt_dma_cookie_list_len != 0);
10463 	ASSERT(spx->txlt_buf_dma_handle != NULL);
10464 	ASSERT(spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp != NULL);
10465 
10466 	spx->txlt_sata_pkt->satapkt_cmd.satacmd_num_dma_cookies = 0;
10467 	spx->txlt_sata_pkt->satapkt_cmd.satacmd_dma_cookie_list = NULL;
10468 
10469 	/* Free DMA resources */
10470 	(void) ddi_dma_unbind_handle(spx->txlt_buf_dma_handle);
10471 	ddi_dma_free_handle(&spx->txlt_buf_dma_handle);
10472 	spx->txlt_buf_dma_handle = 0;
10473 
10474 	if (spx->txlt_dma_cookie_list != &spx->txlt_dma_cookie) {
10475 		kmem_free(spx->txlt_dma_cookie_list,
10476 		    spx->txlt_dma_cookie_list_len * sizeof (ddi_dma_cookie_t));
10477 		spx->txlt_dma_cookie_list = NULL;
10478 		spx->txlt_dma_cookie_list_len = 0;
10479 	}
10480 	/* Free buffer */
10481 	scsi_free_consistent_buf(spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp);
10482 	spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp = NULL;
10483 }
10484 
10485 
10486 
10487 
10488 /*
10489  * Allocate sata_pkt
10490  * Pkt structure version and embedded strcutures version are initialized.
10491  * sata_pkt and sata_pkt_txlate structures are cross-linked.
10492  *
10493  * Since this may be called in interrupt context by sata_scsi_init_pkt,
10494  * callback argument determines if it can sleep or not.
10495  * Hence, it should not be called from interrupt context.
10496  *
10497  * If successful, non-NULL pointer to a sata pkt is returned.
10498  * Upon failure, NULL pointer is returned.
10499  */
10500 static sata_pkt_t *
10501 sata_pkt_alloc(sata_pkt_txlate_t *spx, int (*callback)(caddr_t))
10502 {
10503 	sata_pkt_t *spkt;
10504 	int kmsflag;
10505 
10506 	kmsflag = (callback == SLEEP_FUNC) ? KM_SLEEP : KM_NOSLEEP;
10507 	spkt = kmem_zalloc(sizeof (sata_pkt_t), kmsflag);
10508 	if (spkt == NULL) {
10509 		SATA_LOG_D((spx->txlt_sata_hba_inst, CE_WARN,
10510 		    "sata_pkt_alloc: failed"));
10511 		return (NULL);
10512 	}
10513 	spkt->satapkt_rev = SATA_PKT_REV;
10514 	spkt->satapkt_cmd.satacmd_rev = SATA_CMD_REV;
10515 	spkt->satapkt_device.satadev_rev = SATA_DEVICE_REV;
10516 	spkt->satapkt_framework_private = spx;
10517 	spx->txlt_sata_pkt = spkt;
10518 	return (spkt);
10519 }
10520 
10521 /*
10522  * Free sata pkt allocated via sata_pkt_alloc()
10523  */
10524 static void
10525 sata_pkt_free(sata_pkt_txlate_t *spx)
10526 {
10527 	ASSERT(spx->txlt_sata_pkt != NULL);
10528 	ASSERT(spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp == NULL);
10529 	kmem_free(spx->txlt_sata_pkt, sizeof (sata_pkt_t));
10530 	spx->txlt_sata_pkt = NULL;
10531 }
10532 
10533 
10534 /*
10535  * Adjust DMA attributes.
10536  * SCSI cmds block count is up to 24 bits, SATA cmd block count vary
10537  * from 8 bits to 16 bits, depending on a command being used.
10538  * Limiting max block count arbitrarily to 256 for all read/write
10539  * commands may affects performance, so check both the device and
10540  * controller capability before adjusting dma attributes.
10541  */
10542 void
10543 sata_adjust_dma_attr(sata_drive_info_t *sdinfo, ddi_dma_attr_t *dma_attr,
10544     ddi_dma_attr_t *adj_dma_attr)
10545 {
10546 	uint32_t count_max;
10547 
10548 	/* Copy original attributes */
10549 	*adj_dma_attr = *dma_attr;
10550 	/*
10551 	 * Things to consider: device addressing capability,
10552 	 * "excessive" controller DMA capabilities.
10553 	 * If a device is being probed/initialized, there are
10554 	 * no device info - use default limits then.
10555 	 */
10556 	if (sdinfo == NULL) {
10557 		count_max = dma_attr->dma_attr_granular * 0x100;
10558 		if (dma_attr->dma_attr_count_max > count_max)
10559 			adj_dma_attr->dma_attr_count_max = count_max;
10560 		if (dma_attr->dma_attr_maxxfer > count_max)
10561 			adj_dma_attr->dma_attr_maxxfer = count_max;
10562 		return;
10563 	}
10564 
10565 	if (sdinfo->satadrv_type == SATA_DTYPE_ATADISK) {
10566 		if (sdinfo->satadrv_features_support & (SATA_DEV_F_LBA48)) {
10567 			/*
10568 			 * 16-bit sector count may be used - we rely on
10569 			 * the assumption that only read and write cmds
10570 			 * will request more than 256 sectors worth of data
10571 			 */
10572 			count_max = adj_dma_attr->dma_attr_granular * 0x10000;
10573 		} else {
10574 			/*
10575 			 * 8-bit sector count will be used - default limits
10576 			 * for dma attributes
10577 			 */
10578 			count_max = adj_dma_attr->dma_attr_granular * 0x100;
10579 		}
10580 		/*
10581 		 * Adjust controler dma attributes, if necessary
10582 		 */
10583 		if (dma_attr->dma_attr_count_max > count_max)
10584 			adj_dma_attr->dma_attr_count_max = count_max;
10585 		if (dma_attr->dma_attr_maxxfer > count_max)
10586 			adj_dma_attr->dma_attr_maxxfer = count_max;
10587 	}
10588 }
10589 
10590 
10591 /*
10592  * Allocate DMA resources for the buffer
10593  * This function handles initial DMA resource allocation as well as
10594  * DMA window shift and may be called repeatedly for the same DMA window
10595  * until all DMA cookies in the DMA window are processed.
10596  * To guarantee that there is always a coherent set of cookies to process
10597  * by SATA HBA driver (observing alignment, device granularity, etc.),
10598  * the number of slots for DMA cookies is equal to lesser of  a number of
10599  * cookies in a DMA window and a max number of scatter/gather entries.
10600  *
10601  * Returns DDI_SUCCESS upon successful operation.
10602  * Return failure code of a failing command or DDI_FAILURE when
10603  * internal cleanup failed.
10604  */
10605 static int
10606 sata_dma_buf_setup(sata_pkt_txlate_t *spx, int flags,
10607     int (*callback)(caddr_t), caddr_t arg,
10608     ddi_dma_attr_t *cur_dma_attr)
10609 {
10610 	int	rval;
10611 	off_t	offset;
10612 	size_t	size;
10613 	int	max_sg_len, req_len, i;
10614 	uint_t	dma_flags;
10615 	struct buf	*bp;
10616 	uint64_t	cur_txfer_len;
10617 
10618 
10619 	ASSERT(spx->txlt_sata_pkt != NULL);
10620 	bp = spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp;
10621 	ASSERT(bp != NULL);
10622 
10623 
10624 	if (spx->txlt_buf_dma_handle == NULL) {
10625 		/*
10626 		 * No DMA resources allocated so far - this is a first call
10627 		 * for this sata pkt.
10628 		 */
10629 		rval = ddi_dma_alloc_handle(SATA_DIP(spx->txlt_sata_hba_inst),
10630 		    cur_dma_attr, callback, arg, &spx->txlt_buf_dma_handle);
10631 
10632 		if (rval != DDI_SUCCESS) {
10633 			SATA_LOG_D((spx->txlt_sata_hba_inst, CE_WARN,
10634 			    "sata_dma_buf_setup: no buf DMA resources %x",
10635 			    rval));
10636 			return (rval);
10637 		}
10638 
10639 		if (bp->b_flags & B_READ)
10640 			dma_flags = DDI_DMA_READ;
10641 		else
10642 			dma_flags = DDI_DMA_WRITE;
10643 
10644 		if (flags & PKT_CONSISTENT)
10645 			dma_flags |= DDI_DMA_CONSISTENT;
10646 
10647 		if (flags & PKT_DMA_PARTIAL)
10648 			dma_flags |= DDI_DMA_PARTIAL;
10649 
10650 		/*
10651 		 * Check buffer alignment and size against dma attributes
10652 		 * Consider dma_attr_align only. There may be requests
10653 		 * with the size lower than device granularity, but they
10654 		 * will not read/write from/to the device, so no adjustment
10655 		 * is necessary. The dma_attr_minxfer theoretically should
10656 		 * be considered, but no HBA driver is checking it.
10657 		 */
10658 		if (IS_P2ALIGNED(bp->b_un.b_addr,
10659 		    cur_dma_attr->dma_attr_align)) {
10660 			rval = ddi_dma_buf_bind_handle(
10661 			    spx->txlt_buf_dma_handle,
10662 			    bp, dma_flags, callback, arg,
10663 			    &spx->txlt_dma_cookie,
10664 			    &spx->txlt_curwin_num_dma_cookies);
10665 		} else { /* Buffer is not aligned */
10666 
10667 			int	(*ddicallback)(caddr_t);
10668 			size_t	bufsz;
10669 
10670 			/* Check id sleeping is allowed */
10671 			ddicallback = (callback == NULL_FUNC) ?
10672 			    DDI_DMA_DONTWAIT : DDI_DMA_SLEEP;
10673 
10674 			SATADBG2(SATA_DBG_DMA_SETUP, spx->txlt_sata_hba_inst,
10675 			    "mis-aligned buffer: addr=0x%p, cnt=%lu",
10676 			    (void *)bp->b_un.b_addr, bp->b_bcount);
10677 
10678 			if (bp->b_flags & (B_PAGEIO|B_PHYS))
10679 				/*
10680 				 * CPU will need to access data in the buffer
10681 				 * (for copying) so map it.
10682 				 */
10683 				bp_mapin(bp);
10684 
10685 			ASSERT(spx->txlt_tmp_buf == NULL);
10686 
10687 			/* Buffer may be padded by ddi_dma_mem_alloc()! */
10688 			rval = ddi_dma_mem_alloc(
10689 			    spx->txlt_buf_dma_handle,
10690 			    bp->b_bcount,
10691 			    &sata_acc_attr,
10692 			    DDI_DMA_STREAMING,
10693 			    ddicallback, NULL,
10694 			    &spx->txlt_tmp_buf,
10695 			    &bufsz,
10696 			    &spx->txlt_tmp_buf_handle);
10697 
10698 			if (rval != DDI_SUCCESS) {
10699 				/* DMA mapping failed */
10700 				(void) ddi_dma_free_handle(
10701 				    &spx->txlt_buf_dma_handle);
10702 				spx->txlt_buf_dma_handle = NULL;
10703 #ifdef SATA_DEBUG
10704 				mbuffail_count++;
10705 #endif
10706 				SATADBG1(SATA_DBG_DMA_SETUP,
10707 				    spx->txlt_sata_hba_inst,
10708 				    "sata_dma_buf_setup: "
10709 				    "buf dma mem alloc failed %x\n", rval);
10710 				return (rval);
10711 			}
10712 			ASSERT(IS_P2ALIGNED(spx->txlt_tmp_buf,
10713 			    cur_dma_attr->dma_attr_align));
10714 
10715 #ifdef SATA_DEBUG
10716 			mbuf_count++;
10717 
10718 			if (bp->b_bcount != bufsz)
10719 				/*
10720 				 * This will require special handling, because
10721 				 * DMA cookies will be based on the temporary
10722 				 * buffer size, not the original buffer
10723 				 * b_bcount, so the residue may have to
10724 				 * be counted differently.
10725 				 */
10726 				SATADBG2(SATA_DBG_DMA_SETUP,
10727 				    spx->txlt_sata_hba_inst,
10728 				    "sata_dma_buf_setup: bp size %x != "
10729 				    "bufsz %x\n", bp->b_bcount, bufsz);
10730 #endif
10731 			if (dma_flags & DDI_DMA_WRITE) {
10732 				/*
10733 				 * Write operation - copy data into
10734 				 * an aligned temporary buffer. Buffer will be
10735 				 * synced for device by ddi_dma_addr_bind_handle
10736 				 */
10737 				bcopy(bp->b_un.b_addr, spx->txlt_tmp_buf,
10738 				    bp->b_bcount);
10739 			}
10740 
10741 			rval = ddi_dma_addr_bind_handle(
10742 			    spx->txlt_buf_dma_handle,
10743 			    NULL,
10744 			    spx->txlt_tmp_buf,
10745 			    bufsz, dma_flags, ddicallback, 0,
10746 			    &spx->txlt_dma_cookie,
10747 			    &spx->txlt_curwin_num_dma_cookies);
10748 		}
10749 
10750 		switch (rval) {
10751 		case DDI_DMA_PARTIAL_MAP:
10752 			SATADBG1(SATA_DBG_DMA_SETUP, spx->txlt_sata_hba_inst,
10753 			    "sata_dma_buf_setup: DMA Partial Map\n", NULL);
10754 			/*
10755 			 * Partial DMA mapping.
10756 			 * Retrieve number of DMA windows for this request.
10757 			 */
10758 			if (ddi_dma_numwin(spx->txlt_buf_dma_handle,
10759 			    &spx->txlt_num_dma_win) != DDI_SUCCESS) {
10760 				if (spx->txlt_tmp_buf != NULL) {
10761 					ddi_dma_mem_free(
10762 					    &spx->txlt_tmp_buf_handle);
10763 					spx->txlt_tmp_buf = NULL;
10764 				}
10765 				(void) ddi_dma_unbind_handle(
10766 				    spx->txlt_buf_dma_handle);
10767 				(void) ddi_dma_free_handle(
10768 				    &spx->txlt_buf_dma_handle);
10769 				spx->txlt_buf_dma_handle = NULL;
10770 				SATA_LOG_D((spx->txlt_sata_hba_inst, CE_WARN,
10771 				    "sata_dma_buf_setup: numwin failed\n"));
10772 				return (DDI_FAILURE);
10773 			}
10774 			SATADBG2(SATA_DBG_DMA_SETUP,
10775 			    spx->txlt_sata_hba_inst,
10776 			    "sata_dma_buf_setup: windows: %d, cookies: %d\n",
10777 			    spx->txlt_num_dma_win,
10778 			    spx->txlt_curwin_num_dma_cookies);
10779 			spx->txlt_cur_dma_win = 0;
10780 			break;
10781 
10782 		case DDI_DMA_MAPPED:
10783 			/* DMA fully mapped */
10784 			spx->txlt_num_dma_win = 1;
10785 			spx->txlt_cur_dma_win = 0;
10786 			SATADBG1(SATA_DBG_DMA_SETUP,
10787 			    spx->txlt_sata_hba_inst,
10788 			    "sata_dma_buf_setup: windows: 1 "
10789 			    "cookies: %d\n", spx->txlt_curwin_num_dma_cookies);
10790 			break;
10791 
10792 		default:
10793 			/* DMA mapping failed */
10794 			if (spx->txlt_tmp_buf != NULL) {
10795 				ddi_dma_mem_free(
10796 				    &spx->txlt_tmp_buf_handle);
10797 				spx->txlt_tmp_buf = NULL;
10798 			}
10799 			(void) ddi_dma_free_handle(&spx->txlt_buf_dma_handle);
10800 			spx->txlt_buf_dma_handle = NULL;
10801 			SATA_LOG_D((spx->txlt_sata_hba_inst, CE_WARN,
10802 			    "sata_dma_buf_setup: buf dma handle binding "
10803 			    "failed %x\n", rval));
10804 			return (rval);
10805 		}
10806 		spx->txlt_curwin_processed_dma_cookies = 0;
10807 		spx->txlt_dma_cookie_list = NULL;
10808 	} else {
10809 		/*
10810 		 * DMA setup is reused. Check if we need to process more
10811 		 * cookies in current window, or to get next window, if any.
10812 		 */
10813 
10814 		ASSERT(spx->txlt_curwin_processed_dma_cookies <=
10815 		    spx->txlt_curwin_num_dma_cookies);
10816 
10817 		if (spx->txlt_curwin_processed_dma_cookies ==
10818 		    spx->txlt_curwin_num_dma_cookies) {
10819 			/*
10820 			 * All cookies from current DMA window were processed.
10821 			 * Get next DMA window.
10822 			 */
10823 			spx->txlt_cur_dma_win++;
10824 			if (spx->txlt_cur_dma_win < spx->txlt_num_dma_win) {
10825 				(void) ddi_dma_getwin(spx->txlt_buf_dma_handle,
10826 				    spx->txlt_cur_dma_win, &offset, &size,
10827 				    &spx->txlt_dma_cookie,
10828 				    &spx->txlt_curwin_num_dma_cookies);
10829 				spx->txlt_curwin_processed_dma_cookies = 0;
10830 			} else {
10831 				/* No more windows! End of request! */
10832 				/* What to do? - panic for now */
10833 				ASSERT(spx->txlt_cur_dma_win >=
10834 				    spx->txlt_num_dma_win);
10835 
10836 				spx->txlt_curwin_num_dma_cookies = 0;
10837 				spx->txlt_curwin_processed_dma_cookies = 0;
10838 				spx->txlt_sata_pkt->
10839 				    satapkt_cmd.satacmd_num_dma_cookies = 0;
10840 				return (DDI_SUCCESS);
10841 			}
10842 		}
10843 	}
10844 	/* There better be at least one DMA cookie outstanding */
10845 	ASSERT((spx->txlt_curwin_num_dma_cookies -
10846 	    spx->txlt_curwin_processed_dma_cookies) > 0);
10847 
10848 	if (spx->txlt_dma_cookie_list == &spx->txlt_dma_cookie) {
10849 		/* The default cookie slot was used in previous run */
10850 		ASSERT(spx->txlt_curwin_processed_dma_cookies == 0);
10851 		spx->txlt_dma_cookie_list = NULL;
10852 		spx->txlt_dma_cookie_list_len = 0;
10853 	}
10854 	if (spx->txlt_curwin_processed_dma_cookies == 0) {
10855 		/*
10856 		 * Processing a new DMA window - set-up dma cookies list.
10857 		 * We may reuse previously allocated cookie array if it is
10858 		 * possible.
10859 		 */
10860 		if (spx->txlt_dma_cookie_list != NULL &&
10861 		    spx->txlt_dma_cookie_list_len <
10862 		    spx->txlt_curwin_num_dma_cookies) {
10863 			/*
10864 			 * New DMA window contains more cookies than
10865 			 * the previous one. We need larger cookie list - free
10866 			 * the old one.
10867 			 */
10868 			(void) kmem_free(spx->txlt_dma_cookie_list,
10869 			    spx->txlt_dma_cookie_list_len *
10870 			    sizeof (ddi_dma_cookie_t));
10871 			spx->txlt_dma_cookie_list = NULL;
10872 			spx->txlt_dma_cookie_list_len = 0;
10873 		}
10874 		if (spx->txlt_dma_cookie_list == NULL) {
10875 			/*
10876 			 * Calculate lesser of number of cookies in this
10877 			 * DMA window and number of s/g entries.
10878 			 */
10879 			max_sg_len = cur_dma_attr->dma_attr_sgllen;
10880 			req_len = MIN(max_sg_len,
10881 			    spx->txlt_curwin_num_dma_cookies);
10882 
10883 			/* Allocate new dma cookie array if necessary */
10884 			if (req_len == 1) {
10885 				/* Only one cookie - no need for a list */
10886 				spx->txlt_dma_cookie_list =
10887 				    &spx->txlt_dma_cookie;
10888 				spx->txlt_dma_cookie_list_len = 1;
10889 			} else {
10890 				/*
10891 				 * More than one cookie - try to allocate space.
10892 				 */
10893 				spx->txlt_dma_cookie_list = kmem_zalloc(
10894 				    sizeof (ddi_dma_cookie_t) * req_len,
10895 				    callback == NULL_FUNC ? KM_NOSLEEP :
10896 				    KM_SLEEP);
10897 				if (spx->txlt_dma_cookie_list == NULL) {
10898 					SATADBG1(SATA_DBG_DMA_SETUP,
10899 					    spx->txlt_sata_hba_inst,
10900 					    "sata_dma_buf_setup: cookie list "
10901 					    "allocation failed\n", NULL);
10902 					/*
10903 					 * We could not allocate space for
10904 					 * neccessary number of dma cookies in
10905 					 * this window, so we fail this request.
10906 					 * Next invocation would try again to
10907 					 * allocate space for cookie list.
10908 					 * Note:Packet residue was not modified.
10909 					 */
10910 					return (DDI_DMA_NORESOURCES);
10911 				} else {
10912 					spx->txlt_dma_cookie_list_len = req_len;
10913 				}
10914 			}
10915 		}
10916 		/*
10917 		 * Fetch DMA cookies into cookie list in sata_pkt_txlate.
10918 		 * First cookie was already fetched.
10919 		 */
10920 		*(&spx->txlt_dma_cookie_list[0]) = spx->txlt_dma_cookie;
10921 		cur_txfer_len =
10922 		    (uint64_t)spx->txlt_dma_cookie_list[0].dmac_size;
10923 		spx->txlt_sata_pkt->satapkt_cmd.satacmd_num_dma_cookies = 1;
10924 		spx->txlt_curwin_processed_dma_cookies++;
10925 		for (i = 1; (i < spx->txlt_dma_cookie_list_len) &&
10926 		    (i < spx->txlt_curwin_num_dma_cookies); i++) {
10927 			ddi_dma_nextcookie(spx->txlt_buf_dma_handle,
10928 			    &spx->txlt_dma_cookie_list[i]);
10929 			cur_txfer_len +=
10930 			    (uint64_t)spx->txlt_dma_cookie_list[i].dmac_size;
10931 			spx->txlt_curwin_processed_dma_cookies++;
10932 			spx->txlt_sata_pkt->
10933 			    satapkt_cmd.satacmd_num_dma_cookies += 1;
10934 		}
10935 	} else {
10936 		SATADBG2(SATA_DBG_DMA_SETUP, spx->txlt_sata_hba_inst,
10937 		    "sata_dma_buf_setup: sliding within DMA window, "
10938 		    "cur cookie %d, total cookies %d\n",
10939 		    spx->txlt_curwin_processed_dma_cookies,
10940 		    spx->txlt_curwin_num_dma_cookies);
10941 
10942 		/*
10943 		 * Not all cookies from the current dma window were used because
10944 		 * of s/g limitation.
10945 		 * There is no need to re-size the list - it was set at
10946 		 * optimal size, or only default entry is used (s/g = 1).
10947 		 */
10948 		if (spx->txlt_dma_cookie_list == NULL) {
10949 			spx->txlt_dma_cookie_list = &spx->txlt_dma_cookie;
10950 			spx->txlt_dma_cookie_list_len = 1;
10951 		}
10952 		/*
10953 		 * Since we are processing remaining cookies in a DMA window,
10954 		 * there may be less of them than the number of entries in the
10955 		 * current dma cookie list.
10956 		 */
10957 		req_len = MIN(spx->txlt_dma_cookie_list_len,
10958 		    (spx->txlt_curwin_num_dma_cookies -
10959 		    spx->txlt_curwin_processed_dma_cookies));
10960 
10961 		/* Fetch the next batch of cookies */
10962 		for (i = 0, cur_txfer_len = 0; i < req_len; i++) {
10963 			ddi_dma_nextcookie(spx->txlt_buf_dma_handle,
10964 			    &spx->txlt_dma_cookie_list[i]);
10965 			cur_txfer_len +=
10966 			    (uint64_t)spx->txlt_dma_cookie_list[i].dmac_size;
10967 			spx->txlt_sata_pkt->
10968 			    satapkt_cmd.satacmd_num_dma_cookies++;
10969 			spx->txlt_curwin_processed_dma_cookies++;
10970 		}
10971 	}
10972 
10973 	ASSERT(spx->txlt_sata_pkt->satapkt_cmd.satacmd_num_dma_cookies > 0);
10974 
10975 	/* Point sata_cmd to the cookie list */
10976 	spx->txlt_sata_pkt->satapkt_cmd.satacmd_dma_cookie_list =
10977 	    &spx->txlt_dma_cookie_list[0];
10978 
10979 	/* Remember number of DMA cookies passed in sata packet */
10980 	spx->txlt_num_dma_cookies =
10981 	    spx->txlt_sata_pkt->satapkt_cmd.satacmd_num_dma_cookies;
10982 
10983 	ASSERT(cur_txfer_len != 0);
10984 	if (cur_txfer_len <= bp->b_bcount)
10985 		spx->txlt_total_residue -= cur_txfer_len;
10986 	else {
10987 		/*
10988 		 * Temporary DMA buffer has been padded by
10989 		 * ddi_dma_mem_alloc()!
10990 		 * This requires special handling, because DMA cookies are
10991 		 * based on the temporary buffer size, not the b_bcount,
10992 		 * and we have extra bytes to transfer - but the packet
10993 		 * residue has to stay correct because we will copy only
10994 		 * the requested number of bytes.
10995 		 */
10996 		spx->txlt_total_residue -= bp->b_bcount;
10997 	}
10998 
10999 	return (DDI_SUCCESS);
11000 }
11001 
11002 
11003 /*
11004  * Fetch Device Identify data.
11005  * Send DEVICE IDENTIFY or IDENTIFY PACKET DEVICE (depending on a device type)
11006  * command to a device and get the device identify data.
11007  * The device_info structure has to be set to device type (for selecting proper
11008  * device identify command).
11009  *
11010  * Returns:
11011  * SATA_SUCCESS if cmd succeeded
11012  * SATA_RETRY if cmd was rejected and could be retried,
11013  * SATA_FAILURE if cmd failed and should not be retried (port error)
11014  *
11015  * Cannot be called in an interrupt context.
11016  */
11017 
11018 static int
11019 sata_fetch_device_identify_data(sata_hba_inst_t *sata_hba_inst,
11020     sata_drive_info_t *sdinfo)
11021 {
11022 	struct buf *bp;
11023 	sata_pkt_t *spkt;
11024 	sata_cmd_t *scmd;
11025 	sata_pkt_txlate_t *spx;
11026 	int rval;
11027 
11028 	spx = kmem_zalloc(sizeof (sata_pkt_txlate_t), KM_SLEEP);
11029 	spx->txlt_sata_hba_inst = sata_hba_inst;
11030 	spx->txlt_scsi_pkt = NULL;		/* No scsi pkt involved */
11031 	spkt = sata_pkt_alloc(spx, SLEEP_FUNC);
11032 	if (spkt == NULL) {
11033 		kmem_free(spx, sizeof (sata_pkt_txlate_t));
11034 		return (SATA_RETRY); /* may retry later */
11035 	}
11036 	/* address is needed now */
11037 	spkt->satapkt_device.satadev_addr = sdinfo->satadrv_addr;
11038 
11039 	/*
11040 	 * Allocate buffer for Identify Data return data
11041 	 */
11042 	bp = sata_alloc_local_buffer(spx, sizeof (sata_id_t));
11043 	if (bp == NULL) {
11044 		sata_pkt_free(spx);
11045 		kmem_free(spx, sizeof (sata_pkt_txlate_t));
11046 		SATA_LOG_D((sata_hba_inst, CE_WARN,
11047 		    "sata_fetch_device_identify_data: "
11048 		    "cannot allocate buffer for ID"));
11049 		return (SATA_RETRY); /* may retry later */
11050 	}
11051 
11052 	/* Fill sata_pkt */
11053 	sdinfo->satadrv_state = SATA_STATE_PROBING;
11054 	spkt->satapkt_device.satadev_addr = sdinfo->satadrv_addr;
11055 	spkt->satapkt_op_mode = SATA_OPMODE_SYNCH | SATA_OPMODE_INTERRUPTS;
11056 	/* Synchronous mode, no callback */
11057 	spkt->satapkt_comp = NULL;
11058 	/* Timeout 30s */
11059 	spkt->satapkt_time = sata_default_pkt_time;
11060 
11061 	scmd = &spkt->satapkt_cmd;
11062 	scmd->satacmd_bp = bp;
11063 	scmd->satacmd_flags.sata_data_direction = SATA_DIR_READ;
11064 	scmd->satacmd_flags.sata_ignore_dev_reset = B_TRUE;
11065 
11066 	/* Build Identify Device cmd in the sata_pkt */
11067 	scmd->satacmd_addr_type = 0;		/* N/A */
11068 	scmd->satacmd_sec_count_lsb = 0;	/* N/A */
11069 	scmd->satacmd_lba_low_lsb = 0;		/* N/A */
11070 	scmd->satacmd_lba_mid_lsb = 0;		/* N/A */
11071 	scmd->satacmd_lba_high_lsb = 0;		/* N/A */
11072 	scmd->satacmd_features_reg = 0;		/* N/A */
11073 	scmd->satacmd_device_reg = 0;		/* Always device 0 */
11074 	if (sdinfo->satadrv_type == SATA_DTYPE_ATAPICD) {
11075 		/* Identify Packet Device cmd */
11076 		scmd->satacmd_cmd_reg = SATAC_ID_PACKET_DEVICE;
11077 	} else {
11078 		/* Identify Device cmd - mandatory for all other devices */
11079 		scmd->satacmd_cmd_reg = SATAC_ID_DEVICE;
11080 	}
11081 
11082 	/* Send pkt to SATA HBA driver */
11083 	rval = (*SATA_START_FUNC(sata_hba_inst))(SATA_DIP(sata_hba_inst), spkt);
11084 	if (rval == SATA_TRAN_ACCEPTED &&
11085 	    spkt->satapkt_reason == SATA_PKT_COMPLETED) {
11086 		if ((sdinfo->satadrv_id.ai_config & SATA_INCOMPLETE_DATA) ==
11087 		    SATA_INCOMPLETE_DATA) {
11088 			SATA_LOG_D((sata_hba_inst, CE_WARN,
11089 			    "SATA disk device at port %d - "
11090 			    "partial Identify Data",
11091 			    sdinfo->satadrv_addr.cport));
11092 			rval = SATA_RETRY; /* may retry later */
11093 			goto fail;
11094 		}
11095 		/* Update sata_drive_info */
11096 		rval = ddi_dma_sync(spx->txlt_buf_dma_handle, 0, 0,
11097 		    DDI_DMA_SYNC_FORKERNEL);
11098 		ASSERT(rval == DDI_SUCCESS);
11099 		bcopy(bp->b_un.b_addr, &sdinfo->satadrv_id,
11100 		    sizeof (sata_id_t));
11101 
11102 		sdinfo->satadrv_features_support = 0;
11103 		if (sdinfo->satadrv_type == SATA_DTYPE_ATADISK) {
11104 			/*
11105 			 * Retrieve capacity (disks only) and addressing mode
11106 			 */
11107 			sdinfo->satadrv_capacity = sata_check_capacity(sdinfo);
11108 		} else {
11109 			/*
11110 			 * For ATAPI devices one would have to issue
11111 			 * Get Capacity cmd for media capacity. Not here.
11112 			 */
11113 			sdinfo->satadrv_capacity = 0;
11114 			/*
11115 			 * Check what cdb length is supported
11116 			 */
11117 			if ((sdinfo->satadrv_id.ai_config &
11118 			    SATA_ATAPI_ID_PKT_SZ) == SATA_ATAPI_ID_PKT_16B)
11119 				sdinfo->satadrv_atapi_cdb_len = 16;
11120 			else
11121 				sdinfo->satadrv_atapi_cdb_len = 12;
11122 		}
11123 		/* Setup supported features flags */
11124 		if (sdinfo->satadrv_id.ai_cap & SATA_DMA_SUPPORT)
11125 			sdinfo->satadrv_features_support |= SATA_DEV_F_DMA;
11126 
11127 		/* Check for SATA GEN and NCQ support */
11128 		if (sdinfo->satadrv_id.ai_satacap != 0 &&
11129 		    sdinfo->satadrv_id.ai_satacap != 0xffff) {
11130 			/* SATA compliance */
11131 			if (sdinfo->satadrv_id.ai_satacap & SATA_NCQ)
11132 				sdinfo->satadrv_features_support |=
11133 				    SATA_DEV_F_NCQ;
11134 			if (sdinfo->satadrv_id.ai_satacap &
11135 			    (SATA_1_SPEED | SATA_2_SPEED)) {
11136 				if (sdinfo->satadrv_id.ai_satacap &
11137 				    SATA_2_SPEED)
11138 					sdinfo->satadrv_features_support |=
11139 					    SATA_DEV_F_SATA2;
11140 				if (sdinfo->satadrv_id.ai_satacap &
11141 				    SATA_1_SPEED)
11142 					sdinfo->satadrv_features_support |=
11143 					    SATA_DEV_F_SATA1;
11144 			} else {
11145 				sdinfo->satadrv_features_support |=
11146 				    SATA_DEV_F_SATA1;
11147 			}
11148 		}
11149 		if ((sdinfo->satadrv_id.ai_cmdset83 & SATA_RW_DMA_QUEUED_CMD) &&
11150 		    (sdinfo->satadrv_id.ai_features86 & SATA_RW_DMA_QUEUED_CMD))
11151 			sdinfo->satadrv_features_support |= SATA_DEV_F_TCQ;
11152 
11153 		sdinfo->satadrv_queue_depth = sdinfo->satadrv_id.ai_qdepth;
11154 		if ((sdinfo->satadrv_features_support & SATA_DEV_F_NCQ) ||
11155 		    (sdinfo->satadrv_features_support & SATA_DEV_F_TCQ))
11156 			++sdinfo->satadrv_queue_depth;
11157 		rval = SATA_SUCCESS;
11158 	} else {
11159 		/*
11160 		 * Woops, no Identify Data.
11161 		 */
11162 		if (rval == SATA_TRAN_BUSY || rval == SATA_TRAN_QUEUE_FULL) {
11163 			rval = SATA_RETRY; /* may retry later */
11164 		} else if (rval == SATA_TRAN_ACCEPTED) {
11165 			if (spkt->satapkt_reason == SATA_PKT_DEV_ERROR ||
11166 			    spkt->satapkt_reason == SATA_PKT_ABORTED ||
11167 			    spkt->satapkt_reason == SATA_PKT_TIMEOUT ||
11168 			    spkt->satapkt_reason == SATA_PKT_RESET)
11169 				rval = SATA_RETRY; /* may retry later */
11170 			else
11171 				rval = SATA_FAILURE;
11172 		} else {
11173 			rval = SATA_FAILURE;
11174 		}
11175 	}
11176 fail:
11177 	/* Free allocated resources */
11178 	sata_free_local_buffer(spx);
11179 	sata_pkt_free(spx);
11180 	kmem_free(spx, sizeof (sata_pkt_txlate_t));
11181 
11182 	return (rval);
11183 }
11184 
11185 
11186 /*
11187  * Some devices may not come-up with default DMA mode (UDMA or MWDMA).
11188  * UDMA mode is checked first, followed by MWDMA mode.
11189  * set correctly, so this function is setting it to the highest supported level.
11190  * Older SATA spec required that the device supports at least DMA 4 mode and
11191  * UDMA mode is selected.  It is not mentioned in SerialATA 2.6, so this
11192  * restriction has been removed.
11193  *
11194  * Returns SATA_SUCCESS if proper DMA mode is selected or no DMA is supported.
11195  * Returns SATA_FAILURE if proper DMA mode could not be selected.
11196  *
11197  * NOTE: This function should be called only if DMA mode is supported.
11198  */
11199 static int
11200 sata_set_dma_mode(sata_hba_inst_t *sata_hba_inst, sata_drive_info_t *sdinfo)
11201 {
11202 	sata_pkt_t *spkt;
11203 	sata_cmd_t *scmd;
11204 	sata_pkt_txlate_t *spx;
11205 	int i, mode;
11206 	uint8_t subcmd;
11207 	int rval = SATA_SUCCESS;
11208 
11209 	ASSERT(sdinfo != NULL);
11210 	ASSERT(sata_hba_inst != NULL);
11211 
11212 	if ((sdinfo->satadrv_id.ai_validinfo & SATA_VALIDINFO_88) != 0 &&
11213 	    (sdinfo->satadrv_id.ai_ultradma & SATA_UDMA_SUP_MASK) != 0) {
11214 		/* Find highest Ultra DMA mode supported */
11215 		for (mode = 6; mode >= 0; --mode) {
11216 			if (sdinfo->satadrv_id.ai_ultradma & (1 << mode))
11217 				break;
11218 		}
11219 #if 0
11220 		/* Left for historical reasons */
11221 		/*
11222 		 * Some initial version of SATA spec indicated that at least
11223 		 * UDMA mode 4 has to be supported. It is not mentioned in
11224 		 * SerialATA 2.6, so this restriction is removed.
11225 		 */
11226 		if (mode < 4)
11227 			return (SATA_FAILURE);
11228 #endif
11229 		/* Find UDMA mode currently selected */
11230 		for (i = 6; i >= 0; --i) {
11231 			if (sdinfo->satadrv_id.ai_ultradma & (1 << (i + 8)))
11232 				break;
11233 		}
11234 		if (i >= mode)
11235 			/* Nothing to do */
11236 			return (SATA_SUCCESS);
11237 
11238 		subcmd = SATAC_TRANSFER_MODE_ULTRA_DMA;
11239 
11240 	} else if ((sdinfo->satadrv_id.ai_dworddma & SATA_MDMA_SUP_MASK) != 0) {
11241 		/* Find highest MultiWord DMA mode supported */
11242 		for (mode = 2; mode >= 0; --mode) {
11243 			if (sdinfo->satadrv_id.ai_dworddma & (1 << mode))
11244 				break;
11245 		}
11246 		/* Find highest MultiWord DMA mode selected */
11247 		for (i = 2; i >= 0; --i) {
11248 			if (sdinfo->satadrv_id.ai_dworddma & (1 << (i + 8)))
11249 				break;
11250 		}
11251 		if (i >= mode)
11252 			/* Nothing to do */
11253 			return (SATA_SUCCESS);
11254 
11255 		subcmd = SATAC_TRANSFER_MODE_MULTI_WORD_DMA;
11256 	} else
11257 		return (SATA_SUCCESS);
11258 
11259 	/*
11260 	 * Set DMA mode via SET FEATURES COMMAND.
11261 	 * Prepare packet for SET FEATURES COMMAND.
11262 	 */
11263 	spx = kmem_zalloc(sizeof (sata_pkt_txlate_t), KM_SLEEP);
11264 	spx->txlt_sata_hba_inst = sata_hba_inst;
11265 	spx->txlt_scsi_pkt = NULL;	/* No scsi pkt involved */
11266 	spkt = sata_pkt_alloc(spx, SLEEP_FUNC);
11267 	if (spkt == NULL) {
11268 		SATA_LOG_D((sata_hba_inst, CE_WARN,
11269 		    "sata_set_dma_mode: could not set DMA mode %", mode));
11270 		rval = SATA_FAILURE;
11271 		goto done;
11272 	}
11273 	/* Fill sata_pkt */
11274 	spkt->satapkt_device.satadev_addr = sdinfo->satadrv_addr;
11275 	/* Timeout 30s */
11276 	spkt->satapkt_time = sata_default_pkt_time;
11277 	/* Synchronous mode, no callback, interrupts */
11278 	spkt->satapkt_op_mode = SATA_OPMODE_SYNCH | SATA_OPMODE_INTERRUPTS;
11279 	spkt->satapkt_comp = NULL;
11280 	scmd = &spkt->satapkt_cmd;
11281 	scmd->satacmd_flags.sata_data_direction = SATA_DIR_NODATA_XFER;
11282 	scmd->satacmd_flags.sata_ignore_dev_reset = B_TRUE;
11283 	scmd->satacmd_addr_type = 0;
11284 	scmd->satacmd_device_reg = 0;
11285 	scmd->satacmd_status_reg = 0;
11286 	scmd->satacmd_error_reg = 0;
11287 	scmd->satacmd_cmd_reg = SATAC_SET_FEATURES;
11288 	scmd->satacmd_features_reg = SATAC_SF_TRANSFER_MODE;
11289 	scmd->satacmd_sec_count_lsb = subcmd | mode;
11290 
11291 	/* Transfer command to HBA */
11292 	if ((*SATA_START_FUNC(sata_hba_inst))(SATA_DIP(sata_hba_inst),
11293 	    spkt) != SATA_TRAN_ACCEPTED ||
11294 	    spkt->satapkt_reason != SATA_PKT_COMPLETED) {
11295 		/* Pkt execution failed */
11296 		rval = SATA_FAILURE;
11297 	}
11298 done:
11299 
11300 	/* Free allocated resources */
11301 	if (spkt != NULL)
11302 		sata_pkt_free(spx);
11303 	(void) kmem_free(spx, sizeof (sata_pkt_txlate_t));
11304 
11305 	return (rval);
11306 }
11307 
11308 
11309 /*
11310  * Set device caching mode.
11311  * One of the following operations should be specified:
11312  * SATAC_SF_ENABLE_READ_AHEAD
11313  * SATAC_SF_DISABLE_READ_AHEAD
11314  * SATAC_SF_ENABLE_WRITE_CACHE
11315  * SATAC_SF_DISABLE_WRITE_CACHE
11316  *
11317  * If operation fails, system log messgage is emitted.
11318  * Returns SATA_SUCCESS when the operation succeeds, SATA_FAILURE otherwise.
11319  */
11320 
11321 static int
11322 sata_set_cache_mode(sata_hba_inst_t *sata_hba_inst, sata_drive_info_t *sdinfo,
11323     int cache_op)
11324 {
11325 	sata_pkt_t *spkt;
11326 	sata_cmd_t *scmd;
11327 	sata_pkt_txlate_t *spx;
11328 	int rval = SATA_SUCCESS;
11329 	char *infop;
11330 
11331 	ASSERT(sdinfo != NULL);
11332 	ASSERT(sata_hba_inst != NULL);
11333 	ASSERT(cache_op == SATAC_SF_ENABLE_READ_AHEAD ||
11334 	    cache_op == SATAC_SF_DISABLE_READ_AHEAD ||
11335 	    cache_op == SATAC_SF_ENABLE_WRITE_CACHE ||
11336 	    cache_op == SATAC_SF_DISABLE_WRITE_CACHE);
11337 
11338 
11339 	/* Prepare packet for SET FEATURES COMMAND */
11340 	spx = kmem_zalloc(sizeof (sata_pkt_txlate_t), KM_SLEEP);
11341 	spx->txlt_sata_hba_inst = sata_hba_inst;
11342 	spx->txlt_scsi_pkt = NULL;	/* No scsi pkt involved */
11343 	spkt = sata_pkt_alloc(spx, SLEEP_FUNC);
11344 	if (spkt == NULL) {
11345 		rval = SATA_FAILURE;
11346 		goto failure;
11347 	}
11348 	/* Fill sata_pkt */
11349 	spkt->satapkt_device.satadev_addr = sdinfo->satadrv_addr;
11350 	/* Timeout 30s */
11351 	spkt->satapkt_time = sata_default_pkt_time;
11352 	/* Synchronous mode, no callback, interrupts */
11353 	spkt->satapkt_op_mode =
11354 	    SATA_OPMODE_SYNCH | SATA_OPMODE_INTERRUPTS;
11355 	spkt->satapkt_comp = NULL;
11356 	scmd = &spkt->satapkt_cmd;
11357 	scmd->satacmd_flags.sata_data_direction = SATA_DIR_NODATA_XFER;
11358 	scmd->satacmd_flags.sata_ignore_dev_reset = B_TRUE;
11359 	scmd->satacmd_addr_type = 0;
11360 	scmd->satacmd_device_reg = 0;
11361 	scmd->satacmd_status_reg = 0;
11362 	scmd->satacmd_error_reg = 0;
11363 	scmd->satacmd_cmd_reg = SATAC_SET_FEATURES;
11364 	scmd->satacmd_features_reg = cache_op;
11365 
11366 	/* Transfer command to HBA */
11367 	if (((*SATA_START_FUNC(sata_hba_inst))(
11368 	    SATA_DIP(sata_hba_inst), spkt) != SATA_TRAN_ACCEPTED) ||
11369 	    (spkt->satapkt_reason != SATA_PKT_COMPLETED)) {
11370 		/* Pkt execution failed */
11371 		switch (cache_op) {
11372 		case SATAC_SF_ENABLE_READ_AHEAD:
11373 			infop = "enabling read ahead failed";
11374 			break;
11375 		case SATAC_SF_DISABLE_READ_AHEAD:
11376 			infop = "disabling read ahead failed";
11377 			break;
11378 		case SATAC_SF_ENABLE_WRITE_CACHE:
11379 			infop = "enabling write cache failed";
11380 			break;
11381 		case SATAC_SF_DISABLE_WRITE_CACHE:
11382 			infop = "disabling write cache failed";
11383 			break;
11384 		}
11385 		SATA_LOG_D((sata_hba_inst, CE_WARN, "%s", infop));
11386 		rval = SATA_FAILURE;
11387 	}
11388 failure:
11389 	/* Free allocated resources */
11390 	if (spkt != NULL)
11391 		sata_pkt_free(spx);
11392 	(void) kmem_free(spx, sizeof (sata_pkt_txlate_t));
11393 	return (rval);
11394 }
11395 
11396 /*
11397  * Set Removable Media Status Notification (enable/disable)
11398  * state == 0 , disable
11399  * state != 0 , enable
11400  *
11401  * If operation fails, system log messgage is emitted.
11402  * Returns SATA_SUCCESS when the operation succeeds, SATA_FAILURE otherwise.
11403  */
11404 
11405 static int
11406 sata_set_rmsn(sata_hba_inst_t *sata_hba_inst, sata_drive_info_t *sdinfo,
11407     int state)
11408 {
11409 	sata_pkt_t *spkt;
11410 	sata_cmd_t *scmd;
11411 	sata_pkt_txlate_t *spx;
11412 	int rval = SATA_SUCCESS;
11413 	char *infop;
11414 
11415 	ASSERT(sdinfo != NULL);
11416 	ASSERT(sata_hba_inst != NULL);
11417 
11418 	/* Prepare packet for SET FEATURES COMMAND */
11419 	spx = kmem_zalloc(sizeof (sata_pkt_txlate_t), KM_SLEEP);
11420 	spx->txlt_sata_hba_inst = sata_hba_inst;
11421 	spx->txlt_scsi_pkt = NULL;	/* No scsi pkt involved */
11422 	spkt = sata_pkt_alloc(spx, SLEEP_FUNC);
11423 	if (spkt == NULL) {
11424 		rval = SATA_FAILURE;
11425 		goto failure;
11426 	}
11427 	/* Fill sata_pkt */
11428 	spkt->satapkt_device.satadev_addr = sdinfo->satadrv_addr;
11429 	/* Timeout 30s */
11430 	spkt->satapkt_time = sata_default_pkt_time;
11431 	/* Synchronous mode, no callback, interrupts */
11432 	spkt->satapkt_op_mode =
11433 	    SATA_OPMODE_SYNCH | SATA_OPMODE_INTERRUPTS;
11434 	spkt->satapkt_comp = NULL;
11435 	scmd = &spkt->satapkt_cmd;
11436 	scmd->satacmd_flags.sata_data_direction = SATA_DIR_NODATA_XFER;
11437 	scmd->satacmd_flags.sata_ignore_dev_reset = B_TRUE;
11438 	scmd->satacmd_addr_type = 0;
11439 	scmd->satacmd_device_reg = 0;
11440 	scmd->satacmd_status_reg = 0;
11441 	scmd->satacmd_error_reg = 0;
11442 	scmd->satacmd_cmd_reg = SATAC_SET_FEATURES;
11443 	if (state == 0)
11444 		scmd->satacmd_features_reg = SATAC_SF_DISABLE_RMSN;
11445 	else
11446 		scmd->satacmd_features_reg = SATAC_SF_ENABLE_RMSN;
11447 
11448 	/* Transfer command to HBA */
11449 	if (((*SATA_START_FUNC(sata_hba_inst))(
11450 	    SATA_DIP(sata_hba_inst), spkt) != SATA_TRAN_ACCEPTED) ||
11451 	    (spkt->satapkt_reason != SATA_PKT_COMPLETED)) {
11452 		/* Pkt execution failed */
11453 		if (state == 0)
11454 			infop = "disabling Removable Media Status "
11455 			    "Notification failed";
11456 		else
11457 			infop = "enabling Removable Media Status "
11458 			    "Notification failed";
11459 
11460 		SATA_LOG_D((sata_hba_inst, CE_WARN, "%s", infop));
11461 		rval = SATA_FAILURE;
11462 	}
11463 failure:
11464 	/* Free allocated resources */
11465 	if (spkt != NULL)
11466 		sata_pkt_free(spx);
11467 	(void) kmem_free(spx, sizeof (sata_pkt_txlate_t));
11468 	return (rval);
11469 }
11470 
11471 
11472 /*
11473  * Update port SCR block
11474  */
11475 static void
11476 sata_update_port_scr(sata_port_scr_t *port_scr, sata_device_t *device)
11477 {
11478 	port_scr->sstatus = device->satadev_scr.sstatus;
11479 	port_scr->serror = device->satadev_scr.serror;
11480 	port_scr->scontrol = device->satadev_scr.scontrol;
11481 	port_scr->sactive = device->satadev_scr.sactive;
11482 	port_scr->snotific = device->satadev_scr.snotific;
11483 }
11484 
11485 /*
11486  * Update state and copy port ss* values from passed sata_device structure.
11487  * sata_address is validated - if not valid, nothing is changed in sata_scsi
11488  * configuration struct.
11489  *
11490  * SATA_PSTATE_SHUTDOWN in port state is not reset to 0 by this function
11491  * regardless of the state in device argument.
11492  *
11493  * Port mutex should be held while calling this function.
11494  */
11495 static void
11496 sata_update_port_info(sata_hba_inst_t *sata_hba_inst,
11497 	sata_device_t *sata_device)
11498 {
11499 	ASSERT(mutex_owned(&SATA_CPORT_MUTEX(sata_hba_inst,
11500 	    sata_device->satadev_addr.cport)));
11501 
11502 	if (sata_device->satadev_addr.qual == SATA_ADDR_CPORT ||
11503 	    sata_device->satadev_addr.qual == SATA_ADDR_DCPORT) {
11504 
11505 		sata_cport_info_t *cportinfo;
11506 
11507 		if (SATA_NUM_CPORTS(sata_hba_inst) <=
11508 		    sata_device->satadev_addr.cport)
11509 			return;
11510 
11511 		cportinfo = SATA_CPORT_INFO(sata_hba_inst,
11512 		    sata_device->satadev_addr.cport);
11513 		sata_update_port_scr(&cportinfo->cport_scr, sata_device);
11514 
11515 		/* Preserve SATA_PSTATE_SHUTDOWN flag */
11516 		cportinfo->cport_state &= ~(SATA_PSTATE_PWRON |
11517 		    SATA_PSTATE_PWROFF | SATA_PSTATE_FAILED);
11518 		cportinfo->cport_state |=
11519 		    sata_device->satadev_state & SATA_PSTATE_VALID;
11520 	} else {
11521 		sata_pmport_info_t *pmportinfo;
11522 
11523 		if ((sata_device->satadev_addr.qual != SATA_ADDR_PMPORT) ||
11524 		    (sata_device->satadev_addr.qual != SATA_ADDR_DPMPORT) ||
11525 		    SATA_NUM_PMPORTS(sata_hba_inst,
11526 		    sata_device->satadev_addr.cport) <
11527 		    sata_device->satadev_addr.pmport)
11528 			return;
11529 
11530 		pmportinfo = SATA_PMPORT_INFO(sata_hba_inst,
11531 		    sata_device->satadev_addr.cport,
11532 		    sata_device->satadev_addr.pmport);
11533 		sata_update_port_scr(&pmportinfo->pmport_scr, sata_device);
11534 
11535 		/* Preserve SATA_PSTATE_SHUTDOWN flag */
11536 		pmportinfo->pmport_state &=
11537 		    ~(SATA_PSTATE_PWRON | SATA_PSTATE_PWROFF |
11538 		    SATA_PSTATE_FAILED);
11539 		pmportinfo->pmport_state |=
11540 		    sata_device->satadev_state & SATA_PSTATE_VALID;
11541 	}
11542 }
11543 
11544 
11545 
11546 /*
11547  * Extract SATA port specification from an IOCTL argument.
11548  *
11549  * This function return the port the user land send us as is, unless it
11550  * cannot retrieve port spec, then -1 is returned.
11551  *
11552  * Note: Only cport  - no port multiplier port.
11553  */
11554 static int32_t
11555 sata_get_port_num(sata_hba_inst_t *sata_hba_inst, struct devctl_iocdata *dcp)
11556 {
11557 	int32_t port;
11558 
11559 	/* Extract port number from nvpair in dca structure  */
11560 	if (nvlist_lookup_int32(ndi_dc_get_ap_data(dcp), "port", &port) != 0) {
11561 		SATA_LOG_D((sata_hba_inst, CE_NOTE,
11562 		    "sata_get_port_num: invalid port spec 0x%x in ioctl",
11563 		    port));
11564 		port = -1;
11565 	}
11566 
11567 	return (port);
11568 }
11569 
11570 /*
11571  * Get dev_info_t pointer to the device node pointed to by port argument.
11572  * NOTE: target argument is a value used in ioctls to identify
11573  * the AP - it is not a sata_address.
11574  * It is a combination of cport, pmport and address qualifier, encodded same
11575  * way as a scsi target number.
11576  * At this moment it carries only cport number.
11577  *
11578  * No PMult hotplug support.
11579  *
11580  * Returns dev_info_t pointer if target device was found, NULL otherwise.
11581  */
11582 
11583 static dev_info_t *
11584 sata_get_target_dip(dev_info_t *dip, int32_t port)
11585 {
11586 	dev_info_t	*cdip = NULL;
11587 	int		target, tgt;
11588 	int		ncport;
11589 	int 		circ;
11590 
11591 	ncport = port & SATA_CFGA_CPORT_MASK;
11592 	target = SATA_TO_SCSI_TARGET(ncport, 0, SATA_ADDR_DCPORT);
11593 
11594 	ndi_devi_enter(dip, &circ);
11595 	for (cdip = ddi_get_child(dip); cdip != NULL; ) {
11596 		dev_info_t *next = ddi_get_next_sibling(cdip);
11597 
11598 		tgt = ddi_prop_get_int(DDI_DEV_T_ANY, cdip,
11599 		    DDI_PROP_DONTPASS, "target", -1);
11600 		if (tgt == -1) {
11601 			/*
11602 			 * This is actually an error condition, but not
11603 			 * a fatal one. Just continue the search.
11604 			 */
11605 			cdip = next;
11606 			continue;
11607 		}
11608 
11609 		if (tgt == target)
11610 			break;
11611 
11612 		cdip = next;
11613 	}
11614 	ndi_devi_exit(dip, circ);
11615 
11616 	return (cdip);
11617 }
11618 
11619 
11620 /*
11621  * sata_cfgadm_state:
11622  * Use the sata port state and state of the target node to figure out
11623  * the cfgadm_state.
11624  *
11625  * The port argument is a value with encoded cport,
11626  * pmport and address qualifier, in the same manner as a scsi target number.
11627  * SCSI_TO_SATA_CPORT macro extracts cport number,
11628  * SCSI_TO_SATA_PMPORT extracts pmport number and
11629  * SCSI_TO_SATA_ADDR_QUAL extracts port mulitplier qualifier flag.
11630  *
11631  * For now, support is for cports only - no port multiplier device ports.
11632  */
11633 
11634 static void
11635 sata_cfgadm_state(sata_hba_inst_t *sata_hba_inst, int32_t port,
11636     devctl_ap_state_t *ap_state)
11637 {
11638 	uint16_t	cport;
11639 	int		port_state;
11640 
11641 	/* Cport only */
11642 	cport = SCSI_TO_SATA_CPORT(port);
11643 
11644 	port_state = SATA_CPORT_STATE(sata_hba_inst, cport);
11645 	if (port_state & SATA_PSTATE_SHUTDOWN ||
11646 	    port_state & SATA_PSTATE_FAILED) {
11647 		ap_state->ap_rstate = AP_RSTATE_DISCONNECTED;
11648 		ap_state->ap_ostate = AP_OSTATE_UNCONFIGURED;
11649 		if (port_state & SATA_PSTATE_FAILED)
11650 			ap_state->ap_condition = AP_COND_FAILED;
11651 		else
11652 			ap_state->ap_condition = AP_COND_UNKNOWN;
11653 
11654 		return;
11655 	}
11656 
11657 	/* Need to check pmult device port here as well, when supported */
11658 
11659 	/* Port is enabled and ready */
11660 
11661 	switch (SATA_CPORT_DEV_TYPE(sata_hba_inst, cport)) {
11662 	case SATA_DTYPE_NONE:
11663 	{
11664 		ap_state->ap_ostate = AP_OSTATE_UNCONFIGURED;
11665 		ap_state->ap_condition = AP_COND_OK;
11666 		/* No device attached */
11667 		ap_state->ap_rstate = AP_RSTATE_EMPTY;
11668 		break;
11669 	}
11670 	case SATA_DTYPE_UNKNOWN:
11671 	case SATA_DTYPE_ATAPINONCD:
11672 	case SATA_DTYPE_PMULT:	/* Until PMult is supported */
11673 	case SATA_DTYPE_ATADISK:
11674 	case SATA_DTYPE_ATAPICD:
11675 	{
11676 		dev_info_t *tdip = NULL;
11677 		dev_info_t *dip = NULL;
11678 		int circ;
11679 
11680 		dip = SATA_DIP(sata_hba_inst);
11681 		tdip = sata_get_target_dip(dip, port);
11682 		ap_state->ap_rstate = AP_RSTATE_CONNECTED;
11683 		if (tdip != NULL) {
11684 			ndi_devi_enter(dip, &circ);
11685 			mutex_enter(&(DEVI(tdip)->devi_lock));
11686 			if (DEVI_IS_DEVICE_REMOVED(tdip)) {
11687 				/*
11688 				 * There could be the case where previously
11689 				 * configured and opened device was removed
11690 				 * and unknown device was plugged.
11691 				 * In such case we want to show a device, and
11692 				 * its configured or unconfigured state but
11693 				 * indicate unusable condition untill the
11694 				 * old target node is released and removed.
11695 				 */
11696 				ap_state->ap_condition = AP_COND_UNUSABLE;
11697 			} else {
11698 				ap_state->ap_condition = AP_COND_OK;
11699 			}
11700 			if ((DEVI_IS_DEVICE_OFFLINE(tdip)) ||
11701 			    (DEVI_IS_DEVICE_DOWN(tdip))) {
11702 				ap_state->ap_ostate =
11703 				    AP_OSTATE_UNCONFIGURED;
11704 			} else {
11705 				ap_state->ap_ostate =
11706 				    AP_OSTATE_CONFIGURED;
11707 			}
11708 			mutex_exit(&(DEVI(tdip)->devi_lock));
11709 			ndi_devi_exit(dip, circ);
11710 		} else {
11711 			ap_state->ap_ostate = AP_OSTATE_UNCONFIGURED;
11712 			ap_state->ap_condition = AP_COND_UNKNOWN;
11713 		}
11714 		break;
11715 	}
11716 	default:
11717 		ap_state->ap_rstate = AP_RSTATE_CONNECTED;
11718 		ap_state->ap_ostate = AP_OSTATE_UNCONFIGURED;
11719 		ap_state->ap_condition = AP_COND_UNKNOWN;
11720 		/*
11721 		 * This is actually internal error condition (non fatal),
11722 		 * because we have already checked all defined device types.
11723 		 */
11724 		SATA_LOG_D((sata_hba_inst, CE_WARN,
11725 		    "sata_cfgadm_state: Internal error: "
11726 		    "unknown device type"));
11727 		break;
11728 	}
11729 }
11730 
11731 
11732 /*
11733  * Preset scsi extended sense data (to NO SENSE)
11734  * First 18 bytes of the sense data are preset to current valid sense
11735  * with a key NO SENSE data.
11736  *
11737  * Returns void
11738  */
11739 static void
11740 sata_fixed_sense_data_preset(struct scsi_extended_sense *sense)
11741 {
11742 	sense->es_valid = 1;		/* Valid sense */
11743 	sense->es_class = CLASS_EXTENDED_SENSE;	/* 0x70 - current err */
11744 	sense->es_key = KEY_NO_SENSE;
11745 	sense->es_info_1 = 0;
11746 	sense->es_info_2 = 0;
11747 	sense->es_info_3 = 0;
11748 	sense->es_info_4 = 0;
11749 	sense->es_add_len = 10;	/* Additional length - replace with a def */
11750 	sense->es_cmd_info[0] = 0;
11751 	sense->es_cmd_info[1] = 0;
11752 	sense->es_cmd_info[2] = 0;
11753 	sense->es_cmd_info[3] = 0;
11754 	sense->es_add_code = 0;
11755 	sense->es_qual_code = 0;
11756 }
11757 
11758 /*
11759  * Register a legacy cmdk-style devid for the target (disk) device.
11760  *
11761  * Note: This function is called only when the HBA devinfo node has the
11762  * property "use-cmdk-devid-format" set. This property indicates that
11763  * devid compatible with old cmdk (target) driver is to be generated
11764  * for any target device attached to this controller. This will take
11765  * precedence over the devid generated by sd (target) driver.
11766  * This function is derived from cmdk_devid_setup() function in cmdk.c.
11767  */
11768 static void
11769 sata_target_devid_register(dev_info_t *dip, sata_drive_info_t *sdinfo)
11770 {
11771 	char	*hwid;
11772 	int	modlen;
11773 	int	serlen;
11774 	int	rval;
11775 	ddi_devid_t	devid;
11776 
11777 	/*
11778 	 * device ID is a concatanation of model number, "=", serial number.
11779 	 */
11780 	hwid = kmem_zalloc(LEGACY_HWID_LEN, KM_SLEEP);
11781 	bcopy(&sdinfo->satadrv_id.ai_model, hwid,
11782 	    sizeof (sdinfo->satadrv_id.ai_model));
11783 	swab(hwid, hwid, sizeof (sdinfo->satadrv_id.ai_model));
11784 	modlen = sata_check_modser(hwid, sizeof (sdinfo->satadrv_id.ai_model));
11785 	if (modlen == 0)
11786 		goto err;
11787 	hwid[modlen++] = '=';
11788 	bcopy(&sdinfo->satadrv_id.ai_drvser, &hwid[modlen],
11789 	    sizeof (sdinfo->satadrv_id.ai_drvser));
11790 	swab(&hwid[modlen], &hwid[modlen],
11791 		sizeof (sdinfo->satadrv_id.ai_drvser));
11792 	serlen = sata_check_modser(&hwid[modlen],
11793 		sizeof (sdinfo->satadrv_id.ai_drvser));
11794 	if (serlen == 0)
11795 		goto err;
11796 	hwid[modlen + serlen] = 0; /* terminate the hwid string */
11797 
11798 	/* initialize/register devid */
11799 	if ((rval = ddi_devid_init(dip, DEVID_ATA_SERIAL,
11800 		(ushort_t)(modlen + serlen), hwid, &devid)) == DDI_SUCCESS)
11801 		rval = ddi_devid_register(dip, devid);
11802 
11803 	if (rval != DDI_SUCCESS)
11804 		cmn_err(CE_WARN, "sata: failed to create devid for the disk"
11805 			" on port %d", sdinfo->satadrv_addr.cport);
11806 err:
11807 	kmem_free(hwid, LEGACY_HWID_LEN);
11808 }
11809 
11810 /*
11811  * valid model/serial string must contain a non-zero non-space characters.
11812  * trim trailing spaces/NULLs.
11813  */
11814 static int
11815 sata_check_modser(char *buf, int buf_len)
11816 {
11817 	boolean_t ret;
11818 	char *s;
11819 	int i;
11820 	int tb;
11821 	char ch;
11822 
11823 	ret = B_FALSE;
11824 	s = buf;
11825 	for (i = 0; i < buf_len; i++) {
11826 		ch = *s++;
11827 		if (ch != ' ' && ch != '\0')
11828 			tb = i + 1;
11829 		if (ch != ' ' && ch != '\0' && ch != '0')
11830 			ret = B_TRUE;
11831 	}
11832 
11833 	if (ret == B_FALSE)
11834 		return (0); /* invalid string */
11835 
11836 	return (tb); /* return length */
11837 }
11838 
11839 /*
11840  * sata_set_drive_features function compares current device features setting
11841  * with the saved device features settings and, if there is a difference,
11842  * it restores device features setting to the previously saved state.
11843  * It also arbitrarily tries to select the highest supported DMA mode.
11844  * Device Identify or Identify Packet Device data has to be current.
11845  * At the moment read ahead and write cache are considered for all devices.
11846  * For atapi devices, Removable Media Status Notification is set in addition
11847  * to common features.
11848  *
11849  * This function cannot be called in the interrupt context (it may sleep).
11850  *
11851  * The input argument sdinfo should point to the drive info structure
11852  * to be updated after features are set. Note, that only
11853  * device (packet) identify data is updated, not the flags indicating the
11854  * supported features.
11855  *
11856  * Returns TRUE if successful or there was nothing to do. Device Identify data
11857  * in the drive info structure pointed to by the sdinfo argumens is updated
11858  * even when no features were set or changed.
11859  *
11860  * Returns FALSE if device features could not be set.
11861  *
11862  * Note: This function may fail the port, making it inaccessible.
11863  * In such case the explicit port disconnect/connect or physical device
11864  * detach/attach is required to re-evaluate port state again.
11865  */
11866 
11867 static int
11868 sata_set_drive_features(sata_hba_inst_t *sata_hba_inst,
11869     sata_drive_info_t *sdinfo, int restore)
11870 {
11871 	int rval = SATA_SUCCESS;
11872 	sata_drive_info_t new_sdinfo;
11873 	char *finfo = "sata_set_drive_features: cannot";
11874 	char *finfox;
11875 	int cache_op;
11876 
11877 	bzero(&new_sdinfo, sizeof (sata_drive_info_t));
11878 	new_sdinfo.satadrv_addr = sdinfo->satadrv_addr;
11879 	new_sdinfo.satadrv_type = sdinfo->satadrv_type;
11880 	if (sata_fetch_device_identify_data(sata_hba_inst, &new_sdinfo) != 0) {
11881 		/*
11882 		 * Cannot get device identification - retry later
11883 		 */
11884 		SATA_LOG_D((sata_hba_inst, CE_WARN,
11885 		    "%s fetch device identify data\n", finfo));
11886 		return (SATA_FAILURE);
11887 	}
11888 	finfox = (restore != 0) ? " restore device features" :
11889 	    " initialize device features\n";
11890 
11891 	if (sdinfo->satadrv_type == SATA_DTYPE_ATADISK) {
11892 		/* Arbitrarily set UDMA mode */
11893 		if (sata_set_dma_mode(sata_hba_inst, &new_sdinfo) !=
11894 		    SATA_SUCCESS) {
11895 			SATA_LOG_D((sata_hba_inst, CE_WARN,
11896 			    "%s set UDMA mode\n", finfo));
11897 			return (SATA_FAILURE);
11898 		}
11899 	} else { /* Assume SATA ATAPI CD/DVD */
11900 		/*  Set Removable Media Status Notification, if necessary */
11901 		if ((new_sdinfo.satadrv_id.ai_cmdset83 &
11902 		    SATA_RM_STATUS_NOTIFIC) != 0 && restore != 0) {
11903 			if (((sdinfo->satadrv_settings & SATA_DEV_RMSN) &&
11904 			    (!(new_sdinfo.satadrv_id.ai_features86 &
11905 			    SATA_RM_STATUS_NOTIFIC))) ||
11906 			    ((!(sdinfo->satadrv_settings & SATA_DEV_RMSN)) &&
11907 			    (new_sdinfo.satadrv_id.ai_features86 &
11908 			    SATA_RM_STATUS_NOTIFIC))) {
11909 				/* Current setting does not match saved one */
11910 				if (sata_set_rmsn(sata_hba_inst, sdinfo,
11911 				    sdinfo->satadrv_settings &
11912 				    SATA_DEV_RMSN) != SATA_SUCCESS)
11913 					rval = SATA_FAILURE;
11914 			}
11915 		}
11916 		/*
11917 		 * We have to set Multiword DMA or UDMA, if it is supported, as
11918 		 * we want to use DMA transfer mode whenever possible.
11919 		 * Some devices require explicit setting of the DMA mode.
11920 		 */
11921 		if (new_sdinfo.satadrv_id.ai_cap & SATA_DMA_SUPPORT) {
11922 			/* Set highest supported DMA mode */
11923 			if (sata_set_dma_mode(sata_hba_inst, &new_sdinfo) !=
11924 			    SATA_SUCCESS) {
11925 				SATA_LOG_D((sata_hba_inst, CE_WARN,
11926 				    "%s set UDMA mode\n", finfo));
11927 				rval = SATA_FAILURE;
11928 			}
11929 		}
11930 	}
11931 
11932 	if (!(new_sdinfo.satadrv_id.ai_cmdset82 & SATA_LOOK_AHEAD) &&
11933 	    !(new_sdinfo.satadrv_id.ai_cmdset82 & SATA_WRITE_CACHE)) {
11934 		/* None of the features is supported - do nothing */
11935 		SATADBG1(SATA_DBG_DEV_SETTINGS, sata_hba_inst,
11936 		    "settable features not supported\n", NULL);
11937 		goto update_sdinfo;
11938 	}
11939 
11940 	if (((new_sdinfo.satadrv_id.ai_features85 & SATA_LOOK_AHEAD) &&
11941 	    (sdinfo->satadrv_settings & SATA_DEV_READ_AHEAD)) &&
11942 	    ((new_sdinfo.satadrv_id.ai_features85 & SATA_WRITE_CACHE) &&
11943 	    (sdinfo->satadrv_settings & SATA_DEV_WRITE_CACHE))) {
11944 		/* Nothing to do */
11945 		SATADBG1(SATA_DBG_DEV_SETTINGS, sata_hba_inst,
11946 		    "no device features to set\n", NULL);
11947 		goto update_sdinfo;
11948 	}
11949 
11950 	if (!((new_sdinfo.satadrv_id.ai_features85 & SATA_LOOK_AHEAD) &&
11951 	    (sdinfo->satadrv_settings & SATA_DEV_READ_AHEAD))) {
11952 		if (sdinfo->satadrv_settings & SATA_DEV_READ_AHEAD) {
11953 			/* Enable read ahead / read cache */
11954 			cache_op = SATAC_SF_ENABLE_READ_AHEAD;
11955 			SATADBG1(SATA_DBG_DEV_SETTINGS, sata_hba_inst,
11956 			    "enabling read cache\n", NULL);
11957 		} else {
11958 			/* Disable read ahead  / read cache */
11959 			cache_op = SATAC_SF_DISABLE_READ_AHEAD;
11960 			SATADBG1(SATA_DBG_DEV_SETTINGS, sata_hba_inst,
11961 			    "disabling read cache\n", NULL);
11962 		}
11963 
11964 		/* Try to set read cache mode */
11965 		if (sata_set_cache_mode(sata_hba_inst, &new_sdinfo,
11966 		    cache_op) != SATA_SUCCESS) {
11967 			/* Pkt execution failed */
11968 			rval = SATA_FAILURE;
11969 		}
11970 	}
11971 
11972 	if (!((new_sdinfo.satadrv_id.ai_features85 & SATA_WRITE_CACHE) &&
11973 	    (sdinfo->satadrv_settings & SATA_DEV_WRITE_CACHE))) {
11974 		if (sdinfo->satadrv_settings & SATA_DEV_WRITE_CACHE) {
11975 			/* Enable write cache */
11976 			cache_op = SATAC_SF_ENABLE_WRITE_CACHE;
11977 			SATADBG1(SATA_DBG_DEV_SETTINGS, sata_hba_inst,
11978 			    "enabling write cache\n", NULL);
11979 		} else {
11980 			/* Disable write cache */
11981 			cache_op = SATAC_SF_DISABLE_WRITE_CACHE;
11982 			SATADBG1(SATA_DBG_DEV_SETTINGS, sata_hba_inst,
11983 			    "disabling write cache\n", NULL);
11984 		}
11985 		/* Try to set write cache mode */
11986 		if (sata_set_cache_mode(sata_hba_inst, &new_sdinfo,
11987 		    cache_op) != SATA_SUCCESS) {
11988 			/* Pkt execution failed */
11989 			rval = SATA_FAILURE;
11990 		}
11991 	}
11992 
11993 	if (rval == SATA_FAILURE)
11994 		SATA_LOG_D((sata_hba_inst, CE_WARN,
11995 		    "%s %s", finfo, finfox));
11996 update_sdinfo:
11997 	/*
11998 	 * We need to fetch Device Identify data again
11999 	 */
12000 	if (sata_fetch_device_identify_data(sata_hba_inst, &new_sdinfo) != 0) {
12001 		/*
12002 		 * Cannot get device identification - retry later
12003 		 */
12004 		SATA_LOG_D((sata_hba_inst, CE_WARN,
12005 		    "%s cannot re-fetch device identify data\n"));
12006 		rval = SATA_FAILURE;
12007 	}
12008 	/* Copy device sata info. */
12009 	sdinfo->satadrv_id = new_sdinfo.satadrv_id;
12010 
12011 	return (rval);
12012 }
12013 
12014 
12015 /*
12016  *
12017  * Returns 1 if threshold exceeded, 0 if threshold not exceeded, -1 if
12018  * unable to determine.
12019  *
12020  * Cannot be called in an interrupt context.
12021  *
12022  * Called by sata_build_lsense_page_2f()
12023  */
12024 
12025 static int
12026 sata_fetch_smart_return_status(sata_hba_inst_t *sata_hba_inst,
12027     sata_drive_info_t *sdinfo)
12028 {
12029 	sata_pkt_t *spkt;
12030 	sata_cmd_t *scmd;
12031 	sata_pkt_txlate_t *spx;
12032 	int rval;
12033 
12034 	spx = kmem_zalloc(sizeof (sata_pkt_txlate_t), KM_SLEEP);
12035 	spx->txlt_sata_hba_inst = sata_hba_inst;
12036 	spx->txlt_scsi_pkt = NULL;		/* No scsi pkt involved */
12037 	spkt = sata_pkt_alloc(spx, SLEEP_FUNC);
12038 	if (spkt == NULL) {
12039 		kmem_free(spx, sizeof (sata_pkt_txlate_t));
12040 		return (-1);
12041 	}
12042 	/* address is needed now */
12043 	spkt->satapkt_device.satadev_addr = sdinfo->satadrv_addr;
12044 
12045 
12046 	/* Fill sata_pkt */
12047 	spkt->satapkt_device.satadev_addr = sdinfo->satadrv_addr;
12048 	spkt->satapkt_op_mode = SATA_OPMODE_SYNCH | SATA_OPMODE_INTERRUPTS;
12049 	/* Synchronous mode, no callback */
12050 	spkt->satapkt_comp = NULL;
12051 	/* Timeout 30s */
12052 	spkt->satapkt_time = sata_default_pkt_time;
12053 
12054 	scmd = &spkt->satapkt_cmd;
12055 	scmd->satacmd_flags.sata_special_regs = B_TRUE;
12056 	scmd->satacmd_flags.sata_data_direction = SATA_DIR_NODATA_XFER;
12057 
12058 	/* Set up which registers need to be returned */
12059 	scmd->satacmd_flags.sata_copy_out_lba_mid_lsb = B_TRUE;
12060 	scmd->satacmd_flags.sata_copy_out_lba_high_lsb = B_TRUE;
12061 
12062 	/* Build SMART_RETURN_STATUS cmd in the sata_pkt */
12063 	scmd->satacmd_addr_type = 0;		/* N/A */
12064 	scmd->satacmd_sec_count_lsb = 0;	/* N/A */
12065 	scmd->satacmd_lba_low_lsb = 0;		/* N/A */
12066 	scmd->satacmd_lba_mid_lsb = SMART_MAGIC_VAL_1;
12067 	scmd->satacmd_lba_high_lsb = SMART_MAGIC_VAL_2;
12068 	scmd->satacmd_features_reg = SATA_SMART_RETURN_STATUS;
12069 	scmd->satacmd_device_reg = 0;		/* Always device 0 */
12070 	scmd->satacmd_cmd_reg = SATAC_SMART;
12071 	mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
12072 	    sdinfo->satadrv_addr.cport)));
12073 
12074 
12075 	/* Send pkt to SATA HBA driver */
12076 	if ((*SATA_START_FUNC(sata_hba_inst))(SATA_DIP(sata_hba_inst), spkt) !=
12077 	    SATA_TRAN_ACCEPTED ||
12078 	    spkt->satapkt_reason != SATA_PKT_COMPLETED) {
12079 		mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst,
12080 		    sdinfo->satadrv_addr.cport)));
12081 		/*
12082 		 * Whoops, no SMART RETURN STATUS
12083 		 */
12084 		rval = -1;
12085 	} else {
12086 		mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst,
12087 		    sdinfo->satadrv_addr.cport)));
12088 		if (scmd->satacmd_error_reg & SATA_ERROR_ABORT) {
12089 			rval = -1;
12090 			goto fail;
12091 		}
12092 		if (scmd->satacmd_status_reg & SATA_STATUS_ERR) {
12093 			rval = -1;
12094 			goto fail;
12095 		}
12096 		if ((scmd->satacmd_lba_mid_lsb == SMART_MAGIC_VAL_1) &&
12097 		    (scmd->satacmd_lba_high_lsb == SMART_MAGIC_VAL_2))
12098 			rval = 0;
12099 		else if ((scmd->satacmd_lba_mid_lsb == SMART_MAGIC_VAL_3) &&
12100 		    (scmd->satacmd_lba_high_lsb == SMART_MAGIC_VAL_4))
12101 			rval = 1;
12102 		else {
12103 			rval = -1;
12104 			goto fail;
12105 		}
12106 	}
12107 fail:
12108 	/* Free allocated resources */
12109 	sata_pkt_free(spx);
12110 	kmem_free(spx, sizeof (sata_pkt_txlate_t));
12111 
12112 	return (rval);
12113 }
12114 
12115 /*
12116  *
12117  * Returns 0 if succeeded, -1 otherwise
12118  *
12119  * Cannot be called in an interrupt context.
12120  *
12121  */
12122 static int
12123 sata_fetch_smart_data(
12124 	sata_hba_inst_t *sata_hba_inst,
12125 	sata_drive_info_t *sdinfo,
12126 	struct smart_data *smart_data)
12127 {
12128 	sata_pkt_t *spkt;
12129 	sata_cmd_t *scmd;
12130 	sata_pkt_txlate_t *spx;
12131 	int rval;
12132 
12133 #if ! defined(lint)
12134 	ASSERT(sizeof (struct smart_data) == 512);
12135 #endif
12136 
12137 	spx = kmem_zalloc(sizeof (sata_pkt_txlate_t), KM_SLEEP);
12138 	spx->txlt_sata_hba_inst = sata_hba_inst;
12139 	spx->txlt_scsi_pkt = NULL;		/* No scsi pkt involved */
12140 	spkt = sata_pkt_alloc(spx, SLEEP_FUNC);
12141 	if (spkt == NULL) {
12142 		kmem_free(spx, sizeof (sata_pkt_txlate_t));
12143 		return (-1);
12144 	}
12145 	/* address is needed now */
12146 	spkt->satapkt_device.satadev_addr = sdinfo->satadrv_addr;
12147 
12148 
12149 	/* Fill sata_pkt */
12150 	spkt->satapkt_device.satadev_addr = sdinfo->satadrv_addr;
12151 	spkt->satapkt_op_mode = SATA_OPMODE_SYNCH | SATA_OPMODE_INTERRUPTS;
12152 	/* Synchronous mode, no callback */
12153 	spkt->satapkt_comp = NULL;
12154 	/* Timeout 30s */
12155 	spkt->satapkt_time = sata_default_pkt_time;
12156 
12157 	scmd = &spkt->satapkt_cmd;
12158 	scmd->satacmd_flags.sata_data_direction = SATA_DIR_READ;
12159 
12160 	/*
12161 	 * Allocate buffer for SMART data
12162 	 */
12163 	scmd->satacmd_bp = sata_alloc_local_buffer(spx,
12164 	    sizeof (struct smart_data));
12165 	if (scmd->satacmd_bp == NULL) {
12166 		sata_pkt_free(spx);
12167 		kmem_free(spx, sizeof (sata_pkt_txlate_t));
12168 		SATA_LOG_D((sata_hba_inst, CE_WARN,
12169 		    "sata_fetch_smart_data: "
12170 		    "cannot allocate buffer"));
12171 		return (-1);
12172 	}
12173 
12174 
12175 	/* Build SMART_READ_DATA cmd in the sata_pkt */
12176 	scmd->satacmd_addr_type = 0;		/* N/A */
12177 	scmd->satacmd_sec_count_lsb = 0;	/* N/A */
12178 	scmd->satacmd_lba_low_lsb = 0;		/* N/A */
12179 	scmd->satacmd_lba_mid_lsb = SMART_MAGIC_VAL_1;
12180 	scmd->satacmd_lba_high_lsb = SMART_MAGIC_VAL_2;
12181 	scmd->satacmd_features_reg = SATA_SMART_READ_DATA;
12182 	scmd->satacmd_device_reg = 0;		/* Always device 0 */
12183 	scmd->satacmd_cmd_reg = SATAC_SMART;
12184 	mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
12185 	    sdinfo->satadrv_addr.cport)));
12186 
12187 	/* Send pkt to SATA HBA driver */
12188 	if ((*SATA_START_FUNC(sata_hba_inst))(SATA_DIP(sata_hba_inst), spkt) !=
12189 	    SATA_TRAN_ACCEPTED ||
12190 	    spkt->satapkt_reason != SATA_PKT_COMPLETED) {
12191 		mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst,
12192 		    sdinfo->satadrv_addr.cport)));
12193 		/*
12194 		 * Whoops, no SMART DATA available
12195 		 */
12196 		rval = -1;
12197 		goto fail;
12198 	} else {
12199 		mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst,
12200 		    sdinfo->satadrv_addr.cport)));
12201 		rval = ddi_dma_sync(spx->txlt_buf_dma_handle, 0, 0,
12202 		    DDI_DMA_SYNC_FORKERNEL);
12203 		ASSERT(rval == DDI_SUCCESS);
12204 		bcopy(scmd->satacmd_bp->b_un.b_addr, (uint8_t *)smart_data,
12205 		    sizeof (struct smart_data));
12206 	}
12207 
12208 fail:
12209 	/* Free allocated resources */
12210 	sata_free_local_buffer(spx);
12211 	sata_pkt_free(spx);
12212 	kmem_free(spx, sizeof (sata_pkt_txlate_t));
12213 
12214 	return (rval);
12215 }
12216 
12217 /*
12218  * Used by LOG SENSE page 0x10
12219  *
12220  * return 0 for success, -1 otherwise
12221  *
12222  */
12223 static int
12224 sata_ext_smart_selftest_read_log(
12225 	sata_hba_inst_t *sata_hba_inst,
12226 	sata_drive_info_t *sdinfo,
12227 	struct smart_ext_selftest_log *ext_selftest_log,
12228 	uint16_t block_num)
12229 {
12230 	sata_pkt_txlate_t *spx;
12231 	sata_pkt_t *spkt;
12232 	sata_cmd_t *scmd;
12233 	int rval;
12234 
12235 #if ! defined(lint)
12236 	ASSERT(sizeof (struct smart_ext_selftest_log) == 512);
12237 #endif
12238 
12239 	spx = kmem_zalloc(sizeof (sata_pkt_txlate_t), KM_SLEEP);
12240 	spx->txlt_sata_hba_inst = sata_hba_inst;
12241 	spx->txlt_scsi_pkt = NULL;		/* No scsi pkt involved */
12242 	spkt = sata_pkt_alloc(spx, SLEEP_FUNC);
12243 	if (spkt == NULL) {
12244 		kmem_free(spx, sizeof (sata_pkt_txlate_t));
12245 		return (-1);
12246 	}
12247 	/* address is needed now */
12248 	spkt->satapkt_device.satadev_addr = sdinfo->satadrv_addr;
12249 
12250 
12251 	/* Fill sata_pkt */
12252 	spkt->satapkt_device.satadev_addr = sdinfo->satadrv_addr;
12253 	spkt->satapkt_op_mode = SATA_OPMODE_SYNCH | SATA_OPMODE_INTERRUPTS;
12254 	/* Synchronous mode, no callback */
12255 	spkt->satapkt_comp = NULL;
12256 	/* Timeout 30s */
12257 	spkt->satapkt_time = sata_default_pkt_time;
12258 
12259 	scmd = &spkt->satapkt_cmd;
12260 	scmd->satacmd_flags.sata_data_direction = SATA_DIR_READ;
12261 
12262 	/*
12263 	 * Allocate buffer for SMART extended self-test log
12264 	 */
12265 	scmd->satacmd_bp = sata_alloc_local_buffer(spx,
12266 	    sizeof (struct smart_ext_selftest_log));
12267 	if (scmd->satacmd_bp == NULL) {
12268 		sata_pkt_free(spx);
12269 		kmem_free(spx, sizeof (sata_pkt_txlate_t));
12270 		SATA_LOG_D((sata_hba_inst, CE_WARN,
12271 		    "sata_ext_smart_selftest_log: "
12272 		    "cannot allocate buffer"));
12273 		return (-1);
12274 	}
12275 
12276 	/* Build READ LOG EXT w/ extended self-test log cmd in the sata_pkt */
12277 	scmd->satacmd_addr_type = ATA_ADDR_LBA48;
12278 	scmd->satacmd_sec_count_lsb = 1;	/* One sector of selftest log */
12279 	scmd->satacmd_sec_count_msb = 0;	/* One sector of selftest log */
12280 	scmd->satacmd_lba_low_lsb = EXT_SMART_SELFTEST_LOG_PAGE;
12281 	scmd->satacmd_lba_low_msb = 0;
12282 	scmd->satacmd_lba_mid_lsb = block_num & 0xff;
12283 	scmd->satacmd_lba_mid_msb = block_num >> 8;
12284 	scmd->satacmd_device_reg = 0;		/* Always device 0 */
12285 	scmd->satacmd_cmd_reg = SATAC_READ_LOG_EXT;
12286 
12287 	mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
12288 	    sdinfo->satadrv_addr.cport)));
12289 
12290 	/* Send pkt to SATA HBA driver */
12291 	if ((*SATA_START_FUNC(sata_hba_inst))(SATA_DIP(sata_hba_inst), spkt) !=
12292 	    SATA_TRAN_ACCEPTED ||
12293 	    spkt->satapkt_reason != SATA_PKT_COMPLETED) {
12294 		mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst,
12295 		    sdinfo->satadrv_addr.cport)));
12296 
12297 		/*
12298 		 * Whoops, no SMART selftest log info available
12299 		 */
12300 		rval = -1;
12301 		goto fail;
12302 	} else {
12303 		mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst,
12304 		    sdinfo->satadrv_addr.cport)));
12305 
12306 		rval = ddi_dma_sync(spx->txlt_buf_dma_handle, 0, 0,
12307 		    DDI_DMA_SYNC_FORKERNEL);
12308 		ASSERT(rval == DDI_SUCCESS);
12309 		bcopy(scmd->satacmd_bp->b_un.b_addr,
12310 		    (uint8_t *)ext_selftest_log,
12311 		    sizeof (struct smart_ext_selftest_log));
12312 		rval = 0;
12313 	}
12314 
12315 fail:
12316 	/* Free allocated resources */
12317 	sata_free_local_buffer(spx);
12318 	sata_pkt_free(spx);
12319 	kmem_free(spx, sizeof (sata_pkt_txlate_t));
12320 
12321 	return (rval);
12322 }
12323 
12324 /*
12325  * Returns 0 for success, -1 otherwise
12326  *
12327  * SMART self-test log data is returned in buffer pointed to by selftest_log
12328  */
12329 static int
12330 sata_smart_selftest_log(
12331 	sata_hba_inst_t *sata_hba_inst,
12332 	sata_drive_info_t *sdinfo,
12333 	struct smart_selftest_log *selftest_log)
12334 {
12335 	sata_pkt_t *spkt;
12336 	sata_cmd_t *scmd;
12337 	sata_pkt_txlate_t *spx;
12338 	int rval;
12339 
12340 #if ! defined(lint)
12341 	ASSERT(sizeof (struct smart_selftest_log) == 512);
12342 #endif
12343 
12344 	spx = kmem_zalloc(sizeof (sata_pkt_txlate_t), KM_SLEEP);
12345 	spx->txlt_sata_hba_inst = sata_hba_inst;
12346 	spx->txlt_scsi_pkt = NULL;		/* No scsi pkt involved */
12347 	spkt = sata_pkt_alloc(spx, SLEEP_FUNC);
12348 	if (spkt == NULL) {
12349 		kmem_free(spx, sizeof (sata_pkt_txlate_t));
12350 		return (-1);
12351 	}
12352 	/* address is needed now */
12353 	spkt->satapkt_device.satadev_addr = sdinfo->satadrv_addr;
12354 
12355 
12356 	/* Fill sata_pkt */
12357 	spkt->satapkt_device.satadev_addr = sdinfo->satadrv_addr;
12358 	spkt->satapkt_op_mode = SATA_OPMODE_SYNCH | SATA_OPMODE_INTERRUPTS;
12359 	/* Synchronous mode, no callback */
12360 	spkt->satapkt_comp = NULL;
12361 	/* Timeout 30s */
12362 	spkt->satapkt_time = sata_default_pkt_time;
12363 
12364 	scmd = &spkt->satapkt_cmd;
12365 	scmd->satacmd_flags.sata_data_direction = SATA_DIR_READ;
12366 
12367 	/*
12368 	 * Allocate buffer for SMART SELFTEST LOG
12369 	 */
12370 	scmd->satacmd_bp = sata_alloc_local_buffer(spx,
12371 	    sizeof (struct smart_selftest_log));
12372 	if (scmd->satacmd_bp == NULL) {
12373 		sata_pkt_free(spx);
12374 		kmem_free(spx, sizeof (sata_pkt_txlate_t));
12375 		SATA_LOG_D((sata_hba_inst, CE_WARN,
12376 		    "sata_smart_selftest_log: "
12377 		    "cannot allocate buffer"));
12378 		return (-1);
12379 	}
12380 
12381 	/* Build SMART_READ_LOG cmd in the sata_pkt */
12382 	scmd->satacmd_addr_type = 0;		/* N/A */
12383 	scmd->satacmd_sec_count_lsb = 1;	/* One sector of SMART log */
12384 	scmd->satacmd_lba_low_lsb = SMART_SELFTEST_LOG_PAGE;
12385 	scmd->satacmd_lba_mid_lsb = SMART_MAGIC_VAL_1;
12386 	scmd->satacmd_lba_high_lsb = SMART_MAGIC_VAL_2;
12387 	scmd->satacmd_features_reg = SATA_SMART_READ_LOG;
12388 	scmd->satacmd_device_reg = 0;		/* Always device 0 */
12389 	scmd->satacmd_cmd_reg = SATAC_SMART;
12390 	mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
12391 	    sdinfo->satadrv_addr.cport)));
12392 
12393 	/* Send pkt to SATA HBA driver */
12394 	if ((*SATA_START_FUNC(sata_hba_inst))(SATA_DIP(sata_hba_inst), spkt) !=
12395 	    SATA_TRAN_ACCEPTED ||
12396 	    spkt->satapkt_reason != SATA_PKT_COMPLETED) {
12397 		mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst,
12398 		    sdinfo->satadrv_addr.cport)));
12399 		/*
12400 		 * Whoops, no SMART DATA available
12401 		 */
12402 		rval = -1;
12403 		goto fail;
12404 	} else {
12405 		mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst,
12406 		    sdinfo->satadrv_addr.cport)));
12407 		rval = ddi_dma_sync(spx->txlt_buf_dma_handle, 0, 0,
12408 		    DDI_DMA_SYNC_FORKERNEL);
12409 		ASSERT(rval == DDI_SUCCESS);
12410 		bcopy(scmd->satacmd_bp->b_un.b_addr, (uint8_t *)selftest_log,
12411 		    sizeof (struct smart_selftest_log));
12412 		rval = 0;
12413 	}
12414 
12415 fail:
12416 	/* Free allocated resources */
12417 	sata_free_local_buffer(spx);
12418 	sata_pkt_free(spx);
12419 	kmem_free(spx, sizeof (sata_pkt_txlate_t));
12420 
12421 	return (rval);
12422 }
12423 
12424 
12425 /*
12426  * Returns 0 for success, -1 otherwise
12427  *
12428  * SMART READ LOG data is returned in buffer pointed to by smart_log
12429  */
12430 static int
12431 sata_smart_read_log(
12432 	sata_hba_inst_t *sata_hba_inst,
12433 	sata_drive_info_t *sdinfo,
12434 	uint8_t *smart_log,		/* where the data should be returned */
12435 	uint8_t which_log,		/* which log should be returned */
12436 	uint8_t log_size)		/* # of 512 bytes in log */
12437 {
12438 	sata_pkt_t *spkt;
12439 	sata_cmd_t *scmd;
12440 	sata_pkt_txlate_t *spx;
12441 	int rval;
12442 
12443 	spx = kmem_zalloc(sizeof (sata_pkt_txlate_t), KM_SLEEP);
12444 	spx->txlt_sata_hba_inst = sata_hba_inst;
12445 	spx->txlt_scsi_pkt = NULL;		/* No scsi pkt involved */
12446 	spkt = sata_pkt_alloc(spx, SLEEP_FUNC);
12447 	if (spkt == NULL) {
12448 		kmem_free(spx, sizeof (sata_pkt_txlate_t));
12449 		return (-1);
12450 	}
12451 	/* address is needed now */
12452 	spkt->satapkt_device.satadev_addr = sdinfo->satadrv_addr;
12453 
12454 
12455 	/* Fill sata_pkt */
12456 	spkt->satapkt_device.satadev_addr = sdinfo->satadrv_addr;
12457 	spkt->satapkt_op_mode = SATA_OPMODE_SYNCH | SATA_OPMODE_INTERRUPTS;
12458 	/* Synchronous mode, no callback */
12459 	spkt->satapkt_comp = NULL;
12460 	/* Timeout 30s */
12461 	spkt->satapkt_time = sata_default_pkt_time;
12462 
12463 	scmd = &spkt->satapkt_cmd;
12464 	scmd->satacmd_flags.sata_data_direction = SATA_DIR_READ;
12465 
12466 	/*
12467 	 * Allocate buffer for SMART READ LOG
12468 	 */
12469 	scmd->satacmd_bp = sata_alloc_local_buffer(spx, log_size * 512);
12470 	if (scmd->satacmd_bp == NULL) {
12471 		sata_pkt_free(spx);
12472 		kmem_free(spx, sizeof (sata_pkt_txlate_t));
12473 		SATA_LOG_D((sata_hba_inst, CE_WARN,
12474 		    "sata_smart_read_log: " "cannot allocate buffer"));
12475 		return (-1);
12476 	}
12477 
12478 	/* Build SMART_READ_LOG cmd in the sata_pkt */
12479 	scmd->satacmd_addr_type = 0;		/* N/A */
12480 	scmd->satacmd_sec_count_lsb = log_size;	/* what the caller asked for */
12481 	scmd->satacmd_lba_low_lsb = which_log;	/* which log page */
12482 	scmd->satacmd_lba_mid_lsb = SMART_MAGIC_VAL_1;
12483 	scmd->satacmd_lba_high_lsb = SMART_MAGIC_VAL_2;
12484 	scmd->satacmd_features_reg = SATA_SMART_READ_LOG;
12485 	scmd->satacmd_device_reg = 0;		/* Always device 0 */
12486 	scmd->satacmd_cmd_reg = SATAC_SMART;
12487 
12488 	mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
12489 	    sdinfo->satadrv_addr.cport)));
12490 
12491 	/* Send pkt to SATA HBA driver */
12492 	if ((*SATA_START_FUNC(sata_hba_inst))(SATA_DIP(sata_hba_inst), spkt) !=
12493 	    SATA_TRAN_ACCEPTED ||
12494 	    spkt->satapkt_reason != SATA_PKT_COMPLETED) {
12495 		mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst,
12496 		    sdinfo->satadrv_addr.cport)));
12497 
12498 		/*
12499 		 * Whoops, no SMART DATA available
12500 		 */
12501 		rval = -1;
12502 		goto fail;
12503 	} else {
12504 		mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst,
12505 		    sdinfo->satadrv_addr.cport)));
12506 
12507 		rval = ddi_dma_sync(spx->txlt_buf_dma_handle, 0, 0,
12508 		    DDI_DMA_SYNC_FORKERNEL);
12509 		ASSERT(rval == DDI_SUCCESS);
12510 		bcopy(scmd->satacmd_bp->b_un.b_addr, smart_log, log_size * 512);
12511 		rval = 0;
12512 	}
12513 
12514 fail:
12515 	/* Free allocated resources */
12516 	sata_free_local_buffer(spx);
12517 	sata_pkt_free(spx);
12518 	kmem_free(spx, sizeof (sata_pkt_txlate_t));
12519 
12520 	return (rval);
12521 }
12522 
12523 /*
12524  * Used by LOG SENSE page 0x10
12525  *
12526  * return 0 for success, -1 otherwise
12527  *
12528  */
12529 static int
12530 sata_read_log_ext_directory(
12531 	sata_hba_inst_t *sata_hba_inst,
12532 	sata_drive_info_t *sdinfo,
12533 	struct read_log_ext_directory *logdir)
12534 {
12535 	sata_pkt_txlate_t *spx;
12536 	sata_pkt_t *spkt;
12537 	sata_cmd_t *scmd;
12538 	int rval;
12539 
12540 #if ! defined(lint)
12541 	ASSERT(sizeof (struct read_log_ext_directory) == 512);
12542 #endif
12543 
12544 	spx = kmem_zalloc(sizeof (sata_pkt_txlate_t), KM_SLEEP);
12545 	spx->txlt_sata_hba_inst = sata_hba_inst;
12546 	spx->txlt_scsi_pkt = NULL;		/* No scsi pkt involved */
12547 	spkt = sata_pkt_alloc(spx, SLEEP_FUNC);
12548 	if (spkt == NULL) {
12549 		kmem_free(spx, sizeof (sata_pkt_txlate_t));
12550 		return (-1);
12551 	}
12552 
12553 	/* Fill sata_pkt */
12554 	spkt->satapkt_device.satadev_addr = sdinfo->satadrv_addr;
12555 	spkt->satapkt_op_mode = SATA_OPMODE_SYNCH | SATA_OPMODE_INTERRUPTS;
12556 	/* Synchronous mode, no callback */
12557 	spkt->satapkt_comp = NULL;
12558 	/* Timeout 30s */
12559 	spkt->satapkt_time = sata_default_pkt_time;
12560 
12561 	scmd = &spkt->satapkt_cmd;
12562 	scmd->satacmd_flags.sata_data_direction = SATA_DIR_READ;
12563 
12564 	/*
12565 	 * Allocate buffer for SMART READ LOG EXTENDED command
12566 	 */
12567 	scmd->satacmd_bp = sata_alloc_local_buffer(spx,
12568 	    sizeof (struct read_log_ext_directory));
12569 	if (scmd->satacmd_bp == NULL) {
12570 		sata_pkt_free(spx);
12571 		kmem_free(spx, sizeof (sata_pkt_txlate_t));
12572 		SATA_LOG_D((sata_hba_inst, CE_WARN,
12573 		    "sata_read_log_ext_directory: "
12574 		    "cannot allocate buffer"));
12575 		return (-1);
12576 	}
12577 
12578 	/* Build READ LOG EXT w/ log directory cmd in the  sata_pkt */
12579 	scmd->satacmd_addr_type = ATA_ADDR_LBA48;
12580 	scmd->satacmd_sec_count_lsb = 1;	/* One sector of directory */
12581 	scmd->satacmd_sec_count_msb = 0;	/* One sector of directory */
12582 	scmd->satacmd_lba_low_lsb = READ_LOG_EXT_LOG_DIRECTORY;
12583 	scmd->satacmd_lba_low_msb = 0;
12584 	scmd->satacmd_lba_mid_lsb = 0;
12585 	scmd->satacmd_lba_mid_msb = 0;
12586 	scmd->satacmd_device_reg = 0;		/* Always device 0 */
12587 	scmd->satacmd_cmd_reg = SATAC_READ_LOG_EXT;
12588 
12589 	mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
12590 	    sdinfo->satadrv_addr.cport)));
12591 
12592 	/* Send pkt to SATA HBA driver */
12593 	if ((*SATA_START_FUNC(sata_hba_inst))(SATA_DIP(sata_hba_inst), spkt) !=
12594 	    SATA_TRAN_ACCEPTED ||
12595 	    spkt->satapkt_reason != SATA_PKT_COMPLETED) {
12596 		mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst,
12597 		    sdinfo->satadrv_addr.cport)));
12598 		/*
12599 		 * Whoops, no SMART selftest log info available
12600 		 */
12601 		rval = -1;
12602 		goto fail;
12603 	} else {
12604 		mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst,
12605 		    sdinfo->satadrv_addr.cport)));
12606 		rval = ddi_dma_sync(spx->txlt_buf_dma_handle, 0, 0,
12607 		    DDI_DMA_SYNC_FORKERNEL);
12608 		ASSERT(rval == DDI_SUCCESS);
12609 		bcopy(scmd->satacmd_bp->b_un.b_addr, (uint8_t *)logdir,
12610 		    sizeof (struct read_log_ext_directory));
12611 		rval = 0;
12612 	}
12613 
12614 fail:
12615 	/* Free allocated resources */
12616 	sata_free_local_buffer(spx);
12617 	sata_pkt_free(spx);
12618 	kmem_free(spx, sizeof (sata_pkt_txlate_t));
12619 
12620 	return (rval);
12621 }
12622 
12623 
12624 /*
12625  * sata_xlate_errors() is used to translate (S)ATA error
12626  * information to SCSI information returned in the SCSI
12627  * packet.
12628  */
12629 static void
12630 sata_xlate_errors(sata_pkt_txlate_t *spx)
12631 {
12632 	struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
12633 	struct scsi_extended_sense *sense;
12634 
12635 	scsipkt->pkt_reason = CMD_INCOMPLETE;
12636 	*scsipkt->pkt_scbp = STATUS_CHECK;
12637 	sense = sata_arq_sense(spx);
12638 
12639 	switch (spx->txlt_sata_pkt->satapkt_reason) {
12640 	case SATA_PKT_PORT_ERROR:
12641 		/*
12642 		 * We have no device data. Assume no data transfered.
12643 		 */
12644 		sense->es_key = KEY_HARDWARE_ERROR;
12645 		break;
12646 
12647 	case SATA_PKT_DEV_ERROR:
12648 		if (spx->txlt_sata_pkt->satapkt_cmd.satacmd_status_reg &
12649 		    SATA_STATUS_ERR) {
12650 			/*
12651 			 * determine dev error reason from error
12652 			 * reg content
12653 			 */
12654 			sata_decode_device_error(spx, sense);
12655 			break;
12656 		}
12657 		/* No extended sense key - no info available */
12658 		break;
12659 
12660 	case SATA_PKT_TIMEOUT:
12661 		/*
12662 		 * scsipkt->pkt_reason = CMD_TIMEOUT; This causes problems.
12663 		 */
12664 		scsipkt->pkt_reason = CMD_INCOMPLETE;
12665 		/* No extended sense key */
12666 		break;
12667 
12668 	case SATA_PKT_ABORTED:
12669 		scsipkt->pkt_reason = CMD_ABORTED;
12670 		/* No extended sense key */
12671 		break;
12672 
12673 	case SATA_PKT_RESET:
12674 		/*
12675 		 * pkt aborted either by an explicit reset request from
12676 		 * a host, or due to error recovery
12677 		 */
12678 		scsipkt->pkt_reason = CMD_RESET;
12679 		break;
12680 
12681 	default:
12682 		scsipkt->pkt_reason = CMD_TRAN_ERR;
12683 		break;
12684 	}
12685 }
12686 
12687 
12688 
12689 
12690 /*
12691  * Log sata message
12692  * dev pathname msg line preceeds the logged message.
12693  */
12694 
12695 static	void
12696 sata_log(sata_hba_inst_t *sata_hba_inst, uint_t level, char *fmt, ...)
12697 {
12698 	char pathname[128];
12699 	dev_info_t *dip;
12700 	va_list ap;
12701 
12702 	mutex_enter(&sata_log_mutex);
12703 
12704 	va_start(ap, fmt);
12705 	(void) vsprintf(sata_log_buf, fmt, ap);
12706 	va_end(ap);
12707 
12708 	if (sata_hba_inst != NULL) {
12709 		dip = SATA_DIP(sata_hba_inst);
12710 		(void) ddi_pathname(dip, pathname);
12711 	} else {
12712 		pathname[0] = 0;
12713 	}
12714 	if (level == CE_CONT) {
12715 		if (sata_debug_flags == 0)
12716 			cmn_err(level, "?%s:\n %s\n", pathname, sata_log_buf);
12717 		else
12718 			cmn_err(level, "%s:\n %s\n", pathname, sata_log_buf);
12719 	} else
12720 		cmn_err(level, "%s:\n %s", pathname, sata_log_buf);
12721 
12722 	mutex_exit(&sata_log_mutex);
12723 }
12724 
12725 
12726 /* ******** Asynchronous HBA events handling & hotplugging support ******** */
12727 
12728 /*
12729  * Start or terminate the thread, depending on flag arg and current state
12730  */
12731 static void
12732 sata_event_thread_control(int startstop)
12733 {
12734 	static 	int sata_event_thread_terminating = 0;
12735 	static 	int sata_event_thread_starting = 0;
12736 	int i;
12737 
12738 	mutex_enter(&sata_event_mutex);
12739 
12740 	if (startstop == 0 && (sata_event_thread_starting == 1 ||
12741 	    sata_event_thread_terminating == 1)) {
12742 		mutex_exit(&sata_event_mutex);
12743 		return;
12744 	}
12745 	if (startstop == 1 && sata_event_thread_starting == 1) {
12746 		mutex_exit(&sata_event_mutex);
12747 		return;
12748 	}
12749 	if (startstop == 1 && sata_event_thread_terminating == 1) {
12750 		sata_event_thread_starting = 1;
12751 		/* wait til terminate operation completes */
12752 		i = SATA_EVNT_DAEMON_TERM_WAIT/SATA_EVNT_DAEMON_TERM_TIMEOUT;
12753 		while (sata_event_thread_terminating == 1) {
12754 			if (i-- <= 0) {
12755 				sata_event_thread_starting = 0;
12756 				mutex_exit(&sata_event_mutex);
12757 #ifdef SATA_DEBUG
12758 				cmn_err(CE_WARN, "sata_event_thread_control: "
12759 				    "timeout waiting for thread to terminate");
12760 #endif
12761 				return;
12762 			}
12763 			mutex_exit(&sata_event_mutex);
12764 			delay(drv_usectohz(SATA_EVNT_DAEMON_TERM_TIMEOUT));
12765 			mutex_enter(&sata_event_mutex);
12766 		}
12767 	}
12768 	if (startstop == 1) {
12769 		if (sata_event_thread == NULL) {
12770 			sata_event_thread = thread_create(NULL, 0,
12771 			    (void (*)())sata_event_daemon,
12772 			    &sata_hba_list, 0, &p0, TS_RUN, minclsyspri);
12773 		}
12774 		sata_event_thread_starting = 0;
12775 		mutex_exit(&sata_event_mutex);
12776 		return;
12777 	}
12778 
12779 	/*
12780 	 * If we got here, thread may need to be terminated
12781 	 */
12782 	if (sata_event_thread != NULL) {
12783 		int i;
12784 		/* Signal event thread to go away */
12785 		sata_event_thread_terminating = 1;
12786 		sata_event_thread_terminate = 1;
12787 		cv_signal(&sata_event_cv);
12788 		/*
12789 		 * Wait til daemon terminates.
12790 		 */
12791 		i = SATA_EVNT_DAEMON_TERM_WAIT/SATA_EVNT_DAEMON_TERM_TIMEOUT;
12792 		while (sata_event_thread_terminate == 1) {
12793 			mutex_exit(&sata_event_mutex);
12794 			if (i-- <= 0) {
12795 				/* Daemon did not go away !!! */
12796 #ifdef SATA_DEBUG
12797 				cmn_err(CE_WARN, "sata_event_thread_control: "
12798 				    "cannot terminate event daemon thread");
12799 #endif
12800 				mutex_enter(&sata_event_mutex);
12801 				break;
12802 			}
12803 			delay(drv_usectohz(SATA_EVNT_DAEMON_TERM_TIMEOUT));
12804 			mutex_enter(&sata_event_mutex);
12805 		}
12806 		sata_event_thread_terminating = 0;
12807 	}
12808 	ASSERT(sata_event_thread_terminating == 0);
12809 	ASSERT(sata_event_thread_starting == 0);
12810 	mutex_exit(&sata_event_mutex);
12811 }
12812 
12813 
12814 /*
12815  * SATA HBA event notification function.
12816  * Events reported by SATA HBA drivers per HBA instance relate to a change in
12817  * a port and/or device state or a controller itself.
12818  * Events for different addresses/addr types cannot be combined.
12819  * A warning message is generated for each event type.
12820  * Events are not processed by this function, so only the
12821  * event flag(s)is set for an affected entity and the event thread is
12822  * waken up. Event daemon thread processes all events.
12823  *
12824  * NOTE: Since more than one event may be reported at the same time, one
12825  * cannot determine a sequence of events when opposite event are reported, eg.
12826  * LINK_LOST and LINK_ESTABLISHED. Actual port status during event processing
12827  * is taking precedence over reported events, i.e. may cause ignoring some
12828  * events.
12829  */
12830 #define	SATA_EVENT_MAX_MSG_LENGTH	79
12831 
12832 void
12833 sata_hba_event_notify(dev_info_t *dip, sata_device_t *sata_device, int event)
12834 {
12835 	sata_hba_inst_t *sata_hba_inst = NULL;
12836 	sata_address_t *saddr;
12837 	sata_drive_info_t *sdinfo;
12838 	sata_port_stats_t *pstats;
12839 	int cport, pmport;
12840 	char buf1[SATA_EVENT_MAX_MSG_LENGTH + 1];
12841 	char buf2[SATA_EVENT_MAX_MSG_LENGTH + 1];
12842 	char *lcp;
12843 	static char *err_msg_evnt_1 =
12844 	    "sata_hba_event_notify: invalid port event 0x%x ";
12845 	static char *err_msg_evnt_2 =
12846 	    "sata_hba_event_notify: invalid device event 0x%x ";
12847 	int linkevent;
12848 
12849 	/*
12850 	 * There is a possibility that an event will be generated on HBA
12851 	 * that has not completed attachment or is detaching.
12852 	 * HBA driver should prevent this, but just in case it does not,
12853 	 * we need to ignore events for such HBA.
12854 	 */
12855 	mutex_enter(&sata_mutex);
12856 	for (sata_hba_inst = sata_hba_list; sata_hba_inst != NULL;
12857 	    sata_hba_inst = sata_hba_inst->satahba_next) {
12858 		if (SATA_DIP(sata_hba_inst) == dip)
12859 			if (sata_hba_inst->satahba_attached == 1)
12860 				break;
12861 	}
12862 	mutex_exit(&sata_mutex);
12863 	if (sata_hba_inst == NULL)
12864 		/* HBA not attached */
12865 		return;
12866 
12867 	ASSERT(sata_device != NULL);
12868 
12869 	/*
12870 	 * Validate address before - do not proceed with invalid address.
12871 	 */
12872 	saddr = &sata_device->satadev_addr;
12873 	if (saddr->cport >= SATA_NUM_CPORTS(sata_hba_inst))
12874 		return;
12875 	if (saddr->qual == SATA_ADDR_PMPORT ||
12876 	    saddr->qual == SATA_ADDR_DPMPORT)
12877 		/* Port Multiplier not supported yet */
12878 		return;
12879 
12880 	cport = saddr->cport;
12881 	pmport = saddr->pmport;
12882 
12883 	buf1[0] = buf2[0] = '\0';
12884 
12885 	/*
12886 	 * Events refer to devices, ports and controllers - each has
12887 	 * unique address. Events for different addresses cannot be combined.
12888 	 */
12889 	if (saddr->qual & (SATA_ADDR_CPORT | SATA_ADDR_PMPORT)) {
12890 
12891 		mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst, cport)));
12892 
12893 		/* qualify this event(s) */
12894 		if ((event & SATA_EVNT_PORT_EVENTS) == 0) {
12895 			/* Invalid event for the device port */
12896 			(void) sprintf(buf2, err_msg_evnt_1,
12897 			    event & SATA_EVNT_PORT_EVENTS);
12898 			mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst, cport)));
12899 			goto event_info;
12900 		}
12901 		if (saddr->qual == SATA_ADDR_CPORT) {
12902 			/* Controller's device port event */
12903 
12904 			(SATA_CPORT_INFO(sata_hba_inst, cport))->
12905 			    cport_event_flags |=
12906 			    event & SATA_EVNT_PORT_EVENTS;
12907 			pstats =
12908 			    &(SATA_CPORT_INFO(sata_hba_inst, cport))->
12909 			    cport_stats;
12910 		} else {
12911 			/* Port multiplier's device port event */
12912 			(SATA_PMPORT_INFO(sata_hba_inst, cport, pmport))->
12913 			    pmport_event_flags |=
12914 			    event & SATA_EVNT_PORT_EVENTS;
12915 			pstats =
12916 			    &(SATA_PMPORT_INFO(sata_hba_inst, cport, pmport))->
12917 			    pmport_stats;
12918 		}
12919 
12920 		/*
12921 		 * Add to statistics and log the message. We have to do it
12922 		 * here rather than in the event daemon, because there may be
12923 		 * multiple events occuring before they are processed.
12924 		 */
12925 		linkevent = event &
12926 		    (SATA_EVNT_LINK_LOST | SATA_EVNT_LINK_ESTABLISHED);
12927 		if (linkevent) {
12928 			if (linkevent == (SATA_EVNT_LINK_LOST |
12929 			    SATA_EVNT_LINK_ESTABLISHED)) {
12930 				/* This is likely event combination */
12931 				(void) strlcat(buf1, "link lost/established, ",
12932 				    SATA_EVENT_MAX_MSG_LENGTH);
12933 
12934 				if (pstats->link_lost < 0xffffffffffffffffULL)
12935 					pstats->link_lost++;
12936 				if (pstats->link_established <
12937 				    0xffffffffffffffffULL)
12938 					pstats->link_established++;
12939 				linkevent = 0;
12940 			} else if (linkevent & SATA_EVNT_LINK_LOST) {
12941 				(void) strlcat(buf1, "link lost, ",
12942 				    SATA_EVENT_MAX_MSG_LENGTH);
12943 
12944 				if (pstats->link_lost < 0xffffffffffffffffULL)
12945 					pstats->link_lost++;
12946 			} else {
12947 				(void) strlcat(buf1, "link established, ",
12948 				    SATA_EVENT_MAX_MSG_LENGTH);
12949 				if (pstats->link_established <
12950 				    0xffffffffffffffffULL)
12951 					pstats->link_established++;
12952 			}
12953 		}
12954 		if (event & SATA_EVNT_DEVICE_ATTACHED) {
12955 			(void) strlcat(buf1, "device attached, ",
12956 			    SATA_EVENT_MAX_MSG_LENGTH);
12957 			if (pstats->device_attached < 0xffffffffffffffffULL)
12958 				pstats->device_attached++;
12959 		}
12960 		if (event & SATA_EVNT_DEVICE_DETACHED) {
12961 			(void) strlcat(buf1, "device detached, ",
12962 			    SATA_EVENT_MAX_MSG_LENGTH);
12963 			if (pstats->device_detached < 0xffffffffffffffffULL)
12964 				pstats->device_detached++;
12965 		}
12966 		if (event & SATA_EVNT_PWR_LEVEL_CHANGED) {
12967 			SATADBG1(SATA_DBG_EVENTS, sata_hba_inst,
12968 			    "port %d power level changed", cport);
12969 			if (pstats->port_pwr_changed < 0xffffffffffffffffULL)
12970 				pstats->port_pwr_changed++;
12971 		}
12972 
12973 		if ((event & ~SATA_EVNT_PORT_EVENTS) != 0) {
12974 			/* There should be no other events for this address */
12975 			(void) sprintf(buf2, err_msg_evnt_1,
12976 			    event & ~SATA_EVNT_PORT_EVENTS);
12977 		}
12978 		mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst, cport)));
12979 
12980 	} else if (saddr->qual & (SATA_ADDR_DCPORT | SATA_ADDR_DPMPORT)) {
12981 		mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst, cport)));
12982 
12983 		/* qualify this event */
12984 		if ((event & SATA_EVNT_DEVICE_RESET) == 0) {
12985 			/* Invalid event for a device */
12986 			(void) sprintf(buf2, err_msg_evnt_2,
12987 			    event & SATA_EVNT_DEVICE_RESET);
12988 			mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst, cport)));
12989 			goto event_info;
12990 		}
12991 		/* drive event */
12992 		sdinfo = sata_get_device_info(sata_hba_inst, sata_device);
12993 		if (sdinfo != NULL) {
12994 			if (event & SATA_EVNT_DEVICE_RESET) {
12995 				(void) strlcat(buf1, "device reset, ",
12996 				    SATA_EVENT_MAX_MSG_LENGTH);
12997 				if (sdinfo->satadrv_stats.drive_reset <
12998 				    0xffffffffffffffffULL)
12999 					sdinfo->satadrv_stats.drive_reset++;
13000 				sdinfo->satadrv_event_flags |=
13001 				    SATA_EVNT_DEVICE_RESET;
13002 			}
13003 		}
13004 		if ((event & ~SATA_EVNT_DEVICE_RESET) != 0) {
13005 			/* Invalid event for a device */
13006 			(void) sprintf(buf2, err_msg_evnt_2,
13007 			    event & ~SATA_EVNT_DRIVE_EVENTS);
13008 		}
13009 		mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst, cport)));
13010 	} else {
13011 		if (saddr->qual != SATA_ADDR_NULL) {
13012 			/* Wrong address qualifier */
13013 			SATA_LOG_D((sata_hba_inst, CE_WARN,
13014 			    "sata_hba_event_notify: invalid address 0x%x",
13015 			    *(uint32_t *)saddr));
13016 			return;
13017 		}
13018 		if ((event & SATA_EVNT_CONTROLLER_EVENTS) == 0 ||
13019 		    (event & ~SATA_EVNT_CONTROLLER_EVENTS) != 0) {
13020 			/* Invalid event for the controller */
13021 			SATA_LOG_D((sata_hba_inst, CE_WARN,
13022 			    "sata_hba_event_notify: invalid event 0x%x for "
13023 			    "controller",
13024 			    event & SATA_EVNT_CONTROLLER_EVENTS));
13025 			return;
13026 		}
13027 		buf1[0] = '\0';
13028 		/* This may be a frequent and not interesting event */
13029 		SATADBG1(SATA_DBG_EVENTS, sata_hba_inst,
13030 		    "controller power level changed\n", NULL);
13031 
13032 		mutex_enter(&sata_hba_inst->satahba_mutex);
13033 		if (sata_hba_inst->satahba_stats.ctrl_pwr_change <
13034 		    0xffffffffffffffffULL)
13035 			sata_hba_inst->satahba_stats.ctrl_pwr_change++;
13036 
13037 		sata_hba_inst->satahba_event_flags |=
13038 		    SATA_EVNT_PWR_LEVEL_CHANGED;
13039 		mutex_exit(&sata_hba_inst->satahba_mutex);
13040 	}
13041 	/*
13042 	 * If we got here, there is something to do with this HBA
13043 	 * instance.
13044 	 */
13045 	mutex_enter(&sata_hba_inst->satahba_mutex);
13046 	sata_hba_inst->satahba_event_flags |= SATA_EVNT_MAIN;
13047 	mutex_exit(&sata_hba_inst->satahba_mutex);
13048 	mutex_enter(&sata_mutex);
13049 	sata_event_pending |= SATA_EVNT_MAIN;	/* global event indicator */
13050 	mutex_exit(&sata_mutex);
13051 
13052 	/* Tickle event thread */
13053 	mutex_enter(&sata_event_mutex);
13054 	if (sata_event_thread_active == 0)
13055 		cv_signal(&sata_event_cv);
13056 	mutex_exit(&sata_event_mutex);
13057 
13058 event_info:
13059 	if (buf1[0] != '\0') {
13060 		lcp = strrchr(buf1, ',');
13061 		if (lcp != NULL)
13062 			*lcp = '\0';
13063 	}
13064 	if (saddr->qual == SATA_ADDR_CPORT ||
13065 	    saddr->qual == SATA_ADDR_DCPORT) {
13066 		if (buf1[0] != '\0') {
13067 			sata_log(sata_hba_inst, CE_NOTE, "port %d: %s\n",
13068 			    cport, buf1);
13069 		}
13070 		if (buf2[0] != '\0') {
13071 			sata_log(sata_hba_inst, CE_NOTE, "port %d: %s\n",
13072 			    cport, buf2);
13073 		}
13074 	} else if (saddr->qual == SATA_ADDR_PMPORT ||
13075 	    saddr->qual == SATA_ADDR_DPMPORT) {
13076 		if (buf1[0] != '\0') {
13077 			sata_log(sata_hba_inst, CE_NOTE,
13078 			    "port %d pmport %d: %s\n", cport, pmport, buf1);
13079 		}
13080 		if (buf2[0] != '\0') {
13081 			sata_log(sata_hba_inst, CE_NOTE,
13082 			    "port %d pmport %d: %s\n", cport, pmport, buf2);
13083 		}
13084 	}
13085 }
13086 
13087 
13088 /*
13089  * Event processing thread.
13090  * Arg is a pointer to the sata_hba_list pointer.
13091  * It is not really needed, because sata_hba_list is global and static
13092  */
13093 static void
13094 sata_event_daemon(void *arg)
13095 {
13096 #ifndef __lock_lint
13097 	_NOTE(ARGUNUSED(arg))
13098 #endif
13099 	sata_hba_inst_t *sata_hba_inst;
13100 	clock_t lbolt;
13101 
13102 	SATADBG1(SATA_DBG_EVENTS_DAEMON, NULL,
13103 	    "SATA event daemon started\n", NULL);
13104 loop:
13105 	/*
13106 	 * Process events here. Walk through all registered HBAs
13107 	 */
13108 	mutex_enter(&sata_mutex);
13109 	for (sata_hba_inst = sata_hba_list; sata_hba_inst != NULL;
13110 	    sata_hba_inst = sata_hba_inst->satahba_next) {
13111 		ASSERT(sata_hba_inst != NULL);
13112 		mutex_enter(&sata_hba_inst->satahba_mutex);
13113 		if (sata_hba_inst->satahba_attached != 1 ||
13114 		    (sata_hba_inst->satahba_event_flags &
13115 		    SATA_EVNT_SKIP) != 0) {
13116 			mutex_exit(&sata_hba_inst->satahba_mutex);
13117 			continue;
13118 		}
13119 		if (sata_hba_inst->satahba_event_flags & SATA_EVNT_MAIN) {
13120 			sata_hba_inst->satahba_event_flags |= SATA_EVNT_SKIP;
13121 			mutex_exit(&sata_hba_inst->satahba_mutex);
13122 			mutex_exit(&sata_mutex);
13123 			/* Got the controller with pending event */
13124 			sata_process_controller_events(sata_hba_inst);
13125 			/*
13126 			 * Since global mutex was released, there is a
13127 			 * possibility that HBA list has changed, so start
13128 			 * over from the top. Just processed controller
13129 			 * will be passed-over because of the SKIP flag.
13130 			 */
13131 			goto loop;
13132 		}
13133 		mutex_exit(&sata_hba_inst->satahba_mutex);
13134 	}
13135 	/* Clear SKIP flag in all controllers */
13136 	for (sata_hba_inst = sata_hba_list; sata_hba_inst != NULL;
13137 	    sata_hba_inst = sata_hba_inst->satahba_next) {
13138 		mutex_enter(&sata_hba_inst->satahba_mutex);
13139 		sata_hba_inst->satahba_event_flags &= ~SATA_EVNT_SKIP;
13140 		mutex_exit(&sata_hba_inst->satahba_mutex);
13141 	}
13142 	mutex_exit(&sata_mutex);
13143 
13144 	SATADBG1(SATA_DBG_EVENTS_DAEMON, NULL,
13145 	    "SATA EVENT DAEMON suspending itself", NULL);
13146 
13147 #ifdef SATA_DEBUG
13148 	if ((sata_func_enable & SATA_ENABLE_PROCESS_EVENTS) == 0) {
13149 		sata_log(sata_hba_inst, CE_WARN,
13150 		    "SATA EVENTS PROCESSING DISABLED\n");
13151 		thread_exit(); /* Daemon will not run again */
13152 	}
13153 #endif
13154 	mutex_enter(&sata_event_mutex);
13155 	sata_event_thread_active = 0;
13156 	mutex_exit(&sata_event_mutex);
13157 	/*
13158 	 * Go to sleep/suspend itself and wake up either because new event or
13159 	 * wait timeout. Exit if there is a termination request (driver
13160 	 * unload).
13161 	 */
13162 	do {
13163 		lbolt = ddi_get_lbolt();
13164 		lbolt += drv_usectohz(SATA_EVNT_DAEMON_SLEEP_TIME);
13165 		mutex_enter(&sata_event_mutex);
13166 		(void) cv_timedwait(&sata_event_cv, &sata_event_mutex, lbolt);
13167 
13168 		if (sata_event_thread_active != 0) {
13169 			mutex_exit(&sata_event_mutex);
13170 			continue;
13171 		}
13172 
13173 		/* Check if it is time to go away */
13174 		if (sata_event_thread_terminate == 1) {
13175 			/*
13176 			 * It is up to the thread setting above flag to make
13177 			 * sure that this thread is not killed prematurely.
13178 			 */
13179 			sata_event_thread_terminate = 0;
13180 			sata_event_thread = NULL;
13181 			mutex_exit(&sata_event_mutex);
13182 			SATADBG1(SATA_DBG_EVENTS_DAEMON, NULL,
13183 			    "SATA_EVENT_DAEMON_TERMINATING", NULL);
13184 			thread_exit();  { _NOTE(NOT_REACHED) }
13185 		}
13186 		mutex_exit(&sata_event_mutex);
13187 	} while (!(sata_event_pending & SATA_EVNT_MAIN));
13188 
13189 	mutex_enter(&sata_event_mutex);
13190 	sata_event_thread_active = 1;
13191 	mutex_exit(&sata_event_mutex);
13192 
13193 	mutex_enter(&sata_mutex);
13194 	sata_event_pending &= ~SATA_EVNT_MAIN;
13195 	mutex_exit(&sata_mutex);
13196 
13197 	SATADBG1(SATA_DBG_EVENTS_DAEMON, NULL,
13198 	    "SATA EVENT DAEMON READY TO PROCESS EVENT", NULL);
13199 
13200 	goto loop;
13201 }
13202 
13203 /*
13204  * Specific HBA instance event processing.
13205  *
13206  * NOTE: At the moment, device event processing is limited to hard disks
13207  * only.
13208  * cports only are supported - no pmports.
13209  */
13210 static void
13211 sata_process_controller_events(sata_hba_inst_t *sata_hba_inst)
13212 {
13213 	int ncport;
13214 	uint32_t event_flags;
13215 	sata_address_t *saddr;
13216 
13217 	SATADBG1(SATA_DBG_EVENTS_CNTRL, sata_hba_inst,
13218 	    "Processing controller %d event(s)",
13219 	    ddi_get_instance(SATA_DIP(sata_hba_inst)));
13220 
13221 	mutex_enter(&sata_hba_inst->satahba_mutex);
13222 	sata_hba_inst->satahba_event_flags &= ~SATA_EVNT_MAIN;
13223 	event_flags = sata_hba_inst->satahba_event_flags;
13224 	mutex_exit(&sata_hba_inst->satahba_mutex);
13225 	/*
13226 	 * Process controller power change first
13227 	 * HERE
13228 	 */
13229 	if (event_flags & SATA_EVNT_PWR_LEVEL_CHANGED)
13230 		sata_process_cntrl_pwr_level_change(sata_hba_inst);
13231 
13232 	/*
13233 	 * Search through ports/devices to identify affected port/device.
13234 	 * We may have to process events for more than one port/device.
13235 	 */
13236 	for (ncport = 0; ncport < SATA_NUM_CPORTS(sata_hba_inst); ncport++) {
13237 		mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst, ncport)));
13238 		event_flags = (SATA_CPORT_INFO(sata_hba_inst, ncport))->
13239 		    cport_event_flags;
13240 		/* Check if port was locked by IOCTL processing */
13241 		if (event_flags & SATA_APCTL_LOCK_PORT_BUSY) {
13242 			/*
13243 			 * We ignore port events because port is busy
13244 			 * with AP control processing. Set again
13245 			 * controller and main event flag, so that
13246 			 * events may be processed by the next daemon
13247 			 * run.
13248 			 */
13249 			mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst, ncport)));
13250 			mutex_enter(&sata_hba_inst->satahba_mutex);
13251 			sata_hba_inst->satahba_event_flags |= SATA_EVNT_MAIN;
13252 			mutex_exit(&sata_hba_inst->satahba_mutex);
13253 			mutex_enter(&sata_mutex);
13254 			sata_event_pending |= SATA_EVNT_MAIN;
13255 			mutex_exit(&sata_mutex);
13256 			SATADBG1(SATA_DBG_EVENTS_PROCPST, sata_hba_inst,
13257 			    "Event processing postponed until "
13258 			    "AP control processing completes",
13259 			    NULL);
13260 			/* Check other ports */
13261 			continue;
13262 		} else {
13263 			/*
13264 			 * Set BSY flag so that AP control would not
13265 			 * interfere with events processing for
13266 			 * this port.
13267 			 */
13268 			(SATA_CPORT_INFO(sata_hba_inst, ncport))->
13269 			    cport_event_flags |= SATA_EVNT_LOCK_PORT_BUSY;
13270 		}
13271 		mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst, ncport)));
13272 
13273 		saddr = &(SATA_CPORT_INFO(sata_hba_inst, ncport))->cport_addr;
13274 
13275 		if ((event_flags &
13276 		    (SATA_EVNT_PORT_EVENTS | SATA_EVNT_DRIVE_EVENTS)) != 0) {
13277 			/*
13278 			 * Got port event.
13279 			 * We need some hierarchy of event processing as they
13280 			 * are affecting each other:
13281 			 * 1. port failed
13282 			 * 2. device detached/attached
13283 			 * 3. link events - link events may trigger device
13284 			 *    detached or device attached events in some
13285 			 *    circumstances.
13286 			 * 4. port power level changed
13287 			 */
13288 			if (event_flags & SATA_EVNT_PORT_FAILED) {
13289 				sata_process_port_failed_event(sata_hba_inst,
13290 				    saddr);
13291 			}
13292 			if (event_flags & SATA_EVNT_DEVICE_DETACHED) {
13293 				sata_process_device_detached(sata_hba_inst,
13294 				    saddr);
13295 			}
13296 			if (event_flags & SATA_EVNT_DEVICE_ATTACHED) {
13297 				sata_process_device_attached(sata_hba_inst,
13298 				    saddr);
13299 			}
13300 			if (event_flags &
13301 			    (SATA_EVNT_LINK_ESTABLISHED |
13302 			    SATA_EVNT_LINK_LOST)) {
13303 				sata_process_port_link_events(sata_hba_inst,
13304 				    saddr);
13305 			}
13306 			if (event_flags & SATA_EVNT_PWR_LEVEL_CHANGED) {
13307 				sata_process_port_pwr_change(sata_hba_inst,
13308 				    saddr);
13309 			}
13310 			if (event_flags & SATA_EVNT_TARGET_NODE_CLEANUP) {
13311 				sata_process_target_node_cleanup(
13312 				    sata_hba_inst, saddr);
13313 			}
13314 		}
13315 		if (SATA_CPORT_DEV_TYPE(sata_hba_inst, ncport) !=
13316 		    SATA_DTYPE_NONE) {
13317 			/* May have device event */
13318 			sata_process_device_reset(sata_hba_inst, saddr);
13319 		}
13320 		mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst, ncport)));
13321 		/* Release PORT_BUSY flag */
13322 		(SATA_CPORT_INFO(sata_hba_inst, ncport))->
13323 		    cport_event_flags &= ~SATA_EVNT_LOCK_PORT_BUSY;
13324 		mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst, ncport)));
13325 
13326 	} /* End of loop through the controller SATA ports */
13327 }
13328 
13329 /*
13330  * Process HBA power level change reported by HBA driver.
13331  * Not implemented at this time - event is ignored.
13332  */
13333 static void
13334 sata_process_cntrl_pwr_level_change(sata_hba_inst_t *sata_hba_inst)
13335 {
13336 	SATADBG1(SATA_DBG_EVENTS_PROC, sata_hba_inst,
13337 	    "Processing controller power level change", NULL);
13338 
13339 	/* Ignoring it for now */
13340 	mutex_enter(&sata_hba_inst->satahba_mutex);
13341 	sata_hba_inst->satahba_event_flags &= ~SATA_EVNT_PWR_LEVEL_CHANGED;
13342 	mutex_exit(&sata_hba_inst->satahba_mutex);
13343 }
13344 
13345 /*
13346  * Process port power level change reported by HBA driver.
13347  * Not implemented at this time - event is ignored.
13348  */
13349 static void
13350 sata_process_port_pwr_change(sata_hba_inst_t *sata_hba_inst,
13351     sata_address_t *saddr)
13352 {
13353 	sata_cport_info_t *cportinfo;
13354 
13355 	SATADBG1(SATA_DBG_EVENTS_PROC, sata_hba_inst,
13356 	    "Processing port power level change", NULL);
13357 
13358 	cportinfo = SATA_CPORT_INFO(sata_hba_inst, saddr->cport);
13359 	mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->cport_mutex);
13360 	/* Reset event flag */
13361 	cportinfo->cport_event_flags &= ~SATA_EVNT_PWR_LEVEL_CHANGED;
13362 	mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->cport_mutex);
13363 }
13364 
13365 /*
13366  * Process port failure reported by HBA driver.
13367  * cports support only - no pmports.
13368  */
13369 static void
13370 sata_process_port_failed_event(sata_hba_inst_t *sata_hba_inst,
13371     sata_address_t *saddr)
13372 {
13373 	sata_cport_info_t *cportinfo;
13374 
13375 	cportinfo = SATA_CPORT_INFO(sata_hba_inst, saddr->cport);
13376 	mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->cport_mutex);
13377 	/* Reset event flag first */
13378 	cportinfo->cport_event_flags &= ~SATA_EVNT_PORT_FAILED;
13379 	/* If the port is in SHUTDOWN or FAILED state, ignore this event. */
13380 	if ((cportinfo->cport_state &
13381 	    (SATA_PSTATE_SHUTDOWN | SATA_PSTATE_FAILED)) == 0) {
13382 		mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->
13383 		    cport_mutex);
13384 		return;
13385 	}
13386 	/* Fail the port */
13387 	cportinfo->cport_state = SATA_PSTATE_FAILED;
13388 	mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->cport_mutex);
13389 	sata_log(sata_hba_inst, CE_WARN, "SATA port %d failed", saddr->cport);
13390 }
13391 
13392 /*
13393  * Device Reset Event processing.
13394  * The seqeunce is managed by 3 stage flags:
13395  * - reset event reported,
13396  * - reset event being processed,
13397  * - request to clear device reset state.
13398  */
13399 static void
13400 sata_process_device_reset(sata_hba_inst_t *sata_hba_inst,
13401     sata_address_t *saddr)
13402 {
13403 	sata_drive_info_t old_sdinfo; /* local copy of the drive info */
13404 	sata_drive_info_t *sdinfo;
13405 	sata_cport_info_t *cportinfo;
13406 	sata_device_t sata_device;
13407 	int rval;
13408 
13409 	/* We only care about host sata cport for now */
13410 	cportinfo = SATA_CPORT_INFO(sata_hba_inst, saddr->cport);
13411 
13412 	mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->cport_mutex);
13413 
13414 	/* If the port is in SHUTDOWN or FAILED state, ignore reset event. */
13415 	if ((cportinfo->cport_state &
13416 	    (SATA_PSTATE_SHUTDOWN | SATA_PSTATE_FAILED)) != 0) {
13417 		mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->
13418 		    cport_mutex);
13419 		return;
13420 	}
13421 
13422 	if ((SATA_CPORT_DEV_TYPE(sata_hba_inst, saddr->cport) &
13423 	    SATA_VALID_DEV_TYPE) == 0) {
13424 		mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->
13425 		    cport_mutex);
13426 		return;
13427 	}
13428 	sdinfo = SATA_CPORT_DRV_INFO(sata_hba_inst, saddr->cport);
13429 	if (sdinfo == NULL) {
13430 		mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->
13431 		    cport_mutex);
13432 		return;
13433 	}
13434 
13435 	if ((sdinfo->satadrv_event_flags &
13436 	    (SATA_EVNT_DEVICE_RESET | SATA_EVNT_INPROC_DEVICE_RESET)) == 0) {
13437 		/* Nothing to do */
13438 		mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->
13439 		    cport_mutex);
13440 		return;
13441 	}
13442 #ifdef SATA_DEBUG
13443 	if ((sdinfo->satadrv_event_flags &
13444 	    (SATA_EVNT_DEVICE_RESET | SATA_EVNT_INPROC_DEVICE_RESET)) ==
13445 	    (SATA_EVNT_DEVICE_RESET | SATA_EVNT_INPROC_DEVICE_RESET)) {
13446 		/* Something is weird - new device reset event */
13447 		SATADBG1(SATA_DBG_EVENTS_PROC, sata_hba_inst,
13448 		    "Overlapping device reset events!", NULL);
13449 	}
13450 #endif
13451 	SATADBG1(SATA_DBG_EVENTS_PROC, sata_hba_inst,
13452 	    "Processing port %d device reset", saddr->cport);
13453 
13454 	/* Clear event flag */
13455 	sdinfo->satadrv_event_flags &= ~SATA_EVNT_DEVICE_RESET;
13456 
13457 	/* It seems that we always need to check the port state first */
13458 	sata_device.satadev_rev = SATA_DEVICE_REV;
13459 	sata_device.satadev_addr = *saddr;
13460 	/*
13461 	 * We have to exit mutex, because the HBA probe port function may
13462 	 * block on its own mutex.
13463 	 */
13464 	mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->cport_mutex);
13465 	rval = (*SATA_PROBE_PORT_FUNC(sata_hba_inst))
13466 	    (SATA_DIP(sata_hba_inst), &sata_device);
13467 	mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->cport_mutex);
13468 	sata_update_port_info(sata_hba_inst, &sata_device);
13469 	if (rval != SATA_SUCCESS) {
13470 		/* Something went wrong? Fail the port */
13471 		cportinfo->cport_state = SATA_PSTATE_FAILED;
13472 		mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->
13473 		    cport_mutex);
13474 		SATA_LOG_D((sata_hba_inst, CE_WARN,
13475 		    "SATA port %d probing failed",
13476 		    saddr->cport));
13477 		return;
13478 	}
13479 	if ((sata_device.satadev_scr.sstatus  &
13480 	    SATA_PORT_DEVLINK_UP_MASK) !=
13481 	    SATA_PORT_DEVLINK_UP ||
13482 	    sata_device.satadev_type == SATA_DTYPE_NONE) {
13483 		/*
13484 		 * No device to process, anymore. Some other event processing
13485 		 * would or have already performed port info cleanup.
13486 		 * To be safe (HBA may need it), request clearing device
13487 		 * reset condition.
13488 		 */
13489 		sdinfo->satadrv_event_flags = 0;
13490 		sdinfo->satadrv_event_flags |= SATA_EVNT_CLEAR_DEVICE_RESET;
13491 		mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->
13492 		    cport_mutex);
13493 		return;
13494 	}
13495 
13496 	/* Mark device reset processing as active */
13497 	sdinfo->satadrv_event_flags |= SATA_EVNT_INPROC_DEVICE_RESET;
13498 
13499 	old_sdinfo = *sdinfo;	/* local copy of the drive info */
13500 	mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->cport_mutex);
13501 
13502 	if (sata_set_drive_features(sata_hba_inst, &old_sdinfo, 1) ==
13503 	    SATA_FAILURE) {
13504 		/*
13505 		 * Restoring drive setting failed.
13506 		 * Probe the port first, to check if the port state has changed
13507 		 */
13508 		sata_device.satadev_rev = SATA_DEVICE_REV;
13509 		sata_device.satadev_addr = *saddr;
13510 		sata_device.satadev_addr.qual = SATA_ADDR_CPORT;
13511 		/* probe port */
13512 		rval = (*SATA_PROBE_PORT_FUNC(sata_hba_inst))
13513 		    (SATA_DIP(sata_hba_inst), &sata_device);
13514 		mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->
13515 		    cport_mutex);
13516 		if (rval == SATA_SUCCESS &&
13517 		    (sata_device.satadev_state &
13518 		    (SATA_PSTATE_SHUTDOWN | SATA_PSTATE_FAILED)) == 0 &&
13519 		    (sata_device.satadev_scr.sstatus  &
13520 		    SATA_PORT_DEVLINK_UP_MASK) == SATA_PORT_DEVLINK_UP &&
13521 		    sata_device.satadev_type != SATA_DTYPE_NONE) {
13522 			/*
13523 			 * We may retry this a bit later - in-process reset
13524 			 * condition should be already set.
13525 			 */
13526 			if ((cportinfo->cport_dev_type &
13527 			    SATA_VALID_DEV_TYPE) != 0 &&
13528 			    SATA_CPORTINFO_DRV_INFO(cportinfo) != NULL) {
13529 				sdinfo = SATA_CPORTINFO_DRV_INFO(cportinfo);
13530 				mutex_exit(&SATA_CPORT_INFO(sata_hba_inst,
13531 				    saddr->cport)->cport_mutex);
13532 				mutex_enter(&sata_hba_inst->satahba_mutex);
13533 				sata_hba_inst->satahba_event_flags |=
13534 				    SATA_EVNT_MAIN;
13535 				mutex_exit(&sata_hba_inst->satahba_mutex);
13536 				mutex_enter(&sata_mutex);
13537 				sata_event_pending |= SATA_EVNT_MAIN;
13538 				mutex_exit(&sata_mutex);
13539 				return;
13540 			}
13541 		} else {
13542 			/*
13543 			 * No point of retrying - some other event processing
13544 			 * would or already did port info cleanup.
13545 			 * To be safe (HBA may need it),
13546 			 * request clearing device reset condition.
13547 			 */
13548 			sdinfo->satadrv_event_flags = 0;
13549 			sdinfo->satadrv_event_flags |=
13550 			    SATA_EVNT_CLEAR_DEVICE_RESET;
13551 		}
13552 		mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->
13553 		    cport_mutex);
13554 		return;
13555 	}
13556 
13557 	/*
13558 	 * Raise the flag indicating that the next sata command could
13559 	 * be sent with SATA_CLEAR_DEV_RESET_STATE flag, if no new device
13560 	 * reset is reported.
13561 	 */
13562 	mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->cport_mutex);
13563 	if ((cportinfo->cport_dev_type & SATA_VALID_DEV_TYPE) != 0 &&
13564 	    SATA_CPORTINFO_DRV_INFO(cportinfo) != NULL) {
13565 		sdinfo = SATA_CPORTINFO_DRV_INFO(cportinfo);
13566 		sdinfo->satadrv_event_flags &= ~SATA_EVNT_INPROC_DEVICE_RESET;
13567 		sdinfo->satadrv_event_flags |= SATA_EVNT_CLEAR_DEVICE_RESET;
13568 	}
13569 	mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->cport_mutex);
13570 }
13571 
13572 
13573 /*
13574  * Port Link Events processing.
13575  * Every link established event may involve device reset (due to
13576  * COMRESET signal, equivalent of the hard reset) so arbitrarily
13577  * set device reset event for an attached device (if any).
13578  * If the port is in SHUTDOWN or FAILED state, ignore link events.
13579  *
13580  * The link established event processing varies, depending on the state
13581  * of the target node, HBA hotplugging capabilities, state of the port.
13582  * If the link is not active, the link established event is ignored.
13583  * If HBA cannot detect device attachment and there is no target node,
13584  * the link established event triggers device attach event processing.
13585  * Else, link established event triggers device reset event processing.
13586  *
13587  * The link lost event processing varies, depending on a HBA hotplugging
13588  * capability and the state of the port (link active or not active).
13589  * If the link is active, the lost link event is ignored.
13590  * If HBA cannot detect device removal, the lost link event triggers
13591  * device detached event processing after link lost timeout.
13592  * Else, the event is ignored.
13593  *
13594  * NOTE: Only cports are processed for now, i.e. no port multiplier ports
13595  */
13596 static void
13597 sata_process_port_link_events(sata_hba_inst_t *sata_hba_inst,
13598     sata_address_t *saddr)
13599 {
13600 	sata_device_t sata_device;
13601 	sata_cport_info_t *cportinfo;
13602 	sata_drive_info_t *sdinfo;
13603 	uint32_t event_flags;
13604 	int rval;
13605 
13606 	SATADBG1(SATA_DBG_EVENTS_PROC, sata_hba_inst,
13607 	    "Processing port %d link event(s)", saddr->cport);
13608 
13609 	cportinfo = SATA_CPORT_INFO(sata_hba_inst, saddr->cport);
13610 	mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->cport_mutex);
13611 	event_flags = cportinfo->cport_event_flags;
13612 
13613 	/* Reset event flags first */
13614 	cportinfo->cport_event_flags &=
13615 	    ~(SATA_EVNT_LINK_ESTABLISHED | SATA_EVNT_LINK_LOST);
13616 
13617 	/* If the port is in SHUTDOWN or FAILED state, ignore link events. */
13618 	if ((cportinfo->cport_state &
13619 	    (SATA_PSTATE_SHUTDOWN | SATA_PSTATE_FAILED)) != 0) {
13620 		mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->
13621 		    cport_mutex);
13622 		return;
13623 	}
13624 
13625 	/*
13626 	 * For the sanity sake get current port state.
13627 	 * Set device address only. Other sata_device fields should be
13628 	 * set by HBA driver.
13629 	 */
13630 	sata_device.satadev_rev = SATA_DEVICE_REV;
13631 	sata_device.satadev_addr = *saddr;
13632 	/*
13633 	 * We have to exit mutex, because the HBA probe port function may
13634 	 * block on its own mutex.
13635 	 */
13636 	mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->cport_mutex);
13637 	rval = (*SATA_PROBE_PORT_FUNC(sata_hba_inst))
13638 	    (SATA_DIP(sata_hba_inst), &sata_device);
13639 	mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->cport_mutex);
13640 	sata_update_port_info(sata_hba_inst, &sata_device);
13641 	if (rval != SATA_SUCCESS) {
13642 		/* Something went wrong? Fail the port */
13643 		cportinfo->cport_state = SATA_PSTATE_FAILED;
13644 		mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->
13645 		    cport_mutex);
13646 		SATA_LOG_D((sata_hba_inst, CE_WARN,
13647 		    "SATA port %d probing failed",
13648 		    saddr->cport));
13649 		/*
13650 		 * We may want to release device info structure, but
13651 		 * it is not necessary.
13652 		 */
13653 		return;
13654 	} else {
13655 		/* port probed successfully */
13656 		cportinfo->cport_state |= SATA_STATE_PROBED | SATA_STATE_READY;
13657 	}
13658 	if (event_flags & SATA_EVNT_LINK_ESTABLISHED) {
13659 
13660 		if ((sata_device.satadev_scr.sstatus &
13661 		    SATA_PORT_DEVLINK_UP_MASK) != SATA_PORT_DEVLINK_UP) {
13662 			/* Ignore event */
13663 			SATADBG1(SATA_DBG_EVENTS_PROC, sata_hba_inst,
13664 			    "Ignoring port %d link established event - "
13665 			    "link down",
13666 			    saddr->cport);
13667 			goto linklost;
13668 		}
13669 
13670 		SATADBG1(SATA_DBG_EVENTS_PROC, sata_hba_inst,
13671 		    "Processing port %d link established event",
13672 		    saddr->cport);
13673 
13674 		/*
13675 		 * For the sanity sake check if a device is attached - check
13676 		 * return state of a port probing.
13677 		 */
13678 		if (sata_device.satadev_type != SATA_DTYPE_NONE &&
13679 		    sata_device.satadev_type != SATA_DTYPE_PMULT) {
13680 			/*
13681 			 * HBA port probe indicated that there is a device
13682 			 * attached. Check if the framework had device info
13683 			 * structure attached for this device.
13684 			 */
13685 			if (cportinfo->cport_dev_type != SATA_DTYPE_NONE) {
13686 				ASSERT(SATA_CPORTINFO_DRV_INFO(cportinfo) !=
13687 				    NULL);
13688 
13689 				sdinfo = SATA_CPORTINFO_DRV_INFO(cportinfo);
13690 				if ((sdinfo->satadrv_type &
13691 				    SATA_VALID_DEV_TYPE) != 0) {
13692 					/*
13693 					 * Dev info structure is present.
13694 					 * If dev_type is set to known type in
13695 					 * the framework's drive info struct
13696 					 * then the device existed before and
13697 					 * the link was probably lost
13698 					 * momentarily - in such case
13699 					 * we may want to check device
13700 					 * identity.
13701 					 * Identity check is not supported now.
13702 					 *
13703 					 * Link established event
13704 					 * triggers device reset event.
13705 					 */
13706 					(SATA_CPORTINFO_DRV_INFO(cportinfo))->
13707 					    satadrv_event_flags |=
13708 					    SATA_EVNT_DEVICE_RESET;
13709 				}
13710 			} else if (cportinfo->cport_dev_type ==
13711 			    SATA_DTYPE_NONE) {
13712 				/*
13713 				 * We got new device attached! If HBA does not
13714 				 * generate device attached events, trigger it
13715 				 * here.
13716 				 */
13717 				if (!(SATA_FEATURES(sata_hba_inst) &
13718 				    SATA_CTLF_HOTPLUG)) {
13719 					cportinfo->cport_event_flags |=
13720 					    SATA_EVNT_DEVICE_ATTACHED;
13721 				}
13722 			}
13723 			/* Reset link lost timeout */
13724 			cportinfo->cport_link_lost_time = 0;
13725 		}
13726 	}
13727 linklost:
13728 	if (event_flags & SATA_EVNT_LINK_LOST) {
13729 		if ((sata_device.satadev_scr.sstatus &
13730 		    SATA_PORT_DEVLINK_UP_MASK) == SATA_PORT_DEVLINK_UP) {
13731 			/* Ignore event */
13732 			SATADBG1(SATA_DBG_EVENTS_PROC, sata_hba_inst,
13733 			    "Ignoring port %d link lost event - link is up",
13734 			    saddr->cport);
13735 			goto done;
13736 		}
13737 #ifdef SATA_DEBUG
13738 		if (cportinfo->cport_link_lost_time == 0) {
13739 			SATADBG1(SATA_DBG_EVENTS_PROC, sata_hba_inst,
13740 			    "Processing port %d link lost event",
13741 			    saddr->cport);
13742 		}
13743 #endif
13744 		/*
13745 		 * When HBA cannot generate device attached/detached events,
13746 		 * we need to track link lost time and eventually generate
13747 		 * device detach event.
13748 		 */
13749 		if (!(SATA_FEATURES(sata_hba_inst) & SATA_CTLF_HOTPLUG)) {
13750 			/* We are tracking link lost time */
13751 			if (cportinfo->cport_link_lost_time == 0) {
13752 				/* save current time (lbolt value) */
13753 				cportinfo->cport_link_lost_time =
13754 				    ddi_get_lbolt();
13755 				/* just keep link lost event */
13756 				cportinfo->cport_event_flags |=
13757 				    SATA_EVNT_LINK_LOST;
13758 			} else {
13759 				clock_t cur_time = ddi_get_lbolt();
13760 				if ((cur_time -
13761 				    cportinfo->cport_link_lost_time) >=
13762 				    drv_usectohz(
13763 				    SATA_EVNT_LINK_LOST_TIMEOUT)) {
13764 					/* trigger device detach event */
13765 					cportinfo->cport_event_flags |=
13766 					    SATA_EVNT_DEVICE_DETACHED;
13767 					cportinfo->cport_link_lost_time = 0;
13768 					SATADBG1(SATA_DBG_EVENTS,
13769 					    sata_hba_inst,
13770 					    "Triggering port %d "
13771 					    "device detached event",
13772 					    saddr->cport);
13773 				} else {
13774 					/* keep link lost event */
13775 					cportinfo->cport_event_flags |=
13776 					    SATA_EVNT_LINK_LOST;
13777 				}
13778 			}
13779 		}
13780 		/*
13781 		 * We could change port state to disable/delay access to
13782 		 * the attached device until the link is recovered.
13783 		 */
13784 	}
13785 done:
13786 	event_flags = cportinfo->cport_event_flags;
13787 	mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->cport_mutex);
13788 	if (event_flags != 0) {
13789 		mutex_enter(&sata_hba_inst->satahba_mutex);
13790 		sata_hba_inst->satahba_event_flags |= SATA_EVNT_MAIN;
13791 		mutex_exit(&sata_hba_inst->satahba_mutex);
13792 		mutex_enter(&sata_mutex);
13793 		sata_event_pending |= SATA_EVNT_MAIN;
13794 		mutex_exit(&sata_mutex);
13795 	}
13796 }
13797 
13798 /*
13799  * Device Detached Event processing.
13800  * Port is probed to find if a device is really gone. If so,
13801  * the device info structure is detached from the SATA port info structure
13802  * and released.
13803  * Port status is updated.
13804  *
13805  * NOTE: Process cports event only, no port multiplier ports.
13806  */
13807 static void
13808 sata_process_device_detached(sata_hba_inst_t *sata_hba_inst,
13809     sata_address_t *saddr)
13810 {
13811 	sata_cport_info_t *cportinfo;
13812 	sata_drive_info_t *sdevinfo;
13813 	sata_device_t sata_device;
13814 	dev_info_t *tdip;
13815 	int rval;
13816 
13817 	SATADBG1(SATA_DBG_EVENTS_PROC, sata_hba_inst,
13818 	    "Processing port %d device detached", saddr->cport);
13819 
13820 	cportinfo = SATA_CPORT_INFO(sata_hba_inst, saddr->cport);
13821 	mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->cport_mutex);
13822 	/* Clear event flag */
13823 	cportinfo->cport_event_flags &= ~SATA_EVNT_DEVICE_DETACHED;
13824 
13825 	/* If the port is in SHUTDOWN or FAILED state, ignore detach event. */
13826 	if ((cportinfo->cport_state &
13827 	    (SATA_PSTATE_SHUTDOWN | SATA_PSTATE_FAILED)) != 0) {
13828 		mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->
13829 		    cport_mutex);
13830 		return;
13831 	}
13832 	/* For sanity, re-probe the port */
13833 	sata_device.satadev_rev = SATA_DEVICE_REV;
13834 	sata_device.satadev_addr = *saddr;
13835 
13836 	/*
13837 	 * We have to exit mutex, because the HBA probe port function may
13838 	 * block on its own mutex.
13839 	 */
13840 	mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->cport_mutex);
13841 	rval = (*SATA_PROBE_PORT_FUNC(sata_hba_inst))
13842 	    (SATA_DIP(sata_hba_inst), &sata_device);
13843 	mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->cport_mutex);
13844 	sata_update_port_info(sata_hba_inst, &sata_device);
13845 	if (rval != SATA_SUCCESS) {
13846 		/* Something went wrong? Fail the port */
13847 		cportinfo->cport_state = SATA_PSTATE_FAILED;
13848 		mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->
13849 		    cport_mutex);
13850 		SATA_LOG_D((sata_hba_inst, CE_WARN,
13851 		    "SATA port %d probing failed",
13852 		    saddr->cport));
13853 		/*
13854 		 * We may want to release device info structure, but
13855 		 * it is not necessary.
13856 		 */
13857 		return;
13858 	} else {
13859 		/* port probed successfully */
13860 		cportinfo->cport_state |= SATA_STATE_PROBED | SATA_STATE_READY;
13861 	}
13862 	/*
13863 	 * Check if a device is still attached. For sanity, check also
13864 	 * link status - if no link, there is no device.
13865 	 */
13866 	if ((sata_device.satadev_scr.sstatus & SATA_PORT_DEVLINK_UP_MASK) ==
13867 	    SATA_PORT_DEVLINK_UP && sata_device.satadev_type !=
13868 	    SATA_DTYPE_NONE) {
13869 		/*
13870 		 * Device is still attached - ignore detach event.
13871 		 */
13872 		mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->
13873 		    cport_mutex);
13874 		SATADBG1(SATA_DBG_EVENTS_PROC, sata_hba_inst,
13875 		    "Ignoring detach - device still attached to port %d",
13876 		    sata_device.satadev_addr.cport);
13877 		return;
13878 	}
13879 	/*
13880 	 * We need to detach and release device info structure here
13881 	 */
13882 	if (SATA_CPORTINFO_DRV_INFO(cportinfo) != NULL) {
13883 		sdevinfo = SATA_CPORTINFO_DRV_INFO(cportinfo);
13884 		SATA_CPORTINFO_DRV_INFO(cportinfo) = NULL;
13885 		(void) kmem_free((void *)sdevinfo,
13886 		    sizeof (sata_drive_info_t));
13887 	}
13888 	cportinfo->cport_dev_type = SATA_DTYPE_NONE;
13889 	/*
13890 	 * Device cannot be reached anymore, even if the target node may be
13891 	 * still present.
13892 	 */
13893 
13894 	mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->cport_mutex);
13895 	sata_log(sata_hba_inst, CE_WARN, "SATA device detached at port %d",
13896 	    sata_device.satadev_addr.cport);
13897 
13898 	/*
13899 	 * Try to offline a device and remove target node if it still exists
13900 	 */
13901 	tdip = sata_get_target_dip(SATA_DIP(sata_hba_inst), saddr->cport);
13902 	if (tdip != NULL) {
13903 		/*
13904 		 * Target node exists.  Unconfigure device then remove
13905 		 * the target node (one ndi operation).
13906 		 */
13907 		if (ndi_devi_offline(tdip, NDI_DEVI_REMOVE) != NDI_SUCCESS) {
13908 			/*
13909 			 * PROBLEM - no device, but target node remained
13910 			 * This happens when the file was open or node was
13911 			 * waiting for resources.
13912 			 */
13913 			SATA_LOG_D((sata_hba_inst, CE_WARN,
13914 			    "sata_process_device_detached: "
13915 			    "Failed to remove target node for "
13916 			    "detached SATA device."));
13917 			/*
13918 			 * Set target node state to DEVI_DEVICE_REMOVED.
13919 			 * But re-check first that the node still exists.
13920 			 */
13921 			tdip = sata_get_target_dip(SATA_DIP(sata_hba_inst),
13922 			    saddr->cport);
13923 			if (tdip != NULL) {
13924 				sata_set_device_removed(tdip);
13925 				/*
13926 				 * Instruct event daemon to retry the
13927 				 * cleanup later.
13928 				 */
13929 				sata_set_target_node_cleanup(sata_hba_inst,
13930 				    saddr->cport);
13931 			}
13932 		}
13933 	}
13934 	/*
13935 	 * Generate sysevent - EC_DR / ESC_DR_AP_STATE_CHANGE
13936 	 * with the hint: SE_HINT_REMOVE
13937 	 */
13938 	sata_gen_sysevent(sata_hba_inst, saddr, SE_HINT_REMOVE);
13939 }
13940 
13941 
13942 /*
13943  * Device Attached Event processing.
13944  * Port state is checked to verify that a device is really attached. If so,
13945  * the device info structure is created and attached to the SATA port info
13946  * structure.
13947  *
13948  * If attached device cannot be identified or set-up, the retry for the
13949  * attach processing is set-up. Subsequent daemon run would try again to
13950  * identify the device, until the time limit is reached
13951  * (SATA_DEV_IDENTIFY_TIMEOUT).
13952  *
13953  * This function cannot be called in interrupt context (it may sleep).
13954  *
13955  * NOTE: Process cports event only, no port multiplier ports.
13956  */
13957 static void
13958 sata_process_device_attached(sata_hba_inst_t *sata_hba_inst,
13959     sata_address_t *saddr)
13960 {
13961 	sata_cport_info_t *cportinfo;
13962 	sata_drive_info_t *sdevinfo;
13963 	sata_device_t sata_device;
13964 	dev_info_t *tdip;
13965 	uint32_t event_flags;
13966 	int rval;
13967 
13968 	SATADBG1(SATA_DBG_EVENTS_PROC, sata_hba_inst,
13969 	    "Processing port %d device attached", saddr->cport);
13970 
13971 	cportinfo = SATA_CPORT_INFO(sata_hba_inst, saddr->cport);
13972 	mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->cport_mutex);
13973 
13974 	/* Clear attach event flag first */
13975 	cportinfo->cport_event_flags &= ~SATA_EVNT_DEVICE_ATTACHED;
13976 
13977 	/* If the port is in SHUTDOWN or FAILED state, ignore event. */
13978 	if ((cportinfo->cport_state &
13979 	    (SATA_PSTATE_SHUTDOWN | SATA_PSTATE_FAILED)) != 0) {
13980 		cportinfo->cport_dev_attach_time = 0;
13981 		mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->
13982 		    cport_mutex);
13983 		return;
13984 	}
13985 
13986 	/*
13987 	 * If the sata_drive_info structure is found attached to the port info,
13988 	 * despite the fact the device was removed and now it is re-attached,
13989 	 * the old drive info structure was not removed.
13990 	 * Arbitrarily release device info structure.
13991 	 */
13992 	if (SATA_CPORTINFO_DRV_INFO(cportinfo) != NULL) {
13993 		sdevinfo = SATA_CPORTINFO_DRV_INFO(cportinfo);
13994 		SATA_CPORTINFO_DRV_INFO(cportinfo) = NULL;
13995 		(void) kmem_free((void *)sdevinfo,
13996 		    sizeof (sata_drive_info_t));
13997 		SATADBG1(SATA_DBG_EVENTS_PROC, sata_hba_inst,
13998 		    "Arbitrarily detaching old device info.", NULL);
13999 	}
14000 	cportinfo->cport_dev_type = SATA_DTYPE_NONE;
14001 
14002 	/* For sanity, re-probe the port */
14003 	sata_device.satadev_rev = SATA_DEVICE_REV;
14004 	sata_device.satadev_addr = *saddr;
14005 
14006 	/*
14007 	 * We have to exit mutex, because the HBA probe port function may
14008 	 * block on its own mutex.
14009 	 */
14010 	mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->cport_mutex);
14011 	rval = (*SATA_PROBE_PORT_FUNC(sata_hba_inst))
14012 	    (SATA_DIP(sata_hba_inst), &sata_device);
14013 	mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->cport_mutex);
14014 	sata_update_port_info(sata_hba_inst, &sata_device);
14015 	if (rval != SATA_SUCCESS) {
14016 		/* Something went wrong? Fail the port */
14017 		cportinfo->cport_state = SATA_PSTATE_FAILED;
14018 		cportinfo->cport_dev_attach_time = 0;
14019 		mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->
14020 		    cport_mutex);
14021 		SATA_LOG_D((sata_hba_inst, CE_WARN,
14022 		    "SATA port %d probing failed",
14023 		    saddr->cport));
14024 		return;
14025 	} else {
14026 		/* port probed successfully */
14027 		cportinfo->cport_state |= SATA_STATE_PROBED | SATA_STATE_READY;
14028 	}
14029 	/*
14030 	 * Check if a device is still attached. For sanity, check also
14031 	 * link status - if no link, there is no device.
14032 	 */
14033 	if ((sata_device.satadev_scr.sstatus & SATA_PORT_DEVLINK_UP_MASK) !=
14034 	    SATA_PORT_DEVLINK_UP || sata_device.satadev_type ==
14035 	    SATA_DTYPE_NONE) {
14036 		/*
14037 		 * No device - ignore attach event.
14038 		 */
14039 		cportinfo->cport_dev_attach_time = 0;
14040 		mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->
14041 		    cport_mutex);
14042 		SATADBG1(SATA_DBG_EVENTS_PROC, sata_hba_inst,
14043 		    "Ignoring attach - no device connected to port %d",
14044 		    sata_device.satadev_addr.cport);
14045 		return;
14046 	}
14047 
14048 	mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->cport_mutex);
14049 	/*
14050 	 * Generate sysevent - EC_DR / ESC_DR_AP_STATE_CHANGE
14051 	 * with the hint: SE_HINT_INSERT
14052 	 */
14053 	sata_gen_sysevent(sata_hba_inst, saddr, SE_HINT_INSERT);
14054 
14055 	/*
14056 	 * Port reprobing will take care of the creation of the device
14057 	 * info structure and determination of the device type.
14058 	 */
14059 	sata_device.satadev_addr = *saddr;
14060 	(void) sata_reprobe_port(sata_hba_inst, &sata_device,
14061 	    SATA_DEV_IDENTIFY_NORETRY);
14062 
14063 	mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->
14064 	    cport_mutex);
14065 	if ((cportinfo->cport_state & SATA_STATE_READY) &&
14066 	    (cportinfo->cport_dev_type != SATA_DTYPE_NONE)) {
14067 		/* Some device is attached to the port */
14068 		if (cportinfo->cport_dev_type == SATA_DTYPE_UNKNOWN) {
14069 			/*
14070 			 * A device was not successfully attached.
14071 			 * Track retry time for device identification.
14072 			 */
14073 			if (cportinfo->cport_dev_attach_time != 0) {
14074 				clock_t cur_time = ddi_get_lbolt();
14075 				/*
14076 				 * If the retry time limit was not exceeded,
14077 				 * reinstate attach event.
14078 				 */
14079 				if ((cur_time -
14080 				    cportinfo->cport_dev_attach_time) <
14081 				    drv_usectohz(
14082 				    SATA_DEV_IDENTIFY_TIMEOUT)) {
14083 					/* OK, restore attach event */
14084 					cportinfo->cport_event_flags |=
14085 					    SATA_EVNT_DEVICE_ATTACHED;
14086 				} else {
14087 					/* Timeout - cannot identify device */
14088 					cportinfo->cport_dev_attach_time = 0;
14089 					sata_log(sata_hba_inst,
14090 					    CE_WARN,
14091 					    "Cannot identify SATA device "
14092 					    "at port %d - device will not be "
14093 					    "attached.",
14094 					    saddr->cport);
14095 				}
14096 			} else {
14097 				/*
14098 				 * Start tracking time for device
14099 				 * identification.
14100 				 * Save current time (lbolt value).
14101 				 */
14102 				cportinfo->cport_dev_attach_time =
14103 				    ddi_get_lbolt();
14104 				/* Restore attach event */
14105 				cportinfo->cport_event_flags |=
14106 				    SATA_EVNT_DEVICE_ATTACHED;
14107 			}
14108 		} else {
14109 			/*
14110 			 * If device was successfully attached, an explicit
14111 			 * 'configure' command will be needed to configure it.
14112 			 * Log the message indicating that a device
14113 			 * was attached.
14114 			 */
14115 			cportinfo->cport_dev_attach_time = 0;
14116 			sata_log(sata_hba_inst, CE_WARN,
14117 			    "SATA device detected at port %d", saddr->cport);
14118 
14119 			if (SATA_CPORTINFO_DRV_INFO(cportinfo) != NULL) {
14120 				sata_drive_info_t new_sdinfo;
14121 
14122 				/* Log device info data */
14123 				new_sdinfo = *(SATA_CPORTINFO_DRV_INFO(
14124 				    cportinfo));
14125 				sata_show_drive_info(sata_hba_inst,
14126 				    &new_sdinfo);
14127 			}
14128 
14129 			mutex_exit(&SATA_CPORT_INFO(sata_hba_inst,
14130 			    saddr->cport)->cport_mutex);
14131 
14132 			/*
14133 			 * Make sure that there is no target node for that
14134 			 * device. If so, release it. It should not happen,
14135 			 * unless we had problem removing the node when
14136 			 * device was detached.
14137 			 */
14138 			tdip = sata_get_target_dip(SATA_DIP(sata_hba_inst),
14139 			    saddr->cport);
14140 			mutex_enter(&SATA_CPORT_INFO(sata_hba_inst,
14141 			    saddr->cport)->cport_mutex);
14142 			if (tdip != NULL) {
14143 
14144 #ifdef SATA_DEBUG
14145 				if ((cportinfo->cport_event_flags &
14146 				    SATA_EVNT_TARGET_NODE_CLEANUP) == 0)
14147 					sata_log(sata_hba_inst, CE_WARN,
14148 					    "sata_process_device_attached: "
14149 					    "old device target node exists!");
14150 #endif
14151 				/*
14152 				 * target node exists - try to unconfigure
14153 				 * device and remove the node.
14154 				 */
14155 				mutex_exit(&SATA_CPORT_INFO(sata_hba_inst,
14156 				    saddr->cport)->cport_mutex);
14157 				rval = ndi_devi_offline(tdip,
14158 				    NDI_DEVI_REMOVE);
14159 				mutex_enter(&SATA_CPORT_INFO(sata_hba_inst,
14160 				    saddr->cport)->cport_mutex);
14161 
14162 				if (rval == NDI_SUCCESS) {
14163 					cportinfo->cport_event_flags &=
14164 					    ~SATA_EVNT_TARGET_NODE_CLEANUP;
14165 					cportinfo->cport_tgtnode_clean = B_TRUE;
14166 				} else {
14167 					/*
14168 					 * PROBLEM - the target node remained
14169 					 * and it belongs to a previously
14170 					 * attached device.
14171 					 * This happens when the file was open
14172 					 * or the node was waiting for
14173 					 * resources at the time the
14174 					 * associated device was removed.
14175 					 * Instruct event daemon to retry the
14176 					 * cleanup later.
14177 					 */
14178 					sata_log(sata_hba_inst,
14179 					    CE_WARN,
14180 					    "Application(s) accessing "
14181 					    "previously attached SATA "
14182 					    "device have to release "
14183 					    "it before newly inserted "
14184 					    "device can be made accessible.",
14185 					    saddr->cport);
14186 					cportinfo->cport_event_flags |=
14187 					    SATA_EVNT_TARGET_NODE_CLEANUP;
14188 					cportinfo->cport_tgtnode_clean =
14189 					    B_FALSE;
14190 				}
14191 			}
14192 
14193 		}
14194 	} else {
14195 		cportinfo->cport_dev_attach_time = 0;
14196 	}
14197 
14198 	event_flags = cportinfo->cport_event_flags;
14199 	mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->cport_mutex);
14200 	if (event_flags != 0) {
14201 		mutex_enter(&sata_hba_inst->satahba_mutex);
14202 		sata_hba_inst->satahba_event_flags |= SATA_EVNT_MAIN;
14203 		mutex_exit(&sata_hba_inst->satahba_mutex);
14204 		mutex_enter(&sata_mutex);
14205 		sata_event_pending |= SATA_EVNT_MAIN;
14206 		mutex_exit(&sata_mutex);
14207 	}
14208 }
14209 
14210 
14211 /*
14212  * Device Target Node Cleanup Event processing.
14213  * If the target node associated with a sata port device is in
14214  * DEVI_DEVICE_REMOVED state, an attempt is made to remove it.
14215  * If the target node cannot be removed, the event flag is left intact,
14216  * so that event daemon may re-run this function later.
14217  *
14218  * This function cannot be called in interrupt context (it may sleep).
14219  *
14220  * NOTE: Processes cport events only, not port multiplier ports.
14221  */
14222 static void
14223 sata_process_target_node_cleanup(sata_hba_inst_t *sata_hba_inst,
14224     sata_address_t *saddr)
14225 {
14226 	sata_cport_info_t *cportinfo;
14227 	dev_info_t *tdip;
14228 
14229 	SATADBG1(SATA_DBG_EVENTS_PROC, sata_hba_inst,
14230 	    "Processing port %d device target node cleanup", saddr->cport);
14231 
14232 	cportinfo = SATA_CPORT_INFO(sata_hba_inst, saddr->cport);
14233 
14234 	/*
14235 	 * Check if there is target node for that device and it is in the
14236 	 * DEVI_DEVICE_REMOVED state. If so, release it.
14237 	 */
14238 	tdip = sata_get_target_dip(SATA_DIP(sata_hba_inst), saddr->cport);
14239 	if (tdip != NULL) {
14240 		/*
14241 		 * target node exists - check if it is target node of
14242 		 * a removed device.
14243 		 */
14244 		if (sata_check_device_removed(tdip) == B_TRUE) {
14245 			SATADBG1(SATA_DBG_EVENTS_PROC, sata_hba_inst,
14246 			    "sata_process_target_node_cleanup: "
14247 			    "old device target node exists!", NULL);
14248 			/*
14249 			 * Unconfigure and remove the target node
14250 			 */
14251 			if (ndi_devi_offline(tdip, NDI_DEVI_REMOVE) ==
14252 			    NDI_SUCCESS) {
14253 				mutex_enter(&SATA_CPORT_INFO(sata_hba_inst,
14254 				    saddr->cport)->cport_mutex);
14255 				cportinfo->cport_event_flags &=
14256 				    ~SATA_EVNT_TARGET_NODE_CLEANUP;
14257 				mutex_exit(&SATA_CPORT_INFO(sata_hba_inst,
14258 				    saddr->cport)->cport_mutex);
14259 				return;
14260 			}
14261 			/*
14262 			 * Event daemon will retry the cleanup later.
14263 			 */
14264 			mutex_enter(&sata_hba_inst->satahba_mutex);
14265 			sata_hba_inst->satahba_event_flags |= SATA_EVNT_MAIN;
14266 			mutex_exit(&sata_hba_inst->satahba_mutex);
14267 			mutex_enter(&sata_mutex);
14268 			sata_event_pending |= SATA_EVNT_MAIN;
14269 			mutex_exit(&sata_mutex);
14270 		}
14271 	} else {
14272 		mutex_enter(&SATA_CPORT_INFO(sata_hba_inst,
14273 		    saddr->cport)->cport_mutex);
14274 		cportinfo->cport_event_flags &=
14275 		    ~SATA_EVNT_TARGET_NODE_CLEANUP;
14276 		mutex_exit(&SATA_CPORT_INFO(sata_hba_inst,
14277 		    saddr->cport)->cport_mutex);
14278 	}
14279 }
14280 
14281 static void
14282 sata_gen_sysevent(sata_hba_inst_t *sata_hba_inst, sata_address_t *saddr,
14283     int hint)
14284 {
14285 	char ap[MAXPATHLEN];
14286 	nvlist_t *ev_attr_list = NULL;
14287 	int err;
14288 
14289 	/* Allocate and build sysevent attribute list */
14290 	err = nvlist_alloc(&ev_attr_list, NV_UNIQUE_NAME_TYPE, DDI_NOSLEEP);
14291 	if (err != 0) {
14292 		SATA_LOG_D((sata_hba_inst, CE_WARN,
14293 		    "sata_gen_sysevent: "
14294 		    "cannot allocate memory for sysevent attributes\n"));
14295 		return;
14296 	}
14297 	/* Add hint attribute */
14298 	err = nvlist_add_string(ev_attr_list, DR_HINT, SE_HINT2STR(hint));
14299 	if (err != 0) {
14300 		SATA_LOG_D((sata_hba_inst, CE_WARN,
14301 		    "sata_gen_sysevent: "
14302 		    "failed to add DR_HINT attr for sysevent"));
14303 		nvlist_free(ev_attr_list);
14304 		return;
14305 	}
14306 	/*
14307 	 * Add AP attribute.
14308 	 * Get controller pathname and convert it into AP pathname by adding
14309 	 * a target number.
14310 	 */
14311 	(void) snprintf(ap, MAXPATHLEN, "/devices");
14312 	(void) ddi_pathname(SATA_DIP(sata_hba_inst), ap + strlen(ap));
14313 	(void) snprintf(ap + strlen(ap), MAXPATHLEN - strlen(ap), ":%d",
14314 	    SATA_MAKE_AP_NUMBER(saddr->cport, saddr->pmport, saddr->qual));
14315 
14316 	err = nvlist_add_string(ev_attr_list, DR_AP_ID, ap);
14317 	if (err != 0) {
14318 		SATA_LOG_D((sata_hba_inst, CE_WARN,
14319 		    "sata_gen_sysevent: "
14320 		    "failed to add DR_AP_ID attr for sysevent"));
14321 		nvlist_free(ev_attr_list);
14322 		return;
14323 	}
14324 
14325 	/* Generate/log sysevent */
14326 	err = ddi_log_sysevent(SATA_DIP(sata_hba_inst), DDI_VENDOR_SUNW, EC_DR,
14327 	    ESC_DR_AP_STATE_CHANGE, ev_attr_list, NULL, DDI_NOSLEEP);
14328 	if (err != DDI_SUCCESS) {
14329 		SATA_LOG_D((sata_hba_inst, CE_WARN,
14330 		    "sata_gen_sysevent: "
14331 		    "cannot log sysevent, err code %x\n", err));
14332 	}
14333 
14334 	nvlist_free(ev_attr_list);
14335 }
14336 
14337 
14338 
14339 
14340 /*
14341  * Set DEVI_DEVICE_REMOVED state in the SATA device target node.
14342  */
14343 static void
14344 sata_set_device_removed(dev_info_t *tdip)
14345 {
14346 	int circ;
14347 
14348 	ASSERT(tdip != NULL);
14349 
14350 	ndi_devi_enter(tdip, &circ);
14351 	mutex_enter(&DEVI(tdip)->devi_lock);
14352 	DEVI_SET_DEVICE_REMOVED(tdip);
14353 	mutex_exit(&DEVI(tdip)->devi_lock);
14354 	ndi_devi_exit(tdip, circ);
14355 }
14356 
14357 
14358 /*
14359  * Set internal event instructing event daemon to try
14360  * to perform the target node cleanup.
14361  */
14362 static void
14363 sata_set_target_node_cleanup(sata_hba_inst_t *sata_hba_inst, int cport)
14364 {
14365 	mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, cport)->cport_mutex);
14366 	SATA_CPORT_EVENT_FLAGS(sata_hba_inst, cport) |=
14367 	    SATA_EVNT_TARGET_NODE_CLEANUP;
14368 	SATA_CPORT_INFO(sata_hba_inst, cport)->cport_tgtnode_clean = B_FALSE;
14369 	mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, cport)->cport_mutex);
14370 	mutex_enter(&sata_hba_inst->satahba_mutex);
14371 	sata_hba_inst->satahba_event_flags |= SATA_EVNT_MAIN;
14372 	mutex_exit(&sata_hba_inst->satahba_mutex);
14373 	mutex_enter(&sata_mutex);
14374 	sata_event_pending |= SATA_EVNT_MAIN;
14375 	mutex_exit(&sata_mutex);
14376 }
14377 
14378 
14379 /*
14380  * Check if the SATA device target node is in DEVI_DEVICE_REMOVED state,
14381  * i.e. check if the target node state indicates that it belongs to a removed
14382  * device.
14383  *
14384  * Returns B_TRUE if the target node is in DEVI_DEVICE_REMOVED state,
14385  * B_FALSE otherwise.
14386  *
14387  * NOTE: No port multiplier support.
14388  */
14389 static boolean_t
14390 sata_check_device_removed(dev_info_t *tdip)
14391 {
14392 	ASSERT(tdip != NULL);
14393 
14394 	if (DEVI_IS_DEVICE_REMOVED(tdip))
14395 		return (B_TRUE);
14396 	else
14397 		return (B_FALSE);
14398 }
14399