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 int sata_txlt_request_sense(sata_pkt_txlate_t *);
221 static int sata_txlt_read(sata_pkt_txlate_t *);
222 static int sata_txlt_write(sata_pkt_txlate_t *);
223 static int sata_txlt_log_sense(sata_pkt_txlate_t *);
224 static int sata_txlt_log_select(sata_pkt_txlate_t *);
225 static int sata_txlt_mode_sense(sata_pkt_txlate_t *);
226 static int sata_txlt_mode_select(sata_pkt_txlate_t *);
227 static int sata_txlt_ata_pass_thru(sata_pkt_txlate_t *);
228 static int sata_txlt_synchronize_cache(sata_pkt_txlate_t *);
229 static int sata_txlt_write_buffer(sata_pkt_txlate_t *);
230 static int sata_txlt_nodata_cmd_immediate(sata_pkt_txlate_t *);
231
232 static int sata_hba_start(sata_pkt_txlate_t *, int *);
233 static int sata_txlt_invalid_command(sata_pkt_txlate_t *);
234 static int sata_txlt_check_condition(sata_pkt_txlate_t *, uchar_t, uchar_t);
235 static int sata_txlt_lba_out_of_range(sata_pkt_txlate_t *);
236 static int sata_txlt_ata_pass_thru_illegal_cmd(sata_pkt_txlate_t *);
237 static int sata_txlt_unmap_nodata_cmd(sata_pkt_txlate_t *);
238 static void sata_txlt_rw_completion(sata_pkt_t *);
239 static void sata_txlt_nodata_cmd_completion(sata_pkt_t *);
240 static void sata_txlt_apt_completion(sata_pkt_t *sata_pkt);
241 static void sata_txlt_unmap_completion(sata_pkt_t *sata_pkt);
242 static int sata_emul_rw_completion(sata_pkt_txlate_t *);
243 static void sata_fill_ata_return_desc(sata_pkt_t *, uint8_t, uint8_t,
244 uint8_t);
245 static struct scsi_extended_sense *sata_arq_sense(sata_pkt_txlate_t *);
246
247 static int sata_txlt_atapi(sata_pkt_txlate_t *);
248 static void sata_txlt_atapi_completion(sata_pkt_t *);
249
250 /*
251 * Local functions for ioctl
252 */
253 static int32_t sata_get_port_num(sata_hba_inst_t *, struct devctl_iocdata *);
254 static void sata_cfgadm_state(sata_hba_inst_t *, int32_t,
255 devctl_ap_state_t *);
256 static dev_info_t *sata_get_target_dip(dev_info_t *, uint8_t, uint8_t);
257 static dev_info_t *sata_get_scsi_target_dip(dev_info_t *, sata_address_t *);
258 static dev_info_t *sata_devt_to_devinfo(dev_t);
259 static int sata_ioctl_connect(sata_hba_inst_t *, sata_device_t *);
260 static int sata_ioctl_disconnect(sata_hba_inst_t *, sata_device_t *);
261 static int sata_ioctl_configure(sata_hba_inst_t *, sata_device_t *);
262 static int sata_ioctl_unconfigure(sata_hba_inst_t *, sata_device_t *);
263 static int sata_ioctl_activate(sata_hba_inst_t *, sata_device_t *);
264 static int sata_ioctl_deactivate(sata_hba_inst_t *, sata_device_t *);
265 static int sata_ioctl_reset_port(sata_hba_inst_t *, sata_device_t *);
266 static int sata_ioctl_reset_device(sata_hba_inst_t *, sata_device_t *);
267 static int sata_ioctl_reset_all(sata_hba_inst_t *);
268 static int sata_ioctl_port_self_test(sata_hba_inst_t *, sata_device_t *);
269 static int sata_ioctl_get_device_path(sata_hba_inst_t *, sata_device_t *,
270 sata_ioctl_data_t *, int mode);
271 static int sata_ioctl_get_ap_type(sata_hba_inst_t *, sata_device_t *,
272 sata_ioctl_data_t *, int mode);
273 static int sata_ioctl_get_model_info(sata_hba_inst_t *, sata_device_t *,
274 sata_ioctl_data_t *, int mode);
275 static int sata_ioctl_get_revfirmware_info(sata_hba_inst_t *, sata_device_t *,
276 sata_ioctl_data_t *, int mode);
277 static int sata_ioctl_get_serialnumber_info(sata_hba_inst_t *,
278 sata_device_t *, sata_ioctl_data_t *, int mode);
279
280 /*
281 * Local functions
282 */
283 static void sata_remove_hba_instance(dev_info_t *);
284 static int sata_validate_sata_hba_tran(dev_info_t *, sata_hba_tran_t *);
285 static void sata_probe_ports(sata_hba_inst_t *);
286 static void sata_probe_pmports(sata_hba_inst_t *, uint8_t);
287 static int sata_reprobe_port(sata_hba_inst_t *, sata_device_t *, int);
288 static int sata_reprobe_pmult(sata_hba_inst_t *, sata_device_t *, int);
289 static int sata_reprobe_pmport(sata_hba_inst_t *, sata_device_t *, int);
290 static int sata_alloc_pmult(sata_hba_inst_t *, sata_device_t *);
291 static void sata_free_pmult(sata_hba_inst_t *, sata_device_t *);
292 static int sata_add_device(dev_info_t *, sata_hba_inst_t *, sata_device_t *);
293 static int sata_offline_device(sata_hba_inst_t *, sata_device_t *,
294 sata_drive_info_t *);
295 static dev_info_t *sata_create_target_node(dev_info_t *, sata_hba_inst_t *,
296 sata_address_t *);
297 static void sata_remove_target_node(sata_hba_inst_t *,
298 sata_address_t *);
299 static int sata_validate_scsi_address(sata_hba_inst_t *,
300 struct scsi_address *, sata_device_t *);
301 static int sata_validate_sata_address(sata_hba_inst_t *, int, int, int);
302 static sata_pkt_t *sata_pkt_alloc(sata_pkt_txlate_t *, int (*)(caddr_t));
303 static void sata_pkt_free(sata_pkt_txlate_t *);
304 static int sata_dma_buf_setup(sata_pkt_txlate_t *, int, int (*)(caddr_t),
305 caddr_t, ddi_dma_attr_t *);
306 static void sata_common_free_dma_rsrcs(sata_pkt_txlate_t *);
307 static int sata_probe_device(sata_hba_inst_t *, sata_device_t *);
308 static sata_drive_info_t *sata_get_device_info(sata_hba_inst_t *,
309 sata_device_t *);
310 static int sata_identify_device(sata_hba_inst_t *, sata_drive_info_t *);
311 static void sata_reidentify_device(sata_pkt_txlate_t *);
312 static struct buf *sata_alloc_local_buffer(sata_pkt_txlate_t *, size_t);
313 static void sata_free_local_buffer(sata_pkt_txlate_t *);
314 static uint64_t sata_check_capacity(sata_drive_info_t *);
315 void sata_adjust_dma_attr(sata_drive_info_t *, ddi_dma_attr_t *,
316 ddi_dma_attr_t *);
317 static int sata_fetch_device_identify_data(sata_hba_inst_t *,
318 sata_drive_info_t *);
319 static void sata_update_port_info(sata_hba_inst_t *, sata_device_t *);
320 static void sata_update_pmport_info(sata_hba_inst_t *, sata_device_t *);
321 static int sata_set_dma_mode(sata_hba_inst_t *, sata_drive_info_t *);
322 static int sata_set_cache_mode(sata_hba_inst_t *, sata_drive_info_t *, int);
323 static int sata_set_rmsn(sata_hba_inst_t *, sata_drive_info_t *, int);
324 static int sata_set_drive_features(sata_hba_inst_t *,
325 sata_drive_info_t *, int flag);
326 static void sata_init_write_cache_mode(sata_drive_info_t *sdinfo);
327 static int sata_initialize_device(sata_hba_inst_t *, sata_drive_info_t *);
328 static void sata_identdev_to_inquiry(sata_hba_inst_t *, sata_drive_info_t *,
329 uint8_t *);
330 static int sata_get_atapi_inquiry_data(sata_hba_inst_t *, sata_address_t *,
331 struct scsi_inquiry *);
332 static int sata_build_msense_page_1(sata_drive_info_t *, int, uint8_t *);
333 static int sata_build_msense_page_8(sata_drive_info_t *, int, uint8_t *);
334 static int sata_build_msense_page_1a(sata_drive_info_t *, int, uint8_t *);
335 static int sata_build_msense_page_1c(sata_drive_info_t *, int, uint8_t *);
336 static int sata_build_msense_page_30(sata_drive_info_t *, int, uint8_t *);
337 static int sata_mode_select_page_8(sata_pkt_txlate_t *,
338 struct mode_cache_scsi3 *, int, int *, int *, int *);
339 static int sata_mode_select_page_1a(sata_pkt_txlate_t *,
340 struct mode_info_power_cond *, int, int *, int *, int *);
341 static int sata_mode_select_page_1c(sata_pkt_txlate_t *,
342 struct mode_info_excpt_page *, int, int *, int *, int *);
343 static int sata_mode_select_page_30(sata_pkt_txlate_t *,
344 struct mode_acoustic_management *, int, int *, int *, int *);
345
346 static int sata_build_lsense_page_0(sata_drive_info_t *, uint8_t *);
347 static int sata_build_lsense_page_03(sata_drive_info_t *, uint8_t *,
348 sata_hba_inst_t *);
349 static int sata_build_lsense_page_0d(sata_drive_info_t *, uint8_t *,
350 sata_hba_inst_t *);
351 static int sata_build_lsense_page_0e(sata_drive_info_t *, uint8_t *,
352 sata_pkt_txlate_t *);
353 static int sata_build_lsense_page_10(sata_drive_info_t *, uint8_t *,
354 sata_hba_inst_t *);
355 static int sata_build_lsense_page_11(sata_drive_info_t *, uint8_t *,
356 sata_hba_inst_t *);
357 static int sata_build_lsense_page_19(sata_drive_info_t *, uint8_t *,
358 sata_hba_inst_t *);
359 static int sata_build_lsense_page_2f(sata_drive_info_t *, uint8_t *,
360 sata_hba_inst_t *);
361 static int sata_build_lsense_page_30(sata_drive_info_t *, uint8_t *,
362 sata_hba_inst_t *);
363
364 static void sata_set_arq_data(sata_pkt_t *);
365 static void sata_build_read_verify_cmd(sata_cmd_t *, uint16_t, uint64_t);
366 static void sata_build_generic_cmd(sata_cmd_t *, uint8_t);
367 static uint8_t sata_get_standby_timer(uint8_t *timer);
368
369 static void sata_save_drive_settings(sata_drive_info_t *);
370 static void sata_show_drive_info(sata_hba_inst_t *, sata_drive_info_t *);
371 static void sata_show_pmult_info(sata_hba_inst_t *, sata_device_t *);
372 static void sata_log(sata_hba_inst_t *, uint_t, char *fmt, ...);
373 #ifndef SATA_DEBUG
374 static void sata_trace_log(sata_hba_inst_t *, uint_t, const char *fmt, ...);
375 #endif
376 static int sata_fetch_smart_return_status(sata_hba_inst_t *,
377 sata_drive_info_t *);
378 static int sata_fetch_smart_data(sata_hba_inst_t *, sata_drive_info_t *,
379 struct smart_data *);
380 static int sata_smart_selftest_log(sata_hba_inst_t *,
381 sata_drive_info_t *,
382 struct smart_selftest_log *);
383 static int sata_ext_smart_selftest_read_log(sata_hba_inst_t *,
384 sata_drive_info_t *, struct smart_ext_selftest_log *, uint16_t);
385 static int sata_read_log_ext(sata_hba_inst_t *, sata_drive_info_t *, uint8_t,
386 uint16_t, void *, uint16_t);
387 static int sata_smart_read_log(sata_hba_inst_t *, sata_drive_info_t *,
388 uint8_t *, uint8_t, uint8_t);
389 static int sata_read_log_ext_directory(sata_hba_inst_t *, sata_drive_info_t *,
390 struct read_log_ext_directory *);
391 static void sata_gen_sysevent(sata_hba_inst_t *, sata_address_t *, int);
392 static void sata_xlate_errors(sata_pkt_txlate_t *);
393 static void sata_decode_device_error(sata_pkt_txlate_t *,
394 struct scsi_extended_sense *);
395 static void sata_set_device_removed(dev_info_t *);
396 static boolean_t sata_check_device_removed(dev_info_t *);
397 static void sata_set_target_node_cleanup(sata_hba_inst_t *, sata_address_t *);
398 static int sata_ncq_err_ret_cmd_setup(sata_pkt_txlate_t *,
399 sata_drive_info_t *);
400 static int sata_atapi_err_ret_cmd_setup(sata_pkt_txlate_t *,
401 sata_drive_info_t *);
402 static void sata_atapi_packet_cmd_setup(sata_cmd_t *, sata_drive_info_t *);
403 static void sata_fixed_sense_data_preset(struct scsi_extended_sense *);
404 static void sata_target_devid_register(dev_info_t *, sata_drive_info_t *);
405 static int sata_check_modser(char *, int);
406
407 /*
408 * FMA
409 */
410 static boolean_t sata_check_for_dma_error(dev_info_t *, sata_pkt_txlate_t *);
411
412
413 /*
414 * SATA Framework will ignore SATA HBA driver cb_ops structure and
415 * register following one with SCSA framework.
416 * Open & close are provided, so scsi framework will not use its own
417 */
418 static struct cb_ops sata_cb_ops = {
419 sata_hba_open, /* open */
420 sata_hba_close, /* close */
421 nodev, /* strategy */
422 nodev, /* print */
423 nodev, /* dump */
424 nodev, /* read */
425 nodev, /* write */
426 sata_hba_ioctl, /* ioctl */
427 nodev, /* devmap */
428 nodev, /* mmap */
429 nodev, /* segmap */
430 nochpoll, /* chpoll */
431 ddi_prop_op, /* cb_prop_op */
432 0, /* streamtab */
433 D_NEW | D_MP, /* cb_flag */
434 CB_REV, /* rev */
435 nodev, /* aread */
436 nodev /* awrite */
437 };
438
439
440 extern struct mod_ops mod_miscops;
441 extern uchar_t scsi_cdb_size[];
442
443 static struct modlmisc modlmisc = {
444 &mod_miscops, /* Type of module */
445 "SATA Module" /* module name */
446 };
447
448
449 static struct modlinkage modlinkage = {
450 MODREV_1,
451 (void *)&modlmisc,
452 NULL
453 };
454
455 /*
456 * Default sata pkt timeout. Used when a target driver scsi_pkt time is zero,
457 * i.e. when scsi_pkt has not timeout specified.
458 */
459 static int sata_default_pkt_time = 60; /* 60 seconds */
460
461 /*
462 * Intermediate buffer device access attributes - they are required,
463 * but not necessarily used.
464 */
465 static ddi_device_acc_attr_t sata_acc_attr = {
466 DDI_DEVICE_ATTR_V0,
467 DDI_STRUCTURE_LE_ACC,
468 DDI_STRICTORDER_ACC
469 };
470
471
472 /*
473 * Mutexes protecting structures in multithreaded operations.
474 * Because events are relatively rare, a single global mutex protecting
475 * data structures should be sufficient. To increase performance, add
476 * separate mutex per each sata port and use global mutex only to protect
477 * common data structures.
478 */
479 static kmutex_t sata_mutex; /* protects sata_hba_list */
480 static kmutex_t sata_log_mutex; /* protects log */
481
482 static char sata_log_buf[256];
483
484 /*
485 * sata trace debug
486 */
487 static sata_trace_rbuf_t *sata_debug_rbuf;
488 static sata_trace_dmsg_t *sata_trace_dmsg_alloc(void);
489 static void sata_trace_dmsg_free(void);
490 static void sata_trace_rbuf_alloc(void);
491 static void sata_trace_rbuf_free(void);
492
493 int dmsg_ring_size = DMSG_RING_SIZE;
494
495 /* Default write cache setting for SATA hard disks */
496 int sata_write_cache = 1; /* enabled */
497
498 /* Default write cache setting for SATA ATAPI CD/DVD */
499 int sata_atapicdvd_write_cache = 1; /* enabled */
500
501 /* Default write cache setting for SATA ATAPI tape */
502 int sata_atapitape_write_cache = 1; /* enabled */
503
504 /* Default write cache setting for SATA ATAPI disk */
505 int sata_atapidisk_write_cache = 1; /* enabled */
506
507 /*
508 * Linked list of HBA instances
509 */
510 static sata_hba_inst_t *sata_hba_list = NULL;
511 static sata_hba_inst_t *sata_hba_list_tail = NULL;
512 /*
513 * Pointer to per-instance SATA HBA soft structure is stored in sata_hba_tran
514 * structure and in sata soft state.
515 */
516
517 /*
518 * Event daemon related variables
519 */
520 static kmutex_t sata_event_mutex;
521 static kcondvar_t sata_event_cv;
522 static kthread_t *sata_event_thread = NULL;
523 static int sata_event_thread_terminate = 0;
524 static int sata_event_pending = 0;
525 static int sata_event_thread_active = 0;
526 extern pri_t minclsyspri;
527
528 /*
529 * NCQ error recovery command
530 */
531 static const sata_cmd_t sata_rle_cmd = {
532 SATA_CMD_REV,
533 NULL,
534 {
535 SATA_DIR_READ
536 },
537 ATA_ADDR_LBA48,
538 0,
539 0,
540 0,
541 0,
542 0,
543 1,
544 READ_LOG_EXT_NCQ_ERROR_RECOVERY,
545 0,
546 0,
547 0,
548 SATAC_READ_LOG_EXT,
549 0,
550 0,
551 0,
552 };
553
554 /*
555 * ATAPI error recovery CDB
556 */
557 static const uint8_t sata_rqsense_cdb[SATA_ATAPI_RQSENSE_CDB_LEN] = {
558 SCMD_REQUEST_SENSE,
559 0, /* Only fixed RQ format is supported */
560 0,
561 0,
562 SATA_ATAPI_MIN_RQSENSE_LEN, /* Less data may be returned */
563 0
564 };
565
566
567 /* Warlock directives */
568
569 _NOTE(SCHEME_PROTECTS_DATA("No Mutex Needed", scsi_hba_tran))
570 _NOTE(SCHEME_PROTECTS_DATA("No Mutex Needed", scsi_device))
571 _NOTE(SCHEME_PROTECTS_DATA("No Mutex Needed", dev_ops))
572 _NOTE(SCHEME_PROTECTS_DATA("No Mutex Needed", scsi_extended_sense))
573 _NOTE(SCHEME_PROTECTS_DATA("No Mutex Needed", scsi_arq_status))
574 _NOTE(SCHEME_PROTECTS_DATA("No Mutex Needed", ddi_dma_attr))
575 _NOTE(SCHEME_PROTECTS_DATA("No Mutex Needed", ddi_dma_cookie_t))
576 _NOTE(SCHEME_PROTECTS_DATA("No Mutex Needed", devctl_ap_state))
577 _NOTE(SCHEME_PROTECTS_DATA("No Mutex Needed", dev_info::devi_state))
_NOTE(MUTEX_PROTECTS_DATA (sata_mutex,sata_hba_list))578 _NOTE(MUTEX_PROTECTS_DATA(sata_mutex, sata_hba_list))
579 _NOTE(DATA_READABLE_WITHOUT_LOCK(sata_hba_list))
580 _NOTE(MUTEX_PROTECTS_DATA(sata_mutex, sata_hba_inst::satahba_next))
581 _NOTE(MUTEX_PROTECTS_DATA(sata_mutex, sata_hba_inst::satahba_prev))
582 _NOTE(SCHEME_PROTECTS_DATA("No Mutex Needed", \
583 sata_hba_inst::satahba_scsi_tran))
584 _NOTE(SCHEME_PROTECTS_DATA("No Mutex Needed", sata_hba_inst::satahba_tran))
585 _NOTE(SCHEME_PROTECTS_DATA("No Mutex Needed", sata_hba_inst::satahba_dip))
586 _NOTE(SCHEME_PROTECTS_DATA("Scheme", sata_hba_inst::satahba_attached))
587 _NOTE(DATA_READABLE_WITHOUT_LOCK(sata_hba_inst::satahba_dev_port))
588 _NOTE(MUTEX_PROTECTS_DATA(sata_hba_inst::satahba_mutex,
589 sata_hba_inst::satahba_event_flags))
590 _NOTE(MUTEX_PROTECTS_DATA(sata_cport_info::cport_mutex, \
591 sata_cport_info::cport_devp))
592 _NOTE(DATA_READABLE_WITHOUT_LOCK(sata_cport_info::cport_devp))
593 _NOTE(SCHEME_PROTECTS_DATA("Scheme", sata_cport_info::cport_addr))
594 _NOTE(MUTEX_PROTECTS_DATA(sata_cport_info::cport_mutex, \
595 sata_cport_info::cport_dev_type))
596 _NOTE(DATA_READABLE_WITHOUT_LOCK(sata_cport_info::cport_dev_type))
597 _NOTE(MUTEX_PROTECTS_DATA(sata_cport_info::cport_mutex, \
598 sata_cport_info::cport_state))
599 _NOTE(DATA_READABLE_WITHOUT_LOCK(sata_cport_info::cport_state))
600 _NOTE(MUTEX_PROTECTS_DATA(sata_pmport_info::pmport_mutex, \
601 sata_pmport_info::pmport_state))
602 _NOTE(DATA_READABLE_WITHOUT_LOCK(sata_pmport_info::pmport_state))
603 _NOTE(MUTEX_PROTECTS_DATA(sata_pmport_info::pmport_mutex, \
604 sata_pmport_info::pmport_dev_type))
605 _NOTE(DATA_READABLE_WITHOUT_LOCK(sata_pmport_info::pmport_dev_type))
606 _NOTE(MUTEX_PROTECTS_DATA(sata_pmport_info::pmport_mutex, \
607 sata_pmport_info::pmport_sata_drive))
608 _NOTE(MUTEX_PROTECTS_DATA(sata_pmport_info::pmport_mutex, \
609 sata_pmport_info::pmport_tgtnode_clean))
610 _NOTE(MUTEX_PROTECTS_DATA(sata_pmport_info::pmport_mutex, \
611 sata_pmport_info::pmport_event_flags))
612 _NOTE(DATA_READABLE_WITHOUT_LOCK(sata_pmport_info::pmport_sata_drive))
613 _NOTE(DATA_READABLE_WITHOUT_LOCK(sata_pmult_info::pmult_dev_port))
614 _NOTE(DATA_READABLE_WITHOUT_LOCK(sata_pmult_info::pmult_num_dev_ports))
615 #ifdef SATA_DEBUG
616 _NOTE(SCHEME_PROTECTS_DATA("No Mutex Needed", mbuf_count))
617 _NOTE(SCHEME_PROTECTS_DATA("No Mutex Needed", mbuffail_count))
618 _NOTE(SCHEME_PROTECTS_DATA("No Mutex Needed", sata_atapi_trace))
619 _NOTE(SCHEME_PROTECTS_DATA("No Mutex Needed", sata_atapi_trace_index))
620 #endif
621
622 /* End of warlock directives */
623
624 /* ************** loadable module configuration functions ************** */
625
626 int
627 _init()
628 {
629 int rval;
630
631 mutex_init(&sata_mutex, NULL, MUTEX_DRIVER, NULL);
632 mutex_init(&sata_event_mutex, NULL, MUTEX_DRIVER, NULL);
633 mutex_init(&sata_log_mutex, NULL, MUTEX_DRIVER, NULL);
634 cv_init(&sata_event_cv, NULL, CV_DRIVER, NULL);
635 sata_trace_rbuf_alloc();
636 if ((rval = mod_install(&modlinkage)) != 0) {
637 #ifdef SATA_DEBUG
638 cmn_err(CE_WARN, "sata: _init: mod_install failed\n");
639 #endif
640 sata_trace_rbuf_free();
641 mutex_destroy(&sata_log_mutex);
642 cv_destroy(&sata_event_cv);
643 mutex_destroy(&sata_event_mutex);
644 mutex_destroy(&sata_mutex);
645 }
646 return (rval);
647 }
648
649 int
_fini()650 _fini()
651 {
652 int rval;
653
654 if ((rval = mod_remove(&modlinkage)) != 0)
655 return (rval);
656
657 sata_trace_rbuf_free();
658 mutex_destroy(&sata_log_mutex);
659 cv_destroy(&sata_event_cv);
660 mutex_destroy(&sata_event_mutex);
661 mutex_destroy(&sata_mutex);
662 return (rval);
663 }
664
665 int
_info(struct modinfo * modinfop)666 _info(struct modinfo *modinfop)
667 {
668 return (mod_info(&modlinkage, modinfop));
669 }
670
671
672
673 /* ********************* SATA HBA entry points ********************* */
674
675
676 /*
677 * Called by SATA HBA from _init().
678 * Registers HBA driver instance/sata framework pair with scsi framework, by
679 * calling scsi_hba_init().
680 *
681 * SATA HBA driver cb_ops are ignored - SATA HBA framework cb_ops are used
682 * instead. SATA HBA framework cb_ops pointer overwrites SATA HBA driver
683 * cb_ops pointer in SATA HBA driver dev_ops structure.
684 * SATA HBA framework cb_ops supplies cb_open cb_close and cb_ioctl vectors.
685 *
686 * Return status of the scsi_hba_init() is returned to a calling SATA HBA
687 * driver.
688 */
689 int
sata_hba_init(struct modlinkage * modlp)690 sata_hba_init(struct modlinkage *modlp)
691 {
692 int rval;
693 struct dev_ops *hba_ops;
694
695 SATADBG1(SATA_DBG_HBA_IF, NULL,
696 "sata_hba_init: name %s \n",
697 ((struct modldrv *)(modlp->ml_linkage[0]))->drv_linkinfo);
698 /*
699 * Fill-up cb_ops and dev_ops when necessary
700 */
701 hba_ops = ((struct modldrv *)(modlp->ml_linkage[0]))->drv_dev_ops;
702 /*
703 * Provide pointer to SATA dev_ops
704 */
705 hba_ops->devo_cb_ops = &sata_cb_ops;
706
707 /*
708 * Register SATA HBA with SCSI framework
709 */
710 if ((rval = scsi_hba_init(modlp)) != 0) {
711 SATADBG1(SATA_DBG_HBA_IF, NULL,
712 "sata_hba_init: scsi hba init failed\n", NULL);
713 return (rval);
714 }
715
716 return (0);
717 }
718
719
720 /* HBA attach stages */
721 #define HBA_ATTACH_STAGE_SATA_HBA_INST 1
722 #define HBA_ATTACH_STAGE_SCSI_ATTACHED 2
723 #define HBA_ATTACH_STAGE_SETUP 4
724 #define HBA_ATTACH_STAGE_LINKED 8
725
726
727 /*
728 *
729 * Called from SATA HBA driver's attach routine to attach an instance of
730 * the HBA.
731 *
732 * For DDI_ATTACH command:
733 * sata_hba_inst structure is allocated here and initialized with pointers to
734 * SATA framework implementation of required scsi tran functions.
735 * The scsi_tran's tran_hba_private field is used by SATA Framework to point
736 * to the soft structure (sata_hba_inst) allocated by SATA framework for
737 * SATA HBA instance related data.
738 * The scsi_tran's tran_hba_private field is used by SATA framework to
739 * store a pointer to per-HBA-instance of sata_hba_inst structure.
740 * The sata_hba_inst structure is cross-linked to scsi tran structure.
741 * Among other info, a pointer to sata_hba_tran structure is stored in
742 * sata_hba_inst. The sata_hba_inst structures for different HBA instances are
743 * linked together into the list, pointed to by sata_hba_list.
744 * On the first HBA instance attach the sata event thread is initialized.
745 * Attachment points are created for all SATA ports of the HBA being attached.
746 * All HBA instance's SATA ports are probed and type of plugged devices is
747 * determined. For each device of a supported type, a target node is created.
748 *
749 * DDI_SUCCESS is returned when attachment process is successful,
750 * DDI_FAILURE is returned otherwise.
751 *
752 * For DDI_RESUME command:
753 * Not implemented at this time (postponed until phase 2 of the development).
754 */
755 int
sata_hba_attach(dev_info_t * dip,sata_hba_tran_t * sata_tran,ddi_attach_cmd_t cmd)756 sata_hba_attach(dev_info_t *dip, sata_hba_tran_t *sata_tran,
757 ddi_attach_cmd_t cmd)
758 {
759 sata_hba_inst_t *sata_hba_inst;
760 scsi_hba_tran_t *scsi_tran = NULL;
761 int hba_attach_state = 0;
762 char taskq_name[MAXPATHLEN];
763
764 SATADBG3(SATA_DBG_HBA_IF, NULL,
765 "sata_hba_attach: node %s (%s%d)\n",
766 ddi_node_name(dip), ddi_driver_name(dip),
767 ddi_get_instance(dip));
768
769 if (cmd == DDI_RESUME) {
770 /*
771 * Postponed until phase 2 of the development
772 */
773 return (DDI_FAILURE);
774 }
775
776 if (cmd != DDI_ATTACH) {
777 return (DDI_FAILURE);
778 }
779
780 /* cmd == DDI_ATTACH */
781
782 if (sata_validate_sata_hba_tran(dip, sata_tran) != SATA_SUCCESS) {
783 SATA_LOG_D((NULL, CE_WARN,
784 "sata_hba_attach: invalid sata_hba_tran"));
785 return (DDI_FAILURE);
786 }
787 /*
788 * Allocate and initialize SCSI tran structure.
789 * SATA copy of tran_bus_config is provided to create port nodes.
790 */
791 scsi_tran = scsi_hba_tran_alloc(dip, SCSI_HBA_CANSLEEP);
792 if (scsi_tran == NULL)
793 return (DDI_FAILURE);
794 /*
795 * Allocate soft structure for SATA HBA instance.
796 * There is a separate softstate for each HBA instance.
797 */
798 sata_hba_inst = kmem_zalloc(sizeof (struct sata_hba_inst), KM_SLEEP);
799 ASSERT(sata_hba_inst != NULL); /* this should not fail */
800 mutex_init(&sata_hba_inst->satahba_mutex, NULL, MUTEX_DRIVER, NULL);
801 hba_attach_state |= HBA_ATTACH_STAGE_SATA_HBA_INST;
802
803 /*
804 * scsi_trans's tran_hba_private is used by SATA Framework to point to
805 * soft structure allocated by SATA framework for
806 * SATA HBA instance related data.
807 */
808 scsi_tran->tran_hba_private = sata_hba_inst;
809 scsi_tran->tran_tgt_private = NULL;
810
811 scsi_tran->tran_tgt_init = sata_scsi_tgt_init;
812 scsi_tran->tran_tgt_probe = sata_scsi_tgt_probe;
813 scsi_tran->tran_tgt_free = sata_scsi_tgt_free;
814
815 scsi_tran->tran_start = sata_scsi_start;
816 scsi_tran->tran_reset = sata_scsi_reset;
817 scsi_tran->tran_abort = sata_scsi_abort;
818 scsi_tran->tran_getcap = sata_scsi_getcap;
819 scsi_tran->tran_setcap = sata_scsi_setcap;
820 scsi_tran->tran_init_pkt = sata_scsi_init_pkt;
821 scsi_tran->tran_destroy_pkt = sata_scsi_destroy_pkt;
822
823 scsi_tran->tran_dmafree = sata_scsi_dmafree;
824 scsi_tran->tran_sync_pkt = sata_scsi_sync_pkt;
825
826 scsi_tran->tran_reset_notify = NULL;
827 scsi_tran->tran_get_bus_addr = NULL;
828 scsi_tran->tran_quiesce = NULL;
829 scsi_tran->tran_unquiesce = NULL;
830 scsi_tran->tran_bus_reset = NULL;
831
832 if (scsi_hba_attach_setup(dip, sata_tran->sata_tran_hba_dma_attr,
833 scsi_tran, 0) != DDI_SUCCESS) {
834 #ifdef SATA_DEBUG
835 cmn_err(CE_WARN, "?SATA: %s%d hba scsi attach failed",
836 ddi_driver_name(dip), ddi_get_instance(dip));
837 #endif
838 goto fail;
839 }
840 hba_attach_state |= HBA_ATTACH_STAGE_SCSI_ATTACHED;
841
842 if (!ddi_prop_exists(DDI_DEV_T_ANY, dip, DDI_PROP_DONTPASS, "sata")) {
843 if (ddi_prop_update_int(DDI_DEV_T_NONE, dip,
844 "sata", 1) != DDI_PROP_SUCCESS) {
845 SATA_LOG_D((NULL, CE_WARN, "sata_hba_attach: "
846 "failed to create hba sata prop"));
847 goto fail;
848 }
849 }
850
851 /*
852 * Save pointers in hba instance soft state.
853 */
854 sata_hba_inst->satahba_scsi_tran = scsi_tran;
855 sata_hba_inst->satahba_tran = sata_tran;
856 sata_hba_inst->satahba_dip = dip;
857
858 /*
859 * Create a task queue to handle emulated commands completion
860 * Use node name, dash, instance number as the queue name.
861 */
862 taskq_name[0] = '\0';
863 (void) strlcat(taskq_name, DEVI(dip)->devi_node_name,
864 sizeof (taskq_name));
865 (void) snprintf(taskq_name + strlen(taskq_name),
866 sizeof (taskq_name) - strlen(taskq_name),
867 "-%d", DEVI(dip)->devi_instance);
868 sata_hba_inst->satahba_taskq = taskq_create(taskq_name, 1,
869 minclsyspri, 1, sata_tran->sata_tran_hba_num_cports * 4,
870 TASKQ_DYNAMIC);
871
872 hba_attach_state |= HBA_ATTACH_STAGE_SETUP;
873
874 /*
875 * Create events thread if not created yet.
876 */
877 sata_event_thread_control(1);
878
879 /*
880 * Link this hba instance into the list.
881 */
882 mutex_enter(&sata_mutex);
883
884 if (sata_hba_list == NULL) {
885 /*
886 * The first instance of HBA is attached.
887 * Set current/active default maximum NCQ/TCQ queue depth for
888 * all SATA devices. It is done here and now, to eliminate the
889 * possibility of the dynamic, programatic modification of the
890 * queue depth via global (and public) sata_max_queue_depth
891 * variable (this would require special handling in HBA drivers)
892 */
893 sata_current_max_qdepth = sata_max_queue_depth;
894 if (sata_current_max_qdepth > 32)
895 sata_current_max_qdepth = 32;
896 else if (sata_current_max_qdepth < 1)
897 sata_current_max_qdepth = 1;
898 }
899
900 sata_hba_inst->satahba_next = NULL;
901 sata_hba_inst->satahba_prev = sata_hba_list_tail;
902 if (sata_hba_list == NULL) {
903 sata_hba_list = sata_hba_inst;
904 }
905 if (sata_hba_list_tail != NULL) {
906 sata_hba_list_tail->satahba_next = sata_hba_inst;
907 }
908 sata_hba_list_tail = sata_hba_inst;
909 mutex_exit(&sata_mutex);
910 hba_attach_state |= HBA_ATTACH_STAGE_LINKED;
911
912 /*
913 * Create SATA HBA devctl minor node for sata_hba_open, close, ioctl
914 * SATA HBA driver should not use its own open/close entry points.
915 *
916 * Make sure that instance number doesn't overflow
917 * when forming minor numbers.
918 */
919 ASSERT(ddi_get_instance(dip) <= (L_MAXMIN >> INST_MINOR_SHIFT));
920 if (ddi_create_minor_node(dip, "devctl", S_IFCHR,
921 INST2DEVCTL(ddi_get_instance(dip)),
922 DDI_NT_SATA_NEXUS, 0) != DDI_SUCCESS) {
923 #ifdef SATA_DEBUG
924 cmn_err(CE_WARN, "sata_hba_attach: "
925 "cannot create devctl minor node");
926 #endif
927 goto fail;
928 }
929
930
931 /*
932 * Set-up kstats here, if necessary.
933 * (postponed until future phase of the development).
934 */
935
936 /*
937 * Indicate that HBA is attached. This will enable events processing
938 * for this HBA.
939 */
940 sata_hba_inst->satahba_attached = 1;
941 /*
942 * Probe controller ports. This operation will describe a current
943 * controller/port/multipliers/device configuration and will create
944 * attachment points.
945 * We may end-up with just a controller with no devices attached.
946 * For the ports with a supported device attached, device target nodes
947 * are created and devices are initialized.
948 */
949 sata_probe_ports(sata_hba_inst);
950
951 return (DDI_SUCCESS);
952
953 fail:
954 if (hba_attach_state & HBA_ATTACH_STAGE_LINKED) {
955 (void) sata_remove_hba_instance(dip);
956 if (sata_hba_list == NULL)
957 sata_event_thread_control(0);
958 }
959
960 if (hba_attach_state & HBA_ATTACH_STAGE_SETUP) {
961 (void) ddi_prop_remove(DDI_DEV_T_ANY, dip, "sata");
962 taskq_destroy(sata_hba_inst->satahba_taskq);
963 }
964
965 if (hba_attach_state & HBA_ATTACH_STAGE_SCSI_ATTACHED)
966 (void) scsi_hba_detach(dip);
967
968 if (hba_attach_state & HBA_ATTACH_STAGE_SATA_HBA_INST) {
969 mutex_destroy(&sata_hba_inst->satahba_mutex);
970 kmem_free((void *)sata_hba_inst,
971 sizeof (struct sata_hba_inst));
972 scsi_hba_tran_free(scsi_tran);
973 }
974
975 sata_log(NULL, CE_WARN, "?SATA: %s%d hba attach failed",
976 ddi_driver_name(dip), ddi_get_instance(dip));
977
978 return (DDI_FAILURE);
979 }
980
981
982 /*
983 * Called by SATA HBA from to detach an instance of the driver.
984 *
985 * For DDI_DETACH command:
986 * Free local structures allocated for SATA HBA instance during
987 * sata_hba_attach processing.
988 *
989 * Returns DDI_SUCCESS when HBA was detached, DDI_FAILURE otherwise.
990 *
991 * For DDI_SUSPEND command:
992 * Not implemented at this time (postponed until phase 2 of the development)
993 * Returnd DDI_SUCCESS.
994 *
995 * When the last HBA instance is detached, the event daemon is terminated.
996 *
997 * NOTE: Port multiplier is supported.
998 */
999 int
sata_hba_detach(dev_info_t * dip,ddi_detach_cmd_t cmd)1000 sata_hba_detach(dev_info_t *dip, ddi_detach_cmd_t cmd)
1001 {
1002 dev_info_t *tdip;
1003 sata_hba_inst_t *sata_hba_inst;
1004 scsi_hba_tran_t *scsi_hba_tran;
1005 sata_cport_info_t *cportinfo;
1006 sata_pmult_info_t *pminfo;
1007 sata_drive_info_t *sdinfo;
1008 sata_device_t sdevice;
1009 int ncport, npmport;
1010
1011 SATADBG3(SATA_DBG_HBA_IF, NULL, "sata_hba_detach: node %s (%s%d)\n",
1012 ddi_node_name(dip), ddi_driver_name(dip), ddi_get_instance(dip));
1013
1014 switch (cmd) {
1015 case DDI_DETACH:
1016
1017 if ((scsi_hba_tran = ddi_get_driver_private(dip)) == NULL)
1018 return (DDI_FAILURE);
1019
1020 sata_hba_inst = scsi_hba_tran->tran_hba_private;
1021 if (sata_hba_inst == NULL)
1022 return (DDI_FAILURE);
1023
1024 if (scsi_hba_detach(dip) == DDI_FAILURE) {
1025 sata_hba_inst->satahba_attached = 1;
1026 return (DDI_FAILURE);
1027 }
1028
1029 /*
1030 * Free all target nodes - at this point
1031 * devices should be at least offlined
1032 * otherwise scsi_hba_detach() should not be called.
1033 */
1034 for (ncport = 0; ncport < SATA_NUM_CPORTS(sata_hba_inst);
1035 ncport++) {
1036 cportinfo = SATA_CPORT_INFO(sata_hba_inst, ncport);
1037 if (cportinfo->cport_dev_type != SATA_DTYPE_PMULT) {
1038 sdinfo = SATA_CPORTINFO_DRV_INFO(cportinfo);
1039 if (sdinfo != NULL) {
1040 tdip = sata_get_target_dip(dip,
1041 ncport, 0);
1042 if (tdip != NULL) {
1043 if (ndi_devi_offline(tdip,
1044 NDI_DEVI_REMOVE) !=
1045 NDI_SUCCESS) {
1046 SATA_LOG_D((
1047 sata_hba_inst,
1048 CE_WARN,
1049 "sata_hba_detach: "
1050 "Target node not "
1051 "removed !"));
1052 return (DDI_FAILURE);
1053 }
1054 }
1055 }
1056 } else { /* SATA_DTYPE_PMULT */
1057 mutex_enter(&cportinfo->cport_mutex);
1058 pminfo = SATA_CPORTINFO_PMULT_INFO(cportinfo);
1059
1060 if (pminfo == NULL) {
1061 SATA_LOG_D((sata_hba_inst, CE_WARN,
1062 "sata_hba_detach: Port multiplier "
1063 "not ready yet!"));
1064 mutex_exit(&cportinfo->cport_mutex);
1065 return (DDI_FAILURE);
1066 }
1067
1068 /*
1069 * Detach would fail if removal of any of the
1070 * target nodes is failed - albeit in that
1071 * case some of them may have been removed.
1072 */
1073 for (npmport = 0; npmport < SATA_NUM_PMPORTS(
1074 sata_hba_inst, ncport); npmport++) {
1075 tdip = sata_get_target_dip(dip, ncport,
1076 npmport);
1077 if (tdip != NULL) {
1078 if (ndi_devi_offline(tdip,
1079 NDI_DEVI_REMOVE) !=
1080 NDI_SUCCESS) {
1081 SATA_LOG_D((
1082 sata_hba_inst,
1083 CE_WARN,
1084 "sata_hba_detach: "
1085 "Target node not "
1086 "removed !"));
1087 mutex_exit(&cportinfo->
1088 cport_mutex);
1089 return (DDI_FAILURE);
1090 }
1091 }
1092 }
1093 mutex_exit(&cportinfo->cport_mutex);
1094 }
1095 }
1096 /*
1097 * Disable sata event daemon processing for this HBA
1098 */
1099 sata_hba_inst->satahba_attached = 0;
1100
1101 /*
1102 * Remove event daemon thread, if it is last HBA instance.
1103 */
1104
1105 mutex_enter(&sata_mutex);
1106 if (sata_hba_list->satahba_next == NULL) {
1107 mutex_exit(&sata_mutex);
1108 sata_event_thread_control(0);
1109 mutex_enter(&sata_mutex);
1110 }
1111 mutex_exit(&sata_mutex);
1112
1113 /* Remove this HBA instance from the HBA list */
1114 sata_remove_hba_instance(dip);
1115
1116 /*
1117 * At this point there should be no target nodes attached.
1118 * Detach and destroy device and port info structures.
1119 */
1120 for (ncport = 0; ncport < SATA_NUM_CPORTS(sata_hba_inst);
1121 ncport++) {
1122 cportinfo = SATA_CPORT_INFO(sata_hba_inst, ncport);
1123 if (cportinfo->cport_dev_type != SATA_DTYPE_PMULT) {
1124 sdinfo =
1125 cportinfo->cport_devp.cport_sata_drive;
1126 if (sdinfo != NULL) {
1127 /* Release device structure */
1128 kmem_free(sdinfo,
1129 sizeof (sata_drive_info_t));
1130 }
1131 /* Release cport info */
1132 mutex_destroy(&cportinfo->cport_mutex);
1133 kmem_free(cportinfo,
1134 sizeof (sata_cport_info_t));
1135 } else { /* SATA_DTYPE_PMULT */
1136 sdevice.satadev_addr.cport = (uint8_t)ncport;
1137 sdevice.satadev_addr.qual = SATA_ADDR_PMULT;
1138 sata_free_pmult(sata_hba_inst, &sdevice);
1139 }
1140 }
1141
1142 scsi_hba_tran_free(sata_hba_inst->satahba_scsi_tran);
1143
1144 (void) ddi_prop_remove(DDI_DEV_T_ANY, dip, "sata");
1145
1146 taskq_destroy(sata_hba_inst->satahba_taskq);
1147
1148 mutex_destroy(&sata_hba_inst->satahba_mutex);
1149 kmem_free((void *)sata_hba_inst,
1150 sizeof (struct sata_hba_inst));
1151
1152 return (DDI_SUCCESS);
1153
1154 case DDI_SUSPEND:
1155 /*
1156 * Postponed until phase 2
1157 */
1158 return (DDI_FAILURE);
1159
1160 default:
1161 return (DDI_FAILURE);
1162 }
1163 }
1164
1165
1166 /*
1167 * Called by an HBA drive from _fini() routine.
1168 * Unregisters SATA HBA instance/SATA framework pair from the scsi framework.
1169 */
1170 void
sata_hba_fini(struct modlinkage * modlp)1171 sata_hba_fini(struct modlinkage *modlp)
1172 {
1173 SATADBG1(SATA_DBG_HBA_IF, NULL,
1174 "sata_hba_fini: name %s\n",
1175 ((struct modldrv *)(modlp->ml_linkage[0]))->drv_linkinfo);
1176
1177 scsi_hba_fini(modlp);
1178 }
1179
1180
1181 /*
1182 * Default open and close routine for sata_hba framework.
1183 *
1184 */
1185 /*
1186 * Open devctl node.
1187 *
1188 * Returns:
1189 * 0 if node was open successfully, error code otherwise.
1190 *
1191 *
1192 */
1193
1194 static int
sata_hba_open(dev_t * devp,int flags,int otyp,cred_t * credp)1195 sata_hba_open(dev_t *devp, int flags, int otyp, cred_t *credp)
1196 {
1197 #ifndef __lock_lint
1198 _NOTE(ARGUNUSED(credp))
1199 #endif
1200 int rv = 0;
1201 dev_info_t *dip;
1202 scsi_hba_tran_t *scsi_hba_tran;
1203 sata_hba_inst_t *sata_hba_inst;
1204
1205 SATADBG1(SATA_DBG_IOCTL_IF, NULL, "sata_hba_open: entered", NULL);
1206
1207 if (otyp != OTYP_CHR)
1208 return (EINVAL);
1209
1210 dip = sata_devt_to_devinfo(*devp);
1211 if (dip == NULL)
1212 return (ENXIO);
1213
1214 if ((scsi_hba_tran = ddi_get_driver_private(dip)) == NULL)
1215 return (ENXIO);
1216
1217 sata_hba_inst = scsi_hba_tran->tran_hba_private;
1218 if (sata_hba_inst == NULL || sata_hba_inst->satahba_attached == 0)
1219 return (ENXIO);
1220
1221 mutex_enter(&sata_mutex);
1222 if (flags & FEXCL) {
1223 if (sata_hba_inst->satahba_open_flag != 0) {
1224 rv = EBUSY;
1225 } else {
1226 sata_hba_inst->satahba_open_flag =
1227 SATA_DEVCTL_EXOPENED;
1228 }
1229 } else {
1230 if (sata_hba_inst->satahba_open_flag == SATA_DEVCTL_EXOPENED) {
1231 rv = EBUSY;
1232 } else {
1233 sata_hba_inst->satahba_open_flag =
1234 SATA_DEVCTL_SOPENED;
1235 }
1236 }
1237 mutex_exit(&sata_mutex);
1238
1239 return (rv);
1240 }
1241
1242
1243 /*
1244 * Close devctl node.
1245 * Returns:
1246 * 0 if node was closed successfully, error code otherwise.
1247 *
1248 */
1249
1250 static int
sata_hba_close(dev_t dev,int flag,int otyp,cred_t * credp)1251 sata_hba_close(dev_t dev, int flag, int otyp, cred_t *credp)
1252 {
1253 #ifndef __lock_lint
1254 _NOTE(ARGUNUSED(credp))
1255 _NOTE(ARGUNUSED(flag))
1256 #endif
1257 dev_info_t *dip;
1258 scsi_hba_tran_t *scsi_hba_tran;
1259 sata_hba_inst_t *sata_hba_inst;
1260
1261 SATADBG1(SATA_DBG_IOCTL_IF, NULL, "sata_hba_close: entered", NULL);
1262
1263 if (otyp != OTYP_CHR)
1264 return (EINVAL);
1265
1266 dip = sata_devt_to_devinfo(dev);
1267 if (dip == NULL)
1268 return (ENXIO);
1269
1270 if ((scsi_hba_tran = ddi_get_driver_private(dip)) == NULL)
1271 return (ENXIO);
1272
1273 sata_hba_inst = scsi_hba_tran->tran_hba_private;
1274 if (sata_hba_inst == NULL || sata_hba_inst->satahba_attached == 0)
1275 return (ENXIO);
1276
1277 mutex_enter(&sata_mutex);
1278 sata_hba_inst->satahba_open_flag = 0;
1279 mutex_exit(&sata_mutex);
1280 return (0);
1281 }
1282
1283
1284
1285 /*
1286 * Standard IOCTL commands for SATA hotplugging.
1287 * Implemented DEVCTL_AP commands:
1288 * DEVCTL_AP_CONNECT
1289 * DEVCTL_AP_DISCONNECT
1290 * DEVCTL_AP_CONFIGURE
1291 * DEVCTL_UNCONFIGURE
1292 * DEVCTL_AP_CONTROL
1293 *
1294 * Commands passed to default ndi ioctl handler:
1295 * DEVCTL_DEVICE_GETSTATE
1296 * DEVCTL_DEVICE_ONLINE
1297 * DEVCTL_DEVICE_OFFLINE
1298 * DEVCTL_DEVICE_REMOVE
1299 * DEVCTL_DEVICE_INSERT
1300 * DEVCTL_BUS_GETSTATE
1301 *
1302 * All other cmds are passed to HBA if it provide ioctl handler, or failed
1303 * if not.
1304 *
1305 * Returns:
1306 * 0 if successful,
1307 * error code if operation failed.
1308 *
1309 * Port Multiplier support is supported now.
1310 *
1311 * NOTE: qual should be SATA_ADDR_DCPORT or SATA_ADDR_DPMPORT
1312 */
1313
1314 static int
sata_hba_ioctl(dev_t dev,int cmd,intptr_t arg,int mode,cred_t * credp,int * rvalp)1315 sata_hba_ioctl(dev_t dev, int cmd, intptr_t arg, int mode, cred_t *credp,
1316 int *rvalp)
1317 {
1318 #ifndef __lock_lint
1319 _NOTE(ARGUNUSED(credp))
1320 _NOTE(ARGUNUSED(rvalp))
1321 #endif
1322 int rv = 0;
1323 int32_t comp_port = -1;
1324 dev_info_t *dip;
1325 devctl_ap_state_t ap_state;
1326 struct devctl_iocdata *dcp = NULL;
1327 scsi_hba_tran_t *scsi_hba_tran;
1328 sata_hba_inst_t *sata_hba_inst;
1329 sata_device_t sata_device;
1330 sata_cport_info_t *cportinfo;
1331 int cport, pmport, qual;
1332 int rval = SATA_SUCCESS;
1333
1334 dip = sata_devt_to_devinfo(dev);
1335 if (dip == NULL)
1336 return (ENXIO);
1337
1338 if ((scsi_hba_tran = ddi_get_driver_private(dip)) == NULL)
1339 return (ENXIO);
1340
1341 sata_hba_inst = scsi_hba_tran->tran_hba_private;
1342 if (sata_hba_inst == NULL)
1343 return (ENXIO);
1344
1345 if (sata_hba_inst->satahba_tran == NULL)
1346 return (ENXIO);
1347
1348 switch (cmd) {
1349
1350 case DEVCTL_DEVICE_GETSTATE:
1351 case DEVCTL_DEVICE_ONLINE:
1352 case DEVCTL_DEVICE_OFFLINE:
1353 case DEVCTL_DEVICE_REMOVE:
1354 case DEVCTL_BUS_GETSTATE:
1355 /*
1356 * There may be more cases that we want to pass to default
1357 * handler rather than fail them.
1358 */
1359 return (ndi_devctl_ioctl(dip, cmd, arg, mode, 0));
1360 }
1361
1362 cport = pmport = qual = 0;
1363 cportinfo = NULL;
1364
1365 /* read devctl ioctl data */
1366 if (cmd != DEVCTL_AP_CONTROL && IS_DEVCTL(cmd)) {
1367 if (ndi_dc_allochdl((void *)arg, &dcp) != NDI_SUCCESS)
1368 return (EFAULT);
1369
1370 if ((comp_port = sata_get_port_num(sata_hba_inst, dcp)) ==
1371 -1) {
1372 if (dcp)
1373 ndi_dc_freehdl(dcp);
1374 return (EINVAL);
1375 }
1376
1377 /*
1378 * According to SCSI_TO_SATA_ADDR_QUAL, qual should be either
1379 * SATA_ADDR_DCPORT or SATA_ADDR_DPMPORT.
1380 */
1381 cport = SCSI_TO_SATA_CPORT(comp_port);
1382 pmport = SCSI_TO_SATA_PMPORT(comp_port);
1383 qual = SCSI_TO_SATA_ADDR_QUAL(comp_port);
1384
1385 if (sata_validate_sata_address(sata_hba_inst, cport, pmport,
1386 qual) != 0) {
1387 ndi_dc_freehdl(dcp);
1388 return (EINVAL);
1389 }
1390
1391 cportinfo = SATA_CPORT_INFO(sata_hba_inst, cport);
1392 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, cport)->
1393 cport_mutex);
1394 if (cportinfo->cport_event_flags & SATA_EVNT_LOCK_PORT_BUSY) {
1395 /*
1396 * Cannot process ioctl request now. Come back later.
1397 */
1398 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, cport)->
1399 cport_mutex);
1400 ndi_dc_freehdl(dcp);
1401 return (EBUSY);
1402 }
1403 /* Block event processing for this port */
1404 cportinfo->cport_event_flags |= SATA_APCTL_LOCK_PORT_BUSY;
1405 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, cport)->cport_mutex);
1406
1407 sata_device.satadev_addr.cport = cport;
1408 sata_device.satadev_addr.pmport = pmport;
1409 sata_device.satadev_addr.qual = qual;
1410 sata_device.satadev_rev = SATA_DEVICE_REV;
1411 }
1412
1413 switch (cmd) {
1414
1415 case DEVCTL_AP_DISCONNECT:
1416
1417 /*
1418 * Normally, cfgadm sata plugin will try to offline
1419 * (unconfigure) device before this request. Nevertheless,
1420 * if a device is still configured, we need to
1421 * attempt to offline and unconfigure device first, and we will
1422 * deactivate the port regardless of the unconfigure
1423 * operation results.
1424 *
1425 */
1426 rv = sata_ioctl_disconnect(sata_hba_inst, &sata_device);
1427
1428 break;
1429
1430 case DEVCTL_AP_UNCONFIGURE:
1431
1432 /*
1433 * The unconfigure operation uses generic nexus operation to
1434 * offline a device. It leaves a target device node attached.
1435 * and obviously sata_drive_info attached as well, because
1436 * from the hardware point of view nothing has changed.
1437 */
1438 rv = sata_ioctl_unconfigure(sata_hba_inst, &sata_device);
1439 break;
1440
1441 case DEVCTL_AP_CONNECT:
1442 {
1443 /*
1444 * The sata cfgadm pluging will invoke this operation only if
1445 * port was found in the disconnect state (failed state
1446 * is also treated as the disconnected state).
1447 * If port activation is successful and a device is found
1448 * attached to the port, the initialization sequence is
1449 * executed to probe the port and attach
1450 * a device structure to a port structure. The device is not
1451 * set in configured state (system-wise) by this operation.
1452 */
1453
1454 rv = sata_ioctl_connect(sata_hba_inst, &sata_device);
1455
1456 break;
1457 }
1458
1459 case DEVCTL_AP_CONFIGURE:
1460 {
1461 /*
1462 * A port may be in an active or shutdown state.
1463 * If port is in a failed state, operation is aborted.
1464 * If a port is in a shutdown state, sata_tran_port_activate()
1465 * is invoked prior to any other operation.
1466 *
1467 * Onlining the device involves creating a new target node.
1468 * If there is an old target node present (belonging to
1469 * previously removed device), the operation is aborted - the
1470 * old node has to be released and removed before configure
1471 * operation is attempted.
1472 */
1473
1474 rv = sata_ioctl_configure(sata_hba_inst, &sata_device);
1475
1476 break;
1477 }
1478
1479 case DEVCTL_AP_GETSTATE:
1480
1481 sata_cfgadm_state(sata_hba_inst, comp_port, &ap_state);
1482
1483 ap_state.ap_last_change = (time_t)-1;
1484 ap_state.ap_error_code = 0;
1485 ap_state.ap_in_transition = 0;
1486
1487 /* Copy the return AP-state information to the user space */
1488 if (ndi_dc_return_ap_state(&ap_state, dcp) != NDI_SUCCESS) {
1489 rv = EFAULT;
1490 }
1491 break;
1492
1493 case DEVCTL_AP_CONTROL:
1494 {
1495 /*
1496 * Generic devctl for hardware specific functionality
1497 */
1498 sata_ioctl_data_t ioc;
1499
1500 ASSERT(dcp == NULL);
1501
1502 /* Copy in user ioctl data first */
1503 #ifdef _MULTI_DATAMODEL
1504 if (ddi_model_convert_from(mode & FMODELS) ==
1505 DDI_MODEL_ILP32) {
1506
1507 sata_ioctl_data_32_t ioc32;
1508
1509 if (ddi_copyin((void *)arg, (void *)&ioc32,
1510 sizeof (ioc32), mode) != 0) {
1511 rv = EFAULT;
1512 break;
1513 }
1514 ioc.cmd = (uint_t)ioc32.cmd;
1515 ioc.port = (uint_t)ioc32.port;
1516 ioc.get_size = (uint_t)ioc32.get_size;
1517 ioc.buf = (caddr_t)(uintptr_t)ioc32.buf;
1518 ioc.bufsiz = (uint_t)ioc32.bufsiz;
1519 ioc.misc_arg = (uint_t)ioc32.misc_arg;
1520 } else
1521 #endif /* _MULTI_DATAMODEL */
1522 if (ddi_copyin((void *)arg, (void *)&ioc, sizeof (ioc),
1523 mode) != 0) {
1524 return (EFAULT);
1525 }
1526
1527 SATADBG2(SATA_DBG_IOCTL_IF, sata_hba_inst,
1528 "sata_hba_ioctl: DEVCTL_AP_CONTROL "
1529 "cmd 0x%x, port 0x%x", ioc.cmd, ioc.port);
1530
1531 /*
1532 * To avoid BE/LE and 32/64 issues, a get_size always returns
1533 * a 32-bit number.
1534 */
1535 if (ioc.get_size != 0 && ioc.bufsiz != (sizeof (uint32_t))) {
1536 return (EINVAL);
1537 }
1538 /* validate address */
1539 cport = SCSI_TO_SATA_CPORT(ioc.port);
1540 pmport = SCSI_TO_SATA_PMPORT(ioc.port);
1541 qual = SCSI_TO_SATA_ADDR_QUAL(ioc.port);
1542
1543 SATADBG3(SATA_DBG_IOCTL_IF, sata_hba_inst,
1544 "sata_hba_ioctl: target port is %d:%d (%d)",
1545 cport, pmport, qual);
1546
1547 if (sata_validate_sata_address(sata_hba_inst, cport,
1548 pmport, qual) != 0)
1549 return (EINVAL);
1550
1551 cportinfo = SATA_CPORT_INFO(sata_hba_inst, cport);
1552 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, cport)->
1553 cport_mutex);
1554 /* Is the port locked by event processing daemon ? */
1555 if (cportinfo->cport_event_flags & SATA_EVNT_LOCK_PORT_BUSY) {
1556 /*
1557 * Cannot process ioctl request now. Come back later
1558 */
1559 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, cport)->
1560 cport_mutex);
1561 return (EBUSY);
1562 }
1563 /* Block event processing for this port */
1564 cportinfo->cport_event_flags |= SATA_APCTL_LOCK_PORT_BUSY;
1565 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, cport)->cport_mutex);
1566
1567
1568 sata_device.satadev_addr.cport = cport;
1569 sata_device.satadev_addr.pmport = pmport;
1570 sata_device.satadev_addr.qual = qual;
1571 sata_device.satadev_rev = SATA_DEVICE_REV;
1572
1573 switch (ioc.cmd) {
1574
1575 case SATA_CFGA_RESET_PORT:
1576 /*
1577 * There is no protection for configured device.
1578 */
1579 rv = sata_ioctl_reset_port(sata_hba_inst, &sata_device);
1580 break;
1581
1582 case SATA_CFGA_RESET_DEVICE:
1583 /*
1584 * There is no protection for configured device.
1585 */
1586 rv = sata_ioctl_reset_device(sata_hba_inst,
1587 &sata_device);
1588 break;
1589
1590 case SATA_CFGA_RESET_ALL:
1591 /*
1592 * There is no protection for configured devices.
1593 */
1594 rv = sata_ioctl_reset_all(sata_hba_inst);
1595 /*
1596 * We return here, because common return is for
1597 * a single port operation - we have already unlocked
1598 * all ports and no dc handle was allocated.
1599 */
1600 return (rv);
1601
1602 case SATA_CFGA_PORT_DEACTIVATE:
1603 /*
1604 * Arbitrarily unconfigure attached device, if any.
1605 * Even if the unconfigure fails, proceed with the
1606 * port deactivation.
1607 */
1608 rv = sata_ioctl_deactivate(sata_hba_inst, &sata_device);
1609
1610 break;
1611
1612 case SATA_CFGA_PORT_ACTIVATE:
1613
1614 rv = sata_ioctl_activate(sata_hba_inst, &sata_device);
1615 break;
1616
1617 case SATA_CFGA_PORT_SELF_TEST:
1618
1619 rv = sata_ioctl_port_self_test(sata_hba_inst,
1620 &sata_device);
1621 break;
1622
1623 case SATA_CFGA_GET_DEVICE_PATH:
1624
1625 rv = sata_ioctl_get_device_path(sata_hba_inst,
1626 &sata_device, &ioc, mode);
1627 break;
1628
1629 case SATA_CFGA_GET_AP_TYPE:
1630
1631 rv = sata_ioctl_get_ap_type(sata_hba_inst,
1632 &sata_device, &ioc, mode);
1633 break;
1634
1635 case SATA_CFGA_GET_MODEL_INFO:
1636
1637 rv = sata_ioctl_get_model_info(sata_hba_inst,
1638 &sata_device, &ioc, mode);
1639 break;
1640
1641 case SATA_CFGA_GET_REVFIRMWARE_INFO:
1642
1643 rv = sata_ioctl_get_revfirmware_info(sata_hba_inst,
1644 &sata_device, &ioc, mode);
1645 break;
1646
1647 case SATA_CFGA_GET_SERIALNUMBER_INFO:
1648
1649 rv = sata_ioctl_get_serialnumber_info(sata_hba_inst,
1650 &sata_device, &ioc, mode);
1651 break;
1652
1653 default:
1654 rv = EINVAL;
1655 break;
1656
1657 } /* End of DEVCTL_AP_CONTROL cmd switch */
1658
1659 break;
1660 }
1661
1662 default:
1663 {
1664 /*
1665 * If we got here, we got an IOCTL that SATA HBA Framework
1666 * does not recognize. Pass ioctl to HBA driver, in case
1667 * it could process it.
1668 */
1669 sata_hba_tran_t *sata_tran = sata_hba_inst->satahba_tran;
1670 dev_info_t *mydip = SATA_DIP(sata_hba_inst);
1671
1672 SATADBG1(SATA_DBG_IOCTL_IF, sata_hba_inst,
1673 "IOCTL 0x%2x not supported in SATA framework, "
1674 "passthrough to HBA", cmd);
1675
1676 if (sata_tran->sata_tran_ioctl == NULL) {
1677 rv = EINVAL;
1678 break;
1679 }
1680 rval = (*sata_tran->sata_tran_ioctl)(mydip, cmd, arg);
1681 if (rval != 0) {
1682 SATADBG1(SATA_DBG_IOCTL_IF, sata_hba_inst,
1683 "IOCTL 0x%2x failed in HBA", cmd);
1684 rv = rval;
1685 }
1686 break;
1687 }
1688
1689 } /* End of main IOCTL switch */
1690
1691 if (dcp) {
1692 ndi_dc_freehdl(dcp);
1693 }
1694
1695 if (IS_DEVCTL(cmd)) {
1696 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst,
1697 cport)->cport_mutex);
1698 cportinfo->cport_event_flags &= ~SATA_APCTL_LOCK_PORT_BUSY;
1699 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, cport)->cport_mutex);
1700 }
1701
1702 return (rv);
1703 }
1704
1705
1706 /*
1707 * Create error retrieval sata packet
1708 *
1709 * A sata packet is allocated and set-up to contain specified error retrieval
1710 * command and appropriate dma-able data buffer.
1711 * No association with any scsi packet is made and no callback routine is
1712 * specified.
1713 *
1714 * Returns a pointer to sata packet upon successful packet creation.
1715 * Returns NULL, if packet cannot be created.
1716 */
1717 sata_pkt_t *
sata_get_error_retrieval_pkt(dev_info_t * dip,sata_device_t * sata_device,int pkt_type)1718 sata_get_error_retrieval_pkt(dev_info_t *dip, sata_device_t *sata_device,
1719 int pkt_type)
1720 {
1721 sata_hba_inst_t *sata_hba_inst;
1722 sata_pkt_txlate_t *spx;
1723 sata_pkt_t *spkt;
1724 sata_drive_info_t *sdinfo;
1725
1726 mutex_enter(&sata_mutex);
1727 for (sata_hba_inst = sata_hba_list; sata_hba_inst != NULL;
1728 sata_hba_inst = sata_hba_inst->satahba_next) {
1729 if (SATA_DIP(sata_hba_inst) == dip)
1730 break;
1731 }
1732 mutex_exit(&sata_mutex);
1733 ASSERT(sata_hba_inst != NULL);
1734
1735 sdinfo = sata_get_device_info(sata_hba_inst, sata_device);
1736 if (sdinfo == NULL) {
1737 sata_log(sata_hba_inst, CE_WARN,
1738 "sata: error recovery request for non-attached device at "
1739 "cport %d", sata_device->satadev_addr.cport);
1740 return (NULL);
1741 }
1742
1743 spx = kmem_zalloc(sizeof (sata_pkt_txlate_t), KM_SLEEP);
1744 spx->txlt_sata_hba_inst = sata_hba_inst;
1745 spx->txlt_scsi_pkt = NULL; /* No scsi pkt involved */
1746 spkt = sata_pkt_alloc(spx, NULL);
1747 if (spkt == NULL) {
1748 kmem_free(spx, sizeof (sata_pkt_txlate_t));
1749 return (NULL);
1750 }
1751 /* address is needed now */
1752 spkt->satapkt_device.satadev_addr = sata_device->satadev_addr;
1753
1754 switch (pkt_type) {
1755 case SATA_ERR_RETR_PKT_TYPE_NCQ:
1756 if (sata_ncq_err_ret_cmd_setup(spx, sdinfo) == SATA_SUCCESS) {
1757 if (sata_check_for_dma_error(dip, spx)) {
1758 ddi_fm_service_impact(dip,
1759 DDI_SERVICE_UNAFFECTED);
1760 break;
1761 }
1762 return (spkt);
1763 }
1764 break;
1765
1766 case SATA_ERR_RETR_PKT_TYPE_ATAPI:
1767 if (sata_atapi_err_ret_cmd_setup(spx, sdinfo) == SATA_SUCCESS) {
1768 if (sata_check_for_dma_error(dip, spx)) {
1769 ddi_fm_service_impact(dip,
1770 DDI_SERVICE_UNAFFECTED);
1771 break;
1772 }
1773 return (spkt);
1774 }
1775 break;
1776
1777 default:
1778 break;
1779 }
1780
1781 sata_pkt_free(spx);
1782 kmem_free(spx, sizeof (sata_pkt_txlate_t));
1783 return (NULL);
1784
1785 }
1786
1787
1788 /*
1789 * Free error retrieval sata packet
1790 *
1791 * Free sata packet and any associated resources allocated previously by
1792 * sata_get_error_retrieval_pkt().
1793 *
1794 * Void return.
1795 */
1796 void
sata_free_error_retrieval_pkt(sata_pkt_t * sata_pkt)1797 sata_free_error_retrieval_pkt(sata_pkt_t *sata_pkt)
1798 {
1799 sata_pkt_txlate_t *spx =
1800 (sata_pkt_txlate_t *)sata_pkt->satapkt_framework_private;
1801
1802 ASSERT(sata_pkt != NULL);
1803
1804 sata_free_local_buffer(spx);
1805 sata_pkt_free(spx);
1806 kmem_free(spx, sizeof (sata_pkt_txlate_t));
1807
1808 }
1809
1810 /*
1811 * Create READ PORT MULTIPLIER and WRITE PORT MULTIPLIER sata packet
1812 *
1813 * No association with any scsi packet is made and no callback routine is
1814 * specified.
1815 *
1816 * Returns a pointer to sata packet upon successful packet creation.
1817 * Returns NULL, if packet cannot be created.
1818 *
1819 * NOTE: Input/Output value includes 64 bits accoring to SATA Spec 2.6,
1820 * only lower 32 bits are available currently.
1821 */
1822 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)1823 sata_get_rdwr_pmult_pkt(dev_info_t *dip, sata_device_t *sd,
1824 uint16_t regn, uint32_t regv, uint32_t type)
1825 {
1826 sata_hba_inst_t *sata_hba_inst;
1827 sata_pkt_txlate_t *spx;
1828 sata_pkt_t *spkt;
1829 sata_cmd_t *scmd;
1830
1831 /* Only READ/WRITE commands are accepted. */
1832 ASSERT(type == SATA_RDWR_PMULT_PKT_TYPE_READ ||
1833 type == SATA_RDWR_PMULT_PKT_TYPE_WRITE);
1834
1835 mutex_enter(&sata_mutex);
1836 for (sata_hba_inst = sata_hba_list; sata_hba_inst != NULL;
1837 sata_hba_inst = sata_hba_inst->satahba_next) {
1838 if (SATA_DIP(sata_hba_inst) == dip)
1839 break;
1840 }
1841 mutex_exit(&sata_mutex);
1842 ASSERT(sata_hba_inst != NULL);
1843
1844 spx = kmem_zalloc(sizeof (sata_pkt_txlate_t), KM_SLEEP);
1845 spx->txlt_sata_hba_inst = sata_hba_inst;
1846 spx->txlt_scsi_pkt = NULL; /* No scsi pkt involved */
1847 spkt = sata_pkt_alloc(spx, SLEEP_FUNC);
1848 if (spkt == NULL) {
1849 kmem_free(spx, sizeof (sata_pkt_txlate_t));
1850 return (NULL);
1851 }
1852
1853 /*
1854 * NOTE: We need to send this command to the port multiplier,
1855 * that means send to SATA_PMULT_HOSTPORT(0xf) pmport
1856 *
1857 * sata_device contains the address of actual target device, and the
1858 * pmport number in the command comes from the sata_device structure.
1859 */
1860 spkt->satapkt_device.satadev_addr = sd->satadev_addr;
1861 spkt->satapkt_device.satadev_addr.pmport = SATA_PMULT_HOSTPORT;
1862 spkt->satapkt_device.satadev_addr.qual = SATA_ADDR_PMULT;
1863
1864 /* Fill sata_pkt */
1865 spkt->satapkt_op_mode = SATA_OPMODE_SYNCH | SATA_OPMODE_POLLING;
1866 spkt->satapkt_comp = NULL; /* Synchronous mode, no callback */
1867 spkt->satapkt_time = 10; /* Timeout 10s */
1868
1869 /* Build READ PORT MULTIPLIER cmd in the sata_pkt */
1870 scmd = &spkt->satapkt_cmd;
1871 scmd->satacmd_features_reg = regn & 0xff;
1872 scmd->satacmd_features_reg_ext = (regn >> 8) & 0xff;
1873 scmd->satacmd_device_reg = sd->satadev_addr.pmport;
1874 scmd->satacmd_addr_type = 0; /* N/A */
1875
1876 scmd->satacmd_flags.sata_ignore_dev_reset = B_TRUE;
1877
1878 if (type == SATA_RDWR_PMULT_PKT_TYPE_READ) {
1879 scmd->satacmd_cmd_reg = SATAC_READ_PORTMULT;
1880 scmd->satacmd_flags.sata_data_direction = SATA_DIR_READ;
1881 scmd->satacmd_flags.sata_special_regs = 1;
1882 scmd->satacmd_flags.sata_copy_out_lba_high_lsb = 1;
1883 scmd->satacmd_flags.sata_copy_out_lba_mid_lsb = 1;
1884 scmd->satacmd_flags.sata_copy_out_lba_low_lsb = 1;
1885 scmd->satacmd_flags.sata_copy_out_sec_count_lsb = 1;
1886 } else if (type == SATA_RDWR_PMULT_PKT_TYPE_WRITE) {
1887 scmd->satacmd_cmd_reg = SATAC_WRITE_PORTMULT;
1888 scmd->satacmd_flags.sata_data_direction = SATA_DIR_WRITE;
1889 scmd->satacmd_sec_count_lsb = regv & 0xff;
1890 scmd->satacmd_lba_low_lsb = regv >> 8 & 0xff;
1891 scmd->satacmd_lba_mid_lsb = regv >> 16 & 0xff;
1892 scmd->satacmd_lba_high_lsb = regv >> 24 & 0xff;
1893 }
1894
1895 return (spkt);
1896 }
1897
1898 /*
1899 * Free sata packet and any associated resources allocated previously by
1900 * sata_get_rdwr_pmult_pkt().
1901 *
1902 * Void return.
1903 */
1904 void
sata_free_rdwr_pmult_pkt(sata_pkt_t * sata_pkt)1905 sata_free_rdwr_pmult_pkt(sata_pkt_t *sata_pkt)
1906 {
1907 sata_pkt_txlate_t *spx =
1908 (sata_pkt_txlate_t *)sata_pkt->satapkt_framework_private;
1909
1910 /* Free allocated resources */
1911 sata_pkt_free(spx);
1912 kmem_free(spx, sizeof (sata_pkt_txlate_t));
1913 }
1914
1915 /*
1916 * Register a port multiplier to framework.
1917 * 1) Store the GSCR values in the previous allocated pmult_info strctures.
1918 * 2) Search in the blacklist and update the number of the device ports of the
1919 * port multiplier.
1920 *
1921 * Void return.
1922 */
1923 void
sata_register_pmult(dev_info_t * dip,sata_device_t * sd,sata_pmult_gscr_t * sg)1924 sata_register_pmult(dev_info_t *dip, sata_device_t *sd, sata_pmult_gscr_t *sg)
1925 {
1926 sata_hba_inst_t *sata_hba_inst = NULL;
1927 sata_pmult_info_t *pmultinfo;
1928 sata_pmult_bl_t *blp;
1929 int cport = sd->satadev_addr.cport;
1930
1931 mutex_enter(&sata_mutex);
1932 for (sata_hba_inst = sata_hba_list; sata_hba_inst != NULL;
1933 sata_hba_inst = sata_hba_inst->satahba_next) {
1934 if (SATA_DIP(sata_hba_inst) == dip)
1935 if (sata_hba_inst->satahba_attached == 1)
1936 break;
1937 }
1938 mutex_exit(&sata_mutex);
1939 /* HBA not attached? */
1940 if (sata_hba_inst == NULL)
1941 return;
1942
1943 /* Number of pmports */
1944 sd->satadev_add_info = sg->gscr2 & SATA_PMULT_PORTNUM_MASK;
1945
1946 /* Check the blacklist */
1947 for (blp = sata_pmult_blacklist; blp->bl_gscr0; blp++) {
1948 if (sg->gscr0 != blp->bl_gscr0 && blp->bl_gscr0)
1949 continue;
1950 if (sg->gscr1 != blp->bl_gscr1 && blp->bl_gscr1)
1951 continue;
1952 if (sg->gscr2 != blp->bl_gscr2 && blp->bl_gscr2)
1953 continue;
1954
1955 cmn_err(CE_WARN, "!Port multiplier is on the blacklist.");
1956 sd->satadev_add_info = blp->bl_flags;
1957 break;
1958 }
1959
1960 /* Register the port multiplier GSCR */
1961 mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst, cport)));
1962 pmultinfo = SATA_PMULT_INFO(sata_hba_inst, cport);
1963 if (pmultinfo != NULL) {
1964 pmultinfo->pmult_gscr = *sg;
1965 pmultinfo->pmult_num_dev_ports =
1966 sd->satadev_add_info & SATA_PMULT_PORTNUM_MASK;
1967 SATADBG1(SATA_DBG_PMULT, sata_hba_inst,
1968 "Port multiplier registered at port %d", cport);
1969 }
1970 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst, cport)));
1971 }
1972
1973 /*
1974 * sata_split_model splits the model ID into vendor and product IDs.
1975 * It assumes that a vendor ID cannot be longer than 8 characters, and
1976 * that vendor and product ID are separated by a whitespace.
1977 */
1978 void
sata_split_model(char * model,char ** vendor,char ** product)1979 sata_split_model(char *model, char **vendor, char **product)
1980 {
1981 int i, modlen;
1982 char *vid, *pid;
1983
1984 /*
1985 * remove whitespace at the end of model
1986 */
1987 for (i = SATA_ID_MODEL_LEN; i > 0; i--)
1988 if (model[i] == ' ' || model[i] == '\t' || model[i] == '\0')
1989 model[i] = '\0';
1990 else
1991 break;
1992
1993 /*
1994 * try to split model into into vid/pid
1995 */
1996 modlen = strlen(model);
1997 for (i = 0, pid = model; i < modlen; i++, pid++)
1998 if ((*pid == ' ') || (*pid == '\t'))
1999 break;
2000
2001 /*
2002 * only use vid if it is less than 8 chars (as in SCSI)
2003 */
2004 if (i < modlen && i <= 8) {
2005 vid = model;
2006 /*
2007 * terminate vid, establish pid
2008 */
2009 *pid++ = '\0';
2010 } else {
2011 /*
2012 * vid will stay "ATA "
2013 */
2014 vid = NULL;
2015 /*
2016 * model is all pid
2017 */
2018 pid = model;
2019 }
2020
2021 *vendor = vid;
2022 *product = pid;
2023 }
2024
2025 /*
2026 * sata_name_child is for composing the name of the node
2027 * the format of the name is "target,0".
2028 */
2029 static int
sata_name_child(dev_info_t * dip,char * name,int namelen)2030 sata_name_child(dev_info_t *dip, char *name, int namelen)
2031 {
2032 int target;
2033
2034 target = ddi_prop_get_int(DDI_DEV_T_ANY, dip,
2035 DDI_PROP_DONTPASS, "target", -1);
2036 if (target == -1)
2037 return (DDI_FAILURE);
2038 (void) snprintf(name, namelen, "%x,0", target);
2039 return (DDI_SUCCESS);
2040 }
2041
2042
2043
2044 /* ****************** SCSA required entry points *********************** */
2045
2046 /*
2047 * Implementation of scsi tran_tgt_init.
2048 * sata_scsi_tgt_init() initializes scsi_device structure
2049 *
2050 * If successful, DDI_SUCCESS is returned.
2051 * DDI_FAILURE is returned if addressed device does not exist
2052 */
2053
2054 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)2055 sata_scsi_tgt_init(dev_info_t *hba_dip, dev_info_t *tgt_dip,
2056 scsi_hba_tran_t *hba_tran, struct scsi_device *sd)
2057 {
2058 #ifndef __lock_lint
2059 _NOTE(ARGUNUSED(hba_dip))
2060 _NOTE(ARGUNUSED(tgt_dip))
2061 #endif
2062 sata_device_t sata_device;
2063 sata_drive_info_t *sdinfo;
2064 struct sata_id *sid;
2065 sata_hba_inst_t *sata_hba_inst;
2066 char model[SATA_ID_MODEL_LEN + 1];
2067 char fw[SATA_ID_FW_LEN + 1];
2068 char *vid, *pid;
2069
2070 /*
2071 * Fail tran_tgt_init for .conf stub node
2072 */
2073 if (ndi_dev_is_persistent_node(tgt_dip) == 0) {
2074 (void) ndi_merge_node(tgt_dip, sata_name_child);
2075 ddi_set_name_addr(tgt_dip, NULL);
2076 return (DDI_FAILURE);
2077 }
2078
2079 sata_hba_inst = (sata_hba_inst_t *)(hba_tran->tran_hba_private);
2080
2081 /* Validate scsi device address */
2082 if (sata_validate_scsi_address(sata_hba_inst, &sd->sd_address,
2083 &sata_device) != 0)
2084 return (DDI_FAILURE);
2085
2086 mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst,
2087 sata_device.satadev_addr.cport)));
2088
2089 /* sata_device now contains a valid sata address */
2090 sdinfo = sata_get_device_info(sata_hba_inst, &sata_device);
2091 if (sdinfo == NULL) {
2092 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
2093 sata_device.satadev_addr.cport)));
2094 return (DDI_FAILURE);
2095 }
2096 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
2097 sata_device.satadev_addr.cport)));
2098
2099 /*
2100 * Check if we need to create a legacy devid (i.e cmdk style) for
2101 * the target disks.
2102 *
2103 * HBA devinfo node will have the property "use-cmdk-devid-format"
2104 * if we need to create cmdk-style devid for all the disk devices
2105 * attached to this controller. This property may have been set
2106 * from HBA driver's .conf file or by the HBA driver in its
2107 * attach(9E) function.
2108 */
2109 if ((sdinfo->satadrv_type == SATA_DTYPE_ATADISK) &&
2110 (ddi_getprop(DDI_DEV_T_ANY, hba_dip, DDI_PROP_DONTPASS,
2111 "use-cmdk-devid-format", 0) == 1)) {
2112 /* register a legacy devid for this target node */
2113 sata_target_devid_register(tgt_dip, sdinfo);
2114 }
2115
2116
2117 /*
2118 * 'Identify Device Data' does not always fit in standard SCSI
2119 * INQUIRY data, so establish INQUIRY_* properties with full-form
2120 * of information.
2121 */
2122 sid = &sdinfo->satadrv_id;
2123 #ifdef _LITTLE_ENDIAN
2124 swab(sid->ai_model, model, SATA_ID_MODEL_LEN);
2125 swab(sid->ai_fw, fw, SATA_ID_FW_LEN);
2126 #else /* _LITTLE_ENDIAN */
2127 bcopy(sid->ai_model, model, SATA_ID_MODEL_LEN);
2128 bcopy(sid->ai_fw, fw, SATA_ID_FW_LEN);
2129 #endif /* _LITTLE_ENDIAN */
2130 model[SATA_ID_MODEL_LEN] = 0;
2131 fw[SATA_ID_FW_LEN] = 0;
2132
2133 sata_split_model(model, &vid, &pid);
2134
2135 if (vid)
2136 (void) scsi_device_prop_update_inqstring(sd, INQUIRY_VENDOR_ID,
2137 vid, strlen(vid));
2138 if (pid)
2139 (void) scsi_device_prop_update_inqstring(sd, INQUIRY_PRODUCT_ID,
2140 pid, strlen(pid));
2141 (void) scsi_device_prop_update_inqstring(sd, INQUIRY_REVISION_ID,
2142 fw, strlen(fw));
2143
2144 return (DDI_SUCCESS);
2145 }
2146
2147 /*
2148 * Implementation of scsi tran_tgt_probe.
2149 * Probe target, by calling default scsi routine scsi_hba_probe()
2150 */
2151 static int
sata_scsi_tgt_probe(struct scsi_device * sd,int (* callback)(void))2152 sata_scsi_tgt_probe(struct scsi_device *sd, int (*callback)(void))
2153 {
2154 sata_hba_inst_t *sata_hba_inst =
2155 (sata_hba_inst_t *)(sd->sd_address.a_hba_tran->tran_hba_private);
2156 int rval;
2157 uint32_t pm_cap;
2158
2159 rval = scsi_hba_probe(sd, callback);
2160 pm_cap = SATA_CAP_POWER_CONDITON | SATA_CAP_SMART_PAGE |
2161 SATA_CAP_LOG_SENSE;
2162
2163 if (rval == SCSIPROBE_EXISTS) {
2164 /*
2165 * Set property "pm-capable" on the target device node, so that
2166 * the target driver will not try to fetch scsi cycle counters
2167 * before enabling device power-management.
2168 */
2169 if ((ddi_prop_update_int(DDI_DEV_T_NONE, sd->sd_dev,
2170 "pm-capable", pm_cap)) != DDI_PROP_SUCCESS) {
2171 sata_log(sata_hba_inst, CE_WARN,
2172 "SATA device at port %d: "
2173 "will not be power-managed ",
2174 SCSI_TO_SATA_CPORT(sd->sd_address.a_target));
2175 SATA_LOG_D((sata_hba_inst, CE_WARN,
2176 "failure updating pm-capable property"));
2177 }
2178 }
2179 return (rval);
2180 }
2181
2182 /*
2183 * Implementation of scsi tran_tgt_free.
2184 * Release all resources allocated for scsi_device
2185 */
2186 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)2187 sata_scsi_tgt_free(dev_info_t *hba_dip, dev_info_t *tgt_dip,
2188 scsi_hba_tran_t *hba_tran, struct scsi_device *sd)
2189 {
2190 #ifndef __lock_lint
2191 _NOTE(ARGUNUSED(hba_dip))
2192 #endif
2193 sata_device_t sata_device;
2194 sata_drive_info_t *sdinfo;
2195 sata_hba_inst_t *sata_hba_inst;
2196 ddi_devid_t devid;
2197
2198 sata_hba_inst = (sata_hba_inst_t *)(hba_tran->tran_hba_private);
2199
2200 /* Validate scsi device address */
2201 /*
2202 * Note: tgt_free relates to the SCSA view of a device. If called, there
2203 * was a device at this address, so even if the sata framework internal
2204 * resources were alredy released because a device was detached,
2205 * this function should be executed as long as its actions do
2206 * not require the internal sata view of a device and the address
2207 * refers to a valid sata address.
2208 * Validating the address here means that we do not trust SCSA...
2209 */
2210 if (sata_validate_scsi_address(sata_hba_inst, &sd->sd_address,
2211 &sata_device) == -1)
2212 return;
2213
2214 mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst,
2215 sata_device.satadev_addr.cport)));
2216
2217 /* sata_device now should contain a valid sata address */
2218 sdinfo = sata_get_device_info(sata_hba_inst, &sata_device);
2219 if (sdinfo == NULL) {
2220 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
2221 sata_device.satadev_addr.cport)));
2222 return;
2223 }
2224 /*
2225 * We did not allocate any resources in sata_scsi_tgt_init()
2226 * other than few properties.
2227 * Free them.
2228 */
2229 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
2230 sata_device.satadev_addr.cport)));
2231 (void) ndi_prop_remove(DDI_DEV_T_NONE, tgt_dip, "pm-capable");
2232
2233 /*
2234 * If devid was previously created but not freed up from
2235 * sd(4D) driver (i.e during detach(9E)) then do it here.
2236 */
2237 if ((sdinfo->satadrv_type == SATA_DTYPE_ATADISK) &&
2238 (ddi_getprop(DDI_DEV_T_ANY, hba_dip, DDI_PROP_DONTPASS,
2239 "use-cmdk-devid-format", 0) == 1) &&
2240 (ddi_devid_get(tgt_dip, &devid) == DDI_SUCCESS)) {
2241 ddi_devid_unregister(tgt_dip);
2242 ddi_devid_free(devid);
2243 }
2244 }
2245
2246 /*
2247 * Implementation of scsi tran_init_pkt
2248 * Upon successful return, scsi pkt buffer has DMA resources allocated.
2249 *
2250 * It seems that we should always allocate pkt, even if the address is
2251 * for non-existing device - just use some default for dma_attr.
2252 * The reason is that there is no way to communicate this to a caller here.
2253 * Subsequent call to sata_scsi_start may fail appropriately.
2254 * Simply returning NULL does not seem to discourage a target driver...
2255 *
2256 * Returns a pointer to initialized scsi_pkt, or NULL otherwise.
2257 */
2258 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)2259 sata_scsi_init_pkt(struct scsi_address *ap, struct scsi_pkt *pkt,
2260 struct buf *bp, int cmdlen, int statuslen, int tgtlen, int flags,
2261 int (*callback)(caddr_t), caddr_t arg)
2262 {
2263 sata_hba_inst_t *sata_hba_inst =
2264 (sata_hba_inst_t *)(ap->a_hba_tran->tran_hba_private);
2265 dev_info_t *dip = SATA_DIP(sata_hba_inst);
2266 sata_device_t sata_device;
2267 sata_drive_info_t *sdinfo;
2268 sata_pkt_txlate_t *spx;
2269 ddi_dma_attr_t cur_dma_attr;
2270 int rval;
2271 boolean_t new_pkt = B_TRUE;
2272
2273 ASSERT(ap->a_hba_tran->tran_hba_dip == dip);
2274
2275 /*
2276 * We need to translate the address, even if it could be
2277 * a bogus one, for a non-existing device
2278 */
2279 sata_device.satadev_addr.qual = SCSI_TO_SATA_ADDR_QUAL(ap->a_target);
2280 sata_device.satadev_addr.cport = SCSI_TO_SATA_CPORT(ap->a_target);
2281 sata_device.satadev_addr.pmport = SCSI_TO_SATA_PMPORT(ap->a_target);
2282 sata_device.satadev_rev = SATA_DEVICE_REV;
2283
2284 if (pkt == NULL) {
2285 /*
2286 * Have to allocate a brand new scsi packet.
2287 * We need to operate with auto request sense enabled.
2288 */
2289 pkt = scsi_hba_pkt_alloc(dip, ap, cmdlen,
2290 MAX(statuslen, SATA_MAX_SENSE_LEN),
2291 tgtlen, sizeof (sata_pkt_txlate_t), callback, arg);
2292
2293 if (pkt == NULL)
2294 return (NULL);
2295
2296 /* Fill scsi packet structure */
2297 pkt->pkt_comp = (void (*)())NULL;
2298 pkt->pkt_time = 0;
2299 pkt->pkt_resid = 0;
2300 pkt->pkt_statistics = 0;
2301 pkt->pkt_reason = 0;
2302
2303 /*
2304 * pkt_hba_private will point to sata pkt txlate structure
2305 */
2306 spx = (sata_pkt_txlate_t *)pkt->pkt_ha_private;
2307 bzero(spx, sizeof (sata_pkt_txlate_t));
2308
2309 spx->txlt_scsi_pkt = pkt;
2310 spx->txlt_sata_hba_inst = sata_hba_inst;
2311
2312 /* Allocate sata_pkt */
2313 spx->txlt_sata_pkt = sata_pkt_alloc(spx, callback);
2314 if (spx->txlt_sata_pkt == NULL) {
2315 /* Could not allocate sata pkt */
2316 scsi_hba_pkt_free(ap, pkt);
2317 return (NULL);
2318 }
2319 /* Set sata address */
2320 spx->txlt_sata_pkt->satapkt_device.satadev_addr =
2321 sata_device.satadev_addr;
2322 spx->txlt_sata_pkt->satapkt_device.satadev_rev =
2323 sata_device.satadev_rev;
2324
2325 if ((bp == NULL) || (bp->b_bcount == 0))
2326 return (pkt);
2327
2328 spx->txlt_total_residue = bp->b_bcount;
2329 } else {
2330 new_pkt = B_FALSE;
2331 /*
2332 * Packet was preallocated/initialized by previous call
2333 */
2334 spx = (sata_pkt_txlate_t *)pkt->pkt_ha_private;
2335
2336 if ((bp == NULL) || (bp->b_bcount == 0)) {
2337 return (pkt);
2338 }
2339
2340 /* Pkt is available already: spx->txlt_scsi_pkt == pkt; */
2341 }
2342
2343 spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp = bp;
2344
2345 /*
2346 * We use an adjusted version of the dma_attr, to account
2347 * for device addressing limitations.
2348 * sata_adjust_dma_attr() will handle sdinfo == NULL which may
2349 * happen when a device is not yet configured.
2350 */
2351 mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst,
2352 sata_device.satadev_addr.cport)));
2353 sdinfo = sata_get_device_info(spx->txlt_sata_hba_inst,
2354 &spx->txlt_sata_pkt->satapkt_device);
2355 /* NULL sdinfo may be passsed to sata_adjust_dma_attr() */
2356 sata_adjust_dma_attr(sdinfo,
2357 SATA_DMA_ATTR(spx->txlt_sata_hba_inst), &cur_dma_attr);
2358 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
2359 sata_device.satadev_addr.cport)));
2360 /*
2361 * Allocate necessary DMA resources for the packet's data buffer
2362 * NOTE:
2363 * In case of read/write commands, DMA resource allocation here is
2364 * based on the premise that the transfer length specified in
2365 * the read/write scsi cdb will match exactly DMA resources -
2366 * returning correct packet residue is crucial.
2367 */
2368 if ((rval = sata_dma_buf_setup(spx, flags, callback, arg,
2369 &cur_dma_attr)) != DDI_SUCCESS) {
2370 /*
2371 * If a DMA allocation request fails with
2372 * DDI_DMA_NOMAPPING, indicate the error by calling
2373 * bioerror(9F) with bp and an error code of EFAULT.
2374 * If a DMA allocation request fails with
2375 * DDI_DMA_TOOBIG, indicate the error by calling
2376 * bioerror(9F) with bp and an error code of EINVAL.
2377 * For DDI_DMA_NORESOURCES, we may have some of them allocated.
2378 * Request may be repeated later - there is no real error.
2379 */
2380 switch (rval) {
2381 case DDI_DMA_NORESOURCES:
2382 bioerror(bp, 0);
2383 break;
2384 case DDI_DMA_NOMAPPING:
2385 case DDI_DMA_BADATTR:
2386 bioerror(bp, EFAULT);
2387 break;
2388 case DDI_DMA_TOOBIG:
2389 default:
2390 bioerror(bp, EINVAL);
2391 break;
2392 }
2393 goto fail;
2394 }
2395
2396 if (sata_check_for_dma_error(dip, spx)) {
2397 ddi_fm_service_impact(dip, DDI_SERVICE_UNAFFECTED);
2398 bioerror(bp, EFAULT);
2399 goto fail;
2400 }
2401
2402 /* Set number of bytes that are not yet accounted for */
2403 pkt->pkt_resid = spx->txlt_total_residue;
2404 ASSERT(pkt->pkt_resid >= 0);
2405
2406 return (pkt);
2407
2408 fail:
2409 if (new_pkt == B_TRUE) {
2410 /*
2411 * Since this is a new packet, we can clean-up
2412 * everything
2413 */
2414 sata_scsi_destroy_pkt(ap, pkt);
2415 } else {
2416 /*
2417 * This is a re-used packet. It will be target driver's
2418 * responsibility to eventually destroy it (which
2419 * will free allocated resources).
2420 * Here, we just "complete" the request, leaving
2421 * allocated resources intact, so the request may
2422 * be retried.
2423 */
2424 spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp = NULL;
2425 sata_pkt_free(spx);
2426 }
2427 return (NULL);
2428 }
2429
2430 /*
2431 * Implementation of scsi tran_start.
2432 * Translate scsi cmd into sata operation and return status.
2433 * ATAPI CDBs are passed to ATAPI devices - the device determines what commands
2434 * are supported.
2435 * For SATA hard disks, supported scsi commands:
2436 * SCMD_INQUIRY
2437 * SCMD_TEST_UNIT_READY
2438 * SCMD_START_STOP
2439 * SCMD_READ_CAPACITY
2440 * SCMD_SVC_ACTION_IN_G4 (READ CAPACITY (16))
2441 * SCMD_REQUEST_SENSE
2442 * SCMD_LOG_SENSE_G1
2443 * SCMD_LOG_SELECT_G1
2444 * SCMD_MODE_SENSE (specific pages)
2445 * SCMD_MODE_SENSE_G1 (specific pages)
2446 * SCMD_MODE_SELECT (specific pages)
2447 * SCMD_MODE_SELECT_G1 (specific pages)
2448 * SCMD_SYNCHRONIZE_CACHE
2449 * SCMD_SYNCHRONIZE_CACHE_G1
2450 * SCMD_READ
2451 * SCMD_READ_G1
2452 * SCMD_READ_G4
2453 * SCMD_READ_G5
2454 * SCMD_WRITE
2455 * SCMD_WRITE_BUFFER
2456 * SCMD_WRITE_G1
2457 * SCMD_WRITE_G4
2458 * SCMD_WRITE_G5
2459 * SCMD_SEEK (noop)
2460 * SCMD_SDIAG
2461 *
2462 * All other commands are rejected as unsupported.
2463 *
2464 * Returns:
2465 * TRAN_ACCEPT if command was executed successfully or accepted by HBA driver
2466 * for execution. TRAN_ACCEPT may be returned also if device was removed but
2467 * a callback could be scheduled.
2468 * TRAN_BADPKT if cmd was directed to invalid address.
2469 * TRAN_FATAL_ERROR is command was rejected due to hardware error, including
2470 * some unspecified error. TRAN_FATAL_ERROR may be also returned if a device
2471 * was removed and there was no callback specified in scsi pkt.
2472 * TRAN_BUSY if command could not be executed becasue HBA driver or SATA
2473 * framework was busy performing some other operation(s).
2474 *
2475 */
2476 static int
sata_scsi_start(struct scsi_address * ap,struct scsi_pkt * pkt)2477 sata_scsi_start(struct scsi_address *ap, struct scsi_pkt *pkt)
2478 {
2479 sata_hba_inst_t *sata_hba_inst =
2480 (sata_hba_inst_t *)(ap->a_hba_tran->tran_hba_private);
2481 sata_pkt_txlate_t *spx = (sata_pkt_txlate_t *)pkt->pkt_ha_private;
2482 sata_device_t *sdevice = &spx->txlt_sata_pkt->satapkt_device;
2483 sata_drive_info_t *sdinfo = NULL;
2484 struct buf *bp;
2485 uint8_t cport, pmport;
2486 boolean_t dev_gone = B_FALSE;
2487 int rval;
2488
2489 SATADBG1(SATA_DBG_SCSI_IF, sata_hba_inst,
2490 "sata_scsi_start: cmd 0x%02x\n", pkt->pkt_cdbp[0]);
2491
2492 ASSERT(spx != NULL &&
2493 spx->txlt_scsi_pkt == pkt && spx->txlt_sata_pkt != NULL);
2494
2495 cport = SCSI_TO_SATA_CPORT(ap->a_target);
2496 pmport = SCSI_TO_SATA_PMPORT(ap->a_target);
2497
2498 mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst, cport)));
2499
2500 if (sdevice->satadev_addr.qual == SATA_ADDR_DCPORT) {
2501 sdinfo = sata_get_device_info(sata_hba_inst, sdevice);
2502 if (sdinfo == NULL ||
2503 SATA_CPORT_INFO(sata_hba_inst, cport)->
2504 cport_tgtnode_clean == B_FALSE ||
2505 (sdinfo->satadrv_state & SATA_DSTATE_FAILED) != 0) {
2506 dev_gone = B_TRUE;
2507 }
2508 } else if (sdevice->satadev_addr.qual == SATA_ADDR_DPMPORT) {
2509 if (SATA_CPORT_DEV_TYPE(sata_hba_inst, cport) !=
2510 SATA_DTYPE_PMULT || SATA_PMULT_INFO(sata_hba_inst,
2511 cport) == NULL) {
2512 dev_gone = B_TRUE;
2513 } else if (SATA_PMPORT_INFO(sata_hba_inst, cport,
2514 pmport) == NULL) {
2515 dev_gone = B_TRUE;
2516 } else {
2517 mutex_enter(&(SATA_PMPORT_MUTEX(sata_hba_inst,
2518 cport, pmport)));
2519 sdinfo = sata_get_device_info(sata_hba_inst, sdevice);
2520 if (sdinfo == NULL ||
2521 SATA_PMPORT_INFO(sata_hba_inst, cport, pmport)->
2522 pmport_tgtnode_clean == B_FALSE ||
2523 (sdinfo->satadrv_state & SATA_DSTATE_FAILED) != 0) {
2524 dev_gone = B_TRUE;
2525 }
2526 mutex_exit(&(SATA_PMPORT_MUTEX(sata_hba_inst,
2527 cport, pmport)));
2528 }
2529 }
2530
2531 if (dev_gone == B_TRUE) {
2532 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst, cport)));
2533 pkt->pkt_reason = CMD_DEV_GONE;
2534 /*
2535 * The sd target driver is checking CMD_DEV_GONE pkt_reason
2536 * only in callback function (for normal requests) and
2537 * in the dump code path.
2538 * So, if the callback is available, we need to do
2539 * the callback rather than returning TRAN_FATAL_ERROR here.
2540 */
2541 if (pkt->pkt_comp != NULL) {
2542 /* scsi callback required */
2543 if (servicing_interrupt()) {
2544 if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
2545 (task_func_t *)spx->txlt_scsi_pkt->pkt_comp,
2546 (void *)spx->txlt_scsi_pkt, TQ_NOSLEEP) ==
2547 TASKQID_INVALID) {
2548 return (TRAN_BUSY);
2549 }
2550 } else if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
2551 (task_func_t *)spx->txlt_scsi_pkt->pkt_comp,
2552 spx->txlt_scsi_pkt, TQ_SLEEP) == TASKQID_INVALID) {
2553 /* Scheduling the callback failed */
2554 return (TRAN_BUSY);
2555 }
2556 return (TRAN_ACCEPT);
2557 }
2558 /* No callback available */
2559 return (TRAN_FATAL_ERROR);
2560 }
2561
2562 if (sdinfo->satadrv_type & SATA_DTYPE_ATAPI) {
2563 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst, cport)));
2564 rval = sata_txlt_atapi(spx);
2565 SATADBG1(SATA_DBG_SCSI_IF, sata_hba_inst,
2566 "sata_scsi_start atapi: rval %d\n", rval);
2567 return (rval);
2568 }
2569 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst, cport)));
2570
2571 /*
2572 * Checking for power state, if it was on
2573 * STOPPED state, then the drive is not capable
2574 * of processing media access command. And
2575 * TEST_UNIT_READY, REQUEST_SENSE has special handling
2576 * in the function for different power state.
2577 */
2578 if (((sdinfo->satadrv_power_level == SATA_POWER_STANDBY) ||
2579 (sdinfo->satadrv_power_level == SATA_POWER_STOPPED)) &&
2580 (SATA_IS_MEDIUM_ACCESS_CMD(pkt->pkt_cdbp[0]))) {
2581 return (sata_txlt_check_condition(spx, KEY_NOT_READY,
2582 SD_SCSI_ASC_LU_NOT_READY));
2583 }
2584
2585 /* ATA Disk commands processing starts here */
2586
2587 bp = spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp;
2588
2589 switch (pkt->pkt_cdbp[0]) {
2590
2591 case SCMD_INQUIRY:
2592 /* Mapped to identify device */
2593 if (bp != NULL && (bp->b_flags & (B_PHYS | B_PAGEIO)))
2594 bp_mapin(bp);
2595 rval = sata_txlt_inquiry(spx);
2596 break;
2597
2598 case SCMD_TEST_UNIT_READY:
2599 /*
2600 * SAT "SATA to ATA Translation" doc specifies translation
2601 * to ATA CHECK POWER MODE.
2602 */
2603 rval = sata_txlt_test_unit_ready(spx);
2604 break;
2605
2606 case SCMD_START_STOP:
2607 /* Mapping depends on the command */
2608 rval = sata_txlt_start_stop_unit(spx);
2609 break;
2610
2611 case SCMD_READ_CAPACITY:
2612 if (bp != NULL && (bp->b_flags & (B_PHYS | B_PAGEIO)))
2613 bp_mapin(bp);
2614 rval = sata_txlt_read_capacity(spx);
2615 break;
2616
2617 case SCMD_SVC_ACTION_IN_G4: /* READ CAPACITY (16) */
2618 if (bp != NULL && (bp->b_flags & (B_PHYS | B_PAGEIO)))
2619 bp_mapin(bp);
2620 rval = sata_txlt_read_capacity16(spx);
2621 break;
2622
2623 case SCMD_REQUEST_SENSE:
2624 /*
2625 * Always No Sense, since we force ARQ
2626 */
2627 if (bp != NULL && (bp->b_flags & (B_PHYS | B_PAGEIO)))
2628 bp_mapin(bp);
2629 rval = sata_txlt_request_sense(spx);
2630 break;
2631
2632 case SCMD_LOG_SENSE_G1:
2633 if (bp != NULL && (bp->b_flags & (B_PHYS | B_PAGEIO)))
2634 bp_mapin(bp);
2635 rval = sata_txlt_log_sense(spx);
2636 break;
2637
2638 case SCMD_LOG_SELECT_G1:
2639 if (bp != NULL && (bp->b_flags & (B_PHYS | B_PAGEIO)))
2640 bp_mapin(bp);
2641 rval = sata_txlt_log_select(spx);
2642 break;
2643
2644 case SCMD_MODE_SENSE:
2645 case SCMD_MODE_SENSE_G1:
2646 if (bp != NULL && (bp->b_flags & (B_PHYS | B_PAGEIO)))
2647 bp_mapin(bp);
2648 rval = sata_txlt_mode_sense(spx);
2649 break;
2650
2651
2652 case SCMD_MODE_SELECT:
2653 case SCMD_MODE_SELECT_G1:
2654 if (bp != NULL && (bp->b_flags & (B_PHYS | B_PAGEIO)))
2655 bp_mapin(bp);
2656 rval = sata_txlt_mode_select(spx);
2657 break;
2658
2659 case SCMD_SYNCHRONIZE_CACHE:
2660 case SCMD_SYNCHRONIZE_CACHE_G1:
2661 rval = sata_txlt_synchronize_cache(spx);
2662 break;
2663
2664 case SCMD_READ:
2665 case SCMD_READ_G1:
2666 case SCMD_READ_G4:
2667 case SCMD_READ_G5:
2668 rval = sata_txlt_read(spx);
2669 break;
2670 case SCMD_WRITE_BUFFER:
2671 if (bp != NULL && (bp->b_flags & (B_PHYS | B_PAGEIO)))
2672 bp_mapin(bp);
2673 rval = sata_txlt_write_buffer(spx);
2674 break;
2675
2676 case SCMD_WRITE:
2677 case SCMD_WRITE_G1:
2678 case SCMD_WRITE_G4:
2679 case SCMD_WRITE_G5:
2680 rval = sata_txlt_write(spx);
2681 break;
2682
2683 case SCMD_SEEK:
2684 rval = sata_txlt_nodata_cmd_immediate(spx);
2685 break;
2686
2687 case SPC3_CMD_ATA_COMMAND_PASS_THROUGH12:
2688 case SPC3_CMD_ATA_COMMAND_PASS_THROUGH16:
2689 if (bp != NULL && (bp->b_flags & (B_PHYS | B_PAGEIO)))
2690 bp_mapin(bp);
2691 rval = sata_txlt_ata_pass_thru(spx);
2692 break;
2693
2694 /* Other cases will be filed later */
2695 /* postponed until phase 2 of the development */
2696 case SPC3_CMD_UNMAP:
2697 if (bp != NULL && (bp->b_flags & (B_PHYS | B_PAGEIO)))
2698 bp_mapin(bp);
2699 rval = sata_txlt_unmap(spx);
2700 break;
2701 default:
2702 rval = sata_txlt_invalid_command(spx);
2703 break;
2704 }
2705
2706 SATADBG1(SATA_DBG_SCSI_IF, sata_hba_inst,
2707 "sata_scsi_start: rval %d\n", rval);
2708
2709 return (rval);
2710 }
2711
2712 /*
2713 * Implementation of scsi tran_abort.
2714 * Abort specific pkt or all packets.
2715 *
2716 * Returns 1 if one or more packets were aborted, returns 0 otherwise
2717 *
2718 * May be called from an interrupt level.
2719 */
2720 static int
sata_scsi_abort(struct scsi_address * ap,struct scsi_pkt * scsi_pkt)2721 sata_scsi_abort(struct scsi_address *ap, struct scsi_pkt *scsi_pkt)
2722 {
2723 sata_hba_inst_t *sata_hba_inst =
2724 (sata_hba_inst_t *)(ap->a_hba_tran->tran_hba_private);
2725 sata_device_t sata_device;
2726 sata_pkt_t *sata_pkt;
2727
2728 SATADBG2(SATA_DBG_SCSI_IF, sata_hba_inst,
2729 "sata_scsi_abort: %s at target: 0x%x\n",
2730 scsi_pkt == NULL ? "all packets" : "one pkt", ap->a_target);
2731
2732 /* Validate address */
2733 if (sata_validate_scsi_address(sata_hba_inst, ap, &sata_device) != 0)
2734 /* Invalid address */
2735 return (0);
2736
2737 mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst,
2738 sata_device.satadev_addr.cport)));
2739 if (sata_get_device_info(sata_hba_inst, &sata_device) == NULL) {
2740 /* invalid address */
2741 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
2742 sata_device.satadev_addr.cport)));
2743 return (0);
2744 }
2745 if (scsi_pkt == NULL) {
2746 /*
2747 * Abort all packets.
2748 * Although we do not have specific packet, we still need
2749 * dummy packet structure to pass device address to HBA.
2750 * Allocate one, without sleeping. Fail if pkt cannot be
2751 * allocated.
2752 */
2753 sata_pkt = kmem_zalloc(sizeof (sata_pkt_t), KM_NOSLEEP);
2754 if (sata_pkt == NULL) {
2755 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
2756 sata_device.satadev_addr.cport)));
2757 SATA_LOG_D((sata_hba_inst, CE_WARN, "sata_pkt_abort: "
2758 "could not allocate sata_pkt"));
2759 return (0);
2760 }
2761 sata_pkt->satapkt_rev = SATA_PKT_REV;
2762 sata_pkt->satapkt_device = sata_device;
2763 sata_pkt->satapkt_device.satadev_rev = SATA_DEVICE_REV;
2764 } else {
2765 if (scsi_pkt->pkt_ha_private == NULL) {
2766 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
2767 sata_device.satadev_addr.cport)));
2768 return (0); /* Bad scsi pkt */
2769 }
2770 /* extract pointer to sata pkt */
2771 sata_pkt = ((sata_pkt_txlate_t *)scsi_pkt->pkt_ha_private)->
2772 txlt_sata_pkt;
2773 }
2774
2775 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
2776 sata_device.satadev_addr.cport)));
2777 /* Send abort request to HBA */
2778 if ((*SATA_ABORT_FUNC(sata_hba_inst))
2779 (SATA_DIP(sata_hba_inst), sata_pkt,
2780 scsi_pkt == NULL ? SATA_ABORT_ALL_PACKETS : SATA_ABORT_PACKET) ==
2781 SATA_SUCCESS) {
2782 if (scsi_pkt == NULL)
2783 kmem_free(sata_pkt, sizeof (sata_pkt_t));
2784 /* Success */
2785 return (1);
2786 }
2787 /* Else, something did not go right */
2788 if (scsi_pkt == NULL)
2789 kmem_free(sata_pkt, sizeof (sata_pkt_t));
2790 /* Failure */
2791 return (0);
2792 }
2793
2794
2795 /*
2796 * Implementation of scsi tran_reset.
2797 * RESET_ALL request is translated into port reset.
2798 * RESET_TARGET requests is translated into a device reset,
2799 * RESET_LUN request is accepted only for LUN 0 and translated into
2800 * device reset.
2801 * The target reset should cause all HBA active and queued packets to
2802 * be terminated and returned with pkt reason SATA_PKT_RESET prior to
2803 * the return. HBA should report reset event for the device.
2804 *
2805 * Returns 1 upon success, 0 upon failure.
2806 */
2807 static int
sata_scsi_reset(struct scsi_address * ap,int level)2808 sata_scsi_reset(struct scsi_address *ap, int level)
2809 {
2810 sata_hba_inst_t *sata_hba_inst =
2811 (sata_hba_inst_t *)(ap->a_hba_tran->tran_hba_private);
2812 sata_device_t sata_device;
2813 int val;
2814
2815 SATADBG2(SATA_DBG_SCSI_IF, sata_hba_inst,
2816 "sata_scsi_reset: level %d target: 0x%x\n",
2817 level, ap->a_target);
2818
2819 /* Validate address */
2820 val = sata_validate_scsi_address(sata_hba_inst, ap, &sata_device);
2821 if (val == -1)
2822 /* Invalid address */
2823 return (0);
2824
2825 mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst,
2826 sata_device.satadev_addr.cport)));
2827 if (sata_get_device_info(sata_hba_inst, &sata_device) == NULL) {
2828 /* invalid address */
2829 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
2830 sata_device.satadev_addr.cport)));
2831 return (0);
2832 }
2833 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
2834 sata_device.satadev_addr.cport)));
2835 if (level == RESET_ALL) {
2836 /* port reset */
2837 if (sata_device.satadev_addr.qual == SATA_ADDR_DCPORT)
2838 sata_device.satadev_addr.qual = SATA_ADDR_CPORT;
2839 else
2840 sata_device.satadev_addr.qual = SATA_ADDR_PMPORT;
2841
2842 if ((*SATA_RESET_DPORT_FUNC(sata_hba_inst))
2843 (SATA_DIP(sata_hba_inst), &sata_device) == SATA_SUCCESS)
2844 return (1);
2845 else
2846 return (0);
2847
2848 } else if (val == 0 &&
2849 (level == RESET_TARGET || level == RESET_LUN)) {
2850 /* reset device (device attached) */
2851 if ((*SATA_RESET_DPORT_FUNC(sata_hba_inst))
2852 (SATA_DIP(sata_hba_inst), &sata_device) == SATA_SUCCESS)
2853 return (1);
2854 else
2855 return (0);
2856 }
2857 return (0);
2858 }
2859
2860
2861 /*
2862 * Implementation of scsi tran_getcap (get transport/device capabilities).
2863 * Supported capabilities for SATA hard disks:
2864 * auto-rqsense (always supported)
2865 * tagged-qing (supported if HBA supports it)
2866 * untagged-qing (could be supported if disk supports it, but because
2867 * caching behavior allowing untagged queuing actually
2868 * results in reduced performance. sd tries to throttle
2869 * back to only 3 outstanding commands, which may
2870 * work for real SCSI disks, but with read ahead
2871 * caching, having more than 1 outstanding command
2872 * results in cache thrashing.)
2873 * sector_size
2874 * dma_max
2875 * interconnect-type (INTERCONNECT_SATA)
2876 *
2877 * Supported capabilities for ATAPI CD/DVD devices:
2878 * auto-rqsense (always supported)
2879 * sector_size
2880 * dma_max
2881 * max-cdb-length
2882 * interconnect-type (INTERCONNECT_SATA)
2883 *
2884 * Supported capabilities for ATAPI TAPE devices:
2885 * auto-rqsense (always supported)
2886 * dma_max
2887 * max-cdb-length
2888 *
2889 * Supported capabilities for SATA ATAPI hard disks:
2890 * auto-rqsense (always supported)
2891 * interconnect-type (INTERCONNECT_SATA)
2892 * max-cdb-length
2893 *
2894 * Request for other capabilities is rejected as unsupported.
2895 *
2896 * Returns supported capability value, or -1 if capability is unsuppported or
2897 * the address is invalid - no device.
2898 */
2899
2900 static int
sata_scsi_getcap(struct scsi_address * ap,char * cap,int whom)2901 sata_scsi_getcap(struct scsi_address *ap, char *cap, int whom)
2902 {
2903
2904 sata_hba_inst_t *sata_hba_inst =
2905 (sata_hba_inst_t *)(ap->a_hba_tran->tran_hba_private);
2906 sata_device_t sata_device;
2907 sata_drive_info_t *sdinfo;
2908 ddi_dma_attr_t adj_dma_attr;
2909 int rval;
2910
2911 SATADBG2(SATA_DBG_SCSI_IF, sata_hba_inst,
2912 "sata_scsi_getcap: target: 0x%x, cap: %s\n",
2913 ap->a_target, cap);
2914
2915 /*
2916 * We want to process the capabilities on per port granularity.
2917 * So, we are specifically restricting ourselves to whom != 0
2918 * to exclude the controller wide handling.
2919 */
2920 if (cap == NULL || whom == 0)
2921 return (-1);
2922
2923 if (sata_validate_scsi_address(sata_hba_inst, ap, &sata_device) != 0) {
2924 /* Invalid address */
2925 return (-1);
2926 }
2927 mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst,
2928 sata_device.satadev_addr.cport)));
2929 if ((sdinfo = sata_get_device_info(sata_hba_inst, &sata_device)) ==
2930 NULL) {
2931 /* invalid address */
2932 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
2933 sata_device.satadev_addr.cport)));
2934 return (-1);
2935 }
2936
2937 switch (scsi_hba_lookup_capstr(cap)) {
2938 case SCSI_CAP_ARQ:
2939 rval = 1; /* ARQ supported, turned on */
2940 break;
2941
2942 case SCSI_CAP_SECTOR_SIZE:
2943 if (sdinfo->satadrv_type == SATA_DTYPE_ATADISK)
2944 rval = SATA_DISK_SECTOR_SIZE; /* fixed size */
2945 else if (sdinfo->satadrv_type == SATA_DTYPE_ATAPICD)
2946 rval = SATA_ATAPI_SECTOR_SIZE;
2947 else rval = -1;
2948 break;
2949
2950 /*
2951 * untagged queuing cause a performance inversion because of
2952 * the way sd operates. Because of this reason we do not
2953 * use it when available.
2954 */
2955 case SCSI_CAP_UNTAGGED_QING:
2956 if (sdinfo->satadrv_features_enabled &
2957 SATA_DEV_F_E_UNTAGGED_QING)
2958 rval = 1; /* Untagged queuing available */
2959 else
2960 rval = -1; /* Untagged queuing not available */
2961 break;
2962
2963 case SCSI_CAP_TAGGED_QING:
2964 if ((sdinfo->satadrv_features_enabled &
2965 SATA_DEV_F_E_TAGGED_QING) &&
2966 (sdinfo->satadrv_max_queue_depth > 1))
2967 rval = 1; /* Tagged queuing available */
2968 else
2969 rval = -1; /* Tagged queuing not available */
2970 break;
2971
2972 case SCSI_CAP_DMA_MAX:
2973 sata_adjust_dma_attr(sdinfo, SATA_DMA_ATTR(sata_hba_inst),
2974 &adj_dma_attr);
2975 rval = (int)adj_dma_attr.dma_attr_maxxfer;
2976 /* We rely on the fact that dma_attr_maxxfer < 0x80000000 */
2977 break;
2978
2979 case SCSI_CAP_INTERCONNECT_TYPE:
2980 rval = INTERCONNECT_SATA; /* SATA interconnect type */
2981 break;
2982
2983 case SCSI_CAP_CDB_LEN:
2984 if (sdinfo->satadrv_type & SATA_DTYPE_ATAPI)
2985 rval = sdinfo->satadrv_atapi_cdb_len;
2986 else
2987 rval = -1;
2988 break;
2989
2990 default:
2991 rval = -1;
2992 break;
2993 }
2994 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
2995 sata_device.satadev_addr.cport)));
2996 return (rval);
2997 }
2998
2999 /*
3000 * Implementation of scsi tran_setcap
3001 *
3002 * Only SCSI_CAP_UNTAGGED_QING and SCSI_CAP_TAGGED_QING are changeable.
3003 *
3004 */
3005 static int
sata_scsi_setcap(struct scsi_address * ap,char * cap,int value,int whom)3006 sata_scsi_setcap(struct scsi_address *ap, char *cap, int value, int whom)
3007 {
3008 sata_hba_inst_t *sata_hba_inst =
3009 (sata_hba_inst_t *)(ap->a_hba_tran->tran_hba_private);
3010 sata_device_t sata_device;
3011 sata_drive_info_t *sdinfo;
3012 int rval;
3013
3014 SATADBG2(SATA_DBG_SCSI_IF, sata_hba_inst,
3015 "sata_scsi_setcap: target: 0x%x, cap: %s\n", ap->a_target, cap);
3016
3017 /*
3018 * We want to process the capabilities on per port granularity.
3019 * So, we are specifically restricting ourselves to whom != 0
3020 * to exclude the controller wide handling.
3021 */
3022 if (cap == NULL || whom == 0) {
3023 return (-1);
3024 }
3025
3026 if (sata_validate_scsi_address(sata_hba_inst, ap, &sata_device) != 0) {
3027 /* Invalid address */
3028 return (-1);
3029 }
3030 mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst,
3031 sata_device.satadev_addr.cport)));
3032 if ((sdinfo = sata_get_device_info(sata_hba_inst,
3033 &sata_device)) == NULL) {
3034 /* invalid address */
3035 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
3036 sata_device.satadev_addr.cport)));
3037 return (-1);
3038 }
3039 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
3040 sata_device.satadev_addr.cport)));
3041
3042 switch (scsi_hba_lookup_capstr(cap)) {
3043 case SCSI_CAP_ARQ:
3044 case SCSI_CAP_SECTOR_SIZE:
3045 case SCSI_CAP_DMA_MAX:
3046 case SCSI_CAP_INTERCONNECT_TYPE:
3047 rval = 0;
3048 break;
3049 case SCSI_CAP_UNTAGGED_QING:
3050 if (SATA_QDEPTH(sata_hba_inst) > 1) {
3051 rval = 1;
3052 if (value == 1) {
3053 sdinfo->satadrv_features_enabled |=
3054 SATA_DEV_F_E_UNTAGGED_QING;
3055 } else if (value == 0) {
3056 sdinfo->satadrv_features_enabled &=
3057 ~SATA_DEV_F_E_UNTAGGED_QING;
3058 } else {
3059 rval = -1;
3060 }
3061 } else {
3062 rval = 0;
3063 }
3064 break;
3065 case SCSI_CAP_TAGGED_QING:
3066 /* This can TCQ or NCQ */
3067 if (sata_func_enable & SATA_ENABLE_QUEUING &&
3068 ((sdinfo->satadrv_features_support & SATA_DEV_F_TCQ &&
3069 SATA_FEATURES(sata_hba_inst) & SATA_CTLF_QCMD) ||
3070 (sata_func_enable & SATA_ENABLE_NCQ &&
3071 sdinfo->satadrv_features_support & SATA_DEV_F_NCQ &&
3072 SATA_FEATURES(sata_hba_inst) & SATA_CTLF_NCQ)) &&
3073 (sdinfo->satadrv_max_queue_depth > 1)) {
3074 rval = 1;
3075 if (value == 1) {
3076 sdinfo->satadrv_features_enabled |=
3077 SATA_DEV_F_E_TAGGED_QING;
3078 } else if (value == 0) {
3079 sdinfo->satadrv_features_enabled &=
3080 ~SATA_DEV_F_E_TAGGED_QING;
3081 } else {
3082 rval = -1;
3083 }
3084 } else {
3085 rval = 0;
3086 }
3087 break;
3088 default:
3089 rval = -1;
3090 break;
3091 }
3092 return (rval);
3093 }
3094
3095 /*
3096 * Implementations of scsi tran_destroy_pkt.
3097 * Free resources allocated by sata_scsi_init_pkt()
3098 */
3099 static void
sata_scsi_destroy_pkt(struct scsi_address * ap,struct scsi_pkt * pkt)3100 sata_scsi_destroy_pkt(struct scsi_address *ap, struct scsi_pkt *pkt)
3101 {
3102 sata_pkt_txlate_t *spx;
3103
3104 spx = (sata_pkt_txlate_t *)pkt->pkt_ha_private;
3105
3106 sata_common_free_dma_rsrcs(spx);
3107
3108 spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp = NULL;
3109 sata_pkt_free(spx);
3110
3111 scsi_hba_pkt_free(ap, pkt);
3112 }
3113
3114 /*
3115 * Implementation of scsi tran_dmafree.
3116 * Free DMA resources allocated by sata_scsi_init_pkt()
3117 */
3118
3119 static void
sata_scsi_dmafree(struct scsi_address * ap,struct scsi_pkt * pkt)3120 sata_scsi_dmafree(struct scsi_address *ap, struct scsi_pkt *pkt)
3121 {
3122 #ifndef __lock_lint
3123 _NOTE(ARGUNUSED(ap))
3124 #endif
3125 sata_pkt_txlate_t *spx;
3126
3127 ASSERT(pkt != NULL);
3128 spx = (sata_pkt_txlate_t *)pkt->pkt_ha_private;
3129
3130 sata_common_free_dma_rsrcs(spx);
3131 }
3132
3133 /*
3134 * Implementation of scsi tran_sync_pkt.
3135 *
3136 * The assumption below is that pkt is unique - there is no need to check ap
3137 *
3138 * Synchronize DMA buffer and, if the intermediate buffer is used, copy data
3139 * into/from the real buffer.
3140 */
3141 static void
sata_scsi_sync_pkt(struct scsi_address * ap __unused,struct scsi_pkt * pkt)3142 sata_scsi_sync_pkt(struct scsi_address *ap __unused, struct scsi_pkt *pkt)
3143 {
3144 sata_pkt_txlate_t *spx = (sata_pkt_txlate_t *)pkt->pkt_ha_private;
3145 struct buf *bp;
3146 int direction;
3147 int rval;
3148
3149 ASSERT(spx != NULL);
3150 if (spx->txlt_buf_dma_handle == NULL)
3151 return;
3152
3153 if (spx->txlt_sata_pkt == NULL)
3154 return;
3155
3156 direction = spx->txlt_sata_pkt->
3157 satapkt_cmd.satacmd_flags.sata_data_direction;
3158
3159 if (direction == SATA_DIR_NODATA_XFER)
3160 return;
3161
3162 bp = spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp;
3163
3164 if (spx->txlt_tmp_buf != NULL && (direction & SATA_DIR_WRITE) != 0) {
3165 /* Intermediate DMA buffer used */
3166 bcopy(bp->b_un.b_addr, spx->txlt_tmp_buf, bp->b_bcount);
3167 }
3168
3169 /* Sync the buffer for device or for CPU */
3170 rval = ddi_dma_sync(spx->txlt_buf_dma_handle, 0, 0,
3171 (direction & SATA_DIR_WRITE) ?
3172 DDI_DMA_SYNC_FORDEV : DDI_DMA_SYNC_FORCPU);
3173 ASSERT3S(rval, ==, DDI_SUCCESS);
3174
3175 if (spx->txlt_tmp_buf != NULL && !(direction & SATA_DIR_WRITE)) {
3176 /* Intermediate DMA buffer used for read */
3177 bcopy(spx->txlt_tmp_buf, bp->b_un.b_addr, bp->b_bcount);
3178 }
3179 }
3180
3181
3182
3183 /* ******************* SATA - SCSI Translation functions **************** */
3184 /*
3185 * SCSI to SATA pkt and command translation and SATA to SCSI status/error
3186 * translation.
3187 */
3188
3189 /*
3190 * Checks if a device exists and can be access and translates common
3191 * scsi_pkt data to sata_pkt data.
3192 *
3193 * Flag argument indicates that a non-read/write ATA command may be sent
3194 * to HBA in arbitrary SYNC mode to execute this packet.
3195 *
3196 * Returns TRAN_ACCEPT and scsi pkt_reason CMD_CMPLT if device exists and
3197 * sata_pkt was set-up.
3198 * Returns TRAN_ACCEPT and scsi pkt_reason CMD_DEV_GONE if device does not
3199 * exist and pkt_comp callback was scheduled.
3200 * Returns other TRAN_XXXXX values when error occured and command should be
3201 * rejected with the returned TRAN_XXXXX value.
3202 *
3203 * This function should be called with port mutex held.
3204 */
3205 static int
sata_txlt_generic_pkt_info(sata_pkt_txlate_t * spx,int * reason,int flag)3206 sata_txlt_generic_pkt_info(sata_pkt_txlate_t *spx, int *reason, int flag)
3207 {
3208 sata_drive_info_t *sdinfo;
3209 sata_device_t sata_device;
3210 const struct sata_cmd_flags sata_initial_cmd_flags = {
3211 SATA_DIR_NODATA_XFER,
3212 /* all other values to 0/FALSE */
3213 };
3214 /*
3215 * Pkt_reason has to be set if the pkt_comp callback is invoked,
3216 * and that implies TRAN_ACCEPT return value. Any other returned value
3217 * indicates that the scsi packet was not accepted (the reason will not
3218 * be checked by the scsi target driver).
3219 * To make debugging easier, we set pkt_reason to know value here.
3220 * It may be changed later when different completion reason is
3221 * determined.
3222 */
3223 spx->txlt_scsi_pkt->pkt_reason = CMD_TRAN_ERR;
3224 *reason = CMD_TRAN_ERR;
3225
3226 /* Validate address */
3227 switch (sata_validate_scsi_address(spx->txlt_sata_hba_inst,
3228 &spx->txlt_scsi_pkt->pkt_address, &sata_device)) {
3229
3230 case -1:
3231 /* Invalid address or invalid device type */
3232 return (TRAN_BADPKT);
3233 case 2:
3234 /*
3235 * Valid address but device type is unknown - Chack if it is
3236 * in the reset state and therefore in an indeterminate state.
3237 */
3238 sdinfo = sata_get_device_info(spx->txlt_sata_hba_inst,
3239 &spx->txlt_sata_pkt->satapkt_device);
3240 if (sdinfo != NULL && (sdinfo->satadrv_event_flags &
3241 (SATA_EVNT_DEVICE_RESET |
3242 SATA_EVNT_INPROC_DEVICE_RESET)) != 0) {
3243 if (!ddi_in_panic()) {
3244 spx->txlt_scsi_pkt->pkt_reason = CMD_INCOMPLETE;
3245 *reason = CMD_INCOMPLETE;
3246 SATADBG1(SATA_DBG_SCSI_IF,
3247 spx->txlt_sata_hba_inst,
3248 "sata_scsi_start: rejecting command "
3249 "because of device reset state\n", NULL);
3250 return (TRAN_BUSY);
3251 }
3252 }
3253 /* FALLTHROUGH */
3254 case 1:
3255 /* valid address but no valid device - it has disappeared */
3256 spx->txlt_scsi_pkt->pkt_reason = CMD_DEV_GONE;
3257 *reason = CMD_DEV_GONE;
3258 /*
3259 * The sd target driver is checking CMD_DEV_GONE pkt_reason
3260 * only in callback function (for normal requests) and
3261 * in the dump code path.
3262 * So, if the callback is available, we need to do
3263 * the callback rather than returning TRAN_FATAL_ERROR here.
3264 */
3265 if (spx->txlt_scsi_pkt->pkt_comp != NULL) {
3266 /* scsi callback required */
3267 if (servicing_interrupt()) {
3268 if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
3269 (task_func_t *)spx->txlt_scsi_pkt->pkt_comp,
3270 (void *)spx->txlt_scsi_pkt, TQ_NOSLEEP) ==
3271 TASKQID_INVALID) {
3272 return (TRAN_BUSY);
3273 }
3274 } else if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
3275 (task_func_t *)spx->txlt_scsi_pkt->pkt_comp,
3276 spx->txlt_scsi_pkt, TQ_SLEEP) == TASKQID_INVALID) {
3277 /* Scheduling the callback failed */
3278 return (TRAN_BUSY);
3279 }
3280
3281 return (TRAN_ACCEPT);
3282 }
3283 return (TRAN_FATAL_ERROR);
3284 default:
3285 /* all OK; pkt reason will be overwritten later */
3286 break;
3287 }
3288 /*
3289 * If pkt is to be executed in polling mode and a command will not be
3290 * emulated in SATA module (requires sending a non-read/write ATA
3291 * command to HBA driver in arbitrary SYNC mode) and we are in the
3292 * interrupt context and not in the panic dump, then reject the packet
3293 * to avoid a possible interrupt stack overrun or hang caused by
3294 * a potentially blocked interrupt.
3295 */
3296 if (((spx->txlt_scsi_pkt->pkt_flags & FLAG_NOINTR) != 0 || flag != 0) &&
3297 servicing_interrupt() && !ddi_in_panic()) {
3298 SATADBG1(SATA_DBG_INTR_CTX, spx->txlt_sata_hba_inst,
3299 "sata_scsi_start: rejecting synchronous command because "
3300 "of interrupt context\n", NULL);
3301 return (TRAN_BUSY);
3302 }
3303
3304 sdinfo = sata_get_device_info(spx->txlt_sata_hba_inst,
3305 &spx->txlt_sata_pkt->satapkt_device);
3306
3307 /*
3308 * If device is in reset condition, reject the packet with
3309 * TRAN_BUSY, unless:
3310 * 1. system is panicking (dumping)
3311 * In such case only one thread is running and there is no way to
3312 * process reset.
3313 * 2. cfgadm operation is is progress (internal APCTL lock is set)
3314 * Some cfgadm operations involve drive commands, so reset condition
3315 * needs to be ignored for IOCTL operations.
3316 */
3317 if ((sdinfo->satadrv_event_flags &
3318 (SATA_EVNT_DEVICE_RESET | SATA_EVNT_INPROC_DEVICE_RESET)) != 0) {
3319
3320 if (!ddi_in_panic() &&
3321 ((SATA_CPORT_EVENT_FLAGS(spx->txlt_sata_hba_inst,
3322 sata_device.satadev_addr.cport) &
3323 SATA_APCTL_LOCK_PORT_BUSY) == 0)) {
3324 spx->txlt_scsi_pkt->pkt_reason = CMD_INCOMPLETE;
3325 *reason = CMD_INCOMPLETE;
3326 SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
3327 "sata_scsi_start: rejecting command because "
3328 "of device reset state\n", NULL);
3329 return (TRAN_BUSY);
3330 }
3331 }
3332
3333 /*
3334 * Fix the dev_type in the sata_pkt->satapkt_device. It was not set by
3335 * sata_scsi_pkt_init() because pkt init had to work also with
3336 * non-existing devices.
3337 * Now we know that the packet was set-up for a real device, so its
3338 * type is known.
3339 */
3340 spx->txlt_sata_pkt->satapkt_device.satadev_type = sdinfo->satadrv_type;
3341
3342 spx->txlt_sata_pkt->satapkt_cmd.satacmd_flags = sata_initial_cmd_flags;
3343 if ((SATA_CPORT_INFO(spx->txlt_sata_hba_inst,
3344 sata_device.satadev_addr.cport)->cport_event_flags &
3345 SATA_APCTL_LOCK_PORT_BUSY) != 0) {
3346 spx->txlt_sata_pkt->satapkt_cmd.satacmd_flags.
3347 sata_ignore_dev_reset = B_TRUE;
3348 }
3349 /*
3350 * At this point the generic translation routine determined that the
3351 * scsi packet should be accepted. Packet completion reason may be
3352 * changed later when a different completion reason is determined.
3353 */
3354 spx->txlt_scsi_pkt->pkt_reason = CMD_CMPLT;
3355 *reason = CMD_CMPLT;
3356
3357 if ((spx->txlt_scsi_pkt->pkt_flags & FLAG_NOINTR) != 0) {
3358 /* Synchronous execution */
3359 spx->txlt_sata_pkt->satapkt_op_mode = SATA_OPMODE_SYNCH |
3360 SATA_OPMODE_POLLING;
3361 spx->txlt_sata_pkt->satapkt_cmd.satacmd_flags.
3362 sata_ignore_dev_reset = ddi_in_panic();
3363 } else {
3364 /* Asynchronous execution */
3365 spx->txlt_sata_pkt->satapkt_op_mode = SATA_OPMODE_ASYNCH |
3366 SATA_OPMODE_INTERRUPTS;
3367 }
3368 /* Convert queuing information */
3369 if (spx->txlt_scsi_pkt->pkt_flags & FLAG_STAG)
3370 spx->txlt_sata_pkt->satapkt_cmd.satacmd_flags.sata_queue_stag =
3371 B_TRUE;
3372 else if (spx->txlt_scsi_pkt->pkt_flags &
3373 (FLAG_OTAG | FLAG_HTAG | FLAG_HEAD))
3374 spx->txlt_sata_pkt->satapkt_cmd.satacmd_flags.sata_queue_otag =
3375 B_TRUE;
3376
3377 /* Always limit pkt time */
3378 if (spx->txlt_scsi_pkt->pkt_time == 0)
3379 spx->txlt_sata_pkt->satapkt_time = sata_default_pkt_time;
3380 else
3381 /* Pass on scsi_pkt time */
3382 spx->txlt_sata_pkt->satapkt_time =
3383 spx->txlt_scsi_pkt->pkt_time;
3384
3385 return (TRAN_ACCEPT);
3386 }
3387
3388
3389 /*
3390 * Translate ATA Identify Device data to SCSI Inquiry data.
3391 * This function may be called only for ATA devices.
3392 * This function should not be called for ATAPI devices - they
3393 * respond directly to SCSI Inquiry command.
3394 *
3395 * SATA Identify Device data has to be valid in sata_drive_info.
3396 * Buffer has to accomodate the inquiry length (36 bytes).
3397 *
3398 * This function should be called with a port mutex held.
3399 */
3400 static void
sata_identdev_to_inquiry(sata_hba_inst_t * sata_hba_inst,sata_drive_info_t * sdinfo,uint8_t * buf)3401 sata_identdev_to_inquiry(sata_hba_inst_t *sata_hba_inst,
3402 sata_drive_info_t *sdinfo, uint8_t *buf)
3403 {
3404
3405 struct scsi_inquiry *inq = (struct scsi_inquiry *)buf;
3406 struct sata_id *sid = &sdinfo->satadrv_id;
3407
3408 /* Start with a nice clean slate */
3409 bzero((void *)inq, sizeof (struct scsi_inquiry));
3410
3411 /*
3412 * Rely on the dev_type for setting paripheral qualifier.
3413 * Assume that DTYPE_RODIRECT applies to CD/DVD R/W devices.
3414 * It could be that DTYPE_OPTICAL could also qualify in the future.
3415 * ATAPI Inquiry may provide more data to the target driver.
3416 */
3417 inq->inq_dtype = sdinfo->satadrv_type == SATA_DTYPE_ATADISK ?
3418 DTYPE_DIRECT : DTYPE_RODIRECT; /* DTYPE_UNKNOWN; */
3419
3420 /* CFA type device is not a removable media device */
3421 inq->inq_rmb = ((sid->ai_config != SATA_CFA_TYPE) &&
3422 (sid->ai_config & SATA_REM_MEDIA)) ? 1 : 0;
3423 inq->inq_qual = 0; /* Device type qualifier (obsolete in SCSI3? */
3424 inq->inq_iso = 0; /* ISO version */
3425 inq->inq_ecma = 0; /* ECMA version */
3426 inq->inq_ansi = 3; /* ANSI version - SCSI 3 */
3427 inq->inq_aenc = 0; /* Async event notification cap. */
3428 inq->inq_trmiop = 0; /* Supports TERMINATE I/O PROC msg - NO */
3429 inq->inq_normaca = 0; /* setting NACA bit supported - NO */
3430 inq->inq_rdf = RDF_SCSI2; /* Response data format- SPC-3 */
3431 inq->inq_len = 31; /* Additional length */
3432 inq->inq_dualp = 0; /* dual port device - NO */
3433 inq->inq_reladdr = 0; /* Supports relative addressing - NO */
3434 inq->inq_sync = 0; /* Supports synchronous data xfers - NO */
3435 inq->inq_linked = 0; /* Supports linked commands - NO */
3436 /*
3437 * Queuing support - controller has to
3438 * support some sort of command queuing.
3439 */
3440 if (SATA_QDEPTH(sata_hba_inst) > 1)
3441 inq->inq_cmdque = 1; /* Supports command queueing - YES */
3442 else
3443 inq->inq_cmdque = 0; /* Supports command queueing - NO */
3444 inq->inq_sftre = 0; /* Supports Soft Reset option - NO ??? */
3445 inq->inq_wbus32 = 0; /* Supports 32 bit wide data xfers - NO */
3446 inq->inq_wbus16 = 0; /* Supports 16 bit wide data xfers - NO */
3447
3448 #ifdef _LITTLE_ENDIAN
3449 /* Swap text fields to match SCSI format */
3450 bcopy("ATA ", inq->inq_vid, 8); /* Vendor ID */
3451 swab(sid->ai_model, inq->inq_pid, 16); /* Product ID */
3452 if (strncmp(&sid->ai_fw[4], " ", 4) == 0)
3453 swab(sid->ai_fw, inq->inq_revision, 4); /* Revision level */
3454 else
3455 swab(&sid->ai_fw[4], inq->inq_revision, 4); /* Rev. level */
3456 #else /* _LITTLE_ENDIAN */
3457 bcopy("ATA ", inq->inq_vid, 8); /* Vendor ID */
3458 bcopy(sid->ai_model, inq->inq_pid, 16); /* Product ID */
3459 if (strncmp(&sid->ai_fw[4], " ", 4) == 0)
3460 bcopy(sid->ai_fw, inq->inq_revision, 4); /* Revision level */
3461 else
3462 bcopy(&sid->ai_fw[4], inq->inq_revision, 4); /* Rev. level */
3463 #endif /* _LITTLE_ENDIAN */
3464 }
3465
3466
3467 /*
3468 * Scsi response set up for invalid command (command not supported)
3469 *
3470 * Returns TRAN_ACCEPT and appropriate values in scsi_pkt fields.
3471 */
3472 static int
sata_txlt_invalid_command(sata_pkt_txlate_t * spx)3473 sata_txlt_invalid_command(sata_pkt_txlate_t *spx)
3474 {
3475 struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
3476 struct scsi_extended_sense *sense;
3477
3478 scsipkt->pkt_reason = CMD_CMPLT;
3479 scsipkt->pkt_state = STATE_GOT_BUS | STATE_GOT_TARGET |
3480 STATE_SENT_CMD | STATE_GOT_STATUS;
3481
3482 *scsipkt->pkt_scbp = STATUS_CHECK;
3483
3484 sense = sata_arq_sense(spx);
3485 sense->es_key = KEY_ILLEGAL_REQUEST;
3486 sense->es_add_code = SD_SCSI_ASC_INVALID_COMMAND_CODE;
3487
3488 SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
3489 "Scsi_pkt completion reason %x\n", scsipkt->pkt_reason);
3490
3491 if ((scsipkt->pkt_flags & FLAG_NOINTR) == 0 &&
3492 scsipkt->pkt_comp != NULL) {
3493 /* scsi callback required */
3494 if (servicing_interrupt()) {
3495 if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
3496 (task_func_t *)spx->txlt_scsi_pkt->pkt_comp,
3497 (void *)spx->txlt_scsi_pkt, TQ_NOSLEEP) ==
3498 TASKQID_INVALID) {
3499 return (TRAN_BUSY);
3500 }
3501 } else if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
3502 (task_func_t *)spx->txlt_scsi_pkt->pkt_comp,
3503 (void *)spx->txlt_scsi_pkt, TQ_SLEEP) == TASKQID_INVALID) {
3504 /* Scheduling the callback failed */
3505 return (TRAN_BUSY);
3506 }
3507 }
3508 return (TRAN_ACCEPT);
3509 }
3510
3511 /*
3512 * Scsi response set up for check condition with special sense key
3513 * and additional sense code.
3514 *
3515 * Returns TRAN_ACCEPT and appropriate values in scsi_pkt fields.
3516 */
3517 static int
sata_txlt_check_condition(sata_pkt_txlate_t * spx,uchar_t key,uchar_t code)3518 sata_txlt_check_condition(sata_pkt_txlate_t *spx, uchar_t key, uchar_t code)
3519 {
3520 sata_hba_inst_t *shi = SATA_TXLT_HBA_INST(spx);
3521 int cport = SATA_TXLT_CPORT(spx);
3522 struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
3523 struct scsi_extended_sense *sense;
3524
3525 mutex_enter(&SATA_CPORT_MUTEX(shi, cport));
3526 scsipkt->pkt_reason = CMD_CMPLT;
3527 scsipkt->pkt_state = STATE_GOT_BUS | STATE_GOT_TARGET |
3528 STATE_SENT_CMD | STATE_GOT_STATUS;
3529
3530 *scsipkt->pkt_scbp = STATUS_CHECK;
3531
3532 sense = sata_arq_sense(spx);
3533 sense->es_key = key;
3534 sense->es_add_code = code;
3535
3536 mutex_exit(&SATA_CPORT_MUTEX(shi, cport));
3537
3538 SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
3539 "Scsi_pkt completion reason %x\n", scsipkt->pkt_reason);
3540
3541 if ((scsipkt->pkt_flags & FLAG_NOINTR) == 0 &&
3542 scsipkt->pkt_comp != NULL) {
3543 /* scsi callback required */
3544 if (servicing_interrupt()) {
3545 if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
3546 (task_func_t *)spx->txlt_scsi_pkt->pkt_comp,
3547 (void *)spx->txlt_scsi_pkt, TQ_NOSLEEP) ==
3548 TASKQID_INVALID) {
3549 return (TRAN_BUSY);
3550 }
3551 } else if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
3552 (task_func_t *)spx->txlt_scsi_pkt->pkt_comp,
3553 (void *)spx->txlt_scsi_pkt, TQ_SLEEP) == TASKQID_INVALID) {
3554 /* Scheduling the callback failed */
3555 return (TRAN_BUSY);
3556 }
3557 }
3558 return (TRAN_ACCEPT);
3559 }
3560
3561 /*
3562 * Scsi response setup for
3563 * emulated non-data command that requires no action/return data
3564 *
3565 * Returns TRAN_ACCEPT and appropriate values in scsi_pkt fields.
3566 */
3567 static int
sata_txlt_nodata_cmd_immediate(sata_pkt_txlate_t * spx)3568 sata_txlt_nodata_cmd_immediate(sata_pkt_txlate_t *spx)
3569 {
3570 int rval;
3571 int reason;
3572 kmutex_t *cport_mutex = &(SATA_TXLT_CPORT_MUTEX(spx));
3573
3574 mutex_enter(cport_mutex);
3575
3576 if (((rval = sata_txlt_generic_pkt_info(spx, &reason, 0)) !=
3577 TRAN_ACCEPT) || (reason == CMD_DEV_GONE)) {
3578 mutex_exit(cport_mutex);
3579 return (rval);
3580 }
3581 mutex_exit(cport_mutex);
3582
3583 spx->txlt_scsi_pkt->pkt_state = STATE_GOT_BUS | STATE_GOT_TARGET |
3584 STATE_SENT_CMD | STATE_GOT_STATUS;
3585 spx->txlt_scsi_pkt->pkt_reason = CMD_CMPLT;
3586 *(spx->txlt_scsi_pkt->pkt_scbp) = STATUS_GOOD;
3587
3588 SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
3589 "Scsi_pkt completion reason %x\n",
3590 spx->txlt_scsi_pkt->pkt_reason);
3591
3592 if ((spx->txlt_scsi_pkt->pkt_flags & FLAG_NOINTR) == 0 &&
3593 spx->txlt_scsi_pkt->pkt_comp != NULL) {
3594 /* scsi callback required */
3595 if (servicing_interrupt()) {
3596 if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
3597 (task_func_t *)spx->txlt_scsi_pkt->pkt_comp,
3598 (void *)spx->txlt_scsi_pkt, TQ_NOSLEEP) ==
3599 TASKQID_INVALID) {
3600 return (TRAN_BUSY);
3601 }
3602 } else if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
3603 (task_func_t *)spx->txlt_scsi_pkt->pkt_comp,
3604 (void *)spx->txlt_scsi_pkt, TQ_SLEEP) == TASKQID_INVALID) {
3605 /* Scheduling the callback failed */
3606 return (TRAN_BUSY);
3607 }
3608 }
3609 return (TRAN_ACCEPT);
3610 }
3611
3612
3613 /*
3614 * SATA translate command: Inquiry / Identify Device
3615 * Use cached Identify Device data for now, rather than issuing actual
3616 * Device Identify cmd request. If device is detached and re-attached,
3617 * asynchronous event processing should fetch and refresh Identify Device
3618 * data.
3619 * VPD pages supported now:
3620 * Vital Product Data page
3621 * Unit Serial Number page
3622 * Block Device Characteristics Page
3623 * ATA Information Page
3624 *
3625 * Returns TRAN_ACCEPT and appropriate values in scsi_pkt fields.
3626 */
3627
3628 #define EVPD 1 /* Extended Vital Product Data flag */
3629 #define CMDDT 2 /* Command Support Data - Obsolete */
3630 #define INQUIRY_SUP_VPD_PAGE 0 /* Supported VPD Pages Page Code */
3631 #define INQUIRY_USN_PAGE 0x80 /* Unit Serial Number Page Code */
3632 #define INQUIRY_BDC_PAGE 0xB1 /* Block Device Characteristics Page */
3633 /* Code */
3634 #define INQUIRY_ATA_INFO_PAGE 0x89 /* ATA Information Page Code */
3635 #define INQUIRY_DEV_IDENTIFICATION_PAGE 0x83 /* Device identifiers */
3636
3637 static int
sata_txlt_inquiry(sata_pkt_txlate_t * spx)3638 sata_txlt_inquiry(sata_pkt_txlate_t *spx)
3639 {
3640 struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
3641 struct buf *bp = spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp;
3642 sata_drive_info_t *sdinfo;
3643 struct scsi_extended_sense *sense;
3644 int count;
3645 uint8_t *p;
3646 int i, j;
3647 uint8_t page_buf[1024]; /* Max length */
3648 int rval, reason;
3649 ushort_t rate;
3650 kmutex_t *cport_mutex = &(SATA_TXLT_CPORT_MUTEX(spx));
3651
3652 /*
3653 * sata_txlt_generic_pkt_info() and sata_get_device_info() require
3654 * cport_mutex to be held while they are called. sdinfo is also
3655 * protected by cport_mutex, so we hold cport_mutex until after we've
3656 * finished using sdinfo.
3657 */
3658 mutex_enter(cport_mutex);
3659
3660 if (((rval = sata_txlt_generic_pkt_info(spx, &reason, 0)) !=
3661 TRAN_ACCEPT) || (reason == CMD_DEV_GONE)) {
3662 mutex_exit(cport_mutex);
3663 return (rval);
3664 }
3665
3666 sdinfo = sata_get_device_info(spx->txlt_sata_hba_inst,
3667 &spx->txlt_sata_pkt->satapkt_device);
3668
3669 ASSERT(sdinfo != NULL);
3670
3671 scsipkt->pkt_reason = CMD_CMPLT;
3672 scsipkt->pkt_state = STATE_GOT_BUS | STATE_GOT_TARGET |
3673 STATE_SENT_CMD | STATE_GOT_STATUS;
3674
3675 /* Reject not supported request */
3676 if (scsipkt->pkt_cdbp[1] & CMDDT) { /* No support for this bit */
3677 *scsipkt->pkt_scbp = STATUS_CHECK;
3678 sense = sata_arq_sense(spx);
3679 sense->es_key = KEY_ILLEGAL_REQUEST;
3680 sense->es_add_code = SD_SCSI_ASC_INVALID_FIELD_IN_CDB;
3681 goto done;
3682 }
3683
3684 /* Valid Inquiry request */
3685 *scsipkt->pkt_scbp = STATUS_GOOD;
3686
3687 if (bp == NULL || bp->b_un.b_addr == NULL || bp->b_bcount == 0)
3688 goto done;
3689
3690 /*
3691 * Because it is fully emulated command storing data
3692 * programatically in the specified buffer, release
3693 * preallocated DMA resources before storing data in the buffer,
3694 * so no unwanted DMA sync would take place.
3695 */
3696 sata_scsi_dmafree(NULL, scsipkt);
3697
3698 if (!(scsipkt->pkt_cdbp[1] & EVPD)) {
3699 /* Standard Inquiry Data request */
3700 struct scsi_inquiry inq;
3701 unsigned int bufsize;
3702
3703 sata_identdev_to_inquiry(spx->txlt_sata_hba_inst,
3704 sdinfo, (uint8_t *)&inq);
3705 /* Copy no more than requested */
3706 count = MIN(bp->b_bcount, sizeof (struct scsi_inquiry));
3707 bufsize = scsipkt->pkt_cdbp[4];
3708 bufsize |= scsipkt->pkt_cdbp[3] << 8;
3709 count = MIN(count, bufsize);
3710 bcopy(&inq, bp->b_un.b_addr, count);
3711
3712 scsipkt->pkt_state |= STATE_XFERRED_DATA;
3713 scsipkt->pkt_resid = scsipkt->pkt_cdbp[4] > count ?
3714 bufsize - count : 0;
3715 goto done;
3716 }
3717
3718 /*
3719 * peripheral_qualifier = 0;
3720 *
3721 * We are dealing only with HD and will be
3722 * dealing with CD/DVD devices soon
3723 */
3724 uint8_t peripheral_device_type =
3725 sdinfo->satadrv_type == SATA_DTYPE_ATADISK ?
3726 DTYPE_DIRECT : DTYPE_RODIRECT;
3727
3728 bzero(page_buf, sizeof (page_buf));
3729
3730 switch ((uint_t)scsipkt->pkt_cdbp[2]) {
3731 case INQUIRY_SUP_VPD_PAGE:
3732 /*
3733 * Request for supported Vital Product Data pages.
3734 */
3735 page_buf[0] = peripheral_device_type;
3736 page_buf[1] = INQUIRY_SUP_VPD_PAGE;
3737 page_buf[2] = 0;
3738 page_buf[4] = INQUIRY_SUP_VPD_PAGE;
3739 page_buf[5] = INQUIRY_USN_PAGE;
3740 page_buf[6] = INQUIRY_BDC_PAGE;
3741 /*
3742 * If WWN info is present, provide a page for it.
3743 * Modern drives always have, but some legacy ones do not.
3744 */
3745 if (sdinfo->satadrv_id.ai_naa_ieee_oui != 0) {
3746 page_buf[3] = 5; /* page length */
3747 page_buf[7] = INQUIRY_DEV_IDENTIFICATION_PAGE;
3748 page_buf[8] = INQUIRY_ATA_INFO_PAGE;
3749 count = 9;
3750 } else {
3751 page_buf[3] = 4; /* page length */
3752 page_buf[7] = INQUIRY_ATA_INFO_PAGE;
3753 count = 8;
3754 }
3755 /* Copy no more than requested */
3756 count = MIN(bp->b_bcount, count);
3757 bcopy(page_buf, bp->b_un.b_addr, count);
3758 break;
3759
3760 case INQUIRY_USN_PAGE:
3761 /*
3762 * Request for Unit Serial Number page.
3763 * Set-up the page.
3764 */
3765 page_buf[0] = peripheral_device_type;
3766 page_buf[1] = INQUIRY_USN_PAGE;
3767 page_buf[2] = 0;
3768 /* remaining page length */
3769 page_buf[3] = SATA_ID_SERIAL_LEN;
3770
3771 /*
3772 * Copy serial number from Identify Device data
3773 * words into the inquiry page and swap bytes
3774 * when necessary.
3775 */
3776 p = (uint8_t *)(sdinfo->satadrv_id.ai_drvser);
3777 #ifdef _LITTLE_ENDIAN
3778 swab(p, &page_buf[4], SATA_ID_SERIAL_LEN);
3779 #else
3780 bcopy(p, &page_buf[4], SATA_ID_SERIAL_LEN);
3781 #endif
3782 /*
3783 * Least significant character of the serial
3784 * number shall appear as the last byte,
3785 * according to SBC-3 spec.
3786 * Count trailing spaces to determine the
3787 * necessary shift length.
3788 */
3789 p = &page_buf[SATA_ID_SERIAL_LEN + 4 - 1];
3790 for (j = 0; j < SATA_ID_SERIAL_LEN; j++) {
3791 if (*(p - j) != '\0' && *(p - j) != '\040')
3792 break;
3793 }
3794
3795 /*
3796 * Shift SN string right, so that the last
3797 * non-blank character would appear in last
3798 * byte of SN field in the page.
3799 * 'j' is the shift length.
3800 */
3801 for (i = 0; i < (SATA_ID_SERIAL_LEN - j) && j != 0; i++, p--)
3802 *p = *(p - j);
3803
3804 /*
3805 * Add leading spaces - same number as the
3806 * shift size
3807 */
3808 for (; j > 0; j--)
3809 page_buf[4 + j - 1] = '\040';
3810
3811 count = MIN(bp->b_bcount, SATA_ID_SERIAL_LEN + 4);
3812 bcopy(page_buf, bp->b_un.b_addr, count);
3813 break;
3814
3815 case INQUIRY_BDC_PAGE:
3816 /*
3817 * Request for Block Device Characteristics
3818 * page. Set-up the page.
3819 */
3820 page_buf[0] = peripheral_device_type;
3821 page_buf[1] = INQUIRY_BDC_PAGE;
3822 page_buf[2] = 0;
3823 /* remaining page length */
3824 page_buf[3] = SATA_ID_BDC_LEN;
3825
3826 rate = sdinfo->satadrv_id.ai_medrotrate;
3827 page_buf[4] = (rate >> 8) & 0xff;
3828 page_buf[5] = rate & 0xff;
3829 page_buf[6] = 0;
3830 page_buf[7] = sdinfo->satadrv_id.ai_nomformfactor & 0xf;
3831
3832 count = MIN(bp->b_bcount, SATA_ID_BDC_LEN + 4);
3833 bcopy(page_buf, bp->b_un.b_addr, count);
3834 break;
3835
3836 case INQUIRY_ATA_INFO_PAGE:
3837 /*
3838 * Request for ATA Information page.
3839 */
3840 page_buf[0] = peripheral_device_type;
3841 page_buf[1] = INQUIRY_ATA_INFO_PAGE;
3842 page_buf[2] = (SATA_ID_ATA_INFO_LEN >> 8) & 0xff;
3843 page_buf[3] = SATA_ID_ATA_INFO_LEN & 0xff;
3844 /* page_buf[4-7] reserved */
3845 #ifdef _LITTLE_ENDIAN
3846 bcopy("ATA ", &page_buf[8], 8);
3847 swab(sdinfo->satadrv_id.ai_model, &page_buf[16], 16);
3848 if (strncmp(&sdinfo->satadrv_id.ai_fw[4], " ", 4) == 0) {
3849 swab(sdinfo->satadrv_id.ai_fw, &page_buf[32], 4);
3850 } else {
3851 swab(&sdinfo->satadrv_id.ai_fw[4], &page_buf[32], 4);
3852 }
3853 #else /* _LITTLE_ENDIAN */
3854 bcopy("ATA ", &page_buf[8], 8);
3855 bcopy(sdinfo->satadrv_id.ai_model, &page_buf[16], 16);
3856 if (strncmp(&sdinfo->satadrv_id.ai_fw[4], " ", 4) == 0) {
3857 bcopy(sdinfo->satadrv_id.ai_fw, &page_buf[32], 4);
3858 } else {
3859 bcopy(&sdinfo->satadrv_id.ai_fw[4], &page_buf[32], 4);
3860 }
3861 #endif /* _LITTLE_ENDIAN */
3862 /*
3863 * page_buf[36-55] which defines the device
3864 * signature is not defined at this
3865 * time.
3866 */
3867
3868 /* Set the command code */
3869 if (sdinfo->satadrv_type == SATA_DTYPE_ATADISK) {
3870 page_buf[56] = SATAC_ID_DEVICE;
3871 } else if (sdinfo->satadrv_type == SATA_DTYPE_ATAPI) {
3872 page_buf[56] = SATAC_ID_PACKET_DEVICE;
3873 }
3874 /*
3875 * If the command code, page_buf[56], is not
3876 * zero and if one of the identify commands
3877 * succeeds, return the identify data.
3878 */
3879 if (page_buf[56] != 0) {
3880 sata_drive_info_t temp_info = {
3881 .satadrv_addr = sdinfo->satadrv_addr,
3882 .satadrv_type = sdinfo->satadrv_type,
3883 };
3884
3885 /*
3886 * It appears calls to an HBA's start (sata_hba_start)
3887 * method (which sata_fetch_device_identify_data_retry()
3888 * calls) must not be done while holding cport_mutex.
3889 *
3890 * A packet's completion routine may call back into
3891 * the sata framework and deadlock (and all extant
3892 * calls to the HBA's start method either drop and
3893 * re-acquire cport_mutex, or never held cport_mutex).
3894 *
3895 * sdinfo is protected by cport_mutex, so we need to
3896 * obtain the SATA address and type from sdinfo
3897 * before releasing cport_mutex and submitting the
3898 * request. We reacquire cport_mutex to simplfy
3899 * cleanup after the done label.
3900 */
3901 mutex_exit(cport_mutex);
3902 (void) sata_fetch_device_identify_data(
3903 spx->txlt_sata_hba_inst, &temp_info);
3904 mutex_enter(cport_mutex);
3905
3906 /*
3907 * If sata_fetch_device_identify_data()
3908 * fails, the bcopy() is harmless since we're copying
3909 * zeros back over zeros. If it succeeds, we're
3910 * copying over the portion of the response we need.
3911 */
3912 bcopy(&temp_info.satadrv_id, &page_buf[60],
3913 sizeof (sata_id_t));
3914 }
3915
3916 /* Need to copy out the page_buf to bp */
3917 count = MIN(bp->b_bcount, SATA_ID_ATA_INFO_LEN + 4);
3918 bcopy(page_buf, bp->b_un.b_addr, count);
3919 break;
3920
3921 case INQUIRY_DEV_IDENTIFICATION_PAGE:
3922 if (sdinfo->satadrv_id.ai_naa_ieee_oui != 0) {
3923 /*
3924 * Page 83; SAT-5 requires this, and modern
3925 * SATA devices all support a WWN.
3926 */
3927 page_buf[0] = peripheral_device_type;
3928 page_buf[1] = INQUIRY_DEV_IDENTIFICATION_PAGE;
3929 page_buf[2] = 0;
3930 page_buf[3] = 12; /* remaining length */
3931 page_buf[4] = 0x01; /* protocol 0, code set 1 */
3932 page_buf[5] = 0x03; /* LUN, NAA type */
3933 page_buf[6] = 0;
3934 page_buf[7] = 0x08; /* length (64-bit WWN) */
3935 #ifdef _LITTLE_ENDIAN
3936 swab(&sdinfo->satadrv_id.ai_naa_ieee_oui, &page_buf[8],
3937 8);
3938 #else
3939 bcopy(&sdinfo->satadrv_id.ai_naa_ieee_oui,
3940 &page_buf[8], 8);
3941 #endif
3942 /* header + designator */
3943 count = MIN(bp->b_bcount, 12 + 4);
3944 bcopy(page_buf, bp->b_un.b_addr, count);
3945 break;
3946 }
3947 /* FALLTHROUGH */
3948
3949 default:
3950 /* Request for unsupported VPD page */
3951 *scsipkt->pkt_scbp = STATUS_CHECK;
3952 sense = sata_arq_sense(spx);
3953 sense->es_key = KEY_ILLEGAL_REQUEST;
3954 sense->es_add_code = SD_SCSI_ASC_INVALID_FIELD_IN_CDB;
3955 goto done;
3956 }
3957
3958 scsipkt->pkt_state |= STATE_XFERRED_DATA;
3959 scsipkt->pkt_resid = scsipkt->pkt_cdbp[4] > count ?
3960 scsipkt->pkt_cdbp[4] - count : 0;
3961
3962 done:
3963 mutex_exit(cport_mutex);
3964
3965 SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
3966 "Scsi_pkt completion reason %x\n",
3967 scsipkt->pkt_reason);
3968
3969 if ((scsipkt->pkt_flags & FLAG_NOINTR) == 0 &&
3970 scsipkt->pkt_comp != NULL) {
3971 /* scsi callback required */
3972 if (servicing_interrupt()) {
3973 if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
3974 (task_func_t *)spx->txlt_scsi_pkt->pkt_comp,
3975 (void *)spx->txlt_scsi_pkt, TQ_NOSLEEP) ==
3976 TASKQID_INVALID) {
3977 return (TRAN_BUSY);
3978 }
3979 } else if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
3980 (task_func_t *)spx->txlt_scsi_pkt->pkt_comp,
3981 (void *)spx->txlt_scsi_pkt, TQ_SLEEP) == TASKQID_INVALID) {
3982 /* Scheduling the callback failed */
3983 return (TRAN_BUSY);
3984 }
3985 }
3986 return (TRAN_ACCEPT);
3987 }
3988
3989 /*
3990 * SATA translate command: Request Sense.
3991 *
3992 * Returns TRAN_ACCEPT and appropriate values in scsi_pkt fields.
3993 * At the moment this is an emulated command (ATA version for SATA hard disks).
3994 * May be translated into Check Power Mode command in the future.
3995 *
3996 * Note: There is a mismatch between already implemented Informational
3997 * Exception Mode Select page 0x1C and this function.
3998 * When MRIE bit is set in page 0x1C, Request Sense is supposed to return
3999 * NO SENSE and set additional sense code to the exception code - this is not
4000 * implemented here.
4001 */
4002 static int
sata_txlt_request_sense(sata_pkt_txlate_t * spx)4003 sata_txlt_request_sense(sata_pkt_txlate_t *spx)
4004 {
4005 struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
4006 struct scsi_extended_sense sense;
4007 struct buf *bp = spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp;
4008 sata_drive_info_t *sdinfo;
4009 sata_cmd_t *scmd = &spx->txlt_sata_pkt->satapkt_cmd;
4010 int rval, reason, power_state = 0;
4011 kmutex_t *cport_mutex;
4012
4013 cport_mutex = &(SATA_TXLT_CPORT_MUTEX(spx));
4014 mutex_enter(cport_mutex);
4015
4016 if (((rval = sata_txlt_generic_pkt_info(spx, &reason, 1)) !=
4017 TRAN_ACCEPT) || (reason == CMD_DEV_GONE)) {
4018 mutex_exit(cport_mutex);
4019 return (rval);
4020 }
4021
4022 scsipkt->pkt_reason = CMD_CMPLT;
4023 scsipkt->pkt_state = STATE_GOT_BUS | STATE_GOT_TARGET |
4024 STATE_SENT_CMD | STATE_GOT_STATUS;
4025 *scsipkt->pkt_scbp = STATUS_GOOD;
4026
4027 /*
4028 * when CONTROL field's NACA bit == 1
4029 * return ILLEGAL_REQUEST
4030 */
4031 if (scsipkt->pkt_cdbp[5] & CTL_BYTE_NACA_MASK) {
4032 mutex_exit(cport_mutex);
4033 return (sata_txlt_check_condition(spx, KEY_ILLEGAL_REQUEST,
4034 SD_SCSI_ASC_CMD_SEQUENCE_ERR));
4035 }
4036
4037 sdinfo = sata_get_device_info(spx->txlt_sata_hba_inst,
4038 &spx->txlt_sata_pkt->satapkt_device);
4039 ASSERT(sdinfo != NULL);
4040
4041 spx->txlt_sata_pkt->satapkt_op_mode |= SATA_OPMODE_SYNCH;
4042
4043 sata_build_generic_cmd(scmd, SATAC_CHECK_POWER_MODE);
4044 scmd->satacmd_flags.sata_copy_out_sec_count_lsb = B_TRUE;
4045 scmd->satacmd_flags.sata_copy_out_error_reg = B_TRUE;
4046 if (sata_hba_start(spx, &rval) != 0) {
4047 mutex_exit(cport_mutex);
4048 return (rval);
4049 }
4050 if (scmd->satacmd_error_reg != 0) {
4051 mutex_exit(cport_mutex);
4052 return (sata_txlt_check_condition(spx, KEY_NO_SENSE,
4053 SD_SCSI_ASC_NO_ADD_SENSE));
4054 }
4055
4056 switch (scmd->satacmd_sec_count_lsb) {
4057 case SATA_PWRMODE_STANDBY: /* device in standby mode */
4058 if (sdinfo->satadrv_power_level == SATA_POWER_STOPPED)
4059 power_state = SATA_POWER_STOPPED;
4060 else {
4061 power_state = SATA_POWER_STANDBY;
4062 sdinfo->satadrv_power_level = SATA_POWER_STANDBY;
4063 }
4064 break;
4065 case SATA_PWRMODE_IDLE: /* device in idle mode */
4066 power_state = SATA_POWER_IDLE;
4067 sdinfo->satadrv_power_level = SATA_POWER_IDLE;
4068 break;
4069 case SATA_PWRMODE_ACTIVE: /* device in active or idle mode */
4070 default: /* 0x40, 0x41 active mode */
4071 if (sdinfo->satadrv_power_level == SATA_POWER_IDLE)
4072 power_state = SATA_POWER_IDLE;
4073 else {
4074 power_state = SATA_POWER_ACTIVE;
4075 sdinfo->satadrv_power_level = SATA_POWER_ACTIVE;
4076 }
4077 break;
4078 }
4079
4080 mutex_exit(cport_mutex);
4081
4082 if (bp != NULL && bp->b_un.b_addr && bp->b_bcount) {
4083 /*
4084 * Because it is fully emulated command storing data
4085 * programatically in the specified buffer, release
4086 * preallocated DMA resources before storing data in the buffer,
4087 * so no unwanted DMA sync would take place.
4088 */
4089 int count = MIN(bp->b_bcount,
4090 sizeof (struct scsi_extended_sense));
4091 sata_scsi_dmafree(NULL, scsipkt);
4092 bzero(&sense, sizeof (struct scsi_extended_sense));
4093 sense.es_valid = 0; /* Valid LBA */
4094 sense.es_class = 7; /* Response code 0x70 - current err */
4095 sense.es_key = KEY_NO_SENSE;
4096 sense.es_add_len = 6; /* Additional length */
4097 /* Copy no more than requested */
4098 bcopy(&sense, bp->b_un.b_addr, count);
4099 scsipkt->pkt_state |= STATE_XFERRED_DATA;
4100 scsipkt->pkt_resid = 0;
4101 switch (power_state) {
4102 case SATA_POWER_IDLE:
4103 case SATA_POWER_STANDBY:
4104 sense.es_add_code =
4105 SD_SCSI_ASC_LOW_POWER_CONDITION_ON;
4106 break;
4107 case SATA_POWER_STOPPED:
4108 sense.es_add_code = SD_SCSI_ASC_NO_ADD_SENSE;
4109 break;
4110 case SATA_POWER_ACTIVE:
4111 default:
4112 break;
4113 }
4114 }
4115
4116 SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
4117 "Scsi_pkt completion reason %x\n",
4118 scsipkt->pkt_reason);
4119
4120 if ((scsipkt->pkt_flags & FLAG_NOINTR) == 0 &&
4121 scsipkt->pkt_comp != NULL) {
4122 /* scsi callback required */
4123 if (servicing_interrupt()) {
4124 if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
4125 (task_func_t *)spx->txlt_scsi_pkt->pkt_comp,
4126 (void *)spx->txlt_scsi_pkt, TQ_NOSLEEP) ==
4127 TASKQID_INVALID) {
4128 return (TRAN_BUSY);
4129 }
4130 } else if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
4131 (task_func_t *)spx->txlt_scsi_pkt->pkt_comp,
4132 (void *)spx->txlt_scsi_pkt, TQ_SLEEP) == TASKQID_INVALID) {
4133 /* Scheduling the callback failed */
4134 return (TRAN_BUSY);
4135 }
4136 }
4137 return (TRAN_ACCEPT);
4138 }
4139
4140 /*
4141 * SATA translate command: Test Unit Ready
4142 * (ATA version for SATA hard disks).
4143 * It is translated into the Check Power Mode command.
4144 *
4145 * Returns TRAN_ACCEPT and appropriate values in scsi_pkt fields.
4146 */
4147 static int
sata_txlt_test_unit_ready(sata_pkt_txlate_t * spx)4148 sata_txlt_test_unit_ready(sata_pkt_txlate_t *spx)
4149 {
4150 struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
4151 struct scsi_extended_sense *sense;
4152 sata_cmd_t *scmd = &spx->txlt_sata_pkt->satapkt_cmd;
4153 sata_drive_info_t *sdinfo;
4154 int power_state;
4155 int rval, reason;
4156 kmutex_t *cport_mutex = &(SATA_TXLT_CPORT_MUTEX(spx));
4157
4158 mutex_enter(cport_mutex);
4159
4160 if (((rval = sata_txlt_generic_pkt_info(spx, &reason, 1)) !=
4161 TRAN_ACCEPT) || (reason == CMD_DEV_GONE)) {
4162 mutex_exit(cport_mutex);
4163 return (rval);
4164 }
4165
4166 sdinfo = sata_get_device_info(spx->txlt_sata_hba_inst,
4167 &spx->txlt_sata_pkt->satapkt_device);
4168 ASSERT(sdinfo != NULL);
4169
4170 spx->txlt_sata_pkt->satapkt_op_mode |= SATA_OPMODE_SYNCH;
4171
4172 /* send CHECK POWER MODE command */
4173 sata_build_generic_cmd(scmd, SATAC_CHECK_POWER_MODE);
4174 scmd->satacmd_flags.sata_copy_out_sec_count_lsb = B_TRUE;
4175 scmd->satacmd_flags.sata_copy_out_error_reg = B_TRUE;
4176 if (sata_hba_start(spx, &rval) != 0) {
4177 mutex_exit(cport_mutex);
4178 return (rval);
4179 }
4180
4181 if (scmd->satacmd_error_reg != 0) {
4182 mutex_exit(cport_mutex);
4183 return (sata_txlt_check_condition(spx, KEY_NOT_READY,
4184 SD_SCSI_ASC_LU_NOT_RESPONSE));
4185 }
4186
4187 power_state = scmd->satacmd_sec_count_lsb;
4188
4189 /*
4190 * return NOT READY when device in STOPPED mode
4191 */
4192 if (power_state == SATA_PWRMODE_STANDBY &&
4193 sdinfo->satadrv_power_level == SATA_POWER_STOPPED) {
4194 *scsipkt->pkt_scbp = STATUS_CHECK;
4195 sense = sata_arq_sense(spx);
4196 sense->es_key = KEY_NOT_READY;
4197 sense->es_add_code = SD_SCSI_ASC_LU_NOT_READY;
4198 } else {
4199 /*
4200 * For other power mode, return GOOD status
4201 */
4202 *scsipkt->pkt_scbp = STATUS_GOOD;
4203 }
4204
4205 scsipkt->pkt_reason = CMD_CMPLT;
4206 scsipkt->pkt_state = STATE_GOT_BUS | STATE_GOT_TARGET |
4207 STATE_SENT_CMD | STATE_GOT_STATUS;
4208
4209 mutex_exit(cport_mutex);
4210
4211 SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
4212 "Scsi_pkt completion reason %x\n", scsipkt->pkt_reason);
4213
4214 if ((scsipkt->pkt_flags & FLAG_NOINTR) == 0 &&
4215 scsipkt->pkt_comp != NULL) {
4216 /* scsi callback required */
4217 if (servicing_interrupt()) {
4218 if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
4219 (task_func_t *)spx->txlt_scsi_pkt->pkt_comp,
4220 (void *)spx->txlt_scsi_pkt, TQ_NOSLEEP) ==
4221 TASKQID_INVALID) {
4222 return (TRAN_BUSY);
4223 }
4224 } else if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
4225 (task_func_t *)spx->txlt_scsi_pkt->pkt_comp,
4226 (void *)spx->txlt_scsi_pkt, TQ_SLEEP) == TASKQID_INVALID) {
4227 /* Scheduling the callback failed */
4228 return (TRAN_BUSY);
4229 }
4230 }
4231
4232 return (TRAN_ACCEPT);
4233 }
4234
4235 /*
4236 * SATA translate command: Start Stop Unit
4237 * Translation depends on a command:
4238 *
4239 * Power condition bits will be supported
4240 * and the power level should be maintained by SATL,
4241 * When SATL received a command, it will check the
4242 * power level firstly, and return the status according
4243 * to SAT2 v2.6 and SAT-2 Standby Modifications
4244 *
4245 * SPC-4/SBC-3 SATL ATA power condition SATL SPC/SBC
4246 * -----------------------------------------------------------------------
4247 * SSU_PC1 Active <==> ATA Active <==> SSU:start_bit =1
4248 * SSU_PC2 Idle <==> ATA Idle <==> N/A
4249 * SSU_PC3 Standby <==> ATA Standby <==> N/A
4250 * SSU_PC4 Stopped <==> ATA Standby <==> SSU:start_bit = 0
4251 *
4252 * Unload Media / NOT SUPPORTED YET
4253 * Load Media / NOT SUPPROTED YET
4254 * Immediate bit / NOT SUPPORTED YET (deferred error)
4255 *
4256 * Returns TRAN_ACCEPT or code returned by sata_hba_start() and
4257 * appropriate values in scsi_pkt fields.
4258 */
4259 static int
sata_txlt_start_stop_unit(sata_pkt_txlate_t * spx)4260 sata_txlt_start_stop_unit(sata_pkt_txlate_t *spx)
4261 {
4262 struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
4263 sata_cmd_t *scmd = &spx->txlt_sata_pkt->satapkt_cmd;
4264 int rval, reason;
4265 sata_drive_info_t *sdinfo;
4266 sata_id_t *sata_id;
4267 kmutex_t *cport_mutex = &(SATA_TXLT_CPORT_MUTEX(spx));
4268
4269 SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
4270 "sata_txlt_start_stop_unit: %d\n", scsipkt->pkt_scbp[4] & 1);
4271
4272 mutex_enter(cport_mutex);
4273
4274 if (((rval = sata_txlt_generic_pkt_info(spx, &reason, 1)) !=
4275 TRAN_ACCEPT) || (reason == CMD_DEV_GONE)) {
4276 mutex_exit(cport_mutex);
4277 return (rval);
4278 }
4279
4280 if (scsipkt->pkt_cdbp[1] & START_STOP_IMMED_MASK) {
4281 /* IMMED bit - not supported */
4282 mutex_exit(cport_mutex);
4283 return (sata_txlt_check_condition(spx, KEY_ILLEGAL_REQUEST,
4284 SD_SCSI_ASC_INVALID_FIELD_IN_CDB));
4285 }
4286
4287 spx->txlt_sata_pkt->satapkt_op_mode |= SATA_OPMODE_SYNCH;
4288 spx->txlt_sata_pkt->satapkt_comp = NULL;
4289
4290 sdinfo = sata_get_device_info(spx->txlt_sata_hba_inst,
4291 &spx->txlt_sata_pkt->satapkt_device);
4292 ASSERT(sdinfo != NULL);
4293 sata_id = &sdinfo->satadrv_id;
4294
4295 switch ((scsipkt->pkt_cdbp[4] & START_STOP_POWER_COND_MASK) >> 4) {
4296 case 0:
4297 if (scsipkt->pkt_cdbp[4] & START_STOP_LOEJ_MASK) {
4298 /* Load/Unload Media - invalid request */
4299 goto err_out;
4300 }
4301 if (scsipkt->pkt_cdbp[4] & START_STOP_START_MASK) {
4302 /* Start Unit */
4303 sata_build_read_verify_cmd(scmd, 1, 5);
4304 scmd->satacmd_flags.sata_copy_out_error_reg = B_TRUE;
4305 /* Transfer command to HBA */
4306 if (sata_hba_start(spx, &rval) != 0) {
4307 /* Pkt not accepted for execution */
4308 mutex_exit(cport_mutex);
4309 return (rval);
4310 }
4311 if (scmd->satacmd_error_reg != 0) {
4312 goto err_out;
4313 }
4314 sdinfo->satadrv_power_level = SATA_POWER_ACTIVE;
4315 } else {
4316 /* Stop Unit */
4317 sata_build_generic_cmd(scmd, SATAC_FLUSH_CACHE);
4318 scmd->satacmd_flags.sata_copy_out_error_reg = B_TRUE;
4319 if (sata_hba_start(spx, &rval) != 0) {
4320 mutex_exit(cport_mutex);
4321 return (rval);
4322 } else {
4323 if (scmd->satacmd_error_reg != 0) {
4324 goto err_out;
4325 }
4326 }
4327 /* ata standby immediate command */
4328 sata_build_generic_cmd(scmd, SATAC_STANDBY_IM);
4329 scmd->satacmd_flags.sata_copy_out_error_reg = B_TRUE;
4330 if (sata_hba_start(spx, &rval) != 0) {
4331 mutex_exit(cport_mutex);
4332 return (rval);
4333 }
4334 if (scmd->satacmd_error_reg != 0) {
4335 goto err_out;
4336 }
4337 sdinfo->satadrv_power_level = SATA_POWER_STOPPED;
4338 }
4339 break;
4340 case 0x1:
4341 sata_build_generic_cmd(scmd, SATAC_IDLE);
4342 scmd->satacmd_flags.sata_copy_out_error_reg = B_TRUE;
4343 if (sata_hba_start(spx, &rval) != 0) {
4344 mutex_exit(cport_mutex);
4345 return (rval);
4346 }
4347 if (scmd->satacmd_error_reg != 0) {
4348 goto err_out;
4349 }
4350 sata_build_read_verify_cmd(scmd, 1, 5);
4351 scmd->satacmd_flags.sata_copy_out_error_reg = B_TRUE;
4352 /* Transfer command to HBA */
4353 if (sata_hba_start(spx, &rval) != 0) {
4354 /* Pkt not accepted for execution */
4355 mutex_exit(cport_mutex);
4356 return (rval);
4357 } else {
4358 if (scmd->satacmd_error_reg != 0) {
4359 goto err_out;
4360 }
4361 }
4362 sdinfo->satadrv_power_level = SATA_POWER_ACTIVE;
4363 break;
4364 case 0x2:
4365 sata_build_generic_cmd(scmd, SATAC_FLUSH_CACHE);
4366 scmd->satacmd_flags.sata_copy_out_error_reg = B_TRUE;
4367 if (!(scsipkt->pkt_cdbp[4] & START_STOP_NOFLUSH_MASK)) {
4368 if (sata_hba_start(spx, &rval) != 0) {
4369 mutex_exit(cport_mutex);
4370 return (rval);
4371 }
4372 if (scmd->satacmd_error_reg != 0) {
4373 goto err_out;
4374 }
4375 }
4376 sata_build_generic_cmd(scmd, SATAC_IDLE);
4377 scmd->satacmd_flags.sata_copy_out_error_reg = B_TRUE;
4378 if (sata_hba_start(spx, &rval) != 0) {
4379 mutex_exit(cport_mutex);
4380 return (rval);
4381 }
4382 if (scmd->satacmd_error_reg != 0) {
4383 goto err_out;
4384 }
4385 if ((scsipkt->pkt_cdbp[3] & START_STOP_MODIFIER_MASK)) {
4386 /*
4387 * POWER CONDITION MODIFIER bit set
4388 * to 0x1 or larger it will be handled
4389 * on the same way as bit = 0x1
4390 */
4391 if (!(sata_id->ai_cmdset84 &
4392 SATA_IDLE_UNLOAD_SUPPORTED)) {
4393 sdinfo->satadrv_power_level = SATA_POWER_IDLE;
4394 break;
4395 }
4396 sata_build_generic_cmd(scmd, SATAC_IDLE_IM);
4397 scmd->satacmd_features_reg = 0x44;
4398 scmd->satacmd_lba_low_lsb = 0x4c;
4399 scmd->satacmd_lba_mid_lsb = 0x4e;
4400 scmd->satacmd_lba_high_lsb = 0x55;
4401 scmd->satacmd_flags.sata_copy_out_error_reg = B_TRUE;
4402 if (sata_hba_start(spx, &rval) != 0) {
4403 mutex_exit(cport_mutex);
4404 return (rval);
4405 }
4406 if (scmd->satacmd_error_reg != 0) {
4407 goto err_out;
4408 }
4409 }
4410 sdinfo->satadrv_power_level = SATA_POWER_IDLE;
4411 break;
4412 case 0x3:
4413 sata_build_generic_cmd(scmd, SATAC_FLUSH_CACHE);
4414 scmd->satacmd_flags.sata_copy_out_error_reg = B_TRUE;
4415 if (!(scsipkt->pkt_cdbp[4] & START_STOP_NOFLUSH_MASK)) {
4416 if (sata_hba_start(spx, &rval) != 0) {
4417 mutex_exit(cport_mutex);
4418 return (rval);
4419 }
4420 if (scmd->satacmd_error_reg != 0) {
4421 goto err_out;
4422 }
4423 }
4424 sata_build_generic_cmd(scmd, SATAC_STANDBY);
4425 scmd->satacmd_flags.sata_copy_out_error_reg = B_TRUE;
4426 if (sata_hba_start(spx, &rval) != 0) {
4427 mutex_exit(cport_mutex);
4428 return (rval);
4429 }
4430 if (scmd->satacmd_error_reg != 0) {
4431 goto err_out;
4432 }
4433 sdinfo->satadrv_power_level = SATA_POWER_STANDBY;
4434 break;
4435 case 0x7:
4436 sata_build_generic_cmd(scmd, SATAC_CHECK_POWER_MODE);
4437 scmd->satacmd_flags.sata_copy_out_sec_count_lsb = B_TRUE;
4438 scmd->satacmd_flags.sata_copy_out_error_reg = B_TRUE;
4439 if (sata_hba_start(spx, &rval) != 0) {
4440 mutex_exit(cport_mutex);
4441 return (rval);
4442 }
4443 if (scmd->satacmd_error_reg != 0) {
4444 goto err_out;
4445 }
4446 switch (scmd->satacmd_sec_count_lsb) {
4447 case SATA_PWRMODE_STANDBY:
4448 sata_build_generic_cmd(scmd, SATAC_STANDBY);
4449 scmd->satacmd_sec_count_msb = sata_get_standby_timer(
4450 sdinfo->satadrv_standby_timer);
4451 scmd->satacmd_flags.sata_copy_out_error_reg = B_TRUE;
4452 if (sata_hba_start(spx, &rval) != 0) {
4453 mutex_exit(cport_mutex);
4454 return (rval);
4455 } else {
4456 if (scmd->satacmd_error_reg != 0) {
4457 goto err_out;
4458 }
4459 }
4460 break;
4461 case SATA_PWRMODE_IDLE:
4462 sata_build_generic_cmd(scmd, SATAC_IDLE);
4463 scmd->satacmd_sec_count_msb = sata_get_standby_timer(
4464 sdinfo->satadrv_standby_timer);
4465 scmd->satacmd_flags.sata_copy_out_error_reg = B_TRUE;
4466 if (sata_hba_start(spx, &rval) != 0) {
4467 mutex_exit(cport_mutex);
4468 return (rval);
4469 } else {
4470 if (scmd->satacmd_error_reg != 0) {
4471 goto err_out;
4472 }
4473 }
4474 break;
4475 case SATA_PWRMODE_ACTIVE_SPINDOWN:
4476 case SATA_PWRMODE_ACTIVE_SPINUP:
4477 case SATA_PWRMODE_ACTIVE:
4478 sata_build_generic_cmd(scmd, SATAC_IDLE);
4479 scmd->satacmd_sec_count_msb = sata_get_standby_timer(
4480 sdinfo->satadrv_standby_timer);
4481 scmd->satacmd_flags.sata_copy_out_error_reg = B_TRUE;
4482 if (sata_hba_start(spx, &rval) != 0) {
4483 mutex_exit(cport_mutex);
4484 return (rval);
4485 }
4486 if (scmd->satacmd_error_reg != 0) {
4487 goto err_out;
4488 }
4489 sata_build_read_verify_cmd(scmd, 1, 5);
4490 scmd->satacmd_flags.sata_copy_out_error_reg = B_TRUE;
4491 if (sata_hba_start(spx, &rval) != 0) {
4492 mutex_exit(cport_mutex);
4493 return (rval);
4494 }
4495 if (scmd->satacmd_error_reg != 0) {
4496 goto err_out;
4497 }
4498 break;
4499 default:
4500 goto err_out;
4501 }
4502 break;
4503 case 0xb:
4504 if ((sata_get_standby_timer(sdinfo->satadrv_standby_timer) ==
4505 0) || (!(sata_id->ai_cap & SATA_STANDBYTIMER))) {
4506 mutex_exit(cport_mutex);
4507 return (sata_txlt_check_condition(spx,
4508 KEY_ILLEGAL_REQUEST,
4509 SD_SCSI_ASC_INVALID_FIELD_IN_CDB));
4510 }
4511 sata_build_generic_cmd(scmd, SATAC_FLUSH_CACHE);
4512 scmd->satacmd_flags.sata_copy_out_error_reg = B_TRUE;
4513 if (!(scsipkt->pkt_cdbp[4] & START_STOP_NOFLUSH_MASK)) {
4514 if (sata_hba_start(spx, &rval) != 0) {
4515 mutex_exit(cport_mutex);
4516 return (rval);
4517 }
4518 if (scmd->satacmd_error_reg != 0) {
4519 goto err_out;
4520 }
4521 sata_build_generic_cmd(scmd, SATAC_STANDBY_IM);
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 }
4527 if (scmd->satacmd_error_reg != 0) {
4528 goto err_out;
4529 }
4530 }
4531 bzero(sdinfo->satadrv_standby_timer, sizeof (uchar_t) * 4);
4532 break;
4533 default:
4534 err_out:
4535 mutex_exit(cport_mutex);
4536 return (sata_txlt_check_condition(spx, KEY_ILLEGAL_REQUEST,
4537 SD_SCSI_ASC_INVALID_FIELD_IN_CDB));
4538 }
4539
4540 /*
4541 * Since it was a synchronous command,
4542 * a callback function will be called directly.
4543 */
4544 mutex_exit(cport_mutex);
4545 SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
4546 "synchronous execution status %x\n",
4547 spx->txlt_sata_pkt->satapkt_reason);
4548
4549 if ((scsipkt->pkt_flags & FLAG_NOINTR) == 0 &&
4550 scsipkt->pkt_comp != NULL) {
4551 sata_set_arq_data(spx->txlt_sata_pkt);
4552 if (servicing_interrupt()) {
4553 if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
4554 (task_func_t *)spx->txlt_scsi_pkt->pkt_comp,
4555 (void *)spx->txlt_scsi_pkt, TQ_NOSLEEP) ==
4556 TASKQID_INVALID) {
4557 return (TRAN_BUSY);
4558 }
4559 } else if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
4560 (task_func_t *)spx->txlt_scsi_pkt->pkt_comp,
4561 (void *)spx->txlt_scsi_pkt, TQ_SLEEP) == TASKQID_INVALID) {
4562 /* Scheduling the callback failed */
4563 return (TRAN_BUSY);
4564 }
4565 }
4566 else
4567
4568 sata_txlt_nodata_cmd_completion(spx->txlt_sata_pkt);
4569
4570 return (TRAN_ACCEPT);
4571
4572 }
4573
4574 /*
4575 * SATA translate command: Read Capacity.
4576 * Emulated command for SATA disks.
4577 * Capacity is retrieved from cached Idenifty Device data.
4578 * Identify Device data shows effective disk capacity, not the native
4579 * capacity, which may be limitted by Set Max Address command.
4580 * This is ATA version for SATA hard disks.
4581 *
4582 * Returns TRAN_ACCEPT and appropriate values in scsi_pkt fields.
4583 */
4584 static int
sata_txlt_read_capacity(sata_pkt_txlate_t * spx)4585 sata_txlt_read_capacity(sata_pkt_txlate_t *spx)
4586 {
4587 struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
4588 struct buf *bp = spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp;
4589 sata_drive_info_t *sdinfo;
4590 uint64_t val;
4591 uint32_t lbsize = DEV_BSIZE;
4592 uchar_t *rbuf;
4593 int rval, reason;
4594 kmutex_t *cport_mutex = &(SATA_TXLT_CPORT_MUTEX(spx));
4595
4596 SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
4597 "sata_txlt_read_capacity: ", NULL);
4598
4599 mutex_enter(cport_mutex);
4600
4601 if (((rval = sata_txlt_generic_pkt_info(spx, &reason, 0)) !=
4602 TRAN_ACCEPT) || (reason == CMD_DEV_GONE)) {
4603 mutex_exit(cport_mutex);
4604 return (rval);
4605 }
4606
4607 scsipkt->pkt_reason = CMD_CMPLT;
4608 scsipkt->pkt_state = STATE_GOT_BUS | STATE_GOT_TARGET |
4609 STATE_SENT_CMD | STATE_GOT_STATUS;
4610 *scsipkt->pkt_scbp = STATUS_GOOD;
4611 if (bp != NULL && bp->b_un.b_addr && bp->b_bcount) {
4612 /*
4613 * Because it is fully emulated command storing data
4614 * programatically in the specified buffer, release
4615 * preallocated DMA resources before storing data in the buffer,
4616 * so no unwanted DMA sync would take place.
4617 */
4618 sata_scsi_dmafree(NULL, scsipkt);
4619
4620 sdinfo = sata_get_device_info(
4621 spx->txlt_sata_hba_inst,
4622 &spx->txlt_sata_pkt->satapkt_device);
4623
4624 /*
4625 * As per SBC-3, the "returned LBA" is either the highest
4626 * addressable LBA or 0xffffffff, whichever is smaller.
4627 */
4628 val = MIN(sdinfo->satadrv_capacity - 1, UINT32_MAX);
4629
4630 if (sdinfo->satadrv_id.ai_phys_sect_sz & SATA_L2PS_CHECK_BIT) {
4631 /* physical/logical sector size word is valid */
4632
4633 if (sdinfo->satadrv_id.ai_phys_sect_sz &
4634 SATA_L2PS_BIG_SECTORS) {
4635 /* if this set 117-118 words are valid */
4636 lbsize = sdinfo->satadrv_id.ai_words_lsec[0] |
4637 (sdinfo->satadrv_id.ai_words_lsec[1] << 16);
4638 lbsize <<= 1; /* convert from words to bytes */
4639 }
4640 }
4641 rbuf = (uchar_t *)bp->b_un.b_addr;
4642 /* Need to swap endians to match scsi format */
4643 rbuf[0] = (val >> 24) & 0xff;
4644 rbuf[1] = (val >> 16) & 0xff;
4645 rbuf[2] = (val >> 8) & 0xff;
4646 rbuf[3] = val & 0xff;
4647 rbuf[4] = (lbsize >> 24) & 0xff;
4648 rbuf[5] = (lbsize >> 16) & 0xff;
4649 rbuf[6] = (lbsize >> 8) & 0xff;
4650 rbuf[7] = lbsize & 0xff;
4651
4652 scsipkt->pkt_state |= STATE_XFERRED_DATA;
4653 scsipkt->pkt_resid = 0;
4654
4655 SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst, "%d\n",
4656 sdinfo->satadrv_capacity -1);
4657 }
4658 mutex_exit(cport_mutex);
4659 /*
4660 * If a callback was requested, do it now.
4661 */
4662 SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
4663 "Scsi_pkt completion reason %x\n", scsipkt->pkt_reason);
4664
4665 if ((scsipkt->pkt_flags & FLAG_NOINTR) == 0 &&
4666 scsipkt->pkt_comp != NULL) {
4667 /* scsi callback required */
4668 if (servicing_interrupt()) {
4669 if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
4670 (task_func_t *)spx->txlt_scsi_pkt->pkt_comp,
4671 (void *)spx->txlt_scsi_pkt, TQ_NOSLEEP) ==
4672 TASKQID_INVALID) {
4673 return (TRAN_BUSY);
4674 }
4675 } else if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
4676 (task_func_t *)spx->txlt_scsi_pkt->pkt_comp,
4677 (void *)spx->txlt_scsi_pkt, TQ_SLEEP) == TASKQID_INVALID) {
4678 /* Scheduling the callback failed */
4679 return (TRAN_BUSY);
4680 }
4681 }
4682
4683 return (TRAN_ACCEPT);
4684 }
4685
4686 /*
4687 * SATA translate command: Read Capacity (16).
4688 * Emulated command for SATA disks.
4689 * Info is retrieved from cached Identify Device data.
4690 * Implemented to SBC-3 (draft 21) and SAT-2 (final) specifications.
4691 *
4692 * Returns TRAN_ACCEPT and appropriate values in scsi_pkt fields.
4693 */
4694 static int
sata_txlt_read_capacity16(sata_pkt_txlate_t * spx)4695 sata_txlt_read_capacity16(sata_pkt_txlate_t *spx)
4696 {
4697 struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
4698 struct buf *bp = spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp;
4699 sata_drive_info_t *sdinfo;
4700 uint64_t val;
4701 uint16_t l2p_exp;
4702 uint32_t lbsize = DEV_BSIZE;
4703 uchar_t *rbuf;
4704 int rval, reason;
4705 #define TPE 0x80
4706 #define TPRZ 0x40
4707 kmutex_t *cport_mutex = &(SATA_TXLT_CPORT_MUTEX(spx));
4708
4709 SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
4710 "sata_txlt_read_capacity: ", NULL);
4711
4712 mutex_enter(cport_mutex);
4713
4714 if (((rval = sata_txlt_generic_pkt_info(spx, &reason, 0)) !=
4715 TRAN_ACCEPT) || (reason == CMD_DEV_GONE)) {
4716 mutex_exit(cport_mutex);
4717 return (rval);
4718 }
4719
4720 scsipkt->pkt_reason = CMD_CMPLT;
4721 scsipkt->pkt_state = STATE_GOT_BUS | STATE_GOT_TARGET |
4722 STATE_SENT_CMD | STATE_GOT_STATUS;
4723 if (bp != NULL && bp->b_un.b_addr && bp->b_bcount) {
4724 /*
4725 * Because it is fully emulated command storing data
4726 * programatically in the specified buffer, release
4727 * preallocated DMA resources before storing data in the buffer,
4728 * so no unwanted DMA sync would take place.
4729 */
4730 sata_scsi_dmafree(NULL, scsipkt);
4731
4732 /* Check SERVICE ACTION field */
4733 if ((scsipkt->pkt_cdbp[1] & 0x1f) !=
4734 SSVC_ACTION_READ_CAPACITY_G4) {
4735 mutex_exit(cport_mutex);
4736 return (sata_txlt_check_condition(spx,
4737 KEY_ILLEGAL_REQUEST,
4738 SD_SCSI_ASC_INVALID_FIELD_IN_CDB));
4739 }
4740
4741 /* Check LBA field */
4742 if ((scsipkt->pkt_cdbp[2] != 0) ||
4743 (scsipkt->pkt_cdbp[3] != 0) ||
4744 (scsipkt->pkt_cdbp[4] != 0) ||
4745 (scsipkt->pkt_cdbp[5] != 0) ||
4746 (scsipkt->pkt_cdbp[6] != 0) ||
4747 (scsipkt->pkt_cdbp[7] != 0) ||
4748 (scsipkt->pkt_cdbp[8] != 0) ||
4749 (scsipkt->pkt_cdbp[9] != 0)) {
4750 mutex_exit(cport_mutex);
4751 return (sata_txlt_check_condition(spx,
4752 KEY_ILLEGAL_REQUEST,
4753 SD_SCSI_ASC_INVALID_FIELD_IN_CDB));
4754 }
4755
4756 /* Check PMI bit */
4757 if (scsipkt->pkt_cdbp[14] & 0x1) {
4758 mutex_exit(cport_mutex);
4759 return (sata_txlt_check_condition(spx,
4760 KEY_ILLEGAL_REQUEST,
4761 SD_SCSI_ASC_INVALID_FIELD_IN_CDB));
4762 }
4763
4764 *scsipkt->pkt_scbp = STATUS_GOOD;
4765
4766 sdinfo = sata_get_device_info(
4767 spx->txlt_sata_hba_inst,
4768 &spx->txlt_sata_pkt->satapkt_device);
4769
4770 /* last logical block address */
4771 val = MIN(sdinfo->satadrv_capacity - 1,
4772 SCSI_READ_CAPACITY16_MAX_LBA);
4773
4774 /* logical to physical block size exponent */
4775 l2p_exp = 0;
4776 if (sdinfo->satadrv_id.ai_phys_sect_sz & SATA_L2PS_CHECK_BIT) {
4777 /* physical/logical sector size word is valid */
4778
4779 if (sdinfo->satadrv_id.ai_phys_sect_sz &
4780 SATA_L2PS_HAS_MULT) {
4781 /* multiple logical sectors per phys sectors */
4782 l2p_exp =
4783 sdinfo->satadrv_id.ai_phys_sect_sz &
4784 SATA_L2PS_EXP_MASK;
4785 }
4786
4787 if (sdinfo->satadrv_id.ai_phys_sect_sz &
4788 SATA_L2PS_BIG_SECTORS) {
4789 /* if this set 117-118 words are valid */
4790 lbsize = sdinfo->satadrv_id.ai_words_lsec[0] |
4791 (sdinfo->satadrv_id.ai_words_lsec[1] << 16);
4792 lbsize <<= 1; /* convert from words to bytes */
4793 }
4794 }
4795
4796 rbuf = (uchar_t *)bp->b_un.b_addr;
4797 bzero(rbuf, bp->b_bcount);
4798
4799 /* returned logical block address */
4800 rbuf[0] = (val >> 56) & 0xff;
4801 rbuf[1] = (val >> 48) & 0xff;
4802 rbuf[2] = (val >> 40) & 0xff;
4803 rbuf[3] = (val >> 32) & 0xff;
4804 rbuf[4] = (val >> 24) & 0xff;
4805 rbuf[5] = (val >> 16) & 0xff;
4806 rbuf[6] = (val >> 8) & 0xff;
4807 rbuf[7] = val & 0xff;
4808 rbuf[8] = (lbsize >> 24) & 0xff;
4809 rbuf[9] = (lbsize >> 16) & 0xff;
4810 rbuf[10] = (lbsize >> 8) & 0xff;
4811 rbuf[11] = lbsize & 0xff;
4812
4813 /* p_type, prot_en, unspecified by SAT-2 */
4814 /* rbuf[12] = 0; */
4815
4816 /* p_i_exponent, undefined by SAT-2 */
4817 /* logical blocks per physical block exponent */
4818 rbuf[13] = l2p_exp;
4819
4820 /*
4821 * tpe and tprz as defined in T10/10-079 r0.
4822 * TRIM support is indicated by the relevant bit in the data
4823 * set management word. Read-after-trim behavior is indicated
4824 * by the additional bits in the identify device word. Of the
4825 * three defined possibilities, we only flag read-zero.
4826 */
4827 if (sdinfo->satadrv_id.ai_dsm & SATA_DSM_TRIM) {
4828 rbuf[14] |= TPE;
4829
4830 if ((sdinfo->satadrv_id.ai_addsupported &
4831 SATA_DETERMINISTIC_READ) &&
4832 (sdinfo->satadrv_id.ai_addsupported &
4833 SATA_READ_ZERO)) {
4834 rbuf[14] |= TPRZ;
4835 }
4836 }
4837
4838 /* lowest aligned logical block address = 0 (for now) */
4839 /* rbuf[15] = 0; */
4840
4841 scsipkt->pkt_state |= STATE_XFERRED_DATA;
4842 scsipkt->pkt_resid = 0;
4843
4844 SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst, "%llu\n",
4845 sdinfo->satadrv_capacity -1);
4846 }
4847
4848 mutex_exit(cport_mutex);
4849
4850 /*
4851 * If a callback was requested, do it now.
4852 */
4853 SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
4854 "Scsi_pkt completion reason %x\n", scsipkt->pkt_reason);
4855
4856 if ((scsipkt->pkt_flags & FLAG_NOINTR) == 0 &&
4857 scsipkt->pkt_comp != NULL) {
4858 /* scsi callback required */
4859 if (servicing_interrupt()) {
4860 if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
4861 (task_func_t *)spx->txlt_scsi_pkt->pkt_comp,
4862 (void *)spx->txlt_scsi_pkt, TQ_NOSLEEP) ==
4863 TASKQID_INVALID) {
4864 return (TRAN_BUSY);
4865 }
4866 } else if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
4867 (task_func_t *)spx->txlt_scsi_pkt->pkt_comp,
4868 (void *)spx->txlt_scsi_pkt, TQ_SLEEP) == TASKQID_INVALID) {
4869 /* Scheduling the callback failed */
4870 return (TRAN_BUSY);
4871 }
4872 }
4873
4874 return (TRAN_ACCEPT);
4875 }
4876
4877 static boolean_t
sata_txlt_unmap_supported(sata_pkt_txlate_t * spx,sata_drive_info_t * sdinfo)4878 sata_txlt_unmap_supported(sata_pkt_txlate_t *spx, sata_drive_info_t *sdinfo)
4879 {
4880 const sata_id_t *id = &sdinfo->satadrv_id;
4881
4882 ASSERT(MUTEX_HELD(&SATA_TXLT_CPORT_MUTEX(spx)));
4883
4884 /*
4885 * SAT-5 9.24.1 If the TRIM SUPPORTED bit is zero or the
4886 * DRAT SUPPORTED bit is zero, then UNMAP is not supported.
4887 */
4888 if (!(id->ai_dsm & SATA_DSM_TRIM) ||
4889 !(id->ai_addsupported & SATA_DETERMINISTIC_READ)) {
4890 return (B_FALSE);
4891 }
4892
4893 return (B_TRUE);
4894 }
4895
4896 /*
4897 * Translate command: UNMAP
4898 *
4899 * The function cannot be called in interrupt context since it may sleep.
4900 */
4901 static int
sata_txlt_unmap(sata_pkt_txlate_t * spx)4902 sata_txlt_unmap(sata_pkt_txlate_t *spx)
4903 {
4904 struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
4905 sata_cmd_t *scmd = &spx->txlt_sata_pkt->satapkt_cmd;
4906 struct buf *bp = spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp;
4907 uint16_t count = 0;
4908 int synch;
4909 int rval, reason;
4910 int i, x;
4911 int bdlen = 0;
4912 int ranges = 0;
4913 int paramlen = 8;
4914 uint8_t *data, *tmpbd;
4915 sata_drive_info_t *sdinfo;
4916 kmutex_t *cport_mutex = &(SATA_TXLT_CPORT_MUTEX(spx));
4917 #define TRIM 0x1
4918
4919 SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
4920 "sata_txlt_unmap: ", NULL);
4921
4922 mutex_enter(cport_mutex);
4923
4924 sdinfo = sata_get_device_info(spx->txlt_sata_hba_inst,
4925 &spx->txlt_sata_pkt->satapkt_device);
4926 if (sdinfo != NULL) {
4927 SATADBG2(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
4928 "DSM support 0x%x, max number of 512 byte blocks of LBA "
4929 "range entries 0x%x\n", sdinfo->satadrv_id.ai_dsm,
4930 sdinfo->satadrv_id.ai_maxcount);
4931 }
4932
4933 rval = sata_txlt_generic_pkt_info(spx, &reason, 1);
4934 if ((rval != TRAN_ACCEPT) || (reason == CMD_DEV_GONE)) {
4935 mutex_exit(cport_mutex);
4936 return (rval);
4937 }
4938
4939 if (!sata_txlt_unmap_supported(spx, sdinfo)) {
4940 mutex_exit(cport_mutex);
4941 return (sata_txlt_invalid_command(spx));
4942 }
4943
4944 /*
4945 * Need to modify bp to have TRIM data instead of UNMAP data.
4946 * Start by getting the block descriptor data length by subtracting
4947 * the 8 byte parameter list header from the parameter list length.
4948 * The block descriptor size has to be a multiple of 16 bytes.
4949 */
4950 bdlen = scsipkt->pkt_cdbp[7];
4951 bdlen = (bdlen << 8) + scsipkt->pkt_cdbp[8] - paramlen;
4952 if ((bdlen < 0) || ((bdlen % 16) != 0) ||
4953 ((bp != NULL) && (bdlen > (bp->b_bcount - paramlen)))) {
4954 SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
4955 "sata_txlt_unmap: invalid block descriptor length", NULL);
4956 mutex_exit(cport_mutex);
4957 return ((sata_txlt_check_condition(spx, KEY_ILLEGAL_REQUEST,
4958 SD_SCSI_ASC_INVALID_FIELD_IN_CDB)));
4959 }
4960 /*
4961 * If there are no parameter data or block descriptors, it is not
4962 * considered an error so just complete the command without sending
4963 * TRIM.
4964 */
4965 if ((bdlen == 0) || (bp == NULL) || (bp->b_un.b_addr == NULL) ||
4966 (bp->b_bcount == 0)) {
4967 SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
4968 "sata_txlt_unmap: no parameter data or block descriptors",
4969 NULL);
4970 mutex_exit(cport_mutex);
4971 return (sata_txlt_unmap_nodata_cmd(spx));
4972 }
4973 tmpbd = (uint8_t *)bp->b_un.b_addr + paramlen;
4974 data = kmem_zalloc(bdlen, KM_SLEEP);
4975
4976 /*
4977 * Loop through all the UNMAP block descriptors and convert the data
4978 * into TRIM format.
4979 */
4980 for (i = 0, x = 0; i < bdlen; i += 16, x += 8) {
4981 /* get range length */
4982 data[x] = tmpbd[i+7];
4983 data[x+1] = tmpbd[i+6];
4984 /* get LBA */
4985 data[x+2] = tmpbd[i+5];
4986 data[x+3] = tmpbd[i+4];
4987 data[x+4] = tmpbd[i+3];
4988 data[x+5] = tmpbd[i+2];
4989 data[x+6] = tmpbd[i+11];
4990 data[x+7] = tmpbd[i+10];
4991
4992 ranges++;
4993 }
4994
4995 /*
4996 * The TRIM command expects the data buffer to be a multiple of
4997 * 512-byte blocks of range entries. This means that the UNMAP buffer
4998 * may be too small. Free the original DMA resources and create a
4999 * local buffer.
5000 */
5001 sata_common_free_dma_rsrcs(spx);
5002
5003 /*
5004 * Get count of 512-byte blocks of range entries. The length
5005 * of a range entry is 8 bytes which means one count has 64 range
5006 * entries.
5007 */
5008 count = (ranges + 63)/64;
5009
5010 /* Allocate a buffer that is a multiple of 512 bytes. */
5011 mutex_exit(cport_mutex);
5012 bp = sata_alloc_local_buffer(spx, (size_t)count * 512);
5013 if (bp == NULL) {
5014 SATADBG1(SATA_DBG_ATAPI, spx->txlt_sata_hba_inst,
5015 "sata_txlt_unmap: "
5016 "cannot allocate buffer for TRIM command", NULL);
5017 kmem_free(data, bdlen);
5018 return (TRAN_BUSY);
5019 }
5020 bp_mapin(bp); /* make data buffer accessible */
5021 mutex_enter(cport_mutex);
5022
5023 bzero(bp->b_un.b_addr, bp->b_bcount);
5024 bcopy(data, bp->b_un.b_addr, x);
5025 kmem_free(data, bdlen);
5026 rval = ddi_dma_sync(spx->txlt_buf_dma_handle, 0, 0,
5027 DDI_DMA_SYNC_FORDEV);
5028 ASSERT(rval == DDI_SUCCESS);
5029
5030 scmd->satacmd_flags.sata_data_direction = SATA_DIR_WRITE;
5031 scmd->satacmd_addr_type = ATA_ADDR_LBA48;
5032 scmd->satacmd_cmd_reg = SATAC_DSM;
5033 scmd->satacmd_sec_count_msb = (count >> 8) & 0xff;
5034 scmd->satacmd_sec_count_lsb = count & 0xff;
5035 scmd->satacmd_features_reg = TRIM;
5036 scmd->satacmd_device_reg = SATA_ADH_LBA;
5037 scmd->satacmd_status_reg = 0;
5038 scmd->satacmd_error_reg = 0;
5039
5040 /* Start processing command */
5041 if (!(spx->txlt_sata_pkt->satapkt_op_mode & SATA_OPMODE_SYNCH)) {
5042 spx->txlt_sata_pkt->satapkt_comp =
5043 sata_txlt_unmap_completion;
5044 synch = FALSE;
5045 } else {
5046 synch = TRUE;
5047 }
5048
5049 if (sata_hba_start(spx, &rval) != 0) {
5050 mutex_exit(cport_mutex);
5051 return (rval);
5052 }
5053
5054 mutex_exit(cport_mutex);
5055
5056 if (synch) {
5057 sata_txlt_unmap_completion(spx->txlt_sata_pkt);
5058 }
5059
5060 return (TRAN_ACCEPT);
5061 }
5062
5063 /*
5064 * SATA translate command: Mode Sense.
5065 * Translated into appropriate SATA command or emulated.
5066 * Saved Values Page Control (03) are not supported.
5067 *
5068 * NOTE: only caching mode sense page is currently implemented.
5069 *
5070 * Returns TRAN_ACCEPT and appropriate values in scsi_pkt fields.
5071 */
5072
5073 #define LLBAA 0x10 /* Long LBA Accepted */
5074
5075 static int
sata_txlt_mode_sense(sata_pkt_txlate_t * spx)5076 sata_txlt_mode_sense(sata_pkt_txlate_t *spx)
5077 {
5078 struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
5079 struct buf *bp = spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp;
5080 sata_drive_info_t *sdinfo;
5081 sata_id_t *sata_id;
5082 struct scsi_extended_sense *sense;
5083 int len, bdlen, count, alc_len;
5084 int pc; /* Page Control code */
5085 uint8_t *buf; /* mode sense buffer */
5086 int rval, reason;
5087 kmutex_t *cport_mutex = &(SATA_TXLT_CPORT_MUTEX(spx));
5088
5089 SATADBG2(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
5090 "sata_txlt_mode_sense, pc %x page code 0x%02x\n",
5091 spx->txlt_scsi_pkt->pkt_cdbp[2] >> 6,
5092 spx->txlt_scsi_pkt->pkt_cdbp[2] & 0x3f);
5093
5094 if (servicing_interrupt()) {
5095 buf = kmem_zalloc(1024, KM_NOSLEEP);
5096 if (buf == NULL) {
5097 return (TRAN_BUSY);
5098 }
5099 } else {
5100 buf = kmem_zalloc(1024, KM_SLEEP);
5101 }
5102
5103 mutex_enter(cport_mutex);
5104
5105 if (((rval = sata_txlt_generic_pkt_info(spx, &reason, 0)) !=
5106 TRAN_ACCEPT) || (reason == CMD_DEV_GONE)) {
5107 mutex_exit(cport_mutex);
5108 kmem_free(buf, 1024);
5109 return (rval);
5110 }
5111
5112 scsipkt->pkt_reason = CMD_CMPLT;
5113 scsipkt->pkt_state = STATE_GOT_BUS | STATE_GOT_TARGET |
5114 STATE_SENT_CMD | STATE_GOT_STATUS;
5115
5116 pc = scsipkt->pkt_cdbp[2] >> 6;
5117
5118 if (bp != NULL && bp->b_un.b_addr && bp->b_bcount) {
5119 /*
5120 * Because it is fully emulated command storing data
5121 * programatically in the specified buffer, release
5122 * preallocated DMA resources before storing data in the buffer,
5123 * so no unwanted DMA sync would take place.
5124 */
5125 sata_scsi_dmafree(NULL, scsipkt);
5126
5127 len = 0;
5128 bdlen = 0;
5129 if (!(scsipkt->pkt_cdbp[1] & 8)) {
5130 if (scsipkt->pkt_cdbp[0] == SCMD_MODE_SENSE_G1 &&
5131 (scsipkt->pkt_cdbp[1] & LLBAA))
5132 bdlen = 16;
5133 else
5134 bdlen = 8;
5135 }
5136 /* Build mode parameter header */
5137 if (spx->txlt_scsi_pkt->pkt_cdbp[0] == SCMD_MODE_SENSE) {
5138 /* 4-byte mode parameter header */
5139 buf[len++] = 0; /* mode data length */
5140 buf[len++] = 0; /* medium type */
5141 buf[len++] = 0; /* dev-specific param */
5142 buf[len++] = bdlen; /* Block Descriptor length */
5143 } else {
5144 /* 8-byte mode parameter header */
5145 buf[len++] = 0; /* mode data length */
5146 buf[len++] = 0;
5147 buf[len++] = 0; /* medium type */
5148 buf[len++] = 0; /* dev-specific param */
5149 if (bdlen == 16)
5150 buf[len++] = 1; /* long lba descriptor */
5151 else
5152 buf[len++] = 0;
5153 buf[len++] = 0;
5154 buf[len++] = 0; /* Block Descriptor length */
5155 buf[len++] = bdlen;
5156 }
5157
5158 sdinfo = sata_get_device_info(
5159 spx->txlt_sata_hba_inst,
5160 &spx->txlt_sata_pkt->satapkt_device);
5161
5162 /* Build block descriptor only if not disabled (DBD) */
5163 if ((scsipkt->pkt_cdbp[1] & 0x08) == 0) {
5164 /* Block descriptor - direct-access device format */
5165 if (bdlen == 8) {
5166 /* build regular block descriptor */
5167 buf[len++] =
5168 (sdinfo->satadrv_capacity >> 24) & 0xff;
5169 buf[len++] =
5170 (sdinfo->satadrv_capacity >> 16) & 0xff;
5171 buf[len++] =
5172 (sdinfo->satadrv_capacity >> 8) & 0xff;
5173 buf[len++] = sdinfo->satadrv_capacity & 0xff;
5174 buf[len++] = 0; /* density code */
5175 buf[len++] = 0;
5176 if (sdinfo->satadrv_type ==
5177 SATA_DTYPE_ATADISK)
5178 buf[len++] = 2;
5179 else
5180 /* ATAPI */
5181 buf[len++] = 8;
5182 buf[len++] = 0;
5183 } else if (bdlen == 16) {
5184 /* Long LBA Accepted */
5185 /* build long lba block descriptor */
5186 #ifndef __lock_lint
5187 buf[len++] =
5188 (sdinfo->satadrv_capacity >> 56) & 0xff;
5189 buf[len++] =
5190 (sdinfo->satadrv_capacity >> 48) & 0xff;
5191 buf[len++] =
5192 (sdinfo->satadrv_capacity >> 40) & 0xff;
5193 buf[len++] =
5194 (sdinfo->satadrv_capacity >> 32) & 0xff;
5195 #endif
5196 buf[len++] =
5197 (sdinfo->satadrv_capacity >> 24) & 0xff;
5198 buf[len++] =
5199 (sdinfo->satadrv_capacity >> 16) & 0xff;
5200 buf[len++] =
5201 (sdinfo->satadrv_capacity >> 8) & 0xff;
5202 buf[len++] = sdinfo->satadrv_capacity & 0xff;
5203 buf[len++] = 0;
5204 buf[len++] = 0; /* density code */
5205 buf[len++] = 0;
5206 buf[len++] = 0;
5207 if (sdinfo->satadrv_type ==
5208 SATA_DTYPE_ATADISK)
5209 buf[len++] = 2;
5210 else
5211 /* ATAPI */
5212 buf[len++] = 8;
5213 buf[len++] = 0;
5214 }
5215 }
5216
5217 sata_id = &sdinfo->satadrv_id;
5218
5219 /*
5220 * Add requested pages.
5221 * Page 3 and 4 are obsolete and we are not supporting them.
5222 * We deal now with:
5223 * caching (read/write cache control).
5224 * We should eventually deal with following mode pages:
5225 * error recovery (0x01),
5226 * power condition (0x1a),
5227 * exception control page (enables SMART) (0x1c),
5228 * enclosure management (ses),
5229 * protocol-specific port mode (port control).
5230 */
5231 switch (scsipkt->pkt_cdbp[2] & 0x3f) {
5232 case MODEPAGE_RW_ERRRECOV:
5233 /* DAD_MODE_ERR_RECOV */
5234 /* R/W recovery */
5235 len += sata_build_msense_page_1(sdinfo, pc, buf+len);
5236 break;
5237 case MODEPAGE_CACHING:
5238 /* DAD_MODE_CACHE */
5239 /* Reject not supported request for saved parameters */
5240 if (pc == 3) {
5241 *scsipkt->pkt_scbp = STATUS_CHECK;
5242 sense = sata_arq_sense(spx);
5243 sense->es_key = KEY_ILLEGAL_REQUEST;
5244 sense->es_add_code =
5245 SD_SCSI_ASC_SAVING_PARAMS_NOT_SUPPORTED;
5246 goto done;
5247 }
5248
5249 /* caching */
5250 len += sata_build_msense_page_8(sdinfo, pc, buf+len);
5251 break;
5252 case MODEPAGE_INFO_EXCPT:
5253 /* exception cntrl */
5254 if (sata_id->ai_cmdset82 & SATA_SMART_SUPPORTED) {
5255 len += sata_build_msense_page_1c(sdinfo, pc,
5256 buf+len);
5257 }
5258 else
5259 goto err;
5260 break;
5261 case MODEPAGE_POWER_COND:
5262 /* DAD_MODE_POWER_COND */
5263 /* power condition */
5264 len += sata_build_msense_page_1a(sdinfo, pc, buf+len);
5265 break;
5266
5267 case MODEPAGE_ACOUSTIC_MANAG:
5268 /* acoustic management */
5269 len += sata_build_msense_page_30(sdinfo, pc, buf+len);
5270 break;
5271 case MODEPAGE_ALLPAGES:
5272 /* all pages */
5273 len += sata_build_msense_page_1(sdinfo, pc, buf+len);
5274 len += sata_build_msense_page_8(sdinfo, pc, buf+len);
5275 len += sata_build_msense_page_1a(sdinfo, pc, buf+len);
5276 if (sata_id->ai_cmdset82 & SATA_SMART_SUPPORTED) {
5277 len += sata_build_msense_page_1c(sdinfo, pc,
5278 buf+len);
5279 }
5280 len += sata_build_msense_page_30(sdinfo, pc, buf+len);
5281 break;
5282 default:
5283 err:
5284 /* Invalid request */
5285 *scsipkt->pkt_scbp = STATUS_CHECK;
5286 sense = sata_arq_sense(spx);
5287 sense->es_key = KEY_ILLEGAL_REQUEST;
5288 sense->es_add_code = SD_SCSI_ASC_INVALID_FIELD_IN_CDB;
5289 goto done;
5290 }
5291
5292 /* fix total mode data length */
5293 if (spx->txlt_scsi_pkt->pkt_cdbp[0] == SCMD_MODE_SENSE) {
5294 /* 4-byte mode parameter header */
5295 buf[0] = len - 1; /* mode data length */
5296 } else {
5297 buf[0] = (len -2) >> 8;
5298 buf[1] = (len -2) & 0xff;
5299 }
5300
5301
5302 /* Check allocation length */
5303 if (scsipkt->pkt_cdbp[0] == SCMD_MODE_SENSE) {
5304 alc_len = scsipkt->pkt_cdbp[4];
5305 } else {
5306 alc_len = scsipkt->pkt_cdbp[7];
5307 alc_len = (alc_len << 8) | scsipkt->pkt_cdbp[8];
5308 }
5309 /*
5310 * We do not check for possible parameters truncation
5311 * (alc_len < len) assuming that the target driver works
5312 * correctly. Just avoiding overrun.
5313 * Copy no more than requested and possible, buffer-wise.
5314 */
5315 count = MIN(alc_len, len);
5316 count = MIN(bp->b_bcount, count);
5317 bcopy(buf, bp->b_un.b_addr, count);
5318
5319 scsipkt->pkt_state |= STATE_XFERRED_DATA;
5320 scsipkt->pkt_resid = alc_len > count ? alc_len - count : 0;
5321 }
5322 *scsipkt->pkt_scbp = STATUS_GOOD;
5323 done:
5324 mutex_exit(cport_mutex);
5325 (void) kmem_free(buf, 1024);
5326
5327 SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
5328 "Scsi_pkt completion reason %x\n", scsipkt->pkt_reason);
5329
5330 if ((scsipkt->pkt_flags & FLAG_NOINTR) == 0 &&
5331 scsipkt->pkt_comp != NULL) {
5332 /* scsi callback required */
5333 if (servicing_interrupt()) {
5334 if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
5335 (task_func_t *)spx->txlt_scsi_pkt->pkt_comp,
5336 (void *)spx->txlt_scsi_pkt, TQ_NOSLEEP) ==
5337 TASKQID_INVALID) {
5338 return (TRAN_BUSY);
5339 }
5340 } else if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
5341 (task_func_t *)spx->txlt_scsi_pkt->pkt_comp,
5342 (void *)spx->txlt_scsi_pkt, TQ_SLEEP) == TASKQID_INVALID) {
5343 /* Scheduling the callback failed */
5344 return (TRAN_BUSY);
5345 }
5346 }
5347
5348 return (TRAN_ACCEPT);
5349 }
5350
5351
5352 /*
5353 * SATA translate command: Mode Select.
5354 * Translated into appropriate SATA command or emulated.
5355 * Saving parameters is not supported.
5356 * Changing device capacity is not supported (although theoretically
5357 * possible by executing SET FEATURES/SET MAX ADDRESS)
5358 *
5359 * Assumption is that the target driver is working correctly.
5360 *
5361 * More than one SATA command may be executed to perform operations specified
5362 * by mode select pages. The first error terminates further execution.
5363 * Operations performed successully are not backed-up in such case.
5364 *
5365 * NOTE: Implemented pages:
5366 * - caching page
5367 * - informational exception page
5368 * - acoustic management page
5369 * - power condition page
5370 * Caching setup is remembered so it could be re-stored in case of
5371 * an unexpected device reset.
5372 *
5373 * Returns TRAN_XXXX.
5374 * If TRAN_ACCEPT is returned, appropriate values are set in scsi_pkt fields.
5375 */
5376
5377 static int
sata_txlt_mode_select(sata_pkt_txlate_t * spx)5378 sata_txlt_mode_select(sata_pkt_txlate_t *spx)
5379 {
5380 struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
5381 struct buf *bp = spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp;
5382 struct scsi_extended_sense *sense;
5383 int len, pagelen, count, pllen;
5384 uint8_t *buf; /* mode select buffer */
5385 int rval, stat, reason;
5386 uint_t nointr_flag;
5387 int dmod = 0;
5388 kmutex_t *cport_mutex = &(SATA_TXLT_CPORT_MUTEX(spx));
5389
5390 SATADBG2(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
5391 "sata_txlt_mode_select, pc %x page code 0x%02x\n",
5392 spx->txlt_scsi_pkt->pkt_cdbp[2] >> 6,
5393 spx->txlt_scsi_pkt->pkt_cdbp[2] & 0x3f);
5394
5395 mutex_enter(cport_mutex);
5396
5397 if (((rval = sata_txlt_generic_pkt_info(spx, &reason, 1)) !=
5398 TRAN_ACCEPT) || (reason == CMD_DEV_GONE)) {
5399 mutex_exit(cport_mutex);
5400 return (rval);
5401 }
5402
5403 rval = TRAN_ACCEPT;
5404
5405 scsipkt->pkt_reason = CMD_CMPLT;
5406 scsipkt->pkt_state = STATE_GOT_BUS | STATE_GOT_TARGET |
5407 STATE_SENT_CMD | STATE_GOT_STATUS;
5408 nointr_flag = scsipkt->pkt_flags & FLAG_NOINTR;
5409
5410 /* Reject not supported request */
5411 if (! (scsipkt->pkt_cdbp[1] & 0x10)) { /* No support for PF bit = 0 */
5412 *scsipkt->pkt_scbp = STATUS_CHECK;
5413 sense = sata_arq_sense(spx);
5414 sense->es_key = KEY_ILLEGAL_REQUEST;
5415 sense->es_add_code = SD_SCSI_ASC_INVALID_FIELD_IN_CDB;
5416 goto done;
5417 }
5418
5419 if (scsipkt->pkt_cdbp[0] == SCMD_MODE_SELECT) {
5420 pllen = scsipkt->pkt_cdbp[4];
5421 } else {
5422 pllen = scsipkt->pkt_cdbp[7];
5423 pllen = (pllen << 8) | scsipkt->pkt_cdbp[7];
5424 }
5425
5426 *scsipkt->pkt_scbp = STATUS_GOOD; /* Presumed outcome */
5427
5428 if (bp != NULL && bp->b_un.b_addr && bp->b_bcount && pllen != 0) {
5429 buf = (uint8_t *)bp->b_un.b_addr;
5430 count = MIN(bp->b_bcount, pllen);
5431 scsipkt->pkt_state |= STATE_XFERRED_DATA;
5432 scsipkt->pkt_resid = 0;
5433 pllen = count;
5434
5435 /*
5436 * Check the header to skip the block descriptor(s) - we
5437 * do not support setting device capacity.
5438 * Existing macros do not recognize long LBA dscriptor,
5439 * hence manual calculation.
5440 */
5441 if (scsipkt->pkt_cdbp[0] == SCMD_MODE_SELECT) {
5442 /* 6-bytes CMD, 4 bytes header */
5443 if (count <= 4)
5444 goto done; /* header only */
5445 len = buf[3] + 4;
5446 } else {
5447 /* 10-bytes CMD, 8 bytes header */
5448 if (count <= 8)
5449 goto done; /* header only */
5450 len = buf[6];
5451 len = (len << 8) + buf[7] + 8;
5452 }
5453 if (len >= count)
5454 goto done; /* header + descriptor(s) only */
5455
5456 pllen -= len; /* remaining data length */
5457
5458 /*
5459 * We may be executing SATA command and want to execute it
5460 * in SYNCH mode, regardless of scsi_pkt setting.
5461 * Save scsi_pkt setting and indicate SYNCH mode
5462 */
5463 if ((scsipkt->pkt_flags & FLAG_NOINTR) == 0 &&
5464 scsipkt->pkt_comp != NULL) {
5465 scsipkt->pkt_flags |= FLAG_NOINTR;
5466 }
5467 spx->txlt_sata_pkt->satapkt_op_mode = SATA_OPMODE_SYNCH;
5468
5469 /*
5470 * len is now the offset to a first mode select page
5471 * Process all pages
5472 */
5473 while (pllen > 0) {
5474 switch ((int)buf[len]) {
5475 case MODEPAGE_CACHING:
5476 /* No support for SP (saving) */
5477 if (scsipkt->pkt_cdbp[1] & 0x01) {
5478 *scsipkt->pkt_scbp = STATUS_CHECK;
5479 sense = sata_arq_sense(spx);
5480 sense->es_key = KEY_ILLEGAL_REQUEST;
5481 sense->es_add_code =
5482 SD_SCSI_ASC_INVALID_FIELD_IN_CDB;
5483 goto done;
5484 }
5485 stat = sata_mode_select_page_8(spx,
5486 (struct mode_cache_scsi3 *)&buf[len],
5487 pllen, &pagelen, &rval, &dmod);
5488 /*
5489 * The pagelen value indicates the number of
5490 * parameter bytes already processed.
5491 * The rval is the return value from
5492 * sata_tran_start().
5493 * The stat indicates the overall status of
5494 * the operation(s).
5495 */
5496 if (stat != SATA_SUCCESS)
5497 /*
5498 * Page processing did not succeed -
5499 * all error info is already set-up,
5500 * just return
5501 */
5502 pllen = 0; /* this breaks the loop */
5503 else {
5504 len += pagelen;
5505 pllen -= pagelen;
5506 }
5507 break;
5508
5509 case MODEPAGE_INFO_EXCPT:
5510 stat = sata_mode_select_page_1c(spx,
5511 (struct mode_info_excpt_page *)&buf[len],
5512 pllen, &pagelen, &rval, &dmod);
5513 /*
5514 * The pagelen value indicates the number of
5515 * parameter bytes already processed.
5516 * The rval is the return value from
5517 * sata_tran_start().
5518 * The stat indicates the overall status of
5519 * the operation(s).
5520 */
5521 if (stat != SATA_SUCCESS)
5522 /*
5523 * Page processing did not succeed -
5524 * all error info is already set-up,
5525 * just return
5526 */
5527 pllen = 0; /* this breaks the loop */
5528 else {
5529 len += pagelen;
5530 pllen -= pagelen;
5531 }
5532 break;
5533
5534 case MODEPAGE_ACOUSTIC_MANAG:
5535 stat = sata_mode_select_page_30(spx,
5536 (struct mode_acoustic_management *)
5537 &buf[len], pllen, &pagelen, &rval, &dmod);
5538 /*
5539 * The pagelen value indicates the number of
5540 * parameter bytes already processed.
5541 * The rval is the return value from
5542 * sata_tran_start().
5543 * The stat indicates the overall status of
5544 * the operation(s).
5545 */
5546 if (stat != SATA_SUCCESS)
5547 /*
5548 * Page processing did not succeed -
5549 * all error info is already set-up,
5550 * just return
5551 */
5552 pllen = 0; /* this breaks the loop */
5553 else {
5554 len += pagelen;
5555 pllen -= pagelen;
5556 }
5557
5558 break;
5559 case MODEPAGE_POWER_COND:
5560 stat = sata_mode_select_page_1a(spx,
5561 (struct mode_info_power_cond *)&buf[len],
5562 pllen, &pagelen, &rval, &dmod);
5563 /*
5564 * The pagelen value indicates the number of
5565 * parameter bytes already processed.
5566 * The rval is the return value from
5567 * sata_tran_start().
5568 * The stat indicates the overall status of
5569 * the operation(s).
5570 */
5571 if (stat != SATA_SUCCESS)
5572 /*
5573 * Page processing did not succeed -
5574 * all error info is already set-up,
5575 * just return
5576 */
5577 pllen = 0; /* this breaks the loop */
5578 else {
5579 len += pagelen;
5580 pllen -= pagelen;
5581 }
5582 break;
5583 default:
5584 *scsipkt->pkt_scbp = STATUS_CHECK;
5585 sense = sata_arq_sense(spx);
5586 sense->es_key = KEY_ILLEGAL_REQUEST;
5587 sense->es_add_code =
5588 SD_SCSI_ASC_INVALID_FIELD_IN_PARAMS_LIST;
5589 goto done;
5590 }
5591 }
5592 }
5593 done:
5594 mutex_exit(cport_mutex);
5595 /*
5596 * If device parameters were modified, fetch and store the new
5597 * Identify Device data. Since port mutex could have been released
5598 * for accessing HBA driver, we need to re-check device existence.
5599 */
5600 if (dmod != 0) {
5601 sata_drive_info_t new_sdinfo, *sdinfo;
5602 int rv = 0;
5603
5604 /*
5605 * Following statement has to be changed if this function is
5606 * used for devices other than SATA hard disks.
5607 */
5608 new_sdinfo.satadrv_type = SATA_DTYPE_ATADISK;
5609
5610 new_sdinfo.satadrv_addr =
5611 spx->txlt_sata_pkt->satapkt_device.satadev_addr;
5612 rv = sata_fetch_device_identify_data(spx->txlt_sata_hba_inst,
5613 &new_sdinfo);
5614
5615 mutex_enter(cport_mutex);
5616 /*
5617 * Since port mutex could have been released when
5618 * accessing HBA driver, we need to re-check that the
5619 * framework still holds the device info structure.
5620 */
5621 sdinfo = sata_get_device_info(spx->txlt_sata_hba_inst,
5622 &spx->txlt_sata_pkt->satapkt_device);
5623 if (sdinfo != NULL) {
5624 /*
5625 * Device still has info structure in the
5626 * sata framework. Copy newly fetched info
5627 */
5628 if (rv == 0) {
5629 sdinfo->satadrv_id = new_sdinfo.satadrv_id;
5630 sata_save_drive_settings(sdinfo);
5631 } else {
5632 /*
5633 * Could not fetch new data - invalidate
5634 * sata_drive_info. That makes device
5635 * unusable.
5636 */
5637 sdinfo->satadrv_type = SATA_DTYPE_UNKNOWN;
5638 sdinfo->satadrv_state = SATA_STATE_UNKNOWN;
5639 }
5640 }
5641 if (rv != 0 || sdinfo == NULL) {
5642 /*
5643 * This changes the overall mode select completion
5644 * reason to a failed one !!!!!
5645 */
5646 *scsipkt->pkt_scbp = STATUS_CHECK;
5647 sense = sata_arq_sense(spx);
5648 scsipkt->pkt_reason = CMD_INCOMPLETE;
5649 rval = TRAN_ACCEPT;
5650 }
5651 mutex_exit(cport_mutex);
5652 }
5653 /* Restore the scsi pkt flags */
5654 scsipkt->pkt_flags &= ~FLAG_NOINTR;
5655 scsipkt->pkt_flags |= nointr_flag;
5656
5657 SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
5658 "Scsi_pkt completion reason %x\n", scsipkt->pkt_reason);
5659
5660 if ((scsipkt->pkt_flags & FLAG_NOINTR) == 0 &&
5661 scsipkt->pkt_comp != NULL) {
5662 /* scsi callback required */
5663 if (servicing_interrupt()) {
5664 if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
5665 (task_func_t *)spx->txlt_scsi_pkt->pkt_comp,
5666 (void *)spx->txlt_scsi_pkt, TQ_NOSLEEP) ==
5667 TASKQID_INVALID) {
5668 return (TRAN_BUSY);
5669 }
5670 } else if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
5671 (task_func_t *)spx->txlt_scsi_pkt->pkt_comp,
5672 (void *)spx->txlt_scsi_pkt, TQ_SLEEP) == TASKQID_INVALID) {
5673 /* Scheduling the callback failed */
5674 return (TRAN_BUSY);
5675 }
5676 }
5677
5678 return (rval);
5679 }
5680
5681 /*
5682 * Translate command: ATA Pass Through
5683 * Incomplete implementation. Only supports No-Data, PIO Data-In, and
5684 * PIO Data-Out protocols. Also supports CK_COND bit.
5685 *
5686 * Mapping of the incoming CDB bytes to the outgoing satacmd bytes is
5687 * described in Table 111 of SAT-2 (Draft 9).
5688 */
5689 static int
sata_txlt_ata_pass_thru(sata_pkt_txlate_t * spx)5690 sata_txlt_ata_pass_thru(sata_pkt_txlate_t *spx)
5691 {
5692 struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
5693 sata_cmd_t *scmd = &spx->txlt_sata_pkt->satapkt_cmd;
5694 struct buf *bp = spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp;
5695 kmutex_t *cport_mutex = &(SATA_TXLT_CPORT_MUTEX(spx));
5696 uint32_t xfer_len;
5697 int extend = 0;
5698 int synch, rval, reason;
5699
5700 mutex_enter(cport_mutex);
5701
5702 rval = sata_txlt_generic_pkt_info(spx, &reason, 1);
5703 if ((rval != TRAN_ACCEPT) || (reason == CMD_DEV_GONE)) {
5704 mutex_exit(cport_mutex);
5705 return (rval);
5706 }
5707
5708 /* T_DIR bit */
5709 if (scsipkt->pkt_cdbp[2] & SATL_APT_BM_T_DIR)
5710 scmd->satacmd_flags.sata_data_direction = SATA_DIR_READ;
5711 else
5712 scmd->satacmd_flags.sata_data_direction = SATA_DIR_WRITE;
5713
5714 /* MULTIPLE_COUNT field. If non-zero, invalid command (for now). */
5715 if (((scsipkt->pkt_cdbp[1] >> 5) & 0x7) != 0) {
5716 mutex_exit(cport_mutex);
5717 return (sata_txlt_ata_pass_thru_illegal_cmd(spx));
5718 }
5719
5720 /* OFFLINE field. If non-zero, invalid command (for now). */
5721 if (((scsipkt->pkt_cdbp[2] >> 6) & 0x3) != 0) {
5722 mutex_exit(cport_mutex);
5723 return (sata_txlt_ata_pass_thru_illegal_cmd(spx));
5724 }
5725
5726 /* PROTOCOL field */
5727 switch ((scsipkt->pkt_cdbp[1] >> 1) & 0xf) {
5728 case SATL_APT_P_HW_RESET:
5729 case SATL_APT_P_SRST:
5730 case SATL_APT_P_DMA:
5731 case SATL_APT_P_DMA_QUEUED:
5732 case SATL_APT_P_DEV_DIAG:
5733 case SATL_APT_P_DEV_RESET:
5734 case SATL_APT_P_UDMA_IN:
5735 case SATL_APT_P_UDMA_OUT:
5736 case SATL_APT_P_FPDMA:
5737 case SATL_APT_P_RET_RESP:
5738 /* Not yet implemented */
5739 default:
5740 mutex_exit(cport_mutex);
5741 return (sata_txlt_ata_pass_thru_illegal_cmd(spx));
5742
5743 case SATL_APT_P_NON_DATA:
5744 scmd->satacmd_flags.sata_data_direction = SATA_DIR_NODATA_XFER;
5745 break;
5746
5747 case SATL_APT_P_PIO_DATA_IN:
5748 /* If PROTOCOL disagrees with T_DIR, invalid command */
5749 if (scmd->satacmd_flags.sata_data_direction == SATA_DIR_WRITE) {
5750 mutex_exit(cport_mutex);
5751 return (sata_txlt_ata_pass_thru_illegal_cmd(spx));
5752 }
5753
5754 /* if there is a buffer, release its DMA resources */
5755 if ((bp != NULL) && bp->b_un.b_addr && bp->b_bcount) {
5756 sata_scsi_dmafree(NULL, scsipkt);
5757 } else {
5758 /* if there is no buffer, how do you PIO in? */
5759 mutex_exit(cport_mutex);
5760 return (sata_txlt_ata_pass_thru_illegal_cmd(spx));
5761 }
5762
5763 break;
5764
5765 case SATL_APT_P_PIO_DATA_OUT:
5766 /* If PROTOCOL disagrees with T_DIR, invalid command */
5767 if (scmd->satacmd_flags.sata_data_direction == SATA_DIR_READ) {
5768 mutex_exit(cport_mutex);
5769 return (sata_txlt_ata_pass_thru_illegal_cmd(spx));
5770 }
5771
5772 /* if there is a buffer, release its DMA resources */
5773 if ((bp != NULL) && bp->b_un.b_addr && bp->b_bcount) {
5774 sata_scsi_dmafree(NULL, scsipkt);
5775 } else {
5776 /* if there is no buffer, how do you PIO out? */
5777 mutex_exit(cport_mutex);
5778 return (sata_txlt_ata_pass_thru_illegal_cmd(spx));
5779 }
5780
5781 break;
5782 }
5783
5784 /* Assume LBA28 by default */
5785 scmd->satacmd_addr_type = ATA_ADDR_LBA28;
5786 scmd->satacmd_lba_low_msb = 0;
5787 scmd->satacmd_lba_mid_msb = 0;
5788 scmd->satacmd_lba_high_msb = 0;
5789
5790 scmd->satacmd_features_reg_ext = 0;
5791 scmd->satacmd_sec_count_msb = 0;
5792
5793 /* Parse the ATA cmd fields, transfer some straight to the satacmd */
5794 switch ((uint_t)scsipkt->pkt_cdbp[0]) {
5795 case SPC3_CMD_ATA_COMMAND_PASS_THROUGH12:
5796 scmd->satacmd_lba_low_lsb = scsipkt->pkt_cdbp[5];
5797 scmd->satacmd_lba_mid_lsb = scsipkt->pkt_cdbp[6];
5798 scmd->satacmd_lba_high_lsb = scsipkt->pkt_cdbp[7];
5799
5800 scmd->satacmd_features_reg = scsipkt->pkt_cdbp[3];
5801 scmd->satacmd_sec_count_lsb = scsipkt->pkt_cdbp[4];
5802
5803 scmd->satacmd_device_reg = scsipkt->pkt_cdbp[8];
5804 scmd->satacmd_cmd_reg = scsipkt->pkt_cdbp[9];
5805 break;
5806
5807 case SPC3_CMD_ATA_COMMAND_PASS_THROUGH16:
5808 scmd->satacmd_device_reg = scsipkt->pkt_cdbp[13];
5809 scmd->satacmd_cmd_reg = scsipkt->pkt_cdbp[14];
5810
5811 scmd->satacmd_lba_low_lsb = scsipkt->pkt_cdbp[8];
5812 scmd->satacmd_lba_mid_lsb = scsipkt->pkt_cdbp[10];
5813 scmd->satacmd_lba_high_lsb = scsipkt->pkt_cdbp[12];
5814
5815 scmd->satacmd_features_reg = scsipkt->pkt_cdbp[4];
5816 scmd->satacmd_sec_count_lsb = scsipkt->pkt_cdbp[6];
5817
5818 if (scsipkt->pkt_cdbp[1] & SATL_APT_BM_EXTEND) {
5819 extend = 1;
5820
5821 scmd->satacmd_addr_type = ATA_ADDR_LBA48;
5822 scmd->satacmd_lba_low_msb = scsipkt->pkt_cdbp[7];
5823 scmd->satacmd_lba_mid_msb = scsipkt->pkt_cdbp[9];
5824 scmd->satacmd_lba_high_msb = scsipkt->pkt_cdbp[11];
5825
5826 scmd->satacmd_features_reg_ext = scsipkt->pkt_cdbp[3];
5827 scmd->satacmd_sec_count_msb = scsipkt->pkt_cdbp[5];
5828 }
5829 break;
5830
5831 default:
5832 /* No other SCSI ops should ever reach this function */
5833 cmn_err(CE_PANIC, "unexpected ATA pass-thru cmd %x",
5834 scsipkt->pkt_cdbp[0]);
5835 }
5836
5837 /* CK_COND bit */
5838 if (scsipkt->pkt_cdbp[2] & SATL_APT_BM_CK_COND) {
5839 if (extend) {
5840 scmd->satacmd_flags.sata_copy_out_sec_count_msb = 1;
5841 scmd->satacmd_flags.sata_copy_out_lba_low_msb = 1;
5842 scmd->satacmd_flags.sata_copy_out_lba_mid_msb = 1;
5843 scmd->satacmd_flags.sata_copy_out_lba_high_msb = 1;
5844 }
5845
5846 scmd->satacmd_flags.sata_copy_out_sec_count_lsb = 1;
5847 scmd->satacmd_flags.sata_copy_out_lba_low_lsb = 1;
5848 scmd->satacmd_flags.sata_copy_out_lba_mid_lsb = 1;
5849 scmd->satacmd_flags.sata_copy_out_lba_high_lsb = 1;
5850 scmd->satacmd_flags.sata_copy_out_device_reg = 1;
5851 scmd->satacmd_flags.sata_copy_out_error_reg = 1;
5852 }
5853
5854 /* Determine transfer length */
5855 switch (scsipkt->pkt_cdbp[2] & 0x03) { /* T_LENGTH field */
5856 case 1:
5857 /* Length is in the FEATURE field */
5858 xfer_len = (uint32_t)scmd->satacmd_features_reg_ext << 8 |
5859 scmd->satacmd_features_reg;
5860
5861 /* If BYTE_BLOCK is set, above value is in units of blocks */
5862 if (((scsipkt->pkt_cdbp[2] >> 2) & 1) == 0)
5863 xfer_len *= SATA_DISK_SECTOR_SIZE;
5864 break;
5865 case 2:
5866 /* Length is in the COUNT field */
5867 xfer_len = (uint32_t)scmd->satacmd_sec_count_msb << 8 |
5868 scmd->satacmd_sec_count_lsb;
5869
5870 /* If BYTE_BLOCK is set, above value is in units of blocks */
5871 if (((scsipkt->pkt_cdbp[2] >> 2) & 1) == 0)
5872 xfer_len *= SATA_DISK_SECTOR_SIZE;
5873 break;
5874 case 3:
5875 /*
5876 * Length is transport specific. The spec is a bit vague on
5877 * this, but it seems like using buf->b_bcount is the most
5878 * reasonable analogue in our situation. b_bcount is in
5879 * units of bytes.
5880 */
5881 xfer_len = bp->b_bcount;
5882 break;
5883 default:
5884 xfer_len = 0;
5885 }
5886
5887 /* Don't allow a transfer larger than what the struct buf supports */
5888 if (xfer_len > bp->b_bcount) {
5889 mutex_exit(cport_mutex);
5890 return (sata_txlt_ata_pass_thru_illegal_cmd(spx));
5891 }
5892
5893 /* Start processing command */
5894 if (!(spx->txlt_sata_pkt->satapkt_op_mode & SATA_OPMODE_SYNCH)) {
5895 spx->txlt_sata_pkt->satapkt_comp = sata_txlt_apt_completion;
5896 synch = FALSE;
5897 } else {
5898 synch = TRUE;
5899 }
5900
5901 if (sata_hba_start(spx, &rval) != 0) {
5902 mutex_exit(cport_mutex);
5903 return (rval);
5904 }
5905
5906 mutex_exit(cport_mutex);
5907
5908 if (synch) {
5909 sata_txlt_apt_completion(spx->txlt_sata_pkt);
5910 }
5911
5912 return (TRAN_ACCEPT);
5913 }
5914
5915 /*
5916 * Translate command: Log Sense
5917 */
5918 static int
sata_txlt_log_sense(sata_pkt_txlate_t * spx)5919 sata_txlt_log_sense(sata_pkt_txlate_t *spx)
5920 {
5921 struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
5922 struct buf *bp = spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp;
5923 sata_drive_info_t *sdinfo;
5924 struct scsi_extended_sense *sense;
5925 int len, count, alc_len;
5926 int pc; /* Page Control code */
5927 int page_code; /* Page code */
5928 uint8_t *buf; /* log sense buffer */
5929 int rval, reason;
5930 #define MAX_LOG_SENSE_PAGE_SIZE 512
5931 kmutex_t *cport_mutex = &(SATA_TXLT_CPORT_MUTEX(spx));
5932
5933 SATADBG2(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
5934 "sata_txlt_log_sense, pc 0x%x, page code 0x%x\n",
5935 spx->txlt_scsi_pkt->pkt_cdbp[2] >> 6,
5936 spx->txlt_scsi_pkt->pkt_cdbp[2] & 0x3f);
5937
5938 if (servicing_interrupt()) {
5939 buf = kmem_zalloc(MAX_LOG_SENSE_PAGE_SIZE, KM_NOSLEEP);
5940 if (buf == NULL) {
5941 return (TRAN_BUSY);
5942 }
5943 } else {
5944 buf = kmem_zalloc(MAX_LOG_SENSE_PAGE_SIZE, KM_SLEEP);
5945 }
5946
5947 mutex_enter(cport_mutex);
5948
5949 if (((rval = sata_txlt_generic_pkt_info(spx, &reason, 1)) !=
5950 TRAN_ACCEPT) || (reason == CMD_DEV_GONE)) {
5951 mutex_exit(cport_mutex);
5952 kmem_free(buf, MAX_LOG_SENSE_PAGE_SIZE);
5953 return (rval);
5954 }
5955
5956 scsipkt->pkt_reason = CMD_CMPLT;
5957 scsipkt->pkt_state = STATE_GOT_BUS | STATE_GOT_TARGET |
5958 STATE_SENT_CMD | STATE_GOT_STATUS;
5959
5960 pc = scsipkt->pkt_cdbp[2] >> 6;
5961 page_code = scsipkt->pkt_cdbp[2] & 0x3f;
5962
5963 /* Reject not supported request for all but cumulative values */
5964 switch (pc) {
5965 case PC_CUMULATIVE_VALUES:
5966 break;
5967 default:
5968 *scsipkt->pkt_scbp = STATUS_CHECK;
5969 sense = sata_arq_sense(spx);
5970 sense->es_key = KEY_ILLEGAL_REQUEST;
5971 sense->es_add_code = SD_SCSI_ASC_INVALID_FIELD_IN_CDB;
5972 goto done;
5973 }
5974
5975 switch (page_code) {
5976 case PAGE_CODE_GET_SUPPORTED_LOG_PAGES:
5977 case PAGE_CODE_SELF_TEST_RESULTS:
5978 case PAGE_CODE_INFORMATION_EXCEPTIONS:
5979 case PAGE_CODE_SMART_READ_DATA:
5980 case PAGE_CODE_START_STOP_CYCLE_COUNTER:
5981 case PAGE_CODE_TEMPERATURE:
5982 case PAGE_CODE_SOLID_STATE_MEDIA:
5983 case PAGE_CODE_READ_ERRORS:
5984 case PAGE_CODE_GENERAL_STATS:
5985 break;
5986 default:
5987 *scsipkt->pkt_scbp = STATUS_CHECK;
5988 sense = sata_arq_sense(spx);
5989 sense->es_key = KEY_ILLEGAL_REQUEST;
5990 sense->es_add_code = SD_SCSI_ASC_INVALID_FIELD_IN_CDB;
5991 goto done;
5992 }
5993
5994 if (bp != NULL && bp->b_un.b_addr && bp->b_bcount) {
5995 /*
5996 * Because log sense uses local buffers for data retrieval from
5997 * the devices and sets the data programatically in the
5998 * original specified buffer, release preallocated DMA
5999 * resources before storing data in the original buffer,
6000 * so no unwanted DMA sync would take place.
6001 */
6002 sata_id_t *sata_id;
6003
6004 sata_scsi_dmafree(NULL, scsipkt);
6005
6006 len = 0;
6007
6008 /* Build log parameter header */
6009 buf[len++] = page_code; /* page code as in the CDB */
6010 buf[len++] = 0; /* reserved */
6011 buf[len++] = 0; /* Zero out page length for now (MSB) */
6012 buf[len++] = 0; /* (LSB) */
6013
6014 sdinfo = sata_get_device_info(
6015 spx->txlt_sata_hba_inst,
6016 &spx->txlt_sata_pkt->satapkt_device);
6017
6018 sata_id = &sdinfo->satadrv_id;
6019
6020 /*
6021 * Add requested pages.
6022 */
6023 switch (page_code) {
6024 case PAGE_CODE_GET_SUPPORTED_LOG_PAGES:
6025 len = sata_build_lsense_page_0(sdinfo, buf + len);
6026 break;
6027 case PAGE_CODE_SELF_TEST_RESULTS:
6028 if ((! (sata_id->ai_cmdset84 &
6029 SATA_SMART_SELF_TEST_SUPPORTED)) ||
6030 (! (sata_id->ai_features87 &
6031 SATA_SMART_SELF_TEST_SUPPORTED))) {
6032 *scsipkt->pkt_scbp = STATUS_CHECK;
6033 sense = sata_arq_sense(spx);
6034 sense->es_key = KEY_ILLEGAL_REQUEST;
6035 sense->es_add_code =
6036 SD_SCSI_ASC_INVALID_FIELD_IN_CDB;
6037
6038 goto done;
6039 }
6040 len = sata_build_lsense_page_10(sdinfo, buf + len,
6041 spx->txlt_sata_hba_inst);
6042 break;
6043 case PAGE_CODE_INFORMATION_EXCEPTIONS:
6044 if (! (sata_id->ai_cmdset82 & SATA_SMART_SUPPORTED)) {
6045 *scsipkt->pkt_scbp = STATUS_CHECK;
6046 sense = sata_arq_sense(spx);
6047 sense->es_key = KEY_ILLEGAL_REQUEST;
6048 sense->es_add_code =
6049 SD_SCSI_ASC_INVALID_FIELD_IN_CDB;
6050
6051 goto done;
6052 }
6053 if (! (sata_id->ai_features85 & SATA_SMART_ENABLED)) {
6054 *scsipkt->pkt_scbp = STATUS_CHECK;
6055 sense = sata_arq_sense(spx);
6056 sense->es_key = KEY_ABORTED_COMMAND;
6057 sense->es_add_code =
6058 SCSI_ASC_ATA_DEV_FEAT_NOT_ENABLED;
6059 sense->es_qual_code =
6060 SCSI_ASCQ_ATA_DEV_FEAT_NOT_ENABLED;
6061
6062 goto done;
6063 }
6064
6065 len = sata_build_lsense_page_2f(sdinfo, buf + len,
6066 spx->txlt_sata_hba_inst);
6067 break;
6068 case PAGE_CODE_SMART_READ_DATA:
6069 if (! (sata_id->ai_cmdset82 & SATA_SMART_SUPPORTED)) {
6070 *scsipkt->pkt_scbp = STATUS_CHECK;
6071 sense = sata_arq_sense(spx);
6072 sense->es_key = KEY_ILLEGAL_REQUEST;
6073 sense->es_add_code =
6074 SD_SCSI_ASC_INVALID_FIELD_IN_CDB;
6075
6076 goto done;
6077 }
6078 if (! (sata_id->ai_features85 & SATA_SMART_ENABLED)) {
6079 *scsipkt->pkt_scbp = STATUS_CHECK;
6080 sense = sata_arq_sense(spx);
6081 sense->es_key = KEY_ABORTED_COMMAND;
6082 sense->es_add_code =
6083 SCSI_ASC_ATA_DEV_FEAT_NOT_ENABLED;
6084 sense->es_qual_code =
6085 SCSI_ASCQ_ATA_DEV_FEAT_NOT_ENABLED;
6086
6087 goto done;
6088 }
6089
6090 /* This page doesn't include a page header */
6091 len = sata_build_lsense_page_30(sdinfo, buf,
6092 spx->txlt_sata_hba_inst);
6093 goto no_header;
6094 case PAGE_CODE_START_STOP_CYCLE_COUNTER:
6095 if (! (sata_id->ai_cmdset82 & SATA_SMART_SUPPORTED)) {
6096 *scsipkt->pkt_scbp = STATUS_CHECK;
6097 sense = sata_arq_sense(spx);
6098 sense->es_key = KEY_ILLEGAL_REQUEST;
6099 sense->es_add_code =
6100 SD_SCSI_ASC_INVALID_FIELD_IN_CDB;
6101
6102 goto done;
6103 }
6104 if (! (sata_id->ai_features85 & SATA_SMART_ENABLED)) {
6105 *scsipkt->pkt_scbp = STATUS_CHECK;
6106 sense = sata_arq_sense(spx);
6107 sense->es_key = KEY_ABORTED_COMMAND;
6108 sense->es_add_code =
6109 SCSI_ASC_ATA_DEV_FEAT_NOT_ENABLED;
6110 sense->es_qual_code =
6111 SCSI_ASCQ_ATA_DEV_FEAT_NOT_ENABLED;
6112
6113 goto done;
6114 }
6115 len = sata_build_lsense_page_0e(sdinfo, buf, spx);
6116 goto no_header;
6117 case PAGE_CODE_TEMPERATURE:
6118 len = sata_build_lsense_page_0d(sdinfo, buf + len,
6119 spx->txlt_sata_hba_inst);
6120 break;
6121 case PAGE_CODE_SOLID_STATE_MEDIA:
6122 len = sata_build_lsense_page_11(sdinfo, buf + len,
6123 spx->txlt_sata_hba_inst);
6124 break;
6125 case PAGE_CODE_READ_ERRORS:
6126 len = sata_build_lsense_page_03(sdinfo, buf + len,
6127 spx->txlt_sata_hba_inst);
6128 break;
6129 case PAGE_CODE_GENERAL_STATS:
6130 len = sata_build_lsense_page_19(sdinfo, buf + len,
6131 spx->txlt_sata_hba_inst);
6132 break;
6133 default:
6134 /* Invalid request */
6135 *scsipkt->pkt_scbp = STATUS_CHECK;
6136 sense = sata_arq_sense(spx);
6137 sense->es_key = KEY_ILLEGAL_REQUEST;
6138 sense->es_add_code = SD_SCSI_ASC_INVALID_FIELD_IN_CDB;
6139 goto done;
6140 }
6141
6142 if (len < 0) {
6143 /* Page not supported by device */
6144 *scsipkt->pkt_scbp = STATUS_CHECK;
6145 sense = sata_arq_sense(spx);
6146 sense->es_key = KEY_ILLEGAL_REQUEST;
6147 sense->es_add_code = SD_SCSI_ASC_INVALID_FIELD_IN_CDB;
6148 goto done;
6149 }
6150
6151 /* set parameter log sense data length */
6152 buf[2] = len >> 8; /* log sense length (MSB) */
6153 buf[3] = len & 0xff; /* log sense length (LSB) */
6154
6155 len += SCSI_LOG_PAGE_HDR_LEN;
6156 ASSERT(len <= MAX_LOG_SENSE_PAGE_SIZE);
6157
6158 no_header:
6159 /* Check allocation length */
6160 alc_len = scsipkt->pkt_cdbp[7];
6161 alc_len = (alc_len << 8) | scsipkt->pkt_cdbp[8];
6162
6163 /*
6164 * We do not check for possible parameters truncation
6165 * (alc_len < len) assuming that the target driver works
6166 * correctly. Just avoiding overrun.
6167 * Copy no more than requested and possible, buffer-wise.
6168 */
6169 count = MIN(alc_len, len);
6170 count = MIN(bp->b_bcount, count);
6171 bcopy(buf, bp->b_un.b_addr, count);
6172
6173 scsipkt->pkt_state |= STATE_XFERRED_DATA;
6174 scsipkt->pkt_resid = alc_len > count ? alc_len - count : 0;
6175 }
6176 *scsipkt->pkt_scbp = STATUS_GOOD;
6177 done:
6178 mutex_exit(cport_mutex);
6179 (void) kmem_free(buf, MAX_LOG_SENSE_PAGE_SIZE);
6180
6181 SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
6182 "Scsi_pkt completion reason %x\n", scsipkt->pkt_reason);
6183
6184 if ((scsipkt->pkt_flags & FLAG_NOINTR) == 0 &&
6185 scsipkt->pkt_comp != NULL) {
6186 /* scsi callback required */
6187 if (servicing_interrupt()) {
6188 if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
6189 (task_func_t *)spx->txlt_scsi_pkt->pkt_comp,
6190 (void *)spx->txlt_scsi_pkt, TQ_NOSLEEP) ==
6191 TASKQID_INVALID) {
6192 return (TRAN_BUSY);
6193 }
6194 } else if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
6195 (task_func_t *)spx->txlt_scsi_pkt->pkt_comp,
6196 (void *)spx->txlt_scsi_pkt, TQ_SLEEP) == TASKQID_INVALID) {
6197 /* Scheduling the callback failed */
6198 return (TRAN_BUSY);
6199 }
6200 }
6201
6202 return (TRAN_ACCEPT);
6203 }
6204
6205 /*
6206 * Translate command: Log Select
6207 * Not implemented at this time - returns invalid command response.
6208 */
6209 static int
sata_txlt_log_select(sata_pkt_txlate_t * spx)6210 sata_txlt_log_select(sata_pkt_txlate_t *spx)
6211 {
6212 SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
6213 "sata_txlt_log_select\n", NULL);
6214
6215 return (sata_txlt_invalid_command(spx));
6216 }
6217
6218
6219 /*
6220 * Translate command: Read (various types).
6221 * Translated into appropriate type of ATA READ command
6222 * for SATA hard disks.
6223 * Both the device capabilities and requested operation mode are
6224 * considered.
6225 *
6226 * Following scsi cdb fields are ignored:
6227 * rdprotect, dpo, fua, fua_nv, group_number.
6228 *
6229 * If SATA_ENABLE_QUEUING flag is set (in the global SATA HBA framework
6230 * enable variable sata_func_enable), the capability of the controller and
6231 * capability of a device are checked and if both support queueing, read
6232 * request will be translated to READ_DMA_QUEUEING or READ_DMA_QUEUEING_EXT
6233 * command rather than plain READ_XXX command.
6234 * If SATA_ENABLE_NCQ flag is set in addition to SATA_ENABLE_QUEUING flag and
6235 * both the controller and device suport such functionality, the read
6236 * request will be translated to READ_FPDMA_QUEUED command.
6237 * In both cases the maximum queue depth is derived as minimum of:
6238 * HBA capability,device capability and sata_max_queue_depth variable setting.
6239 * The value passed to HBA driver is decremented by 1, because only 5 bits are
6240 * used to pass max queue depth value, and the maximum possible queue depth
6241 * is 32.
6242 *
6243 * Returns TRAN_ACCEPT or code returned by sata_hba_start() and
6244 * appropriate values in scsi_pkt fields.
6245 */
6246 static int
sata_txlt_read(sata_pkt_txlate_t * spx)6247 sata_txlt_read(sata_pkt_txlate_t *spx)
6248 {
6249 struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
6250 sata_cmd_t *scmd = &spx->txlt_sata_pkt->satapkt_cmd;
6251 sata_drive_info_t *sdinfo;
6252 sata_hba_inst_t *shi = SATA_TXLT_HBA_INST(spx);
6253 kmutex_t *cport_mutex = &(SATA_TXLT_CPORT_MUTEX(spx));
6254 uint16_t sec_count;
6255 uint64_t lba;
6256 int rval, reason;
6257 int synch;
6258
6259 mutex_enter(cport_mutex);
6260
6261 if (((rval = sata_txlt_generic_pkt_info(spx, &reason, 0)) !=
6262 TRAN_ACCEPT) || (reason == CMD_DEV_GONE)) {
6263 mutex_exit(cport_mutex);
6264 return (rval);
6265 }
6266
6267 sdinfo = sata_get_device_info(spx->txlt_sata_hba_inst,
6268 &spx->txlt_sata_pkt->satapkt_device);
6269
6270 scmd->satacmd_flags.sata_data_direction = SATA_DIR_READ;
6271 /*
6272 * Extract LBA and sector count from scsi CDB.
6273 */
6274 switch ((uint_t)scsipkt->pkt_cdbp[0]) {
6275 case SCMD_READ:
6276 /* 6-byte scsi read cmd : 0x08 */
6277 lba = (scsipkt->pkt_cdbp[1] & 0x1f);
6278 lba = (lba << 8) | scsipkt->pkt_cdbp[2];
6279 lba = (lba << 8) | scsipkt->pkt_cdbp[3];
6280 sec_count = scsipkt->pkt_cdbp[4];
6281 /* sec_count 0 will be interpreted as 256 by a device */
6282 break;
6283 case SCMD_READ_G1:
6284 /* 10-bytes scsi read command : 0x28 */
6285 lba = scsipkt->pkt_cdbp[2];
6286 lba = (lba << 8) | scsipkt->pkt_cdbp[3];
6287 lba = (lba << 8) | scsipkt->pkt_cdbp[4];
6288 lba = (lba << 8) | scsipkt->pkt_cdbp[5];
6289 sec_count = scsipkt->pkt_cdbp[7];
6290 sec_count = (sec_count << 8) | scsipkt->pkt_cdbp[8];
6291 break;
6292 case SCMD_READ_G5:
6293 /* 12-bytes scsi read command : 0xA8 */
6294 lba = scsipkt->pkt_cdbp[2];
6295 lba = (lba << 8) | scsipkt->pkt_cdbp[3];
6296 lba = (lba << 8) | scsipkt->pkt_cdbp[4];
6297 lba = (lba << 8) | scsipkt->pkt_cdbp[5];
6298 sec_count = scsipkt->pkt_cdbp[6];
6299 sec_count = (sec_count << 8) | scsipkt->pkt_cdbp[7];
6300 sec_count = (sec_count << 8) | scsipkt->pkt_cdbp[8];
6301 sec_count = (sec_count << 8) | scsipkt->pkt_cdbp[9];
6302 break;
6303 case SCMD_READ_G4:
6304 /* 16-bytes scsi read command : 0x88 */
6305 lba = scsipkt->pkt_cdbp[2];
6306 lba = (lba << 8) | scsipkt->pkt_cdbp[3];
6307 lba = (lba << 8) | scsipkt->pkt_cdbp[4];
6308 lba = (lba << 8) | scsipkt->pkt_cdbp[5];
6309 lba = (lba << 8) | scsipkt->pkt_cdbp[6];
6310 lba = (lba << 8) | scsipkt->pkt_cdbp[7];
6311 lba = (lba << 8) | scsipkt->pkt_cdbp[8];
6312 lba = (lba << 8) | scsipkt->pkt_cdbp[9];
6313 sec_count = scsipkt->pkt_cdbp[10];
6314 sec_count = (sec_count << 8) | scsipkt->pkt_cdbp[11];
6315 sec_count = (sec_count << 8) | scsipkt->pkt_cdbp[12];
6316 sec_count = (sec_count << 8) | scsipkt->pkt_cdbp[13];
6317 break;
6318 default:
6319 /* Unsupported command */
6320 mutex_exit(cport_mutex);
6321 return (sata_txlt_invalid_command(spx));
6322 }
6323
6324 /*
6325 * Check if specified address exceeds device capacity
6326 */
6327 if ((lba >= sdinfo->satadrv_capacity) ||
6328 ((lba + sec_count) > sdinfo->satadrv_capacity)) {
6329 /* LBA out of range */
6330 mutex_exit(cport_mutex);
6331 return (sata_txlt_lba_out_of_range(spx));
6332 }
6333
6334 /*
6335 * For zero-length transfer, emulate good completion of the command
6336 * (reasons for rejecting the command were already checked).
6337 * No DMA resources were allocated.
6338 */
6339 if (spx->txlt_dma_cookie_list == NULL) {
6340 mutex_exit(cport_mutex);
6341 return (sata_emul_rw_completion(spx));
6342 }
6343
6344 /*
6345 * Build cmd block depending on the device capability and
6346 * requested operation mode.
6347 * Do not bother with non-dma mode - we are working only with
6348 * devices supporting DMA.
6349 */
6350 scmd->satacmd_addr_type = ATA_ADDR_LBA;
6351 scmd->satacmd_device_reg = SATA_ADH_LBA;
6352 scmd->satacmd_cmd_reg = SATAC_READ_DMA;
6353 if (sdinfo->satadrv_features_support & SATA_DEV_F_LBA48) {
6354 scmd->satacmd_addr_type = ATA_ADDR_LBA48;
6355 scmd->satacmd_cmd_reg = SATAC_READ_DMA_EXT;
6356 scmd->satacmd_sec_count_msb = sec_count >> 8;
6357 #ifndef __lock_lint
6358 scmd->satacmd_lba_low_msb = (lba >> 24) & 0xff;
6359 scmd->satacmd_lba_mid_msb = (lba >> 32) & 0xff;
6360 scmd->satacmd_lba_high_msb = lba >> 40;
6361 #endif
6362 } else if (sdinfo->satadrv_features_support & SATA_DEV_F_LBA28) {
6363 scmd->satacmd_addr_type = ATA_ADDR_LBA28;
6364 scmd->satacmd_device_reg = SATA_ADH_LBA | ((lba >> 24) & 0xf);
6365 }
6366 scmd->satacmd_sec_count_lsb = sec_count & 0xff;
6367 scmd->satacmd_lba_low_lsb = lba & 0xff;
6368 scmd->satacmd_lba_mid_lsb = (lba >> 8) & 0xff;
6369 scmd->satacmd_lba_high_lsb = (lba >> 16) & 0xff;
6370 scmd->satacmd_features_reg = 0;
6371 scmd->satacmd_status_reg = 0;
6372 scmd->satacmd_error_reg = 0;
6373
6374 /*
6375 * Check if queueing commands should be used and switch
6376 * to appropriate command if possible
6377 */
6378 if (sata_func_enable & SATA_ENABLE_QUEUING) {
6379 boolean_t using_queuing;
6380
6381 /* Queuing supported by controller and device? */
6382 if ((sata_func_enable & SATA_ENABLE_NCQ) &&
6383 (sdinfo->satadrv_features_support &
6384 SATA_DEV_F_NCQ) &&
6385 (SATA_FEATURES(spx->txlt_sata_hba_inst) &
6386 SATA_CTLF_NCQ)) {
6387 using_queuing = B_TRUE;
6388
6389 /* NCQ supported - use FPDMA READ */
6390 scmd->satacmd_cmd_reg =
6391 SATAC_READ_FPDMA_QUEUED;
6392 scmd->satacmd_features_reg_ext =
6393 scmd->satacmd_sec_count_msb;
6394 scmd->satacmd_sec_count_msb = 0;
6395 } else if ((sdinfo->satadrv_features_support &
6396 SATA_DEV_F_TCQ) &&
6397 (SATA_FEATURES(spx->txlt_sata_hba_inst) &
6398 SATA_CTLF_QCMD)) {
6399 using_queuing = B_TRUE;
6400
6401 /* Legacy queueing */
6402 if (sdinfo->satadrv_features_support &
6403 SATA_DEV_F_LBA48) {
6404 scmd->satacmd_cmd_reg =
6405 SATAC_READ_DMA_QUEUED_EXT;
6406 scmd->satacmd_features_reg_ext =
6407 scmd->satacmd_sec_count_msb;
6408 scmd->satacmd_sec_count_msb = 0;
6409 } else {
6410 scmd->satacmd_cmd_reg =
6411 SATAC_READ_DMA_QUEUED;
6412 }
6413 } else /* NCQ nor legacy queuing not supported */
6414 using_queuing = B_FALSE;
6415
6416 /*
6417 * If queuing, the sector count goes in the features register
6418 * and the secount count will contain the tag.
6419 */
6420 if (using_queuing) {
6421 scmd->satacmd_features_reg =
6422 scmd->satacmd_sec_count_lsb;
6423 scmd->satacmd_sec_count_lsb = 0;
6424 scmd->satacmd_flags.sata_queued = B_TRUE;
6425
6426 /* Set-up maximum queue depth */
6427 scmd->satacmd_flags.sata_max_queue_depth =
6428 sdinfo->satadrv_max_queue_depth - 1;
6429 } else if (sdinfo->satadrv_features_enabled &
6430 SATA_DEV_F_E_UNTAGGED_QING) {
6431 /*
6432 * Although NCQ/TCQ is not enabled, untagged queuing
6433 * may be still used.
6434 * Set-up the maximum untagged queue depth.
6435 * Use controller's queue depth from sata_hba_tran.
6436 * SATA HBA drivers may ignore this value and rely on
6437 * the internal limits.For drivers that do not
6438 * ignore untaged queue depth, limit the value to
6439 * SATA_MAX_QUEUE_DEPTH (32), as this is the
6440 * largest value that can be passed via
6441 * satacmd_flags.sata_max_queue_depth.
6442 */
6443 scmd->satacmd_flags.sata_max_queue_depth =
6444 SATA_QDEPTH(shi) <= SATA_MAX_QUEUE_DEPTH ?
6445 SATA_QDEPTH(shi) - 1: SATA_MAX_QUEUE_DEPTH - 1;
6446
6447 } else {
6448 scmd->satacmd_flags.sata_max_queue_depth = 0;
6449 }
6450 } else
6451 scmd->satacmd_flags.sata_max_queue_depth = 0;
6452
6453 SATADBG3(SATA_DBG_HBA_IF, spx->txlt_sata_hba_inst,
6454 "sata_txlt_read cmd 0x%2x, lba %llx, sec count %x\n",
6455 scmd->satacmd_cmd_reg, lba, sec_count);
6456
6457 if (!(spx->txlt_sata_pkt->satapkt_op_mode & SATA_OPMODE_SYNCH)) {
6458 /* Need callback function */
6459 spx->txlt_sata_pkt->satapkt_comp = sata_txlt_rw_completion;
6460 synch = FALSE;
6461 } else
6462 synch = TRUE;
6463
6464 /* Transfer command to HBA */
6465 if (sata_hba_start(spx, &rval) != 0) {
6466 /* Pkt not accepted for execution */
6467 mutex_exit(cport_mutex);
6468 return (rval);
6469 }
6470 mutex_exit(cport_mutex);
6471 /*
6472 * If execution is non-synchronous,
6473 * a callback function will handle potential errors, translate
6474 * the response and will do a callback to a target driver.
6475 * If it was synchronous, check execution status using the same
6476 * framework callback.
6477 */
6478 if (synch) {
6479 SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
6480 "synchronous execution status %x\n",
6481 spx->txlt_sata_pkt->satapkt_reason);
6482 sata_txlt_rw_completion(spx->txlt_sata_pkt);
6483 }
6484 return (TRAN_ACCEPT);
6485 }
6486
6487
6488 /*
6489 * SATA translate command: Write (various types)
6490 * Translated into appropriate type of ATA WRITE command
6491 * for SATA hard disks.
6492 * Both the device capabilities and requested operation mode are
6493 * considered.
6494 *
6495 * Following scsi cdb fields are ignored:
6496 * rwprotect, dpo, fua, fua_nv, group_number.
6497 *
6498 * If SATA_ENABLE_QUEUING flag is set (in the global SATA HBA framework
6499 * enable variable sata_func_enable), the capability of the controller and
6500 * capability of a device are checked and if both support queueing, write
6501 * request will be translated to WRITE_DMA_QUEUEING or WRITE_DMA_QUEUEING_EXT
6502 * command rather than plain WRITE_XXX command.
6503 * If SATA_ENABLE_NCQ flag is set in addition to SATA_ENABLE_QUEUING flag and
6504 * both the controller and device suport such functionality, the write
6505 * request will be translated to WRITE_FPDMA_QUEUED command.
6506 * In both cases the maximum queue depth is derived as minimum of:
6507 * HBA capability,device capability and sata_max_queue_depth variable setting.
6508 * The value passed to HBA driver is decremented by 1, because only 5 bits are
6509 * used to pass max queue depth value, and the maximum possible queue depth
6510 * is 32.
6511 *
6512 * Returns TRAN_ACCEPT or code returned by sata_hba_start() and
6513 * appropriate values in scsi_pkt fields.
6514 */
6515 static int
sata_txlt_write(sata_pkt_txlate_t * spx)6516 sata_txlt_write(sata_pkt_txlate_t *spx)
6517 {
6518 struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
6519 sata_cmd_t *scmd = &spx->txlt_sata_pkt->satapkt_cmd;
6520 sata_drive_info_t *sdinfo;
6521 sata_hba_inst_t *shi = SATA_TXLT_HBA_INST(spx);
6522 uint16_t sec_count;
6523 uint64_t lba;
6524 int rval, reason;
6525 int synch;
6526 kmutex_t *cport_mutex = &(SATA_TXLT_CPORT_MUTEX(spx));
6527
6528 mutex_enter(cport_mutex);
6529
6530 if (((rval = sata_txlt_generic_pkt_info(spx, &reason, 0)) !=
6531 TRAN_ACCEPT) || (reason == CMD_DEV_GONE)) {
6532 mutex_exit(cport_mutex);
6533 return (rval);
6534 }
6535
6536 sdinfo = sata_get_device_info(spx->txlt_sata_hba_inst,
6537 &spx->txlt_sata_pkt->satapkt_device);
6538
6539 scmd->satacmd_flags.sata_data_direction = SATA_DIR_WRITE;
6540 /*
6541 * Extract LBA and sector count from scsi CDB
6542 */
6543 switch ((uint_t)scsipkt->pkt_cdbp[0]) {
6544 case SCMD_WRITE:
6545 /* 6-byte scsi read cmd : 0x0A */
6546 lba = (scsipkt->pkt_cdbp[1] & 0x1f);
6547 lba = (lba << 8) | scsipkt->pkt_cdbp[2];
6548 lba = (lba << 8) | scsipkt->pkt_cdbp[3];
6549 sec_count = scsipkt->pkt_cdbp[4];
6550 /* sec_count 0 will be interpreted as 256 by a device */
6551 break;
6552 case SCMD_WRITE_G1:
6553 /* 10-bytes scsi write command : 0x2A */
6554 lba = scsipkt->pkt_cdbp[2];
6555 lba = (lba << 8) | scsipkt->pkt_cdbp[3];
6556 lba = (lba << 8) | scsipkt->pkt_cdbp[4];
6557 lba = (lba << 8) | scsipkt->pkt_cdbp[5];
6558 sec_count = scsipkt->pkt_cdbp[7];
6559 sec_count = (sec_count << 8) | scsipkt->pkt_cdbp[8];
6560 break;
6561 case SCMD_WRITE_G5:
6562 /* 12-bytes scsi read command : 0xAA */
6563 lba = scsipkt->pkt_cdbp[2];
6564 lba = (lba << 8) | scsipkt->pkt_cdbp[3];
6565 lba = (lba << 8) | scsipkt->pkt_cdbp[4];
6566 lba = (lba << 8) | scsipkt->pkt_cdbp[5];
6567 sec_count = scsipkt->pkt_cdbp[6];
6568 sec_count = (sec_count << 8) | scsipkt->pkt_cdbp[7];
6569 sec_count = (sec_count << 8) | scsipkt->pkt_cdbp[8];
6570 sec_count = (sec_count << 8) | scsipkt->pkt_cdbp[9];
6571 break;
6572 case SCMD_WRITE_G4:
6573 /* 16-bytes scsi write command : 0x8A */
6574 lba = scsipkt->pkt_cdbp[2];
6575 lba = (lba << 8) | scsipkt->pkt_cdbp[3];
6576 lba = (lba << 8) | scsipkt->pkt_cdbp[4];
6577 lba = (lba << 8) | scsipkt->pkt_cdbp[5];
6578 lba = (lba << 8) | scsipkt->pkt_cdbp[6];
6579 lba = (lba << 8) | scsipkt->pkt_cdbp[7];
6580 lba = (lba << 8) | scsipkt->pkt_cdbp[8];
6581 lba = (lba << 8) | scsipkt->pkt_cdbp[9];
6582 sec_count = scsipkt->pkt_cdbp[10];
6583 sec_count = (sec_count << 8) | scsipkt->pkt_cdbp[11];
6584 sec_count = (sec_count << 8) | scsipkt->pkt_cdbp[12];
6585 sec_count = (sec_count << 8) | scsipkt->pkt_cdbp[13];
6586 break;
6587 default:
6588 /* Unsupported command */
6589 mutex_exit(cport_mutex);
6590 return (sata_txlt_invalid_command(spx));
6591 }
6592
6593 /*
6594 * Check if specified address and length exceeds device capacity
6595 */
6596 if ((lba >= sdinfo->satadrv_capacity) ||
6597 ((lba + sec_count) > sdinfo->satadrv_capacity)) {
6598 /* LBA out of range */
6599 mutex_exit(cport_mutex);
6600 return (sata_txlt_lba_out_of_range(spx));
6601 }
6602
6603 /*
6604 * For zero-length transfer, emulate good completion of the command
6605 * (reasons for rejecting the command were already checked).
6606 * No DMA resources were allocated.
6607 */
6608 if (spx->txlt_dma_cookie_list == NULL) {
6609 mutex_exit(cport_mutex);
6610 return (sata_emul_rw_completion(spx));
6611 }
6612
6613 /*
6614 * Build cmd block depending on the device capability and
6615 * requested operation mode.
6616 * Do not bother with non-dma mode- we are working only with
6617 * devices supporting DMA.
6618 */
6619 scmd->satacmd_addr_type = ATA_ADDR_LBA;
6620 scmd->satacmd_device_reg = SATA_ADH_LBA;
6621 scmd->satacmd_cmd_reg = SATAC_WRITE_DMA;
6622 if (sdinfo->satadrv_features_support & SATA_DEV_F_LBA48) {
6623 scmd->satacmd_addr_type = ATA_ADDR_LBA48;
6624 scmd->satacmd_cmd_reg = SATAC_WRITE_DMA_EXT;
6625 scmd->satacmd_sec_count_msb = sec_count >> 8;
6626 scmd->satacmd_lba_low_msb = (lba >> 24) & 0xff;
6627 #ifndef __lock_lint
6628 scmd->satacmd_lba_mid_msb = (lba >> 32) & 0xff;
6629 scmd->satacmd_lba_high_msb = lba >> 40;
6630 #endif
6631 } else if (sdinfo->satadrv_features_support & SATA_DEV_F_LBA28) {
6632 scmd->satacmd_addr_type = ATA_ADDR_LBA28;
6633 scmd->satacmd_device_reg = SATA_ADH_LBA | ((lba >> 24) & 0xf);
6634 }
6635 scmd->satacmd_sec_count_lsb = sec_count & 0xff;
6636 scmd->satacmd_lba_low_lsb = lba & 0xff;
6637 scmd->satacmd_lba_mid_lsb = (lba >> 8) & 0xff;
6638 scmd->satacmd_lba_high_lsb = (lba >> 16) & 0xff;
6639 scmd->satacmd_features_reg = 0;
6640 scmd->satacmd_status_reg = 0;
6641 scmd->satacmd_error_reg = 0;
6642
6643 /*
6644 * Check if queueing commands should be used and switch
6645 * to appropriate command if possible
6646 */
6647 if (sata_func_enable & SATA_ENABLE_QUEUING) {
6648 boolean_t using_queuing;
6649
6650 /* Queuing supported by controller and device? */
6651 if ((sata_func_enable & SATA_ENABLE_NCQ) &&
6652 (sdinfo->satadrv_features_support &
6653 SATA_DEV_F_NCQ) &&
6654 (SATA_FEATURES(spx->txlt_sata_hba_inst) &
6655 SATA_CTLF_NCQ)) {
6656 using_queuing = B_TRUE;
6657
6658 /* NCQ supported - use FPDMA WRITE */
6659 scmd->satacmd_cmd_reg =
6660 SATAC_WRITE_FPDMA_QUEUED;
6661 scmd->satacmd_features_reg_ext =
6662 scmd->satacmd_sec_count_msb;
6663 scmd->satacmd_sec_count_msb = 0;
6664 } else if ((sdinfo->satadrv_features_support &
6665 SATA_DEV_F_TCQ) &&
6666 (SATA_FEATURES(spx->txlt_sata_hba_inst) &
6667 SATA_CTLF_QCMD)) {
6668 using_queuing = B_TRUE;
6669
6670 /* Legacy queueing */
6671 if (sdinfo->satadrv_features_support &
6672 SATA_DEV_F_LBA48) {
6673 scmd->satacmd_cmd_reg =
6674 SATAC_WRITE_DMA_QUEUED_EXT;
6675 scmd->satacmd_features_reg_ext =
6676 scmd->satacmd_sec_count_msb;
6677 scmd->satacmd_sec_count_msb = 0;
6678 } else {
6679 scmd->satacmd_cmd_reg =
6680 SATAC_WRITE_DMA_QUEUED;
6681 }
6682 } else /* NCQ nor legacy queuing not supported */
6683 using_queuing = B_FALSE;
6684
6685 if (using_queuing) {
6686 scmd->satacmd_features_reg =
6687 scmd->satacmd_sec_count_lsb;
6688 scmd->satacmd_sec_count_lsb = 0;
6689 scmd->satacmd_flags.sata_queued = B_TRUE;
6690 /* Set-up maximum queue depth */
6691 scmd->satacmd_flags.sata_max_queue_depth =
6692 sdinfo->satadrv_max_queue_depth - 1;
6693 } else if (sdinfo->satadrv_features_enabled &
6694 SATA_DEV_F_E_UNTAGGED_QING) {
6695 /*
6696 * Although NCQ/TCQ is not enabled, untagged queuing
6697 * may be still used.
6698 * Set-up the maximum untagged queue depth.
6699 * Use controller's queue depth from sata_hba_tran.
6700 * SATA HBA drivers may ignore this value and rely on
6701 * the internal limits. For drivera that do not
6702 * ignore untaged queue depth, limit the value to
6703 * SATA_MAX_QUEUE_DEPTH (32), as this is the
6704 * largest value that can be passed via
6705 * satacmd_flags.sata_max_queue_depth.
6706 */
6707 scmd->satacmd_flags.sata_max_queue_depth =
6708 SATA_QDEPTH(shi) <= SATA_MAX_QUEUE_DEPTH ?
6709 SATA_QDEPTH(shi) - 1: SATA_MAX_QUEUE_DEPTH - 1;
6710
6711 } else {
6712 scmd->satacmd_flags.sata_max_queue_depth = 0;
6713 }
6714 } else
6715 scmd->satacmd_flags.sata_max_queue_depth = 0;
6716
6717 SATADBG3(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
6718 "sata_txlt_write cmd 0x%2x, lba %llx, sec count %x\n",
6719 scmd->satacmd_cmd_reg, lba, sec_count);
6720
6721 if (!(spx->txlt_sata_pkt->satapkt_op_mode & SATA_OPMODE_SYNCH)) {
6722 /* Need callback function */
6723 spx->txlt_sata_pkt->satapkt_comp = sata_txlt_rw_completion;
6724 synch = FALSE;
6725 } else
6726 synch = TRUE;
6727
6728 /* Transfer command to HBA */
6729 if (sata_hba_start(spx, &rval) != 0) {
6730 /* Pkt not accepted for execution */
6731 mutex_exit(cport_mutex);
6732 return (rval);
6733 }
6734 mutex_exit(cport_mutex);
6735
6736 /*
6737 * If execution is non-synchronous,
6738 * a callback function will handle potential errors, translate
6739 * the response and will do a callback to a target driver.
6740 * If it was synchronous, check execution status using the same
6741 * framework callback.
6742 */
6743 if (synch) {
6744 SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
6745 "synchronous execution status %x\n",
6746 spx->txlt_sata_pkt->satapkt_reason);
6747 sata_txlt_rw_completion(spx->txlt_sata_pkt);
6748 }
6749 return (TRAN_ACCEPT);
6750 }
6751
6752
6753 /*
6754 * Implements SCSI SBC WRITE BUFFER command download microcode option
6755 */
6756 static int
sata_txlt_write_buffer(sata_pkt_txlate_t * spx)6757 sata_txlt_write_buffer(sata_pkt_txlate_t *spx)
6758 {
6759 #define WB_DOWNLOAD_MICROCODE_AND_REVERT_MODE 4
6760 #define WB_DOWNLOAD_MICROCODE_AND_SAVE_MODE 5
6761
6762 struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
6763 struct sata_pkt *sata_pkt = spx->txlt_sata_pkt;
6764 sata_cmd_t *scmd = &spx->txlt_sata_pkt->satapkt_cmd;
6765
6766 struct buf *bp = spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp;
6767 struct scsi_extended_sense *sense;
6768 int rval, mode, sector_count, reason;
6769 kmutex_t *cport_mutex = &(SATA_TXLT_CPORT_MUTEX(spx));
6770
6771 mode = scsipkt->pkt_cdbp[1] & 0x1f;
6772
6773 SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
6774 "sata_txlt_write_buffer, mode 0x%x\n", mode);
6775
6776 mutex_enter(cport_mutex);
6777
6778 if ((rval = sata_txlt_generic_pkt_info(spx, &reason, 1)) !=
6779 TRAN_ACCEPT) {
6780 mutex_exit(cport_mutex);
6781 return (rval);
6782 }
6783
6784 /* Use synchronous mode */
6785 spx->txlt_sata_pkt->satapkt_op_mode
6786 |= SATA_OPMODE_SYNCH | SATA_OPMODE_INTERRUPTS;
6787
6788 scmd->satacmd_flags.sata_data_direction = SATA_DIR_WRITE;
6789
6790 scsipkt->pkt_reason = CMD_CMPLT;
6791 scsipkt->pkt_state = STATE_GOT_BUS | STATE_GOT_TARGET |
6792 STATE_SENT_CMD | STATE_GOT_STATUS;
6793
6794 /*
6795 * The SCSI to ATA translation specification only calls
6796 * for WB_DOWNLOAD_MICROCODE_AND_SAVE_MODE.
6797 * WB_DOWNLOAD_MICROC_AND_REVERT_MODE is implemented, but
6798 * ATA 8 (draft) got rid of download microcode for temp
6799 * and it is even optional for ATA 7, so it may be aborted.
6800 * WB_DOWNLOAD_MICROCODE_WITH_OFFSET is not implemented as
6801 * it is not specified and the buffer offset for SCSI is a 16-bit
6802 * value in bytes, but for ATA it is a 16-bit offset in 512 byte
6803 * sectors. Thus the offset really doesn't buy us anything.
6804 * If and when ATA 8 is stabilized and the SCSI to ATA specification
6805 * is revised, this can be revisisted.
6806 */
6807 /* Reject not supported request */
6808 switch (mode) {
6809 case WB_DOWNLOAD_MICROCODE_AND_REVERT_MODE:
6810 scmd->satacmd_features_reg = SATA_DOWNLOAD_MCODE_TEMP;
6811 break;
6812 case WB_DOWNLOAD_MICROCODE_AND_SAVE_MODE:
6813 scmd->satacmd_features_reg = SATA_DOWNLOAD_MCODE_SAVE;
6814 break;
6815 default:
6816 goto bad_param;
6817 }
6818
6819 *scsipkt->pkt_scbp = STATUS_GOOD; /* Presumed outcome */
6820
6821 scmd->satacmd_cmd_reg = SATAC_DOWNLOAD_MICROCODE;
6822 if ((bp->b_bcount % SATA_DISK_SECTOR_SIZE) != 0)
6823 goto bad_param;
6824 sector_count = bp->b_bcount / SATA_DISK_SECTOR_SIZE;
6825 scmd->satacmd_sec_count_lsb = (uint8_t)sector_count;
6826 scmd->satacmd_lba_low_lsb = ((uint16_t)sector_count) >> 8;
6827 scmd->satacmd_lba_mid_lsb = 0;
6828 scmd->satacmd_lba_high_lsb = 0;
6829 scmd->satacmd_device_reg = 0;
6830 spx->txlt_sata_pkt->satapkt_comp = NULL;
6831 scmd->satacmd_addr_type = 0;
6832
6833 /* Transfer command to HBA */
6834 if (sata_hba_start(spx, &rval) != 0) {
6835 /* Pkt not accepted for execution */
6836 mutex_exit(cport_mutex);
6837 return (rval);
6838 }
6839
6840 mutex_exit(cport_mutex);
6841
6842 /* Then we need synchronous check the status of the disk */
6843 scsipkt->pkt_state = STATE_GOT_BUS | STATE_GOT_TARGET |
6844 STATE_SENT_CMD | STATE_XFERRED_DATA | STATE_GOT_STATUS;
6845 if (sata_pkt->satapkt_reason == SATA_PKT_COMPLETED) {
6846 scsipkt->pkt_reason = CMD_CMPLT;
6847
6848 /* Download commmand succeed, so probe and identify device */
6849 sata_reidentify_device(spx);
6850 } else {
6851 /* Something went wrong, microcode download command failed */
6852 scsipkt->pkt_reason = CMD_INCOMPLETE;
6853 *scsipkt->pkt_scbp = STATUS_CHECK;
6854 sense = sata_arq_sense(spx);
6855 switch (sata_pkt->satapkt_reason) {
6856 case SATA_PKT_PORT_ERROR:
6857 /*
6858 * We have no device data. Assume no data transfered.
6859 */
6860 sense->es_key = KEY_HARDWARE_ERROR;
6861 break;
6862
6863 case SATA_PKT_DEV_ERROR:
6864 if (sata_pkt->satapkt_cmd.satacmd_status_reg &
6865 SATA_STATUS_ERR) {
6866 /*
6867 * determine dev error reason from error
6868 * reg content
6869 */
6870 sata_decode_device_error(spx, sense);
6871 break;
6872 }
6873 /* No extended sense key - no info available */
6874 break;
6875
6876 case SATA_PKT_TIMEOUT:
6877 scsipkt->pkt_reason = CMD_TIMEOUT;
6878 scsipkt->pkt_statistics |=
6879 STAT_TIMEOUT | STAT_DEV_RESET;
6880 /* No extended sense key ? */
6881 break;
6882
6883 case SATA_PKT_ABORTED:
6884 scsipkt->pkt_reason = CMD_ABORTED;
6885 scsipkt->pkt_statistics |= STAT_ABORTED;
6886 /* No extended sense key ? */
6887 break;
6888
6889 case SATA_PKT_RESET:
6890 /* pkt aborted by an explicit reset from a host */
6891 scsipkt->pkt_reason = CMD_RESET;
6892 scsipkt->pkt_statistics |= STAT_DEV_RESET;
6893 break;
6894
6895 default:
6896 SATA_LOG_D((spx->txlt_sata_hba_inst, CE_WARN,
6897 "sata_txlt_nodata_cmd_completion: "
6898 "invalid packet completion reason %d",
6899 sata_pkt->satapkt_reason));
6900 scsipkt->pkt_reason = CMD_TRAN_ERR;
6901 break;
6902 }
6903
6904 SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
6905 "scsi_pkt completion reason %x\n", scsipkt->pkt_reason);
6906
6907 if ((scsipkt->pkt_flags & FLAG_NOINTR) == 0)
6908 /* scsi callback required */
6909 scsi_hba_pkt_comp(scsipkt);
6910 }
6911 return (TRAN_ACCEPT);
6912
6913 bad_param:
6914 mutex_exit(cport_mutex);
6915 *scsipkt->pkt_scbp = STATUS_CHECK;
6916 sense = sata_arq_sense(spx);
6917 sense->es_key = KEY_ILLEGAL_REQUEST;
6918 sense->es_add_code = SD_SCSI_ASC_INVALID_FIELD_IN_CDB;
6919 if ((scsipkt->pkt_flags & FLAG_NOINTR) == 0 &&
6920 scsipkt->pkt_comp != NULL) {
6921 /* scsi callback required */
6922 if (servicing_interrupt()) {
6923 if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
6924 (task_func_t *)spx->txlt_scsi_pkt->pkt_comp,
6925 (void *)spx->txlt_scsi_pkt, TQ_NOSLEEP) ==
6926 TASKQID_INVALID) {
6927 return (TRAN_BUSY);
6928 }
6929 } else if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
6930 (task_func_t *)spx->txlt_scsi_pkt->pkt_comp,
6931 (void *)spx->txlt_scsi_pkt, TQ_SLEEP) == TASKQID_INVALID) {
6932 /* Scheduling the callback failed */
6933 return (TRAN_BUSY);
6934 }
6935 }
6936 return (rval);
6937 }
6938
6939 /*
6940 * Re-identify device after doing a firmware download.
6941 */
6942 static void
sata_reidentify_device(sata_pkt_txlate_t * spx)6943 sata_reidentify_device(sata_pkt_txlate_t *spx)
6944 {
6945 #define DOWNLOAD_WAIT_TIME_SECS 60
6946 #define DOWNLOAD_WAIT_INTERVAL_SECS 1
6947 int rval;
6948 int retry_cnt;
6949 struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
6950 sata_hba_inst_t *sata_hba_inst = spx->txlt_sata_hba_inst;
6951 sata_device_t sata_device = spx->txlt_sata_pkt->satapkt_device;
6952 sata_drive_info_t *sdinfo;
6953
6954 /*
6955 * Before returning good status, probe device.
6956 * Device probing will get IDENTIFY DEVICE data, if possible.
6957 * The assumption is that the new microcode is applied by the
6958 * device. It is a caller responsibility to verify this.
6959 */
6960 for (retry_cnt = 0;
6961 retry_cnt < DOWNLOAD_WAIT_TIME_SECS / DOWNLOAD_WAIT_INTERVAL_SECS;
6962 retry_cnt++) {
6963 rval = sata_probe_device(sata_hba_inst, &sata_device);
6964
6965 if (rval == SATA_SUCCESS) { /* Set default features */
6966 sdinfo = sata_get_device_info(sata_hba_inst,
6967 &sata_device);
6968 if (sata_initialize_device(sata_hba_inst, sdinfo) !=
6969 SATA_SUCCESS) {
6970 /* retry */
6971 rval = sata_initialize_device(sata_hba_inst,
6972 sdinfo);
6973 if (rval == SATA_RETRY)
6974 sata_log(sata_hba_inst, CE_WARN,
6975 "SATA device at port %d pmport %d -"
6976 " default device features could not"
6977 " be set. Device may not operate "
6978 "as expected.",
6979 sata_device.satadev_addr.cport,
6980 sata_device.satadev_addr.pmport);
6981 }
6982 if ((scsipkt->pkt_flags & FLAG_NOINTR) == 0)
6983 scsi_hba_pkt_comp(scsipkt);
6984 return;
6985 } else if (rval == SATA_RETRY) {
6986 delay(drv_usectohz(1000000 *
6987 DOWNLOAD_WAIT_INTERVAL_SECS));
6988 continue;
6989 } else /* failed - no reason to retry */
6990 break;
6991 }
6992
6993 /*
6994 * Something went wrong, device probing failed.
6995 */
6996 SATA_LOG_D((sata_hba_inst, CE_WARN,
6997 "Cannot probe device after downloading microcode\n"));
6998
6999 /* Reset device to force retrying the probe. */
7000 (void) (*SATA_RESET_DPORT_FUNC(sata_hba_inst))
7001 (SATA_DIP(sata_hba_inst), &sata_device);
7002
7003 if ((scsipkt->pkt_flags & FLAG_NOINTR) == 0)
7004 scsi_hba_pkt_comp(scsipkt);
7005 }
7006
7007
7008 /*
7009 * Translate command: Synchronize Cache.
7010 * Translates into Flush Cache command for SATA hard disks.
7011 *
7012 * Returns TRAN_ACCEPT or code returned by sata_hba_start() and
7013 * appropriate values in scsi_pkt fields.
7014 */
7015 static int
sata_txlt_synchronize_cache(sata_pkt_txlate_t * spx)7016 sata_txlt_synchronize_cache(sata_pkt_txlate_t *spx)
7017 {
7018 sata_cmd_t *scmd = &spx->txlt_sata_pkt->satapkt_cmd;
7019 kmutex_t *cport_mutex = &(SATA_TXLT_CPORT_MUTEX(spx));
7020 int rval, reason;
7021 int synch;
7022
7023 mutex_enter(cport_mutex);
7024
7025 if (((rval = sata_txlt_generic_pkt_info(spx, &reason, 1)) !=
7026 TRAN_ACCEPT) || (reason == CMD_DEV_GONE)) {
7027 mutex_exit(cport_mutex);
7028 return (rval);
7029 }
7030
7031 scmd->satacmd_addr_type = 0;
7032 scmd->satacmd_cmd_reg = SATAC_FLUSH_CACHE;
7033 scmd->satacmd_device_reg = 0;
7034 scmd->satacmd_sec_count_lsb = 0;
7035 scmd->satacmd_lba_low_lsb = 0;
7036 scmd->satacmd_lba_mid_lsb = 0;
7037 scmd->satacmd_lba_high_lsb = 0;
7038 scmd->satacmd_features_reg = 0;
7039 scmd->satacmd_status_reg = 0;
7040 scmd->satacmd_error_reg = 0;
7041
7042 SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
7043 "sata_txlt_synchronize_cache\n", NULL);
7044
7045 if (!(spx->txlt_sata_pkt->satapkt_op_mode & SATA_OPMODE_SYNCH)) {
7046 /* Need to set-up a callback function */
7047 spx->txlt_sata_pkt->satapkt_comp =
7048 sata_txlt_nodata_cmd_completion;
7049 synch = FALSE;
7050 } else
7051 synch = TRUE;
7052
7053 /* Transfer command to HBA */
7054 if (sata_hba_start(spx, &rval) != 0) {
7055 /* Pkt not accepted for execution */
7056 mutex_exit(cport_mutex);
7057 return (rval);
7058 }
7059 mutex_exit(cport_mutex);
7060
7061 /*
7062 * If execution non-synchronous, it had to be completed
7063 * a callback function will handle potential errors, translate
7064 * the response and will do a callback to a target driver.
7065 * If it was synchronous, check status, using the same
7066 * framework callback.
7067 */
7068 if (synch) {
7069 SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
7070 "synchronous execution status %x\n",
7071 spx->txlt_sata_pkt->satapkt_reason);
7072 sata_txlt_nodata_cmd_completion(spx->txlt_sata_pkt);
7073 }
7074 return (TRAN_ACCEPT);
7075 }
7076
7077
7078 /*
7079 * Send pkt to SATA HBA driver
7080 *
7081 * This function may be called only if the operation is requested by scsi_pkt,
7082 * i.e. scsi_pkt is not NULL.
7083 *
7084 * This function has to be called with cport mutex held. It does release
7085 * the mutex when it calls HBA driver sata_tran_start function and
7086 * re-acquires it afterwards.
7087 *
7088 * If return value is 0, pkt was accepted, -1 otherwise
7089 * rval is set to appropriate sata_scsi_start return value.
7090 *
7091 * Note 1:If HBA driver returns value other than TRAN_ACCEPT, it should not
7092 * have called the sata_pkt callback function for this packet.
7093 *
7094 * The scsi callback has to be performed by the caller of this routine.
7095 */
7096 static int
sata_hba_start(sata_pkt_txlate_t * spx,int * rval)7097 sata_hba_start(sata_pkt_txlate_t *spx, int *rval)
7098 {
7099 int stat;
7100 uint8_t cport = SATA_TXLT_CPORT(spx);
7101 uint8_t pmport = SATA_TXLT_PMPORT(spx);
7102 sata_hba_inst_t *sata_hba_inst = spx->txlt_sata_hba_inst;
7103 sata_drive_info_t *sdinfo;
7104 sata_pmult_info_t *pminfo = NULL;
7105 sata_pmport_info_t *pmportinfo = NULL;
7106 sata_device_t *sata_device = NULL;
7107 uint8_t cmd;
7108 struct sata_cmd_flags cmd_flags;
7109
7110 ASSERT(spx->txlt_sata_pkt != NULL);
7111
7112 ASSERT(mutex_owned(&SATA_CPORT_MUTEX(sata_hba_inst, cport)));
7113
7114 sdinfo = sata_get_device_info(sata_hba_inst,
7115 &spx->txlt_sata_pkt->satapkt_device);
7116 ASSERT(sdinfo != NULL);
7117
7118 /* Clear device reset state? */
7119 /* qual should be XXX_DPMPORT, but add XXX_PMPORT in case */
7120 if (sdinfo->satadrv_addr.qual == SATA_ADDR_DPMPORT ||
7121 sdinfo->satadrv_addr.qual == SATA_ADDR_PMPORT) {
7122
7123 /*
7124 * Get the pmult_info of the its parent port multiplier, all
7125 * sub-devices share a common device reset flags on in
7126 * pmult_info.
7127 */
7128 pminfo = SATA_PMULT_INFO(sata_hba_inst, cport);
7129 pmportinfo = pminfo->pmult_dev_port[pmport];
7130 ASSERT(pminfo != NULL);
7131 if (pminfo->pmult_event_flags & SATA_EVNT_CLEAR_DEVICE_RESET) {
7132 spx->txlt_sata_pkt->satapkt_cmd.satacmd_flags.
7133 sata_clear_dev_reset = B_TRUE;
7134 pminfo->pmult_event_flags &=
7135 ~SATA_EVNT_CLEAR_DEVICE_RESET;
7136 SATADBG1(SATA_DBG_EVENTS, sata_hba_inst,
7137 "sata_hba_start: clearing device reset state"
7138 "on pmult.\n", NULL);
7139 }
7140 } else {
7141 if (sdinfo->satadrv_event_flags &
7142 SATA_EVNT_CLEAR_DEVICE_RESET) {
7143 spx->txlt_sata_pkt->satapkt_cmd.satacmd_flags.
7144 sata_clear_dev_reset = B_TRUE;
7145 sdinfo->satadrv_event_flags &=
7146 ~SATA_EVNT_CLEAR_DEVICE_RESET;
7147 SATADBG1(SATA_DBG_EVENTS, sata_hba_inst,
7148 "sata_hba_start: clearing device reset state\n",
7149 NULL);
7150 }
7151 }
7152
7153 cmd = spx->txlt_sata_pkt->satapkt_cmd.satacmd_cmd_reg;
7154 cmd_flags = spx->txlt_sata_pkt->satapkt_cmd.satacmd_flags;
7155 sata_device = &spx->txlt_sata_pkt->satapkt_device;
7156
7157 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst, cport)));
7158
7159 SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
7160 "Sata cmd 0x%2x\n", cmd);
7161
7162 stat = (*SATA_START_FUNC(sata_hba_inst))(SATA_DIP(sata_hba_inst),
7163 spx->txlt_sata_pkt);
7164 mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst, cport)));
7165 /*
7166 * If sata pkt was accepted and executed in asynchronous mode, i.e.
7167 * with the sata callback, the sata_pkt could be already destroyed
7168 * by the time we check ther return status from the hba_start()
7169 * function, because sata_scsi_destroy_pkt() could have been already
7170 * called (perhaps in the interrupt context). So, in such case, there
7171 * should be no references to it. In other cases, sata_pkt still
7172 * exists.
7173 */
7174 if (stat == SATA_TRAN_ACCEPTED) {
7175 /*
7176 * pkt accepted for execution.
7177 * If it was executed synchronously, it is already completed
7178 * and pkt completion_reason indicates completion status.
7179 */
7180 *rval = TRAN_ACCEPT;
7181 return (0);
7182 }
7183
7184 sdinfo = sata_get_device_info(sata_hba_inst, sata_device);
7185 switch (stat) {
7186 case SATA_TRAN_QUEUE_FULL:
7187 /*
7188 * Controller detected queue full condition.
7189 */
7190 SATADBG1(SATA_DBG_HBA_IF, sata_hba_inst,
7191 "sata_hba_start: queue full\n", NULL);
7192
7193 spx->txlt_scsi_pkt->pkt_reason = CMD_INCOMPLETE;
7194 *spx->txlt_scsi_pkt->pkt_scbp = STATUS_QFULL;
7195
7196 *rval = TRAN_BUSY;
7197 break;
7198
7199 case SATA_TRAN_PORT_ERROR:
7200 /*
7201 * Communication/link with device or general port error
7202 * detected before pkt execution begun.
7203 */
7204 if (spx->txlt_sata_pkt->satapkt_device.satadev_addr.qual ==
7205 SATA_ADDR_CPORT ||
7206 spx->txlt_sata_pkt->satapkt_device.satadev_addr.qual ==
7207 SATA_ADDR_DCPORT)
7208 sata_log(sata_hba_inst, CE_CONT,
7209 "SATA port %d error",
7210 sata_device->satadev_addr.cport);
7211 else
7212 sata_log(sata_hba_inst, CE_CONT,
7213 "SATA port %d:%d error\n",
7214 sata_device->satadev_addr.cport,
7215 sata_device->satadev_addr.pmport);
7216
7217 /*
7218 * Update the port/device structure.
7219 * sata_pkt should be still valid. Since port error is
7220 * returned, sata_device content should reflect port
7221 * state - it means, that sata address have been changed,
7222 * because original packet's sata address refered to a device
7223 * attached to some port.
7224 */
7225 if (sata_device->satadev_addr.qual == SATA_ADDR_DPMPORT ||
7226 sata_device->satadev_addr.qual == SATA_ADDR_PMPORT) {
7227 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst, cport)));
7228 mutex_enter(&pmportinfo->pmport_mutex);
7229 sata_update_pmport_info(sata_hba_inst, sata_device);
7230 mutex_exit(&pmportinfo->pmport_mutex);
7231 mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst, cport)));
7232 } else {
7233 sata_update_port_info(sata_hba_inst, sata_device);
7234 }
7235
7236 spx->txlt_scsi_pkt->pkt_reason = CMD_TRAN_ERR;
7237 *rval = TRAN_FATAL_ERROR;
7238 break;
7239
7240 case SATA_TRAN_CMD_UNSUPPORTED:
7241 /*
7242 * Command rejected by HBA as unsupported. It was HBA driver
7243 * that rejected the command, command was not sent to
7244 * an attached device.
7245 */
7246 if ((sdinfo != NULL) &&
7247 (sdinfo->satadrv_state & SATA_DSTATE_RESET))
7248 SATADBG1(SATA_DBG_EVENTS, sata_hba_inst,
7249 "sat_hba_start: cmd 0x%2x rejected "
7250 "with SATA_TRAN_CMD_UNSUPPORTED status\n", cmd);
7251
7252 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst, cport)));
7253 (void) sata_txlt_invalid_command(spx);
7254 mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst, cport)));
7255
7256 *rval = TRAN_ACCEPT;
7257 break;
7258
7259 case SATA_TRAN_BUSY:
7260 /*
7261 * Command rejected by HBA because other operation prevents
7262 * accepting the packet, or device is in RESET condition.
7263 */
7264 if (sdinfo != NULL) {
7265 sdinfo->satadrv_state =
7266 spx->txlt_sata_pkt->satapkt_device.satadev_state;
7267
7268 if (sdinfo->satadrv_state & SATA_DSTATE_RESET) {
7269 SATADBG1(SATA_DBG_EVENTS, sata_hba_inst,
7270 "sata_hba_start: cmd 0x%2x rejected "
7271 "because of device reset condition\n",
7272 cmd);
7273 } else {
7274 SATADBG1(SATA_DBG_EVENTS, sata_hba_inst,
7275 "sata_hba_start: cmd 0x%2x rejected "
7276 "with SATA_TRAN_BUSY status\n",
7277 cmd);
7278 }
7279 }
7280 spx->txlt_scsi_pkt->pkt_reason = CMD_INCOMPLETE;
7281 *rval = TRAN_BUSY;
7282 break;
7283
7284 default:
7285 /* Unrecognized HBA response */
7286 SATA_LOG_D((sata_hba_inst, CE_WARN,
7287 "sata_hba_start: unrecognized HBA response "
7288 "to cmd : 0x%2x resp 0x%x", cmd, rval));
7289 spx->txlt_scsi_pkt->pkt_reason = CMD_TRAN_ERR;
7290 *rval = TRAN_FATAL_ERROR;
7291 break;
7292 }
7293
7294 /*
7295 * If we got here, the packet was rejected.
7296 * Check if we need to remember reset state clearing request
7297 */
7298 if (cmd_flags.sata_clear_dev_reset) {
7299 /*
7300 * Check if device is still configured - it may have
7301 * disapeared from the configuration
7302 */
7303 sdinfo = sata_get_device_info(sata_hba_inst, sata_device);
7304 if (sdinfo != NULL) {
7305 /*
7306 * Restore the flag that requests clearing of
7307 * the device reset state,
7308 * so the next sata packet may carry it to HBA.
7309 */
7310 if (sdinfo->satadrv_addr.qual == SATA_ADDR_PMPORT ||
7311 sdinfo->satadrv_addr.qual == SATA_ADDR_DPMPORT) {
7312 pminfo->pmult_event_flags |=
7313 SATA_EVNT_CLEAR_DEVICE_RESET;
7314 } else {
7315 sdinfo->satadrv_event_flags |=
7316 SATA_EVNT_CLEAR_DEVICE_RESET;
7317 }
7318 }
7319 }
7320 return (-1);
7321 }
7322
7323 /*
7324 * Scsi response setup for invalid LBA
7325 *
7326 * Returns TRAN_ACCEPT and appropriate values in scsi_pkt fields.
7327 */
7328 static int
sata_txlt_lba_out_of_range(sata_pkt_txlate_t * spx)7329 sata_txlt_lba_out_of_range(sata_pkt_txlate_t *spx)
7330 {
7331 struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
7332 struct scsi_extended_sense *sense;
7333
7334 scsipkt->pkt_reason = CMD_CMPLT;
7335 scsipkt->pkt_state = STATE_GOT_BUS | STATE_GOT_TARGET |
7336 STATE_SENT_CMD | STATE_GOT_STATUS;
7337 *scsipkt->pkt_scbp = STATUS_CHECK;
7338
7339 *scsipkt->pkt_scbp = STATUS_CHECK;
7340 sense = sata_arq_sense(spx);
7341 sense->es_key = KEY_ILLEGAL_REQUEST;
7342 sense->es_add_code = SD_SCSI_ASC_LBA_OUT_OF_RANGE;
7343
7344 SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
7345 "Scsi_pkt completion reason %x\n", scsipkt->pkt_reason);
7346
7347 if ((scsipkt->pkt_flags & FLAG_NOINTR) == 0 &&
7348 scsipkt->pkt_comp != NULL) {
7349 /* scsi callback required */
7350 if (servicing_interrupt()) {
7351 if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
7352 (task_func_t *)spx->txlt_scsi_pkt->pkt_comp,
7353 (void *)spx->txlt_scsi_pkt, TQ_NOSLEEP) ==
7354 TASKQID_INVALID) {
7355 return (TRAN_BUSY);
7356 }
7357 } else if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
7358 (task_func_t *)spx->txlt_scsi_pkt->pkt_comp,
7359 (void *)spx->txlt_scsi_pkt, TQ_SLEEP) == TASKQID_INVALID) {
7360 /* Scheduling the callback failed */
7361 return (TRAN_BUSY);
7362 }
7363 }
7364 return (TRAN_ACCEPT);
7365 }
7366
7367
7368 /*
7369 * Analyze device status and error registers and translate them into
7370 * appropriate scsi sense codes.
7371 * NOTE: non-packet commands only for now
7372 */
7373 static void
sata_decode_device_error(sata_pkt_txlate_t * spx,struct scsi_extended_sense * sense)7374 sata_decode_device_error(sata_pkt_txlate_t *spx,
7375 struct scsi_extended_sense *sense)
7376 {
7377 uint8_t err_reg = spx->txlt_sata_pkt->satapkt_cmd.satacmd_error_reg;
7378
7379 ASSERT(sense != NULL);
7380 ASSERT(spx->txlt_sata_pkt->satapkt_cmd.satacmd_status_reg &
7381 SATA_STATUS_ERR);
7382
7383
7384 if (err_reg & SATA_ERROR_ICRC) {
7385 sense->es_key = KEY_ABORTED_COMMAND;
7386 sense->es_add_code = 0x08; /* Communication failure */
7387 return;
7388 }
7389
7390 if (err_reg & SATA_ERROR_UNC) {
7391 sense->es_key = KEY_MEDIUM_ERROR;
7392 /* Information bytes (LBA) need to be set by a caller */
7393 return;
7394 }
7395
7396 /* ADD HERE: MC error bit handling for ATAPI CD/DVD */
7397 if (err_reg & (SATA_ERROR_MCR | SATA_ERROR_NM)) {
7398 sense->es_key = KEY_UNIT_ATTENTION;
7399 sense->es_add_code = 0x3a; /* No media present */
7400 return;
7401 }
7402
7403 if (err_reg & SATA_ERROR_IDNF) {
7404 if (err_reg & SATA_ERROR_ABORT) {
7405 sense->es_key = KEY_ABORTED_COMMAND;
7406 } else {
7407 sense->es_key = KEY_ILLEGAL_REQUEST;
7408 sense->es_add_code = 0x21; /* LBA out of range */
7409 }
7410 return;
7411 }
7412
7413 if (err_reg & SATA_ERROR_ABORT) {
7414 ASSERT(spx->txlt_sata_pkt != NULL);
7415 sense->es_key = KEY_ABORTED_COMMAND;
7416 return;
7417 }
7418 }
7419
7420 /*
7421 * Extract error LBA from sata_pkt.satapkt_cmd register fields
7422 */
7423 static void
sata_extract_error_lba(sata_pkt_txlate_t * spx,uint64_t * lba)7424 sata_extract_error_lba(sata_pkt_txlate_t *spx, uint64_t *lba)
7425 {
7426 sata_cmd_t *sata_cmd = &spx->txlt_sata_pkt->satapkt_cmd;
7427
7428 *lba = 0;
7429 if (sata_cmd->satacmd_addr_type == ATA_ADDR_LBA48) {
7430 *lba = sata_cmd->satacmd_lba_high_msb;
7431 *lba = (*lba << 8) | sata_cmd->satacmd_lba_mid_msb;
7432 *lba = (*lba << 8) | sata_cmd->satacmd_lba_low_msb;
7433 } else if (sata_cmd->satacmd_addr_type == ATA_ADDR_LBA28) {
7434 *lba = sata_cmd->satacmd_device_reg & 0xf;
7435 }
7436 *lba = (*lba << 8) | sata_cmd->satacmd_lba_high_lsb;
7437 *lba = (*lba << 8) | sata_cmd->satacmd_lba_mid_lsb;
7438 *lba = (*lba << 8) | sata_cmd->satacmd_lba_low_lsb;
7439 }
7440
7441 /*
7442 * This is fixed sense format - if LBA exceeds the info field size,
7443 * no valid info will be returned (valid bit in extended sense will
7444 * be set to 0).
7445 */
7446 static struct scsi_extended_sense *
sata_arq_sense(sata_pkt_txlate_t * spx)7447 sata_arq_sense(sata_pkt_txlate_t *spx)
7448 {
7449 struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
7450 struct scsi_arq_status *arqs;
7451 struct scsi_extended_sense *sense;
7452
7453 /* Fill ARQ sense data */
7454 scsipkt->pkt_state |= STATE_ARQ_DONE;
7455 arqs = (struct scsi_arq_status *)scsipkt->pkt_scbp;
7456 *(uchar_t *)&arqs->sts_status = STATUS_CHECK;
7457 *(uchar_t *)&arqs->sts_rqpkt_status = STATUS_GOOD;
7458 arqs->sts_rqpkt_reason = CMD_CMPLT;
7459 arqs->sts_rqpkt_state = STATE_GOT_BUS | STATE_GOT_TARGET |
7460 STATE_XFERRED_DATA | STATE_SENT_CMD | STATE_GOT_STATUS;
7461 arqs->sts_rqpkt_resid = 0;
7462 sense = &arqs->sts_sensedata;
7463 bzero(sense, sizeof (struct scsi_extended_sense));
7464 sata_fixed_sense_data_preset(sense);
7465 return (sense);
7466 }
7467
7468 /*
7469 * ATA Pass Through support
7470 * Sets flags indicating that an invalid value was found in some
7471 * field in the command. It could be something illegal according to
7472 * the SAT-2 spec or it could be a feature that is not (yet?)
7473 * supported.
7474 */
7475 static int
sata_txlt_ata_pass_thru_illegal_cmd(sata_pkt_txlate_t * spx)7476 sata_txlt_ata_pass_thru_illegal_cmd(sata_pkt_txlate_t *spx)
7477 {
7478 struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
7479 struct scsi_extended_sense *sense = sata_arq_sense(spx);
7480
7481 scsipkt->pkt_reason = CMD_CMPLT;
7482 *scsipkt->pkt_scbp = STATUS_CHECK;
7483 scsipkt->pkt_state = STATE_GOT_BUS | STATE_GOT_TARGET |
7484 STATE_SENT_CMD | STATE_GOT_STATUS;
7485
7486 sense = sata_arq_sense(spx);
7487 sense->es_key = KEY_ILLEGAL_REQUEST;
7488 sense->es_add_code = SD_SCSI_ASC_INVALID_FIELD_IN_CDB;
7489
7490 if ((scsipkt->pkt_flags & FLAG_NOINTR) == 0 &&
7491 scsipkt->pkt_comp != NULL) {
7492 /* scsi callback required */
7493 if (servicing_interrupt()) {
7494 if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
7495 (task_func_t *)spx->txlt_scsi_pkt->pkt_comp,
7496 (void *)spx->txlt_scsi_pkt, TQ_NOSLEEP) ==
7497 TASKQID_INVALID) {
7498 return (TRAN_BUSY);
7499 }
7500 } else if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
7501 (task_func_t *)spx->txlt_scsi_pkt->pkt_comp,
7502 (void *)spx->txlt_scsi_pkt, TQ_SLEEP) == TASKQID_INVALID) {
7503 /* Scheduling the callback failed */
7504 return (TRAN_BUSY);
7505 }
7506 }
7507
7508 return (TRAN_ACCEPT);
7509 }
7510
7511 /*
7512 * The UNMAP command considers it not to be an error if the parameter length
7513 * or block descriptor length is 0. For this case, there is nothing for TRIM
7514 * to do so just complete the command.
7515 */
7516 static int
sata_txlt_unmap_nodata_cmd(sata_pkt_txlate_t * spx)7517 sata_txlt_unmap_nodata_cmd(sata_pkt_txlate_t *spx)
7518 {
7519 struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
7520
7521 scsipkt->pkt_reason = CMD_CMPLT;
7522 *scsipkt->pkt_scbp = STATUS_GOOD;
7523 scsipkt->pkt_state = STATE_GOT_BUS | STATE_GOT_TARGET |
7524 STATE_SENT_CMD | STATE_GOT_STATUS;
7525
7526 if ((scsipkt->pkt_flags & FLAG_NOINTR) == 0 &&
7527 scsipkt->pkt_comp != NULL) {
7528 /* scsi callback required */
7529 if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
7530 (task_func_t *)spx->txlt_scsi_pkt->pkt_comp,
7531 (void *)spx->txlt_scsi_pkt, TQ_SLEEP) == TASKQID_INVALID) {
7532 /* Scheduling the callback failed */
7533 return (TRAN_BUSY);
7534 }
7535 }
7536
7537 return (TRAN_ACCEPT);
7538 }
7539
7540 /*
7541 * Emulated SATA Read/Write command completion for zero-length requests.
7542 * This request always succedes, so in synchronous mode it always returns
7543 * TRAN_ACCEPT, and in non-synchronous mode it may return TRAN_BUSY if the
7544 * callback cannot be scheduled.
7545 */
7546 static int
sata_emul_rw_completion(sata_pkt_txlate_t * spx)7547 sata_emul_rw_completion(sata_pkt_txlate_t *spx)
7548 {
7549 struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
7550
7551 scsipkt->pkt_state = STATE_GOT_BUS | STATE_GOT_TARGET |
7552 STATE_SENT_CMD | STATE_GOT_STATUS;
7553 scsipkt->pkt_reason = CMD_CMPLT;
7554 *scsipkt->pkt_scbp = STATUS_GOOD;
7555 if (!(spx->txlt_sata_pkt->satapkt_op_mode & SATA_OPMODE_SYNCH)) {
7556 /* scsi callback required - have to schedule it */
7557 if (servicing_interrupt()) {
7558 if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
7559 (task_func_t *)spx->txlt_scsi_pkt->pkt_comp,
7560 (void *)spx->txlt_scsi_pkt, TQ_NOSLEEP) ==
7561 TASKQID_INVALID) {
7562 return (TRAN_BUSY);
7563 }
7564 } else if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
7565 (task_func_t *)spx->txlt_scsi_pkt->pkt_comp,
7566 (void *)spx->txlt_scsi_pkt, TQ_SLEEP) == TASKQID_INVALID) {
7567 /* Scheduling the callback failed */
7568 return (TRAN_BUSY);
7569 }
7570 }
7571 return (TRAN_ACCEPT);
7572 }
7573
7574
7575 /*
7576 * Translate completion status of SATA read/write commands into scsi response.
7577 * pkt completion_reason is checked to determine the completion status.
7578 * Do scsi callback if necessary.
7579 *
7580 * Note: this function may be called also for synchronously executed
7581 * commands.
7582 * This function may be used only if scsi_pkt is non-NULL.
7583 */
7584 static void
sata_txlt_rw_completion(sata_pkt_t * sata_pkt)7585 sata_txlt_rw_completion(sata_pkt_t *sata_pkt)
7586 {
7587 sata_pkt_txlate_t *spx =
7588 (sata_pkt_txlate_t *)sata_pkt->satapkt_framework_private;
7589 sata_cmd_t *scmd = &sata_pkt->satapkt_cmd;
7590 struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
7591 struct scsi_extended_sense *sense;
7592 uint64_t lba;
7593 struct buf *bp;
7594 int rval;
7595 if (sata_pkt->satapkt_reason == SATA_PKT_COMPLETED) {
7596 /* Normal completion */
7597 scsipkt->pkt_state = STATE_GOT_BUS | STATE_GOT_TARGET |
7598 STATE_SENT_CMD | STATE_XFERRED_DATA | STATE_GOT_STATUS;
7599 scsipkt->pkt_reason = CMD_CMPLT;
7600 *scsipkt->pkt_scbp = STATUS_GOOD;
7601 if (spx->txlt_tmp_buf != NULL) {
7602 /* Temporary buffer was used */
7603 bp = spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp;
7604 if (bp->b_flags & B_READ) {
7605 rval = ddi_dma_sync(
7606 spx->txlt_buf_dma_handle, 0, 0,
7607 DDI_DMA_SYNC_FORCPU);
7608 ASSERT(rval == DDI_SUCCESS);
7609 bcopy(spx->txlt_tmp_buf, bp->b_un.b_addr,
7610 bp->b_bcount);
7611 }
7612 }
7613 } else {
7614 /*
7615 * Something went wrong - analyze return
7616 */
7617 scsipkt->pkt_state = STATE_GOT_BUS | STATE_GOT_TARGET |
7618 STATE_SENT_CMD | STATE_GOT_STATUS;
7619 scsipkt->pkt_reason = CMD_INCOMPLETE;
7620 *scsipkt->pkt_scbp = STATUS_CHECK;
7621 sense = sata_arq_sense(spx);
7622 ASSERT(sense != NULL);
7623
7624 /*
7625 * SATA_PKT_DEV_ERROR is the only case where we may be able to
7626 * extract from device registers the failing LBA.
7627 */
7628 if (sata_pkt->satapkt_reason == SATA_PKT_DEV_ERROR) {
7629 if ((scmd->satacmd_addr_type == ATA_ADDR_LBA48) &&
7630 (scmd->satacmd_lba_mid_msb != 0 ||
7631 scmd->satacmd_lba_high_msb != 0)) {
7632 /*
7633 * We have problem reporting this cmd LBA
7634 * in fixed sense data format, because of
7635 * the size of the scsi LBA fields.
7636 */
7637 sense->es_valid = 0;
7638 } else {
7639 sata_extract_error_lba(spx, &lba);
7640 sense->es_info_1 = (lba & 0xFF000000) >> 24;
7641 sense->es_info_2 = (lba & 0xFF0000) >> 16;
7642 sense->es_info_3 = (lba & 0xFF00) >> 8;
7643 sense->es_info_4 = lba & 0xFF;
7644 }
7645 } else {
7646 /* Invalid extended sense info */
7647 sense->es_valid = 0;
7648 }
7649
7650 switch (sata_pkt->satapkt_reason) {
7651 case SATA_PKT_PORT_ERROR:
7652 /* We may want to handle DEV GONE state as well */
7653 /*
7654 * We have no device data. Assume no data transfered.
7655 */
7656 sense->es_key = KEY_HARDWARE_ERROR;
7657 break;
7658
7659 case SATA_PKT_DEV_ERROR:
7660 if (sata_pkt->satapkt_cmd.satacmd_status_reg &
7661 SATA_STATUS_ERR) {
7662 /*
7663 * determine dev error reason from error
7664 * reg content
7665 */
7666 sata_decode_device_error(spx, sense);
7667 if (sense->es_key == KEY_MEDIUM_ERROR) {
7668 switch (scmd->satacmd_cmd_reg) {
7669 case SATAC_READ_DMA:
7670 case SATAC_READ_DMA_EXT:
7671 case SATAC_READ_DMA_QUEUED:
7672 case SATAC_READ_DMA_QUEUED_EXT:
7673 case SATAC_READ_FPDMA_QUEUED:
7674 /* Unrecovered read error */
7675 sense->es_add_code =
7676 SD_SCSI_ASC_UNREC_READ_ERR;
7677 break;
7678 case SATAC_WRITE_DMA:
7679 case SATAC_WRITE_DMA_EXT:
7680 case SATAC_WRITE_DMA_QUEUED:
7681 case SATAC_WRITE_DMA_QUEUED_EXT:
7682 case SATAC_WRITE_FPDMA_QUEUED:
7683 /* Write error */
7684 sense->es_add_code =
7685 SD_SCSI_ASC_WRITE_ERR;
7686 break;
7687 default:
7688 /* Internal error */
7689 SATA_LOG_D((
7690 spx->txlt_sata_hba_inst,
7691 CE_WARN,
7692 "sata_txlt_rw_completion :"
7693 "internal error - invalid "
7694 "command 0x%2x",
7695 scmd->satacmd_cmd_reg));
7696 break;
7697 }
7698 }
7699 break;
7700 }
7701 /* No extended sense key - no info available */
7702 scsipkt->pkt_reason = CMD_INCOMPLETE;
7703 break;
7704
7705 case SATA_PKT_TIMEOUT:
7706 scsipkt->pkt_reason = CMD_TIMEOUT;
7707 scsipkt->pkt_statistics |=
7708 STAT_TIMEOUT | STAT_DEV_RESET;
7709 sense->es_key = KEY_ABORTED_COMMAND;
7710 break;
7711
7712 case SATA_PKT_ABORTED:
7713 scsipkt->pkt_reason = CMD_ABORTED;
7714 scsipkt->pkt_statistics |= STAT_ABORTED;
7715 sense->es_key = KEY_ABORTED_COMMAND;
7716 break;
7717
7718 case SATA_PKT_RESET:
7719 scsipkt->pkt_reason = CMD_RESET;
7720 scsipkt->pkt_statistics |= STAT_DEV_RESET;
7721 sense->es_key = KEY_ABORTED_COMMAND;
7722 break;
7723
7724 default:
7725 SATA_LOG_D((spx->txlt_sata_hba_inst, CE_WARN,
7726 "sata_txlt_rw_completion: "
7727 "invalid packet completion reason"));
7728 scsipkt->pkt_reason = CMD_TRAN_ERR;
7729 break;
7730 }
7731 }
7732 SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
7733 "Scsi_pkt completion reason %x\n", scsipkt->pkt_reason);
7734
7735 if ((scsipkt->pkt_flags & FLAG_NOINTR) == 0)
7736 /* scsi callback required */
7737 scsi_hba_pkt_comp(scsipkt);
7738 }
7739
7740
7741 /*
7742 * Translate completion status of non-data commands (i.e. commands returning
7743 * no data).
7744 * pkt completion_reason is checked to determine the completion status.
7745 * Do scsi callback if necessary (FLAG_NOINTR == 0)
7746 *
7747 * Note: this function may be called also for synchronously executed
7748 * commands.
7749 * This function may be used only if scsi_pkt is non-NULL.
7750 */
7751
7752 static void
sata_txlt_nodata_cmd_completion(sata_pkt_t * sata_pkt)7753 sata_txlt_nodata_cmd_completion(sata_pkt_t *sata_pkt)
7754 {
7755 sata_pkt_txlate_t *spx =
7756 (sata_pkt_txlate_t *)sata_pkt->satapkt_framework_private;
7757 struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
7758
7759 sata_set_arq_data(sata_pkt);
7760
7761 if ((scsipkt->pkt_flags & FLAG_NOINTR) == 0)
7762 /* scsi callback required */
7763 scsi_hba_pkt_comp(scsipkt);
7764 }
7765
7766 /*
7767 * Completion handler for ATA Pass Through command
7768 */
7769 static void
sata_txlt_apt_completion(sata_pkt_t * sata_pkt)7770 sata_txlt_apt_completion(sata_pkt_t *sata_pkt)
7771 {
7772 sata_pkt_txlate_t *spx =
7773 (sata_pkt_txlate_t *)sata_pkt->satapkt_framework_private;
7774 sata_cmd_t *scmd = &sata_pkt->satapkt_cmd;
7775 struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
7776 struct buf *bp;
7777 uint8_t sense_key = 0, addl_sense_code = 0, addl_sense_qual = 0;
7778
7779 if (sata_pkt->satapkt_reason == SATA_PKT_COMPLETED) {
7780 /* Normal completion */
7781 scsipkt->pkt_state = STATE_GOT_BUS | STATE_GOT_TARGET |
7782 STATE_SENT_CMD | STATE_XFERRED_DATA | STATE_GOT_STATUS;
7783 scsipkt->pkt_reason = CMD_CMPLT;
7784 *scsipkt->pkt_scbp = STATUS_GOOD;
7785
7786 /*
7787 * If the command has CK_COND set
7788 */
7789 if (scsipkt->pkt_cdbp[2] & SATL_APT_BM_CK_COND) {
7790 *scsipkt->pkt_scbp = STATUS_CHECK;
7791 sata_fill_ata_return_desc(sata_pkt,
7792 KEY_RECOVERABLE_ERROR,
7793 SD_SCSI_ASC_APT_INFO_AVAIL, 0x1d);
7794 }
7795
7796 if (spx->txlt_tmp_buf != NULL) {
7797 /* Temporary buffer was used */
7798 bp = spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp;
7799 if (bp->b_flags & B_READ) {
7800 bcopy(spx->txlt_tmp_buf, bp->b_un.b_addr,
7801 bp->b_bcount);
7802 }
7803 }
7804 } else {
7805 scsipkt->pkt_state = STATE_GOT_BUS | STATE_GOT_TARGET |
7806 STATE_SENT_CMD | STATE_GOT_STATUS;
7807 scsipkt->pkt_reason = CMD_INCOMPLETE;
7808 *scsipkt->pkt_scbp = STATUS_CHECK;
7809
7810 /*
7811 * If DF or ERR was set, the HBA should have copied out the
7812 * status and error registers to the satacmd structure.
7813 */
7814 if (scmd->satacmd_status_reg & SATA_STATUS_DF) {
7815 sense_key = KEY_HARDWARE_ERROR;
7816 addl_sense_code = SD_SCSI_ASC_INTERNAL_TARGET_FAILURE;
7817 addl_sense_qual = 0;
7818 } else if (scmd->satacmd_status_reg & SATA_STATUS_ERR) {
7819 if (scmd->satacmd_error_reg & SATA_ERROR_NM) {
7820 sense_key = KEY_NOT_READY;
7821 addl_sense_code =
7822 SD_SCSI_ASC_MEDIUM_NOT_PRESENT;
7823 addl_sense_qual = 0;
7824 } else if (scmd->satacmd_error_reg & SATA_ERROR_UNC) {
7825 sense_key = KEY_MEDIUM_ERROR;
7826 addl_sense_code = SD_SCSI_ASC_UNREC_READ_ERR;
7827 addl_sense_qual = 0;
7828 } else if (scmd->satacmd_error_reg & SATA_ERROR_ILI) {
7829 sense_key = KEY_DATA_PROTECT;
7830 addl_sense_code = SD_SCSI_ASC_WRITE_PROTECTED;
7831 addl_sense_qual = 0;
7832 } else if (scmd->satacmd_error_reg & SATA_ERROR_IDNF) {
7833 sense_key = KEY_ILLEGAL_REQUEST;
7834 addl_sense_code = SD_SCSI_ASC_LBA_OUT_OF_RANGE;
7835 addl_sense_qual = 0;
7836 } else if (scmd->satacmd_error_reg & SATA_ERROR_ABORT) {
7837 sense_key = KEY_ABORTED_COMMAND;
7838 addl_sense_code = SD_SCSI_ASC_NO_ADD_SENSE;
7839 addl_sense_qual = 0;
7840 } else if (scmd->satacmd_error_reg & SATA_ERROR_MC) {
7841 sense_key = KEY_UNIT_ATTENTION;
7842 addl_sense_code =
7843 SD_SCSI_ASC_MEDIUM_MAY_HAVE_CHANGED;
7844 addl_sense_qual = 0;
7845 } else if (scmd->satacmd_error_reg & SATA_ERROR_MCR) {
7846 sense_key = KEY_UNIT_ATTENTION;
7847 addl_sense_code = SD_SCSI_ASC_OP_MEDIUM_REM_REQ;
7848 addl_sense_qual = 0;
7849 } else if (scmd->satacmd_error_reg & SATA_ERROR_ICRC) {
7850 sense_key = KEY_ABORTED_COMMAND;
7851 addl_sense_code =
7852 SD_SCSI_ASC_INFO_UNIT_IUCRC_ERR;
7853 addl_sense_qual = 0;
7854 }
7855 }
7856
7857 sata_fill_ata_return_desc(sata_pkt, sense_key, addl_sense_code,
7858 addl_sense_qual);
7859 }
7860
7861 if ((scsipkt->pkt_flags & FLAG_NOINTR) == 0)
7862 /* scsi callback required */
7863 scsi_hba_pkt_comp(scsipkt);
7864 }
7865
7866 /*
7867 * Completion handler for unmap translation command
7868 */
7869 static void
sata_txlt_unmap_completion(sata_pkt_t * sata_pkt)7870 sata_txlt_unmap_completion(sata_pkt_t *sata_pkt)
7871 {
7872 sata_pkt_txlate_t *spx =
7873 (sata_pkt_txlate_t *)sata_pkt->satapkt_framework_private;
7874 sata_cmd_t *scmd = &sata_pkt->satapkt_cmd;
7875 struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
7876 struct buf *bp;
7877 uint8_t sense_key = 0, addl_sense_code = 0, addl_sense_qual = 0;
7878
7879 if (sata_pkt->satapkt_reason == SATA_PKT_COMPLETED) {
7880 /* Normal completion */
7881 scsipkt->pkt_state = STATE_GOT_BUS | STATE_GOT_TARGET |
7882 STATE_SENT_CMD | STATE_XFERRED_DATA | STATE_GOT_STATUS;
7883 scsipkt->pkt_reason = CMD_CMPLT;
7884 *scsipkt->pkt_scbp = STATUS_GOOD;
7885
7886 if (spx->txlt_tmp_buf != NULL) {
7887 /* Temporary buffer was used */
7888 bp = spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp;
7889 if (bp->b_flags & B_READ) {
7890 bcopy(spx->txlt_tmp_buf, bp->b_un.b_addr,
7891 bp->b_bcount);
7892 }
7893 }
7894 } else {
7895 scsipkt->pkt_state = STATE_GOT_BUS | STATE_GOT_TARGET |
7896 STATE_SENT_CMD | STATE_GOT_STATUS;
7897 scsipkt->pkt_reason = CMD_INCOMPLETE;
7898 *scsipkt->pkt_scbp = STATUS_CHECK;
7899
7900 /*
7901 * If DF or ERR was set, the HBA should have copied out the
7902 * status and error registers to the satacmd structure.
7903 */
7904 if (scmd->satacmd_status_reg & SATA_STATUS_DF) {
7905 sense_key = KEY_HARDWARE_ERROR;
7906 addl_sense_code = SD_SCSI_ASC_INTERNAL_TARGET_FAILURE;
7907 addl_sense_qual = 0;
7908 } else if (scmd->satacmd_status_reg & SATA_STATUS_ERR) {
7909 if (scmd->satacmd_error_reg & SATA_ERROR_NM) {
7910 sense_key = KEY_NOT_READY;
7911 addl_sense_code =
7912 SD_SCSI_ASC_MEDIUM_NOT_PRESENT;
7913 addl_sense_qual = 0;
7914 } else if (scmd->satacmd_error_reg & SATA_ERROR_UNC) {
7915 sense_key = KEY_MEDIUM_ERROR;
7916 addl_sense_code = SD_SCSI_ASC_WRITE_ERR;
7917 addl_sense_qual = 0;
7918 } else if (scmd->satacmd_error_reg & SATA_ERROR_ILI) {
7919 sense_key = KEY_DATA_PROTECT;
7920 addl_sense_code = SD_SCSI_ASC_WRITE_PROTECTED;
7921 addl_sense_qual = 0;
7922 } else if (scmd->satacmd_error_reg & SATA_ERROR_IDNF) {
7923 sense_key = KEY_ILLEGAL_REQUEST;
7924 addl_sense_code = SD_SCSI_ASC_LBA_OUT_OF_RANGE;
7925 addl_sense_qual = 0;
7926 } else if (scmd->satacmd_error_reg & SATA_ERROR_ABORT) {
7927 sense_key = KEY_ABORTED_COMMAND;
7928 addl_sense_code = SD_SCSI_ASC_NO_ADD_SENSE;
7929 addl_sense_qual = 0;
7930 } else if (scmd->satacmd_error_reg & SATA_ERROR_MC) {
7931 sense_key = KEY_UNIT_ATTENTION;
7932 addl_sense_code =
7933 SD_SCSI_ASC_MEDIUM_MAY_HAVE_CHANGED;
7934 addl_sense_qual = 0;
7935 } else if (scmd->satacmd_error_reg & SATA_ERROR_MCR) {
7936 sense_key = KEY_UNIT_ATTENTION;
7937 addl_sense_code = SD_SCSI_ASC_OP_MEDIUM_REM_REQ;
7938 addl_sense_qual = 0;
7939 } else if (scmd->satacmd_error_reg & SATA_ERROR_ICRC) {
7940 sense_key = KEY_ABORTED_COMMAND;
7941 addl_sense_code =
7942 SD_SCSI_ASC_INFO_UNIT_IUCRC_ERR;
7943 addl_sense_qual = 0;
7944 }
7945 }
7946
7947 sata_fill_ata_return_desc(sata_pkt, sense_key, addl_sense_code,
7948 addl_sense_qual);
7949 }
7950
7951 sata_free_local_buffer(spx);
7952
7953 if ((scsipkt->pkt_flags & FLAG_NOINTR) == 0)
7954 /* scsi callback required */
7955 scsi_hba_pkt_comp(scsipkt);
7956 }
7957
7958 /*
7959 *
7960 */
7961 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)7962 sata_fill_ata_return_desc(sata_pkt_t *sata_pkt, uint8_t sense_key,
7963 uint8_t addl_sense_code, uint8_t addl_sense_qual)
7964 {
7965 sata_pkt_txlate_t *spx =
7966 (sata_pkt_txlate_t *)sata_pkt->satapkt_framework_private;
7967 sata_cmd_t *scmd = &sata_pkt->satapkt_cmd;
7968 struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
7969 struct sata_apt_sense_data *apt_sd =
7970 (struct sata_apt_sense_data *)scsipkt->pkt_scbp;
7971 struct scsi_descr_sense_hdr *sds = &(apt_sd->apt_sd_hdr);
7972 struct scsi_ata_status_ret_sense_descr *ata_ret_desc =
7973 &(apt_sd->apt_sd_sense);
7974 int extend = 0;
7975
7976 if ((scsipkt->pkt_cdbp[0] == SPC3_CMD_ATA_COMMAND_PASS_THROUGH16) &&
7977 (scsipkt->pkt_cdbp[2] & SATL_APT_BM_EXTEND))
7978 extend = 1;
7979
7980 scsipkt->pkt_state |= STATE_ARQ_DONE;
7981
7982 /* update the residual count */
7983 *(uchar_t *)&apt_sd->apt_status = STATUS_CHECK;
7984 *(uchar_t *)&apt_sd->apt_rqpkt_status = STATUS_GOOD;
7985 apt_sd->apt_rqpkt_reason = CMD_CMPLT;
7986 apt_sd->apt_rqpkt_state = STATE_GOT_BUS | STATE_GOT_TARGET |
7987 STATE_XFERRED_DATA | STATE_SENT_CMD | STATE_GOT_STATUS;
7988 apt_sd->apt_rqpkt_resid = scsipkt->pkt_scblen -
7989 sizeof (struct sata_apt_sense_data);
7990
7991 /*
7992 * Fill in the Descriptor sense header
7993 */
7994 bzero(sds, sizeof (struct scsi_descr_sense_hdr));
7995 sds->ds_code = CODE_FMT_DESCR_CURRENT;
7996 sds->ds_class = CLASS_EXTENDED_SENSE;
7997 sds->ds_key = sense_key & 0xf;
7998 sds->ds_add_code = addl_sense_code;
7999 sds->ds_qual_code = addl_sense_qual;
8000 sds->ds_addl_sense_length =
8001 sizeof (struct scsi_ata_status_ret_sense_descr);
8002
8003 /*
8004 * Fill in the ATA Return descriptor sense data
8005 */
8006 bzero(ata_ret_desc, sizeof (struct scsi_ata_status_ret_sense_descr));
8007 ata_ret_desc->ars_descr_type = DESCR_ATA_STATUS_RETURN;
8008 ata_ret_desc->ars_addl_length = 0xc;
8009 ata_ret_desc->ars_error = scmd->satacmd_error_reg;
8010 ata_ret_desc->ars_sec_count_lsb = scmd->satacmd_sec_count_lsb;
8011 ata_ret_desc->ars_lba_low_lsb = scmd->satacmd_lba_low_lsb;
8012 ata_ret_desc->ars_lba_mid_lsb = scmd->satacmd_lba_mid_lsb;
8013 ata_ret_desc->ars_lba_high_lsb = scmd->satacmd_lba_high_lsb;
8014 ata_ret_desc->ars_device = scmd->satacmd_device_reg;
8015 ata_ret_desc->ars_status = scmd->satacmd_status_reg;
8016
8017 if (extend == 1) {
8018 ata_ret_desc->ars_extend = 1;
8019 ata_ret_desc->ars_sec_count_msb = scmd->satacmd_sec_count_msb;
8020 ata_ret_desc->ars_lba_low_msb = scmd->satacmd_lba_low_msb;
8021 ata_ret_desc->ars_lba_mid_msb = scmd->satacmd_lba_mid_msb;
8022 ata_ret_desc->ars_lba_high_msb = scmd->satacmd_lba_high_msb;
8023 } else {
8024 ata_ret_desc->ars_extend = 0;
8025 ata_ret_desc->ars_sec_count_msb = 0;
8026 ata_ret_desc->ars_lba_low_msb = 0;
8027 ata_ret_desc->ars_lba_mid_msb = 0;
8028 ata_ret_desc->ars_lba_high_msb = 0;
8029 }
8030 }
8031
8032 static void
sata_set_arq_data(sata_pkt_t * sata_pkt)8033 sata_set_arq_data(sata_pkt_t *sata_pkt)
8034 {
8035 sata_pkt_txlate_t *spx =
8036 (sata_pkt_txlate_t *)sata_pkt->satapkt_framework_private;
8037 struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
8038 struct scsi_extended_sense *sense;
8039
8040 scsipkt->pkt_state = STATE_GOT_BUS | STATE_GOT_TARGET |
8041 STATE_SENT_CMD | STATE_GOT_STATUS;
8042 if (sata_pkt->satapkt_reason == SATA_PKT_COMPLETED) {
8043 /* Normal completion */
8044 scsipkt->pkt_reason = CMD_CMPLT;
8045 *scsipkt->pkt_scbp = STATUS_GOOD;
8046 } else {
8047 /* Something went wrong */
8048 scsipkt->pkt_reason = CMD_INCOMPLETE;
8049 *scsipkt->pkt_scbp = STATUS_CHECK;
8050 sense = sata_arq_sense(spx);
8051 switch (sata_pkt->satapkt_reason) {
8052 case SATA_PKT_PORT_ERROR:
8053 /*
8054 * We have no device data. Assume no data transfered.
8055 */
8056 sense->es_key = KEY_HARDWARE_ERROR;
8057 break;
8058
8059 case SATA_PKT_DEV_ERROR:
8060 if (sata_pkt->satapkt_cmd.satacmd_status_reg &
8061 SATA_STATUS_ERR) {
8062 /*
8063 * determine dev error reason from error
8064 * reg content
8065 */
8066 sata_decode_device_error(spx, sense);
8067 break;
8068 }
8069 /* No extended sense key - no info available */
8070 break;
8071
8072 case SATA_PKT_TIMEOUT:
8073 scsipkt->pkt_reason = CMD_TIMEOUT;
8074 scsipkt->pkt_statistics |=
8075 STAT_TIMEOUT | STAT_DEV_RESET;
8076 /* No extended sense key ? */
8077 break;
8078
8079 case SATA_PKT_ABORTED:
8080 scsipkt->pkt_reason = CMD_ABORTED;
8081 scsipkt->pkt_statistics |= STAT_ABORTED;
8082 /* No extended sense key ? */
8083 break;
8084
8085 case SATA_PKT_RESET:
8086 /* pkt aborted by an explicit reset from a host */
8087 scsipkt->pkt_reason = CMD_RESET;
8088 scsipkt->pkt_statistics |= STAT_DEV_RESET;
8089 break;
8090
8091 default:
8092 SATA_LOG_D((spx->txlt_sata_hba_inst, CE_WARN,
8093 "sata_txlt_nodata_cmd_completion: "
8094 "invalid packet completion reason %d",
8095 sata_pkt->satapkt_reason));
8096 scsipkt->pkt_reason = CMD_TRAN_ERR;
8097 break;
8098 }
8099
8100 }
8101 SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
8102 "Scsi_pkt completion reason %x\n", scsipkt->pkt_reason);
8103 }
8104
8105
8106 /*
8107 * Build Mode sense R/W recovery page
8108 * NOT IMPLEMENTED
8109 */
8110
8111 static int
sata_build_msense_page_1(sata_drive_info_t * sdinfo,int pcntrl,uint8_t * buf)8112 sata_build_msense_page_1(sata_drive_info_t *sdinfo, int pcntrl, uint8_t *buf)
8113 {
8114 #ifndef __lock_lint
8115 _NOTE(ARGUNUSED(sdinfo))
8116 _NOTE(ARGUNUSED(pcntrl))
8117 _NOTE(ARGUNUSED(buf))
8118 #endif
8119 return (0);
8120 }
8121
8122 /*
8123 * Build Mode sense caching page - scsi-3 implementation.
8124 * Page length distinguishes previous format from scsi-3 format.
8125 * buf must have space for 0x12 bytes.
8126 * Only DRA (disable read ahead ) and WCE (write cache enable) are changeable.
8127 *
8128 */
8129 static int
sata_build_msense_page_8(sata_drive_info_t * sdinfo,int pcntrl,uint8_t * buf)8130 sata_build_msense_page_8(sata_drive_info_t *sdinfo, int pcntrl, uint8_t *buf)
8131 {
8132 struct mode_cache_scsi3 *page = (struct mode_cache_scsi3 *)buf;
8133 sata_id_t *sata_id = &sdinfo->satadrv_id;
8134
8135 /*
8136 * Most of the fields are set to 0, being not supported and/or disabled
8137 */
8138 bzero(buf, PAGELENGTH_DAD_MODE_CACHE_SCSI3);
8139
8140 /* Saved paramters not supported */
8141 if (pcntrl == 3)
8142 return (0);
8143 if (pcntrl == 0 || pcntrl == 2) {
8144 /*
8145 * For now treat current and default parameters as same
8146 * That may have to change, if target driver will complain
8147 */
8148 page->mode_page.code = MODEPAGE_CACHING; /* PS = 0 */
8149 page->mode_page.length = PAGELENGTH_DAD_MODE_CACHE_SCSI3;
8150
8151 if (SATA_READ_AHEAD_SUPPORTED(*sata_id) &&
8152 !SATA_READ_AHEAD_ENABLED(*sata_id)) {
8153 page->dra = 1; /* Read Ahead disabled */
8154 page->rcd = 1; /* Read Cache disabled */
8155 }
8156 if (SATA_WRITE_CACHE_SUPPORTED(*sata_id) &&
8157 SATA_WRITE_CACHE_ENABLED(*sata_id))
8158 page->wce = 1; /* Write Cache enabled */
8159 } else {
8160 /* Changeable parameters */
8161 page->mode_page.code = MODEPAGE_CACHING;
8162 page->mode_page.length = PAGELENGTH_DAD_MODE_CACHE_SCSI3;
8163 if (SATA_READ_AHEAD_SUPPORTED(*sata_id)) {
8164 page->dra = 1;
8165 page->rcd = 1;
8166 }
8167 if (SATA_WRITE_CACHE_SUPPORTED(*sata_id))
8168 page->wce = 1;
8169 }
8170 return (PAGELENGTH_DAD_MODE_CACHE_SCSI3 +
8171 sizeof (struct mode_page));
8172 }
8173
8174 /*
8175 * Build Mode sense exception cntrl page
8176 */
8177 static int
sata_build_msense_page_1c(sata_drive_info_t * sdinfo,int pcntrl,uint8_t * buf)8178 sata_build_msense_page_1c(sata_drive_info_t *sdinfo, int pcntrl, uint8_t *buf)
8179 {
8180 struct mode_info_excpt_page *page = (struct mode_info_excpt_page *)buf;
8181 sata_id_t *sata_id = &sdinfo->satadrv_id;
8182
8183 /*
8184 * Most of the fields are set to 0, being not supported and/or disabled
8185 */
8186 bzero(buf, PAGELENGTH_INFO_EXCPT);
8187
8188 page->mode_page.code = MODEPAGE_INFO_EXCPT;
8189 page->mode_page.length = PAGELENGTH_INFO_EXCPT;
8190
8191 /* Indicate that this is page is saveable */
8192 page->mode_page.ps = 1;
8193
8194 /*
8195 * We will return the same data for default, current and saved page.
8196 * The only changeable bit is dexcpt and that bit is required
8197 * by the ATA specification to be preserved across power cycles.
8198 */
8199 if (pcntrl != 1) {
8200 page->dexcpt = !(sata_id->ai_features85 & SATA_SMART_SUPPORTED);
8201 page->mrie = MRIE_ONLY_ON_REQUEST;
8202 }
8203 else
8204 page->dexcpt = 1; /* Only changeable parameter */
8205
8206 return (PAGELENGTH_INFO_EXCPT + sizeof (struct mode_page));
8207 }
8208
8209
8210 static int
sata_build_msense_page_30(sata_drive_info_t * sdinfo,int pcntrl,uint8_t * buf)8211 sata_build_msense_page_30(sata_drive_info_t *sdinfo, int pcntrl, uint8_t *buf)
8212 {
8213 struct mode_acoustic_management *page =
8214 (struct mode_acoustic_management *)buf;
8215 sata_id_t *sata_id = &sdinfo->satadrv_id;
8216
8217 /*
8218 * Most of the fields are set to 0, being not supported and/or disabled
8219 */
8220 bzero(buf, PAGELENGTH_DAD_MODE_ACOUSTIC_MANAGEMENT);
8221
8222 switch (pcntrl) {
8223 case P_CNTRL_DEFAULT:
8224 /* default paramters not supported */
8225 return (0);
8226
8227 case P_CNTRL_CURRENT:
8228 case P_CNTRL_SAVED:
8229 /* Saved and current are supported and are identical */
8230 page->mode_page.code = MODEPAGE_ACOUSTIC_MANAG;
8231 page->mode_page.length =
8232 PAGELENGTH_DAD_MODE_ACOUSTIC_MANAGEMENT;
8233 page->mode_page.ps = 1;
8234
8235 /* Word 83 indicates if feature is supported */
8236 /* If feature is not supported */
8237 if (!(sata_id->ai_cmdset83 & SATA_ACOUSTIC_MGMT)) {
8238 page->acoustic_manag_enable =
8239 ACOUSTIC_DISABLED;
8240 } else {
8241 page->acoustic_manag_enable =
8242 ((sata_id->ai_features86 & SATA_ACOUSTIC_MGMT)
8243 != 0);
8244 /* Word 94 inidicates the value */
8245 #ifdef _LITTLE_ENDIAN
8246 page->acoustic_manag_level =
8247 (uchar_t)sata_id->ai_acoustic;
8248 page->vendor_recommended_value =
8249 sata_id->ai_acoustic >> 8;
8250 #else
8251 page->acoustic_manag_level =
8252 sata_id->ai_acoustic >> 8;
8253 page->vendor_recommended_value =
8254 (uchar_t)sata_id->ai_acoustic;
8255 #endif
8256 }
8257 break;
8258
8259 case P_CNTRL_CHANGEABLE:
8260 page->mode_page.code = MODEPAGE_ACOUSTIC_MANAG;
8261 page->mode_page.length =
8262 PAGELENGTH_DAD_MODE_ACOUSTIC_MANAGEMENT;
8263 page->mode_page.ps = 1;
8264
8265 /* Word 83 indicates if the feature is supported */
8266 if (sata_id->ai_cmdset83 & SATA_ACOUSTIC_MGMT) {
8267 page->acoustic_manag_enable =
8268 ACOUSTIC_ENABLED;
8269 page->acoustic_manag_level = 0xff;
8270 }
8271 break;
8272 }
8273 return (PAGELENGTH_DAD_MODE_ACOUSTIC_MANAGEMENT +
8274 sizeof (struct mode_page));
8275 }
8276
8277
8278 /*
8279 * Build Mode sense power condition page.
8280 */
8281 static int
sata_build_msense_page_1a(sata_drive_info_t * sdinfo,int pcntrl,uint8_t * buf)8282 sata_build_msense_page_1a(sata_drive_info_t *sdinfo, int pcntrl, uint8_t *buf)
8283 {
8284 struct mode_info_power_cond *page = (struct mode_info_power_cond *)buf;
8285 sata_id_t *sata_id = &sdinfo->satadrv_id;
8286
8287 /*
8288 * Most of the fields are set to 0, being not supported and/or disabled
8289 * power condition page length was 0x0a
8290 */
8291 bzero(buf, sizeof (struct mode_info_power_cond));
8292
8293 if (pcntrl == P_CNTRL_DEFAULT) {
8294 /* default paramters not supported */
8295 return (0);
8296 }
8297
8298 page->mode_page.code = MODEPAGE_POWER_COND;
8299 page->mode_page.length = sizeof (struct mode_info_power_cond);
8300
8301 if (sata_id->ai_cap & SATA_STANDBYTIMER) {
8302 page->standby = 1;
8303 bcopy(sdinfo->satadrv_standby_timer, page->standby_cond_timer,
8304 sizeof (uchar_t) * 4);
8305 }
8306
8307 return (sizeof (struct mode_info_power_cond));
8308 }
8309
8310 /*
8311 * Process mode select caching page 8 (scsi3 format only).
8312 * Read Ahead (same as read cache) and Write Cache may be turned on and off
8313 * if these features are supported by the device. If these features are not
8314 * supported, the command will be terminated with STATUS_CHECK.
8315 * This function fails only if the SET FEATURE command sent to
8316 * the device fails. The page format is not verified, assuming that the
8317 * target driver operates correctly - if parameters length is too short,
8318 * we just drop the page.
8319 * Two command may be sent if both Read Cache/Read Ahead and Write Cache
8320 * setting have to be changed.
8321 * SET FEATURE command is executed synchronously, i.e. we wait here until
8322 * it is completed, regardless of the scsi pkt directives.
8323 *
8324 * Note: Mode Select Caching page RCD and DRA bits are tied together, i.e.
8325 * changing DRA will change RCD.
8326 *
8327 * More than one SATA command may be executed to perform operations specified
8328 * by mode select pages. The first error terminates further execution.
8329 * Operations performed successully are not backed-up in such case.
8330 *
8331 * Return SATA_SUCCESS if operation succeeded, SATA_FAILURE otherwise.
8332 * If operation resulted in changing device setup, dmod flag should be set to
8333 * one (1). If parameters were not changed, dmod flag should be set to 0.
8334 * Upon return, if operation required sending command to the device, the rval
8335 * should be set to the value returned by sata_hba_start. If operation
8336 * did not require device access, rval should be set to TRAN_ACCEPT.
8337 * The pagelen should be set to the length of the page.
8338 *
8339 * This function has to be called with a port mutex held.
8340 *
8341 * Returns SATA_SUCCESS if operation was successful, SATA_FAILURE otherwise.
8342 */
8343 int
sata_mode_select_page_8(sata_pkt_txlate_t * spx,struct mode_cache_scsi3 * page,int parmlen,int * pagelen,int * rval,int * dmod)8344 sata_mode_select_page_8(sata_pkt_txlate_t *spx, struct mode_cache_scsi3 *page,
8345 int parmlen, int *pagelen, int *rval, int *dmod)
8346 {
8347 struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
8348 sata_drive_info_t *sdinfo;
8349 sata_cmd_t *scmd = &spx->txlt_sata_pkt->satapkt_cmd;
8350 sata_id_t *sata_id;
8351 struct scsi_extended_sense *sense;
8352 int wce, dra; /* Current settings */
8353
8354 sdinfo = sata_get_device_info(spx->txlt_sata_hba_inst,
8355 &spx->txlt_sata_pkt->satapkt_device);
8356 sata_id = &sdinfo->satadrv_id;
8357 *dmod = 0;
8358
8359 /* Verify parameters length. If too short, drop it */
8360 if ((PAGELENGTH_DAD_MODE_CACHE_SCSI3 +
8361 sizeof (struct mode_page)) > parmlen) {
8362 *scsipkt->pkt_scbp = STATUS_CHECK;
8363 sense = sata_arq_sense(spx);
8364 sense->es_key = KEY_ILLEGAL_REQUEST;
8365 sense->es_add_code = SD_SCSI_ASC_INVALID_FIELD_IN_PARAMS_LIST;
8366 *pagelen = parmlen;
8367 *rval = TRAN_ACCEPT;
8368 return (SATA_FAILURE);
8369 }
8370
8371 *pagelen = PAGELENGTH_DAD_MODE_CACHE_SCSI3 + sizeof (struct mode_page);
8372
8373 /* Current setting of Read Ahead (and Read Cache) */
8374 if (SATA_READ_AHEAD_ENABLED(*sata_id))
8375 dra = 0; /* 0 == not disabled */
8376 else
8377 dra = 1;
8378 /* Current setting of Write Cache */
8379 if (SATA_WRITE_CACHE_ENABLED(*sata_id))
8380 wce = 1;
8381 else
8382 wce = 0;
8383
8384 if (page->dra == dra && page->wce == wce && page->rcd == dra) {
8385 /* nothing to do */
8386 *rval = TRAN_ACCEPT;
8387 return (SATA_SUCCESS);
8388 }
8389
8390 /*
8391 * Need to flip some setting
8392 * Set-up Internal SET FEATURES command(s)
8393 */
8394 scmd->satacmd_flags.sata_data_direction = SATA_DIR_NODATA_XFER;
8395 scmd->satacmd_addr_type = 0;
8396 scmd->satacmd_device_reg = 0;
8397 scmd->satacmd_status_reg = 0;
8398 scmd->satacmd_error_reg = 0;
8399 scmd->satacmd_cmd_reg = SATAC_SET_FEATURES;
8400 if (page->dra != dra || page->rcd != dra) {
8401 if (SATA_READ_AHEAD_SUPPORTED(*sata_id)) {
8402 /* Need to flip read ahead setting */
8403 if (dra == 0)
8404 /* Disable read ahead / read cache */
8405 scmd->satacmd_features_reg =
8406 SATAC_SF_DISABLE_READ_AHEAD;
8407 else
8408 /* Enable read ahead / read cache */
8409 scmd->satacmd_features_reg =
8410 SATAC_SF_ENABLE_READ_AHEAD;
8411
8412 /* Transfer command to HBA */
8413 if (sata_hba_start(spx, rval) != 0)
8414 /*
8415 * Pkt not accepted for execution.
8416 */
8417 return (SATA_FAILURE);
8418
8419 *dmod = 1;
8420
8421 /* Now process return */
8422 if (spx->txlt_sata_pkt->satapkt_reason !=
8423 SATA_PKT_COMPLETED) {
8424 goto failure; /* Terminate */
8425 }
8426 } else {
8427 *scsipkt->pkt_scbp = STATUS_CHECK;
8428 sense = sata_arq_sense(spx);
8429 sense->es_key = KEY_ILLEGAL_REQUEST;
8430 sense->es_add_code =
8431 SD_SCSI_ASC_INVALID_FIELD_IN_PARAMS_LIST;
8432 *pagelen = parmlen;
8433 *rval = TRAN_ACCEPT;
8434 return (SATA_FAILURE);
8435 }
8436 }
8437
8438 /* Note that the packet is not removed, so it could be re-used */
8439 if (page->wce != wce) {
8440 if (SATA_WRITE_CACHE_SUPPORTED(*sata_id)) {
8441 /* Need to flip Write Cache setting */
8442 if (page->wce == 1)
8443 /* Enable write cache */
8444 scmd->satacmd_features_reg =
8445 SATAC_SF_ENABLE_WRITE_CACHE;
8446 else
8447 /* Disable write cache */
8448 scmd->satacmd_features_reg =
8449 SATAC_SF_DISABLE_WRITE_CACHE;
8450
8451 /* Transfer command to HBA */
8452 if (sata_hba_start(spx, rval) != 0)
8453 /*
8454 * Pkt not accepted for execution.
8455 */
8456 return (SATA_FAILURE);
8457
8458 *dmod = 1;
8459
8460 /* Now process return */
8461 if (spx->txlt_sata_pkt->satapkt_reason !=
8462 SATA_PKT_COMPLETED) {
8463 goto failure;
8464 }
8465 } else {
8466 *scsipkt->pkt_scbp = STATUS_CHECK;
8467 sense = sata_arq_sense(spx);
8468 sense->es_key = KEY_ILLEGAL_REQUEST;
8469 sense->es_add_code =
8470 SD_SCSI_ASC_INVALID_FIELD_IN_PARAMS_LIST;
8471 *pagelen = parmlen;
8472 *rval = TRAN_ACCEPT;
8473 return (SATA_FAILURE);
8474 }
8475 }
8476 return (SATA_SUCCESS);
8477
8478 failure:
8479 sata_xlate_errors(spx);
8480
8481 return (SATA_FAILURE);
8482 }
8483
8484 /*
8485 * Process mode select informational exceptions control page 0x1c
8486 *
8487 * The only changeable bit is dexcpt (disable exceptions).
8488 * MRIE (method of reporting informational exceptions) must be
8489 * "only on request".
8490 * This page applies to informational exceptions that report
8491 * additional sense codes with the ADDITIONAL SENSE CODE field set to 5Dh
8492 * (e.g.,FAILURE PREDICTION THRESHOLD EXCEEDED) or 0Bh (e.g., WARNING_).
8493 * Informational exception conditions occur as the result of background scan
8494 * errors, background self-test errors, or vendor specific events within a
8495 * logical unit. An informational exception condition may occur asynchronous
8496 * to any commands.
8497 *
8498 * Returns: SATA_SUCCESS if operation succeeded, SATA_FAILURE otherwise.
8499 * If operation resulted in changing device setup, dmod flag should be set to
8500 * one (1). If parameters were not changed, dmod flag should be set to 0.
8501 * Upon return, if operation required sending command to the device, the rval
8502 * should be set to the value returned by sata_hba_start. If operation
8503 * did not require device access, rval should be set to TRAN_ACCEPT.
8504 * The pagelen should be set to the length of the page.
8505 *
8506 * This function has to be called with a port mutex held.
8507 *
8508 * Returns SATA_SUCCESS if operation was successful, SATA_FAILURE otherwise.
8509 *
8510 * Cannot be called in the interrupt context.
8511 */
8512 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)8513 sata_mode_select_page_1c(
8514 sata_pkt_txlate_t *spx,
8515 struct mode_info_excpt_page *page,
8516 int parmlen,
8517 int *pagelen,
8518 int *rval,
8519 int *dmod)
8520 {
8521 struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
8522 sata_cmd_t *scmd = &spx->txlt_sata_pkt->satapkt_cmd;
8523 sata_drive_info_t *sdinfo;
8524 sata_id_t *sata_id;
8525 struct scsi_extended_sense *sense;
8526
8527 sdinfo = sata_get_device_info(spx->txlt_sata_hba_inst,
8528 &spx->txlt_sata_pkt->satapkt_device);
8529 sata_id = &sdinfo->satadrv_id;
8530
8531 *dmod = 0;
8532
8533 /* Verify parameters length. If too short, drop it */
8534 if (((PAGELENGTH_INFO_EXCPT + sizeof (struct mode_page)) > parmlen) ||
8535 page->perf || page->test || (page->mrie != MRIE_ONLY_ON_REQUEST)) {
8536 *scsipkt->pkt_scbp = STATUS_CHECK;
8537 sense = sata_arq_sense(spx);
8538 sense->es_key = KEY_ILLEGAL_REQUEST;
8539 sense->es_add_code = SD_SCSI_ASC_INVALID_FIELD_IN_PARAMS_LIST;
8540 *pagelen = parmlen;
8541 *rval = TRAN_ACCEPT;
8542 return (SATA_FAILURE);
8543 }
8544
8545 *pagelen = PAGELENGTH_INFO_EXCPT + sizeof (struct mode_page);
8546
8547 if (! (sata_id->ai_cmdset82 & SATA_SMART_SUPPORTED)) {
8548 *scsipkt->pkt_scbp = STATUS_CHECK;
8549 sense = sata_arq_sense(spx);
8550 sense->es_key = KEY_ILLEGAL_REQUEST;
8551 sense->es_add_code = SD_SCSI_ASC_INVALID_FIELD_IN_CDB;
8552 *pagelen = parmlen;
8553 *rval = TRAN_ACCEPT;
8554 return (SATA_FAILURE);
8555 }
8556
8557 /* If already in the state requested, we are done */
8558 if (page->dexcpt == ! (sata_id->ai_features85 & SATA_SMART_ENABLED)) {
8559 /* nothing to do */
8560 *rval = TRAN_ACCEPT;
8561 return (SATA_SUCCESS);
8562 }
8563
8564 scmd->satacmd_flags.sata_data_direction = SATA_DIR_NODATA_XFER;
8565
8566 /* Build SMART_ENABLE or SMART_DISABLE command */
8567 scmd->satacmd_addr_type = 0; /* N/A */
8568 scmd->satacmd_lba_mid_lsb = SMART_MAGIC_VAL_1;
8569 scmd->satacmd_lba_high_lsb = SMART_MAGIC_VAL_2;
8570 scmd->satacmd_features_reg = page->dexcpt ?
8571 SATA_SMART_DISABLE_OPS : SATA_SMART_ENABLE_OPS;
8572 scmd->satacmd_device_reg = 0; /* Always device 0 */
8573 scmd->satacmd_cmd_reg = SATAC_SMART;
8574
8575 /* Transfer command to HBA */
8576 if (sata_hba_start(spx, rval) != 0)
8577 /*
8578 * Pkt not accepted for execution.
8579 */
8580 return (SATA_FAILURE);
8581
8582 *dmod = 1; /* At least may have been modified */
8583
8584 /* Now process return */
8585 if (spx->txlt_sata_pkt->satapkt_reason == SATA_PKT_COMPLETED)
8586 return (SATA_SUCCESS);
8587
8588 /* Packet did not complete successfully */
8589 sata_xlate_errors(spx);
8590
8591 return (SATA_FAILURE);
8592 }
8593
8594 /*
8595 * Process mode select acoustic management control page 0x30
8596 *
8597 *
8598 * This function has to be called with a port mutex held.
8599 *
8600 * Returns SATA_SUCCESS if operation was successful, SATA_FAILURE otherwise.
8601 *
8602 * Cannot be called in the interrupt context.
8603 */
8604 int
sata_mode_select_page_30(sata_pkt_txlate_t * spx,struct mode_acoustic_management * page,int parmlen,int * pagelen,int * rval,int * dmod)8605 sata_mode_select_page_30(sata_pkt_txlate_t *spx, struct
8606 mode_acoustic_management *page, int parmlen, int *pagelen,
8607 int *rval, int *dmod)
8608 {
8609 struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
8610 sata_drive_info_t *sdinfo;
8611 sata_cmd_t *scmd = &spx->txlt_sata_pkt->satapkt_cmd;
8612 sata_id_t *sata_id;
8613 struct scsi_extended_sense *sense;
8614
8615 sdinfo = sata_get_device_info(spx->txlt_sata_hba_inst,
8616 &spx->txlt_sata_pkt->satapkt_device);
8617 sata_id = &sdinfo->satadrv_id;
8618 *dmod = 0;
8619
8620 /* If parmlen is too short or the feature is not supported, drop it */
8621 if (((PAGELENGTH_DAD_MODE_ACOUSTIC_MANAGEMENT +
8622 sizeof (struct mode_page)) > parmlen) ||
8623 (! (sata_id->ai_cmdset83 & SATA_ACOUSTIC_MGMT))) {
8624 *scsipkt->pkt_scbp = STATUS_CHECK;
8625 sense = sata_arq_sense(spx);
8626 sense->es_key = KEY_ILLEGAL_REQUEST;
8627 sense->es_add_code = SD_SCSI_ASC_INVALID_FIELD_IN_PARAMS_LIST;
8628 *pagelen = parmlen;
8629 *rval = TRAN_ACCEPT;
8630 return (SATA_FAILURE);
8631 }
8632
8633 *pagelen = PAGELENGTH_DAD_MODE_ACOUSTIC_MANAGEMENT +
8634 sizeof (struct mode_page);
8635
8636 /*
8637 * We can enable and disable acoustice management and
8638 * set the acoustic management level.
8639 */
8640
8641 /*
8642 * Set-up Internal SET FEATURES command(s)
8643 */
8644 scmd->satacmd_flags.sata_data_direction = SATA_DIR_NODATA_XFER;
8645 scmd->satacmd_addr_type = 0;
8646 scmd->satacmd_device_reg = 0;
8647 scmd->satacmd_status_reg = 0;
8648 scmd->satacmd_error_reg = 0;
8649 scmd->satacmd_cmd_reg = SATAC_SET_FEATURES;
8650 if (page->acoustic_manag_enable) {
8651 scmd->satacmd_features_reg = SATAC_SF_ENABLE_ACOUSTIC;
8652 scmd->satacmd_sec_count_lsb = page->acoustic_manag_level;
8653 } else { /* disabling acoustic management */
8654 scmd->satacmd_features_reg = SATAC_SF_DISABLE_ACOUSTIC;
8655 }
8656
8657 /* Transfer command to HBA */
8658 if (sata_hba_start(spx, rval) != 0)
8659 /*
8660 * Pkt not accepted for execution.
8661 */
8662 return (SATA_FAILURE);
8663
8664 /* Now process return */
8665 if (spx->txlt_sata_pkt->satapkt_reason != SATA_PKT_COMPLETED) {
8666 sata_xlate_errors(spx);
8667 return (SATA_FAILURE);
8668 }
8669
8670 *dmod = 1;
8671
8672 return (SATA_SUCCESS);
8673 }
8674
8675 /*
8676 * Process mode select power condition page 0x1a
8677 *
8678 * This function has to be called with a port mutex held.
8679 *
8680 * Returns SATA_SUCCESS if operation was successful, SATA_FAILURE otherwise.
8681 *
8682 * Cannot be called in the interrupt context.
8683 */
8684 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)8685 sata_mode_select_page_1a(sata_pkt_txlate_t *spx, struct
8686 mode_info_power_cond *page, int parmlen, int *pagelen,
8687 int *rval, int *dmod)
8688 {
8689 struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
8690 sata_drive_info_t *sdinfo;
8691 sata_cmd_t *scmd = &spx->txlt_sata_pkt->satapkt_cmd;
8692 sata_id_t *sata_id;
8693 struct scsi_extended_sense *sense;
8694 uint8_t ata_count;
8695 int i, len;
8696
8697 sdinfo = sata_get_device_info(spx->txlt_sata_hba_inst,
8698 &spx->txlt_sata_pkt->satapkt_device);
8699 sata_id = &sdinfo->satadrv_id;
8700 *dmod = 0;
8701
8702 len = sizeof (struct mode_info_power_cond);
8703 len += sizeof (struct mode_page);
8704
8705 /* If parmlen is too short or the feature is not supported, drop it */
8706 if ((len < parmlen) || (page->idle == 1) ||
8707 (!(sata_id->ai_cap & SATA_STANDBYTIMER) && page->standby == 1)) {
8708 *scsipkt->pkt_scbp = STATUS_CHECK;
8709 sense = sata_arq_sense(spx);
8710 sense->es_key = KEY_ILLEGAL_REQUEST;
8711 sense->es_add_code = SD_SCSI_ASC_INVALID_FIELD_IN_PARAMS_LIST;
8712 *pagelen = parmlen;
8713 *rval = TRAN_ACCEPT;
8714 return (SATA_FAILURE);
8715 }
8716
8717 *pagelen = len;
8718
8719 /*
8720 * Set-up Internal STANDBY command(s)
8721 */
8722 if (page->standby == 0)
8723 goto out;
8724
8725 ata_count = sata_get_standby_timer(page->standby_cond_timer);
8726
8727 scmd->satacmd_addr_type = 0;
8728 scmd->satacmd_sec_count_lsb = ata_count;
8729 scmd->satacmd_lba_low_lsb = 0;
8730 scmd->satacmd_lba_mid_lsb = 0;
8731 scmd->satacmd_lba_high_lsb = 0;
8732 scmd->satacmd_features_reg = 0;
8733 scmd->satacmd_device_reg = 0;
8734 scmd->satacmd_status_reg = 0;
8735 scmd->satacmd_cmd_reg = SATAC_STANDBY;
8736 scmd->satacmd_flags.sata_special_regs = B_TRUE;
8737 scmd->satacmd_flags.sata_copy_out_error_reg = B_TRUE;
8738
8739 /* Transfer command to HBA */
8740 if (sata_hba_start(spx, rval) != 0) {
8741 return (SATA_FAILURE);
8742 } else {
8743 if ((scmd->satacmd_error_reg != 0) ||
8744 (spx->txlt_sata_pkt->satapkt_reason !=
8745 SATA_PKT_COMPLETED)) {
8746 sata_xlate_errors(spx);
8747 return (SATA_FAILURE);
8748 }
8749 }
8750
8751 for (i = 0; i < 4; i++) {
8752 sdinfo->satadrv_standby_timer[i] = page->standby_cond_timer[i];
8753 }
8754 out:
8755 *dmod = 1;
8756 return (SATA_SUCCESS);
8757 }
8758
8759 /* Helper functions for manipulating struct log_parameter */
8760
8761 CTASSERT(sizeof (struct log_parameter) == 4);
8762
8763 static inline struct log_parameter *
log_param_next(struct log_parameter * lpp)8764 log_param_next(struct log_parameter *lpp)
8765 {
8766 uint8_t *ptr = (uint8_t *)lpp;
8767
8768 ptr += sizeof (*lpp) + lpp->param_len;
8769 return ((struct log_parameter *)ptr);
8770 }
8771
8772 static inline int
log_param_size(const struct log_parameter * last,const void * startp)8773 log_param_size(const struct log_parameter *last, const void *startp)
8774 {
8775 uintptr_t b = (uintptr_t)last;
8776 uintptr_t a = (uintptr_t)startp;
8777
8778 ASSERT3U(b, >=, a);
8779 return ((int)(b - a));
8780 }
8781
8782 /*
8783 * sata_build_lsense_page0() is used to create the
8784 * SCSI LOG SENSE page 0 (supported log pages)
8785 *
8786 * Currently supported pages are 0, 0x10, 0x2f, 0x30 and 0x0e
8787 * (supported log pages, self-test results, informational exceptions
8788 * Sun vendor specific ATA SMART data, and start stop cycle counter).
8789 *
8790 * Takes a sata_drive_info t * and the address of a buffer
8791 * in which to create the page information.
8792 *
8793 * Returns the number of bytes valid in the buffer.
8794 */
8795 static int
sata_build_lsense_page_0(sata_drive_info_t * sdinfo,uint8_t * buf)8796 sata_build_lsense_page_0(sata_drive_info_t *sdinfo, uint8_t *buf)
8797 {
8798 uint8_t *ptr = buf;
8799 sata_id_t *sata_id = &sdinfo->satadrv_id;
8800
8801 /* The supported log pages should be in ascending order */
8802 *ptr++ = PAGE_CODE_GET_SUPPORTED_LOG_PAGES;
8803
8804 if (sata_id->ai_cmdset84 & SATA_GPL_SUPPORTED) {
8805 *ptr++ = PAGE_CODE_READ_ERRORS;
8806 *ptr++ = PAGE_CODE_TEMPERATURE;
8807 }
8808
8809 if (sata_id->ai_cmdset82 & SATA_SMART_SUPPORTED) {
8810 *ptr++ = PAGE_CODE_START_STOP_CYCLE_COUNTER;
8811 if (sata_id->ai_cmdset84 & SATA_SMART_SELF_TEST_SUPPORTED) {
8812 *ptr++ = PAGE_CODE_SELF_TEST_RESULTS;
8813 }
8814 }
8815
8816 if (sata_id->ai_medrotrate == 0x01 &&
8817 (sata_id->ai_cmdset84 & SATA_GPL_SUPPORTED))
8818 *ptr++ = PAGE_CODE_SOLID_STATE_MEDIA;
8819
8820 if (sata_id->ai_cmdset84 & SATA_GPL_SUPPORTED) {
8821 *ptr++ = PAGE_CODE_GENERAL_STATS;
8822 }
8823
8824 if (sata_id->ai_cmdset82 & SATA_SMART_SUPPORTED) {
8825 *ptr++ = PAGE_CODE_INFORMATION_EXCEPTIONS;
8826 *ptr++ = PAGE_CODE_SMART_READ_DATA;
8827 }
8828
8829 return ((int)((uintptr_t)ptr - (uintptr_t)buf));
8830 }
8831
8832 static int
sata_build_lsense_page_03(sata_drive_info_t * sdinfo,uint8_t * buf,sata_hba_inst_t * sata_hba_inst)8833 sata_build_lsense_page_03(sata_drive_info_t *sdinfo, uint8_t *buf,
8834 sata_hba_inst_t *sata_hba_inst)
8835 {
8836 struct log_parameter *lpp = (struct log_parameter *)buf;
8837 uint64_t *lbuf;
8838 uint64_t param;
8839 int rval;
8840
8841 if (!(sdinfo->satadrv_id.ai_cmdset84 & SATA_GPL_SUPPORTED))
8842 return (-1);
8843
8844 lbuf = kmem_zalloc(512, KM_SLEEP);
8845 rval = sata_read_log_ext(sata_hba_inst, sdinfo, DEVICE_STATS_LOG,
8846 DEVSTAT_ROTATING_MEDIA_PAGE, lbuf, 1);
8847 if (rval == 0) {
8848 param = LE_64(lbuf[5]); /* Read recovery errors */
8849 if (SATA_STAT_SUPPORTED(param) && SATA_STAT_VALID(param)) {
8850 /* Total times corrected algorithm parameter */
8851 lpp->param_code[0] = 0x00;
8852 lpp->param_code[1] = 0x04;
8853 lpp->param_ctrl_flags = LOG_CTRL_LBIN;
8854 lpp->param_len = sizeof (uint32_t);
8855 BE_OUT32(&lpp->param_values[0],
8856 SATA_STAT_VALUE(param) & 0xffffffff);
8857
8858 lpp = log_param_next(lpp);
8859 }
8860 }
8861
8862 bzero(lbuf, 512);
8863 rval = sata_read_log_ext(sata_hba_inst, sdinfo, DEVICE_STATS_LOG,
8864 DEVSTAT_GENERAL_ERRORS_PAGE, lbuf, 1);
8865 if (rval == 0) {
8866 param = LE_64(lbuf[1]); /* Reported uncorrectable errors */
8867 if (SATA_STAT_SUPPORTED(param) && SATA_STAT_VALID(param)) {
8868 /* Total Uncorrected Errors parameter */
8869 lpp->param_code[0] = 0x00;
8870 lpp->param_code[1] = 0x06;
8871 lpp->param_ctrl_flags = LOG_CTRL_LBIN;
8872 lpp->param_len = sizeof (uint32_t);
8873 BE_OUT32(&lpp->param_values[0],
8874 SATA_STAT_VALUE(param) & 0xffffffff);
8875
8876 lpp = log_param_next(lpp);
8877 }
8878 }
8879
8880 kmem_free(lbuf, 512);
8881
8882 /*
8883 * If neither stat is supported, we treat it as the page not being
8884 * supported.
8885 */
8886 return (log_param_size(lpp, buf) > 0 ? log_param_size(lpp, buf) : -1);
8887 }
8888
8889 /*
8890 * sata_build_lsense_page_10() is used to create the
8891 * SCSI LOG SENSE page 0x10 (self-test results)
8892 *
8893 * Takes a sata_drive_info t * and the address of a buffer
8894 * in which to create the page information as well as a sata_hba_inst_t *.
8895 *
8896 * Returns the number of bytes valid in the buffer.
8897 *
8898 * Note: Self test and SMART data is accessible in device log pages.
8899 * The log pages can be accessed by SMART READ/WRITE LOG (up to 255 sectors
8900 * of data can be transferred by a single command), or by the General Purpose
8901 * Logging commands (GPL) READ LOG EXT and WRITE LOG EXT (up to 65,535 sectors
8902 * - approximately 33MB - can be transferred by a single command.
8903 * The SCT Command response (either error or command) is the same for both
8904 * the SMART and GPL methods of issuing commands.
8905 * This function uses READ LOG EXT command when drive supports LBA48, and
8906 * SMART READ command otherwise.
8907 *
8908 * Since above commands are executed in a synchronous mode, this function
8909 * should not be called in an interrupt context.
8910 */
8911 static int
sata_build_lsense_page_10(sata_drive_info_t * sdinfo,uint8_t * buf,sata_hba_inst_t * sata_hba_inst)8912 sata_build_lsense_page_10(
8913 sata_drive_info_t *sdinfo,
8914 uint8_t *buf,
8915 sata_hba_inst_t *sata_hba_inst)
8916 {
8917 struct log_parameter *lpp = (struct log_parameter *)buf;
8918 int rval;
8919
8920 if (sdinfo->satadrv_features_support & SATA_DEV_F_LBA48) {
8921 struct smart_ext_selftest_log *ext_selftest_log;
8922
8923 ext_selftest_log = kmem_zalloc(
8924 sizeof (struct smart_ext_selftest_log), KM_SLEEP);
8925
8926 rval = sata_ext_smart_selftest_read_log(sata_hba_inst, sdinfo,
8927 ext_selftest_log, 0);
8928 if (rval == 0) {
8929 int index, start_index;
8930 struct smart_ext_selftest_log_entry *entry;
8931 static const struct smart_ext_selftest_log_entry empty =
8932 {0};
8933 uint16_t block_num;
8934 int count;
8935 boolean_t only_one_block = B_FALSE;
8936
8937 index = ext_selftest_log->
8938 smart_ext_selftest_log_index[0];
8939 index |= ext_selftest_log->
8940 smart_ext_selftest_log_index[1] << 8;
8941 if (index == 0)
8942 goto out;
8943
8944 --index; /* Correct for 0 origin */
8945 start_index = index; /* remember where we started */
8946 block_num = index / ENTRIES_PER_EXT_SELFTEST_LOG_BLK;
8947 if (block_num != 0) {
8948 rval = sata_ext_smart_selftest_read_log(
8949 sata_hba_inst, sdinfo, ext_selftest_log,
8950 block_num);
8951 if (rval != 0)
8952 goto out;
8953 }
8954 index %= ENTRIES_PER_EXT_SELFTEST_LOG_BLK;
8955 entry =
8956 &ext_selftest_log->
8957 smart_ext_selftest_log_entries[index];
8958
8959 for (count = 1;
8960 count <= SCSI_ENTRIES_IN_LOG_SENSE_SELFTEST_RESULTS;
8961 ++count) {
8962 uint8_t status;
8963 uint8_t code;
8964 uint8_t sense_key;
8965 uint8_t add_sense_code;
8966 uint8_t add_sense_code_qual;
8967
8968 /* If this is an unused entry, we are done */
8969 if (bcmp(entry, &empty, sizeof (empty)) == 0) {
8970 /* Broken firmware on some disks */
8971 if (index + 1 ==
8972 ENTRIES_PER_EXT_SELFTEST_LOG_BLK) {
8973 --entry;
8974 --index;
8975 if (bcmp(entry, &empty,
8976 sizeof (empty)) == 0)
8977 goto out;
8978 } else
8979 goto out;
8980 }
8981
8982 if (only_one_block &&
8983 start_index == index)
8984 goto out;
8985
8986 lpp->param_code[0] = 0;
8987 lpp->param_code[1] = count;
8988 lpp->param_ctrl_flags =
8989 LOG_CTRL_LP | LOG_CTRL_LBIN;
8990 lpp->param_len =
8991 SCSI_LOG_SENSE_SELFTEST_PARAM_LEN;
8992
8993 status = entry->smart_ext_selftest_log_status;
8994 status >>= 4;
8995 switch (status) {
8996 case 0:
8997 default:
8998 sense_key = KEY_NO_SENSE;
8999 add_sense_code =
9000 SD_SCSI_ASC_NO_ADD_SENSE;
9001 add_sense_code_qual = 0;
9002 break;
9003 case 1:
9004 sense_key = KEY_ABORTED_COMMAND;
9005 add_sense_code =
9006 DIAGNOSTIC_FAILURE_ON_COMPONENT;
9007 add_sense_code_qual = SCSI_COMPONENT_81;
9008 break;
9009 case 2:
9010 sense_key = KEY_ABORTED_COMMAND;
9011 add_sense_code =
9012 DIAGNOSTIC_FAILURE_ON_COMPONENT;
9013 add_sense_code_qual = SCSI_COMPONENT_82;
9014 break;
9015 case 3:
9016 sense_key = KEY_ABORTED_COMMAND;
9017 add_sense_code =
9018 DIAGNOSTIC_FAILURE_ON_COMPONENT;
9019 add_sense_code_qual = SCSI_COMPONENT_83;
9020 break;
9021 case 4:
9022 sense_key = KEY_HARDWARE_ERROR;
9023 add_sense_code =
9024 DIAGNOSTIC_FAILURE_ON_COMPONENT;
9025 add_sense_code_qual = SCSI_COMPONENT_84;
9026 break;
9027 case 5:
9028 sense_key = KEY_HARDWARE_ERROR;
9029 add_sense_code =
9030 DIAGNOSTIC_FAILURE_ON_COMPONENT;
9031 add_sense_code_qual = SCSI_COMPONENT_85;
9032 break;
9033 case 6:
9034 sense_key = KEY_HARDWARE_ERROR;
9035 add_sense_code =
9036 DIAGNOSTIC_FAILURE_ON_COMPONENT;
9037 add_sense_code_qual = SCSI_COMPONENT_86;
9038 break;
9039 case 7:
9040 sense_key = KEY_MEDIUM_ERROR;
9041 add_sense_code =
9042 DIAGNOSTIC_FAILURE_ON_COMPONENT;
9043 add_sense_code_qual = SCSI_COMPONENT_87;
9044 break;
9045 case 8:
9046 sense_key = KEY_HARDWARE_ERROR;
9047 add_sense_code =
9048 DIAGNOSTIC_FAILURE_ON_COMPONENT;
9049 add_sense_code_qual = SCSI_COMPONENT_88;
9050 break;
9051 }
9052 code = 0; /* unspecified */
9053 status |= (code << 4);
9054 lpp->param_values[0] = status;
9055 lpp->param_values[1] = 0; /* unspecified */
9056 lpp->param_values[2] = entry->
9057 smart_ext_selftest_log_timestamp[1];
9058 lpp->param_values[3] = entry->
9059 smart_ext_selftest_log_timestamp[0];
9060 if (status != 0) {
9061 lpp->param_values[4] = 0;
9062 lpp->param_values[5] = 0;
9063 lpp->param_values[6] = entry->
9064 smart_ext_selftest_log_failing_lba
9065 [5];
9066 lpp->param_values[7] = entry->
9067 smart_ext_selftest_log_failing_lba
9068 [4];
9069 lpp->param_values[8] = entry->
9070 smart_ext_selftest_log_failing_lba
9071 [3];
9072 lpp->param_values[9] = entry->
9073 smart_ext_selftest_log_failing_lba
9074 [2];
9075 lpp->param_values[10] = entry->
9076 smart_ext_selftest_log_failing_lba
9077 [1];
9078 lpp->param_values[11] = entry->
9079 smart_ext_selftest_log_failing_lba
9080 [0];
9081 } else { /* No bad block address */
9082 lpp->param_values[4] = 0xff;
9083 lpp->param_values[5] = 0xff;
9084 lpp->param_values[6] = 0xff;
9085 lpp->param_values[7] = 0xff;
9086 lpp->param_values[8] = 0xff;
9087 lpp->param_values[9] = 0xff;
9088 lpp->param_values[10] = 0xff;
9089 lpp->param_values[11] = 0xff;
9090 }
9091
9092 lpp->param_values[12] = sense_key;
9093 lpp->param_values[13] = add_sense_code;
9094 lpp->param_values[14] = add_sense_code_qual;
9095 lpp->param_values[15] = 0; /* undefined */
9096
9097 lpp = (struct log_parameter *)
9098 (((uint8_t *)lpp) +
9099 SCSI_LOG_PARAM_HDR_LEN +
9100 SCSI_LOG_SENSE_SELFTEST_PARAM_LEN);
9101
9102 --index; /* Back up to previous entry */
9103 if (index < 0) {
9104 if (block_num > 0) {
9105 --block_num;
9106 } else {
9107 struct read_log_ext_directory
9108 logdir;
9109
9110 rval =
9111 sata_read_log_ext_directory(
9112 sata_hba_inst, sdinfo,
9113 &logdir);
9114 if (rval == -1)
9115 goto out;
9116 if ((logdir.read_log_ext_vers
9117 [0] == 0) &&
9118 (logdir.read_log_ext_vers
9119 [1] == 0))
9120 goto out;
9121 block_num =
9122 logdir.read_log_ext_nblks
9123 [EXT_SMART_SELFTEST_LOG_PAGE
9124 - 1][0];
9125 block_num |= logdir.
9126 read_log_ext_nblks
9127 [EXT_SMART_SELFTEST_LOG_PAGE
9128 - 1][1] << 8;
9129 --block_num;
9130 only_one_block =
9131 (block_num == 0);
9132 }
9133 rval = sata_ext_smart_selftest_read_log(
9134 sata_hba_inst, sdinfo,
9135 ext_selftest_log, block_num);
9136 if (rval != 0)
9137 goto out;
9138
9139 index =
9140 ENTRIES_PER_EXT_SELFTEST_LOG_BLK -
9141 1;
9142 }
9143 index %= ENTRIES_PER_EXT_SELFTEST_LOG_BLK;
9144 entry = &ext_selftest_log->
9145 smart_ext_selftest_log_entries[index];
9146 }
9147 }
9148 out:
9149 kmem_free(ext_selftest_log,
9150 sizeof (struct smart_ext_selftest_log));
9151 } else {
9152 struct smart_selftest_log *selftest_log;
9153
9154 selftest_log = kmem_zalloc(sizeof (struct smart_selftest_log),
9155 KM_SLEEP);
9156
9157 rval = sata_smart_selftest_log(sata_hba_inst, sdinfo,
9158 selftest_log);
9159
9160 if (rval == 0) {
9161 int index;
9162 int count;
9163 struct smart_selftest_log_entry *entry;
9164 static const struct smart_selftest_log_entry empty =
9165 { 0 };
9166
9167 index = selftest_log->smart_selftest_log_index;
9168 if (index == 0)
9169 goto done;
9170 --index; /* Correct for 0 origin */
9171 entry = &selftest_log->
9172 smart_selftest_log_entries[index];
9173 for (count = 1;
9174 count <= SCSI_ENTRIES_IN_LOG_SENSE_SELFTEST_RESULTS;
9175 ++count) {
9176 uint8_t status;
9177 uint8_t code;
9178 uint8_t sense_key;
9179 uint8_t add_sense_code;
9180 uint8_t add_sense_code_qual = 0;
9181
9182 if (bcmp(entry, &empty, sizeof (empty)) == 0)
9183 goto done;
9184
9185 lpp->param_code[0] = 0;
9186 lpp->param_code[1] = count;
9187 lpp->param_ctrl_flags =
9188 LOG_CTRL_LP | LOG_CTRL_LBIN;
9189 lpp->param_len =
9190 SCSI_LOG_SENSE_SELFTEST_PARAM_LEN;
9191
9192 status = entry->smart_selftest_log_status;
9193 status >>= 4;
9194 switch (status) {
9195 case 0:
9196 default:
9197 sense_key = KEY_NO_SENSE;
9198 add_sense_code =
9199 SD_SCSI_ASC_NO_ADD_SENSE;
9200 break;
9201 case 1:
9202 sense_key = KEY_ABORTED_COMMAND;
9203 add_sense_code =
9204 DIAGNOSTIC_FAILURE_ON_COMPONENT;
9205 add_sense_code_qual = SCSI_COMPONENT_81;
9206 break;
9207 case 2:
9208 sense_key = KEY_ABORTED_COMMAND;
9209 add_sense_code =
9210 DIAGNOSTIC_FAILURE_ON_COMPONENT;
9211 add_sense_code_qual = SCSI_COMPONENT_82;
9212 break;
9213 case 3:
9214 sense_key = KEY_ABORTED_COMMAND;
9215 add_sense_code =
9216 DIAGNOSTIC_FAILURE_ON_COMPONENT;
9217 add_sense_code_qual = SCSI_COMPONENT_83;
9218 break;
9219 case 4:
9220 sense_key = KEY_HARDWARE_ERROR;
9221 add_sense_code =
9222 DIAGNOSTIC_FAILURE_ON_COMPONENT;
9223 add_sense_code_qual = SCSI_COMPONENT_84;
9224 break;
9225 case 5:
9226 sense_key = KEY_HARDWARE_ERROR;
9227 add_sense_code =
9228 DIAGNOSTIC_FAILURE_ON_COMPONENT;
9229 add_sense_code_qual = SCSI_COMPONENT_85;
9230 break;
9231 case 6:
9232 sense_key = KEY_HARDWARE_ERROR;
9233 add_sense_code =
9234 DIAGNOSTIC_FAILURE_ON_COMPONENT;
9235 add_sense_code_qual = SCSI_COMPONENT_86;
9236 break;
9237 case 7:
9238 sense_key = KEY_MEDIUM_ERROR;
9239 add_sense_code =
9240 DIAGNOSTIC_FAILURE_ON_COMPONENT;
9241 add_sense_code_qual = SCSI_COMPONENT_87;
9242 break;
9243 case 8:
9244 sense_key = KEY_HARDWARE_ERROR;
9245 add_sense_code =
9246 DIAGNOSTIC_FAILURE_ON_COMPONENT;
9247 add_sense_code_qual = SCSI_COMPONENT_88;
9248 break;
9249 }
9250 code = 0; /* unspecified */
9251 status |= (code << 4);
9252 lpp->param_values[0] = status;
9253 lpp->param_values[1] = 0; /* unspecified */
9254 lpp->param_values[2] = entry->
9255 smart_selftest_log_timestamp[1];
9256 lpp->param_values[3] = entry->
9257 smart_selftest_log_timestamp[0];
9258 if (status != 0) {
9259 lpp->param_values[4] = 0;
9260 lpp->param_values[5] = 0;
9261 lpp->param_values[6] = 0;
9262 lpp->param_values[7] = 0;
9263 lpp->param_values[8] = entry->
9264 smart_selftest_log_failing_lba[3];
9265 lpp->param_values[9] = entry->
9266 smart_selftest_log_failing_lba[2];
9267 lpp->param_values[10] = entry->
9268 smart_selftest_log_failing_lba[1];
9269 lpp->param_values[11] = entry->
9270 smart_selftest_log_failing_lba[0];
9271 } else { /* No block address */
9272 lpp->param_values[4] = 0xff;
9273 lpp->param_values[5] = 0xff;
9274 lpp->param_values[6] = 0xff;
9275 lpp->param_values[7] = 0xff;
9276 lpp->param_values[8] = 0xff;
9277 lpp->param_values[9] = 0xff;
9278 lpp->param_values[10] = 0xff;
9279 lpp->param_values[11] = 0xff;
9280 }
9281 lpp->param_values[12] = sense_key;
9282 lpp->param_values[13] = add_sense_code;
9283 lpp->param_values[14] = add_sense_code_qual;
9284 lpp->param_values[15] = 0; /* undefined */
9285
9286 lpp = (struct log_parameter *)
9287 (((uint8_t *)lpp) +
9288 SCSI_LOG_PARAM_HDR_LEN +
9289 SCSI_LOG_SENSE_SELFTEST_PARAM_LEN);
9290 --index; /* back up to previous entry */
9291 if (index < 0) {
9292 index =
9293 NUM_SMART_SELFTEST_LOG_ENTRIES - 1;
9294 }
9295 entry = &selftest_log->
9296 smart_selftest_log_entries[index];
9297 }
9298 }
9299 done:
9300 kmem_free(selftest_log, sizeof (struct smart_selftest_log));
9301 }
9302
9303 return ((SCSI_LOG_PARAM_HDR_LEN + SCSI_LOG_SENSE_SELFTEST_PARAM_LEN) *
9304 SCSI_ENTRIES_IN_LOG_SENSE_SELFTEST_RESULTS);
9305 }
9306
9307 static uint8_t
sata_sct_temp(sata_hba_inst_t * sata_hba_inst,sata_drive_info_t * sdinfo,void * p,size_t lbufsz)9308 sata_sct_temp(sata_hba_inst_t *sata_hba_inst, sata_drive_info_t *sdinfo,
9309 void *p, size_t lbufsz)
9310 {
9311 sata_id_t *sata_id = &sdinfo->satadrv_id;
9312 uint8_t *lbuf = p;
9313 int rval;
9314 uint8_t temp;
9315
9316 /* The log buffer we use should be at least 1 block in size */
9317 ASSERT3U(lbufsz, >=, 512);
9318
9319 if ((sata_id->ai_sctsupport & SATA_SCT_CMD_TRANS_SUP) == 0)
9320 return (SCSI_NO_TEMP);
9321
9322 bzero(lbuf, lbufsz);
9323 rval = sata_smart_read_log(sata_hba_inst, sdinfo, lbuf,
9324 SCT_STATUS_LOG_PAGE, 1);
9325 if (rval == -1)
9326 return (SCSI_NO_TEMP);
9327
9328 /*
9329 * ACS-3 8.2.5 Table 186 -- If the value is 0x80, the field (HDA TEMP)
9330 * is not valid)
9331 */
9332 temp = lbuf[200];
9333 if (temp == 0x80)
9334 return (SCSI_NO_TEMP);
9335
9336 /*
9337 * SATA temps are signed (with 0x80 being a sentinel value indicating
9338 * not valid as noted above). SAT-5 says that values below 0 are
9339 * truncated to 0.
9340 */
9341 if ((temp & 0x80) != 0)
9342 return (0);
9343
9344 return (temp);
9345 }
9346
9347
9348 /*
9349 * sata_build_lsense_page_2f() is used to create the
9350 * SCSI LOG SENSE page 0x2f (informational exceptions)
9351 *
9352 * Takes a sata_drive_info t * and the address of a buffer
9353 * in which to create the page information as well as a sata_hba_inst_t *.
9354 *
9355 * Returns the number of bytes valid in the buffer.
9356 *
9357 * Because it invokes function(s) that send synchronously executed command
9358 * to the HBA, it cannot be called in the interrupt context.
9359 */
9360 static int
sata_build_lsense_page_2f(sata_drive_info_t * sdinfo,uint8_t * buf,sata_hba_inst_t * sata_hba_inst)9361 sata_build_lsense_page_2f(
9362 sata_drive_info_t *sdinfo,
9363 uint8_t *buf,
9364 sata_hba_inst_t *sata_hba_inst)
9365 {
9366 struct log_parameter *lpp = (struct log_parameter *)buf;
9367 int rval;
9368 uint8_t *smart_data;
9369 uint8_t temp;
9370 sata_id_t *sata_id;
9371
9372 lpp->param_code[0] = 0;
9373 lpp->param_code[1] = 0;
9374 lpp->param_ctrl_flags = LOG_CTRL_LP | LOG_CTRL_LBIN;
9375
9376 /* Now get the SMART status w.r.t. threshold exceeded */
9377 rval = sata_fetch_smart_return_status(sata_hba_inst, sdinfo);
9378 switch (rval) {
9379 case 1:
9380 lpp->param_values[0] = SCSI_PREDICTED_FAILURE;
9381 lpp->param_values[1] = SCSI_GENERAL_HD_FAILURE;
9382 break;
9383 case 0:
9384 case -1: /* failed to get data */
9385 lpp->param_values[0] = 0; /* No failure predicted */
9386 lpp->param_values[1] = 0;
9387 break;
9388 #if defined(SATA_DEBUG)
9389 default:
9390 cmn_err(CE_PANIC, "sata_build_lsense_page_2f bad return value");
9391 /* NOTREACHED */
9392 #endif
9393 }
9394
9395 sata_id = &sdinfo->satadrv_id;
9396 if (! (sata_id->ai_sctsupport & SATA_SCT_CMD_TRANS_SUP)) {
9397 temp = SCSI_NO_TEMP;
9398 } else {
9399 /* Now get the temperature */
9400 smart_data = kmem_zalloc(512, KM_SLEEP);
9401 temp = sata_sct_temp(sata_hba_inst, sdinfo, smart_data, 512);
9402 kmem_free(smart_data, 512);
9403 }
9404
9405 lpp->param_values[2] = temp; /* most recent temperature */
9406 lpp->param_values[3] = 0; /* required vendor specific byte */
9407
9408 lpp->param_len = SCSI_INFO_EXCEPTIONS_PARAM_LEN;
9409
9410
9411 return (SCSI_INFO_EXCEPTIONS_PARAM_LEN + SCSI_LOG_PARAM_HDR_LEN);
9412 }
9413
9414 static int
sata_build_lsense_page_0d(sata_drive_info_t * sdinfo,uint8_t * buf,sata_hba_inst_t * sata_hba_inst)9415 sata_build_lsense_page_0d(sata_drive_info_t *sdinfo, uint8_t *buf,
9416 sata_hba_inst_t *sata_hba_inst)
9417 {
9418 struct log_parameter *lpp = (struct log_parameter *)buf;
9419 uint64_t *lbuf;
9420 uint64_t param;
9421 int rval;
9422 uint8_t temp, ref_temp, sct_temp;
9423
9424 if (!(sdinfo->satadrv_id.ai_sctsupport & SATA_SCT_CMD_TRANS_SUP) &&
9425 !(sdinfo->satadrv_id.ai_cmdset84 & SATA_GPL_SUPPORTED))
9426 return (-1);
9427
9428 temp = ref_temp = sct_temp = SCSI_NO_TEMP;
9429
9430 lbuf = kmem_zalloc(512, KM_SLEEP);
9431 sct_temp = sata_sct_temp(sata_hba_inst, sdinfo, lbuf, 512);
9432
9433 bzero(lbuf, 512);
9434
9435 rval = sata_read_log_ext(sata_hba_inst, sdinfo, DEVICE_STATS_LOG,
9436 DEVSTAT_TEMP_PAGE, lbuf, 1);
9437 if (rval == -1)
9438 goto done;
9439
9440 param = LE_64(lbuf[1]); /* Current temperature */
9441 if (SATA_STAT_SUPPORTED(param) && SATA_STAT_VALID(param)) {
9442 /*
9443 * SAT-5 10.3.13.2 Table 136 says that only positive
9444 * temperatures (SATA temps are signed 8-bit values) -- i.e.
9445 * bit 7 is 0 are translated, otherwise 0xff (SCSI_NO_TEMP)
9446 * is returned.
9447 */
9448 temp = SATA_STAT_VALUE(param) & 0xff;
9449 if ((temp & 0x80) != 0)
9450 temp = SCSI_NO_TEMP;
9451 }
9452
9453 param = LE_64(lbuf[11]); /* Max operating temp */
9454 if (SATA_STAT_SUPPORTED(param) && SATA_STAT_VALID(param)) {
9455 /*
9456 * Interestingly, for the reference temperature, while the
9457 * SATA value is also an 8-bit signed value), SAT-5 10.3.13.3
9458 * Table 137 says that negative temps are translated to 0
9459 * unlike the current temperature.
9460 */
9461 int8_t val = (int8_t)(SATA_STAT_VALUE(param) & 0xff);
9462 ref_temp = (val < 0) ? 0 : val;
9463 }
9464
9465 rval = 0;
9466
9467 done:
9468 kmem_free(lbuf, 512);
9469
9470 /*
9471 * If we support SCT or GPL, we'll always return a value, even if
9472 * that value is SCSI_NO_TEMP (as it may be a transient issue and
9473 * appears to be allowable per SPC-5).
9474 */
9475
9476 lpp->param_code[0] = 0;
9477 lpp->param_code[1] = 0;
9478 lpp->param_ctrl_flags = LOG_CTRL_LP | LOG_CTRL_LBIN;
9479 lpp->param_len = 2;
9480 lpp->param_values[0] = 0; /* Reserved */
9481
9482 /*
9483 * Per SAT-5 10.3.13.2 Table 136, The SCT temp is used if
9484 * valid, otherwise the current temp from the temp statistics page
9485 * is used.
9486 */
9487 lpp->param_values[1] = (sct_temp != SCSI_NO_TEMP) ? sct_temp : temp;
9488
9489 lpp = log_param_next(lpp);
9490
9491 if (ref_temp != SCSI_NO_TEMP) {
9492 lpp->param_code[0] = 0x00;
9493 lpp->param_code[1] = 0x01; /* Reference Temperature */
9494 lpp->param_ctrl_flags = LOG_CTRL_LP | LOG_CTRL_LBIN;
9495 lpp->param_len = 2;
9496 lpp->param_values[0] = 0; /* Resreved */
9497 lpp->param_values[1] = ref_temp;
9498
9499 lpp = log_param_next(lpp);
9500 }
9501
9502 return (log_param_size(lpp, buf));
9503 }
9504
9505 /*
9506 * sata_build_lsense_page_30() is used to create the
9507 * SCSI LOG SENSE page 0x30 (Sun's vendor specific page for ATA SMART data).
9508 *
9509 * Takes a sata_drive_info t * and the address of a buffer
9510 * in which to create the page information as well as a sata_hba_inst_t *.
9511 *
9512 * Returns the number of bytes valid in the buffer.
9513 */
9514 static int
sata_build_lsense_page_30(sata_drive_info_t * sdinfo,uint8_t * buf,sata_hba_inst_t * sata_hba_inst)9515 sata_build_lsense_page_30(
9516 sata_drive_info_t *sdinfo,
9517 uint8_t *buf,
9518 sata_hba_inst_t *sata_hba_inst)
9519 {
9520 struct smart_data *smart_data = (struct smart_data *)buf;
9521 int rval;
9522
9523 /* Now do the SMART READ DATA */
9524 rval = sata_fetch_smart_data(sata_hba_inst, sdinfo, smart_data);
9525 if (rval == -1)
9526 return (0);
9527
9528 return (sizeof (struct smart_data));
9529 }
9530
9531 /*
9532 * sata_build_lsense_page_0e() is used to create the
9533 * SCSI LOG SENSE page 0e (start-stop cycle counter page)
9534 *
9535 * Date of Manufacture (0x0001)
9536 * YEAR = "0000"
9537 * WEEK = "00"
9538 * Accounting Date (0x0002)
9539 * 6 ASCII space character(20h)
9540 * Specified cycle count over device lifetime
9541 * VALUE - THRESH - the delta between max and min;
9542 * Accumulated start-stop cycles
9543 * VALUE - WORST - the accumulated cycles;
9544 *
9545 * ID FLAG THRESH VALUE WORST RAW on start/stop counter attribute
9546 *
9547 * Takes a sata_drive_info t * and the address of a buffer
9548 * in which to create the page information as well as a sata_hba_inst_t *.
9549 *
9550 * Returns the number of bytes valid in the buffer.
9551 */
9552 static int
sata_build_lsense_page_0e(sata_drive_info_t * sdinfo,uint8_t * buf,sata_pkt_txlate_t * spx)9553 sata_build_lsense_page_0e(sata_drive_info_t *sdinfo, uint8_t *buf,
9554 sata_pkt_txlate_t *spx)
9555 {
9556 struct start_stop_cycle_counter_log *log_page;
9557 int i, rval, index;
9558 uint8_t smart_data[512], id, value, worst, thresh;
9559 uint32_t max_count, cycles;
9560
9561 /* Now do the SMART READ DATA */
9562 rval = sata_fetch_smart_data(spx->txlt_sata_hba_inst, sdinfo,
9563 (struct smart_data *)smart_data);
9564 if (rval == -1)
9565 return (0);
9566 for (i = 0, id = 0; i < SMART_START_STOP_COUNT_ID * 2; i++) {
9567 index = (i * 12) + 2;
9568 id = smart_data[index];
9569 if (id != SMART_START_STOP_COUNT_ID)
9570 continue;
9571 else {
9572 thresh = smart_data[index + 2];
9573 value = smart_data[index + 3];
9574 worst = smart_data[index + 4];
9575 break;
9576 }
9577 }
9578 if (id != SMART_START_STOP_COUNT_ID)
9579 return (0);
9580 max_count = value - thresh;
9581 cycles = value - worst;
9582
9583 log_page = (struct start_stop_cycle_counter_log *)buf;
9584 bzero(log_page, sizeof (struct start_stop_cycle_counter_log));
9585 log_page->code = 0x0e;
9586 log_page->page_len_low = 0x24;
9587
9588 log_page->manufactor_date_low = 0x1;
9589 log_page->param_1.fmt_link = 0x1; /* 01b */
9590 log_page->param_len_1 = 0x06;
9591 for (i = 0; i < 4; i++) {
9592 log_page->year_manu[i] = 0x30;
9593 if (i < 2)
9594 log_page->week_manu[i] = 0x30;
9595 }
9596
9597 log_page->account_date_low = 0x02;
9598 log_page->param_2.fmt_link = 0x01; /* 01b */
9599 log_page->param_len_2 = 0x06;
9600 for (i = 0; i < 4; i++) {
9601 log_page->year_account[i] = 0x20;
9602 if (i < 2)
9603 log_page->week_account[i] = 0x20;
9604 }
9605
9606 log_page->lifetime_code_low = 0x03;
9607 log_page->param_3.fmt_link = 0x03; /* 11b */
9608 log_page->param_len_3 = 0x04;
9609 /* VALUE - THRESH - the delta between max and min */
9610 log_page->cycle_code_low = 0x04;
9611 log_page->param_4.fmt_link = 0x03; /* 11b */
9612 log_page->param_len_4 = 0x04;
9613 /* WORST - THRESH - the distance from 'now' to min */
9614
9615 for (i = 0; i < 4; i++) {
9616 log_page->cycle_lifetime[i] =
9617 (max_count >> (8 * (3 - i))) & 0xff;
9618 log_page->cycle_accumulated[i] =
9619 (cycles >> (8 * (3 - i))) & 0xff;
9620 }
9621
9622 return (sizeof (struct start_stop_cycle_counter_log));
9623 }
9624
9625 static int
sata_build_lsense_page_11(sata_drive_info_t * sdinfo,uint8_t * buf,sata_hba_inst_t * sata_hba_inst)9626 sata_build_lsense_page_11(sata_drive_info_t *sdinfo, uint8_t *buf,
9627 sata_hba_inst_t *sata_hba_inst)
9628 {
9629 struct log_parameter *lpp = (struct log_parameter *)buf;
9630 uint64_t *lbuf;
9631 uint64_t param;
9632 int rval = 0;
9633
9634 /* Check if device is SSD */
9635 if (sdinfo->satadrv_id.ai_medrotrate != 0x01 ||
9636 !(sdinfo->satadrv_id.ai_cmdset84 & SATA_GPL_SUPPORTED)) {
9637 return (-1);
9638 }
9639
9640 lbuf = kmem_zalloc(512, KM_SLEEP);
9641 rval = sata_read_log_ext(sata_hba_inst, sdinfo, DEVICE_STATS_LOG,
9642 DEVSTAT_SSD_PAGE, lbuf, 1);
9643 if (rval == -1)
9644 goto done;
9645
9646 param = LE_64(lbuf[1]); /* %-age used endurance indicator */
9647 if (!SATA_STAT_SUPPORTED(param) || !SATA_STAT_VALID(param)) {
9648 /*
9649 * If the wear stat isn't supported or valid, the SAT-5
9650 * says this is unspecified. We'll treat it as the
9651 * log page being unsupported.
9652 */
9653 rval = -1;
9654 goto done;
9655 }
9656
9657 lpp->param_code[0] = 0x00;
9658 lpp->param_code[1] = 0x01;
9659 lpp->param_ctrl_flags = LOG_CTRL_LP | LOG_CTRL_LBIN;
9660 lpp->param_len = 4;
9661 BE_OUT32(&lpp->param_values[0], SATA_STAT_VALUE(param) & 0xffffffff);
9662
9663 lpp = log_param_next(lpp);
9664
9665 done:
9666 kmem_free(lbuf, 512);
9667 return ((rval < 0) ? -1 : log_param_size(lpp, buf));
9668 }
9669
9670 static int
sata_build_lsense_page_19(sata_drive_info_t * sdinfo,uint8_t * buf,sata_hba_inst_t * sata_hba_inst)9671 sata_build_lsense_page_19(sata_drive_info_t *sdinfo, uint8_t *buf,
9672 sata_hba_inst_t *sata_hba_inst)
9673 {
9674 /*
9675 * The indexes into lbuf (the SATA general statistics log)
9676 * that correspond to the values of the general access statistics
9677 * and performance log values. -1 means there is no mapping (e.g.
9678 * write 0 for that value).
9679 */
9680 static const int stat_idx[] = {
9681 6, /* # of read commands */
9682 4, /* # of write commands */
9683 3, /* Logical sectors written */
9684 5, /* Logical sectors read */
9685 -1, -1, -1, -1
9686 };
9687
9688 struct log_parameter *lpp = (struct log_parameter *)buf;
9689 uint64_t *lbuf;
9690 uint64_t *paramp;
9691 uint64_t param;
9692 uint_t nvalid;
9693 int rval;
9694
9695 if (!(sdinfo->satadrv_id.ai_cmdset84 & SATA_GPL_SUPPORTED))
9696 return (-1);
9697
9698 nvalid = 0;
9699
9700 lbuf = kmem_zalloc(512, KM_SLEEP);
9701 rval = sata_read_log_ext(sata_hba_inst, sdinfo, DEVICE_STATS_LOG,
9702 DEVSTAT_GENERAL_STATS, lbuf, 1);
9703 if (rval == -1) {
9704 kmem_free(lbuf, 512);
9705 return (-1);
9706 }
9707
9708 lpp->param_code[0] = 0x00;
9709 lpp->param_code[1] = 0x01;
9710 /*
9711 * SPC-5 and SAT-5 disagree on this value -- SPC-5 7.3.9.2 says this
9712 * should be an unbounded data counter (10b LOG_CTRL_LBIN) while SAT-5
9713 * 10.3.4.2 Table 110 says this should be a binary format list (11b
9714 * aka LOG_CTRL_LP | LOG_CTRL_LBIN). Since SAT-5 is a bit more
9715 * explicit on the value, we've followed it. So far no software
9716 * has been uncovered to date that seems to care about the value, but
9717 * it may need to be updated of the two specs are ever brought into
9718 * agreement.
9719 */
9720 lpp->param_ctrl_flags = LOG_CTRL_LP | LOG_CTRL_LBIN;
9721 lpp->param_len = 0x40;
9722
9723 paramp = (uint64_t *)&lpp->param_values[0];
9724
9725 /* Zero out all of parameter values */
9726 bzero(paramp, 0x40);
9727
9728 /* The stat parameters are 48 bits long */
9729 #define PARAM_VAL(x) ((x) & ((1ULL << 48) - 1))
9730
9731 for (uint_t i = 0; i < ARRAY_SIZE(stat_idx); i++, paramp++) {
9732 if (stat_idx[i] == -1) {
9733 continue;
9734 }
9735
9736 param = LE_64(lbuf[stat_idx[i]]);
9737
9738 if (SATA_STAT_SUPPORTED(param) && SATA_STAT_VALID(param)) {
9739 BE_OUT64(paramp, PARAM_VAL(param));
9740 nvalid++;
9741 }
9742 }
9743 #undef PARAM_VAL
9744
9745 kmem_free(lbuf, 512);
9746
9747 /* We must return at least one valid value for this page */
9748 if (nvalid == 0)
9749 return (-1);
9750
9751 /*
9752 * SPC-5 says that the IDLE TIME and TIME INTERVAL parameters
9753 * are mandatory, but SAT-5 gives no mention of either parameter.
9754 * Some utilities (e.g. sg3_utils) strictly follow the guidance of
9755 * SPC-5 and expect all three parameters, so we generate dummy
9756 * values for the IDLE TIME and TIME INTERVAL parameters.
9757 */
9758 lpp = log_param_next(lpp);
9759
9760 /* IDLE TIME */
9761 lpp->param_code[0] = 0x00;
9762 lpp->param_code[1] = 0x02;
9763 lpp->param_ctrl_flags = LOG_CTRL_LP;
9764 lpp->param_len = 0x08;
9765
9766 /*
9767 * The value is an 64-bit unsigned int, the address is almost
9768 * certainly going to be unaligned, so just set each byte
9769 * individually.
9770 */
9771 lpp->param_values[0] = lpp->param_values[1] = lpp->param_values[2] =
9772 lpp->param_values[3] = lpp->param_values[4] =
9773 lpp->param_values[5] = lpp->param_values[6] =
9774 lpp->param_values[7] = 0;
9775 lpp = log_param_next(lpp);
9776
9777 /* TIME INTERVAL */
9778 lpp->param_code[0] = 0x00;
9779 lpp->param_code[1] = 0x03;
9780 lpp->param_ctrl_flags = LOG_CTRL_LP | LOG_CTRL_LBIN;
9781 lpp->param_len = 0x08;
9782
9783 uint32_t *vp = (uint32_t *)&lpp->param_values;
9784
9785 /*
9786 * SPC-5 7.3.6.7 -- The TIME INTERVAL parameter consists of
9787 * two 32-bit unsigned ints -- EXPONENT and INTEGER.
9788 * EXPONENT is the _negative_ power of ten (e.g. '3' implies
9789 * 10^-3) and INTEGER is the mantissa (e.g. the actual value
9790 * is INTEGER * 10^(-EXPONENT)).
9791 *
9792 * SPC-5 isn't completely clear on this, but from the description
9793 * of the fields of the General Access Statistics and Performance
9794 * log parameter in section 7.3.9.2, it implies that the TIME INTERVAL
9795 * parameter is used to in conjunction with the {READ,WRITE} COMMAND
9796 * PROCESSING INTERVAL statistics value. Since these values do not
9797 * have a translation defined (there doesn't appear to be any
9798 * equivalent statistic in any SATA log page), we always return
9799 * 0 for these stats. As a TIME INTERVAL of 0^-0 would be nonsensical
9800 * (and mathematically undefined), we choose an arbitrary interval of
9801 * 1ms (1 * 10^-3).
9802 */
9803 BE_OUT32(vp, 3);
9804 vp++;
9805 BE_OUT32(vp, 1);
9806
9807 lpp = log_param_next(lpp);
9808
9809 return (log_param_size(lpp, buf));
9810 }
9811
9812
9813 /*
9814 * This function was used for build a ATA read verify sector command
9815 */
9816 static void
sata_build_read_verify_cmd(sata_cmd_t * scmd,uint16_t sec,uint64_t lba)9817 sata_build_read_verify_cmd(sata_cmd_t *scmd, uint16_t sec, uint64_t lba)
9818 {
9819 scmd->satacmd_cmd_reg = SATAC_RDVER;
9820 scmd->satacmd_addr_type = ATA_ADDR_LBA28;
9821 scmd->satacmd_flags.sata_special_regs = B_TRUE;
9822
9823 scmd->satacmd_sec_count_lsb = sec & 0xff;
9824 scmd->satacmd_lba_low_lsb = lba & 0xff;
9825 scmd->satacmd_lba_mid_lsb = (lba >> 8) & 0xff;
9826 scmd->satacmd_lba_high_lsb = (lba >> 16) & 0xff;
9827 scmd->satacmd_device_reg = (SATA_ADH_LBA | ((lba >> 24) & 0xf));
9828 scmd->satacmd_features_reg = 0;
9829 scmd->satacmd_status_reg = 0;
9830 scmd->satacmd_error_reg = 0;
9831 }
9832
9833 /*
9834 * This function was used for building an ATA
9835 * command, and only command register need to
9836 * be defined, other register will be zero or na.
9837 */
9838 static void
sata_build_generic_cmd(sata_cmd_t * scmd,uint8_t cmd)9839 sata_build_generic_cmd(sata_cmd_t *scmd, uint8_t cmd)
9840 {
9841 scmd->satacmd_addr_type = 0;
9842 scmd->satacmd_cmd_reg = cmd;
9843 scmd->satacmd_device_reg = 0;
9844 scmd->satacmd_sec_count_lsb = 0;
9845 scmd->satacmd_lba_low_lsb = 0;
9846 scmd->satacmd_lba_mid_lsb = 0;
9847 scmd->satacmd_lba_high_lsb = 0;
9848 scmd->satacmd_features_reg = 0;
9849 scmd->satacmd_status_reg = 0;
9850 scmd->satacmd_error_reg = 0;
9851 scmd->satacmd_flags.sata_special_regs = B_TRUE;
9852 }
9853
9854 /*
9855 * This function was used for changing the standby
9856 * timer format from SCSI to ATA.
9857 */
9858 static uint8_t
sata_get_standby_timer(uint8_t * timer)9859 sata_get_standby_timer(uint8_t *timer)
9860 {
9861 uint32_t i = 0, count = 0;
9862 uint8_t ata_count;
9863
9864 for (i = 0; i < 4; i++) {
9865 count = count << 8 | timer[i];
9866 }
9867
9868 if (count == 0)
9869 return (0);
9870
9871 if (count >= 1 && count <= 12000)
9872 ata_count = (count -1) / 50 + 1;
9873 else if (count > 12000 && count <= 12600)
9874 ata_count = 0xfc;
9875 else if (count > 12601 && count <= 12750)
9876 ata_count = 0xff;
9877 else if (count > 12750 && count <= 17999)
9878 ata_count = 0xf1;
9879 else if (count > 18000 && count <= 198000)
9880 ata_count = count / 18000 + 240;
9881 else
9882 ata_count = 0xfd;
9883 return (ata_count);
9884 }
9885
9886 /* ************************** ATAPI-SPECIFIC FUNCTIONS ********************** */
9887
9888 /*
9889 * Start command for ATAPI device.
9890 * This function processes scsi_pkt requests.
9891 * Now CD/DVD, tape and ATAPI disk devices are supported.
9892 * Most commands are packet without any translation into Packet Command.
9893 * Some may be trapped and executed as SATA commands (not clear which one).
9894 *
9895 * Returns TRAN_ACCEPT if command is accepted for execution (or completed
9896 * execution).
9897 * Returns other TRAN_XXXX codes if command is not accepted or completed
9898 * (see return values for sata_hba_start()).
9899 *
9900 * Note:
9901 * Inquiry cdb format differs between transport version 2 and 3.
9902 * However, the transport version 3 devices that were checked did not adhere
9903 * to the specification (ignored MSB of the allocation length). Therefore,
9904 * the transport version is not checked, but Inquiry allocation length is
9905 * truncated to 255 bytes if the original allocation length set-up by the
9906 * target driver is greater than 255 bytes.
9907 */
9908 static int
sata_txlt_atapi(sata_pkt_txlate_t * spx)9909 sata_txlt_atapi(sata_pkt_txlate_t *spx)
9910 {
9911 struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
9912 sata_cmd_t *scmd = &spx->txlt_sata_pkt->satapkt_cmd;
9913 struct buf *bp = spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp;
9914 sata_hba_inst_t *sata_hba = SATA_TXLT_HBA_INST(spx);
9915 sata_drive_info_t *sdinfo = sata_get_device_info(sata_hba,
9916 &spx->txlt_sata_pkt->satapkt_device);
9917 kmutex_t *cport_mutex = &(SATA_TXLT_CPORT_MUTEX(spx));
9918 int cdblen;
9919 int rval, reason;
9920 int synch;
9921 union scsi_cdb *cdbp = (union scsi_cdb *)scsipkt->pkt_cdbp;
9922
9923 mutex_enter(cport_mutex);
9924
9925 if (((rval = sata_txlt_generic_pkt_info(spx, &reason, 0)) !=
9926 TRAN_ACCEPT) || (reason == CMD_DEV_GONE)) {
9927 mutex_exit(cport_mutex);
9928 return (rval);
9929 }
9930
9931 /*
9932 * ATAPI device executes some ATA commands in addition to those
9933 * commands sent via PACKET command. These ATA commands may be
9934 * executed by the regular SATA translation functions. None needs
9935 * to be captured now.
9936 *
9937 * Commands sent via PACKET command include:
9938 * MMC command set for ATAPI CD/DVD device
9939 * SSC command set for ATAPI TAPE device
9940 * SBC command set for ATAPI disk device
9941 *
9942 */
9943
9944 /* Check the size of cdb */
9945
9946 switch (GETGROUP(cdbp)) {
9947 case CDB_GROUPID_3: /* Reserved, per SPC-4 */
9948 /*
9949 * opcodes 0x7e and 0x7f identify variable-length CDBs and
9950 * therefore require special handling. Return failure, for now.
9951 */
9952 mutex_exit(cport_mutex);
9953 return (TRAN_BADPKT);
9954
9955 case CDB_GROUPID_6: /* Vendor-specific, per SPC-4 */
9956 case CDB_GROUPID_7: /* Vendor-specific, per SPC-4 */
9957 /* obtain length from the scsi_pkt */
9958 cdblen = scsipkt->pkt_cdblen;
9959 break;
9960
9961 default:
9962 /* CDB's length is statically known, per SPC-4 */
9963 cdblen = scsi_cdb_size[GETGROUP(cdbp)];
9964 break;
9965 }
9966
9967 if (cdblen <= 0 || cdblen > sdinfo->satadrv_atapi_cdb_len) {
9968 sata_log(NULL, CE_WARN,
9969 "sata: invalid ATAPI cdb length %d",
9970 cdblen);
9971 mutex_exit(cport_mutex);
9972 return (TRAN_BADPKT);
9973 }
9974
9975 SATAATAPITRACE(spx, cdblen);
9976
9977 /*
9978 * For non-read/write commands we need to
9979 * map buffer
9980 */
9981 switch ((uint_t)scsipkt->pkt_cdbp[0]) {
9982 case SCMD_READ:
9983 case SCMD_READ_G1:
9984 case SCMD_READ_G5:
9985 case SCMD_READ_G4:
9986 case SCMD_WRITE:
9987 case SCMD_WRITE_G1:
9988 case SCMD_WRITE_G5:
9989 case SCMD_WRITE_G4:
9990 break;
9991 default:
9992 if (bp != NULL) {
9993 if (bp->b_flags & (B_PHYS | B_PAGEIO))
9994 bp_mapin(bp);
9995 }
9996 break;
9997 }
9998 /*
9999 * scmd->satacmd_flags.sata_data_direction default -
10000 * SATA_DIR_NODATA_XFER - is set by
10001 * sata_txlt_generic_pkt_info().
10002 */
10003 if (scmd->satacmd_bp) {
10004 if (scmd->satacmd_bp->b_flags & B_READ) {
10005 scmd->satacmd_flags.sata_data_direction = SATA_DIR_READ;
10006 } else {
10007 scmd->satacmd_flags.sata_data_direction =
10008 SATA_DIR_WRITE;
10009 }
10010 }
10011
10012 /*
10013 * Set up ATAPI packet command.
10014 */
10015
10016 sata_atapi_packet_cmd_setup(scmd, sdinfo);
10017
10018 /* Copy cdb into sata_cmd */
10019 scmd->satacmd_acdb_len = sdinfo->satadrv_atapi_cdb_len;
10020 bzero(scmd->satacmd_acdb, SATA_ATAPI_MAX_CDB_LEN);
10021 bcopy(cdbp, scmd->satacmd_acdb, cdblen);
10022
10023 /* See note in the command header */
10024 if (scmd->satacmd_acdb[0] == SCMD_INQUIRY) {
10025 if (scmd->satacmd_acdb[3] != 0)
10026 scmd->satacmd_acdb[4] = 255;
10027 }
10028
10029 #ifdef SATA_DEBUG
10030 if (sata_debug_flags & SATA_DBG_ATAPI) {
10031 uint8_t *p = scmd->satacmd_acdb;
10032 char buf[3 * SATA_ATAPI_MAX_CDB_LEN];
10033
10034 (void) snprintf(buf, SATA_ATAPI_MAX_CDB_LEN,
10035 "%02x %02x %02x %02x %02x %02x %02x %02x "
10036 "%2x %02x %02x %02x %02x %02x %02x %02x",
10037 p[0], p[1], p[2], p[3], p[4], p[5], p[6], p[7],
10038 p[8], p[9], p[10], p[11], p[12], p[13], p[14], p[15]);
10039 buf[(3 * SATA_ATAPI_MAX_CDB_LEN) - 1] = '\0';
10040 cmn_err(CE_NOTE, "ATAPI cdb: %s\n", buf);
10041 }
10042 #endif
10043
10044 /*
10045 * Preset request sense data to NO SENSE.
10046 * If there is no way to get error information via Request Sense,
10047 * the packet request sense data would not have to be modified by HBA,
10048 * but it could be returned as is.
10049 */
10050 bzero(scmd->satacmd_rqsense, SATA_ATAPI_RQSENSE_LEN);
10051 sata_fixed_sense_data_preset(
10052 (struct scsi_extended_sense *)scmd->satacmd_rqsense);
10053
10054 if (!(spx->txlt_sata_pkt->satapkt_op_mode & SATA_OPMODE_SYNCH)) {
10055 /* Need callback function */
10056 spx->txlt_sata_pkt->satapkt_comp = sata_txlt_atapi_completion;
10057 synch = FALSE;
10058 } else
10059 synch = TRUE;
10060
10061 /* Transfer command to HBA */
10062 if (sata_hba_start(spx, &rval) != 0) {
10063 /* Pkt not accepted for execution */
10064 mutex_exit(cport_mutex);
10065 return (rval);
10066 }
10067 mutex_exit(cport_mutex);
10068 /*
10069 * If execution is non-synchronous,
10070 * a callback function will handle potential errors, translate
10071 * the response and will do a callback to a target driver.
10072 * If it was synchronous, use the same framework callback to check
10073 * an execution status.
10074 */
10075 if (synch) {
10076 SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
10077 "synchronous execution status %x\n",
10078 spx->txlt_sata_pkt->satapkt_reason);
10079 sata_txlt_atapi_completion(spx->txlt_sata_pkt);
10080 }
10081 return (TRAN_ACCEPT);
10082 }
10083
10084
10085 /*
10086 * ATAPI Packet command completion.
10087 *
10088 * Failure of the command passed via Packet command are considered device
10089 * error. SATA HBA driver would have to retrieve error data (via Request
10090 * Sense command delivered via error retrieval sata packet) and copy it
10091 * to satacmd_rqsense array. From there, it is moved into scsi pkt sense data.
10092 */
10093 static void
sata_txlt_atapi_completion(sata_pkt_t * sata_pkt)10094 sata_txlt_atapi_completion(sata_pkt_t *sata_pkt)
10095 {
10096 sata_pkt_txlate_t *spx =
10097 (sata_pkt_txlate_t *)sata_pkt->satapkt_framework_private;
10098 struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
10099 struct scsi_extended_sense *sense;
10100 struct buf *bp;
10101 int rval;
10102
10103 #ifdef SATA_DEBUG
10104 uint8_t *rqsp = sata_pkt->satapkt_cmd.satacmd_rqsense;
10105 #endif
10106
10107 scsipkt->pkt_state = STATE_GOT_BUS | STATE_GOT_TARGET |
10108 STATE_SENT_CMD | STATE_GOT_STATUS;
10109
10110 if (sata_pkt->satapkt_reason == SATA_PKT_COMPLETED) {
10111 /* Normal completion */
10112 if (sata_pkt->satapkt_cmd.satacmd_bp != NULL)
10113 scsipkt->pkt_state |= STATE_XFERRED_DATA;
10114 scsipkt->pkt_reason = CMD_CMPLT;
10115 *scsipkt->pkt_scbp = STATUS_GOOD;
10116 if (spx->txlt_tmp_buf != NULL) {
10117 /* Temporary buffer was used */
10118 bp = spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp;
10119 if (bp->b_flags & B_READ) {
10120 rval = ddi_dma_sync(
10121 spx->txlt_buf_dma_handle, 0, 0,
10122 DDI_DMA_SYNC_FORCPU);
10123 ASSERT(rval == DDI_SUCCESS);
10124 bcopy(spx->txlt_tmp_buf, bp->b_un.b_addr,
10125 bp->b_bcount);
10126 }
10127 }
10128 } else {
10129 /*
10130 * Something went wrong - analyze return
10131 */
10132 *scsipkt->pkt_scbp = STATUS_CHECK;
10133 sense = sata_arq_sense(spx);
10134
10135 if (sata_pkt->satapkt_reason == SATA_PKT_DEV_ERROR) {
10136 /*
10137 * pkt_reason should be CMD_CMPLT for DEVICE ERROR.
10138 * Under this condition ERR bit is set for ATA command,
10139 * and CHK bit set for ATAPI command.
10140 *
10141 * Please check st_intr & sdintr about how pkt_reason
10142 * is used.
10143 */
10144 scsipkt->pkt_reason = CMD_CMPLT;
10145
10146 /*
10147 * We may not have ARQ data if there was a double
10148 * error. But sense data in sata packet was pre-set
10149 * with NO SENSE so it is valid even if HBA could
10150 * not retrieve a real sense data.
10151 * Just copy this sense data into scsi pkt sense area.
10152 */
10153 bcopy(sata_pkt->satapkt_cmd.satacmd_rqsense, sense,
10154 SATA_ATAPI_MIN_RQSENSE_LEN);
10155 #ifdef SATA_DEBUG
10156 if (sata_debug_flags & SATA_DBG_SCSI_IF) {
10157 sata_log(spx->txlt_sata_hba_inst, CE_WARN,
10158 "sata_txlt_atapi_completion: %02x\n"
10159 "RQSENSE: %02x %02x %02x %02x %02x %02x "
10160 " %02x %02x %02x %02x %02x %02x "
10161 " %02x %02x %02x %02x %02x %02x\n",
10162 scsipkt->pkt_reason,
10163 rqsp[0], rqsp[1], rqsp[2], rqsp[3],
10164 rqsp[4], rqsp[5], rqsp[6], rqsp[7],
10165 rqsp[8], rqsp[9], rqsp[10], rqsp[11],
10166 rqsp[12], rqsp[13], rqsp[14], rqsp[15],
10167 rqsp[16], rqsp[17]);
10168 }
10169 #endif
10170 } else {
10171 switch (sata_pkt->satapkt_reason) {
10172 case SATA_PKT_PORT_ERROR:
10173 /*
10174 * We have no device data.
10175 */
10176 scsipkt->pkt_reason = CMD_INCOMPLETE;
10177 scsipkt->pkt_state &= ~(STATE_GOT_BUS |
10178 STATE_GOT_TARGET | STATE_SENT_CMD |
10179 STATE_GOT_STATUS);
10180 sense->es_key = KEY_HARDWARE_ERROR;
10181 break;
10182
10183 case SATA_PKT_TIMEOUT:
10184 scsipkt->pkt_reason = CMD_TIMEOUT;
10185 scsipkt->pkt_statistics |=
10186 STAT_TIMEOUT | STAT_DEV_RESET;
10187 /*
10188 * Need to check if HARDWARE_ERROR/
10189 * TIMEOUT_ON_LOGICAL_UNIT 4/3E/2 would be more
10190 * appropriate.
10191 */
10192 break;
10193
10194 case SATA_PKT_ABORTED:
10195 scsipkt->pkt_reason = CMD_ABORTED;
10196 scsipkt->pkt_statistics |= STAT_ABORTED;
10197 /* Should we set key COMMAND_ABPRTED? */
10198 break;
10199
10200 case SATA_PKT_RESET:
10201 scsipkt->pkt_reason = CMD_RESET;
10202 scsipkt->pkt_statistics |= STAT_DEV_RESET;
10203 /*
10204 * May be we should set Unit Attention /
10205 * Reset. Perhaps the same should be
10206 * returned for disks....
10207 */
10208 sense->es_key = KEY_UNIT_ATTENTION;
10209 sense->es_add_code = SD_SCSI_ASC_RESET;
10210 break;
10211
10212 default:
10213 SATA_LOG_D((spx->txlt_sata_hba_inst, CE_WARN,
10214 "sata_txlt_atapi_completion: "
10215 "invalid packet completion reason"));
10216 scsipkt->pkt_reason = CMD_TRAN_ERR;
10217 scsipkt->pkt_state &= ~(STATE_GOT_BUS |
10218 STATE_GOT_TARGET | STATE_SENT_CMD |
10219 STATE_GOT_STATUS);
10220 break;
10221 }
10222 }
10223 }
10224
10225 SATAATAPITRACE(spx, 0);
10226
10227 if ((scsipkt->pkt_flags & FLAG_NOINTR) == 0 &&
10228 scsipkt->pkt_comp != NULL) {
10229 /* scsi callback required */
10230 (*scsipkt->pkt_comp)(scsipkt);
10231 }
10232 }
10233
10234 /*
10235 * Set up error retrieval sata command for ATAPI Packet Command error data
10236 * recovery.
10237 *
10238 * Returns SATA_SUCCESS when data buffer is allocated and packet set-up,
10239 * returns SATA_FAILURE otherwise.
10240 */
10241
10242 static int
sata_atapi_err_ret_cmd_setup(sata_pkt_txlate_t * spx,sata_drive_info_t * sdinfo)10243 sata_atapi_err_ret_cmd_setup(sata_pkt_txlate_t *spx, sata_drive_info_t *sdinfo)
10244 {
10245 sata_pkt_t *spkt = spx->txlt_sata_pkt;
10246 sata_cmd_t *scmd;
10247 struct buf *bp;
10248
10249 /*
10250 * Allocate dma-able buffer error data.
10251 * Buffer allocation will take care of buffer alignment and other DMA
10252 * attributes.
10253 */
10254 bp = sata_alloc_local_buffer(spx, SATA_ATAPI_MIN_RQSENSE_LEN);
10255 if (bp == NULL) {
10256 SATADBG1(SATA_DBG_ATAPI, spx->txlt_sata_hba_inst,
10257 "sata_get_err_retrieval_pkt: "
10258 "cannot allocate buffer for error data", NULL);
10259 return (SATA_FAILURE);
10260 }
10261 bp_mapin(bp); /* make data buffer accessible */
10262
10263 /* Operation modes are up to the caller */
10264 spkt->satapkt_op_mode = SATA_OPMODE_SYNCH | SATA_OPMODE_INTERRUPTS;
10265
10266 /* Synchronous mode, no callback - may be changed by the caller */
10267 spkt->satapkt_comp = NULL;
10268 spkt->satapkt_time = sata_default_pkt_time;
10269
10270 scmd = &spkt->satapkt_cmd;
10271 scmd->satacmd_flags.sata_data_direction = SATA_DIR_READ;
10272 scmd->satacmd_flags.sata_ignore_dev_reset = B_TRUE;
10273
10274 sata_atapi_packet_cmd_setup(scmd, sdinfo);
10275
10276 /*
10277 * Set-up acdb. Request Sense CDB (packet command content) is
10278 * not in DMA-able buffer. Its handling is HBA-specific (how
10279 * it is transfered into packet FIS).
10280 */
10281 scmd->satacmd_acdb_len = sdinfo->satadrv_atapi_cdb_len;
10282 bcopy(sata_rqsense_cdb, scmd->satacmd_acdb, SATA_ATAPI_RQSENSE_CDB_LEN);
10283 /* Following zeroing of pad bytes may not be necessary */
10284 bzero(&scmd->satacmd_acdb[SATA_ATAPI_RQSENSE_CDB_LEN],
10285 sdinfo->satadrv_atapi_cdb_len - SATA_ATAPI_RQSENSE_CDB_LEN);
10286
10287 /*
10288 * Set-up pointer to the buffer handle, so HBA can sync buffer
10289 * before accessing it. Handle is in usual place in translate struct.
10290 */
10291 scmd->satacmd_err_ret_buf_handle = &spx->txlt_buf_dma_handle;
10292
10293 /*
10294 * Preset request sense data to NO SENSE.
10295 * Here it is redundant, only for a symetry with scsi-originated
10296 * packets. It should not be used for anything but debugging.
10297 */
10298 bzero(scmd->satacmd_rqsense, SATA_ATAPI_RQSENSE_LEN);
10299 sata_fixed_sense_data_preset(
10300 (struct scsi_extended_sense *)scmd->satacmd_rqsense);
10301
10302 ASSERT(scmd->satacmd_num_dma_cookies != 0);
10303 ASSERT(scmd->satacmd_dma_cookie_list != NULL);
10304
10305 return (SATA_SUCCESS);
10306 }
10307
10308 /*
10309 * Set-up ATAPI packet command.
10310 * Data transfer direction has to be set-up in sata_cmd structure prior to
10311 * calling this function.
10312 *
10313 * Returns void
10314 */
10315
10316 static void
sata_atapi_packet_cmd_setup(sata_cmd_t * scmd,sata_drive_info_t * sdinfo)10317 sata_atapi_packet_cmd_setup(sata_cmd_t *scmd, sata_drive_info_t *sdinfo)
10318 {
10319 scmd->satacmd_addr_type = 0; /* N/A */
10320 scmd->satacmd_sec_count_lsb = 0; /* no tag */
10321 scmd->satacmd_lba_low_lsb = 0; /* N/A */
10322 scmd->satacmd_lba_mid_lsb = (uint8_t)SATA_ATAPI_MAX_BYTES_PER_DRQ;
10323 scmd->satacmd_lba_high_lsb =
10324 (uint8_t)(SATA_ATAPI_MAX_BYTES_PER_DRQ >> 8);
10325 scmd->satacmd_cmd_reg = SATAC_PACKET; /* Command */
10326
10327 /*
10328 * We want all data to be transfered via DMA.
10329 * But specify it only if drive supports DMA and DMA mode is
10330 * selected - some drives are sensitive about it.
10331 * Hopefully it wil work for all drives....
10332 */
10333 if (sdinfo->satadrv_settings & SATA_DEV_DMA)
10334 scmd->satacmd_features_reg = SATA_ATAPI_F_DMA;
10335
10336 /*
10337 * Features register requires special care for devices that use
10338 * Serial ATA bridge - they need an explicit specification of
10339 * the data transfer direction for Packet DMA commands.
10340 * Setting this bit is harmless if DMA is not used.
10341 *
10342 * Many drives do not implement word 80, specifying what ATA/ATAPI
10343 * spec they follow.
10344 * We are arbitrarily following the latest SerialATA 2.6 spec,
10345 * which uses ATA/ATAPI 6 specification for Identify Data, unless
10346 * ATA/ATAPI-7 support is explicitly indicated.
10347 */
10348 if (sdinfo->satadrv_id.ai_majorversion != 0 &&
10349 sdinfo->satadrv_id.ai_majorversion != 0xffff &&
10350 (sdinfo->satadrv_id.ai_majorversion & SATA_MAJVER_7) != 0) {
10351 /*
10352 * Specification of major version is valid and version 7
10353 * is supported. It does automatically imply that all
10354 * spec features are supported. For now, we assume that
10355 * DMADIR setting is valid. ATA/ATAPI7 spec is incomplete.
10356 */
10357 if ((sdinfo->satadrv_id.ai_dirdma &
10358 SATA_ATAPI_ID_DMADIR_REQ) != 0) {
10359 if (scmd->satacmd_flags.sata_data_direction ==
10360 SATA_DIR_READ) {
10361 scmd->satacmd_features_reg |=
10362 SATA_ATAPI_F_DATA_DIR_READ;
10363 }
10364 }
10365 }
10366 }
10367
10368
10369 #ifdef SATA_DEBUG
10370
10371 /* Display 18 bytes of Inquiry data */
10372 static void
sata_show_inqry_data(uint8_t * buf)10373 sata_show_inqry_data(uint8_t *buf)
10374 {
10375 struct scsi_inquiry *inq = (struct scsi_inquiry *)buf;
10376 uint8_t *p;
10377
10378 cmn_err(CE_NOTE, "Inquiry data:");
10379 cmn_err(CE_NOTE, "device type %x", inq->inq_dtype);
10380 cmn_err(CE_NOTE, "removable media %x", inq->inq_rmb);
10381 cmn_err(CE_NOTE, "version %x", inq->inq_ansi);
10382 cmn_err(CE_NOTE, "ATAPI transport version %d",
10383 SATA_ATAPI_TRANS_VERSION(inq));
10384 cmn_err(CE_NOTE, "response data format %d, aenc %d",
10385 inq->inq_rdf, inq->inq_aenc);
10386 cmn_err(CE_NOTE, " additional length %d", inq->inq_len);
10387 cmn_err(CE_NOTE, "tpgs %d", inq->inq_tpgs);
10388 p = (uint8_t *)inq->inq_vid;
10389 cmn_err(CE_NOTE, "vendor id (binary): %02x %02x %02x %02x "
10390 "%02x %02x %02x %02x",
10391 p[0], p[1], p[2], p[3], p[4], p[5], p[6], p[7]);
10392 p = (uint8_t *)inq->inq_vid;
10393 cmn_err(CE_NOTE, "vendor id: %c %c %c %c %c %c %c %c",
10394 p[0], p[1], p[2], p[3], p[4], p[5], p[6], p[7]);
10395
10396 p = (uint8_t *)inq->inq_pid;
10397 cmn_err(CE_NOTE, "product id (binary): %02x %02x %02x %02x "
10398 "%02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x",
10399 p[0], p[1], p[2], p[3], p[4], p[5], p[6], p[7],
10400 p[8], p[9], p[10], p[11], p[12], p[13], p[14], p[15]);
10401 p = (uint8_t *)inq->inq_pid;
10402 cmn_err(CE_NOTE, "product id: %c %c %c %c %c %c %c %c "
10403 "%c %c %c %c %c %c %c %c",
10404 p[0], p[1], p[2], p[3], p[4], p[5], p[6], p[7],
10405 p[8], p[9], p[10], p[11], p[12], p[13], p[14], p[15]);
10406
10407 p = (uint8_t *)inq->inq_revision;
10408 cmn_err(CE_NOTE, "revision (binary): %02x %02x %02x %02x",
10409 p[0], p[1], p[2], p[3]);
10410 p = (uint8_t *)inq->inq_revision;
10411 cmn_err(CE_NOTE, "revision: %c %c %c %c",
10412 p[0], p[1], p[2], p[3]);
10413
10414 }
10415
10416
10417 static void
sata_save_atapi_trace(sata_pkt_txlate_t * spx,int count)10418 sata_save_atapi_trace(sata_pkt_txlate_t *spx, int count)
10419 {
10420 struct scsi_pkt *scsi_pkt = spx->txlt_scsi_pkt;
10421
10422 if (scsi_pkt == NULL)
10423 return;
10424 if (count != 0) {
10425 /* saving cdb */
10426 bzero(sata_atapi_trace[sata_atapi_trace_index].acdb,
10427 SATA_ATAPI_MAX_CDB_LEN);
10428 bcopy(scsi_pkt->pkt_cdbp,
10429 sata_atapi_trace[sata_atapi_trace_index].acdb, count);
10430 } else {
10431 bcopy(&((struct scsi_arq_status *)scsi_pkt->pkt_scbp)->
10432 sts_sensedata,
10433 sata_atapi_trace[sata_atapi_trace_index].arqs,
10434 SATA_ATAPI_MIN_RQSENSE_LEN);
10435 sata_atapi_trace[sata_atapi_trace_index].scsi_pkt_reason =
10436 scsi_pkt->pkt_reason;
10437 sata_atapi_trace[sata_atapi_trace_index].sata_pkt_reason =
10438 spx->txlt_sata_pkt->satapkt_reason;
10439
10440 if (++sata_atapi_trace_index >= 64)
10441 sata_atapi_trace_index = 0;
10442 }
10443 }
10444
10445 #endif
10446
10447 /*
10448 * Fetch inquiry data from ATAPI device
10449 * Returns SATA_SUCCESS if operation was successful, SATA_FAILURE otherwise.
10450 *
10451 * Note:
10452 * inqb pointer does not point to a DMA-able buffer. It is a local buffer
10453 * where the caller expects to see the inquiry data.
10454 *
10455 */
10456
10457 static int
sata_get_atapi_inquiry_data(sata_hba_inst_t * sata_hba,sata_address_t * saddr,struct scsi_inquiry * inq)10458 sata_get_atapi_inquiry_data(sata_hba_inst_t *sata_hba,
10459 sata_address_t *saddr, struct scsi_inquiry *inq)
10460 {
10461 sata_pkt_txlate_t *spx;
10462 sata_pkt_t *spkt;
10463 struct buf *bp;
10464 sata_drive_info_t *sdinfo;
10465 sata_cmd_t *scmd;
10466 int rval;
10467 uint8_t *rqsp;
10468 dev_info_t *dip = SATA_DIP(sata_hba);
10469 #ifdef SATA_DEBUG
10470 char msg_buf[MAXPATHLEN];
10471 #endif
10472 kmutex_t *cport_mutex;
10473
10474 ASSERT(sata_hba != NULL);
10475
10476 spx = kmem_zalloc(sizeof (sata_pkt_txlate_t), KM_SLEEP);
10477 spx->txlt_sata_hba_inst = sata_hba;
10478 spx->txlt_scsi_pkt = NULL; /* No scsi pkt involved */
10479 spkt = sata_pkt_alloc(spx, NULL);
10480 if (spkt == NULL) {
10481 kmem_free(spx, sizeof (sata_pkt_txlate_t));
10482 return (SATA_FAILURE);
10483 }
10484 /* address is needed now */
10485 spkt->satapkt_device.satadev_addr = *saddr;
10486
10487 /* scsi_inquiry size buffer */
10488 bp = sata_alloc_local_buffer(spx, sizeof (struct scsi_inquiry));
10489 if (bp == NULL) {
10490 sata_pkt_free(spx);
10491 kmem_free(spx, sizeof (sata_pkt_txlate_t));
10492 SATA_LOG_D((sata_hba, CE_WARN,
10493 "sata_get_atapi_inquiry_data: "
10494 "cannot allocate data buffer"));
10495 return (SATA_FAILURE);
10496 }
10497 bp_mapin(bp); /* make data buffer accessible */
10498
10499 scmd = &spkt->satapkt_cmd;
10500 ASSERT(scmd->satacmd_num_dma_cookies != 0);
10501 ASSERT(scmd->satacmd_dma_cookie_list != NULL);
10502
10503 /* Use synchronous mode */
10504 spkt->satapkt_op_mode = SATA_OPMODE_SYNCH | SATA_OPMODE_INTERRUPTS;
10505 spkt->satapkt_comp = NULL;
10506 spkt->satapkt_time = sata_default_pkt_time;
10507
10508 /* Issue inquiry command - 6 bytes cdb, data transfer, read */
10509
10510 scmd->satacmd_flags.sata_data_direction = SATA_DIR_READ;
10511 scmd->satacmd_flags.sata_ignore_dev_reset = B_TRUE;
10512
10513 cport_mutex = &(SATA_CPORT_MUTEX(sata_hba, saddr->cport));
10514 mutex_enter(cport_mutex);
10515 sdinfo = sata_get_device_info(sata_hba,
10516 &spx->txlt_sata_pkt->satapkt_device);
10517 if (sdinfo == NULL) {
10518 /* we have to be carefull about the disapearing device */
10519 mutex_exit(cport_mutex);
10520 rval = SATA_FAILURE;
10521 goto cleanup;
10522 }
10523 sata_atapi_packet_cmd_setup(scmd, sdinfo);
10524
10525 /*
10526 * Set-up acdb. This works for atapi transport version 2 and later.
10527 */
10528 scmd->satacmd_acdb_len = sdinfo->satadrv_atapi_cdb_len;
10529 bzero(scmd->satacmd_acdb, SATA_ATAPI_MAX_CDB_LEN);
10530 scmd->satacmd_acdb[0] = 0x12; /* Inquiry */
10531 scmd->satacmd_acdb[1] = 0x00;
10532 scmd->satacmd_acdb[2] = 0x00;
10533 scmd->satacmd_acdb[3] = 0x00;
10534 scmd->satacmd_acdb[4] = sizeof (struct scsi_inquiry);
10535 scmd->satacmd_acdb[5] = 0x00;
10536
10537 sata_fixed_sense_data_preset(
10538 (struct scsi_extended_sense *)scmd->satacmd_rqsense);
10539
10540 /* Transfer command to HBA */
10541 if (sata_hba_start(spx, &rval) != 0) {
10542 /* Pkt not accepted for execution */
10543 SATADBG1(SATA_DBG_ATAPI, sata_hba,
10544 "sata_get_atapi_inquiry_data: "
10545 "Packet not accepted for execution - ret: %02x", rval);
10546 mutex_exit(cport_mutex);
10547 rval = SATA_FAILURE;
10548 goto cleanup;
10549 }
10550 mutex_exit(cport_mutex);
10551
10552 if (spkt->satapkt_reason == SATA_PKT_COMPLETED) {
10553 SATADBG1(SATA_DBG_ATAPI, sata_hba,
10554 "sata_get_atapi_inquiry_data: "
10555 "Packet completed successfully - ret: %02x", rval);
10556 if (spx->txlt_buf_dma_handle != NULL) {
10557 /*
10558 * Sync buffer. Handle is in usual place in translate
10559 * struct.
10560 */
10561 rval = ddi_dma_sync(spx->txlt_buf_dma_handle, 0, 0,
10562 DDI_DMA_SYNC_FORCPU);
10563 ASSERT(rval == DDI_SUCCESS);
10564 }
10565
10566 if (sata_check_for_dma_error(dip, spx)) {
10567 ddi_fm_service_impact(dip, DDI_SERVICE_UNAFFECTED);
10568 rval = SATA_FAILURE;
10569 } else {
10570 /*
10571 * Normal completion - copy data into caller's buffer
10572 */
10573 bcopy(bp->b_un.b_addr, (uint8_t *)inq,
10574 sizeof (struct scsi_inquiry));
10575 #ifdef SATA_DEBUG
10576 if (sata_debug_flags & SATA_DBG_ATAPI) {
10577 sata_show_inqry_data((uint8_t *)inq);
10578 }
10579 #endif
10580 rval = SATA_SUCCESS;
10581 }
10582 } else {
10583 /*
10584 * Something went wrong - analyze return - check rqsense data
10585 */
10586 rval = SATA_FAILURE;
10587 if (spkt->satapkt_reason == SATA_PKT_DEV_ERROR) {
10588 /*
10589 * ARQ data hopefull show something other than NO SENSE
10590 */
10591 rqsp = scmd->satacmd_rqsense;
10592 #ifdef SATA_DEBUG
10593 if (sata_debug_flags & SATA_DBG_ATAPI) {
10594 msg_buf[0] = '\0';
10595 (void) snprintf(msg_buf, MAXPATHLEN,
10596 "ATAPI packet completion reason: %02x\n"
10597 "RQSENSE: %02x %02x %02x %02x %02x %02x\n"
10598 " %02x %02x %02x %02x %02x %02x\n"
10599 " %02x %02x %02x %02x %02x %02x",
10600 spkt->satapkt_reason,
10601 rqsp[0], rqsp[1], rqsp[2], rqsp[3],
10602 rqsp[4], rqsp[5], rqsp[6], rqsp[7],
10603 rqsp[8], rqsp[9], rqsp[10], rqsp[11],
10604 rqsp[12], rqsp[13], rqsp[14], rqsp[15],
10605 rqsp[16], rqsp[17]);
10606 sata_log(spx->txlt_sata_hba_inst, CE_WARN,
10607 "%s", msg_buf);
10608 }
10609 #endif
10610 } else {
10611 switch (spkt->satapkt_reason) {
10612 case SATA_PKT_PORT_ERROR:
10613 SATADBG1(SATA_DBG_ATAPI, sata_hba,
10614 "sata_get_atapi_inquiry_data: "
10615 "packet reason: port error", NULL);
10616 break;
10617
10618 case SATA_PKT_TIMEOUT:
10619 SATADBG1(SATA_DBG_ATAPI, sata_hba,
10620 "sata_get_atapi_inquiry_data: "
10621 "packet reason: timeout", NULL);
10622 break;
10623
10624 case SATA_PKT_ABORTED:
10625 SATADBG1(SATA_DBG_ATAPI, sata_hba,
10626 "sata_get_atapi_inquiry_data: "
10627 "packet reason: aborted", NULL);
10628 break;
10629
10630 case SATA_PKT_RESET:
10631 SATADBG1(SATA_DBG_ATAPI, sata_hba,
10632 "sata_get_atapi_inquiry_data: "
10633 "packet reason: reset\n", NULL);
10634 break;
10635 default:
10636 SATADBG1(SATA_DBG_ATAPI, sata_hba,
10637 "sata_get_atapi_inquiry_data: "
10638 "invalid packet reason: %02x\n",
10639 spkt->satapkt_reason);
10640 break;
10641 }
10642 }
10643 }
10644 cleanup:
10645 sata_free_local_buffer(spx);
10646 sata_pkt_free(spx);
10647 kmem_free(spx, sizeof (sata_pkt_txlate_t));
10648 return (rval);
10649 }
10650
10651
10652
10653
10654
10655 #if 0
10656 #ifdef SATA_DEBUG
10657
10658 /*
10659 * Test ATAPI packet command.
10660 * Single threaded test: send packet command in synch mode, process completion
10661 *
10662 */
10663 static void
10664 sata_test_atapi_packet_command(sata_hba_inst_t *sata_hba_inst, int cport)
10665 {
10666 sata_pkt_txlate_t *spx;
10667 sata_pkt_t *spkt;
10668 struct buf *bp;
10669 sata_device_t sata_device;
10670 sata_drive_info_t *sdinfo;
10671 sata_cmd_t *scmd;
10672 int rval;
10673 uint8_t *rqsp;
10674
10675 ASSERT(sata_hba_inst != NULL);
10676 sata_device.satadev_addr.cport = cport;
10677 sata_device.satadev_addr.pmport = 0;
10678 sata_device.satadev_addr.qual = SATA_ADDR_DCPORT;
10679 sata_device.satadev_rev = SATA_DEVICE_REV;
10680 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, cport)->cport_mutex);
10681 sdinfo = sata_get_device_info(sata_hba_inst, &sata_device);
10682 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, cport)->cport_mutex);
10683 if (sdinfo == NULL) {
10684 sata_log(sata_hba_inst, CE_WARN,
10685 "sata_test_atapi_packet_command: "
10686 "no device info for cport %d",
10687 sata_device.satadev_addr.cport);
10688 return;
10689 }
10690
10691 spx = kmem_zalloc(sizeof (sata_pkt_txlate_t), KM_SLEEP);
10692 spx->txlt_sata_hba_inst = sata_hba_inst;
10693 spx->txlt_scsi_pkt = NULL; /* No scsi pkt involved */
10694 spkt = sata_pkt_alloc(spx, NULL);
10695 if (spkt == NULL) {
10696 kmem_free(spx, sizeof (sata_pkt_txlate_t));
10697 return;
10698 }
10699 /* address is needed now */
10700 spkt->satapkt_device.satadev_addr = sata_device.satadev_addr;
10701
10702 /* 1024k buffer */
10703 bp = sata_alloc_local_buffer(spx, 1024);
10704 if (bp == NULL) {
10705 sata_pkt_free(spx);
10706 kmem_free(spx, sizeof (sata_pkt_txlate_t));
10707 sata_log(sata_hba_inst, CE_WARN,
10708 "sata_test_atapi_packet_command: "
10709 "cannot allocate data buffer");
10710 return;
10711 }
10712 bp_mapin(bp); /* make data buffer accessible */
10713
10714 scmd = &spkt->satapkt_cmd;
10715 ASSERT(scmd->satacmd_num_dma_cookies != 0);
10716 ASSERT(scmd->satacmd_dma_cookie_list != NULL);
10717
10718 /* Use synchronous mode */
10719 spkt->satapkt_op_mode = SATA_OPMODE_SYNCH | SATA_OPMODE_INTERRUPTS;
10720
10721 /* Synchronous mode, no callback - may be changed by the caller */
10722 spkt->satapkt_comp = NULL;
10723 spkt->satapkt_time = sata_default_pkt_time;
10724
10725 /* Issue inquiry command - 6 bytes cdb, data transfer, read */
10726
10727 scmd->satacmd_flags.sata_data_direction = SATA_DIR_READ;
10728 scmd->satacmd_flags.sata_ignore_dev_reset = B_TRUE;
10729
10730 sata_atapi_packet_cmd_setup(scmd, sdinfo);
10731
10732 /* Set-up acdb. */
10733 scmd->satacmd_acdb_len = sdinfo->satadrv_atapi_cdb_len;
10734 bzero(scmd->satacmd_acdb, SATA_ATAPI_MAX_CDB_LEN);
10735 scmd->satacmd_acdb[0] = 0x12; /* Inquiry */
10736 scmd->satacmd_acdb[1] = 0x00;
10737 scmd->satacmd_acdb[2] = 0x00;
10738 scmd->satacmd_acdb[3] = 0x00;
10739 scmd->satacmd_acdb[4] = sizeof (struct scsi_inquiry);
10740 scmd->satacmd_acdb[5] = 0x00;
10741
10742 sata_fixed_sense_data_preset(
10743 (struct scsi_extended_sense *)scmd->satacmd_rqsense);
10744
10745 /* Transfer command to HBA */
10746 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, cport)->cport_mutex);
10747 if (sata_hba_start(spx, &rval) != 0) {
10748 /* Pkt not accepted for execution */
10749 sata_log(sata_hba_inst, CE_WARN,
10750 "sata_test_atapi_packet_command: "
10751 "Packet not accepted for execution - ret: %02x", rval);
10752 mutex_exit(
10753 &SATA_CPORT_INFO(sata_hba_inst, cport)->cport_mutex);
10754 goto cleanup;
10755 }
10756 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, cport)->cport_mutex);
10757
10758 if (spx->txlt_buf_dma_handle != NULL) {
10759 /*
10760 * Sync buffer. Handle is in usual place in translate struct.
10761 */
10762 rval = ddi_dma_sync(spx->txlt_buf_dma_handle, 0, 0,
10763 DDI_DMA_SYNC_FORCPU);
10764 ASSERT(rval == DDI_SUCCESS);
10765 }
10766 if (spkt->satapkt_reason == SATA_PKT_COMPLETED) {
10767 sata_log(sata_hba_inst, CE_WARN,
10768 "sata_test_atapi_packet_command: "
10769 "Packet completed successfully");
10770 /*
10771 * Normal completion - show inquiry data
10772 */
10773 sata_show_inqry_data((uint8_t *)bp->b_un.b_addr);
10774 } else {
10775 /*
10776 * Something went wrong - analyze return - check rqsense data
10777 */
10778 if (spkt->satapkt_reason == SATA_PKT_DEV_ERROR) {
10779 /*
10780 * ARQ data hopefull show something other than NO SENSE
10781 */
10782 rqsp = scmd->satacmd_rqsense;
10783 sata_log(spx->txlt_sata_hba_inst, CE_WARN,
10784 "ATAPI packet completion reason: %02x\n"
10785 "RQSENSE: %02x %02x %02x %02x %02x %02x "
10786 " %02x %02x %02x %02x %02x %02x "
10787 " %02x %02x %02x %02x %02x %02x\n",
10788 spkt->satapkt_reason,
10789 rqsp[0], rqsp[1], rqsp[2], rqsp[3],
10790 rqsp[4], rqsp[5], rqsp[6], rqsp[7],
10791 rqsp[8], rqsp[9], rqsp[10], rqsp[11],
10792 rqsp[12], rqsp[13], rqsp[14], rqsp[15],
10793 rqsp[16], rqsp[17]);
10794 } else {
10795 switch (spkt->satapkt_reason) {
10796 case SATA_PKT_PORT_ERROR:
10797 sata_log(sata_hba_inst, CE_WARN,
10798 "sata_test_atapi_packet_command: "
10799 "packet reason: port error\n");
10800 break;
10801
10802 case SATA_PKT_TIMEOUT:
10803 sata_log(sata_hba_inst, CE_WARN,
10804 "sata_test_atapi_packet_command: "
10805 "packet reason: timeout\n");
10806 break;
10807
10808 case SATA_PKT_ABORTED:
10809 sata_log(sata_hba_inst, CE_WARN,
10810 "sata_test_atapi_packet_command: "
10811 "packet reason: aborted\n");
10812 break;
10813
10814 case SATA_PKT_RESET:
10815 sata_log(sata_hba_inst, CE_WARN,
10816 "sata_test_atapi_packet_command: "
10817 "packet reason: reset\n");
10818 break;
10819 default:
10820 sata_log(sata_hba_inst, CE_WARN,
10821 "sata_test_atapi_packet_command: "
10822 "invalid packet reason: %02x\n",
10823 spkt->satapkt_reason);
10824 break;
10825 }
10826 }
10827 }
10828 cleanup:
10829 sata_free_local_buffer(spx);
10830 sata_pkt_free(spx);
10831 kmem_free(spx, sizeof (sata_pkt_txlate_t));
10832 }
10833
10834 #endif /* SATA_DEBUG */
10835 #endif /* 1 */
10836
10837
10838 /* ************************** LOCAL HELPER FUNCTIONS *********************** */
10839
10840 /*
10841 * Validate sata_tran info
10842 * SATA_FAILURE returns if structure is inconsistent or structure revision
10843 * does not match one used by the framework.
10844 *
10845 * Returns SATA_SUCCESS if sata_hba_tran has matching revision and contains
10846 * required function pointers.
10847 * Returns SATA_FAILURE otherwise.
10848 */
10849 static int
sata_validate_sata_hba_tran(dev_info_t * dip,sata_hba_tran_t * sata_tran)10850 sata_validate_sata_hba_tran(dev_info_t *dip, sata_hba_tran_t *sata_tran)
10851 {
10852 /*
10853 * SATA_TRAN_HBA_REV is the current (highest) revision number
10854 * of the SATA interface.
10855 */
10856 if (sata_tran->sata_tran_hba_rev > SATA_TRAN_HBA_REV) {
10857 sata_log(NULL, CE_WARN,
10858 "sata: invalid sata_hba_tran version %d for driver %s",
10859 sata_tran->sata_tran_hba_rev, ddi_driver_name(dip));
10860 return (SATA_FAILURE);
10861 }
10862
10863 if (dip != sata_tran->sata_tran_hba_dip) {
10864 SATA_LOG_D((NULL, CE_WARN,
10865 "sata: inconsistent sata_tran_hba_dip "
10866 "%p / %p", sata_tran->sata_tran_hba_dip, dip));
10867 return (SATA_FAILURE);
10868 }
10869
10870 if (sata_tran->sata_tran_probe_port == NULL ||
10871 sata_tran->sata_tran_start == NULL ||
10872 sata_tran->sata_tran_abort == NULL ||
10873 sata_tran->sata_tran_reset_dport == NULL ||
10874 sata_tran->sata_tran_hotplug_ops == NULL ||
10875 sata_tran->sata_tran_hotplug_ops->sata_tran_port_activate == NULL ||
10876 sata_tran->sata_tran_hotplug_ops->sata_tran_port_deactivate ==
10877 NULL) {
10878 SATA_LOG_D((NULL, CE_WARN, "sata: sata_hba_tran missing "
10879 "required functions"));
10880 }
10881 return (SATA_SUCCESS);
10882 }
10883
10884 /*
10885 * Remove HBA instance from sata_hba_list.
10886 */
10887 static void
sata_remove_hba_instance(dev_info_t * dip)10888 sata_remove_hba_instance(dev_info_t *dip)
10889 {
10890 sata_hba_inst_t *sata_hba_inst;
10891
10892 mutex_enter(&sata_mutex);
10893 for (sata_hba_inst = sata_hba_list;
10894 sata_hba_inst != (struct sata_hba_inst *)NULL;
10895 sata_hba_inst = sata_hba_inst->satahba_next) {
10896 if (sata_hba_inst->satahba_dip == dip)
10897 break;
10898 }
10899
10900 if (sata_hba_inst == (struct sata_hba_inst *)NULL) {
10901 #ifdef SATA_DEBUG
10902 cmn_err(CE_WARN, "sata_remove_hba_instance: "
10903 "unknown HBA instance\n");
10904 #endif
10905 ASSERT(FALSE);
10906 }
10907 if (sata_hba_inst == sata_hba_list) {
10908 sata_hba_list = sata_hba_inst->satahba_next;
10909 if (sata_hba_list) {
10910 sata_hba_list->satahba_prev =
10911 (struct sata_hba_inst *)NULL;
10912 }
10913 if (sata_hba_inst == sata_hba_list_tail) {
10914 sata_hba_list_tail = NULL;
10915 }
10916 } else if (sata_hba_inst == sata_hba_list_tail) {
10917 sata_hba_list_tail = sata_hba_inst->satahba_prev;
10918 if (sata_hba_list_tail) {
10919 sata_hba_list_tail->satahba_next =
10920 (struct sata_hba_inst *)NULL;
10921 }
10922 } else {
10923 sata_hba_inst->satahba_prev->satahba_next =
10924 sata_hba_inst->satahba_next;
10925 sata_hba_inst->satahba_next->satahba_prev =
10926 sata_hba_inst->satahba_prev;
10927 }
10928 mutex_exit(&sata_mutex);
10929 }
10930
10931 /*
10932 * Probe all SATA ports of the specified HBA instance.
10933 * The assumption is that there are no target and attachment point minor nodes
10934 * created by the boot subsystems, so we do not need to prune device tree.
10935 *
10936 * This function is called only from sata_hba_attach(). It does not have to
10937 * be protected by controller mutex, because the hba_attached flag is not set
10938 * yet and no one would be touching this HBA instance other than this thread.
10939 * Determines if port is active and what type of the device is attached
10940 * (if any). Allocates necessary structures for each port.
10941 *
10942 * An AP (Attachement Point) node is created for each SATA device port even
10943 * when there is no device attached.
10944 */
10945
10946 static void
sata_probe_ports(sata_hba_inst_t * sata_hba_inst)10947 sata_probe_ports(sata_hba_inst_t *sata_hba_inst)
10948 {
10949 dev_info_t *dip = SATA_DIP(sata_hba_inst);
10950 int ncport;
10951 sata_cport_info_t *cportinfo;
10952 sata_drive_info_t *drive;
10953 sata_device_t sata_device;
10954 int rval;
10955 dev_t minor_number;
10956 char name[16];
10957 clock_t start_time, cur_time;
10958
10959 /*
10960 * Probe controller ports first, to find port status and
10961 * any port multiplier attached.
10962 */
10963 for (ncport = 0; ncport < SATA_NUM_CPORTS(sata_hba_inst); ncport++) {
10964 /* allocate cport structure */
10965 cportinfo = kmem_zalloc(sizeof (sata_cport_info_t), KM_SLEEP);
10966 ASSERT(cportinfo != NULL);
10967 mutex_init(&cportinfo->cport_mutex, NULL, MUTEX_DRIVER, NULL);
10968
10969 mutex_enter(&cportinfo->cport_mutex);
10970
10971 cportinfo->cport_addr.cport = ncport;
10972 cportinfo->cport_addr.pmport = 0;
10973 cportinfo->cport_addr.qual = SATA_ADDR_CPORT;
10974 cportinfo->cport_state &= ~SATA_PORT_STATE_CLEAR_MASK;
10975 cportinfo->cport_state |= SATA_STATE_PROBING;
10976 SATA_CPORT_INFO(sata_hba_inst, ncport) = cportinfo;
10977
10978 /*
10979 * Regardless if a port is usable or not, create
10980 * an attachment point
10981 */
10982 mutex_exit(&cportinfo->cport_mutex);
10983 minor_number = SATA_MAKE_AP_MINOR(ddi_get_instance(dip),
10984 ncport, 0, SATA_ADDR_CPORT);
10985 (void) sprintf(name, "%d", ncport);
10986 if (ddi_create_minor_node(dip, name, S_IFCHR,
10987 minor_number, DDI_NT_SATA_ATTACHMENT_POINT, 0) !=
10988 DDI_SUCCESS) {
10989 sata_log(sata_hba_inst, CE_WARN, "sata_hba_attach: "
10990 "cannot create SATA attachment point for port %d",
10991 ncport);
10992 }
10993
10994 /* Probe port */
10995 start_time = ddi_get_lbolt();
10996 reprobe_cport:
10997 sata_device.satadev_addr.cport = ncport;
10998 sata_device.satadev_addr.pmport = 0;
10999 sata_device.satadev_addr.qual = SATA_ADDR_CPORT;
11000 sata_device.satadev_rev = SATA_DEVICE_REV;
11001
11002 rval = (*SATA_PROBE_PORT_FUNC(sata_hba_inst))
11003 (dip, &sata_device);
11004
11005 mutex_enter(&cportinfo->cport_mutex);
11006 cportinfo->cport_scr = sata_device.satadev_scr;
11007 if (rval != SATA_SUCCESS) {
11008 /* Something went wrong? Fail the port */
11009 cportinfo->cport_state = SATA_PSTATE_FAILED;
11010 mutex_exit(&cportinfo->cport_mutex);
11011 continue;
11012 }
11013 cportinfo->cport_state &= ~SATA_STATE_PROBING;
11014 cportinfo->cport_state |= SATA_STATE_PROBED;
11015 cportinfo->cport_dev_type = sata_device.satadev_type;
11016
11017 cportinfo->cport_state |= SATA_STATE_READY;
11018 if (cportinfo->cport_dev_type == SATA_DTYPE_NONE) {
11019 mutex_exit(&cportinfo->cport_mutex);
11020 continue;
11021 }
11022 if (cportinfo->cport_dev_type != SATA_DTYPE_PMULT) {
11023 /*
11024 * There is some device attached.
11025 * Allocate device info structure
11026 */
11027 if (SATA_CPORTINFO_DRV_INFO(cportinfo) == NULL) {
11028 mutex_exit(&cportinfo->cport_mutex);
11029 SATA_CPORTINFO_DRV_INFO(cportinfo) =
11030 kmem_zalloc(sizeof (sata_drive_info_t),
11031 KM_SLEEP);
11032 mutex_enter(&cportinfo->cport_mutex);
11033 }
11034 drive = SATA_CPORTINFO_DRV_INFO(cportinfo);
11035 drive->satadrv_addr = cportinfo->cport_addr;
11036 drive->satadrv_addr.qual = SATA_ADDR_DCPORT;
11037 drive->satadrv_type = cportinfo->cport_dev_type;
11038 drive->satadrv_state = SATA_STATE_UNKNOWN;
11039
11040 mutex_exit(&cportinfo->cport_mutex);
11041 if (sata_add_device(dip, sata_hba_inst, &sata_device) !=
11042 SATA_SUCCESS) {
11043 /*
11044 * Plugged device was not correctly identified.
11045 * Retry, within a SATA_DEV_IDENTIFY_TIMEOUT
11046 */
11047 cur_time = ddi_get_lbolt();
11048 if ((cur_time - start_time) <
11049 drv_usectohz(SATA_DEV_IDENTIFY_TIMEOUT)) {
11050 /* sleep for a while */
11051 delay(drv_usectohz(
11052 SATA_DEV_RETRY_DLY));
11053 goto reprobe_cport;
11054 }
11055 }
11056 } else { /* SATA_DTYPE_PMULT */
11057 mutex_exit(&cportinfo->cport_mutex);
11058
11059 /* Allocate sata_pmult_info and sata_pmport_info */
11060 if (sata_alloc_pmult(sata_hba_inst, &sata_device) !=
11061 SATA_SUCCESS)
11062 continue;
11063
11064 /* Log the information of the port multiplier */
11065 sata_show_pmult_info(sata_hba_inst, &sata_device);
11066
11067 /* Probe its pmports */
11068 sata_probe_pmports(sata_hba_inst, ncport);
11069 }
11070 }
11071 }
11072
11073 /*
11074 * Probe all device ports behind a port multiplier.
11075 *
11076 * PMult-related structure should be allocated before by sata_alloc_pmult().
11077 *
11078 * NOTE1: Only called from sata_probe_ports()
11079 * NOTE2: No mutex should be hold.
11080 */
11081 static void
sata_probe_pmports(sata_hba_inst_t * sata_hba_inst,uint8_t ncport)11082 sata_probe_pmports(sata_hba_inst_t *sata_hba_inst, uint8_t ncport)
11083 {
11084 dev_info_t *dip = SATA_DIP(sata_hba_inst);
11085 sata_pmult_info_t *pmultinfo = NULL;
11086 sata_pmport_info_t *pmportinfo = NULL;
11087 sata_drive_info_t *drive = NULL;
11088 sata_device_t sata_device;
11089
11090 clock_t start_time, cur_time;
11091 int npmport;
11092 int rval;
11093
11094 pmultinfo = SATA_PMULT_INFO(sata_hba_inst, ncport);
11095
11096 /* Probe Port Multiplier ports */
11097 for (npmport = 0; npmport < pmultinfo->pmult_num_dev_ports; npmport++) {
11098 pmportinfo = pmultinfo->pmult_dev_port[npmport];
11099 start_time = ddi_get_lbolt();
11100 reprobe_pmport:
11101 sata_device.satadev_addr.cport = ncport;
11102 sata_device.satadev_addr.pmport = npmport;
11103 sata_device.satadev_addr.qual = SATA_ADDR_PMPORT;
11104 sata_device.satadev_rev = SATA_DEVICE_REV;
11105
11106 /* Let HBA driver probe it. */
11107 rval = (*SATA_PROBE_PORT_FUNC(sata_hba_inst))
11108 (dip, &sata_device);
11109 mutex_enter(&pmportinfo->pmport_mutex);
11110
11111 pmportinfo->pmport_scr = sata_device.satadev_scr;
11112
11113 if (rval != SATA_SUCCESS) {
11114 pmportinfo->pmport_state =
11115 SATA_PSTATE_FAILED;
11116 mutex_exit(&pmportinfo->pmport_mutex);
11117 continue;
11118 }
11119 pmportinfo->pmport_state &= ~SATA_STATE_PROBING;
11120 pmportinfo->pmport_state |= SATA_STATE_PROBED;
11121 pmportinfo->pmport_dev_type = sata_device.satadev_type;
11122
11123 pmportinfo->pmport_state |= SATA_STATE_READY;
11124 if (pmportinfo->pmport_dev_type ==
11125 SATA_DTYPE_NONE) {
11126 SATADBG2(SATA_DBG_PMULT, sata_hba_inst,
11127 "no device found at port %d:%d", ncport, npmport);
11128 mutex_exit(&pmportinfo->pmport_mutex);
11129 continue;
11130 }
11131 /* Port multipliers cannot be chained */
11132 ASSERT(pmportinfo->pmport_dev_type != SATA_DTYPE_PMULT);
11133 /*
11134 * There is something attached to Port
11135 * Multiplier device port
11136 * Allocate device info structure
11137 */
11138 if (pmportinfo->pmport_sata_drive == NULL) {
11139 mutex_exit(&pmportinfo->pmport_mutex);
11140 pmportinfo->pmport_sata_drive =
11141 kmem_zalloc(sizeof (sata_drive_info_t), KM_SLEEP);
11142 mutex_enter(&pmportinfo->pmport_mutex);
11143 }
11144 drive = pmportinfo->pmport_sata_drive;
11145 drive->satadrv_addr.cport = pmportinfo->pmport_addr.cport;
11146 drive->satadrv_addr.pmport = npmport;
11147 drive->satadrv_addr.qual = SATA_ADDR_DPMPORT;
11148 drive->satadrv_type = pmportinfo-> pmport_dev_type;
11149 drive->satadrv_state = SATA_STATE_UNKNOWN;
11150
11151 mutex_exit(&pmportinfo->pmport_mutex);
11152 rval = sata_add_device(dip, sata_hba_inst, &sata_device);
11153
11154 if (rval != SATA_SUCCESS) {
11155 /*
11156 * Plugged device was not correctly identified.
11157 * Retry, within the SATA_DEV_IDENTIFY_TIMEOUT
11158 */
11159 cur_time = ddi_get_lbolt();
11160 if ((cur_time - start_time) < drv_usectohz(
11161 SATA_DEV_IDENTIFY_TIMEOUT)) {
11162 /* sleep for a while */
11163 delay(drv_usectohz(SATA_DEV_RETRY_DLY));
11164 goto reprobe_pmport;
11165 }
11166 }
11167 }
11168 }
11169
11170 /*
11171 * Add SATA device for specified HBA instance & port (SCSI target
11172 * device nodes).
11173 * This function is called (indirectly) only from sata_hba_attach().
11174 * A target node is created when there is a supported type device attached,
11175 * but may be removed if it cannot be put online.
11176 *
11177 * This function cannot be called from an interrupt context.
11178 *
11179 * Create target nodes for disk, CD/DVD, Tape and ATAPI disk devices
11180 *
11181 * Returns SATA_SUCCESS when port/device was fully processed, SATA_FAILURE when
11182 * device identification failed - adding a device could be retried.
11183 *
11184 */
11185 static int
sata_add_device(dev_info_t * pdip,sata_hba_inst_t * sata_hba_inst,sata_device_t * sata_device)11186 sata_add_device(dev_info_t *pdip, sata_hba_inst_t *sata_hba_inst,
11187 sata_device_t *sata_device)
11188 {
11189 sata_cport_info_t *cportinfo;
11190 sata_pmult_info_t *pminfo;
11191 sata_pmport_info_t *pmportinfo;
11192 dev_info_t *cdip; /* child dip */
11193 sata_address_t *saddr = &sata_device->satadev_addr;
11194 uint8_t cport, pmport;
11195 int rval;
11196
11197 cport = saddr->cport;
11198 pmport = saddr->pmport;
11199 cportinfo = SATA_CPORT_INFO(sata_hba_inst, cport);
11200 ASSERT(cportinfo->cport_dev_type != SATA_DTYPE_NONE);
11201
11202 /*
11203 * Some device is attached to a controller port.
11204 * We rely on controllers distinquishing between no-device,
11205 * attached port multiplier and other kind of attached device.
11206 * We need to get Identify Device data and determine
11207 * positively the dev type before trying to attach
11208 * the target driver.
11209 */
11210 sata_device->satadev_rev = SATA_DEVICE_REV;
11211 switch (saddr->qual) {
11212 case SATA_ADDR_CPORT:
11213 /*
11214 * Add a non-port-multiplier device at controller port.
11215 */
11216 saddr->qual = SATA_ADDR_DCPORT;
11217
11218 rval = sata_probe_device(sata_hba_inst, sata_device);
11219 if (rval != SATA_SUCCESS ||
11220 sata_device->satadev_type == SATA_DTYPE_UNKNOWN)
11221 return (SATA_FAILURE);
11222
11223 mutex_enter(&cportinfo->cport_mutex);
11224 sata_show_drive_info(sata_hba_inst,
11225 SATA_CPORTINFO_DRV_INFO(cportinfo));
11226
11227 if ((sata_device->satadev_type & SATA_VALID_DEV_TYPE) == 0) {
11228 /*
11229 * Could not determine device type or
11230 * a device is not supported.
11231 * Degrade this device to unknown.
11232 */
11233 cportinfo->cport_dev_type = SATA_DTYPE_UNKNOWN;
11234 mutex_exit(&cportinfo->cport_mutex);
11235 return (SATA_SUCCESS);
11236 }
11237 cportinfo->cport_dev_type = sata_device->satadev_type;
11238 cportinfo->cport_tgtnode_clean = B_TRUE;
11239 mutex_exit(&cportinfo->cport_mutex);
11240
11241 /*
11242 * Initialize device to the desired state. Even if it
11243 * fails, the device will still attach but syslog
11244 * will show the warning.
11245 */
11246 if (sata_initialize_device(sata_hba_inst,
11247 SATA_CPORTINFO_DRV_INFO(cportinfo)) != SATA_SUCCESS) {
11248 /* Retry */
11249 rval = sata_initialize_device(sata_hba_inst,
11250 SATA_CPORTINFO_DRV_INFO(cportinfo));
11251
11252 if (rval == SATA_RETRY)
11253 sata_log(sata_hba_inst, CE_WARN,
11254 "SATA device at port %d - "
11255 "default device features could not be set."
11256 " Device may not operate as expected.",
11257 cport);
11258 }
11259
11260 cdip = sata_create_target_node(pdip, sata_hba_inst, saddr);
11261 if (cdip == NULL) {
11262 /*
11263 * Attaching target node failed.
11264 * We retain sata_drive_info structure...
11265 */
11266 return (SATA_SUCCESS);
11267 }
11268
11269 mutex_enter(&cportinfo->cport_mutex);
11270 (SATA_CPORTINFO_DRV_INFO(cportinfo))->
11271 satadrv_state = SATA_STATE_READY;
11272 mutex_exit(&cportinfo->cport_mutex);
11273
11274 break;
11275
11276 case SATA_ADDR_PMPORT:
11277 saddr->qual = SATA_ADDR_DPMPORT;
11278
11279 mutex_enter(&cportinfo->cport_mutex);
11280 /* It must be a Port Multiplier at the controller port */
11281 ASSERT(cportinfo->cport_dev_type == SATA_DTYPE_PMULT);
11282
11283 pminfo = SATA_CPORTINFO_PMULT_INFO(cportinfo);
11284 pmportinfo = pminfo->pmult_dev_port[saddr->pmport];
11285 mutex_exit(&cportinfo->cport_mutex);
11286
11287 rval = sata_probe_device(sata_hba_inst, sata_device);
11288 if (rval != SATA_SUCCESS ||
11289 sata_device->satadev_type == SATA_DTYPE_UNKNOWN) {
11290 return (SATA_FAILURE);
11291 }
11292
11293 mutex_enter(&pmportinfo->pmport_mutex);
11294 sata_show_drive_info(sata_hba_inst,
11295 SATA_PMPORTINFO_DRV_INFO(pmportinfo));
11296
11297 if ((sata_device->satadev_type & SATA_VALID_DEV_TYPE) == 0) {
11298 /*
11299 * Could not determine device type.
11300 * Degrade this device to unknown.
11301 */
11302 pmportinfo->pmport_dev_type = SATA_DTYPE_UNKNOWN;
11303 mutex_exit(&pmportinfo->pmport_mutex);
11304 return (SATA_SUCCESS);
11305 }
11306 pmportinfo->pmport_dev_type = sata_device->satadev_type;
11307 pmportinfo->pmport_tgtnode_clean = B_TRUE;
11308 mutex_exit(&pmportinfo->pmport_mutex);
11309
11310 /*
11311 * Initialize device to the desired state.
11312 * Even if it fails, the device will still
11313 * attach but syslog will show the warning.
11314 */
11315 if (sata_initialize_device(sata_hba_inst,
11316 pmportinfo->pmport_sata_drive) != SATA_SUCCESS) {
11317 /* Retry */
11318 rval = sata_initialize_device(sata_hba_inst,
11319 pmportinfo->pmport_sata_drive);
11320
11321 if (rval == SATA_RETRY)
11322 sata_log(sata_hba_inst, CE_WARN,
11323 "SATA device at port %d:%d - "
11324 "default device features could not be set."
11325 " Device may not operate as expected.",
11326 cport, pmport);
11327 }
11328
11329 cdip = sata_create_target_node(pdip, sata_hba_inst, saddr);
11330 if (cdip == NULL) {
11331 /*
11332 * Attaching target node failed.
11333 * We retain sata_drive_info structure...
11334 */
11335 return (SATA_SUCCESS);
11336 }
11337 mutex_enter(&pmportinfo->pmport_mutex);
11338 pmportinfo->pmport_sata_drive->satadrv_state |=
11339 SATA_STATE_READY;
11340 mutex_exit(&pmportinfo->pmport_mutex);
11341
11342 break;
11343
11344 default:
11345 return (SATA_FAILURE);
11346 }
11347
11348 return (SATA_SUCCESS);
11349 }
11350
11351 /*
11352 * Clean up target node at specific address.
11353 *
11354 * NOTE: No Mutex should be hold.
11355 */
11356 static int
sata_offline_device(sata_hba_inst_t * sata_hba_inst,sata_device_t * sata_device,sata_drive_info_t * sdinfo)11357 sata_offline_device(sata_hba_inst_t *sata_hba_inst,
11358 sata_device_t *sata_device, sata_drive_info_t *sdinfo)
11359 {
11360 uint8_t cport, pmport, qual;
11361 dev_info_t *tdip;
11362
11363 cport = sata_device->satadev_addr.cport;
11364 pmport = sata_device->satadev_addr.pmport;
11365 qual = sata_device->satadev_addr.qual;
11366
11367 if (qual == SATA_ADDR_DCPORT) {
11368 SATA_LOG_D((sata_hba_inst, CE_WARN,
11369 "sata_hba_ioctl: disconnect device at port %d", cport));
11370 } else {
11371 SATA_LOG_D((sata_hba_inst, CE_WARN,
11372 "sata_hba_ioctl: disconnect device at port %d:%d",
11373 cport, pmport));
11374 }
11375
11376 /* We are addressing attached device, not a port */
11377 sata_device->satadev_addr.qual =
11378 sdinfo->satadrv_addr.qual;
11379 tdip = sata_get_scsi_target_dip(SATA_DIP(sata_hba_inst),
11380 &sata_device->satadev_addr);
11381 if (tdip != NULL && ndi_devi_offline(tdip,
11382 NDI_DEVI_REMOVE) != NDI_SUCCESS) {
11383 /*
11384 * Problem :
11385 * The target node remained attached.
11386 * This happens when the device file was open
11387 * or a node was waiting for resources.
11388 * Cannot do anything about it.
11389 */
11390 if (qual == SATA_ADDR_DCPORT) {
11391 SATA_LOG_D((sata_hba_inst, CE_WARN,
11392 "sata_hba_ioctl: disconnect: could "
11393 "not unconfigure device before "
11394 "disconnecting the SATA port %d",
11395 cport));
11396 } else {
11397 SATA_LOG_D((sata_hba_inst, CE_WARN,
11398 "sata_hba_ioctl: disconnect: could "
11399 "not unconfigure device before "
11400 "disconnecting the SATA port %d:%d",
11401 cport, pmport));
11402 }
11403 /*
11404 * Set DEVICE REMOVED state in the target
11405 * node. It will prevent access to the device
11406 * even when a new device is attached, until
11407 * the old target node is released, removed and
11408 * recreated for a new device.
11409 */
11410 sata_set_device_removed(tdip);
11411
11412 /*
11413 * Instruct event daemon to try the target
11414 * node cleanup later.
11415 */
11416 sata_set_target_node_cleanup(
11417 sata_hba_inst, &sata_device->satadev_addr);
11418 }
11419
11420
11421 return (SATA_SUCCESS);
11422 }
11423
11424
11425 /*
11426 * Create scsi target node for attached device, create node properties and
11427 * attach the node.
11428 * The node could be removed if the device onlining fails.
11429 *
11430 * A dev_info_t pointer is returned if operation is successful, NULL is
11431 * returned otherwise.
11432 */
11433
11434 static dev_info_t *
sata_create_target_node(dev_info_t * dip,sata_hba_inst_t * sata_hba_inst,sata_address_t * sata_addr)11435 sata_create_target_node(dev_info_t *dip, sata_hba_inst_t *sata_hba_inst,
11436 sata_address_t *sata_addr)
11437 {
11438 dev_info_t *cdip = NULL;
11439 int rval;
11440 char *nname = NULL;
11441 char **compatible = NULL;
11442 int ncompatible;
11443 struct scsi_inquiry inq;
11444 sata_device_t sata_device;
11445 sata_drive_info_t *sdinfo;
11446 int target;
11447 int i;
11448
11449 sata_device.satadev_rev = SATA_DEVICE_REV;
11450 sata_device.satadev_addr = *sata_addr;
11451
11452 mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst, sata_addr->cport)));
11453
11454 sdinfo = sata_get_device_info(sata_hba_inst, &sata_device);
11455
11456 target = SATA_TO_SCSI_TARGET(sata_addr->cport,
11457 sata_addr->pmport, sata_addr->qual);
11458
11459 if (sdinfo == NULL) {
11460 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
11461 sata_addr->cport)));
11462 SATA_LOG_D((sata_hba_inst, CE_WARN,
11463 "sata_create_target_node: no sdinfo for target %x",
11464 target));
11465 return (NULL);
11466 }
11467
11468 /*
11469 * create or get scsi inquiry data, expected by
11470 * scsi_hba_nodename_compatible_get()
11471 * SATA hard disks get Identify Data translated into Inguiry Data.
11472 * ATAPI devices respond directly to Inquiry request.
11473 */
11474 if (sdinfo->satadrv_type == SATA_DTYPE_ATADISK) {
11475 sata_identdev_to_inquiry(sata_hba_inst, sdinfo,
11476 (uint8_t *)&inq);
11477 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
11478 sata_addr->cport)));
11479 } else { /* Assume supported ATAPI device */
11480 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
11481 sata_addr->cport)));
11482 if (sata_get_atapi_inquiry_data(sata_hba_inst, sata_addr,
11483 &inq) == SATA_FAILURE)
11484 return (NULL);
11485 /*
11486 * Save supported ATAPI transport version
11487 */
11488 sdinfo->satadrv_atapi_trans_ver =
11489 SATA_ATAPI_TRANS_VERSION(&inq);
11490 }
11491
11492 /* determine the node name and compatible */
11493 scsi_hba_nodename_compatible_get(&inq, NULL,
11494 inq.inq_dtype, NULL, &nname, &compatible, &ncompatible);
11495
11496 #ifdef SATA_DEBUG
11497 if (sata_debug_flags & SATA_DBG_NODES) {
11498 if (nname == NULL) {
11499 cmn_err(CE_NOTE, "sata_create_target_node: "
11500 "cannot determine nodename for target %d\n",
11501 target);
11502 } else {
11503 cmn_err(CE_WARN, "sata_create_target_node: "
11504 "target %d nodename: %s\n", target, nname);
11505 }
11506 if (compatible == NULL) {
11507 cmn_err(CE_WARN,
11508 "sata_create_target_node: no compatible name\n");
11509 } else {
11510 for (i = 0; i < ncompatible; i++) {
11511 cmn_err(CE_WARN, "sata_create_target_node: "
11512 "compatible name: %s\n", compatible[i]);
11513 }
11514 }
11515 }
11516 #endif
11517
11518 /* if nodename can't be determined, log error and exit */
11519 if (nname == NULL) {
11520 SATA_LOG_D((sata_hba_inst, CE_WARN,
11521 "sata_create_target_node: cannot determine nodename "
11522 "for target %d\n", target));
11523 scsi_hba_nodename_compatible_free(nname, compatible);
11524 return (NULL);
11525 }
11526 /*
11527 * Create scsi target node
11528 */
11529 ndi_devi_alloc_sleep(dip, nname, (pnode_t)DEVI_SID_NODEID, &cdip);
11530 rval = ndi_prop_update_string(DDI_DEV_T_NONE, cdip,
11531 "device-type", "scsi");
11532
11533 if (rval != DDI_PROP_SUCCESS) {
11534 SATA_LOG_D((sata_hba_inst, CE_WARN, "sata_create_target_node: "
11535 "updating device_type prop failed %d", rval));
11536 goto fail;
11537 }
11538
11539 /*
11540 * Create target node properties: target & lun
11541 */
11542 rval = ndi_prop_update_int(DDI_DEV_T_NONE, cdip, "target", target);
11543 if (rval != DDI_PROP_SUCCESS) {
11544 SATA_LOG_D((sata_hba_inst, CE_WARN, "sata_create_target_node: "
11545 "updating target prop failed %d", rval));
11546 goto fail;
11547 }
11548 rval = ndi_prop_update_int(DDI_DEV_T_NONE, cdip, "lun", 0);
11549 if (rval != DDI_PROP_SUCCESS) {
11550 SATA_LOG_D((sata_hba_inst, CE_WARN, "sata_create_target_node: "
11551 "updating target prop failed %d", rval));
11552 goto fail;
11553 }
11554
11555 if (sdinfo->satadrv_type & SATA_DTYPE_ATAPI) {
11556 /*
11557 * Add "variant" property
11558 */
11559 rval = ndi_prop_update_string(DDI_DEV_T_NONE, cdip,
11560 "variant", "atapi");
11561 if (rval != DDI_PROP_SUCCESS) {
11562 SATA_LOG_D((sata_hba_inst, CE_WARN,
11563 "sata_create_target_node: variant atapi "
11564 "property could not be created: %d", rval));
11565 goto fail;
11566 }
11567 }
11568 /* decorate the node with compatible */
11569 if (ndi_prop_update_string_array(DDI_DEV_T_NONE, cdip, "compatible",
11570 compatible, ncompatible) != DDI_PROP_SUCCESS) {
11571 SATA_LOG_D((sata_hba_inst, CE_WARN,
11572 "sata_create_target_node: FAIL compatible props cdip 0x%p",
11573 (void *)cdip));
11574 goto fail;
11575 }
11576
11577 if (sdinfo->satadrv_type == SATA_DTYPE_ATADISK) {
11578 /*
11579 * Add "sata-phy" property
11580 */
11581 if (ndi_prop_update_int(DDI_DEV_T_NONE, cdip, "sata-phy",
11582 (int)sata_addr->cport) != DDI_PROP_SUCCESS) {
11583 SATA_LOG_D((sata_hba_inst, CE_WARN,
11584 "sata_create_target_node: failed to create "
11585 "\"sata-phy\" property: port %d",
11586 sata_addr->cport));
11587 }
11588 }
11589
11590
11591 /*
11592 * Now, try to attach the driver. If probing of the device fails,
11593 * the target node may be removed
11594 */
11595 rval = ndi_devi_online(cdip, NDI_ONLINE_ATTACH);
11596
11597 scsi_hba_nodename_compatible_free(nname, compatible);
11598
11599 if (rval == NDI_SUCCESS)
11600 return (cdip);
11601
11602 /* target node was removed - are we sure? */
11603 return (NULL);
11604
11605 fail:
11606 scsi_hba_nodename_compatible_free(nname, compatible);
11607 ddi_prop_remove_all(cdip);
11608 rval = ndi_devi_free(cdip);
11609 if (rval != NDI_SUCCESS) {
11610 SATA_LOG_D((sata_hba_inst, CE_WARN, "sata_create_target_node: "
11611 "node removal failed %d", rval));
11612 }
11613 sata_log(sata_hba_inst, CE_WARN, "sata_create_target_node: "
11614 "cannot create target node for SATA device at port %d",
11615 sata_addr->cport);
11616 return (NULL);
11617 }
11618
11619 /*
11620 * Remove a target node.
11621 */
11622 static void
sata_remove_target_node(sata_hba_inst_t * sata_hba_inst,sata_address_t * sata_addr)11623 sata_remove_target_node(sata_hba_inst_t *sata_hba_inst,
11624 sata_address_t *sata_addr)
11625 {
11626 dev_info_t *tdip;
11627 uint8_t cport = sata_addr->cport;
11628 uint8_t pmport = sata_addr->pmport;
11629 uint8_t qual = sata_addr->qual;
11630
11631 /* Note the sata daemon uses the address of the port/pmport */
11632 ASSERT(qual == SATA_ADDR_CPORT || qual == SATA_ADDR_PMPORT);
11633
11634 /* Remove target node */
11635 tdip = sata_get_target_dip(SATA_DIP(sata_hba_inst), cport, pmport);
11636 if (tdip != NULL) {
11637 /*
11638 * Target node exists. Unconfigure device
11639 * then remove the target node (one ndi
11640 * operation).
11641 */
11642 if (ndi_devi_offline(tdip, NDI_DEVI_REMOVE) != NDI_SUCCESS) {
11643 /*
11644 * PROBLEM - no device, but target node remained. This
11645 * happens when the file was open or node was waiting
11646 * for resources.
11647 */
11648 SATA_LOG_D((sata_hba_inst, CE_WARN,
11649 "sata_remove_target_node: "
11650 "Failed to remove target node for "
11651 "detached SATA device."));
11652 /*
11653 * Set target node state to DEVI_DEVICE_REMOVED. But
11654 * re-check first that the node still exists.
11655 */
11656 tdip = sata_get_target_dip(SATA_DIP(sata_hba_inst),
11657 cport, pmport);
11658 if (tdip != NULL) {
11659 sata_set_device_removed(tdip);
11660 /*
11661 * Instruct event daemon to retry the cleanup
11662 * later.
11663 */
11664 sata_set_target_node_cleanup(sata_hba_inst,
11665 sata_addr);
11666 }
11667 }
11668
11669 if (qual == SATA_ADDR_CPORT)
11670 sata_log(sata_hba_inst, CE_WARN,
11671 "SATA device detached at port %d", cport);
11672 else
11673 sata_log(sata_hba_inst, CE_WARN,
11674 "SATA device detached at port %d:%d",
11675 cport, pmport);
11676 }
11677 #ifdef SATA_DEBUG
11678 else {
11679 if (qual == SATA_ADDR_CPORT)
11680 sata_log(sata_hba_inst, CE_WARN,
11681 "target node not found at port %d", cport);
11682 else
11683 sata_log(sata_hba_inst, CE_WARN,
11684 "target node not found at port %d:%d",
11685 cport, pmport);
11686 }
11687 #endif
11688 }
11689
11690
11691 /*
11692 * Re-probe sata port, check for a device and attach info
11693 * structures when necessary. Identify Device data is fetched, if possible.
11694 * Assumption: sata address is already validated.
11695 * SATA_SUCCESS is returned if port is re-probed sucessfully, regardless of
11696 * the presence of a device and its type.
11697 *
11698 * flag arg specifies that the function should try multiple times to identify
11699 * device type and to initialize it, or it should return immediately on failure.
11700 * SATA_DEV_IDENTIFY_RETRY - retry
11701 * SATA_DEV_IDENTIFY_NORETRY - no retry
11702 *
11703 * SATA_FAILURE is returned if one of the operations failed.
11704 *
11705 * This function cannot be called in interrupt context - it may sleep.
11706 *
11707 * Note: Port multiplier is supported.
11708 */
11709 static int
sata_reprobe_port(sata_hba_inst_t * sata_hba_inst,sata_device_t * sata_device,int flag)11710 sata_reprobe_port(sata_hba_inst_t *sata_hba_inst, sata_device_t *sata_device,
11711 int flag)
11712 {
11713 sata_cport_info_t *cportinfo;
11714 sata_pmult_info_t *pmultinfo;
11715 sata_drive_info_t *sdinfo, *osdinfo;
11716 boolean_t init_device = B_FALSE;
11717 int prev_device_type = SATA_DTYPE_NONE;
11718 int prev_device_settings = 0;
11719 int prev_device_state = 0;
11720 clock_t start_time = 0;
11721 int retry = B_FALSE;
11722 uint8_t cport = sata_device->satadev_addr.cport;
11723 int rval_probe, rval_init;
11724
11725 /*
11726 * If target is pmport, sata_reprobe_pmport() will handle it.
11727 */
11728 if (sata_device->satadev_addr.qual == SATA_ADDR_PMPORT ||
11729 sata_device->satadev_addr.qual == SATA_ADDR_DPMPORT)
11730 return (sata_reprobe_pmport(sata_hba_inst, sata_device, flag));
11731
11732 /* We only care about host sata cport for now */
11733 cportinfo = SATA_CPORT_INFO(sata_hba_inst,
11734 sata_device->satadev_addr.cport);
11735
11736 /*
11737 * If a port multiplier was previously attached (we have no idea it
11738 * still there or not), sata_reprobe_pmult() will handle it.
11739 */
11740 if (cportinfo->cport_dev_type == SATA_DTYPE_PMULT)
11741 return (sata_reprobe_pmult(sata_hba_inst, sata_device, flag));
11742
11743 /* Store sata_drive_info when a non-pmult device was attached. */
11744 osdinfo = SATA_CPORTINFO_DRV_INFO(cportinfo);
11745 if (osdinfo != NULL) {
11746 /*
11747 * We are re-probing port with a previously attached device.
11748 * Save previous device type and settings.
11749 */
11750 prev_device_type = cportinfo->cport_dev_type;
11751 prev_device_settings = osdinfo->satadrv_settings;
11752 prev_device_state = osdinfo->satadrv_state;
11753 }
11754 if (flag == SATA_DEV_IDENTIFY_RETRY) {
11755 start_time = ddi_get_lbolt();
11756 retry = B_TRUE;
11757 }
11758 retry_probe:
11759
11760 /* probe port */
11761 mutex_enter(&cportinfo->cport_mutex);
11762 cportinfo->cport_state &= ~SATA_PORT_STATE_CLEAR_MASK;
11763 cportinfo->cport_state |= SATA_STATE_PROBING;
11764 mutex_exit(&cportinfo->cport_mutex);
11765
11766 rval_probe = (*SATA_PROBE_PORT_FUNC(sata_hba_inst))
11767 (SATA_DIP(sata_hba_inst), sata_device);
11768
11769 mutex_enter(&cportinfo->cport_mutex);
11770 if (rval_probe != SATA_SUCCESS) {
11771 cportinfo->cport_state = SATA_PSTATE_FAILED;
11772 mutex_exit(&cportinfo->cport_mutex);
11773 SATA_LOG_D((sata_hba_inst, CE_WARN, "sata_reprobe_port: "
11774 "SATA port %d probing failed",
11775 cportinfo->cport_addr.cport));
11776 return (SATA_FAILURE);
11777 }
11778
11779 /*
11780 * update sata port state and set device type
11781 */
11782 sata_update_port_info(sata_hba_inst, sata_device);
11783 cportinfo->cport_state &= ~SATA_STATE_PROBING;
11784
11785 /*
11786 * Sanity check - Port is active? Is the link active?
11787 * Is there any device attached?
11788 */
11789 if ((cportinfo->cport_state &
11790 (SATA_PSTATE_SHUTDOWN | SATA_PSTATE_FAILED)) ||
11791 (cportinfo->cport_scr.sstatus & SATA_PORT_DEVLINK_UP_MASK) !=
11792 SATA_PORT_DEVLINK_UP) {
11793 /*
11794 * Port in non-usable state or no link active/no device.
11795 * Free info structure if necessary (direct attached drive
11796 * only, for now!
11797 */
11798 sdinfo = SATA_CPORTINFO_DRV_INFO(cportinfo);
11799 SATA_CPORTINFO_DRV_INFO(cportinfo) = NULL;
11800 /* Add here differentiation for device attached or not */
11801 cportinfo->cport_dev_type = SATA_DTYPE_NONE;
11802 mutex_exit(&cportinfo->cport_mutex);
11803 if (sdinfo != NULL)
11804 kmem_free(sdinfo, sizeof (sata_drive_info_t));
11805 return (SATA_SUCCESS);
11806 }
11807
11808 cportinfo->cport_state |= SATA_STATE_READY;
11809 cportinfo->cport_state |= SATA_STATE_PROBED;
11810
11811 cportinfo->cport_dev_type = sata_device->satadev_type;
11812 sdinfo = SATA_CPORTINFO_DRV_INFO(cportinfo);
11813
11814 /*
11815 * If we are re-probing the port, there may be
11816 * sata_drive_info structure attached
11817 */
11818 if (sata_device->satadev_type == SATA_DTYPE_NONE) {
11819
11820 /*
11821 * There is no device, so remove device info structure,
11822 * if necessary.
11823 */
11824 /* Device change: Drive -> None */
11825 SATA_CPORTINFO_DRV_INFO(cportinfo) = NULL;
11826 cportinfo->cport_dev_type = SATA_DTYPE_NONE;
11827 if (sdinfo != NULL) {
11828 kmem_free(sdinfo, sizeof (sata_drive_info_t));
11829 sata_log(sata_hba_inst, CE_WARN,
11830 "SATA device detached "
11831 "from port %d", cportinfo->cport_addr.cport);
11832 }
11833 mutex_exit(&cportinfo->cport_mutex);
11834 return (SATA_SUCCESS);
11835
11836 }
11837
11838 if (sata_device->satadev_type != SATA_DTYPE_PMULT) {
11839
11840 /* Device (may) change: Drive -> Drive */
11841 if (sdinfo == NULL) {
11842 /*
11843 * There is some device attached, but there is
11844 * no sata_drive_info structure - allocate one
11845 */
11846 mutex_exit(&cportinfo->cport_mutex);
11847 sdinfo = kmem_zalloc(
11848 sizeof (sata_drive_info_t), KM_SLEEP);
11849 mutex_enter(&cportinfo->cport_mutex);
11850 /*
11851 * Recheck, that the port state did not change when we
11852 * released mutex.
11853 */
11854 if (cportinfo->cport_state & SATA_STATE_READY) {
11855 SATA_CPORTINFO_DRV_INFO(cportinfo) = sdinfo;
11856 sdinfo->satadrv_addr = cportinfo->cport_addr;
11857 sdinfo->satadrv_addr.qual = SATA_ADDR_DCPORT;
11858 sdinfo->satadrv_type = SATA_DTYPE_UNKNOWN;
11859 sdinfo->satadrv_state = SATA_STATE_UNKNOWN;
11860 } else {
11861 /*
11862 * Port is not in ready state, we
11863 * cannot attach a device.
11864 */
11865 mutex_exit(&cportinfo->cport_mutex);
11866 kmem_free(sdinfo, sizeof (sata_drive_info_t));
11867 return (SATA_SUCCESS);
11868 }
11869 /*
11870 * Since we are adding device, presumably new one,
11871 * indicate that it should be initalized,
11872 * as well as some internal framework states).
11873 */
11874 init_device = B_TRUE;
11875 }
11876 cportinfo->cport_dev_type = SATA_DTYPE_UNKNOWN;
11877 sata_device->satadev_addr.qual = sdinfo->satadrv_addr.qual;
11878 } else {
11879 /* Device change: Drive -> PMult */
11880 SATA_CPORTINFO_DRV_INFO(cportinfo) = NULL;
11881 if (sdinfo != NULL) {
11882 kmem_free(sdinfo, sizeof (sata_drive_info_t));
11883 sata_log(sata_hba_inst, CE_WARN,
11884 "SATA device detached "
11885 "from port %d", cportinfo->cport_addr.cport);
11886 }
11887
11888 sata_log(sata_hba_inst, CE_WARN,
11889 "SATA port multiplier detected at port %d",
11890 cportinfo->cport_addr.cport);
11891
11892 mutex_exit(&cportinfo->cport_mutex);
11893 if (sata_alloc_pmult(sata_hba_inst, sata_device) !=
11894 SATA_SUCCESS)
11895 return (SATA_FAILURE);
11896 sata_show_pmult_info(sata_hba_inst, sata_device);
11897 mutex_enter(&cportinfo->cport_mutex);
11898
11899 /*
11900 * Mark all the port multiplier port behind the port
11901 * multiplier behind with link events, so that the sata daemon
11902 * will update their status.
11903 */
11904 pmultinfo = SATA_PMULT_INFO(sata_hba_inst, cport);
11905 pmultinfo->pmult_event_flags |= SATA_EVNT_DEVICE_RESET;
11906 mutex_exit(&cportinfo->cport_mutex);
11907 return (SATA_SUCCESS);
11908 }
11909 mutex_exit(&cportinfo->cport_mutex);
11910
11911 /*
11912 * Figure out what kind of device we are really
11913 * dealing with. Failure of identifying device does not fail this
11914 * function.
11915 */
11916 rval_probe = sata_probe_device(sata_hba_inst, sata_device);
11917 rval_init = SATA_FAILURE;
11918 mutex_enter(&cportinfo->cport_mutex);
11919 if (rval_probe == SATA_SUCCESS) {
11920 /*
11921 * If we are dealing with the same type of a device as before,
11922 * restore its settings flags.
11923 */
11924 if (osdinfo != NULL &&
11925 sata_device->satadev_type == prev_device_type)
11926 sdinfo->satadrv_settings = prev_device_settings;
11927
11928 mutex_exit(&cportinfo->cport_mutex);
11929 rval_init = SATA_SUCCESS;
11930 /* Set initial device features, if necessary */
11931 if (init_device == B_TRUE) {
11932 rval_init = sata_initialize_device(sata_hba_inst,
11933 sdinfo);
11934 }
11935 if (rval_init == SATA_SUCCESS)
11936 return (rval_init);
11937 /* else we will retry if retry was asked for */
11938
11939 } else {
11940 /*
11941 * If there was some device info before we probe the device,
11942 * restore previous device setting, so we can retry from scratch
11943 * later. Providing, of course, that device has not disapear
11944 * during probing process.
11945 */
11946 if (sata_device->satadev_type != SATA_DTYPE_NONE) {
11947 if (osdinfo != NULL) {
11948 cportinfo->cport_dev_type = prev_device_type;
11949 sdinfo->satadrv_type = prev_device_type;
11950 sdinfo->satadrv_state = prev_device_state;
11951 }
11952 } else {
11953 /* device is gone */
11954 kmem_free(sdinfo, sizeof (sata_drive_info_t));
11955 cportinfo->cport_dev_type = SATA_DTYPE_NONE;
11956 SATA_CPORTINFO_DRV_INFO(cportinfo) = NULL;
11957 mutex_exit(&cportinfo->cport_mutex);
11958 return (SATA_SUCCESS);
11959 }
11960 mutex_exit(&cportinfo->cport_mutex);
11961 }
11962
11963 if (retry) {
11964 clock_t cur_time = ddi_get_lbolt();
11965 /*
11966 * A device was not successfully identified or initialized.
11967 * Track retry time for device identification.
11968 */
11969 if ((cur_time - start_time) <
11970 drv_usectohz(SATA_DEV_REPROBE_TIMEOUT)) {
11971 /* sleep for a while */
11972 delay(drv_usectohz(SATA_DEV_RETRY_DLY));
11973 goto retry_probe;
11974 }
11975 /* else no more retries */
11976 mutex_enter(&cportinfo->cport_mutex);
11977 if (SATA_CPORTINFO_DRV_INFO(cportinfo) != NULL) {
11978 if (rval_init == SATA_RETRY) {
11979 /*
11980 * Setting drive features have failed, but
11981 * because the drive is still accessible,
11982 * keep it and emit a warning message.
11983 */
11984 sata_log(sata_hba_inst, CE_WARN,
11985 "SATA device at port %d - desired "
11986 "drive features could not be set. "
11987 "Device may not operate as expected.",
11988 cportinfo->cport_addr.cport);
11989 } else {
11990 SATA_CPORTINFO_DRV_INFO(cportinfo)->
11991 satadrv_state = SATA_DSTATE_FAILED;
11992 }
11993 }
11994 mutex_exit(&cportinfo->cport_mutex);
11995 }
11996 return (SATA_SUCCESS);
11997 }
11998
11999 /*
12000 * Reprobe a controller port that connected to a port multiplier.
12001 *
12002 * NOTE: No Mutex should be hold.
12003 */
12004 static int
sata_reprobe_pmult(sata_hba_inst_t * sata_hba_inst,sata_device_t * sata_device,int flag)12005 sata_reprobe_pmult(sata_hba_inst_t *sata_hba_inst, sata_device_t *sata_device,
12006 int flag)
12007 {
12008 _NOTE(ARGUNUSED(flag))
12009 sata_cport_info_t *cportinfo;
12010 sata_pmult_info_t *pmultinfo;
12011 uint8_t cport = sata_device->satadev_addr.cport;
12012 int rval_probe;
12013
12014 cportinfo = SATA_CPORT_INFO(sata_hba_inst, cport);
12015 pmultinfo = SATA_PMULT_INFO(sata_hba_inst, cport);
12016
12017 /* probe port */
12018 mutex_enter(&cportinfo->cport_mutex);
12019 cportinfo->cport_state &= ~SATA_PORT_STATE_CLEAR_MASK;
12020 cportinfo->cport_state |= SATA_STATE_PROBING;
12021 mutex_exit(&cportinfo->cport_mutex);
12022
12023 rval_probe = (*SATA_PROBE_PORT_FUNC(sata_hba_inst))
12024 (SATA_DIP(sata_hba_inst), sata_device);
12025
12026 mutex_enter(&cportinfo->cport_mutex);
12027 if (rval_probe != SATA_SUCCESS) {
12028 cportinfo->cport_state = SATA_PSTATE_FAILED;
12029 SATA_LOG_D((sata_hba_inst, CE_WARN, "sata_reprobe_pmult: "
12030 "SATA port %d probing failed", cport));
12031 sata_log(sata_hba_inst, CE_WARN,
12032 "SATA port multiplier detached at port %d", cport);
12033 mutex_exit(&cportinfo->cport_mutex);
12034 sata_free_pmult(sata_hba_inst, sata_device);
12035 return (SATA_FAILURE);
12036 }
12037
12038 /*
12039 * update sata port state and set device type
12040 */
12041 sata_update_port_info(sata_hba_inst, sata_device);
12042 cportinfo->cport_state &= ~SATA_STATE_PROBING;
12043 cportinfo->cport_state |= SATA_STATE_PROBED;
12044
12045 /*
12046 * Sanity check - Port is active? Is the link active?
12047 * Is there any device attached?
12048 */
12049 if ((cportinfo->cport_state &
12050 (SATA_PSTATE_SHUTDOWN | SATA_PSTATE_FAILED)) ||
12051 (cportinfo->cport_scr.sstatus & SATA_PORT_DEVLINK_UP_MASK) !=
12052 SATA_PORT_DEVLINK_UP ||
12053 (sata_device->satadev_type == SATA_DTYPE_NONE)) {
12054 cportinfo->cport_dev_type = SATA_DTYPE_NONE;
12055 mutex_exit(&cportinfo->cport_mutex);
12056 sata_free_pmult(sata_hba_inst, sata_device);
12057 sata_log(sata_hba_inst, CE_WARN,
12058 "SATA port multiplier detached at port %d", cport);
12059 return (SATA_SUCCESS);
12060 }
12061
12062 /*
12063 * Device changed: PMult -> Non-PMult
12064 *
12065 * This situation is uncommon, most possibly being caused by errors
12066 * after which the port multiplier is not correct initialized and
12067 * recognized. In that case the new device will be marked as unknown
12068 * and will not be automatically probed in this routine. Instead
12069 * system administrator could manually restart it via cfgadm(8).
12070 */
12071 if (sata_device->satadev_type != SATA_DTYPE_PMULT) {
12072 cportinfo->cport_dev_type = SATA_DTYPE_UNKNOWN;
12073 mutex_exit(&cportinfo->cport_mutex);
12074 sata_free_pmult(sata_hba_inst, sata_device);
12075 sata_log(sata_hba_inst, CE_WARN,
12076 "SATA port multiplier detached at port %d", cport);
12077 return (SATA_FAILURE);
12078 }
12079
12080 /*
12081 * Now we know it is a port multiplier. However, if this is not the
12082 * previously attached port multiplier - they may have different
12083 * pmport numbers - we need to re-allocate data structures for every
12084 * pmport and drive.
12085 *
12086 * Port multipliers of the same model have identical values in these
12087 * registers, so it is still necessary to update the information of
12088 * all drives attached to the previous port multiplier afterwards.
12089 */
12090 /* Device changed: PMult -> another PMult */
12091 mutex_exit(&cportinfo->cport_mutex);
12092 sata_free_pmult(sata_hba_inst, sata_device);
12093 if (sata_alloc_pmult(sata_hba_inst, sata_device) != SATA_SUCCESS)
12094 return (SATA_FAILURE);
12095 mutex_enter(&cportinfo->cport_mutex);
12096
12097 SATADBG1(SATA_DBG_PMULT, sata_hba_inst,
12098 "SATA port multiplier [changed] at port %d", cport);
12099 sata_log(sata_hba_inst, CE_WARN,
12100 "SATA port multiplier detected at port %d", cport);
12101
12102 /*
12103 * Mark all the port multiplier port behind the port
12104 * multiplier behind with link events, so that the sata daemon
12105 * will update their status.
12106 */
12107 pmultinfo->pmult_event_flags |= SATA_EVNT_DEVICE_RESET;
12108 mutex_exit(&cportinfo->cport_mutex);
12109
12110 return (SATA_SUCCESS);
12111 }
12112
12113 /*
12114 * Re-probe a port multiplier port, check for a device and attach info
12115 * structures when necessary. Identify Device data is fetched, if possible.
12116 * Assumption: sata address is already validated as port multiplier port.
12117 * SATA_SUCCESS is returned if port is re-probed sucessfully, regardless of
12118 * the presence of a device and its type.
12119 *
12120 * flag arg specifies that the function should try multiple times to identify
12121 * device type and to initialize it, or it should return immediately on failure.
12122 * SATA_DEV_IDENTIFY_RETRY - retry
12123 * SATA_DEV_IDENTIFY_NORETRY - no retry
12124 *
12125 * SATA_FAILURE is returned if one of the operations failed.
12126 *
12127 * This function cannot be called in interrupt context - it may sleep.
12128 *
12129 * NOTE: Should be only called by sata_probe_port() in case target port is a
12130 * port multiplier port.
12131 * NOTE: No Mutex should be hold.
12132 */
12133 static int
sata_reprobe_pmport(sata_hba_inst_t * sata_hba_inst,sata_device_t * sata_device,int flag)12134 sata_reprobe_pmport(sata_hba_inst_t *sata_hba_inst, sata_device_t *sata_device,
12135 int flag)
12136 {
12137 sata_cport_info_t *cportinfo = NULL;
12138 sata_pmport_info_t *pmportinfo = NULL;
12139 sata_drive_info_t *sdinfo, *osdinfo;
12140 sata_device_t sdevice;
12141 boolean_t init_device = B_FALSE;
12142 int prev_device_type = SATA_DTYPE_NONE;
12143 int prev_device_settings = 0;
12144 int prev_device_state = 0;
12145 clock_t start_time;
12146 uint8_t cport = sata_device->satadev_addr.cport;
12147 uint8_t pmport = sata_device->satadev_addr.pmport;
12148 int rval;
12149
12150 cportinfo = SATA_CPORT_INFO(sata_hba_inst, cport);
12151 pmportinfo = SATA_PMPORT_INFO(sata_hba_inst, cport, pmport);
12152 osdinfo = SATA_PMPORTINFO_DRV_INFO(pmportinfo);
12153
12154 if (osdinfo != NULL) {
12155 /*
12156 * We are re-probing port with a previously attached device.
12157 * Save previous device type and settings.
12158 */
12159 prev_device_type = pmportinfo->pmport_dev_type;
12160 prev_device_settings = osdinfo->satadrv_settings;
12161 prev_device_state = osdinfo->satadrv_state;
12162 }
12163
12164 start_time = ddi_get_lbolt();
12165
12166 /* check parent status */
12167 mutex_enter(&cportinfo->cport_mutex);
12168 if ((cportinfo->cport_state &
12169 (SATA_PSTATE_SHUTDOWN | SATA_PSTATE_FAILED)) ||
12170 (cportinfo->cport_scr.sstatus & SATA_PORT_DEVLINK_UP_MASK) !=
12171 SATA_PORT_DEVLINK_UP) {
12172 mutex_exit(&cportinfo->cport_mutex);
12173 return (SATA_FAILURE);
12174 }
12175 mutex_exit(&cportinfo->cport_mutex);
12176
12177 retry_probe_pmport:
12178
12179 /* probe port */
12180 mutex_enter(&pmportinfo->pmport_mutex);
12181 pmportinfo->pmport_state &= ~SATA_PORT_STATE_CLEAR_MASK;
12182 pmportinfo->pmport_state |= SATA_STATE_PROBING;
12183 mutex_exit(&pmportinfo->pmport_mutex);
12184
12185 rval = (*SATA_PROBE_PORT_FUNC(sata_hba_inst))
12186 (SATA_DIP(sata_hba_inst), sata_device);
12187
12188 /* might need retry because we cannot touch registers. */
12189 if (rval == SATA_FAILURE) {
12190 mutex_enter(&pmportinfo->pmport_mutex);
12191 pmportinfo->pmport_state = SATA_PSTATE_FAILED;
12192 mutex_exit(&pmportinfo->pmport_mutex);
12193 SATA_LOG_D((sata_hba_inst, CE_WARN, "sata_reprobe_pmport: "
12194 "SATA port %d:%d probing failed",
12195 cport, pmport));
12196 return (SATA_FAILURE);
12197 } else if (rval == SATA_RETRY) {
12198 SATA_LOG_D((sata_hba_inst, CE_WARN, "sata_reprobe_pmport: "
12199 "SATA port %d:%d probing failed, retrying...",
12200 cport, pmport));
12201 clock_t cur_time = ddi_get_lbolt();
12202 /*
12203 * A device was not successfully identified or initialized.
12204 * Track retry time for device identification.
12205 */
12206 if ((cur_time - start_time) <
12207 drv_usectohz(SATA_DEV_REPROBE_TIMEOUT)) {
12208 /* sleep for a while */
12209 delay(drv_usectohz(SATA_DEV_RETRY_DLY));
12210 goto retry_probe_pmport;
12211 } else {
12212 mutex_enter(&pmportinfo->pmport_mutex);
12213 if (SATA_PMPORTINFO_DRV_INFO(pmportinfo) != NULL)
12214 SATA_PMPORTINFO_DRV_INFO(pmportinfo)->
12215 satadrv_state = SATA_DSTATE_FAILED;
12216 mutex_exit(&pmportinfo->pmport_mutex);
12217 return (SATA_SUCCESS);
12218 }
12219 }
12220
12221 /*
12222 * Sanity check - Controller port is active? Is the link active?
12223 * Is it still a port multiplier?
12224 */
12225 if ((cportinfo->cport_state &
12226 (SATA_PSTATE_SHUTDOWN | SATA_PSTATE_FAILED)) ||
12227 (cportinfo->cport_scr.sstatus & SATA_PORT_DEVLINK_UP_MASK) !=
12228 SATA_PORT_DEVLINK_UP ||
12229 (cportinfo->cport_dev_type != SATA_DTYPE_PMULT)) {
12230 /*
12231 * Port in non-usable state or no link active/no
12232 * device. Free info structure.
12233 */
12234 cportinfo->cport_dev_type = SATA_DTYPE_UNKNOWN;
12235
12236 sdevice.satadev_addr.cport = cport;
12237 sdevice.satadev_addr.pmport = pmport;
12238 sdevice.satadev_addr.qual = SATA_ADDR_PMULT;
12239 mutex_exit(&cportinfo->cport_mutex);
12240
12241 sata_free_pmult(sata_hba_inst, &sdevice);
12242 return (SATA_FAILURE);
12243 }
12244
12245 /* SATA_SUCCESS NOW */
12246 /*
12247 * update sata port state and set device type
12248 */
12249 mutex_enter(&pmportinfo->pmport_mutex);
12250 sata_update_pmport_info(sata_hba_inst, sata_device);
12251 pmportinfo->pmport_state &= ~SATA_STATE_PROBING;
12252
12253 /*
12254 * Sanity check - Port is active? Is the link active?
12255 * Is there any device attached?
12256 */
12257 if ((pmportinfo->pmport_state &
12258 (SATA_PSTATE_SHUTDOWN | SATA_PSTATE_FAILED)) ||
12259 (pmportinfo->pmport_scr.sstatus & SATA_PORT_DEVLINK_UP_MASK) !=
12260 SATA_PORT_DEVLINK_UP) {
12261 /*
12262 * Port in non-usable state or no link active/no device.
12263 * Free info structure if necessary (direct attached drive
12264 * only, for now!
12265 */
12266 sdinfo = SATA_PMPORTINFO_DRV_INFO(pmportinfo);
12267 SATA_PMPORTINFO_DRV_INFO(pmportinfo) = NULL;
12268 /* Add here differentiation for device attached or not */
12269 pmportinfo->pmport_dev_type = SATA_DTYPE_NONE;
12270 mutex_exit(&pmportinfo->pmport_mutex);
12271 if (sdinfo != NULL)
12272 kmem_free(sdinfo, sizeof (sata_drive_info_t));
12273 return (SATA_SUCCESS);
12274 }
12275
12276 pmportinfo->pmport_state |= SATA_STATE_READY;
12277 pmportinfo->pmport_dev_type = sata_device->satadev_type;
12278 sdinfo = SATA_PMPORTINFO_DRV_INFO(pmportinfo);
12279
12280 /*
12281 * If we are re-probing the port, there may be
12282 * sata_drive_info structure attached
12283 * (or sata_pm_info, if PMult is supported).
12284 */
12285 if (sata_device->satadev_type == SATA_DTYPE_NONE) {
12286 /*
12287 * There is no device, so remove device info structure,
12288 * if necessary.
12289 */
12290 SATA_PMPORTINFO_DRV_INFO(pmportinfo) = NULL;
12291 pmportinfo->pmport_dev_type = SATA_DTYPE_NONE;
12292 if (sdinfo != NULL) {
12293 kmem_free(sdinfo, sizeof (sata_drive_info_t));
12294 sata_log(sata_hba_inst, CE_WARN,
12295 "SATA device detached from port %d:%d",
12296 cport, pmport);
12297 }
12298 mutex_exit(&pmportinfo->pmport_mutex);
12299 return (SATA_SUCCESS);
12300 }
12301
12302 /* this should not be a pmult */
12303 ASSERT(sata_device->satadev_type != SATA_DTYPE_PMULT);
12304 if (sdinfo == NULL) {
12305 /*
12306 * There is some device attached, but there is
12307 * no sata_drive_info structure - allocate one
12308 */
12309 mutex_exit(&pmportinfo->pmport_mutex);
12310 sdinfo = kmem_zalloc(sizeof (sata_drive_info_t),
12311 KM_SLEEP);
12312 mutex_enter(&pmportinfo->pmport_mutex);
12313 /*
12314 * Recheck, that the port state did not change when we
12315 * released mutex.
12316 */
12317 if (pmportinfo->pmport_state & SATA_STATE_READY) {
12318 SATA_PMPORTINFO_DRV_INFO(pmportinfo) = sdinfo;
12319 sdinfo->satadrv_addr = pmportinfo->pmport_addr;
12320 sdinfo->satadrv_addr.qual = SATA_ADDR_DPMPORT;
12321 sdinfo->satadrv_type = SATA_DTYPE_UNKNOWN;
12322 sdinfo->satadrv_state = SATA_STATE_UNKNOWN;
12323 } else {
12324 /*
12325 * Port is not in ready state, we
12326 * cannot attach a device.
12327 */
12328 mutex_exit(&pmportinfo->pmport_mutex);
12329 kmem_free(sdinfo, sizeof (sata_drive_info_t));
12330 return (SATA_SUCCESS);
12331 }
12332 /*
12333 * Since we are adding device, presumably new one,
12334 * indicate that it should be initalized,
12335 * as well as some internal framework states).
12336 */
12337 init_device = B_TRUE;
12338 }
12339
12340 pmportinfo->pmport_dev_type = SATA_DTYPE_UNKNOWN;
12341 sata_device->satadev_addr.qual = sdinfo->satadrv_addr.qual;
12342
12343 mutex_exit(&pmportinfo->pmport_mutex);
12344 /*
12345 * Figure out what kind of device we are really
12346 * dealing with.
12347 */
12348 rval = sata_probe_device(sata_hba_inst, sata_device);
12349
12350 mutex_enter(&pmportinfo->pmport_mutex);
12351 if (rval == SATA_SUCCESS) {
12352 /*
12353 * If we are dealing with the same type of a device as before,
12354 * restore its settings flags.
12355 */
12356 if (osdinfo != NULL &&
12357 sata_device->satadev_type == prev_device_type)
12358 sdinfo->satadrv_settings = prev_device_settings;
12359
12360 mutex_exit(&pmportinfo->pmport_mutex);
12361 /* Set initial device features, if necessary */
12362 if (init_device == B_TRUE) {
12363 rval = sata_initialize_device(sata_hba_inst, sdinfo);
12364 }
12365 if (rval == SATA_SUCCESS)
12366 return (rval);
12367 } else {
12368 /*
12369 * If there was some device info before we probe the device,
12370 * restore previous device setting, so we can retry from scratch
12371 * later. Providing, of course, that device has not disappeared
12372 * during probing process.
12373 */
12374 if (sata_device->satadev_type != SATA_DTYPE_NONE) {
12375 if (osdinfo != NULL) {
12376 pmportinfo->pmport_dev_type = prev_device_type;
12377 sdinfo->satadrv_type = prev_device_type;
12378 sdinfo->satadrv_state = prev_device_state;
12379 }
12380 } else {
12381 /* device is gone */
12382 kmem_free(sdinfo, sizeof (sata_drive_info_t));
12383 pmportinfo->pmport_dev_type = SATA_DTYPE_NONE;
12384 SATA_PMPORTINFO_DRV_INFO(pmportinfo) = NULL;
12385 mutex_exit(&pmportinfo->pmport_mutex);
12386 return (SATA_SUCCESS);
12387 }
12388 mutex_exit(&pmportinfo->pmport_mutex);
12389 }
12390
12391 if (flag == SATA_DEV_IDENTIFY_RETRY) {
12392 clock_t cur_time = ddi_get_lbolt();
12393 /*
12394 * A device was not successfully identified or initialized.
12395 * Track retry time for device identification.
12396 */
12397 if ((cur_time - start_time) <
12398 drv_usectohz(SATA_DEV_REPROBE_TIMEOUT)) {
12399 /* sleep for a while */
12400 delay(drv_usectohz(SATA_DEV_RETRY_DLY));
12401 goto retry_probe_pmport;
12402 } else {
12403 mutex_enter(&pmportinfo->pmport_mutex);
12404 if (SATA_PMPORTINFO_DRV_INFO(pmportinfo) != NULL)
12405 SATA_PMPORTINFO_DRV_INFO(pmportinfo)->
12406 satadrv_state = SATA_DSTATE_FAILED;
12407 mutex_exit(&pmportinfo->pmport_mutex);
12408 }
12409 }
12410 return (SATA_SUCCESS);
12411 }
12412
12413 /*
12414 * Allocated related structure for a port multiplier and its device ports
12415 *
12416 * Port multiplier should be ready and probed, and related information like
12417 * the number of the device ports should be store in sata_device_t.
12418 *
12419 * NOTE: No Mutex should be hold.
12420 */
12421 static int
sata_alloc_pmult(sata_hba_inst_t * sata_hba_inst,sata_device_t * sata_device)12422 sata_alloc_pmult(sata_hba_inst_t *sata_hba_inst, sata_device_t *sata_device)
12423 {
12424 dev_info_t *dip = SATA_DIP(sata_hba_inst);
12425 sata_cport_info_t *cportinfo = NULL;
12426 sata_pmult_info_t *pmultinfo = NULL;
12427 sata_pmport_info_t *pmportinfo = NULL;
12428 sata_device_t sd;
12429 dev_t minor_number;
12430 char name[16];
12431 uint8_t cport = sata_device->satadev_addr.cport;
12432 int rval;
12433 int npmport;
12434
12435 cportinfo = SATA_CPORT_INFO(sata_hba_inst, cport);
12436
12437 /* This function might be called while a port-mult is hot-plugged. */
12438 mutex_enter(&cportinfo->cport_mutex);
12439
12440 /* dev_type's not updated when get called from sata_reprobe_port() */
12441 if (SATA_CPORTINFO_PMULT_INFO(cportinfo) == NULL) {
12442 /* Create a pmult_info structure */
12443 SATA_CPORTINFO_PMULT_INFO(cportinfo) =
12444 kmem_zalloc(sizeof (sata_pmult_info_t), KM_SLEEP);
12445 }
12446 pmultinfo = SATA_CPORTINFO_PMULT_INFO(cportinfo);
12447
12448 pmultinfo->pmult_addr = sata_device->satadev_addr;
12449 pmultinfo->pmult_addr.qual = SATA_ADDR_PMULT;
12450 pmultinfo->pmult_state = SATA_STATE_PROBING;
12451
12452 /*
12453 * Probe the port multiplier with qualifier SATA_ADDR_PMULT_SPEC,
12454 * The HBA driver should initialize and register the port multiplier,
12455 * sata_register_pmult() will fill following fields,
12456 * + sata_pmult_info.pmult_gscr
12457 * + sata_pmult_info.pmult_num_dev_ports
12458 */
12459 sd.satadev_addr = sata_device->satadev_addr;
12460 sd.satadev_addr.qual = SATA_ADDR_PMULT_SPEC;
12461 mutex_exit(&cportinfo->cport_mutex);
12462 rval = (*SATA_PROBE_PORT_FUNC(sata_hba_inst))
12463 (SATA_DIP(sata_hba_inst), &sd);
12464 mutex_enter(&cportinfo->cport_mutex);
12465
12466 if (rval != SATA_SUCCESS ||
12467 (sd.satadev_type != SATA_DTYPE_PMULT) ||
12468 !(sd.satadev_state & SATA_DSTATE_PMULT_INIT)) {
12469 SATA_CPORTINFO_PMULT_INFO(cportinfo) = NULL;
12470 kmem_free(pmultinfo, sizeof (sata_pmult_info_t));
12471 cportinfo->cport_state = SATA_PSTATE_FAILED;
12472 cportinfo->cport_dev_type = SATA_DTYPE_UNKNOWN;
12473 mutex_exit(&cportinfo->cport_mutex);
12474 SATADBG1(SATA_DBG_PMULT, sata_hba_inst,
12475 "sata_alloc_pmult: failed to initialize pmult "
12476 "at port %d.", cport)
12477 return (SATA_FAILURE);
12478 }
12479
12480 /* Initialize pmport_info structure */
12481 for (npmport = 0; npmport < pmultinfo->pmult_num_dev_ports;
12482 npmport++) {
12483
12484 /* if everything is allocated, skip */
12485 if (SATA_PMPORT_INFO(sata_hba_inst, cport, npmport) != NULL)
12486 continue;
12487
12488 pmportinfo = kmem_zalloc(sizeof (sata_pmport_info_t), KM_SLEEP);
12489 mutex_init(&pmportinfo->pmport_mutex, NULL, MUTEX_DRIVER, NULL);
12490 mutex_exit(&cportinfo->cport_mutex);
12491
12492 mutex_enter(&pmportinfo->pmport_mutex);
12493 pmportinfo->pmport_addr.cport = cport;
12494 pmportinfo->pmport_addr.pmport = (uint8_t)npmport;
12495 pmportinfo->pmport_addr.qual = SATA_ADDR_PMPORT;
12496 pmportinfo->pmport_state &= ~SATA_PORT_STATE_CLEAR_MASK;
12497 mutex_exit(&pmportinfo->pmport_mutex);
12498
12499 mutex_enter(&cportinfo->cport_mutex);
12500 SATA_PMPORT_INFO(sata_hba_inst, cport, npmport) = pmportinfo;
12501
12502 /* Create an attachment point */
12503 minor_number = SATA_MAKE_AP_MINOR(ddi_get_instance(dip),
12504 cport, (uint8_t)npmport, SATA_ADDR_PMPORT);
12505 (void) sprintf(name, "%d.%d", cport, npmport);
12506
12507 if (ddi_create_minor_node(dip, name, S_IFCHR, minor_number,
12508 DDI_NT_SATA_ATTACHMENT_POINT, 0) != DDI_SUCCESS) {
12509 sata_log(sata_hba_inst, CE_WARN, "sata_hba_attach: "
12510 "cannot create SATA attachment point for "
12511 "port %d:%d", cport, npmport);
12512 }
12513 }
12514
12515 pmultinfo->pmult_state &= ~SATA_STATE_PROBING;
12516 pmultinfo->pmult_state |= (SATA_STATE_PROBED|SATA_STATE_READY);
12517 cportinfo->cport_dev_type = SATA_DTYPE_PMULT;
12518
12519 mutex_exit(&cportinfo->cport_mutex);
12520 return (SATA_SUCCESS);
12521 }
12522
12523 /*
12524 * Free data structures when a port multiplier is removed.
12525 *
12526 * NOTE: No Mutex should be hold.
12527 */
12528 static void
sata_free_pmult(sata_hba_inst_t * sata_hba_inst,sata_device_t * sata_device)12529 sata_free_pmult(sata_hba_inst_t *sata_hba_inst, sata_device_t *sata_device)
12530 {
12531 sata_cport_info_t *cportinfo;
12532 sata_pmult_info_t *pmultinfo;
12533 sata_pmport_info_t *pmportinfo;
12534 sata_device_t pmport_device;
12535 sata_drive_info_t *sdinfo;
12536 dev_info_t *tdip;
12537 char name[16];
12538 uint8_t cport = sata_device->satadev_addr.cport;
12539 int npmport;
12540
12541 cportinfo = SATA_CPORT_INFO(sata_hba_inst, cport);
12542
12543 /* This function might be called while port-mult is hot plugged. */
12544 mutex_enter(&cportinfo->cport_mutex);
12545
12546 cportinfo->cport_dev_type = SATA_DTYPE_NONE;
12547 pmultinfo = SATA_CPORTINFO_PMULT_INFO(cportinfo);
12548 ASSERT(pmultinfo != NULL);
12549
12550 /* Free pmport_info structure */
12551 for (npmport = 0; npmport < pmultinfo->pmult_num_dev_ports;
12552 npmport++) {
12553 pmportinfo = SATA_PMPORT_INFO(sata_hba_inst, cport, npmport);
12554 if (pmportinfo == NULL)
12555 continue;
12556 mutex_exit(&cportinfo->cport_mutex);
12557
12558 mutex_enter(&pmportinfo->pmport_mutex);
12559 sdinfo = pmportinfo->pmport_sata_drive;
12560 SATA_PMPORTINFO_DRV_INFO(pmportinfo) = NULL;
12561 mutex_exit(&pmportinfo->pmport_mutex);
12562
12563 /* Remove attachment point. */
12564 name[0] = '\0';
12565 (void) sprintf(name, "%d.%d", cport, npmport);
12566 ddi_remove_minor_node(SATA_DIP(sata_hba_inst), name);
12567 sata_log(sata_hba_inst, CE_NOTE,
12568 "Remove attachment point of port %d:%d",
12569 cport, npmport);
12570
12571 /*
12572 * Rumove target node
12573 */
12574 bzero(&pmport_device, sizeof (sata_device_t));
12575 pmport_device.satadev_rev = SATA_DEVICE_REV;
12576 pmport_device.satadev_addr.cport = cport;
12577 pmport_device.satadev_addr.pmport = (uint8_t)npmport;
12578 pmport_device.satadev_addr.qual = SATA_ADDR_DPMPORT;
12579
12580 tdip = sata_get_scsi_target_dip(SATA_DIP(sata_hba_inst),
12581 &(pmport_device.satadev_addr));
12582 if (tdip != NULL && ndi_devi_offline(tdip,
12583 NDI_DEVI_REMOVE) != NDI_SUCCESS) {
12584 /*
12585 * Problem :
12586 * The target node remained attached.
12587 * This happens when the device file was open
12588 * or a node was waiting for resources.
12589 * Cannot do anything about it.
12590 */
12591 SATA_LOG_D((sata_hba_inst, CE_WARN,
12592 "sata_free_pmult: could not unconfigure device "
12593 "before disconnecting the SATA port %d:%d",
12594 cport, npmport));
12595
12596 /*
12597 * Set DEVICE REMOVED state in the target
12598 * node. It will prevent access to the device
12599 * even when a new device is attached, until
12600 * the old target node is released, removed and
12601 * recreated for a new device.
12602 */
12603 sata_set_device_removed(tdip);
12604
12605 /*
12606 * Instruct event daemon to try the target
12607 * node cleanup later.
12608 */
12609 sata_set_target_node_cleanup(
12610 sata_hba_inst, &(pmport_device.satadev_addr));
12611
12612 }
12613 mutex_enter(&cportinfo->cport_mutex);
12614
12615 /*
12616 * Add here differentiation for device attached or not
12617 */
12618 if (sdinfo != NULL) {
12619 sata_log(sata_hba_inst, CE_WARN,
12620 "SATA device detached from port %d:%d",
12621 cport, npmport);
12622 kmem_free(sdinfo, sizeof (sata_drive_info_t));
12623 }
12624
12625 mutex_destroy(&pmportinfo->pmport_mutex);
12626 kmem_free(pmportinfo, sizeof (sata_pmport_info_t));
12627 }
12628
12629 kmem_free(pmultinfo, sizeof (sata_pmult_info_t));
12630
12631 cportinfo->cport_devp.cport_sata_pmult = NULL;
12632
12633 sata_log(sata_hba_inst, CE_WARN,
12634 "SATA port multiplier detached at port %d", cport);
12635
12636 mutex_exit(&cportinfo->cport_mutex);
12637 }
12638
12639 /*
12640 * Initialize device
12641 * Specified device is initialized to a default state.
12642 *
12643 * Returns SATA_SUCCESS if all device features are set successfully,
12644 * SATA_RETRY if device is accessible but device features were not set
12645 * successfully, and SATA_FAILURE otherwise.
12646 */
12647 static int
sata_initialize_device(sata_hba_inst_t * sata_hba_inst,sata_drive_info_t * sdinfo)12648 sata_initialize_device(sata_hba_inst_t *sata_hba_inst,
12649 sata_drive_info_t *sdinfo)
12650 {
12651 int rval;
12652
12653 sata_save_drive_settings(sdinfo);
12654
12655 sdinfo->satadrv_settings |= SATA_DEV_READ_AHEAD;
12656
12657 sata_init_write_cache_mode(sdinfo);
12658
12659 rval = sata_set_drive_features(sata_hba_inst, sdinfo, 0);
12660
12661 /* Determine current data transfer mode */
12662 if ((sdinfo->satadrv_id.ai_cap & SATA_DMA_SUPPORT) == 0) {
12663 sdinfo->satadrv_settings &= ~SATA_DEV_DMA;
12664 } else if ((sdinfo->satadrv_id.ai_validinfo &
12665 SATA_VALIDINFO_88) != 0 &&
12666 (sdinfo->satadrv_id.ai_ultradma & SATA_UDMA_SEL_MASK) != 0) {
12667 sdinfo->satadrv_settings |= SATA_DEV_DMA;
12668 } else if ((sdinfo->satadrv_id.ai_dworddma &
12669 SATA_MDMA_SEL_MASK) != 0) {
12670 sdinfo->satadrv_settings |= SATA_DEV_DMA;
12671 } else
12672 /* DMA supported, not no DMA transfer mode is selected !? */
12673 sdinfo->satadrv_settings &= ~SATA_DEV_DMA;
12674
12675 if ((sdinfo->satadrv_id.ai_cmdset83 & 0x20) &&
12676 (sdinfo->satadrv_id.ai_features86 & 0x20))
12677 sdinfo->satadrv_power_level = SATA_POWER_STANDBY;
12678 else
12679 sdinfo->satadrv_power_level = SATA_POWER_ACTIVE;
12680
12681 return (rval);
12682 }
12683
12684
12685 /*
12686 * Initialize write cache mode.
12687 *
12688 * The default write cache setting for SATA HDD is provided by sata_write_cache
12689 * static variable. ATAPI CD/DVDs devices have write cache default is
12690 * determined by sata_atapicdvd_write_cache static variable.
12691 * ATAPI tape devices have write cache default is determined by
12692 * sata_atapitape_write_cache static variable.
12693 * ATAPI disk devices have write cache default is determined by
12694 * sata_atapidisk_write_cache static variable.
12695 * 1 - enable
12696 * 0 - disable
12697 * any other value - current drive setting
12698 *
12699 * Although there is not reason to disable write cache on CD/DVD devices,
12700 * tape devices and ATAPI disk devices, the default setting control is provided
12701 * for the maximun flexibility.
12702 *
12703 * In the future, it may be overridden by the
12704 * disk-write-cache-enable property setting, if it is defined.
12705 * Returns SATA_SUCCESS if all device features are set successfully,
12706 * SATA_FAILURE otherwise.
12707 */
12708 static void
sata_init_write_cache_mode(sata_drive_info_t * sdinfo)12709 sata_init_write_cache_mode(sata_drive_info_t *sdinfo)
12710 {
12711 switch (sdinfo->satadrv_type) {
12712 case SATA_DTYPE_ATADISK:
12713 if (sata_write_cache == 1)
12714 sdinfo->satadrv_settings |= SATA_DEV_WRITE_CACHE;
12715 else if (sata_write_cache == 0)
12716 sdinfo->satadrv_settings &= ~SATA_DEV_WRITE_CACHE;
12717 /*
12718 * When sata_write_cache value is not 0 or 1,
12719 * a current setting of the drive's write cache is used.
12720 */
12721 break;
12722 case SATA_DTYPE_ATAPICD:
12723 if (sata_atapicdvd_write_cache == 1)
12724 sdinfo->satadrv_settings |= SATA_DEV_WRITE_CACHE;
12725 else if (sata_atapicdvd_write_cache == 0)
12726 sdinfo->satadrv_settings &= ~SATA_DEV_WRITE_CACHE;
12727 /*
12728 * When sata_atapicdvd_write_cache value is not 0 or 1,
12729 * a current setting of the drive's write cache is used.
12730 */
12731 break;
12732 case SATA_DTYPE_ATAPITAPE:
12733 if (sata_atapitape_write_cache == 1)
12734 sdinfo->satadrv_settings |= SATA_DEV_WRITE_CACHE;
12735 else if (sata_atapitape_write_cache == 0)
12736 sdinfo->satadrv_settings &= ~SATA_DEV_WRITE_CACHE;
12737 /*
12738 * When sata_atapitape_write_cache value is not 0 or 1,
12739 * a current setting of the drive's write cache is used.
12740 */
12741 break;
12742 case SATA_DTYPE_ATAPIDISK:
12743 if (sata_atapidisk_write_cache == 1)
12744 sdinfo->satadrv_settings |= SATA_DEV_WRITE_CACHE;
12745 else if (sata_atapidisk_write_cache == 0)
12746 sdinfo->satadrv_settings &= ~SATA_DEV_WRITE_CACHE;
12747 /*
12748 * When sata_atapidisk_write_cache value is not 0 or 1,
12749 * a current setting of the drive's write cache is used.
12750 */
12751 break;
12752 }
12753 }
12754
12755
12756 /*
12757 * Validate sata address.
12758 * Specified cport, pmport and qualifier has to match
12759 * passed sata_scsi configuration info.
12760 * The presence of an attached device is not verified.
12761 *
12762 * Returns 0 when address is valid, -1 otherwise.
12763 */
12764 static int
sata_validate_sata_address(sata_hba_inst_t * sata_hba_inst,int cport,int pmport,int qual)12765 sata_validate_sata_address(sata_hba_inst_t *sata_hba_inst, int cport,
12766 int pmport, int qual)
12767 {
12768 if (qual == SATA_ADDR_DCPORT && pmport != 0)
12769 goto invalid_address;
12770 if (cport >= SATA_NUM_CPORTS(sata_hba_inst))
12771 goto invalid_address;
12772 if ((qual == SATA_ADDR_DPMPORT || qual == SATA_ADDR_PMPORT) &&
12773 ((SATA_CPORT_DEV_TYPE(sata_hba_inst, cport) != SATA_DTYPE_PMULT) ||
12774 (SATA_PMULT_INFO(sata_hba_inst, cport) == NULL) ||
12775 (pmport >= SATA_NUM_PMPORTS(sata_hba_inst, cport))))
12776 goto invalid_address;
12777
12778 return (0);
12779
12780 invalid_address:
12781 return (-1);
12782
12783 }
12784
12785 /*
12786 * Validate scsi address
12787 * SCSI target address is translated into SATA cport/pmport and compared
12788 * with a controller port/device configuration. LUN has to be 0.
12789 * Returns 0 if a scsi target refers to an attached device,
12790 * returns 1 if address is valid but no valid device is attached,
12791 * returns 2 if address is valid but device type is unknown (not valid device),
12792 * returns -1 if bad address or device is of an unsupported type.
12793 * Upon return sata_device argument is set.
12794 *
12795 * Port multiplier is supported now.
12796 */
12797 static int
sata_validate_scsi_address(sata_hba_inst_t * sata_hba_inst,struct scsi_address * ap,sata_device_t * sata_device)12798 sata_validate_scsi_address(sata_hba_inst_t *sata_hba_inst,
12799 struct scsi_address *ap, sata_device_t *sata_device)
12800 {
12801 int cport, pmport, qual, rval;
12802
12803 rval = -1; /* Invalid address */
12804 if (ap->a_lun != 0)
12805 goto out;
12806
12807 qual = SCSI_TO_SATA_ADDR_QUAL(ap->a_target);
12808 cport = SCSI_TO_SATA_CPORT(ap->a_target);
12809 pmport = SCSI_TO_SATA_PMPORT(ap->a_target);
12810
12811 if (qual != SATA_ADDR_DCPORT && qual != SATA_ADDR_DPMPORT)
12812 goto out;
12813
12814 if (sata_validate_sata_address(sata_hba_inst, cport, pmport, qual) ==
12815 0) {
12816
12817 sata_cport_info_t *cportinfo;
12818 sata_pmult_info_t *pmultinfo;
12819 sata_drive_info_t *sdinfo = NULL;
12820
12821 sata_device->satadev_addr.qual = qual;
12822 sata_device->satadev_addr.cport = cport;
12823 sata_device->satadev_addr.pmport = pmport;
12824 sata_device->satadev_rev = SATA_DEVICE_REV_1;
12825
12826 rval = 1; /* Valid sata address */
12827
12828 cportinfo = SATA_CPORT_INFO(sata_hba_inst, cport);
12829 if (qual == SATA_ADDR_DCPORT) {
12830 if (cportinfo == NULL ||
12831 cportinfo->cport_dev_type == SATA_DTYPE_NONE)
12832 goto out;
12833
12834 sdinfo = SATA_CPORTINFO_DRV_INFO(cportinfo);
12835 if (cportinfo->cport_dev_type == SATA_DTYPE_UNKNOWN &&
12836 sdinfo != NULL) {
12837 rval = 2;
12838 goto out;
12839 }
12840
12841 if ((cportinfo->cport_dev_type &
12842 SATA_VALID_DEV_TYPE) == 0) {
12843 rval = -1;
12844 goto out;
12845 }
12846
12847 } else if (qual == SATA_ADDR_DPMPORT) {
12848 pmultinfo = SATA_CPORTINFO_PMULT_INFO(cportinfo);
12849 if (pmultinfo == NULL) {
12850 rval = -1;
12851 goto out;
12852 }
12853 if (SATA_PMPORT_INFO(sata_hba_inst, cport, pmport) ==
12854 NULL ||
12855 SATA_PMPORT_DEV_TYPE(sata_hba_inst, cport,
12856 pmport) == SATA_DTYPE_NONE)
12857 goto out;
12858
12859 sdinfo = SATA_PMPORT_DRV_INFO(sata_hba_inst, cport,
12860 pmport);
12861 if (SATA_PMPORT_DEV_TYPE(sata_hba_inst, cport,
12862 pmport) == SATA_DTYPE_UNKNOWN && sdinfo != NULL) {
12863 rval = 2;
12864 goto out;
12865 }
12866
12867 if ((SATA_PMPORT_DEV_TYPE(sata_hba_inst, cport,
12868 pmport) & SATA_VALID_DEV_TYPE) == 0) {
12869 rval = -1;
12870 goto out;
12871 }
12872
12873 } else {
12874 rval = -1;
12875 goto out;
12876 }
12877 if ((sdinfo == NULL) ||
12878 (sdinfo->satadrv_type & SATA_VALID_DEV_TYPE) == 0)
12879 goto out;
12880
12881 sata_device->satadev_type = sdinfo->satadrv_type;
12882
12883 return (0);
12884 }
12885 out:
12886 if (rval > 0) {
12887 SATADBG2(SATA_DBG_SCSI_IF, sata_hba_inst,
12888 "sata_validate_scsi_address: no valid target %x lun %x",
12889 ap->a_target, ap->a_lun);
12890 }
12891 return (rval);
12892 }
12893
12894 /*
12895 * Find dip corresponding to passed device number
12896 *
12897 * Returns NULL if invalid device number is passed or device cannot be found,
12898 * Returns dip is device is found.
12899 */
12900 static dev_info_t *
sata_devt_to_devinfo(dev_t dev)12901 sata_devt_to_devinfo(dev_t dev)
12902 {
12903 dev_info_t *dip;
12904 #ifndef __lock_lint
12905 struct devnames *dnp;
12906 major_t major = getmajor(dev);
12907 int instance = SATA_MINOR2INSTANCE(getminor(dev));
12908
12909 if (major >= devcnt)
12910 return (NULL);
12911
12912 dnp = &devnamesp[major];
12913 LOCK_DEV_OPS(&(dnp->dn_lock));
12914 dip = dnp->dn_head;
12915 while (dip && (ddi_get_instance(dip) != instance)) {
12916 dip = ddi_get_next(dip);
12917 }
12918 UNLOCK_DEV_OPS(&(dnp->dn_lock));
12919 #endif
12920
12921 return (dip);
12922 }
12923
12924
12925 /*
12926 * Probe device.
12927 * This function issues Identify Device command and initializes local
12928 * sata_drive_info structure if the device can be identified.
12929 * The device type is determined by examining Identify Device
12930 * command response.
12931 * If the sata_hba_inst has linked drive info structure for this
12932 * device address, the Identify Device data is stored into sata_drive_info
12933 * structure linked to the port info structure.
12934 *
12935 * sata_device has to refer to the valid sata port(s) for HBA described
12936 * by sata_hba_inst structure.
12937 *
12938 * Returns:
12939 * SATA_SUCCESS if device type was successfully probed and port-linked
12940 * drive info structure was updated;
12941 * SATA_FAILURE if there is no device, or device was not probed
12942 * successully;
12943 * SATA_RETRY if device probe can be retried later.
12944 * If a device cannot be identified, sata_device's dev_state and dev_type
12945 * fields are set to unknown.
12946 * There are no retries in this function. Any retries should be managed by
12947 * the caller.
12948 */
12949
12950
12951 static int
sata_probe_device(sata_hba_inst_t * sata_hba_inst,sata_device_t * sata_device)12952 sata_probe_device(sata_hba_inst_t *sata_hba_inst, sata_device_t *sata_device)
12953 {
12954 sata_pmport_info_t *pmportinfo = NULL;
12955 sata_drive_info_t *sdinfo;
12956 sata_drive_info_t new_sdinfo; /* local drive info struct */
12957 int rval;
12958
12959 ASSERT((SATA_CPORT_STATE(sata_hba_inst,
12960 sata_device->satadev_addr.cport) &
12961 (SATA_STATE_PROBED | SATA_STATE_READY)) != 0);
12962
12963 sata_device->satadev_type = SATA_DTYPE_NONE;
12964
12965 mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst,
12966 sata_device->satadev_addr.cport)));
12967
12968 if (sata_device->satadev_addr.qual == SATA_ADDR_DPMPORT) {
12969 pmportinfo = SATA_PMPORT_INFO(sata_hba_inst,
12970 sata_device->satadev_addr.cport,
12971 sata_device->satadev_addr.pmport);
12972 ASSERT(pmportinfo != NULL);
12973 }
12974
12975 /* Get pointer to port-linked sata device info structure */
12976 sdinfo = sata_get_device_info(sata_hba_inst, sata_device);
12977 if (sdinfo != NULL) {
12978 sdinfo->satadrv_state &=
12979 ~(SATA_STATE_PROBED | SATA_STATE_READY);
12980 sdinfo->satadrv_state |= SATA_STATE_PROBING;
12981 } else {
12982 /* No device to probe */
12983 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
12984 sata_device->satadev_addr.cport)));
12985 sata_device->satadev_type = SATA_DTYPE_NONE;
12986 sata_device->satadev_state = SATA_STATE_UNKNOWN;
12987 return (SATA_FAILURE);
12988 }
12989 /*
12990 * Need to issue both types of identify device command and
12991 * determine device type by examining retreived data/status.
12992 * First, ATA Identify Device.
12993 */
12994 bzero(&new_sdinfo, sizeof (sata_drive_info_t));
12995 new_sdinfo.satadrv_addr = sata_device->satadev_addr;
12996 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
12997 sata_device->satadev_addr.cport)));
12998 new_sdinfo.satadrv_type = SATA_DTYPE_ATADISK;
12999 rval = sata_identify_device(sata_hba_inst, &new_sdinfo);
13000 if (rval == SATA_RETRY) {
13001 /* We may try to check for ATAPI device */
13002 if (SATA_FEATURES(sata_hba_inst) & SATA_CTLF_ATAPI) {
13003 /*
13004 * HBA supports ATAPI - try to issue Identify Packet
13005 * Device command.
13006 */
13007 new_sdinfo.satadrv_type = SATA_DTYPE_ATAPI;
13008 rval = sata_identify_device(sata_hba_inst, &new_sdinfo);
13009 }
13010 }
13011 if (rval == SATA_SUCCESS) {
13012 /*
13013 * Got something responding positively to ATA Identify Device
13014 * or to Identify Packet Device cmd.
13015 * Save last used device type.
13016 */
13017 sata_device->satadev_type = new_sdinfo.satadrv_type;
13018
13019 /* save device info, if possible */
13020 mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst,
13021 sata_device->satadev_addr.cport)));
13022 sdinfo = sata_get_device_info(sata_hba_inst, sata_device);
13023 if (sdinfo == NULL) {
13024 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
13025 sata_device->satadev_addr.cport)));
13026 return (SATA_FAILURE);
13027 }
13028 /*
13029 * Copy drive info into the port-linked drive info structure.
13030 */
13031 *sdinfo = new_sdinfo;
13032 sdinfo->satadrv_state &= ~SATA_STATE_PROBING;
13033 sdinfo->satadrv_state |= SATA_STATE_PROBED;
13034 if (sata_device->satadev_addr.qual == SATA_ADDR_DCPORT)
13035 SATA_CPORT_DEV_TYPE(sata_hba_inst,
13036 sata_device->satadev_addr.cport) =
13037 sdinfo->satadrv_type;
13038 else { /* SATA_ADDR_DPMPORT */
13039 mutex_enter(&pmportinfo->pmport_mutex);
13040 SATA_PMPORT_DEV_TYPE(sata_hba_inst,
13041 sata_device->satadev_addr.cport,
13042 sata_device->satadev_addr.pmport) =
13043 sdinfo->satadrv_type;
13044 mutex_exit(&pmportinfo->pmport_mutex);
13045 }
13046 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
13047 sata_device->satadev_addr.cport)));
13048 return (SATA_SUCCESS);
13049 }
13050
13051 /*
13052 * It may be SATA_RETRY or SATA_FAILURE return.
13053 * Looks like we cannot determine the device type at this time.
13054 */
13055 mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst,
13056 sata_device->satadev_addr.cport)));
13057 sdinfo = sata_get_device_info(sata_hba_inst, sata_device);
13058 if (sdinfo != NULL) {
13059 sata_device->satadev_type = SATA_DTYPE_UNKNOWN;
13060 sdinfo->satadrv_type = SATA_DTYPE_UNKNOWN;
13061 sdinfo->satadrv_state &= ~SATA_STATE_PROBING;
13062 sdinfo->satadrv_state |= SATA_STATE_PROBED;
13063 if (sata_device->satadev_addr.qual == SATA_ADDR_DCPORT)
13064 SATA_CPORT_DEV_TYPE(sata_hba_inst,
13065 sata_device->satadev_addr.cport) =
13066 SATA_DTYPE_UNKNOWN;
13067 else {
13068 /* SATA_ADDR_DPMPORT */
13069 mutex_enter(&pmportinfo->pmport_mutex);
13070 if ((SATA_PMULT_INFO(sata_hba_inst,
13071 sata_device->satadev_addr.cport) != NULL) &&
13072 (SATA_PMPORT_INFO(sata_hba_inst,
13073 sata_device->satadev_addr.cport,
13074 sata_device->satadev_addr.pmport) != NULL))
13075 SATA_PMPORT_DEV_TYPE(sata_hba_inst,
13076 sata_device->satadev_addr.cport,
13077 sata_device->satadev_addr.pmport) =
13078 SATA_DTYPE_UNKNOWN;
13079 mutex_exit(&pmportinfo->pmport_mutex);
13080 }
13081 }
13082 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
13083 sata_device->satadev_addr.cport)));
13084 return (rval);
13085 }
13086
13087
13088 /*
13089 * Get pointer to sata_drive_info structure.
13090 *
13091 * The sata_device has to contain address (cport, pmport and qualifier) for
13092 * specified sata_scsi structure.
13093 *
13094 * Returns NULL if device address is not valid for this HBA configuration.
13095 * Otherwise, returns a pointer to sata_drive_info structure.
13096 *
13097 * This function should be called with a port mutex held.
13098 */
13099 static sata_drive_info_t *
sata_get_device_info(sata_hba_inst_t * sata_hba_inst,sata_device_t * sata_device)13100 sata_get_device_info(sata_hba_inst_t *sata_hba_inst,
13101 sata_device_t *sata_device)
13102 {
13103 uint8_t cport = sata_device->satadev_addr.cport;
13104 uint8_t pmport = sata_device->satadev_addr.pmport;
13105 uint8_t qual = sata_device->satadev_addr.qual;
13106
13107 if (cport >= SATA_NUM_CPORTS(sata_hba_inst))
13108 return (NULL);
13109
13110 if (!(SATA_CPORT_STATE(sata_hba_inst, cport) &
13111 (SATA_STATE_PROBED | SATA_STATE_READY)))
13112 /* Port not probed yet */
13113 return (NULL);
13114
13115 if (SATA_CPORT_DEV_TYPE(sata_hba_inst, cport) == SATA_DTYPE_NONE)
13116 return (NULL);
13117
13118 if (qual == SATA_ADDR_DCPORT) {
13119 /* Request for a device on a controller port */
13120 if (SATA_CPORT_DEV_TYPE(sata_hba_inst, cport) ==
13121 SATA_DTYPE_PMULT)
13122 /* Port multiplier attached */
13123 return (NULL);
13124 return (SATA_CPORT_DRV_INFO(sata_hba_inst, cport));
13125 }
13126 if (qual == SATA_ADDR_DPMPORT) {
13127 if (SATA_CPORT_DEV_TYPE(sata_hba_inst, cport) !=
13128 SATA_DTYPE_PMULT)
13129 return (NULL);
13130
13131 if (pmport > SATA_NUM_PMPORTS(sata_hba_inst, cport))
13132 return (NULL);
13133
13134 if (!(SATA_PMPORT_STATE(sata_hba_inst, cport, pmport) &
13135 (SATA_STATE_PROBED | SATA_STATE_READY)))
13136 /* Port multiplier port not probed yet */
13137 return (NULL);
13138
13139 return (SATA_PMPORT_DRV_INFO(sata_hba_inst, cport, pmport));
13140 }
13141
13142 /* we should not get here */
13143 return (NULL);
13144 }
13145
13146
13147 /*
13148 * sata_identify_device.
13149 * Send Identify Device command to SATA HBA driver.
13150 * If command executes successfully, update sata_drive_info structure pointed
13151 * to by sdinfo argument, including Identify Device data.
13152 * If command fails, invalidate data in sata_drive_info.
13153 *
13154 * Cannot be called from interrupt level.
13155 *
13156 * Returns:
13157 * SATA_SUCCESS if the device was identified as a supported device,
13158 * SATA_RETRY if the device was not identified but could be retried,
13159 * SATA_FAILURE if the device was not identified and identify attempt
13160 * should not be retried.
13161 */
13162 static int
sata_identify_device(sata_hba_inst_t * sata_hba_inst,sata_drive_info_t * sdinfo)13163 sata_identify_device(sata_hba_inst_t *sata_hba_inst,
13164 sata_drive_info_t *sdinfo)
13165 {
13166 uint16_t cfg_word;
13167 int rval;
13168
13169 /* fetch device identify data */
13170 if ((rval = sata_fetch_device_identify_data(sata_hba_inst,
13171 sdinfo)) != SATA_SUCCESS)
13172 goto fail_unknown;
13173
13174 cfg_word = sdinfo->satadrv_id.ai_config;
13175
13176 /* Set the correct device type */
13177 if ((cfg_word & SATA_ATA_TYPE_MASK) == SATA_ATA_TYPE) {
13178 sdinfo->satadrv_type = SATA_DTYPE_ATADISK;
13179 } else if (cfg_word == SATA_CFA_TYPE) {
13180 /* It's a Compact Flash media via CF-to-SATA HDD adapter */
13181 sdinfo->satadrv_type = SATA_DTYPE_ATADISK;
13182 } else if ((cfg_word & SATA_ATAPI_TYPE_MASK) == SATA_ATAPI_TYPE) {
13183 switch (cfg_word & SATA_ATAPI_ID_DEV_TYPE) {
13184 case SATA_ATAPI_CDROM_DEV:
13185 sdinfo->satadrv_type = SATA_DTYPE_ATAPICD;
13186 break;
13187 case SATA_ATAPI_SQACC_DEV:
13188 sdinfo->satadrv_type = SATA_DTYPE_ATAPITAPE;
13189 break;
13190 case SATA_ATAPI_DIRACC_DEV:
13191 sdinfo->satadrv_type = SATA_DTYPE_ATAPIDISK;
13192 break;
13193 case SATA_ATAPI_PROC_DEV:
13194 sdinfo->satadrv_type = SATA_DTYPE_ATAPIPROC;
13195 break;
13196 default:
13197 sdinfo->satadrv_type = SATA_DTYPE_UNKNOWN;
13198 }
13199 } else {
13200 sdinfo->satadrv_type = SATA_DTYPE_UNKNOWN;
13201 }
13202
13203 if (sdinfo->satadrv_type == SATA_DTYPE_ATADISK) {
13204 if (sdinfo->satadrv_capacity == 0) {
13205 /* Non-LBA disk. Too bad... */
13206 sata_log(sata_hba_inst, CE_WARN,
13207 "SATA disk device at port %d does not support LBA",
13208 sdinfo->satadrv_addr.cport);
13209 rval = SATA_FAILURE;
13210 goto fail_unknown;
13211 }
13212 }
13213 #if 0
13214 /* Left for historical reason */
13215 /*
13216 * Some initial version of SATA spec indicated that at least
13217 * UDMA mode 4 has to be supported. It is not metioned in
13218 * SerialATA 2.6, so this restriction is removed.
13219 */
13220 /* Check for Ultra DMA modes 6 through 0 being supported */
13221 for (i = 6; i >= 0; --i) {
13222 if (sdinfo->satadrv_id.ai_ultradma & (1 << i))
13223 break;
13224 }
13225
13226 /*
13227 * At least UDMA 4 mode has to be supported. If mode 4 or
13228 * higher are not supported by the device, fail this
13229 * device.
13230 */
13231 if (i < 4) {
13232 /* No required Ultra DMA mode supported */
13233 sata_log(sata_hba_inst, CE_WARN,
13234 "SATA disk device at port %d does not support UDMA "
13235 "mode 4 or higher", sdinfo->satadrv_addr.cport);
13236 SATA_LOG_D((sata_hba_inst, CE_WARN,
13237 "mode 4 or higher required, %d supported", i));
13238 rval = SATA_FAILURE;
13239 goto fail_unknown;
13240 }
13241 #endif
13242
13243 /*
13244 * For Disk devices, if it doesn't support UDMA mode, we would
13245 * like to return failure directly.
13246 */
13247 if ((sdinfo->satadrv_type == SATA_DTYPE_ATADISK) &&
13248 !((sdinfo->satadrv_id.ai_validinfo & SATA_VALIDINFO_88) != 0 &&
13249 (sdinfo->satadrv_id.ai_ultradma & SATA_UDMA_SUP_MASK) != 0)) {
13250 sata_log(sata_hba_inst, CE_WARN,
13251 "SATA disk device at port %d does not support UDMA",
13252 sdinfo->satadrv_addr.cport);
13253 rval = SATA_FAILURE;
13254 goto fail_unknown;
13255 }
13256
13257 return (SATA_SUCCESS);
13258
13259 fail_unknown:
13260 /* Invalidate sata_drive_info ? */
13261 sdinfo->satadrv_type = SATA_DTYPE_UNKNOWN;
13262 sdinfo->satadrv_state = SATA_STATE_UNKNOWN;
13263 return (rval);
13264 }
13265
13266 /*
13267 * Log/display device information
13268 */
13269 static void
sata_show_drive_info(sata_hba_inst_t * sata_hba_inst,sata_drive_info_t * sdinfo)13270 sata_show_drive_info(sata_hba_inst_t *sata_hba_inst,
13271 sata_drive_info_t *sdinfo)
13272 {
13273 int valid_version = 0;
13274 char msg_buf[MAXPATHLEN];
13275 int i;
13276
13277 /* Show HBA path */
13278 (void) ddi_pathname(SATA_DIP(sata_hba_inst), msg_buf);
13279
13280 cmn_err(CE_CONT, "?%s :\n", msg_buf);
13281
13282 switch (sdinfo->satadrv_type) {
13283 case SATA_DTYPE_ATADISK:
13284 (void) sprintf(msg_buf, "SATA disk device at");
13285 break;
13286
13287 case SATA_DTYPE_ATAPICD:
13288 (void) sprintf(msg_buf, "SATA CD/DVD (ATAPI) device at");
13289 break;
13290
13291 case SATA_DTYPE_ATAPITAPE:
13292 (void) sprintf(msg_buf, "SATA tape (ATAPI) device at");
13293 break;
13294
13295 case SATA_DTYPE_ATAPIDISK:
13296 (void) sprintf(msg_buf, "SATA disk (ATAPI) device at");
13297 break;
13298
13299 case SATA_DTYPE_ATAPIPROC:
13300 (void) sprintf(msg_buf, "SATA processor (ATAPI) device at");
13301 break;
13302
13303 case SATA_DTYPE_UNKNOWN:
13304 (void) sprintf(msg_buf,
13305 "Unsupported SATA device type (cfg 0x%x) at ",
13306 sdinfo->satadrv_id.ai_config);
13307 break;
13308 }
13309
13310 if (sdinfo->satadrv_addr.qual == SATA_ADDR_DCPORT)
13311 cmn_err(CE_CONT, "?\t%s port %d\n",
13312 msg_buf, sdinfo->satadrv_addr.cport);
13313 else
13314 cmn_err(CE_CONT, "?\t%s port %d:%d\n",
13315 msg_buf, sdinfo->satadrv_addr.cport,
13316 sdinfo->satadrv_addr.pmport);
13317
13318 bcopy(&sdinfo->satadrv_id.ai_model, msg_buf,
13319 sizeof (sdinfo->satadrv_id.ai_model));
13320 swab(msg_buf, msg_buf, sizeof (sdinfo->satadrv_id.ai_model));
13321 msg_buf[sizeof (sdinfo->satadrv_id.ai_model)] = '\0';
13322 cmn_err(CE_CONT, "?\tmodel %s\n", msg_buf);
13323
13324 bcopy(&sdinfo->satadrv_id.ai_fw, msg_buf,
13325 sizeof (sdinfo->satadrv_id.ai_fw));
13326 swab(msg_buf, msg_buf, sizeof (sdinfo->satadrv_id.ai_fw));
13327 msg_buf[sizeof (sdinfo->satadrv_id.ai_fw)] = '\0';
13328 cmn_err(CE_CONT, "?\tfirmware %s\n", msg_buf);
13329
13330 bcopy(&sdinfo->satadrv_id.ai_drvser, msg_buf,
13331 sizeof (sdinfo->satadrv_id.ai_drvser));
13332 swab(msg_buf, msg_buf, sizeof (sdinfo->satadrv_id.ai_drvser));
13333 msg_buf[sizeof (sdinfo->satadrv_id.ai_drvser)] = '\0';
13334 if (sdinfo->satadrv_type == SATA_DTYPE_ATADISK) {
13335 cmn_err(CE_CONT, "?\tserial number %s\n", msg_buf);
13336 } else {
13337 /*
13338 * Some drives do not implement serial number and may
13339 * violate the spec by providing spaces rather than zeros
13340 * in serial number field. Scan the buffer to detect it.
13341 */
13342 for (i = 0; i < sizeof (sdinfo->satadrv_id.ai_drvser); i++) {
13343 if (msg_buf[i] != '\0' && msg_buf[i] != ' ')
13344 break;
13345 }
13346 if (i == sizeof (sdinfo->satadrv_id.ai_drvser)) {
13347 cmn_err(CE_CONT, "?\tserial number - none\n");
13348 } else {
13349 cmn_err(CE_CONT, "?\tserial number %s\n", msg_buf);
13350 }
13351 }
13352
13353 #ifdef SATA_DEBUG
13354 if (sdinfo->satadrv_id.ai_majorversion != 0 &&
13355 sdinfo->satadrv_id.ai_majorversion != 0xffff) {
13356 int i;
13357 for (i = 14; i >= 2; i--) {
13358 if (sdinfo->satadrv_id.ai_majorversion & (1 << i)) {
13359 valid_version = i;
13360 break;
13361 }
13362 }
13363 cmn_err(CE_CONT,
13364 "?\tATA/ATAPI-%d supported, majver 0x%x minver 0x%x\n",
13365 valid_version,
13366 sdinfo->satadrv_id.ai_majorversion,
13367 sdinfo->satadrv_id.ai_minorversion);
13368 }
13369 #endif
13370 /* Log some info */
13371 cmn_err(CE_CONT, "?\tsupported features:\n");
13372 msg_buf[0] = '\0';
13373 if (sdinfo->satadrv_type == SATA_DTYPE_ATADISK) {
13374 if (sdinfo->satadrv_features_support & SATA_DEV_F_LBA48)
13375 (void) strlcat(msg_buf, "48-bit LBA, ", MAXPATHLEN);
13376 else if (sdinfo->satadrv_features_support & SATA_DEV_F_LBA28)
13377 (void) strlcat(msg_buf, "28-bit LBA, ", MAXPATHLEN);
13378 }
13379 if (sdinfo->satadrv_features_support & SATA_DEV_F_DMA)
13380 (void) strlcat(msg_buf, "DMA", MAXPATHLEN);
13381 if (sdinfo->satadrv_features_support & SATA_DEV_F_NCQ)
13382 (void) strlcat(msg_buf, ", Native Command Queueing",
13383 MAXPATHLEN);
13384 if (sdinfo->satadrv_features_support & SATA_DEV_F_TCQ)
13385 (void) strlcat(msg_buf, ", Legacy Tagged Queuing", MAXPATHLEN);
13386 if ((sdinfo->satadrv_id.ai_cmdset82 & SATA_SMART_SUPPORTED) &&
13387 (sdinfo->satadrv_id.ai_features85 & SATA_SMART_ENABLED))
13388 (void) strlcat(msg_buf, ", SMART", MAXPATHLEN);
13389 if ((sdinfo->satadrv_id.ai_cmdset84 & SATA_SMART_SELF_TEST_SUPPORTED) &&
13390 (sdinfo->satadrv_id.ai_features87 & SATA_SMART_SELF_TEST_SUPPORTED))
13391 (void) strlcat(msg_buf, ", SMART self-test", MAXPATHLEN);
13392 cmn_err(CE_CONT, "?\t %s\n", msg_buf);
13393 if (sdinfo->satadrv_features_support & SATA_DEV_F_SATA3)
13394 cmn_err(CE_CONT, "?\tSATA Gen3 signaling speed (6.0Gbps)\n");
13395 else if (sdinfo->satadrv_features_support & SATA_DEV_F_SATA2)
13396 cmn_err(CE_CONT, "?\tSATA Gen2 signaling speed (3.0Gbps)\n");
13397 else if (sdinfo->satadrv_features_support & SATA_DEV_F_SATA1)
13398 cmn_err(CE_CONT, "?\tSATA Gen1 signaling speed (1.5Gbps)\n");
13399 if (sdinfo->satadrv_features_support &
13400 (SATA_DEV_F_TCQ | SATA_DEV_F_NCQ)) {
13401 msg_buf[0] = '\0';
13402 (void) snprintf(msg_buf, MAXPATHLEN,
13403 "Supported queue depth %d",
13404 sdinfo->satadrv_queue_depth);
13405 if (!(sata_func_enable &
13406 (SATA_ENABLE_QUEUING | SATA_ENABLE_NCQ)))
13407 (void) strlcat(msg_buf,
13408 " - queueing disabled globally", MAXPATHLEN);
13409 else if (sdinfo->satadrv_queue_depth >
13410 sdinfo->satadrv_max_queue_depth) {
13411 (void) snprintf(&msg_buf[strlen(msg_buf)],
13412 MAXPATHLEN - strlen(msg_buf), ", limited to %d",
13413 (int)sdinfo->satadrv_max_queue_depth);
13414 }
13415 cmn_err(CE_CONT, "?\t%s\n", msg_buf);
13416 }
13417
13418 if (sdinfo->satadrv_type == SATA_DTYPE_ATADISK) {
13419 (void) sprintf(msg_buf, "\tcapacity = %lu sectors\n",
13420 sdinfo->satadrv_capacity);
13421 cmn_err(CE_CONT, "?%s", msg_buf);
13422 }
13423 }
13424
13425 /*
13426 * Log/display port multiplier information
13427 * No Mutex should be hold.
13428 */
13429 static void
sata_show_pmult_info(sata_hba_inst_t * sata_hba_inst,sata_device_t * sata_device)13430 sata_show_pmult_info(sata_hba_inst_t *sata_hba_inst,
13431 sata_device_t *sata_device)
13432 {
13433 _NOTE(ARGUNUSED(sata_hba_inst))
13434
13435 int cport = sata_device->satadev_addr.cport;
13436 sata_pmult_info_t *pmultinfo;
13437 char msg_buf[MAXPATHLEN];
13438 uint32_t gscr0, gscr1, gscr2, gscr64;
13439
13440 mutex_enter(&SATA_CPORT_MUTEX(sata_hba_inst, cport));
13441 pmultinfo = SATA_PMULT_INFO(sata_hba_inst, cport);
13442 if (pmultinfo == NULL) {
13443 mutex_exit(&SATA_CPORT_MUTEX(sata_hba_inst, cport));
13444 return;
13445 }
13446
13447 gscr0 = pmultinfo->pmult_gscr.gscr0;
13448 gscr1 = pmultinfo->pmult_gscr.gscr1;
13449 gscr2 = pmultinfo->pmult_gscr.gscr2;
13450 gscr64 = pmultinfo->pmult_gscr.gscr64;
13451 mutex_exit(&SATA_CPORT_MUTEX(sata_hba_inst, cport));
13452
13453 cmn_err(CE_CONT, "?Port Multiplier %d device-ports found at port %d",
13454 sata_device->satadev_add_info, sata_device->satadev_addr.cport);
13455
13456 (void) sprintf(msg_buf, "\tVendor_ID 0x%04x, Module_ID 0x%04x",
13457 gscr0 & 0xffff, (gscr0 >> 16) & 0xffff);
13458 cmn_err(CE_CONT, "?%s", msg_buf);
13459
13460 (void) strcpy(msg_buf, "\tSupport SATA PMP Spec ");
13461 if (gscr1 & (1 << 3))
13462 (void) strlcat(msg_buf, "1.2", MAXPATHLEN);
13463 else if (gscr1 & (1 << 2))
13464 (void) strlcat(msg_buf, "1.1", MAXPATHLEN);
13465 else if (gscr1 & (1 << 1))
13466 (void) strlcat(msg_buf, "1.0", MAXPATHLEN);
13467 else
13468 (void) strlcat(msg_buf, "unknown", MAXPATHLEN);
13469 cmn_err(CE_CONT, "?%s", msg_buf);
13470
13471 (void) strcpy(msg_buf, "\tSupport ");
13472 if (gscr64 & (1 << 3))
13473 (void) strlcat(msg_buf, "Asy-Notif, ",
13474 MAXPATHLEN);
13475 if (gscr64 & (1 << 2))
13476 (void) strlcat(msg_buf, "Dyn-SSC, ", MAXPATHLEN);
13477 if (gscr64 & (1 << 1))
13478 (void) strlcat(msg_buf, "Iss-PMREQ, ", MAXPATHLEN);
13479 if (gscr64 & (1 << 0))
13480 (void) strlcat(msg_buf, "BIST", MAXPATHLEN);
13481 if ((gscr64 & 0xf) == 0)
13482 (void) strlcat(msg_buf, "nothing", MAXPATHLEN);
13483 cmn_err(CE_CONT, "?%s", msg_buf);
13484
13485 (void) sprintf(msg_buf, "\tNumber of exposed device fan-out ports: %d",
13486 gscr2 & SATA_PMULT_PORTNUM_MASK);
13487 cmn_err(CE_CONT, "?%s", msg_buf);
13488 }
13489
13490 /*
13491 * sata_save_drive_settings extracts current setting of the device and stores
13492 * it for future reference, in case the device setup would need to be restored
13493 * after the device reset.
13494 *
13495 * For all devices read ahead and write cache settings are saved, if the
13496 * device supports these features at all.
13497 * For ATAPI devices the Removable Media Status Notification setting is saved.
13498 */
13499 static void
sata_save_drive_settings(sata_drive_info_t * sdinfo)13500 sata_save_drive_settings(sata_drive_info_t *sdinfo)
13501 {
13502 if (SATA_READ_AHEAD_SUPPORTED(sdinfo->satadrv_id) ||
13503 SATA_WRITE_CACHE_SUPPORTED(sdinfo->satadrv_id)) {
13504
13505 /* Current setting of Read Ahead (and Read Cache) */
13506 if (SATA_READ_AHEAD_ENABLED(sdinfo->satadrv_id))
13507 sdinfo->satadrv_settings |= SATA_DEV_READ_AHEAD;
13508 else
13509 sdinfo->satadrv_settings &= ~SATA_DEV_READ_AHEAD;
13510
13511 /* Current setting of Write Cache */
13512 if (SATA_WRITE_CACHE_ENABLED(sdinfo->satadrv_id))
13513 sdinfo->satadrv_settings |= SATA_DEV_WRITE_CACHE;
13514 else
13515 sdinfo->satadrv_settings &= ~SATA_DEV_WRITE_CACHE;
13516 }
13517
13518 if (sdinfo->satadrv_type == SATA_DTYPE_ATAPICD) {
13519 if (SATA_RM_NOTIFIC_SUPPORTED(sdinfo->satadrv_id))
13520 sdinfo->satadrv_settings |= SATA_DEV_RMSN;
13521 else
13522 sdinfo->satadrv_settings &= ~SATA_DEV_RMSN;
13523 }
13524 }
13525
13526
13527 /*
13528 * sata_check_capacity function determines a disk capacity
13529 * and addressing mode (LBA28/LBA48) by examining a disk identify device data.
13530 *
13531 * NOTE: CHS mode is not supported! If a device does not support LBA,
13532 * this function is not called.
13533 *
13534 * Returns device capacity in number of blocks, i.e. largest addressable LBA+1
13535 */
13536 static uint64_t
sata_check_capacity(sata_drive_info_t * sdinfo)13537 sata_check_capacity(sata_drive_info_t *sdinfo)
13538 {
13539 uint64_t capacity = 0;
13540 int i;
13541
13542 if (sdinfo->satadrv_type != SATA_DTYPE_ATADISK ||
13543 (sdinfo->satadrv_id.ai_cap & SATA_LBA_SUPPORT) == 0)
13544 /* Capacity valid only for LBA-addressable disk devices */
13545 return (0);
13546
13547 if ((sdinfo->satadrv_id.ai_validinfo & SATA_VALIDINFO_88) &&
13548 (sdinfo->satadrv_id.ai_cmdset83 & SATA_EXT48) &&
13549 (sdinfo->satadrv_id.ai_features86 & SATA_EXT48)) {
13550 /* LBA48 mode supported and enabled */
13551 sdinfo->satadrv_features_support |= SATA_DEV_F_LBA48 |
13552 SATA_DEV_F_LBA28;
13553 for (i = 3; i >= 0; --i) {
13554 capacity <<= 16;
13555 capacity += sdinfo->satadrv_id.ai_addrsecxt[i];
13556 }
13557 } else {
13558 capacity = sdinfo->satadrv_id.ai_addrsec[1];
13559 capacity <<= 16;
13560 capacity += sdinfo->satadrv_id.ai_addrsec[0];
13561 if (capacity >= 0x1000000)
13562 /* LBA28 mode */
13563 sdinfo->satadrv_features_support |= SATA_DEV_F_LBA28;
13564 }
13565 return (capacity);
13566 }
13567
13568
13569 /*
13570 * Allocate consistent buffer for DMA transfer
13571 *
13572 * Cannot be called from interrupt level or with mutex held - it may sleep.
13573 *
13574 * Returns pointer to allocated buffer structure, or NULL if allocation failed.
13575 */
13576 static struct buf *
sata_alloc_local_buffer(sata_pkt_txlate_t * spx,size_t len)13577 sata_alloc_local_buffer(sata_pkt_txlate_t *spx, size_t len)
13578 {
13579 struct scsi_address ap;
13580 struct buf *bp;
13581 ddi_dma_attr_t cur_dma_attr;
13582
13583 ASSERT(spx->txlt_sata_pkt != NULL);
13584 ap.a_hba_tran = spx->txlt_sata_hba_inst->satahba_scsi_tran;
13585 ap.a_target = SATA_TO_SCSI_TARGET(
13586 spx->txlt_sata_pkt->satapkt_device.satadev_addr.cport,
13587 spx->txlt_sata_pkt->satapkt_device.satadev_addr.pmport,
13588 spx->txlt_sata_pkt->satapkt_device.satadev_addr.qual);
13589 ap.a_lun = 0;
13590
13591 bp = scsi_alloc_consistent_buf(&ap, NULL, len,
13592 B_READ, SLEEP_FUNC, NULL);
13593
13594 if (bp != NULL) {
13595 /* Allocate DMA resources for this buffer */
13596 spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp = bp;
13597 /*
13598 * We use a local version of the dma_attr, to account
13599 * for a device addressing limitations.
13600 * sata_adjust_dma_attr() will handle sdinfo == NULL which
13601 * will cause dma attributes to be adjusted to a lowest
13602 * acceptable level.
13603 */
13604 sata_adjust_dma_attr(NULL,
13605 SATA_DMA_ATTR(spx->txlt_sata_hba_inst), &cur_dma_attr);
13606
13607 if (sata_dma_buf_setup(spx, PKT_CONSISTENT,
13608 SLEEP_FUNC, NULL, &cur_dma_attr) != DDI_SUCCESS) {
13609 scsi_free_consistent_buf(bp);
13610 spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp = NULL;
13611 bp = NULL;
13612 }
13613 }
13614 return (bp);
13615 }
13616
13617 /*
13618 * Release local buffer (consistent buffer for DMA transfer) allocated
13619 * via sata_alloc_local_buffer().
13620 */
13621 static void
sata_free_local_buffer(sata_pkt_txlate_t * spx)13622 sata_free_local_buffer(sata_pkt_txlate_t *spx)
13623 {
13624 ASSERT(spx->txlt_sata_pkt != NULL);
13625 ASSERT(spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp != NULL);
13626
13627 spx->txlt_sata_pkt->satapkt_cmd.satacmd_num_dma_cookies = 0;
13628 spx->txlt_sata_pkt->satapkt_cmd.satacmd_dma_cookie_list = NULL;
13629
13630 sata_common_free_dma_rsrcs(spx);
13631
13632 /* Free buffer */
13633 scsi_free_consistent_buf(spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp);
13634 spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp = NULL;
13635 }
13636
13637 /*
13638 * Allocate sata_pkt
13639 * Pkt structure version and embedded strcutures version are initialized.
13640 * sata_pkt and sata_pkt_txlate structures are cross-linked.
13641 *
13642 * Since this may be called in interrupt context by sata_scsi_init_pkt,
13643 * callback argument determines if it can sleep or not.
13644 * Hence, it should not be called from interrupt context.
13645 *
13646 * If successful, non-NULL pointer to a sata pkt is returned.
13647 * Upon failure, NULL pointer is returned.
13648 */
13649 static sata_pkt_t *
sata_pkt_alloc(sata_pkt_txlate_t * spx,int (* callback)(caddr_t))13650 sata_pkt_alloc(sata_pkt_txlate_t *spx, int (*callback)(caddr_t))
13651 {
13652 sata_pkt_t *spkt;
13653 int kmsflag;
13654
13655 kmsflag = (callback == SLEEP_FUNC) ? KM_SLEEP : KM_NOSLEEP;
13656 spkt = kmem_zalloc(sizeof (sata_pkt_t), kmsflag);
13657 if (spkt == NULL) {
13658 SATA_LOG_D((spx->txlt_sata_hba_inst, CE_WARN,
13659 "sata_pkt_alloc: failed"));
13660 return (NULL);
13661 }
13662 spkt->satapkt_rev = SATA_PKT_REV;
13663 spkt->satapkt_cmd.satacmd_rev = SATA_CMD_REV;
13664 spkt->satapkt_device.satadev_rev = SATA_DEVICE_REV;
13665 spkt->satapkt_framework_private = spx;
13666 spx->txlt_sata_pkt = spkt;
13667 return (spkt);
13668 }
13669
13670 /*
13671 * Free sata pkt allocated via sata_pkt_alloc()
13672 */
13673 static void
sata_pkt_free(sata_pkt_txlate_t * spx)13674 sata_pkt_free(sata_pkt_txlate_t *spx)
13675 {
13676 ASSERT(spx->txlt_sata_pkt != NULL);
13677 ASSERT(spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp == NULL);
13678 kmem_free(spx->txlt_sata_pkt, sizeof (sata_pkt_t));
13679 spx->txlt_sata_pkt = NULL;
13680 }
13681
13682
13683 /*
13684 * Adjust DMA attributes.
13685 * SCSI cmds block count is up to 24 bits, SATA cmd block count vary
13686 * from 8 bits to 16 bits, depending on a command being used.
13687 * Limiting max block count arbitrarily to 256 for all read/write
13688 * commands may affects performance, so check both the device and
13689 * controller capability before adjusting dma attributes.
13690 */
13691 void
sata_adjust_dma_attr(sata_drive_info_t * sdinfo,ddi_dma_attr_t * dma_attr,ddi_dma_attr_t * adj_dma_attr)13692 sata_adjust_dma_attr(sata_drive_info_t *sdinfo, ddi_dma_attr_t *dma_attr,
13693 ddi_dma_attr_t *adj_dma_attr)
13694 {
13695 uint32_t count_max;
13696
13697 /* Copy original attributes */
13698 *adj_dma_attr = *dma_attr;
13699 /*
13700 * Things to consider: device addressing capability,
13701 * "excessive" controller DMA capabilities.
13702 * If a device is being probed/initialized, there are
13703 * no device info - use default limits then.
13704 */
13705 if (sdinfo == NULL) {
13706 count_max = dma_attr->dma_attr_granular * 0x100;
13707 if (dma_attr->dma_attr_count_max > count_max)
13708 adj_dma_attr->dma_attr_count_max = count_max;
13709 if (dma_attr->dma_attr_maxxfer > count_max)
13710 adj_dma_attr->dma_attr_maxxfer = count_max;
13711 return;
13712 }
13713
13714 if (sdinfo->satadrv_type == SATA_DTYPE_ATADISK) {
13715 if (sdinfo->satadrv_features_support & (SATA_DEV_F_LBA48)) {
13716 /*
13717 * 16-bit sector count may be used - we rely on
13718 * the assumption that only read and write cmds
13719 * will request more than 256 sectors worth of data
13720 */
13721 count_max = adj_dma_attr->dma_attr_granular * 0x10000;
13722 } else {
13723 /*
13724 * 8-bit sector count will be used - default limits
13725 * for dma attributes
13726 */
13727 count_max = adj_dma_attr->dma_attr_granular * 0x100;
13728 }
13729 /*
13730 * Adjust controler dma attributes, if necessary
13731 */
13732 if (dma_attr->dma_attr_count_max > count_max)
13733 adj_dma_attr->dma_attr_count_max = count_max;
13734 if (dma_attr->dma_attr_maxxfer > count_max)
13735 adj_dma_attr->dma_attr_maxxfer = count_max;
13736 }
13737 }
13738
13739
13740 /*
13741 * Allocate DMA resources for the buffer
13742 * This function handles initial DMA resource allocation as well as
13743 * DMA window shift and may be called repeatedly for the same DMA window
13744 * until all DMA cookies in the DMA window are processed.
13745 * To guarantee that there is always a coherent set of cookies to process
13746 * by SATA HBA driver (observing alignment, device granularity, etc.),
13747 * the number of slots for DMA cookies is equal to lesser of a number of
13748 * cookies in a DMA window and a max number of scatter/gather entries.
13749 *
13750 * Returns DDI_SUCCESS upon successful operation.
13751 * Return failure code of a failing command or DDI_FAILURE when
13752 * internal cleanup failed.
13753 */
13754 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)13755 sata_dma_buf_setup(sata_pkt_txlate_t *spx, int flags,
13756 int (*callback)(caddr_t), caddr_t arg,
13757 ddi_dma_attr_t *cur_dma_attr)
13758 {
13759 int rval;
13760 off_t offset;
13761 size_t size;
13762 int max_sg_len, req_len, i;
13763 uint_t dma_flags;
13764 struct buf *bp;
13765 uint64_t cur_txfer_len;
13766
13767
13768 ASSERT(spx->txlt_sata_pkt != NULL);
13769 bp = spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp;
13770 ASSERT(bp != NULL);
13771
13772
13773 if (spx->txlt_buf_dma_handle == NULL) {
13774 /*
13775 * No DMA resources allocated so far - this is a first call
13776 * for this sata pkt.
13777 */
13778 rval = ddi_dma_alloc_handle(SATA_DIP(spx->txlt_sata_hba_inst),
13779 cur_dma_attr, callback, arg, &spx->txlt_buf_dma_handle);
13780
13781 if (rval != DDI_SUCCESS) {
13782 SATA_LOG_D((spx->txlt_sata_hba_inst, CE_WARN,
13783 "sata_dma_buf_setup: no buf DMA resources %x",
13784 rval));
13785 return (rval);
13786 }
13787
13788 if (bp->b_flags & B_READ)
13789 dma_flags = DDI_DMA_READ;
13790 else
13791 dma_flags = DDI_DMA_WRITE;
13792
13793 if (flags & PKT_CONSISTENT)
13794 dma_flags |= DDI_DMA_CONSISTENT;
13795
13796 if (flags & PKT_DMA_PARTIAL)
13797 dma_flags |= DDI_DMA_PARTIAL;
13798
13799 /*
13800 * Check buffer alignment and size against dma attributes
13801 * Consider dma_attr_align only. There may be requests
13802 * with the size lower than device granularity, but they
13803 * will not read/write from/to the device, so no adjustment
13804 * is necessary. The dma_attr_minxfer theoretically should
13805 * be considered, but no HBA driver is checking it.
13806 */
13807 if (IS_P2ALIGNED(bp->b_un.b_addr,
13808 cur_dma_attr->dma_attr_align)) {
13809 rval = ddi_dma_buf_bind_handle(
13810 spx->txlt_buf_dma_handle,
13811 bp, dma_flags, callback, arg,
13812 &spx->txlt_dma_cookie,
13813 &spx->txlt_curwin_num_dma_cookies);
13814 } else { /* Buffer is not aligned */
13815
13816 int (*ddicallback)(caddr_t);
13817 size_t bufsz;
13818
13819 /* Check id sleeping is allowed */
13820 ddicallback = (callback == NULL_FUNC) ?
13821 DDI_DMA_DONTWAIT : DDI_DMA_SLEEP;
13822
13823 SATADBG2(SATA_DBG_DMA_SETUP, spx->txlt_sata_hba_inst,
13824 "mis-aligned buffer: addr=0x%p, cnt=%lu",
13825 (void *)bp->b_un.b_addr, bp->b_bcount);
13826
13827 if (bp->b_flags & (B_PAGEIO|B_PHYS))
13828 /*
13829 * CPU will need to access data in the buffer
13830 * (for copying) so map it.
13831 */
13832 bp_mapin(bp);
13833
13834 ASSERT(spx->txlt_tmp_buf == NULL);
13835
13836 /* Buffer may be padded by ddi_dma_mem_alloc()! */
13837 rval = ddi_dma_mem_alloc(
13838 spx->txlt_buf_dma_handle,
13839 bp->b_bcount,
13840 &sata_acc_attr,
13841 DDI_DMA_STREAMING,
13842 ddicallback, NULL,
13843 &spx->txlt_tmp_buf,
13844 &bufsz,
13845 &spx->txlt_tmp_buf_handle);
13846
13847 if (rval != DDI_SUCCESS) {
13848 /* DMA mapping failed */
13849 (void) ddi_dma_free_handle(
13850 &spx->txlt_buf_dma_handle);
13851 spx->txlt_buf_dma_handle = NULL;
13852 #ifdef SATA_DEBUG
13853 mbuffail_count++;
13854 #endif
13855 SATADBG1(SATA_DBG_DMA_SETUP,
13856 spx->txlt_sata_hba_inst,
13857 "sata_dma_buf_setup: "
13858 "buf dma mem alloc failed %x\n", rval);
13859 return (rval);
13860 }
13861 ASSERT(IS_P2ALIGNED(spx->txlt_tmp_buf,
13862 cur_dma_attr->dma_attr_align));
13863
13864 #ifdef SATA_DEBUG
13865 mbuf_count++;
13866
13867 if (bp->b_bcount != bufsz)
13868 /*
13869 * This will require special handling, because
13870 * DMA cookies will be based on the temporary
13871 * buffer size, not the original buffer
13872 * b_bcount, so the residue may have to
13873 * be counted differently.
13874 */
13875 SATADBG2(SATA_DBG_DMA_SETUP,
13876 spx->txlt_sata_hba_inst,
13877 "sata_dma_buf_setup: bp size %x != "
13878 "bufsz %x\n", bp->b_bcount, bufsz);
13879 #endif
13880 if (dma_flags & DDI_DMA_WRITE) {
13881 /*
13882 * Write operation - copy data into
13883 * an aligned temporary buffer. Buffer will be
13884 * synced for device by ddi_dma_addr_bind_handle
13885 */
13886 bcopy(bp->b_un.b_addr, spx->txlt_tmp_buf,
13887 bp->b_bcount);
13888 }
13889
13890 rval = ddi_dma_addr_bind_handle(
13891 spx->txlt_buf_dma_handle,
13892 NULL,
13893 spx->txlt_tmp_buf,
13894 bufsz, dma_flags, ddicallback, 0,
13895 &spx->txlt_dma_cookie,
13896 &spx->txlt_curwin_num_dma_cookies);
13897 }
13898
13899 switch (rval) {
13900 case DDI_DMA_PARTIAL_MAP:
13901 SATADBG1(SATA_DBG_DMA_SETUP, spx->txlt_sata_hba_inst,
13902 "sata_dma_buf_setup: DMA Partial Map\n", NULL);
13903 /*
13904 * Partial DMA mapping.
13905 * Retrieve number of DMA windows for this request.
13906 */
13907 if (ddi_dma_numwin(spx->txlt_buf_dma_handle,
13908 &spx->txlt_num_dma_win) != DDI_SUCCESS) {
13909 if (spx->txlt_tmp_buf != NULL) {
13910 ddi_dma_mem_free(
13911 &spx->txlt_tmp_buf_handle);
13912 spx->txlt_tmp_buf = NULL;
13913 }
13914 (void) ddi_dma_unbind_handle(
13915 spx->txlt_buf_dma_handle);
13916 (void) ddi_dma_free_handle(
13917 &spx->txlt_buf_dma_handle);
13918 spx->txlt_buf_dma_handle = NULL;
13919 SATA_LOG_D((spx->txlt_sata_hba_inst, CE_WARN,
13920 "sata_dma_buf_setup: numwin failed\n"));
13921 return (DDI_FAILURE);
13922 }
13923 SATADBG2(SATA_DBG_DMA_SETUP,
13924 spx->txlt_sata_hba_inst,
13925 "sata_dma_buf_setup: windows: %d, cookies: %d\n",
13926 spx->txlt_num_dma_win,
13927 spx->txlt_curwin_num_dma_cookies);
13928 spx->txlt_cur_dma_win = 0;
13929 break;
13930
13931 case DDI_DMA_MAPPED:
13932 /* DMA fully mapped */
13933 spx->txlt_num_dma_win = 1;
13934 spx->txlt_cur_dma_win = 0;
13935 SATADBG1(SATA_DBG_DMA_SETUP,
13936 spx->txlt_sata_hba_inst,
13937 "sata_dma_buf_setup: windows: 1 "
13938 "cookies: %d\n", spx->txlt_curwin_num_dma_cookies);
13939 break;
13940
13941 default:
13942 /* DMA mapping failed */
13943 if (spx->txlt_tmp_buf != NULL) {
13944 ddi_dma_mem_free(
13945 &spx->txlt_tmp_buf_handle);
13946 spx->txlt_tmp_buf = NULL;
13947 }
13948 (void) ddi_dma_free_handle(&spx->txlt_buf_dma_handle);
13949 spx->txlt_buf_dma_handle = NULL;
13950 SATA_LOG_D((spx->txlt_sata_hba_inst, CE_WARN,
13951 "sata_dma_buf_setup: buf dma handle binding "
13952 "failed %x\n", rval));
13953 return (rval);
13954 }
13955 spx->txlt_curwin_processed_dma_cookies = 0;
13956 spx->txlt_dma_cookie_list = NULL;
13957 } else {
13958 /*
13959 * DMA setup is reused. Check if we need to process more
13960 * cookies in current window, or to get next window, if any.
13961 */
13962
13963 ASSERT(spx->txlt_curwin_processed_dma_cookies <=
13964 spx->txlt_curwin_num_dma_cookies);
13965
13966 if (spx->txlt_curwin_processed_dma_cookies ==
13967 spx->txlt_curwin_num_dma_cookies) {
13968 /*
13969 * All cookies from current DMA window were processed.
13970 * Get next DMA window.
13971 */
13972 spx->txlt_cur_dma_win++;
13973 if (spx->txlt_cur_dma_win < spx->txlt_num_dma_win) {
13974 (void) ddi_dma_getwin(spx->txlt_buf_dma_handle,
13975 spx->txlt_cur_dma_win, &offset, &size,
13976 &spx->txlt_dma_cookie,
13977 &spx->txlt_curwin_num_dma_cookies);
13978 spx->txlt_curwin_processed_dma_cookies = 0;
13979 } else {
13980 /* No more windows! End of request! */
13981 /* What to do? - panic for now */
13982 ASSERT(spx->txlt_cur_dma_win >=
13983 spx->txlt_num_dma_win);
13984
13985 spx->txlt_curwin_num_dma_cookies = 0;
13986 spx->txlt_curwin_processed_dma_cookies = 0;
13987 spx->txlt_sata_pkt->
13988 satapkt_cmd.satacmd_num_dma_cookies = 0;
13989 return (DDI_SUCCESS);
13990 }
13991 }
13992 }
13993 /* There better be at least one DMA cookie outstanding */
13994 ASSERT((spx->txlt_curwin_num_dma_cookies -
13995 spx->txlt_curwin_processed_dma_cookies) > 0);
13996
13997 if (spx->txlt_dma_cookie_list == &spx->txlt_dma_cookie) {
13998 /* The default cookie slot was used in previous run */
13999 ASSERT(spx->txlt_curwin_processed_dma_cookies == 0);
14000 spx->txlt_dma_cookie_list = NULL;
14001 spx->txlt_dma_cookie_list_len = 0;
14002 }
14003 if (spx->txlt_curwin_processed_dma_cookies == 0) {
14004 /*
14005 * Processing a new DMA window - set-up dma cookies list.
14006 * We may reuse previously allocated cookie array if it is
14007 * possible.
14008 */
14009 if (spx->txlt_dma_cookie_list != NULL &&
14010 spx->txlt_dma_cookie_list_len <
14011 spx->txlt_curwin_num_dma_cookies) {
14012 /*
14013 * New DMA window contains more cookies than
14014 * the previous one. We need larger cookie list - free
14015 * the old one.
14016 */
14017 (void) kmem_free(spx->txlt_dma_cookie_list,
14018 spx->txlt_dma_cookie_list_len *
14019 sizeof (ddi_dma_cookie_t));
14020 spx->txlt_dma_cookie_list = NULL;
14021 spx->txlt_dma_cookie_list_len = 0;
14022 }
14023 if (spx->txlt_dma_cookie_list == NULL) {
14024 /*
14025 * Calculate lesser of number of cookies in this
14026 * DMA window and number of s/g entries.
14027 */
14028 max_sg_len = cur_dma_attr->dma_attr_sgllen;
14029 req_len = MIN(max_sg_len,
14030 spx->txlt_curwin_num_dma_cookies);
14031
14032 /* Allocate new dma cookie array if necessary */
14033 if (req_len == 1) {
14034 /* Only one cookie - no need for a list */
14035 spx->txlt_dma_cookie_list =
14036 &spx->txlt_dma_cookie;
14037 spx->txlt_dma_cookie_list_len = 1;
14038 } else {
14039 /*
14040 * More than one cookie - try to allocate space.
14041 */
14042 spx->txlt_dma_cookie_list = kmem_zalloc(
14043 sizeof (ddi_dma_cookie_t) * req_len,
14044 callback == NULL_FUNC ? KM_NOSLEEP :
14045 KM_SLEEP);
14046 if (spx->txlt_dma_cookie_list == NULL) {
14047 SATADBG1(SATA_DBG_DMA_SETUP,
14048 spx->txlt_sata_hba_inst,
14049 "sata_dma_buf_setup: cookie list "
14050 "allocation failed\n", NULL);
14051 /*
14052 * We could not allocate space for
14053 * neccessary number of dma cookies in
14054 * this window, so we fail this request.
14055 * Next invocation would try again to
14056 * allocate space for cookie list.
14057 * Note:Packet residue was not modified.
14058 */
14059 return (DDI_DMA_NORESOURCES);
14060 } else {
14061 spx->txlt_dma_cookie_list_len = req_len;
14062 }
14063 }
14064 }
14065 /*
14066 * Fetch DMA cookies into cookie list in sata_pkt_txlate.
14067 * First cookie was already fetched.
14068 */
14069 *(&spx->txlt_dma_cookie_list[0]) = spx->txlt_dma_cookie;
14070 cur_txfer_len =
14071 (uint64_t)spx->txlt_dma_cookie_list[0].dmac_size;
14072 spx->txlt_sata_pkt->satapkt_cmd.satacmd_num_dma_cookies = 1;
14073 spx->txlt_curwin_processed_dma_cookies++;
14074 for (i = 1; (i < spx->txlt_dma_cookie_list_len) &&
14075 (i < spx->txlt_curwin_num_dma_cookies); i++) {
14076 ddi_dma_nextcookie(spx->txlt_buf_dma_handle,
14077 &spx->txlt_dma_cookie_list[i]);
14078 cur_txfer_len +=
14079 (uint64_t)spx->txlt_dma_cookie_list[i].dmac_size;
14080 spx->txlt_curwin_processed_dma_cookies++;
14081 spx->txlt_sata_pkt->
14082 satapkt_cmd.satacmd_num_dma_cookies += 1;
14083 }
14084 } else {
14085 SATADBG2(SATA_DBG_DMA_SETUP, spx->txlt_sata_hba_inst,
14086 "sata_dma_buf_setup: sliding within DMA window, "
14087 "cur cookie %d, total cookies %d\n",
14088 spx->txlt_curwin_processed_dma_cookies,
14089 spx->txlt_curwin_num_dma_cookies);
14090
14091 /*
14092 * Not all cookies from the current dma window were used because
14093 * of s/g limitation.
14094 * There is no need to re-size the list - it was set at
14095 * optimal size, or only default entry is used (s/g = 1).
14096 */
14097 if (spx->txlt_dma_cookie_list == NULL) {
14098 spx->txlt_dma_cookie_list = &spx->txlt_dma_cookie;
14099 spx->txlt_dma_cookie_list_len = 1;
14100 }
14101 /*
14102 * Since we are processing remaining cookies in a DMA window,
14103 * there may be less of them than the number of entries in the
14104 * current dma cookie list.
14105 */
14106 req_len = MIN(spx->txlt_dma_cookie_list_len,
14107 (spx->txlt_curwin_num_dma_cookies -
14108 spx->txlt_curwin_processed_dma_cookies));
14109
14110 /* Fetch the next batch of cookies */
14111 for (i = 0, cur_txfer_len = 0; i < req_len; i++) {
14112 ddi_dma_nextcookie(spx->txlt_buf_dma_handle,
14113 &spx->txlt_dma_cookie_list[i]);
14114 cur_txfer_len +=
14115 (uint64_t)spx->txlt_dma_cookie_list[i].dmac_size;
14116 spx->txlt_sata_pkt->
14117 satapkt_cmd.satacmd_num_dma_cookies++;
14118 spx->txlt_curwin_processed_dma_cookies++;
14119 }
14120 }
14121
14122 ASSERT(spx->txlt_sata_pkt->satapkt_cmd.satacmd_num_dma_cookies > 0);
14123
14124 /* Point sata_cmd to the cookie list */
14125 spx->txlt_sata_pkt->satapkt_cmd.satacmd_dma_cookie_list =
14126 &spx->txlt_dma_cookie_list[0];
14127
14128 /* Remember number of DMA cookies passed in sata packet */
14129 spx->txlt_num_dma_cookies =
14130 spx->txlt_sata_pkt->satapkt_cmd.satacmd_num_dma_cookies;
14131
14132 ASSERT(cur_txfer_len != 0);
14133 if (cur_txfer_len <= bp->b_bcount)
14134 spx->txlt_total_residue -= cur_txfer_len;
14135 else {
14136 /*
14137 * Temporary DMA buffer has been padded by
14138 * ddi_dma_mem_alloc()!
14139 * This requires special handling, because DMA cookies are
14140 * based on the temporary buffer size, not the b_bcount,
14141 * and we have extra bytes to transfer - but the packet
14142 * residue has to stay correct because we will copy only
14143 * the requested number of bytes.
14144 */
14145 spx->txlt_total_residue -= bp->b_bcount;
14146 }
14147
14148 return (DDI_SUCCESS);
14149 }
14150
14151 /*
14152 * Common routine for releasing DMA resources
14153 */
14154 static void
sata_common_free_dma_rsrcs(sata_pkt_txlate_t * spx)14155 sata_common_free_dma_rsrcs(sata_pkt_txlate_t *spx)
14156 {
14157 if (spx->txlt_buf_dma_handle != NULL) {
14158 if (spx->txlt_tmp_buf != NULL) {
14159 /*
14160 * Intermediate DMA buffer was allocated.
14161 * Free allocated buffer and associated access handle.
14162 */
14163 ddi_dma_mem_free(&spx->txlt_tmp_buf_handle);
14164 spx->txlt_tmp_buf = NULL;
14165 }
14166 /*
14167 * Free DMA resources - cookies and handles
14168 */
14169 /* ASSERT(spx->txlt_dma_cookie_list != NULL); */
14170 if (spx->txlt_dma_cookie_list != NULL) {
14171 if (spx->txlt_dma_cookie_list !=
14172 &spx->txlt_dma_cookie) {
14173 (void) kmem_free(spx->txlt_dma_cookie_list,
14174 spx->txlt_dma_cookie_list_len *
14175 sizeof (ddi_dma_cookie_t));
14176 spx->txlt_dma_cookie_list = NULL;
14177 }
14178 }
14179 (void) ddi_dma_unbind_handle(spx->txlt_buf_dma_handle);
14180 (void) ddi_dma_free_handle(&spx->txlt_buf_dma_handle);
14181 spx->txlt_buf_dma_handle = NULL;
14182 }
14183 }
14184
14185 /*
14186 * Free DMA resources
14187 * Used by the HBA driver to release DMA resources that it does not use.
14188 *
14189 * Returns Void
14190 */
14191 void
sata_free_dma_resources(sata_pkt_t * sata_pkt)14192 sata_free_dma_resources(sata_pkt_t *sata_pkt)
14193 {
14194 sata_pkt_txlate_t *spx;
14195
14196 if (sata_pkt == NULL)
14197 return;
14198
14199 spx = (sata_pkt_txlate_t *)sata_pkt->satapkt_framework_private;
14200
14201 sata_common_free_dma_rsrcs(spx);
14202 }
14203
14204 /*
14205 * Fetch Device Identify data.
14206 * Send DEVICE IDENTIFY or IDENTIFY PACKET DEVICE (depending on a device type)
14207 * command to a device and get the device identify data.
14208 * The device_info structure has to be set to device type (for selecting proper
14209 * device identify command).
14210 *
14211 * Returns:
14212 * SATA_SUCCESS if cmd succeeded
14213 * SATA_RETRY if cmd was rejected and could be retried,
14214 * SATA_FAILURE if cmd failed and should not be retried (port error)
14215 *
14216 * Cannot be called in an interrupt context.
14217 */
14218
14219 static int
sata_fetch_device_identify_data(sata_hba_inst_t * sata_hba_inst,sata_drive_info_t * sdinfo)14220 sata_fetch_device_identify_data(sata_hba_inst_t *sata_hba_inst,
14221 sata_drive_info_t *sdinfo)
14222 {
14223 struct buf *bp;
14224 sata_pkt_t *spkt;
14225 sata_cmd_t *scmd;
14226 sata_pkt_txlate_t *spx;
14227 int rval;
14228 dev_info_t *dip = SATA_DIP(sata_hba_inst);
14229
14230 spx = kmem_zalloc(sizeof (sata_pkt_txlate_t), KM_SLEEP);
14231 spx->txlt_sata_hba_inst = sata_hba_inst;
14232 spx->txlt_scsi_pkt = NULL; /* No scsi pkt involved */
14233 spkt = sata_pkt_alloc(spx, SLEEP_FUNC);
14234 if (spkt == NULL) {
14235 kmem_free(spx, sizeof (sata_pkt_txlate_t));
14236 return (SATA_RETRY); /* may retry later */
14237 }
14238 /* address is needed now */
14239 spkt->satapkt_device.satadev_addr = sdinfo->satadrv_addr;
14240
14241 /*
14242 * Allocate buffer for Identify Data return data
14243 */
14244 bp = sata_alloc_local_buffer(spx, sizeof (sata_id_t));
14245 if (bp == NULL) {
14246 sata_pkt_free(spx);
14247 kmem_free(spx, sizeof (sata_pkt_txlate_t));
14248 SATA_LOG_D((sata_hba_inst, CE_WARN,
14249 "sata_fetch_device_identify_data: "
14250 "cannot allocate buffer for ID"));
14251 return (SATA_RETRY); /* may retry later */
14252 }
14253
14254 /* Fill sata_pkt */
14255 sdinfo->satadrv_state = SATA_STATE_PROBING;
14256 spkt->satapkt_device.satadev_addr = sdinfo->satadrv_addr;
14257 spkt->satapkt_op_mode = SATA_OPMODE_SYNCH | SATA_OPMODE_INTERRUPTS;
14258 /* Synchronous mode, no callback */
14259 spkt->satapkt_comp = NULL;
14260 /* Timeout 30s */
14261 spkt->satapkt_time = sata_default_pkt_time;
14262
14263 scmd = &spkt->satapkt_cmd;
14264 scmd->satacmd_bp = bp;
14265 scmd->satacmd_flags.sata_data_direction = SATA_DIR_READ;
14266 scmd->satacmd_flags.sata_ignore_dev_reset = B_TRUE;
14267
14268 /* Build Identify Device cmd in the sata_pkt */
14269 scmd->satacmd_addr_type = 0; /* N/A */
14270 scmd->satacmd_sec_count_lsb = 0; /* N/A */
14271 scmd->satacmd_lba_low_lsb = 0; /* N/A */
14272 scmd->satacmd_lba_mid_lsb = 0; /* N/A */
14273 scmd->satacmd_lba_high_lsb = 0; /* N/A */
14274 scmd->satacmd_features_reg = 0; /* N/A */
14275 scmd->satacmd_device_reg = 0; /* Always device 0 */
14276 if (sdinfo->satadrv_type & SATA_DTYPE_ATAPI) {
14277 /* Identify Packet Device cmd */
14278 scmd->satacmd_cmd_reg = SATAC_ID_PACKET_DEVICE;
14279 } else {
14280 /* Identify Device cmd - mandatory for all other devices */
14281 scmd->satacmd_cmd_reg = SATAC_ID_DEVICE;
14282 }
14283
14284 /* Send pkt to SATA HBA driver */
14285 rval = (*SATA_START_FUNC(sata_hba_inst))(SATA_DIP(sata_hba_inst), spkt);
14286
14287 #ifdef SATA_INJECT_FAULTS
14288 sata_inject_pkt_fault(spkt, &rval, sata_fault_type);
14289 #endif
14290
14291 if (rval == SATA_TRAN_ACCEPTED &&
14292 spkt->satapkt_reason == SATA_PKT_COMPLETED) {
14293 if (spx->txlt_buf_dma_handle != NULL) {
14294 rval = ddi_dma_sync(spx->txlt_buf_dma_handle, 0, 0,
14295 DDI_DMA_SYNC_FORKERNEL);
14296 ASSERT(rval == DDI_SUCCESS);
14297 if (sata_check_for_dma_error(dip, spx)) {
14298 ddi_fm_service_impact(dip,
14299 DDI_SERVICE_UNAFFECTED);
14300 rval = SATA_RETRY;
14301 goto fail;
14302 }
14303
14304 }
14305 if ((((sata_id_t *)(bp->b_un.b_addr))->ai_config &
14306 SATA_INCOMPLETE_DATA) == SATA_INCOMPLETE_DATA) {
14307 SATA_LOG_D((sata_hba_inst, CE_WARN,
14308 "SATA disk device at port %d - "
14309 "partial Identify Data",
14310 sdinfo->satadrv_addr.cport));
14311 rval = SATA_RETRY; /* may retry later */
14312 goto fail;
14313 }
14314 /* Update sata_drive_info */
14315 bcopy(bp->b_un.b_addr, &sdinfo->satadrv_id,
14316 sizeof (sata_id_t));
14317
14318 sdinfo->satadrv_features_support = 0;
14319 if (sdinfo->satadrv_type == SATA_DTYPE_ATADISK) {
14320 /*
14321 * Retrieve capacity (disks only) and addressing mode
14322 */
14323 sdinfo->satadrv_capacity = sata_check_capacity(sdinfo);
14324 } else {
14325 /*
14326 * For ATAPI devices one would have to issue
14327 * Get Capacity cmd for media capacity. Not here.
14328 */
14329 sdinfo->satadrv_capacity = 0;
14330 /*
14331 * Check what cdb length is supported
14332 */
14333 if ((sdinfo->satadrv_id.ai_config &
14334 SATA_ATAPI_ID_PKT_SZ) == SATA_ATAPI_ID_PKT_16B)
14335 sdinfo->satadrv_atapi_cdb_len = 16;
14336 else
14337 sdinfo->satadrv_atapi_cdb_len = 12;
14338 }
14339 /* Setup supported features flags */
14340 if (sdinfo->satadrv_id.ai_cap & SATA_DMA_SUPPORT)
14341 sdinfo->satadrv_features_support |= SATA_DEV_F_DMA;
14342
14343 /* Check for SATA GEN and NCQ support */
14344 if (sdinfo->satadrv_id.ai_satacap != 0 &&
14345 sdinfo->satadrv_id.ai_satacap != 0xffff) {
14346 /* SATA compliance */
14347 if (sdinfo->satadrv_id.ai_satacap & SATA_NCQ)
14348 sdinfo->satadrv_features_support |=
14349 SATA_DEV_F_NCQ;
14350 if (sdinfo->satadrv_id.ai_satacap &
14351 (SATA_1_SPEED | SATA_2_SPEED | SATA_3_SPEED)) {
14352 if (sdinfo->satadrv_id.ai_satacap &
14353 SATA_3_SPEED)
14354 sdinfo->satadrv_features_support |=
14355 SATA_DEV_F_SATA3;
14356 if (sdinfo->satadrv_id.ai_satacap &
14357 SATA_2_SPEED)
14358 sdinfo->satadrv_features_support |=
14359 SATA_DEV_F_SATA2;
14360 if (sdinfo->satadrv_id.ai_satacap &
14361 SATA_1_SPEED)
14362 sdinfo->satadrv_features_support |=
14363 SATA_DEV_F_SATA1;
14364 } else {
14365 sdinfo->satadrv_features_support |=
14366 SATA_DEV_F_SATA1;
14367 }
14368 }
14369 if ((sdinfo->satadrv_id.ai_cmdset83 & SATA_RW_DMA_QUEUED_CMD) &&
14370 (sdinfo->satadrv_id.ai_features86 & SATA_RW_DMA_QUEUED_CMD))
14371 sdinfo->satadrv_features_support |= SATA_DEV_F_TCQ;
14372
14373 sdinfo->satadrv_queue_depth = sdinfo->satadrv_id.ai_qdepth;
14374 if ((sdinfo->satadrv_features_support & SATA_DEV_F_NCQ) ||
14375 (sdinfo->satadrv_features_support & SATA_DEV_F_TCQ)) {
14376 ++sdinfo->satadrv_queue_depth;
14377 /* Adjust according to controller capabilities */
14378 sdinfo->satadrv_max_queue_depth = MIN(
14379 sdinfo->satadrv_queue_depth,
14380 SATA_QDEPTH(sata_hba_inst));
14381 /* Adjust according to global queue depth limit */
14382 sdinfo->satadrv_max_queue_depth = MIN(
14383 sdinfo->satadrv_max_queue_depth,
14384 sata_current_max_qdepth);
14385 if (sdinfo->satadrv_max_queue_depth == 0)
14386 sdinfo->satadrv_max_queue_depth = 1;
14387 } else
14388 sdinfo->satadrv_max_queue_depth = 1;
14389
14390 rval = SATA_SUCCESS;
14391 } else {
14392 /*
14393 * Woops, no Identify Data.
14394 */
14395 if (rval == SATA_TRAN_BUSY || rval == SATA_TRAN_QUEUE_FULL) {
14396 rval = SATA_RETRY; /* may retry later */
14397 } else if (rval == SATA_TRAN_ACCEPTED) {
14398 if (spkt->satapkt_reason == SATA_PKT_DEV_ERROR ||
14399 spkt->satapkt_reason == SATA_PKT_ABORTED ||
14400 spkt->satapkt_reason == SATA_PKT_TIMEOUT ||
14401 spkt->satapkt_reason == SATA_PKT_RESET)
14402 rval = SATA_RETRY; /* may retry later */
14403 else
14404 rval = SATA_FAILURE;
14405 } else {
14406 rval = SATA_FAILURE;
14407 }
14408 }
14409 fail:
14410 /* Free allocated resources */
14411 sata_free_local_buffer(spx);
14412 sata_pkt_free(spx);
14413 kmem_free(spx, sizeof (sata_pkt_txlate_t));
14414
14415 return (rval);
14416 }
14417
14418
14419 /*
14420 * Some devices may not come-up with default DMA mode (UDMA or MWDMA).
14421 * UDMA mode is checked first, followed by MWDMA mode.
14422 * set correctly, so this function is setting it to the highest supported level.
14423 * Older SATA spec required that the device supports at least DMA 4 mode and
14424 * UDMA mode is selected. It is not mentioned in SerialATA 2.6, so this
14425 * restriction has been removed.
14426 *
14427 * Returns SATA_SUCCESS if proper DMA mode is selected or no DMA is supported.
14428 * Returns SATA_FAILURE if proper DMA mode could not be selected.
14429 *
14430 * NOTE: This function should be called only if DMA mode is supported.
14431 */
14432 static int
sata_set_dma_mode(sata_hba_inst_t * sata_hba_inst,sata_drive_info_t * sdinfo)14433 sata_set_dma_mode(sata_hba_inst_t *sata_hba_inst, sata_drive_info_t *sdinfo)
14434 {
14435 sata_pkt_t *spkt;
14436 sata_cmd_t *scmd;
14437 sata_pkt_txlate_t *spx;
14438 int i, mode;
14439 uint8_t subcmd;
14440 int rval = SATA_SUCCESS;
14441
14442 ASSERT(sdinfo != NULL);
14443 ASSERT(sata_hba_inst != NULL);
14444
14445 if ((sdinfo->satadrv_id.ai_validinfo & SATA_VALIDINFO_88) != 0 &&
14446 (sdinfo->satadrv_id.ai_ultradma & SATA_UDMA_SUP_MASK) != 0) {
14447 /* Find highest Ultra DMA mode supported */
14448 for (mode = 6; mode >= 0; --mode) {
14449 if (sdinfo->satadrv_id.ai_ultradma & (1 << mode))
14450 break;
14451 }
14452 #if 0
14453 /* Left for historical reasons */
14454 /*
14455 * Some initial version of SATA spec indicated that at least
14456 * UDMA mode 4 has to be supported. It is not mentioned in
14457 * SerialATA 2.6, so this restriction is removed.
14458 */
14459 if (mode < 4)
14460 return (SATA_FAILURE);
14461 #endif
14462
14463 /*
14464 * For disk, we're still going to set DMA mode whatever is
14465 * selected by default
14466 *
14467 * We saw an old maxtor sata drive will select Ultra DMA and
14468 * Multi-Word DMA simultaneouly by default, which is going
14469 * to cause DMA command timed out, so we need to select DMA
14470 * mode even when it's already done by default
14471 */
14472 if (sdinfo->satadrv_type != SATA_DTYPE_ATADISK) {
14473
14474 /* Find UDMA mode currently selected */
14475 for (i = 6; i >= 0; --i) {
14476 if (sdinfo->satadrv_id.ai_ultradma &
14477 (1 << (i + 8)))
14478 break;
14479 }
14480 if (i >= mode)
14481 /* Nothing to do */
14482 return (SATA_SUCCESS);
14483 }
14484
14485 subcmd = SATAC_TRANSFER_MODE_ULTRA_DMA;
14486
14487 } else if ((sdinfo->satadrv_id.ai_dworddma & SATA_MDMA_SUP_MASK) != 0) {
14488 /* Find highest MultiWord DMA mode supported */
14489 for (mode = 2; mode >= 0; --mode) {
14490 if (sdinfo->satadrv_id.ai_dworddma & (1 << mode))
14491 break;
14492 }
14493
14494 /*
14495 * For disk, We're still going to set DMA mode whatever is
14496 * selected by default
14497 *
14498 * We saw an old maxtor sata drive will select Ultra DMA and
14499 * Multi-Word DMA simultaneouly by default, which is going
14500 * to cause DMA command timed out, so we need to select DMA
14501 * mode even when it's already done by default
14502 */
14503 if (sdinfo->satadrv_type != SATA_DTYPE_ATADISK) {
14504
14505 /* Find highest MultiWord DMA mode selected */
14506 for (i = 2; i >= 0; --i) {
14507 if (sdinfo->satadrv_id.ai_dworddma &
14508 (1 << (i + 8)))
14509 break;
14510 }
14511 if (i >= mode)
14512 /* Nothing to do */
14513 return (SATA_SUCCESS);
14514 }
14515
14516 subcmd = SATAC_TRANSFER_MODE_MULTI_WORD_DMA;
14517 } else
14518 return (SATA_SUCCESS);
14519
14520 /*
14521 * Set DMA mode via SET FEATURES COMMAND.
14522 * Prepare packet for SET FEATURES COMMAND.
14523 */
14524 spx = kmem_zalloc(sizeof (sata_pkt_txlate_t), KM_SLEEP);
14525 spx->txlt_sata_hba_inst = sata_hba_inst;
14526 spx->txlt_scsi_pkt = NULL; /* No scsi pkt involved */
14527 spkt = sata_pkt_alloc(spx, SLEEP_FUNC);
14528 if (spkt == NULL) {
14529 SATA_LOG_D((sata_hba_inst, CE_WARN,
14530 "sata_set_dma_mode: could not set DMA mode %d", mode));
14531 rval = SATA_FAILURE;
14532 goto done;
14533 }
14534 /* Fill sata_pkt */
14535 spkt->satapkt_device.satadev_addr = sdinfo->satadrv_addr;
14536 /* Timeout 30s */
14537 spkt->satapkt_time = sata_default_pkt_time;
14538 /* Synchronous mode, no callback, interrupts */
14539 spkt->satapkt_op_mode = SATA_OPMODE_SYNCH | SATA_OPMODE_INTERRUPTS;
14540 spkt->satapkt_comp = NULL;
14541 scmd = &spkt->satapkt_cmd;
14542 scmd->satacmd_flags.sata_data_direction = SATA_DIR_NODATA_XFER;
14543 scmd->satacmd_flags.sata_ignore_dev_reset = B_TRUE;
14544 scmd->satacmd_addr_type = 0;
14545 scmd->satacmd_device_reg = 0;
14546 scmd->satacmd_status_reg = 0;
14547 scmd->satacmd_error_reg = 0;
14548 scmd->satacmd_cmd_reg = SATAC_SET_FEATURES;
14549 scmd->satacmd_features_reg = SATAC_SF_TRANSFER_MODE;
14550 scmd->satacmd_sec_count_lsb = subcmd | mode;
14551
14552 /* Transfer command to HBA */
14553 if ((*SATA_START_FUNC(sata_hba_inst))(SATA_DIP(sata_hba_inst),
14554 spkt) != SATA_TRAN_ACCEPTED ||
14555 spkt->satapkt_reason != SATA_PKT_COMPLETED) {
14556 /* Pkt execution failed */
14557 rval = SATA_FAILURE;
14558 }
14559 done:
14560
14561 /* Free allocated resources */
14562 if (spkt != NULL)
14563 sata_pkt_free(spx);
14564 (void) kmem_free(spx, sizeof (sata_pkt_txlate_t));
14565
14566 return (rval);
14567 }
14568
14569
14570 /*
14571 * Set device caching mode.
14572 * One of the following operations should be specified:
14573 * SATAC_SF_ENABLE_READ_AHEAD
14574 * SATAC_SF_DISABLE_READ_AHEAD
14575 * SATAC_SF_ENABLE_WRITE_CACHE
14576 * SATAC_SF_DISABLE_WRITE_CACHE
14577 *
14578 * If operation fails, system log messgage is emitted.
14579 * Returns SATA_SUCCESS when the operation succeeds, SATA_RETRY if
14580 * command was sent but did not succeed, and SATA_FAILURE otherwise.
14581 */
14582
14583 static int
sata_set_cache_mode(sata_hba_inst_t * sata_hba_inst,sata_drive_info_t * sdinfo,int cache_op)14584 sata_set_cache_mode(sata_hba_inst_t *sata_hba_inst, sata_drive_info_t *sdinfo,
14585 int cache_op)
14586 {
14587 sata_pkt_t *spkt;
14588 sata_cmd_t *scmd;
14589 sata_pkt_txlate_t *spx;
14590 int rval = SATA_SUCCESS;
14591 int hba_rval;
14592 char *infop = NULL;
14593
14594 ASSERT(sdinfo != NULL);
14595 ASSERT(sata_hba_inst != NULL);
14596 ASSERT(cache_op == SATAC_SF_ENABLE_READ_AHEAD ||
14597 cache_op == SATAC_SF_DISABLE_READ_AHEAD ||
14598 cache_op == SATAC_SF_ENABLE_WRITE_CACHE ||
14599 cache_op == SATAC_SF_DISABLE_WRITE_CACHE);
14600
14601
14602 /* Prepare packet for SET FEATURES COMMAND */
14603 spx = kmem_zalloc(sizeof (sata_pkt_txlate_t), KM_SLEEP);
14604 spx->txlt_sata_hba_inst = sata_hba_inst;
14605 spx->txlt_scsi_pkt = NULL; /* No scsi pkt involved */
14606 spkt = sata_pkt_alloc(spx, SLEEP_FUNC);
14607 if (spkt == NULL) {
14608 rval = SATA_FAILURE;
14609 goto failure;
14610 }
14611 /* Fill sata_pkt */
14612 spkt->satapkt_device.satadev_addr = sdinfo->satadrv_addr;
14613 /* Timeout 30s */
14614 spkt->satapkt_time = sata_default_pkt_time;
14615 /* Synchronous mode, no callback, interrupts */
14616 spkt->satapkt_op_mode =
14617 SATA_OPMODE_SYNCH | SATA_OPMODE_INTERRUPTS;
14618 spkt->satapkt_comp = NULL;
14619 scmd = &spkt->satapkt_cmd;
14620 scmd->satacmd_flags.sata_data_direction = SATA_DIR_NODATA_XFER;
14621 scmd->satacmd_flags.sata_ignore_dev_reset = B_TRUE;
14622 scmd->satacmd_addr_type = 0;
14623 scmd->satacmd_device_reg = 0;
14624 scmd->satacmd_status_reg = 0;
14625 scmd->satacmd_error_reg = 0;
14626 scmd->satacmd_cmd_reg = SATAC_SET_FEATURES;
14627 scmd->satacmd_features_reg = cache_op;
14628
14629 /* Transfer command to HBA */
14630 hba_rval = (*SATA_START_FUNC(sata_hba_inst))(
14631 SATA_DIP(sata_hba_inst), spkt);
14632
14633 #ifdef SATA_INJECT_FAULTS
14634 sata_inject_pkt_fault(spkt, &rval, sata_fault_type);
14635 #endif
14636
14637 if ((hba_rval != SATA_TRAN_ACCEPTED) ||
14638 (spkt->satapkt_reason != SATA_PKT_COMPLETED)) {
14639 /* Pkt execution failed */
14640 switch (cache_op) {
14641 case SATAC_SF_ENABLE_READ_AHEAD:
14642 infop = "enabling read ahead failed";
14643 break;
14644 case SATAC_SF_DISABLE_READ_AHEAD:
14645 infop = "disabling read ahead failed";
14646 break;
14647 case SATAC_SF_ENABLE_WRITE_CACHE:
14648 infop = "enabling write cache failed";
14649 break;
14650 case SATAC_SF_DISABLE_WRITE_CACHE:
14651 infop = "disabling write cache failed";
14652 break;
14653 }
14654 SATA_LOG_D((sata_hba_inst, CE_WARN, "%s", infop));
14655 rval = SATA_RETRY;
14656 }
14657 failure:
14658 /* Free allocated resources */
14659 if (spkt != NULL)
14660 sata_pkt_free(spx);
14661 (void) kmem_free(spx, sizeof (sata_pkt_txlate_t));
14662 return (rval);
14663 }
14664
14665 /*
14666 * Set Removable Media Status Notification (enable/disable)
14667 * state == 0 , disable
14668 * state != 0 , enable
14669 *
14670 * If operation fails, system log messgage is emitted.
14671 * Returns SATA_SUCCESS when the operation succeeds, SATA_FAILURE otherwise.
14672 */
14673
14674 static int
sata_set_rmsn(sata_hba_inst_t * sata_hba_inst,sata_drive_info_t * sdinfo,int state)14675 sata_set_rmsn(sata_hba_inst_t *sata_hba_inst, sata_drive_info_t *sdinfo,
14676 int state)
14677 {
14678 sata_pkt_t *spkt;
14679 sata_cmd_t *scmd;
14680 sata_pkt_txlate_t *spx;
14681 int rval = SATA_SUCCESS;
14682 char *infop;
14683
14684 ASSERT(sdinfo != NULL);
14685 ASSERT(sata_hba_inst != NULL);
14686
14687 /* Prepare packet for SET FEATURES COMMAND */
14688 spx = kmem_zalloc(sizeof (sata_pkt_txlate_t), KM_SLEEP);
14689 spx->txlt_sata_hba_inst = sata_hba_inst;
14690 spx->txlt_scsi_pkt = NULL; /* No scsi pkt involved */
14691 spkt = sata_pkt_alloc(spx, SLEEP_FUNC);
14692 if (spkt == NULL) {
14693 rval = SATA_FAILURE;
14694 goto failure;
14695 }
14696 /* Fill sata_pkt */
14697 spkt->satapkt_device.satadev_addr = sdinfo->satadrv_addr;
14698 /* Timeout 30s */
14699 spkt->satapkt_time = sata_default_pkt_time;
14700 /* Synchronous mode, no callback, interrupts */
14701 spkt->satapkt_op_mode =
14702 SATA_OPMODE_SYNCH | SATA_OPMODE_INTERRUPTS;
14703 spkt->satapkt_comp = NULL;
14704 scmd = &spkt->satapkt_cmd;
14705 scmd->satacmd_flags.sata_data_direction = SATA_DIR_NODATA_XFER;
14706 scmd->satacmd_flags.sata_ignore_dev_reset = B_TRUE;
14707 scmd->satacmd_addr_type = 0;
14708 scmd->satacmd_device_reg = 0;
14709 scmd->satacmd_status_reg = 0;
14710 scmd->satacmd_error_reg = 0;
14711 scmd->satacmd_cmd_reg = SATAC_SET_FEATURES;
14712 if (state == 0)
14713 scmd->satacmd_features_reg = SATAC_SF_DISABLE_RMSN;
14714 else
14715 scmd->satacmd_features_reg = SATAC_SF_ENABLE_RMSN;
14716
14717 /* Transfer command to HBA */
14718 if (((*SATA_START_FUNC(sata_hba_inst))(
14719 SATA_DIP(sata_hba_inst), spkt) != SATA_TRAN_ACCEPTED) ||
14720 (spkt->satapkt_reason != SATA_PKT_COMPLETED)) {
14721 /* Pkt execution failed */
14722 if (state == 0)
14723 infop = "disabling Removable Media Status "
14724 "Notification failed";
14725 else
14726 infop = "enabling Removable Media Status "
14727 "Notification failed";
14728
14729 SATA_LOG_D((sata_hba_inst, CE_WARN, "%s", infop));
14730 rval = SATA_FAILURE;
14731 }
14732 failure:
14733 /* Free allocated resources */
14734 if (spkt != NULL)
14735 sata_pkt_free(spx);
14736 (void) kmem_free(spx, sizeof (sata_pkt_txlate_t));
14737 return (rval);
14738 }
14739
14740
14741 /*
14742 * Update state and copy port ss* values from passed sata_device structure.
14743 * sata_address is validated - if not valid, nothing is changed in sata_scsi
14744 * configuration struct.
14745 *
14746 * SATA_PSTATE_SHUTDOWN in port state is not reset to 0 by this function
14747 * regardless of the state in device argument.
14748 *
14749 * Port mutex should be held while calling this function.
14750 */
14751 static void
sata_update_port_info(sata_hba_inst_t * sata_hba_inst,sata_device_t * sata_device)14752 sata_update_port_info(sata_hba_inst_t *sata_hba_inst,
14753 sata_device_t *sata_device)
14754 {
14755 sata_cport_info_t *cportinfo;
14756
14757 if (sata_device->satadev_addr.qual == SATA_ADDR_CPORT ||
14758 sata_device->satadev_addr.qual == SATA_ADDR_DCPORT) {
14759 if (SATA_NUM_CPORTS(sata_hba_inst) <=
14760 sata_device->satadev_addr.cport)
14761 return;
14762
14763 cportinfo = SATA_CPORT_INFO(sata_hba_inst,
14764 sata_device->satadev_addr.cport);
14765
14766 ASSERT(mutex_owned(&cportinfo->cport_mutex));
14767 cportinfo->cport_scr = sata_device->satadev_scr;
14768
14769 /* Preserve SATA_PSTATE_SHUTDOWN flag */
14770 cportinfo->cport_state &= ~(SATA_PSTATE_PWRON |
14771 SATA_PSTATE_PWROFF | SATA_PSTATE_FAILED);
14772 cportinfo->cport_state |=
14773 sata_device->satadev_state & SATA_PSTATE_VALID;
14774 }
14775 }
14776
14777 void
sata_update_pmport_info(sata_hba_inst_t * sata_hba_inst,sata_device_t * sata_device)14778 sata_update_pmport_info(sata_hba_inst_t *sata_hba_inst,
14779 sata_device_t *sata_device)
14780 {
14781 sata_pmport_info_t *pmportinfo;
14782
14783 if ((sata_device->satadev_addr.qual != SATA_ADDR_PMPORT &&
14784 sata_device->satadev_addr.qual != SATA_ADDR_DPMPORT) ||
14785 SATA_NUM_PMPORTS(sata_hba_inst,
14786 sata_device->satadev_addr.cport) <
14787 sata_device->satadev_addr.pmport) {
14788 SATADBG1(SATA_DBG_PMULT, sata_hba_inst,
14789 "sata_update_port_info: error address %p.",
14790 &sata_device->satadev_addr);
14791 return;
14792 }
14793
14794 pmportinfo = SATA_PMPORT_INFO(sata_hba_inst,
14795 sata_device->satadev_addr.cport,
14796 sata_device->satadev_addr.pmport);
14797
14798 ASSERT(mutex_owned(&pmportinfo->pmport_mutex));
14799 pmportinfo->pmport_scr = sata_device->satadev_scr;
14800
14801 /* Preserve SATA_PSTATE_SHUTDOWN flag */
14802 pmportinfo->pmport_state &=
14803 ~(SATA_PSTATE_PWRON | SATA_PSTATE_PWROFF | SATA_PSTATE_FAILED);
14804 pmportinfo->pmport_state |=
14805 sata_device->satadev_state & SATA_PSTATE_VALID;
14806 }
14807
14808 /*
14809 * Extract SATA port specification from an IOCTL argument.
14810 *
14811 * This function return the port the user land send us as is, unless it
14812 * cannot retrieve port spec, then -1 is returned.
14813 *
14814 * Support port multiplier.
14815 */
14816 static int32_t
sata_get_port_num(sata_hba_inst_t * sata_hba_inst,struct devctl_iocdata * dcp)14817 sata_get_port_num(sata_hba_inst_t *sata_hba_inst, struct devctl_iocdata *dcp)
14818 {
14819 int32_t port;
14820
14821 /* Extract port number from nvpair in dca structure */
14822 if (nvlist_lookup_int32(ndi_dc_get_ap_data(dcp), "port", &port) != 0) {
14823 SATA_LOG_D((sata_hba_inst, CE_NOTE,
14824 "sata_get_port_num: invalid port spec 0x%x in ioctl",
14825 port));
14826 port = -1;
14827 }
14828
14829 return (port);
14830 }
14831
14832 /*
14833 * Get dev_info_t pointer to the device node pointed to by port argument.
14834 * NOTE: target argument is a value used in ioctls to identify
14835 * the AP - it is not a sata_address.
14836 * It is a combination of cport, pmport and address qualifier, encodded same
14837 * way as a scsi target number.
14838 * At this moment it carries only cport number.
14839 *
14840 * PMult hotplug is supported now.
14841 *
14842 * Returns dev_info_t pointer if target device was found, NULL otherwise.
14843 */
14844
14845 static dev_info_t *
sata_get_target_dip(dev_info_t * dip,uint8_t cport,uint8_t pmport)14846 sata_get_target_dip(dev_info_t *dip, uint8_t cport, uint8_t pmport)
14847 {
14848 dev_info_t *cdip = NULL;
14849 int target, tgt;
14850 uint8_t qual;
14851
14852 sata_hba_inst_t *sata_hba_inst;
14853 scsi_hba_tran_t *scsi_hba_tran;
14854
14855 /* Get target id */
14856 scsi_hba_tran = ddi_get_driver_private(dip);
14857 if (scsi_hba_tran == NULL)
14858 return (NULL);
14859
14860 sata_hba_inst = scsi_hba_tran->tran_hba_private;
14861
14862 if (sata_hba_inst == NULL)
14863 return (NULL);
14864
14865 /* Identify a port-mult by cport_info.cport_dev_type */
14866 if (SATA_CPORT_DEV_TYPE(sata_hba_inst, cport) == SATA_DTYPE_PMULT)
14867 qual = SATA_ADDR_DPMPORT;
14868 else
14869 qual = SATA_ADDR_DCPORT;
14870
14871 target = SATA_TO_SCSI_TARGET(cport, pmport, qual);
14872
14873 /* Retrieve target dip */
14874 ndi_devi_enter(dip);
14875 for (cdip = ddi_get_child(dip); cdip != NULL; ) {
14876 dev_info_t *next = ddi_get_next_sibling(cdip);
14877
14878 tgt = ddi_prop_get_int(DDI_DEV_T_ANY, cdip,
14879 DDI_PROP_DONTPASS, "target", -1);
14880 if (tgt == -1) {
14881 /*
14882 * This is actually an error condition, but not
14883 * a fatal one. Just continue the search.
14884 */
14885 cdip = next;
14886 continue;
14887 }
14888
14889 if (tgt == target)
14890 break;
14891
14892 cdip = next;
14893 }
14894 ndi_devi_exit(dip);
14895
14896 return (cdip);
14897 }
14898
14899 /*
14900 * Get dev_info_t pointer to the device node pointed to by port argument.
14901 * NOTE: target argument is a value used in ioctls to identify
14902 * the AP - it is not a sata_address.
14903 * It is a combination of cport, pmport and address qualifier, encoded same
14904 * way as a scsi target number.
14905 *
14906 * Returns dev_info_t pointer if target device was found, NULL otherwise.
14907 */
14908
14909 static dev_info_t *
sata_get_scsi_target_dip(dev_info_t * dip,sata_address_t * saddr)14910 sata_get_scsi_target_dip(dev_info_t *dip, sata_address_t *saddr)
14911 {
14912 dev_info_t *cdip = NULL;
14913 int target, tgt;
14914
14915 target = SATA_TO_SCSI_TARGET(saddr->cport, saddr->pmport, saddr->qual);
14916
14917 ndi_devi_enter(dip);
14918 for (cdip = ddi_get_child(dip); cdip != NULL; ) {
14919 dev_info_t *next = ddi_get_next_sibling(cdip);
14920
14921 tgt = ddi_prop_get_int(DDI_DEV_T_ANY, cdip,
14922 DDI_PROP_DONTPASS, "target", -1);
14923 if (tgt == -1) {
14924 /*
14925 * This is actually an error condition, but not
14926 * a fatal one. Just continue the search.
14927 */
14928 cdip = next;
14929 continue;
14930 }
14931
14932 if (tgt == target)
14933 break;
14934
14935 cdip = next;
14936 }
14937 ndi_devi_exit(dip);
14938
14939 return (cdip);
14940 }
14941
14942 /*
14943 * Process sata port disconnect request.
14944 * Normally, cfgadm sata plugin will try to offline (unconfigure) the device
14945 * before this request. Nevertheless, if a device is still configured,
14946 * we need to attempt to offline and unconfigure device.
14947 * Regardless of the unconfigure operation results the port is marked as
14948 * deactivated and no access to the attached device is possible.
14949 * If the target node remains because unconfigure operation failed, its state
14950 * will be set to DEVICE_REMOVED, preventing it to be used again when a device
14951 * is inserted/re-inserted. The event daemon will repeatedly try to unconfigure
14952 * the device and remove old target node.
14953 *
14954 * This function invokes sata_hba_inst->satahba_tran->
14955 * sata_tran_hotplug_ops->sata_tran_port_deactivate().
14956 * If successful, the device structure (if any) attached to the specified port
14957 * is removed and state of the port marked appropriately.
14958 * Failure of the port_deactivate may keep port in the physically active state,
14959 * or may fail the port.
14960 *
14961 * NOTE: Port multiplier is supported.
14962 */
14963
14964 static int
sata_ioctl_disconnect(sata_hba_inst_t * sata_hba_inst,sata_device_t * sata_device)14965 sata_ioctl_disconnect(sata_hba_inst_t *sata_hba_inst,
14966 sata_device_t *sata_device)
14967 {
14968 sata_drive_info_t *sdinfo = NULL, *subsdinfo = NULL;
14969 sata_cport_info_t *cportinfo = NULL;
14970 sata_pmport_info_t *pmportinfo = NULL;
14971 sata_pmult_info_t *pmultinfo = NULL;
14972 sata_device_t subsdevice;
14973 int cport, pmport, qual;
14974 int rval = SATA_SUCCESS;
14975 int npmport = 0;
14976 int rv = 0;
14977
14978 cport = sata_device->satadev_addr.cport;
14979 pmport = sata_device->satadev_addr.pmport;
14980 qual = sata_device->satadev_addr.qual;
14981
14982 ASSERT(qual == SATA_ADDR_DCPORT || qual == SATA_ADDR_DPMPORT);
14983 if (qual == SATA_ADDR_DCPORT)
14984 qual = SATA_ADDR_CPORT;
14985 else
14986 qual = SATA_ADDR_PMPORT;
14987
14988 /*
14989 * DEVCTL_AP_DISCONNECT invokes sata_hba_inst->satahba_tran->
14990 * sata_tran_hotplug_ops->sata_tran_port_deactivate().
14991 * Do the sanity check.
14992 */
14993 if (SATA_PORT_DEACTIVATE_FUNC(sata_hba_inst) == NULL) {
14994 /* No physical port deactivation supported. */
14995 return (EINVAL);
14996 }
14997
14998 /* Check the current state of the port */
14999 rval = (*SATA_PROBE_PORT_FUNC(sata_hba_inst))
15000 (SATA_DIP(sata_hba_inst), sata_device);
15001
15002 cportinfo = SATA_CPORT_INFO(sata_hba_inst, cport);
15003
15004 /*
15005 * Processing port mulitiplier
15006 */
15007 if (qual == SATA_ADDR_CPORT &&
15008 SATA_CPORT_DEV_TYPE(sata_hba_inst, cport) == SATA_DTYPE_PMULT) {
15009 mutex_enter(&cportinfo->cport_mutex);
15010
15011 /* Check controller port status */
15012 sata_update_port_info(sata_hba_inst, sata_device);
15013 if (rval != SATA_SUCCESS ||
15014 (sata_device->satadev_state & SATA_PSTATE_FAILED) != 0) {
15015 /*
15016 * Device port status is unknown or it is in failed
15017 * state
15018 */
15019 SATA_CPORT_STATE(sata_hba_inst, cport) =
15020 SATA_PSTATE_FAILED;
15021 SATADBG1(SATA_DBG_IOCTL_IF, sata_hba_inst,
15022 "sata_hba_ioctl: connect: failed to deactivate "
15023 "SATA port %d", cport);
15024 mutex_exit(&cportinfo->cport_mutex);
15025 return (EIO);
15026 }
15027
15028 /* Disconnect all sub-devices. */
15029 pmultinfo = SATA_CPORTINFO_PMULT_INFO(cportinfo);
15030 if (pmultinfo != NULL) {
15031
15032 for (npmport = 0; npmport < SATA_NUM_PMPORTS(
15033 sata_hba_inst, cport); npmport ++) {
15034 subsdinfo = SATA_PMPORT_DRV_INFO(
15035 sata_hba_inst, cport, npmport);
15036 if (subsdinfo == NULL)
15037 continue;
15038
15039 subsdevice.satadev_addr = subsdinfo->
15040 satadrv_addr;
15041
15042 mutex_exit(&cportinfo->cport_mutex);
15043 if (sata_ioctl_disconnect(sata_hba_inst,
15044 &subsdevice) == SATA_SUCCESS) {
15045 SATADBG2(SATA_DBG_PMULT, sata_hba_inst,
15046 "[Remove] device at port %d:%d "
15047 "successfully.", cport, npmport);
15048 }
15049 mutex_enter(&cportinfo->cport_mutex);
15050 }
15051 }
15052
15053 /* Disconnect the port multiplier */
15054 cportinfo->cport_state &= ~SATA_STATE_READY;
15055 mutex_exit(&cportinfo->cport_mutex);
15056
15057 sata_device->satadev_addr.qual = qual;
15058 rval = (*SATA_PORT_DEACTIVATE_FUNC(sata_hba_inst))
15059 (SATA_DIP(sata_hba_inst), sata_device);
15060
15061 sata_gen_sysevent(sata_hba_inst, &sata_device->satadev_addr,
15062 SE_NO_HINT);
15063
15064 mutex_enter(&cportinfo->cport_mutex);
15065 sata_update_port_info(sata_hba_inst, sata_device);
15066 if (rval != SATA_SUCCESS &&
15067 sata_device->satadev_state & SATA_PSTATE_FAILED) {
15068 cportinfo->cport_state = SATA_PSTATE_FAILED;
15069 rv = EIO;
15070 } else {
15071 cportinfo->cport_state |= SATA_PSTATE_SHUTDOWN;
15072 }
15073 mutex_exit(&cportinfo->cport_mutex);
15074
15075 return (rv);
15076 }
15077
15078 /*
15079 * Process non-port-multiplier device - it could be a drive connected
15080 * to a port multiplier port or a controller port.
15081 */
15082 if (qual == SATA_ADDR_PMPORT) {
15083 pmportinfo = SATA_PMPORT_INFO(sata_hba_inst, cport, pmport);
15084 mutex_enter(&pmportinfo->pmport_mutex);
15085 sata_update_pmport_info(sata_hba_inst, sata_device);
15086 if (rval != SATA_SUCCESS ||
15087 (sata_device->satadev_state & SATA_PSTATE_FAILED) != 0) {
15088 SATA_PMPORT_STATE(sata_hba_inst, cport, pmport) =
15089 SATA_PSTATE_FAILED;
15090 SATADBG2(SATA_DBG_IOCTL_IF, sata_hba_inst,
15091 "sata_hba_ioctl: connect: failed to deactivate "
15092 "SATA port %d:%d", cport, pmport);
15093 mutex_exit(&pmportinfo->pmport_mutex);
15094 return (EIO);
15095 }
15096
15097 if (pmportinfo->pmport_dev_type != SATA_DTYPE_NONE) {
15098 sdinfo = pmportinfo->pmport_sata_drive;
15099 ASSERT(sdinfo != NULL);
15100 }
15101
15102 /*
15103 * Set port's dev_state to not ready - this will disable
15104 * an access to a potentially attached device.
15105 */
15106 pmportinfo->pmport_state &= ~SATA_STATE_READY;
15107
15108 /* Remove and release sata_drive info structure. */
15109 if (sdinfo != NULL) {
15110 if ((sdinfo->satadrv_type &
15111 SATA_VALID_DEV_TYPE) != 0) {
15112 /*
15113 * If a target node exists, try to offline
15114 * a device and remove target node.
15115 */
15116 mutex_exit(&pmportinfo->pmport_mutex);
15117 (void) sata_offline_device(sata_hba_inst,
15118 sata_device, sdinfo);
15119 mutex_enter(&pmportinfo->pmport_mutex);
15120 }
15121
15122 SATA_PMPORTINFO_DRV_INFO(pmportinfo) = NULL;
15123 pmportinfo->pmport_dev_type = SATA_DTYPE_NONE;
15124 (void) kmem_free((void *)sdinfo,
15125 sizeof (sata_drive_info_t));
15126 }
15127 mutex_exit(&pmportinfo->pmport_mutex);
15128
15129 } else if (qual == SATA_ADDR_CPORT) {
15130 mutex_enter(&cportinfo->cport_mutex);
15131 sata_update_port_info(sata_hba_inst, sata_device);
15132 if (rval != SATA_SUCCESS ||
15133 (sata_device->satadev_state & SATA_PSTATE_FAILED) != 0) {
15134 /*
15135 * Device port status is unknown or it is in failed
15136 * state
15137 */
15138 SATA_CPORT_STATE(sata_hba_inst, cport) =
15139 SATA_PSTATE_FAILED;
15140 SATADBG1(SATA_DBG_IOCTL_IF, sata_hba_inst,
15141 "sata_hba_ioctl: connect: failed to deactivate "
15142 "SATA port %d", cport);
15143 mutex_exit(&cportinfo->cport_mutex);
15144 return (EIO);
15145 }
15146
15147 if (cportinfo->cport_dev_type == SATA_DTYPE_PMULT) {
15148 pmultinfo = SATA_CPORTINFO_PMULT_INFO(cportinfo);
15149 ASSERT(pmultinfo != NULL);
15150 } else if (cportinfo->cport_dev_type != SATA_DTYPE_NONE) {
15151 sdinfo = SATA_CPORTINFO_DRV_INFO(cportinfo);
15152 ASSERT(sdinfo != NULL);
15153 }
15154 cportinfo->cport_state &= ~SATA_STATE_READY;
15155
15156 if (sdinfo != NULL) {
15157 if ((sdinfo->satadrv_type &
15158 SATA_VALID_DEV_TYPE) != 0) {
15159 /*
15160 * If a target node exists, try to offline
15161 * a device and remove target node.
15162 */
15163 mutex_exit(&cportinfo->cport_mutex);
15164 (void) sata_offline_device(sata_hba_inst,
15165 sata_device, sdinfo);
15166 mutex_enter(&cportinfo->cport_mutex);
15167 }
15168
15169 SATA_CPORTINFO_DRV_INFO(cportinfo) = NULL;
15170 cportinfo->cport_dev_type = SATA_DTYPE_NONE;
15171 (void) kmem_free((void *)sdinfo,
15172 sizeof (sata_drive_info_t));
15173 }
15174 mutex_exit(&cportinfo->cport_mutex);
15175 }
15176
15177 /* Just ask HBA driver to deactivate port */
15178 sata_device->satadev_addr.qual = qual;
15179
15180 rval = (*SATA_PORT_DEACTIVATE_FUNC(sata_hba_inst))
15181 (SATA_DIP(sata_hba_inst), sata_device);
15182
15183 /*
15184 * Generate sysevent - EC_DR / ESC_DR_AP_STATE_CHANGE
15185 * without the hint (to force listener to investivate the state).
15186 */
15187 sata_gen_sysevent(sata_hba_inst, &sata_device->satadev_addr,
15188 SE_NO_HINT);
15189
15190 if (qual == SATA_ADDR_PMPORT) {
15191 mutex_enter(&pmportinfo->pmport_mutex);
15192 sata_update_pmport_info(sata_hba_inst, sata_device);
15193
15194 if (rval != SATA_SUCCESS &&
15195 sata_device->satadev_state & SATA_PSTATE_FAILED) {
15196 /*
15197 * Port deactivation failure - do not change port
15198 * state unless the state returned by HBA indicates a
15199 * port failure.
15200 *
15201 * NOTE: device structures were released, so devices
15202 * now are invisible! Port reset is needed to
15203 * re-enumerate devices.
15204 */
15205 pmportinfo->pmport_state = SATA_PSTATE_FAILED;
15206 rv = EIO;
15207 } else {
15208 /*
15209 * Deactivation succeded. From now on the sata framework
15210 * will not care what is happening to the device, until
15211 * the port is activated again.
15212 */
15213 pmportinfo->pmport_state |= SATA_PSTATE_SHUTDOWN;
15214 }
15215 mutex_exit(&pmportinfo->pmport_mutex);
15216 } else if (qual == SATA_ADDR_CPORT) {
15217 mutex_enter(&cportinfo->cport_mutex);
15218 sata_update_port_info(sata_hba_inst, sata_device);
15219
15220 if (rval != SATA_SUCCESS &&
15221 sata_device->satadev_state & SATA_PSTATE_FAILED) {
15222 cportinfo->cport_state = SATA_PSTATE_FAILED;
15223 rv = EIO;
15224 } else {
15225 cportinfo->cport_state |= SATA_PSTATE_SHUTDOWN;
15226 }
15227 mutex_exit(&cportinfo->cport_mutex);
15228 }
15229
15230 return (rv);
15231 }
15232
15233
15234
15235 /*
15236 * Process sata port connect request
15237 * The sata cfgadm pluging will invoke this operation only if port was found
15238 * in the disconnect state (failed state is also treated as the disconnected
15239 * state).
15240 * DEVCTL_AP_CONNECT would invoke sata_hba_inst->satahba_tran->
15241 * sata_tran_hotplug_ops->sata_tran_port_activate().
15242 * If successful and a device is found attached to the port,
15243 * the initialization sequence is executed to attach a device structure to
15244 * a port structure. The state of the port and a device would be set
15245 * appropriately.
15246 * The device is not set in configured state (system-wise) by this operation.
15247 *
15248 * Note, that activating the port may generate link events,
15249 * so it is important that following processing and the
15250 * event processing does not interfere with each other!
15251 *
15252 * This operation may remove port failed state and will
15253 * try to make port active and in good standing.
15254 *
15255 * NOTE: Port multiplier is supported.
15256 */
15257
15258 static int
sata_ioctl_connect(sata_hba_inst_t * sata_hba_inst,sata_device_t * sata_device)15259 sata_ioctl_connect(sata_hba_inst_t *sata_hba_inst,
15260 sata_device_t *sata_device)
15261 {
15262 sata_pmport_info_t *pmportinfo = NULL;
15263 uint8_t cport, pmport, qual;
15264 int rv = 0;
15265
15266 cport = sata_device->satadev_addr.cport;
15267 pmport = sata_device->satadev_addr.pmport;
15268 qual = sata_device->satadev_addr.qual;
15269
15270 ASSERT(qual == SATA_ADDR_DCPORT || qual == SATA_ADDR_DPMPORT);
15271 if (qual == SATA_ADDR_DCPORT)
15272 qual = SATA_ADDR_CPORT;
15273 else
15274 qual = SATA_ADDR_PMPORT;
15275
15276 if (qual == SATA_ADDR_PMPORT)
15277 pmportinfo = SATA_PMPORT_INFO(sata_hba_inst, cport, pmport);
15278
15279 /*
15280 * DEVCTL_AP_CONNECT would invoke sata_hba_inst->
15281 * satahba_tran->sata_tran_hotplug_ops->sata_tran_port_activate().
15282 * Perform sanity check now.
15283 */
15284 if (SATA_PORT_ACTIVATE_FUNC(sata_hba_inst) == NULL) {
15285 /* No physical port activation supported. */
15286 return (EINVAL);
15287 }
15288
15289 /* Just ask HBA driver to activate port */
15290 if ((*SATA_PORT_ACTIVATE_FUNC(sata_hba_inst))
15291 (SATA_DIP(sata_hba_inst), sata_device) != SATA_SUCCESS) {
15292 /*
15293 * Port activation failure.
15294 */
15295 if (qual == SATA_ADDR_CPORT) {
15296 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst,
15297 cport)->cport_mutex);
15298 sata_update_port_info(sata_hba_inst, sata_device);
15299 if (sata_device->satadev_state & SATA_PSTATE_FAILED) {
15300 SATA_CPORT_STATE(sata_hba_inst, cport) =
15301 SATA_PSTATE_FAILED;
15302 SATADBG1(SATA_DBG_IOCTL_IF, sata_hba_inst,
15303 "sata_hba_ioctl: connect: failed to "
15304 "activate SATA port %d", cport);
15305 }
15306 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst,
15307 cport)->cport_mutex);
15308 } else { /* port multiplier device port */
15309 mutex_enter(&pmportinfo->pmport_mutex);
15310 sata_update_pmport_info(sata_hba_inst, sata_device);
15311 if (sata_device->satadev_state & SATA_PSTATE_FAILED) {
15312 SATA_PMPORT_STATE(sata_hba_inst, cport,
15313 pmport) = SATA_PSTATE_FAILED;
15314 SATADBG2(SATA_DBG_IOCTL_IF, sata_hba_inst,
15315 "sata_hba_ioctl: connect: failed to "
15316 "activate SATA port %d:%d", cport, pmport);
15317 }
15318 mutex_exit(&pmportinfo->pmport_mutex);
15319 }
15320 return (EIO);
15321 }
15322
15323 /* Virgin port state - will be updated by the port re-probe. */
15324 if (qual == SATA_ADDR_CPORT) {
15325 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst,
15326 cport)->cport_mutex);
15327 SATA_CPORT_STATE(sata_hba_inst, cport) = 0;
15328 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst,
15329 cport)->cport_mutex);
15330 } else { /* port multiplier device port */
15331 mutex_enter(&pmportinfo->pmport_mutex);
15332 SATA_PMPORT_STATE(sata_hba_inst, cport, pmport) = 0;
15333 mutex_exit(&pmportinfo->pmport_mutex);
15334 }
15335
15336 /*
15337 * Probe the port to find its state and attached device.
15338 */
15339 if (sata_reprobe_port(sata_hba_inst, sata_device,
15340 SATA_DEV_IDENTIFY_RETRY) == SATA_FAILURE)
15341 rv = EIO;
15342
15343 /*
15344 * Generate sysevent - EC_DR / ESC_DR_AP_STATE_CHANGE
15345 * without the hint
15346 */
15347 sata_gen_sysevent(sata_hba_inst, &sata_device->satadev_addr,
15348 SE_NO_HINT);
15349
15350 /*
15351 * If there is a device attached to the port, emit
15352 * a message.
15353 */
15354 if (sata_device->satadev_type != SATA_DTYPE_NONE) {
15355
15356 if (qual == SATA_ADDR_CPORT) {
15357 if (sata_device->satadev_type == SATA_DTYPE_PMULT) {
15358 sata_log(sata_hba_inst, CE_WARN,
15359 "SATA port multiplier detected "
15360 "at port %d", cport);
15361 } else {
15362 sata_log(sata_hba_inst, CE_WARN,
15363 "SATA device detected at port %d", cport);
15364 if (sata_device->satadev_type ==
15365 SATA_DTYPE_UNKNOWN) {
15366 /*
15367 * A device was not successfully identified
15368 */
15369 sata_log(sata_hba_inst, CE_WARN,
15370 "Could not identify SATA "
15371 "device at port %d", cport);
15372 }
15373 }
15374 } else { /* port multiplier device port */
15375 sata_log(sata_hba_inst, CE_WARN,
15376 "SATA device detected at port %d:%d",
15377 cport, pmport);
15378 if (sata_device->satadev_type == SATA_DTYPE_UNKNOWN) {
15379 /*
15380 * A device was not successfully identified
15381 */
15382 sata_log(sata_hba_inst, CE_WARN,
15383 "Could not identify SATA "
15384 "device at port %d:%d", cport, pmport);
15385 }
15386 }
15387 }
15388
15389 return (rv);
15390 }
15391
15392
15393 /*
15394 * Process sata device unconfigure request.
15395 * The unconfigure operation uses generic nexus operation to
15396 * offline a device. It leaves a target device node attached.
15397 * and obviously sata_drive_info attached as well, because
15398 * from the hardware point of view nothing has changed.
15399 */
15400 static int
sata_ioctl_unconfigure(sata_hba_inst_t * sata_hba_inst,sata_device_t * sata_device)15401 sata_ioctl_unconfigure(sata_hba_inst_t *sata_hba_inst,
15402 sata_device_t *sata_device)
15403 {
15404 int rv = 0;
15405 dev_info_t *tdip;
15406
15407 /* We are addressing attached device, not a port */
15408 if (sata_device->satadev_addr.qual == SATA_ADDR_CPORT)
15409 sata_device->satadev_addr.qual = SATA_ADDR_DCPORT;
15410 else if (sata_device->satadev_addr.qual == SATA_ADDR_PMPORT)
15411 sata_device->satadev_addr.qual = SATA_ADDR_DPMPORT;
15412
15413 if ((tdip = sata_get_scsi_target_dip(SATA_DIP(sata_hba_inst),
15414 &sata_device->satadev_addr)) != NULL) {
15415
15416 if (ndi_devi_offline(tdip, NDI_UNCONFIG) != NDI_SUCCESS) {
15417 SATA_LOG_D((sata_hba_inst, CE_WARN,
15418 "sata_hba_ioctl: unconfigure: "
15419 "failed to unconfigure device at SATA port %d:%d",
15420 sata_device->satadev_addr.cport,
15421 sata_device->satadev_addr.pmport));
15422 rv = EIO;
15423 }
15424 /*
15425 * The target node devi_state should be marked with
15426 * DEVI_DEVICE_OFFLINE by ndi_devi_offline().
15427 * This would be the indication for cfgadm that
15428 * the AP node occupant state is 'unconfigured'.
15429 */
15430
15431 } else {
15432 /*
15433 * This would indicate a failure on the part of cfgadm
15434 * to detect correct state of the node prior to this
15435 * call - one cannot unconfigure non-existing device.
15436 */
15437 SATA_LOG_D((sata_hba_inst, CE_WARN,
15438 "sata_hba_ioctl: unconfigure: "
15439 "attempt to unconfigure non-existing device "
15440 "at SATA port %d:%d",
15441 sata_device->satadev_addr.cport,
15442 sata_device->satadev_addr.pmport));
15443 rv = ENXIO;
15444 }
15445 return (rv);
15446 }
15447
15448 /*
15449 * Process sata device configure request
15450 * If port is in a failed state, operation is aborted - one has to use
15451 * an explicit connect or port activate request to try to get a port into
15452 * non-failed mode. Port reset wil also work in such situation.
15453 * If the port is in disconnected (shutdown) state, the connect operation is
15454 * attempted prior to any other action.
15455 * When port is in the active state, there is a device attached and the target
15456 * node exists, a device was most likely offlined.
15457 * If target node does not exist, a new target node is created. In both cases
15458 * an attempt is made to online (configure) the device.
15459 *
15460 * NOTE: Port multiplier is supported.
15461 */
15462 static int
sata_ioctl_configure(sata_hba_inst_t * sata_hba_inst,sata_device_t * sata_device)15463 sata_ioctl_configure(sata_hba_inst_t *sata_hba_inst,
15464 sata_device_t *sata_device)
15465 {
15466 int cport, pmport, qual;
15467 int rval;
15468 boolean_t target = B_TRUE;
15469 sata_cport_info_t *cportinfo;
15470 sata_pmport_info_t *pmportinfo = NULL;
15471 dev_info_t *tdip;
15472 sata_drive_info_t *sdinfo;
15473
15474 cport = sata_device->satadev_addr.cport;
15475 pmport = sata_device->satadev_addr.pmport;
15476 qual = sata_device->satadev_addr.qual;
15477
15478 /* Get current port state */
15479 rval = (*SATA_PROBE_PORT_FUNC(sata_hba_inst))
15480 (SATA_DIP(sata_hba_inst), sata_device);
15481
15482 cportinfo = SATA_CPORT_INFO(sata_hba_inst, cport);
15483 if (qual == SATA_ADDR_DPMPORT) {
15484 pmportinfo = SATA_PMPORT_INFO(sata_hba_inst, cport, pmport);
15485 mutex_enter(&pmportinfo->pmport_mutex);
15486 sata_update_pmport_info(sata_hba_inst, sata_device);
15487 if (rval != SATA_SUCCESS ||
15488 (sata_device->satadev_state & SATA_PSTATE_FAILED) != 0) {
15489 /*
15490 * Obviously, device on a failed port is not visible
15491 */
15492 mutex_exit(&pmportinfo->pmport_mutex);
15493 return (ENXIO);
15494 }
15495 mutex_exit(&pmportinfo->pmport_mutex);
15496 } else {
15497 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst,
15498 cport)->cport_mutex);
15499 sata_update_port_info(sata_hba_inst, sata_device);
15500 if (rval != SATA_SUCCESS ||
15501 (sata_device->satadev_state & SATA_PSTATE_FAILED) != 0) {
15502 /*
15503 * Obviously, device on a failed port is not visible
15504 */
15505 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst,
15506 cport)->cport_mutex);
15507 return (ENXIO);
15508 }
15509 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst,
15510 cport)->cport_mutex);
15511 }
15512
15513 if ((sata_device->satadev_state & SATA_PSTATE_SHUTDOWN) != 0) {
15514 /* need to activate port */
15515 target = B_FALSE;
15516
15517 /* Sanity check */
15518 if (SATA_PORT_ACTIVATE_FUNC(sata_hba_inst) == NULL)
15519 return (ENXIO);
15520
15521 /* Just let HBA driver to activate port */
15522 if ((*SATA_PORT_ACTIVATE_FUNC(sata_hba_inst))
15523 (SATA_DIP(sata_hba_inst), sata_device) != SATA_SUCCESS) {
15524 /*
15525 * Port activation failure - do not change port state
15526 * unless the state returned by HBA indicates a port
15527 * failure.
15528 */
15529 if (qual == SATA_ADDR_DPMPORT) {
15530 mutex_enter(&pmportinfo->pmport_mutex);
15531 sata_update_pmport_info(sata_hba_inst,
15532 sata_device);
15533 if (sata_device->satadev_state &
15534 SATA_PSTATE_FAILED)
15535 pmportinfo->pmport_state =
15536 SATA_PSTATE_FAILED;
15537 mutex_exit(&pmportinfo->pmport_mutex);
15538 } else {
15539 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst,
15540 cport)->cport_mutex);
15541 sata_update_port_info(sata_hba_inst,
15542 sata_device);
15543 if (sata_device->satadev_state &
15544 SATA_PSTATE_FAILED)
15545 cportinfo->cport_state =
15546 SATA_PSTATE_FAILED;
15547 mutex_exit(&SATA_CPORT_INFO(
15548 sata_hba_inst, cport)->cport_mutex);
15549 }
15550 }
15551 SATA_LOG_D((sata_hba_inst, CE_WARN,
15552 "sata_hba_ioctl: configure: "
15553 "failed to activate SATA port %d:%d",
15554 cport, pmport));
15555 return (EIO);
15556 }
15557 /*
15558 * Generate sysevent - EC_DR / ESC_DR_AP_STATE_CHANGE
15559 * without the hint.
15560 */
15561 sata_gen_sysevent(sata_hba_inst,
15562 &sata_device->satadev_addr, SE_NO_HINT);
15563
15564 /* Virgin port state */
15565 if (qual == SATA_ADDR_DPMPORT) {
15566 mutex_enter(&pmportinfo->pmport_mutex);
15567 pmportinfo->pmport_state = 0;
15568 mutex_exit(&pmportinfo->pmport_mutex);
15569 } else {
15570 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst,
15571 cport)-> cport_mutex);
15572 cportinfo->cport_state = 0;
15573 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst,
15574 cport)->cport_mutex);
15575 }
15576 /*
15577 * Always reprobe port, to get current device info.
15578 */
15579 if (sata_reprobe_port(sata_hba_inst, sata_device,
15580 SATA_DEV_IDENTIFY_RETRY) != SATA_SUCCESS)
15581 return (EIO);
15582
15583 if (sata_device->satadev_type != SATA_DTYPE_NONE && target == B_FALSE) {
15584 if (qual == SATA_ADDR_DPMPORT) {
15585 /*
15586 * That's the transition from "inactive" port
15587 * to active one with device attached.
15588 */
15589 sata_log(sata_hba_inst, CE_WARN,
15590 "SATA device detected at port %d:%d",
15591 cport, pmport);
15592 } else {
15593 /*
15594 * When PM is attached to the cport and cport is
15595 * activated, every PM device port needs to be reprobed.
15596 * We need to emit message for all devices detected
15597 * at port multiplier's device ports.
15598 * Add such code here.
15599 * For now, just inform about device attached to
15600 * cport.
15601 */
15602 sata_log(sata_hba_inst, CE_WARN,
15603 "SATA device detected at port %d", cport);
15604 }
15605 }
15606
15607 /*
15608 * This is where real configuration operation starts.
15609 *
15610 * When PM is attached to the cport and cport is activated,
15611 * devices attached PM device ports may have to be configured
15612 * explicitly. This may change when port multiplier is supported.
15613 * For now, configure only disks and other valid target devices.
15614 */
15615 if (!(sata_device->satadev_type & SATA_VALID_DEV_TYPE)) {
15616 if (qual == SATA_ADDR_DCPORT) {
15617 if (sata_device->satadev_type == SATA_DTYPE_UNKNOWN) {
15618 /*
15619 * A device was not successfully identified
15620 */
15621 sata_log(sata_hba_inst, CE_WARN,
15622 "Could not identify SATA "
15623 "device at port %d", cport);
15624 }
15625 } else { /* port multiplier device port */
15626 if (sata_device->satadev_type == SATA_DTYPE_UNKNOWN) {
15627 /*
15628 * A device was not successfully identified
15629 */
15630 sata_log(sata_hba_inst, CE_WARN,
15631 "Could not identify SATA "
15632 "device at port %d:%d", cport, pmport);
15633 }
15634 }
15635 return (ENXIO); /* No device to configure */
15636 }
15637
15638 /*
15639 * Here we may have a device in reset condition,
15640 * but because we are just configuring it, there is
15641 * no need to process the reset other than just
15642 * to clear device reset condition in the HBA driver.
15643 * Setting the flag SATA_EVNT_CLEAR_DEVICE_RESET will
15644 * cause a first command sent the HBA driver with the request
15645 * to clear device reset condition.
15646 */
15647 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, cport)->cport_mutex);
15648 if (qual == SATA_ADDR_DPMPORT)
15649 sata_device->satadev_addr.qual = SATA_ADDR_DPMPORT;
15650 else
15651 sata_device->satadev_addr.qual = SATA_ADDR_DCPORT;
15652 sdinfo = sata_get_device_info(sata_hba_inst, sata_device);
15653 if (sdinfo == NULL) {
15654 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, cport)->cport_mutex);
15655 return (ENXIO);
15656 }
15657 if (sdinfo->satadrv_event_flags &
15658 (SATA_EVNT_DEVICE_RESET | SATA_EVNT_INPROC_DEVICE_RESET)) {
15659 sdinfo->satadrv_event_flags = 0;
15660 }
15661 sdinfo->satadrv_event_flags |= SATA_EVNT_CLEAR_DEVICE_RESET;
15662 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, cport)->cport_mutex);
15663
15664 if ((tdip = sata_get_scsi_target_dip(SATA_DIP(sata_hba_inst),
15665 &sata_device->satadev_addr)) != NULL) {
15666 /*
15667 * Target node exists. Verify, that it belongs
15668 * to existing, attached device and not to
15669 * a removed device.
15670 */
15671 if (sata_check_device_removed(tdip) == B_TRUE) {
15672 if (qual == SATA_ADDR_DPMPORT)
15673 sata_log(sata_hba_inst, CE_WARN,
15674 "SATA device at port %d cannot be "
15675 "configured. "
15676 "Application(s) accessing "
15677 "previously attached device "
15678 "have to release it before newly "
15679 "inserted device can be made accessible.",
15680 cport);
15681 else
15682 sata_log(sata_hba_inst, CE_WARN,
15683 "SATA device at port %d:%d cannot be"
15684 "configured. "
15685 "Application(s) accessing "
15686 "previously attached device "
15687 "have to release it before newly "
15688 "inserted device can be made accessible.",
15689 cport, pmport);
15690 return (EIO);
15691 }
15692 /*
15693 * Device was not removed and re-inserted.
15694 * Try to online it.
15695 */
15696 if (ndi_devi_online(tdip, 0) != NDI_SUCCESS) {
15697 SATA_LOG_D((sata_hba_inst, CE_WARN,
15698 "sata_hba_ioctl: configure: "
15699 "onlining device at SATA port "
15700 "%d:%d failed", cport, pmport));
15701 return (EIO);
15702 }
15703
15704 if (qual == SATA_ADDR_DPMPORT) {
15705 mutex_enter(&pmportinfo->pmport_mutex);
15706 pmportinfo->pmport_tgtnode_clean = B_TRUE;
15707 mutex_exit(&pmportinfo->pmport_mutex);
15708 } else {
15709 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst,
15710 cport)->cport_mutex);
15711 cportinfo-> cport_tgtnode_clean = B_TRUE;
15712 mutex_exit(&SATA_CPORT_INFO(
15713 sata_hba_inst, cport)->cport_mutex);
15714 }
15715 } else {
15716 /*
15717 * No target node - need to create a new target node.
15718 */
15719 if (qual == SATA_ADDR_DPMPORT) {
15720 mutex_enter(&pmportinfo->pmport_mutex);
15721 pmportinfo->pmport_tgtnode_clean = B_TRUE;
15722 mutex_exit(&pmportinfo->pmport_mutex);
15723 } else {
15724 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, cport)->
15725 cport_mutex);
15726 cportinfo-> cport_tgtnode_clean = B_TRUE;
15727 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, cport)->
15728 cport_mutex);
15729 }
15730
15731 tdip = sata_create_target_node(SATA_DIP(sata_hba_inst),
15732 sata_hba_inst, &sata_device->satadev_addr);
15733 if (tdip == NULL) {
15734 /* Configure operation failed */
15735 SATA_LOG_D((sata_hba_inst, CE_WARN,
15736 "sata_hba_ioctl: configure: "
15737 "configuring SATA device at port %d:%d "
15738 "failed", cport, pmport));
15739 return (EIO);
15740 }
15741 }
15742 return (0);
15743 }
15744
15745
15746 /*
15747 * Process ioctl deactivate port request.
15748 * Arbitrarily unconfigure attached device, if any.
15749 * Even if the unconfigure fails, proceed with the
15750 * port deactivation.
15751 *
15752 * NOTE: Port Multiplier is supported now.
15753 */
15754
15755 static int
sata_ioctl_deactivate(sata_hba_inst_t * sata_hba_inst,sata_device_t * sata_device)15756 sata_ioctl_deactivate(sata_hba_inst_t *sata_hba_inst,
15757 sata_device_t *sata_device)
15758 {
15759 int cport, pmport, qual;
15760 int rval, rv = 0;
15761 int npmport;
15762 sata_cport_info_t *cportinfo;
15763 sata_pmport_info_t *pmportinfo;
15764 sata_pmult_info_t *pmultinfo;
15765 dev_info_t *tdip;
15766 sata_drive_info_t *sdinfo = NULL;
15767 sata_device_t subsdevice;
15768
15769 /* Sanity check */
15770 if (SATA_PORT_DEACTIVATE_FUNC(sata_hba_inst) == NULL)
15771 return (ENOTSUP);
15772
15773 cport = sata_device->satadev_addr.cport;
15774 pmport = sata_device->satadev_addr.pmport;
15775 qual = sata_device->satadev_addr.qual;
15776
15777 /* SCSI_TO_SATA_ADDR_QUAL() translate ap_id into a device qualifier */
15778 ASSERT(qual == SATA_ADDR_DCPORT || qual == SATA_ADDR_DPMPORT);
15779 if (qual == SATA_ADDR_DCPORT)
15780 qual = SATA_ADDR_CPORT;
15781 else
15782 qual = SATA_ADDR_PMPORT;
15783
15784 cportinfo = SATA_CPORT_INFO(sata_hba_inst, cport);
15785 if (qual == SATA_ADDR_PMPORT)
15786 pmportinfo = SATA_PMPORT_INFO(sata_hba_inst, cport, pmport);
15787
15788 /*
15789 * Processing port multiplier
15790 */
15791 if (qual == SATA_ADDR_CPORT &&
15792 SATA_CPORT_DEV_TYPE(sata_hba_inst, cport) == SATA_DTYPE_PMULT) {
15793 mutex_enter(&cportinfo->cport_mutex);
15794
15795 /* Deactivate all sub-deices */
15796 pmultinfo = SATA_CPORTINFO_PMULT_INFO(cportinfo);
15797 if (pmultinfo != NULL) {
15798 for (npmport = 0; npmport < SATA_NUM_PMPORTS(
15799 sata_hba_inst, cport); npmport++) {
15800
15801 subsdevice.satadev_addr.cport = cport;
15802 subsdevice.satadev_addr.pmport =
15803 (uint8_t)npmport;
15804 subsdevice.satadev_addr.qual =
15805 SATA_ADDR_DPMPORT;
15806
15807 SATADBG2(SATA_DBG_PMULT, sata_hba_inst,
15808 "sata_hba_ioctl: deactivate: trying to "
15809 "deactivate SATA port %d:%d",
15810 cport, npmport);
15811
15812 mutex_exit(&cportinfo->cport_mutex);
15813 if (sata_ioctl_deactivate(sata_hba_inst,
15814 &subsdevice) == SATA_SUCCESS) {
15815 SATADBG2(SATA_DBG_PMULT, sata_hba_inst,
15816 "[Deactivate] device at port %d:%d "
15817 "successfully.", cport, npmport);
15818 }
15819 mutex_enter(&cportinfo->cport_mutex);
15820 }
15821 }
15822
15823 /* Deactivate the port multiplier now. */
15824 cportinfo->cport_state &= ~SATA_STATE_READY;
15825 mutex_exit(&cportinfo->cport_mutex);
15826
15827 sata_device->satadev_addr.qual = qual;
15828 rval = (*SATA_PORT_DEACTIVATE_FUNC(sata_hba_inst))
15829 (SATA_DIP(sata_hba_inst), sata_device);
15830
15831 sata_gen_sysevent(sata_hba_inst, &sata_device->satadev_addr,
15832 SE_NO_HINT);
15833
15834 mutex_enter(&cportinfo->cport_mutex);
15835 sata_update_port_info(sata_hba_inst, sata_device);
15836 if (rval != SATA_SUCCESS) {
15837 if (sata_device->satadev_state & SATA_PSTATE_FAILED) {
15838 cportinfo->cport_state = SATA_PSTATE_FAILED;
15839 }
15840 rv = EIO;
15841 } else {
15842 cportinfo->cport_state |= SATA_PSTATE_SHUTDOWN;
15843 }
15844 mutex_exit(&cportinfo->cport_mutex);
15845
15846 return (rv);
15847 }
15848
15849 /*
15850 * Process non-port-multiplier device - it could be a drive connected
15851 * to a port multiplier port or a controller port.
15852 */
15853 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, cport)->cport_mutex);
15854 if (qual == SATA_ADDR_CPORT) {
15855 sata_device->satadev_addr.qual = SATA_ADDR_DCPORT;
15856 if (cportinfo->cport_dev_type != SATA_DTYPE_NONE) {
15857 /* deal only with valid devices */
15858 if ((cportinfo->cport_dev_type &
15859 SATA_VALID_DEV_TYPE) != 0)
15860 sdinfo = SATA_CPORTINFO_DRV_INFO(cportinfo);
15861 }
15862 cportinfo->cport_state &= ~SATA_STATE_READY;
15863 } else {
15864 /* Port multiplier device port */
15865 mutex_enter(&pmportinfo->pmport_mutex);
15866 sata_device->satadev_addr.qual = SATA_ADDR_DPMPORT;
15867 if (pmportinfo->pmport_dev_type != SATA_DTYPE_NONE &&
15868 (pmportinfo->pmport_dev_type & SATA_VALID_DEV_TYPE) != 0)
15869 sdinfo = SATA_PMPORTINFO_DRV_INFO(pmportinfo);
15870 pmportinfo->pmport_state &= ~SATA_STATE_READY;
15871 mutex_exit(&pmportinfo->pmport_mutex);
15872 }
15873
15874 if (sdinfo != NULL) {
15875 /*
15876 * If a target node exists, try to offline a device and
15877 * to remove a target node.
15878 */
15879 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, cport)->
15880 cport_mutex);
15881 tdip = sata_get_scsi_target_dip(SATA_DIP(sata_hba_inst),
15882 &sata_device->satadev_addr);
15883 if (tdip != NULL) {
15884 /* target node exist */
15885 SATADBG1(SATA_DBG_IOCTL_IF, sata_hba_inst,
15886 "sata_hba_ioctl: port deactivate: "
15887 "target node exists.", NULL);
15888
15889 if (ndi_devi_offline(tdip, NDI_DEVI_REMOVE) !=
15890 NDI_SUCCESS) {
15891 SATA_LOG_D((sata_hba_inst, CE_WARN,
15892 "sata_hba_ioctl: port deactivate: "
15893 "failed to unconfigure device at port "
15894 "%d:%d before deactivating the port",
15895 cport, pmport));
15896 /*
15897 * Set DEVICE REMOVED state in the target
15898 * node. It will prevent an access to
15899 * the device even when a new device is
15900 * attached, until the old target node is
15901 * released, removed and recreated for a new
15902 * device.
15903 */
15904 sata_set_device_removed(tdip);
15905
15906 /*
15907 * Instruct the event daemon to try the
15908 * target node cleanup later.
15909 */
15910 sata_set_target_node_cleanup(sata_hba_inst,
15911 &sata_device->satadev_addr);
15912 }
15913 }
15914 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, cport)->
15915 cport_mutex);
15916 /*
15917 * In any case, remove and release sata_drive_info
15918 * structure.
15919 */
15920 if (qual == SATA_ADDR_CPORT) {
15921 SATA_CPORTINFO_DRV_INFO(cportinfo) = NULL;
15922 cportinfo->cport_dev_type = SATA_DTYPE_NONE;
15923 } else { /* port multiplier device port */
15924 mutex_enter(&pmportinfo->pmport_mutex);
15925 SATA_PMPORTINFO_DRV_INFO(pmportinfo) = NULL;
15926 pmportinfo->pmport_dev_type = SATA_DTYPE_NONE;
15927 mutex_exit(&pmportinfo->pmport_mutex);
15928 }
15929 (void) kmem_free((void *)sdinfo, sizeof (sata_drive_info_t));
15930 }
15931
15932 if (qual == SATA_ADDR_CPORT) {
15933 cportinfo->cport_state &= ~(SATA_STATE_PROBED |
15934 SATA_STATE_PROBING);
15935 } else if (qual == SATA_ADDR_PMPORT) {
15936 mutex_enter(&pmportinfo->pmport_mutex);
15937 pmportinfo->pmport_state &= ~(SATA_STATE_PROBED |
15938 SATA_STATE_PROBING);
15939 mutex_exit(&pmportinfo->pmport_mutex);
15940 }
15941 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, cport)->cport_mutex);
15942
15943 /* Just let HBA driver to deactivate port */
15944 sata_device->satadev_addr.qual = qual;
15945 rval = (*SATA_PORT_DEACTIVATE_FUNC(sata_hba_inst))
15946 (SATA_DIP(sata_hba_inst), sata_device);
15947
15948 /*
15949 * Generate sysevent - EC_DR / ESC_DR_AP_STATE_CHANGE
15950 * without the hint
15951 */
15952 sata_gen_sysevent(sata_hba_inst, &sata_device->satadev_addr,
15953 SE_NO_HINT);
15954
15955 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, cport)->cport_mutex);
15956 sata_update_port_info(sata_hba_inst, sata_device);
15957 if (qual == SATA_ADDR_CPORT) {
15958 if (rval != SATA_SUCCESS) {
15959 /*
15960 * Port deactivation failure - do not change port state
15961 * unless the state returned by HBA indicates a port
15962 * failure.
15963 */
15964 if (sata_device->satadev_state & SATA_PSTATE_FAILED) {
15965 SATA_CPORT_STATE(sata_hba_inst, cport) =
15966 SATA_PSTATE_FAILED;
15967 }
15968 SATA_LOG_D((sata_hba_inst, CE_WARN,
15969 "sata_hba_ioctl: port deactivate: "
15970 "cannot deactivate SATA port %d", cport));
15971 rv = EIO;
15972 } else {
15973 cportinfo->cport_state |= SATA_PSTATE_SHUTDOWN;
15974 }
15975 } else {
15976 mutex_enter(&pmportinfo->pmport_mutex);
15977 if (rval != SATA_SUCCESS) {
15978 if (sata_device->satadev_state & SATA_PSTATE_FAILED) {
15979 SATA_PMPORT_STATE(sata_hba_inst, cport,
15980 pmport) = SATA_PSTATE_FAILED;
15981 }
15982 SATA_LOG_D((sata_hba_inst, CE_WARN,
15983 "sata_hba_ioctl: port deactivate: "
15984 "cannot deactivate SATA port %d:%d",
15985 cport, pmport));
15986 rv = EIO;
15987 } else {
15988 pmportinfo->pmport_state |= SATA_PSTATE_SHUTDOWN;
15989 }
15990 mutex_exit(&pmportinfo->pmport_mutex);
15991 }
15992
15993 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, cport)->cport_mutex);
15994
15995 return (rv);
15996 }
15997
15998 /*
15999 * Process ioctl port activate request.
16000 *
16001 * NOTE: Port multiplier is supported now.
16002 */
16003 static int
sata_ioctl_activate(sata_hba_inst_t * sata_hba_inst,sata_device_t * sata_device)16004 sata_ioctl_activate(sata_hba_inst_t *sata_hba_inst,
16005 sata_device_t *sata_device)
16006 {
16007 int cport, pmport, qual;
16008 sata_cport_info_t *cportinfo;
16009 sata_pmport_info_t *pmportinfo = NULL;
16010 boolean_t dev_existed = B_TRUE;
16011
16012 /* Sanity check */
16013 if (SATA_PORT_ACTIVATE_FUNC(sata_hba_inst) == NULL)
16014 return (ENOTSUP);
16015
16016 cport = sata_device->satadev_addr.cport;
16017 pmport = sata_device->satadev_addr.pmport;
16018 qual = sata_device->satadev_addr.qual;
16019
16020 cportinfo = SATA_CPORT_INFO(sata_hba_inst, cport);
16021
16022 /*
16023 * The qual translate from ap_id (by SCSI_TO_SATA_ADDR_QUAL())
16024 * is a device. But what we are dealing with is port/pmport.
16025 */
16026 ASSERT(qual == SATA_ADDR_DCPORT || qual == SATA_ADDR_DPMPORT);
16027 if (qual == SATA_ADDR_DCPORT)
16028 sata_device->satadev_addr.qual = qual = SATA_ADDR_CPORT;
16029 else
16030 sata_device->satadev_addr.qual = qual = SATA_ADDR_PMPORT;
16031
16032 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, cport)->cport_mutex);
16033 if (qual == SATA_ADDR_PMPORT) {
16034 pmportinfo = SATA_PMPORT_INFO(sata_hba_inst, cport, pmport);
16035 if (pmportinfo->pmport_state & SATA_PSTATE_SHUTDOWN ||
16036 pmportinfo->pmport_dev_type == SATA_DTYPE_NONE)
16037 dev_existed = B_FALSE;
16038 } else { /* cport */
16039 if (cportinfo->cport_state & SATA_PSTATE_SHUTDOWN ||
16040 cportinfo->cport_dev_type == SATA_DTYPE_NONE)
16041 dev_existed = B_FALSE;
16042 }
16043 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, cport)->cport_mutex);
16044
16045 /* Just let HBA driver to activate port, if necessary */
16046 if ((*SATA_PORT_ACTIVATE_FUNC(sata_hba_inst))
16047 (SATA_DIP(sata_hba_inst), sata_device) != SATA_SUCCESS) {
16048 /*
16049 * Port activation failure - do not change port state unless
16050 * the state returned by HBA indicates a port failure.
16051 */
16052 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst,
16053 cport)->cport_mutex);
16054 sata_update_port_info(sata_hba_inst, sata_device);
16055 if (sata_device->satadev_state & SATA_PSTATE_FAILED) {
16056 if (qual == SATA_ADDR_PMPORT) {
16057 mutex_enter(&pmportinfo->pmport_mutex);
16058 pmportinfo->pmport_state = SATA_PSTATE_FAILED;
16059 mutex_exit(&pmportinfo->pmport_mutex);
16060 } else
16061 cportinfo->cport_state = SATA_PSTATE_FAILED;
16062
16063 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst,
16064 cport)->cport_mutex);
16065 SATA_LOG_D((sata_hba_inst, CE_WARN,
16066 "sata_hba_ioctl: port activate: cannot activate "
16067 "SATA port %d:%d", cport, pmport));
16068 return (EIO);
16069 }
16070 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, cport)->cport_mutex);
16071 }
16072 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, cport)->cport_mutex);
16073 if (qual == SATA_ADDR_PMPORT) {
16074 mutex_enter(&pmportinfo->pmport_mutex);
16075 pmportinfo->pmport_state &= ~SATA_PSTATE_SHUTDOWN;
16076 mutex_exit(&pmportinfo->pmport_mutex);
16077 } else
16078 cportinfo->cport_state &= ~SATA_PSTATE_SHUTDOWN;
16079 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, cport)->cport_mutex);
16080
16081 /*
16082 * Re-probe port to find its current state and possibly attached device.
16083 * Port re-probing may change the cportinfo device type if device is
16084 * found attached.
16085 * If port probing failed, the device type would be set to
16086 * SATA_DTYPE_NONE.
16087 */
16088 (void) sata_reprobe_port(sata_hba_inst, sata_device,
16089 SATA_DEV_IDENTIFY_RETRY);
16090
16091 /*
16092 * Generate sysevent - EC_DR / ESC_DR_AP_STATE_CHANGE
16093 * without the hint.
16094 */
16095 sata_gen_sysevent(sata_hba_inst, &sata_device->satadev_addr,
16096 SE_NO_HINT);
16097
16098 if (dev_existed == B_FALSE) {
16099 if (qual == SATA_ADDR_PMPORT &&
16100 pmportinfo->pmport_dev_type != SATA_DTYPE_NONE) {
16101 /*
16102 * That's the transition from the "inactive" port state
16103 * or the active port without a device attached to the
16104 * active port state with a device attached.
16105 */
16106 sata_log(sata_hba_inst, CE_WARN,
16107 "SATA device detected at port %d:%d",
16108 cport, pmport);
16109 } else if (qual == SATA_ADDR_CPORT &&
16110 cportinfo->cport_dev_type != SATA_DTYPE_NONE) {
16111 /*
16112 * That's the transition from the "inactive" port state
16113 * or the active port without a device attached to the
16114 * active port state with a device attached.
16115 */
16116 if (cportinfo->cport_dev_type != SATA_DTYPE_PMULT) {
16117 sata_log(sata_hba_inst, CE_WARN,
16118 "SATA device detected at port %d", cport);
16119 } else {
16120 sata_log(sata_hba_inst, CE_WARN,
16121 "SATA port multiplier detected at port %d",
16122 cport);
16123 }
16124 }
16125 }
16126 return (0);
16127 }
16128
16129
16130
16131 /*
16132 * Process ioctl reset port request.
16133 *
16134 * NOTE: Port-Multiplier is supported.
16135 */
16136 static int
sata_ioctl_reset_port(sata_hba_inst_t * sata_hba_inst,sata_device_t * sata_device)16137 sata_ioctl_reset_port(sata_hba_inst_t *sata_hba_inst,
16138 sata_device_t *sata_device)
16139 {
16140 int cport, pmport, qual;
16141 int rv = 0;
16142
16143 cport = sata_device->satadev_addr.cport;
16144 pmport = sata_device->satadev_addr.pmport;
16145 qual = sata_device->satadev_addr.qual;
16146
16147 /*
16148 * The qual translate from ap_id (by SCSI_TO_SATA_ADDR_QUAL())
16149 * is a device. But what we are dealing with is port/pmport.
16150 */
16151 if (qual == SATA_ADDR_DCPORT)
16152 sata_device->satadev_addr.qual = qual = SATA_ADDR_CPORT;
16153 else
16154 sata_device->satadev_addr.qual = qual = SATA_ADDR_PMPORT;
16155 ASSERT(qual == SATA_ADDR_CPORT || qual == SATA_ADDR_PMPORT);
16156
16157 /* Sanity check */
16158 if (SATA_RESET_DPORT_FUNC(sata_hba_inst) == NULL) {
16159 SATA_LOG_D((sata_hba_inst, CE_WARN,
16160 "sata_hba_ioctl: sata_hba_tran missing required "
16161 "function sata_tran_reset_dport"));
16162 return (ENOTSUP);
16163 }
16164
16165 /* Ask HBA to reset port */
16166 if ((*SATA_RESET_DPORT_FUNC(sata_hba_inst))(SATA_DIP(sata_hba_inst),
16167 sata_device) != SATA_SUCCESS) {
16168 SATA_LOG_D((sata_hba_inst, CE_WARN,
16169 "sata_hba_ioctl: reset port: failed %d:%d",
16170 cport, pmport));
16171 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, cport)->
16172 cport_mutex);
16173 sata_update_port_info(sata_hba_inst, sata_device);
16174 if (qual == SATA_ADDR_CPORT)
16175 SATA_CPORT_STATE(sata_hba_inst, cport) =
16176 SATA_PSTATE_FAILED;
16177 else {
16178 mutex_enter(&SATA_PMPORT_MUTEX(sata_hba_inst, cport,
16179 pmport));
16180 SATA_PMPORT_STATE(sata_hba_inst, cport, pmport) =
16181 SATA_PSTATE_FAILED;
16182 mutex_exit(&SATA_PMPORT_MUTEX(sata_hba_inst, cport,
16183 pmport));
16184 }
16185 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, cport)->
16186 cport_mutex);
16187 rv = EIO;
16188 }
16189
16190 return (rv);
16191 }
16192
16193 /*
16194 * Process ioctl reset device request.
16195 *
16196 * NOTE: Port multiplier is supported.
16197 */
16198 static int
sata_ioctl_reset_device(sata_hba_inst_t * sata_hba_inst,sata_device_t * sata_device)16199 sata_ioctl_reset_device(sata_hba_inst_t *sata_hba_inst,
16200 sata_device_t *sata_device)
16201 {
16202 sata_drive_info_t *sdinfo = NULL;
16203 sata_pmult_info_t *pmultinfo = NULL;
16204 int cport, pmport;
16205 int rv = 0;
16206
16207 /* Sanity check */
16208 if (SATA_RESET_DPORT_FUNC(sata_hba_inst) == NULL) {
16209 SATA_LOG_D((sata_hba_inst, CE_WARN,
16210 "sata_hba_ioctl: sata_hba_tran missing required "
16211 "function sata_tran_reset_dport"));
16212 return (ENOTSUP);
16213 }
16214
16215 cport = sata_device->satadev_addr.cport;
16216 pmport = sata_device->satadev_addr.pmport;
16217
16218 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, cport)->cport_mutex);
16219 if (sata_device->satadev_addr.qual == SATA_ADDR_DCPORT) {
16220 if (SATA_CPORT_DEV_TYPE(sata_hba_inst, cport) ==
16221 SATA_DTYPE_PMULT)
16222 pmultinfo = SATA_CPORT_INFO(sata_hba_inst, cport)->
16223 cport_devp.cport_sata_pmult;
16224 else
16225 sdinfo = SATA_CPORT_DRV_INFO(sata_hba_inst,
16226 sata_device->satadev_addr.cport);
16227 } else { /* port multiplier */
16228 sata_device->satadev_addr.qual = SATA_ADDR_DPMPORT;
16229 sdinfo = SATA_PMPORT_DRV_INFO(sata_hba_inst,
16230 sata_device->satadev_addr.cport,
16231 sata_device->satadev_addr.pmport);
16232 }
16233 if (sdinfo == NULL && pmultinfo == NULL) {
16234 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, cport)->cport_mutex);
16235 return (EINVAL);
16236 }
16237 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, cport)->cport_mutex);
16238
16239 /* Ask HBA to reset device */
16240 if ((*SATA_RESET_DPORT_FUNC(sata_hba_inst))
16241 (SATA_DIP(sata_hba_inst), sata_device) != SATA_SUCCESS) {
16242 SATA_LOG_D((sata_hba_inst, CE_WARN,
16243 "sata_hba_ioctl: reset device: failed at port %d:%d",
16244 cport, pmport));
16245 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, cport)->
16246 cport_mutex);
16247 sata_update_port_info(sata_hba_inst, sata_device);
16248 /*
16249 * Device info structure remains attached. Another device reset
16250 * or port disconnect/connect and re-probing is
16251 * needed to change it's state
16252 */
16253 if (sdinfo != NULL) {
16254 sdinfo->satadrv_state &= ~SATA_STATE_READY;
16255 sdinfo->satadrv_state |= SATA_DSTATE_FAILED;
16256 } else if (pmultinfo != NULL) {
16257 pmultinfo->pmult_state &= ~SATA_STATE_READY;
16258 pmultinfo->pmult_state |= SATA_DSTATE_FAILED;
16259 }
16260
16261 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, cport)->cport_mutex);
16262 rv = EIO;
16263 }
16264 /*
16265 * If attached device was a port multiplier, some extra processing
16266 * may be needed to bring it back. SATA specification requies a
16267 * mandatory software reset on host port to reliably enumerate a port
16268 * multiplier, the HBA driver should handle that after reset
16269 * operation.
16270 */
16271 return (rv);
16272 }
16273
16274
16275 /*
16276 * Process ioctl reset all request.
16277 */
16278 static int
sata_ioctl_reset_all(sata_hba_inst_t * sata_hba_inst)16279 sata_ioctl_reset_all(sata_hba_inst_t *sata_hba_inst)
16280 {
16281 sata_device_t sata_device;
16282 int rv = 0;
16283 int tcport;
16284
16285 sata_device.satadev_rev = SATA_DEVICE_REV;
16286
16287 /*
16288 * There is no protection here for configured devices.
16289 */
16290 /* Sanity check */
16291 if (SATA_RESET_DPORT_FUNC(sata_hba_inst) == NULL) {
16292 SATA_LOG_D((sata_hba_inst, CE_WARN,
16293 "sata_hba_ioctl: sata_hba_tran missing required "
16294 "function sata_tran_reset_dport"));
16295 return (ENOTSUP);
16296 }
16297
16298 /*
16299 * Need to lock all ports, not just one.
16300 * If any port is locked by event processing, fail the whole operation.
16301 * One port is already locked, but for simplicity lock it again.
16302 */
16303 for (tcport = 0; tcport < SATA_NUM_CPORTS(sata_hba_inst); tcport++) {
16304 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, tcport)->
16305 cport_mutex);
16306 if (((SATA_CPORT_INFO(sata_hba_inst, tcport)->
16307 cport_event_flags) & SATA_EVNT_LOCK_PORT_BUSY) != 0) {
16308 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, tcport)->
16309 cport_mutex);
16310 rv = EBUSY;
16311 break;
16312 } else {
16313 /*
16314 * It is enough to lock cport in command-based
16315 * switching mode.
16316 */
16317 SATA_CPORT_INFO(sata_hba_inst, tcport)->
16318 cport_event_flags |= SATA_APCTL_LOCK_PORT_BUSY;
16319 }
16320 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, tcport)->
16321 cport_mutex);
16322 }
16323
16324 if (rv == 0) {
16325 /*
16326 * All cports were successfully locked.
16327 * Reset main SATA controller.
16328 * Set the device address to port 0, to have a valid device
16329 * address.
16330 */
16331 sata_device.satadev_addr.qual = SATA_ADDR_CNTRL;
16332 sata_device.satadev_addr.cport = 0;
16333 sata_device.satadev_addr.pmport = 0;
16334
16335 if ((*SATA_RESET_DPORT_FUNC(sata_hba_inst))
16336 (SATA_DIP(sata_hba_inst), &sata_device) != SATA_SUCCESS) {
16337 SATA_LOG_D((sata_hba_inst, CE_WARN,
16338 "sata_hba_ioctl: reset controller failed"));
16339 return (EIO);
16340 }
16341 }
16342 /*
16343 * Unlock all ports
16344 */
16345 for (tcport = 0; tcport < SATA_NUM_CPORTS(sata_hba_inst); tcport++) {
16346 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, tcport)->
16347 cport_mutex);
16348 SATA_CPORT_INFO(sata_hba_inst, tcport)->
16349 cport_event_flags &= ~SATA_APCTL_LOCK_PORT_BUSY;
16350 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, tcport)->
16351 cport_mutex);
16352 }
16353
16354 /*
16355 * This operation returns EFAULT if either reset
16356 * controller failed or a re-probing of any port failed.
16357 */
16358 return (rv);
16359 }
16360
16361
16362 /*
16363 * Process ioctl port self test request.
16364 *
16365 * NOTE: Port multiplier code is not completed nor tested.
16366 */
16367 static int
sata_ioctl_port_self_test(sata_hba_inst_t * sata_hba_inst,sata_device_t * sata_device)16368 sata_ioctl_port_self_test(sata_hba_inst_t *sata_hba_inst,
16369 sata_device_t *sata_device)
16370 {
16371 int cport, pmport, qual;
16372 int rv = 0;
16373
16374 /* Sanity check */
16375 if (SATA_SELFTEST_FUNC(sata_hba_inst) == NULL)
16376 return (ENOTSUP);
16377
16378 cport = sata_device->satadev_addr.cport;
16379 pmport = sata_device->satadev_addr.pmport;
16380 qual = sata_device->satadev_addr.qual;
16381
16382 /*
16383 * There is no protection here for a configured
16384 * device attached to this port.
16385 */
16386
16387 if ((*SATA_SELFTEST_FUNC(sata_hba_inst))
16388 (SATA_DIP(sata_hba_inst), sata_device) != SATA_SUCCESS) {
16389 SATA_LOG_D((sata_hba_inst, CE_WARN,
16390 "sata_hba_ioctl: port selftest: "
16391 "failed port %d:%d", cport, pmport));
16392 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, cport)->
16393 cport_mutex);
16394 sata_update_port_info(sata_hba_inst, sata_device);
16395 if (qual == SATA_ADDR_CPORT)
16396 SATA_CPORT_STATE(sata_hba_inst, cport) =
16397 SATA_PSTATE_FAILED;
16398 else { /* port multiplier device port */
16399 mutex_enter(&SATA_PMPORT_MUTEX(sata_hba_inst,
16400 cport, pmport));
16401 SATA_PMPORT_STATE(sata_hba_inst, cport, pmport) =
16402 SATA_PSTATE_FAILED;
16403 mutex_exit(&SATA_PMPORT_MUTEX(sata_hba_inst,
16404 cport, pmport));
16405 }
16406
16407 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, cport)->
16408 cport_mutex);
16409 return (EIO);
16410 }
16411 /*
16412 * Beacuse the port was reset in the course of testing, it should be
16413 * re-probed and attached device state should be restored. At this
16414 * point the port state is unknown - it's state is HBA-specific.
16415 * Force port re-probing to get it into a known state.
16416 */
16417 if (sata_reprobe_port(sata_hba_inst, sata_device,
16418 SATA_DEV_IDENTIFY_RETRY) != SATA_SUCCESS)
16419 rv = EIO;
16420 return (rv);
16421 }
16422
16423
16424 /*
16425 * sata_cfgadm_state:
16426 * Use the sata port state and state of the target node to figure out
16427 * the cfgadm_state.
16428 *
16429 * The port argument is a value with encoded cport,
16430 * pmport and address qualifier, in the same manner as a scsi target number.
16431 * SCSI_TO_SATA_CPORT macro extracts cport number,
16432 * SCSI_TO_SATA_PMPORT extracts pmport number and
16433 * SCSI_TO_SATA_ADDR_QUAL extracts port mulitplier qualifier flag.
16434 *
16435 * Port multiplier is supported.
16436 */
16437
16438 static void
sata_cfgadm_state(sata_hba_inst_t * sata_hba_inst,int32_t port,devctl_ap_state_t * ap_state)16439 sata_cfgadm_state(sata_hba_inst_t *sata_hba_inst, int32_t port,
16440 devctl_ap_state_t *ap_state)
16441 {
16442 uint8_t cport, pmport, qual;
16443 uint32_t port_state, pmult_state;
16444 uint32_t dev_type;
16445 sata_drive_info_t *sdinfo;
16446
16447 cport = SCSI_TO_SATA_CPORT(port);
16448 pmport = SCSI_TO_SATA_PMPORT(port);
16449 qual = SCSI_TO_SATA_ADDR_QUAL(port);
16450
16451 /* Check cport state */
16452 port_state = SATA_CPORT_STATE(sata_hba_inst, cport);
16453 if (port_state & SATA_PSTATE_SHUTDOWN ||
16454 port_state & SATA_PSTATE_FAILED) {
16455 ap_state->ap_rstate = AP_RSTATE_DISCONNECTED;
16456 ap_state->ap_ostate = AP_OSTATE_UNCONFIGURED;
16457 if (port_state & SATA_PSTATE_FAILED)
16458 ap_state->ap_condition = AP_COND_FAILED;
16459 else
16460 ap_state->ap_condition = AP_COND_UNKNOWN;
16461
16462 return;
16463 }
16464
16465 /* cport state is okay. Now check pmport state */
16466 if (qual == SATA_ADDR_DPMPORT || qual == SATA_ADDR_PMPORT) {
16467 /* Sanity check */
16468 if (SATA_CPORT_DEV_TYPE(sata_hba_inst, cport) !=
16469 SATA_DTYPE_PMULT || SATA_PMPORT_INFO(sata_hba_inst,
16470 cport, pmport) == NULL)
16471 return;
16472 port_state = SATA_PMPORT_STATE(sata_hba_inst, cport, pmport);
16473 if (port_state & SATA_PSTATE_SHUTDOWN ||
16474 port_state & SATA_PSTATE_FAILED) {
16475 ap_state->ap_rstate = AP_RSTATE_DISCONNECTED;
16476 ap_state->ap_ostate = AP_OSTATE_UNCONFIGURED;
16477 if (port_state & SATA_PSTATE_FAILED)
16478 ap_state->ap_condition = AP_COND_FAILED;
16479 else
16480 ap_state->ap_condition = AP_COND_UNKNOWN;
16481
16482 return;
16483 }
16484 }
16485
16486 /* Port is enabled and ready */
16487 if (qual == SATA_ADDR_DCPORT || qual == SATA_ADDR_CPORT)
16488 dev_type = SATA_CPORT_DEV_TYPE(sata_hba_inst, cport);
16489 else
16490 dev_type = SATA_PMPORT_DEV_TYPE(sata_hba_inst, cport, pmport);
16491
16492 switch (dev_type) {
16493 case SATA_DTYPE_NONE:
16494 {
16495 ap_state->ap_ostate = AP_OSTATE_UNCONFIGURED;
16496 ap_state->ap_condition = AP_COND_OK;
16497 /* No device attached */
16498 ap_state->ap_rstate = AP_RSTATE_EMPTY;
16499 break;
16500 }
16501 case SATA_DTYPE_PMULT:
16502 {
16503 /* Need to check port multiplier state */
16504 ASSERT(qual == SATA_ADDR_DCPORT);
16505 pmult_state = SATA_PMULT_INFO(sata_hba_inst, cport)->
16506 pmult_state;
16507 if (pmult_state & (SATA_PSTATE_SHUTDOWN|SATA_PSTATE_FAILED)) {
16508 ap_state->ap_rstate = AP_RSTATE_DISCONNECTED;
16509 ap_state->ap_ostate = AP_OSTATE_UNCONFIGURED;
16510 if (pmult_state & SATA_PSTATE_FAILED)
16511 ap_state->ap_condition = AP_COND_FAILED;
16512 else
16513 ap_state->ap_condition = AP_COND_UNKNOWN;
16514
16515 return;
16516 }
16517
16518 /* Port multiplier is not configurable */
16519 ap_state->ap_ostate = AP_OSTATE_CONFIGURED;
16520 ap_state->ap_rstate = AP_RSTATE_CONNECTED;
16521 ap_state->ap_condition = AP_COND_OK;
16522 break;
16523 }
16524
16525 case SATA_DTYPE_ATADISK:
16526 case SATA_DTYPE_ATAPICD:
16527 case SATA_DTYPE_ATAPITAPE:
16528 case SATA_DTYPE_ATAPIDISK:
16529 {
16530 dev_info_t *tdip = NULL;
16531 dev_info_t *dip = NULL;
16532
16533 dip = SATA_DIP(sata_hba_inst);
16534 tdip = sata_get_target_dip(dip, cport, pmport);
16535 ap_state->ap_rstate = AP_RSTATE_CONNECTED;
16536 if (tdip != NULL) {
16537 ndi_devi_enter(dip);
16538 mutex_enter(&(DEVI(tdip)->devi_lock));
16539 if (DEVI_IS_DEVICE_REMOVED(tdip)) {
16540 /*
16541 * There could be the case where previously
16542 * configured and opened device was removed
16543 * and unknown device was plugged.
16544 * In such case we want to show a device, and
16545 * its configured or unconfigured state but
16546 * indicate unusable condition untill the
16547 * old target node is released and removed.
16548 */
16549 ap_state->ap_condition = AP_COND_UNUSABLE;
16550 } else {
16551 mutex_enter(&SATA_CPORT_MUTEX(sata_hba_inst,
16552 cport));
16553 sdinfo = SATA_CPORT_DRV_INFO(sata_hba_inst,
16554 cport);
16555 if (sdinfo != NULL) {
16556 if ((sdinfo->satadrv_state &
16557 SATA_DSTATE_FAILED) != 0)
16558 ap_state->ap_condition =
16559 AP_COND_FAILED;
16560 else
16561 ap_state->ap_condition =
16562 AP_COND_OK;
16563 } else {
16564 ap_state->ap_condition =
16565 AP_COND_UNKNOWN;
16566 }
16567 mutex_exit(&SATA_CPORT_MUTEX(sata_hba_inst,
16568 cport));
16569 }
16570 if ((DEVI_IS_DEVICE_OFFLINE(tdip)) ||
16571 (DEVI_IS_DEVICE_DOWN(tdip))) {
16572 ap_state->ap_ostate =
16573 AP_OSTATE_UNCONFIGURED;
16574 } else {
16575 ap_state->ap_ostate =
16576 AP_OSTATE_CONFIGURED;
16577 }
16578 mutex_exit(&(DEVI(tdip)->devi_lock));
16579 ndi_devi_exit(dip);
16580 } else {
16581 ap_state->ap_ostate = AP_OSTATE_UNCONFIGURED;
16582 ap_state->ap_condition = AP_COND_UNKNOWN;
16583 }
16584 break;
16585 }
16586 case SATA_DTYPE_ATAPIPROC:
16587 ap_state->ap_rstate = AP_RSTATE_CONNECTED;
16588 ap_state->ap_ostate = AP_OSTATE_UNCONFIGURED;
16589 ap_state->ap_condition = AP_COND_OK;
16590 break;
16591 default:
16592 ap_state->ap_rstate = AP_RSTATE_CONNECTED;
16593 ap_state->ap_ostate = AP_OSTATE_UNCONFIGURED;
16594 ap_state->ap_condition = AP_COND_UNKNOWN;
16595 /*
16596 * This is actually internal error condition (non fatal),
16597 * because we have already checked all defined device types.
16598 */
16599 SATA_LOG_D((sata_hba_inst, CE_WARN,
16600 "sata_cfgadm_state: Internal error: "
16601 "unknown device type"));
16602 break;
16603 }
16604 }
16605
16606
16607 /*
16608 * Process ioctl get device path request.
16609 *
16610 * NOTE: Port multiplier has no target dip. Devices connected to port
16611 * multiplier have target node attached to the HBA node. The only difference
16612 * between them and the directly-attached device node is a target address.
16613 */
16614 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)16615 sata_ioctl_get_device_path(sata_hba_inst_t *sata_hba_inst,
16616 sata_device_t *sata_device, sata_ioctl_data_t *ioc, int mode)
16617 {
16618 char path[MAXPATHLEN];
16619 uint32_t size;
16620 dev_info_t *tdip;
16621
16622 (void) strcpy(path, "/devices");
16623 if ((tdip = sata_get_scsi_target_dip(SATA_DIP(sata_hba_inst),
16624 &sata_device->satadev_addr)) == NULL) {
16625 /*
16626 * No such device. If this is a request for a size, do not
16627 * return EINVAL for non-existing target, because cfgadm
16628 * will then indicate a meaningless ioctl failure.
16629 * If this is a request for a path, indicate invalid
16630 * argument.
16631 */
16632 if (ioc->get_size == 0)
16633 return (EINVAL);
16634 } else {
16635 (void) ddi_pathname(tdip, path + strlen(path));
16636 }
16637 size = strlen(path) + 1;
16638
16639 if (ioc->get_size != 0) {
16640 if (ddi_copyout((void *)&size, ioc->buf, ioc->bufsiz,
16641 mode) != 0)
16642 return (EFAULT);
16643 } else {
16644 if (ioc->bufsiz != size)
16645 return (EINVAL);
16646
16647 else if (ddi_copyout((void *)&path, ioc->buf, ioc->bufsiz,
16648 mode) != 0)
16649 return (EFAULT);
16650 }
16651 return (0);
16652 }
16653
16654 /*
16655 * Process ioctl get attachment point type request.
16656 *
16657 * NOTE: Port multiplier is supported.
16658 */
16659 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)16660 sata_ioctl_get_ap_type(sata_hba_inst_t *sata_hba_inst,
16661 sata_device_t *sata_device, sata_ioctl_data_t *ioc, int mode)
16662 {
16663 uint32_t type_len;
16664 const char *ap_type;
16665 int dev_type;
16666
16667 if (sata_device->satadev_addr.qual == SATA_ADDR_DCPORT)
16668 dev_type = SATA_CPORT_DEV_TYPE(sata_hba_inst,
16669 sata_device->satadev_addr.cport);
16670 else /* pmport */
16671 dev_type = SATA_PMPORT_DEV_TYPE(sata_hba_inst,
16672 sata_device->satadev_addr.cport,
16673 sata_device->satadev_addr.pmport);
16674
16675 switch (dev_type) {
16676 case SATA_DTYPE_NONE:
16677 ap_type = "port";
16678 break;
16679
16680 case SATA_DTYPE_ATADISK:
16681 case SATA_DTYPE_ATAPIDISK:
16682 ap_type = "disk";
16683 break;
16684
16685 case SATA_DTYPE_ATAPICD:
16686 ap_type = "cd/dvd";
16687 break;
16688
16689 case SATA_DTYPE_ATAPITAPE:
16690 ap_type = "tape";
16691 break;
16692
16693 case SATA_DTYPE_ATAPIPROC:
16694 ap_type = "processor";
16695 break;
16696
16697 case SATA_DTYPE_PMULT:
16698 ap_type = "sata-pmult";
16699 break;
16700
16701 case SATA_DTYPE_UNKNOWN:
16702 ap_type = "unknown";
16703 break;
16704
16705 default:
16706 ap_type = "unsupported";
16707 break;
16708
16709 } /* end of dev_type switch */
16710
16711 type_len = strlen(ap_type) + 1;
16712
16713 if (ioc->get_size) {
16714 if (ddi_copyout((void *)&type_len, ioc->buf, ioc->bufsiz,
16715 mode) != 0)
16716 return (EFAULT);
16717 } else {
16718 if (ioc->bufsiz != type_len)
16719 return (EINVAL);
16720
16721 if (ddi_copyout((void *)ap_type, ioc->buf,
16722 ioc->bufsiz, mode) != 0)
16723 return (EFAULT);
16724 }
16725 return (0);
16726
16727 }
16728
16729 /*
16730 * Process ioctl get device model info request.
16731 * This operation should return to cfgadm the device model
16732 * information string
16733 *
16734 * NOTE: Port multiplier is supported.
16735 */
16736 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)16737 sata_ioctl_get_model_info(sata_hba_inst_t *sata_hba_inst,
16738 sata_device_t *sata_device, sata_ioctl_data_t *ioc, int mode)
16739 {
16740 sata_drive_info_t *sdinfo;
16741 uint32_t info_len;
16742 char ap_info[SATA_ID_MODEL_LEN + 1];
16743
16744 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst,
16745 sata_device->satadev_addr.cport)->cport_mutex);
16746 if (sata_device->satadev_addr.qual == SATA_ADDR_DCPORT)
16747 sdinfo = SATA_CPORT_DRV_INFO(sata_hba_inst,
16748 sata_device->satadev_addr.cport);
16749 else /* port multiplier */
16750 sdinfo = SATA_PMPORT_DRV_INFO(sata_hba_inst,
16751 sata_device->satadev_addr.cport,
16752 sata_device->satadev_addr.pmport);
16753 if (sdinfo == NULL) {
16754 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst,
16755 sata_device->satadev_addr.cport)->cport_mutex);
16756 return (EINVAL);
16757 }
16758
16759 #ifdef _LITTLE_ENDIAN
16760 swab(sdinfo->satadrv_id.ai_model, ap_info, SATA_ID_MODEL_LEN);
16761 #else /* _LITTLE_ENDIAN */
16762 bcopy(sdinfo->satadrv_id.ai_model, ap_info, SATA_ID_MODEL_LEN);
16763 #endif /* _LITTLE_ENDIAN */
16764
16765 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst,
16766 sata_device->satadev_addr.cport)->cport_mutex);
16767
16768 ap_info[SATA_ID_MODEL_LEN] = '\0';
16769
16770 info_len = strlen(ap_info) + 1;
16771
16772 if (ioc->get_size) {
16773 if (ddi_copyout((void *)&info_len, ioc->buf, ioc->bufsiz,
16774 mode) != 0)
16775 return (EFAULT);
16776 } else {
16777 if (ioc->bufsiz < info_len)
16778 return (EINVAL);
16779 if (ddi_copyout((void *)ap_info, ioc->buf, ioc->bufsiz,
16780 mode) != 0)
16781 return (EFAULT);
16782 }
16783 return (0);
16784 }
16785
16786
16787 /*
16788 * Process ioctl get device firmware revision info request.
16789 * This operation should return to cfgadm the device firmware revision
16790 * information string
16791 *
16792 * Port multiplier is supported.
16793 */
16794 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)16795 sata_ioctl_get_revfirmware_info(sata_hba_inst_t *sata_hba_inst,
16796 sata_device_t *sata_device, sata_ioctl_data_t *ioc, int mode)
16797 {
16798 sata_drive_info_t *sdinfo;
16799 uint32_t info_len;
16800 char ap_info[SATA_ID_FW_LEN + 1];
16801
16802 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst,
16803 sata_device->satadev_addr.cport)->cport_mutex);
16804 if (sata_device->satadev_addr.qual == SATA_ADDR_DCPORT)
16805 sdinfo = SATA_CPORT_DRV_INFO(sata_hba_inst,
16806 sata_device->satadev_addr.cport);
16807 else /* port multiplier */
16808 sdinfo = SATA_PMPORT_DRV_INFO(sata_hba_inst,
16809 sata_device->satadev_addr.cport,
16810 sata_device->satadev_addr.pmport);
16811 if (sdinfo == NULL) {
16812 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst,
16813 sata_device->satadev_addr.cport)->cport_mutex);
16814 return (EINVAL);
16815 }
16816
16817 #ifdef _LITTLE_ENDIAN
16818 swab(sdinfo->satadrv_id.ai_fw, ap_info, SATA_ID_FW_LEN);
16819 #else /* _LITTLE_ENDIAN */
16820 bcopy(sdinfo->satadrv_id.ai_fw, ap_info, SATA_ID_FW_LEN);
16821 #endif /* _LITTLE_ENDIAN */
16822
16823 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst,
16824 sata_device->satadev_addr.cport)->cport_mutex);
16825
16826 ap_info[SATA_ID_FW_LEN] = '\0';
16827
16828 info_len = strlen(ap_info) + 1;
16829
16830 if (ioc->get_size) {
16831 if (ddi_copyout((void *)&info_len, ioc->buf, ioc->bufsiz,
16832 mode) != 0)
16833 return (EFAULT);
16834 } else {
16835 if (ioc->bufsiz < info_len)
16836 return (EINVAL);
16837 if (ddi_copyout((void *)ap_info, ioc->buf, ioc->bufsiz,
16838 mode) != 0)
16839 return (EFAULT);
16840 }
16841 return (0);
16842 }
16843
16844
16845 /*
16846 * Process ioctl get device serial number info request.
16847 * This operation should return to cfgadm the device serial number string.
16848 *
16849 * NOTE: Port multiplier is supported.
16850 */
16851 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)16852 sata_ioctl_get_serialnumber_info(sata_hba_inst_t *sata_hba_inst,
16853 sata_device_t *sata_device, sata_ioctl_data_t *ioc, int mode)
16854 {
16855 sata_drive_info_t *sdinfo;
16856 uint32_t info_len;
16857 char ap_info[SATA_ID_SERIAL_LEN + 1];
16858
16859 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst,
16860 sata_device->satadev_addr.cport)->cport_mutex);
16861 if (sata_device->satadev_addr.qual == SATA_ADDR_DCPORT)
16862 sdinfo = SATA_CPORT_DRV_INFO(sata_hba_inst,
16863 sata_device->satadev_addr.cport);
16864 else /* port multiplier */
16865 sdinfo = SATA_PMPORT_DRV_INFO(sata_hba_inst,
16866 sata_device->satadev_addr.cport,
16867 sata_device->satadev_addr.pmport);
16868 if (sdinfo == NULL) {
16869 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst,
16870 sata_device->satadev_addr.cport)->cport_mutex);
16871 return (EINVAL);
16872 }
16873
16874 #ifdef _LITTLE_ENDIAN
16875 swab(sdinfo->satadrv_id.ai_drvser, ap_info, SATA_ID_SERIAL_LEN);
16876 #else /* _LITTLE_ENDIAN */
16877 bcopy(sdinfo->satadrv_id.ai_drvser, ap_info, SATA_ID_SERIAL_LEN);
16878 #endif /* _LITTLE_ENDIAN */
16879
16880 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst,
16881 sata_device->satadev_addr.cport)->cport_mutex);
16882
16883 ap_info[SATA_ID_SERIAL_LEN] = '\0';
16884
16885 info_len = strlen(ap_info) + 1;
16886
16887 if (ioc->get_size) {
16888 if (ddi_copyout((void *)&info_len, ioc->buf, ioc->bufsiz,
16889 mode) != 0)
16890 return (EFAULT);
16891 } else {
16892 if (ioc->bufsiz < info_len)
16893 return (EINVAL);
16894 if (ddi_copyout((void *)ap_info, ioc->buf, ioc->bufsiz,
16895 mode) != 0)
16896 return (EFAULT);
16897 }
16898 return (0);
16899 }
16900
16901
16902 /*
16903 * Preset scsi extended sense data (to NO SENSE)
16904 * First 18 bytes of the sense data are preset to current valid sense
16905 * with a key NO SENSE data.
16906 *
16907 * Returns void
16908 */
16909 static void
sata_fixed_sense_data_preset(struct scsi_extended_sense * sense)16910 sata_fixed_sense_data_preset(struct scsi_extended_sense *sense)
16911 {
16912 sense->es_valid = 1; /* Valid sense */
16913 sense->es_class = CLASS_EXTENDED_SENSE; /* 0x70 - current err */
16914 sense->es_key = KEY_NO_SENSE;
16915 sense->es_info_1 = 0;
16916 sense->es_info_2 = 0;
16917 sense->es_info_3 = 0;
16918 sense->es_info_4 = 0;
16919 sense->es_add_len = 10; /* Additional length - replace with a def */
16920 sense->es_cmd_info[0] = 0;
16921 sense->es_cmd_info[1] = 0;
16922 sense->es_cmd_info[2] = 0;
16923 sense->es_cmd_info[3] = 0;
16924 sense->es_add_code = 0;
16925 sense->es_qual_code = 0;
16926 }
16927
16928 /*
16929 * Register a legacy cmdk-style devid for the target (disk) device.
16930 *
16931 * Note: This function is called only when the HBA devinfo node has the
16932 * property "use-cmdk-devid-format" set. This property indicates that
16933 * devid compatible with old cmdk (target) driver is to be generated
16934 * for any target device attached to this controller. This will take
16935 * precedence over the devid generated by sd (target) driver.
16936 * This function is derived from cmdk_devid_setup() function in cmdk.c.
16937 */
16938 static void
sata_target_devid_register(dev_info_t * dip,sata_drive_info_t * sdinfo)16939 sata_target_devid_register(dev_info_t *dip, sata_drive_info_t *sdinfo)
16940 {
16941 char *hwid;
16942 int modlen;
16943 int serlen;
16944 int rval;
16945 ddi_devid_t devid;
16946
16947 /*
16948 * device ID is a concatanation of model number, "=", serial number.
16949 */
16950 hwid = kmem_zalloc(LEGACY_HWID_LEN, KM_SLEEP);
16951 bcopy(&sdinfo->satadrv_id.ai_model, hwid,
16952 sizeof (sdinfo->satadrv_id.ai_model));
16953 swab(hwid, hwid, sizeof (sdinfo->satadrv_id.ai_model));
16954 modlen = sata_check_modser(hwid, sizeof (sdinfo->satadrv_id.ai_model));
16955 if (modlen == 0)
16956 goto err;
16957 hwid[modlen++] = '=';
16958 bcopy(&sdinfo->satadrv_id.ai_drvser, &hwid[modlen],
16959 sizeof (sdinfo->satadrv_id.ai_drvser));
16960 swab(&hwid[modlen], &hwid[modlen],
16961 sizeof (sdinfo->satadrv_id.ai_drvser));
16962 serlen = sata_check_modser(&hwid[modlen],
16963 sizeof (sdinfo->satadrv_id.ai_drvser));
16964 if (serlen == 0)
16965 goto err;
16966 hwid[modlen + serlen] = 0; /* terminate the hwid string */
16967
16968 /* initialize/register devid */
16969 if ((rval = ddi_devid_init(dip, DEVID_ATA_SERIAL,
16970 (ushort_t)(modlen + serlen), hwid, &devid)) == DDI_SUCCESS) {
16971 rval = ddi_devid_register(dip, devid);
16972 /*
16973 * Free up the allocated devid buffer.
16974 * NOTE: This doesn't mean unregistering devid.
16975 */
16976 ddi_devid_free(devid);
16977 }
16978
16979 if (rval != DDI_SUCCESS)
16980 cmn_err(CE_WARN, "sata: failed to create devid for the disk"
16981 " on port %d", sdinfo->satadrv_addr.cport);
16982 err:
16983 kmem_free(hwid, LEGACY_HWID_LEN);
16984 }
16985
16986 /*
16987 * valid model/serial string must contain a non-zero non-space characters.
16988 * trim trailing spaces/NULLs.
16989 */
16990 static int
sata_check_modser(char * buf,int buf_len)16991 sata_check_modser(char *buf, int buf_len)
16992 {
16993 boolean_t ret;
16994 char *s;
16995 int i;
16996 int tb = 0;
16997 char ch;
16998
16999 ret = B_FALSE;
17000 s = buf;
17001 for (i = 0; i < buf_len; i++) {
17002 ch = *s++;
17003 if (ch != ' ' && ch != '\0')
17004 tb = i + 1;
17005 if (ch != ' ' && ch != '\0' && ch != '0')
17006 ret = B_TRUE;
17007 }
17008
17009 if (ret == B_FALSE)
17010 return (0); /* invalid string */
17011
17012 return (tb); /* return length */
17013 }
17014
17015 /*
17016 * sata_set_drive_features function compares current device features setting
17017 * with the saved device features settings and, if there is a difference,
17018 * it restores device features setting to the previously saved state.
17019 * It also arbitrarily tries to select the highest supported DMA mode.
17020 * Device Identify or Identify Packet Device data has to be current.
17021 * At the moment read ahead and write cache are considered for all devices.
17022 * For atapi devices, Removable Media Status Notification is set in addition
17023 * to common features.
17024 *
17025 * This function cannot be called in the interrupt context (it may sleep).
17026 *
17027 * The input argument sdinfo should point to the drive info structure
17028 * to be updated after features are set. Note, that only
17029 * device (packet) identify data is updated, not the flags indicating the
17030 * supported features.
17031 *
17032 * Returns SATA_SUCCESS if successful or there was nothing to do.
17033 * Device Identify data in the drive info structure pointed to by the sdinfo
17034 * arguments is updated even when no features were set or changed.
17035 *
17036 * Returns SATA_FAILURE if device features could not be set or DMA mode
17037 * for a disk cannot be set and device identify data cannot be fetched.
17038 *
17039 * Returns SATA_RETRY if device features could not be set (other than disk
17040 * DMA mode) but the device identify data was fetched successfully.
17041 *
17042 * Note: This function may fail the port, making it inaccessible.
17043 * In such case the explicit port disconnect/connect or physical device
17044 * detach/attach is required to re-evaluate port state again.
17045 */
17046
17047 static int
sata_set_drive_features(sata_hba_inst_t * sata_hba_inst,sata_drive_info_t * sdinfo,int restore)17048 sata_set_drive_features(sata_hba_inst_t *sata_hba_inst,
17049 sata_drive_info_t *sdinfo, int restore)
17050 {
17051 int rval = SATA_SUCCESS;
17052 int rval_set;
17053 sata_drive_info_t new_sdinfo;
17054 char *finfo = "sata_set_drive_features: cannot";
17055 char *finfox;
17056 int cache_op;
17057
17058 bzero(&new_sdinfo, sizeof (sata_drive_info_t));
17059 new_sdinfo.satadrv_addr = sdinfo->satadrv_addr;
17060 new_sdinfo.satadrv_type = sdinfo->satadrv_type;
17061 if (sata_fetch_device_identify_data(sata_hba_inst, &new_sdinfo) != 0) {
17062 /*
17063 * Cannot get device identification - caller may retry later
17064 */
17065 SATADBG1(SATA_DBG_DEV_SETTINGS, sata_hba_inst,
17066 "%s fetch device identify data\n", finfo);
17067 return (SATA_FAILURE);
17068 }
17069 finfox = (restore != 0) ? " restore device features" :
17070 " initialize device features\n";
17071
17072 switch (sdinfo->satadrv_type) {
17073 case SATA_DTYPE_ATADISK:
17074 /* Arbitrarily set UDMA mode */
17075 if (sata_set_dma_mode(sata_hba_inst, &new_sdinfo) !=
17076 SATA_SUCCESS) {
17077 SATA_LOG_D((sata_hba_inst, CE_WARN,
17078 "%s set UDMA mode\n", finfo));
17079 return (SATA_FAILURE);
17080 }
17081 break;
17082 case SATA_DTYPE_ATAPICD:
17083 case SATA_DTYPE_ATAPITAPE:
17084 case SATA_DTYPE_ATAPIDISK:
17085 /* Set Removable Media Status Notification, if necessary */
17086 if (SATA_RM_NOTIFIC_SUPPORTED(new_sdinfo.satadrv_id) &&
17087 restore != 0) {
17088 if (((sdinfo->satadrv_settings & SATA_DEV_RMSN) &&
17089 (!SATA_RM_NOTIFIC_ENABLED(new_sdinfo.satadrv_id)))||
17090 ((!(sdinfo->satadrv_settings & SATA_DEV_RMSN)) &&
17091 SATA_RM_NOTIFIC_ENABLED(new_sdinfo.satadrv_id))) {
17092 /* Current setting does not match saved one */
17093 if (sata_set_rmsn(sata_hba_inst, sdinfo,
17094 sdinfo->satadrv_settings &
17095 SATA_DEV_RMSN) != SATA_SUCCESS)
17096 rval = SATA_FAILURE;
17097 }
17098 }
17099 /*
17100 * We have to set Multiword DMA or UDMA, if it is supported, as
17101 * we want to use DMA transfer mode whenever possible.
17102 * Some devices require explicit setting of the DMA mode.
17103 */
17104 if (new_sdinfo.satadrv_id.ai_cap & SATA_DMA_SUPPORT) {
17105 /* Set highest supported DMA mode */
17106 if (sata_set_dma_mode(sata_hba_inst, &new_sdinfo) !=
17107 SATA_SUCCESS) {
17108 SATA_LOG_D((sata_hba_inst, CE_WARN,
17109 "%s set UDMA mode\n", finfo));
17110 rval = SATA_FAILURE;
17111 }
17112 }
17113 break;
17114 }
17115
17116 if (!SATA_READ_AHEAD_SUPPORTED(new_sdinfo.satadrv_id) &&
17117 !SATA_WRITE_CACHE_SUPPORTED(new_sdinfo.satadrv_id)) {
17118 /*
17119 * neither READ AHEAD nor WRITE CACHE is supported
17120 * - do nothing
17121 */
17122 SATADBG1(SATA_DBG_DEV_SETTINGS, sata_hba_inst,
17123 "settable features not supported\n", NULL);
17124 goto update_sdinfo;
17125 }
17126
17127 if ((SATA_READ_AHEAD_ENABLED(new_sdinfo.satadrv_id) &&
17128 (sdinfo->satadrv_settings & SATA_DEV_READ_AHEAD)) &&
17129 (SATA_WRITE_CACHE_ENABLED(new_sdinfo.satadrv_id) &&
17130 (sdinfo->satadrv_settings & SATA_DEV_WRITE_CACHE))) {
17131 /*
17132 * both READ AHEAD and WRITE CACHE are enabled
17133 * - Nothing to do
17134 */
17135 SATADBG1(SATA_DBG_DEV_SETTINGS, sata_hba_inst,
17136 "no device features to set\n", NULL);
17137 goto update_sdinfo;
17138 }
17139
17140 cache_op = 0;
17141
17142 if (SATA_READ_AHEAD_SUPPORTED(new_sdinfo.satadrv_id)) {
17143 if ((sdinfo->satadrv_settings & SATA_DEV_READ_AHEAD) &&
17144 !SATA_READ_AHEAD_ENABLED(new_sdinfo.satadrv_id)) {
17145 /* Enable read ahead / read cache */
17146 cache_op = SATAC_SF_ENABLE_READ_AHEAD;
17147 SATADBG1(SATA_DBG_DEV_SETTINGS, sata_hba_inst,
17148 "enabling read cache\n", NULL);
17149 } else if (!(sdinfo->satadrv_settings & SATA_DEV_READ_AHEAD) &&
17150 SATA_READ_AHEAD_ENABLED(new_sdinfo.satadrv_id)) {
17151 /* Disable read ahead / read cache */
17152 cache_op = SATAC_SF_DISABLE_READ_AHEAD;
17153 SATADBG1(SATA_DBG_DEV_SETTINGS, sata_hba_inst,
17154 "disabling read cache\n", NULL);
17155 }
17156
17157 if (cache_op != 0) {
17158 /* Try to set read cache mode */
17159 rval_set = sata_set_cache_mode(sata_hba_inst,
17160 &new_sdinfo, cache_op);
17161 if (rval != SATA_FAILURE && rval_set != SATA_SUCCESS)
17162 rval = rval_set;
17163 }
17164 }
17165
17166 cache_op = 0;
17167
17168 if (SATA_WRITE_CACHE_SUPPORTED(new_sdinfo.satadrv_id)) {
17169 if ((sdinfo->satadrv_settings & SATA_DEV_WRITE_CACHE) &&
17170 !SATA_WRITE_CACHE_ENABLED(new_sdinfo.satadrv_id)) {
17171 /* Enable write cache */
17172 cache_op = SATAC_SF_ENABLE_WRITE_CACHE;
17173 SATADBG1(SATA_DBG_DEV_SETTINGS, sata_hba_inst,
17174 "enabling write cache\n", NULL);
17175 } else if (!(sdinfo->satadrv_settings & SATA_DEV_WRITE_CACHE) &&
17176 SATA_WRITE_CACHE_ENABLED(new_sdinfo.satadrv_id)) {
17177 /* Disable write cache */
17178 cache_op = SATAC_SF_DISABLE_WRITE_CACHE;
17179 SATADBG1(SATA_DBG_DEV_SETTINGS, sata_hba_inst,
17180 "disabling write cache\n", NULL);
17181 }
17182
17183 if (cache_op != 0) {
17184 /* Try to set write cache mode */
17185 rval_set = sata_set_cache_mode(sata_hba_inst,
17186 &new_sdinfo, cache_op);
17187 if (rval != SATA_FAILURE && rval_set != SATA_SUCCESS)
17188 rval = rval_set;
17189 }
17190 }
17191 if (rval != SATA_SUCCESS)
17192 SATA_LOG_D((sata_hba_inst, CE_WARN,
17193 "%s %s", finfo, finfox));
17194
17195 update_sdinfo:
17196 /*
17197 * We need to fetch Device Identify data again
17198 */
17199 if (sata_fetch_device_identify_data(sata_hba_inst, &new_sdinfo) != 0) {
17200 /*
17201 * Cannot get device identification - retry later
17202 */
17203 SATA_LOG_D((sata_hba_inst, CE_WARN,
17204 "%s re-fetch device identify data\n", finfo));
17205 rval = SATA_FAILURE;
17206 }
17207 /* Copy device sata info. */
17208 sdinfo->satadrv_id = new_sdinfo.satadrv_id;
17209
17210 return (rval);
17211 }
17212
17213
17214 /*
17215 *
17216 * Returns 1 if threshold exceeded, 0 if threshold not exceeded, -1 if
17217 * unable to determine.
17218 *
17219 * Cannot be called in an interrupt context.
17220 *
17221 * Called by sata_build_lsense_page_2f()
17222 */
17223
17224 static int
sata_fetch_smart_return_status(sata_hba_inst_t * sata_hba_inst,sata_drive_info_t * sdinfo)17225 sata_fetch_smart_return_status(sata_hba_inst_t *sata_hba_inst,
17226 sata_drive_info_t *sdinfo)
17227 {
17228 sata_pkt_t *spkt;
17229 sata_cmd_t *scmd;
17230 sata_pkt_txlate_t *spx;
17231 int rval;
17232
17233 spx = kmem_zalloc(sizeof (sata_pkt_txlate_t), KM_SLEEP);
17234 spx->txlt_sata_hba_inst = sata_hba_inst;
17235 spx->txlt_scsi_pkt = NULL; /* No scsi pkt involved */
17236 spkt = sata_pkt_alloc(spx, SLEEP_FUNC);
17237 if (spkt == NULL) {
17238 kmem_free(spx, sizeof (sata_pkt_txlate_t));
17239 return (-1);
17240 }
17241 /* address is needed now */
17242 spkt->satapkt_device.satadev_addr = sdinfo->satadrv_addr;
17243
17244
17245 /* Fill sata_pkt */
17246 spkt->satapkt_device.satadev_addr = sdinfo->satadrv_addr;
17247 spkt->satapkt_op_mode = SATA_OPMODE_SYNCH | SATA_OPMODE_INTERRUPTS;
17248 /* Synchronous mode, no callback */
17249 spkt->satapkt_comp = NULL;
17250 /* Timeout 30s */
17251 spkt->satapkt_time = sata_default_pkt_time;
17252
17253 scmd = &spkt->satapkt_cmd;
17254 scmd->satacmd_flags.sata_special_regs = B_TRUE;
17255 scmd->satacmd_flags.sata_data_direction = SATA_DIR_NODATA_XFER;
17256
17257 /* Set up which registers need to be returned */
17258 scmd->satacmd_flags.sata_copy_out_lba_mid_lsb = B_TRUE;
17259 scmd->satacmd_flags.sata_copy_out_lba_high_lsb = B_TRUE;
17260
17261 /* Build SMART_RETURN_STATUS cmd in the sata_pkt */
17262 scmd->satacmd_addr_type = 0; /* N/A */
17263 scmd->satacmd_sec_count_lsb = 0; /* N/A */
17264 scmd->satacmd_lba_low_lsb = 0; /* N/A */
17265 scmd->satacmd_lba_mid_lsb = SMART_MAGIC_VAL_1;
17266 scmd->satacmd_lba_high_lsb = SMART_MAGIC_VAL_2;
17267 scmd->satacmd_features_reg = SATA_SMART_RETURN_STATUS;
17268 scmd->satacmd_device_reg = 0; /* Always device 0 */
17269 scmd->satacmd_cmd_reg = SATAC_SMART;
17270 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
17271 sdinfo->satadrv_addr.cport)));
17272
17273
17274 /* Send pkt to SATA HBA driver */
17275 if ((*SATA_START_FUNC(sata_hba_inst))(SATA_DIP(sata_hba_inst), spkt) !=
17276 SATA_TRAN_ACCEPTED ||
17277 spkt->satapkt_reason != SATA_PKT_COMPLETED) {
17278 mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst,
17279 sdinfo->satadrv_addr.cport)));
17280 /*
17281 * Whoops, no SMART RETURN STATUS
17282 */
17283 rval = -1;
17284 } else {
17285 mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst,
17286 sdinfo->satadrv_addr.cport)));
17287 if (scmd->satacmd_error_reg & SATA_ERROR_ABORT) {
17288 rval = -1;
17289 goto fail;
17290 }
17291 if (scmd->satacmd_status_reg & SATA_STATUS_ERR) {
17292 rval = -1;
17293 goto fail;
17294 }
17295 if ((scmd->satacmd_lba_mid_lsb == SMART_MAGIC_VAL_1) &&
17296 (scmd->satacmd_lba_high_lsb == SMART_MAGIC_VAL_2))
17297 rval = 0;
17298 else if ((scmd->satacmd_lba_mid_lsb == SMART_MAGIC_VAL_3) &&
17299 (scmd->satacmd_lba_high_lsb == SMART_MAGIC_VAL_4))
17300 rval = 1;
17301 else {
17302 rval = -1;
17303 goto fail;
17304 }
17305 }
17306 fail:
17307 /* Free allocated resources */
17308 sata_pkt_free(spx);
17309 kmem_free(spx, sizeof (sata_pkt_txlate_t));
17310
17311 return (rval);
17312 }
17313
17314 /*
17315 *
17316 * Returns 0 if succeeded, -1 otherwise
17317 *
17318 * Cannot be called in an interrupt context.
17319 *
17320 */
17321 static int
sata_fetch_smart_data(sata_hba_inst_t * sata_hba_inst,sata_drive_info_t * sdinfo,struct smart_data * smart_data)17322 sata_fetch_smart_data(sata_hba_inst_t *sata_hba_inst, sata_drive_info_t *sdinfo,
17323 struct smart_data *smart_data)
17324 {
17325 sata_pkt_t *spkt;
17326 sata_cmd_t *scmd;
17327 sata_pkt_txlate_t *spx;
17328 int rval = 0;
17329 dev_info_t *dip = SATA_DIP(sata_hba_inst);
17330
17331 #if ! defined(lint)
17332 ASSERT(sizeof (struct smart_data) == 512);
17333 #endif
17334
17335 spx = kmem_zalloc(sizeof (sata_pkt_txlate_t), KM_SLEEP);
17336 spx->txlt_sata_hba_inst = sata_hba_inst;
17337 spx->txlt_scsi_pkt = NULL; /* No scsi pkt involved */
17338 spkt = sata_pkt_alloc(spx, SLEEP_FUNC);
17339 if (spkt == NULL) {
17340 kmem_free(spx, sizeof (sata_pkt_txlate_t));
17341 return (-1);
17342 }
17343 /* address is needed now */
17344 spkt->satapkt_device.satadev_addr = sdinfo->satadrv_addr;
17345
17346
17347 /* Fill sata_pkt */
17348 spkt->satapkt_device.satadev_addr = sdinfo->satadrv_addr;
17349 spkt->satapkt_op_mode = SATA_OPMODE_SYNCH | SATA_OPMODE_INTERRUPTS;
17350 /* Synchronous mode, no callback */
17351 spkt->satapkt_comp = NULL;
17352 /* Timeout 30s */
17353 spkt->satapkt_time = sata_default_pkt_time;
17354
17355 scmd = &spkt->satapkt_cmd;
17356 scmd->satacmd_flags.sata_data_direction = SATA_DIR_READ;
17357
17358 /*
17359 * Allocate buffer for SMART data
17360 */
17361 scmd->satacmd_bp = sata_alloc_local_buffer(spx,
17362 sizeof (struct smart_data));
17363 if (scmd->satacmd_bp == NULL) {
17364 sata_pkt_free(spx);
17365 kmem_free(spx, sizeof (sata_pkt_txlate_t));
17366 SATA_LOG_D((sata_hba_inst, CE_WARN,
17367 "sata_fetch_smart_data: "
17368 "cannot allocate buffer"));
17369 return (-1);
17370 }
17371
17372
17373 /* Build SMART_READ_DATA cmd in the sata_pkt */
17374 scmd->satacmd_addr_type = 0; /* N/A */
17375 scmd->satacmd_sec_count_lsb = 0; /* N/A */
17376 scmd->satacmd_lba_low_lsb = 0; /* N/A */
17377 scmd->satacmd_lba_mid_lsb = SMART_MAGIC_VAL_1;
17378 scmd->satacmd_lba_high_lsb = SMART_MAGIC_VAL_2;
17379 scmd->satacmd_features_reg = SATA_SMART_READ_DATA;
17380 scmd->satacmd_device_reg = 0; /* Always device 0 */
17381 scmd->satacmd_cmd_reg = SATAC_SMART;
17382 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
17383 sdinfo->satadrv_addr.cport)));
17384
17385 /* Send pkt to SATA HBA driver */
17386 if ((*SATA_START_FUNC(sata_hba_inst))(SATA_DIP(sata_hba_inst), spkt) !=
17387 SATA_TRAN_ACCEPTED ||
17388 spkt->satapkt_reason != SATA_PKT_COMPLETED) {
17389 mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst,
17390 sdinfo->satadrv_addr.cport)));
17391 /*
17392 * Whoops, no SMART DATA available
17393 */
17394 rval = -1;
17395 goto fail;
17396 } else {
17397 mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst,
17398 sdinfo->satadrv_addr.cport)));
17399 if (spx->txlt_buf_dma_handle != NULL) {
17400 rval = ddi_dma_sync(spx->txlt_buf_dma_handle, 0, 0,
17401 DDI_DMA_SYNC_FORKERNEL);
17402 ASSERT(rval == DDI_SUCCESS);
17403 if (sata_check_for_dma_error(dip, spx)) {
17404 ddi_fm_service_impact(dip,
17405 DDI_SERVICE_UNAFFECTED);
17406 rval = -1;
17407 goto fail;
17408 }
17409 }
17410 bcopy(scmd->satacmd_bp->b_un.b_addr, (uint8_t *)smart_data,
17411 sizeof (struct smart_data));
17412 }
17413
17414 fail:
17415 /* Free allocated resources */
17416 sata_free_local_buffer(spx);
17417 sata_pkt_free(spx);
17418 kmem_free(spx, sizeof (sata_pkt_txlate_t));
17419
17420 return (rval);
17421 }
17422
17423 /*
17424 * Issue a READ LOG EXT command for the given log (log_addr) and page
17425 * (page_num) of the log. The output is written to buf. nsect is the size
17426 * of buf in units of 512-byte sectors.
17427 */
17428 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)17429 sata_read_log_ext(sata_hba_inst_t *sata_hba_inst, sata_drive_info_t *sdinfo,
17430 uint8_t log_addr, uint16_t page_num, void *buf, uint16_t nsect)
17431 {
17432 dev_info_t *dip;
17433 sata_pkt_txlate_t *spx;
17434 sata_pkt_t *spkt;
17435 sata_cmd_t *scmd;
17436 kmutex_t *cmutex;
17437 int rval;
17438
17439 dip = SATA_DIP(sata_hba_inst);
17440 cmutex = &SATA_CPORT_MUTEX(sata_hba_inst, sdinfo->satadrv_addr.cport);
17441
17442 ASSERT(MUTEX_HELD(cmutex));
17443
17444 spx = kmem_zalloc(sizeof (*spx), KM_SLEEP);
17445 spx->txlt_sata_hba_inst = sata_hba_inst;
17446 spx->txlt_scsi_pkt = NULL;
17447
17448 spkt = sata_pkt_alloc(spx, SLEEP_FUNC);
17449 spkt->satapkt_device.satadev_addr = sdinfo->satadrv_addr;
17450 spkt->satapkt_op_mode = SATA_OPMODE_SYNCH | SATA_OPMODE_INTERRUPTS;
17451 spkt->satapkt_comp = NULL;
17452 spkt->satapkt_time = sata_default_pkt_time;
17453
17454 scmd = &spkt->satapkt_cmd;
17455 scmd->satacmd_bp = sata_alloc_local_buffer(spx, (size_t)nsect * 512);
17456 if (scmd->satacmd_bp == NULL) {
17457 sata_pkt_free(spx);
17458 kmem_free(spx, sizeof (*spx));
17459 SATA_LOG_D((sata_hba_inst, CE_WARN, "%s: cannot allocate bp",
17460 __func__));
17461 return (-1);
17462 }
17463
17464 scmd->satacmd_cmd_reg = SATAC_READ_LOG_EXT;
17465 scmd->satacmd_flags.sata_data_direction = SATA_DIR_READ;
17466 scmd->satacmd_addr_type = ATA_ADDR_LBA48;
17467 scmd->satacmd_sec_count_lsb = nsect & 0xff;
17468 scmd->satacmd_sec_count_msb = nsect >> 8;
17469
17470 /*
17471 * From ACS-3 7.24.3.1 Table 68
17472 * LBA[47:40] Reserved
17473 * LBA[39:32] PAGE NUMBER (15:8)
17474 * LBA[31:16] Reserved
17475 * LBA[15:8] PAGE NUMBER (7:0)
17476 * LBA[7:0] LOG ADDRESS
17477 */
17478 scmd->satacmd_lba_low_lsb = log_addr; /* LBA[7:0] */
17479 scmd->satacmd_lba_mid_lsb = page_num & 0xff; /* LBA[15:8] */
17480 scmd->satacmd_lba_high_lsb = 0; /* LBA[23:16] */
17481 scmd->satacmd_lba_low_msb = 0; /* LBA[31:24] */
17482 scmd->satacmd_lba_mid_msb = page_num >> 8; /* LBA[39:32] */
17483 scmd->satacmd_lba_high_msb = 0; /* LBA[47:40] */
17484
17485 scmd->satacmd_device_reg = 0;
17486
17487 mutex_exit(cmutex);
17488 rval = (*SATA_START_FUNC(sata_hba_inst))(dip, spkt);
17489 mutex_enter(cmutex);
17490
17491 if (rval != SATA_TRAN_ACCEPTED ||
17492 spkt->satapkt_reason != SATA_PKT_COMPLETED) {
17493 rval = -1;
17494 goto fail;
17495 }
17496
17497 if (spx->txlt_buf_dma_handle != NULL) {
17498 rval = ddi_dma_sync(spx->txlt_buf_dma_handle, 0, 0,
17499 DDI_DMA_SYNC_FORKERNEL);
17500 ASSERT3S(rval, ==, DDI_SUCCESS);
17501 if (sata_check_for_dma_error(dip, spx)) {
17502 ddi_fm_service_impact(dip, DDI_SERVICE_UNAFFECTED);
17503 rval = -1;
17504 goto fail;
17505 }
17506
17507 bcopy(scmd->satacmd_bp->b_un.b_addr, buf, (size_t)nsect * 512);
17508 rval = 0;
17509 }
17510
17511 fail:
17512 sata_free_local_buffer(spx);
17513 sata_pkt_free(spx);
17514 kmem_free(spx, sizeof (*spx));
17515
17516 return (rval);
17517 }
17518
17519 /*
17520 * Used by LOG SENSE page 0x10
17521 * Reads (in synchronous mode) the self test log data using Read Log Ext cmd.
17522 * Note: cannot be called in the interrupt context.
17523 *
17524 * return 0 for success, -1 otherwise
17525 *
17526 */
17527 CTASSERT(sizeof (struct smart_ext_selftest_log) == 512);
17528
17529 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)17530 sata_ext_smart_selftest_read_log(sata_hba_inst_t *sata_hba_inst,
17531 sata_drive_info_t *sdinfo, struct smart_ext_selftest_log *ext_selftest_log,
17532 uint16_t block_num)
17533 {
17534 return (sata_read_log_ext(sata_hba_inst, sdinfo,
17535 EXT_SMART_SELFTEST_LOG_PAGE, block_num, ext_selftest_log, 1));
17536 }
17537
17538 /*
17539 * Returns 0 for success, -1 otherwise
17540 *
17541 * SMART self-test log data is returned in buffer pointed to by selftest_log
17542 */
17543 static int
sata_smart_selftest_log(sata_hba_inst_t * sata_hba_inst,sata_drive_info_t * sdinfo,struct smart_selftest_log * selftest_log)17544 sata_smart_selftest_log(
17545 sata_hba_inst_t *sata_hba_inst,
17546 sata_drive_info_t *sdinfo,
17547 struct smart_selftest_log *selftest_log)
17548 {
17549 sata_pkt_t *spkt;
17550 sata_cmd_t *scmd;
17551 sata_pkt_txlate_t *spx;
17552 int rval;
17553 dev_info_t *dip = SATA_DIP(sata_hba_inst);
17554
17555 #if ! defined(lint)
17556 ASSERT(sizeof (struct smart_selftest_log) == 512);
17557 #endif
17558
17559 spx = kmem_zalloc(sizeof (sata_pkt_txlate_t), KM_SLEEP);
17560 spx->txlt_sata_hba_inst = sata_hba_inst;
17561 spx->txlt_scsi_pkt = NULL; /* No scsi pkt involved */
17562 spkt = sata_pkt_alloc(spx, SLEEP_FUNC);
17563 if (spkt == NULL) {
17564 kmem_free(spx, sizeof (sata_pkt_txlate_t));
17565 return (-1);
17566 }
17567 /* address is needed now */
17568 spkt->satapkt_device.satadev_addr = sdinfo->satadrv_addr;
17569
17570
17571 /* Fill sata_pkt */
17572 spkt->satapkt_device.satadev_addr = sdinfo->satadrv_addr;
17573 spkt->satapkt_op_mode = SATA_OPMODE_SYNCH | SATA_OPMODE_INTERRUPTS;
17574 /* Synchronous mode, no callback */
17575 spkt->satapkt_comp = NULL;
17576 /* Timeout 30s */
17577 spkt->satapkt_time = sata_default_pkt_time;
17578
17579 scmd = &spkt->satapkt_cmd;
17580 scmd->satacmd_flags.sata_data_direction = SATA_DIR_READ;
17581
17582 /*
17583 * Allocate buffer for SMART SELFTEST LOG
17584 */
17585 scmd->satacmd_bp = sata_alloc_local_buffer(spx,
17586 sizeof (struct smart_selftest_log));
17587 if (scmd->satacmd_bp == NULL) {
17588 sata_pkt_free(spx);
17589 kmem_free(spx, sizeof (sata_pkt_txlate_t));
17590 SATA_LOG_D((sata_hba_inst, CE_WARN,
17591 "sata_smart_selftest_log: "
17592 "cannot allocate buffer"));
17593 return (-1);
17594 }
17595
17596 /* Build SMART_READ_LOG cmd in the sata_pkt */
17597 scmd->satacmd_addr_type = 0; /* N/A */
17598 scmd->satacmd_sec_count_lsb = 1; /* One sector of SMART log */
17599 scmd->satacmd_lba_low_lsb = SMART_SELFTEST_LOG_PAGE;
17600 scmd->satacmd_lba_mid_lsb = SMART_MAGIC_VAL_1;
17601 scmd->satacmd_lba_high_lsb = SMART_MAGIC_VAL_2;
17602 scmd->satacmd_features_reg = SATA_SMART_READ_LOG;
17603 scmd->satacmd_device_reg = 0; /* Always device 0 */
17604 scmd->satacmd_cmd_reg = SATAC_SMART;
17605 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
17606 sdinfo->satadrv_addr.cport)));
17607
17608 /* Send pkt to SATA HBA driver */
17609 if ((*SATA_START_FUNC(sata_hba_inst))(SATA_DIP(sata_hba_inst), spkt) !=
17610 SATA_TRAN_ACCEPTED ||
17611 spkt->satapkt_reason != SATA_PKT_COMPLETED) {
17612 mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst,
17613 sdinfo->satadrv_addr.cport)));
17614 /*
17615 * Whoops, no SMART DATA available
17616 */
17617 rval = -1;
17618 goto fail;
17619 } else {
17620 mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst,
17621 sdinfo->satadrv_addr.cport)));
17622 if (spx->txlt_buf_dma_handle != NULL) {
17623 rval = ddi_dma_sync(spx->txlt_buf_dma_handle, 0, 0,
17624 DDI_DMA_SYNC_FORKERNEL);
17625 ASSERT(rval == DDI_SUCCESS);
17626 if (sata_check_for_dma_error(dip, spx)) {
17627 ddi_fm_service_impact(dip,
17628 DDI_SERVICE_UNAFFECTED);
17629 rval = -1;
17630 goto fail;
17631 }
17632 }
17633 bcopy(scmd->satacmd_bp->b_un.b_addr, (uint8_t *)selftest_log,
17634 sizeof (struct smart_selftest_log));
17635 rval = 0;
17636 }
17637
17638 fail:
17639 /* Free allocated resources */
17640 sata_free_local_buffer(spx);
17641 sata_pkt_free(spx);
17642 kmem_free(spx, sizeof (sata_pkt_txlate_t));
17643
17644 return (rval);
17645 }
17646
17647
17648 /*
17649 * Returns 0 for success, -1 otherwise
17650 *
17651 * SMART READ LOG data is returned in buffer pointed to by smart_log
17652 */
17653 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)17654 sata_smart_read_log(
17655 sata_hba_inst_t *sata_hba_inst,
17656 sata_drive_info_t *sdinfo,
17657 uint8_t *smart_log, /* where the data should be returned */
17658 uint8_t which_log, /* which log should be returned */
17659 uint8_t log_size) /* # of 512 bytes in log */
17660 {
17661 sata_pkt_t *spkt;
17662 sata_cmd_t *scmd;
17663 sata_pkt_txlate_t *spx;
17664 int rval;
17665 dev_info_t *dip = SATA_DIP(sata_hba_inst);
17666
17667 spx = kmem_zalloc(sizeof (sata_pkt_txlate_t), KM_SLEEP);
17668 spx->txlt_sata_hba_inst = sata_hba_inst;
17669 spx->txlt_scsi_pkt = NULL; /* No scsi pkt involved */
17670 spkt = sata_pkt_alloc(spx, SLEEP_FUNC);
17671 if (spkt == NULL) {
17672 kmem_free(spx, sizeof (sata_pkt_txlate_t));
17673 return (-1);
17674 }
17675 /* address is needed now */
17676 spkt->satapkt_device.satadev_addr = sdinfo->satadrv_addr;
17677
17678
17679 /* Fill sata_pkt */
17680 spkt->satapkt_device.satadev_addr = sdinfo->satadrv_addr;
17681 spkt->satapkt_op_mode = SATA_OPMODE_SYNCH | SATA_OPMODE_INTERRUPTS;
17682 /* Synchronous mode, no callback */
17683 spkt->satapkt_comp = NULL;
17684 /* Timeout 30s */
17685 spkt->satapkt_time = sata_default_pkt_time;
17686
17687 scmd = &spkt->satapkt_cmd;
17688 scmd->satacmd_flags.sata_data_direction = SATA_DIR_READ;
17689
17690 /*
17691 * Allocate buffer for SMART READ LOG
17692 */
17693 scmd->satacmd_bp = sata_alloc_local_buffer(spx, (size_t)log_size * 512);
17694 if (scmd->satacmd_bp == NULL) {
17695 sata_pkt_free(spx);
17696 kmem_free(spx, sizeof (sata_pkt_txlate_t));
17697 SATA_LOG_D((sata_hba_inst, CE_WARN,
17698 "sata_smart_read_log: " "cannot allocate buffer"));
17699 return (-1);
17700 }
17701
17702 /* Build SMART_READ_LOG cmd in the sata_pkt */
17703 scmd->satacmd_addr_type = 0; /* N/A */
17704 scmd->satacmd_sec_count_lsb = log_size; /* what the caller asked for */
17705 scmd->satacmd_lba_low_lsb = which_log; /* which log page */
17706 scmd->satacmd_lba_mid_lsb = SMART_MAGIC_VAL_1;
17707 scmd->satacmd_lba_high_lsb = SMART_MAGIC_VAL_2;
17708 scmd->satacmd_features_reg = SATA_SMART_READ_LOG;
17709 scmd->satacmd_device_reg = 0; /* Always device 0 */
17710 scmd->satacmd_cmd_reg = SATAC_SMART;
17711
17712 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
17713 sdinfo->satadrv_addr.cport)));
17714
17715 /* Send pkt to SATA HBA driver */
17716 if ((*SATA_START_FUNC(sata_hba_inst))(SATA_DIP(sata_hba_inst), spkt) !=
17717 SATA_TRAN_ACCEPTED ||
17718 spkt->satapkt_reason != SATA_PKT_COMPLETED) {
17719 mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst,
17720 sdinfo->satadrv_addr.cport)));
17721
17722 /*
17723 * Whoops, no SMART DATA available
17724 */
17725 rval = -1;
17726 goto fail;
17727 } else {
17728 mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst,
17729 sdinfo->satadrv_addr.cport)));
17730
17731 if (spx->txlt_buf_dma_handle != NULL) {
17732 rval = ddi_dma_sync(spx->txlt_buf_dma_handle, 0, 0,
17733 DDI_DMA_SYNC_FORKERNEL);
17734 ASSERT(rval == DDI_SUCCESS);
17735 if (sata_check_for_dma_error(dip, spx)) {
17736 ddi_fm_service_impact(dip,
17737 DDI_SERVICE_UNAFFECTED);
17738 rval = -1;
17739 goto fail;
17740 }
17741 }
17742 bcopy(scmd->satacmd_bp->b_un.b_addr, smart_log, log_size * 512);
17743 rval = 0;
17744 }
17745
17746 fail:
17747 /* Free allocated resources */
17748 sata_free_local_buffer(spx);
17749 sata_pkt_free(spx);
17750 kmem_free(spx, sizeof (sata_pkt_txlate_t));
17751
17752 return (rval);
17753 }
17754
17755 /*
17756 * Used by LOG SENSE page 0x10
17757 *
17758 * return 0 for success, -1 otherwise
17759 *
17760 */
17761 CTASSERT(sizeof (struct read_log_ext_directory) == 512);
17762
17763 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)17764 sata_read_log_ext_directory(sata_hba_inst_t *sata_hba_inst,
17765 sata_drive_info_t *sdinfo, struct read_log_ext_directory *logdir)
17766 {
17767 return (sata_read_log_ext(sata_hba_inst, sdinfo,
17768 READ_LOG_EXT_LOG_DIRECTORY, 0, logdir, 1));
17769 }
17770
17771 /*
17772 * Set up error retrieval sata command for NCQ command error data
17773 * recovery.
17774 *
17775 * Returns SATA_SUCCESS when data buffer is allocated and packet set-up,
17776 * returns SATA_FAILURE otherwise.
17777 */
17778 static int
sata_ncq_err_ret_cmd_setup(sata_pkt_txlate_t * spx,sata_drive_info_t * sdinfo)17779 sata_ncq_err_ret_cmd_setup(sata_pkt_txlate_t *spx, sata_drive_info_t *sdinfo)
17780 {
17781 #ifndef __lock_lint
17782 _NOTE(ARGUNUSED(sdinfo))
17783 #endif
17784
17785 sata_pkt_t *spkt = spx->txlt_sata_pkt;
17786 sata_cmd_t *scmd;
17787 struct buf *bp;
17788
17789 /* Operation modes are up to the caller */
17790 spkt->satapkt_op_mode = SATA_OPMODE_SYNCH | SATA_OPMODE_INTERRUPTS;
17791
17792 /* Synchronous mode, no callback - may be changed by the caller */
17793 spkt->satapkt_comp = NULL;
17794 spkt->satapkt_time = sata_default_pkt_time;
17795
17796 scmd = &spkt->satapkt_cmd;
17797 bcopy(&sata_rle_cmd, scmd, sizeof (sata_cmd_t));
17798 scmd->satacmd_flags.sata_ignore_dev_reset = B_TRUE;
17799
17800 /*
17801 * Allocate dma_able buffer error data.
17802 * Buffer allocation will take care of buffer alignment and other DMA
17803 * attributes.
17804 */
17805 bp = sata_alloc_local_buffer(spx,
17806 sizeof (struct sata_ncq_error_recovery_page));
17807 if (bp == NULL)
17808 return (SATA_FAILURE);
17809
17810 bp_mapin(bp); /* make data buffer accessible */
17811 scmd->satacmd_bp = bp;
17812
17813 /*
17814 * Set-up pointer to the buffer handle, so HBA can sync buffer
17815 * before accessing it. Handle is in usual place in translate struct.
17816 */
17817 scmd->satacmd_err_ret_buf_handle = &spx->txlt_buf_dma_handle;
17818
17819 ASSERT(scmd->satacmd_num_dma_cookies != 0);
17820 ASSERT(scmd->satacmd_dma_cookie_list != NULL);
17821
17822 return (SATA_SUCCESS);
17823 }
17824
17825 /*
17826 * sata_xlate_errors() is used to translate (S)ATA error
17827 * information to SCSI information returned in the SCSI
17828 * packet.
17829 */
17830 static void
sata_xlate_errors(sata_pkt_txlate_t * spx)17831 sata_xlate_errors(sata_pkt_txlate_t *spx)
17832 {
17833 struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
17834 struct scsi_extended_sense *sense;
17835
17836 scsipkt->pkt_reason = CMD_INCOMPLETE;
17837 *scsipkt->pkt_scbp = STATUS_CHECK;
17838 sense = sata_arq_sense(spx);
17839
17840 switch (spx->txlt_sata_pkt->satapkt_reason) {
17841 case SATA_PKT_PORT_ERROR:
17842 /*
17843 * We have no device data. Assume no data transfered.
17844 */
17845 sense->es_key = KEY_HARDWARE_ERROR;
17846 break;
17847
17848 case SATA_PKT_DEV_ERROR:
17849 if (spx->txlt_sata_pkt->satapkt_cmd.satacmd_status_reg &
17850 SATA_STATUS_ERR) {
17851 /*
17852 * determine dev error reason from error
17853 * reg content
17854 */
17855 sata_decode_device_error(spx, sense);
17856 break;
17857 }
17858 /* No extended sense key - no info available */
17859 break;
17860
17861 case SATA_PKT_TIMEOUT:
17862 scsipkt->pkt_reason = CMD_TIMEOUT;
17863 scsipkt->pkt_statistics |= STAT_TIMEOUT | STAT_DEV_RESET;
17864 /* No extended sense key */
17865 break;
17866
17867 case SATA_PKT_ABORTED:
17868 scsipkt->pkt_reason = CMD_ABORTED;
17869 scsipkt->pkt_statistics |= STAT_ABORTED;
17870 /* No extended sense key */
17871 break;
17872
17873 case SATA_PKT_RESET:
17874 /*
17875 * pkt aborted either by an explicit reset request from
17876 * a host, or due to error recovery
17877 */
17878 scsipkt->pkt_reason = CMD_RESET;
17879 scsipkt->pkt_statistics |= STAT_DEV_RESET;
17880 break;
17881
17882 default:
17883 scsipkt->pkt_reason = CMD_TRAN_ERR;
17884 break;
17885 }
17886 }
17887
17888
17889
17890
17891 /*
17892 * Log sata message
17893 * dev pathname msg line preceeds the logged message.
17894 */
17895
17896 static void
sata_log(sata_hba_inst_t * sata_hba_inst,uint_t level,char * fmt,...)17897 sata_log(sata_hba_inst_t *sata_hba_inst, uint_t level, char *fmt, ...)
17898 {
17899 char pathname[128];
17900 dev_info_t *dip = NULL;
17901 va_list ap;
17902
17903 mutex_enter(&sata_log_mutex);
17904
17905 va_start(ap, fmt);
17906 (void) vsprintf(sata_log_buf, fmt, ap);
17907 va_end(ap);
17908
17909 if (sata_hba_inst != NULL) {
17910 dip = SATA_DIP(sata_hba_inst);
17911 (void) ddi_pathname(dip, pathname);
17912 } else {
17913 pathname[0] = 0;
17914 }
17915 if (level == CE_CONT) {
17916 if (sata_debug_flags == 0)
17917 cmn_err(level, "?%s:\n %s\n", pathname, sata_log_buf);
17918 else
17919 cmn_err(level, "%s:\n %s\n", pathname, sata_log_buf);
17920 } else {
17921 if (level != CE_NOTE) {
17922 cmn_err(level, "%s:\n %s", pathname, sata_log_buf);
17923 } else if (sata_msg) {
17924 cmn_err(level, "%s:\n %s", pathname,
17925 sata_log_buf);
17926 }
17927 }
17928
17929 /* sata trace debug */
17930 sata_trace_debug(dip, sata_log_buf);
17931
17932 mutex_exit(&sata_log_mutex);
17933 }
17934
17935
17936 /* ******** Asynchronous HBA events handling & hotplugging support ******** */
17937
17938 /*
17939 * Start or terminate the thread, depending on flag arg and current state
17940 */
17941 static void
sata_event_thread_control(int startstop)17942 sata_event_thread_control(int startstop)
17943 {
17944 static int sata_event_thread_terminating = 0;
17945 static int sata_event_thread_starting = 0;
17946 int i;
17947
17948 mutex_enter(&sata_event_mutex);
17949
17950 if (startstop == 0 && (sata_event_thread_starting == 1 ||
17951 sata_event_thread_terminating == 1)) {
17952 mutex_exit(&sata_event_mutex);
17953 return;
17954 }
17955 if (startstop == 1 && sata_event_thread_starting == 1) {
17956 mutex_exit(&sata_event_mutex);
17957 return;
17958 }
17959 if (startstop == 1 && sata_event_thread_terminating == 1) {
17960 sata_event_thread_starting = 1;
17961 /* wait til terminate operation completes */
17962 i = SATA_EVNT_DAEMON_TERM_WAIT/SATA_EVNT_DAEMON_TERM_TIMEOUT;
17963 while (sata_event_thread_terminating == 1) {
17964 if (i-- <= 0) {
17965 sata_event_thread_starting = 0;
17966 mutex_exit(&sata_event_mutex);
17967 #ifdef SATA_DEBUG
17968 cmn_err(CE_WARN, "sata_event_thread_control: "
17969 "timeout waiting for thread to terminate");
17970 #endif
17971 return;
17972 }
17973 mutex_exit(&sata_event_mutex);
17974 delay(drv_usectohz(SATA_EVNT_DAEMON_TERM_TIMEOUT));
17975 mutex_enter(&sata_event_mutex);
17976 }
17977 }
17978 if (startstop == 1) {
17979 if (sata_event_thread == NULL) {
17980 sata_event_thread = thread_create(NULL, 0,
17981 (void (*)())sata_event_daemon,
17982 &sata_hba_list, 0, &p0, TS_RUN, minclsyspri);
17983 }
17984 sata_event_thread_starting = 0;
17985 mutex_exit(&sata_event_mutex);
17986 return;
17987 }
17988
17989 /*
17990 * If we got here, thread may need to be terminated
17991 */
17992 if (sata_event_thread != NULL) {
17993 int i;
17994 /* Signal event thread to go away */
17995 sata_event_thread_terminating = 1;
17996 sata_event_thread_terminate = 1;
17997 cv_signal(&sata_event_cv);
17998 /*
17999 * Wait til daemon terminates.
18000 */
18001 i = SATA_EVNT_DAEMON_TERM_WAIT/SATA_EVNT_DAEMON_TERM_TIMEOUT;
18002 while (sata_event_thread_terminate == 1) {
18003 mutex_exit(&sata_event_mutex);
18004 if (i-- <= 0) {
18005 /* Daemon did not go away !!! */
18006 #ifdef SATA_DEBUG
18007 cmn_err(CE_WARN, "sata_event_thread_control: "
18008 "cannot terminate event daemon thread");
18009 #endif
18010 mutex_enter(&sata_event_mutex);
18011 break;
18012 }
18013 delay(drv_usectohz(SATA_EVNT_DAEMON_TERM_TIMEOUT));
18014 mutex_enter(&sata_event_mutex);
18015 }
18016 sata_event_thread_terminating = 0;
18017 }
18018 ASSERT(sata_event_thread_terminating == 0);
18019 ASSERT(sata_event_thread_starting == 0);
18020 mutex_exit(&sata_event_mutex);
18021 }
18022
18023
18024 /*
18025 * SATA HBA event notification function.
18026 * Events reported by SATA HBA drivers per HBA instance relate to a change in
18027 * a port and/or device state or a controller itself.
18028 * Events for different addresses/addr types cannot be combined.
18029 * A warning message is generated for each event type.
18030 * Events are not processed by this function, so only the
18031 * event flag(s)is set for an affected entity and the event thread is
18032 * waken up. Event daemon thread processes all events.
18033 *
18034 * NOTE: Since more than one event may be reported at the same time, one
18035 * cannot determine a sequence of events when opposite event are reported, eg.
18036 * LINK_LOST and LINK_ESTABLISHED. Actual port status during event processing
18037 * is taking precedence over reported events, i.e. may cause ignoring some
18038 * events.
18039 */
18040 #define SATA_EVENT_MAX_MSG_LENGTH 79
18041
18042 void
sata_hba_event_notify(dev_info_t * dip,sata_device_t * sata_device,int event)18043 sata_hba_event_notify(dev_info_t *dip, sata_device_t *sata_device, int event)
18044 {
18045 sata_hba_inst_t *sata_hba_inst = NULL;
18046 sata_address_t *saddr;
18047 sata_pmult_info_t *pmultinfo;
18048 sata_drive_info_t *sdinfo;
18049 sata_port_stats_t *pstats;
18050 sata_cport_info_t *cportinfo = NULL;
18051 sata_pmport_info_t *pmportinfo = NULL;
18052 int cport, pmport;
18053 char buf1[SATA_EVENT_MAX_MSG_LENGTH + 1];
18054 char buf2[SATA_EVENT_MAX_MSG_LENGTH + 1];
18055 char *lcp;
18056 static char *err_msg_evnt_1 =
18057 "sata_hba_event_notify: invalid port event 0x%x ";
18058 static char *err_msg_evnt_2 =
18059 "sata_hba_event_notify: invalid device event 0x%x ";
18060 int linkevent;
18061
18062 /*
18063 * There is a possibility that an event will be generated on HBA
18064 * that has not completed attachment or is detaching. We still want
18065 * to process events until HBA is detached.
18066 */
18067 mutex_enter(&sata_mutex);
18068 for (sata_hba_inst = sata_hba_list; sata_hba_inst != NULL;
18069 sata_hba_inst = sata_hba_inst->satahba_next) {
18070 if (SATA_DIP(sata_hba_inst) == dip)
18071 if (sata_hba_inst->satahba_attached == 1)
18072 break;
18073 }
18074 mutex_exit(&sata_mutex);
18075 if (sata_hba_inst == NULL)
18076 /* HBA not attached */
18077 return;
18078
18079 ASSERT(sata_device != NULL);
18080
18081 /*
18082 * Validate address before - do not proceed with invalid address.
18083 */
18084 saddr = &sata_device->satadev_addr;
18085 if (saddr->cport >= SATA_NUM_CPORTS(sata_hba_inst))
18086 return;
18087
18088 cport = saddr->cport;
18089 pmport = saddr->pmport;
18090
18091 buf1[0] = buf2[0] = '\0';
18092
18093 /*
18094 * If event relates to port or device, check port state.
18095 * Port has to be initialized, or we cannot accept an event.
18096 */
18097 if ((saddr->qual & (SATA_ADDR_CPORT | SATA_ADDR_PMPORT |
18098 SATA_ADDR_DCPORT | SATA_ADDR_DPMPORT | SATA_ADDR_PMULT)) != 0) {
18099 mutex_enter(&sata_hba_inst->satahba_mutex);
18100 cportinfo = SATA_CPORT_INFO(sata_hba_inst, cport);
18101 mutex_exit(&sata_hba_inst->satahba_mutex);
18102 if (cportinfo == NULL || cportinfo->cport_state == 0)
18103 return;
18104 }
18105
18106 if ((saddr->qual & (SATA_ADDR_PMULT | SATA_ADDR_PMPORT |
18107 SATA_ADDR_DPMPORT)) != 0) {
18108 if (cportinfo->cport_dev_type != SATA_DTYPE_PMULT) {
18109 SATA_LOG_D((sata_hba_inst, CE_WARN,
18110 "sata_hba_event_notify: Non-pmult device (0x%x)"
18111 "is attached to port %d, ignore pmult/pmport "
18112 "event 0x%x", cportinfo->cport_dev_type,
18113 cport, event));
18114 return;
18115 }
18116
18117 mutex_enter(&cportinfo->cport_mutex);
18118 pmultinfo = SATA_PMULT_INFO(sata_hba_inst, cport);
18119 mutex_exit(&cportinfo->cport_mutex);
18120
18121 /*
18122 * The daemon might be processing attachment of port
18123 * multiplier, in that case we should ignore events on its
18124 * sub-devices.
18125 *
18126 * NOTE: Only pmult_state is checked in sata_hba_event_notify.
18127 * The pmport_state is checked by sata daemon.
18128 */
18129 if (pmultinfo == NULL ||
18130 pmultinfo->pmult_state == SATA_STATE_UNKNOWN) {
18131 SATA_LOG_D((sata_hba_inst, CE_WARN,
18132 "sata_hba_event_notify: pmult is not"
18133 "available at port %d:%d, ignore event 0x%x",
18134 cport, pmport, event));
18135 return;
18136 }
18137 }
18138
18139 if ((saddr->qual &
18140 (SATA_ADDR_PMPORT | SATA_ADDR_DPMPORT)) != 0) {
18141
18142 mutex_enter(&cportinfo->cport_mutex);
18143 if (pmport > SATA_NUM_PMPORTS(sata_hba_inst, cport)) {
18144 SATA_LOG_D((sata_hba_inst, CE_WARN,
18145 "sata_hba_event_notify: invalid/"
18146 "un-implemented port %d:%d (%d ports), "
18147 "ignore event 0x%x", cport, pmport,
18148 SATA_NUM_PMPORTS(sata_hba_inst, cport), event));
18149 mutex_exit(&cportinfo->cport_mutex);
18150 return;
18151 }
18152 mutex_exit(&cportinfo->cport_mutex);
18153
18154 mutex_enter(&sata_hba_inst->satahba_mutex);
18155 pmportinfo = SATA_PMPORT_INFO(sata_hba_inst,
18156 cport, pmport);
18157 mutex_exit(&sata_hba_inst->satahba_mutex);
18158
18159 /* pmport is implemented/valid? */
18160 if (pmportinfo == NULL) {
18161 SATA_LOG_D((sata_hba_inst, CE_WARN,
18162 "sata_hba_event_notify: invalid/"
18163 "un-implemented port %d:%d, ignore "
18164 "event 0x%x", cport, pmport, event));
18165 return;
18166 }
18167 }
18168
18169 /*
18170 * Events refer to devices, ports and controllers - each has
18171 * unique address. Events for different addresses cannot be combined.
18172 */
18173 if (saddr->qual & (SATA_ADDR_CPORT | SATA_ADDR_PMPORT)) {
18174
18175 mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst, cport)));
18176
18177 /* qualify this event(s) */
18178 if ((event & SATA_EVNT_PORT_EVENTS) == 0) {
18179 /* Invalid event for the device port */
18180 (void) sprintf(buf2, err_msg_evnt_1,
18181 event & SATA_EVNT_PORT_EVENTS);
18182 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst, cport)));
18183 goto event_info;
18184 }
18185 if (saddr->qual == SATA_ADDR_CPORT) {
18186 /* Controller's device port event */
18187
18188 (SATA_CPORT_INFO(sata_hba_inst, cport))->
18189 cport_event_flags |=
18190 event & SATA_EVNT_PORT_EVENTS;
18191 pstats =
18192 &(SATA_CPORT_INFO(sata_hba_inst, cport))->
18193 cport_stats;
18194 } else {
18195 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst, cport)));
18196 mutex_enter(&pmportinfo->pmport_mutex);
18197 /* Port multiplier's device port event */
18198 (SATA_PMPORT_INFO(sata_hba_inst, cport, pmport))->
18199 pmport_event_flags |=
18200 event & SATA_EVNT_PORT_EVENTS;
18201 pstats =
18202 &(SATA_PMPORT_INFO(sata_hba_inst, cport, pmport))->
18203 pmport_stats;
18204 mutex_exit(&pmportinfo->pmport_mutex);
18205 mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst, cport)));
18206 }
18207
18208 /*
18209 * Add to statistics and log the message. We have to do it
18210 * here rather than in the event daemon, because there may be
18211 * multiple events occuring before they are processed.
18212 */
18213 linkevent = event &
18214 (SATA_EVNT_LINK_LOST | SATA_EVNT_LINK_ESTABLISHED);
18215 if (linkevent) {
18216 if (linkevent == (SATA_EVNT_LINK_LOST |
18217 SATA_EVNT_LINK_ESTABLISHED)) {
18218 /* This is likely event combination */
18219 (void) strlcat(buf1, "link lost/established, ",
18220 SATA_EVENT_MAX_MSG_LENGTH);
18221
18222 if (pstats->link_lost < 0xffffffffffffffffULL)
18223 pstats->link_lost++;
18224 if (pstats->link_established <
18225 0xffffffffffffffffULL)
18226 pstats->link_established++;
18227 linkevent = 0;
18228 } else if (linkevent & SATA_EVNT_LINK_LOST) {
18229 (void) strlcat(buf1, "link lost, ",
18230 SATA_EVENT_MAX_MSG_LENGTH);
18231
18232 if (pstats->link_lost < 0xffffffffffffffffULL)
18233 pstats->link_lost++;
18234 } else {
18235 (void) strlcat(buf1, "link established, ",
18236 SATA_EVENT_MAX_MSG_LENGTH);
18237 if (pstats->link_established <
18238 0xffffffffffffffffULL)
18239 pstats->link_established++;
18240 }
18241 }
18242 if (event & SATA_EVNT_DEVICE_ATTACHED) {
18243 (void) strlcat(buf1, "device attached, ",
18244 SATA_EVENT_MAX_MSG_LENGTH);
18245 if (pstats->device_attached < 0xffffffffffffffffULL)
18246 pstats->device_attached++;
18247 }
18248 if (event & SATA_EVNT_DEVICE_DETACHED) {
18249 (void) strlcat(buf1, "device detached, ",
18250 SATA_EVENT_MAX_MSG_LENGTH);
18251 if (pstats->device_detached < 0xffffffffffffffffULL)
18252 pstats->device_detached++;
18253 }
18254 if (event & SATA_EVNT_PWR_LEVEL_CHANGED) {
18255 SATADBG1(SATA_DBG_EVENTS, sata_hba_inst,
18256 "port %d power level changed", cport);
18257 if (pstats->port_pwr_changed < 0xffffffffffffffffULL)
18258 pstats->port_pwr_changed++;
18259 }
18260
18261 if ((event & ~SATA_EVNT_PORT_EVENTS) != 0) {
18262 /* There should be no other events for this address */
18263 (void) sprintf(buf2, err_msg_evnt_1,
18264 event & ~SATA_EVNT_PORT_EVENTS);
18265 }
18266 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst, cport)));
18267
18268 } else if (saddr->qual & (SATA_ADDR_DCPORT | SATA_ADDR_DPMPORT)) {
18269 mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst, cport)));
18270
18271 /* qualify this event */
18272 if ((event & SATA_EVNT_DEVICE_RESET) == 0) {
18273 /* Invalid event for a device */
18274 (void) sprintf(buf2, err_msg_evnt_2,
18275 event & SATA_EVNT_DEVICE_RESET);
18276 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst, cport)));
18277 goto event_info;
18278 }
18279 /* drive event */
18280 sdinfo = sata_get_device_info(sata_hba_inst, sata_device);
18281 if (sdinfo != NULL) {
18282 if (event & SATA_EVNT_DEVICE_RESET) {
18283 (void) strlcat(buf1, "device reset, ",
18284 SATA_EVENT_MAX_MSG_LENGTH);
18285 if (sdinfo->satadrv_stats.drive_reset <
18286 0xffffffffffffffffULL)
18287 sdinfo->satadrv_stats.drive_reset++;
18288 sdinfo->satadrv_event_flags |=
18289 SATA_EVNT_DEVICE_RESET;
18290 }
18291 }
18292 if ((event & ~SATA_EVNT_DEVICE_RESET) != 0) {
18293 /* Invalid event for a device */
18294 (void) sprintf(buf2, err_msg_evnt_2,
18295 event & ~SATA_EVNT_DRIVE_EVENTS);
18296 }
18297 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst, cport)));
18298 } else if (saddr->qual == SATA_ADDR_PMULT) {
18299 mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst, cport)));
18300
18301 /* qualify this event */
18302 if ((event & (SATA_EVNT_DEVICE_RESET |
18303 SATA_EVNT_PMULT_LINK_CHANGED)) == 0) {
18304 /* Invalid event for a port multiplier */
18305 (void) sprintf(buf2, err_msg_evnt_2,
18306 event & SATA_EVNT_DEVICE_RESET);
18307 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst, cport)));
18308 goto event_info;
18309 }
18310
18311 pmultinfo = SATA_PMULT_INFO(sata_hba_inst, cport);
18312
18313 if (event & SATA_EVNT_DEVICE_RESET) {
18314
18315 SATADBG1(SATA_DBG_PMULT, sata_hba_inst,
18316 "[Reset] port-mult on cport %d", cport);
18317 pmultinfo->pmult_event_flags |=
18318 SATA_EVNT_DEVICE_RESET;
18319 (void) strlcat(buf1, "pmult reset, ",
18320 SATA_EVENT_MAX_MSG_LENGTH);
18321 }
18322
18323 if (event & SATA_EVNT_PMULT_LINK_CHANGED) {
18324
18325 SATADBG1(SATA_DBG_PMULT, sata_hba_inst,
18326 "pmult link changed on cport %d", cport);
18327 pmultinfo->pmult_event_flags |=
18328 SATA_EVNT_PMULT_LINK_CHANGED;
18329 (void) strlcat(buf1, "pmult link changed, ",
18330 SATA_EVENT_MAX_MSG_LENGTH);
18331 }
18332 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst, cport)));
18333
18334 } else {
18335 if (saddr->qual != SATA_ADDR_NULL) {
18336 /* Wrong address qualifier */
18337 SATA_LOG_D((sata_hba_inst, CE_WARN,
18338 "sata_hba_event_notify: invalid address 0x%x",
18339 *(uint32_t *)saddr));
18340 return;
18341 }
18342 if ((event & SATA_EVNT_CONTROLLER_EVENTS) == 0 ||
18343 (event & ~SATA_EVNT_CONTROLLER_EVENTS) != 0) {
18344 /* Invalid event for the controller */
18345 SATA_LOG_D((sata_hba_inst, CE_WARN,
18346 "sata_hba_event_notify: invalid event 0x%x for "
18347 "controller",
18348 event & SATA_EVNT_CONTROLLER_EVENTS));
18349 return;
18350 }
18351 buf1[0] = '\0';
18352 /* This may be a frequent and not interesting event */
18353 SATADBG1(SATA_DBG_EVENTS, sata_hba_inst,
18354 "controller power level changed\n", NULL);
18355
18356 mutex_enter(&sata_hba_inst->satahba_mutex);
18357 if (sata_hba_inst->satahba_stats.ctrl_pwr_change <
18358 0xffffffffffffffffULL)
18359 sata_hba_inst->satahba_stats.ctrl_pwr_change++;
18360
18361 sata_hba_inst->satahba_event_flags |=
18362 SATA_EVNT_PWR_LEVEL_CHANGED;
18363 mutex_exit(&sata_hba_inst->satahba_mutex);
18364 }
18365 /*
18366 * If we got here, there is something to do with this HBA
18367 * instance.
18368 */
18369 mutex_enter(&sata_hba_inst->satahba_mutex);
18370 sata_hba_inst->satahba_event_flags |= SATA_EVNT_MAIN;
18371 mutex_exit(&sata_hba_inst->satahba_mutex);
18372 mutex_enter(&sata_mutex);
18373 sata_event_pending |= SATA_EVNT_MAIN; /* global event indicator */
18374 mutex_exit(&sata_mutex);
18375
18376 /* Tickle event thread */
18377 mutex_enter(&sata_event_mutex);
18378 if (sata_event_thread_active == 0)
18379 cv_signal(&sata_event_cv);
18380 mutex_exit(&sata_event_mutex);
18381
18382 event_info:
18383 if (buf1[0] != '\0') {
18384 lcp = strrchr(buf1, ',');
18385 if (lcp != NULL)
18386 *lcp = '\0';
18387 }
18388 if (saddr->qual == SATA_ADDR_CPORT ||
18389 saddr->qual == SATA_ADDR_DCPORT) {
18390 if (buf1[0] != '\0') {
18391 sata_log(sata_hba_inst, CE_NOTE, "port %d: %s\n",
18392 cport, buf1);
18393 }
18394 if (buf2[0] != '\0') {
18395 sata_log(sata_hba_inst, CE_NOTE, "port %d: %s\n",
18396 cport, buf2);
18397 }
18398 } else if (saddr->qual == SATA_ADDR_PMPORT ||
18399 saddr->qual == SATA_ADDR_DPMPORT) {
18400 if (buf1[0] != '\0') {
18401 sata_log(sata_hba_inst, CE_NOTE,
18402 "port %d pmport %d: %s\n", cport, pmport, buf1);
18403 }
18404 if (buf2[0] != '\0') {
18405 sata_log(sata_hba_inst, CE_NOTE,
18406 "port %d pmport %d: %s\n", cport, pmport, buf2);
18407 }
18408 }
18409 }
18410
18411
18412 /*
18413 * Event processing thread.
18414 * Arg is a pointer to the sata_hba_list pointer.
18415 * It is not really needed, because sata_hba_list is global and static
18416 */
18417 static void
sata_event_daemon(void * arg)18418 sata_event_daemon(void *arg)
18419 {
18420 #ifndef __lock_lint
18421 _NOTE(ARGUNUSED(arg))
18422 #endif
18423 sata_hba_inst_t *sata_hba_inst;
18424 clock_t delta;
18425
18426 SATADBG1(SATA_DBG_EVENTS_DAEMON, NULL,
18427 "SATA event daemon started\n", NULL);
18428 loop:
18429 /*
18430 * Process events here. Walk through all registered HBAs
18431 */
18432 mutex_enter(&sata_mutex);
18433 for (sata_hba_inst = sata_hba_list; sata_hba_inst != NULL;
18434 sata_hba_inst = sata_hba_inst->satahba_next) {
18435 ASSERT(sata_hba_inst != NULL);
18436 mutex_enter(&sata_hba_inst->satahba_mutex);
18437 if (sata_hba_inst->satahba_attached == 0 ||
18438 (sata_hba_inst->satahba_event_flags &
18439 SATA_EVNT_SKIP) != 0) {
18440 mutex_exit(&sata_hba_inst->satahba_mutex);
18441 continue;
18442 }
18443 if (sata_hba_inst->satahba_event_flags & SATA_EVNT_MAIN) {
18444 sata_hba_inst->satahba_event_flags |= SATA_EVNT_SKIP;
18445 mutex_exit(&sata_hba_inst->satahba_mutex);
18446 mutex_exit(&sata_mutex);
18447 /* Got the controller with pending event */
18448 sata_process_controller_events(sata_hba_inst);
18449 /*
18450 * Since global mutex was released, there is a
18451 * possibility that HBA list has changed, so start
18452 * over from the top. Just processed controller
18453 * will be passed-over because of the SKIP flag.
18454 */
18455 goto loop;
18456 }
18457 mutex_exit(&sata_hba_inst->satahba_mutex);
18458 }
18459 /* Clear SKIP flag in all controllers */
18460 for (sata_hba_inst = sata_hba_list; sata_hba_inst != NULL;
18461 sata_hba_inst = sata_hba_inst->satahba_next) {
18462 mutex_enter(&sata_hba_inst->satahba_mutex);
18463 sata_hba_inst->satahba_event_flags &= ~SATA_EVNT_SKIP;
18464 mutex_exit(&sata_hba_inst->satahba_mutex);
18465 }
18466 mutex_exit(&sata_mutex);
18467
18468 SATADBG1(SATA_DBG_EVENTS_DAEMON, NULL,
18469 "SATA EVENT DAEMON suspending itself", NULL);
18470
18471 #ifdef SATA_DEBUG
18472 if ((sata_func_enable & SATA_ENABLE_PROCESS_EVENTS) == 0) {
18473 sata_log(sata_hba_inst, CE_WARN,
18474 "SATA EVENTS PROCESSING DISABLED\n");
18475 thread_exit(); /* Daemon will not run again */
18476 }
18477 #endif
18478 mutex_enter(&sata_event_mutex);
18479 sata_event_thread_active = 0;
18480 mutex_exit(&sata_event_mutex);
18481 /*
18482 * Go to sleep/suspend itself and wake up either because new event or
18483 * wait timeout. Exit if there is a termination request (driver
18484 * unload).
18485 */
18486 delta = drv_usectohz(SATA_EVNT_DAEMON_SLEEP_TIME);
18487 do {
18488 mutex_enter(&sata_event_mutex);
18489 (void) cv_reltimedwait(&sata_event_cv, &sata_event_mutex,
18490 delta, TR_CLOCK_TICK);
18491
18492 if (sata_event_thread_active != 0) {
18493 mutex_exit(&sata_event_mutex);
18494 continue;
18495 }
18496
18497 /* Check if it is time to go away */
18498 if (sata_event_thread_terminate == 1) {
18499 /*
18500 * It is up to the thread setting above flag to make
18501 * sure that this thread is not killed prematurely.
18502 */
18503 sata_event_thread_terminate = 0;
18504 sata_event_thread = NULL;
18505 mutex_exit(&sata_event_mutex);
18506 SATADBG1(SATA_DBG_EVENTS_DAEMON, NULL,
18507 "SATA_EVENT_DAEMON_TERMINATING", NULL);
18508 thread_exit(); { _NOTE(NOT_REACHED) }
18509 }
18510 mutex_exit(&sata_event_mutex);
18511 } while (!(sata_event_pending & SATA_EVNT_MAIN));
18512
18513 mutex_enter(&sata_event_mutex);
18514 sata_event_thread_active = 1;
18515 mutex_exit(&sata_event_mutex);
18516
18517 mutex_enter(&sata_mutex);
18518 sata_event_pending &= ~SATA_EVNT_MAIN;
18519 mutex_exit(&sata_mutex);
18520
18521 SATADBG1(SATA_DBG_EVENTS_DAEMON, NULL,
18522 "SATA EVENT DAEMON READY TO PROCESS EVENT", NULL);
18523
18524 goto loop;
18525 }
18526
18527 /*
18528 * Specific HBA instance event processing.
18529 *
18530 * NOTE: At the moment, device event processing is limited to hard disks
18531 * only.
18532 * Port multiplier is supported now.
18533 */
18534 static void
sata_process_controller_events(sata_hba_inst_t * sata_hba_inst)18535 sata_process_controller_events(sata_hba_inst_t *sata_hba_inst)
18536 {
18537 int ncport;
18538 uint32_t event_flags;
18539 sata_address_t *saddr;
18540 sata_cport_info_t *cportinfo;
18541 sata_pmult_info_t *pmultinfo;
18542
18543 SATADBG1(SATA_DBG_EVENTS_CNTRL, sata_hba_inst,
18544 "Processing controller %d event(s)",
18545 ddi_get_instance(SATA_DIP(sata_hba_inst)));
18546
18547 mutex_enter(&sata_hba_inst->satahba_mutex);
18548 sata_hba_inst->satahba_event_flags &= ~SATA_EVNT_MAIN;
18549 event_flags = sata_hba_inst->satahba_event_flags;
18550 mutex_exit(&sata_hba_inst->satahba_mutex);
18551 /*
18552 * Process controller power change first
18553 * HERE
18554 */
18555 if (event_flags & SATA_EVNT_PWR_LEVEL_CHANGED)
18556 sata_process_cntrl_pwr_level_change(sata_hba_inst);
18557
18558 /*
18559 * Search through ports/devices to identify affected port/device.
18560 * We may have to process events for more than one port/device.
18561 */
18562 for (ncport = 0; ncport < SATA_NUM_CPORTS(sata_hba_inst); ncport++) {
18563 /*
18564 * Not all ports may be processed in attach by the time we
18565 * get an event. Check if port info is initialized.
18566 */
18567 mutex_enter(&sata_hba_inst->satahba_mutex);
18568 cportinfo = SATA_CPORT_INFO(sata_hba_inst, ncport);
18569 mutex_exit(&sata_hba_inst->satahba_mutex);
18570 if (cportinfo == NULL || cportinfo->cport_state == 0)
18571 continue;
18572
18573 /* We have initialized controller port info */
18574 mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst, ncport)));
18575 event_flags = (SATA_CPORT_INFO(sata_hba_inst, ncport))->
18576 cport_event_flags;
18577 /* Check if port was locked by IOCTL processing */
18578 if (event_flags & SATA_APCTL_LOCK_PORT_BUSY) {
18579 /*
18580 * We ignore port events because port is busy
18581 * with AP control processing. Set again
18582 * controller and main event flag, so that
18583 * events may be processed by the next daemon
18584 * run.
18585 */
18586 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst, ncport)));
18587 mutex_enter(&sata_hba_inst->satahba_mutex);
18588 sata_hba_inst->satahba_event_flags |= SATA_EVNT_MAIN;
18589 mutex_exit(&sata_hba_inst->satahba_mutex);
18590 mutex_enter(&sata_mutex);
18591 sata_event_pending |= SATA_EVNT_MAIN;
18592 mutex_exit(&sata_mutex);
18593 SATADBG1(SATA_DBG_EVENTS_PROCPST, sata_hba_inst,
18594 "Event processing postponed until "
18595 "AP control processing completes",
18596 NULL);
18597 /* Check other ports */
18598 continue;
18599 } else {
18600 /*
18601 * Set BSY flag so that AP control would not
18602 * interfere with events processing for
18603 * this port.
18604 */
18605 (SATA_CPORT_INFO(sata_hba_inst, ncport))->
18606 cport_event_flags |= SATA_EVNT_LOCK_PORT_BUSY;
18607 }
18608 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst, ncport)));
18609
18610 saddr = &(SATA_CPORT_INFO(sata_hba_inst, ncport))->cport_addr;
18611
18612 if ((event_flags &
18613 (SATA_EVNT_PORT_EVENTS | SATA_EVNT_DRIVE_EVENTS)) != 0) {
18614 /*
18615 * Got port event.
18616 * We need some hierarchy of event processing as they
18617 * are affecting each other:
18618 * 1. port failed
18619 * 2. device detached/attached
18620 * 3. link events - link events may trigger device
18621 * detached or device attached events in some
18622 * circumstances.
18623 * 4. port power level changed
18624 */
18625 if (event_flags & SATA_EVNT_PORT_FAILED) {
18626 sata_process_port_failed_event(sata_hba_inst,
18627 saddr);
18628 }
18629 if (event_flags & SATA_EVNT_DEVICE_DETACHED) {
18630 sata_process_device_detached(sata_hba_inst,
18631 saddr);
18632 }
18633 if (event_flags & SATA_EVNT_DEVICE_ATTACHED) {
18634 sata_process_device_attached(sata_hba_inst,
18635 saddr);
18636 }
18637 if (event_flags &
18638 (SATA_EVNT_LINK_ESTABLISHED |
18639 SATA_EVNT_LINK_LOST)) {
18640 sata_process_port_link_events(sata_hba_inst,
18641 saddr);
18642 }
18643 if (event_flags & SATA_EVNT_PWR_LEVEL_CHANGED) {
18644 sata_process_port_pwr_change(sata_hba_inst,
18645 saddr);
18646 }
18647 if (event_flags & SATA_EVNT_TARGET_NODE_CLEANUP) {
18648 sata_process_target_node_cleanup(
18649 sata_hba_inst, saddr);
18650 }
18651 if (event_flags & SATA_EVNT_AUTOONLINE_DEVICE) {
18652 sata_process_device_autoonline(
18653 sata_hba_inst, saddr);
18654 }
18655 }
18656
18657
18658 /*
18659 * Scan port multiplier and all its sub-ports event flags.
18660 * The events are marked by
18661 * (1) sata_pmult_info.pmult_event_flags
18662 * (2) sata_pmport_info.pmport_event_flags
18663 */
18664 mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst, ncport)));
18665 if (cportinfo->cport_dev_type == SATA_DTYPE_PMULT) {
18666 /*
18667 * There should be another extra check: this
18668 * port multiplier still exists?
18669 */
18670 pmultinfo = SATA_PMULT_INFO(sata_hba_inst,
18671 ncport);
18672
18673 if (pmultinfo != NULL) {
18674 mutex_exit(&(SATA_CPORT_MUTEX(
18675 sata_hba_inst, ncport)));
18676 sata_process_pmult_events(
18677 sata_hba_inst, ncport);
18678 mutex_enter(&(SATA_CPORT_MUTEX(
18679 sata_hba_inst, ncport)));
18680 } else {
18681 SATADBG1(SATA_DBG_PMULT, sata_hba_inst,
18682 "Port-multiplier is gone. "
18683 "Ignore all sub-device events "
18684 "at port %d.", ncport);
18685 }
18686 }
18687
18688 if ((SATA_CPORT_DEV_TYPE(sata_hba_inst, ncport) !=
18689 SATA_DTYPE_NONE) &&
18690 (SATA_CPORT_DRV_INFO(sata_hba_inst, ncport) != NULL)) {
18691 if (SATA_CPORT_DRV_INFO(sata_hba_inst, ncport)->
18692 satadrv_event_flags &
18693 (SATA_EVNT_DEVICE_RESET |
18694 SATA_EVNT_INPROC_DEVICE_RESET)) {
18695 /* Have device event */
18696 sata_process_device_reset(sata_hba_inst,
18697 saddr);
18698 }
18699 }
18700 /* Release PORT_BUSY flag */
18701 (SATA_CPORT_INFO(sata_hba_inst, ncport))->
18702 cport_event_flags &= ~SATA_EVNT_LOCK_PORT_BUSY;
18703 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst, ncport)));
18704
18705 } /* End of loop through the controller SATA ports */
18706 }
18707
18708 /*
18709 * Specific port multiplier instance event processing. At the moment, device
18710 * event processing is limited to link/attach event only.
18711 *
18712 * NOTE: power management event is not supported yet.
18713 */
18714 static void
sata_process_pmult_events(sata_hba_inst_t * sata_hba_inst,uint8_t cport)18715 sata_process_pmult_events(sata_hba_inst_t *sata_hba_inst, uint8_t cport)
18716 {
18717 sata_cport_info_t *cportinfo = SATA_CPORT_INFO(sata_hba_inst, cport);
18718 sata_pmult_info_t *pmultinfo;
18719 sata_pmport_info_t *pmportinfo;
18720 sata_address_t *saddr;
18721 sata_device_t sata_device;
18722 uint32_t event_flags;
18723 int npmport;
18724 int rval;
18725
18726 SATADBG2(SATA_DBG_EVENTS_CNTRL|SATA_DBG_PMULT, sata_hba_inst,
18727 "Processing pmult event(s) on cport %d of controller %d",
18728 cport, ddi_get_instance(SATA_DIP(sata_hba_inst)));
18729
18730 /* First process events on port multiplier */
18731 mutex_enter(&cportinfo->cport_mutex);
18732 pmultinfo = SATA_PMULT_INFO(sata_hba_inst, cport);
18733 event_flags = pmultinfo->pmult_event_flags;
18734
18735 /*
18736 * Reset event (of port multiplier) has higher priority because the
18737 * port multiplier itself might be failed or removed after reset.
18738 */
18739 if (event_flags & SATA_EVNT_DEVICE_RESET) {
18740 /*
18741 * The status of the sub-links are uncertain,
18742 * so mark all sub-ports as RESET
18743 */
18744 for (npmport = 0; npmport < SATA_NUM_PMPORTS(
18745 sata_hba_inst, cport); npmport ++) {
18746 pmportinfo = SATA_PMPORT_INFO(sata_hba_inst,
18747 cport, npmport);
18748 if (pmportinfo == NULL) {
18749 /* That's weird. */
18750 SATA_LOG_D((sata_hba_inst, CE_WARN,
18751 "sata_hba_event_notify: "
18752 "invalid/un-implemented "
18753 "port %d:%d (%d ports), ",
18754 cport, npmport, SATA_NUM_PMPORTS(
18755 sata_hba_inst, cport)));
18756 continue;
18757 }
18758
18759 mutex_enter(&pmportinfo->pmport_mutex);
18760
18761 /* Mark all pmport to unknow state. */
18762 pmportinfo->pmport_state = SATA_STATE_UNKNOWN;
18763 /* Mark all pmports with link events. */
18764 pmportinfo->pmport_event_flags =
18765 (SATA_EVNT_LINK_ESTABLISHED|SATA_EVNT_LINK_LOST);
18766 mutex_exit(&pmportinfo->pmport_mutex);
18767 }
18768
18769 } else if (event_flags & SATA_EVNT_PMULT_LINK_CHANGED) {
18770 /*
18771 * We need probe the port multiplier to know what has
18772 * happened.
18773 */
18774 bzero(&sata_device, sizeof (sata_device_t));
18775 sata_device.satadev_rev = SATA_DEVICE_REV;
18776 sata_device.satadev_addr.cport = cport;
18777 sata_device.satadev_addr.pmport = SATA_PMULT_HOSTPORT;
18778 sata_device.satadev_addr.qual = SATA_ADDR_PMULT;
18779
18780 mutex_exit(&cportinfo->cport_mutex);
18781 rval = (*SATA_PROBE_PORT_FUNC(sata_hba_inst))
18782 (SATA_DIP(sata_hba_inst), &sata_device);
18783 mutex_enter(&cportinfo->cport_mutex);
18784 if (rval != SATA_SUCCESS) {
18785 /* Something went wrong? Fail the port */
18786 cportinfo->cport_state = SATA_PSTATE_FAILED;
18787 mutex_exit(&cportinfo->cport_mutex);
18788 SATA_LOG_D((sata_hba_inst, CE_WARN,
18789 "SATA port %d probing failed", cport));
18790
18791 /* PMult structure must be released. */
18792 sata_free_pmult(sata_hba_inst, &sata_device);
18793 return;
18794 }
18795
18796 sata_update_port_info(sata_hba_inst, &sata_device);
18797
18798 /*
18799 * Sanity check - Port is active? Is the link active?
18800 * The device is still a port multiplier?
18801 */
18802 if ((cportinfo->cport_state &
18803 (SATA_PSTATE_SHUTDOWN | SATA_PSTATE_FAILED)) ||
18804 ((cportinfo->cport_scr.sstatus &
18805 SATA_PORT_DEVLINK_UP_MASK) != SATA_PORT_DEVLINK_UP) ||
18806 (cportinfo->cport_dev_type != SATA_DTYPE_PMULT)) {
18807 mutex_exit(&cportinfo->cport_mutex);
18808
18809 /* PMult structure must be released. */
18810 sata_free_pmult(sata_hba_inst, &sata_device);
18811 return;
18812 }
18813
18814 /* Probed succeed, set port ready. */
18815 cportinfo->cport_state |=
18816 SATA_STATE_PROBED | SATA_STATE_READY;
18817 }
18818
18819 /* Release port multiplier event flags. */
18820 pmultinfo->pmult_event_flags &=
18821 ~(SATA_EVNT_DEVICE_RESET|SATA_EVNT_PMULT_LINK_CHANGED);
18822 mutex_exit(&cportinfo->cport_mutex);
18823
18824 /*
18825 * Check all sub-links.
18826 */
18827 for (npmport = 0; npmport < SATA_NUM_PMPORTS(sata_hba_inst, cport);
18828 npmport ++) {
18829 pmportinfo = SATA_PMPORT_INFO(sata_hba_inst, cport, npmport);
18830 mutex_enter(&pmportinfo->pmport_mutex);
18831 event_flags = pmportinfo->pmport_event_flags;
18832 mutex_exit(&pmportinfo->pmport_mutex);
18833 saddr = &pmportinfo->pmport_addr;
18834
18835 if ((event_flags &
18836 (SATA_EVNT_PORT_EVENTS | SATA_EVNT_DRIVE_EVENTS)) != 0) {
18837 /*
18838 * Got port multiplier port event.
18839 * We need some hierarchy of event processing as they
18840 * are affecting each other:
18841 * 1. device detached/attached
18842 * 2. link events - link events may trigger device
18843 * detached or device attached events in some
18844 * circumstances.
18845 */
18846 if (event_flags & SATA_EVNT_DEVICE_DETACHED) {
18847 sata_process_pmdevice_detached(sata_hba_inst,
18848 saddr);
18849 }
18850 if (event_flags & SATA_EVNT_DEVICE_ATTACHED) {
18851 sata_process_pmdevice_attached(sata_hba_inst,
18852 saddr);
18853 }
18854 if (event_flags & SATA_EVNT_LINK_ESTABLISHED ||
18855 event_flags & SATA_EVNT_LINK_LOST) {
18856 sata_process_pmport_link_events(sata_hba_inst,
18857 saddr);
18858 }
18859 if (event_flags & SATA_EVNT_TARGET_NODE_CLEANUP) {
18860 sata_process_target_node_cleanup(
18861 sata_hba_inst, saddr);
18862 }
18863 }
18864
18865 /* Checking drive event(s). */
18866 mutex_enter(&pmportinfo->pmport_mutex);
18867 if (pmportinfo->pmport_dev_type != SATA_DTYPE_NONE &&
18868 pmportinfo->pmport_sata_drive != NULL) {
18869 event_flags = pmportinfo->pmport_sata_drive->
18870 satadrv_event_flags;
18871 if (event_flags & (SATA_EVNT_DEVICE_RESET |
18872 SATA_EVNT_INPROC_DEVICE_RESET)) {
18873
18874 /* Have device event */
18875 sata_process_pmdevice_reset(sata_hba_inst,
18876 saddr);
18877 }
18878 }
18879 mutex_exit(&pmportinfo->pmport_mutex);
18880
18881 /* Release PORT_BUSY flag */
18882 mutex_enter(&cportinfo->cport_mutex);
18883 cportinfo->cport_event_flags &= ~SATA_EVNT_LOCK_PORT_BUSY;
18884 mutex_exit(&cportinfo->cport_mutex);
18885 }
18886
18887 SATADBG2(SATA_DBG_EVENTS_CNTRL|SATA_DBG_PMULT, sata_hba_inst,
18888 "[DONE] pmult event(s) on cport %d of controller %d",
18889 cport, ddi_get_instance(SATA_DIP(sata_hba_inst)));
18890 }
18891
18892 /*
18893 * Process HBA power level change reported by HBA driver.
18894 * Not implemented at this time - event is ignored.
18895 */
18896 static void
sata_process_cntrl_pwr_level_change(sata_hba_inst_t * sata_hba_inst)18897 sata_process_cntrl_pwr_level_change(sata_hba_inst_t *sata_hba_inst)
18898 {
18899 SATADBG1(SATA_DBG_EVENTS_PROC, sata_hba_inst,
18900 "Processing controller power level change", NULL);
18901
18902 /* Ignoring it for now */
18903 mutex_enter(&sata_hba_inst->satahba_mutex);
18904 sata_hba_inst->satahba_event_flags &= ~SATA_EVNT_PWR_LEVEL_CHANGED;
18905 mutex_exit(&sata_hba_inst->satahba_mutex);
18906 }
18907
18908 /*
18909 * Process port power level change reported by HBA driver.
18910 * Not implemented at this time - event is ignored.
18911 */
18912 static void
sata_process_port_pwr_change(sata_hba_inst_t * sata_hba_inst,sata_address_t * saddr)18913 sata_process_port_pwr_change(sata_hba_inst_t *sata_hba_inst,
18914 sata_address_t *saddr)
18915 {
18916 sata_cport_info_t *cportinfo;
18917
18918 SATADBG1(SATA_DBG_EVENTS_PROC, sata_hba_inst,
18919 "Processing port power level change", NULL);
18920
18921 cportinfo = SATA_CPORT_INFO(sata_hba_inst, saddr->cport);
18922 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->cport_mutex);
18923 /* Reset event flag */
18924 cportinfo->cport_event_flags &= ~SATA_EVNT_PWR_LEVEL_CHANGED;
18925 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->cport_mutex);
18926 }
18927
18928 /*
18929 * Process port failure reported by HBA driver.
18930 * cports support only - no pmports.
18931 */
18932 static void
sata_process_port_failed_event(sata_hba_inst_t * sata_hba_inst,sata_address_t * saddr)18933 sata_process_port_failed_event(sata_hba_inst_t *sata_hba_inst,
18934 sata_address_t *saddr)
18935 {
18936 sata_cport_info_t *cportinfo;
18937
18938 cportinfo = SATA_CPORT_INFO(sata_hba_inst, saddr->cport);
18939 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->cport_mutex);
18940 /* Reset event flag first */
18941 cportinfo->cport_event_flags &= ~SATA_EVNT_PORT_FAILED;
18942 /* If the port is in SHUTDOWN or FAILED state, ignore this event. */
18943 if ((cportinfo->cport_state &
18944 (SATA_PSTATE_SHUTDOWN | SATA_PSTATE_FAILED)) == 0) {
18945 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->
18946 cport_mutex);
18947 return;
18948 }
18949 /* Fail the port */
18950 cportinfo->cport_state = SATA_PSTATE_FAILED;
18951 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->cport_mutex);
18952 sata_log(sata_hba_inst, CE_WARN, "SATA port %d failed", saddr->cport);
18953 }
18954
18955 /*
18956 * Device Reset Event processing.
18957 * The sequence is managed by 3 stage flags:
18958 * - reset event reported,
18959 * - reset event being processed,
18960 * - request to clear device reset state.
18961 *
18962 * NOTE: This function has to be entered with cport mutex held. It exits with
18963 * mutex held as well, but can release mutex during the processing.
18964 */
18965 static void
sata_process_device_reset(sata_hba_inst_t * sata_hba_inst,sata_address_t * saddr)18966 sata_process_device_reset(sata_hba_inst_t *sata_hba_inst,
18967 sata_address_t *saddr)
18968 {
18969 sata_drive_info_t old_sdinfo; /* local copy of the drive info */
18970 sata_drive_info_t *sdinfo;
18971 sata_cport_info_t *cportinfo;
18972 sata_device_t sata_device;
18973 int rval_probe, rval_set;
18974
18975 /* We only care about host sata cport for now */
18976 cportinfo = SATA_CPORT_INFO(sata_hba_inst, saddr->cport);
18977 sdinfo = SATA_CPORT_DRV_INFO(sata_hba_inst, saddr->cport);
18978 /*
18979 * If the port is in SHUTDOWN or FAILED state, or device is in FAILED
18980 * state, ignore reset event.
18981 */
18982 if (((cportinfo->cport_state &
18983 (SATA_PSTATE_SHUTDOWN | SATA_PSTATE_FAILED)) != 0) ||
18984 (sdinfo->satadrv_state & SATA_DSTATE_FAILED) != 0) {
18985 sdinfo->satadrv_event_flags &=
18986 ~(SATA_EVNT_DEVICE_RESET | SATA_EVNT_INPROC_DEVICE_RESET);
18987 return;
18988 }
18989
18990 if ((SATA_CPORT_DEV_TYPE(sata_hba_inst, saddr->cport) ==
18991 SATA_DTYPE_PMULT)) {
18992 /*
18993 * Should not happened: this is already handled in
18994 * sata_hba_event_notify()
18995 */
18996 mutex_exit(&cportinfo->cport_mutex);
18997 goto done;
18998 }
18999
19000 if ((SATA_CPORT_DEV_TYPE(sata_hba_inst, saddr->cport) &
19001 SATA_VALID_DEV_TYPE) == 0) {
19002 /*
19003 * This should not happen - coding error.
19004 * But we can recover, so do not panic, just clean up
19005 * and if in debug mode, log the message.
19006 */
19007 #ifdef SATA_DEBUG
19008 sata_log(sata_hba_inst, CE_WARN,
19009 "sata_process_device_reset: "
19010 "Invalid device type with sdinfo!", NULL);
19011 #endif
19012 sdinfo->satadrv_event_flags = 0;
19013 return;
19014 }
19015
19016 #ifdef SATA_DEBUG
19017 if ((sdinfo->satadrv_event_flags &
19018 (SATA_EVNT_DEVICE_RESET | SATA_EVNT_INPROC_DEVICE_RESET)) == 0) {
19019 /* Nothing to do */
19020 /* Something is weird - why we are processing dev reset? */
19021 SATADBG1(SATA_DBG_EVENTS_PROC, sata_hba_inst,
19022 "No device reset event!!!!", NULL);
19023
19024 return;
19025 }
19026 if ((sdinfo->satadrv_event_flags &
19027 (SATA_EVNT_DEVICE_RESET | SATA_EVNT_INPROC_DEVICE_RESET)) ==
19028 (SATA_EVNT_DEVICE_RESET | SATA_EVNT_INPROC_DEVICE_RESET)) {
19029 /* Something is weird - new device reset event */
19030 SATADBG1(SATA_DBG_EVENTS_PROC, sata_hba_inst,
19031 "Overlapping device reset events!", NULL);
19032 }
19033 #endif
19034 SATADBG1(SATA_DBG_EVENTS_PROC, sata_hba_inst,
19035 "Processing port %d device reset", saddr->cport);
19036
19037 /* Clear event flag */
19038 sdinfo->satadrv_event_flags &= ~SATA_EVNT_DEVICE_RESET;
19039
19040 /* It seems that we always need to check the port state first */
19041 sata_device.satadev_rev = SATA_DEVICE_REV;
19042 sata_device.satadev_addr = *saddr;
19043 /*
19044 * We have to exit mutex, because the HBA probe port function may
19045 * block on its own mutex.
19046 */
19047 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->cport_mutex);
19048 rval_probe = (*SATA_PROBE_PORT_FUNC(sata_hba_inst))
19049 (SATA_DIP(sata_hba_inst), &sata_device);
19050 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->cport_mutex);
19051 sata_update_port_info(sata_hba_inst, &sata_device);
19052 if (rval_probe != SATA_SUCCESS) {
19053 /* Something went wrong? Fail the port */
19054 cportinfo->cport_state = SATA_PSTATE_FAILED;
19055 sdinfo = SATA_CPORT_DRV_INFO(sata_hba_inst, saddr->cport);
19056 if (sdinfo != NULL)
19057 sdinfo->satadrv_event_flags = 0;
19058 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->
19059 cport_mutex);
19060 SATA_LOG_D((sata_hba_inst, CE_WARN,
19061 "SATA port %d probing failed",
19062 saddr->cport));
19063 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst,
19064 saddr->cport)->cport_mutex);
19065 return;
19066 }
19067 if ((sata_device.satadev_scr.sstatus &
19068 SATA_PORT_DEVLINK_UP_MASK) !=
19069 SATA_PORT_DEVLINK_UP ||
19070 sata_device.satadev_type == SATA_DTYPE_NONE) {
19071 /*
19072 * No device to process, anymore. Some other event processing
19073 * would or have already performed port info cleanup.
19074 * To be safe (HBA may need it), request clearing device
19075 * reset condition.
19076 */
19077 sdinfo = SATA_CPORT_DRV_INFO(sata_hba_inst, saddr->cport);
19078 if (sdinfo != NULL) {
19079 sdinfo->satadrv_event_flags &=
19080 ~SATA_EVNT_INPROC_DEVICE_RESET;
19081 sdinfo->satadrv_event_flags |=
19082 SATA_EVNT_CLEAR_DEVICE_RESET;
19083 }
19084 return;
19085 }
19086
19087 sdinfo = SATA_CPORT_DRV_INFO(sata_hba_inst, saddr->cport);
19088 if (sdinfo == NULL) {
19089 return;
19090 }
19091 if ((sdinfo->satadrv_event_flags &
19092 SATA_EVNT_INPROC_DEVICE_RESET) == 0) {
19093 /*
19094 * Start tracking time for device feature restoration and
19095 * identification. Save current time (lbolt value).
19096 */
19097 sdinfo->satadrv_reset_time = ddi_get_lbolt();
19098 }
19099 /* Mark device reset processing as active */
19100 sdinfo->satadrv_event_flags |= SATA_EVNT_INPROC_DEVICE_RESET;
19101
19102 old_sdinfo = *sdinfo; /* local copy of the drive info */
19103 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->cport_mutex);
19104
19105 rval_set = sata_set_drive_features(sata_hba_inst, &old_sdinfo, 1);
19106
19107 if (rval_set != SATA_SUCCESS) {
19108 /*
19109 * Restoring drive setting failed.
19110 * Probe the port first, to check if the port state has changed
19111 */
19112 sata_device.satadev_rev = SATA_DEVICE_REV;
19113 sata_device.satadev_addr = *saddr;
19114 sata_device.satadev_addr.qual = SATA_ADDR_CPORT;
19115 /* probe port */
19116 rval_probe = (*SATA_PROBE_PORT_FUNC(sata_hba_inst))
19117 (SATA_DIP(sata_hba_inst), &sata_device);
19118 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->
19119 cport_mutex);
19120 if (rval_probe == SATA_SUCCESS &&
19121 (sata_device.satadev_state &
19122 (SATA_PSTATE_SHUTDOWN | SATA_PSTATE_FAILED)) == 0 &&
19123 (sata_device.satadev_scr.sstatus &
19124 SATA_PORT_DEVLINK_UP_MASK) == SATA_PORT_DEVLINK_UP &&
19125 sata_device.satadev_type != SATA_DTYPE_NONE) {
19126 /*
19127 * We may retry this a bit later - in-process reset
19128 * condition should be already set.
19129 * Track retry time for device identification.
19130 */
19131 if ((cportinfo->cport_dev_type &
19132 SATA_VALID_DEV_TYPE) != 0 &&
19133 SATA_CPORTINFO_DRV_INFO(cportinfo) != NULL &&
19134 sdinfo->satadrv_reset_time != 0) {
19135 clock_t cur_time = ddi_get_lbolt();
19136 /*
19137 * If the retry time limit was not
19138 * exceeded, retry.
19139 */
19140 if ((cur_time - sdinfo->satadrv_reset_time) <
19141 drv_usectohz(SATA_DEV_REPROBE_TIMEOUT)) {
19142 mutex_enter(
19143 &sata_hba_inst->satahba_mutex);
19144 sata_hba_inst->satahba_event_flags |=
19145 SATA_EVNT_MAIN;
19146 mutex_exit(
19147 &sata_hba_inst->satahba_mutex);
19148 mutex_enter(&sata_mutex);
19149 sata_event_pending |= SATA_EVNT_MAIN;
19150 mutex_exit(&sata_mutex);
19151 return;
19152 }
19153 if (rval_set == SATA_RETRY) {
19154 /*
19155 * Setting drive features failed, but
19156 * the drive is still accessible,
19157 * so emit a warning message before
19158 * return.
19159 */
19160 mutex_exit(&SATA_CPORT_INFO(
19161 sata_hba_inst,
19162 saddr->cport)->cport_mutex);
19163 goto done;
19164 }
19165 }
19166 /* Fail the drive */
19167 sdinfo->satadrv_state = SATA_DSTATE_FAILED;
19168
19169 sata_log(sata_hba_inst, CE_WARN,
19170 "SATA device at port %d - device failed",
19171 saddr->cport);
19172
19173 DTRACE_PROBE(port_failed_f);
19174 }
19175 /*
19176 * No point of retrying - device failed or some other event
19177 * processing or already did or will do port info cleanup.
19178 * To be safe (HBA may need it),
19179 * request clearing device reset condition.
19180 */
19181 sdinfo->satadrv_event_flags |= SATA_EVNT_CLEAR_DEVICE_RESET;
19182 sdinfo->satadrv_event_flags &= ~SATA_EVNT_INPROC_DEVICE_RESET;
19183 sdinfo->satadrv_reset_time = 0;
19184 return;
19185 }
19186 done:
19187 /*
19188 * If setting of drive features failed, but the drive is still
19189 * accessible, emit a warning message.
19190 */
19191 if (rval_set == SATA_RETRY) {
19192 sata_log(sata_hba_inst, CE_WARN,
19193 "SATA device at port %d - desired setting could not be "
19194 "restored after reset. Device may not operate as expected.",
19195 saddr->cport);
19196 }
19197 /*
19198 * Raise the flag indicating that the next sata command could
19199 * be sent with SATA_CLEAR_DEV_RESET_STATE flag, if no new device
19200 * reset is reported.
19201 */
19202 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->cport_mutex);
19203 if (SATA_CPORTINFO_DRV_INFO(cportinfo) != NULL) {
19204 sdinfo->satadrv_reset_time = 0;
19205 if ((cportinfo->cport_dev_type & SATA_VALID_DEV_TYPE) != 0) {
19206 sdinfo = SATA_CPORTINFO_DRV_INFO(cportinfo);
19207 sdinfo->satadrv_event_flags &=
19208 ~SATA_EVNT_INPROC_DEVICE_RESET;
19209 sdinfo->satadrv_event_flags |=
19210 SATA_EVNT_CLEAR_DEVICE_RESET;
19211 }
19212 }
19213 }
19214
19215
19216 /*
19217 * Port Multiplier Port Device Reset Event processing.
19218 *
19219 * NOTE: This function has to be entered with pmport mutex held. It exits with
19220 * mutex held as well, but can release mutex during the processing.
19221 */
19222 static void
sata_process_pmdevice_reset(sata_hba_inst_t * sata_hba_inst,sata_address_t * saddr)19223 sata_process_pmdevice_reset(sata_hba_inst_t *sata_hba_inst,
19224 sata_address_t *saddr)
19225 {
19226 sata_drive_info_t old_sdinfo; /* local copy of the drive info */
19227 sata_drive_info_t *sdinfo = NULL;
19228 sata_cport_info_t *cportinfo = NULL;
19229 sata_pmport_info_t *pmportinfo = NULL;
19230 sata_pmult_info_t *pminfo = NULL;
19231 sata_device_t sata_device;
19232 uint8_t cport = saddr->cport;
19233 uint8_t pmport = saddr->pmport;
19234 int rval;
19235
19236 SATADBG2(SATA_DBG_EVENTS_PROC, sata_hba_inst,
19237 "Processing drive reset at port %d:%d", cport, pmport);
19238
19239 cportinfo = SATA_CPORT_INFO(sata_hba_inst, cport);
19240 pmportinfo = SATA_PMPORT_INFO(sata_hba_inst, cport, pmport);
19241 sdinfo = SATA_PMPORT_DRV_INFO(sata_hba_inst, cport, pmport);
19242
19243 /*
19244 * If the port is in SHUTDOWN or FAILED state, or device is in FAILED
19245 * state, ignore reset event.
19246 */
19247 if (((cportinfo->cport_state &
19248 (SATA_PSTATE_SHUTDOWN | SATA_PSTATE_FAILED)) != 0) ||
19249 (sdinfo->satadrv_state & SATA_DSTATE_FAILED) != 0) {
19250 sdinfo->satadrv_event_flags &=
19251 ~(SATA_EVNT_DEVICE_RESET | SATA_EVNT_INPROC_DEVICE_RESET);
19252 return;
19253 }
19254
19255 if ((pmportinfo->pmport_dev_type & SATA_VALID_DEV_TYPE) == 0) {
19256 /*
19257 * This should not happen - coding error.
19258 * But we can recover, so do not panic, just clean up
19259 * and if in debug mode, log the message.
19260 */
19261 #ifdef SATA_DEBUG
19262 sata_log(sata_hba_inst, CE_WARN,
19263 "sata_process_pmdevice_reset: "
19264 "Invalid device type with sdinfo!", NULL);
19265 #endif
19266 sdinfo->satadrv_event_flags = 0;
19267 return;
19268 }
19269
19270 #ifdef SATA_DEBUG
19271 if ((sdinfo->satadrv_event_flags &
19272 (SATA_EVNT_DEVICE_RESET | SATA_EVNT_INPROC_DEVICE_RESET)) == 0) {
19273 /* Nothing to do */
19274 /* Something is weird - why we are processing dev reset? */
19275 SATADBG1(SATA_DBG_EVENTS_PROC, sata_hba_inst,
19276 "No device reset event!!!!", NULL);
19277
19278 return;
19279 }
19280 if ((sdinfo->satadrv_event_flags &
19281 (SATA_EVNT_DEVICE_RESET | SATA_EVNT_INPROC_DEVICE_RESET)) ==
19282 (SATA_EVNT_DEVICE_RESET | SATA_EVNT_INPROC_DEVICE_RESET)) {
19283 /* Something is weird - new device reset event */
19284 SATADBG1(SATA_DBG_EVENTS_PROC, sata_hba_inst,
19285 "Overlapping device reset events!", NULL);
19286 }
19287 #endif
19288 SATADBG2(SATA_DBG_EVENTS_PROC, sata_hba_inst,
19289 "Processing port %d:%d device reset", cport, pmport);
19290
19291 /* Clear event flag */
19292 sdinfo->satadrv_event_flags &= ~SATA_EVNT_DEVICE_RESET;
19293
19294 /* It seems that we always need to check the port state first */
19295 sata_device.satadev_rev = SATA_DEVICE_REV;
19296 sata_device.satadev_addr = *saddr;
19297 /*
19298 * We have to exit mutex, because the HBA probe port function may
19299 * block on its own mutex.
19300 */
19301 mutex_exit(&pmportinfo->pmport_mutex);
19302 rval = (*SATA_PROBE_PORT_FUNC(sata_hba_inst))
19303 (SATA_DIP(sata_hba_inst), &sata_device);
19304 mutex_enter(&pmportinfo->pmport_mutex);
19305
19306 sata_update_pmport_info(sata_hba_inst, &sata_device);
19307 if (rval != SATA_SUCCESS) {
19308 /* Something went wrong? Fail the port */
19309 pmportinfo->pmport_state = SATA_PSTATE_FAILED;
19310 sdinfo = SATA_PMPORT_DRV_INFO(sata_hba_inst, saddr->cport,
19311 saddr->pmport);
19312 if (sdinfo != NULL)
19313 sdinfo->satadrv_event_flags = 0;
19314 mutex_exit(&pmportinfo->pmport_mutex);
19315 SATA_LOG_D((sata_hba_inst, CE_WARN,
19316 "SATA port %d:%d probing failed",
19317 saddr->cport, saddr->pmport));
19318 mutex_enter(&pmportinfo->pmport_mutex);
19319 return;
19320 }
19321 if ((sata_device.satadev_scr.sstatus &
19322 SATA_PORT_DEVLINK_UP_MASK) !=
19323 SATA_PORT_DEVLINK_UP ||
19324 sata_device.satadev_type == SATA_DTYPE_NONE) {
19325 /*
19326 * No device to process, anymore. Some other event processing
19327 * would or have already performed port info cleanup.
19328 * To be safe (HBA may need it), request clearing device
19329 * reset condition.
19330 */
19331 sdinfo = SATA_PMPORT_DRV_INFO(sata_hba_inst, saddr->cport,
19332 saddr->pmport);
19333 if (sdinfo != NULL) {
19334 sdinfo->satadrv_event_flags &=
19335 ~SATA_EVNT_INPROC_DEVICE_RESET;
19336 /* must clear flags on cport */
19337 pminfo = SATA_PMULT_INFO(sata_hba_inst,
19338 saddr->cport);
19339 pminfo->pmult_event_flags |=
19340 SATA_EVNT_CLEAR_DEVICE_RESET;
19341 }
19342 return;
19343 }
19344
19345 sdinfo = SATA_PMPORT_DRV_INFO(sata_hba_inst, saddr->cport,
19346 saddr->pmport);
19347 if (sdinfo == NULL) {
19348 return;
19349 }
19350 if ((sdinfo->satadrv_event_flags &
19351 SATA_EVNT_INPROC_DEVICE_RESET) == 0) {
19352 /*
19353 * Start tracking time for device feature restoration and
19354 * identification. Save current time (lbolt value).
19355 */
19356 sdinfo->satadrv_reset_time = ddi_get_lbolt();
19357 }
19358 /* Mark device reset processing as active */
19359 sdinfo->satadrv_event_flags |= SATA_EVNT_INPROC_DEVICE_RESET;
19360
19361 old_sdinfo = *sdinfo; /* local copy of the drive info */
19362 mutex_exit(&pmportinfo->pmport_mutex);
19363
19364 if (sata_set_drive_features(sata_hba_inst, &old_sdinfo, 1) ==
19365 SATA_FAILURE) {
19366 /*
19367 * Restoring drive setting failed.
19368 * Probe the port first, to check if the port state has changed
19369 */
19370 sata_device.satadev_rev = SATA_DEVICE_REV;
19371 sata_device.satadev_addr = *saddr;
19372 sata_device.satadev_addr.qual = SATA_ADDR_PMPORT;
19373
19374 /* probe port */
19375 rval = (*SATA_PROBE_PORT_FUNC(sata_hba_inst))
19376 (SATA_DIP(sata_hba_inst), &sata_device);
19377 mutex_enter(&pmportinfo->pmport_mutex);
19378 if (rval == SATA_SUCCESS &&
19379 (sata_device.satadev_state &
19380 (SATA_PSTATE_SHUTDOWN | SATA_PSTATE_FAILED)) == 0 &&
19381 (sata_device.satadev_scr.sstatus &
19382 SATA_PORT_DEVLINK_UP_MASK) == SATA_PORT_DEVLINK_UP &&
19383 sata_device.satadev_type != SATA_DTYPE_NONE) {
19384 /*
19385 * We may retry this a bit later - in-process reset
19386 * condition should be already set.
19387 * Track retry time for device identification.
19388 */
19389 if ((pmportinfo->pmport_dev_type &
19390 SATA_VALID_DEV_TYPE) != 0 &&
19391 SATA_PMPORTINFO_DRV_INFO(pmportinfo) != NULL &&
19392 sdinfo->satadrv_reset_time != 0) {
19393 clock_t cur_time = ddi_get_lbolt();
19394 /*
19395 * If the retry time limit was not
19396 * exceeded, retry.
19397 */
19398 if ((cur_time - sdinfo->satadrv_reset_time) <
19399 drv_usectohz(SATA_DEV_REPROBE_TIMEOUT)) {
19400 mutex_enter(
19401 &sata_hba_inst->satahba_mutex);
19402 sata_hba_inst->satahba_event_flags |=
19403 SATA_EVNT_MAIN;
19404 mutex_exit(
19405 &sata_hba_inst->satahba_mutex);
19406 mutex_enter(&sata_mutex);
19407 sata_event_pending |= SATA_EVNT_MAIN;
19408 mutex_exit(&sata_mutex);
19409 return;
19410 }
19411 }
19412 /* Fail the drive */
19413 sdinfo->satadrv_state = SATA_DSTATE_FAILED;
19414
19415 sata_log(sata_hba_inst, CE_WARN,
19416 "SATA device at port %d:%d - device failed",
19417 saddr->cport, saddr->pmport);
19418 } else {
19419 /*
19420 * No point of retrying - some other event processing
19421 * would or already did port info cleanup.
19422 * To be safe (HBA may need it),
19423 * request clearing device reset condition.
19424 */
19425 sdinfo->satadrv_event_flags |=
19426 SATA_EVNT_CLEAR_DEVICE_RESET;
19427 }
19428 sdinfo->satadrv_event_flags &= ~SATA_EVNT_INPROC_DEVICE_RESET;
19429 sdinfo->satadrv_reset_time = 0;
19430 return;
19431 }
19432 /*
19433 * Raise the flag indicating that the next sata command could
19434 * be sent with SATA_CLEAR_DEV_RESET_STATE flag, if no new device
19435 * reset is reported.
19436 */
19437 mutex_enter(&pmportinfo->pmport_mutex);
19438 if (SATA_PMPORTINFO_DRV_INFO(pmportinfo) != NULL) {
19439 sdinfo->satadrv_reset_time = 0;
19440 if (pmportinfo->pmport_dev_type & SATA_VALID_DEV_TYPE) {
19441 sdinfo = SATA_PMPORTINFO_DRV_INFO(pmportinfo);
19442 sdinfo->satadrv_event_flags &=
19443 ~SATA_EVNT_INPROC_DEVICE_RESET;
19444 /* must clear flags on cport */
19445 pminfo = SATA_PMULT_INFO(sata_hba_inst,
19446 saddr->cport);
19447 pminfo->pmult_event_flags |=
19448 SATA_EVNT_CLEAR_DEVICE_RESET;
19449 }
19450 }
19451 }
19452
19453 /*
19454 * Port Link Events processing.
19455 * Every link established event may involve device reset (due to
19456 * COMRESET signal, equivalent of the hard reset) so arbitrarily
19457 * set device reset event for an attached device (if any).
19458 * If the port is in SHUTDOWN or FAILED state, ignore link events.
19459 *
19460 * The link established event processing varies, depending on the state
19461 * of the target node, HBA hotplugging capabilities, state of the port.
19462 * If the link is not active, the link established event is ignored.
19463 * If HBA cannot detect device attachment and there is no target node,
19464 * the link established event triggers device attach event processing.
19465 * Else, link established event triggers device reset event processing.
19466 *
19467 * The link lost event processing varies, depending on a HBA hotplugging
19468 * capability and the state of the port (link active or not active).
19469 * If the link is active, the lost link event is ignored.
19470 * If HBA cannot detect device removal, the lost link event triggers
19471 * device detached event processing after link lost timeout.
19472 * Else, the event is ignored.
19473 *
19474 * NOTE: Port multiplier ports events are handled by
19475 * sata_process_pmport_link_events();
19476 */
19477 static void
sata_process_port_link_events(sata_hba_inst_t * sata_hba_inst,sata_address_t * saddr)19478 sata_process_port_link_events(sata_hba_inst_t *sata_hba_inst,
19479 sata_address_t *saddr)
19480 {
19481 sata_device_t sata_device;
19482 sata_cport_info_t *cportinfo;
19483 sata_drive_info_t *sdinfo;
19484 uint32_t event_flags;
19485 int rval;
19486
19487 SATADBG1(SATA_DBG_EVENTS_PROC, sata_hba_inst,
19488 "Processing port %d link event(s)", saddr->cport);
19489
19490 cportinfo = SATA_CPORT_INFO(sata_hba_inst, saddr->cport);
19491 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->cport_mutex);
19492 event_flags = cportinfo->cport_event_flags;
19493
19494 /* Reset event flags first */
19495 cportinfo->cport_event_flags &=
19496 ~(SATA_EVNT_LINK_ESTABLISHED | SATA_EVNT_LINK_LOST);
19497
19498 /* If the port is in SHUTDOWN or FAILED state, ignore link events. */
19499 if ((cportinfo->cport_state &
19500 (SATA_PSTATE_SHUTDOWN | SATA_PSTATE_FAILED)) != 0) {
19501 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->
19502 cport_mutex);
19503 return;
19504 }
19505
19506 /*
19507 * For the sanity sake get current port state.
19508 * Set device address only. Other sata_device fields should be
19509 * set by HBA driver.
19510 */
19511 sata_device.satadev_rev = SATA_DEVICE_REV;
19512 sata_device.satadev_addr = *saddr;
19513 /*
19514 * We have to exit mutex, because the HBA probe port function may
19515 * block on its own mutex.
19516 */
19517 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->cport_mutex);
19518 rval = (*SATA_PROBE_PORT_FUNC(sata_hba_inst))
19519 (SATA_DIP(sata_hba_inst), &sata_device);
19520 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->cport_mutex);
19521 sata_update_port_info(sata_hba_inst, &sata_device);
19522 if (rval != SATA_SUCCESS) {
19523 /* Something went wrong? Fail the port */
19524 cportinfo->cport_state = SATA_PSTATE_FAILED;
19525 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->
19526 cport_mutex);
19527 SATA_LOG_D((sata_hba_inst, CE_WARN,
19528 "SATA port %d probing failed",
19529 saddr->cport));
19530 /*
19531 * We may want to release device info structure, but
19532 * it is not necessary.
19533 */
19534 return;
19535 } else {
19536 /* port probed successfully */
19537 cportinfo->cport_state |= SATA_STATE_PROBED | SATA_STATE_READY;
19538 }
19539 if (event_flags & SATA_EVNT_LINK_ESTABLISHED) {
19540
19541 if ((sata_device.satadev_scr.sstatus &
19542 SATA_PORT_DEVLINK_UP_MASK) != SATA_PORT_DEVLINK_UP) {
19543 /* Ignore event */
19544 SATADBG1(SATA_DBG_EVENTS_PROC, sata_hba_inst,
19545 "Ignoring port %d link established event - "
19546 "link down",
19547 saddr->cport);
19548 goto linklost;
19549 }
19550
19551 SATADBG1(SATA_DBG_EVENTS_PROC, sata_hba_inst,
19552 "Processing port %d link established event",
19553 saddr->cport);
19554
19555 /*
19556 * For the sanity sake check if a device is attached - check
19557 * return state of a port probing.
19558 */
19559 if (sata_device.satadev_type != SATA_DTYPE_NONE) {
19560 /*
19561 * HBA port probe indicated that there is a device
19562 * attached. Check if the framework had device info
19563 * structure attached for this device.
19564 */
19565 if (cportinfo->cport_dev_type != SATA_DTYPE_NONE) {
19566 ASSERT(SATA_CPORTINFO_DRV_INFO(cportinfo) !=
19567 NULL);
19568
19569 sdinfo = SATA_CPORTINFO_DRV_INFO(cportinfo);
19570 if ((sdinfo->satadrv_type &
19571 SATA_VALID_DEV_TYPE) != 0) {
19572 /*
19573 * Dev info structure is present.
19574 * If dev_type is set to known type in
19575 * the framework's drive info struct
19576 * then the device existed before and
19577 * the link was probably lost
19578 * momentarily - in such case
19579 * we may want to check device
19580 * identity.
19581 * Identity check is not supported now.
19582 *
19583 * Link established event
19584 * triggers device reset event.
19585 */
19586 (SATA_CPORTINFO_DRV_INFO(cportinfo))->
19587 satadrv_event_flags |=
19588 SATA_EVNT_DEVICE_RESET;
19589 }
19590 } else if (cportinfo->cport_dev_type ==
19591 SATA_DTYPE_NONE) {
19592 /*
19593 * We got new device attached! If HBA does not
19594 * generate device attached events, trigger it
19595 * here.
19596 */
19597 if (!(SATA_FEATURES(sata_hba_inst) &
19598 SATA_CTLF_HOTPLUG)) {
19599 cportinfo->cport_event_flags |=
19600 SATA_EVNT_DEVICE_ATTACHED;
19601 }
19602 }
19603 /* Reset link lost timeout */
19604 cportinfo->cport_link_lost_time = 0;
19605 }
19606 }
19607 linklost:
19608 if (event_flags & SATA_EVNT_LINK_LOST) {
19609 if ((sata_device.satadev_scr.sstatus &
19610 SATA_PORT_DEVLINK_UP_MASK) == SATA_PORT_DEVLINK_UP) {
19611 /* Ignore event */
19612 SATADBG1(SATA_DBG_EVENTS_PROC, sata_hba_inst,
19613 "Ignoring port %d link lost event - link is up",
19614 saddr->cport);
19615 goto done;
19616 }
19617 #ifdef SATA_DEBUG
19618 if (cportinfo->cport_link_lost_time == 0) {
19619 SATADBG1(SATA_DBG_EVENTS_PROC, sata_hba_inst,
19620 "Processing port %d link lost event",
19621 saddr->cport);
19622 }
19623 #endif
19624 /*
19625 * When HBA cannot generate device attached/detached events,
19626 * we need to track link lost time and eventually generate
19627 * device detach event.
19628 */
19629 if (!(SATA_FEATURES(sata_hba_inst) & SATA_CTLF_HOTPLUG)) {
19630 /* We are tracking link lost time */
19631 if (cportinfo->cport_link_lost_time == 0) {
19632 /* save current time (lbolt value) */
19633 cportinfo->cport_link_lost_time =
19634 ddi_get_lbolt();
19635 /* just keep link lost event */
19636 cportinfo->cport_event_flags |=
19637 SATA_EVNT_LINK_LOST;
19638 } else {
19639 clock_t cur_time = ddi_get_lbolt();
19640 if ((cur_time -
19641 cportinfo->cport_link_lost_time) >=
19642 drv_usectohz(
19643 SATA_EVNT_LINK_LOST_TIMEOUT)) {
19644 /* trigger device detach event */
19645 cportinfo->cport_event_flags |=
19646 SATA_EVNT_DEVICE_DETACHED;
19647 cportinfo->cport_link_lost_time = 0;
19648 SATADBG1(SATA_DBG_EVENTS,
19649 sata_hba_inst,
19650 "Triggering port %d "
19651 "device detached event",
19652 saddr->cport);
19653 } else {
19654 /* keep link lost event */
19655 cportinfo->cport_event_flags |=
19656 SATA_EVNT_LINK_LOST;
19657 }
19658 }
19659 }
19660 /*
19661 * We could change port state to disable/delay access to
19662 * the attached device until the link is recovered.
19663 */
19664 }
19665 done:
19666 event_flags = cportinfo->cport_event_flags;
19667 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->cport_mutex);
19668 if (event_flags != 0) {
19669 mutex_enter(&sata_hba_inst->satahba_mutex);
19670 sata_hba_inst->satahba_event_flags |= SATA_EVNT_MAIN;
19671 mutex_exit(&sata_hba_inst->satahba_mutex);
19672 mutex_enter(&sata_mutex);
19673 sata_event_pending |= SATA_EVNT_MAIN;
19674 mutex_exit(&sata_mutex);
19675 }
19676 }
19677
19678 /*
19679 * Port Multiplier Port Link Events processing.
19680 */
19681 static void
sata_process_pmport_link_events(sata_hba_inst_t * sata_hba_inst,sata_address_t * saddr)19682 sata_process_pmport_link_events(sata_hba_inst_t *sata_hba_inst,
19683 sata_address_t *saddr)
19684 {
19685 sata_device_t sata_device;
19686 sata_pmport_info_t *pmportinfo = NULL;
19687 sata_drive_info_t *sdinfo = NULL;
19688 uint32_t event_flags;
19689 uint8_t cport = saddr->cport;
19690 uint8_t pmport = saddr->pmport;
19691 int rval;
19692
19693 SATADBG2(SATA_DBG_EVENTS_PROC, sata_hba_inst,
19694 "Processing port %d:%d link event(s)",
19695 cport, pmport);
19696
19697 pmportinfo = SATA_PMPORT_INFO(sata_hba_inst, cport, pmport);
19698 mutex_enter(&pmportinfo->pmport_mutex);
19699 event_flags = pmportinfo->pmport_event_flags;
19700
19701 /* Reset event flags first */
19702 pmportinfo->pmport_event_flags &=
19703 ~(SATA_EVNT_LINK_ESTABLISHED | SATA_EVNT_LINK_LOST);
19704
19705 /* If the port is in SHUTDOWN or FAILED state, ignore link events. */
19706 if ((pmportinfo->pmport_state &
19707 (SATA_PSTATE_SHUTDOWN | SATA_PSTATE_FAILED)) != 0) {
19708 mutex_exit(&pmportinfo->pmport_mutex);
19709 return;
19710 }
19711
19712 /*
19713 * For the sanity sake get current port state.
19714 * Set device address only. Other sata_device fields should be
19715 * set by HBA driver.
19716 */
19717 sata_device.satadev_rev = SATA_DEVICE_REV;
19718 sata_device.satadev_addr = *saddr;
19719 /*
19720 * We have to exit mutex, because the HBA probe port function may
19721 * block on its own mutex.
19722 */
19723 mutex_exit(&SATA_PMPORT_MUTEX(sata_hba_inst, saddr->cport,
19724 saddr->pmport));
19725 rval = (*SATA_PROBE_PORT_FUNC(sata_hba_inst))
19726 (SATA_DIP(sata_hba_inst), &sata_device);
19727 mutex_enter(&SATA_PMPORT_MUTEX(sata_hba_inst, saddr->cport,
19728 saddr->pmport));
19729 sata_update_pmport_info(sata_hba_inst, &sata_device);
19730 if (rval != SATA_SUCCESS) {
19731 /* Something went wrong? Fail the port */
19732 pmportinfo->pmport_state = SATA_PSTATE_FAILED;
19733 mutex_exit(&SATA_PMPORT_MUTEX(sata_hba_inst, saddr->cport,
19734 saddr->pmport));
19735 SATA_LOG_D((sata_hba_inst, CE_WARN,
19736 "SATA port %d:%d probing failed",
19737 saddr->cport, saddr->pmport));
19738 /*
19739 * We may want to release device info structure, but
19740 * it is not necessary.
19741 */
19742 return;
19743 } else {
19744 /* port probed successfully */
19745 pmportinfo->pmport_state |=
19746 SATA_STATE_PROBED | SATA_STATE_READY;
19747 }
19748 mutex_exit(&SATA_PMPORT_MUTEX(sata_hba_inst,
19749 saddr->cport, saddr->pmport));
19750 mutex_enter(&SATA_PMPORT_MUTEX(sata_hba_inst,
19751 saddr->cport, saddr->pmport));
19752 if (event_flags & SATA_EVNT_LINK_ESTABLISHED) {
19753
19754 if ((sata_device.satadev_scr.sstatus &
19755 SATA_PORT_DEVLINK_UP_MASK) != SATA_PORT_DEVLINK_UP) {
19756 /* Ignore event */
19757 SATADBG2(SATA_DBG_EVENTS_PROC, sata_hba_inst,
19758 "Ignoring port %d:%d link established event - "
19759 "link down",
19760 saddr->cport, saddr->pmport);
19761 goto linklost;
19762 }
19763
19764 SATADBG2(SATA_DBG_EVENTS_PROC, sata_hba_inst,
19765 "Processing port %d:%d link established event",
19766 cport, pmport);
19767
19768 /*
19769 * For the sanity sake check if a device is attached - check
19770 * return state of a port probing.
19771 */
19772 if (sata_device.satadev_type != SATA_DTYPE_NONE &&
19773 sata_device.satadev_type != SATA_DTYPE_PMULT) {
19774 /*
19775 * HBA port probe indicated that there is a device
19776 * attached. Check if the framework had device info
19777 * structure attached for this device.
19778 */
19779 if (pmportinfo->pmport_dev_type != SATA_DTYPE_NONE) {
19780 ASSERT(SATA_PMPORTINFO_DRV_INFO(pmportinfo) !=
19781 NULL);
19782
19783 sdinfo = SATA_PMPORTINFO_DRV_INFO(pmportinfo);
19784 if ((sdinfo->satadrv_type &
19785 SATA_VALID_DEV_TYPE) != 0) {
19786 /*
19787 * Dev info structure is present.
19788 * If dev_type is set to known type in
19789 * the framework's drive info struct
19790 * then the device existed before and
19791 * the link was probably lost
19792 * momentarily - in such case
19793 * we may want to check device
19794 * identity.
19795 * Identity check is not supported now.
19796 *
19797 * Link established event
19798 * triggers device reset event.
19799 */
19800 (SATA_PMPORTINFO_DRV_INFO(pmportinfo))->
19801 satadrv_event_flags |=
19802 SATA_EVNT_DEVICE_RESET;
19803 }
19804 } else if (pmportinfo->pmport_dev_type ==
19805 SATA_DTYPE_NONE) {
19806 /*
19807 * We got new device attached! If HBA does not
19808 * generate device attached events, trigger it
19809 * here.
19810 */
19811 if (!(SATA_FEATURES(sata_hba_inst) &
19812 SATA_CTLF_HOTPLUG)) {
19813 pmportinfo->pmport_event_flags |=
19814 SATA_EVNT_DEVICE_ATTACHED;
19815 }
19816 }
19817 /* Reset link lost timeout */
19818 pmportinfo->pmport_link_lost_time = 0;
19819 }
19820 }
19821 linklost:
19822 if (event_flags & SATA_EVNT_LINK_LOST) {
19823 #ifdef SATA_DEBUG
19824 if (pmportinfo->pmport_link_lost_time == 0) {
19825 SATADBG2(SATA_DBG_EVENTS_PROC, sata_hba_inst,
19826 "Processing port %d:%d link lost event",
19827 saddr->cport, saddr->pmport);
19828 }
19829 #endif
19830 if ((sata_device.satadev_scr.sstatus &
19831 SATA_PORT_DEVLINK_UP_MASK) == SATA_PORT_DEVLINK_UP) {
19832 /* Ignore event */
19833 SATADBG2(SATA_DBG_EVENTS_PROC, sata_hba_inst,
19834 "Ignoring port %d:%d link lost event - link is up",
19835 saddr->cport, saddr->pmport);
19836 goto done;
19837 }
19838 /*
19839 * When HBA cannot generate device attached/detached events,
19840 * we need to track link lost time and eventually generate
19841 * device detach event.
19842 */
19843 if (!(SATA_FEATURES(sata_hba_inst) & SATA_CTLF_HOTPLUG)) {
19844 /* We are tracking link lost time */
19845 if (pmportinfo->pmport_link_lost_time == 0) {
19846 /* save current time (lbolt value) */
19847 pmportinfo->pmport_link_lost_time =
19848 ddi_get_lbolt();
19849 /* just keep link lost event */
19850 pmportinfo->pmport_event_flags |=
19851 SATA_EVNT_LINK_LOST;
19852 } else {
19853 clock_t cur_time = ddi_get_lbolt();
19854 if ((cur_time -
19855 pmportinfo->pmport_link_lost_time) >=
19856 drv_usectohz(
19857 SATA_EVNT_LINK_LOST_TIMEOUT)) {
19858 /* trigger device detach event */
19859 pmportinfo->pmport_event_flags |=
19860 SATA_EVNT_DEVICE_DETACHED;
19861 pmportinfo->pmport_link_lost_time = 0;
19862 SATADBG2(SATA_DBG_EVENTS,
19863 sata_hba_inst,
19864 "Triggering port %d:%d "
19865 "device detached event",
19866 saddr->cport, saddr->pmport);
19867 } else {
19868 /* keep link lost event */
19869 pmportinfo->pmport_event_flags |=
19870 SATA_EVNT_LINK_LOST;
19871 }
19872 }
19873 }
19874 /*
19875 * We could change port state to disable/delay access to
19876 * the attached device until the link is recovered.
19877 */
19878 }
19879 done:
19880 event_flags = pmportinfo->pmport_event_flags;
19881 mutex_exit(&SATA_PMPORT_MUTEX(sata_hba_inst, saddr->cport,
19882 saddr->pmport));
19883 if (event_flags != 0) {
19884 mutex_enter(&sata_hba_inst->satahba_mutex);
19885 sata_hba_inst->satahba_event_flags |= SATA_EVNT_MAIN;
19886 mutex_exit(&sata_hba_inst->satahba_mutex);
19887 mutex_enter(&sata_mutex);
19888 sata_event_pending |= SATA_EVNT_MAIN;
19889 mutex_exit(&sata_mutex);
19890 }
19891 }
19892
19893 /*
19894 * Device Detached Event processing.
19895 * Port is probed to find if a device is really gone. If so,
19896 * the device info structure is detached from the SATA port info structure
19897 * and released.
19898 * Port status is updated.
19899 *
19900 * NOTE: Port multiplier ports events are handled by
19901 * sata_process_pmdevice_detached()
19902 */
19903 static void
sata_process_device_detached(sata_hba_inst_t * sata_hba_inst,sata_address_t * saddr)19904 sata_process_device_detached(sata_hba_inst_t *sata_hba_inst,
19905 sata_address_t *saddr)
19906 {
19907 sata_cport_info_t *cportinfo;
19908 sata_pmport_info_t *pmportinfo;
19909 sata_drive_info_t *sdevinfo;
19910 sata_device_t sata_device;
19911 sata_address_t pmport_addr;
19912 char name[16];
19913 uint8_t cport = saddr->cport;
19914 int npmport;
19915 int rval;
19916
19917 SATADBG1(SATA_DBG_EVENTS_PROC, sata_hba_inst,
19918 "Processing port %d device detached", saddr->cport);
19919
19920 cportinfo = SATA_CPORT_INFO(sata_hba_inst, saddr->cport);
19921 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->cport_mutex);
19922 /* Clear event flag */
19923 cportinfo->cport_event_flags &= ~SATA_EVNT_DEVICE_DETACHED;
19924
19925 /* If the port is in SHUTDOWN or FAILED state, ignore detach event. */
19926 if ((cportinfo->cport_state &
19927 (SATA_PSTATE_SHUTDOWN | SATA_PSTATE_FAILED)) != 0) {
19928 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->
19929 cport_mutex);
19930 return;
19931 }
19932 /* For sanity, re-probe the port */
19933 sata_device.satadev_rev = SATA_DEVICE_REV;
19934 sata_device.satadev_addr = *saddr;
19935
19936 /*
19937 * We have to exit mutex, because the HBA probe port function may
19938 * block on its own mutex.
19939 */
19940 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->cport_mutex);
19941 rval = (*SATA_PROBE_PORT_FUNC(sata_hba_inst))
19942 (SATA_DIP(sata_hba_inst), &sata_device);
19943 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->cport_mutex);
19944 sata_update_port_info(sata_hba_inst, &sata_device);
19945 if (rval != SATA_SUCCESS) {
19946 /* Something went wrong? Fail the port */
19947 cportinfo->cport_state = SATA_PSTATE_FAILED;
19948 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->
19949 cport_mutex);
19950 SATA_LOG_D((sata_hba_inst, CE_WARN,
19951 "SATA port %d probing failed",
19952 saddr->cport));
19953 /*
19954 * We may want to release device info structure, but
19955 * it is not necessary.
19956 */
19957 return;
19958 } else {
19959 /* port probed successfully */
19960 cportinfo->cport_state |= SATA_STATE_PROBED | SATA_STATE_READY;
19961 }
19962 /*
19963 * Check if a device is still attached. For sanity, check also
19964 * link status - if no link, there is no device.
19965 */
19966 if ((sata_device.satadev_scr.sstatus & SATA_PORT_DEVLINK_UP_MASK) ==
19967 SATA_PORT_DEVLINK_UP && sata_device.satadev_type !=
19968 SATA_DTYPE_NONE) {
19969 /*
19970 * Device is still attached - ignore detach event.
19971 */
19972 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->
19973 cport_mutex);
19974 SATADBG1(SATA_DBG_EVENTS_PROC, sata_hba_inst,
19975 "Ignoring detach - device still attached to port %d",
19976 sata_device.satadev_addr.cport);
19977 return;
19978 }
19979 /*
19980 * We need to detach and release device info structure here
19981 */
19982 if (cportinfo->cport_dev_type == SATA_DTYPE_PMULT) {
19983 /*
19984 * A port-multiplier is removed.
19985 *
19986 * Calling sata_process_pmdevice_detached() does not work
19987 * here. The port multiplier is gone, so we cannot probe
19988 * sub-port any more and all pmult-related data structure must
19989 * be de-allocated immediately. Following structure of every
19990 * implemented sub-port behind the pmult are required to
19991 * released.
19992 *
19993 * - attachment point
19994 * - target node
19995 * - sata_drive_info
19996 * - sata_pmport_info
19997 */
19998 for (npmport = 0; npmport < SATA_NUM_PMPORTS(sata_hba_inst,
19999 cport); npmport ++) {
20000 SATADBG2(SATA_DBG_PMULT|SATA_DBG_EVENTS_PROC,
20001 sata_hba_inst,
20002 "Detaching target node at port %d:%d",
20003 cport, npmport);
20004
20005 mutex_exit(&SATA_CPORT_MUTEX(sata_hba_inst, cport));
20006
20007 /* Remove attachment point. */
20008 name[0] = '\0';
20009 (void) sprintf(name, "%d.%d", cport, npmport);
20010 ddi_remove_minor_node(SATA_DIP(sata_hba_inst), name);
20011 sata_log(sata_hba_inst, CE_NOTE,
20012 "Remove attachment point of port %d:%d",
20013 cport, npmport);
20014
20015 /* Remove target node */
20016 pmport_addr.cport = cport;
20017 pmport_addr.pmport = (uint8_t)npmport;
20018 pmport_addr.qual = SATA_ADDR_PMPORT;
20019 sata_remove_target_node(sata_hba_inst, &pmport_addr);
20020
20021 mutex_enter(&SATA_CPORT_MUTEX(sata_hba_inst, cport));
20022
20023 /* Release sata_pmport_info & sata_drive_info. */
20024 pmportinfo = SATA_PMPORT_INFO(sata_hba_inst,
20025 cport, npmport);
20026 ASSERT(pmportinfo != NULL);
20027
20028 sdevinfo = SATA_PMPORTINFO_DRV_INFO(pmportinfo);
20029 if (sdevinfo != NULL) {
20030 (void) kmem_free((void *) sdevinfo,
20031 sizeof (sata_drive_info_t));
20032 }
20033
20034 /* Release sata_pmport_info at last */
20035 (void) kmem_free((void *) pmportinfo,
20036 sizeof (sata_pmport_info_t));
20037 }
20038
20039 /* Finally, release sata_pmult_info */
20040 (void) kmem_free((void *)
20041 SATA_CPORTINFO_PMULT_INFO(cportinfo),
20042 sizeof (sata_pmult_info_t));
20043 SATA_CPORTINFO_PMULT_INFO(cportinfo) = NULL;
20044
20045 sata_log(sata_hba_inst, CE_WARN,
20046 "SATA port-multiplier detached at port %d", cport);
20047
20048 cportinfo->cport_dev_type = SATA_DTYPE_NONE;
20049 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst,
20050 saddr->cport)->cport_mutex);
20051 } else {
20052 if (SATA_CPORTINFO_DRV_INFO(cportinfo) != NULL) {
20053 sdevinfo = SATA_CPORTINFO_DRV_INFO(cportinfo);
20054 SATA_CPORTINFO_DRV_INFO(cportinfo) = NULL;
20055 (void) kmem_free((void *)sdevinfo,
20056 sizeof (sata_drive_info_t));
20057 }
20058 sata_log(sata_hba_inst, CE_WARN,
20059 "SATA device detached at port %d", cport);
20060
20061 cportinfo->cport_dev_type = SATA_DTYPE_NONE;
20062 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst,
20063 saddr->cport)->cport_mutex);
20064
20065 /*
20066 * Try to offline a device and remove target node
20067 * if it still exists
20068 */
20069 sata_remove_target_node(sata_hba_inst, saddr);
20070 }
20071
20072
20073 /*
20074 * Generate sysevent - EC_DR / ESC_DR_AP_STATE_CHANGE
20075 * with the hint: SE_HINT_REMOVE
20076 */
20077 sata_gen_sysevent(sata_hba_inst, saddr, SE_HINT_REMOVE);
20078 }
20079
20080 /*
20081 * Port Multiplier Port Device Deattached Event processing.
20082 *
20083 * NOTE: No Mutex should be hold.
20084 */
20085 static void
sata_process_pmdevice_detached(sata_hba_inst_t * sata_hba_inst,sata_address_t * saddr)20086 sata_process_pmdevice_detached(sata_hba_inst_t *sata_hba_inst,
20087 sata_address_t *saddr)
20088 {
20089 sata_pmport_info_t *pmportinfo;
20090 sata_drive_info_t *sdevinfo;
20091 sata_device_t sata_device;
20092 int rval;
20093 uint8_t cport, pmport;
20094
20095 cport = saddr->cport;
20096 pmport = saddr->pmport;
20097
20098 SATADBG2(SATA_DBG_EVENTS_PROC, sata_hba_inst,
20099 "Processing port %d:%d device detached",
20100 cport, pmport);
20101
20102 pmportinfo = SATA_PMPORT_INFO(sata_hba_inst, cport, pmport);
20103 mutex_enter(&SATA_PMPORT_MUTEX(sata_hba_inst, cport, pmport));
20104
20105 /* Clear event flag */
20106 pmportinfo->pmport_event_flags &= ~SATA_EVNT_DEVICE_DETACHED;
20107
20108 /* If the port is in SHUTDOWN or FAILED state, ignore detach event. */
20109 if ((pmportinfo->pmport_state &
20110 (SATA_PSTATE_SHUTDOWN | SATA_PSTATE_FAILED)) != 0) {
20111 mutex_exit(&SATA_PMPORT_MUTEX(sata_hba_inst, cport, pmport));
20112 return;
20113 }
20114 /* For sanity, re-probe the port */
20115 sata_device.satadev_rev = SATA_DEVICE_REV;
20116 sata_device.satadev_addr = *saddr;
20117
20118 /*
20119 * We have to exit mutex, because the HBA probe port function may
20120 * block on its own mutex.
20121 */
20122 mutex_exit(&SATA_PMPORT_MUTEX(sata_hba_inst, cport, pmport));
20123 rval = (*SATA_PROBE_PORT_FUNC(sata_hba_inst))
20124 (SATA_DIP(sata_hba_inst), &sata_device);
20125 mutex_enter(&SATA_PMPORT_MUTEX(sata_hba_inst, cport, pmport));
20126 sata_update_pmport_info(sata_hba_inst, &sata_device);
20127 if (rval != SATA_SUCCESS) {
20128 /* Something went wrong? Fail the port */
20129 pmportinfo->pmport_state = SATA_PSTATE_FAILED;
20130 mutex_exit(&SATA_PMPORT_MUTEX(sata_hba_inst, cport, pmport));
20131 SATA_LOG_D((sata_hba_inst, CE_WARN,
20132 "SATA port %d:%d probing failed",
20133 saddr->pmport));
20134 /*
20135 * We may want to release device info structure, but
20136 * it is not necessary.
20137 */
20138 return;
20139 } else {
20140 /* port probed successfully */
20141 pmportinfo->pmport_state |=
20142 SATA_STATE_PROBED | SATA_STATE_READY;
20143 }
20144 /*
20145 * Check if a device is still attached. For sanity, check also
20146 * link status - if no link, there is no device.
20147 */
20148 if ((sata_device.satadev_scr.sstatus & SATA_PORT_DEVLINK_UP_MASK) ==
20149 SATA_PORT_DEVLINK_UP && sata_device.satadev_type !=
20150 SATA_DTYPE_NONE) {
20151 /*
20152 * Device is still attached - ignore detach event.
20153 */
20154 mutex_exit(&SATA_PMPORT_MUTEX(sata_hba_inst, cport, pmport));
20155 SATADBG1(SATA_DBG_EVENTS_PROC, sata_hba_inst,
20156 "Ignoring detach - device still attached to port %d",
20157 sata_device.satadev_addr.pmport);
20158 return;
20159 }
20160 /*
20161 * We need to detach and release device info structure here
20162 */
20163 if (SATA_PMPORTINFO_DRV_INFO(pmportinfo) != NULL) {
20164 sdevinfo = SATA_PMPORTINFO_DRV_INFO(pmportinfo);
20165 SATA_PMPORTINFO_DRV_INFO(pmportinfo) = NULL;
20166 (void) kmem_free((void *)sdevinfo,
20167 sizeof (sata_drive_info_t));
20168 }
20169 pmportinfo->pmport_dev_type = SATA_DTYPE_NONE;
20170 /*
20171 * Device cannot be reached anymore, even if the target node may be
20172 * still present.
20173 */
20174 mutex_exit(&SATA_PMPORT_MUTEX(sata_hba_inst, cport, pmport));
20175
20176 /*
20177 * Try to offline a device and remove target node if it still exists
20178 */
20179 sata_remove_target_node(sata_hba_inst, saddr);
20180
20181 /*
20182 * Generate sysevent - EC_DR / ESC_DR_AP_STATE_CHANGE
20183 * with the hint: SE_HINT_REMOVE
20184 */
20185 sata_gen_sysevent(sata_hba_inst, saddr, SE_HINT_REMOVE);
20186 }
20187
20188
20189 /*
20190 * Device Attached Event processing.
20191 * Port state is checked to verify that a device is really attached. If so,
20192 * the device info structure is created and attached to the SATA port info
20193 * structure.
20194 *
20195 * If attached device cannot be identified or set-up, the retry for the
20196 * attach processing is set-up. Subsequent daemon run would try again to
20197 * identify the device, until the time limit is reached
20198 * (SATA_DEV_IDENTIFY_TIMEOUT).
20199 *
20200 * This function cannot be called in interrupt context (it may sleep).
20201 *
20202 * NOTE: Port multiplier ports events are handled by
20203 * sata_process_pmdevice_attached()
20204 */
20205 static void
sata_process_device_attached(sata_hba_inst_t * sata_hba_inst,sata_address_t * saddr)20206 sata_process_device_attached(sata_hba_inst_t *sata_hba_inst,
20207 sata_address_t *saddr)
20208 {
20209 sata_cport_info_t *cportinfo = NULL;
20210 sata_drive_info_t *sdevinfo = NULL;
20211 sata_pmult_info_t *pmultinfo = NULL;
20212 sata_pmport_info_t *pmportinfo = NULL;
20213 sata_device_t sata_device;
20214 dev_info_t *tdip;
20215 uint32_t event_flags = 0, pmult_event_flags = 0;
20216 int rval;
20217 int npmport;
20218
20219 SATADBG1(SATA_DBG_EVENTS_PROC, sata_hba_inst,
20220 "Processing port %d device attached", saddr->cport);
20221
20222 cportinfo = SATA_CPORT_INFO(sata_hba_inst, saddr->cport);
20223 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->cport_mutex);
20224
20225 /* Clear attach event flag first */
20226 cportinfo->cport_event_flags &= ~SATA_EVNT_DEVICE_ATTACHED;
20227
20228 /* If the port is in SHUTDOWN or FAILED state, ignore event. */
20229 if ((cportinfo->cport_state &
20230 (SATA_PSTATE_SHUTDOWN | SATA_PSTATE_FAILED)) != 0) {
20231 cportinfo->cport_dev_attach_time = 0;
20232 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->
20233 cport_mutex);
20234 return;
20235 }
20236
20237 /*
20238 * If the sata_drive_info structure is found attached to the port info,
20239 * despite the fact the device was removed and now it is re-attached,
20240 * the old drive info structure was not removed.
20241 * Arbitrarily release device info structure.
20242 */
20243 if (SATA_CPORTINFO_DRV_INFO(cportinfo) != NULL) {
20244 sdevinfo = SATA_CPORTINFO_DRV_INFO(cportinfo);
20245 SATA_CPORTINFO_DRV_INFO(cportinfo) = NULL;
20246 (void) kmem_free((void *)sdevinfo,
20247 sizeof (sata_drive_info_t));
20248 SATADBG1(SATA_DBG_EVENTS_PROC, sata_hba_inst,
20249 "Arbitrarily detaching old device info.", NULL);
20250 }
20251 cportinfo->cport_dev_type = SATA_DTYPE_NONE;
20252
20253 /* For sanity, re-probe the port */
20254 sata_device.satadev_rev = SATA_DEVICE_REV;
20255 sata_device.satadev_addr = *saddr;
20256
20257 /*
20258 * We have to exit mutex, because the HBA probe port function may
20259 * block on its own mutex.
20260 */
20261 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->cport_mutex);
20262 rval = (*SATA_PROBE_PORT_FUNC(sata_hba_inst))
20263 (SATA_DIP(sata_hba_inst), &sata_device);
20264 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->cport_mutex);
20265 sata_update_port_info(sata_hba_inst, &sata_device);
20266 if (rval != SATA_SUCCESS) {
20267 /* Something went wrong? Fail the port */
20268 cportinfo->cport_state = SATA_PSTATE_FAILED;
20269 cportinfo->cport_dev_attach_time = 0;
20270 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->
20271 cport_mutex);
20272 SATA_LOG_D((sata_hba_inst, CE_WARN,
20273 "SATA port %d probing failed",
20274 saddr->cport));
20275 return;
20276 } else {
20277 /* port probed successfully */
20278 cportinfo->cport_state |= SATA_STATE_PROBED | SATA_STATE_READY;
20279 }
20280 /*
20281 * Check if a device is still attached. For sanity, check also
20282 * link status - if no link, there is no device.
20283 */
20284 if ((sata_device.satadev_scr.sstatus & SATA_PORT_DEVLINK_UP_MASK) !=
20285 SATA_PORT_DEVLINK_UP || sata_device.satadev_type ==
20286 SATA_DTYPE_NONE) {
20287 /*
20288 * No device - ignore attach event.
20289 */
20290 cportinfo->cport_dev_attach_time = 0;
20291 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->
20292 cport_mutex);
20293 SATADBG1(SATA_DBG_EVENTS_PROC, sata_hba_inst,
20294 "Ignoring attach - no device connected to port %d",
20295 sata_device.satadev_addr.cport);
20296 return;
20297 }
20298
20299 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->cport_mutex);
20300 /*
20301 * Generate sysevent - EC_DR / ESC_DR_AP_STATE_CHANGE
20302 * with the hint: SE_HINT_INSERT
20303 */
20304 sata_gen_sysevent(sata_hba_inst, saddr, SE_HINT_INSERT);
20305
20306 /*
20307 * Port reprobing will take care of the creation of the device
20308 * info structure and determination of the device type.
20309 */
20310 sata_device.satadev_addr = *saddr;
20311 (void) sata_reprobe_port(sata_hba_inst, &sata_device,
20312 SATA_DEV_IDENTIFY_NORETRY);
20313
20314 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->
20315 cport_mutex);
20316 if ((cportinfo->cport_state & SATA_STATE_READY) &&
20317 (cportinfo->cport_dev_type != SATA_DTYPE_NONE)) {
20318 /* Some device is attached to the port */
20319 if (cportinfo->cport_dev_type == SATA_DTYPE_UNKNOWN) {
20320 /*
20321 * A device was not successfully attached.
20322 * Track retry time for device identification.
20323 */
20324 if (cportinfo->cport_dev_attach_time != 0) {
20325 clock_t cur_time = ddi_get_lbolt();
20326 /*
20327 * If the retry time limit was not exceeded,
20328 * reinstate attach event.
20329 */
20330 if ((cur_time -
20331 cportinfo->cport_dev_attach_time) <
20332 drv_usectohz(
20333 SATA_DEV_IDENTIFY_TIMEOUT)) {
20334 /* OK, restore attach event */
20335 cportinfo->cport_event_flags |=
20336 SATA_EVNT_DEVICE_ATTACHED;
20337 } else {
20338 /* Timeout - cannot identify device */
20339 cportinfo->cport_dev_attach_time = 0;
20340 sata_log(sata_hba_inst,
20341 CE_WARN,
20342 "Could not identify SATA device "
20343 "at port %d",
20344 saddr->cport);
20345 }
20346 } else {
20347 /*
20348 * Start tracking time for device
20349 * identification.
20350 * Save current time (lbolt value).
20351 */
20352 cportinfo->cport_dev_attach_time =
20353 ddi_get_lbolt();
20354 /* Restore attach event */
20355 cportinfo->cport_event_flags |=
20356 SATA_EVNT_DEVICE_ATTACHED;
20357 }
20358 } else if (cportinfo->cport_dev_type == SATA_DTYPE_PMULT) {
20359 cportinfo->cport_dev_attach_time = 0;
20360 sata_log(sata_hba_inst, CE_NOTE,
20361 "SATA port-multiplier detected at port %d",
20362 saddr->cport);
20363
20364 if (SATA_CPORTINFO_PMULT_INFO(cportinfo) != NULL) {
20365 /* Log the info of new port multiplier */
20366 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst,
20367 saddr->cport)->cport_mutex);
20368 sata_show_pmult_info(sata_hba_inst,
20369 &sata_device);
20370 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst,
20371 saddr->cport)->cport_mutex);
20372 }
20373
20374 ASSERT(SATA_CPORTINFO_PMULT_INFO(cportinfo) != NULL);
20375 pmultinfo = SATA_CPORTINFO_PMULT_INFO(cportinfo);
20376 for (npmport = 0; npmport <
20377 pmultinfo->pmult_num_dev_ports; npmport++) {
20378 pmportinfo = SATA_PMPORT_INFO(sata_hba_inst,
20379 saddr->cport, npmport);
20380 ASSERT(pmportinfo != NULL);
20381
20382 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst,
20383 saddr->cport)->cport_mutex);
20384 mutex_enter(&pmportinfo->pmport_mutex);
20385 /* Marked all pmports with link events. */
20386 pmportinfo->pmport_event_flags =
20387 SATA_EVNT_LINK_ESTABLISHED;
20388 pmult_event_flags |=
20389 pmportinfo->pmport_event_flags;
20390 mutex_exit(&pmportinfo->pmport_mutex);
20391 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst,
20392 saddr->cport)->cport_mutex);
20393 }
20394 /* Auto-online is not available for PMult now. */
20395
20396 } else {
20397 /*
20398 * If device was successfully attached, the subsequent
20399 * action depends on a state of the
20400 * sata_auto_online variable. If it is set to zero.
20401 * an explicit 'configure' command will be needed to
20402 * configure it. If its value is non-zero, we will
20403 * attempt to online (configure) the device.
20404 * First, log the message indicating that a device
20405 * was attached.
20406 */
20407 cportinfo->cport_dev_attach_time = 0;
20408 sata_log(sata_hba_inst, CE_WARN,
20409 "SATA device detected at port %d", saddr->cport);
20410
20411 if (SATA_CPORTINFO_DRV_INFO(cportinfo) != NULL) {
20412 sata_drive_info_t new_sdinfo;
20413
20414 /* Log device info data */
20415 new_sdinfo = *(SATA_CPORTINFO_DRV_INFO(
20416 cportinfo));
20417 sata_show_drive_info(sata_hba_inst,
20418 &new_sdinfo);
20419 }
20420
20421 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst,
20422 saddr->cport)->cport_mutex);
20423
20424 /*
20425 * Make sure that there is no target node for that
20426 * device. If so, release it. It should not happen,
20427 * unless we had problem removing the node when
20428 * device was detached.
20429 */
20430 tdip = sata_get_target_dip(SATA_DIP(sata_hba_inst),
20431 saddr->cport, saddr->pmport);
20432 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst,
20433 saddr->cport)->cport_mutex);
20434 if (tdip != NULL) {
20435
20436 #ifdef SATA_DEBUG
20437 if ((cportinfo->cport_event_flags &
20438 SATA_EVNT_TARGET_NODE_CLEANUP) == 0)
20439 sata_log(sata_hba_inst, CE_WARN,
20440 "sata_process_device_attached: "
20441 "old device target node exists!");
20442 #endif
20443 /*
20444 * target node exists - try to unconfigure
20445 * device and remove the node.
20446 */
20447 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst,
20448 saddr->cport)->cport_mutex);
20449 rval = ndi_devi_offline(tdip,
20450 NDI_DEVI_REMOVE);
20451 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst,
20452 saddr->cport)->cport_mutex);
20453
20454 if (rval == NDI_SUCCESS) {
20455 cportinfo->cport_event_flags &=
20456 ~SATA_EVNT_TARGET_NODE_CLEANUP;
20457 cportinfo->cport_tgtnode_clean = B_TRUE;
20458 } else {
20459 /*
20460 * PROBLEM - the target node remained
20461 * and it belongs to a previously
20462 * attached device.
20463 * This happens when the file was open
20464 * or the node was waiting for
20465 * resources at the time the
20466 * associated device was removed.
20467 * Instruct event daemon to retry the
20468 * cleanup later.
20469 */
20470 sata_log(sata_hba_inst,
20471 CE_WARN,
20472 "Application(s) accessing "
20473 "previously attached SATA "
20474 "device have to release "
20475 "it before newly inserted "
20476 "device can be made accessible.",
20477 saddr->cport);
20478 cportinfo->cport_event_flags |=
20479 SATA_EVNT_TARGET_NODE_CLEANUP;
20480 cportinfo->cport_tgtnode_clean =
20481 B_FALSE;
20482 }
20483 }
20484 if (sata_auto_online != 0) {
20485 cportinfo->cport_event_flags |=
20486 SATA_EVNT_AUTOONLINE_DEVICE;
20487 }
20488
20489 }
20490 } else {
20491 cportinfo->cport_dev_attach_time = 0;
20492 }
20493
20494 event_flags = cportinfo->cport_event_flags;
20495 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->cport_mutex);
20496 if (event_flags != 0 || pmult_event_flags != 0) {
20497 mutex_enter(&sata_hba_inst->satahba_mutex);
20498 sata_hba_inst->satahba_event_flags |= SATA_EVNT_MAIN;
20499 mutex_exit(&sata_hba_inst->satahba_mutex);
20500 mutex_enter(&sata_mutex);
20501 sata_event_pending |= SATA_EVNT_MAIN;
20502 mutex_exit(&sata_mutex);
20503 }
20504 }
20505
20506 /*
20507 * Port Multiplier Port Device Attached Event processing.
20508 *
20509 * NOTE: No Mutex should be hold.
20510 */
20511 static void
sata_process_pmdevice_attached(sata_hba_inst_t * sata_hba_inst,sata_address_t * saddr)20512 sata_process_pmdevice_attached(sata_hba_inst_t *sata_hba_inst,
20513 sata_address_t *saddr)
20514 {
20515 sata_pmport_info_t *pmportinfo;
20516 sata_drive_info_t *sdinfo;
20517 sata_device_t sata_device;
20518 dev_info_t *tdip;
20519 uint32_t event_flags;
20520 uint8_t cport = saddr->cport;
20521 uint8_t pmport = saddr->pmport;
20522 int rval;
20523
20524 SATADBG2(SATA_DBG_EVENTS_PROC, sata_hba_inst,
20525 "Processing port %d:%d device attached", cport, pmport);
20526
20527 pmportinfo = SATA_PMPORT_INFO(sata_hba_inst, cport, pmport);
20528
20529 mutex_enter(&pmportinfo->pmport_mutex);
20530
20531 /* Clear attach event flag first */
20532 pmportinfo->pmport_event_flags &= ~SATA_EVNT_DEVICE_ATTACHED;
20533
20534 /* If the port is in SHUTDOWN or FAILED state, ignore event. */
20535 if ((pmportinfo->pmport_state &
20536 (SATA_PSTATE_SHUTDOWN | SATA_PSTATE_FAILED)) != 0) {
20537 pmportinfo->pmport_dev_attach_time = 0;
20538 mutex_exit(&pmportinfo->pmport_mutex);
20539 return;
20540 }
20541
20542 /*
20543 * If the sata_drive_info structure is found attached to the port info,
20544 * despite the fact the device was removed and now it is re-attached,
20545 * the old drive info structure was not removed.
20546 * Arbitrarily release device info structure.
20547 */
20548 if (SATA_PMPORTINFO_DRV_INFO(pmportinfo) != NULL) {
20549 sdinfo = SATA_PMPORTINFO_DRV_INFO(pmportinfo);
20550 SATA_PMPORTINFO_DRV_INFO(pmportinfo) = NULL;
20551 (void) kmem_free((void *)sdinfo,
20552 sizeof (sata_drive_info_t));
20553 SATADBG1(SATA_DBG_EVENTS_PROC, sata_hba_inst,
20554 "Arbitrarily detaching old device info.", NULL);
20555 }
20556 pmportinfo->pmport_dev_type = SATA_DTYPE_NONE;
20557
20558 /* For sanity, re-probe the port */
20559 sata_device.satadev_rev = SATA_DEVICE_REV;
20560 sata_device.satadev_addr = *saddr;
20561
20562 /*
20563 * We have to exit mutex, because the HBA probe port function may
20564 * block on its own mutex.
20565 */
20566 mutex_exit(&pmportinfo->pmport_mutex);
20567 rval = (*SATA_PROBE_PORT_FUNC(sata_hba_inst))
20568 (SATA_DIP(sata_hba_inst), &sata_device);
20569 mutex_enter(&pmportinfo->pmport_mutex);
20570
20571 sata_update_pmport_info(sata_hba_inst, &sata_device);
20572 if (rval != SATA_SUCCESS) {
20573 /* Something went wrong? Fail the port */
20574 pmportinfo->pmport_state = SATA_PSTATE_FAILED;
20575 pmportinfo->pmport_dev_attach_time = 0;
20576 mutex_exit(&pmportinfo->pmport_mutex);
20577 SATA_LOG_D((sata_hba_inst, CE_WARN,
20578 "SATA port %d:%d probing failed", cport, pmport));
20579 return;
20580 } else {
20581 /* pmport probed successfully */
20582 pmportinfo->pmport_state |=
20583 SATA_STATE_PROBED | SATA_STATE_READY;
20584 }
20585 /*
20586 * Check if a device is still attached. For sanity, check also
20587 * link status - if no link, there is no device.
20588 */
20589 if ((sata_device.satadev_scr.sstatus & SATA_PORT_DEVLINK_UP_MASK) !=
20590 SATA_PORT_DEVLINK_UP || sata_device.satadev_type ==
20591 SATA_DTYPE_NONE) {
20592 /*
20593 * No device - ignore attach event.
20594 */
20595 pmportinfo->pmport_dev_attach_time = 0;
20596 mutex_exit(&pmportinfo->pmport_mutex);
20597 SATADBG2(SATA_DBG_EVENTS_PROC, sata_hba_inst,
20598 "Ignoring attach - no device connected to port %d:%d",
20599 cport, pmport);
20600 return;
20601 }
20602
20603 mutex_exit(&pmportinfo->pmport_mutex);
20604 /*
20605 * Generate sysevent - EC_DR / ESC_DR_AP_STATE_CHANGE
20606 * with the hint: SE_HINT_INSERT
20607 */
20608 sata_gen_sysevent(sata_hba_inst, saddr, SE_HINT_INSERT);
20609
20610 /*
20611 * Port reprobing will take care of the creation of the device
20612 * info structure and determination of the device type.
20613 */
20614 sata_device.satadev_addr = *saddr;
20615 (void) sata_reprobe_port(sata_hba_inst, &sata_device,
20616 SATA_DEV_IDENTIFY_NORETRY);
20617
20618 mutex_enter(&pmportinfo->pmport_mutex);
20619 if ((pmportinfo->pmport_state & SATA_STATE_READY) &&
20620 (pmportinfo->pmport_dev_type != SATA_DTYPE_NONE)) {
20621 /* Some device is attached to the port */
20622 if (pmportinfo->pmport_dev_type == SATA_DTYPE_UNKNOWN) {
20623 /*
20624 * A device was not successfully attached.
20625 * Track retry time for device identification.
20626 */
20627 if (pmportinfo->pmport_dev_attach_time != 0) {
20628 clock_t cur_time = ddi_get_lbolt();
20629 /*
20630 * If the retry time limit was not exceeded,
20631 * reinstate attach event.
20632 */
20633 if ((cur_time -
20634 pmportinfo->pmport_dev_attach_time) <
20635 drv_usectohz(
20636 SATA_DEV_IDENTIFY_TIMEOUT)) {
20637 /* OK, restore attach event */
20638 pmportinfo->pmport_event_flags |=
20639 SATA_EVNT_DEVICE_ATTACHED;
20640 } else {
20641 /* Timeout - cannot identify device */
20642 pmportinfo->pmport_dev_attach_time = 0;
20643 sata_log(sata_hba_inst, CE_WARN,
20644 "Could not identify SATA device "
20645 "at port %d:%d",
20646 cport, pmport);
20647 }
20648 } else {
20649 /*
20650 * Start tracking time for device
20651 * identification.
20652 * Save current time (lbolt value).
20653 */
20654 pmportinfo->pmport_dev_attach_time =
20655 ddi_get_lbolt();
20656 /* Restore attach event */
20657 pmportinfo->pmport_event_flags |=
20658 SATA_EVNT_DEVICE_ATTACHED;
20659 }
20660 } else {
20661 /*
20662 * If device was successfully attached, the subsequent
20663 * action depends on a state of the
20664 * sata_auto_online variable. If it is set to zero.
20665 * an explicit 'configure' command will be needed to
20666 * configure it. If its value is non-zero, we will
20667 * attempt to online (configure) the device.
20668 * First, log the message indicating that a device
20669 * was attached.
20670 */
20671 pmportinfo->pmport_dev_attach_time = 0;
20672 sata_log(sata_hba_inst, CE_WARN,
20673 "SATA device detected at port %d:%d",
20674 cport, pmport);
20675
20676 if (SATA_PMPORTINFO_DRV_INFO(pmportinfo) != NULL) {
20677 sata_drive_info_t new_sdinfo;
20678
20679 /* Log device info data */
20680 new_sdinfo = *(SATA_PMPORTINFO_DRV_INFO(
20681 pmportinfo));
20682 sata_show_drive_info(sata_hba_inst,
20683 &new_sdinfo);
20684 }
20685
20686 mutex_exit(&pmportinfo->pmport_mutex);
20687
20688 /*
20689 * Make sure that there is no target node for that
20690 * device. If so, release it. It should not happen,
20691 * unless we had problem removing the node when
20692 * device was detached.
20693 */
20694 tdip = sata_get_target_dip(SATA_DIP(sata_hba_inst),
20695 saddr->cport, saddr->pmport);
20696 mutex_enter(&pmportinfo->pmport_mutex);
20697 if (tdip != NULL) {
20698
20699 #ifdef SATA_DEBUG
20700 if ((pmportinfo->pmport_event_flags &
20701 SATA_EVNT_TARGET_NODE_CLEANUP) == 0)
20702 sata_log(sata_hba_inst, CE_WARN,
20703 "sata_process_device_attached: "
20704 "old device target node exists!");
20705 #endif
20706 /*
20707 * target node exists - try to unconfigure
20708 * device and remove the node.
20709 */
20710 mutex_exit(&pmportinfo->pmport_mutex);
20711 rval = ndi_devi_offline(tdip,
20712 NDI_DEVI_REMOVE);
20713 mutex_enter(&pmportinfo->pmport_mutex);
20714
20715 if (rval == NDI_SUCCESS) {
20716 pmportinfo->pmport_event_flags &=
20717 ~SATA_EVNT_TARGET_NODE_CLEANUP;
20718 pmportinfo->pmport_tgtnode_clean =
20719 B_TRUE;
20720 } else {
20721 /*
20722 * PROBLEM - the target node remained
20723 * and it belongs to a previously
20724 * attached device.
20725 * This happens when the file was open
20726 * or the node was waiting for
20727 * resources at the time the
20728 * associated device was removed.
20729 * Instruct event daemon to retry the
20730 * cleanup later.
20731 */
20732 sata_log(sata_hba_inst,
20733 CE_WARN,
20734 "Application(s) accessing "
20735 "previously attached SATA "
20736 "device have to release "
20737 "it before newly inserted "
20738 "device can be made accessible."
20739 "at port %d:%d",
20740 cport, pmport);
20741 pmportinfo->pmport_event_flags |=
20742 SATA_EVNT_TARGET_NODE_CLEANUP;
20743 pmportinfo->pmport_tgtnode_clean =
20744 B_FALSE;
20745 }
20746 }
20747 if (sata_auto_online != 0) {
20748 pmportinfo->pmport_event_flags |=
20749 SATA_EVNT_AUTOONLINE_DEVICE;
20750 }
20751
20752 }
20753 } else {
20754 pmportinfo->pmport_dev_attach_time = 0;
20755 }
20756
20757 event_flags = pmportinfo->pmport_event_flags;
20758 mutex_exit(&pmportinfo->pmport_mutex);
20759 if (event_flags != 0) {
20760 mutex_enter(&sata_hba_inst->satahba_mutex);
20761 sata_hba_inst->satahba_event_flags |= SATA_EVNT_MAIN;
20762 mutex_exit(&sata_hba_inst->satahba_mutex);
20763 mutex_enter(&sata_mutex);
20764 sata_event_pending |= SATA_EVNT_MAIN;
20765 mutex_exit(&sata_mutex);
20766 }
20767
20768 /* clear the reset_in_progress events */
20769 if (SATA_PMPORTINFO_DRV_INFO(pmportinfo) != NULL) {
20770 if (pmportinfo->pmport_dev_type & SATA_VALID_DEV_TYPE) {
20771 /* must clear flags on cport */
20772 sata_pmult_info_t *pminfo =
20773 SATA_PMULT_INFO(sata_hba_inst,
20774 saddr->cport);
20775 pminfo->pmult_event_flags |=
20776 SATA_EVNT_CLEAR_DEVICE_RESET;
20777 }
20778 }
20779 }
20780
20781 /*
20782 * Device Target Node Cleanup Event processing.
20783 * If the target node associated with a sata port device is in
20784 * DEVI_DEVICE_REMOVED state, an attempt is made to remove it.
20785 * If the target node cannot be removed, the event flag is left intact,
20786 * so that event daemon may re-run this function later.
20787 *
20788 * This function cannot be called in interrupt context (it may sleep).
20789 *
20790 * NOTE: Processes cport events only, not port multiplier ports.
20791 */
20792 static void
sata_process_target_node_cleanup(sata_hba_inst_t * sata_hba_inst,sata_address_t * saddr)20793 sata_process_target_node_cleanup(sata_hba_inst_t *sata_hba_inst,
20794 sata_address_t *saddr)
20795 {
20796 sata_cport_info_t *cportinfo;
20797 dev_info_t *tdip;
20798
20799 SATADBG1(SATA_DBG_EVENTS_PROC, sata_hba_inst,
20800 "Processing port %d device target node cleanup", saddr->cport);
20801
20802 cportinfo = SATA_CPORT_INFO(sata_hba_inst, saddr->cport);
20803
20804 /*
20805 * Check if there is target node for that device and it is in the
20806 * DEVI_DEVICE_REMOVED state. If so, release it.
20807 */
20808 tdip = sata_get_target_dip(SATA_DIP(sata_hba_inst), saddr->cport,
20809 saddr->pmport);
20810 if (tdip != NULL) {
20811 /*
20812 * target node exists - check if it is target node of
20813 * a removed device.
20814 */
20815 if (sata_check_device_removed(tdip) == B_TRUE) {
20816 SATADBG1(SATA_DBG_EVENTS_PROC, sata_hba_inst,
20817 "sata_process_target_node_cleanup: "
20818 "old device target node exists!", NULL);
20819 /*
20820 * Unconfigure and remove the target node
20821 */
20822 if (ndi_devi_offline(tdip, NDI_DEVI_REMOVE) ==
20823 NDI_SUCCESS) {
20824 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst,
20825 saddr->cport)->cport_mutex);
20826 cportinfo->cport_event_flags &=
20827 ~SATA_EVNT_TARGET_NODE_CLEANUP;
20828 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst,
20829 saddr->cport)->cport_mutex);
20830 return;
20831 }
20832 /*
20833 * Event daemon will retry the cleanup later.
20834 */
20835 mutex_enter(&sata_hba_inst->satahba_mutex);
20836 sata_hba_inst->satahba_event_flags |= SATA_EVNT_MAIN;
20837 mutex_exit(&sata_hba_inst->satahba_mutex);
20838 mutex_enter(&sata_mutex);
20839 sata_event_pending |= SATA_EVNT_MAIN;
20840 mutex_exit(&sata_mutex);
20841 }
20842 } else {
20843 if (saddr->qual == SATA_ADDR_CPORT ||
20844 saddr->qual == SATA_ADDR_DCPORT) {
20845 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst,
20846 saddr->cport)->cport_mutex);
20847 cportinfo->cport_event_flags &=
20848 ~SATA_EVNT_TARGET_NODE_CLEANUP;
20849 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst,
20850 saddr->cport)->cport_mutex);
20851 } else {
20852 /* sanity check */
20853 if (SATA_CPORT_DEV_TYPE(sata_hba_inst, saddr->cport) !=
20854 SATA_DTYPE_PMULT || SATA_PMULT_INFO(sata_hba_inst,
20855 saddr->cport) == NULL)
20856 return;
20857 if (SATA_PMPORT_INFO(sata_hba_inst, saddr->cport,
20858 saddr->pmport) == NULL)
20859 return;
20860
20861 mutex_enter(&SATA_PMPORT_INFO(sata_hba_inst,
20862 saddr->cport, saddr->pmport)->pmport_mutex);
20863 SATA_PMPORT_INFO(sata_hba_inst, saddr->cport,
20864 saddr->pmport)->pmport_event_flags &=
20865 ~SATA_EVNT_TARGET_NODE_CLEANUP;
20866 mutex_exit(&SATA_PMPORT_INFO(sata_hba_inst,
20867 saddr->cport, saddr->pmport)->pmport_mutex);
20868 }
20869 }
20870 }
20871
20872 /*
20873 * Device AutoOnline Event processing.
20874 * If attached device is to be onlined, an attempt is made to online this
20875 * device, but only if there is no lingering (old) target node present.
20876 * If the device cannot be onlined, the event flag is left intact,
20877 * so that event daemon may re-run this function later.
20878 *
20879 * This function cannot be called in interrupt context (it may sleep).
20880 *
20881 * NOTE: Processes cport events only, not port multiplier ports.
20882 */
20883 static void
sata_process_device_autoonline(sata_hba_inst_t * sata_hba_inst,sata_address_t * saddr)20884 sata_process_device_autoonline(sata_hba_inst_t *sata_hba_inst,
20885 sata_address_t *saddr)
20886 {
20887 sata_cport_info_t *cportinfo;
20888 sata_drive_info_t *sdinfo;
20889 sata_device_t sata_device;
20890 dev_info_t *tdip;
20891
20892 SATADBG1(SATA_DBG_EVENTS_PROC, sata_hba_inst,
20893 "Processing port %d attached device auto-onlining", saddr->cport);
20894
20895 cportinfo = SATA_CPORT_INFO(sata_hba_inst, saddr->cport);
20896
20897 /*
20898 * Check if device is present and recognized. If not, reset event.
20899 */
20900 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->cport_mutex);
20901 if ((cportinfo->cport_dev_type & SATA_VALID_DEV_TYPE) == 0) {
20902 /* Nothing to online */
20903 cportinfo->cport_event_flags &= ~SATA_EVNT_AUTOONLINE_DEVICE;
20904 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst,
20905 saddr->cport)->cport_mutex);
20906 return;
20907 }
20908 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->cport_mutex);
20909
20910 /*
20911 * Check if there is target node for this device and if it is in the
20912 * DEVI_DEVICE_REMOVED state. If so, abort onlining but keep
20913 * the event for later processing.
20914 */
20915 tdip = sata_get_target_dip(SATA_DIP(sata_hba_inst), saddr->cport,
20916 saddr->pmport);
20917 if (tdip != NULL) {
20918 /*
20919 * target node exists - check if it is target node of
20920 * a removed device.
20921 */
20922 if (sata_check_device_removed(tdip) == B_TRUE) {
20923 SATADBG1(SATA_DBG_EVENTS_PROC, sata_hba_inst,
20924 "sata_process_device_autoonline: "
20925 "old device target node exists!", NULL);
20926 /*
20927 * Event daemon will retry device onlining later.
20928 */
20929 mutex_enter(&sata_hba_inst->satahba_mutex);
20930 sata_hba_inst->satahba_event_flags |= SATA_EVNT_MAIN;
20931 mutex_exit(&sata_hba_inst->satahba_mutex);
20932 mutex_enter(&sata_mutex);
20933 sata_event_pending |= SATA_EVNT_MAIN;
20934 mutex_exit(&sata_mutex);
20935 return;
20936 }
20937 /*
20938 * If the target node is not in the 'removed" state, assume
20939 * that it belongs to this device. There is nothing more to do,
20940 * but reset the event.
20941 */
20942 } else {
20943
20944 /*
20945 * Try to online the device
20946 * If there is any reset-related event, remove it. We are
20947 * configuring the device and no state restoring is needed.
20948 */
20949 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst,
20950 saddr->cport)->cport_mutex);
20951 sata_device.satadev_addr = *saddr;
20952 if (saddr->qual == SATA_ADDR_CPORT)
20953 sata_device.satadev_addr.qual = SATA_ADDR_DCPORT;
20954 else
20955 sata_device.satadev_addr.qual = SATA_ADDR_DPMPORT;
20956 sdinfo = sata_get_device_info(sata_hba_inst, &sata_device);
20957 if (sdinfo != NULL) {
20958 if (sdinfo->satadrv_event_flags &
20959 (SATA_EVNT_DEVICE_RESET |
20960 SATA_EVNT_INPROC_DEVICE_RESET))
20961 sdinfo->satadrv_event_flags = 0;
20962 sdinfo->satadrv_event_flags |=
20963 SATA_EVNT_CLEAR_DEVICE_RESET;
20964
20965 /* Need to create a new target node. */
20966 cportinfo->cport_tgtnode_clean = B_TRUE;
20967 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst,
20968 saddr->cport)->cport_mutex);
20969 tdip = sata_create_target_node(SATA_DIP(sata_hba_inst),
20970 sata_hba_inst, &sata_device.satadev_addr);
20971 if (tdip == NULL) {
20972 /*
20973 * Configure (onlining) failed.
20974 * We will NOT retry
20975 */
20976 SATA_LOG_D((sata_hba_inst, CE_WARN,
20977 "sata_process_device_autoonline: "
20978 "configuring SATA device at port %d failed",
20979 saddr->cport));
20980 }
20981 } else {
20982 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst,
20983 saddr->cport)->cport_mutex);
20984 }
20985
20986 }
20987 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->cport_mutex);
20988 cportinfo->cport_event_flags &= ~SATA_EVNT_AUTOONLINE_DEVICE;
20989 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst,
20990 saddr->cport)->cport_mutex);
20991 }
20992
20993
20994 static void
sata_gen_sysevent(sata_hba_inst_t * sata_hba_inst,sata_address_t * saddr,int hint)20995 sata_gen_sysevent(sata_hba_inst_t *sata_hba_inst, sata_address_t *saddr,
20996 int hint)
20997 {
20998 char ap[MAXPATHLEN];
20999 nvlist_t *ev_attr_list = NULL;
21000 int err;
21001
21002 /* Allocate and build sysevent attribute list */
21003 err = nvlist_alloc(&ev_attr_list, NV_UNIQUE_NAME_TYPE, DDI_NOSLEEP);
21004 if (err != 0) {
21005 SATA_LOG_D((sata_hba_inst, CE_WARN,
21006 "sata_gen_sysevent: "
21007 "cannot allocate memory for sysevent attributes\n"));
21008 return;
21009 }
21010 /* Add hint attribute */
21011 err = nvlist_add_string(ev_attr_list, DR_HINT, SE_HINT2STR(hint));
21012 if (err != 0) {
21013 SATA_LOG_D((sata_hba_inst, CE_WARN,
21014 "sata_gen_sysevent: "
21015 "failed to add DR_HINT attr for sysevent"));
21016 nvlist_free(ev_attr_list);
21017 return;
21018 }
21019 /*
21020 * Add AP attribute.
21021 * Get controller pathname and convert it into AP pathname by adding
21022 * a target number.
21023 */
21024 (void) snprintf(ap, MAXPATHLEN, "/devices");
21025 (void) ddi_pathname(SATA_DIP(sata_hba_inst), ap + strlen(ap));
21026 (void) snprintf(ap + strlen(ap), MAXPATHLEN - strlen(ap), ":%d",
21027 SATA_MAKE_AP_NUMBER(saddr->cport, saddr->pmport, saddr->qual));
21028
21029 err = nvlist_add_string(ev_attr_list, DR_AP_ID, ap);
21030 if (err != 0) {
21031 SATA_LOG_D((sata_hba_inst, CE_WARN,
21032 "sata_gen_sysevent: "
21033 "failed to add DR_AP_ID attr for sysevent"));
21034 nvlist_free(ev_attr_list);
21035 return;
21036 }
21037
21038 /* Generate/log sysevent */
21039 err = ddi_log_sysevent(SATA_DIP(sata_hba_inst), DDI_VENDOR_SUNW, EC_DR,
21040 ESC_DR_AP_STATE_CHANGE, ev_attr_list, NULL, DDI_NOSLEEP);
21041 if (err != DDI_SUCCESS) {
21042 SATA_LOG_D((sata_hba_inst, CE_WARN,
21043 "sata_gen_sysevent: "
21044 "cannot log sysevent, err code %x\n", err));
21045 }
21046
21047 nvlist_free(ev_attr_list);
21048 }
21049
21050
21051
21052
21053 /*
21054 * Set DEVI_DEVICE_REMOVED state in the SATA device target node.
21055 */
21056 static void
sata_set_device_removed(dev_info_t * tdip)21057 sata_set_device_removed(dev_info_t *tdip)
21058 {
21059 ASSERT(tdip != NULL);
21060
21061 ndi_devi_enter(tdip);
21062 mutex_enter(&DEVI(tdip)->devi_lock);
21063 DEVI_SET_DEVICE_REMOVED(tdip);
21064 mutex_exit(&DEVI(tdip)->devi_lock);
21065 ndi_devi_exit(tdip);
21066 }
21067
21068
21069 /*
21070 * Set internal event instructing event daemon to try
21071 * to perform the target node cleanup.
21072 */
21073 static void
sata_set_target_node_cleanup(sata_hba_inst_t * sata_hba_inst,sata_address_t * saddr)21074 sata_set_target_node_cleanup(sata_hba_inst_t *sata_hba_inst,
21075 sata_address_t *saddr)
21076 {
21077 if (saddr->qual == SATA_ADDR_CPORT ||
21078 saddr->qual == SATA_ADDR_DCPORT) {
21079 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst,
21080 saddr->cport)->cport_mutex);
21081 SATA_CPORT_EVENT_FLAGS(sata_hba_inst, saddr->cport) |=
21082 SATA_EVNT_TARGET_NODE_CLEANUP;
21083 SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->
21084 cport_tgtnode_clean = B_FALSE;
21085 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst,
21086 saddr->cport)->cport_mutex);
21087 } else {
21088 mutex_enter(&SATA_PMPORT_INFO(sata_hba_inst,
21089 saddr->cport, saddr->pmport)->pmport_mutex);
21090 SATA_PMPORT_EVENT_FLAGS(sata_hba_inst, saddr->cport,
21091 saddr->pmport) |= SATA_EVNT_TARGET_NODE_CLEANUP;
21092 SATA_PMPORT_INFO(sata_hba_inst, saddr->cport, saddr->pmport)->
21093 pmport_tgtnode_clean = B_FALSE;
21094 mutex_exit(&SATA_PMPORT_INFO(sata_hba_inst,
21095 saddr->cport, saddr->pmport)->pmport_mutex);
21096 }
21097 mutex_enter(&sata_hba_inst->satahba_mutex);
21098 sata_hba_inst->satahba_event_flags |= SATA_EVNT_MAIN;
21099 mutex_exit(&sata_hba_inst->satahba_mutex);
21100 mutex_enter(&sata_mutex);
21101 sata_event_pending |= SATA_EVNT_MAIN;
21102 mutex_exit(&sata_mutex);
21103 }
21104
21105
21106 /*
21107 * Check if the SATA device target node is in DEVI_DEVICE_REMOVED state,
21108 * i.e. check if the target node state indicates that it belongs to a removed
21109 * device.
21110 *
21111 * Returns B_TRUE if the target node is in DEVI_DEVICE_REMOVED state,
21112 * B_FALSE otherwise.
21113 */
21114 static boolean_t
sata_check_device_removed(dev_info_t * tdip)21115 sata_check_device_removed(dev_info_t *tdip)
21116 {
21117 ASSERT(tdip != NULL);
21118
21119 if (DEVI_IS_DEVICE_REMOVED(tdip))
21120 return (B_TRUE);
21121 else
21122 return (B_FALSE);
21123 }
21124
21125
21126 /*
21127 * Check for DMA error. Return B_TRUE if error, B_FALSE otherwise.
21128 */
21129 static boolean_t
sata_check_for_dma_error(dev_info_t * dip,sata_pkt_txlate_t * spx)21130 sata_check_for_dma_error(dev_info_t *dip, sata_pkt_txlate_t *spx)
21131 {
21132 int fm_capability = ddi_fm_capable(dip);
21133 ddi_fm_error_t de;
21134
21135 if (fm_capability & DDI_FM_DMACHK_CAPABLE) {
21136 if (spx->txlt_buf_dma_handle != NULL) {
21137 ddi_fm_dma_err_get(spx->txlt_buf_dma_handle, &de,
21138 DDI_FME_VERSION);
21139 if (de.fme_status != DDI_SUCCESS)
21140 return (B_TRUE);
21141 }
21142 }
21143 return (B_FALSE);
21144 }
21145
21146
21147 /* ************************ FAULT INJECTTION **************************** */
21148
21149 #ifdef SATA_INJECT_FAULTS
21150
21151 static uint32_t sata_fault_count = 0;
21152 static uint32_t sata_fault_suspend_count = 0;
21153
21154 /*
21155 * Inject sata pkt fault
21156 * It modifies returned values of the sata packet.
21157 * It returns immediately if:
21158 * pkt fault injection is not enabled (via sata_inject_fault,
21159 * sata_inject_fault_count), or invalid fault is specified (sata_fault_type),
21160 * or pkt does not contain command to be faulted (set in sata_fault_cmd), or
21161 * pkt is not directed to specified fault controller/device
21162 * (sata_fault_ctrl_dev and sata_fault_device).
21163 * If fault controller is not specified, fault injection applies to all
21164 * controllers and devices.
21165 *
21166 * First argument is the pointer to the executed sata packet.
21167 * Second argument is a pointer to a value returned by the HBA tran_start
21168 * function.
21169 * Third argument specifies injected error. Injected sata packet faults
21170 * are the satapkt_reason values.
21171 * SATA_PKT_BUSY -1 Not completed, busy
21172 * SATA_PKT_DEV_ERROR 1 Device reported error
21173 * SATA_PKT_QUEUE_FULL 2 Not accepted, queue full
21174 * SATA_PKT_PORT_ERROR 3 Not completed, port error
21175 * SATA_PKT_CMD_UNSUPPORTED 4 Cmd unsupported
21176 * SATA_PKT_ABORTED 5 Aborted by request
21177 * SATA_PKT_TIMEOUT 6 Operation timeut
21178 * SATA_PKT_RESET 7 Aborted by reset request
21179 *
21180 * Additional global variables affecting the execution:
21181 *
21182 * sata_inject_fault_count variable specifies number of times in row the
21183 * error is injected. Value of -1 specifies permanent fault, ie. every time
21184 * the fault injection point is reached, the fault is injected and a pause
21185 * between fault injection specified by sata_inject_fault_pause_count is
21186 * ignored). Fault injection routine decrements sata_inject_fault_count
21187 * (if greater than zero) until it reaches 0. No fault is injected when
21188 * sata_inject_fault_count is 0 (zero).
21189 *
21190 * sata_inject_fault_pause_count variable specifies number of times a fault
21191 * injection is bypassed (pause between fault injections).
21192 * If set to 0, a fault is injected only a number of times specified by
21193 * sata_inject_fault_count.
21194 *
21195 * The fault counts are static, so for periodic errors they have to be manually
21196 * reset to start repetition sequence from scratch.
21197 * If the original value returned by the HBA tran_start function is not
21198 * SATA_TRAN_ACCEPTED and pkt reason is not SATA_PKT_COMPLETED, no error
21199 * is injected (to avoid masking real problems);
21200 *
21201 * NOTE: In its current incarnation, this function should be invoked only for
21202 * commands executed in SYNCHRONOUS mode.
21203 */
21204
21205
21206 static void
sata_inject_pkt_fault(sata_pkt_t * spkt,int * rval,int fault)21207 sata_inject_pkt_fault(sata_pkt_t *spkt, int *rval, int fault)
21208 {
21209
21210 if (sata_inject_fault != SATA_INJECT_PKT_FAULT)
21211 return;
21212
21213 if (sata_inject_fault_count == 0)
21214 return;
21215
21216 if (fault == 0)
21217 return;
21218
21219 if (sata_fault_cmd != spkt->satapkt_cmd.satacmd_cmd_reg)
21220 return;
21221
21222 if (sata_fault_ctrl != NULL) {
21223 sata_pkt_txlate_t *spx =
21224 (sata_pkt_txlate_t *)spkt->satapkt_framework_private;
21225
21226 if (sata_fault_ctrl != NULL && sata_fault_ctrl !=
21227 spx->txlt_sata_hba_inst->satahba_dip)
21228 return;
21229
21230 if (sata_fault_device.satadev_addr.cport !=
21231 spkt->satapkt_device.satadev_addr.cport ||
21232 sata_fault_device.satadev_addr.pmport !=
21233 spkt->satapkt_device.satadev_addr.pmport ||
21234 sata_fault_device.satadev_addr.qual !=
21235 spkt->satapkt_device.satadev_addr.qual)
21236 return;
21237 }
21238
21239 /* Modify pkt return parameters */
21240 if (*rval != SATA_TRAN_ACCEPTED ||
21241 spkt->satapkt_reason != SATA_PKT_COMPLETED) {
21242 sata_fault_count = 0;
21243 sata_fault_suspend_count = 0;
21244 return;
21245 }
21246 if (sata_fault_count == 0 && sata_fault_suspend_count != 0) {
21247 /* Pause in the injection */
21248 sata_fault_suspend_count -= 1;
21249 return;
21250 }
21251
21252 if (sata_fault_count == 0 && sata_fault_suspend_count == 0) {
21253 /*
21254 * Init inject fault cycle. If fault count is set to -1,
21255 * it is a permanent fault.
21256 */
21257 if (sata_inject_fault_count != -1) {
21258 sata_fault_count = sata_inject_fault_count;
21259 sata_fault_suspend_count =
21260 sata_inject_fault_pause_count;
21261 if (sata_fault_suspend_count == 0)
21262 sata_inject_fault_count = 0;
21263 }
21264 }
21265
21266 if (sata_fault_count != 0)
21267 sata_fault_count -= 1;
21268
21269 switch (fault) {
21270 case SATA_PKT_BUSY:
21271 *rval = SATA_TRAN_BUSY;
21272 spkt->satapkt_reason = SATA_PKT_BUSY;
21273 break;
21274
21275 case SATA_PKT_QUEUE_FULL:
21276 *rval = SATA_TRAN_QUEUE_FULL;
21277 spkt->satapkt_reason = SATA_PKT_QUEUE_FULL;
21278 break;
21279
21280 case SATA_PKT_CMD_UNSUPPORTED:
21281 *rval = SATA_TRAN_CMD_UNSUPPORTED;
21282 spkt->satapkt_reason = SATA_PKT_CMD_UNSUPPORTED;
21283 break;
21284
21285 case SATA_PKT_PORT_ERROR:
21286 /* This is "rejected" command */
21287 *rval = SATA_TRAN_PORT_ERROR;
21288 spkt->satapkt_reason = SATA_PKT_PORT_ERROR;
21289 /* Additional error setup could be done here - port state */
21290 break;
21291
21292 case SATA_PKT_DEV_ERROR:
21293 spkt->satapkt_reason = SATA_PKT_DEV_ERROR;
21294 /*
21295 * Additional error setup could be done here
21296 */
21297 break;
21298
21299 case SATA_PKT_ABORTED:
21300 spkt->satapkt_reason = SATA_PKT_ABORTED;
21301 break;
21302
21303 case SATA_PKT_TIMEOUT:
21304 spkt->satapkt_reason = SATA_PKT_TIMEOUT;
21305 /* Additional error setup could be done here */
21306 break;
21307
21308 case SATA_PKT_RESET:
21309 spkt->satapkt_reason = SATA_PKT_RESET;
21310 /*
21311 * Additional error setup could be done here - device reset
21312 */
21313 break;
21314
21315 default:
21316 break;
21317 }
21318 }
21319
21320 #endif
21321
21322 /*
21323 * SATA Trace Ring Buffer
21324 * ----------------------
21325 *
21326 * Overview
21327 *
21328 * The SATA trace ring buffer is a ring buffer created and managed by
21329 * the SATA framework module that can be used by any module or driver
21330 * within the SATA framework to store debug messages.
21331 *
21332 * Ring Buffer Interfaces:
21333 *
21334 * sata_vtrace_debug() <-- Adds debug message to ring buffer
21335 * sata_trace_debug() <-- Wraps varargs into sata_vtrace_debug()
21336 *
21337 * Note that the sata_trace_debug() interface was created to give
21338 * consumers the flexibilty of sending debug messages to ring buffer
21339 * as variable arguments. Consumers can send type va_list debug
21340 * messages directly to sata_vtrace_debug(). The sata_trace_debug()
21341 * and sata_vtrace_debug() relationship is similar to that of
21342 * cmn_err(9F) and vcmn_err(9F).
21343 *
21344 * Below is a diagram of the SATA trace ring buffer interfaces and
21345 * sample consumers:
21346 *
21347 * +---------------------------------+
21348 * | o o SATA Framework Module |
21349 * | o SATA o +------------------+ +------------------+
21350 * |o Trace o <--|sata_vtrace_debug/|<-----|SATA HBA Driver #1|
21351 * |o R-Buf o |sata_trace_debug |<--+ +------------------+
21352 * | o o +------------------+ | +------------------+
21353 * | o o ^ | +--|SATA HBA Driver #2|
21354 * | | | +------------------+
21355 * | +------------------+ |
21356 * | |SATA Debug Message| |
21357 * | +------------------+ |
21358 * +---------------------------------+
21359 *
21360 * Supporting Routines:
21361 *
21362 * sata_trace_rbuf_alloc() <-- Initializes ring buffer
21363 * sata_trace_rbuf_free() <-- Destroys ring buffer
21364 * sata_trace_dmsg_alloc() <-- Creates or reuses buffer in ring buffer
21365 * sata_trace_dmsg_free() <-- Destroys content of ring buffer
21366 *
21367 * The default SATA trace ring buffer size is defined by DMSG_RING_SIZE.
21368 * The ring buffer size can be adjusted by setting dmsg_ring_size in
21369 * /etc/system to desired size in unit of bytes.
21370 *
21371 * The individual debug message size in the ring buffer is restricted
21372 * to DMSG_BUF_SIZE.
21373 */
21374 void
sata_vtrace_debug(dev_info_t * dip,const char * fmt,va_list ap)21375 sata_vtrace_debug(dev_info_t *dip, const char *fmt, va_list ap)
21376 {
21377 sata_trace_dmsg_t *dmsg;
21378
21379 if (sata_debug_rbuf == NULL) {
21380 return;
21381 }
21382
21383 /*
21384 * If max size of ring buffer is smaller than size
21385 * required for one debug message then just return
21386 * since we have no room for the debug message.
21387 */
21388 if (sata_debug_rbuf->maxsize < (sizeof (sata_trace_dmsg_t))) {
21389 return;
21390 }
21391
21392 mutex_enter(&sata_debug_rbuf->lock);
21393
21394 /* alloc or reuse on ring buffer */
21395 dmsg = sata_trace_dmsg_alloc();
21396
21397 if (dmsg == NULL) {
21398 /* resource allocation failed */
21399 mutex_exit(&sata_debug_rbuf->lock);
21400 return;
21401 }
21402
21403 dmsg->dip = dip;
21404 gethrestime(&dmsg->timestamp);
21405
21406 (void) vsnprintf(dmsg->buf, sizeof (dmsg->buf), fmt, ap);
21407
21408 mutex_exit(&sata_debug_rbuf->lock);
21409 }
21410
21411 void
sata_trace_debug(dev_info_t * dip,const char * fmt,...)21412 sata_trace_debug(dev_info_t *dip, const char *fmt, ...)
21413 {
21414 va_list ap;
21415
21416 va_start(ap, fmt);
21417 sata_vtrace_debug(dip, fmt, ap);
21418 va_end(ap);
21419 }
21420
21421 /*
21422 * This routine is used to manage debug messages
21423 * on ring buffer.
21424 */
21425 static sata_trace_dmsg_t *
sata_trace_dmsg_alloc(void)21426 sata_trace_dmsg_alloc(void)
21427 {
21428 sata_trace_dmsg_t *dmsg_alloc, *dmsg = sata_debug_rbuf->dmsgp;
21429
21430 if (sata_debug_rbuf->looped == TRUE) {
21431 sata_debug_rbuf->dmsgp = dmsg->next;
21432 return (sata_debug_rbuf->dmsgp);
21433 }
21434
21435 /*
21436 * If we're looping for the first time,
21437 * connect the ring.
21438 */
21439 if (((sata_debug_rbuf->size + (sizeof (sata_trace_dmsg_t))) >
21440 sata_debug_rbuf->maxsize) && (sata_debug_rbuf->dmsgh != NULL)) {
21441 dmsg->next = sata_debug_rbuf->dmsgh;
21442 sata_debug_rbuf->dmsgp = sata_debug_rbuf->dmsgh;
21443 sata_debug_rbuf->looped = TRUE;
21444 return (sata_debug_rbuf->dmsgp);
21445 }
21446
21447 /* If we've gotten this far then memory allocation is needed */
21448 dmsg_alloc = kmem_zalloc(sizeof (sata_trace_dmsg_t), KM_NOSLEEP);
21449 if (dmsg_alloc == NULL) {
21450 sata_debug_rbuf->allocfailed++;
21451 return (dmsg_alloc);
21452 } else {
21453 sata_debug_rbuf->size += sizeof (sata_trace_dmsg_t);
21454 }
21455
21456 if (sata_debug_rbuf->dmsgp != NULL) {
21457 dmsg->next = dmsg_alloc;
21458 sata_debug_rbuf->dmsgp = dmsg->next;
21459 return (sata_debug_rbuf->dmsgp);
21460 } else {
21461 /*
21462 * We should only be here if we're initializing
21463 * the ring buffer.
21464 */
21465 if (sata_debug_rbuf->dmsgh == NULL) {
21466 sata_debug_rbuf->dmsgh = dmsg_alloc;
21467 } else {
21468 /* Something is wrong */
21469 kmem_free(dmsg_alloc, sizeof (sata_trace_dmsg_t));
21470 return (NULL);
21471 }
21472
21473 sata_debug_rbuf->dmsgp = dmsg_alloc;
21474 return (sata_debug_rbuf->dmsgp);
21475 }
21476 }
21477
21478
21479 /*
21480 * Free all messages on debug ring buffer.
21481 */
21482 static void
sata_trace_dmsg_free(void)21483 sata_trace_dmsg_free(void)
21484 {
21485 sata_trace_dmsg_t *dmsg_next, *dmsg = sata_debug_rbuf->dmsgh;
21486
21487 while (dmsg != NULL) {
21488 dmsg_next = dmsg->next;
21489 kmem_free(dmsg, sizeof (sata_trace_dmsg_t));
21490
21491 /*
21492 * If we've looped around the ring than we're done.
21493 */
21494 if (dmsg_next == sata_debug_rbuf->dmsgh) {
21495 break;
21496 } else {
21497 dmsg = dmsg_next;
21498 }
21499 }
21500 }
21501
21502
21503 /*
21504 * This function can block
21505 */
21506 static void
sata_trace_rbuf_alloc(void)21507 sata_trace_rbuf_alloc(void)
21508 {
21509 sata_debug_rbuf = kmem_zalloc(sizeof (sata_trace_rbuf_t), KM_SLEEP);
21510
21511 mutex_init(&sata_debug_rbuf->lock, NULL, MUTEX_DRIVER, NULL);
21512
21513 if (dmsg_ring_size > 0) {
21514 sata_debug_rbuf->maxsize = (size_t)dmsg_ring_size;
21515 }
21516 }
21517
21518
21519 static void
sata_trace_rbuf_free(void)21520 sata_trace_rbuf_free(void)
21521 {
21522 sata_trace_dmsg_free();
21523 mutex_destroy(&sata_debug_rbuf->lock);
21524 kmem_free(sata_debug_rbuf, sizeof (sata_trace_rbuf_t));
21525 }
21526
21527 #ifndef SATA_DEBUG
21528 /*
21529 * If SATA_DEBUG is not defined then this routine is called instead
21530 * of sata_log() via the SATA_LOG_D macro.
21531 */
21532 static void
sata_trace_log(sata_hba_inst_t * sata_hba_inst,uint_t level __unused,const char * fmt,...)21533 sata_trace_log(sata_hba_inst_t *sata_hba_inst, uint_t level __unused,
21534 const char *fmt, ...)
21535 {
21536 dev_info_t *dip = NULL;
21537 va_list ap;
21538
21539 if (sata_hba_inst != NULL) {
21540 dip = SATA_DIP(sata_hba_inst);
21541 }
21542
21543 va_start(ap, fmt);
21544 sata_vtrace_debug(dip, fmt, ap);
21545 va_end(ap);
21546 }
21547
21548 #endif /* SATA_DEBUG */
21549