xref: /illumos-gate/usr/src/uts/common/io/sata/impl/sata.c (revision 9182c9260eeeb6d8f7e0e1b6ae07369a19958e24)
1 /*
2  * CDDL HEADER START
3  *
4  * The contents of this file are subject to the terms of the
5  * Common Development and Distribution License (the "License").
6  * You may not use this file except in compliance with the License.
7  *
8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9  * or http://www.opensolaris.org/os/licensing.
10  * See the License for the specific language governing permissions
11  * and limitations under the License.
12  *
13  * When distributing Covered Code, include this CDDL HEADER in each
14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15  * If applicable, add the following below this CDDL HEADER, with the
16  * fields enclosed by brackets "[]" replaced with your own identifying
17  * information: Portions Copyright [yyyy] [name of copyright owner]
18  *
19  * CDDL HEADER END
20  */
21 
22 /*
23  * Copyright (c) 2006, 2010, Oracle and/or its affiliates. All rights reserved.
24  */
25 /*
26  * Copyright 2017 Nexenta Systems, Inc.  All rights reserved.
27  * Copyright 2016 Argo Technologies SA
28  * Copyright 2019 Joyent, Inc.
29  * Copyright 2024 RackTop Systems, Inc.
30  * Copyright 2023 Oxide Computer Company
31  * Copyright 2023 Jason King
32  */
33 
34 /*
35  * SATA Framework
36  * Generic SATA Host Adapter Implementation
37  */
38 
39 #include <sys/conf.h>
40 #include <sys/file.h>
41 #include <sys/ddi.h>
42 #include <sys/sunddi.h>
43 #include <sys/modctl.h>
44 #include <sys/cmn_err.h>
45 #include <sys/errno.h>
46 #include <sys/thread.h>
47 #include <sys/kstat.h>
48 #include <sys/note.h>
49 #include <sys/sysevent.h>
50 #include <sys/sysevent/eventdefs.h>
51 #include <sys/sysevent/dr.h>
52 #include <sys/taskq.h>
53 #include <sys/disp.h>
54 #include <sys/sdt.h>
55 
56 #include <sys/sata/impl/sata.h>
57 #include <sys/sata/sata_hba.h>
58 #include <sys/sata/sata_defs.h>
59 #include <sys/sata/sata_cfgadm.h>
60 #include <sys/sata/sata_blacklist.h>
61 #include <sys/sata/sata_satl.h>
62 
63 #include <sys/scsi/impl/spc3_types.h>
64 
65 /*
66  * FMA header files
67  */
68 #include <sys/ddifm.h>
69 #include <sys/fm/protocol.h>
70 #include <sys/fm/util.h>
71 #include <sys/fm/io/ddi.h>
72 
73 /* Debug flags - defined in sata.h */
74 int	sata_debug_flags = 0;
75 int	sata_msg = 0;
76 
77 /*
78  * Flags enabling selected SATA HBA framework functionality
79  */
80 #define	SATA_ENABLE_QUEUING		1
81 #define	SATA_ENABLE_NCQ			2
82 #define	SATA_ENABLE_PROCESS_EVENTS	4
83 #define	SATA_ENABLE_PMULT_FBS		8 /* FIS-Based Switching */
84 int sata_func_enable =
85 	SATA_ENABLE_PROCESS_EVENTS | SATA_ENABLE_QUEUING | SATA_ENABLE_NCQ;
86 
87 /*
88  * Global variable setting default maximum queue depth (NCQ or TCQ)
89  * Note:minimum queue depth is 1
90  */
91 int sata_max_queue_depth = SATA_MAX_QUEUE_DEPTH; /* max NCQ/TCQ queue depth */
92 
93 /*
94  * Currently used default NCQ/TCQ queue depth. It is set-up during the driver
95  * initialization, using value from sata_max_queue_depth
96  * It is adjusted to minimum supported by the controller and by the device,
97  * if queueing is enabled.
98  */
99 static	int sata_current_max_qdepth;
100 
101 /*
102  * Global variable determining the default behavior after device hotpluggin.
103  * If non-zero, the hotplugged device is onlined (if possible) without explicit
104  * IOCTL request (AP_CONFIGURE).
105  * If zero, hotplugged device is identified, but not onlined.
106  * Enabling (AP_CONNECT) device port with an attached device does not result
107  * in device onlining regardless of the flag setting
108  */
109 int sata_auto_online = 0;
110 
111 #ifdef SATA_DEBUG
112 
113 #define	SATA_LOG_D(args)	sata_log args
114 uint64_t mbuf_count = 0;
115 uint64_t mbuffail_count = 0;
116 
117 sata_atapi_cmd_t sata_atapi_trace[64];
118 uint32_t sata_atapi_trace_index = 0;
119 int sata_atapi_trace_save = 1;
120 static	void sata_save_atapi_trace(sata_pkt_txlate_t *, int);
121 #define	SATAATAPITRACE(spx, count)	\
122 	if (sata_atapi_trace_save)	\
123 	    sata_save_atapi_trace(spx, count)
124 
125 #else
126 #define	SATA_LOG_D(args)	sata_trace_log args
127 #define	SATAATAPITRACE(spx, count)
128 #endif
129 
130 #if 0
131 static void
132 sata_test_atapi_packet_command(sata_hba_inst_t *, int);
133 #endif
134 
135 #ifdef SATA_INJECT_FAULTS
136 
137 #define		SATA_INJECT_PKT_FAULT	1
138 uint32_t	sata_inject_fault = 0;
139 
140 uint32_t	sata_inject_fault_count = 0;
141 uint32_t	sata_inject_fault_pause_count = 0;
142 uint32_t	sata_fault_type = 0;
143 uint32_t	sata_fault_cmd = 0;
144 dev_info_t	*sata_fault_ctrl = NULL;
145 sata_device_t	sata_fault_device;
146 
147 static	void sata_inject_pkt_fault(sata_pkt_t *, int *, int);
148 
149 #endif
150 
151 #define	LEGACY_HWID_LEN	64	/* Model (40) + Serial (20) + pad */
152 
153 /*
154  * SATA cb_ops functions
155  */
156 static	int sata_hba_open(dev_t *, int, int, cred_t *);
157 static	int sata_hba_close(dev_t, int, int, cred_t *);
158 static	int sata_hba_ioctl(dev_t, int, intptr_t, int, cred_t *,	int *);
159 
160 /*
161  * SCSA required entry points
162  */
163 static	int sata_scsi_tgt_init(dev_info_t *, dev_info_t *,
164     scsi_hba_tran_t *, struct scsi_device *);
165 static	int sata_scsi_tgt_probe(struct scsi_device *,
166     int (*callback)(void));
167 static void sata_scsi_tgt_free(dev_info_t *, dev_info_t *,
168     scsi_hba_tran_t *, struct scsi_device *);
169 static	int sata_scsi_start(struct scsi_address *, struct scsi_pkt *);
170 static	int sata_scsi_abort(struct scsi_address *, struct scsi_pkt *);
171 static	int sata_scsi_reset(struct scsi_address *, int);
172 static	int sata_scsi_getcap(struct scsi_address *, char *, int);
173 static	int sata_scsi_setcap(struct scsi_address *, char *, int, int);
174 static	struct scsi_pkt *sata_scsi_init_pkt(struct scsi_address *,
175     struct scsi_pkt *, struct buf *, int, int, int, int, int (*)(caddr_t),
176     caddr_t);
177 static	void sata_scsi_destroy_pkt(struct scsi_address *, struct scsi_pkt *);
178 static	void sata_scsi_dmafree(struct scsi_address *, struct scsi_pkt *);
179 static	void sata_scsi_sync_pkt(struct scsi_address *, struct scsi_pkt *);
180 
181 /*
182  * SATA HBA interface functions are defined in sata_hba.h header file
183  */
184 
185 /* Event processing functions */
186 static	void sata_event_daemon(void *);
187 static	void sata_event_thread_control(int);
188 static	void sata_process_controller_events(sata_hba_inst_t *sata_hba_inst);
189 static	void sata_process_pmult_events(sata_hba_inst_t *, uint8_t);
190 static	void sata_process_device_reset(sata_hba_inst_t *, sata_address_t *);
191 static	void sata_process_pmdevice_reset(sata_hba_inst_t *, sata_address_t *);
192 static	void sata_process_port_failed_event(sata_hba_inst_t *,
193     sata_address_t *);
194 static	void sata_process_port_link_events(sata_hba_inst_t *,
195     sata_address_t *);
196 static	void sata_process_pmport_link_events(sata_hba_inst_t *,
197     sata_address_t *);
198 static	void sata_process_device_detached(sata_hba_inst_t *, sata_address_t *);
199 static	void sata_process_pmdevice_detached(sata_hba_inst_t *,
200     sata_address_t *);
201 static	void sata_process_device_attached(sata_hba_inst_t *, sata_address_t *);
202 static	void sata_process_pmdevice_attached(sata_hba_inst_t *,
203     sata_address_t *);
204 static	void sata_process_port_pwr_change(sata_hba_inst_t *, sata_address_t *);
205 static	void sata_process_cntrl_pwr_level_change(sata_hba_inst_t *);
206 static	void sata_process_target_node_cleanup(sata_hba_inst_t *,
207     sata_address_t *);
208 static	void sata_process_device_autoonline(sata_hba_inst_t *,
209     sata_address_t *saddr);
210 
211 /*
212  * Local translation functions
213  */
214 static	int sata_txlt_inquiry(sata_pkt_txlate_t *);
215 static	int sata_txlt_test_unit_ready(sata_pkt_txlate_t *);
216 static	int sata_txlt_start_stop_unit(sata_pkt_txlate_t *);
217 static	int sata_txlt_read_capacity(sata_pkt_txlate_t *);
218 static	int sata_txlt_read_capacity16(sata_pkt_txlate_t *);
219 static  int sata_txlt_unmap(sata_pkt_txlate_t *);
220 static	boolean_t sata_txlt_unmap_supported(sata_pkt_txlate_t *,
221     sata_drive_info_t *);
222 static	int sata_txlt_request_sense(sata_pkt_txlate_t *);
223 static	int sata_txlt_read(sata_pkt_txlate_t *);
224 static	int sata_txlt_write(sata_pkt_txlate_t *);
225 static	int sata_txlt_log_sense(sata_pkt_txlate_t *);
226 static	int sata_txlt_mode_sense(sata_pkt_txlate_t *);
227 static	int sata_txlt_mode_select(sata_pkt_txlate_t *);
228 static	int sata_txlt_ata_pass_thru(sata_pkt_txlate_t *);
229 static	int sata_txlt_synchronize_cache(sata_pkt_txlate_t *);
230 static	int sata_txlt_write_buffer(sata_pkt_txlate_t *);
231 static	int sata_txlt_nodata_cmd_immediate(sata_pkt_txlate_t *);
232 static	int sata_txlt_supported_ops(sata_pkt_txlate_t *);
233 
234 static	int sata_hba_start(sata_pkt_txlate_t *, int *);
235 static	int sata_txlt_invalid_command(sata_pkt_txlate_t *);
236 static	int sata_txlt_check_condition(sata_pkt_txlate_t *, uchar_t, uchar_t);
237 static	int sata_txlt_lba_out_of_range(sata_pkt_txlate_t *);
238 static	int sata_txlt_ata_pass_thru_illegal_cmd(sata_pkt_txlate_t *);
239 static  int sata_txlt_unmap_nodata_cmd(sata_pkt_txlate_t *);
240 static	void sata_txlt_rw_completion(sata_pkt_t *);
241 static	void sata_txlt_nodata_cmd_completion(sata_pkt_t *);
242 static	void sata_txlt_apt_completion(sata_pkt_t *sata_pkt);
243 static	void sata_txlt_unmap_completion(sata_pkt_t *sata_pkt);
244 static	int sata_emul_rw_completion(sata_pkt_txlate_t *);
245 static	void sata_fill_ata_return_desc(sata_pkt_t *, uint8_t, uint8_t,
246     uint8_t);
247 static	struct scsi_extended_sense *sata_arq_sense(sata_pkt_txlate_t *);
248 
249 static	int sata_txlt_atapi(sata_pkt_txlate_t *);
250 static	void sata_txlt_atapi_completion(sata_pkt_t *);
251 
252 /*
253  * Local functions for ioctl
254  */
255 static	int32_t sata_get_port_num(sata_hba_inst_t *,  struct devctl_iocdata *);
256 static	void sata_cfgadm_state(sata_hba_inst_t *, int32_t,
257     devctl_ap_state_t *);
258 static	dev_info_t *sata_get_target_dip(dev_info_t *, uint8_t, uint8_t);
259 static	dev_info_t *sata_get_scsi_target_dip(dev_info_t *, sata_address_t *);
260 static	dev_info_t *sata_devt_to_devinfo(dev_t);
261 static	int sata_ioctl_connect(sata_hba_inst_t *, sata_device_t *);
262 static	int sata_ioctl_disconnect(sata_hba_inst_t *, sata_device_t *);
263 static	int sata_ioctl_configure(sata_hba_inst_t *, sata_device_t *);
264 static	int sata_ioctl_unconfigure(sata_hba_inst_t *, sata_device_t *);
265 static	int sata_ioctl_activate(sata_hba_inst_t *, sata_device_t *);
266 static	int sata_ioctl_deactivate(sata_hba_inst_t *, sata_device_t *);
267 static	int sata_ioctl_reset_port(sata_hba_inst_t *, sata_device_t *);
268 static	int sata_ioctl_reset_device(sata_hba_inst_t *, sata_device_t *);
269 static	int sata_ioctl_reset_all(sata_hba_inst_t *);
270 static	int sata_ioctl_port_self_test(sata_hba_inst_t *, sata_device_t *);
271 static	int sata_ioctl_get_device_path(sata_hba_inst_t *, sata_device_t *,
272     sata_ioctl_data_t *, int mode);
273 static	int sata_ioctl_get_ap_type(sata_hba_inst_t *, sata_device_t *,
274     sata_ioctl_data_t *, int mode);
275 static	int sata_ioctl_get_model_info(sata_hba_inst_t *, sata_device_t *,
276     sata_ioctl_data_t *, int mode);
277 static	int sata_ioctl_get_revfirmware_info(sata_hba_inst_t *, sata_device_t *,
278     sata_ioctl_data_t *, int mode);
279 static	int sata_ioctl_get_serialnumber_info(sata_hba_inst_t *,
280     sata_device_t *, sata_ioctl_data_t *, int mode);
281 
282 /*
283  * Local functions
284  */
285 static	void sata_remove_hba_instance(dev_info_t *);
286 static	int sata_validate_sata_hba_tran(dev_info_t *, sata_hba_tran_t *);
287 static	void sata_probe_ports(sata_hba_inst_t *);
288 static	void sata_probe_pmports(sata_hba_inst_t *, uint8_t);
289 static	int sata_reprobe_port(sata_hba_inst_t *, sata_device_t *, int);
290 static	int sata_reprobe_pmult(sata_hba_inst_t *, sata_device_t *, int);
291 static	int sata_reprobe_pmport(sata_hba_inst_t *, sata_device_t *, int);
292 static	int sata_alloc_pmult(sata_hba_inst_t *, sata_device_t *);
293 static	void sata_free_pmult(sata_hba_inst_t *, sata_device_t *);
294 static	int sata_add_device(dev_info_t *, sata_hba_inst_t *, sata_device_t *);
295 static	int sata_offline_device(sata_hba_inst_t *, sata_device_t *,
296     sata_drive_info_t *);
297 static	dev_info_t *sata_create_target_node(dev_info_t *, sata_hba_inst_t *,
298     sata_address_t *);
299 static	void sata_remove_target_node(sata_hba_inst_t *,
300     sata_address_t *);
301 static	int sata_validate_scsi_address(sata_hba_inst_t *,
302     struct scsi_address *, sata_device_t *);
303 static	int sata_validate_sata_address(sata_hba_inst_t *, int, int, int);
304 static	sata_pkt_t *sata_pkt_alloc(sata_pkt_txlate_t *, int (*)(caddr_t));
305 static	void sata_pkt_free(sata_pkt_txlate_t *);
306 static	int sata_dma_buf_setup(sata_pkt_txlate_t *, int, int (*)(caddr_t),
307     caddr_t, ddi_dma_attr_t *);
308 static	void sata_common_free_dma_rsrcs(sata_pkt_txlate_t *);
309 static	int sata_probe_device(sata_hba_inst_t *, sata_device_t *);
310 static	sata_drive_info_t *sata_get_device_info(sata_hba_inst_t *,
311     sata_device_t *);
312 static	int sata_identify_device(sata_hba_inst_t *, sata_drive_info_t *);
313 static	void sata_reidentify_device(sata_pkt_txlate_t *);
314 static	struct buf *sata_alloc_local_buffer(sata_pkt_txlate_t *, size_t);
315 static	void sata_free_local_buffer(sata_pkt_txlate_t *);
316 static	uint64_t sata_check_capacity(sata_drive_info_t *);
317 void	sata_adjust_dma_attr(sata_drive_info_t *, ddi_dma_attr_t *,
318     ddi_dma_attr_t *);
319 static	int sata_fetch_device_identify_data(sata_hba_inst_t *,
320     sata_drive_info_t *);
321 static	void sata_update_port_info(sata_hba_inst_t *, sata_device_t *);
322 static	void sata_update_pmport_info(sata_hba_inst_t *, sata_device_t *);
323 static	int sata_set_dma_mode(sata_hba_inst_t *, sata_drive_info_t *);
324 static	int sata_set_cache_mode(sata_hba_inst_t *, sata_drive_info_t *, int);
325 static	int sata_set_rmsn(sata_hba_inst_t *, sata_drive_info_t *, int);
326 static	int sata_set_drive_features(sata_hba_inst_t *,
327     sata_drive_info_t *, int flag);
328 static	void sata_init_write_cache_mode(sata_drive_info_t *sdinfo);
329 static	int sata_initialize_device(sata_hba_inst_t *, sata_drive_info_t *);
330 static	void sata_identdev_to_inquiry(sata_hba_inst_t *, sata_drive_info_t *,
331     uint8_t *);
332 static	int sata_get_atapi_inquiry_data(sata_hba_inst_t *, sata_address_t *,
333     struct scsi_inquiry *);
334 static	int sata_build_msense_page_1(sata_drive_info_t *, int, uint8_t *);
335 static	int sata_build_msense_page_8(sata_drive_info_t *, int, uint8_t *);
336 static	int sata_build_msense_page_1a(sata_drive_info_t *, int, uint8_t *);
337 static	int sata_build_msense_page_1c(sata_drive_info_t *, int, uint8_t *);
338 static	int sata_build_msense_page_30(sata_drive_info_t *, int, uint8_t *);
339 static	int sata_mode_select_page_8(sata_pkt_txlate_t *,
340     struct mode_cache_scsi3 *, int, int *, int *, int *);
341 static	int sata_mode_select_page_1a(sata_pkt_txlate_t *,
342     struct mode_info_power_cond *, int, int *, int *, int *);
343 static	int sata_mode_select_page_1c(sata_pkt_txlate_t *,
344     struct mode_info_excpt_page *, int, int *, int *, int *);
345 static	int sata_mode_select_page_30(sata_pkt_txlate_t *,
346     struct mode_acoustic_management *, int, int *, int *, int *);
347 
348 static	int sata_build_lsense_page_0(sata_drive_info_t *, uint8_t *);
349 static	int sata_build_lsense_page_03(sata_drive_info_t *, uint8_t *,
350     sata_hba_inst_t *);
351 static	int sata_build_lsense_page_0d(sata_drive_info_t *, uint8_t *,
352     sata_hba_inst_t *);
353 static	int sata_build_lsense_page_0e(sata_drive_info_t *, uint8_t *,
354     sata_pkt_txlate_t *);
355 static	int sata_build_lsense_page_10(sata_drive_info_t *, uint8_t *,
356     sata_hba_inst_t *);
357 static	int sata_build_lsense_page_11(sata_drive_info_t *, uint8_t *,
358     sata_hba_inst_t *);
359 static	int sata_build_lsense_page_19(sata_drive_info_t *, uint8_t *,
360     sata_hba_inst_t *);
361 static	int sata_build_lsense_page_2f(sata_drive_info_t *, uint8_t *,
362     sata_hba_inst_t *);
363 static	int sata_build_lsense_page_30(sata_drive_info_t *, uint8_t *,
364     sata_hba_inst_t *);
365 
366 static	void sata_set_arq_data(sata_pkt_t *);
367 static	void sata_build_read_verify_cmd(sata_cmd_t *, uint16_t, uint64_t);
368 static	void sata_build_generic_cmd(sata_cmd_t *, uint8_t);
369 static	uint8_t sata_get_standby_timer(uint8_t *timer);
370 
371 static	void sata_save_drive_settings(sata_drive_info_t *);
372 static	void sata_show_drive_info(sata_hba_inst_t *, sata_drive_info_t *);
373 static	void sata_show_pmult_info(sata_hba_inst_t *, sata_device_t *);
374 static	void sata_log(sata_hba_inst_t *, uint_t, char *fmt, ...);
375 #ifndef SATA_DEBUG
376 static	void sata_trace_log(sata_hba_inst_t *, uint_t, const char *fmt, ...);
377 #endif
378 static	int sata_fetch_smart_return_status(sata_hba_inst_t *,
379     sata_drive_info_t *);
380 static	int sata_fetch_smart_data(sata_hba_inst_t *, sata_drive_info_t *,
381     struct smart_data *);
382 static	int sata_smart_selftest_log(sata_hba_inst_t *,
383     sata_drive_info_t *,
384     struct smart_selftest_log *);
385 static	int sata_ext_smart_selftest_read_log(sata_hba_inst_t *,
386     sata_drive_info_t *, struct smart_ext_selftest_log *, uint16_t);
387 static int sata_read_log_ext(sata_hba_inst_t *, sata_drive_info_t *, uint8_t,
388     uint16_t, void *, uint16_t);
389 static	int sata_smart_read_log(sata_hba_inst_t *, sata_drive_info_t *,
390     uint8_t *, uint8_t, uint8_t);
391 static	int sata_read_log_ext_directory(sata_hba_inst_t *, sata_drive_info_t *,
392     struct read_log_ext_directory *);
393 static	void sata_gen_sysevent(sata_hba_inst_t *, sata_address_t *, int);
394 static	void sata_xlate_errors(sata_pkt_txlate_t *);
395 static	void sata_decode_device_error(sata_pkt_txlate_t *,
396     struct scsi_extended_sense *);
397 static	void sata_set_device_removed(dev_info_t *);
398 static	boolean_t sata_check_device_removed(dev_info_t *);
399 static	void sata_set_target_node_cleanup(sata_hba_inst_t *, sata_address_t *);
400 static	int sata_ncq_err_ret_cmd_setup(sata_pkt_txlate_t *,
401     sata_drive_info_t *);
402 static	int sata_atapi_err_ret_cmd_setup(sata_pkt_txlate_t *,
403     sata_drive_info_t *);
404 static	void sata_atapi_packet_cmd_setup(sata_cmd_t *, sata_drive_info_t *);
405 static	void sata_fixed_sense_data_preset(struct scsi_extended_sense *);
406 static  void sata_target_devid_register(dev_info_t *, sata_drive_info_t *);
407 static  int sata_check_modser(char *, int);
408 
409 /*
410  * FMA
411  */
412 static boolean_t sata_check_for_dma_error(dev_info_t *, sata_pkt_txlate_t *);
413 
414 
415 /*
416  * SATA Framework will ignore SATA HBA driver cb_ops structure and
417  * register following one with SCSA framework.
418  * Open & close are provided, so scsi framework will not use its own
419  */
420 static struct cb_ops sata_cb_ops = {
421 	sata_hba_open,			/* open */
422 	sata_hba_close,			/* close */
423 	nodev,				/* strategy */
424 	nodev,				/* print */
425 	nodev,				/* dump */
426 	nodev,				/* read */
427 	nodev,				/* write */
428 	sata_hba_ioctl,			/* ioctl */
429 	nodev,				/* devmap */
430 	nodev,				/* mmap */
431 	nodev,				/* segmap */
432 	nochpoll,			/* chpoll */
433 	ddi_prop_op,			/* cb_prop_op */
434 	0,				/* streamtab */
435 	D_NEW | D_MP,			/* cb_flag */
436 	CB_REV,				/* rev */
437 	nodev,				/* aread */
438 	nodev				/* awrite */
439 };
440 
441 
442 extern struct mod_ops mod_miscops;
443 extern uchar_t	scsi_cdb_size[];
444 
445 static struct modlmisc modlmisc = {
446 	&mod_miscops,			/* Type of module */
447 	"SATA Module"			/* module name */
448 };
449 
450 
451 static struct modlinkage modlinkage = {
452 	MODREV_1,
453 	(void *)&modlmisc,
454 	NULL
455 };
456 
457 /*
458  * Default sata pkt timeout. Used when a target driver scsi_pkt time is zero,
459  * i.e. when scsi_pkt has not timeout specified.
460  */
461 static int sata_default_pkt_time = 60;	/* 60 seconds */
462 
463 /*
464  * Intermediate buffer device access attributes - they are required,
465  * but not necessarily used.
466  */
467 static ddi_device_acc_attr_t sata_acc_attr = {
468 	DDI_DEVICE_ATTR_V0,
469 	DDI_STRUCTURE_LE_ACC,
470 	DDI_STRICTORDER_ACC
471 };
472 
473 
474 /*
475  * Mutexes protecting structures in multithreaded operations.
476  * Because events are relatively rare, a single global mutex protecting
477  * data structures should be sufficient. To increase performance, add
478  * separate mutex per each sata port and use global mutex only to protect
479  * common data structures.
480  */
481 static	kmutex_t sata_mutex;		/* protects sata_hba_list */
482 static	kmutex_t sata_log_mutex;	/* protects log */
483 
484 static	char sata_log_buf[256];
485 
486 /*
487  * sata trace debug
488  */
489 static	sata_trace_rbuf_t *sata_debug_rbuf;
490 static	sata_trace_dmsg_t *sata_trace_dmsg_alloc(void);
491 static	void sata_trace_dmsg_free(void);
492 static	void sata_trace_rbuf_alloc(void);
493 static	void sata_trace_rbuf_free(void);
494 
495 int	dmsg_ring_size = DMSG_RING_SIZE;
496 
497 /* Default write cache setting for SATA hard disks */
498 int	sata_write_cache = 1;		/* enabled */
499 
500 /* Default write cache setting for SATA ATAPI CD/DVD */
501 int	sata_atapicdvd_write_cache = 1; /* enabled */
502 
503 /* Default write cache setting for SATA ATAPI tape */
504 int	sata_atapitape_write_cache = 1; /* enabled */
505 
506 /* Default write cache setting for SATA ATAPI disk */
507 int	sata_atapidisk_write_cache = 1;	/* enabled */
508 
509 /*
510  * Linked list of HBA instances
511  */
512 static	sata_hba_inst_t *sata_hba_list = NULL;
513 static	sata_hba_inst_t *sata_hba_list_tail = NULL;
514 /*
515  * Pointer to per-instance SATA HBA soft structure is stored in sata_hba_tran
516  * structure and in sata soft state.
517  */
518 
519 /*
520  * Event daemon related variables
521  */
522 static	kmutex_t sata_event_mutex;
523 static	kcondvar_t sata_event_cv;
524 static	kthread_t *sata_event_thread = NULL;
525 static	int sata_event_thread_terminate = 0;
526 static	int sata_event_pending = 0;
527 static	int sata_event_thread_active = 0;
528 extern	pri_t minclsyspri;
529 
530 /*
531  * NCQ error recovery command
532  */
533 static const sata_cmd_t sata_rle_cmd = {
534 	SATA_CMD_REV,
535 	NULL,
536 	{
537 		SATA_DIR_READ
538 	},
539 	ATA_ADDR_LBA48,
540 	0,
541 	0,
542 	0,
543 	0,
544 	0,
545 	1,
546 	READ_LOG_EXT_NCQ_ERROR_RECOVERY,
547 	0,
548 	0,
549 	0,
550 	SATAC_READ_LOG_EXT,
551 	0,
552 	0,
553 	0,
554 };
555 
556 /*
557  * ATAPI error recovery CDB
558  */
559 static const uint8_t sata_rqsense_cdb[SATA_ATAPI_RQSENSE_CDB_LEN] = {
560 	SCMD_REQUEST_SENSE,
561 	0,			/* Only fixed RQ format is supported */
562 	0,
563 	0,
564 	SATA_ATAPI_MIN_RQSENSE_LEN, /* Less data may be returned */
565 	0
566 };
567 
568 
569 /* Warlock directives */
570 
571 _NOTE(SCHEME_PROTECTS_DATA("No Mutex Needed", scsi_hba_tran))
572 _NOTE(SCHEME_PROTECTS_DATA("No Mutex Needed", scsi_device))
573 _NOTE(SCHEME_PROTECTS_DATA("No Mutex Needed", dev_ops))
574 _NOTE(SCHEME_PROTECTS_DATA("No Mutex Needed", scsi_extended_sense))
575 _NOTE(SCHEME_PROTECTS_DATA("No Mutex Needed", scsi_arq_status))
576 _NOTE(SCHEME_PROTECTS_DATA("No Mutex Needed", ddi_dma_attr))
577 _NOTE(SCHEME_PROTECTS_DATA("No Mutex Needed", ddi_dma_cookie_t))
578 _NOTE(SCHEME_PROTECTS_DATA("No Mutex Needed", devctl_ap_state))
579 _NOTE(SCHEME_PROTECTS_DATA("No Mutex Needed", dev_info::devi_state))
580 _NOTE(MUTEX_PROTECTS_DATA(sata_mutex, sata_hba_list))
581 _NOTE(DATA_READABLE_WITHOUT_LOCK(sata_hba_list))
582 _NOTE(MUTEX_PROTECTS_DATA(sata_mutex, sata_hba_inst::satahba_next))
583 _NOTE(MUTEX_PROTECTS_DATA(sata_mutex, sata_hba_inst::satahba_prev))
584 _NOTE(SCHEME_PROTECTS_DATA("No Mutex Needed", \
585     sata_hba_inst::satahba_scsi_tran))
586 _NOTE(SCHEME_PROTECTS_DATA("No Mutex Needed", sata_hba_inst::satahba_tran))
587 _NOTE(SCHEME_PROTECTS_DATA("No Mutex Needed", sata_hba_inst::satahba_dip))
588 _NOTE(SCHEME_PROTECTS_DATA("Scheme", sata_hba_inst::satahba_attached))
589 _NOTE(DATA_READABLE_WITHOUT_LOCK(sata_hba_inst::satahba_dev_port))
590 _NOTE(MUTEX_PROTECTS_DATA(sata_hba_inst::satahba_mutex,
591     sata_hba_inst::satahba_event_flags))
592 _NOTE(MUTEX_PROTECTS_DATA(sata_cport_info::cport_mutex, \
593     sata_cport_info::cport_devp))
594 _NOTE(DATA_READABLE_WITHOUT_LOCK(sata_cport_info::cport_devp))
595 _NOTE(SCHEME_PROTECTS_DATA("Scheme", sata_cport_info::cport_addr))
596 _NOTE(MUTEX_PROTECTS_DATA(sata_cport_info::cport_mutex, \
597     sata_cport_info::cport_dev_type))
598 _NOTE(DATA_READABLE_WITHOUT_LOCK(sata_cport_info::cport_dev_type))
599 _NOTE(MUTEX_PROTECTS_DATA(sata_cport_info::cport_mutex, \
600     sata_cport_info::cport_state))
601 _NOTE(DATA_READABLE_WITHOUT_LOCK(sata_cport_info::cport_state))
602 _NOTE(MUTEX_PROTECTS_DATA(sata_pmport_info::pmport_mutex, \
603     sata_pmport_info::pmport_state))
604 _NOTE(DATA_READABLE_WITHOUT_LOCK(sata_pmport_info::pmport_state))
605 _NOTE(MUTEX_PROTECTS_DATA(sata_pmport_info::pmport_mutex, \
606     sata_pmport_info::pmport_dev_type))
607 _NOTE(DATA_READABLE_WITHOUT_LOCK(sata_pmport_info::pmport_dev_type))
608 _NOTE(MUTEX_PROTECTS_DATA(sata_pmport_info::pmport_mutex, \
609     sata_pmport_info::pmport_sata_drive))
610 _NOTE(MUTEX_PROTECTS_DATA(sata_pmport_info::pmport_mutex, \
611     sata_pmport_info::pmport_tgtnode_clean))
612 _NOTE(MUTEX_PROTECTS_DATA(sata_pmport_info::pmport_mutex, \
613     sata_pmport_info::pmport_event_flags))
614 _NOTE(DATA_READABLE_WITHOUT_LOCK(sata_pmport_info::pmport_sata_drive))
615 _NOTE(DATA_READABLE_WITHOUT_LOCK(sata_pmult_info::pmult_dev_port))
616 _NOTE(DATA_READABLE_WITHOUT_LOCK(sata_pmult_info::pmult_num_dev_ports))
617 #ifdef SATA_DEBUG
618 _NOTE(SCHEME_PROTECTS_DATA("No Mutex Needed", mbuf_count))
619 _NOTE(SCHEME_PROTECTS_DATA("No Mutex Needed", mbuffail_count))
620 _NOTE(SCHEME_PROTECTS_DATA("No Mutex Needed", sata_atapi_trace))
621 _NOTE(SCHEME_PROTECTS_DATA("No Mutex Needed", sata_atapi_trace_index))
622 #endif
623 
624 /* End of warlock directives */
625 
626 /*
627  * A number of SCSI commands (e.g. LOG SENSE, READ CAPACITY (16),
628  * REPORT SUPPORTED OPERATION CODES) take a parameter 'ALLOCATION LENGTH' as a
629  * parameter, and then return up to ALLOCATION LENGTH bytes of the response
630  * while still reporting the total amount of data available. In other words,
631  * the commands return the total amount of data available, but truncate what
632  * is sent to ALLOCATION LENGTH bytes if this amount is smaller.
633  *
634  * To simplify translating such commands, we define a number of helper
635  * functions that allow us to write to struct buf->b_un.b_addr safely while
636  * tracking the total length of the output. Basically, these will stop
637  * writing out bytes once we've reached our limit (either due to the size of
638  * struct buf->b_bcount or capped by the ALLOCATION LENGTH parameter) while
639  * still tracking the total number of bytes we want to write out for the
640  * complete response.
641  *
642  * Currently these are just used with the REPORT SUPPORTED OPERATION CODES op.
643  * In the future, other commands could be modified to use these to simplify
644  * their implementation (with the side benefit of often avoiding additional
645  * allocations).
646  */
647 struct sata_txlt_buf {
648 	uint8_t *stb_ptr;	/* Start of the buffer */
649 	uint32_t stb_idx;	/* Current index/# bytes we want to write */
650 	uint32_t stb_len;	/* Max # of bytes to actually write */
651 };
652 
653 static inline void
sbuf_init(struct sata_txlt_buf * sbuf,struct buf * bp,uint32_t alc_len)654 sbuf_init(struct sata_txlt_buf *sbuf, struct buf *bp, uint32_t alc_len)
655 {
656 	sbuf->stb_ptr = (uint8_t *)bp->b_un.b_addr;
657 	sbuf->stb_idx = 0;
658 	sbuf->stb_len = MIN(bp->b_bcount, alc_len);
659 }
660 
661 static inline void
sbuf_put8(struct sata_txlt_buf * sb,uint8_t val)662 sbuf_put8(struct sata_txlt_buf *sb, uint8_t val)
663 {
664 	if (sb->stb_idx >= sb->stb_len) {
665 		sb->stb_idx++;
666 		return;
667 	}
668 
669 	sb->stb_ptr[sb->stb_idx++] = val;
670 }
671 
672 static inline void
sbuf_put16(struct sata_txlt_buf * sb,uint16_t val)673 sbuf_put16(struct sata_txlt_buf *sb, uint16_t val)
674 {
675 	sbuf_put8(sb, val >> 8);
676 	sbuf_put8(sb, val & 0xff);
677 }
678 
679 static inline void
sbuf_put32(struct sata_txlt_buf * sb,uint32_t val)680 sbuf_put32(struct sata_txlt_buf *sb, uint32_t val)
681 {
682 	sbuf_put8(sb, val >> 24);
683 	sbuf_put8(sb, (val >> 16) & 0xff);
684 	sbuf_put8(sb, (val >> 8) & 0xff);
685 	sbuf_put8(sb, val & 0xff);
686 }
687 
688 static inline void
sbuf_copy(struct sata_txlt_buf * sb,const void * src,size_t len)689 sbuf_copy(struct sata_txlt_buf *sb, const void *src, size_t len)
690 {
691 	ssize_t max = sb->stb_len - sb->stb_idx;
692 
693 	if (len == 0)
694 		return;
695 
696 	if (max <= 0) {
697 		sb->stb_idx += len;
698 		return;
699 	}
700 
701 	size_t amt = MIN(max, len);
702 
703 	ASSERT3U(sb->stb_idx + amt, <=, sb->stb_len);
704 
705 	bcopy(src, sb->stb_ptr + sb->stb_idx, amt);
706 	sb->stb_idx += len;
707 }
708 
709 /*
710  * Set the length field at 'offset' in the buffer to the total amount
711  * of data that we want to write minus 'adj' bytes.
712  * llen is the size (in bytes) of the field.
713  */
714 static inline void
sbuf_set_len(struct sata_txlt_buf * sb,uint32_t offset,uint32_t llen,uint32_t adj)715 sbuf_set_len(struct sata_txlt_buf *sb, uint32_t offset, uint32_t llen,
716     uint32_t adj)
717 {
718 	/*
719 	 * Because we have to worry about pathological cases (where the
720 	 * length field is truncated, we have to be a bit more cautious
721 	 * (and thus complicated).
722 	 *
723 	 * We start with the MSB of the size (based on llen) and use that
724 	 * to determine how many bits of stb->stb_idx we need to shift
725 	 * right, and then (space permitting) write out the byte, then
726 	 * continue on until we've either reached the end of the buf, or
727 	 * have written out the entire length.
728 	 */
729 	uint_t shift = (llen - 1) * NBBY;
730 	uint64_t val = sb->stb_idx - adj;
731 
732 	ASSERT3U(adj, <=, sb->stb_idx);
733 	ASSERT3U(llen, >, 0);
734 
735 	for (uint_t i = 0; i < llen; i++) {
736 		if (offset >= sb->stb_len)
737 			return;
738 		sb->stb_ptr[offset++] = (val >> shift) & 0xff;
739 		shift -= NBBY;
740 	}
741 }
742 
743 static inline size_t
sbuf_resid(const struct sata_txlt_buf * sb,const struct buf * bp,int32_t alc_len)744 sbuf_resid(const struct sata_txlt_buf *sb, const struct buf *bp,
745     int32_t alc_len)
746 {
747 	/*
748 	 * There's a bit of sublety here. We have two different potential
749 	 * constraints on the actual amount of data that's ultimately
750 	 * return to the higher layers of the stack. The first is the value
751 	 * of the ALLOCATION LENGTH parameter in the CDB (alc_len). The
752 	 * second is the size of bp (bp->b_bcount).
753 	 *
754 	 * The resid value is defined as 'the amount of data not transferred'.
755 	 * The question then is 'relative to what?'. The most sensical choice
756 	 * here is 'relative to the size of bp'.  This is because as far as
757 	 * processing the CDB, the ALLOCATION LENGTH is (for any SCSI device)
758 	 * the maximum amount of data the device will return. It is expected
759 	 * that the issuer of the CDB will retry (if necessary) with a larger
760 	 * ALLOCATION LENGTH if the initial value is too small. In other words,
761 	 * truncation due to ALLOCATION LENGTH is something that should be
762 	 * dealt with at a higher layer (e.g. sd driver, uscsi caller, etc),
763 	 * so the resid should reflect truncation due to our internal buffers
764 	 * being too small.
765 	 */
766 	const size_t expected = MIN(alc_len, sb->stb_idx);
767 	const size_t written = MIN(bp->b_bcount, sb->stb_idx);
768 
769 	ASSERT3U(written, <=, expected);
770 
771 	return ((written <= expected) ? 0 : expected - written);
772 }
773 
774 /* ************** loadable module configuration functions ************** */
775 
776 int
_init()777 _init()
778 {
779 	int rval;
780 
781 	mutex_init(&sata_mutex, NULL, MUTEX_DRIVER, NULL);
782 	mutex_init(&sata_event_mutex, NULL, MUTEX_DRIVER, NULL);
783 	mutex_init(&sata_log_mutex, NULL, MUTEX_DRIVER, NULL);
784 	cv_init(&sata_event_cv, NULL, CV_DRIVER, NULL);
785 	sata_trace_rbuf_alloc();
786 	if ((rval = mod_install(&modlinkage)) != 0) {
787 #ifdef SATA_DEBUG
788 		cmn_err(CE_WARN, "sata: _init: mod_install failed\n");
789 #endif
790 		sata_trace_rbuf_free();
791 		mutex_destroy(&sata_log_mutex);
792 		cv_destroy(&sata_event_cv);
793 		mutex_destroy(&sata_event_mutex);
794 		mutex_destroy(&sata_mutex);
795 	}
796 	return (rval);
797 }
798 
799 int
_fini()800 _fini()
801 {
802 	int rval;
803 
804 	if ((rval = mod_remove(&modlinkage)) != 0)
805 		return (rval);
806 
807 	sata_trace_rbuf_free();
808 	mutex_destroy(&sata_log_mutex);
809 	cv_destroy(&sata_event_cv);
810 	mutex_destroy(&sata_event_mutex);
811 	mutex_destroy(&sata_mutex);
812 	return (rval);
813 }
814 
815 int
_info(struct modinfo * modinfop)816 _info(struct modinfo *modinfop)
817 {
818 	return (mod_info(&modlinkage, modinfop));
819 }
820 
821 
822 
823 /* ********************* SATA HBA entry points ********************* */
824 
825 
826 /*
827  * Called by SATA HBA from _init().
828  * Registers HBA driver instance/sata framework pair with scsi framework, by
829  * calling scsi_hba_init().
830  *
831  * SATA HBA driver cb_ops are ignored - SATA HBA framework cb_ops are used
832  * instead. SATA HBA framework cb_ops pointer overwrites SATA HBA driver
833  * cb_ops pointer in SATA HBA driver dev_ops structure.
834  * SATA HBA framework cb_ops supplies cb_open cb_close and cb_ioctl vectors.
835  *
836  * Return status of the scsi_hba_init() is returned to a calling SATA HBA
837  * driver.
838  */
839 int
sata_hba_init(struct modlinkage * modlp)840 sata_hba_init(struct modlinkage *modlp)
841 {
842 	int rval;
843 	struct dev_ops *hba_ops;
844 
845 	SATADBG1(SATA_DBG_HBA_IF, NULL,
846 	    "sata_hba_init: name %s \n",
847 	    ((struct modldrv *)(modlp->ml_linkage[0]))->drv_linkinfo);
848 	/*
849 	 * Fill-up cb_ops and dev_ops when necessary
850 	 */
851 	hba_ops = ((struct modldrv *)(modlp->ml_linkage[0]))->drv_dev_ops;
852 	/*
853 	 * Provide pointer to SATA dev_ops
854 	 */
855 	hba_ops->devo_cb_ops = &sata_cb_ops;
856 
857 	/*
858 	 * Register SATA HBA with SCSI framework
859 	 */
860 	if ((rval = scsi_hba_init(modlp)) != 0) {
861 		SATADBG1(SATA_DBG_HBA_IF, NULL,
862 		    "sata_hba_init: scsi hba init failed\n", NULL);
863 		return (rval);
864 	}
865 
866 	return (0);
867 }
868 
869 
870 /* HBA attach stages */
871 #define	HBA_ATTACH_STAGE_SATA_HBA_INST	1
872 #define	HBA_ATTACH_STAGE_SCSI_ATTACHED	2
873 #define	HBA_ATTACH_STAGE_SETUP		4
874 #define	HBA_ATTACH_STAGE_LINKED		8
875 
876 
877 /*
878  *
879  * Called from SATA HBA driver's attach routine to attach an instance of
880  * the HBA.
881  *
882  * For DDI_ATTACH command:
883  * sata_hba_inst structure is allocated here and initialized with pointers to
884  * SATA framework implementation of required scsi tran functions.
885  * The scsi_tran's tran_hba_private field is used by SATA Framework to point
886  * to the soft structure (sata_hba_inst) allocated by SATA framework for
887  * SATA HBA instance related data.
888  * The scsi_tran's tran_hba_private field is used by SATA framework to
889  * store a pointer to per-HBA-instance of sata_hba_inst structure.
890  * The sata_hba_inst structure is cross-linked to scsi tran structure.
891  * Among other info, a pointer to sata_hba_tran structure is stored in
892  * sata_hba_inst. The sata_hba_inst structures for different HBA instances are
893  * linked together into the list, pointed to by sata_hba_list.
894  * On the first HBA instance attach the sata event thread is initialized.
895  * Attachment points are created for all SATA ports of the HBA being attached.
896  * All HBA instance's SATA ports are probed and type of plugged devices is
897  * determined. For each device of a supported type, a target node is created.
898  *
899  * DDI_SUCCESS is returned when attachment process is successful,
900  * DDI_FAILURE is returned otherwise.
901  *
902  * For DDI_RESUME command:
903  * Not implemented at this time (postponed until phase 2 of the development).
904  */
905 int
sata_hba_attach(dev_info_t * dip,sata_hba_tran_t * sata_tran,ddi_attach_cmd_t cmd)906 sata_hba_attach(dev_info_t *dip, sata_hba_tran_t *sata_tran,
907     ddi_attach_cmd_t cmd)
908 {
909 	sata_hba_inst_t	*sata_hba_inst;
910 	scsi_hba_tran_t *scsi_tran = NULL;
911 	int hba_attach_state = 0;
912 	char taskq_name[MAXPATHLEN];
913 
914 	SATADBG3(SATA_DBG_HBA_IF, NULL,
915 	    "sata_hba_attach: node %s (%s%d)\n",
916 	    ddi_node_name(dip), ddi_driver_name(dip),
917 	    ddi_get_instance(dip));
918 
919 	if (cmd == DDI_RESUME) {
920 		/*
921 		 * Postponed until phase 2 of the development
922 		 */
923 		return (DDI_FAILURE);
924 	}
925 
926 	if (cmd != DDI_ATTACH) {
927 		return (DDI_FAILURE);
928 	}
929 
930 	/* cmd == DDI_ATTACH */
931 
932 	if (sata_validate_sata_hba_tran(dip, sata_tran) != SATA_SUCCESS) {
933 		SATA_LOG_D((NULL, CE_WARN,
934 		    "sata_hba_attach: invalid sata_hba_tran"));
935 		return (DDI_FAILURE);
936 	}
937 	/*
938 	 * Allocate and initialize SCSI tran structure.
939 	 * SATA copy of tran_bus_config is provided to create port nodes.
940 	 */
941 	scsi_tran = scsi_hba_tran_alloc(dip, SCSI_HBA_CANSLEEP);
942 	if (scsi_tran == NULL)
943 		return (DDI_FAILURE);
944 	/*
945 	 * Allocate soft structure for SATA HBA instance.
946 	 * There is a separate softstate for each HBA instance.
947 	 */
948 	sata_hba_inst = kmem_zalloc(sizeof (struct sata_hba_inst), KM_SLEEP);
949 	ASSERT(sata_hba_inst != NULL); /* this should not fail */
950 	mutex_init(&sata_hba_inst->satahba_mutex, NULL, MUTEX_DRIVER, NULL);
951 	hba_attach_state |= HBA_ATTACH_STAGE_SATA_HBA_INST;
952 
953 	/*
954 	 * scsi_trans's tran_hba_private is used by SATA Framework to point to
955 	 * soft structure allocated by SATA framework for
956 	 * SATA HBA instance related data.
957 	 */
958 	scsi_tran->tran_hba_private	= sata_hba_inst;
959 	scsi_tran->tran_tgt_private	= NULL;
960 
961 	scsi_tran->tran_tgt_init	= sata_scsi_tgt_init;
962 	scsi_tran->tran_tgt_probe	= sata_scsi_tgt_probe;
963 	scsi_tran->tran_tgt_free	= sata_scsi_tgt_free;
964 
965 	scsi_tran->tran_start		= sata_scsi_start;
966 	scsi_tran->tran_reset		= sata_scsi_reset;
967 	scsi_tran->tran_abort		= sata_scsi_abort;
968 	scsi_tran->tran_getcap		= sata_scsi_getcap;
969 	scsi_tran->tran_setcap		= sata_scsi_setcap;
970 	scsi_tran->tran_init_pkt	= sata_scsi_init_pkt;
971 	scsi_tran->tran_destroy_pkt	= sata_scsi_destroy_pkt;
972 
973 	scsi_tran->tran_dmafree		= sata_scsi_dmafree;
974 	scsi_tran->tran_sync_pkt	= sata_scsi_sync_pkt;
975 
976 	scsi_tran->tran_reset_notify	= NULL;
977 	scsi_tran->tran_get_bus_addr	= NULL;
978 	scsi_tran->tran_quiesce		= NULL;
979 	scsi_tran->tran_unquiesce	= NULL;
980 	scsi_tran->tran_bus_reset	= NULL;
981 
982 	if (scsi_hba_attach_setup(dip, sata_tran->sata_tran_hba_dma_attr,
983 	    scsi_tran, 0) != DDI_SUCCESS) {
984 #ifdef SATA_DEBUG
985 		cmn_err(CE_WARN, "?SATA: %s%d hba scsi attach failed",
986 		    ddi_driver_name(dip), ddi_get_instance(dip));
987 #endif
988 		goto fail;
989 	}
990 	hba_attach_state |= HBA_ATTACH_STAGE_SCSI_ATTACHED;
991 
992 	if (!ddi_prop_exists(DDI_DEV_T_ANY, dip, DDI_PROP_DONTPASS, "sata")) {
993 		if (ddi_prop_update_int(DDI_DEV_T_NONE, dip,
994 		    "sata", 1) != DDI_PROP_SUCCESS) {
995 			SATA_LOG_D((NULL, CE_WARN, "sata_hba_attach: "
996 			    "failed to create hba sata prop"));
997 			goto fail;
998 		}
999 	}
1000 
1001 	/*
1002 	 * Save pointers in hba instance soft state.
1003 	 */
1004 	sata_hba_inst->satahba_scsi_tran = scsi_tran;
1005 	sata_hba_inst->satahba_tran = sata_tran;
1006 	sata_hba_inst->satahba_dip = dip;
1007 
1008 	/*
1009 	 * Create a task queue to handle emulated commands completion
1010 	 * Use node name, dash, instance number as the queue name.
1011 	 */
1012 	taskq_name[0] = '\0';
1013 	(void) strlcat(taskq_name, DEVI(dip)->devi_node_name,
1014 	    sizeof (taskq_name));
1015 	(void) snprintf(taskq_name + strlen(taskq_name),
1016 	    sizeof (taskq_name) - strlen(taskq_name),
1017 	    "-%d", DEVI(dip)->devi_instance);
1018 	sata_hba_inst->satahba_taskq = taskq_create(taskq_name, 1,
1019 	    minclsyspri, 1, sata_tran->sata_tran_hba_num_cports * 4,
1020 	    TASKQ_DYNAMIC);
1021 
1022 	hba_attach_state |= HBA_ATTACH_STAGE_SETUP;
1023 
1024 	/*
1025 	 * Create events thread if not created yet.
1026 	 */
1027 	sata_event_thread_control(1);
1028 
1029 	/*
1030 	 * Link this hba instance into the list.
1031 	 */
1032 	mutex_enter(&sata_mutex);
1033 
1034 	if (sata_hba_list == NULL) {
1035 		/*
1036 		 * The first instance of HBA is attached.
1037 		 * Set current/active default maximum NCQ/TCQ queue depth for
1038 		 * all SATA devices. It is done here and now, to eliminate the
1039 		 * possibility of the dynamic, programatic modification of the
1040 		 * queue depth via global (and public) sata_max_queue_depth
1041 		 * variable (this would require special handling in HBA drivers)
1042 		 */
1043 		sata_current_max_qdepth = sata_max_queue_depth;
1044 		if (sata_current_max_qdepth > 32)
1045 			sata_current_max_qdepth = 32;
1046 		else if (sata_current_max_qdepth < 1)
1047 			sata_current_max_qdepth = 1;
1048 	}
1049 
1050 	sata_hba_inst->satahba_next = NULL;
1051 	sata_hba_inst->satahba_prev = sata_hba_list_tail;
1052 	if (sata_hba_list == NULL) {
1053 		sata_hba_list = sata_hba_inst;
1054 	}
1055 	if (sata_hba_list_tail != NULL) {
1056 		sata_hba_list_tail->satahba_next = sata_hba_inst;
1057 	}
1058 	sata_hba_list_tail = sata_hba_inst;
1059 	mutex_exit(&sata_mutex);
1060 	hba_attach_state |= HBA_ATTACH_STAGE_LINKED;
1061 
1062 	/*
1063 	 * Create SATA HBA devctl minor node for sata_hba_open, close, ioctl
1064 	 * SATA HBA driver should not use its own open/close entry points.
1065 	 *
1066 	 * Make sure that instance number doesn't overflow
1067 	 * when forming minor numbers.
1068 	 */
1069 	ASSERT(ddi_get_instance(dip) <= (L_MAXMIN >> INST_MINOR_SHIFT));
1070 	if (ddi_create_minor_node(dip, "devctl", S_IFCHR,
1071 	    INST2DEVCTL(ddi_get_instance(dip)),
1072 	    DDI_NT_SATA_NEXUS, 0) != DDI_SUCCESS) {
1073 #ifdef SATA_DEBUG
1074 		cmn_err(CE_WARN, "sata_hba_attach: "
1075 		    "cannot create devctl minor node");
1076 #endif
1077 		goto fail;
1078 	}
1079 
1080 
1081 	/*
1082 	 * Set-up kstats here, if necessary.
1083 	 * (postponed until future phase of the development).
1084 	 */
1085 
1086 	/*
1087 	 * Indicate that HBA is attached. This will enable events processing
1088 	 * for this HBA.
1089 	 */
1090 	sata_hba_inst->satahba_attached = 1;
1091 	/*
1092 	 * Probe controller ports. This operation will describe a current
1093 	 * controller/port/multipliers/device configuration and will create
1094 	 * attachment points.
1095 	 * We may end-up with just a controller with no devices attached.
1096 	 * For the ports with a supported device attached, device target nodes
1097 	 * are created and devices are initialized.
1098 	 */
1099 	sata_probe_ports(sata_hba_inst);
1100 
1101 	return (DDI_SUCCESS);
1102 
1103 fail:
1104 	if (hba_attach_state & HBA_ATTACH_STAGE_LINKED) {
1105 		(void) sata_remove_hba_instance(dip);
1106 		if (sata_hba_list == NULL)
1107 			sata_event_thread_control(0);
1108 	}
1109 
1110 	if (hba_attach_state & HBA_ATTACH_STAGE_SETUP) {
1111 		(void) ddi_prop_remove(DDI_DEV_T_ANY, dip, "sata");
1112 		taskq_destroy(sata_hba_inst->satahba_taskq);
1113 	}
1114 
1115 	if (hba_attach_state & HBA_ATTACH_STAGE_SCSI_ATTACHED)
1116 		(void) scsi_hba_detach(dip);
1117 
1118 	if (hba_attach_state & HBA_ATTACH_STAGE_SATA_HBA_INST) {
1119 		mutex_destroy(&sata_hba_inst->satahba_mutex);
1120 		kmem_free((void *)sata_hba_inst,
1121 		    sizeof (struct sata_hba_inst));
1122 		scsi_hba_tran_free(scsi_tran);
1123 	}
1124 
1125 	sata_log(NULL, CE_WARN, "?SATA: %s%d hba attach failed",
1126 	    ddi_driver_name(dip), ddi_get_instance(dip));
1127 
1128 	return (DDI_FAILURE);
1129 }
1130 
1131 
1132 /*
1133  * Called by SATA HBA from to detach an instance of the driver.
1134  *
1135  * For DDI_DETACH command:
1136  * Free local structures allocated for SATA HBA instance during
1137  * sata_hba_attach processing.
1138  *
1139  * Returns DDI_SUCCESS when HBA was detached, DDI_FAILURE otherwise.
1140  *
1141  * For DDI_SUSPEND command:
1142  * Not implemented at this time (postponed until phase 2 of the development)
1143  * Returnd DDI_SUCCESS.
1144  *
1145  * When the last HBA instance is detached, the event daemon is terminated.
1146  *
1147  * NOTE: Port multiplier is supported.
1148  */
1149 int
sata_hba_detach(dev_info_t * dip,ddi_detach_cmd_t cmd)1150 sata_hba_detach(dev_info_t *dip, ddi_detach_cmd_t cmd)
1151 {
1152 	dev_info_t	*tdip;
1153 	sata_hba_inst_t	*sata_hba_inst;
1154 	scsi_hba_tran_t *scsi_hba_tran;
1155 	sata_cport_info_t *cportinfo;
1156 	sata_pmult_info_t *pminfo;
1157 	sata_drive_info_t *sdinfo;
1158 	sata_device_t	sdevice;
1159 	int ncport, npmport;
1160 
1161 	SATADBG3(SATA_DBG_HBA_IF, NULL, "sata_hba_detach: node %s (%s%d)\n",
1162 	    ddi_node_name(dip), ddi_driver_name(dip), ddi_get_instance(dip));
1163 
1164 	switch (cmd) {
1165 	case DDI_DETACH:
1166 
1167 		if ((scsi_hba_tran = ddi_get_driver_private(dip)) == NULL)
1168 			return (DDI_FAILURE);
1169 
1170 		sata_hba_inst = scsi_hba_tran->tran_hba_private;
1171 		if (sata_hba_inst == NULL)
1172 			return (DDI_FAILURE);
1173 
1174 		if (scsi_hba_detach(dip) == DDI_FAILURE) {
1175 			sata_hba_inst->satahba_attached = 1;
1176 			return (DDI_FAILURE);
1177 		}
1178 
1179 		/*
1180 		 * Free all target nodes - at this point
1181 		 * devices should be at least offlined
1182 		 * otherwise scsi_hba_detach() should not be called.
1183 		 */
1184 		for (ncport = 0; ncport < SATA_NUM_CPORTS(sata_hba_inst);
1185 		    ncport++) {
1186 			cportinfo = SATA_CPORT_INFO(sata_hba_inst, ncport);
1187 			if (cportinfo->cport_dev_type != SATA_DTYPE_PMULT) {
1188 				sdinfo = SATA_CPORTINFO_DRV_INFO(cportinfo);
1189 				if (sdinfo != NULL) {
1190 					tdip = sata_get_target_dip(dip,
1191 					    ncport, 0);
1192 					if (tdip != NULL) {
1193 						if (ndi_devi_offline(tdip,
1194 						    NDI_DEVI_REMOVE) !=
1195 						    NDI_SUCCESS) {
1196 							SATA_LOG_D((
1197 							    sata_hba_inst,
1198 							    CE_WARN,
1199 							    "sata_hba_detach: "
1200 							    "Target node not "
1201 							    "removed !"));
1202 							return (DDI_FAILURE);
1203 						}
1204 					}
1205 				}
1206 			} else { /* SATA_DTYPE_PMULT */
1207 				mutex_enter(&cportinfo->cport_mutex);
1208 				pminfo = SATA_CPORTINFO_PMULT_INFO(cportinfo);
1209 
1210 				if (pminfo == NULL) {
1211 					SATA_LOG_D((sata_hba_inst, CE_WARN,
1212 					    "sata_hba_detach: Port multiplier "
1213 					    "not ready yet!"));
1214 					mutex_exit(&cportinfo->cport_mutex);
1215 					return (DDI_FAILURE);
1216 				}
1217 
1218 				/*
1219 				 * Detach would fail if removal of any of the
1220 				 * target nodes is failed - albeit in that
1221 				 * case some of them may have been removed.
1222 				 */
1223 				for (npmport = 0; npmport < SATA_NUM_PMPORTS(
1224 				    sata_hba_inst, ncport); npmport++) {
1225 					tdip = sata_get_target_dip(dip, ncport,
1226 					    npmport);
1227 					if (tdip != NULL) {
1228 						if (ndi_devi_offline(tdip,
1229 						    NDI_DEVI_REMOVE) !=
1230 						    NDI_SUCCESS) {
1231 							SATA_LOG_D((
1232 							    sata_hba_inst,
1233 							    CE_WARN,
1234 							    "sata_hba_detach: "
1235 							    "Target node not "
1236 							    "removed !"));
1237 							mutex_exit(&cportinfo->
1238 							    cport_mutex);
1239 							return (DDI_FAILURE);
1240 						}
1241 					}
1242 				}
1243 				mutex_exit(&cportinfo->cport_mutex);
1244 			}
1245 		}
1246 		/*
1247 		 * Disable sata event daemon processing for this HBA
1248 		 */
1249 		sata_hba_inst->satahba_attached = 0;
1250 
1251 		/*
1252 		 * Remove event daemon thread, if it is last HBA instance.
1253 		 */
1254 
1255 		mutex_enter(&sata_mutex);
1256 		if (sata_hba_list->satahba_next == NULL) {
1257 			mutex_exit(&sata_mutex);
1258 			sata_event_thread_control(0);
1259 			mutex_enter(&sata_mutex);
1260 		}
1261 		mutex_exit(&sata_mutex);
1262 
1263 		/* Remove this HBA instance from the HBA list */
1264 		sata_remove_hba_instance(dip);
1265 
1266 		/*
1267 		 * At this point there should be no target nodes attached.
1268 		 * Detach and destroy device and port info structures.
1269 		 */
1270 		for (ncport = 0; ncport < SATA_NUM_CPORTS(sata_hba_inst);
1271 		    ncport++) {
1272 			cportinfo = SATA_CPORT_INFO(sata_hba_inst, ncport);
1273 			if (cportinfo->cport_dev_type != SATA_DTYPE_PMULT) {
1274 				sdinfo =
1275 				    cportinfo->cport_devp.cport_sata_drive;
1276 				if (sdinfo != NULL) {
1277 					/* Release device structure */
1278 					kmem_free(sdinfo,
1279 					    sizeof (sata_drive_info_t));
1280 				}
1281 				/* Release cport info */
1282 				mutex_destroy(&cportinfo->cport_mutex);
1283 				kmem_free(cportinfo,
1284 				    sizeof (sata_cport_info_t));
1285 			} else { /* SATA_DTYPE_PMULT */
1286 				sdevice.satadev_addr.cport = (uint8_t)ncport;
1287 				sdevice.satadev_addr.qual = SATA_ADDR_PMULT;
1288 				sata_free_pmult(sata_hba_inst, &sdevice);
1289 			}
1290 		}
1291 
1292 		scsi_hba_tran_free(sata_hba_inst->satahba_scsi_tran);
1293 
1294 		(void) ddi_prop_remove(DDI_DEV_T_ANY, dip, "sata");
1295 
1296 		taskq_destroy(sata_hba_inst->satahba_taskq);
1297 
1298 		mutex_destroy(&sata_hba_inst->satahba_mutex);
1299 		kmem_free((void *)sata_hba_inst,
1300 		    sizeof (struct sata_hba_inst));
1301 
1302 		return (DDI_SUCCESS);
1303 
1304 	case DDI_SUSPEND:
1305 		/*
1306 		 * Postponed until phase 2
1307 		 */
1308 		return (DDI_FAILURE);
1309 
1310 	default:
1311 		return (DDI_FAILURE);
1312 	}
1313 }
1314 
1315 
1316 /*
1317  * Called by an HBA drive from _fini() routine.
1318  * Unregisters SATA HBA instance/SATA framework pair from the scsi framework.
1319  */
1320 void
sata_hba_fini(struct modlinkage * modlp)1321 sata_hba_fini(struct modlinkage *modlp)
1322 {
1323 	SATADBG1(SATA_DBG_HBA_IF, NULL,
1324 	    "sata_hba_fini: name %s\n",
1325 	    ((struct modldrv *)(modlp->ml_linkage[0]))->drv_linkinfo);
1326 
1327 	scsi_hba_fini(modlp);
1328 }
1329 
1330 
1331 /*
1332  * Default open and close routine for sata_hba framework.
1333  *
1334  */
1335 /*
1336  * Open devctl node.
1337  *
1338  * Returns:
1339  * 0 if node was open successfully, error code otherwise.
1340  *
1341  *
1342  */
1343 
1344 static int
sata_hba_open(dev_t * devp,int flags,int otyp,cred_t * credp)1345 sata_hba_open(dev_t *devp, int flags, int otyp, cred_t *credp)
1346 {
1347 #ifndef __lock_lint
1348 	_NOTE(ARGUNUSED(credp))
1349 #endif
1350 	int rv = 0;
1351 	dev_info_t *dip;
1352 	scsi_hba_tran_t *scsi_hba_tran;
1353 	sata_hba_inst_t	*sata_hba_inst;
1354 
1355 	SATADBG1(SATA_DBG_IOCTL_IF, NULL, "sata_hba_open: entered", NULL);
1356 
1357 	if (otyp != OTYP_CHR)
1358 		return (EINVAL);
1359 
1360 	dip = sata_devt_to_devinfo(*devp);
1361 	if (dip == NULL)
1362 		return (ENXIO);
1363 
1364 	if ((scsi_hba_tran = ddi_get_driver_private(dip)) == NULL)
1365 		return (ENXIO);
1366 
1367 	sata_hba_inst = scsi_hba_tran->tran_hba_private;
1368 	if (sata_hba_inst == NULL || sata_hba_inst->satahba_attached == 0)
1369 		return (ENXIO);
1370 
1371 	mutex_enter(&sata_mutex);
1372 	if (flags & FEXCL) {
1373 		if (sata_hba_inst->satahba_open_flag != 0) {
1374 			rv = EBUSY;
1375 		} else {
1376 			sata_hba_inst->satahba_open_flag =
1377 			    SATA_DEVCTL_EXOPENED;
1378 		}
1379 	} else {
1380 		if (sata_hba_inst->satahba_open_flag == SATA_DEVCTL_EXOPENED) {
1381 			rv = EBUSY;
1382 		} else {
1383 			sata_hba_inst->satahba_open_flag =
1384 			    SATA_DEVCTL_SOPENED;
1385 		}
1386 	}
1387 	mutex_exit(&sata_mutex);
1388 
1389 	return (rv);
1390 }
1391 
1392 
1393 /*
1394  * Close devctl node.
1395  * Returns:
1396  * 0 if node was closed successfully, error code otherwise.
1397  *
1398  */
1399 
1400 static int
sata_hba_close(dev_t dev,int flag,int otyp,cred_t * credp)1401 sata_hba_close(dev_t dev, int flag, int otyp, cred_t *credp)
1402 {
1403 #ifndef __lock_lint
1404 	_NOTE(ARGUNUSED(credp))
1405 	_NOTE(ARGUNUSED(flag))
1406 #endif
1407 	dev_info_t *dip;
1408 	scsi_hba_tran_t *scsi_hba_tran;
1409 	sata_hba_inst_t	*sata_hba_inst;
1410 
1411 	SATADBG1(SATA_DBG_IOCTL_IF, NULL, "sata_hba_close: entered", NULL);
1412 
1413 	if (otyp != OTYP_CHR)
1414 		return (EINVAL);
1415 
1416 	dip = sata_devt_to_devinfo(dev);
1417 	if (dip == NULL)
1418 		return (ENXIO);
1419 
1420 	if ((scsi_hba_tran = ddi_get_driver_private(dip)) == NULL)
1421 		return (ENXIO);
1422 
1423 	sata_hba_inst = scsi_hba_tran->tran_hba_private;
1424 	if (sata_hba_inst == NULL || sata_hba_inst->satahba_attached == 0)
1425 		return (ENXIO);
1426 
1427 	mutex_enter(&sata_mutex);
1428 	sata_hba_inst->satahba_open_flag = 0;
1429 	mutex_exit(&sata_mutex);
1430 	return (0);
1431 }
1432 
1433 
1434 
1435 /*
1436  * Standard IOCTL commands for SATA hotplugging.
1437  * Implemented DEVCTL_AP commands:
1438  * DEVCTL_AP_CONNECT
1439  * DEVCTL_AP_DISCONNECT
1440  * DEVCTL_AP_CONFIGURE
1441  * DEVCTL_UNCONFIGURE
1442  * DEVCTL_AP_CONTROL
1443  *
1444  * Commands passed to default ndi ioctl handler:
1445  * DEVCTL_DEVICE_GETSTATE
1446  * DEVCTL_DEVICE_ONLINE
1447  * DEVCTL_DEVICE_OFFLINE
1448  * DEVCTL_DEVICE_REMOVE
1449  * DEVCTL_DEVICE_INSERT
1450  * DEVCTL_BUS_GETSTATE
1451  *
1452  * All other cmds are passed to HBA if it provide ioctl handler, or failed
1453  * if not.
1454  *
1455  * Returns:
1456  * 0 if successful,
1457  * error code if operation failed.
1458  *
1459  * Port Multiplier support is supported now.
1460  *
1461  * NOTE: qual should be SATA_ADDR_DCPORT or SATA_ADDR_DPMPORT
1462  */
1463 
1464 static int
sata_hba_ioctl(dev_t dev,int cmd,intptr_t arg,int mode,cred_t * credp,int * rvalp)1465 sata_hba_ioctl(dev_t dev, int cmd, intptr_t arg, int mode, cred_t *credp,
1466     int *rvalp)
1467 {
1468 #ifndef __lock_lint
1469 	_NOTE(ARGUNUSED(credp))
1470 	_NOTE(ARGUNUSED(rvalp))
1471 #endif
1472 	int rv = 0;
1473 	int32_t	comp_port = -1;
1474 	dev_info_t *dip;
1475 	devctl_ap_state_t ap_state;
1476 	struct devctl_iocdata *dcp = NULL;
1477 	scsi_hba_tran_t *scsi_hba_tran;
1478 	sata_hba_inst_t *sata_hba_inst;
1479 	sata_device_t sata_device;
1480 	sata_cport_info_t *cportinfo;
1481 	int cport, pmport, qual;
1482 	int rval = SATA_SUCCESS;
1483 
1484 	dip = sata_devt_to_devinfo(dev);
1485 	if (dip == NULL)
1486 		return (ENXIO);
1487 
1488 	if ((scsi_hba_tran = ddi_get_driver_private(dip)) == NULL)
1489 		return (ENXIO);
1490 
1491 	sata_hba_inst = scsi_hba_tran->tran_hba_private;
1492 	if (sata_hba_inst == NULL)
1493 		return (ENXIO);
1494 
1495 	if (sata_hba_inst->satahba_tran == NULL)
1496 		return (ENXIO);
1497 
1498 	switch (cmd) {
1499 
1500 	case DEVCTL_DEVICE_GETSTATE:
1501 	case DEVCTL_DEVICE_ONLINE:
1502 	case DEVCTL_DEVICE_OFFLINE:
1503 	case DEVCTL_DEVICE_REMOVE:
1504 	case DEVCTL_BUS_GETSTATE:
1505 		/*
1506 		 * There may be more cases that we want to pass to default
1507 		 * handler rather than fail them.
1508 		 */
1509 		return (ndi_devctl_ioctl(dip, cmd, arg, mode, 0));
1510 	}
1511 
1512 	cport = pmport = qual = 0;
1513 	cportinfo = NULL;
1514 
1515 	/* read devctl ioctl data */
1516 	if (cmd != DEVCTL_AP_CONTROL && IS_DEVCTL(cmd)) {
1517 		if (ndi_dc_allochdl((void *)arg, &dcp) != NDI_SUCCESS)
1518 			return (EFAULT);
1519 
1520 		if ((comp_port = sata_get_port_num(sata_hba_inst, dcp)) ==
1521 		    -1) {
1522 			if (dcp)
1523 				ndi_dc_freehdl(dcp);
1524 			return (EINVAL);
1525 		}
1526 
1527 		/*
1528 		 * According to SCSI_TO_SATA_ADDR_QUAL, qual should be either
1529 		 * SATA_ADDR_DCPORT or SATA_ADDR_DPMPORT.
1530 		 */
1531 		cport = SCSI_TO_SATA_CPORT(comp_port);
1532 		pmport = SCSI_TO_SATA_PMPORT(comp_port);
1533 		qual = SCSI_TO_SATA_ADDR_QUAL(comp_port);
1534 
1535 		if (sata_validate_sata_address(sata_hba_inst, cport, pmport,
1536 		    qual) != 0) {
1537 			ndi_dc_freehdl(dcp);
1538 			return (EINVAL);
1539 		}
1540 
1541 		cportinfo = SATA_CPORT_INFO(sata_hba_inst, cport);
1542 		mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, cport)->
1543 		    cport_mutex);
1544 		if (cportinfo->cport_event_flags & SATA_EVNT_LOCK_PORT_BUSY) {
1545 			/*
1546 			 * Cannot process ioctl request now. Come back later.
1547 			 */
1548 			mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, cport)->
1549 			    cport_mutex);
1550 			ndi_dc_freehdl(dcp);
1551 			return (EBUSY);
1552 		}
1553 		/* Block event processing for this port */
1554 		cportinfo->cport_event_flags |= SATA_APCTL_LOCK_PORT_BUSY;
1555 		mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, cport)->cport_mutex);
1556 
1557 		sata_device.satadev_addr.cport = cport;
1558 		sata_device.satadev_addr.pmport = pmport;
1559 		sata_device.satadev_addr.qual = qual;
1560 		sata_device.satadev_rev = SATA_DEVICE_REV;
1561 	}
1562 
1563 	switch (cmd) {
1564 
1565 	case DEVCTL_AP_DISCONNECT:
1566 
1567 		/*
1568 		 * Normally, cfgadm sata plugin will try to offline
1569 		 * (unconfigure) device before this request. Nevertheless,
1570 		 * if a device is still configured, we need to
1571 		 * attempt to offline and unconfigure device first, and we will
1572 		 * deactivate the port regardless of the unconfigure
1573 		 * operation results.
1574 		 *
1575 		 */
1576 		rv = sata_ioctl_disconnect(sata_hba_inst, &sata_device);
1577 
1578 		break;
1579 
1580 	case DEVCTL_AP_UNCONFIGURE:
1581 
1582 		/*
1583 		 * The unconfigure operation uses generic nexus operation to
1584 		 * offline a device. It leaves a target device node attached.
1585 		 * and obviously sata_drive_info attached as well, because
1586 		 * from the hardware point of view nothing has changed.
1587 		 */
1588 		rv = sata_ioctl_unconfigure(sata_hba_inst, &sata_device);
1589 		break;
1590 
1591 	case DEVCTL_AP_CONNECT:
1592 	{
1593 		/*
1594 		 * The sata cfgadm pluging will invoke this operation only if
1595 		 * port was found in the disconnect state (failed state
1596 		 * is also treated as the disconnected state).
1597 		 * If port activation is successful and a device is found
1598 		 * attached to the port, the initialization sequence is
1599 		 * executed to probe the port and attach
1600 		 * a device structure to a port structure. The device is not
1601 		 * set in configured state (system-wise) by this operation.
1602 		 */
1603 
1604 		rv = sata_ioctl_connect(sata_hba_inst, &sata_device);
1605 
1606 		break;
1607 	}
1608 
1609 	case DEVCTL_AP_CONFIGURE:
1610 	{
1611 		/*
1612 		 * A port may be in an active or shutdown state.
1613 		 * If port is in a failed state, operation is aborted.
1614 		 * If a port is in a shutdown state, sata_tran_port_activate()
1615 		 * is invoked prior to any other operation.
1616 		 *
1617 		 * Onlining the device involves creating a new target node.
1618 		 * If there is an old target node present (belonging to
1619 		 * previously removed device), the operation is aborted - the
1620 		 * old node has to be released and removed before configure
1621 		 * operation is attempted.
1622 		 */
1623 
1624 		rv = sata_ioctl_configure(sata_hba_inst, &sata_device);
1625 
1626 		break;
1627 	}
1628 
1629 	case DEVCTL_AP_GETSTATE:
1630 
1631 		sata_cfgadm_state(sata_hba_inst, comp_port, &ap_state);
1632 
1633 		ap_state.ap_last_change = (time_t)-1;
1634 		ap_state.ap_error_code = 0;
1635 		ap_state.ap_in_transition = 0;
1636 
1637 		/* Copy the return AP-state information to the user space */
1638 		if (ndi_dc_return_ap_state(&ap_state, dcp) != NDI_SUCCESS) {
1639 			rv = EFAULT;
1640 		}
1641 		break;
1642 
1643 	case DEVCTL_AP_CONTROL:
1644 	{
1645 		/*
1646 		 * Generic devctl for hardware specific functionality
1647 		 */
1648 		sata_ioctl_data_t	ioc;
1649 
1650 		ASSERT(dcp == NULL);
1651 
1652 		/* Copy in user ioctl data first */
1653 #ifdef _MULTI_DATAMODEL
1654 		if (ddi_model_convert_from(mode & FMODELS) ==
1655 		    DDI_MODEL_ILP32) {
1656 
1657 			sata_ioctl_data_32_t	ioc32;
1658 
1659 			if (ddi_copyin((void *)arg, (void *)&ioc32,
1660 			    sizeof (ioc32), mode) != 0) {
1661 				rv = EFAULT;
1662 				break;
1663 			}
1664 			ioc.cmd		= (uint_t)ioc32.cmd;
1665 			ioc.port	= (uint_t)ioc32.port;
1666 			ioc.get_size	= (uint_t)ioc32.get_size;
1667 			ioc.buf		= (caddr_t)(uintptr_t)ioc32.buf;
1668 			ioc.bufsiz	= (uint_t)ioc32.bufsiz;
1669 			ioc.misc_arg	= (uint_t)ioc32.misc_arg;
1670 		} else
1671 #endif /* _MULTI_DATAMODEL */
1672 		if (ddi_copyin((void *)arg, (void *)&ioc, sizeof (ioc),
1673 		    mode) != 0) {
1674 			return (EFAULT);
1675 		}
1676 
1677 		SATADBG2(SATA_DBG_IOCTL_IF, sata_hba_inst,
1678 		    "sata_hba_ioctl: DEVCTL_AP_CONTROL "
1679 		    "cmd 0x%x, port 0x%x", ioc.cmd, ioc.port);
1680 
1681 		/*
1682 		 * To avoid BE/LE and 32/64 issues, a get_size always returns
1683 		 * a 32-bit number.
1684 		 */
1685 		if (ioc.get_size != 0 && ioc.bufsiz != (sizeof (uint32_t))) {
1686 			return (EINVAL);
1687 		}
1688 		/* validate address */
1689 		cport = SCSI_TO_SATA_CPORT(ioc.port);
1690 		pmport = SCSI_TO_SATA_PMPORT(ioc.port);
1691 		qual = SCSI_TO_SATA_ADDR_QUAL(ioc.port);
1692 
1693 		SATADBG3(SATA_DBG_IOCTL_IF, sata_hba_inst,
1694 		    "sata_hba_ioctl: target port is %d:%d (%d)",
1695 		    cport, pmport, qual);
1696 
1697 		if (sata_validate_sata_address(sata_hba_inst, cport,
1698 		    pmport, qual) != 0)
1699 			return (EINVAL);
1700 
1701 		cportinfo = SATA_CPORT_INFO(sata_hba_inst, cport);
1702 		mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, cport)->
1703 		    cport_mutex);
1704 		/* Is the port locked by event processing daemon ? */
1705 		if (cportinfo->cport_event_flags & SATA_EVNT_LOCK_PORT_BUSY) {
1706 			/*
1707 			 * Cannot process ioctl request now. Come back later
1708 			 */
1709 			mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, cport)->
1710 			    cport_mutex);
1711 			return (EBUSY);
1712 		}
1713 		/* Block event processing for this port */
1714 		cportinfo->cport_event_flags |= SATA_APCTL_LOCK_PORT_BUSY;
1715 		mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, cport)->cport_mutex);
1716 
1717 
1718 		sata_device.satadev_addr.cport = cport;
1719 		sata_device.satadev_addr.pmport = pmport;
1720 		sata_device.satadev_addr.qual = qual;
1721 		sata_device.satadev_rev = SATA_DEVICE_REV;
1722 
1723 		switch (ioc.cmd) {
1724 
1725 		case SATA_CFGA_RESET_PORT:
1726 			/*
1727 			 * There is no protection for configured device.
1728 			 */
1729 			rv = sata_ioctl_reset_port(sata_hba_inst, &sata_device);
1730 			break;
1731 
1732 		case SATA_CFGA_RESET_DEVICE:
1733 			/*
1734 			 * There is no protection for configured device.
1735 			 */
1736 			rv = sata_ioctl_reset_device(sata_hba_inst,
1737 			    &sata_device);
1738 			break;
1739 
1740 		case SATA_CFGA_RESET_ALL:
1741 			/*
1742 			 * There is no protection for configured devices.
1743 			 */
1744 			rv = sata_ioctl_reset_all(sata_hba_inst);
1745 			/*
1746 			 * We return here, because common return is for
1747 			 * a single port operation - we have already unlocked
1748 			 * all ports and no dc handle was allocated.
1749 			 */
1750 			return (rv);
1751 
1752 		case SATA_CFGA_PORT_DEACTIVATE:
1753 			/*
1754 			 * Arbitrarily unconfigure attached device, if any.
1755 			 * Even if the unconfigure fails, proceed with the
1756 			 * port deactivation.
1757 			 */
1758 			rv = sata_ioctl_deactivate(sata_hba_inst, &sata_device);
1759 
1760 			break;
1761 
1762 		case SATA_CFGA_PORT_ACTIVATE:
1763 
1764 			rv = sata_ioctl_activate(sata_hba_inst, &sata_device);
1765 			break;
1766 
1767 		case SATA_CFGA_PORT_SELF_TEST:
1768 
1769 			rv = sata_ioctl_port_self_test(sata_hba_inst,
1770 			    &sata_device);
1771 			break;
1772 
1773 		case SATA_CFGA_GET_DEVICE_PATH:
1774 
1775 			rv = sata_ioctl_get_device_path(sata_hba_inst,
1776 			    &sata_device, &ioc, mode);
1777 			break;
1778 
1779 		case SATA_CFGA_GET_AP_TYPE:
1780 
1781 			rv = sata_ioctl_get_ap_type(sata_hba_inst,
1782 			    &sata_device, &ioc, mode);
1783 			break;
1784 
1785 		case SATA_CFGA_GET_MODEL_INFO:
1786 
1787 			rv = sata_ioctl_get_model_info(sata_hba_inst,
1788 			    &sata_device, &ioc, mode);
1789 			break;
1790 
1791 		case SATA_CFGA_GET_REVFIRMWARE_INFO:
1792 
1793 			rv = sata_ioctl_get_revfirmware_info(sata_hba_inst,
1794 			    &sata_device, &ioc, mode);
1795 			break;
1796 
1797 		case SATA_CFGA_GET_SERIALNUMBER_INFO:
1798 
1799 			rv = sata_ioctl_get_serialnumber_info(sata_hba_inst,
1800 			    &sata_device, &ioc, mode);
1801 			break;
1802 
1803 		default:
1804 			rv = EINVAL;
1805 			break;
1806 
1807 		} /* End of DEVCTL_AP_CONTROL cmd switch */
1808 
1809 		break;
1810 	}
1811 
1812 	default:
1813 	{
1814 		/*
1815 		 * If we got here, we got an IOCTL that SATA HBA Framework
1816 		 * does not recognize. Pass ioctl to HBA driver, in case
1817 		 * it could process it.
1818 		 */
1819 		sata_hba_tran_t *sata_tran = sata_hba_inst->satahba_tran;
1820 		dev_info_t	*mydip = SATA_DIP(sata_hba_inst);
1821 
1822 		SATADBG1(SATA_DBG_IOCTL_IF, sata_hba_inst,
1823 		    "IOCTL 0x%2x not supported in SATA framework, "
1824 		    "passthrough to HBA", cmd);
1825 
1826 		if (sata_tran->sata_tran_ioctl == NULL) {
1827 			rv = EINVAL;
1828 			break;
1829 		}
1830 		rval = (*sata_tran->sata_tran_ioctl)(mydip, cmd, arg);
1831 		if (rval != 0) {
1832 			SATADBG1(SATA_DBG_IOCTL_IF, sata_hba_inst,
1833 			    "IOCTL 0x%2x failed in HBA", cmd);
1834 			rv = rval;
1835 		}
1836 		break;
1837 	}
1838 
1839 	} /* End of main IOCTL switch */
1840 
1841 	if (dcp) {
1842 		ndi_dc_freehdl(dcp);
1843 	}
1844 
1845 	if (IS_DEVCTL(cmd)) {
1846 		mutex_enter(&SATA_CPORT_INFO(sata_hba_inst,
1847 		    cport)->cport_mutex);
1848 		cportinfo->cport_event_flags &= ~SATA_APCTL_LOCK_PORT_BUSY;
1849 		mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, cport)->cport_mutex);
1850 	}
1851 
1852 	return (rv);
1853 }
1854 
1855 
1856 /*
1857  * Create error retrieval sata packet
1858  *
1859  * A sata packet is allocated and set-up to contain specified error retrieval
1860  * command and appropriate dma-able data buffer.
1861  * No association with any scsi packet is made and no callback routine is
1862  * specified.
1863  *
1864  * Returns a pointer to sata packet upon successful packet creation.
1865  * Returns NULL, if packet cannot be created.
1866  */
1867 sata_pkt_t *
sata_get_error_retrieval_pkt(dev_info_t * dip,sata_device_t * sata_device,int pkt_type)1868 sata_get_error_retrieval_pkt(dev_info_t *dip, sata_device_t *sata_device,
1869     int pkt_type)
1870 {
1871 	sata_hba_inst_t	*sata_hba_inst;
1872 	sata_pkt_txlate_t *spx;
1873 	sata_pkt_t *spkt;
1874 	sata_drive_info_t *sdinfo;
1875 
1876 	mutex_enter(&sata_mutex);
1877 	for (sata_hba_inst = sata_hba_list; sata_hba_inst != NULL;
1878 	    sata_hba_inst = sata_hba_inst->satahba_next) {
1879 		if (SATA_DIP(sata_hba_inst) == dip)
1880 			break;
1881 	}
1882 	mutex_exit(&sata_mutex);
1883 	ASSERT(sata_hba_inst != NULL);
1884 
1885 	sdinfo = sata_get_device_info(sata_hba_inst, sata_device);
1886 	if (sdinfo == NULL) {
1887 		sata_log(sata_hba_inst, CE_WARN,
1888 		    "sata: error recovery request for non-attached device at "
1889 		    "cport %d", sata_device->satadev_addr.cport);
1890 		return (NULL);
1891 	}
1892 
1893 	spx = kmem_zalloc(sizeof (sata_pkt_txlate_t), KM_SLEEP);
1894 	spx->txlt_sata_hba_inst = sata_hba_inst;
1895 	spx->txlt_scsi_pkt = NULL;		/* No scsi pkt involved */
1896 	spkt = sata_pkt_alloc(spx, NULL);
1897 	if (spkt == NULL) {
1898 		kmem_free(spx, sizeof (sata_pkt_txlate_t));
1899 		return (NULL);
1900 	}
1901 	/* address is needed now */
1902 	spkt->satapkt_device.satadev_addr = sata_device->satadev_addr;
1903 
1904 	switch (pkt_type) {
1905 	case SATA_ERR_RETR_PKT_TYPE_NCQ:
1906 		if (sata_ncq_err_ret_cmd_setup(spx, sdinfo) == SATA_SUCCESS) {
1907 			if (sata_check_for_dma_error(dip, spx)) {
1908 				ddi_fm_service_impact(dip,
1909 				    DDI_SERVICE_UNAFFECTED);
1910 				break;
1911 			}
1912 			return (spkt);
1913 		}
1914 		break;
1915 
1916 	case SATA_ERR_RETR_PKT_TYPE_ATAPI:
1917 		if (sata_atapi_err_ret_cmd_setup(spx, sdinfo) == SATA_SUCCESS) {
1918 			if (sata_check_for_dma_error(dip, spx)) {
1919 				ddi_fm_service_impact(dip,
1920 				    DDI_SERVICE_UNAFFECTED);
1921 				break;
1922 			}
1923 			return (spkt);
1924 		}
1925 		break;
1926 
1927 	default:
1928 		break;
1929 	}
1930 
1931 	sata_pkt_free(spx);
1932 	kmem_free(spx, sizeof (sata_pkt_txlate_t));
1933 	return (NULL);
1934 
1935 }
1936 
1937 
1938 /*
1939  * Free error retrieval sata packet
1940  *
1941  * Free sata packet and any associated resources allocated previously by
1942  * sata_get_error_retrieval_pkt().
1943  *
1944  * Void return.
1945  */
1946 void
sata_free_error_retrieval_pkt(sata_pkt_t * sata_pkt)1947 sata_free_error_retrieval_pkt(sata_pkt_t *sata_pkt)
1948 {
1949 	sata_pkt_txlate_t *spx =
1950 	    (sata_pkt_txlate_t *)sata_pkt->satapkt_framework_private;
1951 
1952 	ASSERT(sata_pkt != NULL);
1953 
1954 	sata_free_local_buffer(spx);
1955 	sata_pkt_free(spx);
1956 	kmem_free(spx, sizeof (sata_pkt_txlate_t));
1957 
1958 }
1959 
1960 /*
1961  * Create READ PORT MULTIPLIER and WRITE PORT MULTIPLIER sata packet
1962  *
1963  * No association with any scsi packet is made and no callback routine is
1964  * specified.
1965  *
1966  * Returns a pointer to sata packet upon successful packet creation.
1967  * Returns NULL, if packet cannot be created.
1968  *
1969  * NOTE: Input/Output value includes 64 bits accoring to SATA Spec 2.6,
1970  * only lower 32 bits are available currently.
1971  */
1972 sata_pkt_t *
sata_get_rdwr_pmult_pkt(dev_info_t * dip,sata_device_t * sd,uint16_t regn,uint32_t regv,uint32_t type)1973 sata_get_rdwr_pmult_pkt(dev_info_t *dip, sata_device_t *sd,
1974     uint16_t regn, uint32_t regv, uint32_t type)
1975 {
1976 	sata_hba_inst_t	*sata_hba_inst;
1977 	sata_pkt_txlate_t *spx;
1978 	sata_pkt_t *spkt;
1979 	sata_cmd_t *scmd;
1980 
1981 	/* Only READ/WRITE commands are accepted. */
1982 	ASSERT(type == SATA_RDWR_PMULT_PKT_TYPE_READ ||
1983 	    type == SATA_RDWR_PMULT_PKT_TYPE_WRITE);
1984 
1985 	mutex_enter(&sata_mutex);
1986 	for (sata_hba_inst = sata_hba_list; sata_hba_inst != NULL;
1987 	    sata_hba_inst = sata_hba_inst->satahba_next) {
1988 		if (SATA_DIP(sata_hba_inst) == dip)
1989 			break;
1990 	}
1991 	mutex_exit(&sata_mutex);
1992 	ASSERT(sata_hba_inst != NULL);
1993 
1994 	spx = kmem_zalloc(sizeof (sata_pkt_txlate_t), KM_SLEEP);
1995 	spx->txlt_sata_hba_inst = sata_hba_inst;
1996 	spx->txlt_scsi_pkt = NULL;	/* No scsi pkt involved */
1997 	spkt = sata_pkt_alloc(spx, SLEEP_FUNC);
1998 	if (spkt == NULL) {
1999 		kmem_free(spx, sizeof (sata_pkt_txlate_t));
2000 		return (NULL);
2001 	}
2002 
2003 	/*
2004 	 * NOTE: We need to send this command to the port multiplier,
2005 	 * that means send to SATA_PMULT_HOSTPORT(0xf) pmport
2006 	 *
2007 	 * sata_device contains the address of actual target device, and the
2008 	 * pmport number in the command comes from the sata_device structure.
2009 	 */
2010 	spkt->satapkt_device.satadev_addr = sd->satadev_addr;
2011 	spkt->satapkt_device.satadev_addr.pmport = SATA_PMULT_HOSTPORT;
2012 	spkt->satapkt_device.satadev_addr.qual = SATA_ADDR_PMULT;
2013 
2014 	/* Fill sata_pkt */
2015 	spkt->satapkt_op_mode = SATA_OPMODE_SYNCH | SATA_OPMODE_POLLING;
2016 	spkt->satapkt_comp = NULL; /* Synchronous mode, no callback */
2017 	spkt->satapkt_time = 10; /* Timeout 10s */
2018 
2019 	/* Build READ PORT MULTIPLIER cmd in the sata_pkt */
2020 	scmd = &spkt->satapkt_cmd;
2021 	scmd->satacmd_features_reg = regn & 0xff;
2022 	scmd->satacmd_features_reg_ext = (regn >> 8) & 0xff;
2023 	scmd->satacmd_device_reg = sd->satadev_addr.pmport;
2024 	scmd->satacmd_addr_type = 0;		/* N/A */
2025 
2026 	scmd->satacmd_flags.sata_ignore_dev_reset = B_TRUE;
2027 
2028 	if (type == SATA_RDWR_PMULT_PKT_TYPE_READ) {
2029 		scmd->satacmd_cmd_reg = SATAC_READ_PORTMULT;
2030 		scmd->satacmd_flags.sata_data_direction = SATA_DIR_READ;
2031 		scmd->satacmd_flags.sata_special_regs = 1;
2032 		scmd->satacmd_flags.sata_copy_out_lba_high_lsb = 1;
2033 		scmd->satacmd_flags.sata_copy_out_lba_mid_lsb = 1;
2034 		scmd->satacmd_flags.sata_copy_out_lba_low_lsb = 1;
2035 		scmd->satacmd_flags.sata_copy_out_sec_count_lsb = 1;
2036 	} else if (type == SATA_RDWR_PMULT_PKT_TYPE_WRITE) {
2037 		scmd->satacmd_cmd_reg = SATAC_WRITE_PORTMULT;
2038 		scmd->satacmd_flags.sata_data_direction = SATA_DIR_WRITE;
2039 		scmd->satacmd_sec_count_lsb = regv & 0xff;
2040 		scmd->satacmd_lba_low_lsb = regv >> 8 & 0xff;
2041 		scmd->satacmd_lba_mid_lsb = regv >> 16 & 0xff;
2042 		scmd->satacmd_lba_high_lsb = regv >> 24 & 0xff;
2043 	}
2044 
2045 	return (spkt);
2046 }
2047 
2048 /*
2049  * Free sata packet and any associated resources allocated previously by
2050  * sata_get_rdwr_pmult_pkt().
2051  *
2052  * Void return.
2053  */
2054 void
sata_free_rdwr_pmult_pkt(sata_pkt_t * sata_pkt)2055 sata_free_rdwr_pmult_pkt(sata_pkt_t *sata_pkt)
2056 {
2057 	sata_pkt_txlate_t *spx =
2058 	    (sata_pkt_txlate_t *)sata_pkt->satapkt_framework_private;
2059 
2060 	/* Free allocated resources */
2061 	sata_pkt_free(spx);
2062 	kmem_free(spx, sizeof (sata_pkt_txlate_t));
2063 }
2064 
2065 /*
2066  * Register a port multiplier to framework.
2067  * 1) Store the GSCR values in the previous allocated pmult_info strctures.
2068  * 2) Search in the blacklist and update the number of the device ports of the
2069  * port multiplier.
2070  *
2071  * Void return.
2072  */
2073 void
sata_register_pmult(dev_info_t * dip,sata_device_t * sd,sata_pmult_gscr_t * sg)2074 sata_register_pmult(dev_info_t *dip, sata_device_t *sd, sata_pmult_gscr_t *sg)
2075 {
2076 	sata_hba_inst_t *sata_hba_inst = NULL;
2077 	sata_pmult_info_t *pmultinfo;
2078 	sata_pmult_bl_t *blp;
2079 	int cport = sd->satadev_addr.cport;
2080 
2081 	mutex_enter(&sata_mutex);
2082 	for (sata_hba_inst = sata_hba_list; sata_hba_inst != NULL;
2083 	    sata_hba_inst = sata_hba_inst->satahba_next) {
2084 		if (SATA_DIP(sata_hba_inst) == dip)
2085 			if (sata_hba_inst->satahba_attached == 1)
2086 				break;
2087 	}
2088 	mutex_exit(&sata_mutex);
2089 	/* HBA not attached? */
2090 	if (sata_hba_inst == NULL)
2091 		return;
2092 
2093 	/* Number of pmports */
2094 	sd->satadev_add_info = sg->gscr2 & SATA_PMULT_PORTNUM_MASK;
2095 
2096 	/* Check the blacklist */
2097 	for (blp = sata_pmult_blacklist; blp->bl_gscr0; blp++) {
2098 		if (sg->gscr0 != blp->bl_gscr0 && blp->bl_gscr0)
2099 			continue;
2100 		if (sg->gscr1 != blp->bl_gscr1 && blp->bl_gscr1)
2101 			continue;
2102 		if (sg->gscr2 != blp->bl_gscr2 && blp->bl_gscr2)
2103 			continue;
2104 
2105 		cmn_err(CE_WARN, "!Port multiplier is on the blacklist.");
2106 		sd->satadev_add_info = blp->bl_flags;
2107 		break;
2108 	}
2109 
2110 	/* Register the port multiplier GSCR */
2111 	mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst, cport)));
2112 	pmultinfo = SATA_PMULT_INFO(sata_hba_inst, cport);
2113 	if (pmultinfo != NULL) {
2114 		pmultinfo->pmult_gscr = *sg;
2115 		pmultinfo->pmult_num_dev_ports =
2116 		    sd->satadev_add_info & SATA_PMULT_PORTNUM_MASK;
2117 		SATADBG1(SATA_DBG_PMULT, sata_hba_inst,
2118 		    "Port multiplier registered at port %d", cport);
2119 	}
2120 	mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst, cport)));
2121 }
2122 
2123 /*
2124  * sata_split_model splits the model ID into vendor and product IDs.
2125  * It assumes that a vendor ID cannot be longer than 8 characters, and
2126  * that vendor and product ID are separated by a whitespace.
2127  */
2128 void
sata_split_model(char * model,char ** vendor,char ** product)2129 sata_split_model(char *model, char **vendor, char **product)
2130 {
2131 	int i, modlen;
2132 	char *vid, *pid;
2133 
2134 	/*
2135 	 * remove whitespace at the end of model
2136 	 */
2137 	for (i = SATA_ID_MODEL_LEN; i > 0; i--)
2138 		if (model[i] == ' ' || model[i] == '\t' || model[i] == '\0')
2139 			model[i] = '\0';
2140 		else
2141 			break;
2142 
2143 	/*
2144 	 * try to split model into into vid/pid
2145 	 */
2146 	modlen = strlen(model);
2147 	for (i = 0, pid = model; i < modlen; i++, pid++)
2148 		if ((*pid == ' ') || (*pid == '\t'))
2149 			break;
2150 
2151 	/*
2152 	 * only use vid if it is less than 8 chars (as in SCSI)
2153 	 */
2154 	if (i < modlen && i <= 8) {
2155 		vid = model;
2156 		/*
2157 		 * terminate vid, establish pid
2158 		 */
2159 		*pid++ = '\0';
2160 	} else {
2161 		/*
2162 		 * vid will stay "ATA     "
2163 		 */
2164 		vid = NULL;
2165 		/*
2166 		 * model is all pid
2167 		 */
2168 		pid = model;
2169 	}
2170 
2171 	*vendor = vid;
2172 	*product = pid;
2173 }
2174 
2175 /*
2176  * sata_name_child is for composing the name of the node
2177  * the format of the name is "target,0".
2178  */
2179 static int
sata_name_child(dev_info_t * dip,char * name,int namelen)2180 sata_name_child(dev_info_t *dip, char *name, int namelen)
2181 {
2182 	int target;
2183 
2184 	target = ddi_prop_get_int(DDI_DEV_T_ANY, dip,
2185 	    DDI_PROP_DONTPASS, "target", -1);
2186 	if (target == -1)
2187 		return (DDI_FAILURE);
2188 	(void) snprintf(name, namelen, "%x,0", target);
2189 	return (DDI_SUCCESS);
2190 }
2191 
2192 
2193 
2194 /* ****************** SCSA required entry points *********************** */
2195 
2196 /*
2197  * Implementation of scsi tran_tgt_init.
2198  * sata_scsi_tgt_init() initializes scsi_device structure
2199  *
2200  * If successful, DDI_SUCCESS is returned.
2201  * DDI_FAILURE is returned if addressed device does not exist
2202  */
2203 
2204 static int
sata_scsi_tgt_init(dev_info_t * hba_dip,dev_info_t * tgt_dip,scsi_hba_tran_t * hba_tran,struct scsi_device * sd)2205 sata_scsi_tgt_init(dev_info_t *hba_dip, dev_info_t *tgt_dip,
2206     scsi_hba_tran_t *hba_tran, struct scsi_device *sd)
2207 {
2208 #ifndef __lock_lint
2209 	_NOTE(ARGUNUSED(hba_dip))
2210 	_NOTE(ARGUNUSED(tgt_dip))
2211 #endif
2212 	sata_device_t		sata_device;
2213 	sata_drive_info_t	*sdinfo;
2214 	struct sata_id		*sid;
2215 	sata_hba_inst_t		*sata_hba_inst;
2216 	char			model[SATA_ID_MODEL_LEN + 1];
2217 	char			fw[SATA_ID_FW_LEN + 1];
2218 	char			*vid, *pid;
2219 
2220 	/*
2221 	 * Fail tran_tgt_init for .conf stub node
2222 	 */
2223 	if (ndi_dev_is_persistent_node(tgt_dip) == 0) {
2224 		(void) ndi_merge_node(tgt_dip, sata_name_child);
2225 		ddi_set_name_addr(tgt_dip, NULL);
2226 		return (DDI_FAILURE);
2227 	}
2228 
2229 	sata_hba_inst = (sata_hba_inst_t *)(hba_tran->tran_hba_private);
2230 
2231 	/* Validate scsi device address */
2232 	if (sata_validate_scsi_address(sata_hba_inst, &sd->sd_address,
2233 	    &sata_device) != 0)
2234 		return (DDI_FAILURE);
2235 
2236 	mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst,
2237 	    sata_device.satadev_addr.cport)));
2238 
2239 	/* sata_device now contains a valid sata address */
2240 	sdinfo = sata_get_device_info(sata_hba_inst, &sata_device);
2241 	if (sdinfo == NULL) {
2242 		mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
2243 		    sata_device.satadev_addr.cport)));
2244 		return (DDI_FAILURE);
2245 	}
2246 	mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
2247 	    sata_device.satadev_addr.cport)));
2248 
2249 	/*
2250 	 * Check if we need to create a legacy devid (i.e cmdk style) for
2251 	 * the target disks.
2252 	 *
2253 	 * HBA devinfo node will have the property "use-cmdk-devid-format"
2254 	 * if we need to create cmdk-style devid for all the disk devices
2255 	 * attached to this controller. This property may have been set
2256 	 * from HBA driver's .conf file or by the HBA driver in its
2257 	 * attach(9E) function.
2258 	 */
2259 	if ((sdinfo->satadrv_type == SATA_DTYPE_ATADISK) &&
2260 	    (ddi_getprop(DDI_DEV_T_ANY, hba_dip, DDI_PROP_DONTPASS,
2261 	    "use-cmdk-devid-format", 0) == 1)) {
2262 		/* register a legacy devid for this target node */
2263 		sata_target_devid_register(tgt_dip, sdinfo);
2264 	}
2265 
2266 
2267 	/*
2268 	 * 'Identify Device Data' does not always fit in standard SCSI
2269 	 * INQUIRY data, so establish INQUIRY_* properties with full-form
2270 	 * of information.
2271 	 */
2272 	sid = &sdinfo->satadrv_id;
2273 #ifdef	_LITTLE_ENDIAN
2274 	swab(sid->ai_model, model, SATA_ID_MODEL_LEN);
2275 	swab(sid->ai_fw, fw, SATA_ID_FW_LEN);
2276 #else	/* _LITTLE_ENDIAN */
2277 	bcopy(sid->ai_model, model, SATA_ID_MODEL_LEN);
2278 	bcopy(sid->ai_fw, fw, SATA_ID_FW_LEN);
2279 #endif	/* _LITTLE_ENDIAN */
2280 	model[SATA_ID_MODEL_LEN] = 0;
2281 	fw[SATA_ID_FW_LEN] = 0;
2282 
2283 	sata_split_model(model, &vid, &pid);
2284 
2285 	if (vid)
2286 		(void) scsi_device_prop_update_inqstring(sd, INQUIRY_VENDOR_ID,
2287 		    vid, strlen(vid));
2288 	if (pid)
2289 		(void) scsi_device_prop_update_inqstring(sd, INQUIRY_PRODUCT_ID,
2290 		    pid, strlen(pid));
2291 	(void) scsi_device_prop_update_inqstring(sd, INQUIRY_REVISION_ID,
2292 	    fw, strlen(fw));
2293 
2294 	return (DDI_SUCCESS);
2295 }
2296 
2297 /*
2298  * Implementation of scsi tran_tgt_probe.
2299  * Probe target, by calling default scsi routine scsi_hba_probe()
2300  */
2301 static int
sata_scsi_tgt_probe(struct scsi_device * sd,int (* callback)(void))2302 sata_scsi_tgt_probe(struct scsi_device *sd, int (*callback)(void))
2303 {
2304 	sata_hba_inst_t *sata_hba_inst =
2305 	    (sata_hba_inst_t *)(sd->sd_address.a_hba_tran->tran_hba_private);
2306 	int rval;
2307 	uint32_t pm_cap;
2308 
2309 	rval = scsi_hba_probe(sd, callback);
2310 	pm_cap = SATA_CAP_POWER_CONDITON | SATA_CAP_SMART_PAGE |
2311 	    SATA_CAP_LOG_SENSE;
2312 
2313 	if (rval == SCSIPROBE_EXISTS) {
2314 		/*
2315 		 * Set property "pm-capable" on the target device node, so that
2316 		 * the target driver will not try to fetch scsi cycle counters
2317 		 * before enabling device power-management.
2318 		 */
2319 		if ((ddi_prop_update_int(DDI_DEV_T_NONE, sd->sd_dev,
2320 		    "pm-capable", pm_cap)) != DDI_PROP_SUCCESS) {
2321 			sata_log(sata_hba_inst, CE_WARN,
2322 			    "SATA device at port %d: "
2323 			    "will not be power-managed ",
2324 			    SCSI_TO_SATA_CPORT(sd->sd_address.a_target));
2325 			SATA_LOG_D((sata_hba_inst, CE_WARN,
2326 			    "failure updating pm-capable property"));
2327 		}
2328 	}
2329 	return (rval);
2330 }
2331 
2332 /*
2333  * Implementation of scsi tran_tgt_free.
2334  * Release all resources allocated for scsi_device
2335  */
2336 static void
sata_scsi_tgt_free(dev_info_t * hba_dip,dev_info_t * tgt_dip,scsi_hba_tran_t * hba_tran,struct scsi_device * sd)2337 sata_scsi_tgt_free(dev_info_t *hba_dip, dev_info_t *tgt_dip,
2338     scsi_hba_tran_t *hba_tran, struct scsi_device *sd)
2339 {
2340 #ifndef __lock_lint
2341 	_NOTE(ARGUNUSED(hba_dip))
2342 #endif
2343 	sata_device_t		sata_device;
2344 	sata_drive_info_t	*sdinfo;
2345 	sata_hba_inst_t		*sata_hba_inst;
2346 	ddi_devid_t		devid;
2347 
2348 	sata_hba_inst = (sata_hba_inst_t *)(hba_tran->tran_hba_private);
2349 
2350 	/* Validate scsi device address */
2351 	/*
2352 	 * Note: tgt_free relates to the SCSA view of a device. If called, there
2353 	 * was a device at this address, so even if the sata framework internal
2354 	 * resources were alredy released because a device was detached,
2355 	 * this function should be executed as long as its actions do
2356 	 * not require the internal sata view of a device and the address
2357 	 * refers to a valid sata address.
2358 	 * Validating the address here means that we do not trust SCSA...
2359 	 */
2360 	if (sata_validate_scsi_address(sata_hba_inst, &sd->sd_address,
2361 	    &sata_device) == -1)
2362 		return;
2363 
2364 	mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst,
2365 	    sata_device.satadev_addr.cport)));
2366 
2367 	/* sata_device now should contain a valid sata address */
2368 	sdinfo = sata_get_device_info(sata_hba_inst, &sata_device);
2369 	if (sdinfo == NULL) {
2370 		mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
2371 		    sata_device.satadev_addr.cport)));
2372 		return;
2373 	}
2374 	/*
2375 	 * We did not allocate any resources in sata_scsi_tgt_init()
2376 	 * other than few properties.
2377 	 * Free them.
2378 	 */
2379 	mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
2380 	    sata_device.satadev_addr.cport)));
2381 	(void) ndi_prop_remove(DDI_DEV_T_NONE, tgt_dip, "pm-capable");
2382 
2383 	/*
2384 	 * If devid was previously created but not freed up from
2385 	 * sd(4D) driver (i.e during detach(9E)) then do it here.
2386 	 */
2387 	if ((sdinfo->satadrv_type == SATA_DTYPE_ATADISK) &&
2388 	    (ddi_getprop(DDI_DEV_T_ANY, hba_dip, DDI_PROP_DONTPASS,
2389 	    "use-cmdk-devid-format", 0) == 1) &&
2390 	    (ddi_devid_get(tgt_dip, &devid) == DDI_SUCCESS)) {
2391 		ddi_devid_unregister(tgt_dip);
2392 		ddi_devid_free(devid);
2393 	}
2394 }
2395 
2396 /*
2397  * Implementation of scsi tran_init_pkt
2398  * Upon successful return, scsi pkt buffer has DMA resources allocated.
2399  *
2400  * It seems that we should always allocate pkt, even if the address is
2401  * for non-existing device - just use some default for dma_attr.
2402  * The reason is that there is no way to communicate this to a caller here.
2403  * Subsequent call to sata_scsi_start may fail appropriately.
2404  * Simply returning NULL does not seem to discourage a target driver...
2405  *
2406  * Returns a pointer to initialized scsi_pkt, or NULL otherwise.
2407  */
2408 static struct scsi_pkt *
sata_scsi_init_pkt(struct scsi_address * ap,struct scsi_pkt * pkt,struct buf * bp,int cmdlen,int statuslen,int tgtlen,int flags,int (* callback)(caddr_t),caddr_t arg)2409 sata_scsi_init_pkt(struct scsi_address *ap, struct scsi_pkt *pkt,
2410     struct buf *bp, int cmdlen, int statuslen, int tgtlen, int flags,
2411     int (*callback)(caddr_t), caddr_t arg)
2412 {
2413 	sata_hba_inst_t *sata_hba_inst =
2414 	    (sata_hba_inst_t *)(ap->a_hba_tran->tran_hba_private);
2415 	dev_info_t *dip = SATA_DIP(sata_hba_inst);
2416 	sata_device_t sata_device;
2417 	sata_drive_info_t *sdinfo;
2418 	sata_pkt_txlate_t *spx;
2419 	ddi_dma_attr_t cur_dma_attr;
2420 	int rval;
2421 	boolean_t new_pkt = B_TRUE;
2422 
2423 	ASSERT(ap->a_hba_tran->tran_hba_dip == dip);
2424 
2425 	/*
2426 	 * We need to translate the address, even if it could be
2427 	 * a bogus one, for a non-existing device
2428 	 */
2429 	sata_device.satadev_addr.qual = SCSI_TO_SATA_ADDR_QUAL(ap->a_target);
2430 	sata_device.satadev_addr.cport = SCSI_TO_SATA_CPORT(ap->a_target);
2431 	sata_device.satadev_addr.pmport = SCSI_TO_SATA_PMPORT(ap->a_target);
2432 	sata_device.satadev_rev = SATA_DEVICE_REV;
2433 
2434 	if (pkt == NULL) {
2435 		/*
2436 		 * Have to allocate a brand new scsi packet.
2437 		 * We need to operate with auto request sense enabled.
2438 		 */
2439 		pkt = scsi_hba_pkt_alloc(dip, ap, cmdlen,
2440 		    MAX(statuslen, SATA_MAX_SENSE_LEN),
2441 		    tgtlen, sizeof (sata_pkt_txlate_t), callback, arg);
2442 
2443 		if (pkt == NULL)
2444 			return (NULL);
2445 
2446 		/* Fill scsi packet structure */
2447 		pkt->pkt_comp		= (void (*)())NULL;
2448 		pkt->pkt_time		= 0;
2449 		pkt->pkt_resid		= 0;
2450 		pkt->pkt_statistics	= 0;
2451 		pkt->pkt_reason		= 0;
2452 
2453 		/*
2454 		 * pkt_hba_private will point to sata pkt txlate structure
2455 		 */
2456 		spx = (sata_pkt_txlate_t *)pkt->pkt_ha_private;
2457 		bzero(spx, sizeof (sata_pkt_txlate_t));
2458 
2459 		spx->txlt_scsi_pkt = pkt;
2460 		spx->txlt_sata_hba_inst = sata_hba_inst;
2461 
2462 		/* Allocate sata_pkt */
2463 		spx->txlt_sata_pkt = sata_pkt_alloc(spx, callback);
2464 		if (spx->txlt_sata_pkt == NULL) {
2465 			/* Could not allocate sata pkt */
2466 			scsi_hba_pkt_free(ap, pkt);
2467 			return (NULL);
2468 		}
2469 		/* Set sata address */
2470 		spx->txlt_sata_pkt->satapkt_device.satadev_addr =
2471 		    sata_device.satadev_addr;
2472 		spx->txlt_sata_pkt->satapkt_device.satadev_rev =
2473 		    sata_device.satadev_rev;
2474 
2475 		if ((bp == NULL) || (bp->b_bcount == 0))
2476 			return (pkt);
2477 
2478 		spx->txlt_total_residue = bp->b_bcount;
2479 	} else {
2480 		new_pkt = B_FALSE;
2481 		/*
2482 		 * Packet was preallocated/initialized by previous call
2483 		 */
2484 		spx = (sata_pkt_txlate_t *)pkt->pkt_ha_private;
2485 
2486 		if ((bp == NULL) || (bp->b_bcount == 0)) {
2487 			return (pkt);
2488 		}
2489 
2490 		/* Pkt is available already: spx->txlt_scsi_pkt == pkt; */
2491 	}
2492 
2493 	spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp = bp;
2494 
2495 	/*
2496 	 * We use an adjusted version of the dma_attr, to account
2497 	 * for device addressing limitations.
2498 	 * sata_adjust_dma_attr() will handle sdinfo == NULL which may
2499 	 * happen when a device is not yet configured.
2500 	 */
2501 	mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst,
2502 	    sata_device.satadev_addr.cport)));
2503 	sdinfo = sata_get_device_info(spx->txlt_sata_hba_inst,
2504 	    &spx->txlt_sata_pkt->satapkt_device);
2505 	/* NULL sdinfo may be passsed to sata_adjust_dma_attr() */
2506 	sata_adjust_dma_attr(sdinfo,
2507 	    SATA_DMA_ATTR(spx->txlt_sata_hba_inst), &cur_dma_attr);
2508 	mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
2509 	    sata_device.satadev_addr.cport)));
2510 	/*
2511 	 * Allocate necessary DMA resources for the packet's data buffer
2512 	 * NOTE:
2513 	 * In case of read/write commands, DMA resource allocation here is
2514 	 * based on the premise that the transfer length specified in
2515 	 * the read/write scsi cdb will match exactly DMA resources -
2516 	 * returning correct packet residue is crucial.
2517 	 */
2518 	if ((rval = sata_dma_buf_setup(spx, flags, callback, arg,
2519 	    &cur_dma_attr)) != DDI_SUCCESS) {
2520 		/*
2521 		 * If a DMA allocation request fails with
2522 		 * DDI_DMA_NOMAPPING, indicate the error by calling
2523 		 * bioerror(9F) with bp and an error code of EFAULT.
2524 		 * If a DMA allocation request fails with
2525 		 * DDI_DMA_TOOBIG, indicate the error by calling
2526 		 * bioerror(9F) with bp and an error code of EINVAL.
2527 		 * For DDI_DMA_NORESOURCES, we may have some of them allocated.
2528 		 * Request may be repeated later - there is no real error.
2529 		 */
2530 		switch (rval) {
2531 		case DDI_DMA_NORESOURCES:
2532 			bioerror(bp, 0);
2533 			break;
2534 		case DDI_DMA_NOMAPPING:
2535 		case DDI_DMA_BADATTR:
2536 			bioerror(bp, EFAULT);
2537 			break;
2538 		case DDI_DMA_TOOBIG:
2539 		default:
2540 			bioerror(bp, EINVAL);
2541 			break;
2542 		}
2543 		goto fail;
2544 	}
2545 
2546 	if (sata_check_for_dma_error(dip, spx)) {
2547 		ddi_fm_service_impact(dip, DDI_SERVICE_UNAFFECTED);
2548 		bioerror(bp, EFAULT);
2549 		goto fail;
2550 	}
2551 
2552 	/* Set number of bytes that are not yet accounted for */
2553 	pkt->pkt_resid = spx->txlt_total_residue;
2554 	ASSERT(pkt->pkt_resid >= 0);
2555 
2556 	return (pkt);
2557 
2558 fail:
2559 	if (new_pkt == B_TRUE) {
2560 		/*
2561 		 * Since this is a new packet, we can clean-up
2562 		 * everything
2563 		 */
2564 		sata_scsi_destroy_pkt(ap, pkt);
2565 	} else {
2566 		/*
2567 		 * This is a re-used packet. It will be target driver's
2568 		 * responsibility to eventually destroy it (which
2569 		 * will free allocated resources).
2570 		 * Here, we just "complete" the request, leaving
2571 		 * allocated resources intact, so the request may
2572 		 * be retried.
2573 		 */
2574 		spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp = NULL;
2575 		sata_pkt_free(spx);
2576 	}
2577 	return (NULL);
2578 }
2579 
2580 typedef enum sata_cmd_info_flags {
2581 	SCF_NONE =	0,
2582 	SCF_SVC_ACT =	(1 << 0),	/* Op uses SVC ACTION field */
2583 	SCF_MAPIN =	(1 << 1),	/* Op doesn't map in buf */
2584 } sata_cmd_info_flags_t;
2585 
2586 /* The largest CDB we support */
2587 #define	CDB_MAXLEN	16
2588 
2589 /*
2590  * New commands should be added to this struct. This is used to both
2591  * dispatch commands as well as with REPORT SUPPORTED OPERATIONS.
2592  * Currently no order is required for these.
2593  */
2594 static const struct sata_cmd_info {
2595 	uint8_t			sci_op;		/* SCSI op code */
2596 	uint16_t		sci_svcact;	/* SCSI service action */
2597 	sata_cmd_info_flags_t	sci_flags;
2598 	int			(*sci_cmd)(sata_pkt_txlate_t *spx);
2599 	boolean_t		(*sci_supported)(sata_pkt_txlate_t *,
2600 				    sata_drive_info_t *);
2601 	uint8_t			sci_cdbusage[CDB_MAXLEN];
2602 } sata_cmd_info[] = {
2603 	{ SCMD_INQUIRY, 0, SCF_MAPIN, sata_txlt_inquiry, NULL,
2604 	    { SCMD_INQUIRY, 0x01, 0xff, 0xff, 0xff, 0x00 } },
2605 	{ SCMD_TEST_UNIT_READY, 0, SCF_NONE, sata_txlt_test_unit_ready, NULL,
2606 	    { SCMD_TEST_UNIT_READY, 0x00, 0x00, 0x00, 0x00, 0x00 } },
2607 	{ SCMD_START_STOP, 0, SCF_NONE, sata_txlt_start_stop_unit, NULL,
2608 	    { SCMD_START_STOP, 0x01, 0x00, 0x0f, 0xf7, 0x00 } },
2609 	{ SCMD_READ_CAPACITY, 0, SCF_MAPIN, sata_txlt_read_capacity, NULL,
2610 	    { SCMD_READ_CAPACITY, 0x00, 0x00, 0x00, 0x00, 0x00 } },
2611 	{ SCMD_SVC_ACTION_IN_G4, SSVC_ACTION_READ_CAPACITY_G4,
2612 	    SCF_SVC_ACT|SCF_MAPIN, sata_txlt_read_capacity16, NULL,
2613 	    { SCMD_SVC_ACTION_IN_G4, SSVC_ACTION_READ_CAPACITY_G4, 0x00, 0x00,
2614 	    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00,
2615 	    0x00 } },
2616 	{ SCMD_REQUEST_SENSE, 0, SCF_MAPIN, sata_txlt_request_sense, NULL,
2617 	    { SCMD_REQUEST_SENSE, 0x00, 0x00, 0x00, 0x00, 0x00 } },
2618 	{ SCMD_LOG_SENSE_G1, 0, SCF_MAPIN, sata_txlt_log_sense, NULL,
2619 	    { SCMD_LOG_SENSE_G1, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff,
2620 	    0xff } },
2621 	{ SCMD_MODE_SENSE, 0, SCF_MAPIN, sata_txlt_mode_sense, NULL,
2622 	    { SCMD_MODE_SENSE, 0x08, 0xff, 0xff, 0xff, 0x00 } },
2623 	{ SCMD_MODE_SENSE_G1, 0, SCF_MAPIN, sata_txlt_mode_sense, NULL,
2624 	    { SCMD_MODE_SENSE_G1, 0x18, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff,
2625 	    0xff, 0x00 } },
2626 	{ SCMD_MODE_SELECT, 0, SCF_MAPIN, sata_txlt_mode_select, NULL,
2627 	    { SCMD_MODE_SELECT, 0x00, 0x00, 0x00, 0xff, 0x00 } },
2628 	{ SCMD_MODE_SELECT_G1, 0, SCF_MAPIN, sata_txlt_mode_select, NULL,
2629 	    { SCMD_MODE_SELECT_G1, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00 } },
2630 	{ SCMD_SYNCHRONIZE_CACHE, 0, SCF_NONE, sata_txlt_synchronize_cache,
2631 	    NULL, { SCMD_SYNCHRONIZE_CACHE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2632 	    0x00, 0x00, 0x00 } },
2633 	{ SCMD_SYNCHRONIZE_CACHE_G1, 0, SCF_NONE,
2634 	    sata_txlt_synchronize_cache, NULL,
2635 	    { SCMD_SYNCHRONIZE_CACHE_G1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2636 	    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } },
2637 	{ SCMD_READ, 0, SCF_NONE, sata_txlt_read, NULL,
2638 	    { SCMD_READ, 0x1f, 0xff, 0xff, 0xff, 0x00 } },
2639 	{ SCMD_READ_G1, 0, SCF_NONE, sata_txlt_read, NULL,
2640 	    { SCMD_READ_G1, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0xff, 0xff,
2641 	    0x00 } },
2642 	{ SCMD_READ_G4, 0, SCF_NONE, sata_txlt_read, NULL,
2643 	    { SCMD_READ_G4, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
2644 	    0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00 } },
2645 	{ SCMD_READ_G5, 0, SCF_NONE, sata_txlt_read, NULL,
2646 	    { SCMD_READ_G5, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
2647 	    0xff, 0x00, 0x00 } },
2648 	{ SCMD_WRITE_BUFFER, 0, SCF_MAPIN, sata_txlt_write_buffer, NULL,
2649 	    { SCMD_WRITE_BUFFER, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2650 	    0x00 } },
2651 	{ SCMD_WRITE, 0, SCF_NONE, sata_txlt_write, NULL,
2652 	    { SCMD_WRITE, 0x1f, 0xff, 0xff, 0xff, 0x00, 0x00 } },
2653 	{ SCMD_WRITE_G1, 0, SCF_NONE, sata_txlt_write, NULL,
2654 	    { SCMD_WRITE_G1, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0xff, 0xff,
2655 	    0x00 } },
2656 	{ SCMD_WRITE_G4, 0, SCF_NONE, sata_txlt_write, NULL,
2657 	    { SCMD_WRITE_G4, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
2658 	    0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00 } },
2659 	{ SCMD_WRITE_G5, 0, SCF_NONE, sata_txlt_write, NULL,
2660 	    { SCMD_WRITE_G5, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
2661 	    0xff, 0x00, 0x00 } },
2662 	{ SCMD_SEEK, 0, SCF_NONE, sata_txlt_nodata_cmd_immediate, NULL,
2663 	    { SCMD_SEEK, 0x00, 0x00, 0x00, 0x00, 0x00 } },
2664 	{ SPC3_CMD_ATA_COMMAND_PASS_THROUGH12, 0, SCF_MAPIN,
2665 	    sata_txlt_ata_pass_thru, NULL,
2666 	    { SPC3_CMD_ATA_COMMAND_PASS_THROUGH12, 0x1e, 0xff, 0xff, 0xff,
2667 	    0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00 } },
2668 	{ SPC3_CMD_ATA_COMMAND_PASS_THROUGH16, 0, SCF_MAPIN,
2669 	    sata_txlt_ata_pass_thru, NULL,
2670 	    { SPC3_CMD_ATA_COMMAND_PASS_THROUGH16, 0x1f, 0xff, 0xff, 0xff, 0xff,
2671 	    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff } },
2672 	{ SPC3_CMD_UNMAP, 0, SCF_MAPIN, sata_txlt_unmap,
2673 	    sata_txlt_unmap_supported, { SPC3_CMD_UNMAP, 0x00, 0x00, 0x00, 0x00,
2674 	    0x00, 0x00, 0xff, 0xff, 0x00 } },
2675 	{ SCMD_MAINTENANCE_IN, SSVC_ACTION_GET_SUPPORTED_OPERATIONS,
2676 	    SCF_SVC_ACT|SCF_MAPIN, sata_txlt_supported_ops, NULL,
2677 	    { SCMD_MAINTENANCE_IN, SSVC_ACTION_GET_SUPPORTED_OPERATIONS, 0x07,
2678 	    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00 } },
2679 };
2680 
2681 static const struct sata_cmd_info scmd_invalid = {
2682 	.sci_op = 0,
2683 	.sci_svcact = 0,
2684 	.sci_flags = SCF_NONE,
2685 	.sci_cmd = sata_txlt_invalid_command,
2686 	.sci_supported = NULL,
2687 };
2688 
2689 static inline uint16_t
sata_cmd_cdblen(const struct sata_cmd_info * cmd)2690 sata_cmd_cdblen(const struct sata_cmd_info *cmd)
2691 {
2692 	switch (CDB_GROUPID(cmd->sci_op)) {
2693 	case CDB_GROUPID_0:
2694 		return (CDB_GROUP0);
2695 	case CDB_GROUPID_1:
2696 		return (CDB_GROUP1);
2697 	case CDB_GROUPID_2:
2698 		return (CDB_GROUP2);
2699 	case CDB_GROUPID_3:
2700 		return (CDB_GROUP3);
2701 	case CDB_GROUPID_4:
2702 		return (CDB_GROUP4);
2703 	case CDB_GROUPID_5:
2704 		return (CDB_GROUP5);
2705 	case CDB_GROUPID_6:
2706 		return (CDB_GROUP6);
2707 	case CDB_GROUPID_7:
2708 		return (CDB_GROUP7);
2709 	default:
2710 		/* We should never get here */
2711 		cmn_err(CE_PANIC, "invalid CDB size for op %x\n", cmd->sci_op);
2712 
2713 #ifndef __CHECKER__
2714 		/* Make gcc happy */
2715 		return (0);
2716 #endif
2717 	}
2718 }
2719 
2720 /*
2721  * Implementation of scsi tran_start.
2722  * Translate scsi cmd into sata operation and return status.
2723  * ATAPI CDBs are passed to ATAPI devices - the device determines what commands
2724  * are supported.
2725  * For SATA hard disks, supported scsi commands:
2726  * SCMD_INQUIRY
2727  * SCMD_TEST_UNIT_READY
2728  * SCMD_START_STOP
2729  * SCMD_READ_CAPACITY
2730  * SCMD_SVC_ACTION_IN_G4 (READ CAPACITY (16))
2731  * SCMD_REQUEST_SENSE
2732  * SCMD_LOG_SENSE_G1
2733  * SCMD_LOG_SELECT_G1
2734  * SCMD_MODE_SENSE	(specific pages)
2735  * SCMD_MODE_SENSE_G1	(specific pages)
2736  * SCMD_MODE_SELECT	(specific pages)
2737  * SCMD_MODE_SELECT_G1	(specific pages)
2738  * SCMD_SYNCHRONIZE_CACHE
2739  * SCMD_SYNCHRONIZE_CACHE_G1
2740  * SCMD_READ
2741  * SCMD_READ_G1
2742  * SCMD_READ_G4
2743  * SCMD_READ_G5
2744  * SCMD_WRITE
2745  * SCMD_WRITE_BUFFER
2746  * SCMD_WRITE_G1
2747  * SCMD_WRITE_G4
2748  * SCMD_WRITE_G5
2749  * SCMD_SEEK		(noop)
2750  * SCMD_SDIAG
2751  * SCMD_MAINTENANCE_IN (SSVC_ACTION_GET_SUPPORTED_OPERATIONS)
2752  *
2753  * All other commands are rejected as unsupported.
2754  *
2755  * Returns:
2756  * TRAN_ACCEPT if command was executed successfully or accepted by HBA driver
2757  * for execution. TRAN_ACCEPT may be returned also if device was removed but
2758  * a callback could be scheduled.
2759  * TRAN_BADPKT if cmd was directed to invalid address.
2760  * TRAN_FATAL_ERROR is command was rejected due to hardware error, including
2761  * some unspecified error. TRAN_FATAL_ERROR may be also returned if a device
2762  * was removed and there was no callback specified in scsi pkt.
2763  * TRAN_BUSY if command could not be executed becasue HBA driver or SATA
2764  * framework was busy performing some other operation(s).
2765  *
2766  */
2767 static int
sata_scsi_start(struct scsi_address * ap,struct scsi_pkt * pkt)2768 sata_scsi_start(struct scsi_address *ap, struct scsi_pkt *pkt)
2769 {
2770 	sata_hba_inst_t *sata_hba_inst =
2771 	    (sata_hba_inst_t *)(ap->a_hba_tran->tran_hba_private);
2772 	sata_pkt_txlate_t *spx = (sata_pkt_txlate_t *)pkt->pkt_ha_private;
2773 	sata_device_t *sdevice = &spx->txlt_sata_pkt->satapkt_device;
2774 	sata_drive_info_t *sdinfo = NULL;
2775 	struct buf *bp;
2776 	uint8_t cport, pmport;
2777 	boolean_t dev_gone = B_FALSE;
2778 	int rval;
2779 
2780 	SATADBG1(SATA_DBG_SCSI_IF, sata_hba_inst,
2781 	    "sata_scsi_start: cmd 0x%02x\n", pkt->pkt_cdbp[0]);
2782 
2783 	ASSERT3P(spx, !=, NULL);
2784 	ASSERT3P(spx->txlt_scsi_pkt, ==, pkt);
2785 	ASSERT3P(spx->txlt_scsi_pkt, !=, NULL);
2786 
2787 	cport = SCSI_TO_SATA_CPORT(ap->a_target);
2788 	pmport = SCSI_TO_SATA_PMPORT(ap->a_target);
2789 
2790 	mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst, cport)));
2791 
2792 	if (sdevice->satadev_addr.qual == SATA_ADDR_DCPORT) {
2793 		sdinfo = sata_get_device_info(sata_hba_inst, sdevice);
2794 		if (sdinfo == NULL ||
2795 		    SATA_CPORT_INFO(sata_hba_inst, cport)->
2796 		    cport_tgtnode_clean == B_FALSE ||
2797 		    (sdinfo->satadrv_state & SATA_DSTATE_FAILED) != 0) {
2798 			dev_gone = B_TRUE;
2799 		}
2800 	} else if (sdevice->satadev_addr.qual == SATA_ADDR_DPMPORT) {
2801 		if (SATA_CPORT_DEV_TYPE(sata_hba_inst, cport) !=
2802 		    SATA_DTYPE_PMULT || SATA_PMULT_INFO(sata_hba_inst,
2803 		    cport) == NULL) {
2804 			dev_gone = B_TRUE;
2805 		} else if (SATA_PMPORT_INFO(sata_hba_inst, cport,
2806 		    pmport) == NULL) {
2807 			dev_gone = B_TRUE;
2808 		} else {
2809 			mutex_enter(&(SATA_PMPORT_MUTEX(sata_hba_inst,
2810 			    cport, pmport)));
2811 			sdinfo = sata_get_device_info(sata_hba_inst, sdevice);
2812 			if (sdinfo == NULL ||
2813 			    SATA_PMPORT_INFO(sata_hba_inst, cport, pmport)->
2814 			    pmport_tgtnode_clean == B_FALSE ||
2815 			    (sdinfo->satadrv_state & SATA_DSTATE_FAILED) != 0) {
2816 				dev_gone = B_TRUE;
2817 			}
2818 			mutex_exit(&(SATA_PMPORT_MUTEX(sata_hba_inst,
2819 			    cport, pmport)));
2820 		}
2821 	}
2822 
2823 	if (dev_gone == B_TRUE) {
2824 		taskq_t		*tq = SATA_TXLT_TASKQ(spx);
2825 		task_func_t	*func = (task_func_t *)pkt->pkt_comp;
2826 		uint_t		flags = servicing_interrupt() ?
2827 		    TQ_NOSLEEP : TQ_SLEEP;
2828 
2829 		mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst, cport)));
2830 		pkt->pkt_reason = CMD_DEV_GONE;
2831 
2832 		/*
2833 		 * The sd target driver is checking CMD_DEV_GONE pkt_reason
2834 		 * only in the callback function (for normal requests) and
2835 		 * in the dump code path.
2836 		 *
2837 		 * If the callback is available, we need to dispatch
2838 		 * the callback rather than returning TRAN_FATAL_ERROR here.
2839 		 */
2840 		if (pkt->pkt_comp == NULL)
2841 			return (TRAN_FATAL_ERROR);
2842 
2843 		if (taskq_dispatch(tq, func, pkt, flags) == TASKQID_INVALID)
2844 			return (TRAN_BUSY);
2845 
2846 		return (TRAN_ACCEPT);
2847 	}
2848 
2849 	if (sdinfo->satadrv_type & SATA_DTYPE_ATAPI) {
2850 		mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst, cport)));
2851 		rval = sata_txlt_atapi(spx);
2852 		SATADBG1(SATA_DBG_SCSI_IF, sata_hba_inst,
2853 		    "sata_scsi_start atapi: rval %d\n", rval);
2854 		return (rval);
2855 	}
2856 
2857 	/*
2858 	 * Checking for power state, if it was on
2859 	 * STOPPED state, then the drive is not capable
2860 	 * of processing media access command.  And
2861 	 * TEST_UNIT_READY, REQUEST_SENSE has special handling
2862 	 * in the function for different power state.
2863 	 */
2864 	if (((sdinfo->satadrv_power_level == SATA_POWER_STANDBY) ||
2865 	    (sdinfo->satadrv_power_level == SATA_POWER_STOPPED)) &&
2866 	    (SATA_IS_MEDIUM_ACCESS_CMD(pkt->pkt_cdbp[0]))) {
2867 		mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst, cport)));
2868 		return (sata_txlt_check_condition(spx, KEY_NOT_READY,
2869 		    SD_SCSI_ASC_LU_NOT_READY));
2870 	}
2871 
2872 	/* ATA Disk commands processing starts here */
2873 
2874 	bp = spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp;
2875 
2876 	/*
2877 	 * Default cmd to 'invalid command'. If the SCSI OP doesn't
2878 	 * exist in sata_cmd_info, we fall back to this (which returns
2879 	 * INVALID OPERATION CODE).
2880 	 */
2881 	const struct sata_cmd_info *cmd = &scmd_invalid;
2882 
2883 	for (uint_t i = 0; i < ARRAY_SIZE(sata_cmd_info); i++) {
2884 		if (pkt->pkt_cdbp[0] != sata_cmd_info[i].sci_op)
2885 			continue;
2886 
2887 		if ((sata_cmd_info[i].sci_flags & SCF_SVC_ACT) != 0 &&
2888 		    (pkt->pkt_cdbp[1] & 0x1f) != sata_cmd_info[i].sci_svcact) {
2889 			continue;
2890 		}
2891 
2892 		cmd = &sata_cmd_info[i];
2893 		break;
2894 	}
2895 
2896 	if (cmd->sci_supported != NULL && !cmd->sci_supported(spx, sdinfo)) {
2897 		mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst, cport)));
2898 		return (sata_txlt_invalid_command(spx));
2899 	}
2900 
2901 	mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst, cport)));
2902 
2903 	if ((cmd->sci_flags & SCF_MAPIN) && bp != NULL &&
2904 	    (bp->b_flags & (B_PHYS | B_PAGEIO))) {
2905 		bp_mapin(bp);
2906 	}
2907 
2908 	rval = cmd->sci_cmd(spx);
2909 
2910 	SATADBG1(SATA_DBG_SCSI_IF, sata_hba_inst,
2911 	    "sata_scsi_start: rval %d\n", rval);
2912 
2913 	return (rval);
2914 }
2915 
2916 /*
2917  * Implementation of scsi tran_abort.
2918  * Abort specific pkt or all packets.
2919  *
2920  * Returns 1 if one or more packets were aborted, returns 0 otherwise
2921  *
2922  * May be called from an interrupt level.
2923  */
2924 static int
sata_scsi_abort(struct scsi_address * ap,struct scsi_pkt * scsi_pkt)2925 sata_scsi_abort(struct scsi_address *ap, struct scsi_pkt *scsi_pkt)
2926 {
2927 	sata_hba_inst_t *sata_hba_inst =
2928 	    (sata_hba_inst_t *)(ap->a_hba_tran->tran_hba_private);
2929 	sata_device_t	sata_device;
2930 	sata_pkt_t	*sata_pkt;
2931 
2932 	SATADBG2(SATA_DBG_SCSI_IF, sata_hba_inst,
2933 	    "sata_scsi_abort: %s at target: 0x%x\n",
2934 	    scsi_pkt == NULL ? "all packets" : "one pkt", ap->a_target);
2935 
2936 	/* Validate address */
2937 	if (sata_validate_scsi_address(sata_hba_inst, ap, &sata_device) != 0)
2938 		/* Invalid address */
2939 		return (0);
2940 
2941 	mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst,
2942 	    sata_device.satadev_addr.cport)));
2943 	if (sata_get_device_info(sata_hba_inst, &sata_device) == NULL) {
2944 		/* invalid address */
2945 		mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
2946 		    sata_device.satadev_addr.cport)));
2947 		return (0);
2948 	}
2949 	if (scsi_pkt == NULL) {
2950 		/*
2951 		 * Abort all packets.
2952 		 * Although we do not have specific packet, we still need
2953 		 * dummy packet structure to pass device address to HBA.
2954 		 * Allocate one, without sleeping. Fail if pkt cannot be
2955 		 * allocated.
2956 		 */
2957 		sata_pkt = kmem_zalloc(sizeof (sata_pkt_t), KM_NOSLEEP);
2958 		if (sata_pkt == NULL) {
2959 			mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
2960 			    sata_device.satadev_addr.cport)));
2961 			SATA_LOG_D((sata_hba_inst, CE_WARN, "sata_pkt_abort: "
2962 			    "could not allocate sata_pkt"));
2963 			return (0);
2964 		}
2965 		sata_pkt->satapkt_rev = SATA_PKT_REV;
2966 		sata_pkt->satapkt_device = sata_device;
2967 		sata_pkt->satapkt_device.satadev_rev = SATA_DEVICE_REV;
2968 	} else {
2969 		if (scsi_pkt->pkt_ha_private == NULL) {
2970 			mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
2971 			    sata_device.satadev_addr.cport)));
2972 			return (0); /* Bad scsi pkt */
2973 		}
2974 		/* extract pointer to sata pkt */
2975 		sata_pkt = ((sata_pkt_txlate_t *)scsi_pkt->pkt_ha_private)->
2976 		    txlt_sata_pkt;
2977 	}
2978 
2979 	mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
2980 	    sata_device.satadev_addr.cport)));
2981 	/* Send abort request to HBA */
2982 	if ((*SATA_ABORT_FUNC(sata_hba_inst))
2983 	    (SATA_DIP(sata_hba_inst), sata_pkt,
2984 	    scsi_pkt == NULL ? SATA_ABORT_ALL_PACKETS : SATA_ABORT_PACKET) ==
2985 	    SATA_SUCCESS) {
2986 		if (scsi_pkt == NULL)
2987 			kmem_free(sata_pkt, sizeof (sata_pkt_t));
2988 		/* Success */
2989 		return (1);
2990 	}
2991 	/* Else, something did not go right */
2992 	if (scsi_pkt == NULL)
2993 		kmem_free(sata_pkt, sizeof (sata_pkt_t));
2994 	/* Failure */
2995 	return (0);
2996 }
2997 
2998 
2999 /*
3000  * Implementation of scsi tran_reset.
3001  * RESET_ALL request is translated into port reset.
3002  * RESET_TARGET requests is translated into a device reset,
3003  * RESET_LUN request is accepted only for LUN 0 and translated into
3004  * device reset.
3005  * The target reset should cause all HBA active and queued packets to
3006  * be terminated and returned with pkt reason SATA_PKT_RESET prior to
3007  * the return. HBA should report reset event for the device.
3008  *
3009  * Returns 1 upon success, 0 upon failure.
3010  */
3011 static int
sata_scsi_reset(struct scsi_address * ap,int level)3012 sata_scsi_reset(struct scsi_address *ap, int level)
3013 {
3014 	sata_hba_inst_t	*sata_hba_inst =
3015 	    (sata_hba_inst_t *)(ap->a_hba_tran->tran_hba_private);
3016 	sata_device_t	sata_device;
3017 	int		val;
3018 
3019 	SATADBG2(SATA_DBG_SCSI_IF, sata_hba_inst,
3020 	    "sata_scsi_reset: level %d target: 0x%x\n",
3021 	    level, ap->a_target);
3022 
3023 	/* Validate address */
3024 	val = sata_validate_scsi_address(sata_hba_inst, ap, &sata_device);
3025 	if (val == -1)
3026 		/* Invalid address */
3027 		return (0);
3028 
3029 	mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst,
3030 	    sata_device.satadev_addr.cport)));
3031 	if (sata_get_device_info(sata_hba_inst, &sata_device) == NULL) {
3032 		/* invalid address */
3033 		mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
3034 		    sata_device.satadev_addr.cport)));
3035 		return (0);
3036 	}
3037 	mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
3038 	    sata_device.satadev_addr.cport)));
3039 	if (level == RESET_ALL) {
3040 		/* port reset */
3041 		if (sata_device.satadev_addr.qual == SATA_ADDR_DCPORT)
3042 			sata_device.satadev_addr.qual = SATA_ADDR_CPORT;
3043 		else
3044 			sata_device.satadev_addr.qual = SATA_ADDR_PMPORT;
3045 
3046 		if ((*SATA_RESET_DPORT_FUNC(sata_hba_inst))
3047 		    (SATA_DIP(sata_hba_inst), &sata_device) == SATA_SUCCESS)
3048 			return (1);
3049 		else
3050 			return (0);
3051 
3052 	} else if (val == 0 &&
3053 	    (level == RESET_TARGET || level == RESET_LUN)) {
3054 		/* reset device (device attached) */
3055 		if ((*SATA_RESET_DPORT_FUNC(sata_hba_inst))
3056 		    (SATA_DIP(sata_hba_inst), &sata_device) == SATA_SUCCESS)
3057 			return (1);
3058 		else
3059 			return (0);
3060 	}
3061 	return (0);
3062 }
3063 
3064 
3065 /*
3066  * Implementation of scsi tran_getcap (get transport/device capabilities).
3067  * Supported capabilities for SATA hard disks:
3068  * auto-rqsense		(always supported)
3069  * tagged-qing		(supported if HBA supports it)
3070  * untagged-qing	(could be supported if disk supports it, but because
3071  *			 caching behavior allowing untagged queuing actually
3072  *			 results in reduced performance.  sd tries to throttle
3073  *			 back to only 3 outstanding commands, which may
3074  *			 work for real SCSI disks, but with read ahead
3075  *			 caching, having more than 1 outstanding command
3076  *			 results in cache thrashing.)
3077  * sector_size
3078  * dma_max
3079  * interconnect-type	(INTERCONNECT_SATA)
3080  *
3081  * Supported capabilities for ATAPI CD/DVD devices:
3082  * auto-rqsense		(always supported)
3083  * sector_size
3084  * dma_max
3085  * max-cdb-length
3086  * interconnect-type	(INTERCONNECT_SATA)
3087  *
3088  * Supported capabilities for ATAPI TAPE devices:
3089  * auto-rqsense		(always supported)
3090  * dma_max
3091  * max-cdb-length
3092  *
3093  * Supported capabilities for SATA ATAPI hard disks:
3094  * auto-rqsense		(always supported)
3095  * interconnect-type	(INTERCONNECT_SATA)
3096  * max-cdb-length
3097  *
3098  * Request for other capabilities is rejected as unsupported.
3099  *
3100  * Returns supported capability value, or -1 if capability is unsuppported or
3101  * the address is invalid - no device.
3102  */
3103 
3104 static int
sata_scsi_getcap(struct scsi_address * ap,char * cap,int whom)3105 sata_scsi_getcap(struct scsi_address *ap, char *cap, int whom)
3106 {
3107 
3108 	sata_hba_inst_t		*sata_hba_inst =
3109 	    (sata_hba_inst_t *)(ap->a_hba_tran->tran_hba_private);
3110 	sata_device_t		sata_device;
3111 	sata_drive_info_t	*sdinfo;
3112 	ddi_dma_attr_t		adj_dma_attr;
3113 	int			rval;
3114 
3115 	SATADBG2(SATA_DBG_SCSI_IF, sata_hba_inst,
3116 	    "sata_scsi_getcap: target: 0x%x, cap: %s\n",
3117 	    ap->a_target, cap);
3118 
3119 	/*
3120 	 * We want to process the capabilities on per port granularity.
3121 	 * So, we are specifically restricting ourselves to whom != 0
3122 	 * to exclude the controller wide handling.
3123 	 */
3124 	if (cap == NULL || whom == 0)
3125 		return (-1);
3126 
3127 	if (sata_validate_scsi_address(sata_hba_inst, ap, &sata_device) != 0) {
3128 		/* Invalid address */
3129 		return (-1);
3130 	}
3131 	mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst,
3132 	    sata_device.satadev_addr.cport)));
3133 	if ((sdinfo = sata_get_device_info(sata_hba_inst, &sata_device)) ==
3134 	    NULL) {
3135 		/* invalid address */
3136 		mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
3137 		    sata_device.satadev_addr.cport)));
3138 		return (-1);
3139 	}
3140 
3141 	switch (scsi_hba_lookup_capstr(cap)) {
3142 	case SCSI_CAP_ARQ:
3143 		rval = 1;		/* ARQ supported, turned on */
3144 		break;
3145 
3146 	case SCSI_CAP_SECTOR_SIZE:
3147 		if (sdinfo->satadrv_type == SATA_DTYPE_ATADISK)
3148 			rval = SATA_DISK_SECTOR_SIZE;	/* fixed size */
3149 		else if (sdinfo->satadrv_type == SATA_DTYPE_ATAPICD)
3150 			rval = SATA_ATAPI_SECTOR_SIZE;
3151 		else rval = -1;
3152 		break;
3153 
3154 	/*
3155 	 * untagged queuing cause a performance inversion because of
3156 	 * the way sd operates.  Because of this reason we do not
3157 	 * use it when available.
3158 	 */
3159 	case SCSI_CAP_UNTAGGED_QING:
3160 		if (sdinfo->satadrv_features_enabled &
3161 		    SATA_DEV_F_E_UNTAGGED_QING)
3162 			rval = 1;	/* Untagged queuing available */
3163 		else
3164 			rval = -1;	/* Untagged queuing not available */
3165 		break;
3166 
3167 	case SCSI_CAP_TAGGED_QING:
3168 		if ((sdinfo->satadrv_features_enabled &
3169 		    SATA_DEV_F_E_TAGGED_QING) &&
3170 		    (sdinfo->satadrv_max_queue_depth > 1))
3171 			rval = 1;	/* Tagged queuing available */
3172 		else
3173 			rval = -1;	/* Tagged queuing not available */
3174 		break;
3175 
3176 	case SCSI_CAP_DMA_MAX:
3177 		sata_adjust_dma_attr(sdinfo, SATA_DMA_ATTR(sata_hba_inst),
3178 		    &adj_dma_attr);
3179 		rval = (int)adj_dma_attr.dma_attr_maxxfer;
3180 		/* We rely on the fact that dma_attr_maxxfer < 0x80000000 */
3181 		break;
3182 
3183 	case SCSI_CAP_INTERCONNECT_TYPE:
3184 		rval = INTERCONNECT_SATA;	/* SATA interconnect type */
3185 		break;
3186 
3187 	case SCSI_CAP_CDB_LEN:
3188 		if (sdinfo->satadrv_type & SATA_DTYPE_ATAPI)
3189 			rval = sdinfo->satadrv_atapi_cdb_len;
3190 		else
3191 			rval = -1;
3192 		break;
3193 
3194 	default:
3195 		rval = -1;
3196 		break;
3197 	}
3198 	mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
3199 	    sata_device.satadev_addr.cport)));
3200 	return (rval);
3201 }
3202 
3203 /*
3204  * Implementation of scsi tran_setcap
3205  *
3206  * Only SCSI_CAP_UNTAGGED_QING and  SCSI_CAP_TAGGED_QING are changeable.
3207  *
3208  */
3209 static int
sata_scsi_setcap(struct scsi_address * ap,char * cap,int value,int whom)3210 sata_scsi_setcap(struct scsi_address *ap, char *cap, int value, int whom)
3211 {
3212 	sata_hba_inst_t	*sata_hba_inst =
3213 	    (sata_hba_inst_t *)(ap->a_hba_tran->tran_hba_private);
3214 	sata_device_t	sata_device;
3215 	sata_drive_info_t	*sdinfo;
3216 	int		rval;
3217 
3218 	SATADBG2(SATA_DBG_SCSI_IF, sata_hba_inst,
3219 	    "sata_scsi_setcap: target: 0x%x, cap: %s\n", ap->a_target, cap);
3220 
3221 	/*
3222 	 * We want to process the capabilities on per port granularity.
3223 	 * So, we are specifically restricting ourselves to whom != 0
3224 	 * to exclude the controller wide handling.
3225 	 */
3226 	if (cap == NULL || whom == 0) {
3227 		return (-1);
3228 	}
3229 
3230 	if (sata_validate_scsi_address(sata_hba_inst, ap, &sata_device) != 0) {
3231 		/* Invalid address */
3232 		return (-1);
3233 	}
3234 	mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst,
3235 	    sata_device.satadev_addr.cport)));
3236 	if ((sdinfo = sata_get_device_info(sata_hba_inst,
3237 	    &sata_device)) == NULL) {
3238 		/* invalid address */
3239 		mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
3240 		    sata_device.satadev_addr.cport)));
3241 		return (-1);
3242 	}
3243 	mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
3244 	    sata_device.satadev_addr.cport)));
3245 
3246 	switch (scsi_hba_lookup_capstr(cap)) {
3247 	case SCSI_CAP_ARQ:
3248 	case SCSI_CAP_SECTOR_SIZE:
3249 	case SCSI_CAP_DMA_MAX:
3250 	case SCSI_CAP_INTERCONNECT_TYPE:
3251 		rval = 0;
3252 		break;
3253 	case SCSI_CAP_UNTAGGED_QING:
3254 		if (SATA_QDEPTH(sata_hba_inst) > 1) {
3255 			rval = 1;
3256 			if (value == 1) {
3257 				sdinfo->satadrv_features_enabled |=
3258 				    SATA_DEV_F_E_UNTAGGED_QING;
3259 			} else if (value == 0) {
3260 				sdinfo->satadrv_features_enabled &=
3261 				    ~SATA_DEV_F_E_UNTAGGED_QING;
3262 			} else {
3263 				rval = -1;
3264 			}
3265 		} else {
3266 			rval = 0;
3267 		}
3268 		break;
3269 	case SCSI_CAP_TAGGED_QING:
3270 		/* This can TCQ or NCQ */
3271 		if (sata_func_enable & SATA_ENABLE_QUEUING &&
3272 		    ((sdinfo->satadrv_features_support & SATA_DEV_F_TCQ &&
3273 		    SATA_FEATURES(sata_hba_inst) & SATA_CTLF_QCMD) ||
3274 		    (sata_func_enable & SATA_ENABLE_NCQ &&
3275 		    sdinfo->satadrv_features_support & SATA_DEV_F_NCQ &&
3276 		    SATA_FEATURES(sata_hba_inst) & SATA_CTLF_NCQ)) &&
3277 		    (sdinfo->satadrv_max_queue_depth > 1)) {
3278 			rval = 1;
3279 			if (value == 1) {
3280 				sdinfo->satadrv_features_enabled |=
3281 				    SATA_DEV_F_E_TAGGED_QING;
3282 			} else if (value == 0) {
3283 				sdinfo->satadrv_features_enabled &=
3284 				    ~SATA_DEV_F_E_TAGGED_QING;
3285 			} else {
3286 				rval = -1;
3287 			}
3288 		} else {
3289 			rval = 0;
3290 		}
3291 		break;
3292 	default:
3293 		rval = -1;
3294 		break;
3295 	}
3296 	return (rval);
3297 }
3298 
3299 /*
3300  * Implementations of scsi tran_destroy_pkt.
3301  * Free resources allocated by sata_scsi_init_pkt()
3302  */
3303 static void
sata_scsi_destroy_pkt(struct scsi_address * ap,struct scsi_pkt * pkt)3304 sata_scsi_destroy_pkt(struct scsi_address *ap, struct scsi_pkt *pkt)
3305 {
3306 	sata_pkt_txlate_t *spx;
3307 
3308 	spx = (sata_pkt_txlate_t *)pkt->pkt_ha_private;
3309 
3310 	sata_common_free_dma_rsrcs(spx);
3311 
3312 	spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp = NULL;
3313 	sata_pkt_free(spx);
3314 
3315 	scsi_hba_pkt_free(ap, pkt);
3316 }
3317 
3318 /*
3319  * Implementation of scsi tran_dmafree.
3320  * Free DMA resources allocated by sata_scsi_init_pkt()
3321  */
3322 
3323 static void
sata_scsi_dmafree(struct scsi_address * ap,struct scsi_pkt * pkt)3324 sata_scsi_dmafree(struct scsi_address *ap, struct scsi_pkt *pkt)
3325 {
3326 #ifndef __lock_lint
3327 	_NOTE(ARGUNUSED(ap))
3328 #endif
3329 	sata_pkt_txlate_t *spx;
3330 
3331 	ASSERT(pkt != NULL);
3332 	spx = (sata_pkt_txlate_t *)pkt->pkt_ha_private;
3333 
3334 	sata_common_free_dma_rsrcs(spx);
3335 }
3336 
3337 /*
3338  * Implementation of scsi tran_sync_pkt.
3339  *
3340  * The assumption below is that pkt is unique - there is no need to check ap
3341  *
3342  * Synchronize DMA buffer and, if the intermediate buffer is used, copy data
3343  * into/from the real buffer.
3344  */
3345 static void
sata_scsi_sync_pkt(struct scsi_address * ap __unused,struct scsi_pkt * pkt)3346 sata_scsi_sync_pkt(struct scsi_address *ap __unused, struct scsi_pkt *pkt)
3347 {
3348 	sata_pkt_txlate_t *spx = (sata_pkt_txlate_t *)pkt->pkt_ha_private;
3349 	struct buf *bp;
3350 	int direction;
3351 	int rval;
3352 
3353 	ASSERT(spx != NULL);
3354 	if (spx->txlt_buf_dma_handle == NULL)
3355 		return;
3356 
3357 	if (spx->txlt_sata_pkt == NULL)
3358 		return;
3359 
3360 	direction = spx->txlt_sata_pkt->
3361 	    satapkt_cmd.satacmd_flags.sata_data_direction;
3362 
3363 	if (direction == SATA_DIR_NODATA_XFER)
3364 		return;
3365 
3366 	bp = spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp;
3367 
3368 	if (spx->txlt_tmp_buf != NULL && (direction & SATA_DIR_WRITE) != 0) {
3369 		/* Intermediate DMA buffer used */
3370 		bcopy(bp->b_un.b_addr, spx->txlt_tmp_buf, bp->b_bcount);
3371 	}
3372 
3373 	/* Sync the buffer for device or for CPU */
3374 	rval = ddi_dma_sync(spx->txlt_buf_dma_handle, 0, 0,
3375 	    (direction & SATA_DIR_WRITE) ?
3376 	    DDI_DMA_SYNC_FORDEV : DDI_DMA_SYNC_FORCPU);
3377 	ASSERT3S(rval, ==, DDI_SUCCESS);
3378 
3379 	if (spx->txlt_tmp_buf != NULL && !(direction & SATA_DIR_WRITE)) {
3380 		/* Intermediate DMA buffer used for read */
3381 		bcopy(spx->txlt_tmp_buf, bp->b_un.b_addr, bp->b_bcount);
3382 	}
3383 }
3384 
3385 
3386 
3387 /* *******************  SATA - SCSI Translation functions **************** */
3388 /*
3389  * SCSI to SATA pkt and command translation and SATA to SCSI status/error
3390  * translation.
3391  */
3392 
3393 /*
3394  * Checks if a device exists and can be access and translates common
3395  * scsi_pkt data to sata_pkt data.
3396  *
3397  * Flag argument indicates that a non-read/write ATA command may be sent
3398  * to HBA in arbitrary SYNC mode to execute this packet.
3399  *
3400  * Returns TRAN_ACCEPT and scsi pkt_reason CMD_CMPLT if device exists and
3401  * sata_pkt was set-up.
3402  * Returns TRAN_ACCEPT and scsi pkt_reason CMD_DEV_GONE if device does not
3403  * exist and pkt_comp callback was scheduled.
3404  * Returns other TRAN_XXXXX values when error occured and command should be
3405  * rejected with the returned TRAN_XXXXX value.
3406  *
3407  * This function should be called with port mutex held.
3408  */
3409 static int
sata_txlt_generic_pkt_info(sata_pkt_txlate_t * spx,int * reason,int flag)3410 sata_txlt_generic_pkt_info(sata_pkt_txlate_t *spx, int *reason, int flag)
3411 {
3412 	sata_drive_info_t *sdinfo;
3413 	sata_device_t sata_device;
3414 	const struct sata_cmd_flags sata_initial_cmd_flags = {
3415 		SATA_DIR_NODATA_XFER,
3416 		/* all other values to 0/FALSE */
3417 	};
3418 	/*
3419 	 * Pkt_reason has to be set if the pkt_comp callback is invoked,
3420 	 * and that implies TRAN_ACCEPT return value. Any other returned value
3421 	 * indicates that the scsi packet was not accepted (the reason will not
3422 	 * be checked by the scsi target driver).
3423 	 * To make debugging easier, we set pkt_reason to know value here.
3424 	 * It may be changed later when different completion reason is
3425 	 * determined.
3426 	 */
3427 	spx->txlt_scsi_pkt->pkt_reason = CMD_TRAN_ERR;
3428 	*reason = CMD_TRAN_ERR;
3429 
3430 	/* Validate address */
3431 	switch (sata_validate_scsi_address(spx->txlt_sata_hba_inst,
3432 	    &spx->txlt_scsi_pkt->pkt_address, &sata_device)) {
3433 
3434 	case -1:
3435 		/* Invalid address or invalid device type */
3436 		return (TRAN_BADPKT);
3437 	case 2:
3438 		/*
3439 		 * Valid address but device type is unknown - Chack if it is
3440 		 * in the reset state and therefore in an indeterminate state.
3441 		 */
3442 		sdinfo = sata_get_device_info(spx->txlt_sata_hba_inst,
3443 		    &spx->txlt_sata_pkt->satapkt_device);
3444 		if (sdinfo != NULL && (sdinfo->satadrv_event_flags &
3445 		    (SATA_EVNT_DEVICE_RESET |
3446 		    SATA_EVNT_INPROC_DEVICE_RESET)) != 0) {
3447 			if (!ddi_in_panic()) {
3448 				spx->txlt_scsi_pkt->pkt_reason = CMD_INCOMPLETE;
3449 				*reason = CMD_INCOMPLETE;
3450 				SATADBG1(SATA_DBG_SCSI_IF,
3451 				    spx->txlt_sata_hba_inst,
3452 				    "sata_scsi_start: rejecting command "
3453 				    "because of device reset state\n", NULL);
3454 				return (TRAN_BUSY);
3455 			}
3456 		}
3457 		/* FALLTHROUGH */
3458 	case 1:
3459 		/* valid address but no valid device - it has disappeared */
3460 		spx->txlt_scsi_pkt->pkt_reason = CMD_DEV_GONE;
3461 		*reason = CMD_DEV_GONE;
3462 		/*
3463 		 * The sd target driver is checking CMD_DEV_GONE pkt_reason
3464 		 * only in callback function (for normal requests) and
3465 		 * in the dump code path.
3466 		 * So, if the callback is available, we need to do
3467 		 * the callback rather than returning TRAN_FATAL_ERROR here.
3468 		 */
3469 		if (spx->txlt_scsi_pkt->pkt_comp != NULL) {
3470 			/* scsi callback required */
3471 			if (servicing_interrupt()) {
3472 				if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
3473 				    (task_func_t *)spx->txlt_scsi_pkt->pkt_comp,
3474 				    (void *)spx->txlt_scsi_pkt, TQ_NOSLEEP) ==
3475 				    TASKQID_INVALID) {
3476 					return (TRAN_BUSY);
3477 				}
3478 			} else if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
3479 			    (task_func_t *)spx->txlt_scsi_pkt->pkt_comp,
3480 			    spx->txlt_scsi_pkt, TQ_SLEEP) == TASKQID_INVALID) {
3481 				/* Scheduling the callback failed */
3482 				return (TRAN_BUSY);
3483 			}
3484 
3485 			return (TRAN_ACCEPT);
3486 		}
3487 		return (TRAN_FATAL_ERROR);
3488 	default:
3489 		/* all OK; pkt reason will be overwritten later */
3490 		break;
3491 	}
3492 	/*
3493 	 * If pkt is to be executed in polling mode and a command will not be
3494 	 * emulated in SATA module (requires sending a non-read/write ATA
3495 	 * command to HBA driver in arbitrary SYNC mode) and we are in the
3496 	 * interrupt context and not in the panic dump, then reject the packet
3497 	 * to avoid a possible interrupt stack overrun or hang caused by
3498 	 * a potentially blocked interrupt.
3499 	 */
3500 	if (((spx->txlt_scsi_pkt->pkt_flags & FLAG_NOINTR) != 0 || flag != 0) &&
3501 	    servicing_interrupt() && !ddi_in_panic()) {
3502 		SATADBG1(SATA_DBG_INTR_CTX, spx->txlt_sata_hba_inst,
3503 		    "sata_scsi_start: rejecting synchronous command because "
3504 		    "of interrupt context\n", NULL);
3505 		return (TRAN_BUSY);
3506 	}
3507 
3508 	sdinfo = sata_get_device_info(spx->txlt_sata_hba_inst,
3509 	    &spx->txlt_sata_pkt->satapkt_device);
3510 
3511 	/*
3512 	 * If device is in reset condition, reject the packet with
3513 	 * TRAN_BUSY, unless:
3514 	 * 1. system is panicking (dumping)
3515 	 * In such case only one thread is running and there is no way to
3516 	 * process reset.
3517 	 * 2. cfgadm operation is is progress (internal APCTL lock is set)
3518 	 * Some cfgadm operations involve drive commands, so reset condition
3519 	 * needs to be ignored for IOCTL operations.
3520 	 */
3521 	if ((sdinfo->satadrv_event_flags &
3522 	    (SATA_EVNT_DEVICE_RESET | SATA_EVNT_INPROC_DEVICE_RESET)) != 0) {
3523 
3524 		if (!ddi_in_panic() &&
3525 		    ((SATA_CPORT_EVENT_FLAGS(spx->txlt_sata_hba_inst,
3526 		    sata_device.satadev_addr.cport) &
3527 		    SATA_APCTL_LOCK_PORT_BUSY) == 0)) {
3528 			spx->txlt_scsi_pkt->pkt_reason = CMD_INCOMPLETE;
3529 			*reason = CMD_INCOMPLETE;
3530 			SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
3531 			    "sata_scsi_start: rejecting command because "
3532 			    "of device reset state\n", NULL);
3533 			return (TRAN_BUSY);
3534 		}
3535 	}
3536 
3537 	/*
3538 	 * Fix the dev_type in the sata_pkt->satapkt_device. It was not set by
3539 	 * sata_scsi_pkt_init() because pkt init had to work also with
3540 	 * non-existing devices.
3541 	 * Now we know that the packet was set-up for a real device, so its
3542 	 * type is known.
3543 	 */
3544 	spx->txlt_sata_pkt->satapkt_device.satadev_type = sdinfo->satadrv_type;
3545 
3546 	spx->txlt_sata_pkt->satapkt_cmd.satacmd_flags = sata_initial_cmd_flags;
3547 	if ((SATA_CPORT_INFO(spx->txlt_sata_hba_inst,
3548 	    sata_device.satadev_addr.cport)->cport_event_flags &
3549 	    SATA_APCTL_LOCK_PORT_BUSY) != 0) {
3550 		spx->txlt_sata_pkt->satapkt_cmd.satacmd_flags.
3551 		    sata_ignore_dev_reset = B_TRUE;
3552 	}
3553 	/*
3554 	 * At this point the generic translation routine determined that the
3555 	 * scsi packet should be accepted. Packet completion reason may be
3556 	 * changed later when a different completion reason is determined.
3557 	 */
3558 	spx->txlt_scsi_pkt->pkt_reason = CMD_CMPLT;
3559 	*reason = CMD_CMPLT;
3560 
3561 	if ((spx->txlt_scsi_pkt->pkt_flags & FLAG_NOINTR) != 0) {
3562 		/* Synchronous execution */
3563 		spx->txlt_sata_pkt->satapkt_op_mode = SATA_OPMODE_SYNCH |
3564 		    SATA_OPMODE_POLLING;
3565 		spx->txlt_sata_pkt->satapkt_cmd.satacmd_flags.
3566 		    sata_ignore_dev_reset = ddi_in_panic();
3567 	} else {
3568 		/* Asynchronous execution */
3569 		spx->txlt_sata_pkt->satapkt_op_mode = SATA_OPMODE_ASYNCH |
3570 		    SATA_OPMODE_INTERRUPTS;
3571 	}
3572 	/* Convert queuing information */
3573 	if (spx->txlt_scsi_pkt->pkt_flags & FLAG_STAG)
3574 		spx->txlt_sata_pkt->satapkt_cmd.satacmd_flags.sata_queue_stag =
3575 		    B_TRUE;
3576 	else if (spx->txlt_scsi_pkt->pkt_flags &
3577 	    (FLAG_OTAG | FLAG_HTAG | FLAG_HEAD))
3578 		spx->txlt_sata_pkt->satapkt_cmd.satacmd_flags.sata_queue_otag =
3579 		    B_TRUE;
3580 
3581 	/* Always limit pkt time */
3582 	if (spx->txlt_scsi_pkt->pkt_time == 0)
3583 		spx->txlt_sata_pkt->satapkt_time = sata_default_pkt_time;
3584 	else
3585 		/* Pass on scsi_pkt time */
3586 		spx->txlt_sata_pkt->satapkt_time =
3587 		    spx->txlt_scsi_pkt->pkt_time;
3588 
3589 	return (TRAN_ACCEPT);
3590 }
3591 
3592 
3593 /*
3594  * Translate ATA Identify Device data to SCSI Inquiry data.
3595  * This function may be called only for ATA devices.
3596  * This function should not be called for ATAPI devices - they
3597  * respond directly to SCSI Inquiry command.
3598  *
3599  * SATA Identify Device data has to be valid in sata_drive_info.
3600  * Buffer has to accomodate the inquiry length (36 bytes).
3601  *
3602  * This function should be called with a port mutex held.
3603  */
3604 static	void
sata_identdev_to_inquiry(sata_hba_inst_t * sata_hba_inst,sata_drive_info_t * sdinfo,uint8_t * buf)3605 sata_identdev_to_inquiry(sata_hba_inst_t *sata_hba_inst,
3606     sata_drive_info_t *sdinfo, uint8_t *buf)
3607 {
3608 
3609 	struct scsi_inquiry *inq = (struct scsi_inquiry *)buf;
3610 	struct sata_id *sid = &sdinfo->satadrv_id;
3611 
3612 	/* Start with a nice clean slate */
3613 	bzero((void *)inq, sizeof (struct scsi_inquiry));
3614 
3615 	/*
3616 	 * Rely on the dev_type for setting paripheral qualifier.
3617 	 * Assume that  DTYPE_RODIRECT applies to CD/DVD R/W devices.
3618 	 * It could be that DTYPE_OPTICAL could also qualify in the future.
3619 	 * ATAPI Inquiry may provide more data to the target driver.
3620 	 */
3621 	inq->inq_dtype = sdinfo->satadrv_type == SATA_DTYPE_ATADISK ?
3622 	    DTYPE_DIRECT : DTYPE_RODIRECT; /* DTYPE_UNKNOWN; */
3623 
3624 	/* CFA type device is not a removable media device */
3625 	inq->inq_rmb = ((sid->ai_config != SATA_CFA_TYPE) &&
3626 	    (sid->ai_config & SATA_REM_MEDIA)) ? 1 : 0;
3627 	inq->inq_qual = 0;	/* Device type qualifier (obsolete in SCSI3? */
3628 	inq->inq_iso = 0;	/* ISO version */
3629 	inq->inq_ecma = 0;	/* ECMA version */
3630 	inq->inq_ansi = 3;	/* ANSI version - SCSI 3 */
3631 	inq->inq_aenc = 0;	/* Async event notification cap. */
3632 	inq->inq_trmiop = 0;	/* Supports TERMINATE I/O PROC msg - NO */
3633 	inq->inq_normaca = 0;	/* setting NACA bit supported - NO */
3634 	inq->inq_rdf = RDF_SCSI2; /* Response data format- SPC-3 */
3635 	inq->inq_len = 31;	/* Additional length */
3636 	inq->inq_dualp = 0;	/* dual port device - NO */
3637 	inq->inq_reladdr = 0;	/* Supports relative addressing - NO */
3638 	inq->inq_sync = 0;	/* Supports synchronous data xfers - NO */
3639 	inq->inq_linked = 0;	/* Supports linked commands - NO */
3640 				/*
3641 				 * Queuing support - controller has to
3642 				 * support some sort of command queuing.
3643 				 */
3644 	if (SATA_QDEPTH(sata_hba_inst) > 1)
3645 		inq->inq_cmdque = 1; /* Supports command queueing - YES */
3646 	else
3647 		inq->inq_cmdque = 0; /* Supports command queueing - NO */
3648 	inq->inq_sftre = 0;	/* Supports Soft Reset option - NO ??? */
3649 	inq->inq_wbus32 = 0;	/* Supports 32 bit wide data xfers - NO */
3650 	inq->inq_wbus16 = 0;	/* Supports 16 bit wide data xfers - NO */
3651 
3652 #ifdef	_LITTLE_ENDIAN
3653 	/* Swap text fields to match SCSI format */
3654 	bcopy("ATA     ", inq->inq_vid, 8);		/* Vendor ID */
3655 	swab(sid->ai_model, inq->inq_pid, 16);		/* Product ID */
3656 	if (strncmp(&sid->ai_fw[4], "    ", 4) == 0)
3657 		swab(sid->ai_fw, inq->inq_revision, 4);	/* Revision level */
3658 	else
3659 		swab(&sid->ai_fw[4], inq->inq_revision, 4);	/* Rev. level */
3660 #else	/* _LITTLE_ENDIAN */
3661 	bcopy("ATA     ", inq->inq_vid, 8);		/* Vendor ID */
3662 	bcopy(sid->ai_model, inq->inq_pid, 16);		/* Product ID */
3663 	if (strncmp(&sid->ai_fw[4], "    ", 4) == 0)
3664 		bcopy(sid->ai_fw, inq->inq_revision, 4); /* Revision level */
3665 	else
3666 		bcopy(&sid->ai_fw[4], inq->inq_revision, 4); /* Rev. level */
3667 #endif	/* _LITTLE_ENDIAN */
3668 }
3669 
3670 
3671 /*
3672  * Scsi response set up for invalid command (command not supported)
3673  *
3674  * Returns TRAN_ACCEPT and appropriate values in scsi_pkt fields.
3675  */
3676 static int
sata_txlt_invalid_command(sata_pkt_txlate_t * spx)3677 sata_txlt_invalid_command(sata_pkt_txlate_t *spx)
3678 {
3679 	struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
3680 	struct scsi_extended_sense *sense;
3681 
3682 	scsipkt->pkt_reason = CMD_CMPLT;
3683 	scsipkt->pkt_state = STATE_GOT_BUS | STATE_GOT_TARGET |
3684 	    STATE_SENT_CMD | STATE_GOT_STATUS;
3685 
3686 	*scsipkt->pkt_scbp = STATUS_CHECK;
3687 
3688 	sense = sata_arq_sense(spx);
3689 	sense->es_key = KEY_ILLEGAL_REQUEST;
3690 	sense->es_add_code = SD_SCSI_ASC_INVALID_COMMAND_CODE;
3691 
3692 	SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
3693 	    "Scsi_pkt completion reason %x\n", scsipkt->pkt_reason);
3694 
3695 	if ((scsipkt->pkt_flags & FLAG_NOINTR) == 0 &&
3696 	    scsipkt->pkt_comp != NULL) {
3697 		/* scsi callback required */
3698 		if (servicing_interrupt()) {
3699 			if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
3700 			    (task_func_t *)spx->txlt_scsi_pkt->pkt_comp,
3701 			    (void *)spx->txlt_scsi_pkt, TQ_NOSLEEP) ==
3702 			    TASKQID_INVALID) {
3703 				return (TRAN_BUSY);
3704 			}
3705 		} else if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
3706 		    (task_func_t *)spx->txlt_scsi_pkt->pkt_comp,
3707 		    (void *)spx->txlt_scsi_pkt, TQ_SLEEP) == TASKQID_INVALID) {
3708 			/* Scheduling the callback failed */
3709 			return (TRAN_BUSY);
3710 		}
3711 	}
3712 	return (TRAN_ACCEPT);
3713 }
3714 
3715 /*
3716  * Scsi response set up for check condition with special sense key
3717  * and additional sense code.
3718  *
3719  * Returns TRAN_ACCEPT and appropriate values in scsi_pkt fields.
3720  */
3721 static int
sata_txlt_check_condition(sata_pkt_txlate_t * spx,uchar_t key,uchar_t code)3722 sata_txlt_check_condition(sata_pkt_txlate_t *spx, uchar_t key, uchar_t code)
3723 {
3724 	sata_hba_inst_t *shi = SATA_TXLT_HBA_INST(spx);
3725 	int cport = SATA_TXLT_CPORT(spx);
3726 	struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
3727 	struct scsi_extended_sense *sense;
3728 
3729 	mutex_enter(&SATA_CPORT_MUTEX(shi, cport));
3730 	scsipkt->pkt_reason = CMD_CMPLT;
3731 	scsipkt->pkt_state = STATE_GOT_BUS | STATE_GOT_TARGET |
3732 	    STATE_SENT_CMD | STATE_GOT_STATUS;
3733 
3734 	*scsipkt->pkt_scbp = STATUS_CHECK;
3735 
3736 	sense = sata_arq_sense(spx);
3737 	sense->es_key = key;
3738 	sense->es_add_code = code;
3739 
3740 	mutex_exit(&SATA_CPORT_MUTEX(shi, cport));
3741 
3742 	SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
3743 	    "Scsi_pkt completion reason %x\n", scsipkt->pkt_reason);
3744 
3745 	if ((scsipkt->pkt_flags & FLAG_NOINTR) == 0 &&
3746 	    scsipkt->pkt_comp != NULL) {
3747 		/* scsi callback required */
3748 		if (servicing_interrupt()) {
3749 			if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
3750 			    (task_func_t *)spx->txlt_scsi_pkt->pkt_comp,
3751 			    (void *)spx->txlt_scsi_pkt, TQ_NOSLEEP) ==
3752 			    TASKQID_INVALID) {
3753 				return (TRAN_BUSY);
3754 			}
3755 		} else if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
3756 		    (task_func_t *)spx->txlt_scsi_pkt->pkt_comp,
3757 		    (void *)spx->txlt_scsi_pkt, TQ_SLEEP) == TASKQID_INVALID) {
3758 			/* Scheduling the callback failed */
3759 			return (TRAN_BUSY);
3760 		}
3761 	}
3762 	return (TRAN_ACCEPT);
3763 }
3764 
3765 /*
3766  * Scsi response setup for
3767  * emulated non-data command that requires no action/return data
3768  *
3769  * Returns TRAN_ACCEPT and appropriate values in scsi_pkt fields.
3770  */
3771 static	int
sata_txlt_nodata_cmd_immediate(sata_pkt_txlate_t * spx)3772 sata_txlt_nodata_cmd_immediate(sata_pkt_txlate_t *spx)
3773 {
3774 	int rval;
3775 	int reason;
3776 	kmutex_t *cport_mutex =  &(SATA_TXLT_CPORT_MUTEX(spx));
3777 
3778 	mutex_enter(cport_mutex);
3779 
3780 	if (((rval = sata_txlt_generic_pkt_info(spx, &reason, 0)) !=
3781 	    TRAN_ACCEPT) || (reason == CMD_DEV_GONE)) {
3782 		mutex_exit(cport_mutex);
3783 		return (rval);
3784 	}
3785 	mutex_exit(cport_mutex);
3786 
3787 	spx->txlt_scsi_pkt->pkt_state = STATE_GOT_BUS | STATE_GOT_TARGET |
3788 	    STATE_SENT_CMD | STATE_GOT_STATUS;
3789 	spx->txlt_scsi_pkt->pkt_reason = CMD_CMPLT;
3790 	*(spx->txlt_scsi_pkt->pkt_scbp) = STATUS_GOOD;
3791 
3792 	SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
3793 	    "Scsi_pkt completion reason %x\n",
3794 	    spx->txlt_scsi_pkt->pkt_reason);
3795 
3796 	if ((spx->txlt_scsi_pkt->pkt_flags & FLAG_NOINTR) == 0 &&
3797 	    spx->txlt_scsi_pkt->pkt_comp != NULL) {
3798 		/* scsi callback required */
3799 		if (servicing_interrupt()) {
3800 			if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
3801 			    (task_func_t *)spx->txlt_scsi_pkt->pkt_comp,
3802 			    (void *)spx->txlt_scsi_pkt, TQ_NOSLEEP) ==
3803 			    TASKQID_INVALID) {
3804 				return (TRAN_BUSY);
3805 			}
3806 		} else if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
3807 		    (task_func_t *)spx->txlt_scsi_pkt->pkt_comp,
3808 		    (void *)spx->txlt_scsi_pkt, TQ_SLEEP) == TASKQID_INVALID) {
3809 			/* Scheduling the callback failed */
3810 			return (TRAN_BUSY);
3811 		}
3812 	}
3813 	return (TRAN_ACCEPT);
3814 }
3815 
3816 
3817 /*
3818  * SATA translate command: Inquiry / Identify Device
3819  * Use cached Identify Device data for now, rather than issuing actual
3820  * Device Identify cmd request. If device is detached and re-attached,
3821  * asynchronous event processing should fetch and refresh Identify Device
3822  * data.
3823  * VPD pages supported now:
3824  * Vital Product Data page
3825  * Unit Serial Number page
3826  * Block Device Characteristics Page
3827  * ATA Information Page
3828  *
3829  * Returns TRAN_ACCEPT and appropriate values in scsi_pkt fields.
3830  */
3831 
3832 #define	EVPD			1	/* Extended Vital Product Data flag */
3833 #define	CMDDT			2	/* Command Support Data - Obsolete */
3834 #define	INQUIRY_SUP_VPD_PAGE	0	/* Supported VPD Pages Page Code */
3835 #define	INQUIRY_USN_PAGE	0x80	/* Unit Serial Number Page Code */
3836 #define	INQUIRY_BDC_PAGE	0xB1	/* Block Device Characteristics Page */
3837 					/* Code */
3838 #define	INQUIRY_ATA_INFO_PAGE	0x89	/* ATA Information Page Code */
3839 #define	INQUIRY_DEV_IDENTIFICATION_PAGE 0x83 /* Device identifiers */
3840 
3841 static int
sata_txlt_inquiry(sata_pkt_txlate_t * spx)3842 sata_txlt_inquiry(sata_pkt_txlate_t *spx)
3843 {
3844 	struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
3845 	struct buf *bp = spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp;
3846 	sata_drive_info_t *sdinfo;
3847 	struct scsi_extended_sense *sense;
3848 	int count;
3849 	uint8_t *p;
3850 	int i, j;
3851 	uint8_t page_buf[1024]; /* Max length */
3852 	int rval, reason;
3853 	ushort_t rate;
3854 	kmutex_t *cport_mutex = &(SATA_TXLT_CPORT_MUTEX(spx));
3855 
3856 	/*
3857 	 * sata_txlt_generic_pkt_info() and sata_get_device_info() require
3858 	 * cport_mutex to be held while they are called. sdinfo is also
3859 	 * protected by cport_mutex, so we hold cport_mutex until after we've
3860 	 * finished using sdinfo.
3861 	 */
3862 	mutex_enter(cport_mutex);
3863 
3864 	if (((rval = sata_txlt_generic_pkt_info(spx, &reason, 0)) !=
3865 	    TRAN_ACCEPT) || (reason == CMD_DEV_GONE)) {
3866 		mutex_exit(cport_mutex);
3867 		return (rval);
3868 	}
3869 
3870 	sdinfo = sata_get_device_info(spx->txlt_sata_hba_inst,
3871 	    &spx->txlt_sata_pkt->satapkt_device);
3872 
3873 	ASSERT(sdinfo != NULL);
3874 
3875 	scsipkt->pkt_reason = CMD_CMPLT;
3876 	scsipkt->pkt_state = STATE_GOT_BUS | STATE_GOT_TARGET |
3877 	    STATE_SENT_CMD | STATE_GOT_STATUS;
3878 
3879 	/* Reject not supported request */
3880 	if (scsipkt->pkt_cdbp[1] & CMDDT) { /* No support for this bit */
3881 		*scsipkt->pkt_scbp = STATUS_CHECK;
3882 		sense = sata_arq_sense(spx);
3883 		sense->es_key = KEY_ILLEGAL_REQUEST;
3884 		sense->es_add_code = SD_SCSI_ASC_INVALID_FIELD_IN_CDB;
3885 		goto done;
3886 	}
3887 
3888 	/* Valid Inquiry request */
3889 	*scsipkt->pkt_scbp = STATUS_GOOD;
3890 
3891 	if (bp == NULL || bp->b_un.b_addr == NULL || bp->b_bcount == 0)
3892 		goto done;
3893 
3894 	/*
3895 	 * Because it is fully emulated command storing data
3896 	 * programatically in the specified buffer, release
3897 	 * preallocated DMA resources before storing data in the buffer,
3898 	 * so no unwanted DMA sync would take place.
3899 	 */
3900 	sata_scsi_dmafree(NULL, scsipkt);
3901 
3902 	if (!(scsipkt->pkt_cdbp[1] & EVPD)) {
3903 		/* Standard Inquiry Data request */
3904 		struct scsi_inquiry inq;
3905 		unsigned int bufsize;
3906 
3907 		sata_identdev_to_inquiry(spx->txlt_sata_hba_inst,
3908 		    sdinfo, (uint8_t *)&inq);
3909 		/* Copy no more than requested */
3910 		count = MIN(bp->b_bcount, sizeof (struct scsi_inquiry));
3911 		bufsize = scsipkt->pkt_cdbp[4];
3912 		bufsize |= scsipkt->pkt_cdbp[3] << 8;
3913 		count = MIN(count, bufsize);
3914 		bcopy(&inq, bp->b_un.b_addr, count);
3915 
3916 		scsipkt->pkt_state |= STATE_XFERRED_DATA;
3917 		scsipkt->pkt_resid = scsipkt->pkt_cdbp[4] > count ?
3918 		    bufsize - count : 0;
3919 		goto done;
3920 	}
3921 
3922 	/*
3923 	 * peripheral_qualifier = 0;
3924 	 *
3925 	 * We are dealing only with HD and will be
3926 	 * dealing with CD/DVD devices soon
3927 	 */
3928 	uint8_t peripheral_device_type =
3929 	    sdinfo->satadrv_type == SATA_DTYPE_ATADISK ?
3930 	    DTYPE_DIRECT : DTYPE_RODIRECT;
3931 
3932 	bzero(page_buf, sizeof (page_buf));
3933 
3934 	switch ((uint_t)scsipkt->pkt_cdbp[2]) {
3935 	case INQUIRY_SUP_VPD_PAGE:
3936 		/*
3937 		 * Request for supported Vital Product Data pages.
3938 		 */
3939 		page_buf[0] = peripheral_device_type;
3940 		page_buf[1] = INQUIRY_SUP_VPD_PAGE;
3941 		page_buf[2] = 0;
3942 		page_buf[4] = INQUIRY_SUP_VPD_PAGE;
3943 		page_buf[5] = INQUIRY_USN_PAGE;
3944 		page_buf[6] = INQUIRY_BDC_PAGE;
3945 		/*
3946 		 * If WWN info is present, provide a page for it.
3947 		 * Modern drives always have, but some legacy ones do not.
3948 		 */
3949 		if (sdinfo->satadrv_id.ai_naa_ieee_oui != 0) {
3950 			page_buf[3] = 5; /* page length */
3951 			page_buf[7] = INQUIRY_DEV_IDENTIFICATION_PAGE;
3952 			page_buf[8] = INQUIRY_ATA_INFO_PAGE;
3953 			count = 9;
3954 		} else {
3955 			page_buf[3] = 4; /* page length */
3956 			page_buf[7] = INQUIRY_ATA_INFO_PAGE;
3957 			count = 8;
3958 		}
3959 		/* Copy no more than requested */
3960 		count = MIN(bp->b_bcount, count);
3961 		bcopy(page_buf, bp->b_un.b_addr, count);
3962 		break;
3963 
3964 	case INQUIRY_USN_PAGE:
3965 		/*
3966 		 * Request for Unit Serial Number page.
3967 		 * Set-up the page.
3968 		 */
3969 		page_buf[0] = peripheral_device_type;
3970 		page_buf[1] = INQUIRY_USN_PAGE;
3971 		page_buf[2] = 0;
3972 		/* remaining page length */
3973 		page_buf[3] = SATA_ID_SERIAL_LEN;
3974 
3975 		/*
3976 		 * Copy serial number from Identify Device data
3977 		 * words into the inquiry page and swap bytes
3978 		 * when necessary.
3979 		 */
3980 		p = (uint8_t *)(sdinfo->satadrv_id.ai_drvser);
3981 #ifdef	_LITTLE_ENDIAN
3982 		swab(p, &page_buf[4], SATA_ID_SERIAL_LEN);
3983 #else
3984 		bcopy(p, &page_buf[4], SATA_ID_SERIAL_LEN);
3985 #endif
3986 		/*
3987 		 * Least significant character of the serial
3988 		 * number shall appear as the last byte,
3989 		 * according to SBC-3 spec.
3990 		 * Count trailing spaces to determine the
3991 		 * necessary shift length.
3992 		 */
3993 		p = &page_buf[SATA_ID_SERIAL_LEN + 4 - 1];
3994 		for (j = 0; j < SATA_ID_SERIAL_LEN; j++) {
3995 			if (*(p - j) != '\0' && *(p - j) != '\040')
3996 				break;
3997 		}
3998 
3999 		/*
4000 		 * Shift SN string right, so that the last
4001 		 * non-blank character would appear in last
4002 		 * byte of SN field in the page.
4003 		 * 'j' is the shift length.
4004 		 */
4005 		for (i = 0; i < (SATA_ID_SERIAL_LEN - j) && j != 0; i++, p--)
4006 			*p = *(p - j);
4007 
4008 		/*
4009 		 * Add leading spaces - same number as the
4010 		 * shift size
4011 		 */
4012 		for (; j > 0; j--)
4013 			page_buf[4 + j - 1] = '\040';
4014 
4015 		count = MIN(bp->b_bcount, SATA_ID_SERIAL_LEN + 4);
4016 		bcopy(page_buf, bp->b_un.b_addr, count);
4017 		break;
4018 
4019 	case INQUIRY_BDC_PAGE:
4020 		/*
4021 		 * Request for Block Device Characteristics
4022 		 * page.  Set-up the page.
4023 		 */
4024 		page_buf[0] = peripheral_device_type;
4025 		page_buf[1] = INQUIRY_BDC_PAGE;
4026 		page_buf[2] = 0;
4027 		/* remaining page length */
4028 		page_buf[3] = SATA_ID_BDC_LEN;
4029 
4030 		rate = sdinfo->satadrv_id.ai_medrotrate;
4031 		page_buf[4] = (rate >> 8) & 0xff;
4032 		page_buf[5] = rate & 0xff;
4033 		page_buf[6] = 0;
4034 		page_buf[7] = sdinfo->satadrv_id.ai_nomformfactor & 0xf;
4035 
4036 		count = MIN(bp->b_bcount, SATA_ID_BDC_LEN + 4);
4037 		bcopy(page_buf, bp->b_un.b_addr, count);
4038 		break;
4039 
4040 	case INQUIRY_ATA_INFO_PAGE:
4041 		/*
4042 		 * Request for ATA Information page.
4043 		 */
4044 		page_buf[0] = peripheral_device_type;
4045 		page_buf[1] = INQUIRY_ATA_INFO_PAGE;
4046 		page_buf[2] = (SATA_ID_ATA_INFO_LEN >> 8) & 0xff;
4047 		page_buf[3] = SATA_ID_ATA_INFO_LEN & 0xff;
4048 		/* page_buf[4-7] reserved */
4049 #ifdef  _LITTLE_ENDIAN
4050 		bcopy("ATA     ", &page_buf[8], 8);
4051 		swab(sdinfo->satadrv_id.ai_model, &page_buf[16], 16);
4052 		if (strncmp(&sdinfo->satadrv_id.ai_fw[4], "    ", 4) == 0) {
4053 			swab(sdinfo->satadrv_id.ai_fw, &page_buf[32], 4);
4054 		} else {
4055 			swab(&sdinfo->satadrv_id.ai_fw[4], &page_buf[32], 4);
4056 		}
4057 #else   /* _LITTLE_ENDIAN */
4058 		bcopy("ATA     ", &page_buf[8], 8);
4059 		bcopy(sdinfo->satadrv_id.ai_model, &page_buf[16], 16);
4060 		if (strncmp(&sdinfo->satadrv_id.ai_fw[4], "    ", 4) == 0) {
4061 			bcopy(sdinfo->satadrv_id.ai_fw, &page_buf[32], 4);
4062 		} else {
4063 			bcopy(&sdinfo->satadrv_id.ai_fw[4], &page_buf[32], 4);
4064 		}
4065 #endif  /* _LITTLE_ENDIAN */
4066 		/*
4067 		 * page_buf[36-55] which defines the device
4068 		 * signature is not defined at this
4069 		 * time.
4070 		 */
4071 
4072 		/* Set the command code */
4073 		if (sdinfo->satadrv_type == SATA_DTYPE_ATADISK) {
4074 			page_buf[56] = SATAC_ID_DEVICE;
4075 		} else if (sdinfo->satadrv_type == SATA_DTYPE_ATAPI) {
4076 			page_buf[56] = SATAC_ID_PACKET_DEVICE;
4077 		}
4078 		/*
4079 		 * If the command code, page_buf[56], is not
4080 		 * zero and if one of the identify commands
4081 		 * succeeds, return the identify data.
4082 		 */
4083 		if (page_buf[56] != 0) {
4084 			sata_drive_info_t temp_info = {
4085 				.satadrv_addr = sdinfo->satadrv_addr,
4086 				.satadrv_type = sdinfo->satadrv_type,
4087 			};
4088 
4089 			/*
4090 			 * It appears calls to an HBA's start (sata_hba_start)
4091 			 * method (which sata_fetch_device_identify_data_retry()
4092 			 * calls) must not be done while holding cport_mutex.
4093 			 *
4094 			 * A packet's completion routine may call back into
4095 			 * the sata framework and deadlock (and all extant
4096 			 * calls to the HBA's start method either drop and
4097 			 * re-acquire cport_mutex, or never held cport_mutex).
4098 			 *
4099 			 * sdinfo is protected by cport_mutex, so we need to
4100 			 * obtain the SATA address and type from sdinfo
4101 			 * before releasing cport_mutex and submitting the
4102 			 * request. We reacquire cport_mutex to simplfy
4103 			 * cleanup after the done label.
4104 			 */
4105 			mutex_exit(cport_mutex);
4106 			(void) sata_fetch_device_identify_data(
4107 			    spx->txlt_sata_hba_inst, &temp_info);
4108 			mutex_enter(cport_mutex);
4109 
4110 			/*
4111 			 * If sata_fetch_device_identify_data()
4112 			 * fails, the bcopy() is harmless since we're copying
4113 			 * zeros back over zeros. If it succeeds, we're
4114 			 * copying over the portion of the response we need.
4115 			 */
4116 			bcopy(&temp_info.satadrv_id, &page_buf[60],
4117 			    sizeof (sata_id_t));
4118 		}
4119 
4120 		/* Need to copy out the page_buf to bp */
4121 		count = MIN(bp->b_bcount, SATA_ID_ATA_INFO_LEN + 4);
4122 		bcopy(page_buf, bp->b_un.b_addr, count);
4123 		break;
4124 
4125 	case INQUIRY_DEV_IDENTIFICATION_PAGE:
4126 		if (sdinfo->satadrv_id.ai_naa_ieee_oui != 0) {
4127 			/*
4128 			 * Page 83; SAT-5 requires this, and modern
4129 			 * SATA devices all support a WWN.
4130 			 */
4131 			page_buf[0] = peripheral_device_type;
4132 			page_buf[1] = INQUIRY_DEV_IDENTIFICATION_PAGE;
4133 			page_buf[2] = 0;
4134 			page_buf[3] = 12; /* remaining length */
4135 			page_buf[4] = 0x01; /* protocol 0, code set 1 */
4136 			page_buf[5] = 0x03; /* LUN, NAA type */
4137 			page_buf[6] = 0;
4138 			page_buf[7] = 0x08; /* length (64-bit WWN) */
4139 #ifdef	_LITTLE_ENDIAN
4140 			swab(&sdinfo->satadrv_id.ai_naa_ieee_oui, &page_buf[8],
4141 			    8);
4142 #else
4143 			bcopy(&sdinfo->satadrv_id.ai_naa_ieee_oui,
4144 			    &page_buf[8], 8);
4145 #endif
4146 			/* header + designator */
4147 			count = MIN(bp->b_bcount, 12 + 4);
4148 			bcopy(page_buf, bp->b_un.b_addr, count);
4149 			break;
4150 		}
4151 		/* FALLTHROUGH */
4152 
4153 	default:
4154 		/* Request for unsupported VPD page */
4155 		*scsipkt->pkt_scbp = STATUS_CHECK;
4156 		sense = sata_arq_sense(spx);
4157 		sense->es_key = KEY_ILLEGAL_REQUEST;
4158 		sense->es_add_code = SD_SCSI_ASC_INVALID_FIELD_IN_CDB;
4159 		goto done;
4160 	}
4161 
4162 	scsipkt->pkt_state |= STATE_XFERRED_DATA;
4163 	scsipkt->pkt_resid = scsipkt->pkt_cdbp[4] > count ?
4164 	    scsipkt->pkt_cdbp[4] - count : 0;
4165 
4166 done:
4167 	mutex_exit(cport_mutex);
4168 
4169 	SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
4170 	    "Scsi_pkt completion reason %x\n",
4171 	    scsipkt->pkt_reason);
4172 
4173 	if ((scsipkt->pkt_flags & FLAG_NOINTR) == 0 &&
4174 	    scsipkt->pkt_comp != NULL) {
4175 		/* scsi callback required */
4176 		if (servicing_interrupt()) {
4177 			if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
4178 			    (task_func_t *)spx->txlt_scsi_pkt->pkt_comp,
4179 			    (void *)spx->txlt_scsi_pkt, TQ_NOSLEEP) ==
4180 			    TASKQID_INVALID) {
4181 				return (TRAN_BUSY);
4182 			}
4183 		} else if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
4184 		    (task_func_t *)spx->txlt_scsi_pkt->pkt_comp,
4185 		    (void *)spx->txlt_scsi_pkt, TQ_SLEEP) == TASKQID_INVALID) {
4186 			/* Scheduling the callback failed */
4187 			return (TRAN_BUSY);
4188 		}
4189 	}
4190 	return (TRAN_ACCEPT);
4191 }
4192 
4193 /*
4194  * SATA translate command: Request Sense.
4195  *
4196  * Returns TRAN_ACCEPT and appropriate values in scsi_pkt fields.
4197  * At the moment this is an emulated command (ATA version for SATA hard disks).
4198  * May be translated into Check Power Mode command in the future.
4199  *
4200  * Note: There is a mismatch between already implemented Informational
4201  * Exception Mode Select page 0x1C and this function.
4202  * When MRIE bit is set in page 0x1C, Request Sense is supposed to return
4203  * NO SENSE and set additional sense code to the exception code - this is not
4204  * implemented here.
4205  */
4206 static int
sata_txlt_request_sense(sata_pkt_txlate_t * spx)4207 sata_txlt_request_sense(sata_pkt_txlate_t *spx)
4208 {
4209 	struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
4210 	struct scsi_extended_sense sense;
4211 	struct buf *bp = spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp;
4212 	sata_drive_info_t *sdinfo;
4213 	sata_cmd_t *scmd = &spx->txlt_sata_pkt->satapkt_cmd;
4214 	int rval, reason, power_state = 0;
4215 	kmutex_t *cport_mutex;
4216 
4217 	cport_mutex = &(SATA_TXLT_CPORT_MUTEX(spx));
4218 	mutex_enter(cport_mutex);
4219 
4220 	if (((rval = sata_txlt_generic_pkt_info(spx, &reason, 1)) !=
4221 	    TRAN_ACCEPT) || (reason == CMD_DEV_GONE)) {
4222 		mutex_exit(cport_mutex);
4223 		return (rval);
4224 	}
4225 
4226 	scsipkt->pkt_reason = CMD_CMPLT;
4227 	scsipkt->pkt_state = STATE_GOT_BUS | STATE_GOT_TARGET |
4228 	    STATE_SENT_CMD | STATE_GOT_STATUS;
4229 	*scsipkt->pkt_scbp = STATUS_GOOD;
4230 
4231 	/*
4232 	 * when CONTROL field's NACA bit == 1
4233 	 * return ILLEGAL_REQUEST
4234 	 */
4235 	if (scsipkt->pkt_cdbp[5] & CTL_BYTE_NACA_MASK) {
4236 		mutex_exit(cport_mutex);
4237 		return (sata_txlt_check_condition(spx, KEY_ILLEGAL_REQUEST,
4238 		    SD_SCSI_ASC_CMD_SEQUENCE_ERR));
4239 	}
4240 
4241 	sdinfo = sata_get_device_info(spx->txlt_sata_hba_inst,
4242 	    &spx->txlt_sata_pkt->satapkt_device);
4243 	ASSERT(sdinfo != NULL);
4244 
4245 	spx->txlt_sata_pkt->satapkt_op_mode |= SATA_OPMODE_SYNCH;
4246 
4247 	sata_build_generic_cmd(scmd, SATAC_CHECK_POWER_MODE);
4248 	scmd->satacmd_flags.sata_copy_out_sec_count_lsb = B_TRUE;
4249 	scmd->satacmd_flags.sata_copy_out_error_reg = B_TRUE;
4250 	if (sata_hba_start(spx, &rval) != 0) {
4251 		mutex_exit(cport_mutex);
4252 		return (rval);
4253 	}
4254 	if (scmd->satacmd_error_reg != 0) {
4255 		mutex_exit(cport_mutex);
4256 		return (sata_txlt_check_condition(spx, KEY_NO_SENSE,
4257 		    SD_SCSI_ASC_NO_ADD_SENSE));
4258 	}
4259 
4260 	switch (scmd->satacmd_sec_count_lsb) {
4261 	case SATA_PWRMODE_STANDBY: /* device in standby mode */
4262 		if (sdinfo->satadrv_power_level == SATA_POWER_STOPPED)
4263 			power_state = SATA_POWER_STOPPED;
4264 		else {
4265 			power_state = SATA_POWER_STANDBY;
4266 			sdinfo->satadrv_power_level = SATA_POWER_STANDBY;
4267 		}
4268 		break;
4269 	case SATA_PWRMODE_IDLE: /* device in idle mode */
4270 		power_state = SATA_POWER_IDLE;
4271 		sdinfo->satadrv_power_level = SATA_POWER_IDLE;
4272 		break;
4273 	case SATA_PWRMODE_ACTIVE: /* device in active or idle mode */
4274 	default:		  /* 0x40, 0x41 active mode */
4275 		if (sdinfo->satadrv_power_level == SATA_POWER_IDLE)
4276 			power_state = SATA_POWER_IDLE;
4277 		else {
4278 			power_state = SATA_POWER_ACTIVE;
4279 			sdinfo->satadrv_power_level = SATA_POWER_ACTIVE;
4280 		}
4281 		break;
4282 	}
4283 
4284 	mutex_exit(cport_mutex);
4285 
4286 	if (bp != NULL && bp->b_un.b_addr && bp->b_bcount) {
4287 		/*
4288 		 * Because it is fully emulated command storing data
4289 		 * programatically in the specified buffer, release
4290 		 * preallocated DMA resources before storing data in the buffer,
4291 		 * so no unwanted DMA sync would take place.
4292 		 */
4293 		int count = MIN(bp->b_bcount,
4294 		    sizeof (struct scsi_extended_sense));
4295 		sata_scsi_dmafree(NULL, scsipkt);
4296 		bzero(&sense, sizeof (struct scsi_extended_sense));
4297 		sense.es_valid = 0;	/* Valid LBA */
4298 		sense.es_class = 7;	/* Response code 0x70 - current err */
4299 		sense.es_key = KEY_NO_SENSE;
4300 		sense.es_add_len = 6;	/* Additional length */
4301 		/* Copy no more than requested */
4302 		bcopy(&sense, bp->b_un.b_addr, count);
4303 		scsipkt->pkt_state |= STATE_XFERRED_DATA;
4304 		scsipkt->pkt_resid = 0;
4305 		switch (power_state) {
4306 		case SATA_POWER_IDLE:
4307 		case SATA_POWER_STANDBY:
4308 			sense.es_add_code =
4309 			    SD_SCSI_ASC_LOW_POWER_CONDITION_ON;
4310 			break;
4311 		case SATA_POWER_STOPPED:
4312 			sense.es_add_code = SD_SCSI_ASC_NO_ADD_SENSE;
4313 			break;
4314 		case SATA_POWER_ACTIVE:
4315 		default:
4316 			break;
4317 		}
4318 	}
4319 
4320 	SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
4321 	    "Scsi_pkt completion reason %x\n",
4322 	    scsipkt->pkt_reason);
4323 
4324 	if ((scsipkt->pkt_flags & FLAG_NOINTR) == 0 &&
4325 	    scsipkt->pkt_comp != NULL) {
4326 		/* scsi callback required */
4327 		if (servicing_interrupt()) {
4328 			if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
4329 			    (task_func_t *)spx->txlt_scsi_pkt->pkt_comp,
4330 			    (void *)spx->txlt_scsi_pkt, TQ_NOSLEEP) ==
4331 			    TASKQID_INVALID) {
4332 				return (TRAN_BUSY);
4333 			}
4334 		} else if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
4335 		    (task_func_t *)spx->txlt_scsi_pkt->pkt_comp,
4336 		    (void *)spx->txlt_scsi_pkt, TQ_SLEEP) == TASKQID_INVALID) {
4337 			/* Scheduling the callback failed */
4338 			return (TRAN_BUSY);
4339 		}
4340 	}
4341 	return (TRAN_ACCEPT);
4342 }
4343 
4344 /*
4345  * SATA translate command: Test Unit Ready
4346  * (ATA version for SATA hard disks).
4347  * It is translated into the Check Power Mode command.
4348  *
4349  * Returns TRAN_ACCEPT and appropriate values in scsi_pkt fields.
4350  */
4351 static int
sata_txlt_test_unit_ready(sata_pkt_txlate_t * spx)4352 sata_txlt_test_unit_ready(sata_pkt_txlate_t *spx)
4353 {
4354 	struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
4355 	struct scsi_extended_sense *sense;
4356 	sata_cmd_t *scmd = &spx->txlt_sata_pkt->satapkt_cmd;
4357 	sata_drive_info_t *sdinfo;
4358 	int power_state;
4359 	int rval, reason;
4360 	kmutex_t *cport_mutex =  &(SATA_TXLT_CPORT_MUTEX(spx));
4361 
4362 	mutex_enter(cport_mutex);
4363 
4364 	if (((rval = sata_txlt_generic_pkt_info(spx, &reason, 1)) !=
4365 	    TRAN_ACCEPT) || (reason == CMD_DEV_GONE)) {
4366 		mutex_exit(cport_mutex);
4367 		return (rval);
4368 	}
4369 
4370 	sdinfo = sata_get_device_info(spx->txlt_sata_hba_inst,
4371 	    &spx->txlt_sata_pkt->satapkt_device);
4372 	ASSERT(sdinfo != NULL);
4373 
4374 	spx->txlt_sata_pkt->satapkt_op_mode |= SATA_OPMODE_SYNCH;
4375 
4376 	/* send CHECK POWER MODE command */
4377 	sata_build_generic_cmd(scmd, SATAC_CHECK_POWER_MODE);
4378 	scmd->satacmd_flags.sata_copy_out_sec_count_lsb = B_TRUE;
4379 	scmd->satacmd_flags.sata_copy_out_error_reg = B_TRUE;
4380 	if (sata_hba_start(spx, &rval) != 0) {
4381 		mutex_exit(cport_mutex);
4382 		return (rval);
4383 	}
4384 
4385 	if (scmd->satacmd_error_reg != 0) {
4386 		mutex_exit(cport_mutex);
4387 		return (sata_txlt_check_condition(spx, KEY_NOT_READY,
4388 		    SD_SCSI_ASC_LU_NOT_RESPONSE));
4389 	}
4390 
4391 	power_state = scmd->satacmd_sec_count_lsb;
4392 
4393 	/*
4394 	 * return NOT READY when device in STOPPED mode
4395 	 */
4396 	if (power_state == SATA_PWRMODE_STANDBY &&
4397 	    sdinfo->satadrv_power_level == SATA_POWER_STOPPED) {
4398 		*scsipkt->pkt_scbp = STATUS_CHECK;
4399 		sense = sata_arq_sense(spx);
4400 		sense->es_key = KEY_NOT_READY;
4401 		sense->es_add_code = SD_SCSI_ASC_LU_NOT_READY;
4402 	} else {
4403 		/*
4404 		 * For other power mode, return GOOD status
4405 		 */
4406 		*scsipkt->pkt_scbp = STATUS_GOOD;
4407 	}
4408 
4409 	scsipkt->pkt_reason = CMD_CMPLT;
4410 	scsipkt->pkt_state = STATE_GOT_BUS | STATE_GOT_TARGET |
4411 	    STATE_SENT_CMD | STATE_GOT_STATUS;
4412 
4413 	mutex_exit(cport_mutex);
4414 
4415 	SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
4416 	    "Scsi_pkt completion reason %x\n", scsipkt->pkt_reason);
4417 
4418 	if ((scsipkt->pkt_flags & FLAG_NOINTR) == 0 &&
4419 	    scsipkt->pkt_comp != NULL) {
4420 		/* scsi callback required */
4421 		if (servicing_interrupt()) {
4422 			if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
4423 			    (task_func_t *)spx->txlt_scsi_pkt->pkt_comp,
4424 			    (void *)spx->txlt_scsi_pkt, TQ_NOSLEEP) ==
4425 			    TASKQID_INVALID) {
4426 				return (TRAN_BUSY);
4427 			}
4428 		} else if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
4429 		    (task_func_t *)spx->txlt_scsi_pkt->pkt_comp,
4430 		    (void *)spx->txlt_scsi_pkt, TQ_SLEEP) == TASKQID_INVALID) {
4431 			/* Scheduling the callback failed */
4432 			return (TRAN_BUSY);
4433 		}
4434 	}
4435 
4436 	return (TRAN_ACCEPT);
4437 }
4438 
4439 /*
4440  * SATA translate command: Start Stop Unit
4441  * Translation depends on a command:
4442  *
4443  * Power condition bits will be supported
4444  * and the power level should be maintained by SATL,
4445  * When SATL received a command, it will check the
4446  * power level firstly, and return the status according
4447  * to SAT2 v2.6 and SAT-2 Standby Modifications
4448  *
4449  * SPC-4/SBC-3      SATL    ATA power condition  SATL      SPC/SBC
4450  * -----------------------------------------------------------------------
4451  * SSU_PC1 Active   <==>     ATA  Active         <==>     SSU:start_bit =1
4452  * SSU_PC2 Idle     <==>     ATA  Idle           <==>     N/A
4453  * SSU_PC3 Standby  <==>     ATA  Standby        <==>     N/A
4454  * SSU_PC4 Stopped  <==>     ATA  Standby        <==>     SSU:start_bit = 0
4455  *
4456  *	Unload Media / NOT SUPPORTED YET
4457  *	Load Media / NOT SUPPROTED YET
4458  *	Immediate bit / NOT SUPPORTED YET (deferred error)
4459  *
4460  * Returns TRAN_ACCEPT or code returned by sata_hba_start() and
4461  * appropriate values in scsi_pkt fields.
4462  */
4463 static int
sata_txlt_start_stop_unit(sata_pkt_txlate_t * spx)4464 sata_txlt_start_stop_unit(sata_pkt_txlate_t *spx)
4465 {
4466 	struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
4467 	sata_cmd_t *scmd = &spx->txlt_sata_pkt->satapkt_cmd;
4468 	int rval, reason;
4469 	sata_drive_info_t *sdinfo;
4470 	sata_id_t *sata_id;
4471 	kmutex_t *cport_mutex = &(SATA_TXLT_CPORT_MUTEX(spx));
4472 
4473 	SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
4474 	    "sata_txlt_start_stop_unit: %d\n", scsipkt->pkt_scbp[4] & 1);
4475 
4476 	mutex_enter(cport_mutex);
4477 
4478 	if (((rval = sata_txlt_generic_pkt_info(spx, &reason, 1)) !=
4479 	    TRAN_ACCEPT) || (reason == CMD_DEV_GONE)) {
4480 		mutex_exit(cport_mutex);
4481 		return (rval);
4482 	}
4483 
4484 	if (scsipkt->pkt_cdbp[1] & START_STOP_IMMED_MASK) {
4485 		/* IMMED bit - not supported */
4486 		mutex_exit(cport_mutex);
4487 		return (sata_txlt_check_condition(spx, KEY_ILLEGAL_REQUEST,
4488 		    SD_SCSI_ASC_INVALID_FIELD_IN_CDB));
4489 	}
4490 
4491 	spx->txlt_sata_pkt->satapkt_op_mode |= SATA_OPMODE_SYNCH;
4492 	spx->txlt_sata_pkt->satapkt_comp = NULL;
4493 
4494 	sdinfo = sata_get_device_info(spx->txlt_sata_hba_inst,
4495 	    &spx->txlt_sata_pkt->satapkt_device);
4496 	ASSERT(sdinfo != NULL);
4497 	sata_id = &sdinfo->satadrv_id;
4498 
4499 	switch ((scsipkt->pkt_cdbp[4] & START_STOP_POWER_COND_MASK) >> 4) {
4500 	case 0:
4501 		if (scsipkt->pkt_cdbp[4] & START_STOP_LOEJ_MASK) {
4502 			/* Load/Unload Media - invalid request */
4503 			goto err_out;
4504 		}
4505 		if (scsipkt->pkt_cdbp[4] & START_STOP_START_MASK) {
4506 			/* Start Unit */
4507 			sata_build_read_verify_cmd(scmd, 1, 5);
4508 			scmd->satacmd_flags.sata_copy_out_error_reg = B_TRUE;
4509 			/* Transfer command to HBA */
4510 			if (sata_hba_start(spx, &rval) != 0) {
4511 				/* Pkt not accepted for execution */
4512 				mutex_exit(cport_mutex);
4513 				return (rval);
4514 			}
4515 			if (scmd->satacmd_error_reg != 0) {
4516 				goto err_out;
4517 			}
4518 			sdinfo->satadrv_power_level = SATA_POWER_ACTIVE;
4519 		} else {
4520 			/* Stop Unit */
4521 			sata_build_generic_cmd(scmd, SATAC_FLUSH_CACHE);
4522 			scmd->satacmd_flags.sata_copy_out_error_reg = B_TRUE;
4523 			if (sata_hba_start(spx, &rval) != 0) {
4524 				mutex_exit(cport_mutex);
4525 				return (rval);
4526 			} else {
4527 				if (scmd->satacmd_error_reg != 0) {
4528 					goto err_out;
4529 				}
4530 			}
4531 			/* ata standby immediate command */
4532 			sata_build_generic_cmd(scmd, SATAC_STANDBY_IM);
4533 			scmd->satacmd_flags.sata_copy_out_error_reg = B_TRUE;
4534 			if (sata_hba_start(spx, &rval) != 0) {
4535 				mutex_exit(cport_mutex);
4536 				return (rval);
4537 			}
4538 			if (scmd->satacmd_error_reg != 0) {
4539 				goto err_out;
4540 			}
4541 			sdinfo->satadrv_power_level = SATA_POWER_STOPPED;
4542 		}
4543 		break;
4544 	case 0x1:
4545 		sata_build_generic_cmd(scmd, SATAC_IDLE);
4546 		scmd->satacmd_flags.sata_copy_out_error_reg = B_TRUE;
4547 		if (sata_hba_start(spx, &rval) != 0) {
4548 			mutex_exit(cport_mutex);
4549 			return (rval);
4550 		}
4551 		if (scmd->satacmd_error_reg != 0) {
4552 			goto err_out;
4553 		}
4554 		sata_build_read_verify_cmd(scmd, 1, 5);
4555 		scmd->satacmd_flags.sata_copy_out_error_reg = B_TRUE;
4556 		/* Transfer command to HBA */
4557 		if (sata_hba_start(spx, &rval) != 0) {
4558 			/* Pkt not accepted for execution */
4559 			mutex_exit(cport_mutex);
4560 			return (rval);
4561 		} else {
4562 			if (scmd->satacmd_error_reg != 0) {
4563 				goto err_out;
4564 			}
4565 		}
4566 		sdinfo->satadrv_power_level = SATA_POWER_ACTIVE;
4567 		break;
4568 	case 0x2:
4569 		sata_build_generic_cmd(scmd, SATAC_FLUSH_CACHE);
4570 		scmd->satacmd_flags.sata_copy_out_error_reg = B_TRUE;
4571 		if (!(scsipkt->pkt_cdbp[4] & START_STOP_NOFLUSH_MASK)) {
4572 			if (sata_hba_start(spx, &rval) != 0) {
4573 				mutex_exit(cport_mutex);
4574 				return (rval);
4575 			}
4576 			if (scmd->satacmd_error_reg != 0) {
4577 				goto err_out;
4578 			}
4579 		}
4580 		sata_build_generic_cmd(scmd, SATAC_IDLE);
4581 		scmd->satacmd_flags.sata_copy_out_error_reg = B_TRUE;
4582 		if (sata_hba_start(spx, &rval) != 0) {
4583 			mutex_exit(cport_mutex);
4584 			return (rval);
4585 		}
4586 		if (scmd->satacmd_error_reg != 0) {
4587 			goto err_out;
4588 		}
4589 		if ((scsipkt->pkt_cdbp[3] & START_STOP_MODIFIER_MASK)) {
4590 			/*
4591 			 *  POWER CONDITION MODIFIER bit set
4592 			 *  to 0x1 or larger it will be handled
4593 			 *  on the same way as bit = 0x1
4594 			 */
4595 			if (!(sata_id->ai_cmdset84 &
4596 			    SATA_IDLE_UNLOAD_SUPPORTED)) {
4597 				sdinfo->satadrv_power_level = SATA_POWER_IDLE;
4598 				break;
4599 			}
4600 			sata_build_generic_cmd(scmd, SATAC_IDLE_IM);
4601 			scmd->satacmd_features_reg = 0x44;
4602 			scmd->satacmd_lba_low_lsb = 0x4c;
4603 			scmd->satacmd_lba_mid_lsb = 0x4e;
4604 			scmd->satacmd_lba_high_lsb = 0x55;
4605 			scmd->satacmd_flags.sata_copy_out_error_reg = B_TRUE;
4606 			if (sata_hba_start(spx, &rval) != 0) {
4607 				mutex_exit(cport_mutex);
4608 				return (rval);
4609 			}
4610 			if (scmd->satacmd_error_reg != 0) {
4611 				goto err_out;
4612 			}
4613 		}
4614 		sdinfo->satadrv_power_level = SATA_POWER_IDLE;
4615 		break;
4616 	case 0x3:
4617 		sata_build_generic_cmd(scmd, SATAC_FLUSH_CACHE);
4618 		scmd->satacmd_flags.sata_copy_out_error_reg = B_TRUE;
4619 		if (!(scsipkt->pkt_cdbp[4] & START_STOP_NOFLUSH_MASK)) {
4620 			if (sata_hba_start(spx, &rval) != 0) {
4621 				mutex_exit(cport_mutex);
4622 				return (rval);
4623 			}
4624 			if (scmd->satacmd_error_reg != 0) {
4625 				goto err_out;
4626 			}
4627 		}
4628 		sata_build_generic_cmd(scmd, SATAC_STANDBY);
4629 		scmd->satacmd_flags.sata_copy_out_error_reg = B_TRUE;
4630 		if (sata_hba_start(spx, &rval) != 0) {
4631 			mutex_exit(cport_mutex);
4632 			return (rval);
4633 		}
4634 		if (scmd->satacmd_error_reg != 0) {
4635 			goto err_out;
4636 		}
4637 		sdinfo->satadrv_power_level = SATA_POWER_STANDBY;
4638 		break;
4639 	case 0x7:
4640 		sata_build_generic_cmd(scmd, SATAC_CHECK_POWER_MODE);
4641 		scmd->satacmd_flags.sata_copy_out_sec_count_lsb = B_TRUE;
4642 		scmd->satacmd_flags.sata_copy_out_error_reg = B_TRUE;
4643 		if (sata_hba_start(spx, &rval) != 0) {
4644 			mutex_exit(cport_mutex);
4645 			return (rval);
4646 		}
4647 		if (scmd->satacmd_error_reg != 0) {
4648 			goto err_out;
4649 		}
4650 		switch (scmd->satacmd_sec_count_lsb) {
4651 		case SATA_PWRMODE_STANDBY:
4652 			sata_build_generic_cmd(scmd, SATAC_STANDBY);
4653 			scmd->satacmd_sec_count_msb = sata_get_standby_timer(
4654 			    sdinfo->satadrv_standby_timer);
4655 			scmd->satacmd_flags.sata_copy_out_error_reg = B_TRUE;
4656 			if (sata_hba_start(spx, &rval) != 0) {
4657 				mutex_exit(cport_mutex);
4658 				return (rval);
4659 			} else {
4660 				if (scmd->satacmd_error_reg != 0) {
4661 					goto err_out;
4662 				}
4663 			}
4664 			break;
4665 		case SATA_PWRMODE_IDLE:
4666 			sata_build_generic_cmd(scmd, SATAC_IDLE);
4667 			scmd->satacmd_sec_count_msb = sata_get_standby_timer(
4668 			    sdinfo->satadrv_standby_timer);
4669 			scmd->satacmd_flags.sata_copy_out_error_reg = B_TRUE;
4670 			if (sata_hba_start(spx, &rval) != 0) {
4671 				mutex_exit(cport_mutex);
4672 				return (rval);
4673 			} else {
4674 				if (scmd->satacmd_error_reg != 0) {
4675 					goto err_out;
4676 				}
4677 			}
4678 			break;
4679 		case SATA_PWRMODE_ACTIVE_SPINDOWN:
4680 		case SATA_PWRMODE_ACTIVE_SPINUP:
4681 		case SATA_PWRMODE_ACTIVE:
4682 			sata_build_generic_cmd(scmd, SATAC_IDLE);
4683 			scmd->satacmd_sec_count_msb = sata_get_standby_timer(
4684 			    sdinfo->satadrv_standby_timer);
4685 			scmd->satacmd_flags.sata_copy_out_error_reg = B_TRUE;
4686 			if (sata_hba_start(spx, &rval) != 0) {
4687 				mutex_exit(cport_mutex);
4688 				return (rval);
4689 			}
4690 			if (scmd->satacmd_error_reg != 0) {
4691 				goto err_out;
4692 			}
4693 			sata_build_read_verify_cmd(scmd, 1, 5);
4694 			scmd->satacmd_flags.sata_copy_out_error_reg = B_TRUE;
4695 			if (sata_hba_start(spx, &rval) != 0) {
4696 				mutex_exit(cport_mutex);
4697 				return (rval);
4698 			}
4699 			if (scmd->satacmd_error_reg != 0) {
4700 				goto err_out;
4701 			}
4702 			break;
4703 		default:
4704 			goto err_out;
4705 		}
4706 		break;
4707 	case 0xb:
4708 		if ((sata_get_standby_timer(sdinfo->satadrv_standby_timer) ==
4709 		    0) || (!(sata_id->ai_cap & SATA_STANDBYTIMER))) {
4710 			mutex_exit(cport_mutex);
4711 			return (sata_txlt_check_condition(spx,
4712 			    KEY_ILLEGAL_REQUEST,
4713 			    SD_SCSI_ASC_INVALID_FIELD_IN_CDB));
4714 		}
4715 		sata_build_generic_cmd(scmd, SATAC_FLUSH_CACHE);
4716 		scmd->satacmd_flags.sata_copy_out_error_reg = B_TRUE;
4717 		if (!(scsipkt->pkt_cdbp[4] & START_STOP_NOFLUSH_MASK)) {
4718 			if (sata_hba_start(spx, &rval) != 0) {
4719 				mutex_exit(cport_mutex);
4720 				return (rval);
4721 			}
4722 			if (scmd->satacmd_error_reg != 0) {
4723 				goto err_out;
4724 			}
4725 			sata_build_generic_cmd(scmd, SATAC_STANDBY_IM);
4726 			scmd->satacmd_flags.sata_copy_out_error_reg = B_TRUE;
4727 			if (sata_hba_start(spx, &rval) != 0) {
4728 				mutex_exit(cport_mutex);
4729 				return (rval);
4730 			}
4731 			if (scmd->satacmd_error_reg != 0) {
4732 				goto err_out;
4733 			}
4734 		}
4735 		bzero(sdinfo->satadrv_standby_timer, sizeof (uchar_t) * 4);
4736 		break;
4737 	default:
4738 err_out:
4739 		mutex_exit(cport_mutex);
4740 		return (sata_txlt_check_condition(spx, KEY_ILLEGAL_REQUEST,
4741 		    SD_SCSI_ASC_INVALID_FIELD_IN_CDB));
4742 	}
4743 
4744 	/*
4745 	 * Since it was a synchronous command,
4746 	 * a callback function will be called directly.
4747 	 */
4748 	mutex_exit(cport_mutex);
4749 	SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
4750 	    "synchronous execution status %x\n",
4751 	    spx->txlt_sata_pkt->satapkt_reason);
4752 
4753 	if ((scsipkt->pkt_flags & FLAG_NOINTR) == 0 &&
4754 	    scsipkt->pkt_comp != NULL) {
4755 		sata_set_arq_data(spx->txlt_sata_pkt);
4756 		if (servicing_interrupt()) {
4757 			if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
4758 			    (task_func_t *)spx->txlt_scsi_pkt->pkt_comp,
4759 			    (void *)spx->txlt_scsi_pkt, TQ_NOSLEEP) ==
4760 			    TASKQID_INVALID) {
4761 				return (TRAN_BUSY);
4762 			}
4763 		} else if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
4764 		    (task_func_t *)spx->txlt_scsi_pkt->pkt_comp,
4765 		    (void *)spx->txlt_scsi_pkt, TQ_SLEEP) == TASKQID_INVALID) {
4766 			/* Scheduling the callback failed */
4767 			return (TRAN_BUSY);
4768 		}
4769 	}
4770 	else
4771 
4772 		sata_txlt_nodata_cmd_completion(spx->txlt_sata_pkt);
4773 
4774 	return (TRAN_ACCEPT);
4775 
4776 }
4777 
4778 /*
4779  * SATA translate command:  Read Capacity.
4780  * Emulated command for SATA disks.
4781  * Capacity is retrieved from cached Idenifty Device data.
4782  * Identify Device data shows effective disk capacity, not the native
4783  * capacity, which may be limitted by Set Max Address command.
4784  * This is ATA version for SATA hard disks.
4785  *
4786  * Returns TRAN_ACCEPT and appropriate values in scsi_pkt fields.
4787  */
4788 static int
sata_txlt_read_capacity(sata_pkt_txlate_t * spx)4789 sata_txlt_read_capacity(sata_pkt_txlate_t *spx)
4790 {
4791 	struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
4792 	struct buf *bp = spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp;
4793 	sata_drive_info_t *sdinfo;
4794 	uint64_t val;
4795 	uint32_t lbsize = DEV_BSIZE;
4796 	uchar_t *rbuf;
4797 	int rval, reason;
4798 	kmutex_t *cport_mutex = &(SATA_TXLT_CPORT_MUTEX(spx));
4799 
4800 	SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
4801 	    "sata_txlt_read_capacity: ", NULL);
4802 
4803 	mutex_enter(cport_mutex);
4804 
4805 	if (((rval = sata_txlt_generic_pkt_info(spx, &reason, 0)) !=
4806 	    TRAN_ACCEPT) || (reason == CMD_DEV_GONE)) {
4807 		mutex_exit(cport_mutex);
4808 		return (rval);
4809 	}
4810 
4811 	scsipkt->pkt_reason = CMD_CMPLT;
4812 	scsipkt->pkt_state = STATE_GOT_BUS | STATE_GOT_TARGET |
4813 	    STATE_SENT_CMD | STATE_GOT_STATUS;
4814 	*scsipkt->pkt_scbp = STATUS_GOOD;
4815 	if (bp != NULL && bp->b_un.b_addr && bp->b_bcount) {
4816 		/*
4817 		 * Because it is fully emulated command storing data
4818 		 * programatically in the specified buffer, release
4819 		 * preallocated DMA resources before storing data in the buffer,
4820 		 * so no unwanted DMA sync would take place.
4821 		 */
4822 		sata_scsi_dmafree(NULL, scsipkt);
4823 
4824 		sdinfo = sata_get_device_info(
4825 		    spx->txlt_sata_hba_inst,
4826 		    &spx->txlt_sata_pkt->satapkt_device);
4827 
4828 		/*
4829 		 * As per SBC-3, the "returned LBA" is either the highest
4830 		 * addressable LBA or 0xffffffff, whichever is smaller.
4831 		 */
4832 		val = MIN(sdinfo->satadrv_capacity - 1, UINT32_MAX);
4833 
4834 		if (sdinfo->satadrv_id.ai_phys_sect_sz & SATA_L2PS_CHECK_BIT) {
4835 			/* physical/logical sector size word is valid */
4836 
4837 			if (sdinfo->satadrv_id.ai_phys_sect_sz &
4838 			    SATA_L2PS_BIG_SECTORS) {
4839 				/* if this set 117-118 words are valid */
4840 				lbsize = sdinfo->satadrv_id.ai_words_lsec[0] |
4841 				    (sdinfo->satadrv_id.ai_words_lsec[1] << 16);
4842 				lbsize <<= 1; /* convert from words to bytes */
4843 			}
4844 		}
4845 		rbuf = (uchar_t *)bp->b_un.b_addr;
4846 		/* Need to swap endians to match scsi format */
4847 		rbuf[0] = (val >> 24) & 0xff;
4848 		rbuf[1] = (val >> 16) & 0xff;
4849 		rbuf[2] = (val >> 8) & 0xff;
4850 		rbuf[3] = val & 0xff;
4851 		rbuf[4] = (lbsize >> 24) & 0xff;
4852 		rbuf[5] = (lbsize >> 16) & 0xff;
4853 		rbuf[6] = (lbsize >> 8) & 0xff;
4854 		rbuf[7] = lbsize & 0xff;
4855 
4856 		scsipkt->pkt_state |= STATE_XFERRED_DATA;
4857 		scsipkt->pkt_resid = 0;
4858 
4859 		SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst, "%d\n",
4860 		    sdinfo->satadrv_capacity -1);
4861 	}
4862 	mutex_exit(cport_mutex);
4863 	/*
4864 	 * If a callback was requested, do it now.
4865 	 */
4866 	SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
4867 	    "Scsi_pkt completion reason %x\n", scsipkt->pkt_reason);
4868 
4869 	if ((scsipkt->pkt_flags & FLAG_NOINTR) == 0 &&
4870 	    scsipkt->pkt_comp != NULL) {
4871 		/* scsi callback required */
4872 		if (servicing_interrupt()) {
4873 			if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
4874 			    (task_func_t *)spx->txlt_scsi_pkt->pkt_comp,
4875 			    (void *)spx->txlt_scsi_pkt, TQ_NOSLEEP) ==
4876 			    TASKQID_INVALID) {
4877 				return (TRAN_BUSY);
4878 			}
4879 		} else if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
4880 		    (task_func_t *)spx->txlt_scsi_pkt->pkt_comp,
4881 		    (void *)spx->txlt_scsi_pkt, TQ_SLEEP) == TASKQID_INVALID) {
4882 			/* Scheduling the callback failed */
4883 			return (TRAN_BUSY);
4884 		}
4885 	}
4886 
4887 	return (TRAN_ACCEPT);
4888 }
4889 
4890 /*
4891  * SATA translate command:  Read Capacity (16).
4892  * Emulated command for SATA disks.
4893  * Info is retrieved from cached Identify Device data.
4894  * Implemented to SBC-3 (draft 21) and SAT-2 (final) specifications.
4895  *
4896  * Returns TRAN_ACCEPT and appropriate values in scsi_pkt fields.
4897  */
4898 static int
sata_txlt_read_capacity16(sata_pkt_txlate_t * spx)4899 sata_txlt_read_capacity16(sata_pkt_txlate_t *spx)
4900 {
4901 	struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
4902 	struct buf *bp = spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp;
4903 	sata_drive_info_t *sdinfo;
4904 	uint64_t val;
4905 	uint16_t l2p_exp;
4906 	uint32_t lbsize = DEV_BSIZE;
4907 	uchar_t *rbuf;
4908 	int rval, reason;
4909 #define	TPE	0x80
4910 #define	TPRZ	0x40
4911 	kmutex_t *cport_mutex = &(SATA_TXLT_CPORT_MUTEX(spx));
4912 
4913 	SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
4914 	    "sata_txlt_read_capacity: ", NULL);
4915 
4916 	mutex_enter(cport_mutex);
4917 
4918 	if (((rval = sata_txlt_generic_pkt_info(spx, &reason, 0)) !=
4919 	    TRAN_ACCEPT) || (reason == CMD_DEV_GONE)) {
4920 		mutex_exit(cport_mutex);
4921 		return (rval);
4922 	}
4923 
4924 	scsipkt->pkt_reason = CMD_CMPLT;
4925 	scsipkt->pkt_state = STATE_GOT_BUS | STATE_GOT_TARGET |
4926 	    STATE_SENT_CMD | STATE_GOT_STATUS;
4927 	if (bp != NULL && bp->b_un.b_addr && bp->b_bcount) {
4928 		/*
4929 		 * Because it is fully emulated command storing data
4930 		 * programatically in the specified buffer, release
4931 		 * preallocated DMA resources before storing data in the buffer,
4932 		 * so no unwanted DMA sync would take place.
4933 		 */
4934 		sata_scsi_dmafree(NULL, scsipkt);
4935 
4936 		/* Check SERVICE ACTION field */
4937 		if ((scsipkt->pkt_cdbp[1] & 0x1f) !=
4938 		    SSVC_ACTION_READ_CAPACITY_G4) {
4939 			mutex_exit(cport_mutex);
4940 			return (sata_txlt_check_condition(spx,
4941 			    KEY_ILLEGAL_REQUEST,
4942 			    SD_SCSI_ASC_INVALID_FIELD_IN_CDB));
4943 		}
4944 
4945 		/* Check LBA field */
4946 		if ((scsipkt->pkt_cdbp[2] != 0) ||
4947 		    (scsipkt->pkt_cdbp[3] != 0) ||
4948 		    (scsipkt->pkt_cdbp[4] != 0) ||
4949 		    (scsipkt->pkt_cdbp[5] != 0) ||
4950 		    (scsipkt->pkt_cdbp[6] != 0) ||
4951 		    (scsipkt->pkt_cdbp[7] != 0) ||
4952 		    (scsipkt->pkt_cdbp[8] != 0) ||
4953 		    (scsipkt->pkt_cdbp[9] != 0)) {
4954 			mutex_exit(cport_mutex);
4955 			return (sata_txlt_check_condition(spx,
4956 			    KEY_ILLEGAL_REQUEST,
4957 			    SD_SCSI_ASC_INVALID_FIELD_IN_CDB));
4958 		}
4959 
4960 		/* Check PMI bit */
4961 		if (scsipkt->pkt_cdbp[14] & 0x1) {
4962 			mutex_exit(cport_mutex);
4963 			return (sata_txlt_check_condition(spx,
4964 			    KEY_ILLEGAL_REQUEST,
4965 			    SD_SCSI_ASC_INVALID_FIELD_IN_CDB));
4966 		}
4967 
4968 		*scsipkt->pkt_scbp = STATUS_GOOD;
4969 
4970 		sdinfo = sata_get_device_info(
4971 		    spx->txlt_sata_hba_inst,
4972 		    &spx->txlt_sata_pkt->satapkt_device);
4973 
4974 		/* last logical block address */
4975 		val = MIN(sdinfo->satadrv_capacity - 1,
4976 		    SCSI_READ_CAPACITY16_MAX_LBA);
4977 
4978 		/* logical to physical block size exponent */
4979 		l2p_exp = 0;
4980 		if (sdinfo->satadrv_id.ai_phys_sect_sz & SATA_L2PS_CHECK_BIT) {
4981 			/* physical/logical sector size word is valid */
4982 
4983 			if (sdinfo->satadrv_id.ai_phys_sect_sz &
4984 			    SATA_L2PS_HAS_MULT) {
4985 				/* multiple logical sectors per phys sectors */
4986 				l2p_exp =
4987 				    sdinfo->satadrv_id.ai_phys_sect_sz &
4988 				    SATA_L2PS_EXP_MASK;
4989 			}
4990 
4991 			if (sdinfo->satadrv_id.ai_phys_sect_sz &
4992 			    SATA_L2PS_BIG_SECTORS) {
4993 				/* if this set 117-118 words are valid */
4994 				lbsize = sdinfo->satadrv_id.ai_words_lsec[0] |
4995 				    (sdinfo->satadrv_id.ai_words_lsec[1] << 16);
4996 				lbsize <<= 1; /* convert from words to bytes */
4997 			}
4998 		}
4999 
5000 		rbuf = (uchar_t *)bp->b_un.b_addr;
5001 		bzero(rbuf, bp->b_bcount);
5002 
5003 		/* returned logical block address */
5004 		rbuf[0] = (val >> 56) & 0xff;
5005 		rbuf[1] = (val >> 48) & 0xff;
5006 		rbuf[2] = (val >> 40) & 0xff;
5007 		rbuf[3] = (val >> 32) & 0xff;
5008 		rbuf[4] = (val >> 24) & 0xff;
5009 		rbuf[5] = (val >> 16) & 0xff;
5010 		rbuf[6] = (val >> 8) & 0xff;
5011 		rbuf[7] = val & 0xff;
5012 		rbuf[8] = (lbsize >> 24) & 0xff;
5013 		rbuf[9] = (lbsize >> 16) & 0xff;
5014 		rbuf[10] = (lbsize >> 8) & 0xff;
5015 		rbuf[11] = lbsize & 0xff;
5016 
5017 		/* p_type, prot_en, unspecified by SAT-2 */
5018 		/* rbuf[12] = 0; */
5019 
5020 		/* p_i_exponent, undefined by SAT-2 */
5021 		/* logical blocks per physical block exponent */
5022 		rbuf[13] = l2p_exp;
5023 
5024 		/*
5025 		 * tpe and tprz as defined in T10/10-079 r0.
5026 		 * TRIM support is indicated by the relevant bit in the data
5027 		 * set management word. Read-after-trim behavior is indicated
5028 		 * by the additional bits in the identify device word. Of the
5029 		 * three defined possibilities, we only flag read-zero.
5030 		 */
5031 		if (sdinfo->satadrv_id.ai_dsm & SATA_DSM_TRIM) {
5032 			rbuf[14] |= TPE;
5033 
5034 			if ((sdinfo->satadrv_id.ai_addsupported &
5035 			    SATA_DETERMINISTIC_READ) &&
5036 			    (sdinfo->satadrv_id.ai_addsupported &
5037 			    SATA_READ_ZERO)) {
5038 				rbuf[14] |= TPRZ;
5039 			}
5040 		}
5041 
5042 		/* lowest aligned logical block address = 0 (for now) */
5043 		/* rbuf[15] = 0; */
5044 
5045 		scsipkt->pkt_state |= STATE_XFERRED_DATA;
5046 		scsipkt->pkt_resid = 0;
5047 
5048 		SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst, "%llu\n",
5049 		    sdinfo->satadrv_capacity -1);
5050 	}
5051 
5052 	mutex_exit(cport_mutex);
5053 
5054 	/*
5055 	 * If a callback was requested, do it now.
5056 	 */
5057 	SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
5058 	    "Scsi_pkt completion reason %x\n", scsipkt->pkt_reason);
5059 
5060 	if ((scsipkt->pkt_flags & FLAG_NOINTR) == 0 &&
5061 	    scsipkt->pkt_comp != NULL) {
5062 		/* scsi callback required */
5063 		if (servicing_interrupt()) {
5064 			if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
5065 			    (task_func_t *)spx->txlt_scsi_pkt->pkt_comp,
5066 			    (void *)spx->txlt_scsi_pkt, TQ_NOSLEEP) ==
5067 			    TASKQID_INVALID) {
5068 				return (TRAN_BUSY);
5069 			}
5070 		} else if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
5071 		    (task_func_t *)spx->txlt_scsi_pkt->pkt_comp,
5072 		    (void *)spx->txlt_scsi_pkt, TQ_SLEEP) == TASKQID_INVALID) {
5073 			/* Scheduling the callback failed */
5074 			return (TRAN_BUSY);
5075 		}
5076 	}
5077 
5078 	return (TRAN_ACCEPT);
5079 }
5080 
5081 static boolean_t
sata_txlt_unmap_supported(sata_pkt_txlate_t * spx,sata_drive_info_t * sdinfo)5082 sata_txlt_unmap_supported(sata_pkt_txlate_t *spx, sata_drive_info_t *sdinfo)
5083 {
5084 	const sata_id_t *id = &sdinfo->satadrv_id;
5085 
5086 	ASSERT(MUTEX_HELD(&SATA_TXLT_CPORT_MUTEX(spx)));
5087 
5088 	/*
5089 	 * SAT-5 9.24.1 If the TRIM SUPPORTED bit is zero or the
5090 	 * DRAT SUPPORTED bit is zero, then UNMAP is not supported.
5091 	 */
5092 	if (!(id->ai_dsm & SATA_DSM_TRIM) ||
5093 	    !(id->ai_addsupported & SATA_DETERMINISTIC_READ)) {
5094 		return (B_FALSE);
5095 	}
5096 
5097 	return (B_TRUE);
5098 }
5099 
5100 /*
5101  * Translate command: UNMAP
5102  *
5103  * The function cannot be called in interrupt context since it may sleep.
5104  */
5105 static int
sata_txlt_unmap(sata_pkt_txlate_t * spx)5106 sata_txlt_unmap(sata_pkt_txlate_t *spx)
5107 {
5108 	struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
5109 	sata_cmd_t *scmd = &spx->txlt_sata_pkt->satapkt_cmd;
5110 	struct buf *bp = spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp;
5111 	uint16_t count = 0;
5112 	int synch;
5113 	int rval, reason;
5114 	int i, x;
5115 	int bdlen = 0;
5116 	int ranges = 0;
5117 	int paramlen = 8;
5118 	uint8_t *data, *tmpbd;
5119 	sata_drive_info_t *sdinfo;
5120 	kmutex_t *cport_mutex = &(SATA_TXLT_CPORT_MUTEX(spx));
5121 #define	TRIM	0x1
5122 
5123 	SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
5124 	    "sata_txlt_unmap: ", NULL);
5125 
5126 	mutex_enter(cport_mutex);
5127 
5128 	sdinfo = sata_get_device_info(spx->txlt_sata_hba_inst,
5129 	    &spx->txlt_sata_pkt->satapkt_device);
5130 	if (sdinfo != NULL) {
5131 		SATADBG2(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
5132 		    "DSM support 0x%x, max number of 512 byte blocks of LBA "
5133 		    "range entries 0x%x\n", sdinfo->satadrv_id.ai_dsm,
5134 		    sdinfo->satadrv_id.ai_maxcount);
5135 	}
5136 
5137 	rval = sata_txlt_generic_pkt_info(spx, &reason, 1);
5138 	if ((rval != TRAN_ACCEPT) || (reason == CMD_DEV_GONE)) {
5139 		mutex_exit(cport_mutex);
5140 		return (rval);
5141 	}
5142 
5143 	if (!sata_txlt_unmap_supported(spx, sdinfo)) {
5144 		mutex_exit(cport_mutex);
5145 		return (sata_txlt_invalid_command(spx));
5146 	}
5147 
5148 	/*
5149 	 * Need to modify bp to have TRIM data instead of UNMAP data.
5150 	 * Start by getting the block descriptor data length by subtracting
5151 	 * the 8 byte parameter list header from the parameter list length.
5152 	 * The block descriptor size has to be a multiple of 16 bytes.
5153 	 */
5154 	bdlen = scsipkt->pkt_cdbp[7];
5155 	bdlen = (bdlen << 8) + scsipkt->pkt_cdbp[8] - paramlen;
5156 	if ((bdlen < 0) || ((bdlen % 16) != 0) ||
5157 	    ((bp != NULL) && (bdlen > (bp->b_bcount - paramlen)))) {
5158 		SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
5159 		    "sata_txlt_unmap: invalid block descriptor length", NULL);
5160 		mutex_exit(cport_mutex);
5161 		return ((sata_txlt_check_condition(spx, KEY_ILLEGAL_REQUEST,
5162 		    SD_SCSI_ASC_INVALID_FIELD_IN_CDB)));
5163 	}
5164 	/*
5165 	 * If there are no parameter data or block descriptors, it is not
5166 	 * considered an error so just complete the command without sending
5167 	 * TRIM.
5168 	 */
5169 	if ((bdlen == 0) || (bp == NULL) || (bp->b_un.b_addr == NULL) ||
5170 	    (bp->b_bcount == 0)) {
5171 		SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
5172 		    "sata_txlt_unmap: no parameter data or block descriptors",
5173 		    NULL);
5174 		mutex_exit(cport_mutex);
5175 		return (sata_txlt_unmap_nodata_cmd(spx));
5176 	}
5177 	tmpbd = (uint8_t *)bp->b_un.b_addr + paramlen;
5178 	data = kmem_zalloc(bdlen, KM_SLEEP);
5179 
5180 	/*
5181 	 * Loop through all the UNMAP block descriptors and convert the data
5182 	 * into TRIM format.
5183 	 */
5184 	for (i = 0, x = 0; i < bdlen; i += 16, x += 8) {
5185 		/* get range length */
5186 		data[x] = tmpbd[i+7];
5187 		data[x+1] = tmpbd[i+6];
5188 		/* get LBA */
5189 		data[x+2] = tmpbd[i+5];
5190 		data[x+3] = tmpbd[i+4];
5191 		data[x+4] = tmpbd[i+3];
5192 		data[x+5] = tmpbd[i+2];
5193 		data[x+6] = tmpbd[i+11];
5194 		data[x+7] = tmpbd[i+10];
5195 
5196 		ranges++;
5197 	}
5198 
5199 	/*
5200 	 * The TRIM command expects the data buffer to be a multiple of
5201 	 * 512-byte blocks of range entries.  This means that the UNMAP buffer
5202 	 * may be too small.  Free the original DMA resources and create a
5203 	 * local buffer.
5204 	 */
5205 	sata_common_free_dma_rsrcs(spx);
5206 
5207 	/*
5208 	 * Get count of 512-byte blocks of range entries.  The length
5209 	 * of a range entry is 8 bytes which means one count has 64 range
5210 	 * entries.
5211 	 */
5212 	count = (ranges + 63)/64;
5213 
5214 	/* Allocate a buffer that is a multiple of 512 bytes. */
5215 	mutex_exit(cport_mutex);
5216 	bp = sata_alloc_local_buffer(spx, (size_t)count * 512);
5217 	if (bp == NULL) {
5218 		SATADBG1(SATA_DBG_ATAPI, spx->txlt_sata_hba_inst,
5219 		    "sata_txlt_unmap: "
5220 		    "cannot allocate buffer for TRIM command", NULL);
5221 		kmem_free(data, bdlen);
5222 		return (TRAN_BUSY);
5223 	}
5224 	bp_mapin(bp); /* make data buffer accessible */
5225 	mutex_enter(cport_mutex);
5226 
5227 	bzero(bp->b_un.b_addr, bp->b_bcount);
5228 	bcopy(data, bp->b_un.b_addr, x);
5229 	kmem_free(data, bdlen);
5230 	rval = ddi_dma_sync(spx->txlt_buf_dma_handle, 0, 0,
5231 	    DDI_DMA_SYNC_FORDEV);
5232 	ASSERT(rval == DDI_SUCCESS);
5233 
5234 	scmd->satacmd_flags.sata_data_direction = SATA_DIR_WRITE;
5235 	scmd->satacmd_addr_type = ATA_ADDR_LBA48;
5236 	scmd->satacmd_cmd_reg = SATAC_DSM;
5237 	scmd->satacmd_sec_count_msb = (count >> 8) & 0xff;
5238 	scmd->satacmd_sec_count_lsb = count & 0xff;
5239 	scmd->satacmd_features_reg = TRIM;
5240 	scmd->satacmd_device_reg = SATA_ADH_LBA;
5241 	scmd->satacmd_status_reg = 0;
5242 	scmd->satacmd_error_reg = 0;
5243 
5244 	/* Start processing command */
5245 	if (!(spx->txlt_sata_pkt->satapkt_op_mode & SATA_OPMODE_SYNCH)) {
5246 		spx->txlt_sata_pkt->satapkt_comp =
5247 		    sata_txlt_unmap_completion;
5248 		synch = FALSE;
5249 	} else {
5250 		synch = TRUE;
5251 	}
5252 
5253 	if (sata_hba_start(spx, &rval) != 0) {
5254 		mutex_exit(cport_mutex);
5255 		return (rval);
5256 	}
5257 
5258 	mutex_exit(cport_mutex);
5259 
5260 	if (synch) {
5261 		sata_txlt_unmap_completion(spx->txlt_sata_pkt);
5262 	}
5263 
5264 	return (TRAN_ACCEPT);
5265 }
5266 
5267 /*
5268  * SATA translate command: Mode Sense.
5269  * Translated into appropriate SATA command or emulated.
5270  * Saved Values Page Control (03) are not supported.
5271  *
5272  * NOTE: only caching mode sense page is currently implemented.
5273  *
5274  * Returns TRAN_ACCEPT and appropriate values in scsi_pkt fields.
5275  */
5276 
5277 #define	LLBAA	0x10	/* Long LBA Accepted */
5278 
5279 static int
sata_txlt_mode_sense(sata_pkt_txlate_t * spx)5280 sata_txlt_mode_sense(sata_pkt_txlate_t *spx)
5281 {
5282 	struct scsi_pkt	*scsipkt = spx->txlt_scsi_pkt;
5283 	struct buf	*bp = spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp;
5284 	sata_drive_info_t *sdinfo;
5285 	sata_id_t *sata_id;
5286 	struct scsi_extended_sense *sense;
5287 	int		len, bdlen, count, alc_len;
5288 	int		pc;	/* Page Control code */
5289 	uint8_t		*buf;	/* mode sense buffer */
5290 	int		rval, reason;
5291 	kmutex_t	*cport_mutex = &(SATA_TXLT_CPORT_MUTEX(spx));
5292 
5293 	SATADBG2(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
5294 	    "sata_txlt_mode_sense, pc %x page code 0x%02x\n",
5295 	    spx->txlt_scsi_pkt->pkt_cdbp[2] >> 6,
5296 	    spx->txlt_scsi_pkt->pkt_cdbp[2] & 0x3f);
5297 
5298 	if (servicing_interrupt()) {
5299 		buf = kmem_zalloc(1024, KM_NOSLEEP);
5300 		if (buf == NULL) {
5301 			return (TRAN_BUSY);
5302 		}
5303 	} else {
5304 		buf = kmem_zalloc(1024, KM_SLEEP);
5305 	}
5306 
5307 	mutex_enter(cport_mutex);
5308 
5309 	if (((rval = sata_txlt_generic_pkt_info(spx, &reason, 0)) !=
5310 	    TRAN_ACCEPT) || (reason == CMD_DEV_GONE)) {
5311 		mutex_exit(cport_mutex);
5312 		kmem_free(buf, 1024);
5313 		return (rval);
5314 	}
5315 
5316 	scsipkt->pkt_reason = CMD_CMPLT;
5317 	scsipkt->pkt_state = STATE_GOT_BUS | STATE_GOT_TARGET |
5318 	    STATE_SENT_CMD | STATE_GOT_STATUS;
5319 
5320 	pc = scsipkt->pkt_cdbp[2] >> 6;
5321 
5322 	if (bp != NULL && bp->b_un.b_addr && bp->b_bcount) {
5323 		/*
5324 		 * Because it is fully emulated command storing data
5325 		 * programatically in the specified buffer, release
5326 		 * preallocated DMA resources before storing data in the buffer,
5327 		 * so no unwanted DMA sync would take place.
5328 		 */
5329 		sata_scsi_dmafree(NULL, scsipkt);
5330 
5331 		len = 0;
5332 		bdlen = 0;
5333 		if (!(scsipkt->pkt_cdbp[1] & 8)) {
5334 			if (scsipkt->pkt_cdbp[0] == SCMD_MODE_SENSE_G1 &&
5335 			    (scsipkt->pkt_cdbp[1] & LLBAA))
5336 				bdlen = 16;
5337 			else
5338 				bdlen = 8;
5339 		}
5340 		/* Build mode parameter header */
5341 		if (spx->txlt_scsi_pkt->pkt_cdbp[0] == SCMD_MODE_SENSE) {
5342 			/* 4-byte mode parameter header */
5343 			buf[len++] = 0;		/* mode data length */
5344 			buf[len++] = 0;		/* medium type */
5345 			buf[len++] = 0;		/* dev-specific param */
5346 			buf[len++] = bdlen;	/* Block Descriptor length */
5347 		} else {
5348 			/* 8-byte mode parameter header */
5349 			buf[len++] = 0;		/* mode data length */
5350 			buf[len++] = 0;
5351 			buf[len++] = 0;		/* medium type */
5352 			buf[len++] = 0;		/* dev-specific param */
5353 			if (bdlen == 16)
5354 				buf[len++] = 1;	/* long lba descriptor */
5355 			else
5356 				buf[len++] = 0;
5357 			buf[len++] = 0;
5358 			buf[len++] = 0;		/* Block Descriptor length */
5359 			buf[len++] = bdlen;
5360 		}
5361 
5362 		sdinfo = sata_get_device_info(
5363 		    spx->txlt_sata_hba_inst,
5364 		    &spx->txlt_sata_pkt->satapkt_device);
5365 
5366 		/* Build block descriptor only if not disabled (DBD) */
5367 		if ((scsipkt->pkt_cdbp[1] & 0x08) == 0) {
5368 			/* Block descriptor - direct-access device format */
5369 			if (bdlen == 8) {
5370 				/* build regular block descriptor */
5371 				buf[len++] =
5372 				    (sdinfo->satadrv_capacity >> 24) & 0xff;
5373 				buf[len++] =
5374 				    (sdinfo->satadrv_capacity >> 16) & 0xff;
5375 				buf[len++] =
5376 				    (sdinfo->satadrv_capacity >> 8) & 0xff;
5377 				buf[len++] = sdinfo->satadrv_capacity & 0xff;
5378 				buf[len++] = 0; /* density code */
5379 				buf[len++] = 0;
5380 				if (sdinfo->satadrv_type ==
5381 				    SATA_DTYPE_ATADISK)
5382 					buf[len++] = 2;
5383 				else
5384 					/* ATAPI */
5385 					buf[len++] = 8;
5386 				buf[len++] = 0;
5387 			} else if (bdlen == 16) {
5388 				/* Long LBA Accepted */
5389 				/* build long lba block descriptor */
5390 #ifndef __lock_lint
5391 				buf[len++] =
5392 				    (sdinfo->satadrv_capacity >> 56) & 0xff;
5393 				buf[len++] =
5394 				    (sdinfo->satadrv_capacity >> 48) & 0xff;
5395 				buf[len++] =
5396 				    (sdinfo->satadrv_capacity >> 40) & 0xff;
5397 				buf[len++] =
5398 				    (sdinfo->satadrv_capacity >> 32) & 0xff;
5399 #endif
5400 				buf[len++] =
5401 				    (sdinfo->satadrv_capacity >> 24) & 0xff;
5402 				buf[len++] =
5403 				    (sdinfo->satadrv_capacity >> 16) & 0xff;
5404 				buf[len++] =
5405 				    (sdinfo->satadrv_capacity >> 8) & 0xff;
5406 				buf[len++] = sdinfo->satadrv_capacity & 0xff;
5407 				buf[len++] = 0;
5408 				buf[len++] = 0; /* density code */
5409 				buf[len++] = 0;
5410 				buf[len++] = 0;
5411 				if (sdinfo->satadrv_type ==
5412 				    SATA_DTYPE_ATADISK)
5413 					buf[len++] = 2;
5414 				else
5415 					/* ATAPI */
5416 					buf[len++] = 8;
5417 				buf[len++] = 0;
5418 			}
5419 		}
5420 
5421 		sata_id = &sdinfo->satadrv_id;
5422 
5423 		/*
5424 		 * Add requested pages.
5425 		 * Page 3 and 4 are obsolete and we are not supporting them.
5426 		 * We deal now with:
5427 		 * caching (read/write cache control).
5428 		 * We should eventually deal with following mode pages:
5429 		 * error recovery  (0x01),
5430 		 * power condition (0x1a),
5431 		 * exception control page (enables SMART) (0x1c),
5432 		 * enclosure management (ses),
5433 		 * protocol-specific port mode (port control).
5434 		 */
5435 		switch (scsipkt->pkt_cdbp[2] & 0x3f) {
5436 		case MODEPAGE_RW_ERRRECOV:
5437 			/* DAD_MODE_ERR_RECOV */
5438 			/* R/W recovery */
5439 			len += sata_build_msense_page_1(sdinfo, pc, buf+len);
5440 			break;
5441 		case MODEPAGE_CACHING:
5442 			/* DAD_MODE_CACHE */
5443 			/* Reject not supported request for saved parameters */
5444 			if (pc == 3) {
5445 				*scsipkt->pkt_scbp = STATUS_CHECK;
5446 				sense = sata_arq_sense(spx);
5447 				sense->es_key = KEY_ILLEGAL_REQUEST;
5448 				sense->es_add_code =
5449 				    SD_SCSI_ASC_SAVING_PARAMS_NOT_SUPPORTED;
5450 				goto done;
5451 			}
5452 
5453 			/* caching */
5454 			len += sata_build_msense_page_8(sdinfo, pc, buf+len);
5455 			break;
5456 		case MODEPAGE_INFO_EXCPT:
5457 			/* exception cntrl */
5458 			if (sata_id->ai_cmdset82 & SATA_SMART_SUPPORTED) {
5459 				len += sata_build_msense_page_1c(sdinfo, pc,
5460 				    buf+len);
5461 			}
5462 			else
5463 				goto err;
5464 			break;
5465 		case MODEPAGE_POWER_COND:
5466 			/* DAD_MODE_POWER_COND */
5467 			/* power condition */
5468 			len += sata_build_msense_page_1a(sdinfo, pc, buf+len);
5469 			break;
5470 
5471 		case MODEPAGE_ACOUSTIC_MANAG:
5472 			/* acoustic management */
5473 			len += sata_build_msense_page_30(sdinfo, pc, buf+len);
5474 			break;
5475 		case MODEPAGE_ALLPAGES:
5476 			/* all pages */
5477 			len += sata_build_msense_page_1(sdinfo, pc, buf+len);
5478 			len += sata_build_msense_page_8(sdinfo, pc, buf+len);
5479 			len += sata_build_msense_page_1a(sdinfo, pc, buf+len);
5480 			if (sata_id->ai_cmdset82 & SATA_SMART_SUPPORTED) {
5481 				len += sata_build_msense_page_1c(sdinfo, pc,
5482 				    buf+len);
5483 			}
5484 			len += sata_build_msense_page_30(sdinfo, pc, buf+len);
5485 			break;
5486 		default:
5487 		err:
5488 			/* Invalid request */
5489 			*scsipkt->pkt_scbp = STATUS_CHECK;
5490 			sense = sata_arq_sense(spx);
5491 			sense->es_key = KEY_ILLEGAL_REQUEST;
5492 			sense->es_add_code = SD_SCSI_ASC_INVALID_FIELD_IN_CDB;
5493 			goto done;
5494 		}
5495 
5496 		/* fix total mode data length */
5497 		if (spx->txlt_scsi_pkt->pkt_cdbp[0] == SCMD_MODE_SENSE) {
5498 			/* 4-byte mode parameter header */
5499 			buf[0] = len - 1;	/* mode data length */
5500 		} else {
5501 			buf[0] = (len -2) >> 8;
5502 			buf[1] = (len -2) & 0xff;
5503 		}
5504 
5505 
5506 		/* Check allocation length */
5507 		if (scsipkt->pkt_cdbp[0] == SCMD_MODE_SENSE) {
5508 			alc_len = scsipkt->pkt_cdbp[4];
5509 		} else {
5510 			alc_len = scsipkt->pkt_cdbp[7];
5511 			alc_len = (alc_len << 8) | scsipkt->pkt_cdbp[8];
5512 		}
5513 		/*
5514 		 * We do not check for possible parameters truncation
5515 		 * (alc_len < len) assuming that the target driver works
5516 		 * correctly. Just avoiding overrun.
5517 		 * Copy no more than requested and possible, buffer-wise.
5518 		 */
5519 		count = MIN(alc_len, len);
5520 		count = MIN(bp->b_bcount, count);
5521 		bcopy(buf, bp->b_un.b_addr, count);
5522 
5523 		scsipkt->pkt_state |= STATE_XFERRED_DATA;
5524 		scsipkt->pkt_resid = alc_len > count ? alc_len - count : 0;
5525 	}
5526 	*scsipkt->pkt_scbp = STATUS_GOOD;
5527 done:
5528 	mutex_exit(cport_mutex);
5529 	(void) kmem_free(buf, 1024);
5530 
5531 	SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
5532 	    "Scsi_pkt completion reason %x\n", scsipkt->pkt_reason);
5533 
5534 	if ((scsipkt->pkt_flags & FLAG_NOINTR) == 0 &&
5535 	    scsipkt->pkt_comp != NULL) {
5536 		/* scsi callback required */
5537 		if (servicing_interrupt()) {
5538 			if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
5539 			    (task_func_t *)spx->txlt_scsi_pkt->pkt_comp,
5540 			    (void *)spx->txlt_scsi_pkt, TQ_NOSLEEP) ==
5541 			    TASKQID_INVALID) {
5542 				return (TRAN_BUSY);
5543 			}
5544 		} else if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
5545 		    (task_func_t *)spx->txlt_scsi_pkt->pkt_comp,
5546 		    (void *)spx->txlt_scsi_pkt, TQ_SLEEP) == TASKQID_INVALID) {
5547 			/* Scheduling the callback failed */
5548 			return (TRAN_BUSY);
5549 		}
5550 	}
5551 
5552 	return (TRAN_ACCEPT);
5553 }
5554 
5555 
5556 /*
5557  * SATA translate command: Mode Select.
5558  * Translated into appropriate SATA command or emulated.
5559  * Saving parameters is not supported.
5560  * Changing device capacity is not supported (although theoretically
5561  * possible by executing SET FEATURES/SET MAX ADDRESS)
5562  *
5563  * Assumption is that the target driver is working correctly.
5564  *
5565  * More than one SATA command may be executed to perform operations specified
5566  * by mode select pages. The first error terminates further execution.
5567  * Operations performed successully are not backed-up in such case.
5568  *
5569  * NOTE: Implemented pages:
5570  * - caching page
5571  * - informational exception page
5572  * - acoustic management page
5573  * - power condition page
5574  * Caching setup is remembered so it could be re-stored in case of
5575  * an unexpected device reset.
5576  *
5577  * Returns TRAN_XXXX.
5578  * If TRAN_ACCEPT is returned, appropriate values are set in scsi_pkt fields.
5579  */
5580 
5581 static int
sata_txlt_mode_select(sata_pkt_txlate_t * spx)5582 sata_txlt_mode_select(sata_pkt_txlate_t *spx)
5583 {
5584 	struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
5585 	struct buf *bp = spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp;
5586 	struct scsi_extended_sense *sense;
5587 	int len, pagelen, count, pllen;
5588 	uint8_t *buf;	/* mode select buffer */
5589 	int rval, stat, reason;
5590 	uint_t nointr_flag;
5591 	int dmod = 0;
5592 	kmutex_t *cport_mutex = &(SATA_TXLT_CPORT_MUTEX(spx));
5593 
5594 	SATADBG2(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
5595 	    "sata_txlt_mode_select, pc %x page code 0x%02x\n",
5596 	    spx->txlt_scsi_pkt->pkt_cdbp[2] >> 6,
5597 	    spx->txlt_scsi_pkt->pkt_cdbp[2] & 0x3f);
5598 
5599 	mutex_enter(cport_mutex);
5600 
5601 	if (((rval = sata_txlt_generic_pkt_info(spx, &reason, 1)) !=
5602 	    TRAN_ACCEPT) || (reason == CMD_DEV_GONE)) {
5603 		mutex_exit(cport_mutex);
5604 		return (rval);
5605 	}
5606 
5607 	rval = TRAN_ACCEPT;
5608 
5609 	scsipkt->pkt_reason = CMD_CMPLT;
5610 	scsipkt->pkt_state = STATE_GOT_BUS | STATE_GOT_TARGET |
5611 	    STATE_SENT_CMD | STATE_GOT_STATUS;
5612 	nointr_flag = scsipkt->pkt_flags & FLAG_NOINTR;
5613 
5614 	/* Reject not supported request */
5615 	if (! (scsipkt->pkt_cdbp[1] & 0x10)) { /* No support for PF bit = 0 */
5616 		*scsipkt->pkt_scbp = STATUS_CHECK;
5617 		sense = sata_arq_sense(spx);
5618 		sense->es_key = KEY_ILLEGAL_REQUEST;
5619 		sense->es_add_code = SD_SCSI_ASC_INVALID_FIELD_IN_CDB;
5620 		goto done;
5621 	}
5622 
5623 	if (scsipkt->pkt_cdbp[0] == SCMD_MODE_SELECT) {
5624 		pllen = scsipkt->pkt_cdbp[4];
5625 	} else {
5626 		pllen = scsipkt->pkt_cdbp[7];
5627 		pllen = (pllen << 8) | scsipkt->pkt_cdbp[7];
5628 	}
5629 
5630 	*scsipkt->pkt_scbp = STATUS_GOOD;	/* Presumed outcome */
5631 
5632 	if (bp != NULL && bp->b_un.b_addr && bp->b_bcount && pllen != 0) {
5633 		buf = (uint8_t *)bp->b_un.b_addr;
5634 		count = MIN(bp->b_bcount, pllen);
5635 		scsipkt->pkt_state |= STATE_XFERRED_DATA;
5636 		scsipkt->pkt_resid = 0;
5637 		pllen = count;
5638 
5639 		/*
5640 		 * Check the header to skip the block descriptor(s) - we
5641 		 * do not support setting device capacity.
5642 		 * Existing macros do not recognize long LBA dscriptor,
5643 		 * hence manual calculation.
5644 		 */
5645 		if (scsipkt->pkt_cdbp[0] == SCMD_MODE_SELECT) {
5646 			/* 6-bytes CMD, 4 bytes header */
5647 			if (count <= 4)
5648 				goto done;		/* header only */
5649 			len = buf[3] + 4;
5650 		} else {
5651 			/* 10-bytes CMD, 8 bytes header */
5652 			if (count <= 8)
5653 				goto done;		/* header only */
5654 			len = buf[6];
5655 			len = (len << 8) + buf[7] + 8;
5656 		}
5657 		if (len >= count)
5658 			goto done;	/* header + descriptor(s) only */
5659 
5660 		pllen -= len;		/* remaining data length */
5661 
5662 		/*
5663 		 * We may be executing SATA command and want to execute it
5664 		 * in SYNCH mode, regardless of scsi_pkt setting.
5665 		 * Save scsi_pkt setting and indicate SYNCH mode
5666 		 */
5667 		if ((scsipkt->pkt_flags & FLAG_NOINTR) == 0 &&
5668 		    scsipkt->pkt_comp != NULL) {
5669 			scsipkt->pkt_flags |= FLAG_NOINTR;
5670 		}
5671 		spx->txlt_sata_pkt->satapkt_op_mode = SATA_OPMODE_SYNCH;
5672 
5673 		/*
5674 		 * len is now the offset to a first mode select page
5675 		 * Process all pages
5676 		 */
5677 		while (pllen > 0) {
5678 			switch ((int)buf[len]) {
5679 			case MODEPAGE_CACHING:
5680 				/* No support for SP (saving) */
5681 				if (scsipkt->pkt_cdbp[1] & 0x01) {
5682 					*scsipkt->pkt_scbp = STATUS_CHECK;
5683 					sense = sata_arq_sense(spx);
5684 					sense->es_key = KEY_ILLEGAL_REQUEST;
5685 					sense->es_add_code =
5686 					    SD_SCSI_ASC_INVALID_FIELD_IN_CDB;
5687 					goto done;
5688 				}
5689 				stat = sata_mode_select_page_8(spx,
5690 				    (struct mode_cache_scsi3 *)&buf[len],
5691 				    pllen, &pagelen, &rval, &dmod);
5692 				/*
5693 				 * The pagelen value indicates the number of
5694 				 * parameter bytes already processed.
5695 				 * The rval is the return value from
5696 				 * sata_tran_start().
5697 				 * The stat indicates the overall status of
5698 				 * the operation(s).
5699 				 */
5700 				if (stat != SATA_SUCCESS)
5701 					/*
5702 					 * Page processing did not succeed -
5703 					 * all error info is already set-up,
5704 					 * just return
5705 					 */
5706 					pllen = 0; /* this breaks the loop */
5707 				else {
5708 					len += pagelen;
5709 					pllen -= pagelen;
5710 				}
5711 				break;
5712 
5713 			case MODEPAGE_INFO_EXCPT:
5714 				stat = sata_mode_select_page_1c(spx,
5715 				    (struct mode_info_excpt_page *)&buf[len],
5716 				    pllen, &pagelen, &rval, &dmod);
5717 				/*
5718 				 * The pagelen value indicates the number of
5719 				 * parameter bytes already processed.
5720 				 * The rval is the return value from
5721 				 * sata_tran_start().
5722 				 * The stat indicates the overall status of
5723 				 * the operation(s).
5724 				 */
5725 				if (stat != SATA_SUCCESS)
5726 					/*
5727 					 * Page processing did not succeed -
5728 					 * all error info is already set-up,
5729 					 * just return
5730 					 */
5731 					pllen = 0; /* this breaks the loop */
5732 				else {
5733 					len += pagelen;
5734 					pllen -= pagelen;
5735 				}
5736 				break;
5737 
5738 			case MODEPAGE_ACOUSTIC_MANAG:
5739 				stat = sata_mode_select_page_30(spx,
5740 				    (struct mode_acoustic_management *)
5741 				    &buf[len], pllen, &pagelen, &rval, &dmod);
5742 				/*
5743 				 * The pagelen value indicates the number of
5744 				 * parameter bytes already processed.
5745 				 * The rval is the return value from
5746 				 * sata_tran_start().
5747 				 * The stat indicates the overall status of
5748 				 * the operation(s).
5749 				 */
5750 				if (stat != SATA_SUCCESS)
5751 					/*
5752 					 * Page processing did not succeed -
5753 					 * all error info is already set-up,
5754 					 * just return
5755 					 */
5756 					pllen = 0; /* this breaks the loop */
5757 				else {
5758 					len += pagelen;
5759 					pllen -= pagelen;
5760 				}
5761 
5762 				break;
5763 			case MODEPAGE_POWER_COND:
5764 				stat = sata_mode_select_page_1a(spx,
5765 				    (struct mode_info_power_cond *)&buf[len],
5766 				    pllen, &pagelen, &rval, &dmod);
5767 				/*
5768 				 * The pagelen value indicates the number of
5769 				 * parameter bytes already processed.
5770 				 * The rval is the return value from
5771 				 * sata_tran_start().
5772 				 * The stat indicates the overall status of
5773 				 * the operation(s).
5774 				 */
5775 				if (stat != SATA_SUCCESS)
5776 					/*
5777 					 * Page processing did not succeed -
5778 					 * all error info is already set-up,
5779 					 * just return
5780 					 */
5781 					pllen = 0; /* this breaks the loop */
5782 				else {
5783 					len += pagelen;
5784 					pllen -= pagelen;
5785 				}
5786 				break;
5787 			default:
5788 				*scsipkt->pkt_scbp = STATUS_CHECK;
5789 				sense = sata_arq_sense(spx);
5790 				sense->es_key = KEY_ILLEGAL_REQUEST;
5791 				sense->es_add_code =
5792 				    SD_SCSI_ASC_INVALID_FIELD_IN_PARAMS_LIST;
5793 				goto done;
5794 			}
5795 		}
5796 	}
5797 done:
5798 	mutex_exit(cport_mutex);
5799 	/*
5800 	 * If device parameters were modified, fetch and store the new
5801 	 * Identify Device data. Since port mutex could have been released
5802 	 * for accessing HBA driver, we need to re-check device existence.
5803 	 */
5804 	if (dmod != 0) {
5805 		sata_drive_info_t new_sdinfo, *sdinfo;
5806 		int rv = 0;
5807 
5808 		/*
5809 		 * Following statement has to be changed if this function is
5810 		 * used for devices other than SATA hard disks.
5811 		 */
5812 		new_sdinfo.satadrv_type = SATA_DTYPE_ATADISK;
5813 
5814 		new_sdinfo.satadrv_addr =
5815 		    spx->txlt_sata_pkt->satapkt_device.satadev_addr;
5816 		rv = sata_fetch_device_identify_data(spx->txlt_sata_hba_inst,
5817 		    &new_sdinfo);
5818 
5819 		mutex_enter(cport_mutex);
5820 		/*
5821 		 * Since port mutex could have been released when
5822 		 * accessing HBA driver, we need to re-check that the
5823 		 * framework still holds the device info structure.
5824 		 */
5825 		sdinfo = sata_get_device_info(spx->txlt_sata_hba_inst,
5826 		    &spx->txlt_sata_pkt->satapkt_device);
5827 		if (sdinfo != NULL) {
5828 			/*
5829 			 * Device still has info structure in the
5830 			 * sata framework. Copy newly fetched info
5831 			 */
5832 			if (rv == 0) {
5833 				sdinfo->satadrv_id = new_sdinfo.satadrv_id;
5834 				sata_save_drive_settings(sdinfo);
5835 			} else {
5836 				/*
5837 				 * Could not fetch new data - invalidate
5838 				 * sata_drive_info. That makes device
5839 				 * unusable.
5840 				 */
5841 				sdinfo->satadrv_type = SATA_DTYPE_UNKNOWN;
5842 				sdinfo->satadrv_state = SATA_STATE_UNKNOWN;
5843 			}
5844 		}
5845 		if (rv != 0 || sdinfo == NULL) {
5846 			/*
5847 			 * This changes the overall mode select completion
5848 			 * reason to a failed one !!!!!
5849 			 */
5850 			*scsipkt->pkt_scbp = STATUS_CHECK;
5851 			sense = sata_arq_sense(spx);
5852 			scsipkt->pkt_reason = CMD_INCOMPLETE;
5853 			rval = TRAN_ACCEPT;
5854 		}
5855 		mutex_exit(cport_mutex);
5856 	}
5857 	/* Restore the scsi pkt flags */
5858 	scsipkt->pkt_flags &= ~FLAG_NOINTR;
5859 	scsipkt->pkt_flags |= nointr_flag;
5860 
5861 	SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
5862 	    "Scsi_pkt completion reason %x\n", scsipkt->pkt_reason);
5863 
5864 	if ((scsipkt->pkt_flags & FLAG_NOINTR) == 0 &&
5865 	    scsipkt->pkt_comp != NULL) {
5866 		/* scsi callback required */
5867 		if (servicing_interrupt()) {
5868 			if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
5869 			    (task_func_t *)spx->txlt_scsi_pkt->pkt_comp,
5870 			    (void *)spx->txlt_scsi_pkt, TQ_NOSLEEP) ==
5871 			    TASKQID_INVALID) {
5872 				return (TRAN_BUSY);
5873 			}
5874 		} else if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
5875 		    (task_func_t *)spx->txlt_scsi_pkt->pkt_comp,
5876 		    (void *)spx->txlt_scsi_pkt, TQ_SLEEP) == TASKQID_INVALID) {
5877 			/* Scheduling the callback failed */
5878 			return (TRAN_BUSY);
5879 		}
5880 	}
5881 
5882 	return (rval);
5883 }
5884 
5885 /*
5886  * Translate command: ATA Pass Through
5887  * Incomplete implementation.  Only supports No-Data, PIO Data-In, and
5888  * PIO Data-Out protocols.  Also supports CK_COND bit.
5889  *
5890  * Mapping of the incoming CDB bytes to the outgoing satacmd bytes is
5891  * described in Table 111 of SAT-2 (Draft 9).
5892  */
5893 static  int
sata_txlt_ata_pass_thru(sata_pkt_txlate_t * spx)5894 sata_txlt_ata_pass_thru(sata_pkt_txlate_t *spx)
5895 {
5896 	struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
5897 	sata_cmd_t *scmd = &spx->txlt_sata_pkt->satapkt_cmd;
5898 	struct buf *bp = spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp;
5899 	kmutex_t *cport_mutex = &(SATA_TXLT_CPORT_MUTEX(spx));
5900 	uint32_t xfer_len;
5901 	int extend = 0;
5902 	int synch, rval, reason;
5903 
5904 	mutex_enter(cport_mutex);
5905 
5906 	rval = sata_txlt_generic_pkt_info(spx, &reason, 1);
5907 	if ((rval != TRAN_ACCEPT) || (reason == CMD_DEV_GONE)) {
5908 		mutex_exit(cport_mutex);
5909 		return (rval);
5910 	}
5911 
5912 	/* T_DIR bit */
5913 	if (scsipkt->pkt_cdbp[2] & SATL_APT_BM_T_DIR)
5914 		scmd->satacmd_flags.sata_data_direction = SATA_DIR_READ;
5915 	else
5916 		scmd->satacmd_flags.sata_data_direction = SATA_DIR_WRITE;
5917 
5918 	/* MULTIPLE_COUNT field.  If non-zero, invalid command (for now). */
5919 	if (((scsipkt->pkt_cdbp[1] >> 5) & 0x7) != 0) {
5920 		mutex_exit(cport_mutex);
5921 		return (sata_txlt_ata_pass_thru_illegal_cmd(spx));
5922 	}
5923 
5924 	/* OFFLINE field. If non-zero, invalid command (for now). */
5925 	if (((scsipkt->pkt_cdbp[2] >> 6) & 0x3) != 0) {
5926 		mutex_exit(cport_mutex);
5927 		return (sata_txlt_ata_pass_thru_illegal_cmd(spx));
5928 	}
5929 
5930 	/* PROTOCOL field */
5931 	switch ((scsipkt->pkt_cdbp[1] >> 1) & 0xf) {
5932 	case SATL_APT_P_HW_RESET:
5933 	case SATL_APT_P_SRST:
5934 	case SATL_APT_P_DMA:
5935 	case SATL_APT_P_DMA_QUEUED:
5936 	case SATL_APT_P_DEV_DIAG:
5937 	case SATL_APT_P_DEV_RESET:
5938 	case SATL_APT_P_UDMA_IN:
5939 	case SATL_APT_P_UDMA_OUT:
5940 	case SATL_APT_P_FPDMA:
5941 	case SATL_APT_P_RET_RESP:
5942 		/* Not yet implemented */
5943 	default:
5944 		mutex_exit(cport_mutex);
5945 		return (sata_txlt_ata_pass_thru_illegal_cmd(spx));
5946 
5947 	case SATL_APT_P_NON_DATA:
5948 		scmd->satacmd_flags.sata_data_direction = SATA_DIR_NODATA_XFER;
5949 		break;
5950 
5951 	case SATL_APT_P_PIO_DATA_IN:
5952 		/* If PROTOCOL disagrees with T_DIR, invalid command */
5953 		if (scmd->satacmd_flags.sata_data_direction == SATA_DIR_WRITE) {
5954 			mutex_exit(cport_mutex);
5955 			return (sata_txlt_ata_pass_thru_illegal_cmd(spx));
5956 		}
5957 
5958 		/* if there is a buffer, release its DMA resources */
5959 		if ((bp != NULL) && bp->b_un.b_addr && bp->b_bcount) {
5960 			sata_scsi_dmafree(NULL, scsipkt);
5961 		} else {
5962 			/* if there is no buffer, how do you PIO in? */
5963 			mutex_exit(cport_mutex);
5964 			return (sata_txlt_ata_pass_thru_illegal_cmd(spx));
5965 		}
5966 
5967 		break;
5968 
5969 	case SATL_APT_P_PIO_DATA_OUT:
5970 		/* If PROTOCOL disagrees with T_DIR, invalid command */
5971 		if (scmd->satacmd_flags.sata_data_direction == SATA_DIR_READ) {
5972 			mutex_exit(cport_mutex);
5973 			return (sata_txlt_ata_pass_thru_illegal_cmd(spx));
5974 		}
5975 
5976 		/* if there is a buffer, release its DMA resources */
5977 		if ((bp != NULL) && bp->b_un.b_addr && bp->b_bcount) {
5978 			sata_scsi_dmafree(NULL, scsipkt);
5979 		} else {
5980 			/* if there is no buffer, how do you PIO out? */
5981 			mutex_exit(cport_mutex);
5982 			return (sata_txlt_ata_pass_thru_illegal_cmd(spx));
5983 		}
5984 
5985 		break;
5986 	}
5987 
5988 	/* Assume LBA28 by default */
5989 	scmd->satacmd_addr_type = ATA_ADDR_LBA28;
5990 	scmd->satacmd_lba_low_msb = 0;
5991 	scmd->satacmd_lba_mid_msb = 0;
5992 	scmd->satacmd_lba_high_msb = 0;
5993 
5994 	scmd->satacmd_features_reg_ext = 0;
5995 	scmd->satacmd_sec_count_msb = 0;
5996 
5997 	/* Parse the ATA cmd fields, transfer some straight to the satacmd */
5998 	switch ((uint_t)scsipkt->pkt_cdbp[0]) {
5999 	case SPC3_CMD_ATA_COMMAND_PASS_THROUGH12:
6000 		scmd->satacmd_lba_low_lsb = scsipkt->pkt_cdbp[5];
6001 		scmd->satacmd_lba_mid_lsb = scsipkt->pkt_cdbp[6];
6002 		scmd->satacmd_lba_high_lsb = scsipkt->pkt_cdbp[7];
6003 
6004 		scmd->satacmd_features_reg = scsipkt->pkt_cdbp[3];
6005 		scmd->satacmd_sec_count_lsb = scsipkt->pkt_cdbp[4];
6006 
6007 		scmd->satacmd_device_reg = scsipkt->pkt_cdbp[8];
6008 		scmd->satacmd_cmd_reg = scsipkt->pkt_cdbp[9];
6009 		break;
6010 
6011 	case SPC3_CMD_ATA_COMMAND_PASS_THROUGH16:
6012 		scmd->satacmd_device_reg = scsipkt->pkt_cdbp[13];
6013 		scmd->satacmd_cmd_reg = scsipkt->pkt_cdbp[14];
6014 
6015 		scmd->satacmd_lba_low_lsb = scsipkt->pkt_cdbp[8];
6016 		scmd->satacmd_lba_mid_lsb = scsipkt->pkt_cdbp[10];
6017 		scmd->satacmd_lba_high_lsb = scsipkt->pkt_cdbp[12];
6018 
6019 		scmd->satacmd_features_reg = scsipkt->pkt_cdbp[4];
6020 		scmd->satacmd_sec_count_lsb = scsipkt->pkt_cdbp[6];
6021 
6022 		if (scsipkt->pkt_cdbp[1] & SATL_APT_BM_EXTEND) {
6023 			extend = 1;
6024 
6025 			scmd->satacmd_addr_type = ATA_ADDR_LBA48;
6026 			scmd->satacmd_lba_low_msb = scsipkt->pkt_cdbp[7];
6027 			scmd->satacmd_lba_mid_msb = scsipkt->pkt_cdbp[9];
6028 			scmd->satacmd_lba_high_msb = scsipkt->pkt_cdbp[11];
6029 
6030 			scmd->satacmd_features_reg_ext = scsipkt->pkt_cdbp[3];
6031 			scmd->satacmd_sec_count_msb = scsipkt->pkt_cdbp[5];
6032 		}
6033 		break;
6034 
6035 	default:
6036 		/* No other SCSI ops should ever reach this function */
6037 		cmn_err(CE_PANIC, "unexpected ATA pass-thru cmd %x",
6038 		    scsipkt->pkt_cdbp[0]);
6039 	}
6040 
6041 	/* CK_COND bit */
6042 	if (scsipkt->pkt_cdbp[2] & SATL_APT_BM_CK_COND) {
6043 		if (extend) {
6044 			scmd->satacmd_flags.sata_copy_out_sec_count_msb = 1;
6045 			scmd->satacmd_flags.sata_copy_out_lba_low_msb = 1;
6046 			scmd->satacmd_flags.sata_copy_out_lba_mid_msb = 1;
6047 			scmd->satacmd_flags.sata_copy_out_lba_high_msb = 1;
6048 		}
6049 
6050 		scmd->satacmd_flags.sata_copy_out_sec_count_lsb = 1;
6051 		scmd->satacmd_flags.sata_copy_out_lba_low_lsb = 1;
6052 		scmd->satacmd_flags.sata_copy_out_lba_mid_lsb = 1;
6053 		scmd->satacmd_flags.sata_copy_out_lba_high_lsb = 1;
6054 		scmd->satacmd_flags.sata_copy_out_device_reg = 1;
6055 		scmd->satacmd_flags.sata_copy_out_error_reg = 1;
6056 	}
6057 
6058 	/* Determine transfer length */
6059 	switch (scsipkt->pkt_cdbp[2] & 0x03) {		/* T_LENGTH field */
6060 	case 1:
6061 		/* Length is in the FEATURE field */
6062 		xfer_len = (uint32_t)scmd->satacmd_features_reg_ext << 8 |
6063 		    scmd->satacmd_features_reg;
6064 
6065 		/* If BYTE_BLOCK is set, above value is in units of blocks */
6066 		if (((scsipkt->pkt_cdbp[2] >> 2) & 1) == 0)
6067 			xfer_len *= SATA_DISK_SECTOR_SIZE;
6068 		break;
6069 	case 2:
6070 		/* Length is in the COUNT field */
6071 		xfer_len = (uint32_t)scmd->satacmd_sec_count_msb << 8 |
6072 		    scmd->satacmd_sec_count_lsb;
6073 
6074 		/* If BYTE_BLOCK is set, above value is in units of blocks */
6075 		if (((scsipkt->pkt_cdbp[2] >> 2) & 1) == 0)
6076 			xfer_len *= SATA_DISK_SECTOR_SIZE;
6077 		break;
6078 	case 3:
6079 		/*
6080 		 * Length is transport specific. The spec is a bit vague on
6081 		 * this, but it seems like using buf->b_bcount is the most
6082 		 * reasonable analogue in our situation. b_bcount is in
6083 		 * units of bytes.
6084 		 */
6085 		xfer_len = bp->b_bcount;
6086 		break;
6087 	default:
6088 		xfer_len = 0;
6089 	}
6090 
6091 	/* Don't allow a transfer larger than what the struct buf supports */
6092 	if (xfer_len > bp->b_bcount) {
6093 		mutex_exit(cport_mutex);
6094 		return (sata_txlt_ata_pass_thru_illegal_cmd(spx));
6095 	}
6096 
6097 	/* Start processing command */
6098 	if (!(spx->txlt_sata_pkt->satapkt_op_mode & SATA_OPMODE_SYNCH)) {
6099 		spx->txlt_sata_pkt->satapkt_comp = sata_txlt_apt_completion;
6100 		synch = FALSE;
6101 	} else {
6102 		synch = TRUE;
6103 	}
6104 
6105 	if (sata_hba_start(spx, &rval) != 0) {
6106 		mutex_exit(cport_mutex);
6107 		return (rval);
6108 	}
6109 
6110 	mutex_exit(cport_mutex);
6111 
6112 	if (synch) {
6113 		sata_txlt_apt_completion(spx->txlt_sata_pkt);
6114 	}
6115 
6116 	return (TRAN_ACCEPT);
6117 }
6118 
6119 /*
6120  * Translate command: Log Sense
6121  */
6122 static int
sata_txlt_log_sense(sata_pkt_txlate_t * spx)6123 sata_txlt_log_sense(sata_pkt_txlate_t *spx)
6124 {
6125 	struct scsi_pkt	*scsipkt = spx->txlt_scsi_pkt;
6126 	struct buf	*bp = spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp;
6127 	sata_drive_info_t *sdinfo;
6128 	struct scsi_extended_sense *sense;
6129 	int		len, count, alc_len;
6130 	int		pc;	/* Page Control code */
6131 	int		page_code;	/* Page code */
6132 	uint8_t		*buf;	/* log sense buffer */
6133 	int		rval, reason;
6134 #define	MAX_LOG_SENSE_PAGE_SIZE	512
6135 	kmutex_t	*cport_mutex = &(SATA_TXLT_CPORT_MUTEX(spx));
6136 
6137 	SATADBG2(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
6138 	    "sata_txlt_log_sense, pc 0x%x, page code 0x%x\n",
6139 	    spx->txlt_scsi_pkt->pkt_cdbp[2] >> 6,
6140 	    spx->txlt_scsi_pkt->pkt_cdbp[2] & 0x3f);
6141 
6142 	if (servicing_interrupt()) {
6143 		buf = kmem_zalloc(MAX_LOG_SENSE_PAGE_SIZE, KM_NOSLEEP);
6144 		if (buf == NULL) {
6145 			return (TRAN_BUSY);
6146 		}
6147 	} else {
6148 		buf = kmem_zalloc(MAX_LOG_SENSE_PAGE_SIZE, KM_SLEEP);
6149 	}
6150 
6151 	mutex_enter(cport_mutex);
6152 
6153 	if (((rval = sata_txlt_generic_pkt_info(spx, &reason, 1)) !=
6154 	    TRAN_ACCEPT) || (reason == CMD_DEV_GONE)) {
6155 		mutex_exit(cport_mutex);
6156 		kmem_free(buf, MAX_LOG_SENSE_PAGE_SIZE);
6157 		return (rval);
6158 	}
6159 
6160 	scsipkt->pkt_reason = CMD_CMPLT;
6161 	scsipkt->pkt_state = STATE_GOT_BUS | STATE_GOT_TARGET |
6162 	    STATE_SENT_CMD | STATE_GOT_STATUS;
6163 
6164 	pc = scsipkt->pkt_cdbp[2] >> 6;
6165 	page_code = scsipkt->pkt_cdbp[2] & 0x3f;
6166 
6167 	/* Reject not supported request for all but cumulative values */
6168 	switch (pc) {
6169 	case PC_CUMULATIVE_VALUES:
6170 		break;
6171 	default:
6172 		*scsipkt->pkt_scbp = STATUS_CHECK;
6173 		sense = sata_arq_sense(spx);
6174 		sense->es_key = KEY_ILLEGAL_REQUEST;
6175 		sense->es_add_code = SD_SCSI_ASC_INVALID_FIELD_IN_CDB;
6176 		goto done;
6177 	}
6178 
6179 	switch (page_code) {
6180 	case PAGE_CODE_GET_SUPPORTED_LOG_PAGES:
6181 	case PAGE_CODE_SELF_TEST_RESULTS:
6182 	case PAGE_CODE_INFORMATION_EXCEPTIONS:
6183 	case PAGE_CODE_SMART_READ_DATA:
6184 	case PAGE_CODE_START_STOP_CYCLE_COUNTER:
6185 	case PAGE_CODE_TEMPERATURE:
6186 	case PAGE_CODE_SOLID_STATE_MEDIA:
6187 	case PAGE_CODE_READ_ERRORS:
6188 	case PAGE_CODE_GENERAL_STATS:
6189 		break;
6190 	default:
6191 		*scsipkt->pkt_scbp = STATUS_CHECK;
6192 		sense = sata_arq_sense(spx);
6193 		sense->es_key = KEY_ILLEGAL_REQUEST;
6194 		sense->es_add_code = SD_SCSI_ASC_INVALID_FIELD_IN_CDB;
6195 		goto done;
6196 	}
6197 
6198 	if (bp != NULL && bp->b_un.b_addr && bp->b_bcount) {
6199 		/*
6200 		 * Because log sense uses local buffers for data retrieval from
6201 		 * the devices and sets the data programatically in the
6202 		 * original specified buffer, release preallocated DMA
6203 		 * resources before storing data in the original buffer,
6204 		 * so no unwanted DMA sync would take place.
6205 		 */
6206 		sata_id_t *sata_id;
6207 
6208 		sata_scsi_dmafree(NULL, scsipkt);
6209 
6210 		len = 0;
6211 
6212 		/* Build log parameter header */
6213 		buf[len++] = page_code;	/* page code as in the CDB */
6214 		buf[len++] = 0;		/* reserved */
6215 		buf[len++] = 0;		/* Zero out page length for now (MSB) */
6216 		buf[len++] = 0;		/* (LSB) */
6217 
6218 		sdinfo = sata_get_device_info(
6219 		    spx->txlt_sata_hba_inst,
6220 		    &spx->txlt_sata_pkt->satapkt_device);
6221 
6222 		sata_id = &sdinfo->satadrv_id;
6223 
6224 		/*
6225 		 * Add requested pages.
6226 		 */
6227 		switch (page_code) {
6228 		case PAGE_CODE_GET_SUPPORTED_LOG_PAGES:
6229 			len = sata_build_lsense_page_0(sdinfo, buf + len);
6230 			break;
6231 		case PAGE_CODE_SELF_TEST_RESULTS:
6232 			if ((! (sata_id->ai_cmdset84 &
6233 			    SATA_SMART_SELF_TEST_SUPPORTED)) ||
6234 			    (! (sata_id->ai_features87 &
6235 			    SATA_SMART_SELF_TEST_SUPPORTED))) {
6236 				*scsipkt->pkt_scbp = STATUS_CHECK;
6237 				sense = sata_arq_sense(spx);
6238 				sense->es_key = KEY_ILLEGAL_REQUEST;
6239 				sense->es_add_code =
6240 				    SD_SCSI_ASC_INVALID_FIELD_IN_CDB;
6241 
6242 				goto done;
6243 			}
6244 			len = sata_build_lsense_page_10(sdinfo, buf + len,
6245 			    spx->txlt_sata_hba_inst);
6246 			break;
6247 		case PAGE_CODE_INFORMATION_EXCEPTIONS:
6248 			if (! (sata_id->ai_cmdset82 & SATA_SMART_SUPPORTED)) {
6249 				*scsipkt->pkt_scbp = STATUS_CHECK;
6250 				sense = sata_arq_sense(spx);
6251 				sense->es_key = KEY_ILLEGAL_REQUEST;
6252 				sense->es_add_code =
6253 				    SD_SCSI_ASC_INVALID_FIELD_IN_CDB;
6254 
6255 				goto done;
6256 			}
6257 			if (! (sata_id->ai_features85 & SATA_SMART_ENABLED)) {
6258 				*scsipkt->pkt_scbp = STATUS_CHECK;
6259 				sense = sata_arq_sense(spx);
6260 				sense->es_key = KEY_ABORTED_COMMAND;
6261 				sense->es_add_code =
6262 				    SCSI_ASC_ATA_DEV_FEAT_NOT_ENABLED;
6263 				sense->es_qual_code =
6264 				    SCSI_ASCQ_ATA_DEV_FEAT_NOT_ENABLED;
6265 
6266 				goto done;
6267 			}
6268 
6269 			len = sata_build_lsense_page_2f(sdinfo, buf + len,
6270 			    spx->txlt_sata_hba_inst);
6271 			break;
6272 		case PAGE_CODE_SMART_READ_DATA:
6273 			if (! (sata_id->ai_cmdset82 & SATA_SMART_SUPPORTED)) {
6274 				*scsipkt->pkt_scbp = STATUS_CHECK;
6275 				sense = sata_arq_sense(spx);
6276 				sense->es_key = KEY_ILLEGAL_REQUEST;
6277 				sense->es_add_code =
6278 				    SD_SCSI_ASC_INVALID_FIELD_IN_CDB;
6279 
6280 				goto done;
6281 			}
6282 			if (! (sata_id->ai_features85 & SATA_SMART_ENABLED)) {
6283 				*scsipkt->pkt_scbp = STATUS_CHECK;
6284 				sense = sata_arq_sense(spx);
6285 				sense->es_key = KEY_ABORTED_COMMAND;
6286 				sense->es_add_code =
6287 				    SCSI_ASC_ATA_DEV_FEAT_NOT_ENABLED;
6288 				sense->es_qual_code =
6289 				    SCSI_ASCQ_ATA_DEV_FEAT_NOT_ENABLED;
6290 
6291 				goto done;
6292 			}
6293 
6294 			/* This page doesn't include a page header */
6295 			len = sata_build_lsense_page_30(sdinfo, buf,
6296 			    spx->txlt_sata_hba_inst);
6297 			goto no_header;
6298 		case PAGE_CODE_START_STOP_CYCLE_COUNTER:
6299 			if (! (sata_id->ai_cmdset82 & SATA_SMART_SUPPORTED)) {
6300 				*scsipkt->pkt_scbp = STATUS_CHECK;
6301 				sense = sata_arq_sense(spx);
6302 				sense->es_key = KEY_ILLEGAL_REQUEST;
6303 				sense->es_add_code =
6304 				    SD_SCSI_ASC_INVALID_FIELD_IN_CDB;
6305 
6306 				goto done;
6307 			}
6308 			if (! (sata_id->ai_features85 & SATA_SMART_ENABLED)) {
6309 				*scsipkt->pkt_scbp = STATUS_CHECK;
6310 				sense = sata_arq_sense(spx);
6311 				sense->es_key = KEY_ABORTED_COMMAND;
6312 				sense->es_add_code =
6313 				    SCSI_ASC_ATA_DEV_FEAT_NOT_ENABLED;
6314 				sense->es_qual_code =
6315 				    SCSI_ASCQ_ATA_DEV_FEAT_NOT_ENABLED;
6316 
6317 				goto done;
6318 			}
6319 			len = sata_build_lsense_page_0e(sdinfo, buf, spx);
6320 			goto no_header;
6321 		case PAGE_CODE_TEMPERATURE:
6322 			len = sata_build_lsense_page_0d(sdinfo, buf + len,
6323 			    spx->txlt_sata_hba_inst);
6324 			break;
6325 		case PAGE_CODE_SOLID_STATE_MEDIA:
6326 			len = sata_build_lsense_page_11(sdinfo, buf + len,
6327 			    spx->txlt_sata_hba_inst);
6328 			break;
6329 		case PAGE_CODE_READ_ERRORS:
6330 			len = sata_build_lsense_page_03(sdinfo, buf + len,
6331 			    spx->txlt_sata_hba_inst);
6332 			break;
6333 		case PAGE_CODE_GENERAL_STATS:
6334 			len = sata_build_lsense_page_19(sdinfo, buf + len,
6335 			    spx->txlt_sata_hba_inst);
6336 			break;
6337 		default:
6338 			/* Invalid request */
6339 			*scsipkt->pkt_scbp = STATUS_CHECK;
6340 			sense = sata_arq_sense(spx);
6341 			sense->es_key = KEY_ILLEGAL_REQUEST;
6342 			sense->es_add_code = SD_SCSI_ASC_INVALID_FIELD_IN_CDB;
6343 			goto done;
6344 		}
6345 
6346 		if (len < 0) {
6347 			/* Page not supported by device */
6348 			*scsipkt->pkt_scbp = STATUS_CHECK;
6349 			sense = sata_arq_sense(spx);
6350 			sense->es_key = KEY_ILLEGAL_REQUEST;
6351 			sense->es_add_code = SD_SCSI_ASC_INVALID_FIELD_IN_CDB;
6352 			goto done;
6353 		}
6354 
6355 		/* set parameter log sense data length */
6356 		buf[2] = len >> 8;	/* log sense length (MSB) */
6357 		buf[3] = len & 0xff;	/* log sense length (LSB) */
6358 
6359 		len += SCSI_LOG_PAGE_HDR_LEN;
6360 		ASSERT(len <= MAX_LOG_SENSE_PAGE_SIZE);
6361 
6362 no_header:
6363 		/* Check allocation length */
6364 		alc_len = scsipkt->pkt_cdbp[7];
6365 		alc_len = (alc_len << 8) | scsipkt->pkt_cdbp[8];
6366 
6367 		/*
6368 		 * We do not check for possible parameters truncation
6369 		 * (alc_len < len) assuming that the target driver works
6370 		 * correctly. Just avoiding overrun.
6371 		 * Copy no more than requested and possible, buffer-wise.
6372 		 */
6373 		count = MIN(alc_len, len);
6374 		count = MIN(bp->b_bcount, count);
6375 		bcopy(buf, bp->b_un.b_addr, count);
6376 
6377 		scsipkt->pkt_state |= STATE_XFERRED_DATA;
6378 		scsipkt->pkt_resid = alc_len > count ? alc_len - count : 0;
6379 	}
6380 	*scsipkt->pkt_scbp = STATUS_GOOD;
6381 done:
6382 	mutex_exit(cport_mutex);
6383 	(void) kmem_free(buf, MAX_LOG_SENSE_PAGE_SIZE);
6384 
6385 	SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
6386 	    "Scsi_pkt completion reason %x\n", scsipkt->pkt_reason);
6387 
6388 	if ((scsipkt->pkt_flags & FLAG_NOINTR) == 0 &&
6389 	    scsipkt->pkt_comp != NULL) {
6390 		/* scsi callback required */
6391 		if (servicing_interrupt()) {
6392 			if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
6393 			    (task_func_t *)spx->txlt_scsi_pkt->pkt_comp,
6394 			    (void *)spx->txlt_scsi_pkt, TQ_NOSLEEP) ==
6395 			    TASKQID_INVALID) {
6396 				return (TRAN_BUSY);
6397 			}
6398 		} else if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
6399 		    (task_func_t *)spx->txlt_scsi_pkt->pkt_comp,
6400 		    (void *)spx->txlt_scsi_pkt, TQ_SLEEP) == TASKQID_INVALID) {
6401 			/* Scheduling the callback failed */
6402 			return (TRAN_BUSY);
6403 		}
6404 	}
6405 
6406 	return (TRAN_ACCEPT);
6407 }
6408 
6409 /*
6410  * Translate command: Read (various types).
6411  * Translated into appropriate type of ATA READ command
6412  * for SATA hard disks.
6413  * Both the device capabilities and requested operation mode are
6414  * considered.
6415  *
6416  * Following scsi cdb fields are ignored:
6417  * rdprotect, dpo, fua, fua_nv, group_number.
6418  *
6419  * If SATA_ENABLE_QUEUING flag is set (in the global SATA HBA framework
6420  * enable variable sata_func_enable), the capability of the controller and
6421  * capability of a device are checked and if both support queueing, read
6422  * request will be translated to READ_DMA_QUEUEING or READ_DMA_QUEUEING_EXT
6423  * command rather than plain READ_XXX command.
6424  * If SATA_ENABLE_NCQ flag is set in addition to SATA_ENABLE_QUEUING flag and
6425  * both the controller and device suport such functionality, the read
6426  * request will be translated to READ_FPDMA_QUEUED command.
6427  * In both cases the maximum queue depth is derived as minimum of:
6428  * HBA capability,device capability and sata_max_queue_depth variable setting.
6429  * The value passed to HBA driver is decremented by 1, because only 5 bits are
6430  * used to pass max queue depth value, and the maximum possible queue depth
6431  * is 32.
6432  *
6433  * Returns TRAN_ACCEPT or code returned by sata_hba_start() and
6434  * appropriate values in scsi_pkt fields.
6435  */
6436 static int
sata_txlt_read(sata_pkt_txlate_t * spx)6437 sata_txlt_read(sata_pkt_txlate_t *spx)
6438 {
6439 	struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
6440 	sata_cmd_t *scmd = &spx->txlt_sata_pkt->satapkt_cmd;
6441 	sata_drive_info_t *sdinfo;
6442 	sata_hba_inst_t *shi = SATA_TXLT_HBA_INST(spx);
6443 	kmutex_t *cport_mutex = &(SATA_TXLT_CPORT_MUTEX(spx));
6444 	uint16_t sec_count;
6445 	uint64_t lba;
6446 	int rval, reason;
6447 	int synch;
6448 
6449 	mutex_enter(cport_mutex);
6450 
6451 	if (((rval = sata_txlt_generic_pkt_info(spx, &reason, 0)) !=
6452 	    TRAN_ACCEPT) || (reason == CMD_DEV_GONE)) {
6453 		mutex_exit(cport_mutex);
6454 		return (rval);
6455 	}
6456 
6457 	sdinfo = sata_get_device_info(spx->txlt_sata_hba_inst,
6458 	    &spx->txlt_sata_pkt->satapkt_device);
6459 
6460 	scmd->satacmd_flags.sata_data_direction = SATA_DIR_READ;
6461 	/*
6462 	 * Extract LBA and sector count from scsi CDB.
6463 	 */
6464 	switch ((uint_t)scsipkt->pkt_cdbp[0]) {
6465 	case SCMD_READ:
6466 		/* 6-byte scsi read cmd : 0x08 */
6467 		lba = (scsipkt->pkt_cdbp[1] & 0x1f);
6468 		lba = (lba << 8) | scsipkt->pkt_cdbp[2];
6469 		lba = (lba << 8) | scsipkt->pkt_cdbp[3];
6470 		sec_count = scsipkt->pkt_cdbp[4];
6471 		/* sec_count 0 will be interpreted as 256 by a device */
6472 		break;
6473 	case SCMD_READ_G1:
6474 		/* 10-bytes scsi read command : 0x28 */
6475 		lba = scsipkt->pkt_cdbp[2];
6476 		lba = (lba << 8) | scsipkt->pkt_cdbp[3];
6477 		lba = (lba << 8) | scsipkt->pkt_cdbp[4];
6478 		lba = (lba << 8) | scsipkt->pkt_cdbp[5];
6479 		sec_count = scsipkt->pkt_cdbp[7];
6480 		sec_count = (sec_count << 8) | scsipkt->pkt_cdbp[8];
6481 		break;
6482 	case SCMD_READ_G5:
6483 		/* 12-bytes scsi read command : 0xA8 */
6484 		lba = scsipkt->pkt_cdbp[2];
6485 		lba = (lba << 8) | scsipkt->pkt_cdbp[3];
6486 		lba = (lba << 8) | scsipkt->pkt_cdbp[4];
6487 		lba = (lba << 8) | scsipkt->pkt_cdbp[5];
6488 		sec_count = scsipkt->pkt_cdbp[6];
6489 		sec_count = (sec_count << 8) | scsipkt->pkt_cdbp[7];
6490 		sec_count = (sec_count << 8) | scsipkt->pkt_cdbp[8];
6491 		sec_count = (sec_count << 8) | scsipkt->pkt_cdbp[9];
6492 		break;
6493 	case SCMD_READ_G4:
6494 		/* 16-bytes scsi read command : 0x88 */
6495 		lba = scsipkt->pkt_cdbp[2];
6496 		lba = (lba << 8) | scsipkt->pkt_cdbp[3];
6497 		lba = (lba << 8) | scsipkt->pkt_cdbp[4];
6498 		lba = (lba << 8) | scsipkt->pkt_cdbp[5];
6499 		lba = (lba << 8) | scsipkt->pkt_cdbp[6];
6500 		lba = (lba << 8) | scsipkt->pkt_cdbp[7];
6501 		lba = (lba << 8) | scsipkt->pkt_cdbp[8];
6502 		lba = (lba << 8) | scsipkt->pkt_cdbp[9];
6503 		sec_count = scsipkt->pkt_cdbp[10];
6504 		sec_count = (sec_count << 8) | scsipkt->pkt_cdbp[11];
6505 		sec_count = (sec_count << 8) | scsipkt->pkt_cdbp[12];
6506 		sec_count = (sec_count << 8) | scsipkt->pkt_cdbp[13];
6507 		break;
6508 	default:
6509 		/* Unsupported command */
6510 		mutex_exit(cport_mutex);
6511 		return (sata_txlt_invalid_command(spx));
6512 	}
6513 
6514 	/*
6515 	 * Check if specified address exceeds device capacity
6516 	 */
6517 	if ((lba >= sdinfo->satadrv_capacity) ||
6518 	    ((lba + sec_count) > sdinfo->satadrv_capacity)) {
6519 		/* LBA out of range */
6520 		mutex_exit(cport_mutex);
6521 		return (sata_txlt_lba_out_of_range(spx));
6522 	}
6523 
6524 	/*
6525 	 * For zero-length transfer, emulate good completion of the command
6526 	 * (reasons for rejecting the command were already checked).
6527 	 * No DMA resources were allocated.
6528 	 */
6529 	if (spx->txlt_dma_cookie_list == NULL) {
6530 		mutex_exit(cport_mutex);
6531 		return (sata_emul_rw_completion(spx));
6532 	}
6533 
6534 	/*
6535 	 * Build cmd block depending on the device capability and
6536 	 * requested operation mode.
6537 	 * Do not bother with non-dma mode - we are working only with
6538 	 * devices supporting DMA.
6539 	 */
6540 	scmd->satacmd_addr_type = ATA_ADDR_LBA;
6541 	scmd->satacmd_device_reg = SATA_ADH_LBA;
6542 	scmd->satacmd_cmd_reg = SATAC_READ_DMA;
6543 	if (sdinfo->satadrv_features_support & SATA_DEV_F_LBA48) {
6544 		scmd->satacmd_addr_type = ATA_ADDR_LBA48;
6545 		scmd->satacmd_cmd_reg = SATAC_READ_DMA_EXT;
6546 		scmd->satacmd_sec_count_msb = sec_count >> 8;
6547 #ifndef __lock_lint
6548 		scmd->satacmd_lba_low_msb = (lba >> 24) & 0xff;
6549 		scmd->satacmd_lba_mid_msb = (lba >> 32) & 0xff;
6550 		scmd->satacmd_lba_high_msb = lba >> 40;
6551 #endif
6552 	} else if (sdinfo->satadrv_features_support & SATA_DEV_F_LBA28) {
6553 		scmd->satacmd_addr_type = ATA_ADDR_LBA28;
6554 		scmd->satacmd_device_reg = SATA_ADH_LBA | ((lba >> 24) & 0xf);
6555 	}
6556 	scmd->satacmd_sec_count_lsb = sec_count & 0xff;
6557 	scmd->satacmd_lba_low_lsb = lba & 0xff;
6558 	scmd->satacmd_lba_mid_lsb = (lba >> 8) & 0xff;
6559 	scmd->satacmd_lba_high_lsb = (lba >> 16) & 0xff;
6560 	scmd->satacmd_features_reg = 0;
6561 	scmd->satacmd_status_reg = 0;
6562 	scmd->satacmd_error_reg = 0;
6563 
6564 	/*
6565 	 * Check if queueing commands should be used and switch
6566 	 * to appropriate command if possible
6567 	 */
6568 	if (sata_func_enable & SATA_ENABLE_QUEUING) {
6569 		boolean_t using_queuing;
6570 
6571 		/* Queuing supported by controller and device? */
6572 		if ((sata_func_enable & SATA_ENABLE_NCQ) &&
6573 		    (sdinfo->satadrv_features_support &
6574 		    SATA_DEV_F_NCQ) &&
6575 		    (SATA_FEATURES(spx->txlt_sata_hba_inst) &
6576 		    SATA_CTLF_NCQ)) {
6577 			using_queuing = B_TRUE;
6578 
6579 			/* NCQ supported - use FPDMA READ */
6580 			scmd->satacmd_cmd_reg =
6581 			    SATAC_READ_FPDMA_QUEUED;
6582 			scmd->satacmd_features_reg_ext =
6583 			    scmd->satacmd_sec_count_msb;
6584 			scmd->satacmd_sec_count_msb = 0;
6585 		} else if ((sdinfo->satadrv_features_support &
6586 		    SATA_DEV_F_TCQ) &&
6587 		    (SATA_FEATURES(spx->txlt_sata_hba_inst) &
6588 		    SATA_CTLF_QCMD)) {
6589 			using_queuing = B_TRUE;
6590 
6591 			/* Legacy queueing */
6592 			if (sdinfo->satadrv_features_support &
6593 			    SATA_DEV_F_LBA48) {
6594 				scmd->satacmd_cmd_reg =
6595 				    SATAC_READ_DMA_QUEUED_EXT;
6596 				scmd->satacmd_features_reg_ext =
6597 				    scmd->satacmd_sec_count_msb;
6598 				scmd->satacmd_sec_count_msb = 0;
6599 			} else {
6600 				scmd->satacmd_cmd_reg =
6601 				    SATAC_READ_DMA_QUEUED;
6602 			}
6603 		} else	/* NCQ nor legacy queuing not supported */
6604 			using_queuing = B_FALSE;
6605 
6606 		/*
6607 		 * If queuing, the sector count goes in the features register
6608 		 * and the secount count will contain the tag.
6609 		 */
6610 		if (using_queuing) {
6611 			scmd->satacmd_features_reg =
6612 			    scmd->satacmd_sec_count_lsb;
6613 			scmd->satacmd_sec_count_lsb = 0;
6614 			scmd->satacmd_flags.sata_queued = B_TRUE;
6615 
6616 			/* Set-up maximum queue depth */
6617 			scmd->satacmd_flags.sata_max_queue_depth =
6618 			    sdinfo->satadrv_max_queue_depth - 1;
6619 		} else if (sdinfo->satadrv_features_enabled &
6620 		    SATA_DEV_F_E_UNTAGGED_QING) {
6621 			/*
6622 			 * Although NCQ/TCQ is not enabled, untagged queuing
6623 			 * may be still used.
6624 			 * Set-up the maximum untagged queue depth.
6625 			 * Use controller's queue depth from sata_hba_tran.
6626 			 * SATA HBA drivers may ignore this value and rely on
6627 			 * the internal limits.For drivers that do not
6628 			 * ignore untaged queue depth, limit the value to
6629 			 * SATA_MAX_QUEUE_DEPTH (32), as this is the
6630 			 * largest value that can be passed via
6631 			 * satacmd_flags.sata_max_queue_depth.
6632 			 */
6633 			scmd->satacmd_flags.sata_max_queue_depth =
6634 			    SATA_QDEPTH(shi) <= SATA_MAX_QUEUE_DEPTH ?
6635 			    SATA_QDEPTH(shi) - 1: SATA_MAX_QUEUE_DEPTH - 1;
6636 
6637 		} else {
6638 			scmd->satacmd_flags.sata_max_queue_depth = 0;
6639 		}
6640 	} else
6641 		scmd->satacmd_flags.sata_max_queue_depth = 0;
6642 
6643 	SATADBG3(SATA_DBG_HBA_IF, spx->txlt_sata_hba_inst,
6644 	    "sata_txlt_read cmd 0x%2x, lba %llx, sec count %x\n",
6645 	    scmd->satacmd_cmd_reg, lba, sec_count);
6646 
6647 	if (!(spx->txlt_sata_pkt->satapkt_op_mode & SATA_OPMODE_SYNCH)) {
6648 		/* Need callback function */
6649 		spx->txlt_sata_pkt->satapkt_comp = sata_txlt_rw_completion;
6650 		synch = FALSE;
6651 	} else
6652 		synch = TRUE;
6653 
6654 	/* Transfer command to HBA */
6655 	if (sata_hba_start(spx, &rval) != 0) {
6656 		/* Pkt not accepted for execution */
6657 		mutex_exit(cport_mutex);
6658 		return (rval);
6659 	}
6660 	mutex_exit(cport_mutex);
6661 	/*
6662 	 * If execution is non-synchronous,
6663 	 * a callback function will handle potential errors, translate
6664 	 * the response and will do a callback to a target driver.
6665 	 * If it was synchronous, check execution status using the same
6666 	 * framework callback.
6667 	 */
6668 	if (synch) {
6669 		SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
6670 		    "synchronous execution status %x\n",
6671 		    spx->txlt_sata_pkt->satapkt_reason);
6672 		sata_txlt_rw_completion(spx->txlt_sata_pkt);
6673 	}
6674 	return (TRAN_ACCEPT);
6675 }
6676 
6677 
6678 /*
6679  * SATA translate command: Write (various types)
6680  * Translated into appropriate type of ATA WRITE command
6681  * for SATA hard disks.
6682  * Both the device capabilities and requested operation mode are
6683  * considered.
6684  *
6685  * Following scsi cdb fields are ignored:
6686  * rwprotect, dpo, fua, fua_nv, group_number.
6687  *
6688  * If SATA_ENABLE_QUEUING flag is set (in the global SATA HBA framework
6689  * enable variable sata_func_enable), the capability of the controller and
6690  * capability of a device are checked and if both support queueing, write
6691  * request will be translated to WRITE_DMA_QUEUEING or WRITE_DMA_QUEUEING_EXT
6692  * command rather than plain WRITE_XXX command.
6693  * If SATA_ENABLE_NCQ flag is set in addition to SATA_ENABLE_QUEUING flag and
6694  * both the controller and device suport such functionality, the write
6695  * request will be translated to WRITE_FPDMA_QUEUED command.
6696  * In both cases the maximum queue depth is derived as minimum of:
6697  * HBA capability,device capability and sata_max_queue_depth variable setting.
6698  * The value passed to HBA driver is decremented by 1, because only 5 bits are
6699  * used to pass max queue depth value, and the maximum possible queue depth
6700  * is 32.
6701  *
6702  * Returns TRAN_ACCEPT or code returned by sata_hba_start() and
6703  * appropriate values in scsi_pkt fields.
6704  */
6705 static int
sata_txlt_write(sata_pkt_txlate_t * spx)6706 sata_txlt_write(sata_pkt_txlate_t *spx)
6707 {
6708 	struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
6709 	sata_cmd_t *scmd = &spx->txlt_sata_pkt->satapkt_cmd;
6710 	sata_drive_info_t *sdinfo;
6711 	sata_hba_inst_t *shi = SATA_TXLT_HBA_INST(spx);
6712 	uint16_t sec_count;
6713 	uint64_t lba;
6714 	int rval, reason;
6715 	int synch;
6716 	kmutex_t *cport_mutex = &(SATA_TXLT_CPORT_MUTEX(spx));
6717 
6718 	mutex_enter(cport_mutex);
6719 
6720 	if (((rval = sata_txlt_generic_pkt_info(spx, &reason, 0)) !=
6721 	    TRAN_ACCEPT) || (reason == CMD_DEV_GONE)) {
6722 		mutex_exit(cport_mutex);
6723 		return (rval);
6724 	}
6725 
6726 	sdinfo = sata_get_device_info(spx->txlt_sata_hba_inst,
6727 	    &spx->txlt_sata_pkt->satapkt_device);
6728 
6729 	scmd->satacmd_flags.sata_data_direction = SATA_DIR_WRITE;
6730 	/*
6731 	 * Extract LBA and sector count from scsi CDB
6732 	 */
6733 	switch ((uint_t)scsipkt->pkt_cdbp[0]) {
6734 	case SCMD_WRITE:
6735 		/* 6-byte scsi read cmd : 0x0A */
6736 		lba = (scsipkt->pkt_cdbp[1] & 0x1f);
6737 		lba = (lba << 8) | scsipkt->pkt_cdbp[2];
6738 		lba = (lba << 8) | scsipkt->pkt_cdbp[3];
6739 		sec_count = scsipkt->pkt_cdbp[4];
6740 		/* sec_count 0 will be interpreted as 256 by a device */
6741 		break;
6742 	case SCMD_WRITE_G1:
6743 		/* 10-bytes scsi write command : 0x2A */
6744 		lba = scsipkt->pkt_cdbp[2];
6745 		lba = (lba << 8) | scsipkt->pkt_cdbp[3];
6746 		lba = (lba << 8) | scsipkt->pkt_cdbp[4];
6747 		lba = (lba << 8) | scsipkt->pkt_cdbp[5];
6748 		sec_count = scsipkt->pkt_cdbp[7];
6749 		sec_count = (sec_count << 8) | scsipkt->pkt_cdbp[8];
6750 		break;
6751 	case SCMD_WRITE_G5:
6752 		/* 12-bytes scsi read command : 0xAA */
6753 		lba = scsipkt->pkt_cdbp[2];
6754 		lba = (lba << 8) | scsipkt->pkt_cdbp[3];
6755 		lba = (lba << 8) | scsipkt->pkt_cdbp[4];
6756 		lba = (lba << 8) | scsipkt->pkt_cdbp[5];
6757 		sec_count = scsipkt->pkt_cdbp[6];
6758 		sec_count = (sec_count << 8) | scsipkt->pkt_cdbp[7];
6759 		sec_count = (sec_count << 8) | scsipkt->pkt_cdbp[8];
6760 		sec_count = (sec_count << 8) | scsipkt->pkt_cdbp[9];
6761 		break;
6762 	case SCMD_WRITE_G4:
6763 		/* 16-bytes scsi write command : 0x8A */
6764 		lba = scsipkt->pkt_cdbp[2];
6765 		lba = (lba << 8) | scsipkt->pkt_cdbp[3];
6766 		lba = (lba << 8) | scsipkt->pkt_cdbp[4];
6767 		lba = (lba << 8) | scsipkt->pkt_cdbp[5];
6768 		lba = (lba << 8) | scsipkt->pkt_cdbp[6];
6769 		lba = (lba << 8) | scsipkt->pkt_cdbp[7];
6770 		lba = (lba << 8) | scsipkt->pkt_cdbp[8];
6771 		lba = (lba << 8) | scsipkt->pkt_cdbp[9];
6772 		sec_count = scsipkt->pkt_cdbp[10];
6773 		sec_count = (sec_count << 8) | scsipkt->pkt_cdbp[11];
6774 		sec_count = (sec_count << 8) | scsipkt->pkt_cdbp[12];
6775 		sec_count = (sec_count << 8) | scsipkt->pkt_cdbp[13];
6776 		break;
6777 	default:
6778 		/* Unsupported command */
6779 		mutex_exit(cport_mutex);
6780 		return (sata_txlt_invalid_command(spx));
6781 	}
6782 
6783 	/*
6784 	 * Check if specified address and length exceeds device capacity
6785 	 */
6786 	if ((lba >= sdinfo->satadrv_capacity) ||
6787 	    ((lba + sec_count) > sdinfo->satadrv_capacity)) {
6788 		/* LBA out of range */
6789 		mutex_exit(cport_mutex);
6790 		return (sata_txlt_lba_out_of_range(spx));
6791 	}
6792 
6793 	/*
6794 	 * For zero-length transfer, emulate good completion of the command
6795 	 * (reasons for rejecting the command were already checked).
6796 	 * No DMA resources were allocated.
6797 	 */
6798 	if (spx->txlt_dma_cookie_list == NULL) {
6799 		mutex_exit(cport_mutex);
6800 		return (sata_emul_rw_completion(spx));
6801 	}
6802 
6803 	/*
6804 	 * Build cmd block depending on the device capability and
6805 	 * requested operation mode.
6806 	 * Do not bother with non-dma mode- we are working only with
6807 	 * devices supporting DMA.
6808 	 */
6809 	scmd->satacmd_addr_type = ATA_ADDR_LBA;
6810 	scmd->satacmd_device_reg = SATA_ADH_LBA;
6811 	scmd->satacmd_cmd_reg = SATAC_WRITE_DMA;
6812 	if (sdinfo->satadrv_features_support & SATA_DEV_F_LBA48) {
6813 		scmd->satacmd_addr_type = ATA_ADDR_LBA48;
6814 		scmd->satacmd_cmd_reg = SATAC_WRITE_DMA_EXT;
6815 		scmd->satacmd_sec_count_msb = sec_count >> 8;
6816 		scmd->satacmd_lba_low_msb = (lba >> 24) & 0xff;
6817 #ifndef __lock_lint
6818 		scmd->satacmd_lba_mid_msb = (lba >> 32) & 0xff;
6819 		scmd->satacmd_lba_high_msb = lba >> 40;
6820 #endif
6821 	} else if (sdinfo->satadrv_features_support & SATA_DEV_F_LBA28) {
6822 		scmd->satacmd_addr_type = ATA_ADDR_LBA28;
6823 		scmd->satacmd_device_reg = SATA_ADH_LBA | ((lba >> 24) & 0xf);
6824 	}
6825 	scmd->satacmd_sec_count_lsb = sec_count & 0xff;
6826 	scmd->satacmd_lba_low_lsb = lba & 0xff;
6827 	scmd->satacmd_lba_mid_lsb = (lba >> 8) & 0xff;
6828 	scmd->satacmd_lba_high_lsb = (lba >> 16) & 0xff;
6829 	scmd->satacmd_features_reg = 0;
6830 	scmd->satacmd_status_reg = 0;
6831 	scmd->satacmd_error_reg = 0;
6832 
6833 	/*
6834 	 * Check if queueing commands should be used and switch
6835 	 * to appropriate command if possible
6836 	 */
6837 	if (sata_func_enable & SATA_ENABLE_QUEUING) {
6838 		boolean_t using_queuing;
6839 
6840 		/* Queuing supported by controller and device? */
6841 		if ((sata_func_enable & SATA_ENABLE_NCQ) &&
6842 		    (sdinfo->satadrv_features_support &
6843 		    SATA_DEV_F_NCQ) &&
6844 		    (SATA_FEATURES(spx->txlt_sata_hba_inst) &
6845 		    SATA_CTLF_NCQ)) {
6846 			using_queuing = B_TRUE;
6847 
6848 			/* NCQ supported - use FPDMA WRITE */
6849 			scmd->satacmd_cmd_reg =
6850 			    SATAC_WRITE_FPDMA_QUEUED;
6851 			scmd->satacmd_features_reg_ext =
6852 			    scmd->satacmd_sec_count_msb;
6853 			scmd->satacmd_sec_count_msb = 0;
6854 		} else if ((sdinfo->satadrv_features_support &
6855 		    SATA_DEV_F_TCQ) &&
6856 		    (SATA_FEATURES(spx->txlt_sata_hba_inst) &
6857 		    SATA_CTLF_QCMD)) {
6858 			using_queuing = B_TRUE;
6859 
6860 			/* Legacy queueing */
6861 			if (sdinfo->satadrv_features_support &
6862 			    SATA_DEV_F_LBA48) {
6863 				scmd->satacmd_cmd_reg =
6864 				    SATAC_WRITE_DMA_QUEUED_EXT;
6865 				scmd->satacmd_features_reg_ext =
6866 				    scmd->satacmd_sec_count_msb;
6867 				scmd->satacmd_sec_count_msb = 0;
6868 			} else {
6869 				scmd->satacmd_cmd_reg =
6870 				    SATAC_WRITE_DMA_QUEUED;
6871 			}
6872 		} else	/*  NCQ nor legacy queuing not supported */
6873 			using_queuing = B_FALSE;
6874 
6875 		if (using_queuing) {
6876 			scmd->satacmd_features_reg =
6877 			    scmd->satacmd_sec_count_lsb;
6878 			scmd->satacmd_sec_count_lsb = 0;
6879 			scmd->satacmd_flags.sata_queued = B_TRUE;
6880 			/* Set-up maximum queue depth */
6881 			scmd->satacmd_flags.sata_max_queue_depth =
6882 			    sdinfo->satadrv_max_queue_depth - 1;
6883 		} else if (sdinfo->satadrv_features_enabled &
6884 		    SATA_DEV_F_E_UNTAGGED_QING) {
6885 			/*
6886 			 * Although NCQ/TCQ is not enabled, untagged queuing
6887 			 * may be still used.
6888 			 * Set-up the maximum untagged queue depth.
6889 			 * Use controller's queue depth from sata_hba_tran.
6890 			 * SATA HBA drivers may ignore this value and rely on
6891 			 * the internal limits. For drivera that do not
6892 			 * ignore untaged queue depth, limit the value to
6893 			 * SATA_MAX_QUEUE_DEPTH (32), as this is the
6894 			 * largest value that can be passed via
6895 			 * satacmd_flags.sata_max_queue_depth.
6896 			 */
6897 			scmd->satacmd_flags.sata_max_queue_depth =
6898 			    SATA_QDEPTH(shi) <= SATA_MAX_QUEUE_DEPTH ?
6899 			    SATA_QDEPTH(shi) - 1: SATA_MAX_QUEUE_DEPTH - 1;
6900 
6901 		} else {
6902 			scmd->satacmd_flags.sata_max_queue_depth = 0;
6903 		}
6904 	} else
6905 		scmd->satacmd_flags.sata_max_queue_depth = 0;
6906 
6907 	SATADBG3(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
6908 	    "sata_txlt_write cmd 0x%2x, lba %llx, sec count %x\n",
6909 	    scmd->satacmd_cmd_reg, lba, sec_count);
6910 
6911 	if (!(spx->txlt_sata_pkt->satapkt_op_mode & SATA_OPMODE_SYNCH)) {
6912 		/* Need callback function */
6913 		spx->txlt_sata_pkt->satapkt_comp = sata_txlt_rw_completion;
6914 		synch = FALSE;
6915 	} else
6916 		synch = TRUE;
6917 
6918 	/* Transfer command to HBA */
6919 	if (sata_hba_start(spx, &rval) != 0) {
6920 		/* Pkt not accepted for execution */
6921 		mutex_exit(cport_mutex);
6922 		return (rval);
6923 	}
6924 	mutex_exit(cport_mutex);
6925 
6926 	/*
6927 	 * If execution is non-synchronous,
6928 	 * a callback function will handle potential errors, translate
6929 	 * the response and will do a callback to a target driver.
6930 	 * If it was synchronous, check execution status using the same
6931 	 * framework callback.
6932 	 */
6933 	if (synch) {
6934 		SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
6935 		    "synchronous execution status %x\n",
6936 		    spx->txlt_sata_pkt->satapkt_reason);
6937 		sata_txlt_rw_completion(spx->txlt_sata_pkt);
6938 	}
6939 	return (TRAN_ACCEPT);
6940 }
6941 
6942 
6943 /*
6944  * Implements SCSI SBC WRITE BUFFER command download microcode option
6945  */
6946 static int
sata_txlt_write_buffer(sata_pkt_txlate_t * spx)6947 sata_txlt_write_buffer(sata_pkt_txlate_t *spx)
6948 {
6949 #define	WB_DOWNLOAD_MICROCODE_AND_REVERT_MODE			4
6950 #define	WB_DOWNLOAD_MICROCODE_AND_SAVE_MODE			5
6951 
6952 	struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
6953 	struct sata_pkt *sata_pkt = spx->txlt_sata_pkt;
6954 	sata_cmd_t *scmd = &spx->txlt_sata_pkt->satapkt_cmd;
6955 
6956 	struct buf *bp = spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp;
6957 	struct scsi_extended_sense *sense;
6958 	int rval, mode, sector_count, reason;
6959 	kmutex_t *cport_mutex = &(SATA_TXLT_CPORT_MUTEX(spx));
6960 
6961 	mode = scsipkt->pkt_cdbp[1] & 0x1f;
6962 
6963 	SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
6964 	    "sata_txlt_write_buffer, mode 0x%x\n", mode);
6965 
6966 	mutex_enter(cport_mutex);
6967 
6968 	if ((rval = sata_txlt_generic_pkt_info(spx, &reason, 1)) !=
6969 	    TRAN_ACCEPT) {
6970 		mutex_exit(cport_mutex);
6971 		return (rval);
6972 	}
6973 
6974 	/* Use synchronous mode */
6975 	spx->txlt_sata_pkt->satapkt_op_mode
6976 	    |= SATA_OPMODE_SYNCH | SATA_OPMODE_INTERRUPTS;
6977 
6978 	scmd->satacmd_flags.sata_data_direction = SATA_DIR_WRITE;
6979 
6980 	scsipkt->pkt_reason = CMD_CMPLT;
6981 	scsipkt->pkt_state = STATE_GOT_BUS | STATE_GOT_TARGET |
6982 	    STATE_SENT_CMD | STATE_GOT_STATUS;
6983 
6984 	/*
6985 	 * The SCSI to ATA translation specification only calls
6986 	 * for WB_DOWNLOAD_MICROCODE_AND_SAVE_MODE.
6987 	 * WB_DOWNLOAD_MICROC_AND_REVERT_MODE is implemented, but
6988 	 * ATA 8 (draft) got rid of download microcode for temp
6989 	 * and it is even optional for ATA 7, so it may be aborted.
6990 	 * WB_DOWNLOAD_MICROCODE_WITH_OFFSET is not implemented as
6991 	 * it is not specified and the buffer offset for SCSI is a 16-bit
6992 	 * value in bytes, but for ATA it is a 16-bit offset in 512 byte
6993 	 * sectors.  Thus the offset really doesn't buy us anything.
6994 	 * If and when ATA 8 is stabilized and the SCSI to ATA specification
6995 	 * is revised, this can be revisisted.
6996 	 */
6997 	/* Reject not supported request */
6998 	switch (mode) {
6999 	case WB_DOWNLOAD_MICROCODE_AND_REVERT_MODE:
7000 		scmd->satacmd_features_reg = SATA_DOWNLOAD_MCODE_TEMP;
7001 		break;
7002 	case WB_DOWNLOAD_MICROCODE_AND_SAVE_MODE:
7003 		scmd->satacmd_features_reg = SATA_DOWNLOAD_MCODE_SAVE;
7004 		break;
7005 	default:
7006 		goto bad_param;
7007 	}
7008 
7009 	*scsipkt->pkt_scbp = STATUS_GOOD;	/* Presumed outcome */
7010 
7011 	scmd->satacmd_cmd_reg = SATAC_DOWNLOAD_MICROCODE;
7012 	if ((bp->b_bcount % SATA_DISK_SECTOR_SIZE) != 0)
7013 		goto bad_param;
7014 	sector_count = bp->b_bcount / SATA_DISK_SECTOR_SIZE;
7015 	scmd->satacmd_sec_count_lsb = (uint8_t)sector_count;
7016 	scmd->satacmd_lba_low_lsb = ((uint16_t)sector_count) >> 8;
7017 	scmd->satacmd_lba_mid_lsb = 0;
7018 	scmd->satacmd_lba_high_lsb = 0;
7019 	scmd->satacmd_device_reg = 0;
7020 	spx->txlt_sata_pkt->satapkt_comp = NULL;
7021 	scmd->satacmd_addr_type = 0;
7022 
7023 	/* Transfer command to HBA */
7024 	if (sata_hba_start(spx, &rval) != 0) {
7025 		/* Pkt not accepted for execution */
7026 		mutex_exit(cport_mutex);
7027 		return (rval);
7028 	}
7029 
7030 	mutex_exit(cport_mutex);
7031 
7032 	/* Then we need synchronous check the status of the disk */
7033 	scsipkt->pkt_state = STATE_GOT_BUS | STATE_GOT_TARGET |
7034 	    STATE_SENT_CMD | STATE_XFERRED_DATA | STATE_GOT_STATUS;
7035 	if (sata_pkt->satapkt_reason == SATA_PKT_COMPLETED) {
7036 		scsipkt->pkt_reason = CMD_CMPLT;
7037 
7038 		/* Download commmand succeed, so probe and identify device */
7039 		sata_reidentify_device(spx);
7040 	} else {
7041 		/* Something went wrong, microcode download command failed */
7042 		scsipkt->pkt_reason = CMD_INCOMPLETE;
7043 		*scsipkt->pkt_scbp = STATUS_CHECK;
7044 		sense = sata_arq_sense(spx);
7045 		switch (sata_pkt->satapkt_reason) {
7046 		case SATA_PKT_PORT_ERROR:
7047 			/*
7048 			 * We have no device data. Assume no data transfered.
7049 			 */
7050 			sense->es_key = KEY_HARDWARE_ERROR;
7051 			break;
7052 
7053 		case SATA_PKT_DEV_ERROR:
7054 			if (sata_pkt->satapkt_cmd.satacmd_status_reg &
7055 			    SATA_STATUS_ERR) {
7056 				/*
7057 				 * determine dev error reason from error
7058 				 * reg content
7059 				 */
7060 				sata_decode_device_error(spx, sense);
7061 				break;
7062 			}
7063 			/* No extended sense key - no info available */
7064 			break;
7065 
7066 		case SATA_PKT_TIMEOUT:
7067 			scsipkt->pkt_reason = CMD_TIMEOUT;
7068 			scsipkt->pkt_statistics |=
7069 			    STAT_TIMEOUT | STAT_DEV_RESET;
7070 			/* No extended sense key ? */
7071 			break;
7072 
7073 		case SATA_PKT_ABORTED:
7074 			scsipkt->pkt_reason = CMD_ABORTED;
7075 			scsipkt->pkt_statistics |= STAT_ABORTED;
7076 			/* No extended sense key ? */
7077 			break;
7078 
7079 		case SATA_PKT_RESET:
7080 			/* pkt aborted by an explicit reset from a host */
7081 			scsipkt->pkt_reason = CMD_RESET;
7082 			scsipkt->pkt_statistics |= STAT_DEV_RESET;
7083 			break;
7084 
7085 		default:
7086 			SATA_LOG_D((spx->txlt_sata_hba_inst, CE_WARN,
7087 			    "sata_txlt_nodata_cmd_completion: "
7088 			    "invalid packet completion reason %d",
7089 			    sata_pkt->satapkt_reason));
7090 			scsipkt->pkt_reason = CMD_TRAN_ERR;
7091 			break;
7092 		}
7093 
7094 		SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
7095 		    "scsi_pkt completion reason %x\n", scsipkt->pkt_reason);
7096 
7097 		if ((scsipkt->pkt_flags & FLAG_NOINTR) == 0)
7098 			/* scsi callback required */
7099 			scsi_hba_pkt_comp(scsipkt);
7100 	}
7101 	return (TRAN_ACCEPT);
7102 
7103 bad_param:
7104 	mutex_exit(cport_mutex);
7105 	*scsipkt->pkt_scbp = STATUS_CHECK;
7106 	sense = sata_arq_sense(spx);
7107 	sense->es_key = KEY_ILLEGAL_REQUEST;
7108 	sense->es_add_code = SD_SCSI_ASC_INVALID_FIELD_IN_CDB;
7109 	if ((scsipkt->pkt_flags & FLAG_NOINTR) == 0 &&
7110 	    scsipkt->pkt_comp != NULL) {
7111 		/* scsi callback required */
7112 		if (servicing_interrupt()) {
7113 			if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
7114 			    (task_func_t *)spx->txlt_scsi_pkt->pkt_comp,
7115 			    (void *)spx->txlt_scsi_pkt, TQ_NOSLEEP) ==
7116 			    TASKQID_INVALID) {
7117 				return (TRAN_BUSY);
7118 			}
7119 		} else if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
7120 		    (task_func_t *)spx->txlt_scsi_pkt->pkt_comp,
7121 		    (void *)spx->txlt_scsi_pkt, TQ_SLEEP) == TASKQID_INVALID) {
7122 			/* Scheduling the callback failed */
7123 			return (TRAN_BUSY);
7124 		}
7125 	}
7126 	return (rval);
7127 }
7128 
7129 /*
7130  * Re-identify device after doing a firmware download.
7131  */
7132 static void
sata_reidentify_device(sata_pkt_txlate_t * spx)7133 sata_reidentify_device(sata_pkt_txlate_t *spx)
7134 {
7135 #define	DOWNLOAD_WAIT_TIME_SECS	60
7136 #define	DOWNLOAD_WAIT_INTERVAL_SECS	1
7137 	int rval;
7138 	int retry_cnt;
7139 	struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
7140 	sata_hba_inst_t *sata_hba_inst = spx->txlt_sata_hba_inst;
7141 	sata_device_t sata_device = spx->txlt_sata_pkt->satapkt_device;
7142 	sata_drive_info_t *sdinfo;
7143 
7144 	/*
7145 	 * Before returning good status, probe device.
7146 	 * Device probing will get IDENTIFY DEVICE data, if possible.
7147 	 * The assumption is that the new microcode is applied by the
7148 	 * device. It is a caller responsibility to verify this.
7149 	 */
7150 	for (retry_cnt = 0;
7151 	    retry_cnt < DOWNLOAD_WAIT_TIME_SECS / DOWNLOAD_WAIT_INTERVAL_SECS;
7152 	    retry_cnt++) {
7153 		rval = sata_probe_device(sata_hba_inst, &sata_device);
7154 
7155 		if (rval == SATA_SUCCESS) { /* Set default features */
7156 			sdinfo = sata_get_device_info(sata_hba_inst,
7157 			    &sata_device);
7158 			if (sata_initialize_device(sata_hba_inst, sdinfo) !=
7159 			    SATA_SUCCESS) {
7160 				/* retry */
7161 				rval = sata_initialize_device(sata_hba_inst,
7162 				    sdinfo);
7163 				if (rval == SATA_RETRY)
7164 					sata_log(sata_hba_inst, CE_WARN,
7165 					    "SATA device at port %d pmport %d -"
7166 					    " default device features could not"
7167 					    " be set. Device may not operate "
7168 					    "as expected.",
7169 					    sata_device.satadev_addr.cport,
7170 					    sata_device.satadev_addr.pmport);
7171 			}
7172 			if ((scsipkt->pkt_flags & FLAG_NOINTR) == 0)
7173 				scsi_hba_pkt_comp(scsipkt);
7174 			return;
7175 		} else if (rval == SATA_RETRY) {
7176 			delay(drv_usectohz(1000000 *
7177 			    DOWNLOAD_WAIT_INTERVAL_SECS));
7178 			continue;
7179 		} else	/* failed - no reason to retry */
7180 			break;
7181 	}
7182 
7183 	/*
7184 	 * Something went wrong, device probing failed.
7185 	 */
7186 	SATA_LOG_D((sata_hba_inst, CE_WARN,
7187 	    "Cannot probe device after downloading microcode\n"));
7188 
7189 	/* Reset device to force retrying the probe. */
7190 	(void) (*SATA_RESET_DPORT_FUNC(sata_hba_inst))
7191 	    (SATA_DIP(sata_hba_inst), &sata_device);
7192 
7193 	if ((scsipkt->pkt_flags & FLAG_NOINTR) == 0)
7194 		scsi_hba_pkt_comp(scsipkt);
7195 }
7196 
7197 
7198 /*
7199  * Translate command: Synchronize Cache.
7200  * Translates into Flush Cache command for SATA hard disks.
7201  *
7202  * Returns TRAN_ACCEPT or code returned by sata_hba_start() and
7203  * appropriate values in scsi_pkt fields.
7204  */
7205 static int
sata_txlt_synchronize_cache(sata_pkt_txlate_t * spx)7206 sata_txlt_synchronize_cache(sata_pkt_txlate_t *spx)
7207 {
7208 	sata_cmd_t *scmd = &spx->txlt_sata_pkt->satapkt_cmd;
7209 	kmutex_t *cport_mutex = &(SATA_TXLT_CPORT_MUTEX(spx));
7210 	int rval, reason;
7211 	int synch;
7212 
7213 	mutex_enter(cport_mutex);
7214 
7215 	if (((rval = sata_txlt_generic_pkt_info(spx, &reason, 1)) !=
7216 	    TRAN_ACCEPT) || (reason == CMD_DEV_GONE)) {
7217 		mutex_exit(cport_mutex);
7218 		return (rval);
7219 	}
7220 
7221 	scmd->satacmd_addr_type = 0;
7222 	scmd->satacmd_cmd_reg = SATAC_FLUSH_CACHE;
7223 	scmd->satacmd_device_reg = 0;
7224 	scmd->satacmd_sec_count_lsb = 0;
7225 	scmd->satacmd_lba_low_lsb = 0;
7226 	scmd->satacmd_lba_mid_lsb = 0;
7227 	scmd->satacmd_lba_high_lsb = 0;
7228 	scmd->satacmd_features_reg = 0;
7229 	scmd->satacmd_status_reg = 0;
7230 	scmd->satacmd_error_reg = 0;
7231 
7232 	SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
7233 	    "sata_txlt_synchronize_cache\n", NULL);
7234 
7235 	if (!(spx->txlt_sata_pkt->satapkt_op_mode & SATA_OPMODE_SYNCH)) {
7236 		/* Need to set-up a callback function */
7237 		spx->txlt_sata_pkt->satapkt_comp =
7238 		    sata_txlt_nodata_cmd_completion;
7239 		synch = FALSE;
7240 	} else
7241 		synch = TRUE;
7242 
7243 	/* Transfer command to HBA */
7244 	if (sata_hba_start(spx, &rval) != 0) {
7245 		/* Pkt not accepted for execution */
7246 		mutex_exit(cport_mutex);
7247 		return (rval);
7248 	}
7249 	mutex_exit(cport_mutex);
7250 
7251 	/*
7252 	 * If execution non-synchronous, it had to be completed
7253 	 * a callback function will handle potential errors, translate
7254 	 * the response and will do a callback to a target driver.
7255 	 * If it was synchronous, check status, using the same
7256 	 * framework callback.
7257 	 */
7258 	if (synch) {
7259 		SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
7260 		    "synchronous execution status %x\n",
7261 		    spx->txlt_sata_pkt->satapkt_reason);
7262 		sata_txlt_nodata_cmd_completion(spx->txlt_sata_pkt);
7263 	}
7264 	return (TRAN_ACCEPT);
7265 }
7266 
7267 #define	RCTD(pkt) (pkt->pkt_cdbp[1] & 0x80)
7268 static int
sata_txlt_supported_ops(sata_pkt_txlate_t * spx)7269 sata_txlt_supported_ops(sata_pkt_txlate_t *spx)
7270 {
7271 	struct scsi_pkt *pkt = spx->txlt_scsi_pkt;
7272 	struct buf	*bp = spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp;
7273 	sata_drive_info_t *sdinfo;
7274 	const struct sata_cmd_info *sci = NULL;
7275 	struct sata_txlt_buf sbuf;
7276 	uint32_t	alc_len;
7277 	uint_t		i;
7278 	int		reason, rval;
7279 	uint16_t	svcact;
7280 	uint8_t		op, reporting_opts;
7281 
7282 	if (bp == NULL || bp->b_un.b_addr == 0 || bp->b_bcount == 0) {
7283 		*pkt->pkt_scbp = STATUS_GOOD;
7284 		goto done;
7285 	}
7286 
7287 	mutex_enter(&SATA_TXLT_CPORT_MUTEX(spx));
7288 	rval = sata_txlt_generic_pkt_info(spx, &reason, 1);
7289 	if (rval != TRAN_ACCEPT || reason == CMD_DEV_GONE) {
7290 		mutex_exit(&SATA_TXLT_CPORT_MUTEX(spx));
7291 		return (rval);
7292 	}
7293 
7294 	sdinfo = sata_get_device_info(spx->txlt_sata_hba_inst,
7295 	    &spx->txlt_sata_pkt->satapkt_device);
7296 
7297 	sata_scsi_dmafree(NULL, pkt);
7298 
7299 	pkt->pkt_reason = CMD_CMPLT;
7300 	pkt->pkt_state = STATE_GOT_BUS | STATE_GOT_TARGET | STATE_SENT_CMD |
7301 	    STATE_GOT_STATUS;
7302 
7303 	op = pkt->pkt_cdbp[3];
7304 	svcact = BE_IN16(&pkt->pkt_cdbp[4]);
7305 	alc_len = BE_IN32(&pkt->pkt_cdbp[6]);
7306 	reporting_opts = pkt->pkt_cdbp[2] & 0x07;
7307 
7308 	if (reporting_opts > 0x03) {
7309 		/* Values > 0x03 are reserved */
7310 		struct scsi_extended_sense *sense;
7311 
7312 		*pkt->pkt_scbp = STATUS_CHECK;
7313 		sense = sata_arq_sense(spx);
7314 		sense->es_key = KEY_ILLEGAL_REQUEST;
7315 		sense->es_add_code = SD_SCSI_ASC_INVALID_FIELD_IN_CDB;
7316 		goto done;
7317 	}
7318 
7319 	sbuf_init(&sbuf, bp, alc_len);
7320 
7321 	/* Skip length when reporting all_commands */
7322 	if (reporting_opts == 0)
7323 		sbuf_put32(&sbuf, 0);
7324 
7325 	for (i = 0, sci = &sata_cmd_info[0]; i < ARRAY_SIZE(sata_cmd_info);
7326 	    i++, sci++) {
7327 		const boolean_t has_svc_act = (sci->sci_flags & SCF_SVC_ACT) ?
7328 		    B_TRUE : B_FALSE;
7329 
7330 		if (reporting_opts == 0) {
7331 			uint8_t flags = 0;
7332 
7333 			if (sci->sci_supported != NULL &&
7334 			    !sci->sci_supported(spx, sdinfo)) {
7335 				continue;
7336 			}
7337 
7338 			if (has_svc_act)
7339 				flags |= 0x01;
7340 			if (RCTD(pkt))
7341 				flags |= 0x02;
7342 
7343 			/* Write all_commands parameter data format */
7344 			sbuf_put8(&sbuf, sci->sci_op);
7345 			sbuf_put8(&sbuf, 0);	/* Reserved */
7346 			sbuf_put16(&sbuf, sci->sci_svcact);
7347 			sbuf_put8(&sbuf, 0);	/* Reserved */
7348 			sbuf_put8(&sbuf, flags);
7349 			sbuf_put16(&sbuf, sata_cmd_cdblen(sci));
7350 
7351 			/*
7352 			 * SPC-5 6.34.2 Table 256 uggests that for the
7353 			 * all_commands paramater data format that each
7354 			 * command descriptor should include a command
7355 			 * duration timeout descriptor, however the CTDP
7356 			 * flag (byte 5, bit 1) implies it should only be
7357 			 * present when this flag is set.
7358 			 * sg3_utils at least believes the CTDP indicates
7359 			 * if a command duration timeout descriptor is
7360 			 * present. Since we don't support command timeouts
7361 			 * at all, we follow this an omit the command timeout
7362 			 * descriptor.
7363 			 */
7364 			if (RCTD(pkt)) {
7365 				sbuf_put16(&sbuf, 0x0a); /* Length */
7366 				sbuf_put8(&sbuf, 0);	/* Reserved */
7367 				sbuf_put8(&sbuf, 0);	/* cmd specific */
7368 				sbuf_put32(&sbuf, 0);	/* nominal timeout */
7369 				sbuf_put32(&sbuf, 0);	/* recommended to */
7370 			}
7371 
7372 			continue;
7373 		}
7374 
7375 		if (sci->sci_op != op)
7376 			continue;
7377 
7378 		if (has_svc_act) {
7379 			if (reporting_opts == 0x01) {
7380 				struct scsi_extended_sense *sense;
7381 
7382 				*pkt->pkt_scbp = STATUS_CHECK;
7383 				sense = sata_arq_sense(spx);
7384 				sense->es_key = KEY_ILLEGAL_REQUEST;
7385 				sense->es_add_code =
7386 				    SD_SCSI_ASC_INVALID_FIELD_IN_CDB;
7387 				goto done;
7388 			}
7389 
7390 			if (sci->sci_svcact != svcact)
7391 				continue;
7392 		} else {
7393 			if (reporting_opts == 0x02) {
7394 				struct scsi_extended_sense *sense;
7395 
7396 				*pkt->pkt_scbp = STATUS_CHECK;
7397 				sense = sata_arq_sense(spx);
7398 				sense->es_key = KEY_ILLEGAL_REQUEST;
7399 				sense->es_add_code =
7400 				    SD_SCSI_ASC_INVALID_FIELD_IN_CDB;
7401 				goto done;
7402 			}
7403 		}
7404 
7405 		/* Found a match */
7406 		break;
7407 	}
7408 
7409 	if (reporting_opts > 0) {
7410 		/* Write one_command parameter data format */
7411 		uint16_t cdblen;
7412 		uint8_t support;
7413 
7414 		if (i < ARRAY_SIZE(sata_cmd_info)) {
7415 			cdblen = sata_cmd_cdblen(sci);
7416 
7417 			if (sci->sci_supported == NULL ||
7418 			    sci->sci_supported(spx, sdinfo)) {
7419 				support = 0x03;
7420 			} else {
7421 				/*
7422 				 * We have a command we conditionally
7423 				 * support translating, but the SATA disk
7424 				 * doesn't support the translated command
7425 				 * (e.g. UNMAP). SPC-5 isn't entirely clear
7426 				 * on the response. We return what we do know
7427 				 * (i.e. CDB length), but still indicate it
7428 				 * is not supported. We should be able to
7429 				 * adjust this behavior if needed (or future
7430 				 * revisions clarify the behavior and our
7431 				 * current behavior conflicts) in the future.
7432 				 */
7433 				support = 0x01;
7434 			}
7435 		} else {
7436 			/* A command we don't recognize at all */
7437 			cdblen = 0;
7438 			support = 0x01;
7439 		}
7440 
7441 		if (RCTD(pkt))
7442 			support |= 0x80;
7443 
7444 		/* Write one_command parameter format */
7445 		sbuf_put8(&sbuf, 0);		/* Reserved */
7446 		sbuf_put8(&sbuf, support);	/* Command supported */
7447 		sbuf_put16(&sbuf, cdblen);	/* CDB Length */
7448 		sbuf_copy(&sbuf, sci->sci_cdbusage, cdblen);
7449 
7450 		if (RCTD(pkt)) {
7451 			sbuf_put16(&sbuf, 0x0a); /* Length */
7452 			sbuf_put8(&sbuf, 0);	/* Reserved */
7453 			sbuf_put8(&sbuf, 0);	/* cmd specific */
7454 			sbuf_put32(&sbuf, 0);	/* nominal timeout */
7455 			sbuf_put32(&sbuf, 0);	/* recommended timeout */
7456 		}
7457 	}
7458 
7459 	/*
7460 	 * When reporting all_commands, set the total length in the first
7461 	 * 4 bytes. When reporting one_command, the output has a fixed
7462 	 * header which includes the CDB length, the CDB usage data,
7463 	 * and (if specified) the command timeout descriptor, so the
7464 	 * size of the output is inferred from the CDB length field (per SPC-5).
7465 	 */
7466 	if (reporting_opts == 0)
7467 		sbuf_set_len(&sbuf, 0, sizeof (uint32_t), 4);
7468 
7469 	pkt->pkt_state |= STATE_XFERRED_DATA;
7470 	pkt->pkt_resid = sbuf_resid(&sbuf, bp, alc_len);
7471 	*pkt->pkt_scbp = STATUS_GOOD;
7472 
7473 done:
7474 	mutex_exit(&SATA_TXLT_CPORT_MUTEX(spx));
7475 
7476 	SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
7477 	    "Scsi_pkt completion reason %x\n", pkt->pkt_reason);
7478 
7479 	taskq_t *tq = SATA_TXLT_TASKQ(spx);
7480 	task_func_t *func = (task_func_t *)pkt->pkt_comp;
7481 	uint_t tq_flags = servicing_interrupt() ? TQ_NOSLEEP : TQ_SLEEP;
7482 
7483 	if ((pkt->pkt_flags & FLAG_NOINTR) != 0 || pkt->pkt_comp == NULL)
7484 		return (TRAN_ACCEPT);
7485 
7486 	if (taskq_dispatch(tq, func, pkt, tq_flags) == TASKQID_INVALID)
7487 		return (TRAN_BUSY);
7488 
7489 	return (TRAN_ACCEPT);
7490 }
7491 
7492 /*
7493  * Send pkt to SATA HBA driver
7494  *
7495  * This function may be called only if the operation is requested by scsi_pkt,
7496  * i.e. scsi_pkt is not NULL.
7497  *
7498  * This function has to be called with cport mutex held. It does release
7499  * the mutex when it calls HBA driver sata_tran_start function and
7500  * re-acquires it afterwards.
7501  *
7502  * If return value is 0, pkt was accepted, -1 otherwise
7503  * rval is set to appropriate sata_scsi_start return value.
7504  *
7505  * Note 1:If HBA driver returns value other than TRAN_ACCEPT, it should not
7506  * have called the sata_pkt callback function for this packet.
7507  *
7508  * The scsi callback has to be performed by the caller of this routine.
7509  */
7510 static int
sata_hba_start(sata_pkt_txlate_t * spx,int * rval)7511 sata_hba_start(sata_pkt_txlate_t *spx, int *rval)
7512 {
7513 	int stat;
7514 	uint8_t cport = SATA_TXLT_CPORT(spx);
7515 	uint8_t pmport = SATA_TXLT_PMPORT(spx);
7516 	sata_hba_inst_t *sata_hba_inst = spx->txlt_sata_hba_inst;
7517 	sata_drive_info_t *sdinfo;
7518 	sata_pmult_info_t *pminfo = NULL;
7519 	sata_pmport_info_t *pmportinfo = NULL;
7520 	sata_device_t *sata_device = NULL;
7521 	uint8_t cmd;
7522 	struct sata_cmd_flags cmd_flags;
7523 
7524 	ASSERT(spx->txlt_sata_pkt != NULL);
7525 
7526 	ASSERT(mutex_owned(&SATA_CPORT_MUTEX(sata_hba_inst, cport)));
7527 
7528 	sdinfo = sata_get_device_info(sata_hba_inst,
7529 	    &spx->txlt_sata_pkt->satapkt_device);
7530 	ASSERT(sdinfo != NULL);
7531 
7532 	/* Clear device reset state? */
7533 	/* qual should be XXX_DPMPORT, but add XXX_PMPORT in case */
7534 	if (sdinfo->satadrv_addr.qual == SATA_ADDR_DPMPORT ||
7535 	    sdinfo->satadrv_addr.qual == SATA_ADDR_PMPORT) {
7536 
7537 		/*
7538 		 * Get the pmult_info of the its parent port multiplier, all
7539 		 * sub-devices share a common device reset flags on in
7540 		 * pmult_info.
7541 		 */
7542 		pminfo = SATA_PMULT_INFO(sata_hba_inst, cport);
7543 		pmportinfo = pminfo->pmult_dev_port[pmport];
7544 		ASSERT(pminfo != NULL);
7545 		if (pminfo->pmult_event_flags & SATA_EVNT_CLEAR_DEVICE_RESET) {
7546 			spx->txlt_sata_pkt->satapkt_cmd.satacmd_flags.
7547 			    sata_clear_dev_reset = B_TRUE;
7548 			pminfo->pmult_event_flags &=
7549 			    ~SATA_EVNT_CLEAR_DEVICE_RESET;
7550 			SATADBG1(SATA_DBG_EVENTS, sata_hba_inst,
7551 			    "sata_hba_start: clearing device reset state"
7552 			    "on pmult.\n", NULL);
7553 		}
7554 	} else {
7555 		if (sdinfo->satadrv_event_flags &
7556 		    SATA_EVNT_CLEAR_DEVICE_RESET) {
7557 			spx->txlt_sata_pkt->satapkt_cmd.satacmd_flags.
7558 			    sata_clear_dev_reset = B_TRUE;
7559 			sdinfo->satadrv_event_flags &=
7560 			    ~SATA_EVNT_CLEAR_DEVICE_RESET;
7561 			SATADBG1(SATA_DBG_EVENTS, sata_hba_inst,
7562 			    "sata_hba_start: clearing device reset state\n",
7563 			    NULL);
7564 		}
7565 	}
7566 
7567 	cmd = spx->txlt_sata_pkt->satapkt_cmd.satacmd_cmd_reg;
7568 	cmd_flags = spx->txlt_sata_pkt->satapkt_cmd.satacmd_flags;
7569 	sata_device = &spx->txlt_sata_pkt->satapkt_device;
7570 
7571 	mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst, cport)));
7572 
7573 	SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
7574 	    "Sata cmd 0x%2x\n", cmd);
7575 
7576 	stat = (*SATA_START_FUNC(sata_hba_inst))(SATA_DIP(sata_hba_inst),
7577 	    spx->txlt_sata_pkt);
7578 	mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst, cport)));
7579 	/*
7580 	 * If sata pkt was accepted and executed in asynchronous mode, i.e.
7581 	 * with the sata callback, the sata_pkt could be already destroyed
7582 	 * by the time we check ther return status from the hba_start()
7583 	 * function, because sata_scsi_destroy_pkt() could have been already
7584 	 * called (perhaps in the interrupt context). So, in such case, there
7585 	 * should be no references to it. In other cases, sata_pkt still
7586 	 * exists.
7587 	 */
7588 	if (stat == SATA_TRAN_ACCEPTED) {
7589 		/*
7590 		 * pkt accepted for execution.
7591 		 * If it was executed synchronously, it is already completed
7592 		 * and pkt completion_reason indicates completion status.
7593 		 */
7594 		*rval = TRAN_ACCEPT;
7595 		return (0);
7596 	}
7597 
7598 	sdinfo = sata_get_device_info(sata_hba_inst, sata_device);
7599 	switch (stat) {
7600 	case SATA_TRAN_QUEUE_FULL:
7601 		/*
7602 		 * Controller detected queue full condition.
7603 		 */
7604 		SATADBG1(SATA_DBG_HBA_IF, sata_hba_inst,
7605 		    "sata_hba_start: queue full\n", NULL);
7606 
7607 		spx->txlt_scsi_pkt->pkt_reason = CMD_INCOMPLETE;
7608 		*spx->txlt_scsi_pkt->pkt_scbp = STATUS_QFULL;
7609 
7610 		*rval = TRAN_BUSY;
7611 		break;
7612 
7613 	case SATA_TRAN_PORT_ERROR:
7614 		/*
7615 		 * Communication/link with device or general port error
7616 		 * detected before pkt execution begun.
7617 		 */
7618 		if (spx->txlt_sata_pkt->satapkt_device.satadev_addr.qual ==
7619 		    SATA_ADDR_CPORT ||
7620 		    spx->txlt_sata_pkt->satapkt_device.satadev_addr.qual ==
7621 		    SATA_ADDR_DCPORT)
7622 			sata_log(sata_hba_inst, CE_CONT,
7623 			    "SATA port %d error",
7624 			    sata_device->satadev_addr.cport);
7625 		else
7626 			sata_log(sata_hba_inst, CE_CONT,
7627 			    "SATA port %d:%d error\n",
7628 			    sata_device->satadev_addr.cport,
7629 			    sata_device->satadev_addr.pmport);
7630 
7631 		/*
7632 		 * Update the port/device structure.
7633 		 * sata_pkt should be still valid. Since port error is
7634 		 * returned, sata_device content should reflect port
7635 		 * state - it means, that sata address have been changed,
7636 		 * because original packet's sata address refered to a device
7637 		 * attached to some port.
7638 		 */
7639 		if (sata_device->satadev_addr.qual == SATA_ADDR_DPMPORT ||
7640 		    sata_device->satadev_addr.qual == SATA_ADDR_PMPORT) {
7641 			mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst, cport)));
7642 			mutex_enter(&pmportinfo->pmport_mutex);
7643 			sata_update_pmport_info(sata_hba_inst, sata_device);
7644 			mutex_exit(&pmportinfo->pmport_mutex);
7645 			mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst, cport)));
7646 		} else {
7647 			sata_update_port_info(sata_hba_inst, sata_device);
7648 		}
7649 
7650 		spx->txlt_scsi_pkt->pkt_reason = CMD_TRAN_ERR;
7651 		*rval = TRAN_FATAL_ERROR;
7652 		break;
7653 
7654 	case SATA_TRAN_CMD_UNSUPPORTED:
7655 		/*
7656 		 * Command rejected by HBA as unsupported. It was HBA driver
7657 		 * that rejected the command, command was not sent to
7658 		 * an attached device.
7659 		 */
7660 		if ((sdinfo != NULL) &&
7661 		    (sdinfo->satadrv_state & SATA_DSTATE_RESET))
7662 			SATADBG1(SATA_DBG_EVENTS, sata_hba_inst,
7663 			    "sat_hba_start: cmd 0x%2x rejected "
7664 			    "with SATA_TRAN_CMD_UNSUPPORTED status\n", cmd);
7665 
7666 		mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst, cport)));
7667 		(void) sata_txlt_invalid_command(spx);
7668 		mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst, cport)));
7669 
7670 		*rval = TRAN_ACCEPT;
7671 		break;
7672 
7673 	case SATA_TRAN_BUSY:
7674 		/*
7675 		 * Command rejected by HBA because other operation prevents
7676 		 * accepting the packet, or device is in RESET condition.
7677 		 */
7678 		if (sdinfo != NULL) {
7679 			sdinfo->satadrv_state =
7680 			    spx->txlt_sata_pkt->satapkt_device.satadev_state;
7681 
7682 			if (sdinfo->satadrv_state & SATA_DSTATE_RESET) {
7683 				SATADBG1(SATA_DBG_EVENTS, sata_hba_inst,
7684 				    "sata_hba_start: cmd 0x%2x rejected "
7685 				    "because of device reset condition\n",
7686 				    cmd);
7687 			} else {
7688 				SATADBG1(SATA_DBG_EVENTS, sata_hba_inst,
7689 				    "sata_hba_start: cmd 0x%2x rejected "
7690 				    "with SATA_TRAN_BUSY status\n",
7691 				    cmd);
7692 			}
7693 		}
7694 		spx->txlt_scsi_pkt->pkt_reason = CMD_INCOMPLETE;
7695 		*rval = TRAN_BUSY;
7696 		break;
7697 
7698 	default:
7699 		/* Unrecognized HBA response */
7700 		SATA_LOG_D((sata_hba_inst, CE_WARN,
7701 		    "sata_hba_start: unrecognized HBA response "
7702 		    "to cmd : 0x%2x resp 0x%x", cmd, rval));
7703 		spx->txlt_scsi_pkt->pkt_reason = CMD_TRAN_ERR;
7704 		*rval = TRAN_FATAL_ERROR;
7705 		break;
7706 	}
7707 
7708 	/*
7709 	 * If we got here, the packet was rejected.
7710 	 * Check if we need to remember reset state clearing request
7711 	 */
7712 	if (cmd_flags.sata_clear_dev_reset) {
7713 		/*
7714 		 * Check if device is still configured - it may have
7715 		 * disapeared from the configuration
7716 		 */
7717 		sdinfo = sata_get_device_info(sata_hba_inst, sata_device);
7718 		if (sdinfo != NULL) {
7719 			/*
7720 			 * Restore the flag that requests clearing of
7721 			 * the device reset state,
7722 			 * so the next sata packet may carry it to HBA.
7723 			 */
7724 			if (sdinfo->satadrv_addr.qual == SATA_ADDR_PMPORT ||
7725 			    sdinfo->satadrv_addr.qual == SATA_ADDR_DPMPORT) {
7726 				pminfo->pmult_event_flags |=
7727 				    SATA_EVNT_CLEAR_DEVICE_RESET;
7728 			} else {
7729 				sdinfo->satadrv_event_flags |=
7730 				    SATA_EVNT_CLEAR_DEVICE_RESET;
7731 			}
7732 		}
7733 	}
7734 	return (-1);
7735 }
7736 
7737 /*
7738  * Scsi response setup for invalid LBA
7739  *
7740  * Returns TRAN_ACCEPT and appropriate values in scsi_pkt fields.
7741  */
7742 static int
sata_txlt_lba_out_of_range(sata_pkt_txlate_t * spx)7743 sata_txlt_lba_out_of_range(sata_pkt_txlate_t *spx)
7744 {
7745 	struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
7746 	struct scsi_extended_sense *sense;
7747 
7748 	scsipkt->pkt_reason = CMD_CMPLT;
7749 	scsipkt->pkt_state = STATE_GOT_BUS | STATE_GOT_TARGET |
7750 	    STATE_SENT_CMD | STATE_GOT_STATUS;
7751 	*scsipkt->pkt_scbp = STATUS_CHECK;
7752 
7753 	*scsipkt->pkt_scbp = STATUS_CHECK;
7754 	sense = sata_arq_sense(spx);
7755 	sense->es_key = KEY_ILLEGAL_REQUEST;
7756 	sense->es_add_code = SD_SCSI_ASC_LBA_OUT_OF_RANGE;
7757 
7758 	SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
7759 	    "Scsi_pkt completion reason %x\n", scsipkt->pkt_reason);
7760 
7761 	if ((scsipkt->pkt_flags & FLAG_NOINTR) == 0 &&
7762 	    scsipkt->pkt_comp != NULL) {
7763 		/* scsi callback required */
7764 		if (servicing_interrupt()) {
7765 			if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
7766 			    (task_func_t *)spx->txlt_scsi_pkt->pkt_comp,
7767 			    (void *)spx->txlt_scsi_pkt, TQ_NOSLEEP) ==
7768 			    TASKQID_INVALID) {
7769 				return (TRAN_BUSY);
7770 			}
7771 		} else if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
7772 		    (task_func_t *)spx->txlt_scsi_pkt->pkt_comp,
7773 		    (void *)spx->txlt_scsi_pkt, TQ_SLEEP) == TASKQID_INVALID) {
7774 			/* Scheduling the callback failed */
7775 			return (TRAN_BUSY);
7776 		}
7777 	}
7778 	return (TRAN_ACCEPT);
7779 }
7780 
7781 
7782 /*
7783  * Analyze device status and error registers and translate them into
7784  * appropriate scsi sense codes.
7785  * NOTE: non-packet commands only for now
7786  */
7787 static void
sata_decode_device_error(sata_pkt_txlate_t * spx,struct scsi_extended_sense * sense)7788 sata_decode_device_error(sata_pkt_txlate_t *spx,
7789     struct scsi_extended_sense *sense)
7790 {
7791 	uint8_t err_reg = spx->txlt_sata_pkt->satapkt_cmd.satacmd_error_reg;
7792 
7793 	ASSERT(sense != NULL);
7794 	ASSERT(spx->txlt_sata_pkt->satapkt_cmd.satacmd_status_reg &
7795 	    SATA_STATUS_ERR);
7796 
7797 
7798 	if (err_reg & SATA_ERROR_ICRC) {
7799 		sense->es_key = KEY_ABORTED_COMMAND;
7800 		sense->es_add_code = 0x08; /* Communication failure */
7801 		return;
7802 	}
7803 
7804 	if (err_reg & SATA_ERROR_UNC) {
7805 		sense->es_key = KEY_MEDIUM_ERROR;
7806 		/* Information bytes (LBA) need to be set by a caller */
7807 		return;
7808 	}
7809 
7810 	/* ADD HERE: MC error bit handling for ATAPI CD/DVD */
7811 	if (err_reg & (SATA_ERROR_MCR | SATA_ERROR_NM)) {
7812 		sense->es_key = KEY_UNIT_ATTENTION;
7813 		sense->es_add_code = 0x3a; /* No media present */
7814 		return;
7815 	}
7816 
7817 	if (err_reg & SATA_ERROR_IDNF) {
7818 		if (err_reg & SATA_ERROR_ABORT) {
7819 			sense->es_key = KEY_ABORTED_COMMAND;
7820 		} else {
7821 			sense->es_key = KEY_ILLEGAL_REQUEST;
7822 			sense->es_add_code = 0x21; /* LBA out of range */
7823 		}
7824 		return;
7825 	}
7826 
7827 	if (err_reg & SATA_ERROR_ABORT) {
7828 		ASSERT(spx->txlt_sata_pkt != NULL);
7829 		sense->es_key = KEY_ABORTED_COMMAND;
7830 		return;
7831 	}
7832 }
7833 
7834 /*
7835  * Extract error LBA from sata_pkt.satapkt_cmd register fields
7836  */
7837 static void
sata_extract_error_lba(sata_pkt_txlate_t * spx,uint64_t * lba)7838 sata_extract_error_lba(sata_pkt_txlate_t *spx, uint64_t *lba)
7839 {
7840 	sata_cmd_t *sata_cmd = &spx->txlt_sata_pkt->satapkt_cmd;
7841 
7842 	*lba = 0;
7843 	if (sata_cmd->satacmd_addr_type == ATA_ADDR_LBA48) {
7844 		*lba = sata_cmd->satacmd_lba_high_msb;
7845 		*lba = (*lba << 8) | sata_cmd->satacmd_lba_mid_msb;
7846 		*lba = (*lba << 8) | sata_cmd->satacmd_lba_low_msb;
7847 	} else if (sata_cmd->satacmd_addr_type == ATA_ADDR_LBA28) {
7848 		*lba = sata_cmd->satacmd_device_reg & 0xf;
7849 	}
7850 	*lba = (*lba << 8) | sata_cmd->satacmd_lba_high_lsb;
7851 	*lba = (*lba << 8) | sata_cmd->satacmd_lba_mid_lsb;
7852 	*lba = (*lba << 8) | sata_cmd->satacmd_lba_low_lsb;
7853 }
7854 
7855 /*
7856  * This is fixed sense format - if LBA exceeds the info field size,
7857  * no valid info will be returned (valid bit in extended sense will
7858  * be set to 0).
7859  */
7860 static struct scsi_extended_sense *
sata_arq_sense(sata_pkt_txlate_t * spx)7861 sata_arq_sense(sata_pkt_txlate_t *spx)
7862 {
7863 	struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
7864 	struct scsi_arq_status *arqs;
7865 	struct scsi_extended_sense *sense;
7866 
7867 	/* Fill ARQ sense data */
7868 	scsipkt->pkt_state |= STATE_ARQ_DONE;
7869 	arqs = (struct scsi_arq_status *)scsipkt->pkt_scbp;
7870 	*(uchar_t *)&arqs->sts_status = STATUS_CHECK;
7871 	*(uchar_t *)&arqs->sts_rqpkt_status = STATUS_GOOD;
7872 	arqs->sts_rqpkt_reason = CMD_CMPLT;
7873 	arqs->sts_rqpkt_state = STATE_GOT_BUS | STATE_GOT_TARGET |
7874 	    STATE_XFERRED_DATA | STATE_SENT_CMD | STATE_GOT_STATUS;
7875 	arqs->sts_rqpkt_resid = 0;
7876 	sense = &arqs->sts_sensedata;
7877 	bzero(sense, sizeof (struct scsi_extended_sense));
7878 	sata_fixed_sense_data_preset(sense);
7879 	return (sense);
7880 }
7881 
7882 /*
7883  * ATA Pass Through support
7884  * Sets flags indicating that an invalid value was found in some
7885  * field in the command.  It could be something illegal according to
7886  * the SAT-2 spec or it could be a feature that is not (yet?)
7887  * supported.
7888  */
7889 static int
sata_txlt_ata_pass_thru_illegal_cmd(sata_pkt_txlate_t * spx)7890 sata_txlt_ata_pass_thru_illegal_cmd(sata_pkt_txlate_t *spx)
7891 {
7892 	struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
7893 	struct scsi_extended_sense *sense = sata_arq_sense(spx);
7894 
7895 	scsipkt->pkt_reason = CMD_CMPLT;
7896 	*scsipkt->pkt_scbp = STATUS_CHECK;
7897 	scsipkt->pkt_state = STATE_GOT_BUS | STATE_GOT_TARGET |
7898 	    STATE_SENT_CMD | STATE_GOT_STATUS;
7899 
7900 	sense = sata_arq_sense(spx);
7901 	sense->es_key = KEY_ILLEGAL_REQUEST;
7902 	sense->es_add_code = SD_SCSI_ASC_INVALID_FIELD_IN_CDB;
7903 
7904 	if ((scsipkt->pkt_flags & FLAG_NOINTR) == 0 &&
7905 	    scsipkt->pkt_comp != NULL) {
7906 		/* scsi callback required */
7907 		if (servicing_interrupt()) {
7908 			if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
7909 			    (task_func_t *)spx->txlt_scsi_pkt->pkt_comp,
7910 			    (void *)spx->txlt_scsi_pkt, TQ_NOSLEEP) ==
7911 			    TASKQID_INVALID) {
7912 				return (TRAN_BUSY);
7913 			}
7914 		} else if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
7915 		    (task_func_t *)spx->txlt_scsi_pkt->pkt_comp,
7916 		    (void *)spx->txlt_scsi_pkt, TQ_SLEEP) == TASKQID_INVALID) {
7917 			/* Scheduling the callback failed */
7918 			return (TRAN_BUSY);
7919 		}
7920 	}
7921 
7922 	return (TRAN_ACCEPT);
7923 }
7924 
7925 /*
7926  * The UNMAP command considers it not to be an error if the parameter length
7927  * or block descriptor length is 0.  For this case, there is nothing for TRIM
7928  * to do so just complete the command.
7929  */
7930 static int
sata_txlt_unmap_nodata_cmd(sata_pkt_txlate_t * spx)7931 sata_txlt_unmap_nodata_cmd(sata_pkt_txlate_t *spx)
7932 {
7933 	struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
7934 
7935 	scsipkt->pkt_reason = CMD_CMPLT;
7936 	*scsipkt->pkt_scbp = STATUS_GOOD;
7937 	scsipkt->pkt_state = STATE_GOT_BUS | STATE_GOT_TARGET |
7938 	    STATE_SENT_CMD | STATE_GOT_STATUS;
7939 
7940 	if ((scsipkt->pkt_flags & FLAG_NOINTR) == 0 &&
7941 	    scsipkt->pkt_comp != NULL) {
7942 		/* scsi callback required */
7943 		if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
7944 		    (task_func_t *)spx->txlt_scsi_pkt->pkt_comp,
7945 		    (void *)spx->txlt_scsi_pkt, TQ_SLEEP) == TASKQID_INVALID) {
7946 			/* Scheduling the callback failed */
7947 			return (TRAN_BUSY);
7948 		}
7949 	}
7950 
7951 	return (TRAN_ACCEPT);
7952 }
7953 
7954 /*
7955  * Emulated SATA Read/Write command completion for zero-length requests.
7956  * This request always succedes, so in synchronous mode it always returns
7957  * TRAN_ACCEPT, and in non-synchronous mode it may return TRAN_BUSY if the
7958  * callback cannot be scheduled.
7959  */
7960 static int
sata_emul_rw_completion(sata_pkt_txlate_t * spx)7961 sata_emul_rw_completion(sata_pkt_txlate_t *spx)
7962 {
7963 	struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
7964 
7965 	scsipkt->pkt_state = STATE_GOT_BUS | STATE_GOT_TARGET |
7966 	    STATE_SENT_CMD | STATE_GOT_STATUS;
7967 	scsipkt->pkt_reason = CMD_CMPLT;
7968 	*scsipkt->pkt_scbp = STATUS_GOOD;
7969 	if (!(spx->txlt_sata_pkt->satapkt_op_mode & SATA_OPMODE_SYNCH)) {
7970 		/* scsi callback required - have to schedule it */
7971 		if (servicing_interrupt()) {
7972 			if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
7973 			    (task_func_t *)spx->txlt_scsi_pkt->pkt_comp,
7974 			    (void *)spx->txlt_scsi_pkt, TQ_NOSLEEP) ==
7975 			    TASKQID_INVALID) {
7976 				return (TRAN_BUSY);
7977 			}
7978 		} else if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
7979 		    (task_func_t *)spx->txlt_scsi_pkt->pkt_comp,
7980 		    (void *)spx->txlt_scsi_pkt, TQ_SLEEP) == TASKQID_INVALID) {
7981 			/* Scheduling the callback failed */
7982 			return (TRAN_BUSY);
7983 		}
7984 	}
7985 	return (TRAN_ACCEPT);
7986 }
7987 
7988 
7989 /*
7990  * Translate completion status of SATA read/write commands into scsi response.
7991  * pkt completion_reason is checked to determine the completion status.
7992  * Do scsi callback if necessary.
7993  *
7994  * Note: this function may be called also for synchronously executed
7995  * commands.
7996  * This function may be used only if scsi_pkt is non-NULL.
7997  */
7998 static void
sata_txlt_rw_completion(sata_pkt_t * sata_pkt)7999 sata_txlt_rw_completion(sata_pkt_t *sata_pkt)
8000 {
8001 	sata_pkt_txlate_t *spx =
8002 	    (sata_pkt_txlate_t *)sata_pkt->satapkt_framework_private;
8003 	sata_cmd_t *scmd = &sata_pkt->satapkt_cmd;
8004 	struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
8005 	struct scsi_extended_sense *sense;
8006 	uint64_t lba;
8007 	struct buf *bp;
8008 	int rval;
8009 	if (sata_pkt->satapkt_reason == SATA_PKT_COMPLETED) {
8010 		/* Normal completion */
8011 		scsipkt->pkt_state = STATE_GOT_BUS | STATE_GOT_TARGET |
8012 		    STATE_SENT_CMD | STATE_XFERRED_DATA | STATE_GOT_STATUS;
8013 		scsipkt->pkt_reason = CMD_CMPLT;
8014 		*scsipkt->pkt_scbp = STATUS_GOOD;
8015 		if (spx->txlt_tmp_buf != NULL) {
8016 			/* Temporary buffer was used */
8017 			bp = spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp;
8018 			if (bp->b_flags & B_READ) {
8019 				rval = ddi_dma_sync(
8020 				    spx->txlt_buf_dma_handle, 0, 0,
8021 				    DDI_DMA_SYNC_FORCPU);
8022 				ASSERT(rval == DDI_SUCCESS);
8023 				bcopy(spx->txlt_tmp_buf, bp->b_un.b_addr,
8024 				    bp->b_bcount);
8025 			}
8026 		}
8027 	} else {
8028 		/*
8029 		 * Something went wrong - analyze return
8030 		 */
8031 		scsipkt->pkt_state = STATE_GOT_BUS | STATE_GOT_TARGET |
8032 		    STATE_SENT_CMD | STATE_GOT_STATUS;
8033 		scsipkt->pkt_reason = CMD_INCOMPLETE;
8034 		*scsipkt->pkt_scbp = STATUS_CHECK;
8035 		sense = sata_arq_sense(spx);
8036 		ASSERT(sense != NULL);
8037 
8038 		/*
8039 		 * SATA_PKT_DEV_ERROR is the only case where we may be able to
8040 		 * extract from device registers the failing LBA.
8041 		 */
8042 		if (sata_pkt->satapkt_reason == SATA_PKT_DEV_ERROR) {
8043 			if ((scmd->satacmd_addr_type == ATA_ADDR_LBA48) &&
8044 			    (scmd->satacmd_lba_mid_msb != 0 ||
8045 			    scmd->satacmd_lba_high_msb != 0)) {
8046 				/*
8047 				 * We have problem reporting this cmd LBA
8048 				 * in fixed sense data format, because of
8049 				 * the size of the scsi LBA fields.
8050 				 */
8051 				sense->es_valid = 0;
8052 			} else {
8053 				sata_extract_error_lba(spx, &lba);
8054 				sense->es_info_1 = (lba & 0xFF000000) >> 24;
8055 				sense->es_info_2 = (lba & 0xFF0000) >> 16;
8056 				sense->es_info_3 = (lba & 0xFF00) >> 8;
8057 				sense->es_info_4 = lba & 0xFF;
8058 			}
8059 		} else {
8060 			/* Invalid extended sense info */
8061 			sense->es_valid = 0;
8062 		}
8063 
8064 		switch (sata_pkt->satapkt_reason) {
8065 		case SATA_PKT_PORT_ERROR:
8066 			/* We may want to handle DEV GONE state as well */
8067 			/*
8068 			 * We have no device data. Assume no data transfered.
8069 			 */
8070 			sense->es_key = KEY_HARDWARE_ERROR;
8071 			break;
8072 
8073 		case SATA_PKT_DEV_ERROR:
8074 			if (sata_pkt->satapkt_cmd.satacmd_status_reg &
8075 			    SATA_STATUS_ERR) {
8076 				/*
8077 				 * determine dev error reason from error
8078 				 * reg content
8079 				 */
8080 				sata_decode_device_error(spx, sense);
8081 				if (sense->es_key == KEY_MEDIUM_ERROR) {
8082 					switch (scmd->satacmd_cmd_reg) {
8083 					case SATAC_READ_DMA:
8084 					case SATAC_READ_DMA_EXT:
8085 					case SATAC_READ_DMA_QUEUED:
8086 					case SATAC_READ_DMA_QUEUED_EXT:
8087 					case SATAC_READ_FPDMA_QUEUED:
8088 						/* Unrecovered read error */
8089 						sense->es_add_code =
8090 						    SD_SCSI_ASC_UNREC_READ_ERR;
8091 						break;
8092 					case SATAC_WRITE_DMA:
8093 					case SATAC_WRITE_DMA_EXT:
8094 					case SATAC_WRITE_DMA_QUEUED:
8095 					case SATAC_WRITE_DMA_QUEUED_EXT:
8096 					case SATAC_WRITE_FPDMA_QUEUED:
8097 						/* Write error */
8098 						sense->es_add_code =
8099 						    SD_SCSI_ASC_WRITE_ERR;
8100 						break;
8101 					default:
8102 						/* Internal error */
8103 						SATA_LOG_D((
8104 						    spx->txlt_sata_hba_inst,
8105 						    CE_WARN,
8106 						    "sata_txlt_rw_completion :"
8107 						    "internal error - invalid "
8108 						    "command 0x%2x",
8109 						    scmd->satacmd_cmd_reg));
8110 						break;
8111 					}
8112 				}
8113 				break;
8114 			}
8115 			/* No extended sense key - no info available */
8116 			scsipkt->pkt_reason = CMD_INCOMPLETE;
8117 			break;
8118 
8119 		case SATA_PKT_TIMEOUT:
8120 			scsipkt->pkt_reason = CMD_TIMEOUT;
8121 			scsipkt->pkt_statistics |=
8122 			    STAT_TIMEOUT | STAT_DEV_RESET;
8123 			sense->es_key = KEY_ABORTED_COMMAND;
8124 			break;
8125 
8126 		case SATA_PKT_ABORTED:
8127 			scsipkt->pkt_reason = CMD_ABORTED;
8128 			scsipkt->pkt_statistics |= STAT_ABORTED;
8129 			sense->es_key = KEY_ABORTED_COMMAND;
8130 			break;
8131 
8132 		case SATA_PKT_RESET:
8133 			scsipkt->pkt_reason = CMD_RESET;
8134 			scsipkt->pkt_statistics |= STAT_DEV_RESET;
8135 			sense->es_key = KEY_ABORTED_COMMAND;
8136 			break;
8137 
8138 		default:
8139 			SATA_LOG_D((spx->txlt_sata_hba_inst, CE_WARN,
8140 			    "sata_txlt_rw_completion: "
8141 			    "invalid packet completion reason"));
8142 			scsipkt->pkt_reason = CMD_TRAN_ERR;
8143 			break;
8144 		}
8145 	}
8146 	SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
8147 	    "Scsi_pkt completion reason %x\n", scsipkt->pkt_reason);
8148 
8149 	if ((scsipkt->pkt_flags & FLAG_NOINTR) == 0)
8150 		/* scsi callback required */
8151 		scsi_hba_pkt_comp(scsipkt);
8152 }
8153 
8154 
8155 /*
8156  * Translate completion status of non-data commands (i.e. commands returning
8157  * no data).
8158  * pkt completion_reason is checked to determine the completion status.
8159  * Do scsi callback if necessary (FLAG_NOINTR == 0)
8160  *
8161  * Note: this function may be called also for synchronously executed
8162  * commands.
8163  * This function may be used only if scsi_pkt is non-NULL.
8164  */
8165 
8166 static	void
sata_txlt_nodata_cmd_completion(sata_pkt_t * sata_pkt)8167 sata_txlt_nodata_cmd_completion(sata_pkt_t *sata_pkt)
8168 {
8169 	sata_pkt_txlate_t *spx =
8170 	    (sata_pkt_txlate_t *)sata_pkt->satapkt_framework_private;
8171 	struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
8172 
8173 	sata_set_arq_data(sata_pkt);
8174 
8175 	if ((scsipkt->pkt_flags & FLAG_NOINTR) == 0)
8176 		/* scsi callback required */
8177 		scsi_hba_pkt_comp(scsipkt);
8178 }
8179 
8180 /*
8181  * Completion handler for ATA Pass Through command
8182  */
8183 static void
sata_txlt_apt_completion(sata_pkt_t * sata_pkt)8184 sata_txlt_apt_completion(sata_pkt_t *sata_pkt)
8185 {
8186 	sata_pkt_txlate_t *spx =
8187 	    (sata_pkt_txlate_t *)sata_pkt->satapkt_framework_private;
8188 	sata_cmd_t *scmd = &sata_pkt->satapkt_cmd;
8189 	struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
8190 	struct buf *bp;
8191 	uint8_t sense_key = 0, addl_sense_code = 0, addl_sense_qual = 0;
8192 
8193 	if (sata_pkt->satapkt_reason == SATA_PKT_COMPLETED) {
8194 		/* Normal completion */
8195 		scsipkt->pkt_state = STATE_GOT_BUS | STATE_GOT_TARGET |
8196 		    STATE_SENT_CMD | STATE_XFERRED_DATA | STATE_GOT_STATUS;
8197 		scsipkt->pkt_reason = CMD_CMPLT;
8198 		*scsipkt->pkt_scbp = STATUS_GOOD;
8199 
8200 		/*
8201 		 * If the command has CK_COND set
8202 		 */
8203 		if (scsipkt->pkt_cdbp[2] & SATL_APT_BM_CK_COND) {
8204 			*scsipkt->pkt_scbp = STATUS_CHECK;
8205 			sata_fill_ata_return_desc(sata_pkt,
8206 			    KEY_RECOVERABLE_ERROR,
8207 			    SD_SCSI_ASC_APT_INFO_AVAIL, 0x1d);
8208 		}
8209 
8210 		if (spx->txlt_tmp_buf != NULL) {
8211 			/* Temporary buffer was used */
8212 			bp = spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp;
8213 			if (bp->b_flags & B_READ) {
8214 				bcopy(spx->txlt_tmp_buf, bp->b_un.b_addr,
8215 				    bp->b_bcount);
8216 			}
8217 		}
8218 	} else {
8219 		scsipkt->pkt_state = STATE_GOT_BUS | STATE_GOT_TARGET |
8220 		    STATE_SENT_CMD | STATE_GOT_STATUS;
8221 		scsipkt->pkt_reason = CMD_INCOMPLETE;
8222 		*scsipkt->pkt_scbp = STATUS_CHECK;
8223 
8224 		/*
8225 		 * If DF or ERR was set, the HBA should have copied out the
8226 		 * status and error registers to the satacmd structure.
8227 		 */
8228 		if (scmd->satacmd_status_reg & SATA_STATUS_DF) {
8229 			sense_key = KEY_HARDWARE_ERROR;
8230 			addl_sense_code = SD_SCSI_ASC_INTERNAL_TARGET_FAILURE;
8231 			addl_sense_qual = 0;
8232 		} else if (scmd->satacmd_status_reg & SATA_STATUS_ERR) {
8233 			if (scmd->satacmd_error_reg & SATA_ERROR_NM) {
8234 				sense_key = KEY_NOT_READY;
8235 				addl_sense_code =
8236 				    SD_SCSI_ASC_MEDIUM_NOT_PRESENT;
8237 				addl_sense_qual = 0;
8238 			} else if (scmd->satacmd_error_reg & SATA_ERROR_UNC) {
8239 				sense_key = KEY_MEDIUM_ERROR;
8240 				addl_sense_code = SD_SCSI_ASC_UNREC_READ_ERR;
8241 				addl_sense_qual = 0;
8242 			} else if (scmd->satacmd_error_reg & SATA_ERROR_ILI) {
8243 				sense_key = KEY_DATA_PROTECT;
8244 				addl_sense_code = SD_SCSI_ASC_WRITE_PROTECTED;
8245 				addl_sense_qual = 0;
8246 			} else if (scmd->satacmd_error_reg & SATA_ERROR_IDNF) {
8247 				sense_key = KEY_ILLEGAL_REQUEST;
8248 				addl_sense_code = SD_SCSI_ASC_LBA_OUT_OF_RANGE;
8249 				addl_sense_qual = 0;
8250 			} else if (scmd->satacmd_error_reg & SATA_ERROR_ABORT) {
8251 				sense_key = KEY_ABORTED_COMMAND;
8252 				addl_sense_code = SD_SCSI_ASC_NO_ADD_SENSE;
8253 				addl_sense_qual = 0;
8254 			} else if (scmd->satacmd_error_reg & SATA_ERROR_MC) {
8255 				sense_key = KEY_UNIT_ATTENTION;
8256 				addl_sense_code =
8257 				    SD_SCSI_ASC_MEDIUM_MAY_HAVE_CHANGED;
8258 				addl_sense_qual = 0;
8259 			} else if (scmd->satacmd_error_reg & SATA_ERROR_MCR) {
8260 				sense_key = KEY_UNIT_ATTENTION;
8261 				addl_sense_code = SD_SCSI_ASC_OP_MEDIUM_REM_REQ;
8262 				addl_sense_qual = 0;
8263 			} else if (scmd->satacmd_error_reg & SATA_ERROR_ICRC) {
8264 				sense_key = KEY_ABORTED_COMMAND;
8265 				addl_sense_code =
8266 				    SD_SCSI_ASC_INFO_UNIT_IUCRC_ERR;
8267 				addl_sense_qual = 0;
8268 			}
8269 		}
8270 
8271 		sata_fill_ata_return_desc(sata_pkt, sense_key, addl_sense_code,
8272 		    addl_sense_qual);
8273 	}
8274 
8275 	if ((scsipkt->pkt_flags & FLAG_NOINTR) == 0)
8276 		/* scsi callback required */
8277 		scsi_hba_pkt_comp(scsipkt);
8278 }
8279 
8280 /*
8281  * Completion handler for unmap translation command
8282  */
8283 static void
sata_txlt_unmap_completion(sata_pkt_t * sata_pkt)8284 sata_txlt_unmap_completion(sata_pkt_t *sata_pkt)
8285 {
8286 	sata_pkt_txlate_t *spx =
8287 	    (sata_pkt_txlate_t *)sata_pkt->satapkt_framework_private;
8288 	sata_cmd_t *scmd = &sata_pkt->satapkt_cmd;
8289 	struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
8290 	struct buf *bp;
8291 	uint8_t sense_key = 0, addl_sense_code = 0, addl_sense_qual = 0;
8292 
8293 	if (sata_pkt->satapkt_reason == SATA_PKT_COMPLETED) {
8294 		/* Normal completion */
8295 		scsipkt->pkt_state = STATE_GOT_BUS | STATE_GOT_TARGET |
8296 		    STATE_SENT_CMD | STATE_XFERRED_DATA | STATE_GOT_STATUS;
8297 		scsipkt->pkt_reason = CMD_CMPLT;
8298 		*scsipkt->pkt_scbp = STATUS_GOOD;
8299 
8300 		if (spx->txlt_tmp_buf != NULL) {
8301 			/* Temporary buffer was used */
8302 			bp = spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp;
8303 			if (bp->b_flags & B_READ) {
8304 				bcopy(spx->txlt_tmp_buf, bp->b_un.b_addr,
8305 				    bp->b_bcount);
8306 			}
8307 		}
8308 	} else {
8309 		scsipkt->pkt_state = STATE_GOT_BUS | STATE_GOT_TARGET |
8310 		    STATE_SENT_CMD | STATE_GOT_STATUS;
8311 		scsipkt->pkt_reason = CMD_INCOMPLETE;
8312 		*scsipkt->pkt_scbp = STATUS_CHECK;
8313 
8314 		/*
8315 		 * If DF or ERR was set, the HBA should have copied out the
8316 		 * status and error registers to the satacmd structure.
8317 		 */
8318 		if (scmd->satacmd_status_reg & SATA_STATUS_DF) {
8319 			sense_key = KEY_HARDWARE_ERROR;
8320 			addl_sense_code = SD_SCSI_ASC_INTERNAL_TARGET_FAILURE;
8321 			addl_sense_qual = 0;
8322 		} else if (scmd->satacmd_status_reg & SATA_STATUS_ERR) {
8323 			if (scmd->satacmd_error_reg & SATA_ERROR_NM) {
8324 				sense_key = KEY_NOT_READY;
8325 				addl_sense_code =
8326 				    SD_SCSI_ASC_MEDIUM_NOT_PRESENT;
8327 				addl_sense_qual = 0;
8328 			} else if (scmd->satacmd_error_reg & SATA_ERROR_UNC) {
8329 				sense_key = KEY_MEDIUM_ERROR;
8330 				addl_sense_code = SD_SCSI_ASC_WRITE_ERR;
8331 				addl_sense_qual = 0;
8332 			} else if (scmd->satacmd_error_reg & SATA_ERROR_ILI) {
8333 				sense_key = KEY_DATA_PROTECT;
8334 				addl_sense_code = SD_SCSI_ASC_WRITE_PROTECTED;
8335 				addl_sense_qual = 0;
8336 			} else if (scmd->satacmd_error_reg & SATA_ERROR_IDNF) {
8337 				sense_key = KEY_ILLEGAL_REQUEST;
8338 				addl_sense_code = SD_SCSI_ASC_LBA_OUT_OF_RANGE;
8339 				addl_sense_qual = 0;
8340 			} else if (scmd->satacmd_error_reg & SATA_ERROR_ABORT) {
8341 				sense_key = KEY_ABORTED_COMMAND;
8342 				addl_sense_code = SD_SCSI_ASC_NO_ADD_SENSE;
8343 				addl_sense_qual = 0;
8344 			} else if (scmd->satacmd_error_reg & SATA_ERROR_MC) {
8345 				sense_key = KEY_UNIT_ATTENTION;
8346 				addl_sense_code =
8347 				    SD_SCSI_ASC_MEDIUM_MAY_HAVE_CHANGED;
8348 				addl_sense_qual = 0;
8349 			} else if (scmd->satacmd_error_reg & SATA_ERROR_MCR) {
8350 				sense_key = KEY_UNIT_ATTENTION;
8351 				addl_sense_code = SD_SCSI_ASC_OP_MEDIUM_REM_REQ;
8352 				addl_sense_qual = 0;
8353 			} else if (scmd->satacmd_error_reg & SATA_ERROR_ICRC) {
8354 				sense_key = KEY_ABORTED_COMMAND;
8355 				addl_sense_code =
8356 				    SD_SCSI_ASC_INFO_UNIT_IUCRC_ERR;
8357 				addl_sense_qual = 0;
8358 			}
8359 		}
8360 
8361 		sata_fill_ata_return_desc(sata_pkt, sense_key, addl_sense_code,
8362 		    addl_sense_qual);
8363 	}
8364 
8365 	sata_free_local_buffer(spx);
8366 
8367 	if ((scsipkt->pkt_flags & FLAG_NOINTR) == 0)
8368 		/* scsi callback required */
8369 		scsi_hba_pkt_comp(scsipkt);
8370 }
8371 
8372 /*
8373  *
8374  */
8375 static void
sata_fill_ata_return_desc(sata_pkt_t * sata_pkt,uint8_t sense_key,uint8_t addl_sense_code,uint8_t addl_sense_qual)8376 sata_fill_ata_return_desc(sata_pkt_t *sata_pkt, uint8_t sense_key,
8377     uint8_t addl_sense_code, uint8_t addl_sense_qual)
8378 {
8379 	sata_pkt_txlate_t *spx =
8380 	    (sata_pkt_txlate_t *)sata_pkt->satapkt_framework_private;
8381 	sata_cmd_t *scmd = &sata_pkt->satapkt_cmd;
8382 	struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
8383 	struct sata_apt_sense_data *apt_sd =
8384 	    (struct sata_apt_sense_data *)scsipkt->pkt_scbp;
8385 	struct scsi_descr_sense_hdr *sds = &(apt_sd->apt_sd_hdr);
8386 	struct scsi_ata_status_ret_sense_descr *ata_ret_desc =
8387 	    &(apt_sd->apt_sd_sense);
8388 	int extend = 0;
8389 
8390 	if ((scsipkt->pkt_cdbp[0] == SPC3_CMD_ATA_COMMAND_PASS_THROUGH16) &&
8391 	    (scsipkt->pkt_cdbp[2] & SATL_APT_BM_EXTEND))
8392 		extend = 1;
8393 
8394 	scsipkt->pkt_state |= STATE_ARQ_DONE;
8395 
8396 	/* update the residual count */
8397 	*(uchar_t *)&apt_sd->apt_status = STATUS_CHECK;
8398 	*(uchar_t *)&apt_sd->apt_rqpkt_status = STATUS_GOOD;
8399 	apt_sd->apt_rqpkt_reason = CMD_CMPLT;
8400 	apt_sd->apt_rqpkt_state = STATE_GOT_BUS | STATE_GOT_TARGET |
8401 	    STATE_XFERRED_DATA | STATE_SENT_CMD | STATE_GOT_STATUS;
8402 	apt_sd->apt_rqpkt_resid = scsipkt->pkt_scblen -
8403 	    sizeof (struct sata_apt_sense_data);
8404 
8405 	/*
8406 	 * Fill in the Descriptor sense header
8407 	 */
8408 	bzero(sds, sizeof (struct scsi_descr_sense_hdr));
8409 	sds->ds_code = CODE_FMT_DESCR_CURRENT;
8410 	sds->ds_class = CLASS_EXTENDED_SENSE;
8411 	sds->ds_key = sense_key & 0xf;
8412 	sds->ds_add_code = addl_sense_code;
8413 	sds->ds_qual_code = addl_sense_qual;
8414 	sds->ds_addl_sense_length =
8415 	    sizeof (struct scsi_ata_status_ret_sense_descr);
8416 
8417 	/*
8418 	 * Fill in the ATA Return descriptor sense data
8419 	 */
8420 	bzero(ata_ret_desc, sizeof (struct scsi_ata_status_ret_sense_descr));
8421 	ata_ret_desc->ars_descr_type = DESCR_ATA_STATUS_RETURN;
8422 	ata_ret_desc->ars_addl_length = 0xc;
8423 	ata_ret_desc->ars_error = scmd->satacmd_error_reg;
8424 	ata_ret_desc->ars_sec_count_lsb = scmd->satacmd_sec_count_lsb;
8425 	ata_ret_desc->ars_lba_low_lsb = scmd->satacmd_lba_low_lsb;
8426 	ata_ret_desc->ars_lba_mid_lsb = scmd->satacmd_lba_mid_lsb;
8427 	ata_ret_desc->ars_lba_high_lsb = scmd->satacmd_lba_high_lsb;
8428 	ata_ret_desc->ars_device = scmd->satacmd_device_reg;
8429 	ata_ret_desc->ars_status = scmd->satacmd_status_reg;
8430 
8431 	if (extend == 1) {
8432 		ata_ret_desc->ars_extend = 1;
8433 		ata_ret_desc->ars_sec_count_msb = scmd->satacmd_sec_count_msb;
8434 		ata_ret_desc->ars_lba_low_msb = scmd->satacmd_lba_low_msb;
8435 		ata_ret_desc->ars_lba_mid_msb = scmd->satacmd_lba_mid_msb;
8436 		ata_ret_desc->ars_lba_high_msb = scmd->satacmd_lba_high_msb;
8437 	} else {
8438 		ata_ret_desc->ars_extend = 0;
8439 		ata_ret_desc->ars_sec_count_msb = 0;
8440 		ata_ret_desc->ars_lba_low_msb = 0;
8441 		ata_ret_desc->ars_lba_mid_msb = 0;
8442 		ata_ret_desc->ars_lba_high_msb = 0;
8443 	}
8444 }
8445 
8446 static	void
sata_set_arq_data(sata_pkt_t * sata_pkt)8447 sata_set_arq_data(sata_pkt_t *sata_pkt)
8448 {
8449 	sata_pkt_txlate_t *spx =
8450 	    (sata_pkt_txlate_t *)sata_pkt->satapkt_framework_private;
8451 	struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
8452 	struct scsi_extended_sense *sense;
8453 
8454 	scsipkt->pkt_state = STATE_GOT_BUS | STATE_GOT_TARGET |
8455 	    STATE_SENT_CMD | STATE_GOT_STATUS;
8456 	if (sata_pkt->satapkt_reason == SATA_PKT_COMPLETED) {
8457 		/* Normal completion */
8458 		scsipkt->pkt_reason = CMD_CMPLT;
8459 		*scsipkt->pkt_scbp = STATUS_GOOD;
8460 	} else {
8461 		/* Something went wrong */
8462 		scsipkt->pkt_reason = CMD_INCOMPLETE;
8463 		*scsipkt->pkt_scbp = STATUS_CHECK;
8464 		sense = sata_arq_sense(spx);
8465 		switch (sata_pkt->satapkt_reason) {
8466 		case SATA_PKT_PORT_ERROR:
8467 			/*
8468 			 * We have no device data. Assume no data transfered.
8469 			 */
8470 			sense->es_key = KEY_HARDWARE_ERROR;
8471 			break;
8472 
8473 		case SATA_PKT_DEV_ERROR:
8474 			if (sata_pkt->satapkt_cmd.satacmd_status_reg &
8475 			    SATA_STATUS_ERR) {
8476 				/*
8477 				 * determine dev error reason from error
8478 				 * reg content
8479 				 */
8480 				sata_decode_device_error(spx, sense);
8481 				break;
8482 			}
8483 			/* No extended sense key - no info available */
8484 			break;
8485 
8486 		case SATA_PKT_TIMEOUT:
8487 			scsipkt->pkt_reason = CMD_TIMEOUT;
8488 			scsipkt->pkt_statistics |=
8489 			    STAT_TIMEOUT | STAT_DEV_RESET;
8490 			/* No extended sense key ? */
8491 			break;
8492 
8493 		case SATA_PKT_ABORTED:
8494 			scsipkt->pkt_reason = CMD_ABORTED;
8495 			scsipkt->pkt_statistics |= STAT_ABORTED;
8496 			/* No extended sense key ? */
8497 			break;
8498 
8499 		case SATA_PKT_RESET:
8500 			/* pkt aborted by an explicit reset from a host */
8501 			scsipkt->pkt_reason = CMD_RESET;
8502 			scsipkt->pkt_statistics |= STAT_DEV_RESET;
8503 			break;
8504 
8505 		default:
8506 			SATA_LOG_D((spx->txlt_sata_hba_inst, CE_WARN,
8507 			    "sata_txlt_nodata_cmd_completion: "
8508 			    "invalid packet completion reason %d",
8509 			    sata_pkt->satapkt_reason));
8510 			scsipkt->pkt_reason = CMD_TRAN_ERR;
8511 			break;
8512 		}
8513 
8514 	}
8515 	SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
8516 	    "Scsi_pkt completion reason %x\n", scsipkt->pkt_reason);
8517 }
8518 
8519 
8520 /*
8521  * Build Mode sense R/W recovery page
8522  * NOT IMPLEMENTED
8523  */
8524 
8525 static int
sata_build_msense_page_1(sata_drive_info_t * sdinfo,int pcntrl,uint8_t * buf)8526 sata_build_msense_page_1(sata_drive_info_t *sdinfo, int pcntrl, uint8_t *buf)
8527 {
8528 #ifndef __lock_lint
8529 	_NOTE(ARGUNUSED(sdinfo))
8530 	_NOTE(ARGUNUSED(pcntrl))
8531 	_NOTE(ARGUNUSED(buf))
8532 #endif
8533 	return (0);
8534 }
8535 
8536 /*
8537  * Build Mode sense caching page  -  scsi-3 implementation.
8538  * Page length distinguishes previous format from scsi-3 format.
8539  * buf must have space for 0x12 bytes.
8540  * Only DRA (disable read ahead ) and WCE (write cache enable) are changeable.
8541  *
8542  */
8543 static int
sata_build_msense_page_8(sata_drive_info_t * sdinfo,int pcntrl,uint8_t * buf)8544 sata_build_msense_page_8(sata_drive_info_t *sdinfo, int pcntrl, uint8_t *buf)
8545 {
8546 	struct mode_cache_scsi3 *page = (struct mode_cache_scsi3 *)buf;
8547 	sata_id_t *sata_id = &sdinfo->satadrv_id;
8548 
8549 	/*
8550 	 * Most of the fields are set to 0, being not supported and/or disabled
8551 	 */
8552 	bzero(buf, PAGELENGTH_DAD_MODE_CACHE_SCSI3);
8553 
8554 	/* Saved paramters not supported */
8555 	if (pcntrl == 3)
8556 		return (0);
8557 	if (pcntrl == 0 || pcntrl == 2) {
8558 		/*
8559 		 * For now treat current and default parameters as same
8560 		 * That may have to change, if target driver will complain
8561 		 */
8562 		page->mode_page.code = MODEPAGE_CACHING;	/* PS = 0 */
8563 		page->mode_page.length = PAGELENGTH_DAD_MODE_CACHE_SCSI3;
8564 
8565 		if (SATA_READ_AHEAD_SUPPORTED(*sata_id) &&
8566 		    !SATA_READ_AHEAD_ENABLED(*sata_id)) {
8567 			page->dra = 1;		/* Read Ahead disabled */
8568 			page->rcd = 1;		/* Read Cache disabled */
8569 		}
8570 		if (SATA_WRITE_CACHE_SUPPORTED(*sata_id) &&
8571 		    SATA_WRITE_CACHE_ENABLED(*sata_id))
8572 			page->wce = 1;		/* Write Cache enabled */
8573 	} else {
8574 		/* Changeable parameters */
8575 		page->mode_page.code = MODEPAGE_CACHING;
8576 		page->mode_page.length = PAGELENGTH_DAD_MODE_CACHE_SCSI3;
8577 		if (SATA_READ_AHEAD_SUPPORTED(*sata_id)) {
8578 			page->dra = 1;
8579 			page->rcd = 1;
8580 		}
8581 		if (SATA_WRITE_CACHE_SUPPORTED(*sata_id))
8582 			page->wce = 1;
8583 	}
8584 	return (PAGELENGTH_DAD_MODE_CACHE_SCSI3 +
8585 	    sizeof (struct mode_page));
8586 }
8587 
8588 /*
8589  * Build Mode sense exception cntrl page
8590  */
8591 static int
sata_build_msense_page_1c(sata_drive_info_t * sdinfo,int pcntrl,uint8_t * buf)8592 sata_build_msense_page_1c(sata_drive_info_t *sdinfo, int pcntrl, uint8_t *buf)
8593 {
8594 	struct mode_info_excpt_page *page = (struct mode_info_excpt_page *)buf;
8595 	sata_id_t *sata_id = &sdinfo->satadrv_id;
8596 
8597 	/*
8598 	 * Most of the fields are set to 0, being not supported and/or disabled
8599 	 */
8600 	bzero(buf, PAGELENGTH_INFO_EXCPT);
8601 
8602 	page->mode_page.code = MODEPAGE_INFO_EXCPT;
8603 	page->mode_page.length = PAGELENGTH_INFO_EXCPT;
8604 
8605 	/* Indicate that this is page is saveable */
8606 	page->mode_page.ps = 1;
8607 
8608 	/*
8609 	 * We will return the same data for default, current and saved page.
8610 	 * The only changeable bit is dexcpt and that bit is required
8611 	 * by the ATA specification to be preserved across power cycles.
8612 	 */
8613 	if (pcntrl != 1) {
8614 		page->dexcpt = !(sata_id->ai_features85 & SATA_SMART_SUPPORTED);
8615 		page->mrie = MRIE_ONLY_ON_REQUEST;
8616 	}
8617 	else
8618 		page->dexcpt = 1;	/* Only changeable parameter */
8619 
8620 	return (PAGELENGTH_INFO_EXCPT + sizeof (struct mode_page));
8621 }
8622 
8623 
8624 static int
sata_build_msense_page_30(sata_drive_info_t * sdinfo,int pcntrl,uint8_t * buf)8625 sata_build_msense_page_30(sata_drive_info_t *sdinfo, int pcntrl, uint8_t *buf)
8626 {
8627 	struct mode_acoustic_management *page =
8628 	    (struct mode_acoustic_management *)buf;
8629 	sata_id_t *sata_id = &sdinfo->satadrv_id;
8630 
8631 	/*
8632 	 * Most of the fields are set to 0, being not supported and/or disabled
8633 	 */
8634 	bzero(buf, PAGELENGTH_DAD_MODE_ACOUSTIC_MANAGEMENT);
8635 
8636 	switch (pcntrl) {
8637 	case P_CNTRL_DEFAULT:
8638 		/*  default paramters not supported */
8639 		return (0);
8640 
8641 	case P_CNTRL_CURRENT:
8642 	case P_CNTRL_SAVED:
8643 		/* Saved and current are supported and are identical */
8644 		page->mode_page.code = MODEPAGE_ACOUSTIC_MANAG;
8645 		page->mode_page.length =
8646 		    PAGELENGTH_DAD_MODE_ACOUSTIC_MANAGEMENT;
8647 		page->mode_page.ps = 1;
8648 
8649 		/* Word 83 indicates if feature is supported */
8650 		/* If feature is not supported */
8651 		if (!(sata_id->ai_cmdset83 & SATA_ACOUSTIC_MGMT)) {
8652 			page->acoustic_manag_enable =
8653 			    ACOUSTIC_DISABLED;
8654 		} else {
8655 			page->acoustic_manag_enable =
8656 			    ((sata_id->ai_features86 & SATA_ACOUSTIC_MGMT)
8657 			    != 0);
8658 			/* Word 94 inidicates the value */
8659 #ifdef	_LITTLE_ENDIAN
8660 			page->acoustic_manag_level =
8661 			    (uchar_t)sata_id->ai_acoustic;
8662 			page->vendor_recommended_value =
8663 			    sata_id->ai_acoustic >> 8;
8664 #else
8665 			page->acoustic_manag_level =
8666 			    sata_id->ai_acoustic >> 8;
8667 			page->vendor_recommended_value =
8668 			    (uchar_t)sata_id->ai_acoustic;
8669 #endif
8670 		}
8671 		break;
8672 
8673 	case P_CNTRL_CHANGEABLE:
8674 		page->mode_page.code = MODEPAGE_ACOUSTIC_MANAG;
8675 		page->mode_page.length =
8676 		    PAGELENGTH_DAD_MODE_ACOUSTIC_MANAGEMENT;
8677 		page->mode_page.ps = 1;
8678 
8679 		/* Word 83 indicates if the feature is supported */
8680 		if (sata_id->ai_cmdset83 & SATA_ACOUSTIC_MGMT) {
8681 			page->acoustic_manag_enable =
8682 			    ACOUSTIC_ENABLED;
8683 			page->acoustic_manag_level = 0xff;
8684 		}
8685 		break;
8686 	}
8687 	return (PAGELENGTH_DAD_MODE_ACOUSTIC_MANAGEMENT +
8688 	    sizeof (struct mode_page));
8689 }
8690 
8691 
8692 /*
8693  * Build Mode sense power condition page.
8694  */
8695 static int
sata_build_msense_page_1a(sata_drive_info_t * sdinfo,int pcntrl,uint8_t * buf)8696 sata_build_msense_page_1a(sata_drive_info_t *sdinfo, int pcntrl, uint8_t *buf)
8697 {
8698 	struct mode_info_power_cond *page = (struct mode_info_power_cond *)buf;
8699 	sata_id_t *sata_id = &sdinfo->satadrv_id;
8700 
8701 	/*
8702 	 * Most of the fields are set to 0, being not supported and/or disabled
8703 	 * power condition page length was 0x0a
8704 	 */
8705 	bzero(buf, sizeof (struct mode_info_power_cond));
8706 
8707 	if (pcntrl == P_CNTRL_DEFAULT) {
8708 		/*  default paramters not supported */
8709 		return (0);
8710 	}
8711 
8712 	page->mode_page.code = MODEPAGE_POWER_COND;
8713 	page->mode_page.length = sizeof (struct mode_info_power_cond);
8714 
8715 	if (sata_id->ai_cap & SATA_STANDBYTIMER) {
8716 		page->standby = 1;
8717 		bcopy(sdinfo->satadrv_standby_timer, page->standby_cond_timer,
8718 		    sizeof (uchar_t) * 4);
8719 	}
8720 
8721 	return (sizeof (struct mode_info_power_cond));
8722 }
8723 
8724 /*
8725  * Process mode select caching page 8 (scsi3 format only).
8726  * Read Ahead (same as read cache) and Write Cache may be turned on and off
8727  * if these features are supported by the device. If these features are not
8728  * supported, the command will be terminated with STATUS_CHECK.
8729  * This function fails only if the SET FEATURE command sent to
8730  * the device fails. The page format is not verified, assuming that the
8731  * target driver operates correctly - if parameters length is too short,
8732  * we just drop the page.
8733  * Two command may be sent if both Read Cache/Read Ahead and Write Cache
8734  * setting have to be changed.
8735  * SET FEATURE command is executed synchronously, i.e. we wait here until
8736  * it is completed, regardless of the scsi pkt directives.
8737  *
8738  * Note: Mode Select Caching page RCD and DRA bits are tied together, i.e.
8739  * changing DRA will change RCD.
8740  *
8741  * More than one SATA command may be executed to perform operations specified
8742  * by mode select pages. The first error terminates further execution.
8743  * Operations performed successully are not backed-up in such case.
8744  *
8745  * Return SATA_SUCCESS if operation succeeded, SATA_FAILURE otherwise.
8746  * If operation resulted in changing device setup, dmod flag should be set to
8747  * one (1). If parameters were not changed, dmod flag should be set to 0.
8748  * Upon return, if operation required sending command to the device, the rval
8749  * should be set to the value returned by sata_hba_start. If operation
8750  * did not require device access, rval should be set to TRAN_ACCEPT.
8751  * The pagelen should be set to the length of the page.
8752  *
8753  * This function has to be called with a port mutex held.
8754  *
8755  * Returns SATA_SUCCESS if operation was successful, SATA_FAILURE otherwise.
8756  */
8757 int
sata_mode_select_page_8(sata_pkt_txlate_t * spx,struct mode_cache_scsi3 * page,int parmlen,int * pagelen,int * rval,int * dmod)8758 sata_mode_select_page_8(sata_pkt_txlate_t *spx, struct mode_cache_scsi3 *page,
8759     int parmlen, int *pagelen, int *rval, int *dmod)
8760 {
8761 	struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
8762 	sata_drive_info_t *sdinfo;
8763 	sata_cmd_t *scmd = &spx->txlt_sata_pkt->satapkt_cmd;
8764 	sata_id_t *sata_id;
8765 	struct scsi_extended_sense *sense;
8766 	int wce, dra;	/* Current settings */
8767 
8768 	sdinfo = sata_get_device_info(spx->txlt_sata_hba_inst,
8769 	    &spx->txlt_sata_pkt->satapkt_device);
8770 	sata_id = &sdinfo->satadrv_id;
8771 	*dmod = 0;
8772 
8773 	/* Verify parameters length. If too short, drop it */
8774 	if ((PAGELENGTH_DAD_MODE_CACHE_SCSI3 +
8775 	    sizeof (struct mode_page)) > parmlen) {
8776 		*scsipkt->pkt_scbp = STATUS_CHECK;
8777 		sense = sata_arq_sense(spx);
8778 		sense->es_key = KEY_ILLEGAL_REQUEST;
8779 		sense->es_add_code = SD_SCSI_ASC_INVALID_FIELD_IN_PARAMS_LIST;
8780 		*pagelen = parmlen;
8781 		*rval = TRAN_ACCEPT;
8782 		return (SATA_FAILURE);
8783 	}
8784 
8785 	*pagelen = PAGELENGTH_DAD_MODE_CACHE_SCSI3 + sizeof (struct mode_page);
8786 
8787 	/* Current setting of Read Ahead (and Read Cache) */
8788 	if (SATA_READ_AHEAD_ENABLED(*sata_id))
8789 		dra = 0;	/* 0 == not disabled */
8790 	else
8791 		dra = 1;
8792 	/* Current setting of Write Cache */
8793 	if (SATA_WRITE_CACHE_ENABLED(*sata_id))
8794 		wce = 1;
8795 	else
8796 		wce = 0;
8797 
8798 	if (page->dra == dra && page->wce == wce && page->rcd == dra) {
8799 		/* nothing to do */
8800 		*rval = TRAN_ACCEPT;
8801 		return (SATA_SUCCESS);
8802 	}
8803 
8804 	/*
8805 	 * Need to flip some setting
8806 	 * Set-up Internal SET FEATURES command(s)
8807 	 */
8808 	scmd->satacmd_flags.sata_data_direction = SATA_DIR_NODATA_XFER;
8809 	scmd->satacmd_addr_type = 0;
8810 	scmd->satacmd_device_reg = 0;
8811 	scmd->satacmd_status_reg = 0;
8812 	scmd->satacmd_error_reg = 0;
8813 	scmd->satacmd_cmd_reg = SATAC_SET_FEATURES;
8814 	if (page->dra != dra || page->rcd != dra) {
8815 		if (SATA_READ_AHEAD_SUPPORTED(*sata_id)) {
8816 			/* Need to flip read ahead setting */
8817 			if (dra == 0)
8818 				/* Disable read ahead / read cache */
8819 				scmd->satacmd_features_reg =
8820 				    SATAC_SF_DISABLE_READ_AHEAD;
8821 			else
8822 				/* Enable read ahead  / read cache */
8823 				scmd->satacmd_features_reg =
8824 				    SATAC_SF_ENABLE_READ_AHEAD;
8825 
8826 			/* Transfer command to HBA */
8827 			if (sata_hba_start(spx, rval) != 0)
8828 				/*
8829 				 * Pkt not accepted for execution.
8830 				 */
8831 				return (SATA_FAILURE);
8832 
8833 			*dmod = 1;
8834 
8835 			/* Now process return */
8836 			if (spx->txlt_sata_pkt->satapkt_reason !=
8837 			    SATA_PKT_COMPLETED) {
8838 				goto failure;	/* Terminate */
8839 			}
8840 		} else {
8841 			*scsipkt->pkt_scbp = STATUS_CHECK;
8842 			sense = sata_arq_sense(spx);
8843 			sense->es_key = KEY_ILLEGAL_REQUEST;
8844 			sense->es_add_code =
8845 			    SD_SCSI_ASC_INVALID_FIELD_IN_PARAMS_LIST;
8846 			*pagelen = parmlen;
8847 			*rval = TRAN_ACCEPT;
8848 			return (SATA_FAILURE);
8849 		}
8850 	}
8851 
8852 	/* Note that the packet is not removed, so it could be re-used */
8853 	if (page->wce != wce) {
8854 		if (SATA_WRITE_CACHE_SUPPORTED(*sata_id)) {
8855 			/* Need to flip Write Cache setting */
8856 			if (page->wce == 1)
8857 				/* Enable write cache */
8858 				scmd->satacmd_features_reg =
8859 				    SATAC_SF_ENABLE_WRITE_CACHE;
8860 			else
8861 				/* Disable write cache */
8862 				scmd->satacmd_features_reg =
8863 				    SATAC_SF_DISABLE_WRITE_CACHE;
8864 
8865 			/* Transfer command to HBA */
8866 			if (sata_hba_start(spx, rval) != 0)
8867 				/*
8868 				 * Pkt not accepted for execution.
8869 				 */
8870 				return (SATA_FAILURE);
8871 
8872 			*dmod = 1;
8873 
8874 			/* Now process return */
8875 			if (spx->txlt_sata_pkt->satapkt_reason !=
8876 			    SATA_PKT_COMPLETED) {
8877 				goto failure;
8878 			}
8879 		} else {
8880 			*scsipkt->pkt_scbp = STATUS_CHECK;
8881 			sense = sata_arq_sense(spx);
8882 			sense->es_key = KEY_ILLEGAL_REQUEST;
8883 			sense->es_add_code =
8884 			    SD_SCSI_ASC_INVALID_FIELD_IN_PARAMS_LIST;
8885 			*pagelen = parmlen;
8886 			*rval = TRAN_ACCEPT;
8887 			return (SATA_FAILURE);
8888 		}
8889 	}
8890 	return (SATA_SUCCESS);
8891 
8892 failure:
8893 	sata_xlate_errors(spx);
8894 
8895 	return (SATA_FAILURE);
8896 }
8897 
8898 /*
8899  * Process mode select informational exceptions control page 0x1c
8900  *
8901  * The only changeable bit is dexcpt (disable exceptions).
8902  * MRIE (method of reporting informational exceptions) must be
8903  * "only on request".
8904  * This page applies to informational exceptions that report
8905  * additional sense codes with the ADDITIONAL SENSE CODE field set to 5Dh
8906  * (e.g.,FAILURE PREDICTION THRESHOLD EXCEEDED) or 0Bh (e.g., WARNING_).
8907  * Informational exception conditions occur as the result of background scan
8908  * errors, background self-test errors, or vendor specific events within a
8909  * logical unit. An informational exception condition may occur asynchronous
8910  * to any commands.
8911  *
8912  * Returns: SATA_SUCCESS if operation succeeded, SATA_FAILURE otherwise.
8913  * If operation resulted in changing device setup, dmod flag should be set to
8914  * one (1). If parameters were not changed, dmod flag should be set to 0.
8915  * Upon return, if operation required sending command to the device, the rval
8916  * should be set to the value returned by sata_hba_start. If operation
8917  * did not require device access, rval should be set to TRAN_ACCEPT.
8918  * The pagelen should be set to the length of the page.
8919  *
8920  * This function has to be called with a port mutex held.
8921  *
8922  * Returns SATA_SUCCESS if operation was successful, SATA_FAILURE otherwise.
8923  *
8924  * Cannot be called in the interrupt context.
8925  */
8926 static	int
sata_mode_select_page_1c(sata_pkt_txlate_t * spx,struct mode_info_excpt_page * page,int parmlen,int * pagelen,int * rval,int * dmod)8927 sata_mode_select_page_1c(
8928 	sata_pkt_txlate_t *spx,
8929 	struct mode_info_excpt_page *page,
8930 	int parmlen,
8931 	int *pagelen,
8932 	int *rval,
8933 	int *dmod)
8934 {
8935 	struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
8936 	sata_cmd_t *scmd = &spx->txlt_sata_pkt->satapkt_cmd;
8937 	sata_drive_info_t *sdinfo;
8938 	sata_id_t *sata_id;
8939 	struct scsi_extended_sense *sense;
8940 
8941 	sdinfo = sata_get_device_info(spx->txlt_sata_hba_inst,
8942 	    &spx->txlt_sata_pkt->satapkt_device);
8943 	sata_id = &sdinfo->satadrv_id;
8944 
8945 	*dmod = 0;
8946 
8947 	/* Verify parameters length. If too short, drop it */
8948 	if (((PAGELENGTH_INFO_EXCPT + sizeof (struct mode_page)) > parmlen) ||
8949 	    page->perf || page->test || (page->mrie != MRIE_ONLY_ON_REQUEST)) {
8950 		*scsipkt->pkt_scbp = STATUS_CHECK;
8951 		sense = sata_arq_sense(spx);
8952 		sense->es_key = KEY_ILLEGAL_REQUEST;
8953 		sense->es_add_code = SD_SCSI_ASC_INVALID_FIELD_IN_PARAMS_LIST;
8954 		*pagelen = parmlen;
8955 		*rval = TRAN_ACCEPT;
8956 		return (SATA_FAILURE);
8957 	}
8958 
8959 	*pagelen = PAGELENGTH_INFO_EXCPT + sizeof (struct mode_page);
8960 
8961 	if (! (sata_id->ai_cmdset82 & SATA_SMART_SUPPORTED)) {
8962 		*scsipkt->pkt_scbp = STATUS_CHECK;
8963 		sense = sata_arq_sense(spx);
8964 		sense->es_key = KEY_ILLEGAL_REQUEST;
8965 		sense->es_add_code = SD_SCSI_ASC_INVALID_FIELD_IN_CDB;
8966 		*pagelen = parmlen;
8967 		*rval = TRAN_ACCEPT;
8968 		return (SATA_FAILURE);
8969 	}
8970 
8971 	/* If already in the state requested, we are done */
8972 	if (page->dexcpt == ! (sata_id->ai_features85 & SATA_SMART_ENABLED)) {
8973 		/* nothing to do */
8974 		*rval = TRAN_ACCEPT;
8975 		return (SATA_SUCCESS);
8976 	}
8977 
8978 	scmd->satacmd_flags.sata_data_direction = SATA_DIR_NODATA_XFER;
8979 
8980 	/* Build SMART_ENABLE or SMART_DISABLE command */
8981 	scmd->satacmd_addr_type = 0;		/* N/A */
8982 	scmd->satacmd_lba_mid_lsb = SMART_MAGIC_VAL_1;
8983 	scmd->satacmd_lba_high_lsb = SMART_MAGIC_VAL_2;
8984 	scmd->satacmd_features_reg = page->dexcpt ?
8985 	    SATA_SMART_DISABLE_OPS : SATA_SMART_ENABLE_OPS;
8986 	scmd->satacmd_device_reg = 0;		/* Always device 0 */
8987 	scmd->satacmd_cmd_reg = SATAC_SMART;
8988 
8989 	/* Transfer command to HBA */
8990 	if (sata_hba_start(spx, rval) != 0)
8991 		/*
8992 		 * Pkt not accepted for execution.
8993 		 */
8994 		return (SATA_FAILURE);
8995 
8996 	*dmod = 1;	/* At least may have been modified */
8997 
8998 	/* Now process return */
8999 	if (spx->txlt_sata_pkt->satapkt_reason == SATA_PKT_COMPLETED)
9000 		return (SATA_SUCCESS);
9001 
9002 	/* Packet did not complete successfully */
9003 	sata_xlate_errors(spx);
9004 
9005 	return (SATA_FAILURE);
9006 }
9007 
9008 /*
9009  * Process mode select acoustic management control page 0x30
9010  *
9011  *
9012  * This function has to be called with a port mutex held.
9013  *
9014  * Returns SATA_SUCCESS if operation was successful, SATA_FAILURE otherwise.
9015  *
9016  * Cannot be called in the interrupt context.
9017  */
9018 int
sata_mode_select_page_30(sata_pkt_txlate_t * spx,struct mode_acoustic_management * page,int parmlen,int * pagelen,int * rval,int * dmod)9019 sata_mode_select_page_30(sata_pkt_txlate_t *spx, struct
9020     mode_acoustic_management *page, int parmlen, int *pagelen,
9021     int *rval, int *dmod)
9022 {
9023 	struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
9024 	sata_drive_info_t *sdinfo;
9025 	sata_cmd_t *scmd = &spx->txlt_sata_pkt->satapkt_cmd;
9026 	sata_id_t *sata_id;
9027 	struct scsi_extended_sense *sense;
9028 
9029 	sdinfo = sata_get_device_info(spx->txlt_sata_hba_inst,
9030 	    &spx->txlt_sata_pkt->satapkt_device);
9031 	sata_id = &sdinfo->satadrv_id;
9032 	*dmod = 0;
9033 
9034 	/* If parmlen is too short or the feature is not supported, drop it */
9035 	if (((PAGELENGTH_DAD_MODE_ACOUSTIC_MANAGEMENT +
9036 	    sizeof (struct mode_page)) > parmlen) ||
9037 	    (! (sata_id->ai_cmdset83 & SATA_ACOUSTIC_MGMT))) {
9038 		*scsipkt->pkt_scbp = STATUS_CHECK;
9039 		sense = sata_arq_sense(spx);
9040 		sense->es_key = KEY_ILLEGAL_REQUEST;
9041 		sense->es_add_code = SD_SCSI_ASC_INVALID_FIELD_IN_PARAMS_LIST;
9042 		*pagelen = parmlen;
9043 		*rval = TRAN_ACCEPT;
9044 		return (SATA_FAILURE);
9045 	}
9046 
9047 	*pagelen = PAGELENGTH_DAD_MODE_ACOUSTIC_MANAGEMENT +
9048 	    sizeof (struct mode_page);
9049 
9050 	/*
9051 	 * We can enable and disable acoustice management and
9052 	 * set the acoustic management level.
9053 	 */
9054 
9055 	/*
9056 	 * Set-up Internal SET FEATURES command(s)
9057 	 */
9058 	scmd->satacmd_flags.sata_data_direction = SATA_DIR_NODATA_XFER;
9059 	scmd->satacmd_addr_type = 0;
9060 	scmd->satacmd_device_reg = 0;
9061 	scmd->satacmd_status_reg = 0;
9062 	scmd->satacmd_error_reg = 0;
9063 	scmd->satacmd_cmd_reg = SATAC_SET_FEATURES;
9064 	if (page->acoustic_manag_enable) {
9065 		scmd->satacmd_features_reg = SATAC_SF_ENABLE_ACOUSTIC;
9066 		scmd->satacmd_sec_count_lsb = page->acoustic_manag_level;
9067 	} else {	/* disabling acoustic management */
9068 		scmd->satacmd_features_reg = SATAC_SF_DISABLE_ACOUSTIC;
9069 	}
9070 
9071 	/* Transfer command to HBA */
9072 	if (sata_hba_start(spx, rval) != 0)
9073 		/*
9074 		 * Pkt not accepted for execution.
9075 		 */
9076 		return (SATA_FAILURE);
9077 
9078 	/* Now process return */
9079 	if (spx->txlt_sata_pkt->satapkt_reason != SATA_PKT_COMPLETED) {
9080 		sata_xlate_errors(spx);
9081 		return (SATA_FAILURE);
9082 	}
9083 
9084 	*dmod = 1;
9085 
9086 	return (SATA_SUCCESS);
9087 }
9088 
9089 /*
9090  * Process mode select power condition page 0x1a
9091  *
9092  * This function has to be called with a port mutex held.
9093  *
9094  * Returns SATA_SUCCESS if operation was successful, SATA_FAILURE otherwise.
9095  *
9096  * Cannot be called in the interrupt context.
9097  */
9098 int
sata_mode_select_page_1a(sata_pkt_txlate_t * spx,struct mode_info_power_cond * page,int parmlen,int * pagelen,int * rval,int * dmod)9099 sata_mode_select_page_1a(sata_pkt_txlate_t *spx, struct
9100     mode_info_power_cond *page, int parmlen, int *pagelen,
9101     int *rval, int *dmod)
9102 {
9103 	struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
9104 	sata_drive_info_t *sdinfo;
9105 	sata_cmd_t *scmd = &spx->txlt_sata_pkt->satapkt_cmd;
9106 	sata_id_t *sata_id;
9107 	struct scsi_extended_sense *sense;
9108 	uint8_t ata_count;
9109 	int i, len;
9110 
9111 	sdinfo = sata_get_device_info(spx->txlt_sata_hba_inst,
9112 	    &spx->txlt_sata_pkt->satapkt_device);
9113 	sata_id = &sdinfo->satadrv_id;
9114 	*dmod = 0;
9115 
9116 	len = sizeof (struct mode_info_power_cond);
9117 	len += sizeof (struct mode_page);
9118 
9119 	/* If parmlen is too short or the feature is not supported, drop it */
9120 	if ((len < parmlen) || (page->idle == 1) ||
9121 	    (!(sata_id->ai_cap & SATA_STANDBYTIMER) && page->standby == 1)) {
9122 		*scsipkt->pkt_scbp = STATUS_CHECK;
9123 		sense = sata_arq_sense(spx);
9124 		sense->es_key = KEY_ILLEGAL_REQUEST;
9125 		sense->es_add_code = SD_SCSI_ASC_INVALID_FIELD_IN_PARAMS_LIST;
9126 		*pagelen = parmlen;
9127 		*rval = TRAN_ACCEPT;
9128 		return (SATA_FAILURE);
9129 	}
9130 
9131 	*pagelen = len;
9132 
9133 	/*
9134 	 * Set-up Internal STANDBY command(s)
9135 	 */
9136 	if (page->standby == 0)
9137 		goto out;
9138 
9139 	ata_count = sata_get_standby_timer(page->standby_cond_timer);
9140 
9141 	scmd->satacmd_addr_type = 0;
9142 	scmd->satacmd_sec_count_lsb = ata_count;
9143 	scmd->satacmd_lba_low_lsb = 0;
9144 	scmd->satacmd_lba_mid_lsb = 0;
9145 	scmd->satacmd_lba_high_lsb = 0;
9146 	scmd->satacmd_features_reg = 0;
9147 	scmd->satacmd_device_reg = 0;
9148 	scmd->satacmd_status_reg = 0;
9149 	scmd->satacmd_cmd_reg = SATAC_STANDBY;
9150 	scmd->satacmd_flags.sata_special_regs = B_TRUE;
9151 	scmd->satacmd_flags.sata_copy_out_error_reg = B_TRUE;
9152 
9153 	/* Transfer command to HBA */
9154 	if (sata_hba_start(spx, rval) != 0) {
9155 		return (SATA_FAILURE);
9156 	} else {
9157 		if ((scmd->satacmd_error_reg != 0) ||
9158 		    (spx->txlt_sata_pkt->satapkt_reason !=
9159 		    SATA_PKT_COMPLETED)) {
9160 			sata_xlate_errors(spx);
9161 			return (SATA_FAILURE);
9162 		}
9163 	}
9164 
9165 	for (i = 0; i < 4; i++) {
9166 		sdinfo->satadrv_standby_timer[i] = page->standby_cond_timer[i];
9167 	}
9168 out:
9169 	*dmod = 1;
9170 	return (SATA_SUCCESS);
9171 }
9172 
9173 /* Helper functions for manipulating struct log_parameter */
9174 
9175 CTASSERT(sizeof (struct log_parameter) == 4);
9176 
9177 static inline struct log_parameter *
log_param_next(struct log_parameter * lpp)9178 log_param_next(struct log_parameter *lpp)
9179 {
9180 	uint8_t *ptr = (uint8_t *)lpp;
9181 
9182 	ptr += sizeof (*lpp) + lpp->param_len;
9183 	return ((struct log_parameter *)ptr);
9184 }
9185 
9186 static inline int
log_param_size(const struct log_parameter * last,const void * startp)9187 log_param_size(const struct log_parameter *last, const void *startp)
9188 {
9189 	uintptr_t b = (uintptr_t)last;
9190 	uintptr_t a = (uintptr_t)startp;
9191 
9192 	ASSERT3U(b, >=, a);
9193 	return ((int)(b - a));
9194 }
9195 
9196 /*
9197  * sata_build_lsense_page0() is used to create the
9198  * SCSI LOG SENSE page 0 (supported log pages)
9199  *
9200  * Currently supported pages are 0, 0x10, 0x2f, 0x30 and 0x0e
9201  * (supported log pages, self-test results, informational exceptions
9202  * Sun vendor specific ATA SMART data, and start stop cycle counter).
9203  *
9204  * Takes a sata_drive_info t * and the address of a buffer
9205  * in which to create the page information.
9206  *
9207  * Returns the number of bytes valid in the buffer.
9208  */
9209 static	int
sata_build_lsense_page_0(sata_drive_info_t * sdinfo,uint8_t * buf)9210 sata_build_lsense_page_0(sata_drive_info_t *sdinfo, uint8_t *buf)
9211 {
9212 	uint8_t *ptr = buf;
9213 	sata_id_t *sata_id = &sdinfo->satadrv_id;
9214 
9215 	/* The supported log pages should be in ascending order */
9216 	*ptr++ = PAGE_CODE_GET_SUPPORTED_LOG_PAGES;
9217 
9218 	if (sata_id->ai_cmdset84 & SATA_GPL_SUPPORTED) {
9219 		*ptr++ = PAGE_CODE_READ_ERRORS;
9220 		*ptr++ = PAGE_CODE_TEMPERATURE;
9221 	}
9222 
9223 	if (sata_id->ai_cmdset82 & SATA_SMART_SUPPORTED) {
9224 		*ptr++ = PAGE_CODE_START_STOP_CYCLE_COUNTER;
9225 		if (sata_id->ai_cmdset84 & SATA_SMART_SELF_TEST_SUPPORTED) {
9226 			*ptr++ = PAGE_CODE_SELF_TEST_RESULTS;
9227 		}
9228 	}
9229 
9230 	if (sata_id->ai_medrotrate == 0x01 &&
9231 	    (sata_id->ai_cmdset84 & SATA_GPL_SUPPORTED))
9232 		*ptr++ = PAGE_CODE_SOLID_STATE_MEDIA;
9233 
9234 	if (sata_id->ai_cmdset84 & SATA_GPL_SUPPORTED) {
9235 		*ptr++ = PAGE_CODE_GENERAL_STATS;
9236 	}
9237 
9238 	if (sata_id->ai_cmdset82 & SATA_SMART_SUPPORTED) {
9239 		*ptr++ = PAGE_CODE_INFORMATION_EXCEPTIONS;
9240 		*ptr++ = PAGE_CODE_SMART_READ_DATA;
9241 	}
9242 
9243 	return ((int)((uintptr_t)ptr - (uintptr_t)buf));
9244 }
9245 
9246 static int
sata_build_lsense_page_03(sata_drive_info_t * sdinfo,uint8_t * buf,sata_hba_inst_t * sata_hba_inst)9247 sata_build_lsense_page_03(sata_drive_info_t *sdinfo, uint8_t *buf,
9248     sata_hba_inst_t *sata_hba_inst)
9249 {
9250 	struct log_parameter *lpp = (struct log_parameter *)buf;
9251 	uint64_t *lbuf;
9252 	uint64_t param;
9253 	int rval;
9254 
9255 	if (!(sdinfo->satadrv_id.ai_cmdset84 & SATA_GPL_SUPPORTED))
9256 		return (-1);
9257 
9258 	lbuf = kmem_zalloc(512, KM_SLEEP);
9259 	rval = sata_read_log_ext(sata_hba_inst, sdinfo, DEVICE_STATS_LOG,
9260 	    DEVSTAT_ROTATING_MEDIA_PAGE, lbuf, 1);
9261 	if (rval == 0) {
9262 		param = LE_64(lbuf[5]);		/* Read recovery errors */
9263 		if (SATA_STAT_SUPPORTED(param) && SATA_STAT_VALID(param)) {
9264 			/* Total times corrected algorithm parameter */
9265 			lpp->param_code[0] = 0x00;
9266 			lpp->param_code[1] = 0x04;
9267 			lpp->param_ctrl_flags = LOG_CTRL_LBIN;
9268 			lpp->param_len = sizeof (uint32_t);
9269 			BE_OUT32(&lpp->param_values[0],
9270 			    SATA_STAT_VALUE(param) & 0xffffffff);
9271 
9272 			lpp = log_param_next(lpp);
9273 		}
9274 	}
9275 
9276 	bzero(lbuf, 512);
9277 	rval = sata_read_log_ext(sata_hba_inst, sdinfo, DEVICE_STATS_LOG,
9278 	    DEVSTAT_GENERAL_ERRORS_PAGE, lbuf, 1);
9279 	if (rval == 0) {
9280 		param = LE_64(lbuf[1]); /* Reported uncorrectable errors */
9281 		if (SATA_STAT_SUPPORTED(param) && SATA_STAT_VALID(param)) {
9282 			/* Total Uncorrected Errors parameter */
9283 			lpp->param_code[0] = 0x00;
9284 			lpp->param_code[1] = 0x06;
9285 			lpp->param_ctrl_flags = LOG_CTRL_LBIN;
9286 			lpp->param_len = sizeof (uint32_t);
9287 			BE_OUT32(&lpp->param_values[0],
9288 			    SATA_STAT_VALUE(param) & 0xffffffff);
9289 
9290 			lpp = log_param_next(lpp);
9291 		}
9292 	}
9293 
9294 	kmem_free(lbuf, 512);
9295 
9296 	/*
9297 	 * If neither stat is supported, we treat it as the page not being
9298 	 * supported.
9299 	 */
9300 	return (log_param_size(lpp, buf) > 0 ? log_param_size(lpp, buf) : -1);
9301 }
9302 
9303 /*
9304  * sata_build_lsense_page_10() is used to create the
9305  * SCSI LOG SENSE page 0x10 (self-test results)
9306  *
9307  * Takes a sata_drive_info t * and the address of a buffer
9308  * in which to create the page information as well as a sata_hba_inst_t *.
9309  *
9310  * Returns the number of bytes valid in the buffer.
9311  *
9312  * Note: Self test and SMART data is accessible in device log pages.
9313  * The log pages can be accessed by SMART READ/WRITE LOG (up to 255 sectors
9314  * of data can be transferred by a single command), or by the General Purpose
9315  * Logging commands (GPL) READ LOG EXT and WRITE LOG EXT (up to 65,535 sectors
9316  * - approximately 33MB - can be transferred by a single command.
9317  * The SCT Command response (either error or command) is the same for both
9318  * the SMART and GPL methods of issuing commands.
9319  * This function uses READ LOG EXT command when drive supports LBA48, and
9320  * SMART READ command otherwise.
9321  *
9322  * Since above commands are executed in a synchronous mode, this function
9323  * should not be called in an interrupt context.
9324  */
9325 static	int
sata_build_lsense_page_10(sata_drive_info_t * sdinfo,uint8_t * buf,sata_hba_inst_t * sata_hba_inst)9326 sata_build_lsense_page_10(
9327 	sata_drive_info_t *sdinfo,
9328 	uint8_t *buf,
9329 	sata_hba_inst_t *sata_hba_inst)
9330 {
9331 	struct log_parameter *lpp = (struct log_parameter *)buf;
9332 	int rval;
9333 
9334 	if (sdinfo->satadrv_features_support & SATA_DEV_F_LBA48) {
9335 		struct smart_ext_selftest_log *ext_selftest_log;
9336 
9337 		ext_selftest_log = kmem_zalloc(
9338 		    sizeof (struct smart_ext_selftest_log), KM_SLEEP);
9339 
9340 		rval = sata_ext_smart_selftest_read_log(sata_hba_inst, sdinfo,
9341 		    ext_selftest_log, 0);
9342 		if (rval == 0) {
9343 			int index, start_index;
9344 			struct smart_ext_selftest_log_entry *entry;
9345 			static const struct smart_ext_selftest_log_entry empty =
9346 			    {0};
9347 			uint16_t block_num;
9348 			int count;
9349 			boolean_t only_one_block = B_FALSE;
9350 
9351 			index = ext_selftest_log->
9352 			    smart_ext_selftest_log_index[0];
9353 			index |= ext_selftest_log->
9354 			    smart_ext_selftest_log_index[1] << 8;
9355 			if (index == 0)
9356 				goto out;
9357 
9358 			--index;	/* Correct for 0 origin */
9359 			start_index = index;	/* remember where we started */
9360 			block_num = index / ENTRIES_PER_EXT_SELFTEST_LOG_BLK;
9361 			if (block_num != 0) {
9362 				rval = sata_ext_smart_selftest_read_log(
9363 				    sata_hba_inst, sdinfo, ext_selftest_log,
9364 				    block_num);
9365 				if (rval != 0)
9366 					goto out;
9367 			}
9368 			index %= ENTRIES_PER_EXT_SELFTEST_LOG_BLK;
9369 			entry =
9370 			    &ext_selftest_log->
9371 			    smart_ext_selftest_log_entries[index];
9372 
9373 			for (count = 1;
9374 			    count <= SCSI_ENTRIES_IN_LOG_SENSE_SELFTEST_RESULTS;
9375 			    ++count) {
9376 				uint8_t status;
9377 				uint8_t code;
9378 				uint8_t sense_key;
9379 				uint8_t add_sense_code;
9380 				uint8_t add_sense_code_qual;
9381 
9382 				/* If this is an unused entry, we are done */
9383 				if (bcmp(entry, &empty, sizeof (empty)) == 0) {
9384 					/* Broken firmware on some disks */
9385 					if (index + 1 ==
9386 					    ENTRIES_PER_EXT_SELFTEST_LOG_BLK) {
9387 						--entry;
9388 						--index;
9389 						if (bcmp(entry, &empty,
9390 						    sizeof (empty)) == 0)
9391 							goto out;
9392 					} else
9393 						goto out;
9394 				}
9395 
9396 				if (only_one_block &&
9397 				    start_index == index)
9398 					goto out;
9399 
9400 				lpp->param_code[0] = 0;
9401 				lpp->param_code[1] = count;
9402 				lpp->param_ctrl_flags =
9403 				    LOG_CTRL_LP | LOG_CTRL_LBIN;
9404 				lpp->param_len =
9405 				    SCSI_LOG_SENSE_SELFTEST_PARAM_LEN;
9406 
9407 				status = entry->smart_ext_selftest_log_status;
9408 				status >>= 4;
9409 				switch (status) {
9410 				case 0:
9411 				default:
9412 					sense_key = KEY_NO_SENSE;
9413 					add_sense_code =
9414 					    SD_SCSI_ASC_NO_ADD_SENSE;
9415 					add_sense_code_qual = 0;
9416 					break;
9417 				case 1:
9418 					sense_key = KEY_ABORTED_COMMAND;
9419 					add_sense_code =
9420 					    DIAGNOSTIC_FAILURE_ON_COMPONENT;
9421 					add_sense_code_qual = SCSI_COMPONENT_81;
9422 					break;
9423 				case 2:
9424 					sense_key = KEY_ABORTED_COMMAND;
9425 					add_sense_code =
9426 					    DIAGNOSTIC_FAILURE_ON_COMPONENT;
9427 					add_sense_code_qual = SCSI_COMPONENT_82;
9428 					break;
9429 				case 3:
9430 					sense_key = KEY_ABORTED_COMMAND;
9431 					add_sense_code =
9432 					    DIAGNOSTIC_FAILURE_ON_COMPONENT;
9433 					add_sense_code_qual = SCSI_COMPONENT_83;
9434 					break;
9435 				case 4:
9436 					sense_key = KEY_HARDWARE_ERROR;
9437 					add_sense_code =
9438 					    DIAGNOSTIC_FAILURE_ON_COMPONENT;
9439 					add_sense_code_qual = SCSI_COMPONENT_84;
9440 					break;
9441 				case 5:
9442 					sense_key = KEY_HARDWARE_ERROR;
9443 					add_sense_code =
9444 					    DIAGNOSTIC_FAILURE_ON_COMPONENT;
9445 					add_sense_code_qual = SCSI_COMPONENT_85;
9446 					break;
9447 				case 6:
9448 					sense_key = KEY_HARDWARE_ERROR;
9449 					add_sense_code =
9450 					    DIAGNOSTIC_FAILURE_ON_COMPONENT;
9451 					add_sense_code_qual = SCSI_COMPONENT_86;
9452 					break;
9453 				case 7:
9454 					sense_key = KEY_MEDIUM_ERROR;
9455 					add_sense_code =
9456 					    DIAGNOSTIC_FAILURE_ON_COMPONENT;
9457 					add_sense_code_qual = SCSI_COMPONENT_87;
9458 					break;
9459 				case 8:
9460 					sense_key = KEY_HARDWARE_ERROR;
9461 					add_sense_code =
9462 					    DIAGNOSTIC_FAILURE_ON_COMPONENT;
9463 					add_sense_code_qual = SCSI_COMPONENT_88;
9464 					break;
9465 				}
9466 				code = 0;	/* unspecified */
9467 				status |= (code << 4);
9468 				lpp->param_values[0] = status;
9469 				lpp->param_values[1] = 0; /* unspecified */
9470 				lpp->param_values[2] = entry->
9471 				    smart_ext_selftest_log_timestamp[1];
9472 				lpp->param_values[3] = entry->
9473 				    smart_ext_selftest_log_timestamp[0];
9474 				if (status != 0) {
9475 					lpp->param_values[4] = 0;
9476 					lpp->param_values[5] = 0;
9477 					lpp->param_values[6] = entry->
9478 					    smart_ext_selftest_log_failing_lba
9479 					    [5];
9480 					lpp->param_values[7] = entry->
9481 					    smart_ext_selftest_log_failing_lba
9482 					    [4];
9483 					lpp->param_values[8] = entry->
9484 					    smart_ext_selftest_log_failing_lba
9485 					    [3];
9486 					lpp->param_values[9] = entry->
9487 					    smart_ext_selftest_log_failing_lba
9488 					    [2];
9489 					lpp->param_values[10] = entry->
9490 					    smart_ext_selftest_log_failing_lba
9491 					    [1];
9492 					lpp->param_values[11] = entry->
9493 					    smart_ext_selftest_log_failing_lba
9494 					    [0];
9495 				} else {	/* No bad block address */
9496 					lpp->param_values[4] = 0xff;
9497 					lpp->param_values[5] = 0xff;
9498 					lpp->param_values[6] = 0xff;
9499 					lpp->param_values[7] = 0xff;
9500 					lpp->param_values[8] = 0xff;
9501 					lpp->param_values[9] = 0xff;
9502 					lpp->param_values[10] = 0xff;
9503 					lpp->param_values[11] = 0xff;
9504 				}
9505 
9506 				lpp->param_values[12] = sense_key;
9507 				lpp->param_values[13] = add_sense_code;
9508 				lpp->param_values[14] = add_sense_code_qual;
9509 				lpp->param_values[15] = 0; /* undefined */
9510 
9511 				lpp = (struct log_parameter *)
9512 				    (((uint8_t *)lpp) +
9513 				    SCSI_LOG_PARAM_HDR_LEN +
9514 				    SCSI_LOG_SENSE_SELFTEST_PARAM_LEN);
9515 
9516 				--index;	/* Back up to previous entry */
9517 				if (index < 0) {
9518 					if (block_num > 0) {
9519 						--block_num;
9520 					} else {
9521 						struct read_log_ext_directory
9522 						    logdir;
9523 
9524 						rval =
9525 						    sata_read_log_ext_directory(
9526 						    sata_hba_inst, sdinfo,
9527 						    &logdir);
9528 						if (rval == -1)
9529 							goto out;
9530 						if ((logdir.read_log_ext_vers
9531 						    [0] == 0) &&
9532 						    (logdir.read_log_ext_vers
9533 						    [1] == 0))
9534 							goto out;
9535 						block_num =
9536 						    logdir.read_log_ext_nblks
9537 						    [EXT_SMART_SELFTEST_LOG_PAGE
9538 						    - 1][0];
9539 						block_num |= logdir.
9540 						    read_log_ext_nblks
9541 						    [EXT_SMART_SELFTEST_LOG_PAGE
9542 						    - 1][1] << 8;
9543 						--block_num;
9544 						only_one_block =
9545 						    (block_num == 0);
9546 					}
9547 					rval = sata_ext_smart_selftest_read_log(
9548 					    sata_hba_inst, sdinfo,
9549 					    ext_selftest_log, block_num);
9550 					if (rval != 0)
9551 						goto out;
9552 
9553 					index =
9554 					    ENTRIES_PER_EXT_SELFTEST_LOG_BLK -
9555 					    1;
9556 				}
9557 				index %= ENTRIES_PER_EXT_SELFTEST_LOG_BLK;
9558 				entry = &ext_selftest_log->
9559 				    smart_ext_selftest_log_entries[index];
9560 			}
9561 		}
9562 out:
9563 		kmem_free(ext_selftest_log,
9564 		    sizeof (struct smart_ext_selftest_log));
9565 	} else {
9566 		struct smart_selftest_log *selftest_log;
9567 
9568 		selftest_log = kmem_zalloc(sizeof (struct smart_selftest_log),
9569 		    KM_SLEEP);
9570 
9571 		rval = sata_smart_selftest_log(sata_hba_inst, sdinfo,
9572 		    selftest_log);
9573 
9574 		if (rval == 0) {
9575 			int index;
9576 			int count;
9577 			struct smart_selftest_log_entry *entry;
9578 			static const struct smart_selftest_log_entry empty =
9579 			    { 0 };
9580 
9581 			index = selftest_log->smart_selftest_log_index;
9582 			if (index == 0)
9583 				goto done;
9584 			--index;	/* Correct for 0 origin */
9585 			entry = &selftest_log->
9586 			    smart_selftest_log_entries[index];
9587 			for (count = 1;
9588 			    count <= SCSI_ENTRIES_IN_LOG_SENSE_SELFTEST_RESULTS;
9589 			    ++count) {
9590 				uint8_t status;
9591 				uint8_t code;
9592 				uint8_t sense_key;
9593 				uint8_t add_sense_code;
9594 				uint8_t add_sense_code_qual = 0;
9595 
9596 				if (bcmp(entry, &empty, sizeof (empty)) == 0)
9597 					goto done;
9598 
9599 				lpp->param_code[0] = 0;
9600 				lpp->param_code[1] = count;
9601 				lpp->param_ctrl_flags =
9602 				    LOG_CTRL_LP | LOG_CTRL_LBIN;
9603 				lpp->param_len =
9604 				    SCSI_LOG_SENSE_SELFTEST_PARAM_LEN;
9605 
9606 				status = entry->smart_selftest_log_status;
9607 				status >>= 4;
9608 				switch (status) {
9609 				case 0:
9610 				default:
9611 					sense_key = KEY_NO_SENSE;
9612 					add_sense_code =
9613 					    SD_SCSI_ASC_NO_ADD_SENSE;
9614 					break;
9615 				case 1:
9616 					sense_key = KEY_ABORTED_COMMAND;
9617 					add_sense_code =
9618 					    DIAGNOSTIC_FAILURE_ON_COMPONENT;
9619 					add_sense_code_qual = SCSI_COMPONENT_81;
9620 					break;
9621 				case 2:
9622 					sense_key = KEY_ABORTED_COMMAND;
9623 					add_sense_code =
9624 					    DIAGNOSTIC_FAILURE_ON_COMPONENT;
9625 					add_sense_code_qual = SCSI_COMPONENT_82;
9626 					break;
9627 				case 3:
9628 					sense_key = KEY_ABORTED_COMMAND;
9629 					add_sense_code =
9630 					    DIAGNOSTIC_FAILURE_ON_COMPONENT;
9631 					add_sense_code_qual = SCSI_COMPONENT_83;
9632 					break;
9633 				case 4:
9634 					sense_key = KEY_HARDWARE_ERROR;
9635 					add_sense_code =
9636 					    DIAGNOSTIC_FAILURE_ON_COMPONENT;
9637 					add_sense_code_qual = SCSI_COMPONENT_84;
9638 					break;
9639 				case 5:
9640 					sense_key = KEY_HARDWARE_ERROR;
9641 					add_sense_code =
9642 					    DIAGNOSTIC_FAILURE_ON_COMPONENT;
9643 					add_sense_code_qual = SCSI_COMPONENT_85;
9644 					break;
9645 				case 6:
9646 					sense_key = KEY_HARDWARE_ERROR;
9647 					add_sense_code =
9648 					    DIAGNOSTIC_FAILURE_ON_COMPONENT;
9649 					add_sense_code_qual = SCSI_COMPONENT_86;
9650 					break;
9651 				case 7:
9652 					sense_key = KEY_MEDIUM_ERROR;
9653 					add_sense_code =
9654 					    DIAGNOSTIC_FAILURE_ON_COMPONENT;
9655 					add_sense_code_qual = SCSI_COMPONENT_87;
9656 					break;
9657 				case 8:
9658 					sense_key = KEY_HARDWARE_ERROR;
9659 					add_sense_code =
9660 					    DIAGNOSTIC_FAILURE_ON_COMPONENT;
9661 					add_sense_code_qual = SCSI_COMPONENT_88;
9662 					break;
9663 				}
9664 				code = 0;	/* unspecified */
9665 				status |= (code << 4);
9666 				lpp->param_values[0] = status;
9667 				lpp->param_values[1] = 0; /* unspecified */
9668 				lpp->param_values[2] = entry->
9669 				    smart_selftest_log_timestamp[1];
9670 				lpp->param_values[3] = entry->
9671 				    smart_selftest_log_timestamp[0];
9672 				if (status != 0) {
9673 					lpp->param_values[4] = 0;
9674 					lpp->param_values[5] = 0;
9675 					lpp->param_values[6] = 0;
9676 					lpp->param_values[7] = 0;
9677 					lpp->param_values[8] = entry->
9678 					    smart_selftest_log_failing_lba[3];
9679 					lpp->param_values[9] = entry->
9680 					    smart_selftest_log_failing_lba[2];
9681 					lpp->param_values[10] = entry->
9682 					    smart_selftest_log_failing_lba[1];
9683 					lpp->param_values[11] = entry->
9684 					    smart_selftest_log_failing_lba[0];
9685 				} else {	/* No block address */
9686 					lpp->param_values[4] = 0xff;
9687 					lpp->param_values[5] = 0xff;
9688 					lpp->param_values[6] = 0xff;
9689 					lpp->param_values[7] = 0xff;
9690 					lpp->param_values[8] = 0xff;
9691 					lpp->param_values[9] = 0xff;
9692 					lpp->param_values[10] = 0xff;
9693 					lpp->param_values[11] = 0xff;
9694 				}
9695 				lpp->param_values[12] = sense_key;
9696 				lpp->param_values[13] = add_sense_code;
9697 				lpp->param_values[14] = add_sense_code_qual;
9698 				lpp->param_values[15] = 0; /* undefined */
9699 
9700 				lpp = (struct log_parameter *)
9701 				    (((uint8_t *)lpp) +
9702 				    SCSI_LOG_PARAM_HDR_LEN +
9703 				    SCSI_LOG_SENSE_SELFTEST_PARAM_LEN);
9704 				--index;	/* back up to previous entry */
9705 				if (index < 0) {
9706 					index =
9707 					    NUM_SMART_SELFTEST_LOG_ENTRIES - 1;
9708 				}
9709 				entry = &selftest_log->
9710 				    smart_selftest_log_entries[index];
9711 			}
9712 		}
9713 done:
9714 		kmem_free(selftest_log, sizeof (struct smart_selftest_log));
9715 	}
9716 
9717 	return ((SCSI_LOG_PARAM_HDR_LEN + SCSI_LOG_SENSE_SELFTEST_PARAM_LEN) *
9718 	    SCSI_ENTRIES_IN_LOG_SENSE_SELFTEST_RESULTS);
9719 }
9720 
9721 static uint8_t
sata_sct_temp(sata_hba_inst_t * sata_hba_inst,sata_drive_info_t * sdinfo,void * p,size_t lbufsz)9722 sata_sct_temp(sata_hba_inst_t *sata_hba_inst, sata_drive_info_t *sdinfo,
9723     void *p, size_t lbufsz)
9724 {
9725 	sata_id_t *sata_id = &sdinfo->satadrv_id;
9726 	uint8_t *lbuf = p;
9727 	int rval;
9728 	uint8_t temp;
9729 
9730 	/* The log buffer we use should be at least 1 block in size */
9731 	ASSERT3U(lbufsz, >=, 512);
9732 
9733 	if ((sata_id->ai_sctsupport & SATA_SCT_CMD_TRANS_SUP) == 0)
9734 		return (SCSI_NO_TEMP);
9735 
9736 	bzero(lbuf, lbufsz);
9737 	rval = sata_smart_read_log(sata_hba_inst, sdinfo, lbuf,
9738 	    SCT_STATUS_LOG_PAGE, 1);
9739 	if (rval == -1)
9740 		return (SCSI_NO_TEMP);
9741 
9742 	/*
9743 	 * ACS-3 8.2.5 Table 186 -- If the value is 0x80, the field (HDA TEMP)
9744 	 * is not valid)
9745 	 */
9746 	temp = lbuf[200];
9747 	if (temp == 0x80)
9748 		return (SCSI_NO_TEMP);
9749 
9750 	/*
9751 	 * SATA temps are signed (with 0x80 being a sentinel value indicating
9752 	 * not valid as noted above). SAT-5 says that values below 0 are
9753 	 * truncated to 0.
9754 	 */
9755 	if ((temp & 0x80) != 0)
9756 		return (0);
9757 
9758 	return (temp);
9759 }
9760 
9761 
9762 /*
9763  * sata_build_lsense_page_2f() is used to create the
9764  * SCSI LOG SENSE page 0x2f (informational exceptions)
9765  *
9766  * Takes a sata_drive_info t * and the address of a buffer
9767  * in which to create the page information as well as a sata_hba_inst_t *.
9768  *
9769  * Returns the number of bytes valid in the buffer.
9770  *
9771  * Because it invokes function(s) that send synchronously executed command
9772  * to the HBA, it cannot be called in the interrupt context.
9773  */
9774 static	int
sata_build_lsense_page_2f(sata_drive_info_t * sdinfo,uint8_t * buf,sata_hba_inst_t * sata_hba_inst)9775 sata_build_lsense_page_2f(
9776 	sata_drive_info_t *sdinfo,
9777 	uint8_t *buf,
9778 	sata_hba_inst_t *sata_hba_inst)
9779 {
9780 	struct log_parameter *lpp = (struct log_parameter *)buf;
9781 	int rval;
9782 	uint8_t *smart_data;
9783 	uint8_t temp;
9784 	sata_id_t *sata_id;
9785 
9786 	lpp->param_code[0] = 0;
9787 	lpp->param_code[1] = 0;
9788 	lpp->param_ctrl_flags = LOG_CTRL_LP | LOG_CTRL_LBIN;
9789 
9790 	/* Now get the SMART status w.r.t. threshold exceeded */
9791 	rval = sata_fetch_smart_return_status(sata_hba_inst, sdinfo);
9792 	switch (rval) {
9793 	case 1:
9794 		lpp->param_values[0] = SCSI_PREDICTED_FAILURE;
9795 		lpp->param_values[1] = SCSI_GENERAL_HD_FAILURE;
9796 		break;
9797 	case 0:
9798 	case -1:	/* failed to get data */
9799 		lpp->param_values[0] = 0;	/* No failure predicted */
9800 		lpp->param_values[1] = 0;
9801 		break;
9802 #if defined(SATA_DEBUG)
9803 	default:
9804 		cmn_err(CE_PANIC, "sata_build_lsense_page_2f bad return value");
9805 		/* NOTREACHED */
9806 #endif
9807 	}
9808 
9809 	sata_id = &sdinfo->satadrv_id;
9810 	if (! (sata_id->ai_sctsupport & SATA_SCT_CMD_TRANS_SUP)) {
9811 		temp = SCSI_NO_TEMP;
9812 	} else {
9813 		/* Now get the temperature */
9814 		smart_data = kmem_zalloc(512, KM_SLEEP);
9815 		temp = sata_sct_temp(sata_hba_inst, sdinfo, smart_data, 512);
9816 		kmem_free(smart_data, 512);
9817 	}
9818 
9819 	lpp->param_values[2] = temp;	/* most recent temperature */
9820 	lpp->param_values[3] = 0;	/* required vendor specific byte */
9821 
9822 	lpp->param_len = SCSI_INFO_EXCEPTIONS_PARAM_LEN;
9823 
9824 
9825 	return (SCSI_INFO_EXCEPTIONS_PARAM_LEN + SCSI_LOG_PARAM_HDR_LEN);
9826 }
9827 
9828 static int
sata_build_lsense_page_0d(sata_drive_info_t * sdinfo,uint8_t * buf,sata_hba_inst_t * sata_hba_inst)9829 sata_build_lsense_page_0d(sata_drive_info_t *sdinfo, uint8_t *buf,
9830     sata_hba_inst_t *sata_hba_inst)
9831 {
9832 	struct log_parameter *lpp = (struct log_parameter *)buf;
9833 	uint64_t *lbuf;
9834 	uint64_t param;
9835 	int rval;
9836 	uint8_t temp, ref_temp, sct_temp;
9837 
9838 	if (!(sdinfo->satadrv_id.ai_sctsupport & SATA_SCT_CMD_TRANS_SUP) &&
9839 	    !(sdinfo->satadrv_id.ai_cmdset84 & SATA_GPL_SUPPORTED))
9840 		return (-1);
9841 
9842 	temp = ref_temp = sct_temp = SCSI_NO_TEMP;
9843 
9844 	lbuf = kmem_zalloc(512, KM_SLEEP);
9845 	sct_temp = sata_sct_temp(sata_hba_inst, sdinfo, lbuf, 512);
9846 
9847 	bzero(lbuf, 512);
9848 
9849 	rval = sata_read_log_ext(sata_hba_inst, sdinfo, DEVICE_STATS_LOG,
9850 	    DEVSTAT_TEMP_PAGE, lbuf, 1);
9851 	if (rval == -1)
9852 		goto done;
9853 
9854 	param = LE_64(lbuf[1]);		/* Current temperature */
9855 	if (SATA_STAT_SUPPORTED(param) && SATA_STAT_VALID(param)) {
9856 		/*
9857 		 * SAT-5 10.3.13.2 Table 136 says that only positive
9858 		 * temperatures (SATA temps are signed 8-bit values) -- i.e.
9859 		 * bit 7 is 0 are translated, otherwise 0xff (SCSI_NO_TEMP)
9860 		 * is returned.
9861 		 */
9862 		temp = SATA_STAT_VALUE(param) & 0xff;
9863 		if ((temp & 0x80) != 0)
9864 			temp = SCSI_NO_TEMP;
9865 	}
9866 
9867 	param = LE_64(lbuf[11]);	/* Max operating temp */
9868 	if (SATA_STAT_SUPPORTED(param) && SATA_STAT_VALID(param)) {
9869 		/*
9870 		 * Interestingly, for the reference temperature, while the
9871 		 * SATA value is also an 8-bit signed value), SAT-5 10.3.13.3
9872 		 * Table 137 says that negative temps are translated to 0
9873 		 * unlike the current temperature.
9874 		 */
9875 		int8_t val = (int8_t)(SATA_STAT_VALUE(param) & 0xff);
9876 		ref_temp = (val < 0) ? 0 : val;
9877 	}
9878 
9879 	rval = 0;
9880 
9881 done:
9882 	kmem_free(lbuf, 512);
9883 
9884 	/*
9885 	 * If we support SCT or GPL, we'll always return a value, even if
9886 	 * that value is SCSI_NO_TEMP (as it may be a transient issue and
9887 	 * appears to be allowable per SPC-5).
9888 	 */
9889 
9890 	lpp->param_code[0] = 0;
9891 	lpp->param_code[1] = 0;
9892 	lpp->param_ctrl_flags = LOG_CTRL_LP | LOG_CTRL_LBIN;
9893 	lpp->param_len = 2;
9894 	lpp->param_values[0] = 0;	/* Reserved */
9895 
9896 	/*
9897 	 * Per SAT-5 10.3.13.2 Table 136, The SCT temp is used if
9898 	 * valid, otherwise the current temp from the temp statistics page
9899 	 * is used.
9900 	 */
9901 	lpp->param_values[1] = (sct_temp != SCSI_NO_TEMP) ? sct_temp : temp;
9902 
9903 	lpp = log_param_next(lpp);
9904 
9905 	if (ref_temp != SCSI_NO_TEMP) {
9906 		lpp->param_code[0] = 0x00;
9907 		lpp->param_code[1] = 0x01;	/* Reference Temperature */
9908 		lpp->param_ctrl_flags = LOG_CTRL_LP | LOG_CTRL_LBIN;
9909 		lpp->param_len = 2;
9910 		lpp->param_values[0] = 0;	/* Resreved */
9911 		lpp->param_values[1] = ref_temp;
9912 
9913 		lpp = log_param_next(lpp);
9914 	}
9915 
9916 	return (log_param_size(lpp, buf));
9917 }
9918 
9919 /*
9920  * sata_build_lsense_page_30() is used to create the
9921  * SCSI LOG SENSE page 0x30 (Sun's vendor specific page for ATA SMART data).
9922  *
9923  * Takes a sata_drive_info t * and the address of a buffer
9924  * in which to create the page information as well as a sata_hba_inst_t *.
9925  *
9926  * Returns the number of bytes valid in the buffer.
9927  */
9928 static int
sata_build_lsense_page_30(sata_drive_info_t * sdinfo,uint8_t * buf,sata_hba_inst_t * sata_hba_inst)9929 sata_build_lsense_page_30(
9930 	sata_drive_info_t *sdinfo,
9931 	uint8_t *buf,
9932 	sata_hba_inst_t *sata_hba_inst)
9933 {
9934 	struct smart_data *smart_data = (struct smart_data *)buf;
9935 	int rval;
9936 
9937 	/* Now do the SMART READ DATA */
9938 	rval = sata_fetch_smart_data(sata_hba_inst, sdinfo, smart_data);
9939 	if (rval == -1)
9940 		return (0);
9941 
9942 	return (sizeof (struct smart_data));
9943 }
9944 
9945 /*
9946  * sata_build_lsense_page_0e() is used to create the
9947  * SCSI LOG SENSE page 0e (start-stop cycle counter page)
9948  *
9949  * Date of Manufacture (0x0001)
9950  *	YEAR = "0000"
9951  *	WEEK = "00"
9952  * Accounting Date (0x0002)
9953  *	6 ASCII space character(20h)
9954  * Specified cycle count over device lifetime
9955  *	VALUE - THRESH - the delta between max and min;
9956  * Accumulated start-stop cycles
9957  *	VALUE - WORST - the accumulated cycles;
9958  *
9959  * ID FLAG THRESH VALUE WORST RAW on start/stop counter attribute
9960  *
9961  * Takes a sata_drive_info t * and the address of a buffer
9962  * in which to create the page information as well as a sata_hba_inst_t *.
9963  *
9964  * Returns the number of bytes valid in the buffer.
9965  */
9966 static	int
sata_build_lsense_page_0e(sata_drive_info_t * sdinfo,uint8_t * buf,sata_pkt_txlate_t * spx)9967 sata_build_lsense_page_0e(sata_drive_info_t *sdinfo, uint8_t *buf,
9968     sata_pkt_txlate_t *spx)
9969 {
9970 	struct start_stop_cycle_counter_log *log_page;
9971 	int i, rval, index;
9972 	uint8_t smart_data[512], id, value, worst, thresh;
9973 	uint32_t max_count, cycles;
9974 
9975 	/* Now do the SMART READ DATA */
9976 	rval = sata_fetch_smart_data(spx->txlt_sata_hba_inst, sdinfo,
9977 	    (struct smart_data *)smart_data);
9978 	if (rval == -1)
9979 		return (0);
9980 	for (i = 0, id = 0; i < SMART_START_STOP_COUNT_ID * 2; i++) {
9981 		index = (i * 12) + 2;
9982 		id = smart_data[index];
9983 		if (id != SMART_START_STOP_COUNT_ID)
9984 			continue;
9985 		else {
9986 			thresh = smart_data[index + 2];
9987 			value = smart_data[index + 3];
9988 			worst = smart_data[index + 4];
9989 			break;
9990 		}
9991 	}
9992 	if (id != SMART_START_STOP_COUNT_ID)
9993 		return (0);
9994 	max_count = value - thresh;
9995 	cycles = value - worst;
9996 
9997 	log_page = (struct start_stop_cycle_counter_log *)buf;
9998 	bzero(log_page, sizeof (struct start_stop_cycle_counter_log));
9999 	log_page->code = 0x0e;
10000 	log_page->page_len_low = 0x24;
10001 
10002 	log_page->manufactor_date_low = 0x1;
10003 	log_page->param_1.fmt_link = 0x1; /* 01b */
10004 	log_page->param_len_1 = 0x06;
10005 	for (i = 0; i < 4; i++) {
10006 		log_page->year_manu[i] = 0x30;
10007 		if (i < 2)
10008 			log_page->week_manu[i] = 0x30;
10009 	}
10010 
10011 	log_page->account_date_low = 0x02;
10012 	log_page->param_2.fmt_link = 0x01; /* 01b */
10013 	log_page->param_len_2 = 0x06;
10014 	for (i = 0; i < 4; i++) {
10015 		log_page->year_account[i] = 0x20;
10016 		if (i < 2)
10017 			log_page->week_account[i] = 0x20;
10018 	}
10019 
10020 	log_page->lifetime_code_low = 0x03;
10021 	log_page->param_3.fmt_link = 0x03; /* 11b */
10022 	log_page->param_len_3 = 0x04;
10023 	/* VALUE - THRESH - the delta between max and min */
10024 	log_page->cycle_code_low = 0x04;
10025 	log_page->param_4.fmt_link = 0x03; /* 11b */
10026 	log_page->param_len_4 = 0x04;
10027 	/* WORST - THRESH - the distance from 'now' to min */
10028 
10029 	for (i = 0; i < 4; i++) {
10030 		log_page->cycle_lifetime[i] =
10031 		    (max_count >> (8 * (3 - i))) & 0xff;
10032 		log_page->cycle_accumulated[i] =
10033 		    (cycles >> (8 * (3 - i))) & 0xff;
10034 	}
10035 
10036 	return (sizeof (struct start_stop_cycle_counter_log));
10037 }
10038 
10039 static int
sata_build_lsense_page_11(sata_drive_info_t * sdinfo,uint8_t * buf,sata_hba_inst_t * sata_hba_inst)10040 sata_build_lsense_page_11(sata_drive_info_t *sdinfo, uint8_t *buf,
10041     sata_hba_inst_t *sata_hba_inst)
10042 {
10043 	struct log_parameter *lpp = (struct log_parameter *)buf;
10044 	uint64_t *lbuf;
10045 	uint64_t param;
10046 	int rval = 0;
10047 
10048 	/* Check if device is SSD */
10049 	if (sdinfo->satadrv_id.ai_medrotrate != 0x01 ||
10050 	    !(sdinfo->satadrv_id.ai_cmdset84 & SATA_GPL_SUPPORTED)) {
10051 		return (-1);
10052 	}
10053 
10054 	lbuf = kmem_zalloc(512, KM_SLEEP);
10055 	rval = sata_read_log_ext(sata_hba_inst, sdinfo, DEVICE_STATS_LOG,
10056 	    DEVSTAT_SSD_PAGE, lbuf, 1);
10057 	if (rval == -1)
10058 		goto done;
10059 
10060 	param = LE_64(lbuf[1]);	/* %-age used endurance indicator */
10061 	if (!SATA_STAT_SUPPORTED(param) || !SATA_STAT_VALID(param)) {
10062 		/*
10063 		 * If the wear stat isn't supported or valid, the SAT-5
10064 		 * says this is unspecified. We'll treat it as the
10065 		 * log page being unsupported.
10066 		 */
10067 		rval = -1;
10068 		goto done;
10069 	}
10070 
10071 	lpp->param_code[0] = 0x00;
10072 	lpp->param_code[1] = 0x01;
10073 	lpp->param_ctrl_flags = LOG_CTRL_LP | LOG_CTRL_LBIN;
10074 	lpp->param_len = 4;
10075 	BE_OUT32(&lpp->param_values[0], SATA_STAT_VALUE(param) & 0xffffffff);
10076 
10077 	lpp = log_param_next(lpp);
10078 
10079 done:
10080 	kmem_free(lbuf, 512);
10081 	return ((rval < 0) ? -1 : log_param_size(lpp, buf));
10082 }
10083 
10084 static int
sata_build_lsense_page_19(sata_drive_info_t * sdinfo,uint8_t * buf,sata_hba_inst_t * sata_hba_inst)10085 sata_build_lsense_page_19(sata_drive_info_t *sdinfo, uint8_t *buf,
10086     sata_hba_inst_t *sata_hba_inst)
10087 {
10088 	/*
10089 	 * The indexes into lbuf (the SATA general statistics log)
10090 	 * that correspond to the values of the general access statistics
10091 	 * and performance log values. -1 means there is no mapping (e.g.
10092 	 * write 0 for that value).
10093 	 */
10094 	static const int stat_idx[] = {
10095 		6,	/* # of read commands */
10096 		4,	/* # of write commands */
10097 		3,	/* Logical sectors written */
10098 		5,	/* Logical sectors read */
10099 		-1, -1, -1, -1
10100 	};
10101 
10102 	struct log_parameter *lpp = (struct log_parameter *)buf;
10103 	uint64_t *lbuf;
10104 	uint64_t *paramp;
10105 	uint64_t param;
10106 	uint_t nvalid;
10107 	int rval;
10108 
10109 	if (!(sdinfo->satadrv_id.ai_cmdset84 & SATA_GPL_SUPPORTED))
10110 		return (-1);
10111 
10112 	nvalid = 0;
10113 
10114 	lbuf = kmem_zalloc(512, KM_SLEEP);
10115 	rval = sata_read_log_ext(sata_hba_inst, sdinfo, DEVICE_STATS_LOG,
10116 	    DEVSTAT_GENERAL_STATS, lbuf, 1);
10117 	if (rval == -1) {
10118 		kmem_free(lbuf, 512);
10119 		return (-1);
10120 	}
10121 
10122 	lpp->param_code[0] = 0x00;
10123 	lpp->param_code[1] = 0x01;
10124 	/*
10125 	 * SPC-5 and SAT-5 disagree on this value -- SPC-5 7.3.9.2 says this
10126 	 * should be an unbounded data counter (10b LOG_CTRL_LBIN) while SAT-5
10127 	 * 10.3.4.2 Table 110 says this should be a binary format list (11b
10128 	 * aka LOG_CTRL_LP | LOG_CTRL_LBIN). Since SAT-5 is a bit more
10129 	 * explicit on the value, we've followed it. So far no software
10130 	 * has been uncovered to date that seems to care about the value, but
10131 	 * it may need to be updated of the two specs are ever brought into
10132 	 * agreement.
10133 	 */
10134 	lpp->param_ctrl_flags = LOG_CTRL_LP | LOG_CTRL_LBIN;
10135 	lpp->param_len = 0x40;
10136 
10137 	paramp = (uint64_t *)&lpp->param_values[0];
10138 
10139 	/* Zero out all of parameter values */
10140 	bzero(paramp, 0x40);
10141 
10142 	/* The stat parameters are 48 bits long */
10143 #define	PARAM_VAL(x) ((x) & ((1ULL << 48) - 1))
10144 
10145 	for (uint_t i = 0; i < ARRAY_SIZE(stat_idx); i++, paramp++) {
10146 		if (stat_idx[i] == -1) {
10147 			continue;
10148 		}
10149 
10150 		param = LE_64(lbuf[stat_idx[i]]);
10151 
10152 		if (SATA_STAT_SUPPORTED(param) && SATA_STAT_VALID(param)) {
10153 			BE_OUT64(paramp, PARAM_VAL(param));
10154 			nvalid++;
10155 		}
10156 	}
10157 #undef PARAM_VAL
10158 
10159 	kmem_free(lbuf, 512);
10160 
10161 	/* We must return at least one valid value for this page */
10162 	if (nvalid == 0)
10163 		return (-1);
10164 
10165 	/*
10166 	 * SPC-5 says that the IDLE TIME and TIME INTERVAL parameters
10167 	 * are mandatory, but SAT-5 gives no mention of either parameter.
10168 	 * Some utilities (e.g. sg3_utils) strictly follow the guidance of
10169 	 * SPC-5 and expect all three parameters, so we generate dummy
10170 	 * values for the IDLE TIME and TIME INTERVAL parameters.
10171 	 */
10172 	lpp = log_param_next(lpp);
10173 
10174 	/* IDLE TIME */
10175 	lpp->param_code[0] = 0x00;
10176 	lpp->param_code[1] = 0x02;
10177 	lpp->param_ctrl_flags = LOG_CTRL_LP;
10178 	lpp->param_len = 0x08;
10179 
10180 	/*
10181 	 * The value is an 64-bit unsigned int, the address is almost
10182 	 * certainly going to be unaligned, so just set each byte
10183 	 * individually.
10184 	 */
10185 	lpp->param_values[0] = lpp->param_values[1] = lpp->param_values[2] =
10186 	    lpp->param_values[3] = lpp->param_values[4] =
10187 	    lpp->param_values[5] = lpp->param_values[6] =
10188 	    lpp->param_values[7] = 0;
10189 	lpp = log_param_next(lpp);
10190 
10191 	/* TIME INTERVAL */
10192 	lpp->param_code[0] = 0x00;
10193 	lpp->param_code[1] = 0x03;
10194 	lpp->param_ctrl_flags = LOG_CTRL_LP | LOG_CTRL_LBIN;
10195 	lpp->param_len = 0x08;
10196 
10197 	uint32_t *vp = (uint32_t *)&lpp->param_values;
10198 
10199 	/*
10200 	 * SPC-5 7.3.6.7 -- The TIME INTERVAL parameter consists of
10201 	 * two 32-bit unsigned ints -- EXPONENT and INTEGER.
10202 	 * EXPONENT is the _negative_ power of ten (e.g. '3' implies
10203 	 * 10^-3) and INTEGER is the mantissa (e.g. the actual value
10204 	 * is INTEGER * 10^(-EXPONENT)).
10205 	 *
10206 	 * SPC-5 isn't completely clear on this, but from the description
10207 	 * of the fields of the General Access Statistics and Performance
10208 	 * log parameter in section 7.3.9.2, it implies that the TIME INTERVAL
10209 	 * parameter is used to in conjunction with the {READ,WRITE} COMMAND
10210 	 * PROCESSING INTERVAL statistics value. Since these values do not
10211 	 * have a translation defined (there doesn't appear to be any
10212 	 * equivalent statistic in any SATA log page), we always return
10213 	 * 0 for these stats. As a TIME INTERVAL of 0^-0 would be nonsensical
10214 	 * (and mathematically undefined), we choose an arbitrary interval of
10215 	 * 1ms (1 * 10^-3).
10216 	 */
10217 	BE_OUT32(vp, 3);
10218 	vp++;
10219 	BE_OUT32(vp, 1);
10220 
10221 	lpp = log_param_next(lpp);
10222 
10223 	return (log_param_size(lpp, buf));
10224 }
10225 
10226 
10227 /*
10228  * This function was used for build a ATA read verify sector command
10229  */
10230 static void
sata_build_read_verify_cmd(sata_cmd_t * scmd,uint16_t sec,uint64_t lba)10231 sata_build_read_verify_cmd(sata_cmd_t *scmd, uint16_t sec, uint64_t lba)
10232 {
10233 	scmd->satacmd_cmd_reg = SATAC_RDVER;
10234 	scmd->satacmd_addr_type = ATA_ADDR_LBA28;
10235 	scmd->satacmd_flags.sata_special_regs = B_TRUE;
10236 
10237 	scmd->satacmd_sec_count_lsb = sec & 0xff;
10238 	scmd->satacmd_lba_low_lsb = lba & 0xff;
10239 	scmd->satacmd_lba_mid_lsb = (lba >> 8) & 0xff;
10240 	scmd->satacmd_lba_high_lsb = (lba >> 16) & 0xff;
10241 	scmd->satacmd_device_reg = (SATA_ADH_LBA | ((lba >> 24) & 0xf));
10242 	scmd->satacmd_features_reg = 0;
10243 	scmd->satacmd_status_reg = 0;
10244 	scmd->satacmd_error_reg = 0;
10245 }
10246 
10247 /*
10248  * This function was used for building an ATA
10249  * command, and only command register need to
10250  * be defined, other register will be zero or na.
10251  */
10252 static void
sata_build_generic_cmd(sata_cmd_t * scmd,uint8_t cmd)10253 sata_build_generic_cmd(sata_cmd_t *scmd, uint8_t cmd)
10254 {
10255 	scmd->satacmd_addr_type = 0;
10256 	scmd->satacmd_cmd_reg = cmd;
10257 	scmd->satacmd_device_reg = 0;
10258 	scmd->satacmd_sec_count_lsb = 0;
10259 	scmd->satacmd_lba_low_lsb = 0;
10260 	scmd->satacmd_lba_mid_lsb = 0;
10261 	scmd->satacmd_lba_high_lsb = 0;
10262 	scmd->satacmd_features_reg = 0;
10263 	scmd->satacmd_status_reg = 0;
10264 	scmd->satacmd_error_reg = 0;
10265 	scmd->satacmd_flags.sata_special_regs = B_TRUE;
10266 }
10267 
10268 /*
10269  * This function was used for changing the standby
10270  * timer format from SCSI to ATA.
10271  */
10272 static uint8_t
sata_get_standby_timer(uint8_t * timer)10273 sata_get_standby_timer(uint8_t *timer)
10274 {
10275 	uint32_t i = 0, count = 0;
10276 	uint8_t ata_count;
10277 
10278 	for (i = 0; i < 4; i++) {
10279 		count = count << 8 | timer[i];
10280 	}
10281 
10282 	if (count == 0)
10283 		return (0);
10284 
10285 	if (count >= 1 && count <= 12000)
10286 		ata_count = (count -1) / 50 + 1;
10287 	else if (count > 12000 && count <= 12600)
10288 		ata_count = 0xfc;
10289 	else if (count > 12601 && count <= 12750)
10290 		ata_count = 0xff;
10291 	else if (count > 12750 && count <= 17999)
10292 		ata_count = 0xf1;
10293 	else if (count > 18000 && count <= 198000)
10294 		ata_count = count / 18000 + 240;
10295 	else
10296 		ata_count = 0xfd;
10297 	return (ata_count);
10298 }
10299 
10300 /* ************************** ATAPI-SPECIFIC FUNCTIONS ********************** */
10301 
10302 /*
10303  * Start command for ATAPI device.
10304  * This function processes scsi_pkt requests.
10305  * Now CD/DVD, tape and ATAPI disk devices are supported.
10306  * Most commands are packet without any translation into Packet Command.
10307  * Some may be trapped and executed as SATA commands (not clear which one).
10308  *
10309  * Returns TRAN_ACCEPT if command is accepted for execution (or completed
10310  * execution).
10311  * Returns other TRAN_XXXX codes if command is not accepted or completed
10312  * (see return values for sata_hba_start()).
10313  *
10314  * Note:
10315  * Inquiry cdb format differs between transport version 2 and 3.
10316  * However, the transport version 3 devices that were checked did not adhere
10317  * to the specification (ignored MSB of the allocation length). Therefore,
10318  * the transport version is not checked, but Inquiry allocation length is
10319  * truncated to 255 bytes if the original allocation length set-up by the
10320  * target driver is greater than 255 bytes.
10321  */
10322 static int
sata_txlt_atapi(sata_pkt_txlate_t * spx)10323 sata_txlt_atapi(sata_pkt_txlate_t *spx)
10324 {
10325 	struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
10326 	sata_cmd_t *scmd = &spx->txlt_sata_pkt->satapkt_cmd;
10327 	struct buf *bp = spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp;
10328 	sata_hba_inst_t *sata_hba = SATA_TXLT_HBA_INST(spx);
10329 	sata_drive_info_t *sdinfo = sata_get_device_info(sata_hba,
10330 	    &spx->txlt_sata_pkt->satapkt_device);
10331 	kmutex_t *cport_mutex = &(SATA_TXLT_CPORT_MUTEX(spx));
10332 	int cdblen;
10333 	int rval, reason;
10334 	int synch;
10335 	union scsi_cdb *cdbp = (union scsi_cdb *)scsipkt->pkt_cdbp;
10336 
10337 	mutex_enter(cport_mutex);
10338 
10339 	if (((rval = sata_txlt_generic_pkt_info(spx, &reason, 0)) !=
10340 	    TRAN_ACCEPT) || (reason == CMD_DEV_GONE)) {
10341 		mutex_exit(cport_mutex);
10342 		return (rval);
10343 	}
10344 
10345 	/*
10346 	 * ATAPI device executes some ATA commands in addition to those
10347 	 * commands sent via PACKET command. These ATA commands may be
10348 	 * executed by the regular SATA translation functions. None needs
10349 	 * to be captured now.
10350 	 *
10351 	 * Commands sent via PACKET command include:
10352 	 *	MMC command set for ATAPI CD/DVD device
10353 	 *	SSC command set for ATAPI TAPE device
10354 	 *	SBC command set for ATAPI disk device
10355 	 *
10356 	 */
10357 
10358 	/* Check the size of cdb */
10359 
10360 	switch (GETGROUP(cdbp)) {
10361 	case CDB_GROUPID_3:   /* Reserved, per SPC-4 */
10362 		/*
10363 		 * opcodes 0x7e and 0x7f identify variable-length CDBs and
10364 		 * therefore require special handling.  Return failure, for now.
10365 		 */
10366 		mutex_exit(cport_mutex);
10367 		return (TRAN_BADPKT);
10368 
10369 	case CDB_GROUPID_6:   /* Vendor-specific, per SPC-4 */
10370 	case CDB_GROUPID_7:   /* Vendor-specific, per SPC-4 */
10371 		/* obtain length from the scsi_pkt */
10372 		cdblen = scsipkt->pkt_cdblen;
10373 		break;
10374 
10375 	default:
10376 		/* CDB's length is statically known, per SPC-4 */
10377 		cdblen = scsi_cdb_size[GETGROUP(cdbp)];
10378 		break;
10379 	}
10380 
10381 	if (cdblen <= 0 || cdblen > sdinfo->satadrv_atapi_cdb_len) {
10382 		sata_log(NULL, CE_WARN,
10383 		    "sata: invalid ATAPI cdb length %d",
10384 		    cdblen);
10385 		mutex_exit(cport_mutex);
10386 		return (TRAN_BADPKT);
10387 	}
10388 
10389 	SATAATAPITRACE(spx, cdblen);
10390 
10391 	/*
10392 	 * For non-read/write commands we need to
10393 	 * map buffer
10394 	 */
10395 	switch ((uint_t)scsipkt->pkt_cdbp[0]) {
10396 	case SCMD_READ:
10397 	case SCMD_READ_G1:
10398 	case SCMD_READ_G5:
10399 	case SCMD_READ_G4:
10400 	case SCMD_WRITE:
10401 	case SCMD_WRITE_G1:
10402 	case SCMD_WRITE_G5:
10403 	case SCMD_WRITE_G4:
10404 		break;
10405 	default:
10406 		if (bp != NULL) {
10407 			if (bp->b_flags & (B_PHYS | B_PAGEIO))
10408 				bp_mapin(bp);
10409 		}
10410 		break;
10411 	}
10412 	/*
10413 	 * scmd->satacmd_flags.sata_data_direction default -
10414 	 * SATA_DIR_NODATA_XFER - is set by
10415 	 * sata_txlt_generic_pkt_info().
10416 	 */
10417 	if (scmd->satacmd_bp) {
10418 		if (scmd->satacmd_bp->b_flags & B_READ) {
10419 			scmd->satacmd_flags.sata_data_direction = SATA_DIR_READ;
10420 		} else {
10421 			scmd->satacmd_flags.sata_data_direction =
10422 			    SATA_DIR_WRITE;
10423 		}
10424 	}
10425 
10426 	/*
10427 	 * Set up ATAPI packet command.
10428 	 */
10429 
10430 	sata_atapi_packet_cmd_setup(scmd, sdinfo);
10431 
10432 	/* Copy cdb into sata_cmd */
10433 	scmd->satacmd_acdb_len = sdinfo->satadrv_atapi_cdb_len;
10434 	bzero(scmd->satacmd_acdb, SATA_ATAPI_MAX_CDB_LEN);
10435 	bcopy(cdbp, scmd->satacmd_acdb, cdblen);
10436 
10437 	/* See note in the command header */
10438 	if (scmd->satacmd_acdb[0] == SCMD_INQUIRY) {
10439 		if (scmd->satacmd_acdb[3] != 0)
10440 			scmd->satacmd_acdb[4] = 255;
10441 	}
10442 
10443 #ifdef SATA_DEBUG
10444 	if (sata_debug_flags & SATA_DBG_ATAPI) {
10445 		uint8_t *p = scmd->satacmd_acdb;
10446 		char buf[3 * SATA_ATAPI_MAX_CDB_LEN];
10447 
10448 		(void) snprintf(buf, SATA_ATAPI_MAX_CDB_LEN,
10449 		    "%02x %02x %02x %02x %02x %02x %02x %02x "
10450 		    "%2x %02x %02x %02x %02x %02x %02x %02x",
10451 		    p[0], p[1], p[2], p[3], p[4], p[5], p[6], p[7],
10452 		    p[8], p[9], p[10], p[11], p[12], p[13], p[14], p[15]);
10453 		buf[(3 * SATA_ATAPI_MAX_CDB_LEN) - 1] = '\0';
10454 		cmn_err(CE_NOTE, "ATAPI cdb: %s\n", buf);
10455 	}
10456 #endif
10457 
10458 	/*
10459 	 * Preset request sense data to NO SENSE.
10460 	 * If there is no way to get error information via Request Sense,
10461 	 * the packet request sense data would not have to be modified by HBA,
10462 	 * but it could be returned as is.
10463 	 */
10464 	bzero(scmd->satacmd_rqsense, SATA_ATAPI_RQSENSE_LEN);
10465 	sata_fixed_sense_data_preset(
10466 	    (struct scsi_extended_sense *)scmd->satacmd_rqsense);
10467 
10468 	if (!(spx->txlt_sata_pkt->satapkt_op_mode & SATA_OPMODE_SYNCH)) {
10469 		/* Need callback function */
10470 		spx->txlt_sata_pkt->satapkt_comp = sata_txlt_atapi_completion;
10471 		synch = FALSE;
10472 	} else
10473 		synch = TRUE;
10474 
10475 	/* Transfer command to HBA */
10476 	if (sata_hba_start(spx, &rval) != 0) {
10477 		/* Pkt not accepted for execution */
10478 		mutex_exit(cport_mutex);
10479 		return (rval);
10480 	}
10481 	mutex_exit(cport_mutex);
10482 	/*
10483 	 * If execution is non-synchronous,
10484 	 * a callback function will handle potential errors, translate
10485 	 * the response and will do a callback to a target driver.
10486 	 * If it was synchronous, use the same framework callback to check
10487 	 * an execution status.
10488 	 */
10489 	if (synch) {
10490 		SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
10491 		    "synchronous execution status %x\n",
10492 		    spx->txlt_sata_pkt->satapkt_reason);
10493 		sata_txlt_atapi_completion(spx->txlt_sata_pkt);
10494 	}
10495 	return (TRAN_ACCEPT);
10496 }
10497 
10498 
10499 /*
10500  * ATAPI Packet command completion.
10501  *
10502  * Failure of the command passed via Packet command are considered device
10503  * error. SATA HBA driver would have to retrieve error data (via Request
10504  * Sense command delivered via error retrieval sata packet) and copy it
10505  * to satacmd_rqsense array. From there, it is moved into scsi pkt sense data.
10506  */
10507 static void
sata_txlt_atapi_completion(sata_pkt_t * sata_pkt)10508 sata_txlt_atapi_completion(sata_pkt_t *sata_pkt)
10509 {
10510 	sata_pkt_txlate_t *spx =
10511 	    (sata_pkt_txlate_t *)sata_pkt->satapkt_framework_private;
10512 	struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
10513 	struct scsi_extended_sense *sense;
10514 	struct buf *bp;
10515 	int rval;
10516 
10517 #ifdef SATA_DEBUG
10518 	uint8_t *rqsp = sata_pkt->satapkt_cmd.satacmd_rqsense;
10519 #endif
10520 
10521 	scsipkt->pkt_state = STATE_GOT_BUS | STATE_GOT_TARGET |
10522 	    STATE_SENT_CMD | STATE_GOT_STATUS;
10523 
10524 	if (sata_pkt->satapkt_reason == SATA_PKT_COMPLETED) {
10525 		/* Normal completion */
10526 		if (sata_pkt->satapkt_cmd.satacmd_bp != NULL)
10527 			scsipkt->pkt_state |= STATE_XFERRED_DATA;
10528 		scsipkt->pkt_reason = CMD_CMPLT;
10529 		*scsipkt->pkt_scbp = STATUS_GOOD;
10530 		if (spx->txlt_tmp_buf != NULL) {
10531 			/* Temporary buffer was used */
10532 			bp = spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp;
10533 			if (bp->b_flags & B_READ) {
10534 				rval = ddi_dma_sync(
10535 				    spx->txlt_buf_dma_handle, 0, 0,
10536 				    DDI_DMA_SYNC_FORCPU);
10537 				ASSERT(rval == DDI_SUCCESS);
10538 				bcopy(spx->txlt_tmp_buf, bp->b_un.b_addr,
10539 				    bp->b_bcount);
10540 			}
10541 		}
10542 	} else {
10543 		/*
10544 		 * Something went wrong - analyze return
10545 		 */
10546 		*scsipkt->pkt_scbp = STATUS_CHECK;
10547 		sense = sata_arq_sense(spx);
10548 
10549 		if (sata_pkt->satapkt_reason == SATA_PKT_DEV_ERROR) {
10550 			/*
10551 			 * pkt_reason should be CMD_CMPLT for DEVICE ERROR.
10552 			 * Under this condition ERR bit is set for ATA command,
10553 			 * and CHK bit set for ATAPI command.
10554 			 *
10555 			 * Please check st_intr & sdintr about how pkt_reason
10556 			 * is used.
10557 			 */
10558 			scsipkt->pkt_reason = CMD_CMPLT;
10559 
10560 			/*
10561 			 * We may not have ARQ data if there was a double
10562 			 * error. But sense data in sata packet was pre-set
10563 			 * with NO SENSE so it is valid even if HBA could
10564 			 * not retrieve a real sense data.
10565 			 * Just copy this sense data into scsi pkt sense area.
10566 			 */
10567 			bcopy(sata_pkt->satapkt_cmd.satacmd_rqsense, sense,
10568 			    SATA_ATAPI_MIN_RQSENSE_LEN);
10569 #ifdef SATA_DEBUG
10570 			if (sata_debug_flags & SATA_DBG_SCSI_IF) {
10571 				sata_log(spx->txlt_sata_hba_inst, CE_WARN,
10572 				    "sata_txlt_atapi_completion: %02x\n"
10573 				    "RQSENSE:  %02x %02x %02x %02x %02x %02x "
10574 				    "          %02x %02x %02x %02x %02x %02x "
10575 				    "          %02x %02x %02x %02x %02x %02x\n",
10576 				    scsipkt->pkt_reason,
10577 				    rqsp[0], rqsp[1], rqsp[2], rqsp[3],
10578 				    rqsp[4], rqsp[5], rqsp[6], rqsp[7],
10579 				    rqsp[8], rqsp[9], rqsp[10], rqsp[11],
10580 				    rqsp[12], rqsp[13], rqsp[14], rqsp[15],
10581 				    rqsp[16], rqsp[17]);
10582 			}
10583 #endif
10584 		} else {
10585 			switch (sata_pkt->satapkt_reason) {
10586 			case SATA_PKT_PORT_ERROR:
10587 				/*
10588 				 * We have no device data.
10589 				 */
10590 				scsipkt->pkt_reason = CMD_INCOMPLETE;
10591 				scsipkt->pkt_state &= ~(STATE_GOT_BUS |
10592 				    STATE_GOT_TARGET | STATE_SENT_CMD |
10593 				    STATE_GOT_STATUS);
10594 				sense->es_key = KEY_HARDWARE_ERROR;
10595 				break;
10596 
10597 			case SATA_PKT_TIMEOUT:
10598 				scsipkt->pkt_reason = CMD_TIMEOUT;
10599 				scsipkt->pkt_statistics |=
10600 				    STAT_TIMEOUT | STAT_DEV_RESET;
10601 				/*
10602 				 * Need to check if HARDWARE_ERROR/
10603 				 * TIMEOUT_ON_LOGICAL_UNIT 4/3E/2 would be more
10604 				 * appropriate.
10605 				 */
10606 				break;
10607 
10608 			case SATA_PKT_ABORTED:
10609 				scsipkt->pkt_reason = CMD_ABORTED;
10610 				scsipkt->pkt_statistics |= STAT_ABORTED;
10611 				/* Should we set key COMMAND_ABPRTED? */
10612 				break;
10613 
10614 			case SATA_PKT_RESET:
10615 				scsipkt->pkt_reason = CMD_RESET;
10616 				scsipkt->pkt_statistics |= STAT_DEV_RESET;
10617 				/*
10618 				 * May be we should set Unit Attention /
10619 				 * Reset. Perhaps the same should be
10620 				 * returned for disks....
10621 				 */
10622 				sense->es_key = KEY_UNIT_ATTENTION;
10623 				sense->es_add_code = SD_SCSI_ASC_RESET;
10624 				break;
10625 
10626 			default:
10627 				SATA_LOG_D((spx->txlt_sata_hba_inst, CE_WARN,
10628 				    "sata_txlt_atapi_completion: "
10629 				    "invalid packet completion reason"));
10630 				scsipkt->pkt_reason = CMD_TRAN_ERR;
10631 				scsipkt->pkt_state &= ~(STATE_GOT_BUS |
10632 				    STATE_GOT_TARGET | STATE_SENT_CMD |
10633 				    STATE_GOT_STATUS);
10634 				break;
10635 			}
10636 		}
10637 	}
10638 
10639 	SATAATAPITRACE(spx, 0);
10640 
10641 	if ((scsipkt->pkt_flags & FLAG_NOINTR) == 0 &&
10642 	    scsipkt->pkt_comp != NULL) {
10643 		/* scsi callback required */
10644 		(*scsipkt->pkt_comp)(scsipkt);
10645 	}
10646 }
10647 
10648 /*
10649  * Set up error retrieval sata command for ATAPI Packet Command error data
10650  * recovery.
10651  *
10652  * Returns SATA_SUCCESS when data buffer is allocated and packet set-up,
10653  * returns SATA_FAILURE otherwise.
10654  */
10655 
10656 static int
sata_atapi_err_ret_cmd_setup(sata_pkt_txlate_t * spx,sata_drive_info_t * sdinfo)10657 sata_atapi_err_ret_cmd_setup(sata_pkt_txlate_t *spx, sata_drive_info_t *sdinfo)
10658 {
10659 	sata_pkt_t *spkt = spx->txlt_sata_pkt;
10660 	sata_cmd_t *scmd;
10661 	struct buf *bp;
10662 
10663 	/*
10664 	 * Allocate dma-able buffer error data.
10665 	 * Buffer allocation will take care of buffer alignment and other DMA
10666 	 * attributes.
10667 	 */
10668 	bp = sata_alloc_local_buffer(spx, SATA_ATAPI_MIN_RQSENSE_LEN);
10669 	if (bp == NULL) {
10670 		SATADBG1(SATA_DBG_ATAPI, spx->txlt_sata_hba_inst,
10671 		    "sata_get_err_retrieval_pkt: "
10672 		    "cannot allocate buffer for error data", NULL);
10673 		return (SATA_FAILURE);
10674 	}
10675 	bp_mapin(bp); /* make data buffer accessible */
10676 
10677 	/* Operation modes are up to the caller */
10678 	spkt->satapkt_op_mode = SATA_OPMODE_SYNCH | SATA_OPMODE_INTERRUPTS;
10679 
10680 	/* Synchronous mode, no callback - may be changed by the caller */
10681 	spkt->satapkt_comp = NULL;
10682 	spkt->satapkt_time = sata_default_pkt_time;
10683 
10684 	scmd = &spkt->satapkt_cmd;
10685 	scmd->satacmd_flags.sata_data_direction = SATA_DIR_READ;
10686 	scmd->satacmd_flags.sata_ignore_dev_reset = B_TRUE;
10687 
10688 	sata_atapi_packet_cmd_setup(scmd, sdinfo);
10689 
10690 	/*
10691 	 * Set-up acdb. Request Sense CDB (packet command content) is
10692 	 * not in DMA-able buffer. Its handling is HBA-specific (how
10693 	 * it is transfered into packet FIS).
10694 	 */
10695 	scmd->satacmd_acdb_len = sdinfo->satadrv_atapi_cdb_len;
10696 	bcopy(sata_rqsense_cdb, scmd->satacmd_acdb, SATA_ATAPI_RQSENSE_CDB_LEN);
10697 	/* Following zeroing of pad bytes may not be necessary */
10698 	bzero(&scmd->satacmd_acdb[SATA_ATAPI_RQSENSE_CDB_LEN],
10699 	    sdinfo->satadrv_atapi_cdb_len - SATA_ATAPI_RQSENSE_CDB_LEN);
10700 
10701 	/*
10702 	 * Set-up pointer to the buffer handle, so HBA can sync buffer
10703 	 * before accessing it. Handle is in usual place in translate struct.
10704 	 */
10705 	scmd->satacmd_err_ret_buf_handle = &spx->txlt_buf_dma_handle;
10706 
10707 	/*
10708 	 * Preset request sense data to NO SENSE.
10709 	 * Here it is redundant, only for a symetry with scsi-originated
10710 	 * packets. It should not be used for anything but debugging.
10711 	 */
10712 	bzero(scmd->satacmd_rqsense, SATA_ATAPI_RQSENSE_LEN);
10713 	sata_fixed_sense_data_preset(
10714 	    (struct scsi_extended_sense *)scmd->satacmd_rqsense);
10715 
10716 	ASSERT(scmd->satacmd_num_dma_cookies != 0);
10717 	ASSERT(scmd->satacmd_dma_cookie_list != NULL);
10718 
10719 	return (SATA_SUCCESS);
10720 }
10721 
10722 /*
10723  * Set-up ATAPI packet command.
10724  * Data transfer direction has to be set-up in sata_cmd structure prior to
10725  * calling this function.
10726  *
10727  * Returns void
10728  */
10729 
10730 static void
sata_atapi_packet_cmd_setup(sata_cmd_t * scmd,sata_drive_info_t * sdinfo)10731 sata_atapi_packet_cmd_setup(sata_cmd_t *scmd, sata_drive_info_t *sdinfo)
10732 {
10733 	scmd->satacmd_addr_type = 0;		/* N/A */
10734 	scmd->satacmd_sec_count_lsb = 0;	/* no tag */
10735 	scmd->satacmd_lba_low_lsb = 0;		/* N/A */
10736 	scmd->satacmd_lba_mid_lsb = (uint8_t)SATA_ATAPI_MAX_BYTES_PER_DRQ;
10737 	scmd->satacmd_lba_high_lsb =
10738 	    (uint8_t)(SATA_ATAPI_MAX_BYTES_PER_DRQ >> 8);
10739 	scmd->satacmd_cmd_reg = SATAC_PACKET;	/* Command */
10740 
10741 	/*
10742 	 * We want all data to be transfered via DMA.
10743 	 * But specify it only if drive supports DMA and DMA mode is
10744 	 * selected - some drives are sensitive about it.
10745 	 * Hopefully it wil work for all drives....
10746 	 */
10747 	if (sdinfo->satadrv_settings & SATA_DEV_DMA)
10748 		scmd->satacmd_features_reg = SATA_ATAPI_F_DMA;
10749 
10750 	/*
10751 	 * Features register requires special care for devices that use
10752 	 * Serial ATA bridge - they need an explicit specification of
10753 	 * the data transfer direction for Packet DMA commands.
10754 	 * Setting this bit is harmless if DMA is not used.
10755 	 *
10756 	 * Many drives do not implement word 80, specifying what ATA/ATAPI
10757 	 * spec they follow.
10758 	 * We are arbitrarily following the latest SerialATA 2.6 spec,
10759 	 * which uses ATA/ATAPI 6 specification for Identify Data, unless
10760 	 * ATA/ATAPI-7 support is explicitly indicated.
10761 	 */
10762 	if (sdinfo->satadrv_id.ai_majorversion != 0 &&
10763 	    sdinfo->satadrv_id.ai_majorversion != 0xffff &&
10764 	    (sdinfo->satadrv_id.ai_majorversion & SATA_MAJVER_7) != 0) {
10765 		/*
10766 		 * Specification of major version is valid and version 7
10767 		 * is supported. It does automatically imply that all
10768 		 * spec features are supported. For now, we assume that
10769 		 * DMADIR setting is valid. ATA/ATAPI7 spec is incomplete.
10770 		 */
10771 		if ((sdinfo->satadrv_id.ai_dirdma &
10772 		    SATA_ATAPI_ID_DMADIR_REQ) != 0) {
10773 			if (scmd->satacmd_flags.sata_data_direction ==
10774 			    SATA_DIR_READ) {
10775 				scmd->satacmd_features_reg |=
10776 				    SATA_ATAPI_F_DATA_DIR_READ;
10777 			}
10778 		}
10779 	}
10780 }
10781 
10782 
10783 #ifdef SATA_DEBUG
10784 
10785 /* Display 18 bytes of Inquiry data */
10786 static void
sata_show_inqry_data(uint8_t * buf)10787 sata_show_inqry_data(uint8_t *buf)
10788 {
10789 	struct scsi_inquiry *inq = (struct scsi_inquiry *)buf;
10790 	uint8_t *p;
10791 
10792 	cmn_err(CE_NOTE, "Inquiry data:");
10793 	cmn_err(CE_NOTE, "device type %x", inq->inq_dtype);
10794 	cmn_err(CE_NOTE, "removable media %x", inq->inq_rmb);
10795 	cmn_err(CE_NOTE, "version %x", inq->inq_ansi);
10796 	cmn_err(CE_NOTE, "ATAPI transport version %d",
10797 	    SATA_ATAPI_TRANS_VERSION(inq));
10798 	cmn_err(CE_NOTE, "response data format %d, aenc %d",
10799 	    inq->inq_rdf, inq->inq_aenc);
10800 	cmn_err(CE_NOTE, " additional length %d", inq->inq_len);
10801 	cmn_err(CE_NOTE, "tpgs %d", inq->inq_tpgs);
10802 	p = (uint8_t *)inq->inq_vid;
10803 	cmn_err(CE_NOTE, "vendor id (binary): %02x %02x %02x %02x "
10804 	    "%02x %02x %02x %02x",
10805 	    p[0], p[1], p[2], p[3], p[4], p[5], p[6], p[7]);
10806 	p = (uint8_t *)inq->inq_vid;
10807 	cmn_err(CE_NOTE, "vendor id: %c %c %c %c %c %c %c %c",
10808 	    p[0], p[1], p[2], p[3], p[4], p[5], p[6], p[7]);
10809 
10810 	p = (uint8_t *)inq->inq_pid;
10811 	cmn_err(CE_NOTE, "product id (binary): %02x %02x %02x %02x "
10812 	    "%02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x",
10813 	    p[0], p[1], p[2], p[3], p[4], p[5], p[6], p[7],
10814 	    p[8], p[9], p[10], p[11], p[12], p[13], p[14], p[15]);
10815 	p = (uint8_t *)inq->inq_pid;
10816 	cmn_err(CE_NOTE, "product id: %c %c %c %c %c %c %c %c "
10817 	    "%c %c %c %c %c %c %c %c",
10818 	    p[0], p[1], p[2], p[3], p[4], p[5], p[6], p[7],
10819 	    p[8], p[9], p[10], p[11], p[12], p[13], p[14], p[15]);
10820 
10821 	p = (uint8_t *)inq->inq_revision;
10822 	cmn_err(CE_NOTE, "revision (binary): %02x %02x %02x %02x",
10823 	    p[0], p[1], p[2], p[3]);
10824 	p = (uint8_t *)inq->inq_revision;
10825 	cmn_err(CE_NOTE, "revision: %c %c %c %c",
10826 	    p[0], p[1], p[2], p[3]);
10827 
10828 }
10829 
10830 
10831 static void
sata_save_atapi_trace(sata_pkt_txlate_t * spx,int count)10832 sata_save_atapi_trace(sata_pkt_txlate_t *spx, int count)
10833 {
10834 	struct scsi_pkt *scsi_pkt = spx->txlt_scsi_pkt;
10835 
10836 	if (scsi_pkt == NULL)
10837 		return;
10838 	if (count != 0) {
10839 		/* saving cdb */
10840 		bzero(sata_atapi_trace[sata_atapi_trace_index].acdb,
10841 		    SATA_ATAPI_MAX_CDB_LEN);
10842 		bcopy(scsi_pkt->pkt_cdbp,
10843 		    sata_atapi_trace[sata_atapi_trace_index].acdb, count);
10844 	} else {
10845 		bcopy(&((struct scsi_arq_status *)scsi_pkt->pkt_scbp)->
10846 		    sts_sensedata,
10847 		    sata_atapi_trace[sata_atapi_trace_index].arqs,
10848 		    SATA_ATAPI_MIN_RQSENSE_LEN);
10849 		sata_atapi_trace[sata_atapi_trace_index].scsi_pkt_reason =
10850 		    scsi_pkt->pkt_reason;
10851 		sata_atapi_trace[sata_atapi_trace_index].sata_pkt_reason =
10852 		    spx->txlt_sata_pkt->satapkt_reason;
10853 
10854 		if (++sata_atapi_trace_index >= 64)
10855 			sata_atapi_trace_index = 0;
10856 	}
10857 }
10858 
10859 #endif
10860 
10861 /*
10862  * Fetch inquiry data from ATAPI device
10863  * Returns SATA_SUCCESS if operation was successful, SATA_FAILURE otherwise.
10864  *
10865  * Note:
10866  * inqb pointer does not point to a DMA-able buffer. It is a local buffer
10867  * where the caller expects to see the inquiry data.
10868  *
10869  */
10870 
10871 static int
sata_get_atapi_inquiry_data(sata_hba_inst_t * sata_hba,sata_address_t * saddr,struct scsi_inquiry * inq)10872 sata_get_atapi_inquiry_data(sata_hba_inst_t *sata_hba,
10873     sata_address_t *saddr, struct scsi_inquiry *inq)
10874 {
10875 	sata_pkt_txlate_t *spx;
10876 	sata_pkt_t *spkt;
10877 	struct buf *bp;
10878 	sata_drive_info_t *sdinfo;
10879 	sata_cmd_t *scmd;
10880 	int rval;
10881 	uint8_t *rqsp;
10882 	dev_info_t *dip = SATA_DIP(sata_hba);
10883 #ifdef SATA_DEBUG
10884 	char msg_buf[MAXPATHLEN];
10885 #endif
10886 	kmutex_t *cport_mutex;
10887 
10888 	ASSERT(sata_hba != NULL);
10889 
10890 	spx = kmem_zalloc(sizeof (sata_pkt_txlate_t), KM_SLEEP);
10891 	spx->txlt_sata_hba_inst = sata_hba;
10892 	spx->txlt_scsi_pkt = NULL;		/* No scsi pkt involved */
10893 	spkt = sata_pkt_alloc(spx, NULL);
10894 	if (spkt == NULL) {
10895 		kmem_free(spx, sizeof (sata_pkt_txlate_t));
10896 		return (SATA_FAILURE);
10897 	}
10898 	/* address is needed now */
10899 	spkt->satapkt_device.satadev_addr = *saddr;
10900 
10901 	/* scsi_inquiry size buffer */
10902 	bp = sata_alloc_local_buffer(spx, sizeof (struct scsi_inquiry));
10903 	if (bp == NULL) {
10904 		sata_pkt_free(spx);
10905 		kmem_free(spx, sizeof (sata_pkt_txlate_t));
10906 		SATA_LOG_D((sata_hba, CE_WARN,
10907 		    "sata_get_atapi_inquiry_data: "
10908 		    "cannot allocate data buffer"));
10909 		return (SATA_FAILURE);
10910 	}
10911 	bp_mapin(bp); /* make data buffer accessible */
10912 
10913 	scmd = &spkt->satapkt_cmd;
10914 	ASSERT(scmd->satacmd_num_dma_cookies != 0);
10915 	ASSERT(scmd->satacmd_dma_cookie_list != NULL);
10916 
10917 	/* Use synchronous mode */
10918 	spkt->satapkt_op_mode = SATA_OPMODE_SYNCH | SATA_OPMODE_INTERRUPTS;
10919 	spkt->satapkt_comp = NULL;
10920 	spkt->satapkt_time = sata_default_pkt_time;
10921 
10922 	/* Issue inquiry command - 6 bytes cdb, data transfer, read */
10923 
10924 	scmd->satacmd_flags.sata_data_direction = SATA_DIR_READ;
10925 	scmd->satacmd_flags.sata_ignore_dev_reset = B_TRUE;
10926 
10927 	cport_mutex = &(SATA_CPORT_MUTEX(sata_hba, saddr->cport));
10928 	mutex_enter(cport_mutex);
10929 	sdinfo = sata_get_device_info(sata_hba,
10930 	    &spx->txlt_sata_pkt->satapkt_device);
10931 	if (sdinfo == NULL) {
10932 		/* we have to be carefull about the disapearing device */
10933 		mutex_exit(cport_mutex);
10934 		rval = SATA_FAILURE;
10935 		goto cleanup;
10936 	}
10937 	sata_atapi_packet_cmd_setup(scmd, sdinfo);
10938 
10939 	/*
10940 	 * Set-up acdb. This works for atapi transport version 2 and later.
10941 	 */
10942 	scmd->satacmd_acdb_len = sdinfo->satadrv_atapi_cdb_len;
10943 	bzero(scmd->satacmd_acdb, SATA_ATAPI_MAX_CDB_LEN);
10944 	scmd->satacmd_acdb[0] = 0x12;	/* Inquiry */
10945 	scmd->satacmd_acdb[1] = 0x00;
10946 	scmd->satacmd_acdb[2] = 0x00;
10947 	scmd->satacmd_acdb[3] = 0x00;
10948 	scmd->satacmd_acdb[4] = sizeof (struct scsi_inquiry);
10949 	scmd->satacmd_acdb[5] = 0x00;
10950 
10951 	sata_fixed_sense_data_preset(
10952 	    (struct scsi_extended_sense *)scmd->satacmd_rqsense);
10953 
10954 	/* Transfer command to HBA */
10955 	if (sata_hba_start(spx, &rval) != 0) {
10956 		/* Pkt not accepted for execution */
10957 		SATADBG1(SATA_DBG_ATAPI, sata_hba,
10958 		    "sata_get_atapi_inquiry_data: "
10959 		    "Packet not accepted for execution - ret: %02x", rval);
10960 		mutex_exit(cport_mutex);
10961 		rval = SATA_FAILURE;
10962 		goto cleanup;
10963 	}
10964 	mutex_exit(cport_mutex);
10965 
10966 	if (spkt->satapkt_reason == SATA_PKT_COMPLETED) {
10967 		SATADBG1(SATA_DBG_ATAPI, sata_hba,
10968 		    "sata_get_atapi_inquiry_data: "
10969 		    "Packet completed successfully - ret: %02x", rval);
10970 		if (spx->txlt_buf_dma_handle != NULL) {
10971 			/*
10972 			 * Sync buffer. Handle is in usual place in translate
10973 			 * struct.
10974 			 */
10975 			rval = ddi_dma_sync(spx->txlt_buf_dma_handle, 0, 0,
10976 			    DDI_DMA_SYNC_FORCPU);
10977 			ASSERT(rval == DDI_SUCCESS);
10978 		}
10979 
10980 		if (sata_check_for_dma_error(dip, spx)) {
10981 			ddi_fm_service_impact(dip, DDI_SERVICE_UNAFFECTED);
10982 			rval = SATA_FAILURE;
10983 		} else {
10984 			/*
10985 			 * Normal completion - copy data into caller's buffer
10986 			 */
10987 			bcopy(bp->b_un.b_addr, (uint8_t *)inq,
10988 			    sizeof (struct scsi_inquiry));
10989 #ifdef SATA_DEBUG
10990 			if (sata_debug_flags & SATA_DBG_ATAPI) {
10991 				sata_show_inqry_data((uint8_t *)inq);
10992 			}
10993 #endif
10994 			rval = SATA_SUCCESS;
10995 		}
10996 	} else {
10997 		/*
10998 		 * Something went wrong - analyze return - check rqsense data
10999 		 */
11000 		rval = SATA_FAILURE;
11001 		if (spkt->satapkt_reason == SATA_PKT_DEV_ERROR) {
11002 			/*
11003 			 * ARQ data hopefull show something other than NO SENSE
11004 			 */
11005 			rqsp = scmd->satacmd_rqsense;
11006 #ifdef SATA_DEBUG
11007 			if (sata_debug_flags & SATA_DBG_ATAPI) {
11008 				msg_buf[0] = '\0';
11009 				(void) snprintf(msg_buf, MAXPATHLEN,
11010 				    "ATAPI packet completion reason: %02x\n"
11011 				    "RQSENSE:  %02x %02x %02x %02x %02x %02x\n"
11012 				    "          %02x %02x %02x %02x %02x %02x\n"
11013 				    "          %02x %02x %02x %02x %02x %02x",
11014 				    spkt->satapkt_reason,
11015 				    rqsp[0], rqsp[1], rqsp[2], rqsp[3],
11016 				    rqsp[4], rqsp[5], rqsp[6], rqsp[7],
11017 				    rqsp[8], rqsp[9], rqsp[10], rqsp[11],
11018 				    rqsp[12], rqsp[13], rqsp[14], rqsp[15],
11019 				    rqsp[16], rqsp[17]);
11020 				sata_log(spx->txlt_sata_hba_inst, CE_WARN,
11021 				    "%s", msg_buf);
11022 			}
11023 #endif
11024 		} else {
11025 			switch (spkt->satapkt_reason) {
11026 			case SATA_PKT_PORT_ERROR:
11027 				SATADBG1(SATA_DBG_ATAPI, sata_hba,
11028 				    "sata_get_atapi_inquiry_data: "
11029 				    "packet reason: port error", NULL);
11030 				break;
11031 
11032 			case SATA_PKT_TIMEOUT:
11033 				SATADBG1(SATA_DBG_ATAPI, sata_hba,
11034 				    "sata_get_atapi_inquiry_data: "
11035 				    "packet reason: timeout", NULL);
11036 				break;
11037 
11038 			case SATA_PKT_ABORTED:
11039 				SATADBG1(SATA_DBG_ATAPI, sata_hba,
11040 				    "sata_get_atapi_inquiry_data: "
11041 				    "packet reason: aborted", NULL);
11042 				break;
11043 
11044 			case SATA_PKT_RESET:
11045 				SATADBG1(SATA_DBG_ATAPI, sata_hba,
11046 				    "sata_get_atapi_inquiry_data: "
11047 				    "packet reason: reset\n", NULL);
11048 				break;
11049 			default:
11050 				SATADBG1(SATA_DBG_ATAPI, sata_hba,
11051 				    "sata_get_atapi_inquiry_data: "
11052 				    "invalid packet reason: %02x\n",
11053 				    spkt->satapkt_reason);
11054 				break;
11055 			}
11056 		}
11057 	}
11058 cleanup:
11059 	sata_free_local_buffer(spx);
11060 	sata_pkt_free(spx);
11061 	kmem_free(spx, sizeof (sata_pkt_txlate_t));
11062 	return (rval);
11063 }
11064 
11065 
11066 
11067 
11068 
11069 #if 0
11070 #ifdef SATA_DEBUG
11071 
11072 /*
11073  * Test ATAPI packet command.
11074  * Single threaded test: send packet command in synch mode, process completion
11075  *
11076  */
11077 static void
11078 sata_test_atapi_packet_command(sata_hba_inst_t *sata_hba_inst, int cport)
11079 {
11080 	sata_pkt_txlate_t *spx;
11081 	sata_pkt_t *spkt;
11082 	struct buf *bp;
11083 	sata_device_t sata_device;
11084 	sata_drive_info_t *sdinfo;
11085 	sata_cmd_t *scmd;
11086 	int rval;
11087 	uint8_t *rqsp;
11088 
11089 	ASSERT(sata_hba_inst != NULL);
11090 	sata_device.satadev_addr.cport = cport;
11091 	sata_device.satadev_addr.pmport = 0;
11092 	sata_device.satadev_addr.qual = SATA_ADDR_DCPORT;
11093 	sata_device.satadev_rev = SATA_DEVICE_REV;
11094 	mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, cport)->cport_mutex);
11095 	sdinfo = sata_get_device_info(sata_hba_inst, &sata_device);
11096 	mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, cport)->cport_mutex);
11097 	if (sdinfo == NULL) {
11098 		sata_log(sata_hba_inst, CE_WARN,
11099 		    "sata_test_atapi_packet_command: "
11100 		    "no device info for cport %d",
11101 		    sata_device.satadev_addr.cport);
11102 		return;
11103 	}
11104 
11105 	spx = kmem_zalloc(sizeof (sata_pkt_txlate_t), KM_SLEEP);
11106 	spx->txlt_sata_hba_inst = sata_hba_inst;
11107 	spx->txlt_scsi_pkt = NULL;		/* No scsi pkt involved */
11108 	spkt = sata_pkt_alloc(spx, NULL);
11109 	if (spkt == NULL) {
11110 		kmem_free(spx, sizeof (sata_pkt_txlate_t));
11111 		return;
11112 	}
11113 	/* address is needed now */
11114 	spkt->satapkt_device.satadev_addr = sata_device.satadev_addr;
11115 
11116 	/* 1024k buffer */
11117 	bp = sata_alloc_local_buffer(spx, 1024);
11118 	if (bp == NULL) {
11119 		sata_pkt_free(spx);
11120 		kmem_free(spx, sizeof (sata_pkt_txlate_t));
11121 		sata_log(sata_hba_inst, CE_WARN,
11122 		    "sata_test_atapi_packet_command: "
11123 		    "cannot allocate data buffer");
11124 		return;
11125 	}
11126 	bp_mapin(bp); /* make data buffer accessible */
11127 
11128 	scmd = &spkt->satapkt_cmd;
11129 	ASSERT(scmd->satacmd_num_dma_cookies != 0);
11130 	ASSERT(scmd->satacmd_dma_cookie_list != NULL);
11131 
11132 	/* Use synchronous mode */
11133 	spkt->satapkt_op_mode = SATA_OPMODE_SYNCH | SATA_OPMODE_INTERRUPTS;
11134 
11135 	/* Synchronous mode, no callback - may be changed by the caller */
11136 	spkt->satapkt_comp = NULL;
11137 	spkt->satapkt_time = sata_default_pkt_time;
11138 
11139 	/* Issue inquiry command - 6 bytes cdb, data transfer, read */
11140 
11141 	scmd->satacmd_flags.sata_data_direction = SATA_DIR_READ;
11142 	scmd->satacmd_flags.sata_ignore_dev_reset = B_TRUE;
11143 
11144 	sata_atapi_packet_cmd_setup(scmd, sdinfo);
11145 
11146 	/* Set-up acdb. */
11147 	scmd->satacmd_acdb_len = sdinfo->satadrv_atapi_cdb_len;
11148 	bzero(scmd->satacmd_acdb, SATA_ATAPI_MAX_CDB_LEN);
11149 	scmd->satacmd_acdb[0] = 0x12;	/* Inquiry */
11150 	scmd->satacmd_acdb[1] = 0x00;
11151 	scmd->satacmd_acdb[2] = 0x00;
11152 	scmd->satacmd_acdb[3] = 0x00;
11153 	scmd->satacmd_acdb[4] = sizeof (struct scsi_inquiry);
11154 	scmd->satacmd_acdb[5] = 0x00;
11155 
11156 	sata_fixed_sense_data_preset(
11157 	    (struct scsi_extended_sense *)scmd->satacmd_rqsense);
11158 
11159 	/* Transfer command to HBA */
11160 	mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, cport)->cport_mutex);
11161 	if (sata_hba_start(spx, &rval) != 0) {
11162 		/* Pkt not accepted for execution */
11163 		sata_log(sata_hba_inst, CE_WARN,
11164 		    "sata_test_atapi_packet_command: "
11165 		    "Packet not accepted for execution - ret: %02x", rval);
11166 		mutex_exit(
11167 		    &SATA_CPORT_INFO(sata_hba_inst, cport)->cport_mutex);
11168 		goto cleanup;
11169 	}
11170 	mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, cport)->cport_mutex);
11171 
11172 	if (spx->txlt_buf_dma_handle != NULL) {
11173 		/*
11174 		 * Sync buffer. Handle is in usual place in translate struct.
11175 		 */
11176 		rval = ddi_dma_sync(spx->txlt_buf_dma_handle, 0, 0,
11177 		    DDI_DMA_SYNC_FORCPU);
11178 		ASSERT(rval == DDI_SUCCESS);
11179 	}
11180 	if (spkt->satapkt_reason == SATA_PKT_COMPLETED) {
11181 		sata_log(sata_hba_inst, CE_WARN,
11182 		    "sata_test_atapi_packet_command: "
11183 		    "Packet completed successfully");
11184 		/*
11185 		 * Normal completion - show inquiry data
11186 		 */
11187 		sata_show_inqry_data((uint8_t *)bp->b_un.b_addr);
11188 	} else {
11189 		/*
11190 		 * Something went wrong - analyze return - check rqsense data
11191 		 */
11192 		if (spkt->satapkt_reason == SATA_PKT_DEV_ERROR) {
11193 			/*
11194 			 * ARQ data hopefull show something other than NO SENSE
11195 			 */
11196 			rqsp = scmd->satacmd_rqsense;
11197 			sata_log(spx->txlt_sata_hba_inst, CE_WARN,
11198 			    "ATAPI packet completion reason: %02x\n"
11199 			    "RQSENSE:  %02x %02x %02x %02x %02x %02x "
11200 			    "          %02x %02x %02x %02x %02x %02x "
11201 			    "          %02x %02x %02x %02x %02x %02x\n",
11202 			    spkt->satapkt_reason,
11203 			    rqsp[0], rqsp[1], rqsp[2], rqsp[3],
11204 			    rqsp[4], rqsp[5], rqsp[6], rqsp[7],
11205 			    rqsp[8], rqsp[9], rqsp[10], rqsp[11],
11206 			    rqsp[12], rqsp[13], rqsp[14], rqsp[15],
11207 			    rqsp[16], rqsp[17]);
11208 		} else {
11209 			switch (spkt->satapkt_reason) {
11210 			case SATA_PKT_PORT_ERROR:
11211 				sata_log(sata_hba_inst, CE_WARN,
11212 				    "sata_test_atapi_packet_command: "
11213 				    "packet reason: port error\n");
11214 				break;
11215 
11216 			case SATA_PKT_TIMEOUT:
11217 				sata_log(sata_hba_inst, CE_WARN,
11218 				    "sata_test_atapi_packet_command: "
11219 				    "packet reason: timeout\n");
11220 				break;
11221 
11222 			case SATA_PKT_ABORTED:
11223 				sata_log(sata_hba_inst, CE_WARN,
11224 				    "sata_test_atapi_packet_command: "
11225 				    "packet reason: aborted\n");
11226 				break;
11227 
11228 			case SATA_PKT_RESET:
11229 				sata_log(sata_hba_inst, CE_WARN,
11230 				    "sata_test_atapi_packet_command: "
11231 				    "packet reason: reset\n");
11232 				break;
11233 			default:
11234 				sata_log(sata_hba_inst, CE_WARN,
11235 				    "sata_test_atapi_packet_command: "
11236 				    "invalid packet reason: %02x\n",
11237 				    spkt->satapkt_reason);
11238 				break;
11239 			}
11240 		}
11241 	}
11242 cleanup:
11243 	sata_free_local_buffer(spx);
11244 	sata_pkt_free(spx);
11245 	kmem_free(spx, sizeof (sata_pkt_txlate_t));
11246 }
11247 
11248 #endif /* SATA_DEBUG */
11249 #endif /* 1 */
11250 
11251 
11252 /* ************************** LOCAL HELPER FUNCTIONS *********************** */
11253 
11254 /*
11255  * Validate sata_tran info
11256  * SATA_FAILURE returns if structure is inconsistent or structure revision
11257  * does not match one used by the framework.
11258  *
11259  * Returns SATA_SUCCESS if sata_hba_tran has matching revision and contains
11260  * required function pointers.
11261  * Returns SATA_FAILURE otherwise.
11262  */
11263 static int
sata_validate_sata_hba_tran(dev_info_t * dip,sata_hba_tran_t * sata_tran)11264 sata_validate_sata_hba_tran(dev_info_t *dip, sata_hba_tran_t *sata_tran)
11265 {
11266 	/*
11267 	 * SATA_TRAN_HBA_REV is the current (highest) revision number
11268 	 * of the SATA interface.
11269 	 */
11270 	if (sata_tran->sata_tran_hba_rev > SATA_TRAN_HBA_REV) {
11271 		sata_log(NULL, CE_WARN,
11272 		    "sata: invalid sata_hba_tran version %d for driver %s",
11273 		    sata_tran->sata_tran_hba_rev, ddi_driver_name(dip));
11274 		return (SATA_FAILURE);
11275 	}
11276 
11277 	if (dip != sata_tran->sata_tran_hba_dip) {
11278 		SATA_LOG_D((NULL, CE_WARN,
11279 		    "sata: inconsistent sata_tran_hba_dip "
11280 		    "%p / %p", sata_tran->sata_tran_hba_dip, dip));
11281 		return (SATA_FAILURE);
11282 	}
11283 
11284 	if (sata_tran->sata_tran_probe_port == NULL ||
11285 	    sata_tran->sata_tran_start == NULL ||
11286 	    sata_tran->sata_tran_abort == NULL ||
11287 	    sata_tran->sata_tran_reset_dport == NULL ||
11288 	    sata_tran->sata_tran_hotplug_ops == NULL ||
11289 	    sata_tran->sata_tran_hotplug_ops->sata_tran_port_activate == NULL ||
11290 	    sata_tran->sata_tran_hotplug_ops->sata_tran_port_deactivate ==
11291 	    NULL) {
11292 		SATA_LOG_D((NULL, CE_WARN, "sata: sata_hba_tran missing "
11293 		    "required functions"));
11294 	}
11295 	return (SATA_SUCCESS);
11296 }
11297 
11298 /*
11299  * Remove HBA instance from sata_hba_list.
11300  */
11301 static void
sata_remove_hba_instance(dev_info_t * dip)11302 sata_remove_hba_instance(dev_info_t *dip)
11303 {
11304 	sata_hba_inst_t	*sata_hba_inst;
11305 
11306 	mutex_enter(&sata_mutex);
11307 	for (sata_hba_inst = sata_hba_list;
11308 	    sata_hba_inst != (struct sata_hba_inst *)NULL;
11309 	    sata_hba_inst = sata_hba_inst->satahba_next) {
11310 		if (sata_hba_inst->satahba_dip == dip)
11311 			break;
11312 	}
11313 
11314 	if (sata_hba_inst == (struct sata_hba_inst *)NULL) {
11315 #ifdef SATA_DEBUG
11316 		cmn_err(CE_WARN, "sata_remove_hba_instance: "
11317 		    "unknown HBA instance\n");
11318 #endif
11319 		ASSERT(FALSE);
11320 	}
11321 	if (sata_hba_inst == sata_hba_list) {
11322 		sata_hba_list = sata_hba_inst->satahba_next;
11323 		if (sata_hba_list) {
11324 			sata_hba_list->satahba_prev =
11325 			    (struct sata_hba_inst *)NULL;
11326 		}
11327 		if (sata_hba_inst == sata_hba_list_tail) {
11328 			sata_hba_list_tail = NULL;
11329 		}
11330 	} else if (sata_hba_inst == sata_hba_list_tail) {
11331 		sata_hba_list_tail = sata_hba_inst->satahba_prev;
11332 		if (sata_hba_list_tail) {
11333 			sata_hba_list_tail->satahba_next =
11334 			    (struct sata_hba_inst *)NULL;
11335 		}
11336 	} else {
11337 		sata_hba_inst->satahba_prev->satahba_next =
11338 		    sata_hba_inst->satahba_next;
11339 		sata_hba_inst->satahba_next->satahba_prev =
11340 		    sata_hba_inst->satahba_prev;
11341 	}
11342 	mutex_exit(&sata_mutex);
11343 }
11344 
11345 /*
11346  * Probe all SATA ports of the specified HBA instance.
11347  * The assumption is that there are no target and attachment point minor nodes
11348  * created by the boot subsystems, so we do not need to prune device tree.
11349  *
11350  * This function is called only from sata_hba_attach(). It does not have to
11351  * be protected by controller mutex, because the hba_attached flag is not set
11352  * yet and no one would be touching this HBA instance other than this thread.
11353  * Determines if port is active and what type of the device is attached
11354  * (if any). Allocates necessary structures for each port.
11355  *
11356  * An AP (Attachement Point) node is created for each SATA device port even
11357  * when there is no device attached.
11358  */
11359 
11360 static void
sata_probe_ports(sata_hba_inst_t * sata_hba_inst)11361 sata_probe_ports(sata_hba_inst_t *sata_hba_inst)
11362 {
11363 	dev_info_t		*dip = SATA_DIP(sata_hba_inst);
11364 	int			ncport;
11365 	sata_cport_info_t	*cportinfo;
11366 	sata_drive_info_t	*drive;
11367 	sata_device_t		sata_device;
11368 	int			rval;
11369 	dev_t			minor_number;
11370 	char			name[16];
11371 	clock_t			start_time, cur_time;
11372 
11373 	/*
11374 	 * Probe controller ports first, to find port status and
11375 	 * any port multiplier attached.
11376 	 */
11377 	for (ncport = 0; ncport < SATA_NUM_CPORTS(sata_hba_inst); ncport++) {
11378 		/* allocate cport structure */
11379 		cportinfo = kmem_zalloc(sizeof (sata_cport_info_t), KM_SLEEP);
11380 		ASSERT(cportinfo != NULL);
11381 		mutex_init(&cportinfo->cport_mutex, NULL, MUTEX_DRIVER, NULL);
11382 
11383 		mutex_enter(&cportinfo->cport_mutex);
11384 
11385 		cportinfo->cport_addr.cport = ncport;
11386 		cportinfo->cport_addr.pmport = 0;
11387 		cportinfo->cport_addr.qual = SATA_ADDR_CPORT;
11388 		cportinfo->cport_state &= ~SATA_PORT_STATE_CLEAR_MASK;
11389 		cportinfo->cport_state |= SATA_STATE_PROBING;
11390 		SATA_CPORT_INFO(sata_hba_inst, ncport) = cportinfo;
11391 
11392 		/*
11393 		 * Regardless if a port is usable or not, create
11394 		 * an attachment point
11395 		 */
11396 		mutex_exit(&cportinfo->cport_mutex);
11397 		minor_number = SATA_MAKE_AP_MINOR(ddi_get_instance(dip),
11398 		    ncport, 0, SATA_ADDR_CPORT);
11399 		(void) sprintf(name, "%d", ncport);
11400 		if (ddi_create_minor_node(dip, name, S_IFCHR,
11401 		    minor_number, DDI_NT_SATA_ATTACHMENT_POINT, 0) !=
11402 		    DDI_SUCCESS) {
11403 			sata_log(sata_hba_inst, CE_WARN, "sata_hba_attach: "
11404 			    "cannot create SATA attachment point for port %d",
11405 			    ncport);
11406 		}
11407 
11408 		/* Probe port */
11409 		start_time = ddi_get_lbolt();
11410 	reprobe_cport:
11411 		sata_device.satadev_addr.cport = ncport;
11412 		sata_device.satadev_addr.pmport = 0;
11413 		sata_device.satadev_addr.qual = SATA_ADDR_CPORT;
11414 		sata_device.satadev_rev = SATA_DEVICE_REV;
11415 
11416 		rval = (*SATA_PROBE_PORT_FUNC(sata_hba_inst))
11417 		    (dip, &sata_device);
11418 
11419 		mutex_enter(&cportinfo->cport_mutex);
11420 		cportinfo->cport_scr = sata_device.satadev_scr;
11421 		if (rval != SATA_SUCCESS) {
11422 			/* Something went wrong? Fail the port */
11423 			cportinfo->cport_state = SATA_PSTATE_FAILED;
11424 			mutex_exit(&cportinfo->cport_mutex);
11425 			continue;
11426 		}
11427 		cportinfo->cport_state &= ~SATA_STATE_PROBING;
11428 		cportinfo->cport_state |= SATA_STATE_PROBED;
11429 		cportinfo->cport_dev_type = sata_device.satadev_type;
11430 
11431 		cportinfo->cport_state |= SATA_STATE_READY;
11432 		if (cportinfo->cport_dev_type == SATA_DTYPE_NONE) {
11433 			mutex_exit(&cportinfo->cport_mutex);
11434 			continue;
11435 		}
11436 		if (cportinfo->cport_dev_type != SATA_DTYPE_PMULT) {
11437 			/*
11438 			 * There is some device attached.
11439 			 * Allocate device info structure
11440 			 */
11441 			if (SATA_CPORTINFO_DRV_INFO(cportinfo) == NULL) {
11442 				mutex_exit(&cportinfo->cport_mutex);
11443 				SATA_CPORTINFO_DRV_INFO(cportinfo) =
11444 				    kmem_zalloc(sizeof (sata_drive_info_t),
11445 				    KM_SLEEP);
11446 				mutex_enter(&cportinfo->cport_mutex);
11447 			}
11448 			drive = SATA_CPORTINFO_DRV_INFO(cportinfo);
11449 			drive->satadrv_addr = cportinfo->cport_addr;
11450 			drive->satadrv_addr.qual = SATA_ADDR_DCPORT;
11451 			drive->satadrv_type = cportinfo->cport_dev_type;
11452 			drive->satadrv_state = SATA_STATE_UNKNOWN;
11453 
11454 			mutex_exit(&cportinfo->cport_mutex);
11455 			if (sata_add_device(dip, sata_hba_inst, &sata_device) !=
11456 			    SATA_SUCCESS) {
11457 				/*
11458 				 * Plugged device was not correctly identified.
11459 				 * Retry, within a SATA_DEV_IDENTIFY_TIMEOUT
11460 				 */
11461 				cur_time = ddi_get_lbolt();
11462 				if ((cur_time - start_time) <
11463 				    drv_usectohz(SATA_DEV_IDENTIFY_TIMEOUT)) {
11464 					/* sleep for a while */
11465 					delay(drv_usectohz(
11466 					    SATA_DEV_RETRY_DLY));
11467 					goto reprobe_cport;
11468 				}
11469 			}
11470 		} else { /* SATA_DTYPE_PMULT */
11471 			mutex_exit(&cportinfo->cport_mutex);
11472 
11473 			/* Allocate sata_pmult_info and sata_pmport_info */
11474 			if (sata_alloc_pmult(sata_hba_inst, &sata_device) !=
11475 			    SATA_SUCCESS)
11476 				continue;
11477 
11478 			/* Log the information of the port multiplier */
11479 			sata_show_pmult_info(sata_hba_inst, &sata_device);
11480 
11481 			/* Probe its pmports */
11482 			sata_probe_pmports(sata_hba_inst, ncport);
11483 		}
11484 	}
11485 }
11486 
11487 /*
11488  * Probe all device ports behind a port multiplier.
11489  *
11490  * PMult-related structure should be allocated before by sata_alloc_pmult().
11491  *
11492  * NOTE1: Only called from sata_probe_ports()
11493  * NOTE2: No mutex should be hold.
11494  */
11495 static void
sata_probe_pmports(sata_hba_inst_t * sata_hba_inst,uint8_t ncport)11496 sata_probe_pmports(sata_hba_inst_t *sata_hba_inst, uint8_t ncport)
11497 {
11498 	dev_info_t		*dip = SATA_DIP(sata_hba_inst);
11499 	sata_pmult_info_t	*pmultinfo = NULL;
11500 	sata_pmport_info_t	*pmportinfo = NULL;
11501 	sata_drive_info_t	*drive = NULL;
11502 	sata_device_t		sata_device;
11503 
11504 	clock_t			start_time, cur_time;
11505 	int			npmport;
11506 	int			rval;
11507 
11508 	pmultinfo = SATA_PMULT_INFO(sata_hba_inst, ncport);
11509 
11510 	/* Probe Port Multiplier ports */
11511 	for (npmport = 0; npmport < pmultinfo->pmult_num_dev_ports; npmport++) {
11512 		pmportinfo = pmultinfo->pmult_dev_port[npmport];
11513 		start_time = ddi_get_lbolt();
11514 reprobe_pmport:
11515 		sata_device.satadev_addr.cport = ncport;
11516 		sata_device.satadev_addr.pmport = npmport;
11517 		sata_device.satadev_addr.qual = SATA_ADDR_PMPORT;
11518 		sata_device.satadev_rev = SATA_DEVICE_REV;
11519 
11520 		/* Let HBA driver probe it. */
11521 		rval = (*SATA_PROBE_PORT_FUNC(sata_hba_inst))
11522 		    (dip, &sata_device);
11523 		mutex_enter(&pmportinfo->pmport_mutex);
11524 
11525 		pmportinfo->pmport_scr = sata_device.satadev_scr;
11526 
11527 		if (rval != SATA_SUCCESS) {
11528 			pmportinfo->pmport_state =
11529 			    SATA_PSTATE_FAILED;
11530 			mutex_exit(&pmportinfo->pmport_mutex);
11531 			continue;
11532 		}
11533 		pmportinfo->pmport_state &= ~SATA_STATE_PROBING;
11534 		pmportinfo->pmport_state |= SATA_STATE_PROBED;
11535 		pmportinfo->pmport_dev_type = sata_device.satadev_type;
11536 
11537 		pmportinfo->pmport_state |= SATA_STATE_READY;
11538 		if (pmportinfo->pmport_dev_type ==
11539 		    SATA_DTYPE_NONE) {
11540 			SATADBG2(SATA_DBG_PMULT, sata_hba_inst,
11541 			    "no device found at port %d:%d", ncport, npmport);
11542 			mutex_exit(&pmportinfo->pmport_mutex);
11543 			continue;
11544 		}
11545 		/* Port multipliers cannot be chained */
11546 		ASSERT(pmportinfo->pmport_dev_type != SATA_DTYPE_PMULT);
11547 		/*
11548 		 * There is something attached to Port
11549 		 * Multiplier device port
11550 		 * Allocate device info structure
11551 		 */
11552 		if (pmportinfo->pmport_sata_drive == NULL) {
11553 			mutex_exit(&pmportinfo->pmport_mutex);
11554 			pmportinfo->pmport_sata_drive =
11555 			    kmem_zalloc(sizeof (sata_drive_info_t), KM_SLEEP);
11556 			mutex_enter(&pmportinfo->pmport_mutex);
11557 		}
11558 		drive = pmportinfo->pmport_sata_drive;
11559 		drive->satadrv_addr.cport = pmportinfo->pmport_addr.cport;
11560 		drive->satadrv_addr.pmport = npmport;
11561 		drive->satadrv_addr.qual = SATA_ADDR_DPMPORT;
11562 		drive->satadrv_type = pmportinfo-> pmport_dev_type;
11563 		drive->satadrv_state = SATA_STATE_UNKNOWN;
11564 
11565 		mutex_exit(&pmportinfo->pmport_mutex);
11566 		rval = sata_add_device(dip, sata_hba_inst, &sata_device);
11567 
11568 		if (rval != SATA_SUCCESS) {
11569 			/*
11570 			 * Plugged device was not correctly identified.
11571 			 * Retry, within the SATA_DEV_IDENTIFY_TIMEOUT
11572 			 */
11573 			cur_time = ddi_get_lbolt();
11574 			if ((cur_time - start_time) < drv_usectohz(
11575 			    SATA_DEV_IDENTIFY_TIMEOUT)) {
11576 				/* sleep for a while */
11577 				delay(drv_usectohz(SATA_DEV_RETRY_DLY));
11578 				goto reprobe_pmport;
11579 			}
11580 		}
11581 	}
11582 }
11583 
11584 /*
11585  * Add SATA device for specified HBA instance & port (SCSI target
11586  * device nodes).
11587  * This function is called (indirectly) only from sata_hba_attach().
11588  * A target node is created when there is a supported type device attached,
11589  * but may be removed if it cannot be put online.
11590  *
11591  * This function cannot be called from an interrupt context.
11592  *
11593  * Create target nodes for disk, CD/DVD, Tape and ATAPI disk devices
11594  *
11595  * Returns SATA_SUCCESS when port/device was fully processed, SATA_FAILURE when
11596  * device identification failed - adding a device could be retried.
11597  *
11598  */
11599 static int
sata_add_device(dev_info_t * pdip,sata_hba_inst_t * sata_hba_inst,sata_device_t * sata_device)11600 sata_add_device(dev_info_t *pdip, sata_hba_inst_t *sata_hba_inst,
11601     sata_device_t *sata_device)
11602 {
11603 	sata_cport_info_t	*cportinfo;
11604 	sata_pmult_info_t	*pminfo;
11605 	sata_pmport_info_t	*pmportinfo;
11606 	dev_info_t		*cdip;		/* child dip */
11607 	sata_address_t		*saddr = &sata_device->satadev_addr;
11608 	uint8_t			cport, pmport;
11609 	int			rval;
11610 
11611 	cport = saddr->cport;
11612 	pmport = saddr->pmport;
11613 	cportinfo = SATA_CPORT_INFO(sata_hba_inst, cport);
11614 	ASSERT(cportinfo->cport_dev_type != SATA_DTYPE_NONE);
11615 
11616 	/*
11617 	 * Some device is attached to a controller port.
11618 	 * We rely on controllers distinquishing between no-device,
11619 	 * attached port multiplier and other kind of attached device.
11620 	 * We need to get Identify Device data and determine
11621 	 * positively the dev type before trying to attach
11622 	 * the target driver.
11623 	 */
11624 	sata_device->satadev_rev = SATA_DEVICE_REV;
11625 	switch (saddr->qual) {
11626 	case SATA_ADDR_CPORT:
11627 		/*
11628 		 * Add a non-port-multiplier device at controller port.
11629 		 */
11630 		saddr->qual = SATA_ADDR_DCPORT;
11631 
11632 		rval = sata_probe_device(sata_hba_inst, sata_device);
11633 		if (rval != SATA_SUCCESS ||
11634 		    sata_device->satadev_type == SATA_DTYPE_UNKNOWN)
11635 			return (SATA_FAILURE);
11636 
11637 		mutex_enter(&cportinfo->cport_mutex);
11638 		sata_show_drive_info(sata_hba_inst,
11639 		    SATA_CPORTINFO_DRV_INFO(cportinfo));
11640 
11641 		if ((sata_device->satadev_type & SATA_VALID_DEV_TYPE) == 0) {
11642 			/*
11643 			 * Could not determine device type or
11644 			 * a device is not supported.
11645 			 * Degrade this device to unknown.
11646 			 */
11647 			cportinfo->cport_dev_type = SATA_DTYPE_UNKNOWN;
11648 			mutex_exit(&cportinfo->cport_mutex);
11649 			return (SATA_SUCCESS);
11650 		}
11651 		cportinfo->cport_dev_type = sata_device->satadev_type;
11652 		cportinfo->cport_tgtnode_clean = B_TRUE;
11653 		mutex_exit(&cportinfo->cport_mutex);
11654 
11655 		/*
11656 		 * Initialize device to the desired state. Even if it
11657 		 * fails, the device will still attach but syslog
11658 		 * will show the warning.
11659 		 */
11660 		if (sata_initialize_device(sata_hba_inst,
11661 		    SATA_CPORTINFO_DRV_INFO(cportinfo)) != SATA_SUCCESS) {
11662 			/* Retry */
11663 			rval = sata_initialize_device(sata_hba_inst,
11664 			    SATA_CPORTINFO_DRV_INFO(cportinfo));
11665 
11666 			if (rval == SATA_RETRY)
11667 				sata_log(sata_hba_inst, CE_WARN,
11668 				    "SATA device at port %d - "
11669 				    "default device features could not be set."
11670 				    " Device may not operate as expected.",
11671 				    cport);
11672 		}
11673 
11674 		cdip = sata_create_target_node(pdip, sata_hba_inst, saddr);
11675 		if (cdip == NULL) {
11676 			/*
11677 			 * Attaching target node failed.
11678 			 * We retain sata_drive_info structure...
11679 			 */
11680 			return (SATA_SUCCESS);
11681 		}
11682 
11683 		mutex_enter(&cportinfo->cport_mutex);
11684 		(SATA_CPORTINFO_DRV_INFO(cportinfo))->
11685 		    satadrv_state = SATA_STATE_READY;
11686 		mutex_exit(&cportinfo->cport_mutex);
11687 
11688 		break;
11689 
11690 	case SATA_ADDR_PMPORT:
11691 		saddr->qual = SATA_ADDR_DPMPORT;
11692 
11693 		mutex_enter(&cportinfo->cport_mutex);
11694 		/* It must be a Port Multiplier at the controller port */
11695 		ASSERT(cportinfo->cport_dev_type == SATA_DTYPE_PMULT);
11696 
11697 		pminfo = SATA_CPORTINFO_PMULT_INFO(cportinfo);
11698 		pmportinfo = pminfo->pmult_dev_port[saddr->pmport];
11699 		mutex_exit(&cportinfo->cport_mutex);
11700 
11701 		rval = sata_probe_device(sata_hba_inst, sata_device);
11702 		if (rval != SATA_SUCCESS ||
11703 		    sata_device->satadev_type == SATA_DTYPE_UNKNOWN) {
11704 			return (SATA_FAILURE);
11705 		}
11706 
11707 		mutex_enter(&pmportinfo->pmport_mutex);
11708 		sata_show_drive_info(sata_hba_inst,
11709 		    SATA_PMPORTINFO_DRV_INFO(pmportinfo));
11710 
11711 		if ((sata_device->satadev_type & SATA_VALID_DEV_TYPE) == 0) {
11712 			/*
11713 			 * Could not determine device type.
11714 			 * Degrade this device to unknown.
11715 			 */
11716 			pmportinfo->pmport_dev_type = SATA_DTYPE_UNKNOWN;
11717 			mutex_exit(&pmportinfo->pmport_mutex);
11718 			return (SATA_SUCCESS);
11719 		}
11720 		pmportinfo->pmport_dev_type = sata_device->satadev_type;
11721 		pmportinfo->pmport_tgtnode_clean = B_TRUE;
11722 		mutex_exit(&pmportinfo->pmport_mutex);
11723 
11724 		/*
11725 		 * Initialize device to the desired state.
11726 		 * Even if it fails, the device will still
11727 		 * attach but syslog will show the warning.
11728 		 */
11729 		if (sata_initialize_device(sata_hba_inst,
11730 		    pmportinfo->pmport_sata_drive) != SATA_SUCCESS) {
11731 			/* Retry */
11732 			rval = sata_initialize_device(sata_hba_inst,
11733 			    pmportinfo->pmport_sata_drive);
11734 
11735 			if (rval == SATA_RETRY)
11736 				sata_log(sata_hba_inst, CE_WARN,
11737 				    "SATA device at port %d:%d - "
11738 				    "default device features could not be set."
11739 				    " Device may not operate as expected.",
11740 				    cport, pmport);
11741 		}
11742 
11743 		cdip = sata_create_target_node(pdip, sata_hba_inst, saddr);
11744 		if (cdip == NULL) {
11745 			/*
11746 			 * Attaching target node failed.
11747 			 * We retain sata_drive_info structure...
11748 			 */
11749 			return (SATA_SUCCESS);
11750 		}
11751 		mutex_enter(&pmportinfo->pmport_mutex);
11752 		pmportinfo->pmport_sata_drive->satadrv_state |=
11753 		    SATA_STATE_READY;
11754 		mutex_exit(&pmportinfo->pmport_mutex);
11755 
11756 		break;
11757 
11758 	default:
11759 		return (SATA_FAILURE);
11760 	}
11761 
11762 	return (SATA_SUCCESS);
11763 }
11764 
11765 /*
11766  * Clean up target node at specific address.
11767  *
11768  * NOTE: No Mutex should be hold.
11769  */
11770 static int
sata_offline_device(sata_hba_inst_t * sata_hba_inst,sata_device_t * sata_device,sata_drive_info_t * sdinfo)11771 sata_offline_device(sata_hba_inst_t *sata_hba_inst,
11772     sata_device_t *sata_device, sata_drive_info_t *sdinfo)
11773 {
11774 	uint8_t cport, pmport, qual;
11775 	dev_info_t *tdip;
11776 
11777 	cport = sata_device->satadev_addr.cport;
11778 	pmport = sata_device->satadev_addr.pmport;
11779 	qual = sata_device->satadev_addr.qual;
11780 
11781 	if (qual == SATA_ADDR_DCPORT) {
11782 		SATA_LOG_D((sata_hba_inst, CE_WARN,
11783 		    "sata_hba_ioctl: disconnect device at port %d", cport));
11784 	} else {
11785 		SATA_LOG_D((sata_hba_inst, CE_WARN,
11786 		    "sata_hba_ioctl: disconnect device at port %d:%d",
11787 		    cport, pmport));
11788 	}
11789 
11790 	/* We are addressing attached device, not a port */
11791 	sata_device->satadev_addr.qual =
11792 	    sdinfo->satadrv_addr.qual;
11793 	tdip = sata_get_scsi_target_dip(SATA_DIP(sata_hba_inst),
11794 	    &sata_device->satadev_addr);
11795 	if (tdip != NULL && ndi_devi_offline(tdip,
11796 	    NDI_DEVI_REMOVE) != NDI_SUCCESS) {
11797 		/*
11798 		 * Problem :
11799 		 * The target node remained attached.
11800 		 * This happens when the device file was open
11801 		 * or a node was waiting for resources.
11802 		 * Cannot do anything about it.
11803 		 */
11804 		if (qual == SATA_ADDR_DCPORT) {
11805 			SATA_LOG_D((sata_hba_inst, CE_WARN,
11806 			    "sata_hba_ioctl: disconnect: could "
11807 			    "not unconfigure device before "
11808 			    "disconnecting the SATA port %d",
11809 			    cport));
11810 		} else {
11811 			SATA_LOG_D((sata_hba_inst, CE_WARN,
11812 			    "sata_hba_ioctl: disconnect: could "
11813 			    "not unconfigure device before "
11814 			    "disconnecting the SATA port %d:%d",
11815 			    cport, pmport));
11816 		}
11817 		/*
11818 		 * Set DEVICE REMOVED state in the target
11819 		 * node. It will prevent access to the device
11820 		 * even when a new device is attached, until
11821 		 * the old target node is released, removed and
11822 		 * recreated for a new  device.
11823 		 */
11824 		sata_set_device_removed(tdip);
11825 
11826 		/*
11827 		 * Instruct event daemon to try the target
11828 		 * node cleanup later.
11829 		 */
11830 		sata_set_target_node_cleanup(
11831 		    sata_hba_inst, &sata_device->satadev_addr);
11832 	}
11833 
11834 
11835 	return (SATA_SUCCESS);
11836 }
11837 
11838 
11839 /*
11840  * Create scsi target node for attached device, create node properties and
11841  * attach the node.
11842  * The node could be removed if the device onlining fails.
11843  *
11844  * A dev_info_t pointer is returned if operation is successful, NULL is
11845  * returned otherwise.
11846  */
11847 
11848 static dev_info_t *
sata_create_target_node(dev_info_t * dip,sata_hba_inst_t * sata_hba_inst,sata_address_t * sata_addr)11849 sata_create_target_node(dev_info_t *dip, sata_hba_inst_t *sata_hba_inst,
11850     sata_address_t *sata_addr)
11851 {
11852 	dev_info_t *cdip = NULL;
11853 	int rval;
11854 	char *nname = NULL;
11855 	char **compatible = NULL;
11856 	int ncompatible;
11857 	struct scsi_inquiry inq;
11858 	sata_device_t sata_device;
11859 	sata_drive_info_t *sdinfo;
11860 	int target;
11861 	int i;
11862 
11863 	sata_device.satadev_rev = SATA_DEVICE_REV;
11864 	sata_device.satadev_addr = *sata_addr;
11865 
11866 	mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst, sata_addr->cport)));
11867 
11868 	sdinfo = sata_get_device_info(sata_hba_inst, &sata_device);
11869 
11870 	target = SATA_TO_SCSI_TARGET(sata_addr->cport,
11871 	    sata_addr->pmport, sata_addr->qual);
11872 
11873 	if (sdinfo == NULL) {
11874 		mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
11875 		    sata_addr->cport)));
11876 		SATA_LOG_D((sata_hba_inst, CE_WARN,
11877 		    "sata_create_target_node: no sdinfo for target %x",
11878 		    target));
11879 		return (NULL);
11880 	}
11881 
11882 	/*
11883 	 * create or get scsi inquiry data, expected by
11884 	 * scsi_hba_nodename_compatible_get()
11885 	 * SATA hard disks get Identify Data translated into Inguiry Data.
11886 	 * ATAPI devices respond directly to Inquiry request.
11887 	 */
11888 	if (sdinfo->satadrv_type == SATA_DTYPE_ATADISK) {
11889 		sata_identdev_to_inquiry(sata_hba_inst, sdinfo,
11890 		    (uint8_t *)&inq);
11891 		mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
11892 		    sata_addr->cport)));
11893 	} else { /* Assume supported ATAPI device */
11894 		mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
11895 		    sata_addr->cport)));
11896 		if (sata_get_atapi_inquiry_data(sata_hba_inst, sata_addr,
11897 		    &inq) == SATA_FAILURE)
11898 			return (NULL);
11899 		/*
11900 		 * Save supported ATAPI transport version
11901 		 */
11902 		sdinfo->satadrv_atapi_trans_ver =
11903 		    SATA_ATAPI_TRANS_VERSION(&inq);
11904 	}
11905 
11906 	/* determine the node name and compatible */
11907 	scsi_hba_nodename_compatible_get(&inq, NULL,
11908 	    inq.inq_dtype, NULL, &nname, &compatible, &ncompatible);
11909 
11910 #ifdef SATA_DEBUG
11911 	if (sata_debug_flags & SATA_DBG_NODES) {
11912 		if (nname == NULL) {
11913 			cmn_err(CE_NOTE, "sata_create_target_node: "
11914 			    "cannot determine nodename for target %d\n",
11915 			    target);
11916 		} else {
11917 			cmn_err(CE_WARN, "sata_create_target_node: "
11918 			    "target %d nodename: %s\n", target, nname);
11919 		}
11920 		if (compatible == NULL) {
11921 			cmn_err(CE_WARN,
11922 			    "sata_create_target_node: no compatible name\n");
11923 		} else {
11924 			for (i = 0; i < ncompatible; i++) {
11925 				cmn_err(CE_WARN, "sata_create_target_node: "
11926 				    "compatible name: %s\n", compatible[i]);
11927 			}
11928 		}
11929 	}
11930 #endif
11931 
11932 	/* if nodename can't be determined, log error and exit */
11933 	if (nname == NULL) {
11934 		SATA_LOG_D((sata_hba_inst, CE_WARN,
11935 		    "sata_create_target_node: cannot determine nodename "
11936 		    "for target %d\n", target));
11937 		scsi_hba_nodename_compatible_free(nname, compatible);
11938 		return (NULL);
11939 	}
11940 	/*
11941 	 * Create scsi target node
11942 	 */
11943 	ndi_devi_alloc_sleep(dip, nname, (pnode_t)DEVI_SID_NODEID, &cdip);
11944 	rval = ndi_prop_update_string(DDI_DEV_T_NONE, cdip,
11945 	    "device-type", "scsi");
11946 
11947 	if (rval != DDI_PROP_SUCCESS) {
11948 		SATA_LOG_D((sata_hba_inst, CE_WARN, "sata_create_target_node: "
11949 		    "updating device_type prop failed %d", rval));
11950 		goto fail;
11951 	}
11952 
11953 	/*
11954 	 * Create target node properties: target & lun
11955 	 */
11956 	rval = ndi_prop_update_int(DDI_DEV_T_NONE, cdip, "target", target);
11957 	if (rval != DDI_PROP_SUCCESS) {
11958 		SATA_LOG_D((sata_hba_inst, CE_WARN, "sata_create_target_node: "
11959 		    "updating target prop failed %d", rval));
11960 		goto fail;
11961 	}
11962 	rval = ndi_prop_update_int(DDI_DEV_T_NONE, cdip, "lun", 0);
11963 	if (rval != DDI_PROP_SUCCESS) {
11964 		SATA_LOG_D((sata_hba_inst, CE_WARN, "sata_create_target_node: "
11965 		    "updating target prop failed %d", rval));
11966 		goto fail;
11967 	}
11968 
11969 	if (sdinfo->satadrv_type & SATA_DTYPE_ATAPI) {
11970 		/*
11971 		 * Add "variant" property
11972 		 */
11973 		rval = ndi_prop_update_string(DDI_DEV_T_NONE, cdip,
11974 		    "variant", "atapi");
11975 		if (rval != DDI_PROP_SUCCESS) {
11976 			SATA_LOG_D((sata_hba_inst, CE_WARN,
11977 			    "sata_create_target_node: variant atapi "
11978 			    "property could not be created: %d", rval));
11979 			goto fail;
11980 		}
11981 	}
11982 	/* decorate the node with compatible */
11983 	if (ndi_prop_update_string_array(DDI_DEV_T_NONE, cdip, "compatible",
11984 	    compatible, ncompatible) != DDI_PROP_SUCCESS) {
11985 		SATA_LOG_D((sata_hba_inst, CE_WARN,
11986 		    "sata_create_target_node: FAIL compatible props cdip 0x%p",
11987 		    (void *)cdip));
11988 		goto fail;
11989 	}
11990 
11991 	if (sdinfo->satadrv_type == SATA_DTYPE_ATADISK) {
11992 		/*
11993 		 * Add "sata-phy" property
11994 		 */
11995 		if (ndi_prop_update_int(DDI_DEV_T_NONE, cdip, "sata-phy",
11996 		    (int)sata_addr->cport) != DDI_PROP_SUCCESS) {
11997 			SATA_LOG_D((sata_hba_inst, CE_WARN,
11998 			    "sata_create_target_node: failed to create "
11999 			    "\"sata-phy\" property: port %d",
12000 			    sata_addr->cport));
12001 		}
12002 	}
12003 
12004 
12005 	/*
12006 	 * Now, try to attach the driver. If probing of the device fails,
12007 	 * the target node may be removed
12008 	 */
12009 	rval = ndi_devi_online(cdip, NDI_ONLINE_ATTACH);
12010 
12011 	scsi_hba_nodename_compatible_free(nname, compatible);
12012 
12013 	if (rval == NDI_SUCCESS)
12014 		return (cdip);
12015 
12016 	/* target node was removed - are we sure? */
12017 	return (NULL);
12018 
12019 fail:
12020 	scsi_hba_nodename_compatible_free(nname, compatible);
12021 	ddi_prop_remove_all(cdip);
12022 	rval = ndi_devi_free(cdip);
12023 	if (rval != NDI_SUCCESS) {
12024 		SATA_LOG_D((sata_hba_inst, CE_WARN, "sata_create_target_node: "
12025 		    "node removal failed %d", rval));
12026 	}
12027 	sata_log(sata_hba_inst, CE_WARN, "sata_create_target_node: "
12028 	    "cannot create target node for SATA device at port %d",
12029 	    sata_addr->cport);
12030 	return (NULL);
12031 }
12032 
12033 /*
12034  * Remove a target node.
12035  */
12036 static void
sata_remove_target_node(sata_hba_inst_t * sata_hba_inst,sata_address_t * sata_addr)12037 sata_remove_target_node(sata_hba_inst_t *sata_hba_inst,
12038     sata_address_t *sata_addr)
12039 {
12040 	dev_info_t *tdip;
12041 	uint8_t cport = sata_addr->cport;
12042 	uint8_t pmport = sata_addr->pmport;
12043 	uint8_t qual = sata_addr->qual;
12044 
12045 	/* Note the sata daemon uses the address of the port/pmport */
12046 	ASSERT(qual == SATA_ADDR_CPORT || qual == SATA_ADDR_PMPORT);
12047 
12048 	/* Remove target node */
12049 	tdip = sata_get_target_dip(SATA_DIP(sata_hba_inst), cport, pmport);
12050 	if (tdip != NULL) {
12051 		/*
12052 		 * Target node exists.  Unconfigure device
12053 		 * then remove the target node (one ndi
12054 		 * operation).
12055 		 */
12056 		if (ndi_devi_offline(tdip, NDI_DEVI_REMOVE) != NDI_SUCCESS) {
12057 			/*
12058 			 * PROBLEM - no device, but target node remained. This
12059 			 * happens when the file was open or node was waiting
12060 			 * for resources.
12061 			 */
12062 			SATA_LOG_D((sata_hba_inst, CE_WARN,
12063 			    "sata_remove_target_node: "
12064 			    "Failed to remove target node for "
12065 			    "detached SATA device."));
12066 			/*
12067 			 * Set target node state to DEVI_DEVICE_REMOVED. But
12068 			 * re-check first that the node still exists.
12069 			 */
12070 			tdip = sata_get_target_dip(SATA_DIP(sata_hba_inst),
12071 			    cport, pmport);
12072 			if (tdip != NULL) {
12073 				sata_set_device_removed(tdip);
12074 				/*
12075 				 * Instruct event daemon to retry the cleanup
12076 				 * later.
12077 				 */
12078 				sata_set_target_node_cleanup(sata_hba_inst,
12079 				    sata_addr);
12080 			}
12081 		}
12082 
12083 		if (qual == SATA_ADDR_CPORT)
12084 			sata_log(sata_hba_inst, CE_WARN,
12085 			    "SATA device detached at port %d", cport);
12086 		else
12087 			sata_log(sata_hba_inst, CE_WARN,
12088 			    "SATA device detached at port %d:%d",
12089 			    cport, pmport);
12090 	}
12091 #ifdef SATA_DEBUG
12092 	else {
12093 		if (qual == SATA_ADDR_CPORT)
12094 			sata_log(sata_hba_inst, CE_WARN,
12095 			    "target node not found at port %d", cport);
12096 		else
12097 			sata_log(sata_hba_inst, CE_WARN,
12098 			    "target node not found at port %d:%d",
12099 			    cport, pmport);
12100 	}
12101 #endif
12102 }
12103 
12104 
12105 /*
12106  * Re-probe sata port, check for a device and attach info
12107  * structures when necessary. Identify Device data is fetched, if possible.
12108  * Assumption: sata address is already validated.
12109  * SATA_SUCCESS is returned if port is re-probed sucessfully, regardless of
12110  * the presence of a device and its type.
12111  *
12112  * flag arg specifies that the function should try multiple times to identify
12113  * device type and to initialize it, or it should return immediately on failure.
12114  * SATA_DEV_IDENTIFY_RETRY - retry
12115  * SATA_DEV_IDENTIFY_NORETRY - no retry
12116  *
12117  * SATA_FAILURE is returned if one of the operations failed.
12118  *
12119  * This function cannot be called in interrupt context - it may sleep.
12120  *
12121  * Note: Port multiplier is supported.
12122  */
12123 static int
sata_reprobe_port(sata_hba_inst_t * sata_hba_inst,sata_device_t * sata_device,int flag)12124 sata_reprobe_port(sata_hba_inst_t *sata_hba_inst, sata_device_t *sata_device,
12125     int flag)
12126 {
12127 	sata_cport_info_t *cportinfo;
12128 	sata_pmult_info_t *pmultinfo;
12129 	sata_drive_info_t *sdinfo, *osdinfo;
12130 	boolean_t init_device = B_FALSE;
12131 	int prev_device_type = SATA_DTYPE_NONE;
12132 	int prev_device_settings = 0;
12133 	int prev_device_state = 0;
12134 	clock_t start_time = 0;
12135 	int retry = B_FALSE;
12136 	uint8_t cport = sata_device->satadev_addr.cport;
12137 	int rval_probe, rval_init;
12138 
12139 	/*
12140 	 * If target is pmport, sata_reprobe_pmport() will handle it.
12141 	 */
12142 	if (sata_device->satadev_addr.qual == SATA_ADDR_PMPORT ||
12143 	    sata_device->satadev_addr.qual == SATA_ADDR_DPMPORT)
12144 		return (sata_reprobe_pmport(sata_hba_inst, sata_device, flag));
12145 
12146 	/* We only care about host sata cport for now */
12147 	cportinfo = SATA_CPORT_INFO(sata_hba_inst,
12148 	    sata_device->satadev_addr.cport);
12149 
12150 	/*
12151 	 * If a port multiplier was previously attached (we have no idea it
12152 	 * still there or not), sata_reprobe_pmult() will handle it.
12153 	 */
12154 	if (cportinfo->cport_dev_type == SATA_DTYPE_PMULT)
12155 		return (sata_reprobe_pmult(sata_hba_inst, sata_device, flag));
12156 
12157 	/* Store sata_drive_info when a non-pmult device was attached. */
12158 	osdinfo = SATA_CPORTINFO_DRV_INFO(cportinfo);
12159 	if (osdinfo != NULL) {
12160 		/*
12161 		 * We are re-probing port with a previously attached device.
12162 		 * Save previous device type and settings.
12163 		 */
12164 		prev_device_type = cportinfo->cport_dev_type;
12165 		prev_device_settings = osdinfo->satadrv_settings;
12166 		prev_device_state = osdinfo->satadrv_state;
12167 	}
12168 	if (flag == SATA_DEV_IDENTIFY_RETRY) {
12169 		start_time = ddi_get_lbolt();
12170 		retry = B_TRUE;
12171 	}
12172 retry_probe:
12173 
12174 	/* probe port */
12175 	mutex_enter(&cportinfo->cport_mutex);
12176 	cportinfo->cport_state &= ~SATA_PORT_STATE_CLEAR_MASK;
12177 	cportinfo->cport_state |= SATA_STATE_PROBING;
12178 	mutex_exit(&cportinfo->cport_mutex);
12179 
12180 	rval_probe = (*SATA_PROBE_PORT_FUNC(sata_hba_inst))
12181 	    (SATA_DIP(sata_hba_inst), sata_device);
12182 
12183 	mutex_enter(&cportinfo->cport_mutex);
12184 	if (rval_probe != SATA_SUCCESS) {
12185 		cportinfo->cport_state = SATA_PSTATE_FAILED;
12186 		mutex_exit(&cportinfo->cport_mutex);
12187 		SATA_LOG_D((sata_hba_inst, CE_WARN, "sata_reprobe_port: "
12188 		    "SATA port %d probing failed",
12189 		    cportinfo->cport_addr.cport));
12190 		return (SATA_FAILURE);
12191 	}
12192 
12193 	/*
12194 	 * update sata port state and set device type
12195 	 */
12196 	sata_update_port_info(sata_hba_inst, sata_device);
12197 	cportinfo->cport_state &= ~SATA_STATE_PROBING;
12198 
12199 	/*
12200 	 * Sanity check - Port is active? Is the link active?
12201 	 * Is there any device attached?
12202 	 */
12203 	if ((cportinfo->cport_state &
12204 	    (SATA_PSTATE_SHUTDOWN | SATA_PSTATE_FAILED)) ||
12205 	    (cportinfo->cport_scr.sstatus & SATA_PORT_DEVLINK_UP_MASK) !=
12206 	    SATA_PORT_DEVLINK_UP) {
12207 		/*
12208 		 * Port in non-usable state or no link active/no device.
12209 		 * Free info structure if necessary (direct attached drive
12210 		 * only, for now!
12211 		 */
12212 		sdinfo = SATA_CPORTINFO_DRV_INFO(cportinfo);
12213 		SATA_CPORTINFO_DRV_INFO(cportinfo) = NULL;
12214 		/* Add here differentiation for device attached or not */
12215 		cportinfo->cport_dev_type = SATA_DTYPE_NONE;
12216 		mutex_exit(&cportinfo->cport_mutex);
12217 		if (sdinfo != NULL)
12218 			kmem_free(sdinfo, sizeof (sata_drive_info_t));
12219 		return (SATA_SUCCESS);
12220 	}
12221 
12222 	cportinfo->cport_state |= SATA_STATE_READY;
12223 	cportinfo->cport_state |= SATA_STATE_PROBED;
12224 
12225 	cportinfo->cport_dev_type = sata_device->satadev_type;
12226 	sdinfo = SATA_CPORTINFO_DRV_INFO(cportinfo);
12227 
12228 	/*
12229 	 * If we are re-probing the port, there may be
12230 	 * sata_drive_info structure attached
12231 	 */
12232 	if (sata_device->satadev_type == SATA_DTYPE_NONE) {
12233 
12234 		/*
12235 		 * There is no device, so remove device info structure,
12236 		 * if necessary.
12237 		 */
12238 		/* Device change: Drive -> None */
12239 		SATA_CPORTINFO_DRV_INFO(cportinfo) = NULL;
12240 		cportinfo->cport_dev_type = SATA_DTYPE_NONE;
12241 		if (sdinfo != NULL) {
12242 			kmem_free(sdinfo, sizeof (sata_drive_info_t));
12243 			sata_log(sata_hba_inst, CE_WARN,
12244 			    "SATA device detached "
12245 			    "from port %d", cportinfo->cport_addr.cport);
12246 		}
12247 		mutex_exit(&cportinfo->cport_mutex);
12248 		return (SATA_SUCCESS);
12249 
12250 	}
12251 
12252 	if (sata_device->satadev_type != SATA_DTYPE_PMULT) {
12253 
12254 		/* Device (may) change: Drive -> Drive */
12255 		if (sdinfo == NULL) {
12256 			/*
12257 			 * There is some device attached, but there is
12258 			 * no sata_drive_info structure - allocate one
12259 			 */
12260 			mutex_exit(&cportinfo->cport_mutex);
12261 			sdinfo = kmem_zalloc(
12262 			    sizeof (sata_drive_info_t), KM_SLEEP);
12263 			mutex_enter(&cportinfo->cport_mutex);
12264 			/*
12265 			 * Recheck, that the port state did not change when we
12266 			 * released mutex.
12267 			 */
12268 			if (cportinfo->cport_state & SATA_STATE_READY) {
12269 				SATA_CPORTINFO_DRV_INFO(cportinfo) = sdinfo;
12270 				sdinfo->satadrv_addr = cportinfo->cport_addr;
12271 				sdinfo->satadrv_addr.qual = SATA_ADDR_DCPORT;
12272 				sdinfo->satadrv_type = SATA_DTYPE_UNKNOWN;
12273 				sdinfo->satadrv_state = SATA_STATE_UNKNOWN;
12274 			} else {
12275 				/*
12276 				 * Port is not in ready state, we
12277 				 * cannot attach a device.
12278 				 */
12279 				mutex_exit(&cportinfo->cport_mutex);
12280 				kmem_free(sdinfo, sizeof (sata_drive_info_t));
12281 				return (SATA_SUCCESS);
12282 			}
12283 			/*
12284 			 * Since we are adding device, presumably new one,
12285 			 * indicate that it  should be initalized,
12286 			 * as well as some internal framework states).
12287 			 */
12288 			init_device = B_TRUE;
12289 		}
12290 		cportinfo->cport_dev_type = SATA_DTYPE_UNKNOWN;
12291 		sata_device->satadev_addr.qual = sdinfo->satadrv_addr.qual;
12292 	} else {
12293 		/* Device change: Drive -> PMult */
12294 		SATA_CPORTINFO_DRV_INFO(cportinfo) = NULL;
12295 		if (sdinfo != NULL) {
12296 			kmem_free(sdinfo, sizeof (sata_drive_info_t));
12297 			sata_log(sata_hba_inst, CE_WARN,
12298 			    "SATA device detached "
12299 			    "from port %d", cportinfo->cport_addr.cport);
12300 		}
12301 
12302 		sata_log(sata_hba_inst, CE_WARN,
12303 		    "SATA port multiplier detected at port %d",
12304 		    cportinfo->cport_addr.cport);
12305 
12306 		mutex_exit(&cportinfo->cport_mutex);
12307 		if (sata_alloc_pmult(sata_hba_inst, sata_device) !=
12308 		    SATA_SUCCESS)
12309 			return (SATA_FAILURE);
12310 		sata_show_pmult_info(sata_hba_inst, sata_device);
12311 		mutex_enter(&cportinfo->cport_mutex);
12312 
12313 		/*
12314 		 * Mark all the port multiplier port behind the port
12315 		 * multiplier behind with link events, so that the sata daemon
12316 		 * will update their status.
12317 		 */
12318 		pmultinfo = SATA_PMULT_INFO(sata_hba_inst, cport);
12319 		pmultinfo->pmult_event_flags |= SATA_EVNT_DEVICE_RESET;
12320 		mutex_exit(&cportinfo->cport_mutex);
12321 		return (SATA_SUCCESS);
12322 	}
12323 	mutex_exit(&cportinfo->cport_mutex);
12324 
12325 	/*
12326 	 * Figure out what kind of device we are really
12327 	 * dealing with. Failure of identifying device does not fail this
12328 	 * function.
12329 	 */
12330 	rval_probe = sata_probe_device(sata_hba_inst, sata_device);
12331 	rval_init = SATA_FAILURE;
12332 	mutex_enter(&cportinfo->cport_mutex);
12333 	if (rval_probe == SATA_SUCCESS) {
12334 		/*
12335 		 * If we are dealing with the same type of a device as before,
12336 		 * restore its settings flags.
12337 		 */
12338 		if (osdinfo != NULL &&
12339 		    sata_device->satadev_type == prev_device_type)
12340 			sdinfo->satadrv_settings = prev_device_settings;
12341 
12342 		mutex_exit(&cportinfo->cport_mutex);
12343 		rval_init = SATA_SUCCESS;
12344 		/* Set initial device features, if necessary */
12345 		if (init_device == B_TRUE) {
12346 			rval_init = sata_initialize_device(sata_hba_inst,
12347 			    sdinfo);
12348 		}
12349 		if (rval_init == SATA_SUCCESS)
12350 			return (rval_init);
12351 		/* else we will retry if retry was asked for */
12352 
12353 	} else {
12354 		/*
12355 		 * If there was some device info before we probe the device,
12356 		 * restore previous device setting, so we can retry from scratch
12357 		 * later. Providing, of course, that device has not disapear
12358 		 * during probing process.
12359 		 */
12360 		if (sata_device->satadev_type != SATA_DTYPE_NONE) {
12361 			if (osdinfo != NULL) {
12362 				cportinfo->cport_dev_type = prev_device_type;
12363 				sdinfo->satadrv_type = prev_device_type;
12364 				sdinfo->satadrv_state = prev_device_state;
12365 			}
12366 		} else {
12367 			/* device is gone */
12368 			kmem_free(sdinfo, sizeof (sata_drive_info_t));
12369 			cportinfo->cport_dev_type = SATA_DTYPE_NONE;
12370 			SATA_CPORTINFO_DRV_INFO(cportinfo) = NULL;
12371 			mutex_exit(&cportinfo->cport_mutex);
12372 			return (SATA_SUCCESS);
12373 		}
12374 		mutex_exit(&cportinfo->cport_mutex);
12375 	}
12376 
12377 	if (retry) {
12378 		clock_t cur_time = ddi_get_lbolt();
12379 		/*
12380 		 * A device was not successfully identified or initialized.
12381 		 * Track retry time for device identification.
12382 		 */
12383 		if ((cur_time - start_time) <
12384 		    drv_usectohz(SATA_DEV_REPROBE_TIMEOUT)) {
12385 			/* sleep for a while */
12386 			delay(drv_usectohz(SATA_DEV_RETRY_DLY));
12387 			goto retry_probe;
12388 		}
12389 		/* else no more retries */
12390 		mutex_enter(&cportinfo->cport_mutex);
12391 		if (SATA_CPORTINFO_DRV_INFO(cportinfo) != NULL) {
12392 			if (rval_init == SATA_RETRY) {
12393 				/*
12394 				 * Setting drive features have failed, but
12395 				 * because the drive is still accessible,
12396 				 * keep it and emit a warning message.
12397 				 */
12398 				sata_log(sata_hba_inst, CE_WARN,
12399 				    "SATA device at port %d - desired "
12400 				    "drive features could not be set. "
12401 				    "Device may not operate as expected.",
12402 				    cportinfo->cport_addr.cport);
12403 			} else {
12404 				SATA_CPORTINFO_DRV_INFO(cportinfo)->
12405 				    satadrv_state = SATA_DSTATE_FAILED;
12406 			}
12407 		}
12408 		mutex_exit(&cportinfo->cport_mutex);
12409 	}
12410 	return (SATA_SUCCESS);
12411 }
12412 
12413 /*
12414  * Reprobe a controller port that connected to a port multiplier.
12415  *
12416  * NOTE: No Mutex should be hold.
12417  */
12418 static int
sata_reprobe_pmult(sata_hba_inst_t * sata_hba_inst,sata_device_t * sata_device,int flag)12419 sata_reprobe_pmult(sata_hba_inst_t *sata_hba_inst, sata_device_t *sata_device,
12420     int flag)
12421 {
12422 	_NOTE(ARGUNUSED(flag))
12423 	sata_cport_info_t *cportinfo;
12424 	sata_pmult_info_t *pmultinfo;
12425 	uint8_t cport = sata_device->satadev_addr.cport;
12426 	int rval_probe;
12427 
12428 	cportinfo = SATA_CPORT_INFO(sata_hba_inst, cport);
12429 	pmultinfo = SATA_PMULT_INFO(sata_hba_inst, cport);
12430 
12431 	/* probe port */
12432 	mutex_enter(&cportinfo->cport_mutex);
12433 	cportinfo->cport_state &= ~SATA_PORT_STATE_CLEAR_MASK;
12434 	cportinfo->cport_state |= SATA_STATE_PROBING;
12435 	mutex_exit(&cportinfo->cport_mutex);
12436 
12437 	rval_probe = (*SATA_PROBE_PORT_FUNC(sata_hba_inst))
12438 	    (SATA_DIP(sata_hba_inst), sata_device);
12439 
12440 	mutex_enter(&cportinfo->cport_mutex);
12441 	if (rval_probe != SATA_SUCCESS) {
12442 		cportinfo->cport_state = SATA_PSTATE_FAILED;
12443 		SATA_LOG_D((sata_hba_inst, CE_WARN, "sata_reprobe_pmult: "
12444 		    "SATA port %d probing failed", cport));
12445 		sata_log(sata_hba_inst, CE_WARN,
12446 		    "SATA port multiplier detached at port %d", cport);
12447 		mutex_exit(&cportinfo->cport_mutex);
12448 		sata_free_pmult(sata_hba_inst, sata_device);
12449 		return (SATA_FAILURE);
12450 	}
12451 
12452 	/*
12453 	 * update sata port state and set device type
12454 	 */
12455 	sata_update_port_info(sata_hba_inst, sata_device);
12456 	cportinfo->cport_state &= ~SATA_STATE_PROBING;
12457 	cportinfo->cport_state |= SATA_STATE_PROBED;
12458 
12459 	/*
12460 	 * Sanity check - Port is active? Is the link active?
12461 	 * Is there any device attached?
12462 	 */
12463 	if ((cportinfo->cport_state &
12464 	    (SATA_PSTATE_SHUTDOWN | SATA_PSTATE_FAILED)) ||
12465 	    (cportinfo->cport_scr.sstatus & SATA_PORT_DEVLINK_UP_MASK) !=
12466 	    SATA_PORT_DEVLINK_UP ||
12467 	    (sata_device->satadev_type == SATA_DTYPE_NONE)) {
12468 		cportinfo->cport_dev_type = SATA_DTYPE_NONE;
12469 		mutex_exit(&cportinfo->cport_mutex);
12470 		sata_free_pmult(sata_hba_inst, sata_device);
12471 		sata_log(sata_hba_inst, CE_WARN,
12472 		    "SATA port multiplier detached at port %d", cport);
12473 		return (SATA_SUCCESS);
12474 	}
12475 
12476 	/*
12477 	 * Device changed: PMult -> Non-PMult
12478 	 *
12479 	 * This situation is uncommon, most possibly being caused by errors
12480 	 * after which the port multiplier is not correct initialized and
12481 	 * recognized. In that case the new device will be marked as unknown
12482 	 * and will not be automatically probed in this routine. Instead
12483 	 * system administrator could manually restart it via cfgadm(8).
12484 	 */
12485 	if (sata_device->satadev_type != SATA_DTYPE_PMULT) {
12486 		cportinfo->cport_dev_type = SATA_DTYPE_UNKNOWN;
12487 		mutex_exit(&cportinfo->cport_mutex);
12488 		sata_free_pmult(sata_hba_inst, sata_device);
12489 		sata_log(sata_hba_inst, CE_WARN,
12490 		    "SATA port multiplier detached at port %d", cport);
12491 		return (SATA_FAILURE);
12492 	}
12493 
12494 	/*
12495 	 * Now we know it is a port multiplier. However, if this is not the
12496 	 * previously attached port multiplier - they may have different
12497 	 * pmport numbers - we need to re-allocate data structures for every
12498 	 * pmport and drive.
12499 	 *
12500 	 * Port multipliers of the same model have identical values in these
12501 	 * registers, so it is still necessary to update the information of
12502 	 * all drives attached to the previous port multiplier afterwards.
12503 	 */
12504 	/* Device changed: PMult -> another PMult */
12505 	mutex_exit(&cportinfo->cport_mutex);
12506 	sata_free_pmult(sata_hba_inst, sata_device);
12507 	if (sata_alloc_pmult(sata_hba_inst, sata_device) != SATA_SUCCESS)
12508 		return (SATA_FAILURE);
12509 	mutex_enter(&cportinfo->cport_mutex);
12510 
12511 	SATADBG1(SATA_DBG_PMULT, sata_hba_inst,
12512 	    "SATA port multiplier [changed] at port %d", cport);
12513 	sata_log(sata_hba_inst, CE_WARN,
12514 	    "SATA port multiplier detected at port %d", cport);
12515 
12516 	/*
12517 	 * Mark all the port multiplier port behind the port
12518 	 * multiplier behind with link events, so that the sata daemon
12519 	 * will update their status.
12520 	 */
12521 	pmultinfo->pmult_event_flags |= SATA_EVNT_DEVICE_RESET;
12522 	mutex_exit(&cportinfo->cport_mutex);
12523 
12524 	return (SATA_SUCCESS);
12525 }
12526 
12527 /*
12528  * Re-probe a port multiplier port, check for a device and attach info
12529  * structures when necessary. Identify Device data is fetched, if possible.
12530  * Assumption: sata address is already validated as port multiplier port.
12531  * SATA_SUCCESS is returned if port is re-probed sucessfully, regardless of
12532  * the presence of a device and its type.
12533  *
12534  * flag arg specifies that the function should try multiple times to identify
12535  * device type and to initialize it, or it should return immediately on failure.
12536  * SATA_DEV_IDENTIFY_RETRY - retry
12537  * SATA_DEV_IDENTIFY_NORETRY - no retry
12538  *
12539  * SATA_FAILURE is returned if one of the operations failed.
12540  *
12541  * This function cannot be called in interrupt context - it may sleep.
12542  *
12543  * NOTE: Should be only called by sata_probe_port() in case target port is a
12544  *       port multiplier port.
12545  * NOTE: No Mutex should be hold.
12546  */
12547 static int
sata_reprobe_pmport(sata_hba_inst_t * sata_hba_inst,sata_device_t * sata_device,int flag)12548 sata_reprobe_pmport(sata_hba_inst_t *sata_hba_inst, sata_device_t *sata_device,
12549     int flag)
12550 {
12551 	sata_cport_info_t *cportinfo = NULL;
12552 	sata_pmport_info_t *pmportinfo = NULL;
12553 	sata_drive_info_t *sdinfo, *osdinfo;
12554 	sata_device_t sdevice;
12555 	boolean_t init_device = B_FALSE;
12556 	int prev_device_type = SATA_DTYPE_NONE;
12557 	int prev_device_settings = 0;
12558 	int prev_device_state = 0;
12559 	clock_t start_time;
12560 	uint8_t cport = sata_device->satadev_addr.cport;
12561 	uint8_t pmport = sata_device->satadev_addr.pmport;
12562 	int rval;
12563 
12564 	cportinfo = SATA_CPORT_INFO(sata_hba_inst, cport);
12565 	pmportinfo = SATA_PMPORT_INFO(sata_hba_inst, cport, pmport);
12566 	osdinfo = SATA_PMPORTINFO_DRV_INFO(pmportinfo);
12567 
12568 	if (osdinfo != NULL) {
12569 		/*
12570 		 * We are re-probing port with a previously attached device.
12571 		 * Save previous device type and settings.
12572 		 */
12573 		prev_device_type = pmportinfo->pmport_dev_type;
12574 		prev_device_settings = osdinfo->satadrv_settings;
12575 		prev_device_state = osdinfo->satadrv_state;
12576 	}
12577 
12578 	start_time = ddi_get_lbolt();
12579 
12580 	/* check parent status */
12581 	mutex_enter(&cportinfo->cport_mutex);
12582 	if ((cportinfo->cport_state &
12583 	    (SATA_PSTATE_SHUTDOWN | SATA_PSTATE_FAILED)) ||
12584 	    (cportinfo->cport_scr.sstatus & SATA_PORT_DEVLINK_UP_MASK) !=
12585 	    SATA_PORT_DEVLINK_UP) {
12586 		mutex_exit(&cportinfo->cport_mutex);
12587 		return (SATA_FAILURE);
12588 	}
12589 	mutex_exit(&cportinfo->cport_mutex);
12590 
12591 retry_probe_pmport:
12592 
12593 	/* probe port */
12594 	mutex_enter(&pmportinfo->pmport_mutex);
12595 	pmportinfo->pmport_state &= ~SATA_PORT_STATE_CLEAR_MASK;
12596 	pmportinfo->pmport_state |= SATA_STATE_PROBING;
12597 	mutex_exit(&pmportinfo->pmport_mutex);
12598 
12599 	rval = (*SATA_PROBE_PORT_FUNC(sata_hba_inst))
12600 	    (SATA_DIP(sata_hba_inst), sata_device);
12601 
12602 	/* might need retry because we cannot touch registers. */
12603 	if (rval == SATA_FAILURE) {
12604 		mutex_enter(&pmportinfo->pmport_mutex);
12605 		pmportinfo->pmport_state = SATA_PSTATE_FAILED;
12606 		mutex_exit(&pmportinfo->pmport_mutex);
12607 		SATA_LOG_D((sata_hba_inst, CE_WARN, "sata_reprobe_pmport: "
12608 		    "SATA port %d:%d probing failed",
12609 		    cport, pmport));
12610 		return (SATA_FAILURE);
12611 	} else if (rval == SATA_RETRY) {
12612 		SATA_LOG_D((sata_hba_inst, CE_WARN, "sata_reprobe_pmport: "
12613 		    "SATA port %d:%d probing failed, retrying...",
12614 		    cport, pmport));
12615 		clock_t cur_time = ddi_get_lbolt();
12616 		/*
12617 		 * A device was not successfully identified or initialized.
12618 		 * Track retry time for device identification.
12619 		 */
12620 		if ((cur_time - start_time) <
12621 		    drv_usectohz(SATA_DEV_REPROBE_TIMEOUT)) {
12622 			/* sleep for a while */
12623 			delay(drv_usectohz(SATA_DEV_RETRY_DLY));
12624 			goto retry_probe_pmport;
12625 		} else {
12626 			mutex_enter(&pmportinfo->pmport_mutex);
12627 			if (SATA_PMPORTINFO_DRV_INFO(pmportinfo) != NULL)
12628 				SATA_PMPORTINFO_DRV_INFO(pmportinfo)->
12629 				    satadrv_state = SATA_DSTATE_FAILED;
12630 			mutex_exit(&pmportinfo->pmport_mutex);
12631 			return (SATA_SUCCESS);
12632 		}
12633 	}
12634 
12635 	/*
12636 	 * Sanity check - Controller port is active? Is the link active?
12637 	 * Is it still a port multiplier?
12638 	 */
12639 	if ((cportinfo->cport_state &
12640 	    (SATA_PSTATE_SHUTDOWN | SATA_PSTATE_FAILED)) ||
12641 	    (cportinfo->cport_scr.sstatus & SATA_PORT_DEVLINK_UP_MASK) !=
12642 	    SATA_PORT_DEVLINK_UP ||
12643 	    (cportinfo->cport_dev_type != SATA_DTYPE_PMULT)) {
12644 		/*
12645 		 * Port in non-usable state or no link active/no
12646 		 * device. Free info structure.
12647 		 */
12648 		cportinfo->cport_dev_type = SATA_DTYPE_UNKNOWN;
12649 
12650 		sdevice.satadev_addr.cport = cport;
12651 		sdevice.satadev_addr.pmport = pmport;
12652 		sdevice.satadev_addr.qual = SATA_ADDR_PMULT;
12653 		mutex_exit(&cportinfo->cport_mutex);
12654 
12655 		sata_free_pmult(sata_hba_inst, &sdevice);
12656 		return (SATA_FAILURE);
12657 	}
12658 
12659 	/* SATA_SUCCESS NOW */
12660 	/*
12661 	 * update sata port state and set device type
12662 	 */
12663 	mutex_enter(&pmportinfo->pmport_mutex);
12664 	sata_update_pmport_info(sata_hba_inst, sata_device);
12665 	pmportinfo->pmport_state &= ~SATA_STATE_PROBING;
12666 
12667 	/*
12668 	 * Sanity check - Port is active? Is the link active?
12669 	 * Is there any device attached?
12670 	 */
12671 	if ((pmportinfo->pmport_state &
12672 	    (SATA_PSTATE_SHUTDOWN | SATA_PSTATE_FAILED)) ||
12673 	    (pmportinfo->pmport_scr.sstatus & SATA_PORT_DEVLINK_UP_MASK) !=
12674 	    SATA_PORT_DEVLINK_UP) {
12675 		/*
12676 		 * Port in non-usable state or no link active/no device.
12677 		 * Free info structure if necessary (direct attached drive
12678 		 * only, for now!
12679 		 */
12680 		sdinfo = SATA_PMPORTINFO_DRV_INFO(pmportinfo);
12681 		SATA_PMPORTINFO_DRV_INFO(pmportinfo) = NULL;
12682 		/* Add here differentiation for device attached or not */
12683 		pmportinfo->pmport_dev_type = SATA_DTYPE_NONE;
12684 		mutex_exit(&pmportinfo->pmport_mutex);
12685 		if (sdinfo != NULL)
12686 			kmem_free(sdinfo, sizeof (sata_drive_info_t));
12687 		return (SATA_SUCCESS);
12688 	}
12689 
12690 	pmportinfo->pmport_state |= SATA_STATE_READY;
12691 	pmportinfo->pmport_dev_type = sata_device->satadev_type;
12692 	sdinfo = SATA_PMPORTINFO_DRV_INFO(pmportinfo);
12693 
12694 	/*
12695 	 * If we are re-probing the port, there may be
12696 	 * sata_drive_info structure attached
12697 	 * (or sata_pm_info, if PMult is supported).
12698 	 */
12699 	if (sata_device->satadev_type == SATA_DTYPE_NONE) {
12700 		/*
12701 		 * There is no device, so remove device info structure,
12702 		 * if necessary.
12703 		 */
12704 		SATA_PMPORTINFO_DRV_INFO(pmportinfo) = NULL;
12705 		pmportinfo->pmport_dev_type = SATA_DTYPE_NONE;
12706 		if (sdinfo != NULL) {
12707 			kmem_free(sdinfo, sizeof (sata_drive_info_t));
12708 			sata_log(sata_hba_inst, CE_WARN,
12709 			    "SATA device detached from port %d:%d",
12710 			    cport, pmport);
12711 		}
12712 		mutex_exit(&pmportinfo->pmport_mutex);
12713 		return (SATA_SUCCESS);
12714 	}
12715 
12716 	/* this should not be a pmult */
12717 	ASSERT(sata_device->satadev_type != SATA_DTYPE_PMULT);
12718 	if (sdinfo == NULL) {
12719 		/*
12720 		 * There is some device attached, but there is
12721 		 * no sata_drive_info structure - allocate one
12722 		 */
12723 		mutex_exit(&pmportinfo->pmport_mutex);
12724 		sdinfo = kmem_zalloc(sizeof (sata_drive_info_t),
12725 		    KM_SLEEP);
12726 		mutex_enter(&pmportinfo->pmport_mutex);
12727 		/*
12728 		 * Recheck, that the port state did not change when we
12729 		 * released mutex.
12730 		 */
12731 		if (pmportinfo->pmport_state & SATA_STATE_READY) {
12732 			SATA_PMPORTINFO_DRV_INFO(pmportinfo) = sdinfo;
12733 			sdinfo->satadrv_addr = pmportinfo->pmport_addr;
12734 			sdinfo->satadrv_addr.qual = SATA_ADDR_DPMPORT;
12735 			sdinfo->satadrv_type = SATA_DTYPE_UNKNOWN;
12736 			sdinfo->satadrv_state = SATA_STATE_UNKNOWN;
12737 		} else {
12738 			/*
12739 			 * Port is not in ready state, we
12740 			 * cannot attach a device.
12741 			 */
12742 			mutex_exit(&pmportinfo->pmport_mutex);
12743 			kmem_free(sdinfo, sizeof (sata_drive_info_t));
12744 			return (SATA_SUCCESS);
12745 		}
12746 		/*
12747 		 * Since we are adding device, presumably new one,
12748 		 * indicate that it  should be initalized,
12749 		 * as well as some internal framework states).
12750 		 */
12751 		init_device = B_TRUE;
12752 	}
12753 
12754 	pmportinfo->pmport_dev_type = SATA_DTYPE_UNKNOWN;
12755 	sata_device->satadev_addr.qual = sdinfo->satadrv_addr.qual;
12756 
12757 	mutex_exit(&pmportinfo->pmport_mutex);
12758 	/*
12759 	 * Figure out what kind of device we are really
12760 	 * dealing with.
12761 	 */
12762 	rval = sata_probe_device(sata_hba_inst, sata_device);
12763 
12764 	mutex_enter(&pmportinfo->pmport_mutex);
12765 	if (rval == SATA_SUCCESS) {
12766 		/*
12767 		 * If we are dealing with the same type of a device as before,
12768 		 * restore its settings flags.
12769 		 */
12770 		if (osdinfo != NULL &&
12771 		    sata_device->satadev_type == prev_device_type)
12772 			sdinfo->satadrv_settings = prev_device_settings;
12773 
12774 		mutex_exit(&pmportinfo->pmport_mutex);
12775 		/* Set initial device features, if necessary */
12776 		if (init_device == B_TRUE) {
12777 			rval = sata_initialize_device(sata_hba_inst, sdinfo);
12778 		}
12779 		if (rval == SATA_SUCCESS)
12780 			return (rval);
12781 	} else {
12782 		/*
12783 		 * If there was some device info before we probe the device,
12784 		 * restore previous device setting, so we can retry from scratch
12785 		 * later. Providing, of course, that device has not disappeared
12786 		 * during probing process.
12787 		 */
12788 		if (sata_device->satadev_type != SATA_DTYPE_NONE) {
12789 			if (osdinfo != NULL) {
12790 				pmportinfo->pmport_dev_type = prev_device_type;
12791 				sdinfo->satadrv_type = prev_device_type;
12792 				sdinfo->satadrv_state = prev_device_state;
12793 			}
12794 		} else {
12795 			/* device is gone */
12796 			kmem_free(sdinfo, sizeof (sata_drive_info_t));
12797 			pmportinfo->pmport_dev_type = SATA_DTYPE_NONE;
12798 			SATA_PMPORTINFO_DRV_INFO(pmportinfo) = NULL;
12799 			mutex_exit(&pmportinfo->pmport_mutex);
12800 			return (SATA_SUCCESS);
12801 		}
12802 		mutex_exit(&pmportinfo->pmport_mutex);
12803 	}
12804 
12805 	if (flag == SATA_DEV_IDENTIFY_RETRY) {
12806 		clock_t cur_time = ddi_get_lbolt();
12807 		/*
12808 		 * A device was not successfully identified or initialized.
12809 		 * Track retry time for device identification.
12810 		 */
12811 		if ((cur_time - start_time) <
12812 		    drv_usectohz(SATA_DEV_REPROBE_TIMEOUT)) {
12813 			/* sleep for a while */
12814 			delay(drv_usectohz(SATA_DEV_RETRY_DLY));
12815 			goto retry_probe_pmport;
12816 		} else {
12817 			mutex_enter(&pmportinfo->pmport_mutex);
12818 			if (SATA_PMPORTINFO_DRV_INFO(pmportinfo) != NULL)
12819 				SATA_PMPORTINFO_DRV_INFO(pmportinfo)->
12820 				    satadrv_state = SATA_DSTATE_FAILED;
12821 			mutex_exit(&pmportinfo->pmport_mutex);
12822 		}
12823 	}
12824 	return (SATA_SUCCESS);
12825 }
12826 
12827 /*
12828  * Allocated related structure for a port multiplier and its device ports
12829  *
12830  * Port multiplier should be ready and probed, and related information like
12831  * the number of the device ports should be store in sata_device_t.
12832  *
12833  * NOTE: No Mutex should be hold.
12834  */
12835 static int
sata_alloc_pmult(sata_hba_inst_t * sata_hba_inst,sata_device_t * sata_device)12836 sata_alloc_pmult(sata_hba_inst_t *sata_hba_inst, sata_device_t *sata_device)
12837 {
12838 	dev_info_t *dip = SATA_DIP(sata_hba_inst);
12839 	sata_cport_info_t *cportinfo = NULL;
12840 	sata_pmult_info_t *pmultinfo = NULL;
12841 	sata_pmport_info_t *pmportinfo = NULL;
12842 	sata_device_t sd;
12843 	dev_t minor_number;
12844 	char name[16];
12845 	uint8_t cport = sata_device->satadev_addr.cport;
12846 	int rval;
12847 	int npmport;
12848 
12849 	cportinfo = SATA_CPORT_INFO(sata_hba_inst, cport);
12850 
12851 	/* This function might be called while a port-mult is hot-plugged. */
12852 	mutex_enter(&cportinfo->cport_mutex);
12853 
12854 	/* dev_type's not updated when get called from sata_reprobe_port() */
12855 	if (SATA_CPORTINFO_PMULT_INFO(cportinfo) == NULL) {
12856 		/* Create a pmult_info structure */
12857 		SATA_CPORTINFO_PMULT_INFO(cportinfo) =
12858 		    kmem_zalloc(sizeof (sata_pmult_info_t), KM_SLEEP);
12859 	}
12860 	pmultinfo = SATA_CPORTINFO_PMULT_INFO(cportinfo);
12861 
12862 	pmultinfo->pmult_addr = sata_device->satadev_addr;
12863 	pmultinfo->pmult_addr.qual = SATA_ADDR_PMULT;
12864 	pmultinfo->pmult_state = SATA_STATE_PROBING;
12865 
12866 	/*
12867 	 * Probe the port multiplier with qualifier SATA_ADDR_PMULT_SPEC,
12868 	 * The HBA driver should initialize and register the port multiplier,
12869 	 * sata_register_pmult() will fill following fields,
12870 	 *   + sata_pmult_info.pmult_gscr
12871 	 *   + sata_pmult_info.pmult_num_dev_ports
12872 	 */
12873 	sd.satadev_addr = sata_device->satadev_addr;
12874 	sd.satadev_addr.qual = SATA_ADDR_PMULT_SPEC;
12875 	mutex_exit(&cportinfo->cport_mutex);
12876 	rval = (*SATA_PROBE_PORT_FUNC(sata_hba_inst))
12877 	    (SATA_DIP(sata_hba_inst), &sd);
12878 	mutex_enter(&cportinfo->cport_mutex);
12879 
12880 	if (rval != SATA_SUCCESS ||
12881 	    (sd.satadev_type != SATA_DTYPE_PMULT) ||
12882 	    !(sd.satadev_state & SATA_DSTATE_PMULT_INIT)) {
12883 		SATA_CPORTINFO_PMULT_INFO(cportinfo) = NULL;
12884 		kmem_free(pmultinfo, sizeof (sata_pmult_info_t));
12885 		cportinfo->cport_state = SATA_PSTATE_FAILED;
12886 		cportinfo->cport_dev_type = SATA_DTYPE_UNKNOWN;
12887 		mutex_exit(&cportinfo->cport_mutex);
12888 		SATADBG1(SATA_DBG_PMULT, sata_hba_inst,
12889 		    "sata_alloc_pmult: failed to initialize pmult "
12890 		    "at port %d.", cport)
12891 		return (SATA_FAILURE);
12892 	}
12893 
12894 	/* Initialize pmport_info structure */
12895 	for (npmport = 0; npmport < pmultinfo->pmult_num_dev_ports;
12896 	    npmport++) {
12897 
12898 		/* if everything is allocated, skip */
12899 		if (SATA_PMPORT_INFO(sata_hba_inst, cport, npmport) != NULL)
12900 			continue;
12901 
12902 		pmportinfo = kmem_zalloc(sizeof (sata_pmport_info_t), KM_SLEEP);
12903 		mutex_init(&pmportinfo->pmport_mutex, NULL, MUTEX_DRIVER, NULL);
12904 		mutex_exit(&cportinfo->cport_mutex);
12905 
12906 		mutex_enter(&pmportinfo->pmport_mutex);
12907 		pmportinfo->pmport_addr.cport = cport;
12908 		pmportinfo->pmport_addr.pmport = (uint8_t)npmport;
12909 		pmportinfo->pmport_addr.qual = SATA_ADDR_PMPORT;
12910 		pmportinfo->pmport_state &= ~SATA_PORT_STATE_CLEAR_MASK;
12911 		mutex_exit(&pmportinfo->pmport_mutex);
12912 
12913 		mutex_enter(&cportinfo->cport_mutex);
12914 		SATA_PMPORT_INFO(sata_hba_inst, cport, npmport) = pmportinfo;
12915 
12916 		/* Create an attachment point */
12917 		minor_number = SATA_MAKE_AP_MINOR(ddi_get_instance(dip),
12918 		    cport, (uint8_t)npmport, SATA_ADDR_PMPORT);
12919 		(void) sprintf(name, "%d.%d", cport, npmport);
12920 
12921 		if (ddi_create_minor_node(dip, name, S_IFCHR, minor_number,
12922 		    DDI_NT_SATA_ATTACHMENT_POINT, 0) != DDI_SUCCESS) {
12923 			sata_log(sata_hba_inst, CE_WARN, "sata_hba_attach: "
12924 			    "cannot create SATA attachment point for "
12925 			    "port %d:%d", cport, npmport);
12926 		}
12927 	}
12928 
12929 	pmultinfo->pmult_state &= ~SATA_STATE_PROBING;
12930 	pmultinfo->pmult_state |= (SATA_STATE_PROBED|SATA_STATE_READY);
12931 	cportinfo->cport_dev_type = SATA_DTYPE_PMULT;
12932 
12933 	mutex_exit(&cportinfo->cport_mutex);
12934 	return (SATA_SUCCESS);
12935 }
12936 
12937 /*
12938  * Free data structures when a port multiplier is removed.
12939  *
12940  * NOTE: No Mutex should be hold.
12941  */
12942 static void
sata_free_pmult(sata_hba_inst_t * sata_hba_inst,sata_device_t * sata_device)12943 sata_free_pmult(sata_hba_inst_t *sata_hba_inst, sata_device_t *sata_device)
12944 {
12945 	sata_cport_info_t *cportinfo;
12946 	sata_pmult_info_t *pmultinfo;
12947 	sata_pmport_info_t *pmportinfo;
12948 	sata_device_t pmport_device;
12949 	sata_drive_info_t *sdinfo;
12950 	dev_info_t *tdip;
12951 	char name[16];
12952 	uint8_t cport = sata_device->satadev_addr.cport;
12953 	int npmport;
12954 
12955 	cportinfo = SATA_CPORT_INFO(sata_hba_inst, cport);
12956 
12957 	/* This function might be called while port-mult is hot plugged. */
12958 	mutex_enter(&cportinfo->cport_mutex);
12959 
12960 	cportinfo->cport_dev_type = SATA_DTYPE_NONE;
12961 	pmultinfo = SATA_CPORTINFO_PMULT_INFO(cportinfo);
12962 	ASSERT(pmultinfo != NULL);
12963 
12964 	/* Free pmport_info structure */
12965 	for (npmport = 0; npmport < pmultinfo->pmult_num_dev_ports;
12966 	    npmport++) {
12967 		pmportinfo = SATA_PMPORT_INFO(sata_hba_inst, cport, npmport);
12968 		if (pmportinfo == NULL)
12969 			continue;
12970 		mutex_exit(&cportinfo->cport_mutex);
12971 
12972 		mutex_enter(&pmportinfo->pmport_mutex);
12973 		sdinfo = pmportinfo->pmport_sata_drive;
12974 		SATA_PMPORTINFO_DRV_INFO(pmportinfo) = NULL;
12975 		mutex_exit(&pmportinfo->pmport_mutex);
12976 
12977 		/* Remove attachment point. */
12978 		name[0] = '\0';
12979 		(void) sprintf(name, "%d.%d", cport, npmport);
12980 		ddi_remove_minor_node(SATA_DIP(sata_hba_inst), name);
12981 		sata_log(sata_hba_inst, CE_NOTE,
12982 		    "Remove attachment point of port %d:%d",
12983 		    cport, npmport);
12984 
12985 		/*
12986 		 * Rumove target node
12987 		 */
12988 		bzero(&pmport_device, sizeof (sata_device_t));
12989 		pmport_device.satadev_rev = SATA_DEVICE_REV;
12990 		pmport_device.satadev_addr.cport = cport;
12991 		pmport_device.satadev_addr.pmport = (uint8_t)npmport;
12992 		pmport_device.satadev_addr.qual = SATA_ADDR_DPMPORT;
12993 
12994 		tdip = sata_get_scsi_target_dip(SATA_DIP(sata_hba_inst),
12995 		    &(pmport_device.satadev_addr));
12996 		if (tdip != NULL && ndi_devi_offline(tdip,
12997 		    NDI_DEVI_REMOVE) != NDI_SUCCESS) {
12998 			/*
12999 			 * Problem :
13000 			 * The target node remained attached.
13001 			 * This happens when the device file was open
13002 			 * or a node was waiting for resources.
13003 			 * Cannot do anything about it.
13004 			 */
13005 			SATA_LOG_D((sata_hba_inst, CE_WARN,
13006 			    "sata_free_pmult: could not unconfigure device "
13007 			    "before disconnecting the SATA port %d:%d",
13008 			    cport, npmport));
13009 
13010 			/*
13011 			 * Set DEVICE REMOVED state in the target
13012 			 * node. It will prevent access to the device
13013 			 * even when a new device is attached, until
13014 			 * the old target node is released, removed and
13015 			 * recreated for a new  device.
13016 			 */
13017 			sata_set_device_removed(tdip);
13018 
13019 			/*
13020 			 * Instruct event daemon to try the target
13021 			 * node cleanup later.
13022 			 */
13023 			sata_set_target_node_cleanup(
13024 			    sata_hba_inst, &(pmport_device.satadev_addr));
13025 
13026 		}
13027 		mutex_enter(&cportinfo->cport_mutex);
13028 
13029 		/*
13030 		 * Add here differentiation for device attached or not
13031 		 */
13032 		if (sdinfo != NULL)  {
13033 			sata_log(sata_hba_inst, CE_WARN,
13034 			    "SATA device detached from port %d:%d",
13035 			    cport, npmport);
13036 			kmem_free(sdinfo, sizeof (sata_drive_info_t));
13037 		}
13038 
13039 		mutex_destroy(&pmportinfo->pmport_mutex);
13040 		kmem_free(pmportinfo, sizeof (sata_pmport_info_t));
13041 	}
13042 
13043 	kmem_free(pmultinfo, sizeof (sata_pmult_info_t));
13044 
13045 	cportinfo->cport_devp.cport_sata_pmult = NULL;
13046 
13047 	sata_log(sata_hba_inst, CE_WARN,
13048 	    "SATA port multiplier detached at port %d", cport);
13049 
13050 	mutex_exit(&cportinfo->cport_mutex);
13051 }
13052 
13053 /*
13054  * Initialize device
13055  * Specified device is initialized to a default state.
13056  *
13057  * Returns SATA_SUCCESS if all device features are set successfully,
13058  * SATA_RETRY if device is accessible but device features were not set
13059  * successfully, and SATA_FAILURE otherwise.
13060  */
13061 static int
sata_initialize_device(sata_hba_inst_t * sata_hba_inst,sata_drive_info_t * sdinfo)13062 sata_initialize_device(sata_hba_inst_t *sata_hba_inst,
13063     sata_drive_info_t *sdinfo)
13064 {
13065 	int rval;
13066 
13067 	sata_save_drive_settings(sdinfo);
13068 
13069 	sdinfo->satadrv_settings |= SATA_DEV_READ_AHEAD;
13070 
13071 	sata_init_write_cache_mode(sdinfo);
13072 
13073 	rval = sata_set_drive_features(sata_hba_inst, sdinfo, 0);
13074 
13075 	/* Determine current data transfer mode */
13076 	if ((sdinfo->satadrv_id.ai_cap & SATA_DMA_SUPPORT) == 0) {
13077 		sdinfo->satadrv_settings &= ~SATA_DEV_DMA;
13078 	} else if ((sdinfo->satadrv_id.ai_validinfo &
13079 	    SATA_VALIDINFO_88) != 0 &&
13080 	    (sdinfo->satadrv_id.ai_ultradma & SATA_UDMA_SEL_MASK) != 0) {
13081 		sdinfo->satadrv_settings |= SATA_DEV_DMA;
13082 	} else if ((sdinfo->satadrv_id.ai_dworddma &
13083 	    SATA_MDMA_SEL_MASK) != 0) {
13084 		sdinfo->satadrv_settings |= SATA_DEV_DMA;
13085 	} else
13086 		/* DMA supported, not no DMA transfer mode is selected !? */
13087 		sdinfo->satadrv_settings &= ~SATA_DEV_DMA;
13088 
13089 	if ((sdinfo->satadrv_id.ai_cmdset83 & 0x20) &&
13090 	    (sdinfo->satadrv_id.ai_features86 & 0x20))
13091 		sdinfo->satadrv_power_level = SATA_POWER_STANDBY;
13092 	else
13093 		sdinfo->satadrv_power_level = SATA_POWER_ACTIVE;
13094 
13095 	return (rval);
13096 }
13097 
13098 
13099 /*
13100  * Initialize write cache mode.
13101  *
13102  * The default write cache setting for SATA HDD is provided by sata_write_cache
13103  * static variable. ATAPI CD/DVDs devices have write cache default is
13104  * determined by sata_atapicdvd_write_cache static variable.
13105  * ATAPI tape devices have write cache default is determined by
13106  * sata_atapitape_write_cache static variable.
13107  * ATAPI disk devices have write cache default is determined by
13108  * sata_atapidisk_write_cache static variable.
13109  * 1 - enable
13110  * 0 - disable
13111  * any other value - current drive setting
13112  *
13113  * Although there is not reason to disable write cache on CD/DVD devices,
13114  * tape devices and ATAPI disk devices, the default setting control is provided
13115  * for the maximun flexibility.
13116  *
13117  * In the future, it may be overridden by the
13118  * disk-write-cache-enable property setting, if it is defined.
13119  * Returns SATA_SUCCESS if all device features are set successfully,
13120  * SATA_FAILURE otherwise.
13121  */
13122 static void
sata_init_write_cache_mode(sata_drive_info_t * sdinfo)13123 sata_init_write_cache_mode(sata_drive_info_t *sdinfo)
13124 {
13125 	switch (sdinfo->satadrv_type) {
13126 	case SATA_DTYPE_ATADISK:
13127 		if (sata_write_cache == 1)
13128 			sdinfo->satadrv_settings |= SATA_DEV_WRITE_CACHE;
13129 		else if (sata_write_cache == 0)
13130 			sdinfo->satadrv_settings &= ~SATA_DEV_WRITE_CACHE;
13131 		/*
13132 		 * When sata_write_cache value is not 0 or 1,
13133 		 * a current setting of the drive's write cache is used.
13134 		 */
13135 		break;
13136 	case SATA_DTYPE_ATAPICD:
13137 		if (sata_atapicdvd_write_cache == 1)
13138 			sdinfo->satadrv_settings |= SATA_DEV_WRITE_CACHE;
13139 		else if (sata_atapicdvd_write_cache == 0)
13140 			sdinfo->satadrv_settings &= ~SATA_DEV_WRITE_CACHE;
13141 		/*
13142 		 * When sata_atapicdvd_write_cache value is not 0 or 1,
13143 		 * a current setting of the drive's write cache is used.
13144 		 */
13145 		break;
13146 	case SATA_DTYPE_ATAPITAPE:
13147 		if (sata_atapitape_write_cache == 1)
13148 			sdinfo->satadrv_settings |= SATA_DEV_WRITE_CACHE;
13149 		else if (sata_atapitape_write_cache == 0)
13150 			sdinfo->satadrv_settings &= ~SATA_DEV_WRITE_CACHE;
13151 		/*
13152 		 * When sata_atapitape_write_cache value is not 0 or 1,
13153 		 * a current setting of the drive's write cache is used.
13154 		 */
13155 		break;
13156 	case SATA_DTYPE_ATAPIDISK:
13157 		if (sata_atapidisk_write_cache == 1)
13158 			sdinfo->satadrv_settings |= SATA_DEV_WRITE_CACHE;
13159 		else if (sata_atapidisk_write_cache == 0)
13160 			sdinfo->satadrv_settings &= ~SATA_DEV_WRITE_CACHE;
13161 		/*
13162 		 * When sata_atapidisk_write_cache value is not 0 or 1,
13163 		 * a current setting of the drive's write cache is used.
13164 		 */
13165 		break;
13166 	}
13167 }
13168 
13169 
13170 /*
13171  * Validate sata address.
13172  * Specified cport, pmport and qualifier has to match
13173  * passed sata_scsi configuration info.
13174  * The presence of an attached device is not verified.
13175  *
13176  * Returns 0 when address is valid, -1 otherwise.
13177  */
13178 static int
sata_validate_sata_address(sata_hba_inst_t * sata_hba_inst,int cport,int pmport,int qual)13179 sata_validate_sata_address(sata_hba_inst_t *sata_hba_inst, int cport,
13180     int pmport, int qual)
13181 {
13182 	if (qual == SATA_ADDR_DCPORT && pmport != 0)
13183 		goto invalid_address;
13184 	if (cport >= SATA_NUM_CPORTS(sata_hba_inst))
13185 		goto invalid_address;
13186 	if ((qual == SATA_ADDR_DPMPORT || qual == SATA_ADDR_PMPORT) &&
13187 	    ((SATA_CPORT_DEV_TYPE(sata_hba_inst, cport) != SATA_DTYPE_PMULT) ||
13188 	    (SATA_PMULT_INFO(sata_hba_inst, cport) == NULL) ||
13189 	    (pmport >= SATA_NUM_PMPORTS(sata_hba_inst, cport))))
13190 		goto invalid_address;
13191 
13192 	return (0);
13193 
13194 invalid_address:
13195 	return (-1);
13196 
13197 }
13198 
13199 /*
13200  * Validate scsi address
13201  * SCSI target address is translated into SATA cport/pmport and compared
13202  * with a controller port/device configuration. LUN has to be 0.
13203  * Returns 0 if a scsi target refers to an attached device,
13204  * returns 1 if address is valid but no valid device is attached,
13205  * returns 2 if address is valid but device type is unknown (not valid device),
13206  * returns -1 if bad address or device is of an unsupported type.
13207  * Upon return sata_device argument is set.
13208  *
13209  * Port multiplier is supported now.
13210  */
13211 static int
sata_validate_scsi_address(sata_hba_inst_t * sata_hba_inst,struct scsi_address * ap,sata_device_t * sata_device)13212 sata_validate_scsi_address(sata_hba_inst_t *sata_hba_inst,
13213     struct scsi_address *ap, sata_device_t *sata_device)
13214 {
13215 	int cport, pmport, qual, rval;
13216 
13217 	rval = -1;	/* Invalid address */
13218 	if (ap->a_lun != 0)
13219 		goto out;
13220 
13221 	qual = SCSI_TO_SATA_ADDR_QUAL(ap->a_target);
13222 	cport = SCSI_TO_SATA_CPORT(ap->a_target);
13223 	pmport = SCSI_TO_SATA_PMPORT(ap->a_target);
13224 
13225 	if (qual != SATA_ADDR_DCPORT && qual != SATA_ADDR_DPMPORT)
13226 		goto out;
13227 
13228 	if (sata_validate_sata_address(sata_hba_inst, cport, pmport, qual) ==
13229 	    0) {
13230 
13231 		sata_cport_info_t *cportinfo;
13232 		sata_pmult_info_t *pmultinfo;
13233 		sata_drive_info_t *sdinfo = NULL;
13234 
13235 		sata_device->satadev_addr.qual = qual;
13236 		sata_device->satadev_addr.cport = cport;
13237 		sata_device->satadev_addr.pmport = pmport;
13238 		sata_device->satadev_rev = SATA_DEVICE_REV_1;
13239 
13240 		rval = 1;	/* Valid sata address */
13241 
13242 		cportinfo = SATA_CPORT_INFO(sata_hba_inst, cport);
13243 		if (qual == SATA_ADDR_DCPORT) {
13244 			if (cportinfo == NULL ||
13245 			    cportinfo->cport_dev_type == SATA_DTYPE_NONE)
13246 				goto out;
13247 
13248 			sdinfo = SATA_CPORTINFO_DRV_INFO(cportinfo);
13249 			if (cportinfo->cport_dev_type == SATA_DTYPE_UNKNOWN &&
13250 			    sdinfo != NULL) {
13251 				rval = 2;
13252 				goto out;
13253 			}
13254 
13255 			if ((cportinfo->cport_dev_type &
13256 			    SATA_VALID_DEV_TYPE) == 0) {
13257 				rval = -1;
13258 				goto out;
13259 			}
13260 
13261 		} else if (qual == SATA_ADDR_DPMPORT) {
13262 			pmultinfo = SATA_CPORTINFO_PMULT_INFO(cportinfo);
13263 			if (pmultinfo == NULL) {
13264 				rval = -1;
13265 				goto out;
13266 			}
13267 			if (SATA_PMPORT_INFO(sata_hba_inst, cport, pmport) ==
13268 			    NULL ||
13269 			    SATA_PMPORT_DEV_TYPE(sata_hba_inst, cport,
13270 			    pmport) == SATA_DTYPE_NONE)
13271 				goto out;
13272 
13273 			sdinfo = SATA_PMPORT_DRV_INFO(sata_hba_inst, cport,
13274 			    pmport);
13275 			if (SATA_PMPORT_DEV_TYPE(sata_hba_inst, cport,
13276 			    pmport) == SATA_DTYPE_UNKNOWN && sdinfo != NULL) {
13277 				rval = 2;
13278 				goto out;
13279 			}
13280 
13281 			if ((SATA_PMPORT_DEV_TYPE(sata_hba_inst, cport,
13282 			    pmport) & SATA_VALID_DEV_TYPE) == 0) {
13283 				rval = -1;
13284 				goto out;
13285 			}
13286 
13287 		} else {
13288 			rval = -1;
13289 			goto out;
13290 		}
13291 		if ((sdinfo == NULL) ||
13292 		    (sdinfo->satadrv_type & SATA_VALID_DEV_TYPE) == 0)
13293 			goto out;
13294 
13295 		sata_device->satadev_type = sdinfo->satadrv_type;
13296 
13297 		return (0);
13298 	}
13299 out:
13300 	if (rval > 0) {
13301 		SATADBG2(SATA_DBG_SCSI_IF, sata_hba_inst,
13302 		    "sata_validate_scsi_address: no valid target %x lun %x",
13303 		    ap->a_target, ap->a_lun);
13304 	}
13305 	return (rval);
13306 }
13307 
13308 /*
13309  * Find dip corresponding to passed device number
13310  *
13311  * Returns NULL if invalid device number is passed or device cannot be found,
13312  * Returns dip is device is found.
13313  */
13314 static dev_info_t *
sata_devt_to_devinfo(dev_t dev)13315 sata_devt_to_devinfo(dev_t dev)
13316 {
13317 	dev_info_t *dip;
13318 #ifndef __lock_lint
13319 	struct devnames *dnp;
13320 	major_t major = getmajor(dev);
13321 	int instance = SATA_MINOR2INSTANCE(getminor(dev));
13322 
13323 	if (major >= devcnt)
13324 		return (NULL);
13325 
13326 	dnp = &devnamesp[major];
13327 	LOCK_DEV_OPS(&(dnp->dn_lock));
13328 	dip = dnp->dn_head;
13329 	while (dip && (ddi_get_instance(dip) != instance)) {
13330 		dip = ddi_get_next(dip);
13331 	}
13332 	UNLOCK_DEV_OPS(&(dnp->dn_lock));
13333 #endif
13334 
13335 	return (dip);
13336 }
13337 
13338 
13339 /*
13340  * Probe device.
13341  * This function issues Identify Device command and initializes local
13342  * sata_drive_info structure if the device can be identified.
13343  * The device type is determined by examining Identify Device
13344  * command response.
13345  * If the sata_hba_inst has linked drive info structure for this
13346  * device address, the Identify Device data is stored into sata_drive_info
13347  * structure linked to the port info structure.
13348  *
13349  * sata_device has to refer to the valid sata port(s) for HBA described
13350  * by sata_hba_inst structure.
13351  *
13352  * Returns:
13353  *	SATA_SUCCESS if device type was successfully probed and port-linked
13354  *		drive info structure was updated;
13355  *	SATA_FAILURE if there is no device, or device was not probed
13356  *		successully;
13357  *	SATA_RETRY if device probe can be retried later.
13358  * If a device cannot be identified, sata_device's dev_state and dev_type
13359  * fields are set to unknown.
13360  * There are no retries in this function. Any retries should be managed by
13361  * the caller.
13362  */
13363 
13364 
13365 static int
sata_probe_device(sata_hba_inst_t * sata_hba_inst,sata_device_t * sata_device)13366 sata_probe_device(sata_hba_inst_t *sata_hba_inst, sata_device_t *sata_device)
13367 {
13368 	sata_pmport_info_t *pmportinfo = NULL;
13369 	sata_drive_info_t *sdinfo;
13370 	sata_drive_info_t new_sdinfo;	/* local drive info struct */
13371 	int rval;
13372 
13373 	ASSERT((SATA_CPORT_STATE(sata_hba_inst,
13374 	    sata_device->satadev_addr.cport) &
13375 	    (SATA_STATE_PROBED | SATA_STATE_READY)) != 0);
13376 
13377 	sata_device->satadev_type = SATA_DTYPE_NONE;
13378 
13379 	mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst,
13380 	    sata_device->satadev_addr.cport)));
13381 
13382 	if (sata_device->satadev_addr.qual == SATA_ADDR_DPMPORT) {
13383 		pmportinfo = SATA_PMPORT_INFO(sata_hba_inst,
13384 		    sata_device->satadev_addr.cport,
13385 		    sata_device->satadev_addr.pmport);
13386 		ASSERT(pmportinfo != NULL);
13387 	}
13388 
13389 	/* Get pointer to port-linked sata device info structure */
13390 	sdinfo = sata_get_device_info(sata_hba_inst, sata_device);
13391 	if (sdinfo != NULL) {
13392 		sdinfo->satadrv_state &=
13393 		    ~(SATA_STATE_PROBED | SATA_STATE_READY);
13394 		sdinfo->satadrv_state |= SATA_STATE_PROBING;
13395 	} else {
13396 		/* No device to probe */
13397 		mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
13398 		    sata_device->satadev_addr.cport)));
13399 		sata_device->satadev_type = SATA_DTYPE_NONE;
13400 		sata_device->satadev_state = SATA_STATE_UNKNOWN;
13401 		return (SATA_FAILURE);
13402 	}
13403 	/*
13404 	 * Need to issue both types of identify device command and
13405 	 * determine device type by examining retreived data/status.
13406 	 * First, ATA Identify Device.
13407 	 */
13408 	bzero(&new_sdinfo, sizeof (sata_drive_info_t));
13409 	new_sdinfo.satadrv_addr = sata_device->satadev_addr;
13410 	mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
13411 	    sata_device->satadev_addr.cport)));
13412 	new_sdinfo.satadrv_type = SATA_DTYPE_ATADISK;
13413 	rval = sata_identify_device(sata_hba_inst, &new_sdinfo);
13414 	if (rval == SATA_RETRY) {
13415 		/* We may try to check for ATAPI device */
13416 		if (SATA_FEATURES(sata_hba_inst) & SATA_CTLF_ATAPI) {
13417 			/*
13418 			 * HBA supports ATAPI - try to issue Identify Packet
13419 			 * Device command.
13420 			 */
13421 			new_sdinfo.satadrv_type = SATA_DTYPE_ATAPI;
13422 			rval = sata_identify_device(sata_hba_inst, &new_sdinfo);
13423 		}
13424 	}
13425 	if (rval == SATA_SUCCESS) {
13426 		/*
13427 		 * Got something responding positively to ATA Identify Device
13428 		 * or to Identify Packet Device cmd.
13429 		 * Save last used device type.
13430 		 */
13431 		sata_device->satadev_type = new_sdinfo.satadrv_type;
13432 
13433 		/* save device info, if possible */
13434 		mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst,
13435 		    sata_device->satadev_addr.cport)));
13436 		sdinfo = sata_get_device_info(sata_hba_inst, sata_device);
13437 		if (sdinfo == NULL) {
13438 			mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
13439 			    sata_device->satadev_addr.cport)));
13440 			return (SATA_FAILURE);
13441 		}
13442 		/*
13443 		 * Copy drive info into the port-linked drive info structure.
13444 		 */
13445 		*sdinfo = new_sdinfo;
13446 		sdinfo->satadrv_state &= ~SATA_STATE_PROBING;
13447 		sdinfo->satadrv_state |= SATA_STATE_PROBED;
13448 		if (sata_device->satadev_addr.qual == SATA_ADDR_DCPORT)
13449 			SATA_CPORT_DEV_TYPE(sata_hba_inst,
13450 			    sata_device->satadev_addr.cport) =
13451 			    sdinfo->satadrv_type;
13452 		else { /* SATA_ADDR_DPMPORT */
13453 			mutex_enter(&pmportinfo->pmport_mutex);
13454 			SATA_PMPORT_DEV_TYPE(sata_hba_inst,
13455 			    sata_device->satadev_addr.cport,
13456 			    sata_device->satadev_addr.pmport) =
13457 			    sdinfo->satadrv_type;
13458 			mutex_exit(&pmportinfo->pmport_mutex);
13459 		}
13460 		mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
13461 		    sata_device->satadev_addr.cport)));
13462 		return (SATA_SUCCESS);
13463 	}
13464 
13465 	/*
13466 	 * It may be SATA_RETRY or SATA_FAILURE return.
13467 	 * Looks like we cannot determine the device type at this time.
13468 	 */
13469 	mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst,
13470 	    sata_device->satadev_addr.cport)));
13471 	sdinfo = sata_get_device_info(sata_hba_inst, sata_device);
13472 	if (sdinfo != NULL) {
13473 		sata_device->satadev_type = SATA_DTYPE_UNKNOWN;
13474 		sdinfo->satadrv_type = SATA_DTYPE_UNKNOWN;
13475 		sdinfo->satadrv_state &= ~SATA_STATE_PROBING;
13476 		sdinfo->satadrv_state |= SATA_STATE_PROBED;
13477 		if (sata_device->satadev_addr.qual == SATA_ADDR_DCPORT)
13478 			SATA_CPORT_DEV_TYPE(sata_hba_inst,
13479 			    sata_device->satadev_addr.cport) =
13480 			    SATA_DTYPE_UNKNOWN;
13481 		else {
13482 			/* SATA_ADDR_DPMPORT */
13483 			mutex_enter(&pmportinfo->pmport_mutex);
13484 			if ((SATA_PMULT_INFO(sata_hba_inst,
13485 			    sata_device->satadev_addr.cport) != NULL) &&
13486 			    (SATA_PMPORT_INFO(sata_hba_inst,
13487 			    sata_device->satadev_addr.cport,
13488 			    sata_device->satadev_addr.pmport) != NULL))
13489 				SATA_PMPORT_DEV_TYPE(sata_hba_inst,
13490 				    sata_device->satadev_addr.cport,
13491 				    sata_device->satadev_addr.pmport) =
13492 				    SATA_DTYPE_UNKNOWN;
13493 			mutex_exit(&pmportinfo->pmport_mutex);
13494 		}
13495 	}
13496 	mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
13497 	    sata_device->satadev_addr.cport)));
13498 	return (rval);
13499 }
13500 
13501 
13502 /*
13503  * Get pointer to sata_drive_info structure.
13504  *
13505  * The sata_device has to contain address (cport, pmport and qualifier) for
13506  * specified sata_scsi structure.
13507  *
13508  * Returns NULL if device address is not valid for this HBA configuration.
13509  * Otherwise, returns a pointer to sata_drive_info structure.
13510  *
13511  * This function should be called with a port mutex held.
13512  */
13513 static sata_drive_info_t *
sata_get_device_info(sata_hba_inst_t * sata_hba_inst,sata_device_t * sata_device)13514 sata_get_device_info(sata_hba_inst_t *sata_hba_inst,
13515     sata_device_t *sata_device)
13516 {
13517 	uint8_t cport = sata_device->satadev_addr.cport;
13518 	uint8_t pmport = sata_device->satadev_addr.pmport;
13519 	uint8_t qual = sata_device->satadev_addr.qual;
13520 
13521 	if (cport >= SATA_NUM_CPORTS(sata_hba_inst))
13522 		return (NULL);
13523 
13524 	if (!(SATA_CPORT_STATE(sata_hba_inst, cport) &
13525 	    (SATA_STATE_PROBED | SATA_STATE_READY)))
13526 		/* Port not probed yet */
13527 		return (NULL);
13528 
13529 	if (SATA_CPORT_DEV_TYPE(sata_hba_inst, cport) == SATA_DTYPE_NONE)
13530 		return (NULL);
13531 
13532 	if (qual == SATA_ADDR_DCPORT) {
13533 		/* Request for a device on a controller port */
13534 		if (SATA_CPORT_DEV_TYPE(sata_hba_inst, cport) ==
13535 		    SATA_DTYPE_PMULT)
13536 			/* Port multiplier attached */
13537 			return (NULL);
13538 		return (SATA_CPORT_DRV_INFO(sata_hba_inst, cport));
13539 	}
13540 	if (qual == SATA_ADDR_DPMPORT) {
13541 		if (SATA_CPORT_DEV_TYPE(sata_hba_inst, cport) !=
13542 		    SATA_DTYPE_PMULT)
13543 			return (NULL);
13544 
13545 		if (pmport > SATA_NUM_PMPORTS(sata_hba_inst, cport))
13546 			return (NULL);
13547 
13548 		if (!(SATA_PMPORT_STATE(sata_hba_inst, cport, pmport) &
13549 		    (SATA_STATE_PROBED | SATA_STATE_READY)))
13550 			/* Port multiplier port not probed yet */
13551 			return (NULL);
13552 
13553 		return (SATA_PMPORT_DRV_INFO(sata_hba_inst, cport, pmport));
13554 	}
13555 
13556 	/* we should not get here */
13557 	return (NULL);
13558 }
13559 
13560 
13561 /*
13562  * sata_identify_device.
13563  * Send Identify Device command to SATA HBA driver.
13564  * If command executes successfully, update sata_drive_info structure pointed
13565  * to by sdinfo argument, including Identify Device data.
13566  * If command fails, invalidate data in sata_drive_info.
13567  *
13568  * Cannot be called from interrupt level.
13569  *
13570  * Returns:
13571  * SATA_SUCCESS if the device was identified as a supported device,
13572  * SATA_RETRY if the device was not identified but could be retried,
13573  * SATA_FAILURE if the device was not identified and identify attempt
13574  *	should not be retried.
13575  */
13576 static int
sata_identify_device(sata_hba_inst_t * sata_hba_inst,sata_drive_info_t * sdinfo)13577 sata_identify_device(sata_hba_inst_t *sata_hba_inst,
13578     sata_drive_info_t *sdinfo)
13579 {
13580 	uint16_t cfg_word;
13581 	int rval;
13582 
13583 	/* fetch device identify data */
13584 	if ((rval = sata_fetch_device_identify_data(sata_hba_inst,
13585 	    sdinfo)) != SATA_SUCCESS)
13586 		goto fail_unknown;
13587 
13588 	cfg_word = sdinfo->satadrv_id.ai_config;
13589 
13590 	/* Set the correct device type */
13591 	if ((cfg_word & SATA_ATA_TYPE_MASK) == SATA_ATA_TYPE) {
13592 		sdinfo->satadrv_type = SATA_DTYPE_ATADISK;
13593 	} else if (cfg_word == SATA_CFA_TYPE) {
13594 		/* It's a Compact Flash media via CF-to-SATA HDD adapter */
13595 		sdinfo->satadrv_type = SATA_DTYPE_ATADISK;
13596 	} else if ((cfg_word & SATA_ATAPI_TYPE_MASK) == SATA_ATAPI_TYPE) {
13597 		switch (cfg_word & SATA_ATAPI_ID_DEV_TYPE) {
13598 		case SATA_ATAPI_CDROM_DEV:
13599 			sdinfo->satadrv_type = SATA_DTYPE_ATAPICD;
13600 			break;
13601 		case SATA_ATAPI_SQACC_DEV:
13602 			sdinfo->satadrv_type = SATA_DTYPE_ATAPITAPE;
13603 			break;
13604 		case SATA_ATAPI_DIRACC_DEV:
13605 			sdinfo->satadrv_type = SATA_DTYPE_ATAPIDISK;
13606 			break;
13607 		case SATA_ATAPI_PROC_DEV:
13608 			sdinfo->satadrv_type = SATA_DTYPE_ATAPIPROC;
13609 			break;
13610 		default:
13611 			sdinfo->satadrv_type = SATA_DTYPE_UNKNOWN;
13612 		}
13613 	} else {
13614 			sdinfo->satadrv_type = SATA_DTYPE_UNKNOWN;
13615 	}
13616 
13617 	if (sdinfo->satadrv_type == SATA_DTYPE_ATADISK) {
13618 		if (sdinfo->satadrv_capacity == 0) {
13619 			/* Non-LBA disk. Too bad... */
13620 			sata_log(sata_hba_inst, CE_WARN,
13621 			    "SATA disk device at port %d does not support LBA",
13622 			    sdinfo->satadrv_addr.cport);
13623 			rval = SATA_FAILURE;
13624 			goto fail_unknown;
13625 		}
13626 	}
13627 #if 0
13628 	/* Left for historical reason */
13629 	/*
13630 	 * Some initial version of SATA spec indicated that at least
13631 	 * UDMA mode 4 has to be supported. It is not metioned in
13632 	 * SerialATA 2.6, so this restriction is removed.
13633 	 */
13634 	/* Check for Ultra DMA modes 6 through 0 being supported */
13635 	for (i = 6; i >= 0; --i) {
13636 		if (sdinfo->satadrv_id.ai_ultradma & (1 << i))
13637 			break;
13638 	}
13639 
13640 	/*
13641 	 * At least UDMA 4 mode has to be supported. If mode 4 or
13642 	 * higher are not supported by the device, fail this
13643 	 * device.
13644 	 */
13645 	if (i < 4) {
13646 		/* No required Ultra DMA mode supported */
13647 		sata_log(sata_hba_inst, CE_WARN,
13648 		    "SATA disk device at port %d does not support UDMA "
13649 		    "mode 4 or higher", sdinfo->satadrv_addr.cport);
13650 		SATA_LOG_D((sata_hba_inst, CE_WARN,
13651 		    "mode 4 or higher required, %d supported", i));
13652 		rval = SATA_FAILURE;
13653 		goto fail_unknown;
13654 	}
13655 #endif
13656 
13657 	/*
13658 	 * For Disk devices, if it doesn't support UDMA mode, we would
13659 	 * like to return failure directly.
13660 	 */
13661 	if ((sdinfo->satadrv_type == SATA_DTYPE_ATADISK) &&
13662 	    !((sdinfo->satadrv_id.ai_validinfo & SATA_VALIDINFO_88) != 0 &&
13663 	    (sdinfo->satadrv_id.ai_ultradma & SATA_UDMA_SUP_MASK) != 0)) {
13664 		sata_log(sata_hba_inst, CE_WARN,
13665 		    "SATA disk device at port %d does not support UDMA",
13666 		    sdinfo->satadrv_addr.cport);
13667 		rval = SATA_FAILURE;
13668 		goto fail_unknown;
13669 	}
13670 
13671 	return (SATA_SUCCESS);
13672 
13673 fail_unknown:
13674 	/* Invalidate sata_drive_info ? */
13675 	sdinfo->satadrv_type = SATA_DTYPE_UNKNOWN;
13676 	sdinfo->satadrv_state = SATA_STATE_UNKNOWN;
13677 	return (rval);
13678 }
13679 
13680 /*
13681  * Log/display device information
13682  */
13683 static void
sata_show_drive_info(sata_hba_inst_t * sata_hba_inst,sata_drive_info_t * sdinfo)13684 sata_show_drive_info(sata_hba_inst_t *sata_hba_inst,
13685     sata_drive_info_t *sdinfo)
13686 {
13687 	int valid_version = 0;
13688 	char msg_buf[MAXPATHLEN];
13689 	int i;
13690 
13691 	/* Show HBA path */
13692 	(void) ddi_pathname(SATA_DIP(sata_hba_inst), msg_buf);
13693 
13694 	cmn_err(CE_CONT, "?%s :\n", msg_buf);
13695 
13696 	switch (sdinfo->satadrv_type) {
13697 	case SATA_DTYPE_ATADISK:
13698 		(void) sprintf(msg_buf, "SATA disk device at");
13699 		break;
13700 
13701 	case SATA_DTYPE_ATAPICD:
13702 		(void) sprintf(msg_buf, "SATA CD/DVD (ATAPI) device at");
13703 		break;
13704 
13705 	case SATA_DTYPE_ATAPITAPE:
13706 		(void) sprintf(msg_buf, "SATA tape (ATAPI) device at");
13707 		break;
13708 
13709 	case SATA_DTYPE_ATAPIDISK:
13710 		(void) sprintf(msg_buf, "SATA disk (ATAPI) device at");
13711 		break;
13712 
13713 	case SATA_DTYPE_ATAPIPROC:
13714 		(void) sprintf(msg_buf, "SATA processor (ATAPI) device at");
13715 		break;
13716 
13717 	case SATA_DTYPE_UNKNOWN:
13718 		(void) sprintf(msg_buf,
13719 		    "Unsupported SATA device type (cfg 0x%x) at ",
13720 		    sdinfo->satadrv_id.ai_config);
13721 		break;
13722 	}
13723 
13724 	if (sdinfo->satadrv_addr.qual == SATA_ADDR_DCPORT)
13725 		cmn_err(CE_CONT, "?\t%s port %d\n",
13726 		    msg_buf, sdinfo->satadrv_addr.cport);
13727 	else
13728 		cmn_err(CE_CONT, "?\t%s port %d:%d\n",
13729 		    msg_buf, sdinfo->satadrv_addr.cport,
13730 		    sdinfo->satadrv_addr.pmport);
13731 
13732 	bcopy(&sdinfo->satadrv_id.ai_model, msg_buf,
13733 	    sizeof (sdinfo->satadrv_id.ai_model));
13734 	swab(msg_buf, msg_buf, sizeof (sdinfo->satadrv_id.ai_model));
13735 	msg_buf[sizeof (sdinfo->satadrv_id.ai_model)] = '\0';
13736 	cmn_err(CE_CONT, "?\tmodel %s\n", msg_buf);
13737 
13738 	bcopy(&sdinfo->satadrv_id.ai_fw, msg_buf,
13739 	    sizeof (sdinfo->satadrv_id.ai_fw));
13740 	swab(msg_buf, msg_buf, sizeof (sdinfo->satadrv_id.ai_fw));
13741 	msg_buf[sizeof (sdinfo->satadrv_id.ai_fw)] = '\0';
13742 	cmn_err(CE_CONT, "?\tfirmware %s\n", msg_buf);
13743 
13744 	bcopy(&sdinfo->satadrv_id.ai_drvser, msg_buf,
13745 	    sizeof (sdinfo->satadrv_id.ai_drvser));
13746 	swab(msg_buf, msg_buf, sizeof (sdinfo->satadrv_id.ai_drvser));
13747 	msg_buf[sizeof (sdinfo->satadrv_id.ai_drvser)] = '\0';
13748 	if (sdinfo->satadrv_type == SATA_DTYPE_ATADISK) {
13749 		cmn_err(CE_CONT, "?\tserial number %s\n", msg_buf);
13750 	} else {
13751 		/*
13752 		 * Some drives do not implement serial number and may
13753 		 * violate the spec by providing spaces rather than zeros
13754 		 * in serial number field. Scan the buffer to detect it.
13755 		 */
13756 		for (i = 0; i < sizeof (sdinfo->satadrv_id.ai_drvser); i++) {
13757 			if (msg_buf[i] != '\0' && msg_buf[i] != ' ')
13758 				break;
13759 		}
13760 		if (i == sizeof (sdinfo->satadrv_id.ai_drvser)) {
13761 			cmn_err(CE_CONT, "?\tserial number - none\n");
13762 		} else {
13763 			cmn_err(CE_CONT, "?\tserial number %s\n", msg_buf);
13764 		}
13765 	}
13766 
13767 #ifdef SATA_DEBUG
13768 	if (sdinfo->satadrv_id.ai_majorversion != 0 &&
13769 	    sdinfo->satadrv_id.ai_majorversion != 0xffff) {
13770 		int i;
13771 		for (i = 14; i >= 2; i--) {
13772 			if (sdinfo->satadrv_id.ai_majorversion & (1 << i)) {
13773 				valid_version = i;
13774 				break;
13775 			}
13776 		}
13777 		cmn_err(CE_CONT,
13778 		    "?\tATA/ATAPI-%d supported, majver 0x%x minver 0x%x\n",
13779 		    valid_version,
13780 		    sdinfo->satadrv_id.ai_majorversion,
13781 		    sdinfo->satadrv_id.ai_minorversion);
13782 	}
13783 #endif
13784 	/* Log some info */
13785 	cmn_err(CE_CONT, "?\tsupported features:\n");
13786 	msg_buf[0] = '\0';
13787 	if (sdinfo->satadrv_type == SATA_DTYPE_ATADISK) {
13788 		if (sdinfo->satadrv_features_support & SATA_DEV_F_LBA48)
13789 			(void) strlcat(msg_buf, "48-bit LBA, ", MAXPATHLEN);
13790 		else if (sdinfo->satadrv_features_support & SATA_DEV_F_LBA28)
13791 			(void) strlcat(msg_buf, "28-bit LBA, ", MAXPATHLEN);
13792 	}
13793 	if (sdinfo->satadrv_features_support & SATA_DEV_F_DMA)
13794 		(void) strlcat(msg_buf, "DMA", MAXPATHLEN);
13795 	if (sdinfo->satadrv_features_support & SATA_DEV_F_NCQ)
13796 		(void) strlcat(msg_buf, ", Native Command Queueing",
13797 		    MAXPATHLEN);
13798 	if (sdinfo->satadrv_features_support & SATA_DEV_F_TCQ)
13799 		(void) strlcat(msg_buf, ", Legacy Tagged Queuing", MAXPATHLEN);
13800 	if ((sdinfo->satadrv_id.ai_cmdset82 & SATA_SMART_SUPPORTED) &&
13801 	    (sdinfo->satadrv_id.ai_features85 & SATA_SMART_ENABLED))
13802 		(void) strlcat(msg_buf, ", SMART", MAXPATHLEN);
13803 	if ((sdinfo->satadrv_id.ai_cmdset84 & SATA_SMART_SELF_TEST_SUPPORTED) &&
13804 	    (sdinfo->satadrv_id.ai_features87 & SATA_SMART_SELF_TEST_SUPPORTED))
13805 		(void) strlcat(msg_buf, ", SMART self-test", MAXPATHLEN);
13806 	cmn_err(CE_CONT, "?\t %s\n", msg_buf);
13807 	if (sdinfo->satadrv_features_support & SATA_DEV_F_SATA3)
13808 		cmn_err(CE_CONT, "?\tSATA Gen3 signaling speed (6.0Gbps)\n");
13809 	else if (sdinfo->satadrv_features_support & SATA_DEV_F_SATA2)
13810 		cmn_err(CE_CONT, "?\tSATA Gen2 signaling speed (3.0Gbps)\n");
13811 	else if (sdinfo->satadrv_features_support & SATA_DEV_F_SATA1)
13812 		cmn_err(CE_CONT, "?\tSATA Gen1 signaling speed (1.5Gbps)\n");
13813 	if (sdinfo->satadrv_features_support &
13814 	    (SATA_DEV_F_TCQ | SATA_DEV_F_NCQ)) {
13815 		msg_buf[0] = '\0';
13816 		(void) snprintf(msg_buf, MAXPATHLEN,
13817 		    "Supported queue depth %d",
13818 		    sdinfo->satadrv_queue_depth);
13819 		if (!(sata_func_enable &
13820 		    (SATA_ENABLE_QUEUING | SATA_ENABLE_NCQ)))
13821 			(void) strlcat(msg_buf,
13822 			    " - queueing disabled globally", MAXPATHLEN);
13823 		else if (sdinfo->satadrv_queue_depth >
13824 		    sdinfo->satadrv_max_queue_depth) {
13825 			(void) snprintf(&msg_buf[strlen(msg_buf)],
13826 			    MAXPATHLEN - strlen(msg_buf), ", limited to %d",
13827 			    (int)sdinfo->satadrv_max_queue_depth);
13828 		}
13829 		cmn_err(CE_CONT, "?\t%s\n", msg_buf);
13830 	}
13831 
13832 	if (sdinfo->satadrv_type == SATA_DTYPE_ATADISK) {
13833 		(void) sprintf(msg_buf, "\tcapacity = %lu sectors\n",
13834 		    sdinfo->satadrv_capacity);
13835 		cmn_err(CE_CONT, "?%s", msg_buf);
13836 	}
13837 }
13838 
13839 /*
13840  * Log/display port multiplier information
13841  * No Mutex should be hold.
13842  */
13843 static void
sata_show_pmult_info(sata_hba_inst_t * sata_hba_inst,sata_device_t * sata_device)13844 sata_show_pmult_info(sata_hba_inst_t *sata_hba_inst,
13845     sata_device_t *sata_device)
13846 {
13847 	_NOTE(ARGUNUSED(sata_hba_inst))
13848 
13849 	int cport = sata_device->satadev_addr.cport;
13850 	sata_pmult_info_t *pmultinfo;
13851 	char msg_buf[MAXPATHLEN];
13852 	uint32_t gscr0, gscr1, gscr2, gscr64;
13853 
13854 	mutex_enter(&SATA_CPORT_MUTEX(sata_hba_inst, cport));
13855 	pmultinfo = SATA_PMULT_INFO(sata_hba_inst, cport);
13856 	if (pmultinfo == NULL) {
13857 		mutex_exit(&SATA_CPORT_MUTEX(sata_hba_inst, cport));
13858 		return;
13859 	}
13860 
13861 	gscr0 = pmultinfo->pmult_gscr.gscr0;
13862 	gscr1 = pmultinfo->pmult_gscr.gscr1;
13863 	gscr2 = pmultinfo->pmult_gscr.gscr2;
13864 	gscr64 = pmultinfo->pmult_gscr.gscr64;
13865 	mutex_exit(&SATA_CPORT_MUTEX(sata_hba_inst, cport));
13866 
13867 	cmn_err(CE_CONT, "?Port Multiplier %d device-ports found at port %d",
13868 	    sata_device->satadev_add_info, sata_device->satadev_addr.cport);
13869 
13870 	(void) sprintf(msg_buf, "\tVendor_ID 0x%04x, Module_ID 0x%04x",
13871 	    gscr0 & 0xffff, (gscr0 >> 16) & 0xffff);
13872 	cmn_err(CE_CONT, "?%s", msg_buf);
13873 
13874 	(void) strcpy(msg_buf, "\tSupport SATA PMP Spec ");
13875 	if (gscr1 & (1 << 3))
13876 		(void) strlcat(msg_buf, "1.2", MAXPATHLEN);
13877 	else if (gscr1 & (1 << 2))
13878 		(void) strlcat(msg_buf, "1.1", MAXPATHLEN);
13879 	else if (gscr1 & (1 << 1))
13880 		(void) strlcat(msg_buf, "1.0", MAXPATHLEN);
13881 	else
13882 		(void) strlcat(msg_buf, "unknown", MAXPATHLEN);
13883 	cmn_err(CE_CONT, "?%s", msg_buf);
13884 
13885 	(void) strcpy(msg_buf, "\tSupport ");
13886 	if (gscr64 & (1 << 3))
13887 		(void) strlcat(msg_buf, "Asy-Notif, ",
13888 		    MAXPATHLEN);
13889 	if (gscr64 & (1 << 2))
13890 		(void) strlcat(msg_buf, "Dyn-SSC, ", MAXPATHLEN);
13891 	if (gscr64 & (1 << 1))
13892 		(void) strlcat(msg_buf, "Iss-PMREQ, ", MAXPATHLEN);
13893 	if (gscr64 & (1 << 0))
13894 		(void) strlcat(msg_buf, "BIST", MAXPATHLEN);
13895 	if ((gscr64 & 0xf) == 0)
13896 		(void) strlcat(msg_buf, "nothing", MAXPATHLEN);
13897 	cmn_err(CE_CONT, "?%s", msg_buf);
13898 
13899 	(void) sprintf(msg_buf, "\tNumber of exposed device fan-out ports: %d",
13900 	    gscr2 & SATA_PMULT_PORTNUM_MASK);
13901 	cmn_err(CE_CONT, "?%s", msg_buf);
13902 }
13903 
13904 /*
13905  * sata_save_drive_settings extracts current setting of the device and stores
13906  * it for future reference, in case the device setup would need to be restored
13907  * after the device reset.
13908  *
13909  * For all devices read ahead and write cache settings are saved, if the
13910  * device supports these features at all.
13911  * For ATAPI devices the Removable Media Status Notification setting is saved.
13912  */
13913 static void
sata_save_drive_settings(sata_drive_info_t * sdinfo)13914 sata_save_drive_settings(sata_drive_info_t *sdinfo)
13915 {
13916 	if (SATA_READ_AHEAD_SUPPORTED(sdinfo->satadrv_id) ||
13917 	    SATA_WRITE_CACHE_SUPPORTED(sdinfo->satadrv_id)) {
13918 
13919 		/* Current setting of Read Ahead (and Read Cache) */
13920 		if (SATA_READ_AHEAD_ENABLED(sdinfo->satadrv_id))
13921 			sdinfo->satadrv_settings |= SATA_DEV_READ_AHEAD;
13922 		else
13923 			sdinfo->satadrv_settings &= ~SATA_DEV_READ_AHEAD;
13924 
13925 		/* Current setting of Write Cache */
13926 		if (SATA_WRITE_CACHE_ENABLED(sdinfo->satadrv_id))
13927 			sdinfo->satadrv_settings |= SATA_DEV_WRITE_CACHE;
13928 		else
13929 			sdinfo->satadrv_settings &= ~SATA_DEV_WRITE_CACHE;
13930 	}
13931 
13932 	if (sdinfo->satadrv_type == SATA_DTYPE_ATAPICD) {
13933 		if (SATA_RM_NOTIFIC_SUPPORTED(sdinfo->satadrv_id))
13934 			sdinfo->satadrv_settings |= SATA_DEV_RMSN;
13935 		else
13936 			sdinfo->satadrv_settings &= ~SATA_DEV_RMSN;
13937 	}
13938 }
13939 
13940 
13941 /*
13942  * sata_check_capacity function determines a disk capacity
13943  * and addressing mode (LBA28/LBA48) by examining a disk identify device data.
13944  *
13945  * NOTE: CHS mode is not supported! If a device does not support LBA,
13946  * this function is not called.
13947  *
13948  * Returns device capacity in number of blocks, i.e. largest addressable LBA+1
13949  */
13950 static uint64_t
sata_check_capacity(sata_drive_info_t * sdinfo)13951 sata_check_capacity(sata_drive_info_t *sdinfo)
13952 {
13953 	uint64_t capacity = 0;
13954 	int i;
13955 
13956 	if (sdinfo->satadrv_type != SATA_DTYPE_ATADISK ||
13957 	    (sdinfo->satadrv_id.ai_cap & SATA_LBA_SUPPORT) == 0)
13958 		/* Capacity valid only for LBA-addressable disk devices */
13959 		return (0);
13960 
13961 	if ((sdinfo->satadrv_id.ai_validinfo & SATA_VALIDINFO_88) &&
13962 	    (sdinfo->satadrv_id.ai_cmdset83 & SATA_EXT48) &&
13963 	    (sdinfo->satadrv_id.ai_features86 & SATA_EXT48)) {
13964 		/* LBA48 mode supported and enabled */
13965 		sdinfo->satadrv_features_support |= SATA_DEV_F_LBA48 |
13966 		    SATA_DEV_F_LBA28;
13967 		for (i = 3;  i >= 0;  --i) {
13968 			capacity <<= 16;
13969 			capacity += sdinfo->satadrv_id.ai_addrsecxt[i];
13970 		}
13971 	} else {
13972 		capacity = sdinfo->satadrv_id.ai_addrsec[1];
13973 		capacity <<= 16;
13974 		capacity += sdinfo->satadrv_id.ai_addrsec[0];
13975 		if (capacity >= 0x1000000)
13976 			/* LBA28 mode */
13977 			sdinfo->satadrv_features_support |= SATA_DEV_F_LBA28;
13978 	}
13979 	return (capacity);
13980 }
13981 
13982 
13983 /*
13984  * Allocate consistent buffer for DMA transfer
13985  *
13986  * Cannot be called from interrupt level or with mutex held - it may sleep.
13987  *
13988  * Returns pointer to allocated buffer structure, or NULL if allocation failed.
13989  */
13990 static struct buf *
sata_alloc_local_buffer(sata_pkt_txlate_t * spx,size_t len)13991 sata_alloc_local_buffer(sata_pkt_txlate_t *spx, size_t len)
13992 {
13993 	struct scsi_address ap;
13994 	struct buf *bp;
13995 	ddi_dma_attr_t	cur_dma_attr;
13996 
13997 	ASSERT(spx->txlt_sata_pkt != NULL);
13998 	ap.a_hba_tran = spx->txlt_sata_hba_inst->satahba_scsi_tran;
13999 	ap.a_target = SATA_TO_SCSI_TARGET(
14000 	    spx->txlt_sata_pkt->satapkt_device.satadev_addr.cport,
14001 	    spx->txlt_sata_pkt->satapkt_device.satadev_addr.pmport,
14002 	    spx->txlt_sata_pkt->satapkt_device.satadev_addr.qual);
14003 	ap.a_lun = 0;
14004 
14005 	bp = scsi_alloc_consistent_buf(&ap, NULL, len,
14006 	    B_READ, SLEEP_FUNC, NULL);
14007 
14008 	if (bp != NULL) {
14009 		/* Allocate DMA resources for this buffer */
14010 		spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp = bp;
14011 		/*
14012 		 * We use a local version of the dma_attr, to account
14013 		 * for a device addressing limitations.
14014 		 * sata_adjust_dma_attr() will handle sdinfo == NULL which
14015 		 * will cause dma attributes to be adjusted to a lowest
14016 		 * acceptable level.
14017 		 */
14018 		sata_adjust_dma_attr(NULL,
14019 		    SATA_DMA_ATTR(spx->txlt_sata_hba_inst), &cur_dma_attr);
14020 
14021 		if (sata_dma_buf_setup(spx, PKT_CONSISTENT,
14022 		    SLEEP_FUNC, NULL, &cur_dma_attr) != DDI_SUCCESS) {
14023 			scsi_free_consistent_buf(bp);
14024 			spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp = NULL;
14025 			bp = NULL;
14026 		}
14027 	}
14028 	return (bp);
14029 }
14030 
14031 /*
14032  * Release local buffer (consistent buffer for DMA transfer) allocated
14033  * via sata_alloc_local_buffer().
14034  */
14035 static void
sata_free_local_buffer(sata_pkt_txlate_t * spx)14036 sata_free_local_buffer(sata_pkt_txlate_t *spx)
14037 {
14038 	ASSERT(spx->txlt_sata_pkt != NULL);
14039 	ASSERT(spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp != NULL);
14040 
14041 	spx->txlt_sata_pkt->satapkt_cmd.satacmd_num_dma_cookies = 0;
14042 	spx->txlt_sata_pkt->satapkt_cmd.satacmd_dma_cookie_list = NULL;
14043 
14044 	sata_common_free_dma_rsrcs(spx);
14045 
14046 	/* Free buffer */
14047 	scsi_free_consistent_buf(spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp);
14048 	spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp = NULL;
14049 }
14050 
14051 /*
14052  * Allocate sata_pkt
14053  * Pkt structure version and embedded strcutures version are initialized.
14054  * sata_pkt and sata_pkt_txlate structures are cross-linked.
14055  *
14056  * Since this may be called in interrupt context by sata_scsi_init_pkt,
14057  * callback argument determines if it can sleep or not.
14058  * Hence, it should not be called from interrupt context.
14059  *
14060  * If successful, non-NULL pointer to a sata pkt is returned.
14061  * Upon failure, NULL pointer is returned.
14062  */
14063 static sata_pkt_t *
sata_pkt_alloc(sata_pkt_txlate_t * spx,int (* callback)(caddr_t))14064 sata_pkt_alloc(sata_pkt_txlate_t *spx, int (*callback)(caddr_t))
14065 {
14066 	sata_pkt_t *spkt;
14067 	int kmsflag;
14068 
14069 	kmsflag = (callback == SLEEP_FUNC) ? KM_SLEEP : KM_NOSLEEP;
14070 	spkt = kmem_zalloc(sizeof (sata_pkt_t), kmsflag);
14071 	if (spkt == NULL) {
14072 		SATA_LOG_D((spx->txlt_sata_hba_inst, CE_WARN,
14073 		    "sata_pkt_alloc: failed"));
14074 		return (NULL);
14075 	}
14076 	spkt->satapkt_rev = SATA_PKT_REV;
14077 	spkt->satapkt_cmd.satacmd_rev = SATA_CMD_REV;
14078 	spkt->satapkt_device.satadev_rev = SATA_DEVICE_REV;
14079 	spkt->satapkt_framework_private = spx;
14080 	spx->txlt_sata_pkt = spkt;
14081 	return (spkt);
14082 }
14083 
14084 /*
14085  * Free sata pkt allocated via sata_pkt_alloc()
14086  */
14087 static void
sata_pkt_free(sata_pkt_txlate_t * spx)14088 sata_pkt_free(sata_pkt_txlate_t *spx)
14089 {
14090 	ASSERT(spx->txlt_sata_pkt != NULL);
14091 	ASSERT(spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp == NULL);
14092 	kmem_free(spx->txlt_sata_pkt, sizeof (sata_pkt_t));
14093 	spx->txlt_sata_pkt = NULL;
14094 }
14095 
14096 
14097 /*
14098  * Adjust DMA attributes.
14099  * SCSI cmds block count is up to 24 bits, SATA cmd block count vary
14100  * from 8 bits to 16 bits, depending on a command being used.
14101  * Limiting max block count arbitrarily to 256 for all read/write
14102  * commands may affects performance, so check both the device and
14103  * controller capability before adjusting dma attributes.
14104  */
14105 void
sata_adjust_dma_attr(sata_drive_info_t * sdinfo,ddi_dma_attr_t * dma_attr,ddi_dma_attr_t * adj_dma_attr)14106 sata_adjust_dma_attr(sata_drive_info_t *sdinfo, ddi_dma_attr_t *dma_attr,
14107     ddi_dma_attr_t *adj_dma_attr)
14108 {
14109 	uint32_t count_max;
14110 
14111 	/* Copy original attributes */
14112 	*adj_dma_attr = *dma_attr;
14113 	/*
14114 	 * Things to consider: device addressing capability,
14115 	 * "excessive" controller DMA capabilities.
14116 	 * If a device is being probed/initialized, there are
14117 	 * no device info - use default limits then.
14118 	 */
14119 	if (sdinfo == NULL) {
14120 		count_max = dma_attr->dma_attr_granular * 0x100;
14121 		if (dma_attr->dma_attr_count_max > count_max)
14122 			adj_dma_attr->dma_attr_count_max = count_max;
14123 		if (dma_attr->dma_attr_maxxfer > count_max)
14124 			adj_dma_attr->dma_attr_maxxfer = count_max;
14125 		return;
14126 	}
14127 
14128 	if (sdinfo->satadrv_type == SATA_DTYPE_ATADISK) {
14129 		if (sdinfo->satadrv_features_support & (SATA_DEV_F_LBA48)) {
14130 			/*
14131 			 * 16-bit sector count may be used - we rely on
14132 			 * the assumption that only read and write cmds
14133 			 * will request more than 256 sectors worth of data
14134 			 */
14135 			count_max = adj_dma_attr->dma_attr_granular * 0x10000;
14136 		} else {
14137 			/*
14138 			 * 8-bit sector count will be used - default limits
14139 			 * for dma attributes
14140 			 */
14141 			count_max = adj_dma_attr->dma_attr_granular * 0x100;
14142 		}
14143 		/*
14144 		 * Adjust controler dma attributes, if necessary
14145 		 */
14146 		if (dma_attr->dma_attr_count_max > count_max)
14147 			adj_dma_attr->dma_attr_count_max = count_max;
14148 		if (dma_attr->dma_attr_maxxfer > count_max)
14149 			adj_dma_attr->dma_attr_maxxfer = count_max;
14150 	}
14151 }
14152 
14153 
14154 /*
14155  * Allocate DMA resources for the buffer
14156  * This function handles initial DMA resource allocation as well as
14157  * DMA window shift and may be called repeatedly for the same DMA window
14158  * until all DMA cookies in the DMA window are processed.
14159  * To guarantee that there is always a coherent set of cookies to process
14160  * by SATA HBA driver (observing alignment, device granularity, etc.),
14161  * the number of slots for DMA cookies is equal to lesser of  a number of
14162  * cookies in a DMA window and a max number of scatter/gather entries.
14163  *
14164  * Returns DDI_SUCCESS upon successful operation.
14165  * Return failure code of a failing command or DDI_FAILURE when
14166  * internal cleanup failed.
14167  */
14168 static int
sata_dma_buf_setup(sata_pkt_txlate_t * spx,int flags,int (* callback)(caddr_t),caddr_t arg,ddi_dma_attr_t * cur_dma_attr)14169 sata_dma_buf_setup(sata_pkt_txlate_t *spx, int flags,
14170     int (*callback)(caddr_t), caddr_t arg,
14171     ddi_dma_attr_t *cur_dma_attr)
14172 {
14173 	int	rval;
14174 	off_t	offset;
14175 	size_t	size;
14176 	int	max_sg_len, req_len, i;
14177 	uint_t	dma_flags;
14178 	struct buf	*bp;
14179 	uint64_t	cur_txfer_len;
14180 
14181 
14182 	ASSERT(spx->txlt_sata_pkt != NULL);
14183 	bp = spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp;
14184 	ASSERT(bp != NULL);
14185 
14186 
14187 	if (spx->txlt_buf_dma_handle == NULL) {
14188 		/*
14189 		 * No DMA resources allocated so far - this is a first call
14190 		 * for this sata pkt.
14191 		 */
14192 		rval = ddi_dma_alloc_handle(SATA_DIP(spx->txlt_sata_hba_inst),
14193 		    cur_dma_attr, callback, arg, &spx->txlt_buf_dma_handle);
14194 
14195 		if (rval != DDI_SUCCESS) {
14196 			SATA_LOG_D((spx->txlt_sata_hba_inst, CE_WARN,
14197 			    "sata_dma_buf_setup: no buf DMA resources %x",
14198 			    rval));
14199 			return (rval);
14200 		}
14201 
14202 		if (bp->b_flags & B_READ)
14203 			dma_flags = DDI_DMA_READ;
14204 		else
14205 			dma_flags = DDI_DMA_WRITE;
14206 
14207 		if (flags & PKT_CONSISTENT)
14208 			dma_flags |= DDI_DMA_CONSISTENT;
14209 
14210 		if (flags & PKT_DMA_PARTIAL)
14211 			dma_flags |= DDI_DMA_PARTIAL;
14212 
14213 		/*
14214 		 * Check buffer alignment and size against dma attributes
14215 		 * Consider dma_attr_align only. There may be requests
14216 		 * with the size lower than device granularity, but they
14217 		 * will not read/write from/to the device, so no adjustment
14218 		 * is necessary. The dma_attr_minxfer theoretically should
14219 		 * be considered, but no HBA driver is checking it.
14220 		 */
14221 		if (IS_P2ALIGNED(bp->b_un.b_addr,
14222 		    cur_dma_attr->dma_attr_align)) {
14223 			rval = ddi_dma_buf_bind_handle(
14224 			    spx->txlt_buf_dma_handle,
14225 			    bp, dma_flags, callback, arg,
14226 			    &spx->txlt_dma_cookie,
14227 			    &spx->txlt_curwin_num_dma_cookies);
14228 		} else { /* Buffer is not aligned */
14229 
14230 			int	(*ddicallback)(caddr_t);
14231 			size_t	bufsz;
14232 
14233 			/* Check id sleeping is allowed */
14234 			ddicallback = (callback == NULL_FUNC) ?
14235 			    DDI_DMA_DONTWAIT : DDI_DMA_SLEEP;
14236 
14237 			SATADBG2(SATA_DBG_DMA_SETUP, spx->txlt_sata_hba_inst,
14238 			    "mis-aligned buffer: addr=0x%p, cnt=%lu",
14239 			    (void *)bp->b_un.b_addr, bp->b_bcount);
14240 
14241 			if (bp->b_flags & (B_PAGEIO|B_PHYS))
14242 				/*
14243 				 * CPU will need to access data in the buffer
14244 				 * (for copying) so map it.
14245 				 */
14246 				bp_mapin(bp);
14247 
14248 			ASSERT(spx->txlt_tmp_buf == NULL);
14249 
14250 			/* Buffer may be padded by ddi_dma_mem_alloc()! */
14251 			rval = ddi_dma_mem_alloc(
14252 			    spx->txlt_buf_dma_handle,
14253 			    bp->b_bcount,
14254 			    &sata_acc_attr,
14255 			    DDI_DMA_STREAMING,
14256 			    ddicallback, NULL,
14257 			    &spx->txlt_tmp_buf,
14258 			    &bufsz,
14259 			    &spx->txlt_tmp_buf_handle);
14260 
14261 			if (rval != DDI_SUCCESS) {
14262 				/* DMA mapping failed */
14263 				(void) ddi_dma_free_handle(
14264 				    &spx->txlt_buf_dma_handle);
14265 				spx->txlt_buf_dma_handle = NULL;
14266 #ifdef SATA_DEBUG
14267 				mbuffail_count++;
14268 #endif
14269 				SATADBG1(SATA_DBG_DMA_SETUP,
14270 				    spx->txlt_sata_hba_inst,
14271 				    "sata_dma_buf_setup: "
14272 				    "buf dma mem alloc failed %x\n", rval);
14273 				return (rval);
14274 			}
14275 			ASSERT(IS_P2ALIGNED(spx->txlt_tmp_buf,
14276 			    cur_dma_attr->dma_attr_align));
14277 
14278 #ifdef SATA_DEBUG
14279 			mbuf_count++;
14280 
14281 			if (bp->b_bcount != bufsz)
14282 				/*
14283 				 * This will require special handling, because
14284 				 * DMA cookies will be based on the temporary
14285 				 * buffer size, not the original buffer
14286 				 * b_bcount, so the residue may have to
14287 				 * be counted differently.
14288 				 */
14289 				SATADBG2(SATA_DBG_DMA_SETUP,
14290 				    spx->txlt_sata_hba_inst,
14291 				    "sata_dma_buf_setup: bp size %x != "
14292 				    "bufsz %x\n", bp->b_bcount, bufsz);
14293 #endif
14294 			if (dma_flags & DDI_DMA_WRITE) {
14295 				/*
14296 				 * Write operation - copy data into
14297 				 * an aligned temporary buffer. Buffer will be
14298 				 * synced for device by ddi_dma_addr_bind_handle
14299 				 */
14300 				bcopy(bp->b_un.b_addr, spx->txlt_tmp_buf,
14301 				    bp->b_bcount);
14302 			}
14303 
14304 			rval = ddi_dma_addr_bind_handle(
14305 			    spx->txlt_buf_dma_handle,
14306 			    NULL,
14307 			    spx->txlt_tmp_buf,
14308 			    bufsz, dma_flags, ddicallback, 0,
14309 			    &spx->txlt_dma_cookie,
14310 			    &spx->txlt_curwin_num_dma_cookies);
14311 		}
14312 
14313 		switch (rval) {
14314 		case DDI_DMA_PARTIAL_MAP:
14315 			SATADBG1(SATA_DBG_DMA_SETUP, spx->txlt_sata_hba_inst,
14316 			    "sata_dma_buf_setup: DMA Partial Map\n", NULL);
14317 			/*
14318 			 * Partial DMA mapping.
14319 			 * Retrieve number of DMA windows for this request.
14320 			 */
14321 			if (ddi_dma_numwin(spx->txlt_buf_dma_handle,
14322 			    &spx->txlt_num_dma_win) != DDI_SUCCESS) {
14323 				if (spx->txlt_tmp_buf != NULL) {
14324 					ddi_dma_mem_free(
14325 					    &spx->txlt_tmp_buf_handle);
14326 					spx->txlt_tmp_buf = NULL;
14327 				}
14328 				(void) ddi_dma_unbind_handle(
14329 				    spx->txlt_buf_dma_handle);
14330 				(void) ddi_dma_free_handle(
14331 				    &spx->txlt_buf_dma_handle);
14332 				spx->txlt_buf_dma_handle = NULL;
14333 				SATA_LOG_D((spx->txlt_sata_hba_inst, CE_WARN,
14334 				    "sata_dma_buf_setup: numwin failed\n"));
14335 				return (DDI_FAILURE);
14336 			}
14337 			SATADBG2(SATA_DBG_DMA_SETUP,
14338 			    spx->txlt_sata_hba_inst,
14339 			    "sata_dma_buf_setup: windows: %d, cookies: %d\n",
14340 			    spx->txlt_num_dma_win,
14341 			    spx->txlt_curwin_num_dma_cookies);
14342 			spx->txlt_cur_dma_win = 0;
14343 			break;
14344 
14345 		case DDI_DMA_MAPPED:
14346 			/* DMA fully mapped */
14347 			spx->txlt_num_dma_win = 1;
14348 			spx->txlt_cur_dma_win = 0;
14349 			SATADBG1(SATA_DBG_DMA_SETUP,
14350 			    spx->txlt_sata_hba_inst,
14351 			    "sata_dma_buf_setup: windows: 1 "
14352 			    "cookies: %d\n", spx->txlt_curwin_num_dma_cookies);
14353 			break;
14354 
14355 		default:
14356 			/* DMA mapping failed */
14357 			if (spx->txlt_tmp_buf != NULL) {
14358 				ddi_dma_mem_free(
14359 				    &spx->txlt_tmp_buf_handle);
14360 				spx->txlt_tmp_buf = NULL;
14361 			}
14362 			(void) ddi_dma_free_handle(&spx->txlt_buf_dma_handle);
14363 			spx->txlt_buf_dma_handle = NULL;
14364 			SATA_LOG_D((spx->txlt_sata_hba_inst, CE_WARN,
14365 			    "sata_dma_buf_setup: buf dma handle binding "
14366 			    "failed %x\n", rval));
14367 			return (rval);
14368 		}
14369 		spx->txlt_curwin_processed_dma_cookies = 0;
14370 		spx->txlt_dma_cookie_list = NULL;
14371 	} else {
14372 		/*
14373 		 * DMA setup is reused. Check if we need to process more
14374 		 * cookies in current window, or to get next window, if any.
14375 		 */
14376 
14377 		ASSERT(spx->txlt_curwin_processed_dma_cookies <=
14378 		    spx->txlt_curwin_num_dma_cookies);
14379 
14380 		if (spx->txlt_curwin_processed_dma_cookies ==
14381 		    spx->txlt_curwin_num_dma_cookies) {
14382 			/*
14383 			 * All cookies from current DMA window were processed.
14384 			 * Get next DMA window.
14385 			 */
14386 			spx->txlt_cur_dma_win++;
14387 			if (spx->txlt_cur_dma_win < spx->txlt_num_dma_win) {
14388 				(void) ddi_dma_getwin(spx->txlt_buf_dma_handle,
14389 				    spx->txlt_cur_dma_win, &offset, &size,
14390 				    &spx->txlt_dma_cookie,
14391 				    &spx->txlt_curwin_num_dma_cookies);
14392 				spx->txlt_curwin_processed_dma_cookies = 0;
14393 			} else {
14394 				/* No more windows! End of request! */
14395 				/* What to do? - panic for now */
14396 				ASSERT(spx->txlt_cur_dma_win >=
14397 				    spx->txlt_num_dma_win);
14398 
14399 				spx->txlt_curwin_num_dma_cookies = 0;
14400 				spx->txlt_curwin_processed_dma_cookies = 0;
14401 				spx->txlt_sata_pkt->
14402 				    satapkt_cmd.satacmd_num_dma_cookies = 0;
14403 				return (DDI_SUCCESS);
14404 			}
14405 		}
14406 	}
14407 	/* There better be at least one DMA cookie outstanding */
14408 	ASSERT((spx->txlt_curwin_num_dma_cookies -
14409 	    spx->txlt_curwin_processed_dma_cookies) > 0);
14410 
14411 	if (spx->txlt_dma_cookie_list == &spx->txlt_dma_cookie) {
14412 		/* The default cookie slot was used in previous run */
14413 		ASSERT(spx->txlt_curwin_processed_dma_cookies == 0);
14414 		spx->txlt_dma_cookie_list = NULL;
14415 		spx->txlt_dma_cookie_list_len = 0;
14416 	}
14417 	if (spx->txlt_curwin_processed_dma_cookies == 0) {
14418 		/*
14419 		 * Processing a new DMA window - set-up dma cookies list.
14420 		 * We may reuse previously allocated cookie array if it is
14421 		 * possible.
14422 		 */
14423 		if (spx->txlt_dma_cookie_list != NULL &&
14424 		    spx->txlt_dma_cookie_list_len <
14425 		    spx->txlt_curwin_num_dma_cookies) {
14426 			/*
14427 			 * New DMA window contains more cookies than
14428 			 * the previous one. We need larger cookie list - free
14429 			 * the old one.
14430 			 */
14431 			(void) kmem_free(spx->txlt_dma_cookie_list,
14432 			    spx->txlt_dma_cookie_list_len *
14433 			    sizeof (ddi_dma_cookie_t));
14434 			spx->txlt_dma_cookie_list = NULL;
14435 			spx->txlt_dma_cookie_list_len = 0;
14436 		}
14437 		if (spx->txlt_dma_cookie_list == NULL) {
14438 			/*
14439 			 * Calculate lesser of number of cookies in this
14440 			 * DMA window and number of s/g entries.
14441 			 */
14442 			max_sg_len = cur_dma_attr->dma_attr_sgllen;
14443 			req_len = MIN(max_sg_len,
14444 			    spx->txlt_curwin_num_dma_cookies);
14445 
14446 			/* Allocate new dma cookie array if necessary */
14447 			if (req_len == 1) {
14448 				/* Only one cookie - no need for a list */
14449 				spx->txlt_dma_cookie_list =
14450 				    &spx->txlt_dma_cookie;
14451 				spx->txlt_dma_cookie_list_len = 1;
14452 			} else {
14453 				/*
14454 				 * More than one cookie - try to allocate space.
14455 				 */
14456 				spx->txlt_dma_cookie_list = kmem_zalloc(
14457 				    sizeof (ddi_dma_cookie_t) * req_len,
14458 				    callback == NULL_FUNC ? KM_NOSLEEP :
14459 				    KM_SLEEP);
14460 				if (spx->txlt_dma_cookie_list == NULL) {
14461 					SATADBG1(SATA_DBG_DMA_SETUP,
14462 					    spx->txlt_sata_hba_inst,
14463 					    "sata_dma_buf_setup: cookie list "
14464 					    "allocation failed\n", NULL);
14465 					/*
14466 					 * We could not allocate space for
14467 					 * neccessary number of dma cookies in
14468 					 * this window, so we fail this request.
14469 					 * Next invocation would try again to
14470 					 * allocate space for cookie list.
14471 					 * Note:Packet residue was not modified.
14472 					 */
14473 					return (DDI_DMA_NORESOURCES);
14474 				} else {
14475 					spx->txlt_dma_cookie_list_len = req_len;
14476 				}
14477 			}
14478 		}
14479 		/*
14480 		 * Fetch DMA cookies into cookie list in sata_pkt_txlate.
14481 		 * First cookie was already fetched.
14482 		 */
14483 		*(&spx->txlt_dma_cookie_list[0]) = spx->txlt_dma_cookie;
14484 		cur_txfer_len =
14485 		    (uint64_t)spx->txlt_dma_cookie_list[0].dmac_size;
14486 		spx->txlt_sata_pkt->satapkt_cmd.satacmd_num_dma_cookies = 1;
14487 		spx->txlt_curwin_processed_dma_cookies++;
14488 		for (i = 1; (i < spx->txlt_dma_cookie_list_len) &&
14489 		    (i < spx->txlt_curwin_num_dma_cookies); i++) {
14490 			ddi_dma_nextcookie(spx->txlt_buf_dma_handle,
14491 			    &spx->txlt_dma_cookie_list[i]);
14492 			cur_txfer_len +=
14493 			    (uint64_t)spx->txlt_dma_cookie_list[i].dmac_size;
14494 			spx->txlt_curwin_processed_dma_cookies++;
14495 			spx->txlt_sata_pkt->
14496 			    satapkt_cmd.satacmd_num_dma_cookies += 1;
14497 		}
14498 	} else {
14499 		SATADBG2(SATA_DBG_DMA_SETUP, spx->txlt_sata_hba_inst,
14500 		    "sata_dma_buf_setup: sliding within DMA window, "
14501 		    "cur cookie %d, total cookies %d\n",
14502 		    spx->txlt_curwin_processed_dma_cookies,
14503 		    spx->txlt_curwin_num_dma_cookies);
14504 
14505 		/*
14506 		 * Not all cookies from the current dma window were used because
14507 		 * of s/g limitation.
14508 		 * There is no need to re-size the list - it was set at
14509 		 * optimal size, or only default entry is used (s/g = 1).
14510 		 */
14511 		if (spx->txlt_dma_cookie_list == NULL) {
14512 			spx->txlt_dma_cookie_list = &spx->txlt_dma_cookie;
14513 			spx->txlt_dma_cookie_list_len = 1;
14514 		}
14515 		/*
14516 		 * Since we are processing remaining cookies in a DMA window,
14517 		 * there may be less of them than the number of entries in the
14518 		 * current dma cookie list.
14519 		 */
14520 		req_len = MIN(spx->txlt_dma_cookie_list_len,
14521 		    (spx->txlt_curwin_num_dma_cookies -
14522 		    spx->txlt_curwin_processed_dma_cookies));
14523 
14524 		/* Fetch the next batch of cookies */
14525 		for (i = 0, cur_txfer_len = 0; i < req_len; i++) {
14526 			ddi_dma_nextcookie(spx->txlt_buf_dma_handle,
14527 			    &spx->txlt_dma_cookie_list[i]);
14528 			cur_txfer_len +=
14529 			    (uint64_t)spx->txlt_dma_cookie_list[i].dmac_size;
14530 			spx->txlt_sata_pkt->
14531 			    satapkt_cmd.satacmd_num_dma_cookies++;
14532 			spx->txlt_curwin_processed_dma_cookies++;
14533 		}
14534 	}
14535 
14536 	ASSERT(spx->txlt_sata_pkt->satapkt_cmd.satacmd_num_dma_cookies > 0);
14537 
14538 	/* Point sata_cmd to the cookie list */
14539 	spx->txlt_sata_pkt->satapkt_cmd.satacmd_dma_cookie_list =
14540 	    &spx->txlt_dma_cookie_list[0];
14541 
14542 	/* Remember number of DMA cookies passed in sata packet */
14543 	spx->txlt_num_dma_cookies =
14544 	    spx->txlt_sata_pkt->satapkt_cmd.satacmd_num_dma_cookies;
14545 
14546 	ASSERT(cur_txfer_len != 0);
14547 	if (cur_txfer_len <= bp->b_bcount)
14548 		spx->txlt_total_residue -= cur_txfer_len;
14549 	else {
14550 		/*
14551 		 * Temporary DMA buffer has been padded by
14552 		 * ddi_dma_mem_alloc()!
14553 		 * This requires special handling, because DMA cookies are
14554 		 * based on the temporary buffer size, not the b_bcount,
14555 		 * and we have extra bytes to transfer - but the packet
14556 		 * residue has to stay correct because we will copy only
14557 		 * the requested number of bytes.
14558 		 */
14559 		spx->txlt_total_residue -= bp->b_bcount;
14560 	}
14561 
14562 	return (DDI_SUCCESS);
14563 }
14564 
14565 /*
14566  * Common routine for releasing DMA resources
14567  */
14568 static void
sata_common_free_dma_rsrcs(sata_pkt_txlate_t * spx)14569 sata_common_free_dma_rsrcs(sata_pkt_txlate_t *spx)
14570 {
14571 	if (spx->txlt_buf_dma_handle != NULL) {
14572 		if (spx->txlt_tmp_buf != NULL)  {
14573 			/*
14574 			 * Intermediate DMA buffer was allocated.
14575 			 * Free allocated buffer and associated access handle.
14576 			 */
14577 			ddi_dma_mem_free(&spx->txlt_tmp_buf_handle);
14578 			spx->txlt_tmp_buf = NULL;
14579 		}
14580 		/*
14581 		 * Free DMA resources - cookies and handles
14582 		 */
14583 		/* ASSERT(spx->txlt_dma_cookie_list != NULL); */
14584 		if (spx->txlt_dma_cookie_list != NULL) {
14585 			if (spx->txlt_dma_cookie_list !=
14586 			    &spx->txlt_dma_cookie) {
14587 				(void) kmem_free(spx->txlt_dma_cookie_list,
14588 				    spx->txlt_dma_cookie_list_len *
14589 				    sizeof (ddi_dma_cookie_t));
14590 				spx->txlt_dma_cookie_list = NULL;
14591 			}
14592 		}
14593 		(void) ddi_dma_unbind_handle(spx->txlt_buf_dma_handle);
14594 		(void) ddi_dma_free_handle(&spx->txlt_buf_dma_handle);
14595 		spx->txlt_buf_dma_handle = NULL;
14596 	}
14597 }
14598 
14599 /*
14600  * Free DMA resources
14601  * Used by the HBA driver to release DMA resources that it does not use.
14602  *
14603  * Returns Void
14604  */
14605 void
sata_free_dma_resources(sata_pkt_t * sata_pkt)14606 sata_free_dma_resources(sata_pkt_t *sata_pkt)
14607 {
14608 	sata_pkt_txlate_t *spx;
14609 
14610 	if (sata_pkt == NULL)
14611 		return;
14612 
14613 	spx = (sata_pkt_txlate_t *)sata_pkt->satapkt_framework_private;
14614 
14615 	sata_common_free_dma_rsrcs(spx);
14616 }
14617 
14618 /*
14619  * Fetch Device Identify data.
14620  * Send DEVICE IDENTIFY or IDENTIFY PACKET DEVICE (depending on a device type)
14621  * command to a device and get the device identify data.
14622  * The device_info structure has to be set to device type (for selecting proper
14623  * device identify command).
14624  *
14625  * Returns:
14626  * SATA_SUCCESS if cmd succeeded
14627  * SATA_RETRY if cmd was rejected and could be retried,
14628  * SATA_FAILURE if cmd failed and should not be retried (port error)
14629  *
14630  * Cannot be called in an interrupt context.
14631  */
14632 
14633 static int
sata_fetch_device_identify_data(sata_hba_inst_t * sata_hba_inst,sata_drive_info_t * sdinfo)14634 sata_fetch_device_identify_data(sata_hba_inst_t *sata_hba_inst,
14635     sata_drive_info_t *sdinfo)
14636 {
14637 	struct buf *bp;
14638 	sata_pkt_t *spkt;
14639 	sata_cmd_t *scmd;
14640 	sata_pkt_txlate_t *spx;
14641 	int rval;
14642 	dev_info_t *dip = SATA_DIP(sata_hba_inst);
14643 
14644 	spx = kmem_zalloc(sizeof (sata_pkt_txlate_t), KM_SLEEP);
14645 	spx->txlt_sata_hba_inst = sata_hba_inst;
14646 	spx->txlt_scsi_pkt = NULL;		/* No scsi pkt involved */
14647 	spkt = sata_pkt_alloc(spx, SLEEP_FUNC);
14648 	if (spkt == NULL) {
14649 		kmem_free(spx, sizeof (sata_pkt_txlate_t));
14650 		return (SATA_RETRY); /* may retry later */
14651 	}
14652 	/* address is needed now */
14653 	spkt->satapkt_device.satadev_addr = sdinfo->satadrv_addr;
14654 
14655 	/*
14656 	 * Allocate buffer for Identify Data return data
14657 	 */
14658 	bp = sata_alloc_local_buffer(spx, sizeof (sata_id_t));
14659 	if (bp == NULL) {
14660 		sata_pkt_free(spx);
14661 		kmem_free(spx, sizeof (sata_pkt_txlate_t));
14662 		SATA_LOG_D((sata_hba_inst, CE_WARN,
14663 		    "sata_fetch_device_identify_data: "
14664 		    "cannot allocate buffer for ID"));
14665 		return (SATA_RETRY); /* may retry later */
14666 	}
14667 
14668 	/* Fill sata_pkt */
14669 	sdinfo->satadrv_state = SATA_STATE_PROBING;
14670 	spkt->satapkt_device.satadev_addr = sdinfo->satadrv_addr;
14671 	spkt->satapkt_op_mode = SATA_OPMODE_SYNCH | SATA_OPMODE_INTERRUPTS;
14672 	/* Synchronous mode, no callback */
14673 	spkt->satapkt_comp = NULL;
14674 	/* Timeout 30s */
14675 	spkt->satapkt_time = sata_default_pkt_time;
14676 
14677 	scmd = &spkt->satapkt_cmd;
14678 	scmd->satacmd_bp = bp;
14679 	scmd->satacmd_flags.sata_data_direction = SATA_DIR_READ;
14680 	scmd->satacmd_flags.sata_ignore_dev_reset = B_TRUE;
14681 
14682 	/* Build Identify Device cmd in the sata_pkt */
14683 	scmd->satacmd_addr_type = 0;		/* N/A */
14684 	scmd->satacmd_sec_count_lsb = 0;	/* N/A */
14685 	scmd->satacmd_lba_low_lsb = 0;		/* N/A */
14686 	scmd->satacmd_lba_mid_lsb = 0;		/* N/A */
14687 	scmd->satacmd_lba_high_lsb = 0;		/* N/A */
14688 	scmd->satacmd_features_reg = 0;		/* N/A */
14689 	scmd->satacmd_device_reg = 0;		/* Always device 0 */
14690 	if (sdinfo->satadrv_type & SATA_DTYPE_ATAPI) {
14691 		/* Identify Packet Device cmd */
14692 		scmd->satacmd_cmd_reg = SATAC_ID_PACKET_DEVICE;
14693 	} else {
14694 		/* Identify Device cmd - mandatory for all other devices */
14695 		scmd->satacmd_cmd_reg = SATAC_ID_DEVICE;
14696 	}
14697 
14698 	/* Send pkt to SATA HBA driver */
14699 	rval = (*SATA_START_FUNC(sata_hba_inst))(SATA_DIP(sata_hba_inst), spkt);
14700 
14701 #ifdef SATA_INJECT_FAULTS
14702 	sata_inject_pkt_fault(spkt, &rval, sata_fault_type);
14703 #endif
14704 
14705 	if (rval == SATA_TRAN_ACCEPTED &&
14706 	    spkt->satapkt_reason == SATA_PKT_COMPLETED) {
14707 		if (spx->txlt_buf_dma_handle != NULL) {
14708 			rval = ddi_dma_sync(spx->txlt_buf_dma_handle, 0, 0,
14709 			    DDI_DMA_SYNC_FORKERNEL);
14710 			ASSERT(rval == DDI_SUCCESS);
14711 			if (sata_check_for_dma_error(dip, spx)) {
14712 				ddi_fm_service_impact(dip,
14713 				    DDI_SERVICE_UNAFFECTED);
14714 				rval = SATA_RETRY;
14715 				goto fail;
14716 			}
14717 
14718 		}
14719 		if ((((sata_id_t *)(bp->b_un.b_addr))->ai_config &
14720 		    SATA_INCOMPLETE_DATA) == SATA_INCOMPLETE_DATA) {
14721 			SATA_LOG_D((sata_hba_inst, CE_WARN,
14722 			    "SATA disk device at port %d - "
14723 			    "partial Identify Data",
14724 			    sdinfo->satadrv_addr.cport));
14725 			rval = SATA_RETRY; /* may retry later */
14726 			goto fail;
14727 		}
14728 		/* Update sata_drive_info */
14729 		bcopy(bp->b_un.b_addr, &sdinfo->satadrv_id,
14730 		    sizeof (sata_id_t));
14731 
14732 		sdinfo->satadrv_features_support = 0;
14733 		if (sdinfo->satadrv_type == SATA_DTYPE_ATADISK) {
14734 			/*
14735 			 * Retrieve capacity (disks only) and addressing mode
14736 			 */
14737 			sdinfo->satadrv_capacity = sata_check_capacity(sdinfo);
14738 		} else {
14739 			/*
14740 			 * For ATAPI devices one would have to issue
14741 			 * Get Capacity cmd for media capacity. Not here.
14742 			 */
14743 			sdinfo->satadrv_capacity = 0;
14744 			/*
14745 			 * Check what cdb length is supported
14746 			 */
14747 			if ((sdinfo->satadrv_id.ai_config &
14748 			    SATA_ATAPI_ID_PKT_SZ) == SATA_ATAPI_ID_PKT_16B)
14749 				sdinfo->satadrv_atapi_cdb_len = 16;
14750 			else
14751 				sdinfo->satadrv_atapi_cdb_len = 12;
14752 		}
14753 		/* Setup supported features flags */
14754 		if (sdinfo->satadrv_id.ai_cap & SATA_DMA_SUPPORT)
14755 			sdinfo->satadrv_features_support |= SATA_DEV_F_DMA;
14756 
14757 		/* Check for SATA GEN and NCQ support */
14758 		if (sdinfo->satadrv_id.ai_satacap != 0 &&
14759 		    sdinfo->satadrv_id.ai_satacap != 0xffff) {
14760 			/* SATA compliance */
14761 			if (sdinfo->satadrv_id.ai_satacap & SATA_NCQ)
14762 				sdinfo->satadrv_features_support |=
14763 				    SATA_DEV_F_NCQ;
14764 			if (sdinfo->satadrv_id.ai_satacap &
14765 			    (SATA_1_SPEED | SATA_2_SPEED | SATA_3_SPEED)) {
14766 				if (sdinfo->satadrv_id.ai_satacap &
14767 				    SATA_3_SPEED)
14768 					sdinfo->satadrv_features_support |=
14769 					    SATA_DEV_F_SATA3;
14770 				if (sdinfo->satadrv_id.ai_satacap &
14771 				    SATA_2_SPEED)
14772 					sdinfo->satadrv_features_support |=
14773 					    SATA_DEV_F_SATA2;
14774 				if (sdinfo->satadrv_id.ai_satacap &
14775 				    SATA_1_SPEED)
14776 					sdinfo->satadrv_features_support |=
14777 					    SATA_DEV_F_SATA1;
14778 			} else {
14779 				sdinfo->satadrv_features_support |=
14780 				    SATA_DEV_F_SATA1;
14781 			}
14782 		}
14783 		if ((sdinfo->satadrv_id.ai_cmdset83 & SATA_RW_DMA_QUEUED_CMD) &&
14784 		    (sdinfo->satadrv_id.ai_features86 & SATA_RW_DMA_QUEUED_CMD))
14785 			sdinfo->satadrv_features_support |= SATA_DEV_F_TCQ;
14786 
14787 		sdinfo->satadrv_queue_depth = sdinfo->satadrv_id.ai_qdepth;
14788 		if ((sdinfo->satadrv_features_support & SATA_DEV_F_NCQ) ||
14789 		    (sdinfo->satadrv_features_support & SATA_DEV_F_TCQ)) {
14790 			++sdinfo->satadrv_queue_depth;
14791 			/* Adjust according to controller capabilities */
14792 			sdinfo->satadrv_max_queue_depth = MIN(
14793 			    sdinfo->satadrv_queue_depth,
14794 			    SATA_QDEPTH(sata_hba_inst));
14795 			/* Adjust according to global queue depth limit */
14796 			sdinfo->satadrv_max_queue_depth = MIN(
14797 			    sdinfo->satadrv_max_queue_depth,
14798 			    sata_current_max_qdepth);
14799 			if (sdinfo->satadrv_max_queue_depth == 0)
14800 				sdinfo->satadrv_max_queue_depth = 1;
14801 		} else
14802 			sdinfo->satadrv_max_queue_depth = 1;
14803 
14804 		rval = SATA_SUCCESS;
14805 	} else {
14806 		/*
14807 		 * Woops, no Identify Data.
14808 		 */
14809 		if (rval == SATA_TRAN_BUSY || rval == SATA_TRAN_QUEUE_FULL) {
14810 			rval = SATA_RETRY; /* may retry later */
14811 		} else if (rval == SATA_TRAN_ACCEPTED) {
14812 			if (spkt->satapkt_reason == SATA_PKT_DEV_ERROR ||
14813 			    spkt->satapkt_reason == SATA_PKT_ABORTED ||
14814 			    spkt->satapkt_reason == SATA_PKT_TIMEOUT ||
14815 			    spkt->satapkt_reason == SATA_PKT_RESET)
14816 				rval = SATA_RETRY; /* may retry later */
14817 			else
14818 				rval = SATA_FAILURE;
14819 		} else {
14820 			rval = SATA_FAILURE;
14821 		}
14822 	}
14823 fail:
14824 	/* Free allocated resources */
14825 	sata_free_local_buffer(spx);
14826 	sata_pkt_free(spx);
14827 	kmem_free(spx, sizeof (sata_pkt_txlate_t));
14828 
14829 	return (rval);
14830 }
14831 
14832 
14833 /*
14834  * Some devices may not come-up with default DMA mode (UDMA or MWDMA).
14835  * UDMA mode is checked first, followed by MWDMA mode.
14836  * set correctly, so this function is setting it to the highest supported level.
14837  * Older SATA spec required that the device supports at least DMA 4 mode and
14838  * UDMA mode is selected.  It is not mentioned in SerialATA 2.6, so this
14839  * restriction has been removed.
14840  *
14841  * Returns SATA_SUCCESS if proper DMA mode is selected or no DMA is supported.
14842  * Returns SATA_FAILURE if proper DMA mode could not be selected.
14843  *
14844  * NOTE: This function should be called only if DMA mode is supported.
14845  */
14846 static int
sata_set_dma_mode(sata_hba_inst_t * sata_hba_inst,sata_drive_info_t * sdinfo)14847 sata_set_dma_mode(sata_hba_inst_t *sata_hba_inst, sata_drive_info_t *sdinfo)
14848 {
14849 	sata_pkt_t *spkt;
14850 	sata_cmd_t *scmd;
14851 	sata_pkt_txlate_t *spx;
14852 	int i, mode;
14853 	uint8_t subcmd;
14854 	int rval = SATA_SUCCESS;
14855 
14856 	ASSERT(sdinfo != NULL);
14857 	ASSERT(sata_hba_inst != NULL);
14858 
14859 	if ((sdinfo->satadrv_id.ai_validinfo & SATA_VALIDINFO_88) != 0 &&
14860 	    (sdinfo->satadrv_id.ai_ultradma & SATA_UDMA_SUP_MASK) != 0) {
14861 		/* Find highest Ultra DMA mode supported */
14862 		for (mode = 6; mode >= 0; --mode) {
14863 			if (sdinfo->satadrv_id.ai_ultradma & (1 << mode))
14864 				break;
14865 		}
14866 #if 0
14867 		/* Left for historical reasons */
14868 		/*
14869 		 * Some initial version of SATA spec indicated that at least
14870 		 * UDMA mode 4 has to be supported. It is not mentioned in
14871 		 * SerialATA 2.6, so this restriction is removed.
14872 		 */
14873 		if (mode < 4)
14874 			return (SATA_FAILURE);
14875 #endif
14876 
14877 		/*
14878 		 * For disk, we're still going to set DMA mode whatever is
14879 		 * selected by default
14880 		 *
14881 		 * We saw an old maxtor sata drive will select Ultra DMA and
14882 		 * Multi-Word DMA simultaneouly by default, which is going
14883 		 * to cause DMA command timed out, so we need to select DMA
14884 		 * mode even when it's already done by default
14885 		 */
14886 		if (sdinfo->satadrv_type != SATA_DTYPE_ATADISK) {
14887 
14888 			/* Find UDMA mode currently selected */
14889 			for (i = 6; i >= 0; --i) {
14890 				if (sdinfo->satadrv_id.ai_ultradma &
14891 				    (1 << (i + 8)))
14892 					break;
14893 			}
14894 			if (i >= mode)
14895 				/* Nothing to do */
14896 				return (SATA_SUCCESS);
14897 		}
14898 
14899 		subcmd = SATAC_TRANSFER_MODE_ULTRA_DMA;
14900 
14901 	} else if ((sdinfo->satadrv_id.ai_dworddma & SATA_MDMA_SUP_MASK) != 0) {
14902 		/* Find highest MultiWord DMA mode supported */
14903 		for (mode = 2; mode >= 0; --mode) {
14904 			if (sdinfo->satadrv_id.ai_dworddma & (1 << mode))
14905 				break;
14906 		}
14907 
14908 		/*
14909 		 * For disk, We're still going to set DMA mode whatever is
14910 		 * selected by default
14911 		 *
14912 		 * We saw an old maxtor sata drive will select Ultra DMA and
14913 		 * Multi-Word DMA simultaneouly by default, which is going
14914 		 * to cause DMA command timed out, so we need to select DMA
14915 		 * mode even when it's already done by default
14916 		 */
14917 		if (sdinfo->satadrv_type != SATA_DTYPE_ATADISK) {
14918 
14919 			/* Find highest MultiWord DMA mode selected */
14920 			for (i = 2; i >= 0; --i) {
14921 				if (sdinfo->satadrv_id.ai_dworddma &
14922 				    (1 << (i + 8)))
14923 					break;
14924 			}
14925 			if (i >= mode)
14926 				/* Nothing to do */
14927 				return (SATA_SUCCESS);
14928 		}
14929 
14930 		subcmd = SATAC_TRANSFER_MODE_MULTI_WORD_DMA;
14931 	} else
14932 		return (SATA_SUCCESS);
14933 
14934 	/*
14935 	 * Set DMA mode via SET FEATURES COMMAND.
14936 	 * Prepare packet for SET FEATURES COMMAND.
14937 	 */
14938 	spx = kmem_zalloc(sizeof (sata_pkt_txlate_t), KM_SLEEP);
14939 	spx->txlt_sata_hba_inst = sata_hba_inst;
14940 	spx->txlt_scsi_pkt = NULL;	/* No scsi pkt involved */
14941 	spkt = sata_pkt_alloc(spx, SLEEP_FUNC);
14942 	if (spkt == NULL) {
14943 		SATA_LOG_D((sata_hba_inst, CE_WARN,
14944 		    "sata_set_dma_mode: could not set DMA mode %d", mode));
14945 		rval = SATA_FAILURE;
14946 		goto done;
14947 	}
14948 	/* Fill sata_pkt */
14949 	spkt->satapkt_device.satadev_addr = sdinfo->satadrv_addr;
14950 	/* Timeout 30s */
14951 	spkt->satapkt_time = sata_default_pkt_time;
14952 	/* Synchronous mode, no callback, interrupts */
14953 	spkt->satapkt_op_mode = SATA_OPMODE_SYNCH | SATA_OPMODE_INTERRUPTS;
14954 	spkt->satapkt_comp = NULL;
14955 	scmd = &spkt->satapkt_cmd;
14956 	scmd->satacmd_flags.sata_data_direction = SATA_DIR_NODATA_XFER;
14957 	scmd->satacmd_flags.sata_ignore_dev_reset = B_TRUE;
14958 	scmd->satacmd_addr_type = 0;
14959 	scmd->satacmd_device_reg = 0;
14960 	scmd->satacmd_status_reg = 0;
14961 	scmd->satacmd_error_reg = 0;
14962 	scmd->satacmd_cmd_reg = SATAC_SET_FEATURES;
14963 	scmd->satacmd_features_reg = SATAC_SF_TRANSFER_MODE;
14964 	scmd->satacmd_sec_count_lsb = subcmd | mode;
14965 
14966 	/* Transfer command to HBA */
14967 	if ((*SATA_START_FUNC(sata_hba_inst))(SATA_DIP(sata_hba_inst),
14968 	    spkt) != SATA_TRAN_ACCEPTED ||
14969 	    spkt->satapkt_reason != SATA_PKT_COMPLETED) {
14970 		/* Pkt execution failed */
14971 		rval = SATA_FAILURE;
14972 	}
14973 done:
14974 
14975 	/* Free allocated resources */
14976 	if (spkt != NULL)
14977 		sata_pkt_free(spx);
14978 	(void) kmem_free(spx, sizeof (sata_pkt_txlate_t));
14979 
14980 	return (rval);
14981 }
14982 
14983 
14984 /*
14985  * Set device caching mode.
14986  * One of the following operations should be specified:
14987  * SATAC_SF_ENABLE_READ_AHEAD
14988  * SATAC_SF_DISABLE_READ_AHEAD
14989  * SATAC_SF_ENABLE_WRITE_CACHE
14990  * SATAC_SF_DISABLE_WRITE_CACHE
14991  *
14992  * If operation fails, system log messgage is emitted.
14993  * Returns SATA_SUCCESS when the operation succeeds, SATA_RETRY if
14994  * command was sent but did not succeed, and SATA_FAILURE otherwise.
14995  */
14996 
14997 static int
sata_set_cache_mode(sata_hba_inst_t * sata_hba_inst,sata_drive_info_t * sdinfo,int cache_op)14998 sata_set_cache_mode(sata_hba_inst_t *sata_hba_inst, sata_drive_info_t *sdinfo,
14999     int cache_op)
15000 {
15001 	sata_pkt_t *spkt;
15002 	sata_cmd_t *scmd;
15003 	sata_pkt_txlate_t *spx;
15004 	int rval = SATA_SUCCESS;
15005 	int hba_rval;
15006 	char *infop = NULL;
15007 
15008 	ASSERT(sdinfo != NULL);
15009 	ASSERT(sata_hba_inst != NULL);
15010 	ASSERT(cache_op == SATAC_SF_ENABLE_READ_AHEAD ||
15011 	    cache_op == SATAC_SF_DISABLE_READ_AHEAD ||
15012 	    cache_op == SATAC_SF_ENABLE_WRITE_CACHE ||
15013 	    cache_op == SATAC_SF_DISABLE_WRITE_CACHE);
15014 
15015 
15016 	/* Prepare packet for SET FEATURES COMMAND */
15017 	spx = kmem_zalloc(sizeof (sata_pkt_txlate_t), KM_SLEEP);
15018 	spx->txlt_sata_hba_inst = sata_hba_inst;
15019 	spx->txlt_scsi_pkt = NULL;	/* No scsi pkt involved */
15020 	spkt = sata_pkt_alloc(spx, SLEEP_FUNC);
15021 	if (spkt == NULL) {
15022 		rval = SATA_FAILURE;
15023 		goto failure;
15024 	}
15025 	/* Fill sata_pkt */
15026 	spkt->satapkt_device.satadev_addr = sdinfo->satadrv_addr;
15027 	/* Timeout 30s */
15028 	spkt->satapkt_time = sata_default_pkt_time;
15029 	/* Synchronous mode, no callback, interrupts */
15030 	spkt->satapkt_op_mode =
15031 	    SATA_OPMODE_SYNCH | SATA_OPMODE_INTERRUPTS;
15032 	spkt->satapkt_comp = NULL;
15033 	scmd = &spkt->satapkt_cmd;
15034 	scmd->satacmd_flags.sata_data_direction = SATA_DIR_NODATA_XFER;
15035 	scmd->satacmd_flags.sata_ignore_dev_reset = B_TRUE;
15036 	scmd->satacmd_addr_type = 0;
15037 	scmd->satacmd_device_reg = 0;
15038 	scmd->satacmd_status_reg = 0;
15039 	scmd->satacmd_error_reg = 0;
15040 	scmd->satacmd_cmd_reg = SATAC_SET_FEATURES;
15041 	scmd->satacmd_features_reg = cache_op;
15042 
15043 	/* Transfer command to HBA */
15044 	hba_rval = (*SATA_START_FUNC(sata_hba_inst))(
15045 	    SATA_DIP(sata_hba_inst), spkt);
15046 
15047 #ifdef SATA_INJECT_FAULTS
15048 	sata_inject_pkt_fault(spkt, &rval, sata_fault_type);
15049 #endif
15050 
15051 	if ((hba_rval != SATA_TRAN_ACCEPTED) ||
15052 	    (spkt->satapkt_reason != SATA_PKT_COMPLETED)) {
15053 		/* Pkt execution failed */
15054 		switch (cache_op) {
15055 		case SATAC_SF_ENABLE_READ_AHEAD:
15056 			infop = "enabling read ahead failed";
15057 			break;
15058 		case SATAC_SF_DISABLE_READ_AHEAD:
15059 			infop = "disabling read ahead failed";
15060 			break;
15061 		case SATAC_SF_ENABLE_WRITE_CACHE:
15062 			infop = "enabling write cache failed";
15063 			break;
15064 		case SATAC_SF_DISABLE_WRITE_CACHE:
15065 			infop = "disabling write cache failed";
15066 			break;
15067 		}
15068 		SATA_LOG_D((sata_hba_inst, CE_WARN, "%s", infop));
15069 		rval = SATA_RETRY;
15070 	}
15071 failure:
15072 	/* Free allocated resources */
15073 	if (spkt != NULL)
15074 		sata_pkt_free(spx);
15075 	(void) kmem_free(spx, sizeof (sata_pkt_txlate_t));
15076 	return (rval);
15077 }
15078 
15079 /*
15080  * Set Removable Media Status Notification (enable/disable)
15081  * state == 0 , disable
15082  * state != 0 , enable
15083  *
15084  * If operation fails, system log messgage is emitted.
15085  * Returns SATA_SUCCESS when the operation succeeds, SATA_FAILURE otherwise.
15086  */
15087 
15088 static int
sata_set_rmsn(sata_hba_inst_t * sata_hba_inst,sata_drive_info_t * sdinfo,int state)15089 sata_set_rmsn(sata_hba_inst_t *sata_hba_inst, sata_drive_info_t *sdinfo,
15090     int state)
15091 {
15092 	sata_pkt_t *spkt;
15093 	sata_cmd_t *scmd;
15094 	sata_pkt_txlate_t *spx;
15095 	int rval = SATA_SUCCESS;
15096 	char *infop;
15097 
15098 	ASSERT(sdinfo != NULL);
15099 	ASSERT(sata_hba_inst != NULL);
15100 
15101 	/* Prepare packet for SET FEATURES COMMAND */
15102 	spx = kmem_zalloc(sizeof (sata_pkt_txlate_t), KM_SLEEP);
15103 	spx->txlt_sata_hba_inst = sata_hba_inst;
15104 	spx->txlt_scsi_pkt = NULL;	/* No scsi pkt involved */
15105 	spkt = sata_pkt_alloc(spx, SLEEP_FUNC);
15106 	if (spkt == NULL) {
15107 		rval = SATA_FAILURE;
15108 		goto failure;
15109 	}
15110 	/* Fill sata_pkt */
15111 	spkt->satapkt_device.satadev_addr = sdinfo->satadrv_addr;
15112 	/* Timeout 30s */
15113 	spkt->satapkt_time = sata_default_pkt_time;
15114 	/* Synchronous mode, no callback, interrupts */
15115 	spkt->satapkt_op_mode =
15116 	    SATA_OPMODE_SYNCH | SATA_OPMODE_INTERRUPTS;
15117 	spkt->satapkt_comp = NULL;
15118 	scmd = &spkt->satapkt_cmd;
15119 	scmd->satacmd_flags.sata_data_direction = SATA_DIR_NODATA_XFER;
15120 	scmd->satacmd_flags.sata_ignore_dev_reset = B_TRUE;
15121 	scmd->satacmd_addr_type = 0;
15122 	scmd->satacmd_device_reg = 0;
15123 	scmd->satacmd_status_reg = 0;
15124 	scmd->satacmd_error_reg = 0;
15125 	scmd->satacmd_cmd_reg = SATAC_SET_FEATURES;
15126 	if (state == 0)
15127 		scmd->satacmd_features_reg = SATAC_SF_DISABLE_RMSN;
15128 	else
15129 		scmd->satacmd_features_reg = SATAC_SF_ENABLE_RMSN;
15130 
15131 	/* Transfer command to HBA */
15132 	if (((*SATA_START_FUNC(sata_hba_inst))(
15133 	    SATA_DIP(sata_hba_inst), spkt) != SATA_TRAN_ACCEPTED) ||
15134 	    (spkt->satapkt_reason != SATA_PKT_COMPLETED)) {
15135 		/* Pkt execution failed */
15136 		if (state == 0)
15137 			infop = "disabling Removable Media Status "
15138 			    "Notification failed";
15139 		else
15140 			infop = "enabling Removable Media Status "
15141 			    "Notification failed";
15142 
15143 		SATA_LOG_D((sata_hba_inst, CE_WARN, "%s", infop));
15144 		rval = SATA_FAILURE;
15145 	}
15146 failure:
15147 	/* Free allocated resources */
15148 	if (spkt != NULL)
15149 		sata_pkt_free(spx);
15150 	(void) kmem_free(spx, sizeof (sata_pkt_txlate_t));
15151 	return (rval);
15152 }
15153 
15154 
15155 /*
15156  * Update state and copy port ss* values from passed sata_device structure.
15157  * sata_address is validated - if not valid, nothing is changed in sata_scsi
15158  * configuration struct.
15159  *
15160  * SATA_PSTATE_SHUTDOWN in port state is not reset to 0 by this function
15161  * regardless of the state in device argument.
15162  *
15163  * Port mutex should be held while calling this function.
15164  */
15165 static void
sata_update_port_info(sata_hba_inst_t * sata_hba_inst,sata_device_t * sata_device)15166 sata_update_port_info(sata_hba_inst_t *sata_hba_inst,
15167     sata_device_t *sata_device)
15168 {
15169 	sata_cport_info_t *cportinfo;
15170 
15171 	if (sata_device->satadev_addr.qual == SATA_ADDR_CPORT ||
15172 	    sata_device->satadev_addr.qual == SATA_ADDR_DCPORT) {
15173 		if (SATA_NUM_CPORTS(sata_hba_inst) <=
15174 		    sata_device->satadev_addr.cport)
15175 			return;
15176 
15177 		cportinfo = SATA_CPORT_INFO(sata_hba_inst,
15178 		    sata_device->satadev_addr.cport);
15179 
15180 		ASSERT(mutex_owned(&cportinfo->cport_mutex));
15181 		cportinfo->cport_scr = sata_device->satadev_scr;
15182 
15183 		/* Preserve SATA_PSTATE_SHUTDOWN flag */
15184 		cportinfo->cport_state &= ~(SATA_PSTATE_PWRON |
15185 		    SATA_PSTATE_PWROFF | SATA_PSTATE_FAILED);
15186 		cportinfo->cport_state |=
15187 		    sata_device->satadev_state & SATA_PSTATE_VALID;
15188 	}
15189 }
15190 
15191 void
sata_update_pmport_info(sata_hba_inst_t * sata_hba_inst,sata_device_t * sata_device)15192 sata_update_pmport_info(sata_hba_inst_t *sata_hba_inst,
15193     sata_device_t *sata_device)
15194 {
15195 	sata_pmport_info_t *pmportinfo;
15196 
15197 	if ((sata_device->satadev_addr.qual != SATA_ADDR_PMPORT &&
15198 	    sata_device->satadev_addr.qual != SATA_ADDR_DPMPORT) ||
15199 	    SATA_NUM_PMPORTS(sata_hba_inst,
15200 	    sata_device->satadev_addr.cport) <
15201 	    sata_device->satadev_addr.pmport) {
15202 		SATADBG1(SATA_DBG_PMULT, sata_hba_inst,
15203 		    "sata_update_port_info: error address %p.",
15204 		    &sata_device->satadev_addr);
15205 		return;
15206 	}
15207 
15208 	pmportinfo = SATA_PMPORT_INFO(sata_hba_inst,
15209 	    sata_device->satadev_addr.cport,
15210 	    sata_device->satadev_addr.pmport);
15211 
15212 	ASSERT(mutex_owned(&pmportinfo->pmport_mutex));
15213 	pmportinfo->pmport_scr = sata_device->satadev_scr;
15214 
15215 	/* Preserve SATA_PSTATE_SHUTDOWN flag */
15216 	pmportinfo->pmport_state &=
15217 	    ~(SATA_PSTATE_PWRON | SATA_PSTATE_PWROFF | SATA_PSTATE_FAILED);
15218 	pmportinfo->pmport_state |=
15219 	    sata_device->satadev_state & SATA_PSTATE_VALID;
15220 }
15221 
15222 /*
15223  * Extract SATA port specification from an IOCTL argument.
15224  *
15225  * This function return the port the user land send us as is, unless it
15226  * cannot retrieve port spec, then -1 is returned.
15227  *
15228  * Support port multiplier.
15229  */
15230 static int32_t
sata_get_port_num(sata_hba_inst_t * sata_hba_inst,struct devctl_iocdata * dcp)15231 sata_get_port_num(sata_hba_inst_t *sata_hba_inst, struct devctl_iocdata *dcp)
15232 {
15233 	int32_t port;
15234 
15235 	/* Extract port number from nvpair in dca structure  */
15236 	if (nvlist_lookup_int32(ndi_dc_get_ap_data(dcp), "port", &port) != 0) {
15237 		SATA_LOG_D((sata_hba_inst, CE_NOTE,
15238 		    "sata_get_port_num: invalid port spec 0x%x in ioctl",
15239 		    port));
15240 		port = -1;
15241 	}
15242 
15243 	return (port);
15244 }
15245 
15246 /*
15247  * Get dev_info_t pointer to the device node pointed to by port argument.
15248  * NOTE: target argument is a value used in ioctls to identify
15249  * the AP - it is not a sata_address.
15250  * It is a combination of cport, pmport and address qualifier, encodded same
15251  * way as a scsi target number.
15252  * At this moment it carries only cport number.
15253  *
15254  * PMult hotplug is supported now.
15255  *
15256  * Returns dev_info_t pointer if target device was found, NULL otherwise.
15257  */
15258 
15259 static dev_info_t *
sata_get_target_dip(dev_info_t * dip,uint8_t cport,uint8_t pmport)15260 sata_get_target_dip(dev_info_t *dip, uint8_t cport, uint8_t pmport)
15261 {
15262 	dev_info_t	*cdip = NULL;
15263 	int		target, tgt;
15264 	uint8_t		qual;
15265 
15266 	sata_hba_inst_t	*sata_hba_inst;
15267 	scsi_hba_tran_t *scsi_hba_tran;
15268 
15269 	/* Get target id */
15270 	scsi_hba_tran = ddi_get_driver_private(dip);
15271 	if (scsi_hba_tran == NULL)
15272 		return (NULL);
15273 
15274 	sata_hba_inst = scsi_hba_tran->tran_hba_private;
15275 
15276 	if (sata_hba_inst == NULL)
15277 		return (NULL);
15278 
15279 	/* Identify a port-mult by cport_info.cport_dev_type */
15280 	if (SATA_CPORT_DEV_TYPE(sata_hba_inst, cport) == SATA_DTYPE_PMULT)
15281 		qual = SATA_ADDR_DPMPORT;
15282 	else
15283 		qual = SATA_ADDR_DCPORT;
15284 
15285 	target = SATA_TO_SCSI_TARGET(cport, pmport, qual);
15286 
15287 	/* Retrieve target dip */
15288 	ndi_devi_enter(dip);
15289 	for (cdip = ddi_get_child(dip); cdip != NULL; ) {
15290 		dev_info_t *next = ddi_get_next_sibling(cdip);
15291 
15292 		tgt = ddi_prop_get_int(DDI_DEV_T_ANY, cdip,
15293 		    DDI_PROP_DONTPASS, "target", -1);
15294 		if (tgt == -1) {
15295 			/*
15296 			 * This is actually an error condition, but not
15297 			 * a fatal one. Just continue the search.
15298 			 */
15299 			cdip = next;
15300 			continue;
15301 		}
15302 
15303 		if (tgt == target)
15304 			break;
15305 
15306 		cdip = next;
15307 	}
15308 	ndi_devi_exit(dip);
15309 
15310 	return (cdip);
15311 }
15312 
15313 /*
15314  * Get dev_info_t pointer to the device node pointed to by port argument.
15315  * NOTE: target argument is a value used in ioctls to identify
15316  * the AP - it is not a sata_address.
15317  * It is a combination of cport, pmport and address qualifier, encoded same
15318  * way as a scsi target number.
15319  *
15320  * Returns dev_info_t pointer if target device was found, NULL otherwise.
15321  */
15322 
15323 static dev_info_t *
sata_get_scsi_target_dip(dev_info_t * dip,sata_address_t * saddr)15324 sata_get_scsi_target_dip(dev_info_t *dip, sata_address_t *saddr)
15325 {
15326 	dev_info_t	*cdip = NULL;
15327 	int		target, tgt;
15328 
15329 	target = SATA_TO_SCSI_TARGET(saddr->cport, saddr->pmport, saddr->qual);
15330 
15331 	ndi_devi_enter(dip);
15332 	for (cdip = ddi_get_child(dip); cdip != NULL; ) {
15333 		dev_info_t *next = ddi_get_next_sibling(cdip);
15334 
15335 		tgt = ddi_prop_get_int(DDI_DEV_T_ANY, cdip,
15336 		    DDI_PROP_DONTPASS, "target", -1);
15337 		if (tgt == -1) {
15338 			/*
15339 			 * This is actually an error condition, but not
15340 			 * a fatal one. Just continue the search.
15341 			 */
15342 			cdip = next;
15343 			continue;
15344 		}
15345 
15346 		if (tgt == target)
15347 			break;
15348 
15349 		cdip = next;
15350 	}
15351 	ndi_devi_exit(dip);
15352 
15353 	return (cdip);
15354 }
15355 
15356 /*
15357  * Process sata port disconnect request.
15358  * Normally, cfgadm sata plugin will try to offline (unconfigure) the device
15359  * before this request. Nevertheless, if a device is still configured,
15360  * we need to attempt to offline and unconfigure device.
15361  * Regardless of the unconfigure operation results the port is marked as
15362  * deactivated and no access to the attached device is possible.
15363  * If the target node remains because unconfigure operation failed, its state
15364  * will be set to DEVICE_REMOVED, preventing it to be used again when a device
15365  * is inserted/re-inserted. The event daemon will repeatedly try to unconfigure
15366  * the device and remove old target node.
15367  *
15368  * This function invokes sata_hba_inst->satahba_tran->
15369  * sata_tran_hotplug_ops->sata_tran_port_deactivate().
15370  * If successful, the device structure (if any) attached to the specified port
15371  * is removed and state of the port marked appropriately.
15372  * Failure of the port_deactivate may keep port in the physically active state,
15373  * or may fail the port.
15374  *
15375  * NOTE: Port multiplier is supported.
15376  */
15377 
15378 static int
sata_ioctl_disconnect(sata_hba_inst_t * sata_hba_inst,sata_device_t * sata_device)15379 sata_ioctl_disconnect(sata_hba_inst_t *sata_hba_inst,
15380     sata_device_t *sata_device)
15381 {
15382 	sata_drive_info_t *sdinfo = NULL, *subsdinfo = NULL;
15383 	sata_cport_info_t *cportinfo = NULL;
15384 	sata_pmport_info_t *pmportinfo = NULL;
15385 	sata_pmult_info_t *pmultinfo = NULL;
15386 	sata_device_t subsdevice;
15387 	int cport, pmport, qual;
15388 	int rval = SATA_SUCCESS;
15389 	int npmport = 0;
15390 	int rv = 0;
15391 
15392 	cport = sata_device->satadev_addr.cport;
15393 	pmport = sata_device->satadev_addr.pmport;
15394 	qual = sata_device->satadev_addr.qual;
15395 
15396 	ASSERT(qual == SATA_ADDR_DCPORT || qual == SATA_ADDR_DPMPORT);
15397 	if (qual == SATA_ADDR_DCPORT)
15398 		qual = SATA_ADDR_CPORT;
15399 	else
15400 		qual = SATA_ADDR_PMPORT;
15401 
15402 	/*
15403 	 * DEVCTL_AP_DISCONNECT invokes sata_hba_inst->satahba_tran->
15404 	 * sata_tran_hotplug_ops->sata_tran_port_deactivate().
15405 	 * Do the sanity check.
15406 	 */
15407 	if (SATA_PORT_DEACTIVATE_FUNC(sata_hba_inst) == NULL) {
15408 		/* No physical port deactivation supported. */
15409 		return (EINVAL);
15410 	}
15411 
15412 	/* Check the current state of the port */
15413 	rval = (*SATA_PROBE_PORT_FUNC(sata_hba_inst))
15414 	    (SATA_DIP(sata_hba_inst), sata_device);
15415 
15416 	cportinfo = SATA_CPORT_INFO(sata_hba_inst, cport);
15417 
15418 	/*
15419 	 * Processing port mulitiplier
15420 	 */
15421 	if (qual == SATA_ADDR_CPORT &&
15422 	    SATA_CPORT_DEV_TYPE(sata_hba_inst, cport) == SATA_DTYPE_PMULT) {
15423 		mutex_enter(&cportinfo->cport_mutex);
15424 
15425 		/* Check controller port status */
15426 		sata_update_port_info(sata_hba_inst, sata_device);
15427 		if (rval != SATA_SUCCESS ||
15428 		    (sata_device->satadev_state & SATA_PSTATE_FAILED) != 0) {
15429 			/*
15430 			 * Device port status is unknown or it is in failed
15431 			 * state
15432 			 */
15433 			SATA_CPORT_STATE(sata_hba_inst, cport) =
15434 			    SATA_PSTATE_FAILED;
15435 			SATADBG1(SATA_DBG_IOCTL_IF, sata_hba_inst,
15436 			    "sata_hba_ioctl: connect: failed to deactivate "
15437 			    "SATA port %d", cport);
15438 			mutex_exit(&cportinfo->cport_mutex);
15439 			return (EIO);
15440 		}
15441 
15442 		/* Disconnect all sub-devices. */
15443 		pmultinfo = SATA_CPORTINFO_PMULT_INFO(cportinfo);
15444 		if (pmultinfo != NULL) {
15445 
15446 			for (npmport = 0; npmport < SATA_NUM_PMPORTS(
15447 			    sata_hba_inst, cport); npmport ++) {
15448 				subsdinfo = SATA_PMPORT_DRV_INFO(
15449 				    sata_hba_inst, cport, npmport);
15450 				if (subsdinfo == NULL)
15451 					continue;
15452 
15453 				subsdevice.satadev_addr = subsdinfo->
15454 				    satadrv_addr;
15455 
15456 				mutex_exit(&cportinfo->cport_mutex);
15457 				if (sata_ioctl_disconnect(sata_hba_inst,
15458 				    &subsdevice) == SATA_SUCCESS) {
15459 					SATADBG2(SATA_DBG_PMULT, sata_hba_inst,
15460 					"[Remove] device at port %d:%d "
15461 					"successfully.", cport, npmport);
15462 				}
15463 				mutex_enter(&cportinfo->cport_mutex);
15464 			}
15465 		}
15466 
15467 		/* Disconnect the port multiplier */
15468 		cportinfo->cport_state &= ~SATA_STATE_READY;
15469 		mutex_exit(&cportinfo->cport_mutex);
15470 
15471 		sata_device->satadev_addr.qual = qual;
15472 		rval = (*SATA_PORT_DEACTIVATE_FUNC(sata_hba_inst))
15473 		    (SATA_DIP(sata_hba_inst), sata_device);
15474 
15475 		sata_gen_sysevent(sata_hba_inst, &sata_device->satadev_addr,
15476 		    SE_NO_HINT);
15477 
15478 		mutex_enter(&cportinfo->cport_mutex);
15479 		sata_update_port_info(sata_hba_inst, sata_device);
15480 		if (rval != SATA_SUCCESS &&
15481 		    sata_device->satadev_state & SATA_PSTATE_FAILED) {
15482 			cportinfo->cport_state = SATA_PSTATE_FAILED;
15483 			rv = EIO;
15484 		} else {
15485 			cportinfo->cport_state |= SATA_PSTATE_SHUTDOWN;
15486 		}
15487 		mutex_exit(&cportinfo->cport_mutex);
15488 
15489 		return (rv);
15490 	}
15491 
15492 	/*
15493 	 * Process non-port-multiplier device - it could be a drive connected
15494 	 * to a port multiplier port or a controller port.
15495 	 */
15496 	if (qual == SATA_ADDR_PMPORT) {
15497 		pmportinfo = SATA_PMPORT_INFO(sata_hba_inst, cport, pmport);
15498 		mutex_enter(&pmportinfo->pmport_mutex);
15499 		sata_update_pmport_info(sata_hba_inst, sata_device);
15500 		if (rval != SATA_SUCCESS ||
15501 		    (sata_device->satadev_state & SATA_PSTATE_FAILED) != 0) {
15502 			SATA_PMPORT_STATE(sata_hba_inst, cport, pmport) =
15503 			    SATA_PSTATE_FAILED;
15504 			SATADBG2(SATA_DBG_IOCTL_IF, sata_hba_inst,
15505 			    "sata_hba_ioctl: connect: failed to deactivate "
15506 			    "SATA port %d:%d", cport, pmport);
15507 			mutex_exit(&pmportinfo->pmport_mutex);
15508 			return (EIO);
15509 		}
15510 
15511 		if (pmportinfo->pmport_dev_type != SATA_DTYPE_NONE) {
15512 			sdinfo = pmportinfo->pmport_sata_drive;
15513 			ASSERT(sdinfo != NULL);
15514 		}
15515 
15516 		/*
15517 		 * Set port's dev_state to not ready - this will disable
15518 		 * an access to a potentially attached device.
15519 		 */
15520 		pmportinfo->pmport_state &= ~SATA_STATE_READY;
15521 
15522 		/* Remove and release sata_drive info structure. */
15523 		if (sdinfo != NULL) {
15524 			if ((sdinfo->satadrv_type &
15525 			    SATA_VALID_DEV_TYPE) != 0) {
15526 				/*
15527 				 * If a target node exists, try to offline
15528 				 * a device and remove target node.
15529 				 */
15530 				mutex_exit(&pmportinfo->pmport_mutex);
15531 				(void) sata_offline_device(sata_hba_inst,
15532 				    sata_device, sdinfo);
15533 				mutex_enter(&pmportinfo->pmport_mutex);
15534 			}
15535 
15536 			SATA_PMPORTINFO_DRV_INFO(pmportinfo) = NULL;
15537 			pmportinfo->pmport_dev_type = SATA_DTYPE_NONE;
15538 			(void) kmem_free((void *)sdinfo,
15539 			    sizeof (sata_drive_info_t));
15540 		}
15541 		mutex_exit(&pmportinfo->pmport_mutex);
15542 
15543 	} else if (qual == SATA_ADDR_CPORT) {
15544 		mutex_enter(&cportinfo->cport_mutex);
15545 		sata_update_port_info(sata_hba_inst, sata_device);
15546 		if (rval != SATA_SUCCESS ||
15547 		    (sata_device->satadev_state & SATA_PSTATE_FAILED) != 0) {
15548 			/*
15549 			 * Device port status is unknown or it is in failed
15550 			 * state
15551 			 */
15552 			SATA_CPORT_STATE(sata_hba_inst, cport) =
15553 			    SATA_PSTATE_FAILED;
15554 			SATADBG1(SATA_DBG_IOCTL_IF, sata_hba_inst,
15555 			    "sata_hba_ioctl: connect: failed to deactivate "
15556 			    "SATA port %d", cport);
15557 			mutex_exit(&cportinfo->cport_mutex);
15558 			return (EIO);
15559 		}
15560 
15561 		if (cportinfo->cport_dev_type == SATA_DTYPE_PMULT) {
15562 			pmultinfo = SATA_CPORTINFO_PMULT_INFO(cportinfo);
15563 			ASSERT(pmultinfo != NULL);
15564 		} else if (cportinfo->cport_dev_type != SATA_DTYPE_NONE) {
15565 			sdinfo = SATA_CPORTINFO_DRV_INFO(cportinfo);
15566 			ASSERT(sdinfo != NULL);
15567 		}
15568 		cportinfo->cport_state &= ~SATA_STATE_READY;
15569 
15570 		if (sdinfo != NULL) {
15571 			if ((sdinfo->satadrv_type &
15572 			    SATA_VALID_DEV_TYPE) != 0) {
15573 				/*
15574 				 * If a target node exists, try to offline
15575 				 * a device and remove target node.
15576 				 */
15577 				mutex_exit(&cportinfo->cport_mutex);
15578 				(void) sata_offline_device(sata_hba_inst,
15579 				    sata_device, sdinfo);
15580 				mutex_enter(&cportinfo->cport_mutex);
15581 			}
15582 
15583 			SATA_CPORTINFO_DRV_INFO(cportinfo) = NULL;
15584 			cportinfo->cport_dev_type = SATA_DTYPE_NONE;
15585 			(void) kmem_free((void *)sdinfo,
15586 			    sizeof (sata_drive_info_t));
15587 		}
15588 		mutex_exit(&cportinfo->cport_mutex);
15589 	}
15590 
15591 	/* Just ask HBA driver to deactivate port */
15592 	sata_device->satadev_addr.qual = qual;
15593 
15594 	rval = (*SATA_PORT_DEACTIVATE_FUNC(sata_hba_inst))
15595 	    (SATA_DIP(sata_hba_inst), sata_device);
15596 
15597 	/*
15598 	 * Generate sysevent - EC_DR / ESC_DR_AP_STATE_CHANGE
15599 	 * without the hint (to force listener to investivate the state).
15600 	 */
15601 	sata_gen_sysevent(sata_hba_inst, &sata_device->satadev_addr,
15602 	    SE_NO_HINT);
15603 
15604 	if (qual == SATA_ADDR_PMPORT) {
15605 		mutex_enter(&pmportinfo->pmport_mutex);
15606 		sata_update_pmport_info(sata_hba_inst, sata_device);
15607 
15608 		if (rval != SATA_SUCCESS &&
15609 		    sata_device->satadev_state & SATA_PSTATE_FAILED) {
15610 			/*
15611 			 * Port deactivation failure - do not change port
15612 			 * state unless the state returned by HBA indicates a
15613 			 * port failure.
15614 			 *
15615 			 * NOTE: device structures were released, so devices
15616 			 * now are invisible! Port reset is needed to
15617 			 * re-enumerate devices.
15618 			 */
15619 			pmportinfo->pmport_state = SATA_PSTATE_FAILED;
15620 			rv = EIO;
15621 		} else {
15622 			/*
15623 			 * Deactivation succeded. From now on the sata framework
15624 			 * will not care what is happening to the device, until
15625 			 * the port is activated again.
15626 			 */
15627 			pmportinfo->pmport_state |= SATA_PSTATE_SHUTDOWN;
15628 		}
15629 		mutex_exit(&pmportinfo->pmport_mutex);
15630 	} else if (qual == SATA_ADDR_CPORT) {
15631 		mutex_enter(&cportinfo->cport_mutex);
15632 		sata_update_port_info(sata_hba_inst, sata_device);
15633 
15634 		if (rval != SATA_SUCCESS &&
15635 		    sata_device->satadev_state & SATA_PSTATE_FAILED) {
15636 			cportinfo->cport_state = SATA_PSTATE_FAILED;
15637 			rv = EIO;
15638 		} else {
15639 			cportinfo->cport_state |= SATA_PSTATE_SHUTDOWN;
15640 		}
15641 		mutex_exit(&cportinfo->cport_mutex);
15642 	}
15643 
15644 	return (rv);
15645 }
15646 
15647 
15648 
15649 /*
15650  * Process sata port connect request
15651  * The sata cfgadm pluging will invoke this operation only if port was found
15652  * in the disconnect state (failed state is also treated as the disconnected
15653  * state).
15654  * DEVCTL_AP_CONNECT would invoke  sata_hba_inst->satahba_tran->
15655  * sata_tran_hotplug_ops->sata_tran_port_activate().
15656  * If successful and a device is found attached to the port,
15657  * the initialization sequence is executed to attach a device structure to
15658  * a port structure. The state of the port and a device would be set
15659  * appropriately.
15660  * The device is not set in configured state (system-wise) by this operation.
15661  *
15662  * Note, that activating the port may generate link events,
15663  * so it is important that following processing and the
15664  * event processing does not interfere with each other!
15665  *
15666  * This operation may remove port failed state and will
15667  * try to make port active and in good standing.
15668  *
15669  * NOTE: Port multiplier is supported.
15670  */
15671 
15672 static int
sata_ioctl_connect(sata_hba_inst_t * sata_hba_inst,sata_device_t * sata_device)15673 sata_ioctl_connect(sata_hba_inst_t *sata_hba_inst,
15674     sata_device_t *sata_device)
15675 {
15676 	sata_pmport_info_t	*pmportinfo = NULL;
15677 	uint8_t cport, pmport, qual;
15678 	int rv = 0;
15679 
15680 	cport = sata_device->satadev_addr.cport;
15681 	pmport = sata_device->satadev_addr.pmport;
15682 	qual = sata_device->satadev_addr.qual;
15683 
15684 	ASSERT(qual == SATA_ADDR_DCPORT || qual == SATA_ADDR_DPMPORT);
15685 	if (qual == SATA_ADDR_DCPORT)
15686 		qual = SATA_ADDR_CPORT;
15687 	else
15688 		qual = SATA_ADDR_PMPORT;
15689 
15690 	if (qual == SATA_ADDR_PMPORT)
15691 		pmportinfo = SATA_PMPORT_INFO(sata_hba_inst, cport, pmport);
15692 
15693 	/*
15694 	 * DEVCTL_AP_CONNECT would invoke sata_hba_inst->
15695 	 * satahba_tran->sata_tran_hotplug_ops->sata_tran_port_activate().
15696 	 * Perform sanity check now.
15697 	 */
15698 	if (SATA_PORT_ACTIVATE_FUNC(sata_hba_inst) == NULL) {
15699 		/* No physical port activation supported. */
15700 		return (EINVAL);
15701 	}
15702 
15703 	/* Just ask HBA driver to activate port */
15704 	if ((*SATA_PORT_ACTIVATE_FUNC(sata_hba_inst))
15705 	    (SATA_DIP(sata_hba_inst), sata_device) != SATA_SUCCESS) {
15706 		/*
15707 		 * Port activation failure.
15708 		 */
15709 		if (qual == SATA_ADDR_CPORT) {
15710 			mutex_enter(&SATA_CPORT_INFO(sata_hba_inst,
15711 			    cport)->cport_mutex);
15712 			sata_update_port_info(sata_hba_inst, sata_device);
15713 			if (sata_device->satadev_state & SATA_PSTATE_FAILED) {
15714 				SATA_CPORT_STATE(sata_hba_inst, cport) =
15715 				    SATA_PSTATE_FAILED;
15716 				SATADBG1(SATA_DBG_IOCTL_IF, sata_hba_inst,
15717 				    "sata_hba_ioctl: connect: failed to "
15718 				    "activate SATA port %d", cport);
15719 			}
15720 			mutex_exit(&SATA_CPORT_INFO(sata_hba_inst,
15721 			    cport)->cport_mutex);
15722 		} else { /* port multiplier device port */
15723 			mutex_enter(&pmportinfo->pmport_mutex);
15724 			sata_update_pmport_info(sata_hba_inst, sata_device);
15725 			if (sata_device->satadev_state & SATA_PSTATE_FAILED) {
15726 				SATA_PMPORT_STATE(sata_hba_inst, cport,
15727 				    pmport) = SATA_PSTATE_FAILED;
15728 				SATADBG2(SATA_DBG_IOCTL_IF, sata_hba_inst,
15729 				    "sata_hba_ioctl: connect: failed to "
15730 				    "activate SATA port %d:%d", cport, pmport);
15731 			}
15732 			mutex_exit(&pmportinfo->pmport_mutex);
15733 		}
15734 		return (EIO);
15735 	}
15736 
15737 	/* Virgin port state - will be updated by the port re-probe. */
15738 	if (qual == SATA_ADDR_CPORT) {
15739 		mutex_enter(&SATA_CPORT_INFO(sata_hba_inst,
15740 		    cport)->cport_mutex);
15741 		SATA_CPORT_STATE(sata_hba_inst, cport) = 0;
15742 		mutex_exit(&SATA_CPORT_INFO(sata_hba_inst,
15743 		    cport)->cport_mutex);
15744 	} else { /* port multiplier device port */
15745 		mutex_enter(&pmportinfo->pmport_mutex);
15746 		SATA_PMPORT_STATE(sata_hba_inst, cport, pmport) = 0;
15747 		mutex_exit(&pmportinfo->pmport_mutex);
15748 	}
15749 
15750 	/*
15751 	 * Probe the port to find its state and attached device.
15752 	 */
15753 	if (sata_reprobe_port(sata_hba_inst, sata_device,
15754 	    SATA_DEV_IDENTIFY_RETRY) == SATA_FAILURE)
15755 		rv = EIO;
15756 
15757 	/*
15758 	 * Generate sysevent - EC_DR / ESC_DR_AP_STATE_CHANGE
15759 	 * without the hint
15760 	 */
15761 	sata_gen_sysevent(sata_hba_inst, &sata_device->satadev_addr,
15762 	    SE_NO_HINT);
15763 
15764 	/*
15765 	 * If there is a device attached to the port, emit
15766 	 * a message.
15767 	 */
15768 	if (sata_device->satadev_type != SATA_DTYPE_NONE) {
15769 
15770 		if (qual == SATA_ADDR_CPORT) {
15771 			if (sata_device->satadev_type == SATA_DTYPE_PMULT) {
15772 				sata_log(sata_hba_inst, CE_WARN,
15773 				    "SATA port multiplier detected "
15774 				    "at port %d", cport);
15775 			} else {
15776 				sata_log(sata_hba_inst, CE_WARN,
15777 				    "SATA device detected at port %d", cport);
15778 				if (sata_device->satadev_type ==
15779 				    SATA_DTYPE_UNKNOWN) {
15780 				/*
15781 				 * A device was not successfully identified
15782 				 */
15783 				sata_log(sata_hba_inst, CE_WARN,
15784 				    "Could not identify SATA "
15785 				    "device at port %d", cport);
15786 				}
15787 			}
15788 		} else { /* port multiplier device port */
15789 			sata_log(sata_hba_inst, CE_WARN,
15790 			    "SATA device detected at port %d:%d",
15791 			    cport, pmport);
15792 			if (sata_device->satadev_type == SATA_DTYPE_UNKNOWN) {
15793 				/*
15794 				 * A device was not successfully identified
15795 				 */
15796 				sata_log(sata_hba_inst, CE_WARN,
15797 				    "Could not identify SATA "
15798 				    "device at port %d:%d", cport, pmport);
15799 			}
15800 		}
15801 	}
15802 
15803 	return (rv);
15804 }
15805 
15806 
15807 /*
15808  * Process sata device unconfigure request.
15809  * The unconfigure operation uses generic nexus operation to
15810  * offline a device. It leaves a target device node attached.
15811  * and obviously sata_drive_info attached as well, because
15812  * from the hardware point of view nothing has changed.
15813  */
15814 static int
sata_ioctl_unconfigure(sata_hba_inst_t * sata_hba_inst,sata_device_t * sata_device)15815 sata_ioctl_unconfigure(sata_hba_inst_t *sata_hba_inst,
15816     sata_device_t *sata_device)
15817 {
15818 	int rv = 0;
15819 	dev_info_t *tdip;
15820 
15821 	/* We are addressing attached device, not a port */
15822 	if (sata_device->satadev_addr.qual == SATA_ADDR_CPORT)
15823 		sata_device->satadev_addr.qual = SATA_ADDR_DCPORT;
15824 	else if (sata_device->satadev_addr.qual == SATA_ADDR_PMPORT)
15825 		sata_device->satadev_addr.qual = SATA_ADDR_DPMPORT;
15826 
15827 	if ((tdip = sata_get_scsi_target_dip(SATA_DIP(sata_hba_inst),
15828 	    &sata_device->satadev_addr)) != NULL) {
15829 
15830 		if (ndi_devi_offline(tdip, NDI_UNCONFIG) != NDI_SUCCESS) {
15831 			SATA_LOG_D((sata_hba_inst, CE_WARN,
15832 			    "sata_hba_ioctl: unconfigure: "
15833 			    "failed to unconfigure device at SATA port %d:%d",
15834 			    sata_device->satadev_addr.cport,
15835 			    sata_device->satadev_addr.pmport));
15836 			rv = EIO;
15837 		}
15838 		/*
15839 		 * The target node devi_state should be marked with
15840 		 * DEVI_DEVICE_OFFLINE by ndi_devi_offline().
15841 		 * This would be the indication for cfgadm that
15842 		 * the AP node occupant state is 'unconfigured'.
15843 		 */
15844 
15845 	} else {
15846 		/*
15847 		 * This would indicate a failure on the part of cfgadm
15848 		 * to detect correct state of the node prior to this
15849 		 * call - one cannot unconfigure non-existing device.
15850 		 */
15851 		SATA_LOG_D((sata_hba_inst, CE_WARN,
15852 		    "sata_hba_ioctl: unconfigure: "
15853 		    "attempt to unconfigure non-existing device "
15854 		    "at SATA port %d:%d",
15855 		    sata_device->satadev_addr.cport,
15856 		    sata_device->satadev_addr.pmport));
15857 		rv = ENXIO;
15858 	}
15859 	return (rv);
15860 }
15861 
15862 /*
15863  * Process sata device configure request
15864  * If port is in a failed state, operation is aborted - one has to use
15865  * an explicit connect or port activate request to try to get a port into
15866  * non-failed mode. Port reset wil also work in such situation.
15867  * If the port is in disconnected (shutdown) state, the connect operation is
15868  * attempted prior to any other action.
15869  * When port is in the active state, there is a device attached and the target
15870  * node exists, a device was most likely offlined.
15871  * If target node does not exist, a new target node is created. In both cases
15872  * an attempt is made to online (configure) the device.
15873  *
15874  * NOTE: Port multiplier is supported.
15875  */
15876 static int
sata_ioctl_configure(sata_hba_inst_t * sata_hba_inst,sata_device_t * sata_device)15877 sata_ioctl_configure(sata_hba_inst_t *sata_hba_inst,
15878     sata_device_t *sata_device)
15879 {
15880 	int cport, pmport, qual;
15881 	int rval;
15882 	boolean_t target = B_TRUE;
15883 	sata_cport_info_t *cportinfo;
15884 	sata_pmport_info_t *pmportinfo = NULL;
15885 	dev_info_t *tdip;
15886 	sata_drive_info_t *sdinfo;
15887 
15888 	cport = sata_device->satadev_addr.cport;
15889 	pmport = sata_device->satadev_addr.pmport;
15890 	qual = sata_device->satadev_addr.qual;
15891 
15892 	/* Get current port state */
15893 	rval = (*SATA_PROBE_PORT_FUNC(sata_hba_inst))
15894 	    (SATA_DIP(sata_hba_inst), sata_device);
15895 
15896 	cportinfo = SATA_CPORT_INFO(sata_hba_inst, cport);
15897 	if (qual == SATA_ADDR_DPMPORT) {
15898 		pmportinfo = SATA_PMPORT_INFO(sata_hba_inst, cport, pmport);
15899 		mutex_enter(&pmportinfo->pmport_mutex);
15900 		sata_update_pmport_info(sata_hba_inst, sata_device);
15901 		if (rval != SATA_SUCCESS ||
15902 		    (sata_device->satadev_state & SATA_PSTATE_FAILED) != 0) {
15903 			/*
15904 			 * Obviously, device on a failed port is not visible
15905 			 */
15906 			mutex_exit(&pmportinfo->pmport_mutex);
15907 			return (ENXIO);
15908 		}
15909 		mutex_exit(&pmportinfo->pmport_mutex);
15910 	} else {
15911 		mutex_enter(&SATA_CPORT_INFO(sata_hba_inst,
15912 		    cport)->cport_mutex);
15913 		sata_update_port_info(sata_hba_inst, sata_device);
15914 		if (rval != SATA_SUCCESS ||
15915 		    (sata_device->satadev_state & SATA_PSTATE_FAILED) != 0) {
15916 			/*
15917 			 * Obviously, device on a failed port is not visible
15918 			 */
15919 			mutex_exit(&SATA_CPORT_INFO(sata_hba_inst,
15920 			    cport)->cport_mutex);
15921 			return (ENXIO);
15922 		}
15923 		mutex_exit(&SATA_CPORT_INFO(sata_hba_inst,
15924 		    cport)->cport_mutex);
15925 	}
15926 
15927 	if ((sata_device->satadev_state & SATA_PSTATE_SHUTDOWN) != 0) {
15928 		/* need to activate port */
15929 		target = B_FALSE;
15930 
15931 		/* Sanity check */
15932 		if (SATA_PORT_ACTIVATE_FUNC(sata_hba_inst) == NULL)
15933 			return (ENXIO);
15934 
15935 		/* Just let HBA driver to activate port */
15936 		if ((*SATA_PORT_ACTIVATE_FUNC(sata_hba_inst))
15937 		    (SATA_DIP(sata_hba_inst), sata_device) != SATA_SUCCESS) {
15938 			/*
15939 			 * Port activation failure - do not change port state
15940 			 * unless the state returned by HBA indicates a port
15941 			 * failure.
15942 			 */
15943 			if (qual == SATA_ADDR_DPMPORT) {
15944 				mutex_enter(&pmportinfo->pmport_mutex);
15945 				sata_update_pmport_info(sata_hba_inst,
15946 				    sata_device);
15947 				if (sata_device->satadev_state &
15948 				    SATA_PSTATE_FAILED)
15949 					pmportinfo->pmport_state =
15950 					    SATA_PSTATE_FAILED;
15951 				mutex_exit(&pmportinfo->pmport_mutex);
15952 			} else {
15953 				mutex_enter(&SATA_CPORT_INFO(sata_hba_inst,
15954 				    cport)->cport_mutex);
15955 				sata_update_port_info(sata_hba_inst,
15956 				    sata_device);
15957 				if (sata_device->satadev_state &
15958 				    SATA_PSTATE_FAILED)
15959 					cportinfo->cport_state =
15960 					    SATA_PSTATE_FAILED;
15961 				mutex_exit(&SATA_CPORT_INFO(
15962 				    sata_hba_inst, cport)->cport_mutex);
15963 			}
15964 		}
15965 		SATA_LOG_D((sata_hba_inst, CE_WARN,
15966 		    "sata_hba_ioctl: configure: "
15967 		    "failed to activate SATA port %d:%d",
15968 		    cport, pmport));
15969 		return (EIO);
15970 	}
15971 	/*
15972 	 * Generate sysevent - EC_DR / ESC_DR_AP_STATE_CHANGE
15973 	 * without the hint.
15974 	 */
15975 	sata_gen_sysevent(sata_hba_inst,
15976 	    &sata_device->satadev_addr, SE_NO_HINT);
15977 
15978 	/* Virgin port state */
15979 	if (qual == SATA_ADDR_DPMPORT) {
15980 		mutex_enter(&pmportinfo->pmport_mutex);
15981 		pmportinfo->pmport_state = 0;
15982 		mutex_exit(&pmportinfo->pmport_mutex);
15983 	} else {
15984 		mutex_enter(&SATA_CPORT_INFO(sata_hba_inst,
15985 		    cport)-> cport_mutex);
15986 		cportinfo->cport_state = 0;
15987 		mutex_exit(&SATA_CPORT_INFO(sata_hba_inst,
15988 		    cport)->cport_mutex);
15989 	}
15990 	/*
15991 	 * Always reprobe port, to get current device info.
15992 	 */
15993 	if (sata_reprobe_port(sata_hba_inst, sata_device,
15994 	    SATA_DEV_IDENTIFY_RETRY) != SATA_SUCCESS)
15995 		return (EIO);
15996 
15997 	if (sata_device->satadev_type != SATA_DTYPE_NONE && target == B_FALSE) {
15998 		if (qual == SATA_ADDR_DPMPORT) {
15999 			/*
16000 			 * That's the transition from "inactive" port
16001 			 * to active one with device attached.
16002 			 */
16003 			sata_log(sata_hba_inst, CE_WARN,
16004 			    "SATA device detected at port %d:%d",
16005 			    cport, pmport);
16006 		} else {
16007 			/*
16008 			 * When PM is attached to the cport and cport is
16009 			 * activated, every PM device port needs to be reprobed.
16010 			 * We need to emit message for all devices detected
16011 			 * at port multiplier's device ports.
16012 			 * Add such code here.
16013 			 * For now, just inform about device attached to
16014 			 * cport.
16015 			 */
16016 			sata_log(sata_hba_inst, CE_WARN,
16017 			    "SATA device detected at port %d", cport);
16018 		}
16019 	}
16020 
16021 	/*
16022 	 * This is where real configuration operation starts.
16023 	 *
16024 	 * When PM is attached to the cport and cport is activated,
16025 	 * devices attached PM device ports may have to be configured
16026 	 * explicitly. This may change when port multiplier is supported.
16027 	 * For now, configure only disks and other valid target devices.
16028 	 */
16029 	if (!(sata_device->satadev_type & SATA_VALID_DEV_TYPE)) {
16030 		if (qual == SATA_ADDR_DCPORT) {
16031 			if (sata_device->satadev_type == SATA_DTYPE_UNKNOWN) {
16032 				/*
16033 				 * A device was not successfully identified
16034 				 */
16035 				sata_log(sata_hba_inst, CE_WARN,
16036 				    "Could not identify SATA "
16037 				    "device at port %d", cport);
16038 			}
16039 		} else { /* port multiplier device port */
16040 			if (sata_device->satadev_type == SATA_DTYPE_UNKNOWN) {
16041 				/*
16042 				 * A device was not successfully identified
16043 				 */
16044 				sata_log(sata_hba_inst, CE_WARN,
16045 				    "Could not identify SATA "
16046 				    "device at port %d:%d", cport, pmport);
16047 			}
16048 		}
16049 		return (ENXIO);		/* No device to configure */
16050 	}
16051 
16052 	/*
16053 	 * Here we may have a device in reset condition,
16054 	 * but because we are just configuring it, there is
16055 	 * no need to process the reset other than just
16056 	 * to clear device reset condition in the HBA driver.
16057 	 * Setting the flag SATA_EVNT_CLEAR_DEVICE_RESET will
16058 	 * cause a first command sent the HBA driver with the request
16059 	 * to clear device reset condition.
16060 	 */
16061 	mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, cport)->cport_mutex);
16062 	if (qual == SATA_ADDR_DPMPORT)
16063 		sata_device->satadev_addr.qual = SATA_ADDR_DPMPORT;
16064 	else
16065 		sata_device->satadev_addr.qual = SATA_ADDR_DCPORT;
16066 	sdinfo = sata_get_device_info(sata_hba_inst, sata_device);
16067 	if (sdinfo == NULL) {
16068 		mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, cport)->cport_mutex);
16069 		return (ENXIO);
16070 	}
16071 	if (sdinfo->satadrv_event_flags &
16072 	    (SATA_EVNT_DEVICE_RESET | SATA_EVNT_INPROC_DEVICE_RESET)) {
16073 		sdinfo->satadrv_event_flags = 0;
16074 	}
16075 	sdinfo->satadrv_event_flags |= SATA_EVNT_CLEAR_DEVICE_RESET;
16076 	mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, cport)->cport_mutex);
16077 
16078 	if ((tdip = sata_get_scsi_target_dip(SATA_DIP(sata_hba_inst),
16079 	    &sata_device->satadev_addr)) != NULL) {
16080 		/*
16081 		 * Target node exists. Verify, that it belongs
16082 		 * to existing, attached device and not to
16083 		 * a removed device.
16084 		 */
16085 		if (sata_check_device_removed(tdip) == B_TRUE) {
16086 			if (qual == SATA_ADDR_DPMPORT)
16087 				sata_log(sata_hba_inst, CE_WARN,
16088 				    "SATA device at port %d cannot be "
16089 				    "configured. "
16090 				    "Application(s) accessing "
16091 				    "previously attached device "
16092 				    "have to release it before newly "
16093 				    "inserted device can be made accessible.",
16094 				    cport);
16095 			else
16096 				sata_log(sata_hba_inst, CE_WARN,
16097 				    "SATA device at port %d:%d cannot be"
16098 				    "configured. "
16099 				    "Application(s) accessing "
16100 				    "previously attached device "
16101 				    "have to release it before newly "
16102 				    "inserted device can be made accessible.",
16103 				    cport, pmport);
16104 			return (EIO);
16105 		}
16106 		/*
16107 		 * Device was not removed and re-inserted.
16108 		 * Try to online it.
16109 		 */
16110 		if (ndi_devi_online(tdip, 0) != NDI_SUCCESS) {
16111 			SATA_LOG_D((sata_hba_inst, CE_WARN,
16112 			    "sata_hba_ioctl: configure: "
16113 			    "onlining device at SATA port "
16114 			    "%d:%d failed", cport, pmport));
16115 			return (EIO);
16116 		}
16117 
16118 		if (qual == SATA_ADDR_DPMPORT) {
16119 			mutex_enter(&pmportinfo->pmport_mutex);
16120 			pmportinfo->pmport_tgtnode_clean = B_TRUE;
16121 			mutex_exit(&pmportinfo->pmport_mutex);
16122 		} else {
16123 			mutex_enter(&SATA_CPORT_INFO(sata_hba_inst,
16124 			    cport)->cport_mutex);
16125 			cportinfo-> cport_tgtnode_clean = B_TRUE;
16126 			mutex_exit(&SATA_CPORT_INFO(
16127 			    sata_hba_inst, cport)->cport_mutex);
16128 		}
16129 	} else {
16130 		/*
16131 		 * No target node - need to create a new target node.
16132 		 */
16133 		if (qual == SATA_ADDR_DPMPORT) {
16134 			mutex_enter(&pmportinfo->pmport_mutex);
16135 			pmportinfo->pmport_tgtnode_clean = B_TRUE;
16136 			mutex_exit(&pmportinfo->pmport_mutex);
16137 		} else {
16138 			mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, cport)->
16139 			    cport_mutex);
16140 			cportinfo-> cport_tgtnode_clean = B_TRUE;
16141 			mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, cport)->
16142 			    cport_mutex);
16143 		}
16144 
16145 		tdip = sata_create_target_node(SATA_DIP(sata_hba_inst),
16146 		    sata_hba_inst, &sata_device->satadev_addr);
16147 		if (tdip == NULL) {
16148 			/* Configure operation failed */
16149 			SATA_LOG_D((sata_hba_inst, CE_WARN,
16150 			    "sata_hba_ioctl: configure: "
16151 			    "configuring SATA device at port %d:%d "
16152 			    "failed", cport, pmport));
16153 			return (EIO);
16154 		}
16155 	}
16156 	return (0);
16157 }
16158 
16159 
16160 /*
16161  * Process ioctl deactivate port request.
16162  * Arbitrarily unconfigure attached device, if any.
16163  * Even if the unconfigure fails, proceed with the
16164  * port deactivation.
16165  *
16166  * NOTE: Port Multiplier is supported now.
16167  */
16168 
16169 static int
sata_ioctl_deactivate(sata_hba_inst_t * sata_hba_inst,sata_device_t * sata_device)16170 sata_ioctl_deactivate(sata_hba_inst_t *sata_hba_inst,
16171     sata_device_t *sata_device)
16172 {
16173 	int cport, pmport, qual;
16174 	int rval, rv = 0;
16175 	int npmport;
16176 	sata_cport_info_t *cportinfo;
16177 	sata_pmport_info_t *pmportinfo;
16178 	sata_pmult_info_t *pmultinfo;
16179 	dev_info_t *tdip;
16180 	sata_drive_info_t *sdinfo = NULL;
16181 	sata_device_t subsdevice;
16182 
16183 	/* Sanity check */
16184 	if (SATA_PORT_DEACTIVATE_FUNC(sata_hba_inst) == NULL)
16185 		return (ENOTSUP);
16186 
16187 	cport = sata_device->satadev_addr.cport;
16188 	pmport = sata_device->satadev_addr.pmport;
16189 	qual = sata_device->satadev_addr.qual;
16190 
16191 	/* SCSI_TO_SATA_ADDR_QUAL() translate ap_id into a device qualifier */
16192 	ASSERT(qual == SATA_ADDR_DCPORT || qual == SATA_ADDR_DPMPORT);
16193 	if (qual == SATA_ADDR_DCPORT)
16194 		qual = SATA_ADDR_CPORT;
16195 	else
16196 		qual = SATA_ADDR_PMPORT;
16197 
16198 	cportinfo = SATA_CPORT_INFO(sata_hba_inst, cport);
16199 	if (qual == SATA_ADDR_PMPORT)
16200 		pmportinfo = SATA_PMPORT_INFO(sata_hba_inst, cport, pmport);
16201 
16202 	/*
16203 	 * Processing port multiplier
16204 	 */
16205 	if (qual == SATA_ADDR_CPORT &&
16206 	    SATA_CPORT_DEV_TYPE(sata_hba_inst, cport) == SATA_DTYPE_PMULT) {
16207 		mutex_enter(&cportinfo->cport_mutex);
16208 
16209 		/* Deactivate all sub-deices */
16210 		pmultinfo = SATA_CPORTINFO_PMULT_INFO(cportinfo);
16211 		if (pmultinfo != NULL) {
16212 			for (npmport = 0; npmport < SATA_NUM_PMPORTS(
16213 			    sata_hba_inst, cport); npmport++) {
16214 
16215 				subsdevice.satadev_addr.cport = cport;
16216 				subsdevice.satadev_addr.pmport =
16217 				    (uint8_t)npmport;
16218 				subsdevice.satadev_addr.qual =
16219 				    SATA_ADDR_DPMPORT;
16220 
16221 				SATADBG2(SATA_DBG_PMULT, sata_hba_inst,
16222 				    "sata_hba_ioctl: deactivate: trying to "
16223 				    "deactivate SATA port %d:%d",
16224 				    cport, npmport);
16225 
16226 				mutex_exit(&cportinfo->cport_mutex);
16227 				if (sata_ioctl_deactivate(sata_hba_inst,
16228 				    &subsdevice) == SATA_SUCCESS) {
16229 					SATADBG2(SATA_DBG_PMULT, sata_hba_inst,
16230 					    "[Deactivate] device at port %d:%d "
16231 					    "successfully.", cport, npmport);
16232 				}
16233 				mutex_enter(&cportinfo->cport_mutex);
16234 			}
16235 		}
16236 
16237 		/* Deactivate the port multiplier now. */
16238 		cportinfo->cport_state &= ~SATA_STATE_READY;
16239 		mutex_exit(&cportinfo->cport_mutex);
16240 
16241 		sata_device->satadev_addr.qual = qual;
16242 		rval = (*SATA_PORT_DEACTIVATE_FUNC(sata_hba_inst))
16243 		    (SATA_DIP(sata_hba_inst), sata_device);
16244 
16245 		sata_gen_sysevent(sata_hba_inst, &sata_device->satadev_addr,
16246 		    SE_NO_HINT);
16247 
16248 		mutex_enter(&cportinfo->cport_mutex);
16249 		sata_update_port_info(sata_hba_inst, sata_device);
16250 		if (rval != SATA_SUCCESS) {
16251 			if (sata_device->satadev_state & SATA_PSTATE_FAILED) {
16252 				cportinfo->cport_state = SATA_PSTATE_FAILED;
16253 			}
16254 			rv = EIO;
16255 		} else {
16256 			cportinfo->cport_state |= SATA_PSTATE_SHUTDOWN;
16257 		}
16258 		mutex_exit(&cportinfo->cport_mutex);
16259 
16260 		return (rv);
16261 	}
16262 
16263 	/*
16264 	 * Process non-port-multiplier device - it could be a drive connected
16265 	 * to a port multiplier port or a controller port.
16266 	 */
16267 	mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, cport)->cport_mutex);
16268 	if (qual == SATA_ADDR_CPORT) {
16269 		sata_device->satadev_addr.qual = SATA_ADDR_DCPORT;
16270 		if (cportinfo->cport_dev_type != SATA_DTYPE_NONE) {
16271 			/* deal only with valid devices */
16272 			if ((cportinfo->cport_dev_type &
16273 			    SATA_VALID_DEV_TYPE) != 0)
16274 				sdinfo = SATA_CPORTINFO_DRV_INFO(cportinfo);
16275 		}
16276 		cportinfo->cport_state &= ~SATA_STATE_READY;
16277 	} else {
16278 		/* Port multiplier device port */
16279 		mutex_enter(&pmportinfo->pmport_mutex);
16280 		sata_device->satadev_addr.qual = SATA_ADDR_DPMPORT;
16281 		if (pmportinfo->pmport_dev_type != SATA_DTYPE_NONE &&
16282 		    (pmportinfo->pmport_dev_type & SATA_VALID_DEV_TYPE) != 0)
16283 			sdinfo = SATA_PMPORTINFO_DRV_INFO(pmportinfo);
16284 		pmportinfo->pmport_state &= ~SATA_STATE_READY;
16285 		mutex_exit(&pmportinfo->pmport_mutex);
16286 	}
16287 
16288 	if (sdinfo != NULL) {
16289 		/*
16290 		 * If a target node exists, try to offline a device and
16291 		 * to remove a target node.
16292 		 */
16293 		mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, cport)->
16294 		    cport_mutex);
16295 		tdip = sata_get_scsi_target_dip(SATA_DIP(sata_hba_inst),
16296 		    &sata_device->satadev_addr);
16297 		if (tdip != NULL) {
16298 			/* target node exist */
16299 			SATADBG1(SATA_DBG_IOCTL_IF, sata_hba_inst,
16300 			    "sata_hba_ioctl: port deactivate: "
16301 			    "target node exists.", NULL);
16302 
16303 			if (ndi_devi_offline(tdip, NDI_DEVI_REMOVE) !=
16304 			    NDI_SUCCESS) {
16305 				SATA_LOG_D((sata_hba_inst, CE_WARN,
16306 				    "sata_hba_ioctl: port deactivate: "
16307 				    "failed to unconfigure device at port "
16308 				    "%d:%d before deactivating the port",
16309 				    cport, pmport));
16310 				/*
16311 				 * Set DEVICE REMOVED state in the target
16312 				 * node. It will prevent an access to
16313 				 * the device even when a new device is
16314 				 * attached, until the old target node is
16315 				 * released, removed and recreated for a new
16316 				 * device.
16317 				 */
16318 				sata_set_device_removed(tdip);
16319 
16320 				/*
16321 				 * Instruct the event daemon to try the
16322 				 * target node cleanup later.
16323 				 */
16324 				sata_set_target_node_cleanup(sata_hba_inst,
16325 				    &sata_device->satadev_addr);
16326 			}
16327 		}
16328 		mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, cport)->
16329 		    cport_mutex);
16330 		/*
16331 		 * In any case, remove and release sata_drive_info
16332 		 * structure.
16333 		 */
16334 		if (qual == SATA_ADDR_CPORT) {
16335 			SATA_CPORTINFO_DRV_INFO(cportinfo) = NULL;
16336 			cportinfo->cport_dev_type = SATA_DTYPE_NONE;
16337 		} else { /* port multiplier device port */
16338 			mutex_enter(&pmportinfo->pmport_mutex);
16339 			SATA_PMPORTINFO_DRV_INFO(pmportinfo) = NULL;
16340 			pmportinfo->pmport_dev_type = SATA_DTYPE_NONE;
16341 			mutex_exit(&pmportinfo->pmport_mutex);
16342 		}
16343 		(void) kmem_free((void *)sdinfo, sizeof (sata_drive_info_t));
16344 	}
16345 
16346 	if (qual == SATA_ADDR_CPORT) {
16347 		cportinfo->cport_state &= ~(SATA_STATE_PROBED |
16348 		    SATA_STATE_PROBING);
16349 	} else if (qual == SATA_ADDR_PMPORT) {
16350 		mutex_enter(&pmportinfo->pmport_mutex);
16351 		pmportinfo->pmport_state &= ~(SATA_STATE_PROBED |
16352 		    SATA_STATE_PROBING);
16353 		mutex_exit(&pmportinfo->pmport_mutex);
16354 	}
16355 	mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, cport)->cport_mutex);
16356 
16357 	/* Just let HBA driver to deactivate port */
16358 	sata_device->satadev_addr.qual = qual;
16359 	rval = (*SATA_PORT_DEACTIVATE_FUNC(sata_hba_inst))
16360 	    (SATA_DIP(sata_hba_inst), sata_device);
16361 
16362 	/*
16363 	 * Generate sysevent - EC_DR / ESC_DR_AP_STATE_CHANGE
16364 	 * without the hint
16365 	 */
16366 	sata_gen_sysevent(sata_hba_inst, &sata_device->satadev_addr,
16367 	    SE_NO_HINT);
16368 
16369 	mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, cport)->cport_mutex);
16370 	sata_update_port_info(sata_hba_inst, sata_device);
16371 	if (qual == SATA_ADDR_CPORT) {
16372 		if (rval != SATA_SUCCESS) {
16373 			/*
16374 			 * Port deactivation failure - do not change port state
16375 			 * unless the state returned by HBA indicates a port
16376 			 * failure.
16377 			 */
16378 			if (sata_device->satadev_state & SATA_PSTATE_FAILED) {
16379 				SATA_CPORT_STATE(sata_hba_inst, cport) =
16380 				    SATA_PSTATE_FAILED;
16381 			}
16382 			SATA_LOG_D((sata_hba_inst, CE_WARN,
16383 			    "sata_hba_ioctl: port deactivate: "
16384 			    "cannot deactivate SATA port %d", cport));
16385 			rv = EIO;
16386 		} else {
16387 			cportinfo->cport_state |= SATA_PSTATE_SHUTDOWN;
16388 		}
16389 	} else {
16390 		mutex_enter(&pmportinfo->pmport_mutex);
16391 		if (rval != SATA_SUCCESS) {
16392 			if (sata_device->satadev_state & SATA_PSTATE_FAILED) {
16393 				SATA_PMPORT_STATE(sata_hba_inst, cport,
16394 				    pmport) = SATA_PSTATE_FAILED;
16395 			}
16396 			SATA_LOG_D((sata_hba_inst, CE_WARN,
16397 			    "sata_hba_ioctl: port deactivate: "
16398 			    "cannot deactivate SATA port %d:%d",
16399 			    cport, pmport));
16400 			rv = EIO;
16401 		} else {
16402 			pmportinfo->pmport_state |= SATA_PSTATE_SHUTDOWN;
16403 		}
16404 		mutex_exit(&pmportinfo->pmport_mutex);
16405 	}
16406 
16407 	mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, cport)->cport_mutex);
16408 
16409 	return (rv);
16410 }
16411 
16412 /*
16413  * Process ioctl port activate request.
16414  *
16415  * NOTE: Port multiplier is supported now.
16416  */
16417 static int
sata_ioctl_activate(sata_hba_inst_t * sata_hba_inst,sata_device_t * sata_device)16418 sata_ioctl_activate(sata_hba_inst_t *sata_hba_inst,
16419     sata_device_t *sata_device)
16420 {
16421 	int cport, pmport, qual;
16422 	sata_cport_info_t *cportinfo;
16423 	sata_pmport_info_t *pmportinfo = NULL;
16424 	boolean_t dev_existed = B_TRUE;
16425 
16426 	/* Sanity check */
16427 	if (SATA_PORT_ACTIVATE_FUNC(sata_hba_inst) == NULL)
16428 		return (ENOTSUP);
16429 
16430 	cport = sata_device->satadev_addr.cport;
16431 	pmport = sata_device->satadev_addr.pmport;
16432 	qual = sata_device->satadev_addr.qual;
16433 
16434 	cportinfo = SATA_CPORT_INFO(sata_hba_inst, cport);
16435 
16436 	/*
16437 	 * The qual translate from ap_id (by SCSI_TO_SATA_ADDR_QUAL())
16438 	 * is a device. But what we are dealing with is port/pmport.
16439 	 */
16440 	ASSERT(qual == SATA_ADDR_DCPORT || qual == SATA_ADDR_DPMPORT);
16441 	if (qual == SATA_ADDR_DCPORT)
16442 		sata_device->satadev_addr.qual = qual = SATA_ADDR_CPORT;
16443 	else
16444 		sata_device->satadev_addr.qual = qual = SATA_ADDR_PMPORT;
16445 
16446 	mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, cport)->cport_mutex);
16447 	if (qual == SATA_ADDR_PMPORT) {
16448 		pmportinfo = SATA_PMPORT_INFO(sata_hba_inst, cport, pmport);
16449 		if (pmportinfo->pmport_state & SATA_PSTATE_SHUTDOWN ||
16450 		    pmportinfo->pmport_dev_type == SATA_DTYPE_NONE)
16451 			dev_existed = B_FALSE;
16452 	} else { /* cport */
16453 		if (cportinfo->cport_state & SATA_PSTATE_SHUTDOWN ||
16454 		    cportinfo->cport_dev_type == SATA_DTYPE_NONE)
16455 			dev_existed = B_FALSE;
16456 	}
16457 	mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, cport)->cport_mutex);
16458 
16459 	/* Just let HBA driver to activate port, if necessary */
16460 	if ((*SATA_PORT_ACTIVATE_FUNC(sata_hba_inst))
16461 	    (SATA_DIP(sata_hba_inst), sata_device) != SATA_SUCCESS) {
16462 		/*
16463 		 * Port activation failure - do not change port state unless
16464 		 * the state returned by HBA indicates a port failure.
16465 		 */
16466 		mutex_enter(&SATA_CPORT_INFO(sata_hba_inst,
16467 		    cport)->cport_mutex);
16468 		sata_update_port_info(sata_hba_inst, sata_device);
16469 		if (sata_device->satadev_state & SATA_PSTATE_FAILED) {
16470 			if (qual == SATA_ADDR_PMPORT) {
16471 				mutex_enter(&pmportinfo->pmport_mutex);
16472 				pmportinfo->pmport_state = SATA_PSTATE_FAILED;
16473 				mutex_exit(&pmportinfo->pmport_mutex);
16474 			} else
16475 				cportinfo->cport_state = SATA_PSTATE_FAILED;
16476 
16477 			mutex_exit(&SATA_CPORT_INFO(sata_hba_inst,
16478 			    cport)->cport_mutex);
16479 			SATA_LOG_D((sata_hba_inst, CE_WARN,
16480 			    "sata_hba_ioctl: port activate: cannot activate "
16481 			    "SATA port %d:%d", cport, pmport));
16482 			return (EIO);
16483 		}
16484 		mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, cport)->cport_mutex);
16485 	}
16486 	mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, cport)->cport_mutex);
16487 	if (qual == SATA_ADDR_PMPORT) {
16488 		mutex_enter(&pmportinfo->pmport_mutex);
16489 		pmportinfo->pmport_state &= ~SATA_PSTATE_SHUTDOWN;
16490 		mutex_exit(&pmportinfo->pmport_mutex);
16491 	} else
16492 		cportinfo->cport_state &= ~SATA_PSTATE_SHUTDOWN;
16493 	mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, cport)->cport_mutex);
16494 
16495 	/*
16496 	 * Re-probe port to find its current state and possibly attached device.
16497 	 * Port re-probing may change the cportinfo device type if device is
16498 	 * found attached.
16499 	 * If port probing failed, the device type would be set to
16500 	 * SATA_DTYPE_NONE.
16501 	 */
16502 	(void) sata_reprobe_port(sata_hba_inst, sata_device,
16503 	    SATA_DEV_IDENTIFY_RETRY);
16504 
16505 	/*
16506 	 * Generate sysevent - EC_DR / ESC_DR_AP_STATE_CHANGE
16507 	 * without the hint.
16508 	 */
16509 	sata_gen_sysevent(sata_hba_inst, &sata_device->satadev_addr,
16510 	    SE_NO_HINT);
16511 
16512 	if (dev_existed == B_FALSE) {
16513 		if (qual == SATA_ADDR_PMPORT &&
16514 		    pmportinfo->pmport_dev_type != SATA_DTYPE_NONE) {
16515 			/*
16516 			 * That's the transition from the "inactive" port state
16517 			 * or the active port without a device attached to the
16518 			 * active port state with a device attached.
16519 			 */
16520 			sata_log(sata_hba_inst, CE_WARN,
16521 			    "SATA device detected at port %d:%d",
16522 			    cport, pmport);
16523 		} else if (qual == SATA_ADDR_CPORT &&
16524 		    cportinfo->cport_dev_type != SATA_DTYPE_NONE) {
16525 			/*
16526 			 * That's the transition from the "inactive" port state
16527 			 * or the active port without a device attached to the
16528 			 * active port state with a device attached.
16529 			 */
16530 			if (cportinfo->cport_dev_type != SATA_DTYPE_PMULT) {
16531 				sata_log(sata_hba_inst, CE_WARN,
16532 				    "SATA device detected at port %d", cport);
16533 			} else {
16534 				sata_log(sata_hba_inst, CE_WARN,
16535 				    "SATA port multiplier detected at port %d",
16536 				    cport);
16537 			}
16538 		}
16539 	}
16540 	return (0);
16541 }
16542 
16543 
16544 
16545 /*
16546  * Process ioctl reset port request.
16547  *
16548  * NOTE: Port-Multiplier is supported.
16549  */
16550 static int
sata_ioctl_reset_port(sata_hba_inst_t * sata_hba_inst,sata_device_t * sata_device)16551 sata_ioctl_reset_port(sata_hba_inst_t *sata_hba_inst,
16552     sata_device_t *sata_device)
16553 {
16554 	int cport, pmport, qual;
16555 	int rv = 0;
16556 
16557 	cport = sata_device->satadev_addr.cport;
16558 	pmport = sata_device->satadev_addr.pmport;
16559 	qual = sata_device->satadev_addr.qual;
16560 
16561 	/*
16562 	 * The qual translate from ap_id (by SCSI_TO_SATA_ADDR_QUAL())
16563 	 * is a device. But what we are dealing with is port/pmport.
16564 	 */
16565 	if (qual == SATA_ADDR_DCPORT)
16566 		sata_device->satadev_addr.qual = qual = SATA_ADDR_CPORT;
16567 	else
16568 		sata_device->satadev_addr.qual = qual = SATA_ADDR_PMPORT;
16569 	ASSERT(qual == SATA_ADDR_CPORT || qual == SATA_ADDR_PMPORT);
16570 
16571 	/* Sanity check */
16572 	if (SATA_RESET_DPORT_FUNC(sata_hba_inst) == NULL) {
16573 		SATA_LOG_D((sata_hba_inst, CE_WARN,
16574 		    "sata_hba_ioctl: sata_hba_tran missing required "
16575 		    "function sata_tran_reset_dport"));
16576 		return (ENOTSUP);
16577 	}
16578 
16579 	/* Ask HBA to reset port */
16580 	if ((*SATA_RESET_DPORT_FUNC(sata_hba_inst))(SATA_DIP(sata_hba_inst),
16581 	    sata_device) != SATA_SUCCESS) {
16582 		SATA_LOG_D((sata_hba_inst, CE_WARN,
16583 		    "sata_hba_ioctl: reset port: failed %d:%d",
16584 		    cport, pmport));
16585 		mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, cport)->
16586 		    cport_mutex);
16587 		sata_update_port_info(sata_hba_inst, sata_device);
16588 		if (qual == SATA_ADDR_CPORT)
16589 			SATA_CPORT_STATE(sata_hba_inst, cport) =
16590 			    SATA_PSTATE_FAILED;
16591 		else {
16592 			mutex_enter(&SATA_PMPORT_MUTEX(sata_hba_inst, cport,
16593 			    pmport));
16594 			SATA_PMPORT_STATE(sata_hba_inst, cport, pmport) =
16595 			    SATA_PSTATE_FAILED;
16596 			mutex_exit(&SATA_PMPORT_MUTEX(sata_hba_inst, cport,
16597 			    pmport));
16598 		}
16599 		mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, cport)->
16600 		    cport_mutex);
16601 		rv = EIO;
16602 	}
16603 
16604 	return (rv);
16605 }
16606 
16607 /*
16608  * Process ioctl reset device request.
16609  *
16610  * NOTE: Port multiplier is supported.
16611  */
16612 static int
sata_ioctl_reset_device(sata_hba_inst_t * sata_hba_inst,sata_device_t * sata_device)16613 sata_ioctl_reset_device(sata_hba_inst_t *sata_hba_inst,
16614     sata_device_t *sata_device)
16615 {
16616 	sata_drive_info_t *sdinfo = NULL;
16617 	sata_pmult_info_t *pmultinfo = NULL;
16618 	int cport, pmport;
16619 	int rv = 0;
16620 
16621 	/* Sanity check */
16622 	if (SATA_RESET_DPORT_FUNC(sata_hba_inst) == NULL) {
16623 		SATA_LOG_D((sata_hba_inst, CE_WARN,
16624 		    "sata_hba_ioctl: sata_hba_tran missing required "
16625 		    "function sata_tran_reset_dport"));
16626 		return (ENOTSUP);
16627 	}
16628 
16629 	cport = sata_device->satadev_addr.cport;
16630 	pmport = sata_device->satadev_addr.pmport;
16631 
16632 	mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, cport)->cport_mutex);
16633 	if (sata_device->satadev_addr.qual == SATA_ADDR_DCPORT) {
16634 		if (SATA_CPORT_DEV_TYPE(sata_hba_inst, cport) ==
16635 		    SATA_DTYPE_PMULT)
16636 			pmultinfo = SATA_CPORT_INFO(sata_hba_inst, cport)->
16637 			    cport_devp.cport_sata_pmult;
16638 		else
16639 			sdinfo = SATA_CPORT_DRV_INFO(sata_hba_inst,
16640 			    sata_device->satadev_addr.cport);
16641 	} else { /* port multiplier */
16642 		sata_device->satadev_addr.qual = SATA_ADDR_DPMPORT;
16643 		sdinfo = SATA_PMPORT_DRV_INFO(sata_hba_inst,
16644 		    sata_device->satadev_addr.cport,
16645 		    sata_device->satadev_addr.pmport);
16646 	}
16647 	if (sdinfo == NULL && pmultinfo == NULL) {
16648 		mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, cport)->cport_mutex);
16649 		return (EINVAL);
16650 	}
16651 	mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, cport)->cport_mutex);
16652 
16653 	/* Ask HBA to reset device */
16654 	if ((*SATA_RESET_DPORT_FUNC(sata_hba_inst))
16655 	    (SATA_DIP(sata_hba_inst), sata_device) != SATA_SUCCESS) {
16656 		SATA_LOG_D((sata_hba_inst, CE_WARN,
16657 		    "sata_hba_ioctl: reset device: failed at port %d:%d",
16658 		    cport, pmport));
16659 		mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, cport)->
16660 		    cport_mutex);
16661 		sata_update_port_info(sata_hba_inst, sata_device);
16662 		/*
16663 		 * Device info structure remains attached. Another device reset
16664 		 * or port disconnect/connect and re-probing is
16665 		 * needed to change it's state
16666 		 */
16667 		if (sdinfo != NULL) {
16668 			sdinfo->satadrv_state &= ~SATA_STATE_READY;
16669 			sdinfo->satadrv_state |= SATA_DSTATE_FAILED;
16670 		} else if (pmultinfo != NULL) {
16671 			pmultinfo->pmult_state &= ~SATA_STATE_READY;
16672 			pmultinfo->pmult_state |= SATA_DSTATE_FAILED;
16673 		}
16674 
16675 		mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, cport)->cport_mutex);
16676 		rv = EIO;
16677 	}
16678 	/*
16679 	 * If attached device was a port multiplier, some extra processing
16680 	 * may be needed to bring it back. SATA specification requies a
16681 	 * mandatory software reset on host port to reliably enumerate a port
16682 	 * multiplier, the HBA driver should handle that after reset
16683 	 * operation.
16684 	 */
16685 	return (rv);
16686 }
16687 
16688 
16689 /*
16690  * Process ioctl reset all request.
16691  */
16692 static int
sata_ioctl_reset_all(sata_hba_inst_t * sata_hba_inst)16693 sata_ioctl_reset_all(sata_hba_inst_t *sata_hba_inst)
16694 {
16695 	sata_device_t sata_device;
16696 	int rv = 0;
16697 	int tcport;
16698 
16699 	sata_device.satadev_rev = SATA_DEVICE_REV;
16700 
16701 	/*
16702 	 * There is no protection here for configured devices.
16703 	 */
16704 	/* Sanity check */
16705 	if (SATA_RESET_DPORT_FUNC(sata_hba_inst) == NULL) {
16706 		SATA_LOG_D((sata_hba_inst, CE_WARN,
16707 		    "sata_hba_ioctl: sata_hba_tran missing required "
16708 		    "function sata_tran_reset_dport"));
16709 		return (ENOTSUP);
16710 	}
16711 
16712 	/*
16713 	 * Need to lock all ports, not just one.
16714 	 * If any port is locked by event processing, fail the whole operation.
16715 	 * One port is already locked, but for simplicity lock it again.
16716 	 */
16717 	for (tcport = 0; tcport < SATA_NUM_CPORTS(sata_hba_inst); tcport++) {
16718 		mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, tcport)->
16719 		    cport_mutex);
16720 		if (((SATA_CPORT_INFO(sata_hba_inst, tcport)->
16721 		    cport_event_flags) & SATA_EVNT_LOCK_PORT_BUSY) != 0) {
16722 			mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, tcport)->
16723 			    cport_mutex);
16724 			rv = EBUSY;
16725 			break;
16726 		} else {
16727 			/*
16728 			 * It is enough to lock cport in command-based
16729 			 * switching mode.
16730 			 */
16731 			SATA_CPORT_INFO(sata_hba_inst, tcport)->
16732 			    cport_event_flags |= SATA_APCTL_LOCK_PORT_BUSY;
16733 		}
16734 		mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, tcport)->
16735 		    cport_mutex);
16736 	}
16737 
16738 	if (rv == 0) {
16739 		/*
16740 		 * All cports were successfully locked.
16741 		 * Reset main SATA controller.
16742 		 * Set the device address to port 0, to have a valid device
16743 		 * address.
16744 		 */
16745 		sata_device.satadev_addr.qual = SATA_ADDR_CNTRL;
16746 		sata_device.satadev_addr.cport = 0;
16747 		sata_device.satadev_addr.pmport = 0;
16748 
16749 		if ((*SATA_RESET_DPORT_FUNC(sata_hba_inst))
16750 		    (SATA_DIP(sata_hba_inst), &sata_device) != SATA_SUCCESS) {
16751 			SATA_LOG_D((sata_hba_inst, CE_WARN,
16752 			    "sata_hba_ioctl: reset controller failed"));
16753 			return (EIO);
16754 		}
16755 	}
16756 	/*
16757 	 * Unlock all ports
16758 	 */
16759 	for (tcport = 0; tcport < SATA_NUM_CPORTS(sata_hba_inst); tcport++) {
16760 		mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, tcport)->
16761 		    cport_mutex);
16762 		SATA_CPORT_INFO(sata_hba_inst, tcport)->
16763 		    cport_event_flags &= ~SATA_APCTL_LOCK_PORT_BUSY;
16764 		mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, tcport)->
16765 		    cport_mutex);
16766 	}
16767 
16768 	/*
16769 	 * This operation returns EFAULT if either reset
16770 	 * controller failed or a re-probing of any port failed.
16771 	 */
16772 	return (rv);
16773 }
16774 
16775 
16776 /*
16777  * Process ioctl port self test request.
16778  *
16779  * NOTE: Port multiplier code is not completed nor tested.
16780  */
16781 static int
sata_ioctl_port_self_test(sata_hba_inst_t * sata_hba_inst,sata_device_t * sata_device)16782 sata_ioctl_port_self_test(sata_hba_inst_t *sata_hba_inst,
16783     sata_device_t *sata_device)
16784 {
16785 	int cport, pmport, qual;
16786 	int rv = 0;
16787 
16788 	/* Sanity check */
16789 	if (SATA_SELFTEST_FUNC(sata_hba_inst) == NULL)
16790 		return (ENOTSUP);
16791 
16792 	cport = sata_device->satadev_addr.cport;
16793 	pmport = sata_device->satadev_addr.pmport;
16794 	qual = sata_device->satadev_addr.qual;
16795 
16796 	/*
16797 	 * There is no protection here for a configured
16798 	 * device attached to this port.
16799 	 */
16800 
16801 	if ((*SATA_SELFTEST_FUNC(sata_hba_inst))
16802 	    (SATA_DIP(sata_hba_inst), sata_device) != SATA_SUCCESS) {
16803 		SATA_LOG_D((sata_hba_inst, CE_WARN,
16804 		    "sata_hba_ioctl: port selftest: "
16805 		    "failed port %d:%d", cport, pmport));
16806 		mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, cport)->
16807 		    cport_mutex);
16808 		sata_update_port_info(sata_hba_inst, sata_device);
16809 		if (qual == SATA_ADDR_CPORT)
16810 			SATA_CPORT_STATE(sata_hba_inst, cport) =
16811 			    SATA_PSTATE_FAILED;
16812 		else { /* port multiplier device port */
16813 			mutex_enter(&SATA_PMPORT_MUTEX(sata_hba_inst,
16814 			    cport, pmport));
16815 			SATA_PMPORT_STATE(sata_hba_inst, cport, pmport) =
16816 			    SATA_PSTATE_FAILED;
16817 			mutex_exit(&SATA_PMPORT_MUTEX(sata_hba_inst,
16818 			    cport, pmport));
16819 		}
16820 
16821 		mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, cport)->
16822 		    cport_mutex);
16823 		return (EIO);
16824 	}
16825 	/*
16826 	 * Beacuse the port was reset in the course of testing, it should be
16827 	 * re-probed and attached device state should be restored. At this
16828 	 * point the port state is unknown - it's state is HBA-specific.
16829 	 * Force port re-probing to get it into a known state.
16830 	 */
16831 	if (sata_reprobe_port(sata_hba_inst, sata_device,
16832 	    SATA_DEV_IDENTIFY_RETRY) != SATA_SUCCESS)
16833 		rv = EIO;
16834 	return (rv);
16835 }
16836 
16837 
16838 /*
16839  * sata_cfgadm_state:
16840  * Use the sata port state and state of the target node to figure out
16841  * the cfgadm_state.
16842  *
16843  * The port argument is a value with encoded cport,
16844  * pmport and address qualifier, in the same manner as a scsi target number.
16845  * SCSI_TO_SATA_CPORT macro extracts cport number,
16846  * SCSI_TO_SATA_PMPORT extracts pmport number and
16847  * SCSI_TO_SATA_ADDR_QUAL extracts port mulitplier qualifier flag.
16848  *
16849  * Port multiplier is supported.
16850  */
16851 
16852 static void
sata_cfgadm_state(sata_hba_inst_t * sata_hba_inst,int32_t port,devctl_ap_state_t * ap_state)16853 sata_cfgadm_state(sata_hba_inst_t *sata_hba_inst, int32_t port,
16854     devctl_ap_state_t *ap_state)
16855 {
16856 	uint8_t		cport, pmport, qual;
16857 	uint32_t	port_state, pmult_state;
16858 	uint32_t	dev_type;
16859 	sata_drive_info_t *sdinfo;
16860 
16861 	cport = SCSI_TO_SATA_CPORT(port);
16862 	pmport = SCSI_TO_SATA_PMPORT(port);
16863 	qual = SCSI_TO_SATA_ADDR_QUAL(port);
16864 
16865 	/* Check cport state */
16866 	port_state = SATA_CPORT_STATE(sata_hba_inst, cport);
16867 	if (port_state & SATA_PSTATE_SHUTDOWN ||
16868 	    port_state & SATA_PSTATE_FAILED) {
16869 		ap_state->ap_rstate = AP_RSTATE_DISCONNECTED;
16870 		ap_state->ap_ostate = AP_OSTATE_UNCONFIGURED;
16871 		if (port_state & SATA_PSTATE_FAILED)
16872 			ap_state->ap_condition = AP_COND_FAILED;
16873 		else
16874 			ap_state->ap_condition = AP_COND_UNKNOWN;
16875 
16876 		return;
16877 	}
16878 
16879 	/* cport state is okay. Now check pmport state */
16880 	if (qual == SATA_ADDR_DPMPORT || qual == SATA_ADDR_PMPORT) {
16881 		/* Sanity check */
16882 		if (SATA_CPORT_DEV_TYPE(sata_hba_inst, cport) !=
16883 		    SATA_DTYPE_PMULT || SATA_PMPORT_INFO(sata_hba_inst,
16884 		    cport, pmport) == NULL)
16885 			return;
16886 		port_state = SATA_PMPORT_STATE(sata_hba_inst, cport, pmport);
16887 		if (port_state & SATA_PSTATE_SHUTDOWN ||
16888 		    port_state & SATA_PSTATE_FAILED) {
16889 			ap_state->ap_rstate = AP_RSTATE_DISCONNECTED;
16890 			ap_state->ap_ostate = AP_OSTATE_UNCONFIGURED;
16891 			if (port_state & SATA_PSTATE_FAILED)
16892 				ap_state->ap_condition = AP_COND_FAILED;
16893 			else
16894 				ap_state->ap_condition = AP_COND_UNKNOWN;
16895 
16896 			return;
16897 		}
16898 	}
16899 
16900 	/* Port is enabled and ready */
16901 	if (qual == SATA_ADDR_DCPORT || qual == SATA_ADDR_CPORT)
16902 		dev_type = SATA_CPORT_DEV_TYPE(sata_hba_inst, cport);
16903 	else
16904 		dev_type = SATA_PMPORT_DEV_TYPE(sata_hba_inst, cport, pmport);
16905 
16906 	switch (dev_type) {
16907 	case SATA_DTYPE_NONE:
16908 	{
16909 		ap_state->ap_ostate = AP_OSTATE_UNCONFIGURED;
16910 		ap_state->ap_condition = AP_COND_OK;
16911 		/* No device attached */
16912 		ap_state->ap_rstate = AP_RSTATE_EMPTY;
16913 		break;
16914 	}
16915 	case SATA_DTYPE_PMULT:
16916 	{
16917 		/* Need to check port multiplier state */
16918 		ASSERT(qual == SATA_ADDR_DCPORT);
16919 		pmult_state = SATA_PMULT_INFO(sata_hba_inst, cport)->
16920 		    pmult_state;
16921 		if (pmult_state & (SATA_PSTATE_SHUTDOWN|SATA_PSTATE_FAILED)) {
16922 			ap_state->ap_rstate = AP_RSTATE_DISCONNECTED;
16923 			ap_state->ap_ostate = AP_OSTATE_UNCONFIGURED;
16924 			if (pmult_state & SATA_PSTATE_FAILED)
16925 				ap_state->ap_condition = AP_COND_FAILED;
16926 			else
16927 				ap_state->ap_condition = AP_COND_UNKNOWN;
16928 
16929 			return;
16930 		}
16931 
16932 		/* Port multiplier is not configurable */
16933 		ap_state->ap_ostate = AP_OSTATE_CONFIGURED;
16934 		ap_state->ap_rstate = AP_RSTATE_CONNECTED;
16935 		ap_state->ap_condition = AP_COND_OK;
16936 		break;
16937 	}
16938 
16939 	case SATA_DTYPE_ATADISK:
16940 	case SATA_DTYPE_ATAPICD:
16941 	case SATA_DTYPE_ATAPITAPE:
16942 	case SATA_DTYPE_ATAPIDISK:
16943 	{
16944 		dev_info_t *tdip = NULL;
16945 		dev_info_t *dip = NULL;
16946 
16947 		dip = SATA_DIP(sata_hba_inst);
16948 		tdip = sata_get_target_dip(dip, cport, pmport);
16949 		ap_state->ap_rstate = AP_RSTATE_CONNECTED;
16950 		if (tdip != NULL) {
16951 			ndi_devi_enter(dip);
16952 			mutex_enter(&(DEVI(tdip)->devi_lock));
16953 			if (DEVI_IS_DEVICE_REMOVED(tdip)) {
16954 				/*
16955 				 * There could be the case where previously
16956 				 * configured and opened device was removed
16957 				 * and unknown device was plugged.
16958 				 * In such case we want to show a device, and
16959 				 * its configured or unconfigured state but
16960 				 * indicate unusable condition untill the
16961 				 * old target node is released and removed.
16962 				 */
16963 				ap_state->ap_condition = AP_COND_UNUSABLE;
16964 			} else {
16965 				mutex_enter(&SATA_CPORT_MUTEX(sata_hba_inst,
16966 				    cport));
16967 				sdinfo = SATA_CPORT_DRV_INFO(sata_hba_inst,
16968 				    cport);
16969 				if (sdinfo != NULL) {
16970 					if ((sdinfo->satadrv_state &
16971 					    SATA_DSTATE_FAILED) != 0)
16972 						ap_state->ap_condition =
16973 						    AP_COND_FAILED;
16974 					else
16975 						ap_state->ap_condition =
16976 						    AP_COND_OK;
16977 				} else {
16978 					ap_state->ap_condition =
16979 					    AP_COND_UNKNOWN;
16980 				}
16981 				mutex_exit(&SATA_CPORT_MUTEX(sata_hba_inst,
16982 				    cport));
16983 			}
16984 			if ((DEVI_IS_DEVICE_OFFLINE(tdip)) ||
16985 			    (DEVI_IS_DEVICE_DOWN(tdip))) {
16986 				ap_state->ap_ostate =
16987 				    AP_OSTATE_UNCONFIGURED;
16988 			} else {
16989 				ap_state->ap_ostate =
16990 				    AP_OSTATE_CONFIGURED;
16991 			}
16992 			mutex_exit(&(DEVI(tdip)->devi_lock));
16993 			ndi_devi_exit(dip);
16994 		} else {
16995 			ap_state->ap_ostate = AP_OSTATE_UNCONFIGURED;
16996 			ap_state->ap_condition = AP_COND_UNKNOWN;
16997 		}
16998 		break;
16999 	}
17000 	case SATA_DTYPE_ATAPIPROC:
17001 		ap_state->ap_rstate = AP_RSTATE_CONNECTED;
17002 		ap_state->ap_ostate = AP_OSTATE_UNCONFIGURED;
17003 		ap_state->ap_condition = AP_COND_OK;
17004 		break;
17005 	default:
17006 		ap_state->ap_rstate = AP_RSTATE_CONNECTED;
17007 		ap_state->ap_ostate = AP_OSTATE_UNCONFIGURED;
17008 		ap_state->ap_condition = AP_COND_UNKNOWN;
17009 		/*
17010 		 * This is actually internal error condition (non fatal),
17011 		 * because we have already checked all defined device types.
17012 		 */
17013 		SATA_LOG_D((sata_hba_inst, CE_WARN,
17014 		    "sata_cfgadm_state: Internal error: "
17015 		    "unknown device type"));
17016 		break;
17017 	}
17018 }
17019 
17020 
17021 /*
17022  * Process ioctl get device path request.
17023  *
17024  * NOTE: Port multiplier has no target dip. Devices connected to port
17025  * multiplier have target node attached to the HBA node. The only difference
17026  * between them and the directly-attached device node is a target address.
17027  */
17028 static int
sata_ioctl_get_device_path(sata_hba_inst_t * sata_hba_inst,sata_device_t * sata_device,sata_ioctl_data_t * ioc,int mode)17029 sata_ioctl_get_device_path(sata_hba_inst_t *sata_hba_inst,
17030     sata_device_t *sata_device, sata_ioctl_data_t *ioc, int mode)
17031 {
17032 	char path[MAXPATHLEN];
17033 	uint32_t size;
17034 	dev_info_t *tdip;
17035 
17036 	(void) strcpy(path, "/devices");
17037 	if ((tdip = sata_get_scsi_target_dip(SATA_DIP(sata_hba_inst),
17038 	    &sata_device->satadev_addr)) == NULL) {
17039 		/*
17040 		 * No such device. If this is a request for a size, do not
17041 		 * return EINVAL for non-existing target, because cfgadm
17042 		 * will then indicate a meaningless ioctl failure.
17043 		 * If this is a request for a path, indicate invalid
17044 		 * argument.
17045 		 */
17046 		if (ioc->get_size == 0)
17047 			return (EINVAL);
17048 	} else {
17049 		(void) ddi_pathname(tdip, path + strlen(path));
17050 	}
17051 	size = strlen(path) + 1;
17052 
17053 	if (ioc->get_size != 0) {
17054 		if (ddi_copyout((void *)&size, ioc->buf, ioc->bufsiz,
17055 		    mode) != 0)
17056 			return (EFAULT);
17057 	} else {
17058 		if (ioc->bufsiz != size)
17059 			return (EINVAL);
17060 
17061 		else if (ddi_copyout((void *)&path, ioc->buf, ioc->bufsiz,
17062 		    mode) != 0)
17063 			return (EFAULT);
17064 	}
17065 	return (0);
17066 }
17067 
17068 /*
17069  * Process ioctl get attachment point type request.
17070  *
17071  * NOTE: Port multiplier is supported.
17072  */
17073 static	int
sata_ioctl_get_ap_type(sata_hba_inst_t * sata_hba_inst,sata_device_t * sata_device,sata_ioctl_data_t * ioc,int mode)17074 sata_ioctl_get_ap_type(sata_hba_inst_t *sata_hba_inst,
17075     sata_device_t *sata_device, sata_ioctl_data_t *ioc, int mode)
17076 {
17077 	uint32_t	type_len;
17078 	const char	*ap_type;
17079 	int		dev_type;
17080 
17081 	if (sata_device->satadev_addr.qual == SATA_ADDR_DCPORT)
17082 		dev_type = SATA_CPORT_DEV_TYPE(sata_hba_inst,
17083 		    sata_device->satadev_addr.cport);
17084 	else /* pmport */
17085 		dev_type = SATA_PMPORT_DEV_TYPE(sata_hba_inst,
17086 		    sata_device->satadev_addr.cport,
17087 		    sata_device->satadev_addr.pmport);
17088 
17089 	switch (dev_type) {
17090 	case SATA_DTYPE_NONE:
17091 		ap_type = "port";
17092 		break;
17093 
17094 	case SATA_DTYPE_ATADISK:
17095 	case SATA_DTYPE_ATAPIDISK:
17096 		ap_type = "disk";
17097 		break;
17098 
17099 	case SATA_DTYPE_ATAPICD:
17100 		ap_type = "cd/dvd";
17101 		break;
17102 
17103 	case SATA_DTYPE_ATAPITAPE:
17104 		ap_type = "tape";
17105 		break;
17106 
17107 	case SATA_DTYPE_ATAPIPROC:
17108 		ap_type = "processor";
17109 		break;
17110 
17111 	case SATA_DTYPE_PMULT:
17112 		ap_type = "sata-pmult";
17113 		break;
17114 
17115 	case SATA_DTYPE_UNKNOWN:
17116 		ap_type = "unknown";
17117 		break;
17118 
17119 	default:
17120 		ap_type = "unsupported";
17121 		break;
17122 
17123 	} /* end of dev_type switch */
17124 
17125 	type_len = strlen(ap_type) + 1;
17126 
17127 	if (ioc->get_size) {
17128 		if (ddi_copyout((void *)&type_len, ioc->buf, ioc->bufsiz,
17129 		    mode) != 0)
17130 			return (EFAULT);
17131 	} else {
17132 		if (ioc->bufsiz != type_len)
17133 			return (EINVAL);
17134 
17135 		if (ddi_copyout((void *)ap_type, ioc->buf,
17136 		    ioc->bufsiz, mode) != 0)
17137 			return (EFAULT);
17138 	}
17139 	return (0);
17140 
17141 }
17142 
17143 /*
17144  * Process ioctl get device model info request.
17145  * This operation should return to cfgadm the device model
17146  * information string
17147  *
17148  * NOTE: Port multiplier is supported.
17149  */
17150 static	int
sata_ioctl_get_model_info(sata_hba_inst_t * sata_hba_inst,sata_device_t * sata_device,sata_ioctl_data_t * ioc,int mode)17151 sata_ioctl_get_model_info(sata_hba_inst_t *sata_hba_inst,
17152     sata_device_t *sata_device, sata_ioctl_data_t *ioc, int mode)
17153 {
17154 	sata_drive_info_t *sdinfo;
17155 	uint32_t info_len;
17156 	char ap_info[SATA_ID_MODEL_LEN + 1];
17157 
17158 	mutex_enter(&SATA_CPORT_INFO(sata_hba_inst,
17159 	    sata_device->satadev_addr.cport)->cport_mutex);
17160 	if (sata_device->satadev_addr.qual == SATA_ADDR_DCPORT)
17161 		sdinfo = SATA_CPORT_DRV_INFO(sata_hba_inst,
17162 		    sata_device->satadev_addr.cport);
17163 	else /* port multiplier */
17164 		sdinfo = SATA_PMPORT_DRV_INFO(sata_hba_inst,
17165 		    sata_device->satadev_addr.cport,
17166 		    sata_device->satadev_addr.pmport);
17167 	if (sdinfo == NULL) {
17168 		mutex_exit(&SATA_CPORT_INFO(sata_hba_inst,
17169 		    sata_device->satadev_addr.cport)->cport_mutex);
17170 		return (EINVAL);
17171 	}
17172 
17173 #ifdef	_LITTLE_ENDIAN
17174 	swab(sdinfo->satadrv_id.ai_model, ap_info, SATA_ID_MODEL_LEN);
17175 #else	/* _LITTLE_ENDIAN */
17176 	bcopy(sdinfo->satadrv_id.ai_model, ap_info, SATA_ID_MODEL_LEN);
17177 #endif	/* _LITTLE_ENDIAN */
17178 
17179 	mutex_exit(&SATA_CPORT_INFO(sata_hba_inst,
17180 	    sata_device->satadev_addr.cport)->cport_mutex);
17181 
17182 	ap_info[SATA_ID_MODEL_LEN] = '\0';
17183 
17184 	info_len = strlen(ap_info) + 1;
17185 
17186 	if (ioc->get_size) {
17187 		if (ddi_copyout((void *)&info_len, ioc->buf, ioc->bufsiz,
17188 		    mode) != 0)
17189 			return (EFAULT);
17190 	} else {
17191 		if (ioc->bufsiz < info_len)
17192 			return (EINVAL);
17193 		if (ddi_copyout((void *)ap_info, ioc->buf, ioc->bufsiz,
17194 		    mode) != 0)
17195 			return (EFAULT);
17196 	}
17197 	return (0);
17198 }
17199 
17200 
17201 /*
17202  * Process ioctl get device firmware revision info request.
17203  * This operation should return to cfgadm the device firmware revision
17204  * information string
17205  *
17206  * Port multiplier is supported.
17207  */
17208 static	int
sata_ioctl_get_revfirmware_info(sata_hba_inst_t * sata_hba_inst,sata_device_t * sata_device,sata_ioctl_data_t * ioc,int mode)17209 sata_ioctl_get_revfirmware_info(sata_hba_inst_t *sata_hba_inst,
17210     sata_device_t *sata_device, sata_ioctl_data_t *ioc, int mode)
17211 {
17212 	sata_drive_info_t *sdinfo;
17213 	uint32_t info_len;
17214 	char ap_info[SATA_ID_FW_LEN + 1];
17215 
17216 	mutex_enter(&SATA_CPORT_INFO(sata_hba_inst,
17217 	    sata_device->satadev_addr.cport)->cport_mutex);
17218 	if (sata_device->satadev_addr.qual == SATA_ADDR_DCPORT)
17219 		sdinfo = SATA_CPORT_DRV_INFO(sata_hba_inst,
17220 		    sata_device->satadev_addr.cport);
17221 	else /* port multiplier */
17222 		sdinfo = SATA_PMPORT_DRV_INFO(sata_hba_inst,
17223 		    sata_device->satadev_addr.cport,
17224 		    sata_device->satadev_addr.pmport);
17225 	if (sdinfo == NULL) {
17226 		mutex_exit(&SATA_CPORT_INFO(sata_hba_inst,
17227 		    sata_device->satadev_addr.cport)->cport_mutex);
17228 		return (EINVAL);
17229 	}
17230 
17231 #ifdef	_LITTLE_ENDIAN
17232 	swab(sdinfo->satadrv_id.ai_fw, ap_info, SATA_ID_FW_LEN);
17233 #else	/* _LITTLE_ENDIAN */
17234 	bcopy(sdinfo->satadrv_id.ai_fw, ap_info, SATA_ID_FW_LEN);
17235 #endif	/* _LITTLE_ENDIAN */
17236 
17237 	mutex_exit(&SATA_CPORT_INFO(sata_hba_inst,
17238 	    sata_device->satadev_addr.cport)->cport_mutex);
17239 
17240 	ap_info[SATA_ID_FW_LEN] = '\0';
17241 
17242 	info_len = strlen(ap_info) + 1;
17243 
17244 	if (ioc->get_size) {
17245 		if (ddi_copyout((void *)&info_len, ioc->buf, ioc->bufsiz,
17246 		    mode) != 0)
17247 			return (EFAULT);
17248 	} else {
17249 		if (ioc->bufsiz < info_len)
17250 			return (EINVAL);
17251 		if (ddi_copyout((void *)ap_info, ioc->buf, ioc->bufsiz,
17252 		    mode) != 0)
17253 			return (EFAULT);
17254 	}
17255 	return (0);
17256 }
17257 
17258 
17259 /*
17260  * Process ioctl get device serial number info request.
17261  * This operation should return to cfgadm the device serial number string.
17262  *
17263  * NOTE: Port multiplier is supported.
17264  */
17265 static	int
sata_ioctl_get_serialnumber_info(sata_hba_inst_t * sata_hba_inst,sata_device_t * sata_device,sata_ioctl_data_t * ioc,int mode)17266 sata_ioctl_get_serialnumber_info(sata_hba_inst_t *sata_hba_inst,
17267     sata_device_t *sata_device, sata_ioctl_data_t *ioc, int mode)
17268 {
17269 	sata_drive_info_t *sdinfo;
17270 	uint32_t info_len;
17271 	char ap_info[SATA_ID_SERIAL_LEN + 1];
17272 
17273 	mutex_enter(&SATA_CPORT_INFO(sata_hba_inst,
17274 	    sata_device->satadev_addr.cport)->cport_mutex);
17275 	if (sata_device->satadev_addr.qual == SATA_ADDR_DCPORT)
17276 		sdinfo = SATA_CPORT_DRV_INFO(sata_hba_inst,
17277 		    sata_device->satadev_addr.cport);
17278 	else /* port multiplier */
17279 		sdinfo = SATA_PMPORT_DRV_INFO(sata_hba_inst,
17280 		    sata_device->satadev_addr.cport,
17281 		    sata_device->satadev_addr.pmport);
17282 	if (sdinfo == NULL) {
17283 		mutex_exit(&SATA_CPORT_INFO(sata_hba_inst,
17284 		    sata_device->satadev_addr.cport)->cport_mutex);
17285 		return (EINVAL);
17286 	}
17287 
17288 #ifdef	_LITTLE_ENDIAN
17289 	swab(sdinfo->satadrv_id.ai_drvser, ap_info, SATA_ID_SERIAL_LEN);
17290 #else	/* _LITTLE_ENDIAN */
17291 	bcopy(sdinfo->satadrv_id.ai_drvser, ap_info, SATA_ID_SERIAL_LEN);
17292 #endif	/* _LITTLE_ENDIAN */
17293 
17294 	mutex_exit(&SATA_CPORT_INFO(sata_hba_inst,
17295 	    sata_device->satadev_addr.cport)->cport_mutex);
17296 
17297 	ap_info[SATA_ID_SERIAL_LEN] = '\0';
17298 
17299 	info_len = strlen(ap_info) + 1;
17300 
17301 	if (ioc->get_size) {
17302 		if (ddi_copyout((void *)&info_len, ioc->buf, ioc->bufsiz,
17303 		    mode) != 0)
17304 			return (EFAULT);
17305 	} else {
17306 		if (ioc->bufsiz < info_len)
17307 			return (EINVAL);
17308 		if (ddi_copyout((void *)ap_info, ioc->buf, ioc->bufsiz,
17309 		    mode) != 0)
17310 			return (EFAULT);
17311 	}
17312 	return (0);
17313 }
17314 
17315 
17316 /*
17317  * Preset scsi extended sense data (to NO SENSE)
17318  * First 18 bytes of the sense data are preset to current valid sense
17319  * with a key NO SENSE data.
17320  *
17321  * Returns void
17322  */
17323 static void
sata_fixed_sense_data_preset(struct scsi_extended_sense * sense)17324 sata_fixed_sense_data_preset(struct scsi_extended_sense *sense)
17325 {
17326 	sense->es_valid = 1;		/* Valid sense */
17327 	sense->es_class = CLASS_EXTENDED_SENSE;	/* 0x70 - current err */
17328 	sense->es_key = KEY_NO_SENSE;
17329 	sense->es_info_1 = 0;
17330 	sense->es_info_2 = 0;
17331 	sense->es_info_3 = 0;
17332 	sense->es_info_4 = 0;
17333 	sense->es_add_len = 10;	/* Additional length - replace with a def */
17334 	sense->es_cmd_info[0] = 0;
17335 	sense->es_cmd_info[1] = 0;
17336 	sense->es_cmd_info[2] = 0;
17337 	sense->es_cmd_info[3] = 0;
17338 	sense->es_add_code = 0;
17339 	sense->es_qual_code = 0;
17340 }
17341 
17342 /*
17343  * Register a legacy cmdk-style devid for the target (disk) device.
17344  *
17345  * Note: This function is called only when the HBA devinfo node has the
17346  * property "use-cmdk-devid-format" set. This property indicates that
17347  * devid compatible with old cmdk (target) driver is to be generated
17348  * for any target device attached to this controller. This will take
17349  * precedence over the devid generated by sd (target) driver.
17350  * This function is derived from cmdk_devid_setup() function in cmdk.c.
17351  */
17352 static void
sata_target_devid_register(dev_info_t * dip,sata_drive_info_t * sdinfo)17353 sata_target_devid_register(dev_info_t *dip, sata_drive_info_t *sdinfo)
17354 {
17355 	char	*hwid;
17356 	int	modlen;
17357 	int	serlen;
17358 	int	rval;
17359 	ddi_devid_t	devid;
17360 
17361 	/*
17362 	 * device ID is a concatanation of model number, "=", serial number.
17363 	 */
17364 	hwid = kmem_zalloc(LEGACY_HWID_LEN, KM_SLEEP);
17365 	bcopy(&sdinfo->satadrv_id.ai_model, hwid,
17366 	    sizeof (sdinfo->satadrv_id.ai_model));
17367 	swab(hwid, hwid, sizeof (sdinfo->satadrv_id.ai_model));
17368 	modlen = sata_check_modser(hwid, sizeof (sdinfo->satadrv_id.ai_model));
17369 	if (modlen == 0)
17370 		goto err;
17371 	hwid[modlen++] = '=';
17372 	bcopy(&sdinfo->satadrv_id.ai_drvser, &hwid[modlen],
17373 	    sizeof (sdinfo->satadrv_id.ai_drvser));
17374 	swab(&hwid[modlen], &hwid[modlen],
17375 	    sizeof (sdinfo->satadrv_id.ai_drvser));
17376 	serlen = sata_check_modser(&hwid[modlen],
17377 	    sizeof (sdinfo->satadrv_id.ai_drvser));
17378 	if (serlen == 0)
17379 		goto err;
17380 	hwid[modlen + serlen] = 0; /* terminate the hwid string */
17381 
17382 	/* initialize/register devid */
17383 	if ((rval = ddi_devid_init(dip, DEVID_ATA_SERIAL,
17384 	    (ushort_t)(modlen + serlen), hwid, &devid)) == DDI_SUCCESS) {
17385 		rval = ddi_devid_register(dip, devid);
17386 		/*
17387 		 * Free up the allocated devid buffer.
17388 		 * NOTE: This doesn't mean unregistering devid.
17389 		 */
17390 		ddi_devid_free(devid);
17391 	}
17392 
17393 	if (rval != DDI_SUCCESS)
17394 		cmn_err(CE_WARN, "sata: failed to create devid for the disk"
17395 		    " on port %d", sdinfo->satadrv_addr.cport);
17396 err:
17397 	kmem_free(hwid, LEGACY_HWID_LEN);
17398 }
17399 
17400 /*
17401  * valid model/serial string must contain a non-zero non-space characters.
17402  * trim trailing spaces/NULLs.
17403  */
17404 static int
sata_check_modser(char * buf,int buf_len)17405 sata_check_modser(char *buf, int buf_len)
17406 {
17407 	boolean_t ret;
17408 	char *s;
17409 	int i;
17410 	int tb = 0;
17411 	char ch;
17412 
17413 	ret = B_FALSE;
17414 	s = buf;
17415 	for (i = 0; i < buf_len; i++) {
17416 		ch = *s++;
17417 		if (ch != ' ' && ch != '\0')
17418 			tb = i + 1;
17419 		if (ch != ' ' && ch != '\0' && ch != '0')
17420 			ret = B_TRUE;
17421 	}
17422 
17423 	if (ret == B_FALSE)
17424 		return (0); /* invalid string */
17425 
17426 	return (tb); /* return length */
17427 }
17428 
17429 /*
17430  * sata_set_drive_features function compares current device features setting
17431  * with the saved device features settings and, if there is a difference,
17432  * it restores device features setting to the previously saved state.
17433  * It also arbitrarily tries to select the highest supported DMA mode.
17434  * Device Identify or Identify Packet Device data has to be current.
17435  * At the moment read ahead and write cache are considered for all devices.
17436  * For atapi devices, Removable Media Status Notification is set in addition
17437  * to common features.
17438  *
17439  * This function cannot be called in the interrupt context (it may sleep).
17440  *
17441  * The input argument sdinfo should point to the drive info structure
17442  * to be updated after features are set. Note, that only
17443  * device (packet) identify data is updated, not the flags indicating the
17444  * supported features.
17445  *
17446  * Returns SATA_SUCCESS if successful or there was nothing to do.
17447  * Device Identify data in the drive info structure pointed to by the sdinfo
17448  * arguments is updated even when no features were set or changed.
17449  *
17450  * Returns SATA_FAILURE if device features could not be set or DMA mode
17451  * for a disk cannot be set and device identify data cannot be fetched.
17452  *
17453  * Returns SATA_RETRY if device features could not be set (other than disk
17454  * DMA mode) but the device identify data was fetched successfully.
17455  *
17456  * Note: This function may fail the port, making it inaccessible.
17457  * In such case the explicit port disconnect/connect or physical device
17458  * detach/attach is required to re-evaluate port state again.
17459  */
17460 
17461 static int
sata_set_drive_features(sata_hba_inst_t * sata_hba_inst,sata_drive_info_t * sdinfo,int restore)17462 sata_set_drive_features(sata_hba_inst_t *sata_hba_inst,
17463     sata_drive_info_t *sdinfo, int restore)
17464 {
17465 	int rval = SATA_SUCCESS;
17466 	int rval_set;
17467 	sata_drive_info_t new_sdinfo;
17468 	char *finfo = "sata_set_drive_features: cannot";
17469 	char *finfox;
17470 	int cache_op;
17471 
17472 	bzero(&new_sdinfo, sizeof (sata_drive_info_t));
17473 	new_sdinfo.satadrv_addr = sdinfo->satadrv_addr;
17474 	new_sdinfo.satadrv_type = sdinfo->satadrv_type;
17475 	if (sata_fetch_device_identify_data(sata_hba_inst, &new_sdinfo) != 0) {
17476 		/*
17477 		 * Cannot get device identification - caller may retry later
17478 		 */
17479 		SATADBG1(SATA_DBG_DEV_SETTINGS, sata_hba_inst,
17480 		    "%s fetch device identify data\n", finfo);
17481 		return (SATA_FAILURE);
17482 	}
17483 	finfox = (restore != 0) ? " restore device features" :
17484 	    " initialize device features\n";
17485 
17486 	switch (sdinfo->satadrv_type) {
17487 	case SATA_DTYPE_ATADISK:
17488 		/* Arbitrarily set UDMA mode */
17489 		if (sata_set_dma_mode(sata_hba_inst, &new_sdinfo) !=
17490 		    SATA_SUCCESS) {
17491 			SATA_LOG_D((sata_hba_inst, CE_WARN,
17492 			    "%s set UDMA mode\n", finfo));
17493 			return (SATA_FAILURE);
17494 		}
17495 		break;
17496 	case SATA_DTYPE_ATAPICD:
17497 	case SATA_DTYPE_ATAPITAPE:
17498 	case SATA_DTYPE_ATAPIDISK:
17499 		/*  Set Removable Media Status Notification, if necessary */
17500 		if (SATA_RM_NOTIFIC_SUPPORTED(new_sdinfo.satadrv_id) &&
17501 		    restore != 0) {
17502 			if (((sdinfo->satadrv_settings & SATA_DEV_RMSN) &&
17503 			    (!SATA_RM_NOTIFIC_ENABLED(new_sdinfo.satadrv_id)))||
17504 			    ((!(sdinfo->satadrv_settings & SATA_DEV_RMSN)) &&
17505 			    SATA_RM_NOTIFIC_ENABLED(new_sdinfo.satadrv_id))) {
17506 				/* Current setting does not match saved one */
17507 				if (sata_set_rmsn(sata_hba_inst, sdinfo,
17508 				    sdinfo->satadrv_settings &
17509 				    SATA_DEV_RMSN) != SATA_SUCCESS)
17510 					rval = SATA_FAILURE;
17511 			}
17512 		}
17513 		/*
17514 		 * We have to set Multiword DMA or UDMA, if it is supported, as
17515 		 * we want to use DMA transfer mode whenever possible.
17516 		 * Some devices require explicit setting of the DMA mode.
17517 		 */
17518 		if (new_sdinfo.satadrv_id.ai_cap & SATA_DMA_SUPPORT) {
17519 			/* Set highest supported DMA mode */
17520 			if (sata_set_dma_mode(sata_hba_inst, &new_sdinfo) !=
17521 			    SATA_SUCCESS) {
17522 				SATA_LOG_D((sata_hba_inst, CE_WARN,
17523 				    "%s set UDMA mode\n", finfo));
17524 				rval = SATA_FAILURE;
17525 			}
17526 		}
17527 		break;
17528 	}
17529 
17530 	if (!SATA_READ_AHEAD_SUPPORTED(new_sdinfo.satadrv_id) &&
17531 	    !SATA_WRITE_CACHE_SUPPORTED(new_sdinfo.satadrv_id)) {
17532 		/*
17533 		 * neither READ AHEAD nor WRITE CACHE is supported
17534 		 * - do nothing
17535 		 */
17536 		SATADBG1(SATA_DBG_DEV_SETTINGS, sata_hba_inst,
17537 		    "settable features not supported\n", NULL);
17538 		goto update_sdinfo;
17539 	}
17540 
17541 	if ((SATA_READ_AHEAD_ENABLED(new_sdinfo.satadrv_id) &&
17542 	    (sdinfo->satadrv_settings & SATA_DEV_READ_AHEAD)) &&
17543 	    (SATA_WRITE_CACHE_ENABLED(new_sdinfo.satadrv_id) &&
17544 	    (sdinfo->satadrv_settings & SATA_DEV_WRITE_CACHE))) {
17545 		/*
17546 		 * both READ AHEAD and WRITE CACHE are enabled
17547 		 * - Nothing to do
17548 		 */
17549 		SATADBG1(SATA_DBG_DEV_SETTINGS, sata_hba_inst,
17550 		    "no device features to set\n", NULL);
17551 		goto update_sdinfo;
17552 	}
17553 
17554 	cache_op = 0;
17555 
17556 	if (SATA_READ_AHEAD_SUPPORTED(new_sdinfo.satadrv_id)) {
17557 		if ((sdinfo->satadrv_settings & SATA_DEV_READ_AHEAD) &&
17558 		    !SATA_READ_AHEAD_ENABLED(new_sdinfo.satadrv_id)) {
17559 			/* Enable read ahead / read cache */
17560 			cache_op = SATAC_SF_ENABLE_READ_AHEAD;
17561 			SATADBG1(SATA_DBG_DEV_SETTINGS, sata_hba_inst,
17562 			    "enabling read cache\n", NULL);
17563 		} else if (!(sdinfo->satadrv_settings & SATA_DEV_READ_AHEAD) &&
17564 		    SATA_READ_AHEAD_ENABLED(new_sdinfo.satadrv_id)) {
17565 			/* Disable read ahead  / read cache */
17566 			cache_op = SATAC_SF_DISABLE_READ_AHEAD;
17567 			SATADBG1(SATA_DBG_DEV_SETTINGS, sata_hba_inst,
17568 			    "disabling read cache\n", NULL);
17569 		}
17570 
17571 		if (cache_op != 0) {
17572 			/* Try to set read cache mode */
17573 			rval_set = sata_set_cache_mode(sata_hba_inst,
17574 			    &new_sdinfo, cache_op);
17575 			if (rval != SATA_FAILURE && rval_set != SATA_SUCCESS)
17576 				rval = rval_set;
17577 		}
17578 	}
17579 
17580 	cache_op = 0;
17581 
17582 	if (SATA_WRITE_CACHE_SUPPORTED(new_sdinfo.satadrv_id)) {
17583 		if ((sdinfo->satadrv_settings & SATA_DEV_WRITE_CACHE) &&
17584 		    !SATA_WRITE_CACHE_ENABLED(new_sdinfo.satadrv_id)) {
17585 			/* Enable write cache */
17586 			cache_op = SATAC_SF_ENABLE_WRITE_CACHE;
17587 			SATADBG1(SATA_DBG_DEV_SETTINGS, sata_hba_inst,
17588 			    "enabling write cache\n", NULL);
17589 		} else if (!(sdinfo->satadrv_settings & SATA_DEV_WRITE_CACHE) &&
17590 		    SATA_WRITE_CACHE_ENABLED(new_sdinfo.satadrv_id)) {
17591 			/* Disable write cache */
17592 			cache_op = SATAC_SF_DISABLE_WRITE_CACHE;
17593 			SATADBG1(SATA_DBG_DEV_SETTINGS, sata_hba_inst,
17594 			    "disabling write cache\n", NULL);
17595 		}
17596 
17597 		if (cache_op != 0) {
17598 			/* Try to set write cache mode */
17599 			rval_set = sata_set_cache_mode(sata_hba_inst,
17600 			    &new_sdinfo, cache_op);
17601 			if (rval != SATA_FAILURE && rval_set != SATA_SUCCESS)
17602 				rval = rval_set;
17603 		}
17604 	}
17605 	if (rval != SATA_SUCCESS)
17606 		SATA_LOG_D((sata_hba_inst, CE_WARN,
17607 		    "%s %s", finfo, finfox));
17608 
17609 update_sdinfo:
17610 	/*
17611 	 * We need to fetch Device Identify data again
17612 	 */
17613 	if (sata_fetch_device_identify_data(sata_hba_inst, &new_sdinfo) != 0) {
17614 		/*
17615 		 * Cannot get device identification - retry later
17616 		 */
17617 		SATA_LOG_D((sata_hba_inst, CE_WARN,
17618 		    "%s re-fetch device identify data\n", finfo));
17619 		rval = SATA_FAILURE;
17620 	}
17621 	/* Copy device sata info. */
17622 	sdinfo->satadrv_id = new_sdinfo.satadrv_id;
17623 
17624 	return (rval);
17625 }
17626 
17627 
17628 /*
17629  *
17630  * Returns 1 if threshold exceeded, 0 if threshold not exceeded, -1 if
17631  * unable to determine.
17632  *
17633  * Cannot be called in an interrupt context.
17634  *
17635  * Called by sata_build_lsense_page_2f()
17636  */
17637 
17638 static int
sata_fetch_smart_return_status(sata_hba_inst_t * sata_hba_inst,sata_drive_info_t * sdinfo)17639 sata_fetch_smart_return_status(sata_hba_inst_t *sata_hba_inst,
17640     sata_drive_info_t *sdinfo)
17641 {
17642 	sata_pkt_t *spkt;
17643 	sata_cmd_t *scmd;
17644 	sata_pkt_txlate_t *spx;
17645 	int rval;
17646 
17647 	spx = kmem_zalloc(sizeof (sata_pkt_txlate_t), KM_SLEEP);
17648 	spx->txlt_sata_hba_inst = sata_hba_inst;
17649 	spx->txlt_scsi_pkt = NULL;		/* No scsi pkt involved */
17650 	spkt = sata_pkt_alloc(spx, SLEEP_FUNC);
17651 	if (spkt == NULL) {
17652 		kmem_free(spx, sizeof (sata_pkt_txlate_t));
17653 		return (-1);
17654 	}
17655 	/* address is needed now */
17656 	spkt->satapkt_device.satadev_addr = sdinfo->satadrv_addr;
17657 
17658 
17659 	/* Fill sata_pkt */
17660 	spkt->satapkt_device.satadev_addr = sdinfo->satadrv_addr;
17661 	spkt->satapkt_op_mode = SATA_OPMODE_SYNCH | SATA_OPMODE_INTERRUPTS;
17662 	/* Synchronous mode, no callback */
17663 	spkt->satapkt_comp = NULL;
17664 	/* Timeout 30s */
17665 	spkt->satapkt_time = sata_default_pkt_time;
17666 
17667 	scmd = &spkt->satapkt_cmd;
17668 	scmd->satacmd_flags.sata_special_regs = B_TRUE;
17669 	scmd->satacmd_flags.sata_data_direction = SATA_DIR_NODATA_XFER;
17670 
17671 	/* Set up which registers need to be returned */
17672 	scmd->satacmd_flags.sata_copy_out_lba_mid_lsb = B_TRUE;
17673 	scmd->satacmd_flags.sata_copy_out_lba_high_lsb = B_TRUE;
17674 
17675 	/* Build SMART_RETURN_STATUS cmd in the sata_pkt */
17676 	scmd->satacmd_addr_type = 0;		/* N/A */
17677 	scmd->satacmd_sec_count_lsb = 0;	/* N/A */
17678 	scmd->satacmd_lba_low_lsb = 0;		/* N/A */
17679 	scmd->satacmd_lba_mid_lsb = SMART_MAGIC_VAL_1;
17680 	scmd->satacmd_lba_high_lsb = SMART_MAGIC_VAL_2;
17681 	scmd->satacmd_features_reg = SATA_SMART_RETURN_STATUS;
17682 	scmd->satacmd_device_reg = 0;		/* Always device 0 */
17683 	scmd->satacmd_cmd_reg = SATAC_SMART;
17684 	mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
17685 	    sdinfo->satadrv_addr.cport)));
17686 
17687 
17688 	/* Send pkt to SATA HBA driver */
17689 	if ((*SATA_START_FUNC(sata_hba_inst))(SATA_DIP(sata_hba_inst), spkt) !=
17690 	    SATA_TRAN_ACCEPTED ||
17691 	    spkt->satapkt_reason != SATA_PKT_COMPLETED) {
17692 		mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst,
17693 		    sdinfo->satadrv_addr.cport)));
17694 		/*
17695 		 * Whoops, no SMART RETURN STATUS
17696 		 */
17697 		rval = -1;
17698 	} else {
17699 		mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst,
17700 		    sdinfo->satadrv_addr.cport)));
17701 		if (scmd->satacmd_error_reg & SATA_ERROR_ABORT) {
17702 			rval = -1;
17703 			goto fail;
17704 		}
17705 		if (scmd->satacmd_status_reg & SATA_STATUS_ERR) {
17706 			rval = -1;
17707 			goto fail;
17708 		}
17709 		if ((scmd->satacmd_lba_mid_lsb == SMART_MAGIC_VAL_1) &&
17710 		    (scmd->satacmd_lba_high_lsb == SMART_MAGIC_VAL_2))
17711 			rval = 0;
17712 		else if ((scmd->satacmd_lba_mid_lsb == SMART_MAGIC_VAL_3) &&
17713 		    (scmd->satacmd_lba_high_lsb == SMART_MAGIC_VAL_4))
17714 			rval = 1;
17715 		else {
17716 			rval = -1;
17717 			goto fail;
17718 		}
17719 	}
17720 fail:
17721 	/* Free allocated resources */
17722 	sata_pkt_free(spx);
17723 	kmem_free(spx, sizeof (sata_pkt_txlate_t));
17724 
17725 	return (rval);
17726 }
17727 
17728 /*
17729  *
17730  * Returns 0 if succeeded, -1 otherwise
17731  *
17732  * Cannot be called in an interrupt context.
17733  *
17734  */
17735 static int
sata_fetch_smart_data(sata_hba_inst_t * sata_hba_inst,sata_drive_info_t * sdinfo,struct smart_data * smart_data)17736 sata_fetch_smart_data(sata_hba_inst_t *sata_hba_inst, sata_drive_info_t *sdinfo,
17737     struct smart_data *smart_data)
17738 {
17739 	sata_pkt_t *spkt;
17740 	sata_cmd_t *scmd;
17741 	sata_pkt_txlate_t *spx;
17742 	int rval = 0;
17743 	dev_info_t *dip = SATA_DIP(sata_hba_inst);
17744 
17745 #if ! defined(lint)
17746 	ASSERT(sizeof (struct smart_data) == 512);
17747 #endif
17748 
17749 	spx = kmem_zalloc(sizeof (sata_pkt_txlate_t), KM_SLEEP);
17750 	spx->txlt_sata_hba_inst = sata_hba_inst;
17751 	spx->txlt_scsi_pkt = NULL;		/* No scsi pkt involved */
17752 	spkt = sata_pkt_alloc(spx, SLEEP_FUNC);
17753 	if (spkt == NULL) {
17754 		kmem_free(spx, sizeof (sata_pkt_txlate_t));
17755 		return (-1);
17756 	}
17757 	/* address is needed now */
17758 	spkt->satapkt_device.satadev_addr = sdinfo->satadrv_addr;
17759 
17760 
17761 	/* Fill sata_pkt */
17762 	spkt->satapkt_device.satadev_addr = sdinfo->satadrv_addr;
17763 	spkt->satapkt_op_mode = SATA_OPMODE_SYNCH | SATA_OPMODE_INTERRUPTS;
17764 	/* Synchronous mode, no callback */
17765 	spkt->satapkt_comp = NULL;
17766 	/* Timeout 30s */
17767 	spkt->satapkt_time = sata_default_pkt_time;
17768 
17769 	scmd = &spkt->satapkt_cmd;
17770 	scmd->satacmd_flags.sata_data_direction = SATA_DIR_READ;
17771 
17772 	/*
17773 	 * Allocate buffer for SMART data
17774 	 */
17775 	scmd->satacmd_bp = sata_alloc_local_buffer(spx,
17776 	    sizeof (struct smart_data));
17777 	if (scmd->satacmd_bp == NULL) {
17778 		sata_pkt_free(spx);
17779 		kmem_free(spx, sizeof (sata_pkt_txlate_t));
17780 		SATA_LOG_D((sata_hba_inst, CE_WARN,
17781 		    "sata_fetch_smart_data: "
17782 		    "cannot allocate buffer"));
17783 		return (-1);
17784 	}
17785 
17786 
17787 	/* Build SMART_READ_DATA cmd in the sata_pkt */
17788 	scmd->satacmd_addr_type = 0;		/* N/A */
17789 	scmd->satacmd_sec_count_lsb = 0;	/* N/A */
17790 	scmd->satacmd_lba_low_lsb = 0;		/* N/A */
17791 	scmd->satacmd_lba_mid_lsb = SMART_MAGIC_VAL_1;
17792 	scmd->satacmd_lba_high_lsb = SMART_MAGIC_VAL_2;
17793 	scmd->satacmd_features_reg = SATA_SMART_READ_DATA;
17794 	scmd->satacmd_device_reg = 0;		/* Always device 0 */
17795 	scmd->satacmd_cmd_reg = SATAC_SMART;
17796 	mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
17797 	    sdinfo->satadrv_addr.cport)));
17798 
17799 	/* Send pkt to SATA HBA driver */
17800 	if ((*SATA_START_FUNC(sata_hba_inst))(SATA_DIP(sata_hba_inst), spkt) !=
17801 	    SATA_TRAN_ACCEPTED ||
17802 	    spkt->satapkt_reason != SATA_PKT_COMPLETED) {
17803 		mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst,
17804 		    sdinfo->satadrv_addr.cport)));
17805 		/*
17806 		 * Whoops, no SMART DATA available
17807 		 */
17808 		rval = -1;
17809 		goto fail;
17810 	} else {
17811 		mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst,
17812 		    sdinfo->satadrv_addr.cport)));
17813 		if (spx->txlt_buf_dma_handle != NULL) {
17814 			rval = ddi_dma_sync(spx->txlt_buf_dma_handle, 0, 0,
17815 			    DDI_DMA_SYNC_FORKERNEL);
17816 			ASSERT(rval == DDI_SUCCESS);
17817 			if (sata_check_for_dma_error(dip, spx)) {
17818 				ddi_fm_service_impact(dip,
17819 				    DDI_SERVICE_UNAFFECTED);
17820 				rval = -1;
17821 				goto fail;
17822 			}
17823 		}
17824 		bcopy(scmd->satacmd_bp->b_un.b_addr, (uint8_t *)smart_data,
17825 		    sizeof (struct smart_data));
17826 	}
17827 
17828 fail:
17829 	/* Free allocated resources */
17830 	sata_free_local_buffer(spx);
17831 	sata_pkt_free(spx);
17832 	kmem_free(spx, sizeof (sata_pkt_txlate_t));
17833 
17834 	return (rval);
17835 }
17836 
17837 /*
17838  * Issue a READ LOG EXT command for the given log (log_addr) and page
17839  * (page_num) of the log. The output is written to buf. nsect is the size
17840  * of buf in units of 512-byte sectors.
17841  */
17842 static int
sata_read_log_ext(sata_hba_inst_t * sata_hba_inst,sata_drive_info_t * sdinfo,uint8_t log_addr,uint16_t page_num,void * buf,uint16_t nsect)17843 sata_read_log_ext(sata_hba_inst_t *sata_hba_inst, sata_drive_info_t *sdinfo,
17844     uint8_t log_addr, uint16_t page_num, void *buf, uint16_t nsect)
17845 {
17846 	dev_info_t *dip;
17847 	sata_pkt_txlate_t *spx;
17848 	sata_pkt_t *spkt;
17849 	sata_cmd_t *scmd;
17850 	kmutex_t *cmutex;
17851 	int rval;
17852 
17853 	dip = SATA_DIP(sata_hba_inst);
17854 	cmutex = &SATA_CPORT_MUTEX(sata_hba_inst, sdinfo->satadrv_addr.cport);
17855 
17856 	ASSERT(MUTEX_HELD(cmutex));
17857 
17858 	spx = kmem_zalloc(sizeof (*spx), KM_SLEEP);
17859 	spx->txlt_sata_hba_inst = sata_hba_inst;
17860 	spx->txlt_scsi_pkt = NULL;
17861 
17862 	spkt = sata_pkt_alloc(spx, SLEEP_FUNC);
17863 	spkt->satapkt_device.satadev_addr = sdinfo->satadrv_addr;
17864 	spkt->satapkt_op_mode = SATA_OPMODE_SYNCH | SATA_OPMODE_INTERRUPTS;
17865 	spkt->satapkt_comp = NULL;
17866 	spkt->satapkt_time = sata_default_pkt_time;
17867 
17868 	scmd = &spkt->satapkt_cmd;
17869 	scmd->satacmd_bp = sata_alloc_local_buffer(spx, (size_t)nsect * 512);
17870 	if (scmd->satacmd_bp == NULL) {
17871 		sata_pkt_free(spx);
17872 		kmem_free(spx, sizeof (*spx));
17873 		SATA_LOG_D((sata_hba_inst, CE_WARN, "%s: cannot allocate bp",
17874 		    __func__));
17875 		return (-1);
17876 	}
17877 
17878 	scmd->satacmd_cmd_reg = SATAC_READ_LOG_EXT;
17879 	scmd->satacmd_flags.sata_data_direction = SATA_DIR_READ;
17880 	scmd->satacmd_addr_type = ATA_ADDR_LBA48;
17881 	scmd->satacmd_sec_count_lsb = nsect & 0xff;
17882 	scmd->satacmd_sec_count_msb = nsect >> 8;
17883 
17884 	/*
17885 	 * From ACS-3 7.24.3.1 Table 68
17886 	 * LBA[47:40]	Reserved
17887 	 * LBA[39:32]	PAGE NUMBER (15:8)
17888 	 * LBA[31:16]	Reserved
17889 	 * LBA[15:8]	PAGE NUMBER (7:0)
17890 	 * LBA[7:0]	LOG ADDRESS
17891 	 */
17892 	scmd->satacmd_lba_low_lsb = log_addr;		/* LBA[7:0] */
17893 	scmd->satacmd_lba_mid_lsb = page_num & 0xff;	/* LBA[15:8] */
17894 	scmd->satacmd_lba_high_lsb = 0;			/* LBA[23:16] */
17895 	scmd->satacmd_lba_low_msb = 0;			/* LBA[31:24] */
17896 	scmd->satacmd_lba_mid_msb = page_num >> 8;	/* LBA[39:32] */
17897 	scmd->satacmd_lba_high_msb = 0;			/* LBA[47:40] */
17898 
17899 	scmd->satacmd_device_reg = 0;
17900 
17901 	mutex_exit(cmutex);
17902 	rval = (*SATA_START_FUNC(sata_hba_inst))(dip, spkt);
17903 	mutex_enter(cmutex);
17904 
17905 	if (rval != SATA_TRAN_ACCEPTED ||
17906 	    spkt->satapkt_reason != SATA_PKT_COMPLETED) {
17907 		rval = -1;
17908 		goto fail;
17909 	}
17910 
17911 	if (spx->txlt_buf_dma_handle != NULL) {
17912 		rval = ddi_dma_sync(spx->txlt_buf_dma_handle, 0, 0,
17913 		    DDI_DMA_SYNC_FORKERNEL);
17914 		ASSERT3S(rval, ==, DDI_SUCCESS);
17915 		if (sata_check_for_dma_error(dip, spx)) {
17916 			ddi_fm_service_impact(dip, DDI_SERVICE_UNAFFECTED);
17917 			rval = -1;
17918 			goto fail;
17919 		}
17920 
17921 		bcopy(scmd->satacmd_bp->b_un.b_addr, buf, (size_t)nsect * 512);
17922 		rval = 0;
17923 	}
17924 
17925 fail:
17926 	sata_free_local_buffer(spx);
17927 	sata_pkt_free(spx);
17928 	kmem_free(spx, sizeof (*spx));
17929 
17930 	return (rval);
17931 }
17932 
17933 /*
17934  * Used by LOG SENSE page 0x10
17935  * Reads (in synchronous mode) the self test log data using Read Log Ext cmd.
17936  * Note: cannot be called in the interrupt context.
17937  *
17938  * return 0 for success, -1 otherwise
17939  *
17940  */
17941 CTASSERT(sizeof (struct smart_ext_selftest_log) == 512);
17942 
17943 static int
sata_ext_smart_selftest_read_log(sata_hba_inst_t * sata_hba_inst,sata_drive_info_t * sdinfo,struct smart_ext_selftest_log * ext_selftest_log,uint16_t block_num)17944 sata_ext_smart_selftest_read_log(sata_hba_inst_t *sata_hba_inst,
17945     sata_drive_info_t *sdinfo, struct smart_ext_selftest_log *ext_selftest_log,
17946     uint16_t block_num)
17947 {
17948 	return (sata_read_log_ext(sata_hba_inst, sdinfo,
17949 	    EXT_SMART_SELFTEST_LOG_PAGE, block_num, ext_selftest_log, 1));
17950 }
17951 
17952 /*
17953  * Returns 0 for success, -1 otherwise
17954  *
17955  * SMART self-test log data is returned in buffer pointed to by selftest_log
17956  */
17957 static int
sata_smart_selftest_log(sata_hba_inst_t * sata_hba_inst,sata_drive_info_t * sdinfo,struct smart_selftest_log * selftest_log)17958 sata_smart_selftest_log(
17959 	sata_hba_inst_t *sata_hba_inst,
17960 	sata_drive_info_t *sdinfo,
17961 	struct smart_selftest_log *selftest_log)
17962 {
17963 	sata_pkt_t *spkt;
17964 	sata_cmd_t *scmd;
17965 	sata_pkt_txlate_t *spx;
17966 	int rval;
17967 	dev_info_t *dip = SATA_DIP(sata_hba_inst);
17968 
17969 #if ! defined(lint)
17970 	ASSERT(sizeof (struct smart_selftest_log) == 512);
17971 #endif
17972 
17973 	spx = kmem_zalloc(sizeof (sata_pkt_txlate_t), KM_SLEEP);
17974 	spx->txlt_sata_hba_inst = sata_hba_inst;
17975 	spx->txlt_scsi_pkt = NULL;		/* No scsi pkt involved */
17976 	spkt = sata_pkt_alloc(spx, SLEEP_FUNC);
17977 	if (spkt == NULL) {
17978 		kmem_free(spx, sizeof (sata_pkt_txlate_t));
17979 		return (-1);
17980 	}
17981 	/* address is needed now */
17982 	spkt->satapkt_device.satadev_addr = sdinfo->satadrv_addr;
17983 
17984 
17985 	/* Fill sata_pkt */
17986 	spkt->satapkt_device.satadev_addr = sdinfo->satadrv_addr;
17987 	spkt->satapkt_op_mode = SATA_OPMODE_SYNCH | SATA_OPMODE_INTERRUPTS;
17988 	/* Synchronous mode, no callback */
17989 	spkt->satapkt_comp = NULL;
17990 	/* Timeout 30s */
17991 	spkt->satapkt_time = sata_default_pkt_time;
17992 
17993 	scmd = &spkt->satapkt_cmd;
17994 	scmd->satacmd_flags.sata_data_direction = SATA_DIR_READ;
17995 
17996 	/*
17997 	 * Allocate buffer for SMART SELFTEST LOG
17998 	 */
17999 	scmd->satacmd_bp = sata_alloc_local_buffer(spx,
18000 	    sizeof (struct smart_selftest_log));
18001 	if (scmd->satacmd_bp == NULL) {
18002 		sata_pkt_free(spx);
18003 		kmem_free(spx, sizeof (sata_pkt_txlate_t));
18004 		SATA_LOG_D((sata_hba_inst, CE_WARN,
18005 		    "sata_smart_selftest_log: "
18006 		    "cannot allocate buffer"));
18007 		return (-1);
18008 	}
18009 
18010 	/* Build SMART_READ_LOG cmd in the sata_pkt */
18011 	scmd->satacmd_addr_type = 0;		/* N/A */
18012 	scmd->satacmd_sec_count_lsb = 1;	/* One sector of SMART log */
18013 	scmd->satacmd_lba_low_lsb = SMART_SELFTEST_LOG_PAGE;
18014 	scmd->satacmd_lba_mid_lsb = SMART_MAGIC_VAL_1;
18015 	scmd->satacmd_lba_high_lsb = SMART_MAGIC_VAL_2;
18016 	scmd->satacmd_features_reg = SATA_SMART_READ_LOG;
18017 	scmd->satacmd_device_reg = 0;		/* Always device 0 */
18018 	scmd->satacmd_cmd_reg = SATAC_SMART;
18019 	mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
18020 	    sdinfo->satadrv_addr.cport)));
18021 
18022 	/* Send pkt to SATA HBA driver */
18023 	if ((*SATA_START_FUNC(sata_hba_inst))(SATA_DIP(sata_hba_inst), spkt) !=
18024 	    SATA_TRAN_ACCEPTED ||
18025 	    spkt->satapkt_reason != SATA_PKT_COMPLETED) {
18026 		mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst,
18027 		    sdinfo->satadrv_addr.cport)));
18028 		/*
18029 		 * Whoops, no SMART DATA available
18030 		 */
18031 		rval = -1;
18032 		goto fail;
18033 	} else {
18034 		mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst,
18035 		    sdinfo->satadrv_addr.cport)));
18036 		if (spx->txlt_buf_dma_handle != NULL) {
18037 			rval = ddi_dma_sync(spx->txlt_buf_dma_handle, 0, 0,
18038 			    DDI_DMA_SYNC_FORKERNEL);
18039 			ASSERT(rval == DDI_SUCCESS);
18040 			if (sata_check_for_dma_error(dip, spx)) {
18041 				ddi_fm_service_impact(dip,
18042 				    DDI_SERVICE_UNAFFECTED);
18043 				rval = -1;
18044 				goto fail;
18045 			}
18046 		}
18047 		bcopy(scmd->satacmd_bp->b_un.b_addr, (uint8_t *)selftest_log,
18048 		    sizeof (struct smart_selftest_log));
18049 		rval = 0;
18050 	}
18051 
18052 fail:
18053 	/* Free allocated resources */
18054 	sata_free_local_buffer(spx);
18055 	sata_pkt_free(spx);
18056 	kmem_free(spx, sizeof (sata_pkt_txlate_t));
18057 
18058 	return (rval);
18059 }
18060 
18061 
18062 /*
18063  * Returns 0 for success, -1 otherwise
18064  *
18065  * SMART READ LOG data is returned in buffer pointed to by smart_log
18066  */
18067 static int
sata_smart_read_log(sata_hba_inst_t * sata_hba_inst,sata_drive_info_t * sdinfo,uint8_t * smart_log,uint8_t which_log,uint8_t log_size)18068 sata_smart_read_log(
18069 	sata_hba_inst_t *sata_hba_inst,
18070 	sata_drive_info_t *sdinfo,
18071 	uint8_t *smart_log,		/* where the data should be returned */
18072 	uint8_t which_log,		/* which log should be returned */
18073 	uint8_t log_size)		/* # of 512 bytes in log */
18074 {
18075 	sata_pkt_t *spkt;
18076 	sata_cmd_t *scmd;
18077 	sata_pkt_txlate_t *spx;
18078 	int rval;
18079 	dev_info_t *dip = SATA_DIP(sata_hba_inst);
18080 
18081 	spx = kmem_zalloc(sizeof (sata_pkt_txlate_t), KM_SLEEP);
18082 	spx->txlt_sata_hba_inst = sata_hba_inst;
18083 	spx->txlt_scsi_pkt = NULL;		/* No scsi pkt involved */
18084 	spkt = sata_pkt_alloc(spx, SLEEP_FUNC);
18085 	if (spkt == NULL) {
18086 		kmem_free(spx, sizeof (sata_pkt_txlate_t));
18087 		return (-1);
18088 	}
18089 	/* address is needed now */
18090 	spkt->satapkt_device.satadev_addr = sdinfo->satadrv_addr;
18091 
18092 
18093 	/* Fill sata_pkt */
18094 	spkt->satapkt_device.satadev_addr = sdinfo->satadrv_addr;
18095 	spkt->satapkt_op_mode = SATA_OPMODE_SYNCH | SATA_OPMODE_INTERRUPTS;
18096 	/* Synchronous mode, no callback */
18097 	spkt->satapkt_comp = NULL;
18098 	/* Timeout 30s */
18099 	spkt->satapkt_time = sata_default_pkt_time;
18100 
18101 	scmd = &spkt->satapkt_cmd;
18102 	scmd->satacmd_flags.sata_data_direction = SATA_DIR_READ;
18103 
18104 	/*
18105 	 * Allocate buffer for SMART READ LOG
18106 	 */
18107 	scmd->satacmd_bp = sata_alloc_local_buffer(spx, (size_t)log_size * 512);
18108 	if (scmd->satacmd_bp == NULL) {
18109 		sata_pkt_free(spx);
18110 		kmem_free(spx, sizeof (sata_pkt_txlate_t));
18111 		SATA_LOG_D((sata_hba_inst, CE_WARN,
18112 		    "sata_smart_read_log: " "cannot allocate buffer"));
18113 		return (-1);
18114 	}
18115 
18116 	/* Build SMART_READ_LOG cmd in the sata_pkt */
18117 	scmd->satacmd_addr_type = 0;		/* N/A */
18118 	scmd->satacmd_sec_count_lsb = log_size;	/* what the caller asked for */
18119 	scmd->satacmd_lba_low_lsb = which_log;	/* which log page */
18120 	scmd->satacmd_lba_mid_lsb = SMART_MAGIC_VAL_1;
18121 	scmd->satacmd_lba_high_lsb = SMART_MAGIC_VAL_2;
18122 	scmd->satacmd_features_reg = SATA_SMART_READ_LOG;
18123 	scmd->satacmd_device_reg = 0;		/* Always device 0 */
18124 	scmd->satacmd_cmd_reg = SATAC_SMART;
18125 
18126 	mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
18127 	    sdinfo->satadrv_addr.cport)));
18128 
18129 	/* Send pkt to SATA HBA driver */
18130 	if ((*SATA_START_FUNC(sata_hba_inst))(SATA_DIP(sata_hba_inst), spkt) !=
18131 	    SATA_TRAN_ACCEPTED ||
18132 	    spkt->satapkt_reason != SATA_PKT_COMPLETED) {
18133 		mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst,
18134 		    sdinfo->satadrv_addr.cport)));
18135 
18136 		/*
18137 		 * Whoops, no SMART DATA available
18138 		 */
18139 		rval = -1;
18140 		goto fail;
18141 	} else {
18142 		mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst,
18143 		    sdinfo->satadrv_addr.cport)));
18144 
18145 		if (spx->txlt_buf_dma_handle != NULL) {
18146 			rval = ddi_dma_sync(spx->txlt_buf_dma_handle, 0, 0,
18147 			    DDI_DMA_SYNC_FORKERNEL);
18148 			ASSERT(rval == DDI_SUCCESS);
18149 			if (sata_check_for_dma_error(dip, spx)) {
18150 				ddi_fm_service_impact(dip,
18151 				    DDI_SERVICE_UNAFFECTED);
18152 				rval = -1;
18153 				goto fail;
18154 			}
18155 		}
18156 		bcopy(scmd->satacmd_bp->b_un.b_addr, smart_log, log_size * 512);
18157 		rval = 0;
18158 	}
18159 
18160 fail:
18161 	/* Free allocated resources */
18162 	sata_free_local_buffer(spx);
18163 	sata_pkt_free(spx);
18164 	kmem_free(spx, sizeof (sata_pkt_txlate_t));
18165 
18166 	return (rval);
18167 }
18168 
18169 /*
18170  * Used by LOG SENSE page 0x10
18171  *
18172  * return 0 for success, -1 otherwise
18173  *
18174  */
18175 CTASSERT(sizeof (struct read_log_ext_directory) == 512);
18176 
18177 static int
sata_read_log_ext_directory(sata_hba_inst_t * sata_hba_inst,sata_drive_info_t * sdinfo,struct read_log_ext_directory * logdir)18178 sata_read_log_ext_directory(sata_hba_inst_t *sata_hba_inst,
18179     sata_drive_info_t *sdinfo, struct read_log_ext_directory *logdir)
18180 {
18181 	return (sata_read_log_ext(sata_hba_inst, sdinfo,
18182 	    READ_LOG_EXT_LOG_DIRECTORY, 0, logdir, 1));
18183 }
18184 
18185 /*
18186  * Set up error retrieval sata command for NCQ command error data
18187  * recovery.
18188  *
18189  * Returns SATA_SUCCESS when data buffer is allocated and packet set-up,
18190  * returns SATA_FAILURE otherwise.
18191  */
18192 static int
sata_ncq_err_ret_cmd_setup(sata_pkt_txlate_t * spx,sata_drive_info_t * sdinfo)18193 sata_ncq_err_ret_cmd_setup(sata_pkt_txlate_t *spx, sata_drive_info_t *sdinfo)
18194 {
18195 #ifndef __lock_lint
18196 	_NOTE(ARGUNUSED(sdinfo))
18197 #endif
18198 
18199 	sata_pkt_t *spkt = spx->txlt_sata_pkt;
18200 	sata_cmd_t *scmd;
18201 	struct buf *bp;
18202 
18203 	/* Operation modes are up to the caller */
18204 	spkt->satapkt_op_mode = SATA_OPMODE_SYNCH | SATA_OPMODE_INTERRUPTS;
18205 
18206 	/* Synchronous mode, no callback - may be changed by the caller */
18207 	spkt->satapkt_comp = NULL;
18208 	spkt->satapkt_time = sata_default_pkt_time;
18209 
18210 	scmd = &spkt->satapkt_cmd;
18211 	bcopy(&sata_rle_cmd, scmd, sizeof (sata_cmd_t));
18212 	scmd->satacmd_flags.sata_ignore_dev_reset = B_TRUE;
18213 
18214 	/*
18215 	 * Allocate dma_able buffer error data.
18216 	 * Buffer allocation will take care of buffer alignment and other DMA
18217 	 * attributes.
18218 	 */
18219 	bp = sata_alloc_local_buffer(spx,
18220 	    sizeof (struct sata_ncq_error_recovery_page));
18221 	if (bp == NULL)
18222 		return (SATA_FAILURE);
18223 
18224 	bp_mapin(bp); /* make data buffer accessible */
18225 	scmd->satacmd_bp = bp;
18226 
18227 	/*
18228 	 * Set-up pointer to the buffer handle, so HBA can sync buffer
18229 	 * before accessing it. Handle is in usual place in translate struct.
18230 	 */
18231 	scmd->satacmd_err_ret_buf_handle = &spx->txlt_buf_dma_handle;
18232 
18233 	ASSERT(scmd->satacmd_num_dma_cookies != 0);
18234 	ASSERT(scmd->satacmd_dma_cookie_list != NULL);
18235 
18236 	return (SATA_SUCCESS);
18237 }
18238 
18239 /*
18240  * sata_xlate_errors() is used to translate (S)ATA error
18241  * information to SCSI information returned in the SCSI
18242  * packet.
18243  */
18244 static void
sata_xlate_errors(sata_pkt_txlate_t * spx)18245 sata_xlate_errors(sata_pkt_txlate_t *spx)
18246 {
18247 	struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
18248 	struct scsi_extended_sense *sense;
18249 
18250 	scsipkt->pkt_reason = CMD_INCOMPLETE;
18251 	*scsipkt->pkt_scbp = STATUS_CHECK;
18252 	sense = sata_arq_sense(spx);
18253 
18254 	switch (spx->txlt_sata_pkt->satapkt_reason) {
18255 	case SATA_PKT_PORT_ERROR:
18256 		/*
18257 		 * We have no device data. Assume no data transfered.
18258 		 */
18259 		sense->es_key = KEY_HARDWARE_ERROR;
18260 		break;
18261 
18262 	case SATA_PKT_DEV_ERROR:
18263 		if (spx->txlt_sata_pkt->satapkt_cmd.satacmd_status_reg &
18264 		    SATA_STATUS_ERR) {
18265 			/*
18266 			 * determine dev error reason from error
18267 			 * reg content
18268 			 */
18269 			sata_decode_device_error(spx, sense);
18270 			break;
18271 		}
18272 		/* No extended sense key - no info available */
18273 		break;
18274 
18275 	case SATA_PKT_TIMEOUT:
18276 		scsipkt->pkt_reason = CMD_TIMEOUT;
18277 		scsipkt->pkt_statistics |= STAT_TIMEOUT | STAT_DEV_RESET;
18278 		/* No extended sense key */
18279 		break;
18280 
18281 	case SATA_PKT_ABORTED:
18282 		scsipkt->pkt_reason = CMD_ABORTED;
18283 		scsipkt->pkt_statistics |= STAT_ABORTED;
18284 		/* No extended sense key */
18285 		break;
18286 
18287 	case SATA_PKT_RESET:
18288 		/*
18289 		 * pkt aborted either by an explicit reset request from
18290 		 * a host, or due to error recovery
18291 		 */
18292 		scsipkt->pkt_reason = CMD_RESET;
18293 		scsipkt->pkt_statistics |= STAT_DEV_RESET;
18294 		break;
18295 
18296 	default:
18297 		scsipkt->pkt_reason = CMD_TRAN_ERR;
18298 		break;
18299 	}
18300 }
18301 
18302 
18303 
18304 
18305 /*
18306  * Log sata message
18307  * dev pathname msg line preceeds the logged message.
18308  */
18309 
18310 static	void
sata_log(sata_hba_inst_t * sata_hba_inst,uint_t level,char * fmt,...)18311 sata_log(sata_hba_inst_t *sata_hba_inst, uint_t level, char *fmt, ...)
18312 {
18313 	char pathname[128];
18314 	dev_info_t *dip = NULL;
18315 	va_list ap;
18316 
18317 	mutex_enter(&sata_log_mutex);
18318 
18319 	va_start(ap, fmt);
18320 	(void) vsprintf(sata_log_buf, fmt, ap);
18321 	va_end(ap);
18322 
18323 	if (sata_hba_inst != NULL) {
18324 		dip = SATA_DIP(sata_hba_inst);
18325 		(void) ddi_pathname(dip, pathname);
18326 	} else {
18327 		pathname[0] = 0;
18328 	}
18329 	if (level == CE_CONT) {
18330 		if (sata_debug_flags == 0)
18331 			cmn_err(level, "?%s:\n %s\n", pathname, sata_log_buf);
18332 		else
18333 			cmn_err(level, "%s:\n %s\n", pathname, sata_log_buf);
18334 	} else {
18335 		if (level != CE_NOTE) {
18336 			cmn_err(level, "%s:\n %s", pathname, sata_log_buf);
18337 		} else if (sata_msg) {
18338 			cmn_err(level, "%s:\n %s", pathname,
18339 			    sata_log_buf);
18340 		}
18341 	}
18342 
18343 	/* sata trace debug */
18344 	sata_trace_debug(dip, sata_log_buf);
18345 
18346 	mutex_exit(&sata_log_mutex);
18347 }
18348 
18349 
18350 /* ******** Asynchronous HBA events handling & hotplugging support ******** */
18351 
18352 /*
18353  * Start or terminate the thread, depending on flag arg and current state
18354  */
18355 static void
sata_event_thread_control(int startstop)18356 sata_event_thread_control(int startstop)
18357 {
18358 	static int sata_event_thread_terminating = 0;
18359 	static int sata_event_thread_starting = 0;
18360 	int i;
18361 
18362 	mutex_enter(&sata_event_mutex);
18363 
18364 	if (startstop == 0 && (sata_event_thread_starting == 1 ||
18365 	    sata_event_thread_terminating == 1)) {
18366 		mutex_exit(&sata_event_mutex);
18367 		return;
18368 	}
18369 	if (startstop == 1 && sata_event_thread_starting == 1) {
18370 		mutex_exit(&sata_event_mutex);
18371 		return;
18372 	}
18373 	if (startstop == 1 && sata_event_thread_terminating == 1) {
18374 		sata_event_thread_starting = 1;
18375 		/* wait til terminate operation completes */
18376 		i = SATA_EVNT_DAEMON_TERM_WAIT/SATA_EVNT_DAEMON_TERM_TIMEOUT;
18377 		while (sata_event_thread_terminating == 1) {
18378 			if (i-- <= 0) {
18379 				sata_event_thread_starting = 0;
18380 				mutex_exit(&sata_event_mutex);
18381 #ifdef SATA_DEBUG
18382 				cmn_err(CE_WARN, "sata_event_thread_control: "
18383 				    "timeout waiting for thread to terminate");
18384 #endif
18385 				return;
18386 			}
18387 			mutex_exit(&sata_event_mutex);
18388 			delay(drv_usectohz(SATA_EVNT_DAEMON_TERM_TIMEOUT));
18389 			mutex_enter(&sata_event_mutex);
18390 		}
18391 	}
18392 	if (startstop == 1) {
18393 		if (sata_event_thread == NULL) {
18394 			sata_event_thread = thread_create(NULL, 0,
18395 			    (void (*)())sata_event_daemon,
18396 			    &sata_hba_list, 0, &p0, TS_RUN, minclsyspri);
18397 		}
18398 		sata_event_thread_starting = 0;
18399 		mutex_exit(&sata_event_mutex);
18400 		return;
18401 	}
18402 
18403 	/*
18404 	 * If we got here, thread may need to be terminated
18405 	 */
18406 	if (sata_event_thread != NULL) {
18407 		int i;
18408 		/* Signal event thread to go away */
18409 		sata_event_thread_terminating = 1;
18410 		sata_event_thread_terminate = 1;
18411 		cv_signal(&sata_event_cv);
18412 		/*
18413 		 * Wait til daemon terminates.
18414 		 */
18415 		i = SATA_EVNT_DAEMON_TERM_WAIT/SATA_EVNT_DAEMON_TERM_TIMEOUT;
18416 		while (sata_event_thread_terminate == 1) {
18417 			mutex_exit(&sata_event_mutex);
18418 			if (i-- <= 0) {
18419 				/* Daemon did not go away !!! */
18420 #ifdef SATA_DEBUG
18421 				cmn_err(CE_WARN, "sata_event_thread_control: "
18422 				    "cannot terminate event daemon thread");
18423 #endif
18424 				mutex_enter(&sata_event_mutex);
18425 				break;
18426 			}
18427 			delay(drv_usectohz(SATA_EVNT_DAEMON_TERM_TIMEOUT));
18428 			mutex_enter(&sata_event_mutex);
18429 		}
18430 		sata_event_thread_terminating = 0;
18431 	}
18432 	ASSERT(sata_event_thread_terminating == 0);
18433 	ASSERT(sata_event_thread_starting == 0);
18434 	mutex_exit(&sata_event_mutex);
18435 }
18436 
18437 
18438 /*
18439  * SATA HBA event notification function.
18440  * Events reported by SATA HBA drivers per HBA instance relate to a change in
18441  * a port and/or device state or a controller itself.
18442  * Events for different addresses/addr types cannot be combined.
18443  * A warning message is generated for each event type.
18444  * Events are not processed by this function, so only the
18445  * event flag(s)is set for an affected entity and the event thread is
18446  * waken up. Event daemon thread processes all events.
18447  *
18448  * NOTE: Since more than one event may be reported at the same time, one
18449  * cannot determine a sequence of events when opposite event are reported, eg.
18450  * LINK_LOST and LINK_ESTABLISHED. Actual port status during event processing
18451  * is taking precedence over reported events, i.e. may cause ignoring some
18452  * events.
18453  */
18454 #define	SATA_EVENT_MAX_MSG_LENGTH	79
18455 
18456 void
sata_hba_event_notify(dev_info_t * dip,sata_device_t * sata_device,int event)18457 sata_hba_event_notify(dev_info_t *dip, sata_device_t *sata_device, int event)
18458 {
18459 	sata_hba_inst_t *sata_hba_inst = NULL;
18460 	sata_address_t *saddr;
18461 	sata_pmult_info_t *pmultinfo;
18462 	sata_drive_info_t *sdinfo;
18463 	sata_port_stats_t *pstats;
18464 	sata_cport_info_t *cportinfo = NULL;
18465 	sata_pmport_info_t *pmportinfo = NULL;
18466 	int cport, pmport;
18467 	char buf1[SATA_EVENT_MAX_MSG_LENGTH + 1];
18468 	char buf2[SATA_EVENT_MAX_MSG_LENGTH + 1];
18469 	char *lcp;
18470 	static char *err_msg_evnt_1 =
18471 	    "sata_hba_event_notify: invalid port event 0x%x ";
18472 	static char *err_msg_evnt_2 =
18473 	    "sata_hba_event_notify: invalid device event 0x%x ";
18474 	int linkevent;
18475 
18476 	/*
18477 	 * There is a possibility that an event will be generated on HBA
18478 	 * that has not completed attachment or is detaching. We still want
18479 	 * to process events until HBA is detached.
18480 	 */
18481 	mutex_enter(&sata_mutex);
18482 	for (sata_hba_inst = sata_hba_list; sata_hba_inst != NULL;
18483 	    sata_hba_inst = sata_hba_inst->satahba_next) {
18484 		if (SATA_DIP(sata_hba_inst) == dip)
18485 			if (sata_hba_inst->satahba_attached == 1)
18486 				break;
18487 	}
18488 	mutex_exit(&sata_mutex);
18489 	if (sata_hba_inst == NULL)
18490 		/* HBA not attached */
18491 		return;
18492 
18493 	ASSERT(sata_device != NULL);
18494 
18495 	/*
18496 	 * Validate address before - do not proceed with invalid address.
18497 	 */
18498 	saddr = &sata_device->satadev_addr;
18499 	if (saddr->cport >= SATA_NUM_CPORTS(sata_hba_inst))
18500 		return;
18501 
18502 	cport = saddr->cport;
18503 	pmport = saddr->pmport;
18504 
18505 	buf1[0] = buf2[0] = '\0';
18506 
18507 	/*
18508 	 * If event relates to port or device, check port state.
18509 	 * Port has to be initialized, or we cannot accept an event.
18510 	 */
18511 	if ((saddr->qual & (SATA_ADDR_CPORT | SATA_ADDR_PMPORT |
18512 	    SATA_ADDR_DCPORT | SATA_ADDR_DPMPORT | SATA_ADDR_PMULT)) != 0) {
18513 		mutex_enter(&sata_hba_inst->satahba_mutex);
18514 		cportinfo = SATA_CPORT_INFO(sata_hba_inst, cport);
18515 		mutex_exit(&sata_hba_inst->satahba_mutex);
18516 		if (cportinfo == NULL || cportinfo->cport_state == 0)
18517 			return;
18518 	}
18519 
18520 	if ((saddr->qual & (SATA_ADDR_PMULT | SATA_ADDR_PMPORT |
18521 	    SATA_ADDR_DPMPORT)) != 0) {
18522 		if (cportinfo->cport_dev_type != SATA_DTYPE_PMULT) {
18523 			SATA_LOG_D((sata_hba_inst, CE_WARN,
18524 			    "sata_hba_event_notify: Non-pmult device (0x%x)"
18525 			    "is attached to port %d, ignore pmult/pmport "
18526 			    "event 0x%x", cportinfo->cport_dev_type,
18527 			    cport, event));
18528 			return;
18529 		}
18530 
18531 		mutex_enter(&cportinfo->cport_mutex);
18532 		pmultinfo = SATA_PMULT_INFO(sata_hba_inst, cport);
18533 		mutex_exit(&cportinfo->cport_mutex);
18534 
18535 		/*
18536 		 * The daemon might be processing attachment of port
18537 		 * multiplier, in that case we should ignore events on its
18538 		 * sub-devices.
18539 		 *
18540 		 * NOTE: Only pmult_state is checked in sata_hba_event_notify.
18541 		 * The pmport_state is checked by sata daemon.
18542 		 */
18543 		if (pmultinfo == NULL ||
18544 		    pmultinfo->pmult_state == SATA_STATE_UNKNOWN) {
18545 			SATA_LOG_D((sata_hba_inst, CE_WARN,
18546 			    "sata_hba_event_notify: pmult is not"
18547 			    "available at port %d:%d, ignore event 0x%x",
18548 			    cport, pmport, event));
18549 			return;
18550 		}
18551 	}
18552 
18553 	if ((saddr->qual &
18554 	    (SATA_ADDR_PMPORT | SATA_ADDR_DPMPORT)) != 0) {
18555 
18556 		mutex_enter(&cportinfo->cport_mutex);
18557 		if (pmport > SATA_NUM_PMPORTS(sata_hba_inst, cport)) {
18558 			SATA_LOG_D((sata_hba_inst, CE_WARN,
18559 			    "sata_hba_event_notify: invalid/"
18560 			    "un-implemented port %d:%d (%d ports), "
18561 			    "ignore event 0x%x", cport, pmport,
18562 			    SATA_NUM_PMPORTS(sata_hba_inst, cport), event));
18563 			mutex_exit(&cportinfo->cport_mutex);
18564 			return;
18565 		}
18566 		mutex_exit(&cportinfo->cport_mutex);
18567 
18568 		mutex_enter(&sata_hba_inst->satahba_mutex);
18569 		pmportinfo = SATA_PMPORT_INFO(sata_hba_inst,
18570 		    cport, pmport);
18571 		mutex_exit(&sata_hba_inst->satahba_mutex);
18572 
18573 		/* pmport is implemented/valid? */
18574 		if (pmportinfo == NULL) {
18575 			SATA_LOG_D((sata_hba_inst, CE_WARN,
18576 			    "sata_hba_event_notify: invalid/"
18577 			    "un-implemented port %d:%d, ignore "
18578 			    "event 0x%x", cport, pmport, event));
18579 			return;
18580 		}
18581 	}
18582 
18583 	/*
18584 	 * Events refer to devices, ports and controllers - each has
18585 	 * unique address. Events for different addresses cannot be combined.
18586 	 */
18587 	if (saddr->qual & (SATA_ADDR_CPORT | SATA_ADDR_PMPORT)) {
18588 
18589 		mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst, cport)));
18590 
18591 		/* qualify this event(s) */
18592 		if ((event & SATA_EVNT_PORT_EVENTS) == 0) {
18593 			/* Invalid event for the device port */
18594 			(void) sprintf(buf2, err_msg_evnt_1,
18595 			    event & SATA_EVNT_PORT_EVENTS);
18596 			mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst, cport)));
18597 			goto event_info;
18598 		}
18599 		if (saddr->qual == SATA_ADDR_CPORT) {
18600 			/* Controller's device port event */
18601 
18602 			(SATA_CPORT_INFO(sata_hba_inst, cport))->
18603 			    cport_event_flags |=
18604 			    event & SATA_EVNT_PORT_EVENTS;
18605 			pstats =
18606 			    &(SATA_CPORT_INFO(sata_hba_inst, cport))->
18607 			    cport_stats;
18608 		} else {
18609 			mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst, cport)));
18610 			mutex_enter(&pmportinfo->pmport_mutex);
18611 			/* Port multiplier's device port event */
18612 			(SATA_PMPORT_INFO(sata_hba_inst, cport, pmport))->
18613 			    pmport_event_flags |=
18614 			    event & SATA_EVNT_PORT_EVENTS;
18615 			pstats =
18616 			    &(SATA_PMPORT_INFO(sata_hba_inst, cport, pmport))->
18617 			    pmport_stats;
18618 			mutex_exit(&pmportinfo->pmport_mutex);
18619 			mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst, cport)));
18620 		}
18621 
18622 		/*
18623 		 * Add to statistics and log the message. We have to do it
18624 		 * here rather than in the event daemon, because there may be
18625 		 * multiple events occuring before they are processed.
18626 		 */
18627 		linkevent = event &
18628 		    (SATA_EVNT_LINK_LOST | SATA_EVNT_LINK_ESTABLISHED);
18629 		if (linkevent) {
18630 			if (linkevent == (SATA_EVNT_LINK_LOST |
18631 			    SATA_EVNT_LINK_ESTABLISHED)) {
18632 				/* This is likely event combination */
18633 				(void) strlcat(buf1, "link lost/established, ",
18634 				    SATA_EVENT_MAX_MSG_LENGTH);
18635 
18636 				if (pstats->link_lost < 0xffffffffffffffffULL)
18637 					pstats->link_lost++;
18638 				if (pstats->link_established <
18639 				    0xffffffffffffffffULL)
18640 					pstats->link_established++;
18641 				linkevent = 0;
18642 			} else if (linkevent & SATA_EVNT_LINK_LOST) {
18643 				(void) strlcat(buf1, "link lost, ",
18644 				    SATA_EVENT_MAX_MSG_LENGTH);
18645 
18646 				if (pstats->link_lost < 0xffffffffffffffffULL)
18647 					pstats->link_lost++;
18648 			} else {
18649 				(void) strlcat(buf1, "link established, ",
18650 				    SATA_EVENT_MAX_MSG_LENGTH);
18651 				if (pstats->link_established <
18652 				    0xffffffffffffffffULL)
18653 					pstats->link_established++;
18654 			}
18655 		}
18656 		if (event & SATA_EVNT_DEVICE_ATTACHED) {
18657 			(void) strlcat(buf1, "device attached, ",
18658 			    SATA_EVENT_MAX_MSG_LENGTH);
18659 			if (pstats->device_attached < 0xffffffffffffffffULL)
18660 				pstats->device_attached++;
18661 		}
18662 		if (event & SATA_EVNT_DEVICE_DETACHED) {
18663 			(void) strlcat(buf1, "device detached, ",
18664 			    SATA_EVENT_MAX_MSG_LENGTH);
18665 			if (pstats->device_detached < 0xffffffffffffffffULL)
18666 				pstats->device_detached++;
18667 		}
18668 		if (event & SATA_EVNT_PWR_LEVEL_CHANGED) {
18669 			SATADBG1(SATA_DBG_EVENTS, sata_hba_inst,
18670 			    "port %d power level changed", cport);
18671 			if (pstats->port_pwr_changed < 0xffffffffffffffffULL)
18672 				pstats->port_pwr_changed++;
18673 		}
18674 
18675 		if ((event & ~SATA_EVNT_PORT_EVENTS) != 0) {
18676 			/* There should be no other events for this address */
18677 			(void) sprintf(buf2, err_msg_evnt_1,
18678 			    event & ~SATA_EVNT_PORT_EVENTS);
18679 		}
18680 		mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst, cport)));
18681 
18682 	} else if (saddr->qual & (SATA_ADDR_DCPORT | SATA_ADDR_DPMPORT)) {
18683 		mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst, cport)));
18684 
18685 		/* qualify this event */
18686 		if ((event & SATA_EVNT_DEVICE_RESET) == 0) {
18687 			/* Invalid event for a device */
18688 			(void) sprintf(buf2, err_msg_evnt_2,
18689 			    event & SATA_EVNT_DEVICE_RESET);
18690 			mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst, cport)));
18691 			goto event_info;
18692 		}
18693 		/* drive event */
18694 		sdinfo = sata_get_device_info(sata_hba_inst, sata_device);
18695 		if (sdinfo != NULL) {
18696 			if (event & SATA_EVNT_DEVICE_RESET) {
18697 				(void) strlcat(buf1, "device reset, ",
18698 				    SATA_EVENT_MAX_MSG_LENGTH);
18699 				if (sdinfo->satadrv_stats.drive_reset <
18700 				    0xffffffffffffffffULL)
18701 					sdinfo->satadrv_stats.drive_reset++;
18702 				sdinfo->satadrv_event_flags |=
18703 				    SATA_EVNT_DEVICE_RESET;
18704 			}
18705 		}
18706 		if ((event & ~SATA_EVNT_DEVICE_RESET) != 0) {
18707 			/* Invalid event for a device */
18708 			(void) sprintf(buf2, err_msg_evnt_2,
18709 			    event & ~SATA_EVNT_DRIVE_EVENTS);
18710 		}
18711 		mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst, cport)));
18712 	} else if (saddr->qual == SATA_ADDR_PMULT) {
18713 		mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst, cport)));
18714 
18715 		/* qualify this event */
18716 		if ((event & (SATA_EVNT_DEVICE_RESET |
18717 		    SATA_EVNT_PMULT_LINK_CHANGED)) == 0) {
18718 			/* Invalid event for a port multiplier */
18719 			(void) sprintf(buf2, err_msg_evnt_2,
18720 			    event & SATA_EVNT_DEVICE_RESET);
18721 			mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst, cport)));
18722 			goto event_info;
18723 		}
18724 
18725 		pmultinfo = SATA_PMULT_INFO(sata_hba_inst, cport);
18726 
18727 		if (event & SATA_EVNT_DEVICE_RESET) {
18728 
18729 			SATADBG1(SATA_DBG_PMULT, sata_hba_inst,
18730 			    "[Reset] port-mult on cport %d", cport);
18731 			pmultinfo->pmult_event_flags |=
18732 			    SATA_EVNT_DEVICE_RESET;
18733 			(void) strlcat(buf1, "pmult reset, ",
18734 			    SATA_EVENT_MAX_MSG_LENGTH);
18735 		}
18736 
18737 		if (event & SATA_EVNT_PMULT_LINK_CHANGED) {
18738 
18739 			SATADBG1(SATA_DBG_PMULT, sata_hba_inst,
18740 			    "pmult link changed on cport %d", cport);
18741 			pmultinfo->pmult_event_flags |=
18742 			    SATA_EVNT_PMULT_LINK_CHANGED;
18743 			(void) strlcat(buf1, "pmult link changed, ",
18744 			    SATA_EVENT_MAX_MSG_LENGTH);
18745 		}
18746 		mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst, cport)));
18747 
18748 	} else {
18749 		if (saddr->qual != SATA_ADDR_NULL) {
18750 			/* Wrong address qualifier */
18751 			SATA_LOG_D((sata_hba_inst, CE_WARN,
18752 			    "sata_hba_event_notify: invalid address 0x%x",
18753 			    *(uint32_t *)saddr));
18754 			return;
18755 		}
18756 		if ((event & SATA_EVNT_CONTROLLER_EVENTS) == 0 ||
18757 		    (event & ~SATA_EVNT_CONTROLLER_EVENTS) != 0) {
18758 			/* Invalid event for the controller */
18759 			SATA_LOG_D((sata_hba_inst, CE_WARN,
18760 			    "sata_hba_event_notify: invalid event 0x%x for "
18761 			    "controller",
18762 			    event & SATA_EVNT_CONTROLLER_EVENTS));
18763 			return;
18764 		}
18765 		buf1[0] = '\0';
18766 		/* This may be a frequent and not interesting event */
18767 		SATADBG1(SATA_DBG_EVENTS, sata_hba_inst,
18768 		    "controller power level changed\n", NULL);
18769 
18770 		mutex_enter(&sata_hba_inst->satahba_mutex);
18771 		if (sata_hba_inst->satahba_stats.ctrl_pwr_change <
18772 		    0xffffffffffffffffULL)
18773 			sata_hba_inst->satahba_stats.ctrl_pwr_change++;
18774 
18775 		sata_hba_inst->satahba_event_flags |=
18776 		    SATA_EVNT_PWR_LEVEL_CHANGED;
18777 		mutex_exit(&sata_hba_inst->satahba_mutex);
18778 	}
18779 	/*
18780 	 * If we got here, there is something to do with this HBA
18781 	 * instance.
18782 	 */
18783 	mutex_enter(&sata_hba_inst->satahba_mutex);
18784 	sata_hba_inst->satahba_event_flags |= SATA_EVNT_MAIN;
18785 	mutex_exit(&sata_hba_inst->satahba_mutex);
18786 	mutex_enter(&sata_mutex);
18787 	sata_event_pending |= SATA_EVNT_MAIN;	/* global event indicator */
18788 	mutex_exit(&sata_mutex);
18789 
18790 	/* Tickle event thread */
18791 	mutex_enter(&sata_event_mutex);
18792 	if (sata_event_thread_active == 0)
18793 		cv_signal(&sata_event_cv);
18794 	mutex_exit(&sata_event_mutex);
18795 
18796 event_info:
18797 	if (buf1[0] != '\0') {
18798 		lcp = strrchr(buf1, ',');
18799 		if (lcp != NULL)
18800 			*lcp = '\0';
18801 	}
18802 	if (saddr->qual == SATA_ADDR_CPORT ||
18803 	    saddr->qual == SATA_ADDR_DCPORT) {
18804 		if (buf1[0] != '\0') {
18805 			sata_log(sata_hba_inst, CE_NOTE, "port %d: %s\n",
18806 			    cport, buf1);
18807 		}
18808 		if (buf2[0] != '\0') {
18809 			sata_log(sata_hba_inst, CE_NOTE, "port %d: %s\n",
18810 			    cport, buf2);
18811 		}
18812 	} else if (saddr->qual == SATA_ADDR_PMPORT ||
18813 	    saddr->qual == SATA_ADDR_DPMPORT) {
18814 		if (buf1[0] != '\0') {
18815 			sata_log(sata_hba_inst, CE_NOTE,
18816 			    "port %d pmport %d: %s\n", cport, pmport, buf1);
18817 		}
18818 		if (buf2[0] != '\0') {
18819 			sata_log(sata_hba_inst, CE_NOTE,
18820 			    "port %d pmport %d: %s\n", cport, pmport, buf2);
18821 		}
18822 	}
18823 }
18824 
18825 
18826 /*
18827  * Event processing thread.
18828  * Arg is a pointer to the sata_hba_list pointer.
18829  * It is not really needed, because sata_hba_list is global and static
18830  */
18831 static void
sata_event_daemon(void * arg)18832 sata_event_daemon(void *arg)
18833 {
18834 #ifndef __lock_lint
18835 	_NOTE(ARGUNUSED(arg))
18836 #endif
18837 	sata_hba_inst_t *sata_hba_inst;
18838 	clock_t delta;
18839 
18840 	SATADBG1(SATA_DBG_EVENTS_DAEMON, NULL,
18841 	    "SATA event daemon started\n", NULL);
18842 loop:
18843 	/*
18844 	 * Process events here. Walk through all registered HBAs
18845 	 */
18846 	mutex_enter(&sata_mutex);
18847 	for (sata_hba_inst = sata_hba_list; sata_hba_inst != NULL;
18848 	    sata_hba_inst = sata_hba_inst->satahba_next) {
18849 		ASSERT(sata_hba_inst != NULL);
18850 		mutex_enter(&sata_hba_inst->satahba_mutex);
18851 		if (sata_hba_inst->satahba_attached == 0 ||
18852 		    (sata_hba_inst->satahba_event_flags &
18853 		    SATA_EVNT_SKIP) != 0) {
18854 			mutex_exit(&sata_hba_inst->satahba_mutex);
18855 			continue;
18856 		}
18857 		if (sata_hba_inst->satahba_event_flags & SATA_EVNT_MAIN) {
18858 			sata_hba_inst->satahba_event_flags |= SATA_EVNT_SKIP;
18859 			mutex_exit(&sata_hba_inst->satahba_mutex);
18860 			mutex_exit(&sata_mutex);
18861 			/* Got the controller with pending event */
18862 			sata_process_controller_events(sata_hba_inst);
18863 			/*
18864 			 * Since global mutex was released, there is a
18865 			 * possibility that HBA list has changed, so start
18866 			 * over from the top. Just processed controller
18867 			 * will be passed-over because of the SKIP flag.
18868 			 */
18869 			goto loop;
18870 		}
18871 		mutex_exit(&sata_hba_inst->satahba_mutex);
18872 	}
18873 	/* Clear SKIP flag in all controllers */
18874 	for (sata_hba_inst = sata_hba_list; sata_hba_inst != NULL;
18875 	    sata_hba_inst = sata_hba_inst->satahba_next) {
18876 		mutex_enter(&sata_hba_inst->satahba_mutex);
18877 		sata_hba_inst->satahba_event_flags &= ~SATA_EVNT_SKIP;
18878 		mutex_exit(&sata_hba_inst->satahba_mutex);
18879 	}
18880 	mutex_exit(&sata_mutex);
18881 
18882 	SATADBG1(SATA_DBG_EVENTS_DAEMON, NULL,
18883 	    "SATA EVENT DAEMON suspending itself", NULL);
18884 
18885 #ifdef SATA_DEBUG
18886 	if ((sata_func_enable & SATA_ENABLE_PROCESS_EVENTS) == 0) {
18887 		sata_log(sata_hba_inst, CE_WARN,
18888 		    "SATA EVENTS PROCESSING DISABLED\n");
18889 		thread_exit(); /* Daemon will not run again */
18890 	}
18891 #endif
18892 	mutex_enter(&sata_event_mutex);
18893 	sata_event_thread_active = 0;
18894 	mutex_exit(&sata_event_mutex);
18895 	/*
18896 	 * Go to sleep/suspend itself and wake up either because new event or
18897 	 * wait timeout. Exit if there is a termination request (driver
18898 	 * unload).
18899 	 */
18900 	delta = drv_usectohz(SATA_EVNT_DAEMON_SLEEP_TIME);
18901 	do {
18902 		mutex_enter(&sata_event_mutex);
18903 		(void) cv_reltimedwait(&sata_event_cv, &sata_event_mutex,
18904 		    delta, TR_CLOCK_TICK);
18905 
18906 		if (sata_event_thread_active != 0) {
18907 			mutex_exit(&sata_event_mutex);
18908 			continue;
18909 		}
18910 
18911 		/* Check if it is time to go away */
18912 		if (sata_event_thread_terminate == 1) {
18913 			/*
18914 			 * It is up to the thread setting above flag to make
18915 			 * sure that this thread is not killed prematurely.
18916 			 */
18917 			sata_event_thread_terminate = 0;
18918 			sata_event_thread = NULL;
18919 			mutex_exit(&sata_event_mutex);
18920 			SATADBG1(SATA_DBG_EVENTS_DAEMON, NULL,
18921 			    "SATA_EVENT_DAEMON_TERMINATING", NULL);
18922 			thread_exit();  { _NOTE(NOT_REACHED) }
18923 		}
18924 		mutex_exit(&sata_event_mutex);
18925 	} while (!(sata_event_pending & SATA_EVNT_MAIN));
18926 
18927 	mutex_enter(&sata_event_mutex);
18928 	sata_event_thread_active = 1;
18929 	mutex_exit(&sata_event_mutex);
18930 
18931 	mutex_enter(&sata_mutex);
18932 	sata_event_pending &= ~SATA_EVNT_MAIN;
18933 	mutex_exit(&sata_mutex);
18934 
18935 	SATADBG1(SATA_DBG_EVENTS_DAEMON, NULL,
18936 	    "SATA EVENT DAEMON READY TO PROCESS EVENT", NULL);
18937 
18938 	goto loop;
18939 }
18940 
18941 /*
18942  * Specific HBA instance event processing.
18943  *
18944  * NOTE: At the moment, device event processing is limited to hard disks
18945  * only.
18946  * Port multiplier is supported now.
18947  */
18948 static void
sata_process_controller_events(sata_hba_inst_t * sata_hba_inst)18949 sata_process_controller_events(sata_hba_inst_t *sata_hba_inst)
18950 {
18951 	int ncport;
18952 	uint32_t event_flags;
18953 	sata_address_t *saddr;
18954 	sata_cport_info_t *cportinfo;
18955 	sata_pmult_info_t *pmultinfo;
18956 
18957 	SATADBG1(SATA_DBG_EVENTS_CNTRL, sata_hba_inst,
18958 	    "Processing controller %d event(s)",
18959 	    ddi_get_instance(SATA_DIP(sata_hba_inst)));
18960 
18961 	mutex_enter(&sata_hba_inst->satahba_mutex);
18962 	sata_hba_inst->satahba_event_flags &= ~SATA_EVNT_MAIN;
18963 	event_flags = sata_hba_inst->satahba_event_flags;
18964 	mutex_exit(&sata_hba_inst->satahba_mutex);
18965 	/*
18966 	 * Process controller power change first
18967 	 * HERE
18968 	 */
18969 	if (event_flags & SATA_EVNT_PWR_LEVEL_CHANGED)
18970 		sata_process_cntrl_pwr_level_change(sata_hba_inst);
18971 
18972 	/*
18973 	 * Search through ports/devices to identify affected port/device.
18974 	 * We may have to process events for more than one port/device.
18975 	 */
18976 	for (ncport = 0; ncport < SATA_NUM_CPORTS(sata_hba_inst); ncport++) {
18977 		/*
18978 		 * Not all ports may be processed in attach by the time we
18979 		 * get an event. Check if port info is initialized.
18980 		 */
18981 		mutex_enter(&sata_hba_inst->satahba_mutex);
18982 		cportinfo = SATA_CPORT_INFO(sata_hba_inst, ncport);
18983 		mutex_exit(&sata_hba_inst->satahba_mutex);
18984 		if (cportinfo == NULL || cportinfo->cport_state == 0)
18985 			continue;
18986 
18987 		/* We have initialized controller port info */
18988 		mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst, ncport)));
18989 		event_flags = (SATA_CPORT_INFO(sata_hba_inst, ncport))->
18990 		    cport_event_flags;
18991 		/* Check if port was locked by IOCTL processing */
18992 		if (event_flags & SATA_APCTL_LOCK_PORT_BUSY) {
18993 			/*
18994 			 * We ignore port events because port is busy
18995 			 * with AP control processing. Set again
18996 			 * controller and main event flag, so that
18997 			 * events may be processed by the next daemon
18998 			 * run.
18999 			 */
19000 			mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst, ncport)));
19001 			mutex_enter(&sata_hba_inst->satahba_mutex);
19002 			sata_hba_inst->satahba_event_flags |= SATA_EVNT_MAIN;
19003 			mutex_exit(&sata_hba_inst->satahba_mutex);
19004 			mutex_enter(&sata_mutex);
19005 			sata_event_pending |= SATA_EVNT_MAIN;
19006 			mutex_exit(&sata_mutex);
19007 			SATADBG1(SATA_DBG_EVENTS_PROCPST, sata_hba_inst,
19008 			    "Event processing postponed until "
19009 			    "AP control processing completes",
19010 			    NULL);
19011 			/* Check other ports */
19012 			continue;
19013 		} else {
19014 			/*
19015 			 * Set BSY flag so that AP control would not
19016 			 * interfere with events processing for
19017 			 * this port.
19018 			 */
19019 			(SATA_CPORT_INFO(sata_hba_inst, ncport))->
19020 			    cport_event_flags |= SATA_EVNT_LOCK_PORT_BUSY;
19021 		}
19022 		mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst, ncport)));
19023 
19024 		saddr = &(SATA_CPORT_INFO(sata_hba_inst, ncport))->cport_addr;
19025 
19026 		if ((event_flags &
19027 		    (SATA_EVNT_PORT_EVENTS | SATA_EVNT_DRIVE_EVENTS)) != 0) {
19028 			/*
19029 			 * Got port event.
19030 			 * We need some hierarchy of event processing as they
19031 			 * are affecting each other:
19032 			 * 1. port failed
19033 			 * 2. device detached/attached
19034 			 * 3. link events - link events may trigger device
19035 			 *    detached or device attached events in some
19036 			 *    circumstances.
19037 			 * 4. port power level changed
19038 			 */
19039 			if (event_flags & SATA_EVNT_PORT_FAILED) {
19040 				sata_process_port_failed_event(sata_hba_inst,
19041 				    saddr);
19042 			}
19043 			if (event_flags & SATA_EVNT_DEVICE_DETACHED) {
19044 				sata_process_device_detached(sata_hba_inst,
19045 				    saddr);
19046 			}
19047 			if (event_flags & SATA_EVNT_DEVICE_ATTACHED) {
19048 				sata_process_device_attached(sata_hba_inst,
19049 				    saddr);
19050 			}
19051 			if (event_flags &
19052 			    (SATA_EVNT_LINK_ESTABLISHED |
19053 			    SATA_EVNT_LINK_LOST)) {
19054 				sata_process_port_link_events(sata_hba_inst,
19055 				    saddr);
19056 			}
19057 			if (event_flags & SATA_EVNT_PWR_LEVEL_CHANGED) {
19058 				sata_process_port_pwr_change(sata_hba_inst,
19059 				    saddr);
19060 			}
19061 			if (event_flags & SATA_EVNT_TARGET_NODE_CLEANUP) {
19062 				sata_process_target_node_cleanup(
19063 				    sata_hba_inst, saddr);
19064 			}
19065 			if (event_flags & SATA_EVNT_AUTOONLINE_DEVICE) {
19066 				sata_process_device_autoonline(
19067 				    sata_hba_inst, saddr);
19068 			}
19069 		}
19070 
19071 
19072 		/*
19073 		 * Scan port multiplier and all its sub-ports event flags.
19074 		 * The events are marked by
19075 		 * (1) sata_pmult_info.pmult_event_flags
19076 		 * (2) sata_pmport_info.pmport_event_flags
19077 		 */
19078 		mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst, ncport)));
19079 		if (cportinfo->cport_dev_type == SATA_DTYPE_PMULT) {
19080 			/*
19081 			 * There should be another extra check: this
19082 			 * port multiplier still exists?
19083 			 */
19084 			pmultinfo = SATA_PMULT_INFO(sata_hba_inst,
19085 			    ncport);
19086 
19087 			if (pmultinfo != NULL) {
19088 				mutex_exit(&(SATA_CPORT_MUTEX(
19089 				    sata_hba_inst, ncport)));
19090 				sata_process_pmult_events(
19091 				    sata_hba_inst, ncport);
19092 				mutex_enter(&(SATA_CPORT_MUTEX(
19093 				    sata_hba_inst, ncport)));
19094 			} else {
19095 				SATADBG1(SATA_DBG_PMULT, sata_hba_inst,
19096 				    "Port-multiplier is gone. "
19097 				    "Ignore all sub-device events "
19098 				    "at port %d.", ncport);
19099 			}
19100 		}
19101 
19102 		if ((SATA_CPORT_DEV_TYPE(sata_hba_inst, ncport) !=
19103 		    SATA_DTYPE_NONE) &&
19104 		    (SATA_CPORT_DRV_INFO(sata_hba_inst, ncport) != NULL)) {
19105 			if (SATA_CPORT_DRV_INFO(sata_hba_inst, ncport)->
19106 			    satadrv_event_flags &
19107 			    (SATA_EVNT_DEVICE_RESET |
19108 			    SATA_EVNT_INPROC_DEVICE_RESET)) {
19109 				/* Have device event */
19110 				sata_process_device_reset(sata_hba_inst,
19111 				    saddr);
19112 			}
19113 		}
19114 		/* Release PORT_BUSY flag */
19115 		(SATA_CPORT_INFO(sata_hba_inst, ncport))->
19116 		    cport_event_flags &= ~SATA_EVNT_LOCK_PORT_BUSY;
19117 		mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst, ncport)));
19118 
19119 	} /* End of loop through the controller SATA ports */
19120 }
19121 
19122 /*
19123  * Specific port multiplier instance event processing. At the moment, device
19124  * event processing is limited to link/attach event only.
19125  *
19126  * NOTE: power management event is not supported yet.
19127  */
19128 static void
sata_process_pmult_events(sata_hba_inst_t * sata_hba_inst,uint8_t cport)19129 sata_process_pmult_events(sata_hba_inst_t *sata_hba_inst, uint8_t cport)
19130 {
19131 	sata_cport_info_t *cportinfo = SATA_CPORT_INFO(sata_hba_inst, cport);
19132 	sata_pmult_info_t *pmultinfo;
19133 	sata_pmport_info_t *pmportinfo;
19134 	sata_address_t *saddr;
19135 	sata_device_t sata_device;
19136 	uint32_t event_flags;
19137 	int npmport;
19138 	int rval;
19139 
19140 	SATADBG2(SATA_DBG_EVENTS_CNTRL|SATA_DBG_PMULT, sata_hba_inst,
19141 	    "Processing pmult event(s) on cport %d of controller %d",
19142 	    cport, ddi_get_instance(SATA_DIP(sata_hba_inst)));
19143 
19144 	/* First process events on port multiplier */
19145 	mutex_enter(&cportinfo->cport_mutex);
19146 	pmultinfo = SATA_PMULT_INFO(sata_hba_inst, cport);
19147 	event_flags = pmultinfo->pmult_event_flags;
19148 
19149 	/*
19150 	 * Reset event (of port multiplier) has higher priority because the
19151 	 * port multiplier itself might be failed or removed after reset.
19152 	 */
19153 	if (event_flags & SATA_EVNT_DEVICE_RESET) {
19154 		/*
19155 		 * The status of the sub-links are uncertain,
19156 		 * so mark all sub-ports as RESET
19157 		 */
19158 		for (npmport = 0; npmport < SATA_NUM_PMPORTS(
19159 		    sata_hba_inst, cport); npmport ++) {
19160 			pmportinfo = SATA_PMPORT_INFO(sata_hba_inst,
19161 			    cport, npmport);
19162 			if (pmportinfo == NULL) {
19163 				/* That's weird. */
19164 				SATA_LOG_D((sata_hba_inst, CE_WARN,
19165 				    "sata_hba_event_notify: "
19166 				    "invalid/un-implemented "
19167 				    "port %d:%d (%d ports), ",
19168 				    cport, npmport, SATA_NUM_PMPORTS(
19169 				    sata_hba_inst, cport)));
19170 				continue;
19171 			}
19172 
19173 			mutex_enter(&pmportinfo->pmport_mutex);
19174 
19175 			/* Mark all pmport to unknow state. */
19176 			pmportinfo->pmport_state = SATA_STATE_UNKNOWN;
19177 			/* Mark all pmports with link events. */
19178 			pmportinfo->pmport_event_flags =
19179 			    (SATA_EVNT_LINK_ESTABLISHED|SATA_EVNT_LINK_LOST);
19180 			mutex_exit(&pmportinfo->pmport_mutex);
19181 		}
19182 
19183 	} else if (event_flags & SATA_EVNT_PMULT_LINK_CHANGED) {
19184 		/*
19185 		 * We need probe the port multiplier to know what has
19186 		 * happened.
19187 		 */
19188 		bzero(&sata_device, sizeof (sata_device_t));
19189 		sata_device.satadev_rev = SATA_DEVICE_REV;
19190 		sata_device.satadev_addr.cport = cport;
19191 		sata_device.satadev_addr.pmport = SATA_PMULT_HOSTPORT;
19192 		sata_device.satadev_addr.qual = SATA_ADDR_PMULT;
19193 
19194 		mutex_exit(&cportinfo->cport_mutex);
19195 		rval = (*SATA_PROBE_PORT_FUNC(sata_hba_inst))
19196 		    (SATA_DIP(sata_hba_inst), &sata_device);
19197 		mutex_enter(&cportinfo->cport_mutex);
19198 		if (rval != SATA_SUCCESS) {
19199 			/* Something went wrong? Fail the port */
19200 			cportinfo->cport_state = SATA_PSTATE_FAILED;
19201 			mutex_exit(&cportinfo->cport_mutex);
19202 			SATA_LOG_D((sata_hba_inst, CE_WARN,
19203 			    "SATA port %d probing failed", cport));
19204 
19205 			/* PMult structure must be released.  */
19206 			sata_free_pmult(sata_hba_inst, &sata_device);
19207 			return;
19208 		}
19209 
19210 		sata_update_port_info(sata_hba_inst, &sata_device);
19211 
19212 		/*
19213 		 * Sanity check - Port is active? Is the link active?
19214 		 * The device is still a port multiplier?
19215 		 */
19216 		if ((cportinfo->cport_state &
19217 		    (SATA_PSTATE_SHUTDOWN | SATA_PSTATE_FAILED)) ||
19218 		    ((cportinfo->cport_scr.sstatus &
19219 		    SATA_PORT_DEVLINK_UP_MASK) != SATA_PORT_DEVLINK_UP) ||
19220 		    (cportinfo->cport_dev_type != SATA_DTYPE_PMULT)) {
19221 			mutex_exit(&cportinfo->cport_mutex);
19222 
19223 			/* PMult structure must be released.  */
19224 			sata_free_pmult(sata_hba_inst, &sata_device);
19225 			return;
19226 		}
19227 
19228 		/* Probed succeed, set port ready. */
19229 		cportinfo->cport_state |=
19230 		    SATA_STATE_PROBED | SATA_STATE_READY;
19231 	}
19232 
19233 	/* Release port multiplier event flags. */
19234 	pmultinfo->pmult_event_flags &=
19235 	    ~(SATA_EVNT_DEVICE_RESET|SATA_EVNT_PMULT_LINK_CHANGED);
19236 	mutex_exit(&cportinfo->cport_mutex);
19237 
19238 	/*
19239 	 * Check all sub-links.
19240 	 */
19241 	for (npmport = 0; npmport < SATA_NUM_PMPORTS(sata_hba_inst, cport);
19242 	    npmport ++) {
19243 		pmportinfo = SATA_PMPORT_INFO(sata_hba_inst, cport, npmport);
19244 		mutex_enter(&pmportinfo->pmport_mutex);
19245 		event_flags = pmportinfo->pmport_event_flags;
19246 		mutex_exit(&pmportinfo->pmport_mutex);
19247 		saddr = &pmportinfo->pmport_addr;
19248 
19249 		if ((event_flags &
19250 		    (SATA_EVNT_PORT_EVENTS | SATA_EVNT_DRIVE_EVENTS)) != 0) {
19251 			/*
19252 			 * Got port multiplier port event.
19253 			 * We need some hierarchy of event processing as they
19254 			 * are affecting each other:
19255 			 * 1. device detached/attached
19256 			 * 2. link events - link events may trigger device
19257 			 *    detached or device attached events in some
19258 			 *    circumstances.
19259 			 */
19260 			if (event_flags & SATA_EVNT_DEVICE_DETACHED) {
19261 				sata_process_pmdevice_detached(sata_hba_inst,
19262 				    saddr);
19263 			}
19264 			if (event_flags & SATA_EVNT_DEVICE_ATTACHED) {
19265 				sata_process_pmdevice_attached(sata_hba_inst,
19266 				    saddr);
19267 			}
19268 			if (event_flags & SATA_EVNT_LINK_ESTABLISHED ||
19269 			    event_flags & SATA_EVNT_LINK_LOST) {
19270 				sata_process_pmport_link_events(sata_hba_inst,
19271 				    saddr);
19272 			}
19273 			if (event_flags & SATA_EVNT_TARGET_NODE_CLEANUP) {
19274 				sata_process_target_node_cleanup(
19275 				    sata_hba_inst, saddr);
19276 			}
19277 		}
19278 
19279 		/* Checking drive event(s). */
19280 		mutex_enter(&pmportinfo->pmport_mutex);
19281 		if (pmportinfo->pmport_dev_type != SATA_DTYPE_NONE &&
19282 		    pmportinfo->pmport_sata_drive != NULL) {
19283 			event_flags = pmportinfo->pmport_sata_drive->
19284 			    satadrv_event_flags;
19285 			if (event_flags & (SATA_EVNT_DEVICE_RESET |
19286 			    SATA_EVNT_INPROC_DEVICE_RESET)) {
19287 
19288 				/* Have device event */
19289 				sata_process_pmdevice_reset(sata_hba_inst,
19290 				    saddr);
19291 			}
19292 		}
19293 		mutex_exit(&pmportinfo->pmport_mutex);
19294 
19295 		/* Release PORT_BUSY flag */
19296 		mutex_enter(&cportinfo->cport_mutex);
19297 		cportinfo->cport_event_flags &= ~SATA_EVNT_LOCK_PORT_BUSY;
19298 		mutex_exit(&cportinfo->cport_mutex);
19299 	}
19300 
19301 	SATADBG2(SATA_DBG_EVENTS_CNTRL|SATA_DBG_PMULT, sata_hba_inst,
19302 	    "[DONE] pmult event(s) on cport %d of controller %d",
19303 	    cport, ddi_get_instance(SATA_DIP(sata_hba_inst)));
19304 }
19305 
19306 /*
19307  * Process HBA power level change reported by HBA driver.
19308  * Not implemented at this time - event is ignored.
19309  */
19310 static void
sata_process_cntrl_pwr_level_change(sata_hba_inst_t * sata_hba_inst)19311 sata_process_cntrl_pwr_level_change(sata_hba_inst_t *sata_hba_inst)
19312 {
19313 	SATADBG1(SATA_DBG_EVENTS_PROC, sata_hba_inst,
19314 	    "Processing controller power level change", NULL);
19315 
19316 	/* Ignoring it for now */
19317 	mutex_enter(&sata_hba_inst->satahba_mutex);
19318 	sata_hba_inst->satahba_event_flags &= ~SATA_EVNT_PWR_LEVEL_CHANGED;
19319 	mutex_exit(&sata_hba_inst->satahba_mutex);
19320 }
19321 
19322 /*
19323  * Process port power level change reported by HBA driver.
19324  * Not implemented at this time - event is ignored.
19325  */
19326 static void
sata_process_port_pwr_change(sata_hba_inst_t * sata_hba_inst,sata_address_t * saddr)19327 sata_process_port_pwr_change(sata_hba_inst_t *sata_hba_inst,
19328     sata_address_t *saddr)
19329 {
19330 	sata_cport_info_t *cportinfo;
19331 
19332 	SATADBG1(SATA_DBG_EVENTS_PROC, sata_hba_inst,
19333 	    "Processing port power level change", NULL);
19334 
19335 	cportinfo = SATA_CPORT_INFO(sata_hba_inst, saddr->cport);
19336 	mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->cport_mutex);
19337 	/* Reset event flag */
19338 	cportinfo->cport_event_flags &= ~SATA_EVNT_PWR_LEVEL_CHANGED;
19339 	mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->cport_mutex);
19340 }
19341 
19342 /*
19343  * Process port failure reported by HBA driver.
19344  * cports support only - no pmports.
19345  */
19346 static void
sata_process_port_failed_event(sata_hba_inst_t * sata_hba_inst,sata_address_t * saddr)19347 sata_process_port_failed_event(sata_hba_inst_t *sata_hba_inst,
19348     sata_address_t *saddr)
19349 {
19350 	sata_cport_info_t *cportinfo;
19351 
19352 	cportinfo = SATA_CPORT_INFO(sata_hba_inst, saddr->cport);
19353 	mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->cport_mutex);
19354 	/* Reset event flag first */
19355 	cportinfo->cport_event_flags &= ~SATA_EVNT_PORT_FAILED;
19356 	/* If the port is in SHUTDOWN or FAILED state, ignore this event. */
19357 	if ((cportinfo->cport_state &
19358 	    (SATA_PSTATE_SHUTDOWN | SATA_PSTATE_FAILED)) == 0) {
19359 		mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->
19360 		    cport_mutex);
19361 		return;
19362 	}
19363 	/* Fail the port */
19364 	cportinfo->cport_state = SATA_PSTATE_FAILED;
19365 	mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->cport_mutex);
19366 	sata_log(sata_hba_inst, CE_WARN, "SATA port %d failed", saddr->cport);
19367 }
19368 
19369 /*
19370  * Device Reset Event processing.
19371  * The sequence is managed by 3 stage flags:
19372  * - reset event reported,
19373  * - reset event being processed,
19374  * - request to clear device reset state.
19375  *
19376  * NOTE: This function has to be entered with cport mutex held. It exits with
19377  * mutex held as well, but can release mutex during the processing.
19378  */
19379 static void
sata_process_device_reset(sata_hba_inst_t * sata_hba_inst,sata_address_t * saddr)19380 sata_process_device_reset(sata_hba_inst_t *sata_hba_inst,
19381     sata_address_t *saddr)
19382 {
19383 	sata_drive_info_t old_sdinfo; /* local copy of the drive info */
19384 	sata_drive_info_t *sdinfo;
19385 	sata_cport_info_t *cportinfo;
19386 	sata_device_t sata_device;
19387 	int rval_probe, rval_set;
19388 
19389 	/* We only care about host sata cport for now */
19390 	cportinfo = SATA_CPORT_INFO(sata_hba_inst, saddr->cport);
19391 	sdinfo = SATA_CPORT_DRV_INFO(sata_hba_inst, saddr->cport);
19392 	/*
19393 	 * If the port is in SHUTDOWN or FAILED state, or device is in FAILED
19394 	 * state, ignore reset event.
19395 	 */
19396 	if (((cportinfo->cport_state &
19397 	    (SATA_PSTATE_SHUTDOWN | SATA_PSTATE_FAILED)) != 0) ||
19398 	    (sdinfo->satadrv_state & SATA_DSTATE_FAILED) != 0) {
19399 		sdinfo->satadrv_event_flags &=
19400 		    ~(SATA_EVNT_DEVICE_RESET | SATA_EVNT_INPROC_DEVICE_RESET);
19401 		return;
19402 	}
19403 
19404 	if ((SATA_CPORT_DEV_TYPE(sata_hba_inst, saddr->cport) ==
19405 	    SATA_DTYPE_PMULT)) {
19406 		/*
19407 		 * Should not happened: this is already handled in
19408 		 * sata_hba_event_notify()
19409 		 */
19410 		mutex_exit(&cportinfo->cport_mutex);
19411 		goto done;
19412 	}
19413 
19414 	if ((SATA_CPORT_DEV_TYPE(sata_hba_inst, saddr->cport) &
19415 	    SATA_VALID_DEV_TYPE) == 0) {
19416 		/*
19417 		 * This should not happen - coding error.
19418 		 * But we can recover, so do not panic, just clean up
19419 		 * and if in debug mode, log the message.
19420 		 */
19421 #ifdef SATA_DEBUG
19422 		sata_log(sata_hba_inst, CE_WARN,
19423 		    "sata_process_device_reset: "
19424 		    "Invalid device type with sdinfo!", NULL);
19425 #endif
19426 		sdinfo->satadrv_event_flags = 0;
19427 		return;
19428 	}
19429 
19430 #ifdef SATA_DEBUG
19431 	if ((sdinfo->satadrv_event_flags &
19432 	    (SATA_EVNT_DEVICE_RESET | SATA_EVNT_INPROC_DEVICE_RESET)) == 0) {
19433 		/* Nothing to do */
19434 		/* Something is weird - why we are processing dev reset? */
19435 		SATADBG1(SATA_DBG_EVENTS_PROC, sata_hba_inst,
19436 		    "No device reset event!!!!", NULL);
19437 
19438 		return;
19439 	}
19440 	if ((sdinfo->satadrv_event_flags &
19441 	    (SATA_EVNT_DEVICE_RESET | SATA_EVNT_INPROC_DEVICE_RESET)) ==
19442 	    (SATA_EVNT_DEVICE_RESET | SATA_EVNT_INPROC_DEVICE_RESET)) {
19443 		/* Something is weird - new device reset event */
19444 		SATADBG1(SATA_DBG_EVENTS_PROC, sata_hba_inst,
19445 		    "Overlapping device reset events!", NULL);
19446 	}
19447 #endif
19448 	SATADBG1(SATA_DBG_EVENTS_PROC, sata_hba_inst,
19449 	    "Processing port %d device reset", saddr->cport);
19450 
19451 	/* Clear event flag */
19452 	sdinfo->satadrv_event_flags &= ~SATA_EVNT_DEVICE_RESET;
19453 
19454 	/* It seems that we always need to check the port state first */
19455 	sata_device.satadev_rev = SATA_DEVICE_REV;
19456 	sata_device.satadev_addr = *saddr;
19457 	/*
19458 	 * We have to exit mutex, because the HBA probe port function may
19459 	 * block on its own mutex.
19460 	 */
19461 	mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->cport_mutex);
19462 	rval_probe = (*SATA_PROBE_PORT_FUNC(sata_hba_inst))
19463 	    (SATA_DIP(sata_hba_inst), &sata_device);
19464 	mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->cport_mutex);
19465 	sata_update_port_info(sata_hba_inst, &sata_device);
19466 	if (rval_probe != SATA_SUCCESS) {
19467 		/* Something went wrong? Fail the port */
19468 		cportinfo->cport_state = SATA_PSTATE_FAILED;
19469 		sdinfo = SATA_CPORT_DRV_INFO(sata_hba_inst, saddr->cport);
19470 		if (sdinfo != NULL)
19471 			sdinfo->satadrv_event_flags = 0;
19472 		mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->
19473 		    cport_mutex);
19474 		SATA_LOG_D((sata_hba_inst, CE_WARN,
19475 		    "SATA port %d probing failed",
19476 		    saddr->cport));
19477 		mutex_enter(&SATA_CPORT_INFO(sata_hba_inst,
19478 		    saddr->cport)->cport_mutex);
19479 		return;
19480 	}
19481 	if ((sata_device.satadev_scr.sstatus  &
19482 	    SATA_PORT_DEVLINK_UP_MASK) !=
19483 	    SATA_PORT_DEVLINK_UP ||
19484 	    sata_device.satadev_type == SATA_DTYPE_NONE) {
19485 		/*
19486 		 * No device to process, anymore. Some other event processing
19487 		 * would or have already performed port info cleanup.
19488 		 * To be safe (HBA may need it), request clearing device
19489 		 * reset condition.
19490 		 */
19491 		sdinfo = SATA_CPORT_DRV_INFO(sata_hba_inst, saddr->cport);
19492 		if (sdinfo != NULL) {
19493 			sdinfo->satadrv_event_flags &=
19494 			    ~SATA_EVNT_INPROC_DEVICE_RESET;
19495 			sdinfo->satadrv_event_flags |=
19496 			    SATA_EVNT_CLEAR_DEVICE_RESET;
19497 		}
19498 		return;
19499 	}
19500 
19501 	sdinfo = SATA_CPORT_DRV_INFO(sata_hba_inst, saddr->cport);
19502 	if (sdinfo == NULL) {
19503 		return;
19504 	}
19505 	if ((sdinfo->satadrv_event_flags &
19506 	    SATA_EVNT_INPROC_DEVICE_RESET) == 0) {
19507 		/*
19508 		 * Start tracking time for device feature restoration and
19509 		 * identification. Save current time (lbolt value).
19510 		 */
19511 		sdinfo->satadrv_reset_time = ddi_get_lbolt();
19512 	}
19513 	/* Mark device reset processing as active */
19514 	sdinfo->satadrv_event_flags |= SATA_EVNT_INPROC_DEVICE_RESET;
19515 
19516 	old_sdinfo = *sdinfo;	/* local copy of the drive info */
19517 	mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->cport_mutex);
19518 
19519 	rval_set = sata_set_drive_features(sata_hba_inst, &old_sdinfo, 1);
19520 
19521 	if (rval_set  != SATA_SUCCESS) {
19522 		/*
19523 		 * Restoring drive setting failed.
19524 		 * Probe the port first, to check if the port state has changed
19525 		 */
19526 		sata_device.satadev_rev = SATA_DEVICE_REV;
19527 		sata_device.satadev_addr = *saddr;
19528 		sata_device.satadev_addr.qual = SATA_ADDR_CPORT;
19529 		/* probe port */
19530 		rval_probe = (*SATA_PROBE_PORT_FUNC(sata_hba_inst))
19531 		    (SATA_DIP(sata_hba_inst), &sata_device);
19532 		mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->
19533 		    cport_mutex);
19534 		if (rval_probe == SATA_SUCCESS &&
19535 		    (sata_device.satadev_state &
19536 		    (SATA_PSTATE_SHUTDOWN | SATA_PSTATE_FAILED)) == 0 &&
19537 		    (sata_device.satadev_scr.sstatus  &
19538 		    SATA_PORT_DEVLINK_UP_MASK) == SATA_PORT_DEVLINK_UP &&
19539 		    sata_device.satadev_type != SATA_DTYPE_NONE) {
19540 			/*
19541 			 * We may retry this a bit later - in-process reset
19542 			 * condition should be already set.
19543 			 * Track retry time for device identification.
19544 			 */
19545 			if ((cportinfo->cport_dev_type &
19546 			    SATA_VALID_DEV_TYPE) != 0 &&
19547 			    SATA_CPORTINFO_DRV_INFO(cportinfo) != NULL &&
19548 			    sdinfo->satadrv_reset_time != 0) {
19549 				clock_t cur_time = ddi_get_lbolt();
19550 				/*
19551 				 * If the retry time limit was not
19552 				 * exceeded, retry.
19553 				 */
19554 				if ((cur_time - sdinfo->satadrv_reset_time) <
19555 				    drv_usectohz(SATA_DEV_REPROBE_TIMEOUT)) {
19556 					mutex_enter(
19557 					    &sata_hba_inst->satahba_mutex);
19558 					sata_hba_inst->satahba_event_flags |=
19559 					    SATA_EVNT_MAIN;
19560 					mutex_exit(
19561 					    &sata_hba_inst->satahba_mutex);
19562 					mutex_enter(&sata_mutex);
19563 					sata_event_pending |= SATA_EVNT_MAIN;
19564 					mutex_exit(&sata_mutex);
19565 					return;
19566 				}
19567 				if (rval_set == SATA_RETRY) {
19568 					/*
19569 					 * Setting drive features failed, but
19570 					 * the drive is still accessible,
19571 					 * so emit a warning message before
19572 					 * return.
19573 					 */
19574 					mutex_exit(&SATA_CPORT_INFO(
19575 					    sata_hba_inst,
19576 					    saddr->cport)->cport_mutex);
19577 					goto done;
19578 				}
19579 			}
19580 			/* Fail the drive */
19581 			sdinfo->satadrv_state = SATA_DSTATE_FAILED;
19582 
19583 			sata_log(sata_hba_inst, CE_WARN,
19584 			    "SATA device at port %d - device failed",
19585 			    saddr->cport);
19586 
19587 			DTRACE_PROBE(port_failed_f);
19588 		}
19589 		/*
19590 		 * No point of retrying - device failed or some other event
19591 		 * processing or already did or will do port info cleanup.
19592 		 * To be safe (HBA may need it),
19593 		 * request clearing device reset condition.
19594 		 */
19595 		sdinfo->satadrv_event_flags |= SATA_EVNT_CLEAR_DEVICE_RESET;
19596 		sdinfo->satadrv_event_flags &= ~SATA_EVNT_INPROC_DEVICE_RESET;
19597 		sdinfo->satadrv_reset_time = 0;
19598 		return;
19599 	}
19600 done:
19601 	/*
19602 	 * If setting of drive features failed, but the drive is still
19603 	 * accessible, emit a warning message.
19604 	 */
19605 	if (rval_set == SATA_RETRY) {
19606 		sata_log(sata_hba_inst, CE_WARN,
19607 		    "SATA device at port %d - desired setting could not be "
19608 		    "restored after reset. Device may not operate as expected.",
19609 		    saddr->cport);
19610 	}
19611 	/*
19612 	 * Raise the flag indicating that the next sata command could
19613 	 * be sent with SATA_CLEAR_DEV_RESET_STATE flag, if no new device
19614 	 * reset is reported.
19615 	 */
19616 	mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->cport_mutex);
19617 	if (SATA_CPORTINFO_DRV_INFO(cportinfo) != NULL) {
19618 		sdinfo->satadrv_reset_time = 0;
19619 		if ((cportinfo->cport_dev_type & SATA_VALID_DEV_TYPE) != 0) {
19620 			sdinfo = SATA_CPORTINFO_DRV_INFO(cportinfo);
19621 			sdinfo->satadrv_event_flags &=
19622 			    ~SATA_EVNT_INPROC_DEVICE_RESET;
19623 			sdinfo->satadrv_event_flags |=
19624 			    SATA_EVNT_CLEAR_DEVICE_RESET;
19625 		}
19626 	}
19627 }
19628 
19629 
19630 /*
19631  * Port Multiplier Port Device Reset Event processing.
19632  *
19633  * NOTE: This function has to be entered with pmport mutex held. It exits with
19634  * mutex held as well, but can release mutex during the processing.
19635  */
19636 static void
sata_process_pmdevice_reset(sata_hba_inst_t * sata_hba_inst,sata_address_t * saddr)19637 sata_process_pmdevice_reset(sata_hba_inst_t *sata_hba_inst,
19638     sata_address_t *saddr)
19639 {
19640 	sata_drive_info_t old_sdinfo; /* local copy of the drive info */
19641 	sata_drive_info_t *sdinfo = NULL;
19642 	sata_cport_info_t *cportinfo = NULL;
19643 	sata_pmport_info_t *pmportinfo = NULL;
19644 	sata_pmult_info_t *pminfo = NULL;
19645 	sata_device_t sata_device;
19646 	uint8_t cport = saddr->cport;
19647 	uint8_t pmport = saddr->pmport;
19648 	int rval;
19649 
19650 	SATADBG2(SATA_DBG_EVENTS_PROC, sata_hba_inst,
19651 	    "Processing drive reset at port %d:%d", cport, pmport);
19652 
19653 	cportinfo = SATA_CPORT_INFO(sata_hba_inst, cport);
19654 	pmportinfo = SATA_PMPORT_INFO(sata_hba_inst, cport, pmport);
19655 	sdinfo = SATA_PMPORT_DRV_INFO(sata_hba_inst, cport, pmport);
19656 
19657 	/*
19658 	 * If the port is in SHUTDOWN or FAILED state, or device is in FAILED
19659 	 * state, ignore reset event.
19660 	 */
19661 	if (((cportinfo->cport_state &
19662 	    (SATA_PSTATE_SHUTDOWN | SATA_PSTATE_FAILED)) != 0) ||
19663 	    (sdinfo->satadrv_state & SATA_DSTATE_FAILED) != 0) {
19664 		sdinfo->satadrv_event_flags &=
19665 		    ~(SATA_EVNT_DEVICE_RESET | SATA_EVNT_INPROC_DEVICE_RESET);
19666 		return;
19667 	}
19668 
19669 	if ((pmportinfo->pmport_dev_type & SATA_VALID_DEV_TYPE) == 0) {
19670 		/*
19671 		 * This should not happen - coding error.
19672 		 * But we can recover, so do not panic, just clean up
19673 		 * and if in debug mode, log the message.
19674 		 */
19675 #ifdef SATA_DEBUG
19676 		sata_log(sata_hba_inst, CE_WARN,
19677 		    "sata_process_pmdevice_reset: "
19678 		    "Invalid device type with sdinfo!", NULL);
19679 #endif
19680 		sdinfo->satadrv_event_flags = 0;
19681 		return;
19682 	}
19683 
19684 #ifdef SATA_DEBUG
19685 	if ((sdinfo->satadrv_event_flags &
19686 	    (SATA_EVNT_DEVICE_RESET | SATA_EVNT_INPROC_DEVICE_RESET)) == 0) {
19687 		/* Nothing to do */
19688 		/* Something is weird - why we are processing dev reset? */
19689 		SATADBG1(SATA_DBG_EVENTS_PROC, sata_hba_inst,
19690 		    "No device reset event!!!!", NULL);
19691 
19692 		return;
19693 	}
19694 	if ((sdinfo->satadrv_event_flags &
19695 	    (SATA_EVNT_DEVICE_RESET | SATA_EVNT_INPROC_DEVICE_RESET)) ==
19696 	    (SATA_EVNT_DEVICE_RESET | SATA_EVNT_INPROC_DEVICE_RESET)) {
19697 		/* Something is weird - new device reset event */
19698 		SATADBG1(SATA_DBG_EVENTS_PROC, sata_hba_inst,
19699 		    "Overlapping device reset events!", NULL);
19700 	}
19701 #endif
19702 	SATADBG2(SATA_DBG_EVENTS_PROC, sata_hba_inst,
19703 	    "Processing port %d:%d device reset", cport, pmport);
19704 
19705 	/* Clear event flag */
19706 	sdinfo->satadrv_event_flags &= ~SATA_EVNT_DEVICE_RESET;
19707 
19708 	/* It seems that we always need to check the port state first */
19709 	sata_device.satadev_rev = SATA_DEVICE_REV;
19710 	sata_device.satadev_addr = *saddr;
19711 	/*
19712 	 * We have to exit mutex, because the HBA probe port function may
19713 	 * block on its own mutex.
19714 	 */
19715 	mutex_exit(&pmportinfo->pmport_mutex);
19716 	rval = (*SATA_PROBE_PORT_FUNC(sata_hba_inst))
19717 	    (SATA_DIP(sata_hba_inst), &sata_device);
19718 	mutex_enter(&pmportinfo->pmport_mutex);
19719 
19720 	sata_update_pmport_info(sata_hba_inst, &sata_device);
19721 	if (rval != SATA_SUCCESS) {
19722 		/* Something went wrong? Fail the port */
19723 		pmportinfo->pmport_state = SATA_PSTATE_FAILED;
19724 		sdinfo = SATA_PMPORT_DRV_INFO(sata_hba_inst, saddr->cport,
19725 		    saddr->pmport);
19726 		if (sdinfo != NULL)
19727 			sdinfo->satadrv_event_flags = 0;
19728 		mutex_exit(&pmportinfo->pmport_mutex);
19729 		SATA_LOG_D((sata_hba_inst, CE_WARN,
19730 		    "SATA port %d:%d probing failed",
19731 		    saddr->cport, saddr->pmport));
19732 		mutex_enter(&pmportinfo->pmport_mutex);
19733 		return;
19734 	}
19735 	if ((sata_device.satadev_scr.sstatus  &
19736 	    SATA_PORT_DEVLINK_UP_MASK) !=
19737 	    SATA_PORT_DEVLINK_UP ||
19738 	    sata_device.satadev_type == SATA_DTYPE_NONE) {
19739 		/*
19740 		 * No device to process, anymore. Some other event processing
19741 		 * would or have already performed port info cleanup.
19742 		 * To be safe (HBA may need it), request clearing device
19743 		 * reset condition.
19744 		 */
19745 		sdinfo = SATA_PMPORT_DRV_INFO(sata_hba_inst, saddr->cport,
19746 		    saddr->pmport);
19747 		if (sdinfo != NULL) {
19748 			sdinfo->satadrv_event_flags &=
19749 			    ~SATA_EVNT_INPROC_DEVICE_RESET;
19750 			/* must clear flags on cport */
19751 			pminfo = SATA_PMULT_INFO(sata_hba_inst,
19752 			    saddr->cport);
19753 			pminfo->pmult_event_flags |=
19754 			    SATA_EVNT_CLEAR_DEVICE_RESET;
19755 		}
19756 		return;
19757 	}
19758 
19759 	sdinfo = SATA_PMPORT_DRV_INFO(sata_hba_inst, saddr->cport,
19760 	    saddr->pmport);
19761 	if (sdinfo == NULL) {
19762 		return;
19763 	}
19764 	if ((sdinfo->satadrv_event_flags &
19765 	    SATA_EVNT_INPROC_DEVICE_RESET) == 0) {
19766 		/*
19767 		 * Start tracking time for device feature restoration and
19768 		 * identification. Save current time (lbolt value).
19769 		 */
19770 		sdinfo->satadrv_reset_time = ddi_get_lbolt();
19771 	}
19772 	/* Mark device reset processing as active */
19773 	sdinfo->satadrv_event_flags |= SATA_EVNT_INPROC_DEVICE_RESET;
19774 
19775 	old_sdinfo = *sdinfo;	/* local copy of the drive info */
19776 	mutex_exit(&pmportinfo->pmport_mutex);
19777 
19778 	if (sata_set_drive_features(sata_hba_inst, &old_sdinfo, 1) ==
19779 	    SATA_FAILURE) {
19780 		/*
19781 		 * Restoring drive setting failed.
19782 		 * Probe the port first, to check if the port state has changed
19783 		 */
19784 		sata_device.satadev_rev = SATA_DEVICE_REV;
19785 		sata_device.satadev_addr = *saddr;
19786 		sata_device.satadev_addr.qual = SATA_ADDR_PMPORT;
19787 
19788 		/* probe port */
19789 		rval = (*SATA_PROBE_PORT_FUNC(sata_hba_inst))
19790 		    (SATA_DIP(sata_hba_inst), &sata_device);
19791 		mutex_enter(&pmportinfo->pmport_mutex);
19792 		if (rval == SATA_SUCCESS &&
19793 		    (sata_device.satadev_state &
19794 		    (SATA_PSTATE_SHUTDOWN | SATA_PSTATE_FAILED)) == 0 &&
19795 		    (sata_device.satadev_scr.sstatus  &
19796 		    SATA_PORT_DEVLINK_UP_MASK) == SATA_PORT_DEVLINK_UP &&
19797 		    sata_device.satadev_type != SATA_DTYPE_NONE) {
19798 			/*
19799 			 * We may retry this a bit later - in-process reset
19800 			 * condition should be already set.
19801 			 * Track retry time for device identification.
19802 			 */
19803 			if ((pmportinfo->pmport_dev_type &
19804 			    SATA_VALID_DEV_TYPE) != 0 &&
19805 			    SATA_PMPORTINFO_DRV_INFO(pmportinfo) != NULL &&
19806 			    sdinfo->satadrv_reset_time != 0) {
19807 				clock_t cur_time = ddi_get_lbolt();
19808 				/*
19809 				 * If the retry time limit was not
19810 				 * exceeded, retry.
19811 				 */
19812 				if ((cur_time - sdinfo->satadrv_reset_time) <
19813 				    drv_usectohz(SATA_DEV_REPROBE_TIMEOUT)) {
19814 					mutex_enter(
19815 					    &sata_hba_inst->satahba_mutex);
19816 					sata_hba_inst->satahba_event_flags |=
19817 					    SATA_EVNT_MAIN;
19818 					mutex_exit(
19819 					    &sata_hba_inst->satahba_mutex);
19820 					mutex_enter(&sata_mutex);
19821 					sata_event_pending |= SATA_EVNT_MAIN;
19822 					mutex_exit(&sata_mutex);
19823 					return;
19824 				}
19825 			}
19826 			/* Fail the drive */
19827 			sdinfo->satadrv_state = SATA_DSTATE_FAILED;
19828 
19829 			sata_log(sata_hba_inst, CE_WARN,
19830 			    "SATA device at port %d:%d - device failed",
19831 			    saddr->cport, saddr->pmport);
19832 		} else {
19833 			/*
19834 			 * No point of retrying - some other event processing
19835 			 * would or already did port info cleanup.
19836 			 * To be safe (HBA may need it),
19837 			 * request clearing device reset condition.
19838 			 */
19839 			sdinfo->satadrv_event_flags |=
19840 			    SATA_EVNT_CLEAR_DEVICE_RESET;
19841 		}
19842 		sdinfo->satadrv_event_flags &= ~SATA_EVNT_INPROC_DEVICE_RESET;
19843 		sdinfo->satadrv_reset_time = 0;
19844 		return;
19845 	}
19846 	/*
19847 	 * Raise the flag indicating that the next sata command could
19848 	 * be sent with SATA_CLEAR_DEV_RESET_STATE flag, if no new device
19849 	 * reset is reported.
19850 	 */
19851 	mutex_enter(&pmportinfo->pmport_mutex);
19852 	if (SATA_PMPORTINFO_DRV_INFO(pmportinfo) != NULL) {
19853 		sdinfo->satadrv_reset_time = 0;
19854 		if (pmportinfo->pmport_dev_type & SATA_VALID_DEV_TYPE) {
19855 			sdinfo = SATA_PMPORTINFO_DRV_INFO(pmportinfo);
19856 			sdinfo->satadrv_event_flags &=
19857 			    ~SATA_EVNT_INPROC_DEVICE_RESET;
19858 			/* must clear flags on cport */
19859 			pminfo = SATA_PMULT_INFO(sata_hba_inst,
19860 			    saddr->cport);
19861 			pminfo->pmult_event_flags |=
19862 			    SATA_EVNT_CLEAR_DEVICE_RESET;
19863 		}
19864 	}
19865 }
19866 
19867 /*
19868  * Port Link Events processing.
19869  * Every link established event may involve device reset (due to
19870  * COMRESET signal, equivalent of the hard reset) so arbitrarily
19871  * set device reset event for an attached device (if any).
19872  * If the port is in SHUTDOWN or FAILED state, ignore link events.
19873  *
19874  * The link established event processing varies, depending on the state
19875  * of the target node, HBA hotplugging capabilities, state of the port.
19876  * If the link is not active, the link established event is ignored.
19877  * If HBA cannot detect device attachment and there is no target node,
19878  * the link established event triggers device attach event processing.
19879  * Else, link established event triggers device reset event processing.
19880  *
19881  * The link lost event processing varies, depending on a HBA hotplugging
19882  * capability and the state of the port (link active or not active).
19883  * If the link is active, the lost link event is ignored.
19884  * If HBA cannot detect device removal, the lost link event triggers
19885  * device detached event processing after link lost timeout.
19886  * Else, the event is ignored.
19887  *
19888  * NOTE: Port multiplier ports events are handled by
19889  * sata_process_pmport_link_events();
19890  */
19891 static void
sata_process_port_link_events(sata_hba_inst_t * sata_hba_inst,sata_address_t * saddr)19892 sata_process_port_link_events(sata_hba_inst_t *sata_hba_inst,
19893     sata_address_t *saddr)
19894 {
19895 	sata_device_t sata_device;
19896 	sata_cport_info_t *cportinfo;
19897 	sata_drive_info_t *sdinfo;
19898 	uint32_t event_flags;
19899 	int rval;
19900 
19901 	SATADBG1(SATA_DBG_EVENTS_PROC, sata_hba_inst,
19902 	    "Processing port %d link event(s)", saddr->cport);
19903 
19904 	cportinfo = SATA_CPORT_INFO(sata_hba_inst, saddr->cport);
19905 	mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->cport_mutex);
19906 	event_flags = cportinfo->cport_event_flags;
19907 
19908 	/* Reset event flags first */
19909 	cportinfo->cport_event_flags &=
19910 	    ~(SATA_EVNT_LINK_ESTABLISHED | SATA_EVNT_LINK_LOST);
19911 
19912 	/* If the port is in SHUTDOWN or FAILED state, ignore link events. */
19913 	if ((cportinfo->cport_state &
19914 	    (SATA_PSTATE_SHUTDOWN | SATA_PSTATE_FAILED)) != 0) {
19915 		mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->
19916 		    cport_mutex);
19917 		return;
19918 	}
19919 
19920 	/*
19921 	 * For the sanity sake get current port state.
19922 	 * Set device address only. Other sata_device fields should be
19923 	 * set by HBA driver.
19924 	 */
19925 	sata_device.satadev_rev = SATA_DEVICE_REV;
19926 	sata_device.satadev_addr = *saddr;
19927 	/*
19928 	 * We have to exit mutex, because the HBA probe port function may
19929 	 * block on its own mutex.
19930 	 */
19931 	mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->cport_mutex);
19932 	rval = (*SATA_PROBE_PORT_FUNC(sata_hba_inst))
19933 	    (SATA_DIP(sata_hba_inst), &sata_device);
19934 	mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->cport_mutex);
19935 	sata_update_port_info(sata_hba_inst, &sata_device);
19936 	if (rval != SATA_SUCCESS) {
19937 		/* Something went wrong? Fail the port */
19938 		cportinfo->cport_state = SATA_PSTATE_FAILED;
19939 		mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->
19940 		    cport_mutex);
19941 		SATA_LOG_D((sata_hba_inst, CE_WARN,
19942 		    "SATA port %d probing failed",
19943 		    saddr->cport));
19944 		/*
19945 		 * We may want to release device info structure, but
19946 		 * it is not necessary.
19947 		 */
19948 		return;
19949 	} else {
19950 		/* port probed successfully */
19951 		cportinfo->cport_state |= SATA_STATE_PROBED | SATA_STATE_READY;
19952 	}
19953 	if (event_flags & SATA_EVNT_LINK_ESTABLISHED) {
19954 
19955 		if ((sata_device.satadev_scr.sstatus &
19956 		    SATA_PORT_DEVLINK_UP_MASK) != SATA_PORT_DEVLINK_UP) {
19957 			/* Ignore event */
19958 			SATADBG1(SATA_DBG_EVENTS_PROC, sata_hba_inst,
19959 			    "Ignoring port %d link established event - "
19960 			    "link down",
19961 			    saddr->cport);
19962 			goto linklost;
19963 		}
19964 
19965 		SATADBG1(SATA_DBG_EVENTS_PROC, sata_hba_inst,
19966 		    "Processing port %d link established event",
19967 		    saddr->cport);
19968 
19969 		/*
19970 		 * For the sanity sake check if a device is attached - check
19971 		 * return state of a port probing.
19972 		 */
19973 		if (sata_device.satadev_type != SATA_DTYPE_NONE) {
19974 			/*
19975 			 * HBA port probe indicated that there is a device
19976 			 * attached. Check if the framework had device info
19977 			 * structure attached for this device.
19978 			 */
19979 			if (cportinfo->cport_dev_type != SATA_DTYPE_NONE) {
19980 				ASSERT(SATA_CPORTINFO_DRV_INFO(cportinfo) !=
19981 				    NULL);
19982 
19983 				sdinfo = SATA_CPORTINFO_DRV_INFO(cportinfo);
19984 				if ((sdinfo->satadrv_type &
19985 				    SATA_VALID_DEV_TYPE) != 0) {
19986 					/*
19987 					 * Dev info structure is present.
19988 					 * If dev_type is set to known type in
19989 					 * the framework's drive info struct
19990 					 * then the device existed before and
19991 					 * the link was probably lost
19992 					 * momentarily - in such case
19993 					 * we may want to check device
19994 					 * identity.
19995 					 * Identity check is not supported now.
19996 					 *
19997 					 * Link established event
19998 					 * triggers device reset event.
19999 					 */
20000 					(SATA_CPORTINFO_DRV_INFO(cportinfo))->
20001 					    satadrv_event_flags |=
20002 					    SATA_EVNT_DEVICE_RESET;
20003 				}
20004 			} else if (cportinfo->cport_dev_type ==
20005 			    SATA_DTYPE_NONE) {
20006 				/*
20007 				 * We got new device attached! If HBA does not
20008 				 * generate device attached events, trigger it
20009 				 * here.
20010 				 */
20011 				if (!(SATA_FEATURES(sata_hba_inst) &
20012 				    SATA_CTLF_HOTPLUG)) {
20013 					cportinfo->cport_event_flags |=
20014 					    SATA_EVNT_DEVICE_ATTACHED;
20015 				}
20016 			}
20017 			/* Reset link lost timeout */
20018 			cportinfo->cport_link_lost_time = 0;
20019 		}
20020 	}
20021 linklost:
20022 	if (event_flags & SATA_EVNT_LINK_LOST) {
20023 		if ((sata_device.satadev_scr.sstatus &
20024 		    SATA_PORT_DEVLINK_UP_MASK) == SATA_PORT_DEVLINK_UP) {
20025 			/* Ignore event */
20026 			SATADBG1(SATA_DBG_EVENTS_PROC, sata_hba_inst,
20027 			    "Ignoring port %d link lost event - link is up",
20028 			    saddr->cport);
20029 			goto done;
20030 		}
20031 #ifdef SATA_DEBUG
20032 		if (cportinfo->cport_link_lost_time == 0) {
20033 			SATADBG1(SATA_DBG_EVENTS_PROC, sata_hba_inst,
20034 			    "Processing port %d link lost event",
20035 			    saddr->cport);
20036 		}
20037 #endif
20038 		/*
20039 		 * When HBA cannot generate device attached/detached events,
20040 		 * we need to track link lost time and eventually generate
20041 		 * device detach event.
20042 		 */
20043 		if (!(SATA_FEATURES(sata_hba_inst) & SATA_CTLF_HOTPLUG)) {
20044 			/* We are tracking link lost time */
20045 			if (cportinfo->cport_link_lost_time == 0) {
20046 				/* save current time (lbolt value) */
20047 				cportinfo->cport_link_lost_time =
20048 				    ddi_get_lbolt();
20049 				/* just keep link lost event */
20050 				cportinfo->cport_event_flags |=
20051 				    SATA_EVNT_LINK_LOST;
20052 			} else {
20053 				clock_t cur_time = ddi_get_lbolt();
20054 				if ((cur_time -
20055 				    cportinfo->cport_link_lost_time) >=
20056 				    drv_usectohz(
20057 				    SATA_EVNT_LINK_LOST_TIMEOUT)) {
20058 					/* trigger device detach event */
20059 					cportinfo->cport_event_flags |=
20060 					    SATA_EVNT_DEVICE_DETACHED;
20061 					cportinfo->cport_link_lost_time = 0;
20062 					SATADBG1(SATA_DBG_EVENTS,
20063 					    sata_hba_inst,
20064 					    "Triggering port %d "
20065 					    "device detached event",
20066 					    saddr->cport);
20067 				} else {
20068 					/* keep link lost event */
20069 					cportinfo->cport_event_flags |=
20070 					    SATA_EVNT_LINK_LOST;
20071 				}
20072 			}
20073 		}
20074 		/*
20075 		 * We could change port state to disable/delay access to
20076 		 * the attached device until the link is recovered.
20077 		 */
20078 	}
20079 done:
20080 	event_flags = cportinfo->cport_event_flags;
20081 	mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->cport_mutex);
20082 	if (event_flags != 0) {
20083 		mutex_enter(&sata_hba_inst->satahba_mutex);
20084 		sata_hba_inst->satahba_event_flags |= SATA_EVNT_MAIN;
20085 		mutex_exit(&sata_hba_inst->satahba_mutex);
20086 		mutex_enter(&sata_mutex);
20087 		sata_event_pending |= SATA_EVNT_MAIN;
20088 		mutex_exit(&sata_mutex);
20089 	}
20090 }
20091 
20092 /*
20093  * Port Multiplier Port Link Events processing.
20094  */
20095 static void
sata_process_pmport_link_events(sata_hba_inst_t * sata_hba_inst,sata_address_t * saddr)20096 sata_process_pmport_link_events(sata_hba_inst_t *sata_hba_inst,
20097     sata_address_t *saddr)
20098 {
20099 	sata_device_t sata_device;
20100 	sata_pmport_info_t *pmportinfo = NULL;
20101 	sata_drive_info_t *sdinfo = NULL;
20102 	uint32_t event_flags;
20103 	uint8_t cport = saddr->cport;
20104 	uint8_t pmport = saddr->pmport;
20105 	int rval;
20106 
20107 	SATADBG2(SATA_DBG_EVENTS_PROC, sata_hba_inst,
20108 	    "Processing port %d:%d link event(s)",
20109 	    cport, pmport);
20110 
20111 	pmportinfo = SATA_PMPORT_INFO(sata_hba_inst, cport, pmport);
20112 	mutex_enter(&pmportinfo->pmport_mutex);
20113 	event_flags = pmportinfo->pmport_event_flags;
20114 
20115 	/* Reset event flags first */
20116 	pmportinfo->pmport_event_flags &=
20117 	    ~(SATA_EVNT_LINK_ESTABLISHED | SATA_EVNT_LINK_LOST);
20118 
20119 	/* If the port is in SHUTDOWN or FAILED state, ignore link events. */
20120 	if ((pmportinfo->pmport_state &
20121 	    (SATA_PSTATE_SHUTDOWN | SATA_PSTATE_FAILED)) != 0) {
20122 		mutex_exit(&pmportinfo->pmport_mutex);
20123 		return;
20124 	}
20125 
20126 	/*
20127 	 * For the sanity sake get current port state.
20128 	 * Set device address only. Other sata_device fields should be
20129 	 * set by HBA driver.
20130 	 */
20131 	sata_device.satadev_rev = SATA_DEVICE_REV;
20132 	sata_device.satadev_addr = *saddr;
20133 	/*
20134 	 * We have to exit mutex, because the HBA probe port function may
20135 	 * block on its own mutex.
20136 	 */
20137 	mutex_exit(&SATA_PMPORT_MUTEX(sata_hba_inst, saddr->cport,
20138 	    saddr->pmport));
20139 	rval = (*SATA_PROBE_PORT_FUNC(sata_hba_inst))
20140 	    (SATA_DIP(sata_hba_inst), &sata_device);
20141 	mutex_enter(&SATA_PMPORT_MUTEX(sata_hba_inst, saddr->cport,
20142 	    saddr->pmport));
20143 	sata_update_pmport_info(sata_hba_inst, &sata_device);
20144 	if (rval != SATA_SUCCESS) {
20145 		/* Something went wrong? Fail the port */
20146 		pmportinfo->pmport_state = SATA_PSTATE_FAILED;
20147 		mutex_exit(&SATA_PMPORT_MUTEX(sata_hba_inst, saddr->cport,
20148 		    saddr->pmport));
20149 		SATA_LOG_D((sata_hba_inst, CE_WARN,
20150 		    "SATA port %d:%d probing failed",
20151 		    saddr->cport, saddr->pmport));
20152 		/*
20153 		 * We may want to release device info structure, but
20154 		 * it is not necessary.
20155 		 */
20156 		return;
20157 	} else {
20158 		/* port probed successfully */
20159 		pmportinfo->pmport_state |=
20160 		    SATA_STATE_PROBED | SATA_STATE_READY;
20161 	}
20162 	mutex_exit(&SATA_PMPORT_MUTEX(sata_hba_inst,
20163 	    saddr->cport, saddr->pmport));
20164 	mutex_enter(&SATA_PMPORT_MUTEX(sata_hba_inst,
20165 	    saddr->cport, saddr->pmport));
20166 	if (event_flags & SATA_EVNT_LINK_ESTABLISHED) {
20167 
20168 		if ((sata_device.satadev_scr.sstatus &
20169 		    SATA_PORT_DEVLINK_UP_MASK) != SATA_PORT_DEVLINK_UP) {
20170 			/* Ignore event */
20171 			SATADBG2(SATA_DBG_EVENTS_PROC, sata_hba_inst,
20172 			    "Ignoring port %d:%d link established event - "
20173 			    "link down",
20174 			    saddr->cport, saddr->pmport);
20175 			goto linklost;
20176 		}
20177 
20178 		SATADBG2(SATA_DBG_EVENTS_PROC, sata_hba_inst,
20179 		    "Processing port %d:%d link established event",
20180 		    cport, pmport);
20181 
20182 		/*
20183 		 * For the sanity sake check if a device is attached - check
20184 		 * return state of a port probing.
20185 		 */
20186 		if (sata_device.satadev_type != SATA_DTYPE_NONE &&
20187 		    sata_device.satadev_type != SATA_DTYPE_PMULT) {
20188 			/*
20189 			 * HBA port probe indicated that there is a device
20190 			 * attached. Check if the framework had device info
20191 			 * structure attached for this device.
20192 			 */
20193 			if (pmportinfo->pmport_dev_type != SATA_DTYPE_NONE) {
20194 				ASSERT(SATA_PMPORTINFO_DRV_INFO(pmportinfo) !=
20195 				    NULL);
20196 
20197 				sdinfo = SATA_PMPORTINFO_DRV_INFO(pmportinfo);
20198 				if ((sdinfo->satadrv_type &
20199 				    SATA_VALID_DEV_TYPE) != 0) {
20200 					/*
20201 					 * Dev info structure is present.
20202 					 * If dev_type is set to known type in
20203 					 * the framework's drive info struct
20204 					 * then the device existed before and
20205 					 * the link was probably lost
20206 					 * momentarily - in such case
20207 					 * we may want to check device
20208 					 * identity.
20209 					 * Identity check is not supported now.
20210 					 *
20211 					 * Link established event
20212 					 * triggers device reset event.
20213 					 */
20214 					(SATA_PMPORTINFO_DRV_INFO(pmportinfo))->
20215 					    satadrv_event_flags |=
20216 					    SATA_EVNT_DEVICE_RESET;
20217 				}
20218 			} else if (pmportinfo->pmport_dev_type ==
20219 			    SATA_DTYPE_NONE) {
20220 				/*
20221 				 * We got new device attached! If HBA does not
20222 				 * generate device attached events, trigger it
20223 				 * here.
20224 				 */
20225 				if (!(SATA_FEATURES(sata_hba_inst) &
20226 				    SATA_CTLF_HOTPLUG)) {
20227 					pmportinfo->pmport_event_flags |=
20228 					    SATA_EVNT_DEVICE_ATTACHED;
20229 				}
20230 			}
20231 			/* Reset link lost timeout */
20232 			pmportinfo->pmport_link_lost_time = 0;
20233 		}
20234 	}
20235 linklost:
20236 	if (event_flags & SATA_EVNT_LINK_LOST) {
20237 #ifdef SATA_DEBUG
20238 		if (pmportinfo->pmport_link_lost_time == 0) {
20239 			SATADBG2(SATA_DBG_EVENTS_PROC, sata_hba_inst,
20240 			    "Processing port %d:%d link lost event",
20241 			    saddr->cport, saddr->pmport);
20242 		}
20243 #endif
20244 		if ((sata_device.satadev_scr.sstatus &
20245 		    SATA_PORT_DEVLINK_UP_MASK) == SATA_PORT_DEVLINK_UP) {
20246 			/* Ignore event */
20247 			SATADBG2(SATA_DBG_EVENTS_PROC, sata_hba_inst,
20248 			    "Ignoring port %d:%d link lost event - link is up",
20249 			    saddr->cport, saddr->pmport);
20250 			goto done;
20251 		}
20252 		/*
20253 		 * When HBA cannot generate device attached/detached events,
20254 		 * we need to track link lost time and eventually generate
20255 		 * device detach event.
20256 		 */
20257 		if (!(SATA_FEATURES(sata_hba_inst) & SATA_CTLF_HOTPLUG)) {
20258 			/* We are tracking link lost time */
20259 			if (pmportinfo->pmport_link_lost_time == 0) {
20260 				/* save current time (lbolt value) */
20261 				pmportinfo->pmport_link_lost_time =
20262 				    ddi_get_lbolt();
20263 				/* just keep link lost event */
20264 				pmportinfo->pmport_event_flags |=
20265 				    SATA_EVNT_LINK_LOST;
20266 			} else {
20267 				clock_t cur_time = ddi_get_lbolt();
20268 				if ((cur_time -
20269 				    pmportinfo->pmport_link_lost_time) >=
20270 				    drv_usectohz(
20271 				    SATA_EVNT_LINK_LOST_TIMEOUT)) {
20272 					/* trigger device detach event */
20273 					pmportinfo->pmport_event_flags |=
20274 					    SATA_EVNT_DEVICE_DETACHED;
20275 					pmportinfo->pmport_link_lost_time = 0;
20276 					SATADBG2(SATA_DBG_EVENTS,
20277 					    sata_hba_inst,
20278 					    "Triggering port %d:%d "
20279 					    "device detached event",
20280 					    saddr->cport, saddr->pmport);
20281 				} else {
20282 					/* keep link lost event */
20283 					pmportinfo->pmport_event_flags |=
20284 					    SATA_EVNT_LINK_LOST;
20285 				}
20286 			}
20287 		}
20288 		/*
20289 		 * We could change port state to disable/delay access to
20290 		 * the attached device until the link is recovered.
20291 		 */
20292 	}
20293 done:
20294 	event_flags = pmportinfo->pmport_event_flags;
20295 	mutex_exit(&SATA_PMPORT_MUTEX(sata_hba_inst, saddr->cport,
20296 	    saddr->pmport));
20297 	if (event_flags != 0) {
20298 		mutex_enter(&sata_hba_inst->satahba_mutex);
20299 		sata_hba_inst->satahba_event_flags |= SATA_EVNT_MAIN;
20300 		mutex_exit(&sata_hba_inst->satahba_mutex);
20301 		mutex_enter(&sata_mutex);
20302 		sata_event_pending |= SATA_EVNT_MAIN;
20303 		mutex_exit(&sata_mutex);
20304 	}
20305 }
20306 
20307 /*
20308  * Device Detached Event processing.
20309  * Port is probed to find if a device is really gone. If so,
20310  * the device info structure is detached from the SATA port info structure
20311  * and released.
20312  * Port status is updated.
20313  *
20314  * NOTE: Port multiplier ports events are handled by
20315  * sata_process_pmdevice_detached()
20316  */
20317 static void
sata_process_device_detached(sata_hba_inst_t * sata_hba_inst,sata_address_t * saddr)20318 sata_process_device_detached(sata_hba_inst_t *sata_hba_inst,
20319     sata_address_t *saddr)
20320 {
20321 	sata_cport_info_t *cportinfo;
20322 	sata_pmport_info_t *pmportinfo;
20323 	sata_drive_info_t *sdevinfo;
20324 	sata_device_t sata_device;
20325 	sata_address_t pmport_addr;
20326 	char name[16];
20327 	uint8_t cport = saddr->cport;
20328 	int npmport;
20329 	int rval;
20330 
20331 	SATADBG1(SATA_DBG_EVENTS_PROC, sata_hba_inst,
20332 	    "Processing port %d device detached", saddr->cport);
20333 
20334 	cportinfo = SATA_CPORT_INFO(sata_hba_inst, saddr->cport);
20335 	mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->cport_mutex);
20336 	/* Clear event flag */
20337 	cportinfo->cport_event_flags &= ~SATA_EVNT_DEVICE_DETACHED;
20338 
20339 	/* If the port is in SHUTDOWN or FAILED state, ignore detach event. */
20340 	if ((cportinfo->cport_state &
20341 	    (SATA_PSTATE_SHUTDOWN | SATA_PSTATE_FAILED)) != 0) {
20342 		mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->
20343 		    cport_mutex);
20344 		return;
20345 	}
20346 	/* For sanity, re-probe the port */
20347 	sata_device.satadev_rev = SATA_DEVICE_REV;
20348 	sata_device.satadev_addr = *saddr;
20349 
20350 	/*
20351 	 * We have to exit mutex, because the HBA probe port function may
20352 	 * block on its own mutex.
20353 	 */
20354 	mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->cport_mutex);
20355 	rval = (*SATA_PROBE_PORT_FUNC(sata_hba_inst))
20356 	    (SATA_DIP(sata_hba_inst), &sata_device);
20357 	mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->cport_mutex);
20358 	sata_update_port_info(sata_hba_inst, &sata_device);
20359 	if (rval != SATA_SUCCESS) {
20360 		/* Something went wrong? Fail the port */
20361 		cportinfo->cport_state = SATA_PSTATE_FAILED;
20362 		mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->
20363 		    cport_mutex);
20364 		SATA_LOG_D((sata_hba_inst, CE_WARN,
20365 		    "SATA port %d probing failed",
20366 		    saddr->cport));
20367 		/*
20368 		 * We may want to release device info structure, but
20369 		 * it is not necessary.
20370 		 */
20371 		return;
20372 	} else {
20373 		/* port probed successfully */
20374 		cportinfo->cport_state |= SATA_STATE_PROBED | SATA_STATE_READY;
20375 	}
20376 	/*
20377 	 * Check if a device is still attached. For sanity, check also
20378 	 * link status - if no link, there is no device.
20379 	 */
20380 	if ((sata_device.satadev_scr.sstatus & SATA_PORT_DEVLINK_UP_MASK) ==
20381 	    SATA_PORT_DEVLINK_UP && sata_device.satadev_type !=
20382 	    SATA_DTYPE_NONE) {
20383 		/*
20384 		 * Device is still attached - ignore detach event.
20385 		 */
20386 		mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->
20387 		    cport_mutex);
20388 		SATADBG1(SATA_DBG_EVENTS_PROC, sata_hba_inst,
20389 		    "Ignoring detach - device still attached to port %d",
20390 		    sata_device.satadev_addr.cport);
20391 		return;
20392 	}
20393 	/*
20394 	 * We need to detach and release device info structure here
20395 	 */
20396 	if (cportinfo->cport_dev_type == SATA_DTYPE_PMULT) {
20397 		/*
20398 		 * A port-multiplier is removed.
20399 		 *
20400 		 * Calling sata_process_pmdevice_detached() does not work
20401 		 * here. The port multiplier is gone, so we cannot probe
20402 		 * sub-port any more and all pmult-related data structure must
20403 		 * be de-allocated immediately. Following structure of every
20404 		 * implemented sub-port behind the pmult are required to
20405 		 * released.
20406 		 *
20407 		 *   - attachment point
20408 		 *   - target node
20409 		 *   - sata_drive_info
20410 		 *   - sata_pmport_info
20411 		 */
20412 		for (npmport = 0; npmport < SATA_NUM_PMPORTS(sata_hba_inst,
20413 		    cport); npmport ++) {
20414 			SATADBG2(SATA_DBG_PMULT|SATA_DBG_EVENTS_PROC,
20415 			    sata_hba_inst,
20416 			    "Detaching target node at port %d:%d",
20417 			    cport, npmport);
20418 
20419 			mutex_exit(&SATA_CPORT_MUTEX(sata_hba_inst, cport));
20420 
20421 			/* Remove attachment point. */
20422 			name[0] = '\0';
20423 			(void) sprintf(name, "%d.%d", cport, npmport);
20424 			ddi_remove_minor_node(SATA_DIP(sata_hba_inst), name);
20425 			sata_log(sata_hba_inst, CE_NOTE,
20426 			    "Remove attachment point of port %d:%d",
20427 			    cport, npmport);
20428 
20429 			/* Remove target node */
20430 			pmport_addr.cport = cport;
20431 			pmport_addr.pmport = (uint8_t)npmport;
20432 			pmport_addr.qual = SATA_ADDR_PMPORT;
20433 			sata_remove_target_node(sata_hba_inst, &pmport_addr);
20434 
20435 			mutex_enter(&SATA_CPORT_MUTEX(sata_hba_inst, cport));
20436 
20437 			/* Release sata_pmport_info & sata_drive_info. */
20438 			pmportinfo = SATA_PMPORT_INFO(sata_hba_inst,
20439 			    cport, npmport);
20440 			ASSERT(pmportinfo != NULL);
20441 
20442 			sdevinfo = SATA_PMPORTINFO_DRV_INFO(pmportinfo);
20443 			if (sdevinfo != NULL) {
20444 				(void) kmem_free((void *) sdevinfo,
20445 				    sizeof (sata_drive_info_t));
20446 			}
20447 
20448 			/* Release sata_pmport_info at last */
20449 			(void) kmem_free((void *) pmportinfo,
20450 			    sizeof (sata_pmport_info_t));
20451 		}
20452 
20453 		/* Finally, release sata_pmult_info */
20454 		(void) kmem_free((void *)
20455 		    SATA_CPORTINFO_PMULT_INFO(cportinfo),
20456 		    sizeof (sata_pmult_info_t));
20457 		SATA_CPORTINFO_PMULT_INFO(cportinfo) = NULL;
20458 
20459 		sata_log(sata_hba_inst, CE_WARN,
20460 		    "SATA port-multiplier detached at port %d", cport);
20461 
20462 		cportinfo->cport_dev_type = SATA_DTYPE_NONE;
20463 		mutex_exit(&SATA_CPORT_INFO(sata_hba_inst,
20464 		    saddr->cport)->cport_mutex);
20465 	} else {
20466 		if (SATA_CPORTINFO_DRV_INFO(cportinfo) != NULL) {
20467 			sdevinfo = SATA_CPORTINFO_DRV_INFO(cportinfo);
20468 			SATA_CPORTINFO_DRV_INFO(cportinfo) = NULL;
20469 			(void) kmem_free((void *)sdevinfo,
20470 			    sizeof (sata_drive_info_t));
20471 		}
20472 		sata_log(sata_hba_inst, CE_WARN,
20473 		    "SATA device detached at port %d", cport);
20474 
20475 		cportinfo->cport_dev_type = SATA_DTYPE_NONE;
20476 		mutex_exit(&SATA_CPORT_INFO(sata_hba_inst,
20477 		    saddr->cport)->cport_mutex);
20478 
20479 		/*
20480 		 * Try to offline a device and remove target node
20481 		 * if it still exists
20482 		 */
20483 		sata_remove_target_node(sata_hba_inst, saddr);
20484 	}
20485 
20486 
20487 	/*
20488 	 * Generate sysevent - EC_DR / ESC_DR_AP_STATE_CHANGE
20489 	 * with the hint: SE_HINT_REMOVE
20490 	 */
20491 	sata_gen_sysevent(sata_hba_inst, saddr, SE_HINT_REMOVE);
20492 }
20493 
20494 /*
20495  * Port Multiplier Port Device Deattached Event processing.
20496  *
20497  * NOTE: No Mutex should be hold.
20498  */
20499 static void
sata_process_pmdevice_detached(sata_hba_inst_t * sata_hba_inst,sata_address_t * saddr)20500 sata_process_pmdevice_detached(sata_hba_inst_t *sata_hba_inst,
20501     sata_address_t *saddr)
20502 {
20503 	sata_pmport_info_t *pmportinfo;
20504 	sata_drive_info_t *sdevinfo;
20505 	sata_device_t sata_device;
20506 	int rval;
20507 	uint8_t cport, pmport;
20508 
20509 	cport = saddr->cport;
20510 	pmport = saddr->pmport;
20511 
20512 	SATADBG2(SATA_DBG_EVENTS_PROC, sata_hba_inst,
20513 	    "Processing port %d:%d device detached",
20514 	    cport, pmport);
20515 
20516 	pmportinfo = SATA_PMPORT_INFO(sata_hba_inst, cport, pmport);
20517 	mutex_enter(&SATA_PMPORT_MUTEX(sata_hba_inst, cport, pmport));
20518 
20519 	/* Clear event flag */
20520 	pmportinfo->pmport_event_flags &= ~SATA_EVNT_DEVICE_DETACHED;
20521 
20522 	/* If the port is in SHUTDOWN or FAILED state, ignore detach event. */
20523 	if ((pmportinfo->pmport_state &
20524 	    (SATA_PSTATE_SHUTDOWN | SATA_PSTATE_FAILED)) != 0) {
20525 		mutex_exit(&SATA_PMPORT_MUTEX(sata_hba_inst, cport, pmport));
20526 		return;
20527 	}
20528 	/* For sanity, re-probe the port */
20529 	sata_device.satadev_rev = SATA_DEVICE_REV;
20530 	sata_device.satadev_addr = *saddr;
20531 
20532 	/*
20533 	 * We have to exit mutex, because the HBA probe port function may
20534 	 * block on its own mutex.
20535 	 */
20536 	mutex_exit(&SATA_PMPORT_MUTEX(sata_hba_inst, cport, pmport));
20537 	rval = (*SATA_PROBE_PORT_FUNC(sata_hba_inst))
20538 	    (SATA_DIP(sata_hba_inst), &sata_device);
20539 	mutex_enter(&SATA_PMPORT_MUTEX(sata_hba_inst, cport, pmport));
20540 	sata_update_pmport_info(sata_hba_inst, &sata_device);
20541 	if (rval != SATA_SUCCESS) {
20542 		/* Something went wrong? Fail the port */
20543 		pmportinfo->pmport_state = SATA_PSTATE_FAILED;
20544 		mutex_exit(&SATA_PMPORT_MUTEX(sata_hba_inst, cport, pmport));
20545 		SATA_LOG_D((sata_hba_inst, CE_WARN,
20546 		    "SATA port %d:%d probing failed",
20547 		    saddr->pmport));
20548 		/*
20549 		 * We may want to release device info structure, but
20550 		 * it is not necessary.
20551 		 */
20552 		return;
20553 	} else {
20554 		/* port probed successfully */
20555 		pmportinfo->pmport_state |=
20556 		    SATA_STATE_PROBED | SATA_STATE_READY;
20557 	}
20558 	/*
20559 	 * Check if a device is still attached. For sanity, check also
20560 	 * link status - if no link, there is no device.
20561 	 */
20562 	if ((sata_device.satadev_scr.sstatus & SATA_PORT_DEVLINK_UP_MASK) ==
20563 	    SATA_PORT_DEVLINK_UP && sata_device.satadev_type !=
20564 	    SATA_DTYPE_NONE) {
20565 		/*
20566 		 * Device is still attached - ignore detach event.
20567 		 */
20568 		mutex_exit(&SATA_PMPORT_MUTEX(sata_hba_inst, cport, pmport));
20569 		SATADBG1(SATA_DBG_EVENTS_PROC, sata_hba_inst,
20570 		    "Ignoring detach - device still attached to port %d",
20571 		    sata_device.satadev_addr.pmport);
20572 		return;
20573 	}
20574 	/*
20575 	 * We need to detach and release device info structure here
20576 	 */
20577 	if (SATA_PMPORTINFO_DRV_INFO(pmportinfo) != NULL) {
20578 		sdevinfo = SATA_PMPORTINFO_DRV_INFO(pmportinfo);
20579 		SATA_PMPORTINFO_DRV_INFO(pmportinfo) = NULL;
20580 		(void) kmem_free((void *)sdevinfo,
20581 		    sizeof (sata_drive_info_t));
20582 	}
20583 	pmportinfo->pmport_dev_type = SATA_DTYPE_NONE;
20584 	/*
20585 	 * Device cannot be reached anymore, even if the target node may be
20586 	 * still present.
20587 	 */
20588 	mutex_exit(&SATA_PMPORT_MUTEX(sata_hba_inst, cport, pmport));
20589 
20590 	/*
20591 	 * Try to offline a device and remove target node if it still exists
20592 	 */
20593 	sata_remove_target_node(sata_hba_inst, saddr);
20594 
20595 	/*
20596 	 * Generate sysevent - EC_DR / ESC_DR_AP_STATE_CHANGE
20597 	 * with the hint: SE_HINT_REMOVE
20598 	 */
20599 	sata_gen_sysevent(sata_hba_inst, saddr, SE_HINT_REMOVE);
20600 }
20601 
20602 
20603 /*
20604  * Device Attached Event processing.
20605  * Port state is checked to verify that a device is really attached. If so,
20606  * the device info structure is created and attached to the SATA port info
20607  * structure.
20608  *
20609  * If attached device cannot be identified or set-up, the retry for the
20610  * attach processing is set-up. Subsequent daemon run would try again to
20611  * identify the device, until the time limit is reached
20612  * (SATA_DEV_IDENTIFY_TIMEOUT).
20613  *
20614  * This function cannot be called in interrupt context (it may sleep).
20615  *
20616  * NOTE: Port multiplier ports events are handled by
20617  * sata_process_pmdevice_attached()
20618  */
20619 static void
sata_process_device_attached(sata_hba_inst_t * sata_hba_inst,sata_address_t * saddr)20620 sata_process_device_attached(sata_hba_inst_t *sata_hba_inst,
20621     sata_address_t *saddr)
20622 {
20623 	sata_cport_info_t *cportinfo = NULL;
20624 	sata_drive_info_t *sdevinfo = NULL;
20625 	sata_pmult_info_t *pmultinfo = NULL;
20626 	sata_pmport_info_t *pmportinfo = NULL;
20627 	sata_device_t sata_device;
20628 	dev_info_t *tdip;
20629 	uint32_t event_flags = 0, pmult_event_flags = 0;
20630 	int rval;
20631 	int npmport;
20632 
20633 	SATADBG1(SATA_DBG_EVENTS_PROC, sata_hba_inst,
20634 	    "Processing port %d device attached", saddr->cport);
20635 
20636 	cportinfo = SATA_CPORT_INFO(sata_hba_inst, saddr->cport);
20637 	mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->cport_mutex);
20638 
20639 	/* Clear attach event flag first */
20640 	cportinfo->cport_event_flags &= ~SATA_EVNT_DEVICE_ATTACHED;
20641 
20642 	/* If the port is in SHUTDOWN or FAILED state, ignore event. */
20643 	if ((cportinfo->cport_state &
20644 	    (SATA_PSTATE_SHUTDOWN | SATA_PSTATE_FAILED)) != 0) {
20645 		cportinfo->cport_dev_attach_time = 0;
20646 		mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->
20647 		    cport_mutex);
20648 		return;
20649 	}
20650 
20651 	/*
20652 	 * If the sata_drive_info structure is found attached to the port info,
20653 	 * despite the fact the device was removed and now it is re-attached,
20654 	 * the old drive info structure was not removed.
20655 	 * Arbitrarily release device info structure.
20656 	 */
20657 	if (SATA_CPORTINFO_DRV_INFO(cportinfo) != NULL) {
20658 		sdevinfo = SATA_CPORTINFO_DRV_INFO(cportinfo);
20659 		SATA_CPORTINFO_DRV_INFO(cportinfo) = NULL;
20660 		(void) kmem_free((void *)sdevinfo,
20661 		    sizeof (sata_drive_info_t));
20662 		SATADBG1(SATA_DBG_EVENTS_PROC, sata_hba_inst,
20663 		    "Arbitrarily detaching old device info.", NULL);
20664 	}
20665 	cportinfo->cport_dev_type = SATA_DTYPE_NONE;
20666 
20667 	/* For sanity, re-probe the port */
20668 	sata_device.satadev_rev = SATA_DEVICE_REV;
20669 	sata_device.satadev_addr = *saddr;
20670 
20671 	/*
20672 	 * We have to exit mutex, because the HBA probe port function may
20673 	 * block on its own mutex.
20674 	 */
20675 	mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->cport_mutex);
20676 	rval = (*SATA_PROBE_PORT_FUNC(sata_hba_inst))
20677 	    (SATA_DIP(sata_hba_inst), &sata_device);
20678 	mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->cport_mutex);
20679 	sata_update_port_info(sata_hba_inst, &sata_device);
20680 	if (rval != SATA_SUCCESS) {
20681 		/* Something went wrong? Fail the port */
20682 		cportinfo->cport_state = SATA_PSTATE_FAILED;
20683 		cportinfo->cport_dev_attach_time = 0;
20684 		mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->
20685 		    cport_mutex);
20686 		SATA_LOG_D((sata_hba_inst, CE_WARN,
20687 		    "SATA port %d probing failed",
20688 		    saddr->cport));
20689 		return;
20690 	} else {
20691 		/* port probed successfully */
20692 		cportinfo->cport_state |= SATA_STATE_PROBED | SATA_STATE_READY;
20693 	}
20694 	/*
20695 	 * Check if a device is still attached. For sanity, check also
20696 	 * link status - if no link, there is no device.
20697 	 */
20698 	if ((sata_device.satadev_scr.sstatus & SATA_PORT_DEVLINK_UP_MASK) !=
20699 	    SATA_PORT_DEVLINK_UP || sata_device.satadev_type ==
20700 	    SATA_DTYPE_NONE) {
20701 		/*
20702 		 * No device - ignore attach event.
20703 		 */
20704 		cportinfo->cport_dev_attach_time = 0;
20705 		mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->
20706 		    cport_mutex);
20707 		SATADBG1(SATA_DBG_EVENTS_PROC, sata_hba_inst,
20708 		    "Ignoring attach - no device connected to port %d",
20709 		    sata_device.satadev_addr.cport);
20710 		return;
20711 	}
20712 
20713 	mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->cport_mutex);
20714 	/*
20715 	 * Generate sysevent - EC_DR / ESC_DR_AP_STATE_CHANGE
20716 	 * with the hint: SE_HINT_INSERT
20717 	 */
20718 	sata_gen_sysevent(sata_hba_inst, saddr, SE_HINT_INSERT);
20719 
20720 	/*
20721 	 * Port reprobing will take care of the creation of the device
20722 	 * info structure and determination of the device type.
20723 	 */
20724 	sata_device.satadev_addr = *saddr;
20725 	(void) sata_reprobe_port(sata_hba_inst, &sata_device,
20726 	    SATA_DEV_IDENTIFY_NORETRY);
20727 
20728 	mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->
20729 	    cport_mutex);
20730 	if ((cportinfo->cport_state & SATA_STATE_READY) &&
20731 	    (cportinfo->cport_dev_type != SATA_DTYPE_NONE)) {
20732 		/* Some device is attached to the port */
20733 		if (cportinfo->cport_dev_type == SATA_DTYPE_UNKNOWN) {
20734 			/*
20735 			 * A device was not successfully attached.
20736 			 * Track retry time for device identification.
20737 			 */
20738 			if (cportinfo->cport_dev_attach_time != 0) {
20739 				clock_t cur_time = ddi_get_lbolt();
20740 				/*
20741 				 * If the retry time limit was not exceeded,
20742 				 * reinstate attach event.
20743 				 */
20744 				if ((cur_time -
20745 				    cportinfo->cport_dev_attach_time) <
20746 				    drv_usectohz(
20747 				    SATA_DEV_IDENTIFY_TIMEOUT)) {
20748 					/* OK, restore attach event */
20749 					cportinfo->cport_event_flags |=
20750 					    SATA_EVNT_DEVICE_ATTACHED;
20751 				} else {
20752 					/* Timeout - cannot identify device */
20753 					cportinfo->cport_dev_attach_time = 0;
20754 					sata_log(sata_hba_inst,
20755 					    CE_WARN,
20756 					    "Could not identify SATA device "
20757 					    "at port %d",
20758 					    saddr->cport);
20759 				}
20760 			} else {
20761 				/*
20762 				 * Start tracking time for device
20763 				 * identification.
20764 				 * Save current time (lbolt value).
20765 				 */
20766 				cportinfo->cport_dev_attach_time =
20767 				    ddi_get_lbolt();
20768 				/* Restore attach event */
20769 				cportinfo->cport_event_flags |=
20770 				    SATA_EVNT_DEVICE_ATTACHED;
20771 			}
20772 		} else if (cportinfo->cport_dev_type == SATA_DTYPE_PMULT) {
20773 			cportinfo->cport_dev_attach_time = 0;
20774 			sata_log(sata_hba_inst, CE_NOTE,
20775 			    "SATA port-multiplier detected at port %d",
20776 			    saddr->cport);
20777 
20778 			if (SATA_CPORTINFO_PMULT_INFO(cportinfo) != NULL) {
20779 				/* Log the info of new port multiplier */
20780 				mutex_exit(&SATA_CPORT_INFO(sata_hba_inst,
20781 				    saddr->cport)->cport_mutex);
20782 				sata_show_pmult_info(sata_hba_inst,
20783 				    &sata_device);
20784 				mutex_enter(&SATA_CPORT_INFO(sata_hba_inst,
20785 				    saddr->cport)->cport_mutex);
20786 			}
20787 
20788 			ASSERT(SATA_CPORTINFO_PMULT_INFO(cportinfo) != NULL);
20789 			pmultinfo = SATA_CPORTINFO_PMULT_INFO(cportinfo);
20790 			for (npmport = 0; npmport <
20791 			    pmultinfo->pmult_num_dev_ports; npmport++) {
20792 				pmportinfo = SATA_PMPORT_INFO(sata_hba_inst,
20793 				    saddr->cport, npmport);
20794 				ASSERT(pmportinfo != NULL);
20795 
20796 				mutex_exit(&SATA_CPORT_INFO(sata_hba_inst,
20797 				    saddr->cport)->cport_mutex);
20798 				mutex_enter(&pmportinfo->pmport_mutex);
20799 				/* Marked all pmports with link events. */
20800 				pmportinfo->pmport_event_flags =
20801 				    SATA_EVNT_LINK_ESTABLISHED;
20802 				pmult_event_flags |=
20803 				    pmportinfo->pmport_event_flags;
20804 				mutex_exit(&pmportinfo->pmport_mutex);
20805 				mutex_enter(&SATA_CPORT_INFO(sata_hba_inst,
20806 				    saddr->cport)->cport_mutex);
20807 			}
20808 			/* Auto-online is not available for PMult now. */
20809 
20810 		} else {
20811 			/*
20812 			 * If device was successfully attached, the subsequent
20813 			 * action depends on a state of the
20814 			 * sata_auto_online variable. If it is set to zero.
20815 			 * an explicit 'configure' command will be needed to
20816 			 * configure it. If its value is non-zero, we will
20817 			 * attempt to online (configure) the device.
20818 			 * First, log the message indicating that a device
20819 			 * was attached.
20820 			 */
20821 			cportinfo->cport_dev_attach_time = 0;
20822 			sata_log(sata_hba_inst, CE_WARN,
20823 			    "SATA device detected at port %d", saddr->cport);
20824 
20825 			if (SATA_CPORTINFO_DRV_INFO(cportinfo) != NULL) {
20826 				sata_drive_info_t new_sdinfo;
20827 
20828 				/* Log device info data */
20829 				new_sdinfo = *(SATA_CPORTINFO_DRV_INFO(
20830 				    cportinfo));
20831 				sata_show_drive_info(sata_hba_inst,
20832 				    &new_sdinfo);
20833 			}
20834 
20835 			mutex_exit(&SATA_CPORT_INFO(sata_hba_inst,
20836 			    saddr->cport)->cport_mutex);
20837 
20838 			/*
20839 			 * Make sure that there is no target node for that
20840 			 * device. If so, release it. It should not happen,
20841 			 * unless we had problem removing the node when
20842 			 * device was detached.
20843 			 */
20844 			tdip = sata_get_target_dip(SATA_DIP(sata_hba_inst),
20845 			    saddr->cport, saddr->pmport);
20846 			mutex_enter(&SATA_CPORT_INFO(sata_hba_inst,
20847 			    saddr->cport)->cport_mutex);
20848 			if (tdip != NULL) {
20849 
20850 #ifdef SATA_DEBUG
20851 				if ((cportinfo->cport_event_flags &
20852 				    SATA_EVNT_TARGET_NODE_CLEANUP) == 0)
20853 					sata_log(sata_hba_inst, CE_WARN,
20854 					    "sata_process_device_attached: "
20855 					    "old device target node exists!");
20856 #endif
20857 				/*
20858 				 * target node exists - try to unconfigure
20859 				 * device and remove the node.
20860 				 */
20861 				mutex_exit(&SATA_CPORT_INFO(sata_hba_inst,
20862 				    saddr->cport)->cport_mutex);
20863 				rval = ndi_devi_offline(tdip,
20864 				    NDI_DEVI_REMOVE);
20865 				mutex_enter(&SATA_CPORT_INFO(sata_hba_inst,
20866 				    saddr->cport)->cport_mutex);
20867 
20868 				if (rval == NDI_SUCCESS) {
20869 					cportinfo->cport_event_flags &=
20870 					    ~SATA_EVNT_TARGET_NODE_CLEANUP;
20871 					cportinfo->cport_tgtnode_clean = B_TRUE;
20872 				} else {
20873 					/*
20874 					 * PROBLEM - the target node remained
20875 					 * and it belongs to a previously
20876 					 * attached device.
20877 					 * This happens when the file was open
20878 					 * or the node was waiting for
20879 					 * resources at the time the
20880 					 * associated device was removed.
20881 					 * Instruct event daemon to retry the
20882 					 * cleanup later.
20883 					 */
20884 					sata_log(sata_hba_inst,
20885 					    CE_WARN,
20886 					    "Application(s) accessing "
20887 					    "previously attached SATA "
20888 					    "device have to release "
20889 					    "it before newly inserted "
20890 					    "device can be made accessible.",
20891 					    saddr->cport);
20892 					cportinfo->cport_event_flags |=
20893 					    SATA_EVNT_TARGET_NODE_CLEANUP;
20894 					cportinfo->cport_tgtnode_clean =
20895 					    B_FALSE;
20896 				}
20897 			}
20898 			if (sata_auto_online != 0) {
20899 				cportinfo->cport_event_flags |=
20900 				    SATA_EVNT_AUTOONLINE_DEVICE;
20901 			}
20902 
20903 		}
20904 	} else {
20905 		cportinfo->cport_dev_attach_time = 0;
20906 	}
20907 
20908 	event_flags = cportinfo->cport_event_flags;
20909 	mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->cport_mutex);
20910 	if (event_flags != 0 || pmult_event_flags != 0) {
20911 		mutex_enter(&sata_hba_inst->satahba_mutex);
20912 		sata_hba_inst->satahba_event_flags |= SATA_EVNT_MAIN;
20913 		mutex_exit(&sata_hba_inst->satahba_mutex);
20914 		mutex_enter(&sata_mutex);
20915 		sata_event_pending |= SATA_EVNT_MAIN;
20916 		mutex_exit(&sata_mutex);
20917 	}
20918 }
20919 
20920 /*
20921  * Port Multiplier Port Device Attached Event processing.
20922  *
20923  * NOTE: No Mutex should be hold.
20924  */
20925 static void
sata_process_pmdevice_attached(sata_hba_inst_t * sata_hba_inst,sata_address_t * saddr)20926 sata_process_pmdevice_attached(sata_hba_inst_t *sata_hba_inst,
20927     sata_address_t *saddr)
20928 {
20929 	sata_pmport_info_t *pmportinfo;
20930 	sata_drive_info_t *sdinfo;
20931 	sata_device_t sata_device;
20932 	dev_info_t *tdip;
20933 	uint32_t event_flags;
20934 	uint8_t cport = saddr->cport;
20935 	uint8_t pmport = saddr->pmport;
20936 	int rval;
20937 
20938 	SATADBG2(SATA_DBG_EVENTS_PROC, sata_hba_inst,
20939 	    "Processing port %d:%d device attached", cport, pmport);
20940 
20941 	pmportinfo = SATA_PMPORT_INFO(sata_hba_inst, cport, pmport);
20942 
20943 	mutex_enter(&pmportinfo->pmport_mutex);
20944 
20945 	/* Clear attach event flag first */
20946 	pmportinfo->pmport_event_flags &= ~SATA_EVNT_DEVICE_ATTACHED;
20947 
20948 	/* If the port is in SHUTDOWN or FAILED state, ignore event. */
20949 	if ((pmportinfo->pmport_state &
20950 	    (SATA_PSTATE_SHUTDOWN | SATA_PSTATE_FAILED)) != 0) {
20951 		pmportinfo->pmport_dev_attach_time = 0;
20952 		mutex_exit(&pmportinfo->pmport_mutex);
20953 		return;
20954 	}
20955 
20956 	/*
20957 	 * If the sata_drive_info structure is found attached to the port info,
20958 	 * despite the fact the device was removed and now it is re-attached,
20959 	 * the old drive info structure was not removed.
20960 	 * Arbitrarily release device info structure.
20961 	 */
20962 	if (SATA_PMPORTINFO_DRV_INFO(pmportinfo) != NULL) {
20963 		sdinfo = SATA_PMPORTINFO_DRV_INFO(pmportinfo);
20964 		SATA_PMPORTINFO_DRV_INFO(pmportinfo) = NULL;
20965 		(void) kmem_free((void *)sdinfo,
20966 		    sizeof (sata_drive_info_t));
20967 		SATADBG1(SATA_DBG_EVENTS_PROC, sata_hba_inst,
20968 		    "Arbitrarily detaching old device info.", NULL);
20969 	}
20970 	pmportinfo->pmport_dev_type = SATA_DTYPE_NONE;
20971 
20972 	/* For sanity, re-probe the port */
20973 	sata_device.satadev_rev = SATA_DEVICE_REV;
20974 	sata_device.satadev_addr = *saddr;
20975 
20976 	/*
20977 	 * We have to exit mutex, because the HBA probe port function may
20978 	 * block on its own mutex.
20979 	 */
20980 	mutex_exit(&pmportinfo->pmport_mutex);
20981 	rval = (*SATA_PROBE_PORT_FUNC(sata_hba_inst))
20982 	    (SATA_DIP(sata_hba_inst), &sata_device);
20983 	mutex_enter(&pmportinfo->pmport_mutex);
20984 
20985 	sata_update_pmport_info(sata_hba_inst, &sata_device);
20986 	if (rval != SATA_SUCCESS) {
20987 		/* Something went wrong? Fail the port */
20988 		pmportinfo->pmport_state = SATA_PSTATE_FAILED;
20989 		pmportinfo->pmport_dev_attach_time = 0;
20990 		mutex_exit(&pmportinfo->pmport_mutex);
20991 		SATA_LOG_D((sata_hba_inst, CE_WARN,
20992 		    "SATA port %d:%d probing failed", cport, pmport));
20993 		return;
20994 	} else {
20995 		/* pmport probed successfully */
20996 		pmportinfo->pmport_state |=
20997 		    SATA_STATE_PROBED | SATA_STATE_READY;
20998 	}
20999 	/*
21000 	 * Check if a device is still attached. For sanity, check also
21001 	 * link status - if no link, there is no device.
21002 	 */
21003 	if ((sata_device.satadev_scr.sstatus & SATA_PORT_DEVLINK_UP_MASK) !=
21004 	    SATA_PORT_DEVLINK_UP || sata_device.satadev_type ==
21005 	    SATA_DTYPE_NONE) {
21006 		/*
21007 		 * No device - ignore attach event.
21008 		 */
21009 		pmportinfo->pmport_dev_attach_time = 0;
21010 		mutex_exit(&pmportinfo->pmport_mutex);
21011 		SATADBG2(SATA_DBG_EVENTS_PROC, sata_hba_inst,
21012 		    "Ignoring attach - no device connected to port %d:%d",
21013 		    cport, pmport);
21014 		return;
21015 	}
21016 
21017 	mutex_exit(&pmportinfo->pmport_mutex);
21018 	/*
21019 	 * Generate sysevent - EC_DR / ESC_DR_AP_STATE_CHANGE
21020 	 * with the hint: SE_HINT_INSERT
21021 	 */
21022 	sata_gen_sysevent(sata_hba_inst, saddr, SE_HINT_INSERT);
21023 
21024 	/*
21025 	 * Port reprobing will take care of the creation of the device
21026 	 * info structure and determination of the device type.
21027 	 */
21028 	sata_device.satadev_addr = *saddr;
21029 	(void) sata_reprobe_port(sata_hba_inst, &sata_device,
21030 	    SATA_DEV_IDENTIFY_NORETRY);
21031 
21032 	mutex_enter(&pmportinfo->pmport_mutex);
21033 	if ((pmportinfo->pmport_state & SATA_STATE_READY) &&
21034 	    (pmportinfo->pmport_dev_type != SATA_DTYPE_NONE)) {
21035 		/* Some device is attached to the port */
21036 		if (pmportinfo->pmport_dev_type == SATA_DTYPE_UNKNOWN) {
21037 			/*
21038 			 * A device was not successfully attached.
21039 			 * Track retry time for device identification.
21040 			 */
21041 			if (pmportinfo->pmport_dev_attach_time != 0) {
21042 				clock_t cur_time = ddi_get_lbolt();
21043 				/*
21044 				 * If the retry time limit was not exceeded,
21045 				 * reinstate attach event.
21046 				 */
21047 				if ((cur_time -
21048 				    pmportinfo->pmport_dev_attach_time) <
21049 				    drv_usectohz(
21050 				    SATA_DEV_IDENTIFY_TIMEOUT)) {
21051 					/* OK, restore attach event */
21052 					pmportinfo->pmport_event_flags |=
21053 					    SATA_EVNT_DEVICE_ATTACHED;
21054 				} else {
21055 					/* Timeout - cannot identify device */
21056 					pmportinfo->pmport_dev_attach_time = 0;
21057 					sata_log(sata_hba_inst, CE_WARN,
21058 					    "Could not identify SATA device "
21059 					    "at port %d:%d",
21060 					    cport, pmport);
21061 				}
21062 			} else {
21063 				/*
21064 				 * Start tracking time for device
21065 				 * identification.
21066 				 * Save current time (lbolt value).
21067 				 */
21068 				pmportinfo->pmport_dev_attach_time =
21069 				    ddi_get_lbolt();
21070 				/* Restore attach event */
21071 				pmportinfo->pmport_event_flags |=
21072 				    SATA_EVNT_DEVICE_ATTACHED;
21073 			}
21074 		} else {
21075 			/*
21076 			 * If device was successfully attached, the subsequent
21077 			 * action depends on a state of the
21078 			 * sata_auto_online variable. If it is set to zero.
21079 			 * an explicit 'configure' command will be needed to
21080 			 * configure it. If its value is non-zero, we will
21081 			 * attempt to online (configure) the device.
21082 			 * First, log the message indicating that a device
21083 			 * was attached.
21084 			 */
21085 			pmportinfo->pmport_dev_attach_time = 0;
21086 			sata_log(sata_hba_inst, CE_WARN,
21087 			    "SATA device detected at port %d:%d",
21088 			    cport, pmport);
21089 
21090 			if (SATA_PMPORTINFO_DRV_INFO(pmportinfo) != NULL) {
21091 				sata_drive_info_t new_sdinfo;
21092 
21093 				/* Log device info data */
21094 				new_sdinfo = *(SATA_PMPORTINFO_DRV_INFO(
21095 				    pmportinfo));
21096 				sata_show_drive_info(sata_hba_inst,
21097 				    &new_sdinfo);
21098 			}
21099 
21100 			mutex_exit(&pmportinfo->pmport_mutex);
21101 
21102 			/*
21103 			 * Make sure that there is no target node for that
21104 			 * device. If so, release it. It should not happen,
21105 			 * unless we had problem removing the node when
21106 			 * device was detached.
21107 			 */
21108 			tdip = sata_get_target_dip(SATA_DIP(sata_hba_inst),
21109 			    saddr->cport, saddr->pmport);
21110 			mutex_enter(&pmportinfo->pmport_mutex);
21111 			if (tdip != NULL) {
21112 
21113 #ifdef SATA_DEBUG
21114 				if ((pmportinfo->pmport_event_flags &
21115 				    SATA_EVNT_TARGET_NODE_CLEANUP) == 0)
21116 					sata_log(sata_hba_inst, CE_WARN,
21117 					    "sata_process_device_attached: "
21118 					    "old device target node exists!");
21119 #endif
21120 				/*
21121 				 * target node exists - try to unconfigure
21122 				 * device and remove the node.
21123 				 */
21124 				mutex_exit(&pmportinfo->pmport_mutex);
21125 				rval = ndi_devi_offline(tdip,
21126 				    NDI_DEVI_REMOVE);
21127 				mutex_enter(&pmportinfo->pmport_mutex);
21128 
21129 				if (rval == NDI_SUCCESS) {
21130 					pmportinfo->pmport_event_flags &=
21131 					    ~SATA_EVNT_TARGET_NODE_CLEANUP;
21132 					pmportinfo->pmport_tgtnode_clean =
21133 					    B_TRUE;
21134 				} else {
21135 					/*
21136 					 * PROBLEM - the target node remained
21137 					 * and it belongs to a previously
21138 					 * attached device.
21139 					 * This happens when the file was open
21140 					 * or the node was waiting for
21141 					 * resources at the time the
21142 					 * associated device was removed.
21143 					 * Instruct event daemon to retry the
21144 					 * cleanup later.
21145 					 */
21146 					sata_log(sata_hba_inst,
21147 					    CE_WARN,
21148 					    "Application(s) accessing "
21149 					    "previously attached SATA "
21150 					    "device have to release "
21151 					    "it before newly inserted "
21152 					    "device can be made accessible."
21153 					    "at port %d:%d",
21154 					    cport, pmport);
21155 					pmportinfo->pmport_event_flags |=
21156 					    SATA_EVNT_TARGET_NODE_CLEANUP;
21157 					pmportinfo->pmport_tgtnode_clean =
21158 					    B_FALSE;
21159 				}
21160 			}
21161 			if (sata_auto_online != 0) {
21162 				pmportinfo->pmport_event_flags |=
21163 				    SATA_EVNT_AUTOONLINE_DEVICE;
21164 			}
21165 
21166 		}
21167 	} else {
21168 		pmportinfo->pmport_dev_attach_time = 0;
21169 	}
21170 
21171 	event_flags = pmportinfo->pmport_event_flags;
21172 	mutex_exit(&pmportinfo->pmport_mutex);
21173 	if (event_flags != 0) {
21174 		mutex_enter(&sata_hba_inst->satahba_mutex);
21175 		sata_hba_inst->satahba_event_flags |= SATA_EVNT_MAIN;
21176 		mutex_exit(&sata_hba_inst->satahba_mutex);
21177 		mutex_enter(&sata_mutex);
21178 		sata_event_pending |= SATA_EVNT_MAIN;
21179 		mutex_exit(&sata_mutex);
21180 	}
21181 
21182 	/* clear the reset_in_progress events */
21183 	if (SATA_PMPORTINFO_DRV_INFO(pmportinfo) != NULL) {
21184 		if (pmportinfo->pmport_dev_type & SATA_VALID_DEV_TYPE) {
21185 			/* must clear flags on cport */
21186 			sata_pmult_info_t *pminfo =
21187 			    SATA_PMULT_INFO(sata_hba_inst,
21188 			    saddr->cport);
21189 			pminfo->pmult_event_flags |=
21190 			    SATA_EVNT_CLEAR_DEVICE_RESET;
21191 		}
21192 	}
21193 }
21194 
21195 /*
21196  * Device Target Node Cleanup Event processing.
21197  * If the target node associated with a sata port device is in
21198  * DEVI_DEVICE_REMOVED state, an attempt is made to remove it.
21199  * If the target node cannot be removed, the event flag is left intact,
21200  * so that event daemon may re-run this function later.
21201  *
21202  * This function cannot be called in interrupt context (it may sleep).
21203  *
21204  * NOTE: Processes cport events only, not port multiplier ports.
21205  */
21206 static void
sata_process_target_node_cleanup(sata_hba_inst_t * sata_hba_inst,sata_address_t * saddr)21207 sata_process_target_node_cleanup(sata_hba_inst_t *sata_hba_inst,
21208     sata_address_t *saddr)
21209 {
21210 	sata_cport_info_t *cportinfo;
21211 	dev_info_t *tdip;
21212 
21213 	SATADBG1(SATA_DBG_EVENTS_PROC, sata_hba_inst,
21214 	    "Processing port %d device target node cleanup", saddr->cport);
21215 
21216 	cportinfo = SATA_CPORT_INFO(sata_hba_inst, saddr->cport);
21217 
21218 	/*
21219 	 * Check if there is target node for that device and it is in the
21220 	 * DEVI_DEVICE_REMOVED state. If so, release it.
21221 	 */
21222 	tdip = sata_get_target_dip(SATA_DIP(sata_hba_inst), saddr->cport,
21223 	    saddr->pmport);
21224 	if (tdip != NULL) {
21225 		/*
21226 		 * target node exists - check if it is target node of
21227 		 * a removed device.
21228 		 */
21229 		if (sata_check_device_removed(tdip) == B_TRUE) {
21230 			SATADBG1(SATA_DBG_EVENTS_PROC, sata_hba_inst,
21231 			    "sata_process_target_node_cleanup: "
21232 			    "old device target node exists!", NULL);
21233 			/*
21234 			 * Unconfigure and remove the target node
21235 			 */
21236 			if (ndi_devi_offline(tdip, NDI_DEVI_REMOVE) ==
21237 			    NDI_SUCCESS) {
21238 				mutex_enter(&SATA_CPORT_INFO(sata_hba_inst,
21239 				    saddr->cport)->cport_mutex);
21240 				cportinfo->cport_event_flags &=
21241 				    ~SATA_EVNT_TARGET_NODE_CLEANUP;
21242 				mutex_exit(&SATA_CPORT_INFO(sata_hba_inst,
21243 				    saddr->cport)->cport_mutex);
21244 				return;
21245 			}
21246 			/*
21247 			 * Event daemon will retry the cleanup later.
21248 			 */
21249 			mutex_enter(&sata_hba_inst->satahba_mutex);
21250 			sata_hba_inst->satahba_event_flags |= SATA_EVNT_MAIN;
21251 			mutex_exit(&sata_hba_inst->satahba_mutex);
21252 			mutex_enter(&sata_mutex);
21253 			sata_event_pending |= SATA_EVNT_MAIN;
21254 			mutex_exit(&sata_mutex);
21255 		}
21256 	} else {
21257 		if (saddr->qual == SATA_ADDR_CPORT ||
21258 		    saddr->qual == SATA_ADDR_DCPORT) {
21259 			mutex_enter(&SATA_CPORT_INFO(sata_hba_inst,
21260 			    saddr->cport)->cport_mutex);
21261 			cportinfo->cport_event_flags &=
21262 			    ~SATA_EVNT_TARGET_NODE_CLEANUP;
21263 			mutex_exit(&SATA_CPORT_INFO(sata_hba_inst,
21264 			    saddr->cport)->cport_mutex);
21265 		} else {
21266 			/* sanity check */
21267 			if (SATA_CPORT_DEV_TYPE(sata_hba_inst, saddr->cport) !=
21268 			    SATA_DTYPE_PMULT || SATA_PMULT_INFO(sata_hba_inst,
21269 			    saddr->cport) == NULL)
21270 				return;
21271 			if (SATA_PMPORT_INFO(sata_hba_inst, saddr->cport,
21272 			    saddr->pmport) == NULL)
21273 				return;
21274 
21275 			mutex_enter(&SATA_PMPORT_INFO(sata_hba_inst,
21276 			    saddr->cport, saddr->pmport)->pmport_mutex);
21277 			SATA_PMPORT_INFO(sata_hba_inst, saddr->cport,
21278 			    saddr->pmport)->pmport_event_flags &=
21279 			    ~SATA_EVNT_TARGET_NODE_CLEANUP;
21280 			mutex_exit(&SATA_PMPORT_INFO(sata_hba_inst,
21281 			    saddr->cport, saddr->pmport)->pmport_mutex);
21282 		}
21283 	}
21284 }
21285 
21286 /*
21287  * Device AutoOnline Event processing.
21288  * If attached device is to be onlined, an attempt is made to online this
21289  * device, but only if there is no lingering (old) target node present.
21290  * If the device cannot be onlined, the event flag is left intact,
21291  * so that event daemon may re-run this function later.
21292  *
21293  * This function cannot be called in interrupt context (it may sleep).
21294  *
21295  * NOTE: Processes cport events only, not port multiplier ports.
21296  */
21297 static void
sata_process_device_autoonline(sata_hba_inst_t * sata_hba_inst,sata_address_t * saddr)21298 sata_process_device_autoonline(sata_hba_inst_t *sata_hba_inst,
21299     sata_address_t *saddr)
21300 {
21301 	sata_cport_info_t *cportinfo;
21302 	sata_drive_info_t *sdinfo;
21303 	sata_device_t sata_device;
21304 	dev_info_t *tdip;
21305 
21306 	SATADBG1(SATA_DBG_EVENTS_PROC, sata_hba_inst,
21307 	    "Processing port %d attached device auto-onlining", saddr->cport);
21308 
21309 	cportinfo = SATA_CPORT_INFO(sata_hba_inst, saddr->cport);
21310 
21311 	/*
21312 	 * Check if device is present and recognized. If not, reset event.
21313 	 */
21314 	mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->cport_mutex);
21315 	if ((cportinfo->cport_dev_type & SATA_VALID_DEV_TYPE) == 0) {
21316 		/* Nothing to online */
21317 		cportinfo->cport_event_flags &= ~SATA_EVNT_AUTOONLINE_DEVICE;
21318 		mutex_exit(&SATA_CPORT_INFO(sata_hba_inst,
21319 		    saddr->cport)->cport_mutex);
21320 		return;
21321 	}
21322 	mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->cport_mutex);
21323 
21324 	/*
21325 	 * Check if there is target node for this device and if it is in the
21326 	 * DEVI_DEVICE_REMOVED state. If so, abort onlining but keep
21327 	 * the event for later processing.
21328 	 */
21329 	tdip = sata_get_target_dip(SATA_DIP(sata_hba_inst), saddr->cport,
21330 	    saddr->pmport);
21331 	if (tdip != NULL) {
21332 		/*
21333 		 * target node exists - check if it is target node of
21334 		 * a removed device.
21335 		 */
21336 		if (sata_check_device_removed(tdip) == B_TRUE) {
21337 			SATADBG1(SATA_DBG_EVENTS_PROC, sata_hba_inst,
21338 			    "sata_process_device_autoonline: "
21339 			    "old device target node exists!", NULL);
21340 			/*
21341 			 * Event daemon will retry device onlining later.
21342 			 */
21343 			mutex_enter(&sata_hba_inst->satahba_mutex);
21344 			sata_hba_inst->satahba_event_flags |= SATA_EVNT_MAIN;
21345 			mutex_exit(&sata_hba_inst->satahba_mutex);
21346 			mutex_enter(&sata_mutex);
21347 			sata_event_pending |= SATA_EVNT_MAIN;
21348 			mutex_exit(&sata_mutex);
21349 			return;
21350 		}
21351 		/*
21352 		 * If the target node is not in the 'removed" state, assume
21353 		 * that it belongs to this device. There is nothing more to do,
21354 		 * but reset the event.
21355 		 */
21356 	} else {
21357 
21358 		/*
21359 		 * Try to online the device
21360 		 * If there is any reset-related event, remove it. We are
21361 		 * configuring the device and no state restoring is needed.
21362 		 */
21363 		mutex_enter(&SATA_CPORT_INFO(sata_hba_inst,
21364 		    saddr->cport)->cport_mutex);
21365 		sata_device.satadev_addr = *saddr;
21366 		if (saddr->qual == SATA_ADDR_CPORT)
21367 			sata_device.satadev_addr.qual = SATA_ADDR_DCPORT;
21368 		else
21369 			sata_device.satadev_addr.qual = SATA_ADDR_DPMPORT;
21370 		sdinfo = sata_get_device_info(sata_hba_inst, &sata_device);
21371 		if (sdinfo != NULL) {
21372 			if (sdinfo->satadrv_event_flags &
21373 			    (SATA_EVNT_DEVICE_RESET |
21374 			    SATA_EVNT_INPROC_DEVICE_RESET))
21375 				sdinfo->satadrv_event_flags = 0;
21376 			sdinfo->satadrv_event_flags |=
21377 			    SATA_EVNT_CLEAR_DEVICE_RESET;
21378 
21379 			/* Need to create a new target node. */
21380 			cportinfo->cport_tgtnode_clean = B_TRUE;
21381 			mutex_exit(&SATA_CPORT_INFO(sata_hba_inst,
21382 			    saddr->cport)->cport_mutex);
21383 			tdip = sata_create_target_node(SATA_DIP(sata_hba_inst),
21384 			    sata_hba_inst, &sata_device.satadev_addr);
21385 			if (tdip == NULL) {
21386 				/*
21387 				 * Configure (onlining) failed.
21388 				 * We will NOT retry
21389 				 */
21390 				SATA_LOG_D((sata_hba_inst, CE_WARN,
21391 				    "sata_process_device_autoonline: "
21392 				    "configuring SATA device at port %d failed",
21393 				    saddr->cport));
21394 			}
21395 		} else {
21396 			mutex_exit(&SATA_CPORT_INFO(sata_hba_inst,
21397 			    saddr->cport)->cport_mutex);
21398 		}
21399 
21400 	}
21401 	mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->cport_mutex);
21402 	cportinfo->cport_event_flags &= ~SATA_EVNT_AUTOONLINE_DEVICE;
21403 	mutex_exit(&SATA_CPORT_INFO(sata_hba_inst,
21404 	    saddr->cport)->cport_mutex);
21405 }
21406 
21407 
21408 static void
sata_gen_sysevent(sata_hba_inst_t * sata_hba_inst,sata_address_t * saddr,int hint)21409 sata_gen_sysevent(sata_hba_inst_t *sata_hba_inst, sata_address_t *saddr,
21410     int hint)
21411 {
21412 	char ap[MAXPATHLEN];
21413 	nvlist_t *ev_attr_list = NULL;
21414 	int err;
21415 
21416 	/* Allocate and build sysevent attribute list */
21417 	err = nvlist_alloc(&ev_attr_list, NV_UNIQUE_NAME_TYPE, DDI_NOSLEEP);
21418 	if (err != 0) {
21419 		SATA_LOG_D((sata_hba_inst, CE_WARN,
21420 		    "sata_gen_sysevent: "
21421 		    "cannot allocate memory for sysevent attributes\n"));
21422 		return;
21423 	}
21424 	/* Add hint attribute */
21425 	err = nvlist_add_string(ev_attr_list, DR_HINT, SE_HINT2STR(hint));
21426 	if (err != 0) {
21427 		SATA_LOG_D((sata_hba_inst, CE_WARN,
21428 		    "sata_gen_sysevent: "
21429 		    "failed to add DR_HINT attr for sysevent"));
21430 		nvlist_free(ev_attr_list);
21431 		return;
21432 	}
21433 	/*
21434 	 * Add AP attribute.
21435 	 * Get controller pathname and convert it into AP pathname by adding
21436 	 * a target number.
21437 	 */
21438 	(void) snprintf(ap, MAXPATHLEN, "/devices");
21439 	(void) ddi_pathname(SATA_DIP(sata_hba_inst), ap + strlen(ap));
21440 	(void) snprintf(ap + strlen(ap), MAXPATHLEN - strlen(ap), ":%d",
21441 	    SATA_MAKE_AP_NUMBER(saddr->cport, saddr->pmport, saddr->qual));
21442 
21443 	err = nvlist_add_string(ev_attr_list, DR_AP_ID, ap);
21444 	if (err != 0) {
21445 		SATA_LOG_D((sata_hba_inst, CE_WARN,
21446 		    "sata_gen_sysevent: "
21447 		    "failed to add DR_AP_ID attr for sysevent"));
21448 		nvlist_free(ev_attr_list);
21449 		return;
21450 	}
21451 
21452 	/* Generate/log sysevent */
21453 	err = ddi_log_sysevent(SATA_DIP(sata_hba_inst), DDI_VENDOR_SUNW, EC_DR,
21454 	    ESC_DR_AP_STATE_CHANGE, ev_attr_list, NULL, DDI_NOSLEEP);
21455 	if (err != DDI_SUCCESS) {
21456 		SATA_LOG_D((sata_hba_inst, CE_WARN,
21457 		    "sata_gen_sysevent: "
21458 		    "cannot log sysevent, err code %x\n", err));
21459 	}
21460 
21461 	nvlist_free(ev_attr_list);
21462 }
21463 
21464 
21465 
21466 
21467 /*
21468  * Set DEVI_DEVICE_REMOVED state in the SATA device target node.
21469  */
21470 static void
sata_set_device_removed(dev_info_t * tdip)21471 sata_set_device_removed(dev_info_t *tdip)
21472 {
21473 	ASSERT(tdip != NULL);
21474 
21475 	ndi_devi_enter(tdip);
21476 	mutex_enter(&DEVI(tdip)->devi_lock);
21477 	DEVI_SET_DEVICE_REMOVED(tdip);
21478 	mutex_exit(&DEVI(tdip)->devi_lock);
21479 	ndi_devi_exit(tdip);
21480 }
21481 
21482 
21483 /*
21484  * Set internal event instructing event daemon to try
21485  * to perform the target node cleanup.
21486  */
21487 static void
sata_set_target_node_cleanup(sata_hba_inst_t * sata_hba_inst,sata_address_t * saddr)21488 sata_set_target_node_cleanup(sata_hba_inst_t *sata_hba_inst,
21489     sata_address_t *saddr)
21490 {
21491 	if (saddr->qual == SATA_ADDR_CPORT ||
21492 	    saddr->qual == SATA_ADDR_DCPORT) {
21493 		mutex_enter(&SATA_CPORT_INFO(sata_hba_inst,
21494 		    saddr->cport)->cport_mutex);
21495 		SATA_CPORT_EVENT_FLAGS(sata_hba_inst, saddr->cport) |=
21496 		    SATA_EVNT_TARGET_NODE_CLEANUP;
21497 		SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->
21498 		    cport_tgtnode_clean = B_FALSE;
21499 		mutex_exit(&SATA_CPORT_INFO(sata_hba_inst,
21500 		    saddr->cport)->cport_mutex);
21501 	} else {
21502 		mutex_enter(&SATA_PMPORT_INFO(sata_hba_inst,
21503 		    saddr->cport, saddr->pmport)->pmport_mutex);
21504 		SATA_PMPORT_EVENT_FLAGS(sata_hba_inst, saddr->cport,
21505 		    saddr->pmport) |= SATA_EVNT_TARGET_NODE_CLEANUP;
21506 		SATA_PMPORT_INFO(sata_hba_inst, saddr->cport, saddr->pmport)->
21507 		    pmport_tgtnode_clean = B_FALSE;
21508 		mutex_exit(&SATA_PMPORT_INFO(sata_hba_inst,
21509 		    saddr->cport, saddr->pmport)->pmport_mutex);
21510 	}
21511 	mutex_enter(&sata_hba_inst->satahba_mutex);
21512 	sata_hba_inst->satahba_event_flags |= SATA_EVNT_MAIN;
21513 	mutex_exit(&sata_hba_inst->satahba_mutex);
21514 	mutex_enter(&sata_mutex);
21515 	sata_event_pending |= SATA_EVNT_MAIN;
21516 	mutex_exit(&sata_mutex);
21517 }
21518 
21519 
21520 /*
21521  * Check if the SATA device target node is in DEVI_DEVICE_REMOVED state,
21522  * i.e. check if the target node state indicates that it belongs to a removed
21523  * device.
21524  *
21525  * Returns B_TRUE if the target node is in DEVI_DEVICE_REMOVED state,
21526  * B_FALSE otherwise.
21527  */
21528 static boolean_t
sata_check_device_removed(dev_info_t * tdip)21529 sata_check_device_removed(dev_info_t *tdip)
21530 {
21531 	ASSERT(tdip != NULL);
21532 
21533 	if (DEVI_IS_DEVICE_REMOVED(tdip))
21534 		return (B_TRUE);
21535 	else
21536 		return (B_FALSE);
21537 }
21538 
21539 
21540 /*
21541  * Check for DMA error. Return B_TRUE if error, B_FALSE otherwise.
21542  */
21543 static boolean_t
sata_check_for_dma_error(dev_info_t * dip,sata_pkt_txlate_t * spx)21544 sata_check_for_dma_error(dev_info_t *dip, sata_pkt_txlate_t *spx)
21545 {
21546 	int fm_capability = ddi_fm_capable(dip);
21547 	ddi_fm_error_t de;
21548 
21549 	if (fm_capability & DDI_FM_DMACHK_CAPABLE) {
21550 		if (spx->txlt_buf_dma_handle != NULL) {
21551 			ddi_fm_dma_err_get(spx->txlt_buf_dma_handle, &de,
21552 			    DDI_FME_VERSION);
21553 			if (de.fme_status != DDI_SUCCESS)
21554 				return (B_TRUE);
21555 		}
21556 	}
21557 	return (B_FALSE);
21558 }
21559 
21560 
21561 /* ************************ FAULT INJECTTION **************************** */
21562 
21563 #ifdef SATA_INJECT_FAULTS
21564 
21565 static	uint32_t sata_fault_count = 0;
21566 static	uint32_t sata_fault_suspend_count = 0;
21567 
21568 /*
21569  * Inject sata pkt fault
21570  * It modifies returned values of the sata packet.
21571  * It returns immediately if:
21572  * pkt fault injection is not enabled (via sata_inject_fault,
21573  * sata_inject_fault_count), or invalid fault is specified (sata_fault_type),
21574  * or pkt does not contain command to be faulted (set in sata_fault_cmd), or
21575  * pkt is not directed to specified fault controller/device
21576  * (sata_fault_ctrl_dev and sata_fault_device).
21577  * If fault controller is not specified, fault injection applies to all
21578  * controllers and devices.
21579  *
21580  * First argument is the pointer to the executed sata packet.
21581  * Second argument is a pointer to a value returned by the HBA tran_start
21582  * function.
21583  * Third argument specifies injected error. Injected sata packet faults
21584  * are the satapkt_reason values.
21585  * SATA_PKT_BUSY		-1	Not completed, busy
21586  * SATA_PKT_DEV_ERROR		1	Device reported error
21587  * SATA_PKT_QUEUE_FULL		2	Not accepted, queue full
21588  * SATA_PKT_PORT_ERROR		3	Not completed, port error
21589  * SATA_PKT_CMD_UNSUPPORTED	4	Cmd unsupported
21590  * SATA_PKT_ABORTED		5	Aborted by request
21591  * SATA_PKT_TIMEOUT		6	Operation timeut
21592  * SATA_PKT_RESET		7	Aborted by reset request
21593  *
21594  * Additional global variables affecting the execution:
21595  *
21596  * sata_inject_fault_count variable specifies number of times in row the
21597  * error is injected. Value of -1 specifies permanent fault, ie. every time
21598  * the fault injection point is reached, the fault is injected and a pause
21599  * between fault injection specified by sata_inject_fault_pause_count is
21600  * ignored). Fault injection routine decrements sata_inject_fault_count
21601  * (if greater than zero) until it reaches 0. No fault is injected when
21602  * sata_inject_fault_count is 0 (zero).
21603  *
21604  * sata_inject_fault_pause_count variable specifies number of times a fault
21605  * injection is bypassed (pause between fault injections).
21606  * If set to 0, a fault is injected only a number of times specified by
21607  * sata_inject_fault_count.
21608  *
21609  * The fault counts are static, so for periodic errors they have to be manually
21610  * reset to start repetition sequence from scratch.
21611  * If the original value returned by the HBA tran_start function is not
21612  * SATA_TRAN_ACCEPTED and pkt reason is not SATA_PKT_COMPLETED, no error
21613  * is injected (to avoid masking real problems);
21614  *
21615  * NOTE: In its current incarnation, this function should be invoked only for
21616  * commands executed in SYNCHRONOUS mode.
21617  */
21618 
21619 
21620 static void
sata_inject_pkt_fault(sata_pkt_t * spkt,int * rval,int fault)21621 sata_inject_pkt_fault(sata_pkt_t *spkt, int *rval, int fault)
21622 {
21623 
21624 	if (sata_inject_fault != SATA_INJECT_PKT_FAULT)
21625 		return;
21626 
21627 	if (sata_inject_fault_count == 0)
21628 		return;
21629 
21630 	if (fault == 0)
21631 		return;
21632 
21633 	if (sata_fault_cmd != spkt->satapkt_cmd.satacmd_cmd_reg)
21634 		return;
21635 
21636 	if (sata_fault_ctrl != NULL) {
21637 		sata_pkt_txlate_t *spx =
21638 		    (sata_pkt_txlate_t *)spkt->satapkt_framework_private;
21639 
21640 		if (sata_fault_ctrl != NULL && sata_fault_ctrl !=
21641 		    spx->txlt_sata_hba_inst->satahba_dip)
21642 			return;
21643 
21644 		if (sata_fault_device.satadev_addr.cport !=
21645 		    spkt->satapkt_device.satadev_addr.cport ||
21646 		    sata_fault_device.satadev_addr.pmport !=
21647 		    spkt->satapkt_device.satadev_addr.pmport ||
21648 		    sata_fault_device.satadev_addr.qual !=
21649 		    spkt->satapkt_device.satadev_addr.qual)
21650 			return;
21651 	}
21652 
21653 	/* Modify pkt return parameters */
21654 	if (*rval != SATA_TRAN_ACCEPTED ||
21655 	    spkt->satapkt_reason != SATA_PKT_COMPLETED) {
21656 		sata_fault_count = 0;
21657 		sata_fault_suspend_count = 0;
21658 		return;
21659 	}
21660 	if (sata_fault_count == 0 && sata_fault_suspend_count != 0) {
21661 		/* Pause in the injection */
21662 		sata_fault_suspend_count -= 1;
21663 		return;
21664 	}
21665 
21666 	if (sata_fault_count == 0 && sata_fault_suspend_count == 0) {
21667 		/*
21668 		 * Init inject fault cycle. If fault count is set to -1,
21669 		 * it is a permanent fault.
21670 		 */
21671 		if (sata_inject_fault_count != -1) {
21672 			sata_fault_count = sata_inject_fault_count;
21673 			sata_fault_suspend_count =
21674 			    sata_inject_fault_pause_count;
21675 			if (sata_fault_suspend_count == 0)
21676 				sata_inject_fault_count = 0;
21677 		}
21678 	}
21679 
21680 	if (sata_fault_count != 0)
21681 		sata_fault_count -= 1;
21682 
21683 	switch (fault) {
21684 	case SATA_PKT_BUSY:
21685 		*rval = SATA_TRAN_BUSY;
21686 		spkt->satapkt_reason = SATA_PKT_BUSY;
21687 		break;
21688 
21689 	case SATA_PKT_QUEUE_FULL:
21690 		*rval = SATA_TRAN_QUEUE_FULL;
21691 		spkt->satapkt_reason = SATA_PKT_QUEUE_FULL;
21692 		break;
21693 
21694 	case SATA_PKT_CMD_UNSUPPORTED:
21695 		*rval = SATA_TRAN_CMD_UNSUPPORTED;
21696 		spkt->satapkt_reason = SATA_PKT_CMD_UNSUPPORTED;
21697 		break;
21698 
21699 	case SATA_PKT_PORT_ERROR:
21700 		/* This is "rejected" command */
21701 		*rval = SATA_TRAN_PORT_ERROR;
21702 		spkt->satapkt_reason = SATA_PKT_PORT_ERROR;
21703 		/* Additional error setup could be done here - port state */
21704 		break;
21705 
21706 	case SATA_PKT_DEV_ERROR:
21707 		spkt->satapkt_reason = SATA_PKT_DEV_ERROR;
21708 		/*
21709 		 * Additional error setup could be done here
21710 		 */
21711 		break;
21712 
21713 	case SATA_PKT_ABORTED:
21714 		spkt->satapkt_reason = SATA_PKT_ABORTED;
21715 		break;
21716 
21717 	case SATA_PKT_TIMEOUT:
21718 		spkt->satapkt_reason = SATA_PKT_TIMEOUT;
21719 		/* Additional error setup could be done here */
21720 		break;
21721 
21722 	case SATA_PKT_RESET:
21723 		spkt->satapkt_reason = SATA_PKT_RESET;
21724 		/*
21725 		 * Additional error setup could be done here - device reset
21726 		 */
21727 		break;
21728 
21729 	default:
21730 		break;
21731 	}
21732 }
21733 
21734 #endif
21735 
21736 /*
21737  * SATA Trace Ring Buffer
21738  * ----------------------
21739  *
21740  * Overview
21741  *
21742  * The SATA trace ring buffer is a ring buffer created and managed by
21743  * the SATA framework module that can be used by any module or driver
21744  * within the SATA framework to store debug messages.
21745  *
21746  * Ring Buffer Interfaces:
21747  *
21748  *	sata_vtrace_debug()	<-- Adds debug message to ring buffer
21749  *	sata_trace_debug()	<-- Wraps varargs into sata_vtrace_debug()
21750  *
21751  *	Note that the sata_trace_debug() interface was created to give
21752  *	consumers the flexibilty of sending debug messages to ring buffer
21753  *	as variable arguments.  Consumers can send type va_list debug
21754  *	messages directly to sata_vtrace_debug(). The sata_trace_debug()
21755  *	and sata_vtrace_debug() relationship is similar to that of
21756  *	cmn_err(9F) and vcmn_err(9F).
21757  *
21758  * Below is a diagram of the SATA trace ring buffer interfaces and
21759  * sample consumers:
21760  *
21761  * +---------------------------------+
21762  * |    o  o  SATA Framework Module  |
21763  * | o  SATA  o     +------------------+      +------------------+
21764  * |o   Trace  o <--|sata_vtrace_debug/|<-----|SATA HBA Driver #1|
21765  * |o   R-Buf  o    |sata_trace_debug  |<--+  +------------------+
21766  * | o        o     +------------------+   |  +------------------+
21767  * |    o  o                ^        |     +--|SATA HBA Driver #2|
21768  * |                        |        |        +------------------+
21769  * |           +------------------+  |
21770  * |           |SATA Debug Message|  |
21771  * |           +------------------+  |
21772  * +---------------------------------+
21773  *
21774  * Supporting Routines:
21775  *
21776  *	sata_trace_rbuf_alloc()	<-- Initializes ring buffer
21777  *	sata_trace_rbuf_free()	<-- Destroys ring buffer
21778  *	sata_trace_dmsg_alloc() <-- Creates or reuses buffer in ring buffer
21779  *	sata_trace_dmsg_free()	<-- Destroys content of ring buffer
21780  *
21781  * The default SATA trace ring buffer size is defined by DMSG_RING_SIZE.
21782  * The ring buffer size can be adjusted by setting dmsg_ring_size in
21783  * /etc/system to desired size in unit of bytes.
21784  *
21785  * The individual debug message size in the ring buffer is restricted
21786  * to DMSG_BUF_SIZE.
21787  */
21788 void
sata_vtrace_debug(dev_info_t * dip,const char * fmt,va_list ap)21789 sata_vtrace_debug(dev_info_t *dip, const char *fmt, va_list ap)
21790 {
21791 	sata_trace_dmsg_t *dmsg;
21792 
21793 	if (sata_debug_rbuf == NULL) {
21794 		return;
21795 	}
21796 
21797 	/*
21798 	 * If max size of ring buffer is smaller than size
21799 	 * required for one debug message then just return
21800 	 * since we have no room for the debug message.
21801 	 */
21802 	if (sata_debug_rbuf->maxsize < (sizeof (sata_trace_dmsg_t))) {
21803 		return;
21804 	}
21805 
21806 	mutex_enter(&sata_debug_rbuf->lock);
21807 
21808 	/* alloc or reuse on ring buffer */
21809 	dmsg = sata_trace_dmsg_alloc();
21810 
21811 	if (dmsg == NULL) {
21812 		/* resource allocation failed */
21813 		mutex_exit(&sata_debug_rbuf->lock);
21814 		return;
21815 	}
21816 
21817 	dmsg->dip = dip;
21818 	gethrestime(&dmsg->timestamp);
21819 
21820 	(void) vsnprintf(dmsg->buf, sizeof (dmsg->buf), fmt, ap);
21821 
21822 	mutex_exit(&sata_debug_rbuf->lock);
21823 }
21824 
21825 void
sata_trace_debug(dev_info_t * dip,const char * fmt,...)21826 sata_trace_debug(dev_info_t *dip, const char *fmt, ...)
21827 {
21828 	va_list ap;
21829 
21830 	va_start(ap, fmt);
21831 	sata_vtrace_debug(dip, fmt, ap);
21832 	va_end(ap);
21833 }
21834 
21835 /*
21836  * This routine is used to manage debug messages
21837  * on ring buffer.
21838  */
21839 static sata_trace_dmsg_t *
sata_trace_dmsg_alloc(void)21840 sata_trace_dmsg_alloc(void)
21841 {
21842 	sata_trace_dmsg_t *dmsg_alloc, *dmsg = sata_debug_rbuf->dmsgp;
21843 
21844 	if (sata_debug_rbuf->looped == TRUE) {
21845 		sata_debug_rbuf->dmsgp = dmsg->next;
21846 		return (sata_debug_rbuf->dmsgp);
21847 	}
21848 
21849 	/*
21850 	 * If we're looping for the first time,
21851 	 * connect the ring.
21852 	 */
21853 	if (((sata_debug_rbuf->size + (sizeof (sata_trace_dmsg_t))) >
21854 	    sata_debug_rbuf->maxsize) && (sata_debug_rbuf->dmsgh != NULL)) {
21855 		dmsg->next = sata_debug_rbuf->dmsgh;
21856 		sata_debug_rbuf->dmsgp = sata_debug_rbuf->dmsgh;
21857 		sata_debug_rbuf->looped = TRUE;
21858 		return (sata_debug_rbuf->dmsgp);
21859 	}
21860 
21861 	/* If we've gotten this far then memory allocation is needed */
21862 	dmsg_alloc = kmem_zalloc(sizeof (sata_trace_dmsg_t), KM_NOSLEEP);
21863 	if (dmsg_alloc == NULL) {
21864 		sata_debug_rbuf->allocfailed++;
21865 		return (dmsg_alloc);
21866 	} else {
21867 		sata_debug_rbuf->size += sizeof (sata_trace_dmsg_t);
21868 	}
21869 
21870 	if (sata_debug_rbuf->dmsgp != NULL) {
21871 		dmsg->next = dmsg_alloc;
21872 		sata_debug_rbuf->dmsgp = dmsg->next;
21873 		return (sata_debug_rbuf->dmsgp);
21874 	} else {
21875 		/*
21876 		 * We should only be here if we're initializing
21877 		 * the ring buffer.
21878 		 */
21879 		if (sata_debug_rbuf->dmsgh == NULL) {
21880 			sata_debug_rbuf->dmsgh = dmsg_alloc;
21881 		} else {
21882 			/* Something is wrong */
21883 			kmem_free(dmsg_alloc, sizeof (sata_trace_dmsg_t));
21884 			return (NULL);
21885 		}
21886 
21887 		sata_debug_rbuf->dmsgp = dmsg_alloc;
21888 		return (sata_debug_rbuf->dmsgp);
21889 	}
21890 }
21891 
21892 
21893 /*
21894  * Free all messages on debug ring buffer.
21895  */
21896 static void
sata_trace_dmsg_free(void)21897 sata_trace_dmsg_free(void)
21898 {
21899 	sata_trace_dmsg_t *dmsg_next, *dmsg = sata_debug_rbuf->dmsgh;
21900 
21901 	while (dmsg != NULL) {
21902 		dmsg_next = dmsg->next;
21903 		kmem_free(dmsg, sizeof (sata_trace_dmsg_t));
21904 
21905 		/*
21906 		 * If we've looped around the ring than we're done.
21907 		 */
21908 		if (dmsg_next == sata_debug_rbuf->dmsgh) {
21909 			break;
21910 		} else {
21911 			dmsg = dmsg_next;
21912 		}
21913 	}
21914 }
21915 
21916 
21917 /*
21918  * This function can block
21919  */
21920 static void
sata_trace_rbuf_alloc(void)21921 sata_trace_rbuf_alloc(void)
21922 {
21923 	sata_debug_rbuf = kmem_zalloc(sizeof (sata_trace_rbuf_t), KM_SLEEP);
21924 
21925 	mutex_init(&sata_debug_rbuf->lock, NULL, MUTEX_DRIVER, NULL);
21926 
21927 	if (dmsg_ring_size > 0) {
21928 		sata_debug_rbuf->maxsize = (size_t)dmsg_ring_size;
21929 	}
21930 }
21931 
21932 
21933 static void
sata_trace_rbuf_free(void)21934 sata_trace_rbuf_free(void)
21935 {
21936 	sata_trace_dmsg_free();
21937 	mutex_destroy(&sata_debug_rbuf->lock);
21938 	kmem_free(sata_debug_rbuf, sizeof (sata_trace_rbuf_t));
21939 }
21940 
21941 #ifndef SATA_DEBUG
21942 /*
21943  * If SATA_DEBUG is not defined then this routine is called instead
21944  * of sata_log() via the SATA_LOG_D macro.
21945  */
21946 static void
sata_trace_log(sata_hba_inst_t * sata_hba_inst,uint_t level __unused,const char * fmt,...)21947 sata_trace_log(sata_hba_inst_t *sata_hba_inst, uint_t level __unused,
21948     const char *fmt, ...)
21949 {
21950 	dev_info_t *dip = NULL;
21951 	va_list ap;
21952 
21953 	if (sata_hba_inst != NULL) {
21954 		dip = SATA_DIP(sata_hba_inst);
21955 	}
21956 
21957 	va_start(ap, fmt);
21958 	sata_vtrace_debug(dip, fmt, ap);
21959 	va_end(ap);
21960 }
21961 
21962 #endif /* SATA_DEBUG */
21963