1 /*
2 * CDDL HEADER START
3 *
4 * The contents of this file are subject to the terms of the
5 * Common Development and Distribution License (the "License").
6 * You may not use this file except in compliance with the License.
7 *
8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9 * or http://www.opensolaris.org/os/licensing.
10 * See the License for the specific language governing permissions
11 * and limitations under the License.
12 *
13 * When distributing Covered Code, include this CDDL HEADER in each
14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15 * If applicable, add the following below this CDDL HEADER, with the
16 * fields enclosed by brackets "[]" replaced with your own identifying
17 * information: Portions Copyright [yyyy] [name of copyright owner]
18 *
19 * CDDL HEADER END
20 */
21
22 /*
23 * Copyright (c) 2006, 2010, Oracle and/or its affiliates. All rights reserved.
24 */
25 /*
26 * Copyright 2017 Nexenta Systems, Inc. All rights reserved.
27 * Copyright 2016 Argo Technologies SA
28 * Copyright 2019 Joyent, Inc.
29 * Copyright 2024 RackTop Systems, Inc.
30 * Copyright 2023 Oxide Computer Company
31 * Copyright 2023 Jason King
32 */
33
34 /*
35 * SATA Framework
36 * Generic SATA Host Adapter Implementation
37 */
38
39 #include <sys/conf.h>
40 #include <sys/file.h>
41 #include <sys/ddi.h>
42 #include <sys/sunddi.h>
43 #include <sys/modctl.h>
44 #include <sys/cmn_err.h>
45 #include <sys/errno.h>
46 #include <sys/thread.h>
47 #include <sys/kstat.h>
48 #include <sys/note.h>
49 #include <sys/sysevent.h>
50 #include <sys/sysevent/eventdefs.h>
51 #include <sys/sysevent/dr.h>
52 #include <sys/taskq.h>
53 #include <sys/disp.h>
54 #include <sys/sdt.h>
55
56 #include <sys/sata/impl/sata.h>
57 #include <sys/sata/sata_hba.h>
58 #include <sys/sata/sata_defs.h>
59 #include <sys/sata/sata_cfgadm.h>
60 #include <sys/sata/sata_blacklist.h>
61 #include <sys/sata/sata_satl.h>
62
63 #include <sys/scsi/impl/spc3_types.h>
64
65 /*
66 * FMA header files
67 */
68 #include <sys/ddifm.h>
69 #include <sys/fm/protocol.h>
70 #include <sys/fm/util.h>
71 #include <sys/fm/io/ddi.h>
72
73 /* Debug flags - defined in sata.h */
74 int sata_debug_flags = 0;
75 int sata_msg = 0;
76
77 /*
78 * Flags enabling selected SATA HBA framework functionality
79 */
80 #define SATA_ENABLE_QUEUING 1
81 #define SATA_ENABLE_NCQ 2
82 #define SATA_ENABLE_PROCESS_EVENTS 4
83 #define SATA_ENABLE_PMULT_FBS 8 /* FIS-Based Switching */
84 int sata_func_enable =
85 SATA_ENABLE_PROCESS_EVENTS | SATA_ENABLE_QUEUING | SATA_ENABLE_NCQ;
86
87 /*
88 * Global variable setting default maximum queue depth (NCQ or TCQ)
89 * Note:minimum queue depth is 1
90 */
91 int sata_max_queue_depth = SATA_MAX_QUEUE_DEPTH; /* max NCQ/TCQ queue depth */
92
93 /*
94 * Currently used default NCQ/TCQ queue depth. It is set-up during the driver
95 * initialization, using value from sata_max_queue_depth
96 * It is adjusted to minimum supported by the controller and by the device,
97 * if queueing is enabled.
98 */
99 static int sata_current_max_qdepth;
100
101 /*
102 * Global variable determining the default behavior after device hotpluggin.
103 * If non-zero, the hotplugged device is onlined (if possible) without explicit
104 * IOCTL request (AP_CONFIGURE).
105 * If zero, hotplugged device is identified, but not onlined.
106 * Enabling (AP_CONNECT) device port with an attached device does not result
107 * in device onlining regardless of the flag setting
108 */
109 int sata_auto_online = 0;
110
111 #ifdef SATA_DEBUG
112
113 #define SATA_LOG_D(args) sata_log args
114 uint64_t mbuf_count = 0;
115 uint64_t mbuffail_count = 0;
116
117 sata_atapi_cmd_t sata_atapi_trace[64];
118 uint32_t sata_atapi_trace_index = 0;
119 int sata_atapi_trace_save = 1;
120 static void sata_save_atapi_trace(sata_pkt_txlate_t *, int);
121 #define SATAATAPITRACE(spx, count) \
122 if (sata_atapi_trace_save) \
123 sata_save_atapi_trace(spx, count)
124
125 #else
126 #define SATA_LOG_D(args) sata_trace_log args
127 #define SATAATAPITRACE(spx, count)
128 #endif
129
130 #if 0
131 static void
132 sata_test_atapi_packet_command(sata_hba_inst_t *, int);
133 #endif
134
135 #ifdef SATA_INJECT_FAULTS
136
137 #define SATA_INJECT_PKT_FAULT 1
138 uint32_t sata_inject_fault = 0;
139
140 uint32_t sata_inject_fault_count = 0;
141 uint32_t sata_inject_fault_pause_count = 0;
142 uint32_t sata_fault_type = 0;
143 uint32_t sata_fault_cmd = 0;
144 dev_info_t *sata_fault_ctrl = NULL;
145 sata_device_t sata_fault_device;
146
147 static void sata_inject_pkt_fault(sata_pkt_t *, int *, int);
148
149 #endif
150
151 #define LEGACY_HWID_LEN 64 /* Model (40) + Serial (20) + pad */
152
153 /*
154 * SATA cb_ops functions
155 */
156 static int sata_hba_open(dev_t *, int, int, cred_t *);
157 static int sata_hba_close(dev_t, int, int, cred_t *);
158 static int sata_hba_ioctl(dev_t, int, intptr_t, int, cred_t *, int *);
159
160 /*
161 * SCSA required entry points
162 */
163 static int sata_scsi_tgt_init(dev_info_t *, dev_info_t *,
164 scsi_hba_tran_t *, struct scsi_device *);
165 static int sata_scsi_tgt_probe(struct scsi_device *,
166 int (*callback)(void));
167 static void sata_scsi_tgt_free(dev_info_t *, dev_info_t *,
168 scsi_hba_tran_t *, struct scsi_device *);
169 static int sata_scsi_start(struct scsi_address *, struct scsi_pkt *);
170 static int sata_scsi_abort(struct scsi_address *, struct scsi_pkt *);
171 static int sata_scsi_reset(struct scsi_address *, int);
172 static int sata_scsi_getcap(struct scsi_address *, char *, int);
173 static int sata_scsi_setcap(struct scsi_address *, char *, int, int);
174 static struct scsi_pkt *sata_scsi_init_pkt(struct scsi_address *,
175 struct scsi_pkt *, struct buf *, int, int, int, int, int (*)(caddr_t),
176 caddr_t);
177 static void sata_scsi_destroy_pkt(struct scsi_address *, struct scsi_pkt *);
178 static void sata_scsi_dmafree(struct scsi_address *, struct scsi_pkt *);
179 static void sata_scsi_sync_pkt(struct scsi_address *, struct scsi_pkt *);
180
181 /*
182 * SATA HBA interface functions are defined in sata_hba.h header file
183 */
184
185 /* Event processing functions */
186 static void sata_event_daemon(void *);
187 static void sata_event_thread_control(int);
188 static void sata_process_controller_events(sata_hba_inst_t *sata_hba_inst);
189 static void sata_process_pmult_events(sata_hba_inst_t *, uint8_t);
190 static void sata_process_device_reset(sata_hba_inst_t *, sata_address_t *);
191 static void sata_process_pmdevice_reset(sata_hba_inst_t *, sata_address_t *);
192 static void sata_process_port_failed_event(sata_hba_inst_t *,
193 sata_address_t *);
194 static void sata_process_port_link_events(sata_hba_inst_t *,
195 sata_address_t *);
196 static void sata_process_pmport_link_events(sata_hba_inst_t *,
197 sata_address_t *);
198 static void sata_process_device_detached(sata_hba_inst_t *, sata_address_t *);
199 static void sata_process_pmdevice_detached(sata_hba_inst_t *,
200 sata_address_t *);
201 static void sata_process_device_attached(sata_hba_inst_t *, sata_address_t *);
202 static void sata_process_pmdevice_attached(sata_hba_inst_t *,
203 sata_address_t *);
204 static void sata_process_port_pwr_change(sata_hba_inst_t *, sata_address_t *);
205 static void sata_process_cntrl_pwr_level_change(sata_hba_inst_t *);
206 static void sata_process_target_node_cleanup(sata_hba_inst_t *,
207 sata_address_t *);
208 static void sata_process_device_autoonline(sata_hba_inst_t *,
209 sata_address_t *saddr);
210
211 /*
212 * Local translation functions
213 */
214 static int sata_txlt_inquiry(sata_pkt_txlate_t *);
215 static int sata_txlt_test_unit_ready(sata_pkt_txlate_t *);
216 static int sata_txlt_start_stop_unit(sata_pkt_txlate_t *);
217 static int sata_txlt_read_capacity(sata_pkt_txlate_t *);
218 static int sata_txlt_read_capacity16(sata_pkt_txlate_t *);
219 static int sata_txlt_unmap(sata_pkt_txlate_t *);
220 static boolean_t sata_txlt_unmap_supported(sata_pkt_txlate_t *,
221 sata_drive_info_t *);
222 static int sata_txlt_request_sense(sata_pkt_txlate_t *);
223 static int sata_txlt_read(sata_pkt_txlate_t *);
224 static int sata_txlt_write(sata_pkt_txlate_t *);
225 static int sata_txlt_log_sense(sata_pkt_txlate_t *);
226 static int sata_txlt_mode_sense(sata_pkt_txlate_t *);
227 static int sata_txlt_mode_select(sata_pkt_txlate_t *);
228 static int sata_txlt_ata_pass_thru(sata_pkt_txlate_t *);
229 static int sata_txlt_synchronize_cache(sata_pkt_txlate_t *);
230 static int sata_txlt_write_buffer(sata_pkt_txlate_t *);
231 static int sata_txlt_nodata_cmd_immediate(sata_pkt_txlate_t *);
232 static int sata_txlt_supported_ops(sata_pkt_txlate_t *);
233
234 static int sata_hba_start(sata_pkt_txlate_t *, int *);
235 static int sata_txlt_invalid_command(sata_pkt_txlate_t *);
236 static int sata_txlt_check_condition(sata_pkt_txlate_t *, uchar_t, uchar_t);
237 static int sata_txlt_lba_out_of_range(sata_pkt_txlate_t *);
238 static int sata_txlt_ata_pass_thru_illegal_cmd(sata_pkt_txlate_t *);
239 static int sata_txlt_unmap_nodata_cmd(sata_pkt_txlate_t *);
240 static void sata_txlt_rw_completion(sata_pkt_t *);
241 static void sata_txlt_nodata_cmd_completion(sata_pkt_t *);
242 static void sata_txlt_apt_completion(sata_pkt_t *sata_pkt);
243 static void sata_txlt_unmap_completion(sata_pkt_t *sata_pkt);
244 static int sata_emul_rw_completion(sata_pkt_txlate_t *);
245 static void sata_fill_ata_return_desc(sata_pkt_t *, uint8_t, uint8_t,
246 uint8_t);
247 static struct scsi_extended_sense *sata_arq_sense(sata_pkt_txlate_t *);
248
249 static int sata_txlt_atapi(sata_pkt_txlate_t *);
250 static void sata_txlt_atapi_completion(sata_pkt_t *);
251
252 /*
253 * Local functions for ioctl
254 */
255 static int32_t sata_get_port_num(sata_hba_inst_t *, struct devctl_iocdata *);
256 static void sata_cfgadm_state(sata_hba_inst_t *, int32_t,
257 devctl_ap_state_t *);
258 static dev_info_t *sata_get_target_dip(dev_info_t *, uint8_t, uint8_t);
259 static dev_info_t *sata_get_scsi_target_dip(dev_info_t *, sata_address_t *);
260 static dev_info_t *sata_devt_to_devinfo(dev_t);
261 static int sata_ioctl_connect(sata_hba_inst_t *, sata_device_t *);
262 static int sata_ioctl_disconnect(sata_hba_inst_t *, sata_device_t *);
263 static int sata_ioctl_configure(sata_hba_inst_t *, sata_device_t *);
264 static int sata_ioctl_unconfigure(sata_hba_inst_t *, sata_device_t *);
265 static int sata_ioctl_activate(sata_hba_inst_t *, sata_device_t *);
266 static int sata_ioctl_deactivate(sata_hba_inst_t *, sata_device_t *);
267 static int sata_ioctl_reset_port(sata_hba_inst_t *, sata_device_t *);
268 static int sata_ioctl_reset_device(sata_hba_inst_t *, sata_device_t *);
269 static int sata_ioctl_reset_all(sata_hba_inst_t *);
270 static int sata_ioctl_port_self_test(sata_hba_inst_t *, sata_device_t *);
271 static int sata_ioctl_get_device_path(sata_hba_inst_t *, sata_device_t *,
272 sata_ioctl_data_t *, int mode);
273 static int sata_ioctl_get_ap_type(sata_hba_inst_t *, sata_device_t *,
274 sata_ioctl_data_t *, int mode);
275 static int sata_ioctl_get_model_info(sata_hba_inst_t *, sata_device_t *,
276 sata_ioctl_data_t *, int mode);
277 static int sata_ioctl_get_revfirmware_info(sata_hba_inst_t *, sata_device_t *,
278 sata_ioctl_data_t *, int mode);
279 static int sata_ioctl_get_serialnumber_info(sata_hba_inst_t *,
280 sata_device_t *, sata_ioctl_data_t *, int mode);
281
282 /*
283 * Local functions
284 */
285 static void sata_remove_hba_instance(dev_info_t *);
286 static int sata_validate_sata_hba_tran(dev_info_t *, sata_hba_tran_t *);
287 static void sata_probe_ports(sata_hba_inst_t *);
288 static void sata_probe_pmports(sata_hba_inst_t *, uint8_t);
289 static int sata_reprobe_port(sata_hba_inst_t *, sata_device_t *, int);
290 static int sata_reprobe_pmult(sata_hba_inst_t *, sata_device_t *, int);
291 static int sata_reprobe_pmport(sata_hba_inst_t *, sata_device_t *, int);
292 static int sata_alloc_pmult(sata_hba_inst_t *, sata_device_t *);
293 static void sata_free_pmult(sata_hba_inst_t *, sata_device_t *);
294 static int sata_add_device(dev_info_t *, sata_hba_inst_t *, sata_device_t *);
295 static int sata_offline_device(sata_hba_inst_t *, sata_device_t *,
296 sata_drive_info_t *);
297 static dev_info_t *sata_create_target_node(dev_info_t *, sata_hba_inst_t *,
298 sata_address_t *);
299 static void sata_remove_target_node(sata_hba_inst_t *,
300 sata_address_t *);
301 static int sata_validate_scsi_address(sata_hba_inst_t *,
302 struct scsi_address *, sata_device_t *);
303 static int sata_validate_sata_address(sata_hba_inst_t *, int, int, int);
304 static sata_pkt_t *sata_pkt_alloc(sata_pkt_txlate_t *, int (*)(caddr_t));
305 static void sata_pkt_free(sata_pkt_txlate_t *);
306 static int sata_dma_buf_setup(sata_pkt_txlate_t *, int, int (*)(caddr_t),
307 caddr_t, ddi_dma_attr_t *);
308 static void sata_common_free_dma_rsrcs(sata_pkt_txlate_t *);
309 static int sata_probe_device(sata_hba_inst_t *, sata_device_t *);
310 static sata_drive_info_t *sata_get_device_info(sata_hba_inst_t *,
311 sata_device_t *);
312 static int sata_identify_device(sata_hba_inst_t *, sata_drive_info_t *);
313 static void sata_reidentify_device(sata_pkt_txlate_t *);
314 static struct buf *sata_alloc_local_buffer(sata_pkt_txlate_t *, size_t);
315 static void sata_free_local_buffer(sata_pkt_txlate_t *);
316 static uint64_t sata_check_capacity(sata_drive_info_t *);
317 void sata_adjust_dma_attr(sata_drive_info_t *, ddi_dma_attr_t *,
318 ddi_dma_attr_t *);
319 static int sata_fetch_device_identify_data(sata_hba_inst_t *,
320 sata_drive_info_t *);
321 static void sata_update_port_info(sata_hba_inst_t *, sata_device_t *);
322 static void sata_update_pmport_info(sata_hba_inst_t *, sata_device_t *);
323 static int sata_set_dma_mode(sata_hba_inst_t *, sata_drive_info_t *);
324 static int sata_set_cache_mode(sata_hba_inst_t *, sata_drive_info_t *, int);
325 static int sata_set_rmsn(sata_hba_inst_t *, sata_drive_info_t *, int);
326 static int sata_set_drive_features(sata_hba_inst_t *,
327 sata_drive_info_t *, int flag);
328 static void sata_init_write_cache_mode(sata_drive_info_t *sdinfo);
329 static int sata_initialize_device(sata_hba_inst_t *, sata_drive_info_t *);
330 static void sata_identdev_to_inquiry(sata_hba_inst_t *, sata_drive_info_t *,
331 uint8_t *);
332 static int sata_get_atapi_inquiry_data(sata_hba_inst_t *, sata_address_t *,
333 struct scsi_inquiry *);
334 static int sata_build_msense_page_1(sata_drive_info_t *, int, uint8_t *);
335 static int sata_build_msense_page_8(sata_drive_info_t *, int, uint8_t *);
336 static int sata_build_msense_page_1a(sata_drive_info_t *, int, uint8_t *);
337 static int sata_build_msense_page_1c(sata_drive_info_t *, int, uint8_t *);
338 static int sata_build_msense_page_30(sata_drive_info_t *, int, uint8_t *);
339 static int sata_mode_select_page_8(sata_pkt_txlate_t *,
340 struct mode_cache_scsi3 *, int, int *, int *, int *);
341 static int sata_mode_select_page_1a(sata_pkt_txlate_t *,
342 struct mode_info_power_cond *, int, int *, int *, int *);
343 static int sata_mode_select_page_1c(sata_pkt_txlate_t *,
344 struct mode_info_excpt_page *, int, int *, int *, int *);
345 static int sata_mode_select_page_30(sata_pkt_txlate_t *,
346 struct mode_acoustic_management *, int, int *, int *, int *);
347
348 static int sata_build_lsense_page_0(sata_drive_info_t *, uint8_t *);
349 static int sata_build_lsense_page_03(sata_drive_info_t *, uint8_t *,
350 sata_hba_inst_t *);
351 static int sata_build_lsense_page_0d(sata_drive_info_t *, uint8_t *,
352 sata_hba_inst_t *);
353 static int sata_build_lsense_page_0e(sata_drive_info_t *, uint8_t *,
354 sata_pkt_txlate_t *);
355 static int sata_build_lsense_page_10(sata_drive_info_t *, uint8_t *,
356 sata_hba_inst_t *);
357 static int sata_build_lsense_page_11(sata_drive_info_t *, uint8_t *,
358 sata_hba_inst_t *);
359 static int sata_build_lsense_page_19(sata_drive_info_t *, uint8_t *,
360 sata_hba_inst_t *);
361 static int sata_build_lsense_page_2f(sata_drive_info_t *, uint8_t *,
362 sata_hba_inst_t *);
363 static int sata_build_lsense_page_30(sata_drive_info_t *, uint8_t *,
364 sata_hba_inst_t *);
365
366 static void sata_set_arq_data(sata_pkt_t *);
367 static void sata_build_read_verify_cmd(sata_cmd_t *, uint16_t, uint64_t);
368 static void sata_build_generic_cmd(sata_cmd_t *, uint8_t);
369 static uint8_t sata_get_standby_timer(uint8_t *timer);
370
371 static void sata_save_drive_settings(sata_drive_info_t *);
372 static void sata_show_drive_info(sata_hba_inst_t *, sata_drive_info_t *);
373 static void sata_show_pmult_info(sata_hba_inst_t *, sata_device_t *);
374 static void sata_log(sata_hba_inst_t *, uint_t, char *fmt, ...);
375 #ifndef SATA_DEBUG
376 static void sata_trace_log(sata_hba_inst_t *, uint_t, const char *fmt, ...);
377 #endif
378 static int sata_fetch_smart_return_status(sata_hba_inst_t *,
379 sata_drive_info_t *);
380 static int sata_fetch_smart_data(sata_hba_inst_t *, sata_drive_info_t *,
381 struct smart_data *);
382 static int sata_smart_selftest_log(sata_hba_inst_t *,
383 sata_drive_info_t *,
384 struct smart_selftest_log *);
385 static int sata_ext_smart_selftest_read_log(sata_hba_inst_t *,
386 sata_drive_info_t *, struct smart_ext_selftest_log *, uint16_t);
387 static int sata_read_log_ext(sata_hba_inst_t *, sata_drive_info_t *, uint8_t,
388 uint16_t, void *, uint16_t);
389 static int sata_smart_read_log(sata_hba_inst_t *, sata_drive_info_t *,
390 uint8_t *, uint8_t, uint8_t);
391 static int sata_read_log_ext_directory(sata_hba_inst_t *, sata_drive_info_t *,
392 struct read_log_ext_directory *);
393 static void sata_gen_sysevent(sata_hba_inst_t *, sata_address_t *, int);
394 static void sata_xlate_errors(sata_pkt_txlate_t *);
395 static void sata_decode_device_error(sata_pkt_txlate_t *,
396 struct scsi_extended_sense *);
397 static void sata_set_device_removed(dev_info_t *);
398 static boolean_t sata_check_device_removed(dev_info_t *);
399 static void sata_set_target_node_cleanup(sata_hba_inst_t *, sata_address_t *);
400 static int sata_ncq_err_ret_cmd_setup(sata_pkt_txlate_t *,
401 sata_drive_info_t *);
402 static int sata_atapi_err_ret_cmd_setup(sata_pkt_txlate_t *,
403 sata_drive_info_t *);
404 static void sata_atapi_packet_cmd_setup(sata_cmd_t *, sata_drive_info_t *);
405 static void sata_fixed_sense_data_preset(struct scsi_extended_sense *);
406 static void sata_target_devid_register(dev_info_t *, sata_drive_info_t *);
407 static int sata_check_modser(char *, int);
408
409 /*
410 * FMA
411 */
412 static boolean_t sata_check_for_dma_error(dev_info_t *, sata_pkt_txlate_t *);
413
414
415 /*
416 * SATA Framework will ignore SATA HBA driver cb_ops structure and
417 * register following one with SCSA framework.
418 * Open & close are provided, so scsi framework will not use its own
419 */
420 static struct cb_ops sata_cb_ops = {
421 sata_hba_open, /* open */
422 sata_hba_close, /* close */
423 nodev, /* strategy */
424 nodev, /* print */
425 nodev, /* dump */
426 nodev, /* read */
427 nodev, /* write */
428 sata_hba_ioctl, /* ioctl */
429 nodev, /* devmap */
430 nodev, /* mmap */
431 nodev, /* segmap */
432 nochpoll, /* chpoll */
433 ddi_prop_op, /* cb_prop_op */
434 0, /* streamtab */
435 D_NEW | D_MP, /* cb_flag */
436 CB_REV, /* rev */
437 nodev, /* aread */
438 nodev /* awrite */
439 };
440
441
442 extern struct mod_ops mod_miscops;
443 extern uchar_t scsi_cdb_size[];
444
445 static struct modlmisc modlmisc = {
446 &mod_miscops, /* Type of module */
447 "SATA Module" /* module name */
448 };
449
450
451 static struct modlinkage modlinkage = {
452 MODREV_1,
453 (void *)&modlmisc,
454 NULL
455 };
456
457 /*
458 * Default sata pkt timeout. Used when a target driver scsi_pkt time is zero,
459 * i.e. when scsi_pkt has not timeout specified.
460 */
461 static int sata_default_pkt_time = 60; /* 60 seconds */
462
463 /*
464 * Intermediate buffer device access attributes - they are required,
465 * but not necessarily used.
466 */
467 static ddi_device_acc_attr_t sata_acc_attr = {
468 DDI_DEVICE_ATTR_V0,
469 DDI_STRUCTURE_LE_ACC,
470 DDI_STRICTORDER_ACC
471 };
472
473
474 /*
475 * Mutexes protecting structures in multithreaded operations.
476 * Because events are relatively rare, a single global mutex protecting
477 * data structures should be sufficient. To increase performance, add
478 * separate mutex per each sata port and use global mutex only to protect
479 * common data structures.
480 */
481 static kmutex_t sata_mutex; /* protects sata_hba_list */
482 static kmutex_t sata_log_mutex; /* protects log */
483
484 static char sata_log_buf[256];
485
486 /*
487 * sata trace debug
488 */
489 static sata_trace_rbuf_t *sata_debug_rbuf;
490 static sata_trace_dmsg_t *sata_trace_dmsg_alloc(void);
491 static void sata_trace_dmsg_free(void);
492 static void sata_trace_rbuf_alloc(void);
493 static void sata_trace_rbuf_free(void);
494
495 int dmsg_ring_size = DMSG_RING_SIZE;
496
497 /* Default write cache setting for SATA hard disks */
498 int sata_write_cache = 1; /* enabled */
499
500 /* Default write cache setting for SATA ATAPI CD/DVD */
501 int sata_atapicdvd_write_cache = 1; /* enabled */
502
503 /* Default write cache setting for SATA ATAPI tape */
504 int sata_atapitape_write_cache = 1; /* enabled */
505
506 /* Default write cache setting for SATA ATAPI disk */
507 int sata_atapidisk_write_cache = 1; /* enabled */
508
509 /*
510 * Linked list of HBA instances
511 */
512 static sata_hba_inst_t *sata_hba_list = NULL;
513 static sata_hba_inst_t *sata_hba_list_tail = NULL;
514 /*
515 * Pointer to per-instance SATA HBA soft structure is stored in sata_hba_tran
516 * structure and in sata soft state.
517 */
518
519 /*
520 * Event daemon related variables
521 */
522 static kmutex_t sata_event_mutex;
523 static kcondvar_t sata_event_cv;
524 static kthread_t *sata_event_thread = NULL;
525 static int sata_event_thread_terminate = 0;
526 static int sata_event_pending = 0;
527 static int sata_event_thread_active = 0;
528 extern pri_t minclsyspri;
529
530 /*
531 * NCQ error recovery command
532 */
533 static const sata_cmd_t sata_rle_cmd = {
534 SATA_CMD_REV,
535 NULL,
536 {
537 SATA_DIR_READ
538 },
539 ATA_ADDR_LBA48,
540 0,
541 0,
542 0,
543 0,
544 0,
545 1,
546 READ_LOG_EXT_NCQ_ERROR_RECOVERY,
547 0,
548 0,
549 0,
550 SATAC_READ_LOG_EXT,
551 0,
552 0,
553 0,
554 };
555
556 /*
557 * ATAPI error recovery CDB
558 */
559 static const uint8_t sata_rqsense_cdb[SATA_ATAPI_RQSENSE_CDB_LEN] = {
560 SCMD_REQUEST_SENSE,
561 0, /* Only fixed RQ format is supported */
562 0,
563 0,
564 SATA_ATAPI_MIN_RQSENSE_LEN, /* Less data may be returned */
565 0
566 };
567
568
569 /* Warlock directives */
570
571 _NOTE(SCHEME_PROTECTS_DATA("No Mutex Needed", scsi_hba_tran))
572 _NOTE(SCHEME_PROTECTS_DATA("No Mutex Needed", scsi_device))
573 _NOTE(SCHEME_PROTECTS_DATA("No Mutex Needed", dev_ops))
574 _NOTE(SCHEME_PROTECTS_DATA("No Mutex Needed", scsi_extended_sense))
575 _NOTE(SCHEME_PROTECTS_DATA("No Mutex Needed", scsi_arq_status))
576 _NOTE(SCHEME_PROTECTS_DATA("No Mutex Needed", ddi_dma_attr))
577 _NOTE(SCHEME_PROTECTS_DATA("No Mutex Needed", ddi_dma_cookie_t))
578 _NOTE(SCHEME_PROTECTS_DATA("No Mutex Needed", devctl_ap_state))
579 _NOTE(SCHEME_PROTECTS_DATA("No Mutex Needed", dev_info::devi_state))
580 _NOTE(MUTEX_PROTECTS_DATA(sata_mutex, sata_hba_list))
581 _NOTE(DATA_READABLE_WITHOUT_LOCK(sata_hba_list))
582 _NOTE(MUTEX_PROTECTS_DATA(sata_mutex, sata_hba_inst::satahba_next))
583 _NOTE(MUTEX_PROTECTS_DATA(sata_mutex, sata_hba_inst::satahba_prev))
584 _NOTE(SCHEME_PROTECTS_DATA("No Mutex Needed", \
585 sata_hba_inst::satahba_scsi_tran))
586 _NOTE(SCHEME_PROTECTS_DATA("No Mutex Needed", sata_hba_inst::satahba_tran))
587 _NOTE(SCHEME_PROTECTS_DATA("No Mutex Needed", sata_hba_inst::satahba_dip))
588 _NOTE(SCHEME_PROTECTS_DATA("Scheme", sata_hba_inst::satahba_attached))
589 _NOTE(DATA_READABLE_WITHOUT_LOCK(sata_hba_inst::satahba_dev_port))
590 _NOTE(MUTEX_PROTECTS_DATA(sata_hba_inst::satahba_mutex,
591 sata_hba_inst::satahba_event_flags))
592 _NOTE(MUTEX_PROTECTS_DATA(sata_cport_info::cport_mutex, \
593 sata_cport_info::cport_devp))
594 _NOTE(DATA_READABLE_WITHOUT_LOCK(sata_cport_info::cport_devp))
595 _NOTE(SCHEME_PROTECTS_DATA("Scheme", sata_cport_info::cport_addr))
596 _NOTE(MUTEX_PROTECTS_DATA(sata_cport_info::cport_mutex, \
597 sata_cport_info::cport_dev_type))
598 _NOTE(DATA_READABLE_WITHOUT_LOCK(sata_cport_info::cport_dev_type))
599 _NOTE(MUTEX_PROTECTS_DATA(sata_cport_info::cport_mutex, \
600 sata_cport_info::cport_state))
601 _NOTE(DATA_READABLE_WITHOUT_LOCK(sata_cport_info::cport_state))
602 _NOTE(MUTEX_PROTECTS_DATA(sata_pmport_info::pmport_mutex, \
603 sata_pmport_info::pmport_state))
604 _NOTE(DATA_READABLE_WITHOUT_LOCK(sata_pmport_info::pmport_state))
605 _NOTE(MUTEX_PROTECTS_DATA(sata_pmport_info::pmport_mutex, \
606 sata_pmport_info::pmport_dev_type))
607 _NOTE(DATA_READABLE_WITHOUT_LOCK(sata_pmport_info::pmport_dev_type))
608 _NOTE(MUTEX_PROTECTS_DATA(sata_pmport_info::pmport_mutex, \
609 sata_pmport_info::pmport_sata_drive))
610 _NOTE(MUTEX_PROTECTS_DATA(sata_pmport_info::pmport_mutex, \
611 sata_pmport_info::pmport_tgtnode_clean))
612 _NOTE(MUTEX_PROTECTS_DATA(sata_pmport_info::pmport_mutex, \
613 sata_pmport_info::pmport_event_flags))
614 _NOTE(DATA_READABLE_WITHOUT_LOCK(sata_pmport_info::pmport_sata_drive))
615 _NOTE(DATA_READABLE_WITHOUT_LOCK(sata_pmult_info::pmult_dev_port))
616 _NOTE(DATA_READABLE_WITHOUT_LOCK(sata_pmult_info::pmult_num_dev_ports))
617 #ifdef SATA_DEBUG
618 _NOTE(SCHEME_PROTECTS_DATA("No Mutex Needed", mbuf_count))
619 _NOTE(SCHEME_PROTECTS_DATA("No Mutex Needed", mbuffail_count))
620 _NOTE(SCHEME_PROTECTS_DATA("No Mutex Needed", sata_atapi_trace))
621 _NOTE(SCHEME_PROTECTS_DATA("No Mutex Needed", sata_atapi_trace_index))
622 #endif
623
624 /* End of warlock directives */
625
626 /*
627 * A number of SCSI commands (e.g. LOG SENSE, READ CAPACITY (16),
628 * REPORT SUPPORTED OPERATION CODES) take a parameter 'ALLOCATION LENGTH' as a
629 * parameter, and then return up to ALLOCATION LENGTH bytes of the response
630 * while still reporting the total amount of data available. In other words,
631 * the commands return the total amount of data available, but truncate what
632 * is sent to ALLOCATION LENGTH bytes if this amount is smaller.
633 *
634 * To simplify translating such commands, we define a number of helper
635 * functions that allow us to write to struct buf->b_un.b_addr safely while
636 * tracking the total length of the output. Basically, these will stop
637 * writing out bytes once we've reached our limit (either due to the size of
638 * struct buf->b_bcount or capped by the ALLOCATION LENGTH parameter) while
639 * still tracking the total number of bytes we want to write out for the
640 * complete response.
641 *
642 * Currently these are just used with the REPORT SUPPORTED OPERATION CODES op.
643 * In the future, other commands could be modified to use these to simplify
644 * their implementation (with the side benefit of often avoiding additional
645 * allocations).
646 */
647 struct sata_txlt_buf {
648 uint8_t *stb_ptr; /* Start of the buffer */
649 uint32_t stb_idx; /* Current index/# bytes we want to write */
650 uint32_t stb_len; /* Max # of bytes to actually write */
651 };
652
653 static inline void
sbuf_init(struct sata_txlt_buf * sbuf,struct buf * bp,uint32_t alc_len)654 sbuf_init(struct sata_txlt_buf *sbuf, struct buf *bp, uint32_t alc_len)
655 {
656 sbuf->stb_ptr = (uint8_t *)bp->b_un.b_addr;
657 sbuf->stb_idx = 0;
658 sbuf->stb_len = MIN(bp->b_bcount, alc_len);
659 }
660
661 static inline void
sbuf_put8(struct sata_txlt_buf * sb,uint8_t val)662 sbuf_put8(struct sata_txlt_buf *sb, uint8_t val)
663 {
664 if (sb->stb_idx >= sb->stb_len) {
665 sb->stb_idx++;
666 return;
667 }
668
669 sb->stb_ptr[sb->stb_idx++] = val;
670 }
671
672 static inline void
sbuf_put16(struct sata_txlt_buf * sb,uint16_t val)673 sbuf_put16(struct sata_txlt_buf *sb, uint16_t val)
674 {
675 sbuf_put8(sb, val >> 8);
676 sbuf_put8(sb, val & 0xff);
677 }
678
679 static inline void
sbuf_put32(struct sata_txlt_buf * sb,uint32_t val)680 sbuf_put32(struct sata_txlt_buf *sb, uint32_t val)
681 {
682 sbuf_put8(sb, val >> 24);
683 sbuf_put8(sb, (val >> 16) & 0xff);
684 sbuf_put8(sb, (val >> 8) & 0xff);
685 sbuf_put8(sb, val & 0xff);
686 }
687
688 static inline void
sbuf_copy(struct sata_txlt_buf * sb,const void * src,size_t len)689 sbuf_copy(struct sata_txlt_buf *sb, const void *src, size_t len)
690 {
691 ssize_t max = sb->stb_len - sb->stb_idx;
692
693 if (len == 0)
694 return;
695
696 if (max <= 0) {
697 sb->stb_idx += len;
698 return;
699 }
700
701 size_t amt = MIN(max, len);
702
703 ASSERT3U(sb->stb_idx + amt, <=, sb->stb_len);
704
705 bcopy(src, sb->stb_ptr + sb->stb_idx, amt);
706 sb->stb_idx += len;
707 }
708
709 /*
710 * Set the length field at 'offset' in the buffer to the total amount
711 * of data that we want to write minus 'adj' bytes.
712 * llen is the size (in bytes) of the field.
713 */
714 static inline void
sbuf_set_len(struct sata_txlt_buf * sb,uint32_t offset,uint32_t llen,uint32_t adj)715 sbuf_set_len(struct sata_txlt_buf *sb, uint32_t offset, uint32_t llen,
716 uint32_t adj)
717 {
718 /*
719 * Because we have to worry about pathological cases (where the
720 * length field is truncated, we have to be a bit more cautious
721 * (and thus complicated).
722 *
723 * We start with the MSB of the size (based on llen) and use that
724 * to determine how many bits of stb->stb_idx we need to shift
725 * right, and then (space permitting) write out the byte, then
726 * continue on until we've either reached the end of the buf, or
727 * have written out the entire length.
728 */
729 uint_t shift = (llen - 1) * NBBY;
730 uint64_t val = sb->stb_idx - adj;
731
732 ASSERT3U(adj, <=, sb->stb_idx);
733 ASSERT3U(llen, >, 0);
734
735 for (uint_t i = 0; i < llen; i++) {
736 if (offset >= sb->stb_len)
737 return;
738 sb->stb_ptr[offset++] = (val >> shift) & 0xff;
739 shift -= NBBY;
740 }
741 }
742
743 static inline size_t
sbuf_resid(const struct sata_txlt_buf * sb,const struct buf * bp,int32_t alc_len)744 sbuf_resid(const struct sata_txlt_buf *sb, const struct buf *bp,
745 int32_t alc_len)
746 {
747 /*
748 * There's a bit of sublety here. We have two different potential
749 * constraints on the actual amount of data that's ultimately
750 * return to the higher layers of the stack. The first is the value
751 * of the ALLOCATION LENGTH parameter in the CDB (alc_len). The
752 * second is the size of bp (bp->b_bcount).
753 *
754 * The resid value is defined as 'the amount of data not transferred'.
755 * The question then is 'relative to what?'. The most sensical choice
756 * here is 'relative to the size of bp'. This is because as far as
757 * processing the CDB, the ALLOCATION LENGTH is (for any SCSI device)
758 * the maximum amount of data the device will return. It is expected
759 * that the issuer of the CDB will retry (if necessary) with a larger
760 * ALLOCATION LENGTH if the initial value is too small. In other words,
761 * truncation due to ALLOCATION LENGTH is something that should be
762 * dealt with at a higher layer (e.g. sd driver, uscsi caller, etc),
763 * so the resid should reflect truncation due to our internal buffers
764 * being too small.
765 */
766 const size_t expected = MIN(alc_len, sb->stb_idx);
767 const size_t written = MIN(bp->b_bcount, sb->stb_idx);
768
769 ASSERT3U(written, <=, expected);
770
771 return ((written <= expected) ? 0 : expected - written);
772 }
773
774 /* ************** loadable module configuration functions ************** */
775
776 int
_init()777 _init()
778 {
779 int rval;
780
781 mutex_init(&sata_mutex, NULL, MUTEX_DRIVER, NULL);
782 mutex_init(&sata_event_mutex, NULL, MUTEX_DRIVER, NULL);
783 mutex_init(&sata_log_mutex, NULL, MUTEX_DRIVER, NULL);
784 cv_init(&sata_event_cv, NULL, CV_DRIVER, NULL);
785 sata_trace_rbuf_alloc();
786 if ((rval = mod_install(&modlinkage)) != 0) {
787 #ifdef SATA_DEBUG
788 cmn_err(CE_WARN, "sata: _init: mod_install failed\n");
789 #endif
790 sata_trace_rbuf_free();
791 mutex_destroy(&sata_log_mutex);
792 cv_destroy(&sata_event_cv);
793 mutex_destroy(&sata_event_mutex);
794 mutex_destroy(&sata_mutex);
795 }
796 return (rval);
797 }
798
799 int
_fini()800 _fini()
801 {
802 int rval;
803
804 if ((rval = mod_remove(&modlinkage)) != 0)
805 return (rval);
806
807 sata_trace_rbuf_free();
808 mutex_destroy(&sata_log_mutex);
809 cv_destroy(&sata_event_cv);
810 mutex_destroy(&sata_event_mutex);
811 mutex_destroy(&sata_mutex);
812 return (rval);
813 }
814
815 int
_info(struct modinfo * modinfop)816 _info(struct modinfo *modinfop)
817 {
818 return (mod_info(&modlinkage, modinfop));
819 }
820
821
822
823 /* ********************* SATA HBA entry points ********************* */
824
825
826 /*
827 * Called by SATA HBA from _init().
828 * Registers HBA driver instance/sata framework pair with scsi framework, by
829 * calling scsi_hba_init().
830 *
831 * SATA HBA driver cb_ops are ignored - SATA HBA framework cb_ops are used
832 * instead. SATA HBA framework cb_ops pointer overwrites SATA HBA driver
833 * cb_ops pointer in SATA HBA driver dev_ops structure.
834 * SATA HBA framework cb_ops supplies cb_open cb_close and cb_ioctl vectors.
835 *
836 * Return status of the scsi_hba_init() is returned to a calling SATA HBA
837 * driver.
838 */
839 int
sata_hba_init(struct modlinkage * modlp)840 sata_hba_init(struct modlinkage *modlp)
841 {
842 int rval;
843 struct dev_ops *hba_ops;
844
845 SATADBG1(SATA_DBG_HBA_IF, NULL,
846 "sata_hba_init: name %s \n",
847 ((struct modldrv *)(modlp->ml_linkage[0]))->drv_linkinfo);
848 /*
849 * Fill-up cb_ops and dev_ops when necessary
850 */
851 hba_ops = ((struct modldrv *)(modlp->ml_linkage[0]))->drv_dev_ops;
852 /*
853 * Provide pointer to SATA dev_ops
854 */
855 hba_ops->devo_cb_ops = &sata_cb_ops;
856
857 /*
858 * Register SATA HBA with SCSI framework
859 */
860 if ((rval = scsi_hba_init(modlp)) != 0) {
861 SATADBG1(SATA_DBG_HBA_IF, NULL,
862 "sata_hba_init: scsi hba init failed\n", NULL);
863 return (rval);
864 }
865
866 return (0);
867 }
868
869
870 /* HBA attach stages */
871 #define HBA_ATTACH_STAGE_SATA_HBA_INST 1
872 #define HBA_ATTACH_STAGE_SCSI_ATTACHED 2
873 #define HBA_ATTACH_STAGE_SETUP 4
874 #define HBA_ATTACH_STAGE_LINKED 8
875
876
877 /*
878 *
879 * Called from SATA HBA driver's attach routine to attach an instance of
880 * the HBA.
881 *
882 * For DDI_ATTACH command:
883 * sata_hba_inst structure is allocated here and initialized with pointers to
884 * SATA framework implementation of required scsi tran functions.
885 * The scsi_tran's tran_hba_private field is used by SATA Framework to point
886 * to the soft structure (sata_hba_inst) allocated by SATA framework for
887 * SATA HBA instance related data.
888 * The scsi_tran's tran_hba_private field is used by SATA framework to
889 * store a pointer to per-HBA-instance of sata_hba_inst structure.
890 * The sata_hba_inst structure is cross-linked to scsi tran structure.
891 * Among other info, a pointer to sata_hba_tran structure is stored in
892 * sata_hba_inst. The sata_hba_inst structures for different HBA instances are
893 * linked together into the list, pointed to by sata_hba_list.
894 * On the first HBA instance attach the sata event thread is initialized.
895 * Attachment points are created for all SATA ports of the HBA being attached.
896 * All HBA instance's SATA ports are probed and type of plugged devices is
897 * determined. For each device of a supported type, a target node is created.
898 *
899 * DDI_SUCCESS is returned when attachment process is successful,
900 * DDI_FAILURE is returned otherwise.
901 *
902 * For DDI_RESUME command:
903 * Not implemented at this time (postponed until phase 2 of the development).
904 */
905 int
sata_hba_attach(dev_info_t * dip,sata_hba_tran_t * sata_tran,ddi_attach_cmd_t cmd)906 sata_hba_attach(dev_info_t *dip, sata_hba_tran_t *sata_tran,
907 ddi_attach_cmd_t cmd)
908 {
909 sata_hba_inst_t *sata_hba_inst;
910 scsi_hba_tran_t *scsi_tran = NULL;
911 int hba_attach_state = 0;
912 char taskq_name[MAXPATHLEN];
913
914 SATADBG3(SATA_DBG_HBA_IF, NULL,
915 "sata_hba_attach: node %s (%s%d)\n",
916 ddi_node_name(dip), ddi_driver_name(dip),
917 ddi_get_instance(dip));
918
919 if (cmd == DDI_RESUME) {
920 /*
921 * Postponed until phase 2 of the development
922 */
923 return (DDI_FAILURE);
924 }
925
926 if (cmd != DDI_ATTACH) {
927 return (DDI_FAILURE);
928 }
929
930 /* cmd == DDI_ATTACH */
931
932 if (sata_validate_sata_hba_tran(dip, sata_tran) != SATA_SUCCESS) {
933 SATA_LOG_D((NULL, CE_WARN,
934 "sata_hba_attach: invalid sata_hba_tran"));
935 return (DDI_FAILURE);
936 }
937 /*
938 * Allocate and initialize SCSI tran structure.
939 * SATA copy of tran_bus_config is provided to create port nodes.
940 */
941 scsi_tran = scsi_hba_tran_alloc(dip, SCSI_HBA_CANSLEEP);
942 if (scsi_tran == NULL)
943 return (DDI_FAILURE);
944 /*
945 * Allocate soft structure for SATA HBA instance.
946 * There is a separate softstate for each HBA instance.
947 */
948 sata_hba_inst = kmem_zalloc(sizeof (struct sata_hba_inst), KM_SLEEP);
949 ASSERT(sata_hba_inst != NULL); /* this should not fail */
950 mutex_init(&sata_hba_inst->satahba_mutex, NULL, MUTEX_DRIVER, NULL);
951 hba_attach_state |= HBA_ATTACH_STAGE_SATA_HBA_INST;
952
953 /*
954 * scsi_trans's tran_hba_private is used by SATA Framework to point to
955 * soft structure allocated by SATA framework for
956 * SATA HBA instance related data.
957 */
958 scsi_tran->tran_hba_private = sata_hba_inst;
959 scsi_tran->tran_tgt_private = NULL;
960
961 scsi_tran->tran_tgt_init = sata_scsi_tgt_init;
962 scsi_tran->tran_tgt_probe = sata_scsi_tgt_probe;
963 scsi_tran->tran_tgt_free = sata_scsi_tgt_free;
964
965 scsi_tran->tran_start = sata_scsi_start;
966 scsi_tran->tran_reset = sata_scsi_reset;
967 scsi_tran->tran_abort = sata_scsi_abort;
968 scsi_tran->tran_getcap = sata_scsi_getcap;
969 scsi_tran->tran_setcap = sata_scsi_setcap;
970 scsi_tran->tran_init_pkt = sata_scsi_init_pkt;
971 scsi_tran->tran_destroy_pkt = sata_scsi_destroy_pkt;
972
973 scsi_tran->tran_dmafree = sata_scsi_dmafree;
974 scsi_tran->tran_sync_pkt = sata_scsi_sync_pkt;
975
976 scsi_tran->tran_reset_notify = NULL;
977 scsi_tran->tran_get_bus_addr = NULL;
978 scsi_tran->tran_quiesce = NULL;
979 scsi_tran->tran_unquiesce = NULL;
980 scsi_tran->tran_bus_reset = NULL;
981
982 if (scsi_hba_attach_setup(dip, sata_tran->sata_tran_hba_dma_attr,
983 scsi_tran, 0) != DDI_SUCCESS) {
984 #ifdef SATA_DEBUG
985 cmn_err(CE_WARN, "?SATA: %s%d hba scsi attach failed",
986 ddi_driver_name(dip), ddi_get_instance(dip));
987 #endif
988 goto fail;
989 }
990 hba_attach_state |= HBA_ATTACH_STAGE_SCSI_ATTACHED;
991
992 if (!ddi_prop_exists(DDI_DEV_T_ANY, dip, DDI_PROP_DONTPASS, "sata")) {
993 if (ddi_prop_update_int(DDI_DEV_T_NONE, dip,
994 "sata", 1) != DDI_PROP_SUCCESS) {
995 SATA_LOG_D((NULL, CE_WARN, "sata_hba_attach: "
996 "failed to create hba sata prop"));
997 goto fail;
998 }
999 }
1000
1001 /*
1002 * Save pointers in hba instance soft state.
1003 */
1004 sata_hba_inst->satahba_scsi_tran = scsi_tran;
1005 sata_hba_inst->satahba_tran = sata_tran;
1006 sata_hba_inst->satahba_dip = dip;
1007
1008 /*
1009 * Create a task queue to handle emulated commands completion
1010 * Use node name, dash, instance number as the queue name.
1011 */
1012 taskq_name[0] = '\0';
1013 (void) strlcat(taskq_name, DEVI(dip)->devi_node_name,
1014 sizeof (taskq_name));
1015 (void) snprintf(taskq_name + strlen(taskq_name),
1016 sizeof (taskq_name) - strlen(taskq_name),
1017 "-%d", DEVI(dip)->devi_instance);
1018 sata_hba_inst->satahba_taskq = taskq_create(taskq_name, 1,
1019 minclsyspri, 1, sata_tran->sata_tran_hba_num_cports * 4,
1020 TASKQ_DYNAMIC);
1021
1022 hba_attach_state |= HBA_ATTACH_STAGE_SETUP;
1023
1024 /*
1025 * Create events thread if not created yet.
1026 */
1027 sata_event_thread_control(1);
1028
1029 /*
1030 * Link this hba instance into the list.
1031 */
1032 mutex_enter(&sata_mutex);
1033
1034 if (sata_hba_list == NULL) {
1035 /*
1036 * The first instance of HBA is attached.
1037 * Set current/active default maximum NCQ/TCQ queue depth for
1038 * all SATA devices. It is done here and now, to eliminate the
1039 * possibility of the dynamic, programatic modification of the
1040 * queue depth via global (and public) sata_max_queue_depth
1041 * variable (this would require special handling in HBA drivers)
1042 */
1043 sata_current_max_qdepth = sata_max_queue_depth;
1044 if (sata_current_max_qdepth > 32)
1045 sata_current_max_qdepth = 32;
1046 else if (sata_current_max_qdepth < 1)
1047 sata_current_max_qdepth = 1;
1048 }
1049
1050 sata_hba_inst->satahba_next = NULL;
1051 sata_hba_inst->satahba_prev = sata_hba_list_tail;
1052 if (sata_hba_list == NULL) {
1053 sata_hba_list = sata_hba_inst;
1054 }
1055 if (sata_hba_list_tail != NULL) {
1056 sata_hba_list_tail->satahba_next = sata_hba_inst;
1057 }
1058 sata_hba_list_tail = sata_hba_inst;
1059 mutex_exit(&sata_mutex);
1060 hba_attach_state |= HBA_ATTACH_STAGE_LINKED;
1061
1062 /*
1063 * Create SATA HBA devctl minor node for sata_hba_open, close, ioctl
1064 * SATA HBA driver should not use its own open/close entry points.
1065 *
1066 * Make sure that instance number doesn't overflow
1067 * when forming minor numbers.
1068 */
1069 ASSERT(ddi_get_instance(dip) <= (L_MAXMIN >> INST_MINOR_SHIFT));
1070 if (ddi_create_minor_node(dip, "devctl", S_IFCHR,
1071 INST2DEVCTL(ddi_get_instance(dip)),
1072 DDI_NT_SATA_NEXUS, 0) != DDI_SUCCESS) {
1073 #ifdef SATA_DEBUG
1074 cmn_err(CE_WARN, "sata_hba_attach: "
1075 "cannot create devctl minor node");
1076 #endif
1077 goto fail;
1078 }
1079
1080
1081 /*
1082 * Set-up kstats here, if necessary.
1083 * (postponed until future phase of the development).
1084 */
1085
1086 /*
1087 * Indicate that HBA is attached. This will enable events processing
1088 * for this HBA.
1089 */
1090 sata_hba_inst->satahba_attached = 1;
1091 /*
1092 * Probe controller ports. This operation will describe a current
1093 * controller/port/multipliers/device configuration and will create
1094 * attachment points.
1095 * We may end-up with just a controller with no devices attached.
1096 * For the ports with a supported device attached, device target nodes
1097 * are created and devices are initialized.
1098 */
1099 sata_probe_ports(sata_hba_inst);
1100
1101 return (DDI_SUCCESS);
1102
1103 fail:
1104 if (hba_attach_state & HBA_ATTACH_STAGE_LINKED) {
1105 (void) sata_remove_hba_instance(dip);
1106 if (sata_hba_list == NULL)
1107 sata_event_thread_control(0);
1108 }
1109
1110 if (hba_attach_state & HBA_ATTACH_STAGE_SETUP) {
1111 (void) ddi_prop_remove(DDI_DEV_T_ANY, dip, "sata");
1112 taskq_destroy(sata_hba_inst->satahba_taskq);
1113 }
1114
1115 if (hba_attach_state & HBA_ATTACH_STAGE_SCSI_ATTACHED)
1116 (void) scsi_hba_detach(dip);
1117
1118 if (hba_attach_state & HBA_ATTACH_STAGE_SATA_HBA_INST) {
1119 mutex_destroy(&sata_hba_inst->satahba_mutex);
1120 kmem_free((void *)sata_hba_inst,
1121 sizeof (struct sata_hba_inst));
1122 scsi_hba_tran_free(scsi_tran);
1123 }
1124
1125 sata_log(NULL, CE_WARN, "?SATA: %s%d hba attach failed",
1126 ddi_driver_name(dip), ddi_get_instance(dip));
1127
1128 return (DDI_FAILURE);
1129 }
1130
1131
1132 /*
1133 * Called by SATA HBA from to detach an instance of the driver.
1134 *
1135 * For DDI_DETACH command:
1136 * Free local structures allocated for SATA HBA instance during
1137 * sata_hba_attach processing.
1138 *
1139 * Returns DDI_SUCCESS when HBA was detached, DDI_FAILURE otherwise.
1140 *
1141 * For DDI_SUSPEND command:
1142 * Not implemented at this time (postponed until phase 2 of the development)
1143 * Returnd DDI_SUCCESS.
1144 *
1145 * When the last HBA instance is detached, the event daemon is terminated.
1146 *
1147 * NOTE: Port multiplier is supported.
1148 */
1149 int
sata_hba_detach(dev_info_t * dip,ddi_detach_cmd_t cmd)1150 sata_hba_detach(dev_info_t *dip, ddi_detach_cmd_t cmd)
1151 {
1152 dev_info_t *tdip;
1153 sata_hba_inst_t *sata_hba_inst;
1154 scsi_hba_tran_t *scsi_hba_tran;
1155 sata_cport_info_t *cportinfo;
1156 sata_pmult_info_t *pminfo;
1157 sata_drive_info_t *sdinfo;
1158 sata_device_t sdevice;
1159 int ncport, npmport;
1160
1161 SATADBG3(SATA_DBG_HBA_IF, NULL, "sata_hba_detach: node %s (%s%d)\n",
1162 ddi_node_name(dip), ddi_driver_name(dip), ddi_get_instance(dip));
1163
1164 switch (cmd) {
1165 case DDI_DETACH:
1166
1167 if ((scsi_hba_tran = ddi_get_driver_private(dip)) == NULL)
1168 return (DDI_FAILURE);
1169
1170 sata_hba_inst = scsi_hba_tran->tran_hba_private;
1171 if (sata_hba_inst == NULL)
1172 return (DDI_FAILURE);
1173
1174 if (scsi_hba_detach(dip) == DDI_FAILURE) {
1175 sata_hba_inst->satahba_attached = 1;
1176 return (DDI_FAILURE);
1177 }
1178
1179 /*
1180 * Free all target nodes - at this point
1181 * devices should be at least offlined
1182 * otherwise scsi_hba_detach() should not be called.
1183 */
1184 for (ncport = 0; ncport < SATA_NUM_CPORTS(sata_hba_inst);
1185 ncport++) {
1186 cportinfo = SATA_CPORT_INFO(sata_hba_inst, ncport);
1187 if (cportinfo->cport_dev_type != SATA_DTYPE_PMULT) {
1188 sdinfo = SATA_CPORTINFO_DRV_INFO(cportinfo);
1189 if (sdinfo != NULL) {
1190 tdip = sata_get_target_dip(dip,
1191 ncport, 0);
1192 if (tdip != NULL) {
1193 if (ndi_devi_offline(tdip,
1194 NDI_DEVI_REMOVE) !=
1195 NDI_SUCCESS) {
1196 SATA_LOG_D((
1197 sata_hba_inst,
1198 CE_WARN,
1199 "sata_hba_detach: "
1200 "Target node not "
1201 "removed !"));
1202 return (DDI_FAILURE);
1203 }
1204 }
1205 }
1206 } else { /* SATA_DTYPE_PMULT */
1207 mutex_enter(&cportinfo->cport_mutex);
1208 pminfo = SATA_CPORTINFO_PMULT_INFO(cportinfo);
1209
1210 if (pminfo == NULL) {
1211 SATA_LOG_D((sata_hba_inst, CE_WARN,
1212 "sata_hba_detach: Port multiplier "
1213 "not ready yet!"));
1214 mutex_exit(&cportinfo->cport_mutex);
1215 return (DDI_FAILURE);
1216 }
1217
1218 /*
1219 * Detach would fail if removal of any of the
1220 * target nodes is failed - albeit in that
1221 * case some of them may have been removed.
1222 */
1223 for (npmport = 0; npmport < SATA_NUM_PMPORTS(
1224 sata_hba_inst, ncport); npmport++) {
1225 tdip = sata_get_target_dip(dip, ncport,
1226 npmport);
1227 if (tdip != NULL) {
1228 if (ndi_devi_offline(tdip,
1229 NDI_DEVI_REMOVE) !=
1230 NDI_SUCCESS) {
1231 SATA_LOG_D((
1232 sata_hba_inst,
1233 CE_WARN,
1234 "sata_hba_detach: "
1235 "Target node not "
1236 "removed !"));
1237 mutex_exit(&cportinfo->
1238 cport_mutex);
1239 return (DDI_FAILURE);
1240 }
1241 }
1242 }
1243 mutex_exit(&cportinfo->cport_mutex);
1244 }
1245 }
1246 /*
1247 * Disable sata event daemon processing for this HBA
1248 */
1249 sata_hba_inst->satahba_attached = 0;
1250
1251 /*
1252 * Remove event daemon thread, if it is last HBA instance.
1253 */
1254
1255 mutex_enter(&sata_mutex);
1256 if (sata_hba_list->satahba_next == NULL) {
1257 mutex_exit(&sata_mutex);
1258 sata_event_thread_control(0);
1259 mutex_enter(&sata_mutex);
1260 }
1261 mutex_exit(&sata_mutex);
1262
1263 /* Remove this HBA instance from the HBA list */
1264 sata_remove_hba_instance(dip);
1265
1266 /*
1267 * At this point there should be no target nodes attached.
1268 * Detach and destroy device and port info structures.
1269 */
1270 for (ncport = 0; ncport < SATA_NUM_CPORTS(sata_hba_inst);
1271 ncport++) {
1272 cportinfo = SATA_CPORT_INFO(sata_hba_inst, ncport);
1273 if (cportinfo->cport_dev_type != SATA_DTYPE_PMULT) {
1274 sdinfo =
1275 cportinfo->cport_devp.cport_sata_drive;
1276 if (sdinfo != NULL) {
1277 /* Release device structure */
1278 kmem_free(sdinfo,
1279 sizeof (sata_drive_info_t));
1280 }
1281 /* Release cport info */
1282 mutex_destroy(&cportinfo->cport_mutex);
1283 kmem_free(cportinfo,
1284 sizeof (sata_cport_info_t));
1285 } else { /* SATA_DTYPE_PMULT */
1286 sdevice.satadev_addr.cport = (uint8_t)ncport;
1287 sdevice.satadev_addr.qual = SATA_ADDR_PMULT;
1288 sata_free_pmult(sata_hba_inst, &sdevice);
1289 }
1290 }
1291
1292 scsi_hba_tran_free(sata_hba_inst->satahba_scsi_tran);
1293
1294 (void) ddi_prop_remove(DDI_DEV_T_ANY, dip, "sata");
1295
1296 taskq_destroy(sata_hba_inst->satahba_taskq);
1297
1298 mutex_destroy(&sata_hba_inst->satahba_mutex);
1299 kmem_free((void *)sata_hba_inst,
1300 sizeof (struct sata_hba_inst));
1301
1302 return (DDI_SUCCESS);
1303
1304 case DDI_SUSPEND:
1305 /*
1306 * Postponed until phase 2
1307 */
1308 return (DDI_FAILURE);
1309
1310 default:
1311 return (DDI_FAILURE);
1312 }
1313 }
1314
1315
1316 /*
1317 * Called by an HBA drive from _fini() routine.
1318 * Unregisters SATA HBA instance/SATA framework pair from the scsi framework.
1319 */
1320 void
sata_hba_fini(struct modlinkage * modlp)1321 sata_hba_fini(struct modlinkage *modlp)
1322 {
1323 SATADBG1(SATA_DBG_HBA_IF, NULL,
1324 "sata_hba_fini: name %s\n",
1325 ((struct modldrv *)(modlp->ml_linkage[0]))->drv_linkinfo);
1326
1327 scsi_hba_fini(modlp);
1328 }
1329
1330
1331 /*
1332 * Default open and close routine for sata_hba framework.
1333 *
1334 */
1335 /*
1336 * Open devctl node.
1337 *
1338 * Returns:
1339 * 0 if node was open successfully, error code otherwise.
1340 *
1341 *
1342 */
1343
1344 static int
sata_hba_open(dev_t * devp,int flags,int otyp,cred_t * credp)1345 sata_hba_open(dev_t *devp, int flags, int otyp, cred_t *credp)
1346 {
1347 #ifndef __lock_lint
1348 _NOTE(ARGUNUSED(credp))
1349 #endif
1350 int rv = 0;
1351 dev_info_t *dip;
1352 scsi_hba_tran_t *scsi_hba_tran;
1353 sata_hba_inst_t *sata_hba_inst;
1354
1355 SATADBG1(SATA_DBG_IOCTL_IF, NULL, "sata_hba_open: entered", NULL);
1356
1357 if (otyp != OTYP_CHR)
1358 return (EINVAL);
1359
1360 dip = sata_devt_to_devinfo(*devp);
1361 if (dip == NULL)
1362 return (ENXIO);
1363
1364 if ((scsi_hba_tran = ddi_get_driver_private(dip)) == NULL)
1365 return (ENXIO);
1366
1367 sata_hba_inst = scsi_hba_tran->tran_hba_private;
1368 if (sata_hba_inst == NULL || sata_hba_inst->satahba_attached == 0)
1369 return (ENXIO);
1370
1371 mutex_enter(&sata_mutex);
1372 if (flags & FEXCL) {
1373 if (sata_hba_inst->satahba_open_flag != 0) {
1374 rv = EBUSY;
1375 } else {
1376 sata_hba_inst->satahba_open_flag =
1377 SATA_DEVCTL_EXOPENED;
1378 }
1379 } else {
1380 if (sata_hba_inst->satahba_open_flag == SATA_DEVCTL_EXOPENED) {
1381 rv = EBUSY;
1382 } else {
1383 sata_hba_inst->satahba_open_flag =
1384 SATA_DEVCTL_SOPENED;
1385 }
1386 }
1387 mutex_exit(&sata_mutex);
1388
1389 return (rv);
1390 }
1391
1392
1393 /*
1394 * Close devctl node.
1395 * Returns:
1396 * 0 if node was closed successfully, error code otherwise.
1397 *
1398 */
1399
1400 static int
sata_hba_close(dev_t dev,int flag,int otyp,cred_t * credp)1401 sata_hba_close(dev_t dev, int flag, int otyp, cred_t *credp)
1402 {
1403 #ifndef __lock_lint
1404 _NOTE(ARGUNUSED(credp))
1405 _NOTE(ARGUNUSED(flag))
1406 #endif
1407 dev_info_t *dip;
1408 scsi_hba_tran_t *scsi_hba_tran;
1409 sata_hba_inst_t *sata_hba_inst;
1410
1411 SATADBG1(SATA_DBG_IOCTL_IF, NULL, "sata_hba_close: entered", NULL);
1412
1413 if (otyp != OTYP_CHR)
1414 return (EINVAL);
1415
1416 dip = sata_devt_to_devinfo(dev);
1417 if (dip == NULL)
1418 return (ENXIO);
1419
1420 if ((scsi_hba_tran = ddi_get_driver_private(dip)) == NULL)
1421 return (ENXIO);
1422
1423 sata_hba_inst = scsi_hba_tran->tran_hba_private;
1424 if (sata_hba_inst == NULL || sata_hba_inst->satahba_attached == 0)
1425 return (ENXIO);
1426
1427 mutex_enter(&sata_mutex);
1428 sata_hba_inst->satahba_open_flag = 0;
1429 mutex_exit(&sata_mutex);
1430 return (0);
1431 }
1432
1433
1434
1435 /*
1436 * Standard IOCTL commands for SATA hotplugging.
1437 * Implemented DEVCTL_AP commands:
1438 * DEVCTL_AP_CONNECT
1439 * DEVCTL_AP_DISCONNECT
1440 * DEVCTL_AP_CONFIGURE
1441 * DEVCTL_UNCONFIGURE
1442 * DEVCTL_AP_CONTROL
1443 *
1444 * Commands passed to default ndi ioctl handler:
1445 * DEVCTL_DEVICE_GETSTATE
1446 * DEVCTL_DEVICE_ONLINE
1447 * DEVCTL_DEVICE_OFFLINE
1448 * DEVCTL_DEVICE_REMOVE
1449 * DEVCTL_DEVICE_INSERT
1450 * DEVCTL_BUS_GETSTATE
1451 *
1452 * All other cmds are passed to HBA if it provide ioctl handler, or failed
1453 * if not.
1454 *
1455 * Returns:
1456 * 0 if successful,
1457 * error code if operation failed.
1458 *
1459 * Port Multiplier support is supported now.
1460 *
1461 * NOTE: qual should be SATA_ADDR_DCPORT or SATA_ADDR_DPMPORT
1462 */
1463
1464 static int
sata_hba_ioctl(dev_t dev,int cmd,intptr_t arg,int mode,cred_t * credp,int * rvalp)1465 sata_hba_ioctl(dev_t dev, int cmd, intptr_t arg, int mode, cred_t *credp,
1466 int *rvalp)
1467 {
1468 #ifndef __lock_lint
1469 _NOTE(ARGUNUSED(credp))
1470 _NOTE(ARGUNUSED(rvalp))
1471 #endif
1472 int rv = 0;
1473 int32_t comp_port = -1;
1474 dev_info_t *dip;
1475 devctl_ap_state_t ap_state;
1476 struct devctl_iocdata *dcp = NULL;
1477 scsi_hba_tran_t *scsi_hba_tran;
1478 sata_hba_inst_t *sata_hba_inst;
1479 sata_device_t sata_device;
1480 sata_cport_info_t *cportinfo;
1481 int cport, pmport, qual;
1482 int rval = SATA_SUCCESS;
1483
1484 dip = sata_devt_to_devinfo(dev);
1485 if (dip == NULL)
1486 return (ENXIO);
1487
1488 if ((scsi_hba_tran = ddi_get_driver_private(dip)) == NULL)
1489 return (ENXIO);
1490
1491 sata_hba_inst = scsi_hba_tran->tran_hba_private;
1492 if (sata_hba_inst == NULL)
1493 return (ENXIO);
1494
1495 if (sata_hba_inst->satahba_tran == NULL)
1496 return (ENXIO);
1497
1498 switch (cmd) {
1499
1500 case DEVCTL_DEVICE_GETSTATE:
1501 case DEVCTL_DEVICE_ONLINE:
1502 case DEVCTL_DEVICE_OFFLINE:
1503 case DEVCTL_DEVICE_REMOVE:
1504 case DEVCTL_BUS_GETSTATE:
1505 /*
1506 * There may be more cases that we want to pass to default
1507 * handler rather than fail them.
1508 */
1509 return (ndi_devctl_ioctl(dip, cmd, arg, mode, 0));
1510 }
1511
1512 cport = pmport = qual = 0;
1513 cportinfo = NULL;
1514
1515 /* read devctl ioctl data */
1516 if (cmd != DEVCTL_AP_CONTROL && IS_DEVCTL(cmd)) {
1517 if (ndi_dc_allochdl((void *)arg, &dcp) != NDI_SUCCESS)
1518 return (EFAULT);
1519
1520 if ((comp_port = sata_get_port_num(sata_hba_inst, dcp)) ==
1521 -1) {
1522 if (dcp)
1523 ndi_dc_freehdl(dcp);
1524 return (EINVAL);
1525 }
1526
1527 /*
1528 * According to SCSI_TO_SATA_ADDR_QUAL, qual should be either
1529 * SATA_ADDR_DCPORT or SATA_ADDR_DPMPORT.
1530 */
1531 cport = SCSI_TO_SATA_CPORT(comp_port);
1532 pmport = SCSI_TO_SATA_PMPORT(comp_port);
1533 qual = SCSI_TO_SATA_ADDR_QUAL(comp_port);
1534
1535 if (sata_validate_sata_address(sata_hba_inst, cport, pmport,
1536 qual) != 0) {
1537 ndi_dc_freehdl(dcp);
1538 return (EINVAL);
1539 }
1540
1541 cportinfo = SATA_CPORT_INFO(sata_hba_inst, cport);
1542 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, cport)->
1543 cport_mutex);
1544 if (cportinfo->cport_event_flags & SATA_EVNT_LOCK_PORT_BUSY) {
1545 /*
1546 * Cannot process ioctl request now. Come back later.
1547 */
1548 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, cport)->
1549 cport_mutex);
1550 ndi_dc_freehdl(dcp);
1551 return (EBUSY);
1552 }
1553 /* Block event processing for this port */
1554 cportinfo->cport_event_flags |= SATA_APCTL_LOCK_PORT_BUSY;
1555 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, cport)->cport_mutex);
1556
1557 sata_device.satadev_addr.cport = cport;
1558 sata_device.satadev_addr.pmport = pmport;
1559 sata_device.satadev_addr.qual = qual;
1560 sata_device.satadev_rev = SATA_DEVICE_REV;
1561 }
1562
1563 switch (cmd) {
1564
1565 case DEVCTL_AP_DISCONNECT:
1566
1567 /*
1568 * Normally, cfgadm sata plugin will try to offline
1569 * (unconfigure) device before this request. Nevertheless,
1570 * if a device is still configured, we need to
1571 * attempt to offline and unconfigure device first, and we will
1572 * deactivate the port regardless of the unconfigure
1573 * operation results.
1574 *
1575 */
1576 rv = sata_ioctl_disconnect(sata_hba_inst, &sata_device);
1577
1578 break;
1579
1580 case DEVCTL_AP_UNCONFIGURE:
1581
1582 /*
1583 * The unconfigure operation uses generic nexus operation to
1584 * offline a device. It leaves a target device node attached.
1585 * and obviously sata_drive_info attached as well, because
1586 * from the hardware point of view nothing has changed.
1587 */
1588 rv = sata_ioctl_unconfigure(sata_hba_inst, &sata_device);
1589 break;
1590
1591 case DEVCTL_AP_CONNECT:
1592 {
1593 /*
1594 * The sata cfgadm pluging will invoke this operation only if
1595 * port was found in the disconnect state (failed state
1596 * is also treated as the disconnected state).
1597 * If port activation is successful and a device is found
1598 * attached to the port, the initialization sequence is
1599 * executed to probe the port and attach
1600 * a device structure to a port structure. The device is not
1601 * set in configured state (system-wise) by this operation.
1602 */
1603
1604 rv = sata_ioctl_connect(sata_hba_inst, &sata_device);
1605
1606 break;
1607 }
1608
1609 case DEVCTL_AP_CONFIGURE:
1610 {
1611 /*
1612 * A port may be in an active or shutdown state.
1613 * If port is in a failed state, operation is aborted.
1614 * If a port is in a shutdown state, sata_tran_port_activate()
1615 * is invoked prior to any other operation.
1616 *
1617 * Onlining the device involves creating a new target node.
1618 * If there is an old target node present (belonging to
1619 * previously removed device), the operation is aborted - the
1620 * old node has to be released and removed before configure
1621 * operation is attempted.
1622 */
1623
1624 rv = sata_ioctl_configure(sata_hba_inst, &sata_device);
1625
1626 break;
1627 }
1628
1629 case DEVCTL_AP_GETSTATE:
1630
1631 sata_cfgadm_state(sata_hba_inst, comp_port, &ap_state);
1632
1633 ap_state.ap_last_change = (time_t)-1;
1634 ap_state.ap_error_code = 0;
1635 ap_state.ap_in_transition = 0;
1636
1637 /* Copy the return AP-state information to the user space */
1638 if (ndi_dc_return_ap_state(&ap_state, dcp) != NDI_SUCCESS) {
1639 rv = EFAULT;
1640 }
1641 break;
1642
1643 case DEVCTL_AP_CONTROL:
1644 {
1645 /*
1646 * Generic devctl for hardware specific functionality
1647 */
1648 sata_ioctl_data_t ioc;
1649
1650 ASSERT(dcp == NULL);
1651
1652 /* Copy in user ioctl data first */
1653 #ifdef _MULTI_DATAMODEL
1654 if (ddi_model_convert_from(mode & FMODELS) ==
1655 DDI_MODEL_ILP32) {
1656
1657 sata_ioctl_data_32_t ioc32;
1658
1659 if (ddi_copyin((void *)arg, (void *)&ioc32,
1660 sizeof (ioc32), mode) != 0) {
1661 rv = EFAULT;
1662 break;
1663 }
1664 ioc.cmd = (uint_t)ioc32.cmd;
1665 ioc.port = (uint_t)ioc32.port;
1666 ioc.get_size = (uint_t)ioc32.get_size;
1667 ioc.buf = (caddr_t)(uintptr_t)ioc32.buf;
1668 ioc.bufsiz = (uint_t)ioc32.bufsiz;
1669 ioc.misc_arg = (uint_t)ioc32.misc_arg;
1670 } else
1671 #endif /* _MULTI_DATAMODEL */
1672 if (ddi_copyin((void *)arg, (void *)&ioc, sizeof (ioc),
1673 mode) != 0) {
1674 return (EFAULT);
1675 }
1676
1677 SATADBG2(SATA_DBG_IOCTL_IF, sata_hba_inst,
1678 "sata_hba_ioctl: DEVCTL_AP_CONTROL "
1679 "cmd 0x%x, port 0x%x", ioc.cmd, ioc.port);
1680
1681 /*
1682 * To avoid BE/LE and 32/64 issues, a get_size always returns
1683 * a 32-bit number.
1684 */
1685 if (ioc.get_size != 0 && ioc.bufsiz != (sizeof (uint32_t))) {
1686 return (EINVAL);
1687 }
1688 /* validate address */
1689 cport = SCSI_TO_SATA_CPORT(ioc.port);
1690 pmport = SCSI_TO_SATA_PMPORT(ioc.port);
1691 qual = SCSI_TO_SATA_ADDR_QUAL(ioc.port);
1692
1693 SATADBG3(SATA_DBG_IOCTL_IF, sata_hba_inst,
1694 "sata_hba_ioctl: target port is %d:%d (%d)",
1695 cport, pmport, qual);
1696
1697 if (sata_validate_sata_address(sata_hba_inst, cport,
1698 pmport, qual) != 0)
1699 return (EINVAL);
1700
1701 cportinfo = SATA_CPORT_INFO(sata_hba_inst, cport);
1702 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, cport)->
1703 cport_mutex);
1704 /* Is the port locked by event processing daemon ? */
1705 if (cportinfo->cport_event_flags & SATA_EVNT_LOCK_PORT_BUSY) {
1706 /*
1707 * Cannot process ioctl request now. Come back later
1708 */
1709 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, cport)->
1710 cport_mutex);
1711 return (EBUSY);
1712 }
1713 /* Block event processing for this port */
1714 cportinfo->cport_event_flags |= SATA_APCTL_LOCK_PORT_BUSY;
1715 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, cport)->cport_mutex);
1716
1717
1718 sata_device.satadev_addr.cport = cport;
1719 sata_device.satadev_addr.pmport = pmport;
1720 sata_device.satadev_addr.qual = qual;
1721 sata_device.satadev_rev = SATA_DEVICE_REV;
1722
1723 switch (ioc.cmd) {
1724
1725 case SATA_CFGA_RESET_PORT:
1726 /*
1727 * There is no protection for configured device.
1728 */
1729 rv = sata_ioctl_reset_port(sata_hba_inst, &sata_device);
1730 break;
1731
1732 case SATA_CFGA_RESET_DEVICE:
1733 /*
1734 * There is no protection for configured device.
1735 */
1736 rv = sata_ioctl_reset_device(sata_hba_inst,
1737 &sata_device);
1738 break;
1739
1740 case SATA_CFGA_RESET_ALL:
1741 /*
1742 * There is no protection for configured devices.
1743 */
1744 rv = sata_ioctl_reset_all(sata_hba_inst);
1745 /*
1746 * We return here, because common return is for
1747 * a single port operation - we have already unlocked
1748 * all ports and no dc handle was allocated.
1749 */
1750 return (rv);
1751
1752 case SATA_CFGA_PORT_DEACTIVATE:
1753 /*
1754 * Arbitrarily unconfigure attached device, if any.
1755 * Even if the unconfigure fails, proceed with the
1756 * port deactivation.
1757 */
1758 rv = sata_ioctl_deactivate(sata_hba_inst, &sata_device);
1759
1760 break;
1761
1762 case SATA_CFGA_PORT_ACTIVATE:
1763
1764 rv = sata_ioctl_activate(sata_hba_inst, &sata_device);
1765 break;
1766
1767 case SATA_CFGA_PORT_SELF_TEST:
1768
1769 rv = sata_ioctl_port_self_test(sata_hba_inst,
1770 &sata_device);
1771 break;
1772
1773 case SATA_CFGA_GET_DEVICE_PATH:
1774
1775 rv = sata_ioctl_get_device_path(sata_hba_inst,
1776 &sata_device, &ioc, mode);
1777 break;
1778
1779 case SATA_CFGA_GET_AP_TYPE:
1780
1781 rv = sata_ioctl_get_ap_type(sata_hba_inst,
1782 &sata_device, &ioc, mode);
1783 break;
1784
1785 case SATA_CFGA_GET_MODEL_INFO:
1786
1787 rv = sata_ioctl_get_model_info(sata_hba_inst,
1788 &sata_device, &ioc, mode);
1789 break;
1790
1791 case SATA_CFGA_GET_REVFIRMWARE_INFO:
1792
1793 rv = sata_ioctl_get_revfirmware_info(sata_hba_inst,
1794 &sata_device, &ioc, mode);
1795 break;
1796
1797 case SATA_CFGA_GET_SERIALNUMBER_INFO:
1798
1799 rv = sata_ioctl_get_serialnumber_info(sata_hba_inst,
1800 &sata_device, &ioc, mode);
1801 break;
1802
1803 default:
1804 rv = EINVAL;
1805 break;
1806
1807 } /* End of DEVCTL_AP_CONTROL cmd switch */
1808
1809 break;
1810 }
1811
1812 default:
1813 {
1814 /*
1815 * If we got here, we got an IOCTL that SATA HBA Framework
1816 * does not recognize. Pass ioctl to HBA driver, in case
1817 * it could process it.
1818 */
1819 sata_hba_tran_t *sata_tran = sata_hba_inst->satahba_tran;
1820 dev_info_t *mydip = SATA_DIP(sata_hba_inst);
1821
1822 SATADBG1(SATA_DBG_IOCTL_IF, sata_hba_inst,
1823 "IOCTL 0x%2x not supported in SATA framework, "
1824 "passthrough to HBA", cmd);
1825
1826 if (sata_tran->sata_tran_ioctl == NULL) {
1827 rv = EINVAL;
1828 break;
1829 }
1830 rval = (*sata_tran->sata_tran_ioctl)(mydip, cmd, arg);
1831 if (rval != 0) {
1832 SATADBG1(SATA_DBG_IOCTL_IF, sata_hba_inst,
1833 "IOCTL 0x%2x failed in HBA", cmd);
1834 rv = rval;
1835 }
1836 break;
1837 }
1838
1839 } /* End of main IOCTL switch */
1840
1841 if (dcp) {
1842 ndi_dc_freehdl(dcp);
1843 }
1844
1845 if (IS_DEVCTL(cmd)) {
1846 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst,
1847 cport)->cport_mutex);
1848 cportinfo->cport_event_flags &= ~SATA_APCTL_LOCK_PORT_BUSY;
1849 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, cport)->cport_mutex);
1850 }
1851
1852 return (rv);
1853 }
1854
1855
1856 /*
1857 * Create error retrieval sata packet
1858 *
1859 * A sata packet is allocated and set-up to contain specified error retrieval
1860 * command and appropriate dma-able data buffer.
1861 * No association with any scsi packet is made and no callback routine is
1862 * specified.
1863 *
1864 * Returns a pointer to sata packet upon successful packet creation.
1865 * Returns NULL, if packet cannot be created.
1866 */
1867 sata_pkt_t *
sata_get_error_retrieval_pkt(dev_info_t * dip,sata_device_t * sata_device,int pkt_type)1868 sata_get_error_retrieval_pkt(dev_info_t *dip, sata_device_t *sata_device,
1869 int pkt_type)
1870 {
1871 sata_hba_inst_t *sata_hba_inst;
1872 sata_pkt_txlate_t *spx;
1873 sata_pkt_t *spkt;
1874 sata_drive_info_t *sdinfo;
1875
1876 mutex_enter(&sata_mutex);
1877 for (sata_hba_inst = sata_hba_list; sata_hba_inst != NULL;
1878 sata_hba_inst = sata_hba_inst->satahba_next) {
1879 if (SATA_DIP(sata_hba_inst) == dip)
1880 break;
1881 }
1882 mutex_exit(&sata_mutex);
1883 ASSERT(sata_hba_inst != NULL);
1884
1885 sdinfo = sata_get_device_info(sata_hba_inst, sata_device);
1886 if (sdinfo == NULL) {
1887 sata_log(sata_hba_inst, CE_WARN,
1888 "sata: error recovery request for non-attached device at "
1889 "cport %d", sata_device->satadev_addr.cport);
1890 return (NULL);
1891 }
1892
1893 spx = kmem_zalloc(sizeof (sata_pkt_txlate_t), KM_SLEEP);
1894 spx->txlt_sata_hba_inst = sata_hba_inst;
1895 spx->txlt_scsi_pkt = NULL; /* No scsi pkt involved */
1896 spkt = sata_pkt_alloc(spx, NULL);
1897 if (spkt == NULL) {
1898 kmem_free(spx, sizeof (sata_pkt_txlate_t));
1899 return (NULL);
1900 }
1901 /* address is needed now */
1902 spkt->satapkt_device.satadev_addr = sata_device->satadev_addr;
1903
1904 switch (pkt_type) {
1905 case SATA_ERR_RETR_PKT_TYPE_NCQ:
1906 if (sata_ncq_err_ret_cmd_setup(spx, sdinfo) == SATA_SUCCESS) {
1907 if (sata_check_for_dma_error(dip, spx)) {
1908 ddi_fm_service_impact(dip,
1909 DDI_SERVICE_UNAFFECTED);
1910 break;
1911 }
1912 return (spkt);
1913 }
1914 break;
1915
1916 case SATA_ERR_RETR_PKT_TYPE_ATAPI:
1917 if (sata_atapi_err_ret_cmd_setup(spx, sdinfo) == SATA_SUCCESS) {
1918 if (sata_check_for_dma_error(dip, spx)) {
1919 ddi_fm_service_impact(dip,
1920 DDI_SERVICE_UNAFFECTED);
1921 break;
1922 }
1923 return (spkt);
1924 }
1925 break;
1926
1927 default:
1928 break;
1929 }
1930
1931 sata_pkt_free(spx);
1932 kmem_free(spx, sizeof (sata_pkt_txlate_t));
1933 return (NULL);
1934
1935 }
1936
1937
1938 /*
1939 * Free error retrieval sata packet
1940 *
1941 * Free sata packet and any associated resources allocated previously by
1942 * sata_get_error_retrieval_pkt().
1943 *
1944 * Void return.
1945 */
1946 void
sata_free_error_retrieval_pkt(sata_pkt_t * sata_pkt)1947 sata_free_error_retrieval_pkt(sata_pkt_t *sata_pkt)
1948 {
1949 sata_pkt_txlate_t *spx =
1950 (sata_pkt_txlate_t *)sata_pkt->satapkt_framework_private;
1951
1952 ASSERT(sata_pkt != NULL);
1953
1954 sata_free_local_buffer(spx);
1955 sata_pkt_free(spx);
1956 kmem_free(spx, sizeof (sata_pkt_txlate_t));
1957
1958 }
1959
1960 /*
1961 * Create READ PORT MULTIPLIER and WRITE PORT MULTIPLIER sata packet
1962 *
1963 * No association with any scsi packet is made and no callback routine is
1964 * specified.
1965 *
1966 * Returns a pointer to sata packet upon successful packet creation.
1967 * Returns NULL, if packet cannot be created.
1968 *
1969 * NOTE: Input/Output value includes 64 bits accoring to SATA Spec 2.6,
1970 * only lower 32 bits are available currently.
1971 */
1972 sata_pkt_t *
sata_get_rdwr_pmult_pkt(dev_info_t * dip,sata_device_t * sd,uint16_t regn,uint32_t regv,uint32_t type)1973 sata_get_rdwr_pmult_pkt(dev_info_t *dip, sata_device_t *sd,
1974 uint16_t regn, uint32_t regv, uint32_t type)
1975 {
1976 sata_hba_inst_t *sata_hba_inst;
1977 sata_pkt_txlate_t *spx;
1978 sata_pkt_t *spkt;
1979 sata_cmd_t *scmd;
1980
1981 /* Only READ/WRITE commands are accepted. */
1982 ASSERT(type == SATA_RDWR_PMULT_PKT_TYPE_READ ||
1983 type == SATA_RDWR_PMULT_PKT_TYPE_WRITE);
1984
1985 mutex_enter(&sata_mutex);
1986 for (sata_hba_inst = sata_hba_list; sata_hba_inst != NULL;
1987 sata_hba_inst = sata_hba_inst->satahba_next) {
1988 if (SATA_DIP(sata_hba_inst) == dip)
1989 break;
1990 }
1991 mutex_exit(&sata_mutex);
1992 ASSERT(sata_hba_inst != NULL);
1993
1994 spx = kmem_zalloc(sizeof (sata_pkt_txlate_t), KM_SLEEP);
1995 spx->txlt_sata_hba_inst = sata_hba_inst;
1996 spx->txlt_scsi_pkt = NULL; /* No scsi pkt involved */
1997 spkt = sata_pkt_alloc(spx, SLEEP_FUNC);
1998 if (spkt == NULL) {
1999 kmem_free(spx, sizeof (sata_pkt_txlate_t));
2000 return (NULL);
2001 }
2002
2003 /*
2004 * NOTE: We need to send this command to the port multiplier,
2005 * that means send to SATA_PMULT_HOSTPORT(0xf) pmport
2006 *
2007 * sata_device contains the address of actual target device, and the
2008 * pmport number in the command comes from the sata_device structure.
2009 */
2010 spkt->satapkt_device.satadev_addr = sd->satadev_addr;
2011 spkt->satapkt_device.satadev_addr.pmport = SATA_PMULT_HOSTPORT;
2012 spkt->satapkt_device.satadev_addr.qual = SATA_ADDR_PMULT;
2013
2014 /* Fill sata_pkt */
2015 spkt->satapkt_op_mode = SATA_OPMODE_SYNCH | SATA_OPMODE_POLLING;
2016 spkt->satapkt_comp = NULL; /* Synchronous mode, no callback */
2017 spkt->satapkt_time = 10; /* Timeout 10s */
2018
2019 /* Build READ PORT MULTIPLIER cmd in the sata_pkt */
2020 scmd = &spkt->satapkt_cmd;
2021 scmd->satacmd_features_reg = regn & 0xff;
2022 scmd->satacmd_features_reg_ext = (regn >> 8) & 0xff;
2023 scmd->satacmd_device_reg = sd->satadev_addr.pmport;
2024 scmd->satacmd_addr_type = 0; /* N/A */
2025
2026 scmd->satacmd_flags.sata_ignore_dev_reset = B_TRUE;
2027
2028 if (type == SATA_RDWR_PMULT_PKT_TYPE_READ) {
2029 scmd->satacmd_cmd_reg = SATAC_READ_PORTMULT;
2030 scmd->satacmd_flags.sata_data_direction = SATA_DIR_READ;
2031 scmd->satacmd_flags.sata_special_regs = 1;
2032 scmd->satacmd_flags.sata_copy_out_lba_high_lsb = 1;
2033 scmd->satacmd_flags.sata_copy_out_lba_mid_lsb = 1;
2034 scmd->satacmd_flags.sata_copy_out_lba_low_lsb = 1;
2035 scmd->satacmd_flags.sata_copy_out_sec_count_lsb = 1;
2036 } else if (type == SATA_RDWR_PMULT_PKT_TYPE_WRITE) {
2037 scmd->satacmd_cmd_reg = SATAC_WRITE_PORTMULT;
2038 scmd->satacmd_flags.sata_data_direction = SATA_DIR_WRITE;
2039 scmd->satacmd_sec_count_lsb = regv & 0xff;
2040 scmd->satacmd_lba_low_lsb = regv >> 8 & 0xff;
2041 scmd->satacmd_lba_mid_lsb = regv >> 16 & 0xff;
2042 scmd->satacmd_lba_high_lsb = regv >> 24 & 0xff;
2043 }
2044
2045 return (spkt);
2046 }
2047
2048 /*
2049 * Free sata packet and any associated resources allocated previously by
2050 * sata_get_rdwr_pmult_pkt().
2051 *
2052 * Void return.
2053 */
2054 void
sata_free_rdwr_pmult_pkt(sata_pkt_t * sata_pkt)2055 sata_free_rdwr_pmult_pkt(sata_pkt_t *sata_pkt)
2056 {
2057 sata_pkt_txlate_t *spx =
2058 (sata_pkt_txlate_t *)sata_pkt->satapkt_framework_private;
2059
2060 /* Free allocated resources */
2061 sata_pkt_free(spx);
2062 kmem_free(spx, sizeof (sata_pkt_txlate_t));
2063 }
2064
2065 /*
2066 * Register a port multiplier to framework.
2067 * 1) Store the GSCR values in the previous allocated pmult_info strctures.
2068 * 2) Search in the blacklist and update the number of the device ports of the
2069 * port multiplier.
2070 *
2071 * Void return.
2072 */
2073 void
sata_register_pmult(dev_info_t * dip,sata_device_t * sd,sata_pmult_gscr_t * sg)2074 sata_register_pmult(dev_info_t *dip, sata_device_t *sd, sata_pmult_gscr_t *sg)
2075 {
2076 sata_hba_inst_t *sata_hba_inst = NULL;
2077 sata_pmult_info_t *pmultinfo;
2078 sata_pmult_bl_t *blp;
2079 int cport = sd->satadev_addr.cport;
2080
2081 mutex_enter(&sata_mutex);
2082 for (sata_hba_inst = sata_hba_list; sata_hba_inst != NULL;
2083 sata_hba_inst = sata_hba_inst->satahba_next) {
2084 if (SATA_DIP(sata_hba_inst) == dip)
2085 if (sata_hba_inst->satahba_attached == 1)
2086 break;
2087 }
2088 mutex_exit(&sata_mutex);
2089 /* HBA not attached? */
2090 if (sata_hba_inst == NULL)
2091 return;
2092
2093 /* Number of pmports */
2094 sd->satadev_add_info = sg->gscr2 & SATA_PMULT_PORTNUM_MASK;
2095
2096 /* Check the blacklist */
2097 for (blp = sata_pmult_blacklist; blp->bl_gscr0; blp++) {
2098 if (sg->gscr0 != blp->bl_gscr0 && blp->bl_gscr0)
2099 continue;
2100 if (sg->gscr1 != blp->bl_gscr1 && blp->bl_gscr1)
2101 continue;
2102 if (sg->gscr2 != blp->bl_gscr2 && blp->bl_gscr2)
2103 continue;
2104
2105 cmn_err(CE_WARN, "!Port multiplier is on the blacklist.");
2106 sd->satadev_add_info = blp->bl_flags;
2107 break;
2108 }
2109
2110 /* Register the port multiplier GSCR */
2111 mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst, cport)));
2112 pmultinfo = SATA_PMULT_INFO(sata_hba_inst, cport);
2113 if (pmultinfo != NULL) {
2114 pmultinfo->pmult_gscr = *sg;
2115 pmultinfo->pmult_num_dev_ports =
2116 sd->satadev_add_info & SATA_PMULT_PORTNUM_MASK;
2117 SATADBG1(SATA_DBG_PMULT, sata_hba_inst,
2118 "Port multiplier registered at port %d", cport);
2119 }
2120 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst, cport)));
2121 }
2122
2123 /*
2124 * sata_split_model splits the model ID into vendor and product IDs.
2125 * It assumes that a vendor ID cannot be longer than 8 characters, and
2126 * that vendor and product ID are separated by a whitespace.
2127 */
2128 void
sata_split_model(char * model,char ** vendor,char ** product)2129 sata_split_model(char *model, char **vendor, char **product)
2130 {
2131 int i, modlen;
2132 char *vid, *pid;
2133
2134 /*
2135 * remove whitespace at the end of model
2136 */
2137 for (i = SATA_ID_MODEL_LEN; i > 0; i--)
2138 if (model[i] == ' ' || model[i] == '\t' || model[i] == '\0')
2139 model[i] = '\0';
2140 else
2141 break;
2142
2143 /*
2144 * try to split model into into vid/pid
2145 */
2146 modlen = strlen(model);
2147 for (i = 0, pid = model; i < modlen; i++, pid++)
2148 if ((*pid == ' ') || (*pid == '\t'))
2149 break;
2150
2151 /*
2152 * only use vid if it is less than 8 chars (as in SCSI)
2153 */
2154 if (i < modlen && i <= 8) {
2155 vid = model;
2156 /*
2157 * terminate vid, establish pid
2158 */
2159 *pid++ = '\0';
2160 } else {
2161 /*
2162 * vid will stay "ATA "
2163 */
2164 vid = NULL;
2165 /*
2166 * model is all pid
2167 */
2168 pid = model;
2169 }
2170
2171 *vendor = vid;
2172 *product = pid;
2173 }
2174
2175 /*
2176 * sata_name_child is for composing the name of the node
2177 * the format of the name is "target,0".
2178 */
2179 static int
sata_name_child(dev_info_t * dip,char * name,int namelen)2180 sata_name_child(dev_info_t *dip, char *name, int namelen)
2181 {
2182 int target;
2183
2184 target = ddi_prop_get_int(DDI_DEV_T_ANY, dip,
2185 DDI_PROP_DONTPASS, "target", -1);
2186 if (target == -1)
2187 return (DDI_FAILURE);
2188 (void) snprintf(name, namelen, "%x,0", target);
2189 return (DDI_SUCCESS);
2190 }
2191
2192
2193
2194 /* ****************** SCSA required entry points *********************** */
2195
2196 /*
2197 * Implementation of scsi tran_tgt_init.
2198 * sata_scsi_tgt_init() initializes scsi_device structure
2199 *
2200 * If successful, DDI_SUCCESS is returned.
2201 * DDI_FAILURE is returned if addressed device does not exist
2202 */
2203
2204 static int
sata_scsi_tgt_init(dev_info_t * hba_dip,dev_info_t * tgt_dip,scsi_hba_tran_t * hba_tran,struct scsi_device * sd)2205 sata_scsi_tgt_init(dev_info_t *hba_dip, dev_info_t *tgt_dip,
2206 scsi_hba_tran_t *hba_tran, struct scsi_device *sd)
2207 {
2208 #ifndef __lock_lint
2209 _NOTE(ARGUNUSED(hba_dip))
2210 _NOTE(ARGUNUSED(tgt_dip))
2211 #endif
2212 sata_device_t sata_device;
2213 sata_drive_info_t *sdinfo;
2214 struct sata_id *sid;
2215 sata_hba_inst_t *sata_hba_inst;
2216 char model[SATA_ID_MODEL_LEN + 1];
2217 char fw[SATA_ID_FW_LEN + 1];
2218 char *vid, *pid;
2219
2220 /*
2221 * Fail tran_tgt_init for .conf stub node
2222 */
2223 if (ndi_dev_is_persistent_node(tgt_dip) == 0) {
2224 (void) ndi_merge_node(tgt_dip, sata_name_child);
2225 ddi_set_name_addr(tgt_dip, NULL);
2226 return (DDI_FAILURE);
2227 }
2228
2229 sata_hba_inst = (sata_hba_inst_t *)(hba_tran->tran_hba_private);
2230
2231 /* Validate scsi device address */
2232 if (sata_validate_scsi_address(sata_hba_inst, &sd->sd_address,
2233 &sata_device) != 0)
2234 return (DDI_FAILURE);
2235
2236 mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst,
2237 sata_device.satadev_addr.cport)));
2238
2239 /* sata_device now contains a valid sata address */
2240 sdinfo = sata_get_device_info(sata_hba_inst, &sata_device);
2241 if (sdinfo == NULL) {
2242 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
2243 sata_device.satadev_addr.cport)));
2244 return (DDI_FAILURE);
2245 }
2246 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
2247 sata_device.satadev_addr.cport)));
2248
2249 /*
2250 * Check if we need to create a legacy devid (i.e cmdk style) for
2251 * the target disks.
2252 *
2253 * HBA devinfo node will have the property "use-cmdk-devid-format"
2254 * if we need to create cmdk-style devid for all the disk devices
2255 * attached to this controller. This property may have been set
2256 * from HBA driver's .conf file or by the HBA driver in its
2257 * attach(9E) function.
2258 */
2259 if ((sdinfo->satadrv_type == SATA_DTYPE_ATADISK) &&
2260 (ddi_getprop(DDI_DEV_T_ANY, hba_dip, DDI_PROP_DONTPASS,
2261 "use-cmdk-devid-format", 0) == 1)) {
2262 /* register a legacy devid for this target node */
2263 sata_target_devid_register(tgt_dip, sdinfo);
2264 }
2265
2266
2267 /*
2268 * 'Identify Device Data' does not always fit in standard SCSI
2269 * INQUIRY data, so establish INQUIRY_* properties with full-form
2270 * of information.
2271 */
2272 sid = &sdinfo->satadrv_id;
2273 #ifdef _LITTLE_ENDIAN
2274 swab(sid->ai_model, model, SATA_ID_MODEL_LEN);
2275 swab(sid->ai_fw, fw, SATA_ID_FW_LEN);
2276 #else /* _LITTLE_ENDIAN */
2277 bcopy(sid->ai_model, model, SATA_ID_MODEL_LEN);
2278 bcopy(sid->ai_fw, fw, SATA_ID_FW_LEN);
2279 #endif /* _LITTLE_ENDIAN */
2280 model[SATA_ID_MODEL_LEN] = 0;
2281 fw[SATA_ID_FW_LEN] = 0;
2282
2283 sata_split_model(model, &vid, &pid);
2284
2285 if (vid)
2286 (void) scsi_device_prop_update_inqstring(sd, INQUIRY_VENDOR_ID,
2287 vid, strlen(vid));
2288 if (pid)
2289 (void) scsi_device_prop_update_inqstring(sd, INQUIRY_PRODUCT_ID,
2290 pid, strlen(pid));
2291 (void) scsi_device_prop_update_inqstring(sd, INQUIRY_REVISION_ID,
2292 fw, strlen(fw));
2293
2294 return (DDI_SUCCESS);
2295 }
2296
2297 /*
2298 * Implementation of scsi tran_tgt_probe.
2299 * Probe target, by calling default scsi routine scsi_hba_probe()
2300 */
2301 static int
sata_scsi_tgt_probe(struct scsi_device * sd,int (* callback)(void))2302 sata_scsi_tgt_probe(struct scsi_device *sd, int (*callback)(void))
2303 {
2304 sata_hba_inst_t *sata_hba_inst =
2305 (sata_hba_inst_t *)(sd->sd_address.a_hba_tran->tran_hba_private);
2306 int rval;
2307 uint32_t pm_cap;
2308
2309 rval = scsi_hba_probe(sd, callback);
2310 pm_cap = SATA_CAP_POWER_CONDITON | SATA_CAP_SMART_PAGE |
2311 SATA_CAP_LOG_SENSE;
2312
2313 if (rval == SCSIPROBE_EXISTS) {
2314 /*
2315 * Set property "pm-capable" on the target device node, so that
2316 * the target driver will not try to fetch scsi cycle counters
2317 * before enabling device power-management.
2318 */
2319 if ((ddi_prop_update_int(DDI_DEV_T_NONE, sd->sd_dev,
2320 "pm-capable", pm_cap)) != DDI_PROP_SUCCESS) {
2321 sata_log(sata_hba_inst, CE_WARN,
2322 "SATA device at port %d: "
2323 "will not be power-managed ",
2324 SCSI_TO_SATA_CPORT(sd->sd_address.a_target));
2325 SATA_LOG_D((sata_hba_inst, CE_WARN,
2326 "failure updating pm-capable property"));
2327 }
2328 }
2329 return (rval);
2330 }
2331
2332 /*
2333 * Implementation of scsi tran_tgt_free.
2334 * Release all resources allocated for scsi_device
2335 */
2336 static void
sata_scsi_tgt_free(dev_info_t * hba_dip,dev_info_t * tgt_dip,scsi_hba_tran_t * hba_tran,struct scsi_device * sd)2337 sata_scsi_tgt_free(dev_info_t *hba_dip, dev_info_t *tgt_dip,
2338 scsi_hba_tran_t *hba_tran, struct scsi_device *sd)
2339 {
2340 #ifndef __lock_lint
2341 _NOTE(ARGUNUSED(hba_dip))
2342 #endif
2343 sata_device_t sata_device;
2344 sata_drive_info_t *sdinfo;
2345 sata_hba_inst_t *sata_hba_inst;
2346 ddi_devid_t devid;
2347
2348 sata_hba_inst = (sata_hba_inst_t *)(hba_tran->tran_hba_private);
2349
2350 /* Validate scsi device address */
2351 /*
2352 * Note: tgt_free relates to the SCSA view of a device. If called, there
2353 * was a device at this address, so even if the sata framework internal
2354 * resources were alredy released because a device was detached,
2355 * this function should be executed as long as its actions do
2356 * not require the internal sata view of a device and the address
2357 * refers to a valid sata address.
2358 * Validating the address here means that we do not trust SCSA...
2359 */
2360 if (sata_validate_scsi_address(sata_hba_inst, &sd->sd_address,
2361 &sata_device) == -1)
2362 return;
2363
2364 mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst,
2365 sata_device.satadev_addr.cport)));
2366
2367 /* sata_device now should contain a valid sata address */
2368 sdinfo = sata_get_device_info(sata_hba_inst, &sata_device);
2369 if (sdinfo == NULL) {
2370 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
2371 sata_device.satadev_addr.cport)));
2372 return;
2373 }
2374 /*
2375 * We did not allocate any resources in sata_scsi_tgt_init()
2376 * other than few properties.
2377 * Free them.
2378 */
2379 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
2380 sata_device.satadev_addr.cport)));
2381 (void) ndi_prop_remove(DDI_DEV_T_NONE, tgt_dip, "pm-capable");
2382
2383 /*
2384 * If devid was previously created but not freed up from
2385 * sd(4D) driver (i.e during detach(9E)) then do it here.
2386 */
2387 if ((sdinfo->satadrv_type == SATA_DTYPE_ATADISK) &&
2388 (ddi_getprop(DDI_DEV_T_ANY, hba_dip, DDI_PROP_DONTPASS,
2389 "use-cmdk-devid-format", 0) == 1) &&
2390 (ddi_devid_get(tgt_dip, &devid) == DDI_SUCCESS)) {
2391 ddi_devid_unregister(tgt_dip);
2392 ddi_devid_free(devid);
2393 }
2394 }
2395
2396 /*
2397 * Implementation of scsi tran_init_pkt
2398 * Upon successful return, scsi pkt buffer has DMA resources allocated.
2399 *
2400 * It seems that we should always allocate pkt, even if the address is
2401 * for non-existing device - just use some default for dma_attr.
2402 * The reason is that there is no way to communicate this to a caller here.
2403 * Subsequent call to sata_scsi_start may fail appropriately.
2404 * Simply returning NULL does not seem to discourage a target driver...
2405 *
2406 * Returns a pointer to initialized scsi_pkt, or NULL otherwise.
2407 */
2408 static struct scsi_pkt *
sata_scsi_init_pkt(struct scsi_address * ap,struct scsi_pkt * pkt,struct buf * bp,int cmdlen,int statuslen,int tgtlen,int flags,int (* callback)(caddr_t),caddr_t arg)2409 sata_scsi_init_pkt(struct scsi_address *ap, struct scsi_pkt *pkt,
2410 struct buf *bp, int cmdlen, int statuslen, int tgtlen, int flags,
2411 int (*callback)(caddr_t), caddr_t arg)
2412 {
2413 sata_hba_inst_t *sata_hba_inst =
2414 (sata_hba_inst_t *)(ap->a_hba_tran->tran_hba_private);
2415 dev_info_t *dip = SATA_DIP(sata_hba_inst);
2416 sata_device_t sata_device;
2417 sata_drive_info_t *sdinfo;
2418 sata_pkt_txlate_t *spx;
2419 ddi_dma_attr_t cur_dma_attr;
2420 int rval;
2421 boolean_t new_pkt = B_TRUE;
2422
2423 ASSERT(ap->a_hba_tran->tran_hba_dip == dip);
2424
2425 /*
2426 * We need to translate the address, even if it could be
2427 * a bogus one, for a non-existing device
2428 */
2429 sata_device.satadev_addr.qual = SCSI_TO_SATA_ADDR_QUAL(ap->a_target);
2430 sata_device.satadev_addr.cport = SCSI_TO_SATA_CPORT(ap->a_target);
2431 sata_device.satadev_addr.pmport = SCSI_TO_SATA_PMPORT(ap->a_target);
2432 sata_device.satadev_rev = SATA_DEVICE_REV;
2433
2434 if (pkt == NULL) {
2435 /*
2436 * Have to allocate a brand new scsi packet.
2437 * We need to operate with auto request sense enabled.
2438 */
2439 pkt = scsi_hba_pkt_alloc(dip, ap, cmdlen,
2440 MAX(statuslen, SATA_MAX_SENSE_LEN),
2441 tgtlen, sizeof (sata_pkt_txlate_t), callback, arg);
2442
2443 if (pkt == NULL)
2444 return (NULL);
2445
2446 /* Fill scsi packet structure */
2447 pkt->pkt_comp = (void (*)())NULL;
2448 pkt->pkt_time = 0;
2449 pkt->pkt_resid = 0;
2450 pkt->pkt_statistics = 0;
2451 pkt->pkt_reason = 0;
2452
2453 /*
2454 * pkt_hba_private will point to sata pkt txlate structure
2455 */
2456 spx = (sata_pkt_txlate_t *)pkt->pkt_ha_private;
2457 bzero(spx, sizeof (sata_pkt_txlate_t));
2458
2459 spx->txlt_scsi_pkt = pkt;
2460 spx->txlt_sata_hba_inst = sata_hba_inst;
2461
2462 /* Allocate sata_pkt */
2463 spx->txlt_sata_pkt = sata_pkt_alloc(spx, callback);
2464 if (spx->txlt_sata_pkt == NULL) {
2465 /* Could not allocate sata pkt */
2466 scsi_hba_pkt_free(ap, pkt);
2467 return (NULL);
2468 }
2469 /* Set sata address */
2470 spx->txlt_sata_pkt->satapkt_device.satadev_addr =
2471 sata_device.satadev_addr;
2472 spx->txlt_sata_pkt->satapkt_device.satadev_rev =
2473 sata_device.satadev_rev;
2474
2475 if ((bp == NULL) || (bp->b_bcount == 0))
2476 return (pkt);
2477
2478 spx->txlt_total_residue = bp->b_bcount;
2479 } else {
2480 new_pkt = B_FALSE;
2481 /*
2482 * Packet was preallocated/initialized by previous call
2483 */
2484 spx = (sata_pkt_txlate_t *)pkt->pkt_ha_private;
2485
2486 if ((bp == NULL) || (bp->b_bcount == 0)) {
2487 return (pkt);
2488 }
2489
2490 /* Pkt is available already: spx->txlt_scsi_pkt == pkt; */
2491 }
2492
2493 spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp = bp;
2494
2495 /*
2496 * We use an adjusted version of the dma_attr, to account
2497 * for device addressing limitations.
2498 * sata_adjust_dma_attr() will handle sdinfo == NULL which may
2499 * happen when a device is not yet configured.
2500 */
2501 mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst,
2502 sata_device.satadev_addr.cport)));
2503 sdinfo = sata_get_device_info(spx->txlt_sata_hba_inst,
2504 &spx->txlt_sata_pkt->satapkt_device);
2505 /* NULL sdinfo may be passsed to sata_adjust_dma_attr() */
2506 sata_adjust_dma_attr(sdinfo,
2507 SATA_DMA_ATTR(spx->txlt_sata_hba_inst), &cur_dma_attr);
2508 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
2509 sata_device.satadev_addr.cport)));
2510 /*
2511 * Allocate necessary DMA resources for the packet's data buffer
2512 * NOTE:
2513 * In case of read/write commands, DMA resource allocation here is
2514 * based on the premise that the transfer length specified in
2515 * the read/write scsi cdb will match exactly DMA resources -
2516 * returning correct packet residue is crucial.
2517 */
2518 if ((rval = sata_dma_buf_setup(spx, flags, callback, arg,
2519 &cur_dma_attr)) != DDI_SUCCESS) {
2520 /*
2521 * If a DMA allocation request fails with
2522 * DDI_DMA_NOMAPPING, indicate the error by calling
2523 * bioerror(9F) with bp and an error code of EFAULT.
2524 * If a DMA allocation request fails with
2525 * DDI_DMA_TOOBIG, indicate the error by calling
2526 * bioerror(9F) with bp and an error code of EINVAL.
2527 * For DDI_DMA_NORESOURCES, we may have some of them allocated.
2528 * Request may be repeated later - there is no real error.
2529 */
2530 switch (rval) {
2531 case DDI_DMA_NORESOURCES:
2532 bioerror(bp, 0);
2533 break;
2534 case DDI_DMA_NOMAPPING:
2535 case DDI_DMA_BADATTR:
2536 bioerror(bp, EFAULT);
2537 break;
2538 case DDI_DMA_TOOBIG:
2539 default:
2540 bioerror(bp, EINVAL);
2541 break;
2542 }
2543 goto fail;
2544 }
2545
2546 if (sata_check_for_dma_error(dip, spx)) {
2547 ddi_fm_service_impact(dip, DDI_SERVICE_UNAFFECTED);
2548 bioerror(bp, EFAULT);
2549 goto fail;
2550 }
2551
2552 /* Set number of bytes that are not yet accounted for */
2553 pkt->pkt_resid = spx->txlt_total_residue;
2554 ASSERT(pkt->pkt_resid >= 0);
2555
2556 return (pkt);
2557
2558 fail:
2559 if (new_pkt == B_TRUE) {
2560 /*
2561 * Since this is a new packet, we can clean-up
2562 * everything
2563 */
2564 sata_scsi_destroy_pkt(ap, pkt);
2565 } else {
2566 /*
2567 * This is a re-used packet. It will be target driver's
2568 * responsibility to eventually destroy it (which
2569 * will free allocated resources).
2570 * Here, we just "complete" the request, leaving
2571 * allocated resources intact, so the request may
2572 * be retried.
2573 */
2574 spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp = NULL;
2575 sata_pkt_free(spx);
2576 }
2577 return (NULL);
2578 }
2579
2580 typedef enum sata_cmd_info_flags {
2581 SCF_NONE = 0,
2582 SCF_SVC_ACT = (1 << 0), /* Op uses SVC ACTION field */
2583 SCF_MAPIN = (1 << 1), /* Op doesn't map in buf */
2584 } sata_cmd_info_flags_t;
2585
2586 /* The largest CDB we support */
2587 #define CDB_MAXLEN 16
2588
2589 /*
2590 * New commands should be added to this struct. This is used to both
2591 * dispatch commands as well as with REPORT SUPPORTED OPERATIONS.
2592 * Currently no order is required for these.
2593 */
2594 static const struct sata_cmd_info {
2595 uint8_t sci_op; /* SCSI op code */
2596 uint16_t sci_svcact; /* SCSI service action */
2597 sata_cmd_info_flags_t sci_flags;
2598 int (*sci_cmd)(sata_pkt_txlate_t *spx);
2599 boolean_t (*sci_supported)(sata_pkt_txlate_t *,
2600 sata_drive_info_t *);
2601 uint8_t sci_cdbusage[CDB_MAXLEN];
2602 } sata_cmd_info[] = {
2603 { SCMD_INQUIRY, 0, SCF_MAPIN, sata_txlt_inquiry, NULL,
2604 { SCMD_INQUIRY, 0x01, 0xff, 0xff, 0xff, 0x00 } },
2605 { SCMD_TEST_UNIT_READY, 0, SCF_NONE, sata_txlt_test_unit_ready, NULL,
2606 { SCMD_TEST_UNIT_READY, 0x00, 0x00, 0x00, 0x00, 0x00 } },
2607 { SCMD_START_STOP, 0, SCF_NONE, sata_txlt_start_stop_unit, NULL,
2608 { SCMD_START_STOP, 0x01, 0x00, 0x0f, 0xf7, 0x00 } },
2609 { SCMD_READ_CAPACITY, 0, SCF_MAPIN, sata_txlt_read_capacity, NULL,
2610 { SCMD_READ_CAPACITY, 0x00, 0x00, 0x00, 0x00, 0x00 } },
2611 { SCMD_SVC_ACTION_IN_G4, SSVC_ACTION_READ_CAPACITY_G4,
2612 SCF_SVC_ACT|SCF_MAPIN, sata_txlt_read_capacity16, NULL,
2613 { SCMD_SVC_ACTION_IN_G4, SSVC_ACTION_READ_CAPACITY_G4, 0x00, 0x00,
2614 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00,
2615 0x00 } },
2616 { SCMD_REQUEST_SENSE, 0, SCF_MAPIN, sata_txlt_request_sense, NULL,
2617 { SCMD_REQUEST_SENSE, 0x00, 0x00, 0x00, 0x00, 0x00 } },
2618 { SCMD_LOG_SENSE_G1, 0, SCF_MAPIN, sata_txlt_log_sense, NULL,
2619 { SCMD_LOG_SENSE_G1, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff,
2620 0xff } },
2621 { SCMD_MODE_SENSE, 0, SCF_MAPIN, sata_txlt_mode_sense, NULL,
2622 { SCMD_MODE_SENSE, 0x08, 0xff, 0xff, 0xff, 0x00 } },
2623 { SCMD_MODE_SENSE_G1, 0, SCF_MAPIN, sata_txlt_mode_sense, NULL,
2624 { SCMD_MODE_SENSE_G1, 0x18, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff,
2625 0xff, 0x00 } },
2626 { SCMD_MODE_SELECT, 0, SCF_MAPIN, sata_txlt_mode_select, NULL,
2627 { SCMD_MODE_SELECT, 0x00, 0x00, 0x00, 0xff, 0x00 } },
2628 { SCMD_MODE_SELECT_G1, 0, SCF_MAPIN, sata_txlt_mode_select, NULL,
2629 { SCMD_MODE_SELECT_G1, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00 } },
2630 { SCMD_SYNCHRONIZE_CACHE, 0, SCF_NONE, sata_txlt_synchronize_cache,
2631 NULL, { SCMD_SYNCHRONIZE_CACHE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2632 0x00, 0x00, 0x00 } },
2633 { SCMD_SYNCHRONIZE_CACHE_G1, 0, SCF_NONE,
2634 sata_txlt_synchronize_cache, NULL,
2635 { SCMD_SYNCHRONIZE_CACHE_G1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2636 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } },
2637 { SCMD_READ, 0, SCF_NONE, sata_txlt_read, NULL,
2638 { SCMD_READ, 0x1f, 0xff, 0xff, 0xff, 0x00 } },
2639 { SCMD_READ_G1, 0, SCF_NONE, sata_txlt_read, NULL,
2640 { SCMD_READ_G1, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0xff, 0xff,
2641 0x00 } },
2642 { SCMD_READ_G4, 0, SCF_NONE, sata_txlt_read, NULL,
2643 { SCMD_READ_G4, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
2644 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00 } },
2645 { SCMD_READ_G5, 0, SCF_NONE, sata_txlt_read, NULL,
2646 { SCMD_READ_G5, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
2647 0xff, 0x00, 0x00 } },
2648 { SCMD_WRITE_BUFFER, 0, SCF_MAPIN, sata_txlt_write_buffer, NULL,
2649 { SCMD_WRITE_BUFFER, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2650 0x00 } },
2651 { SCMD_WRITE, 0, SCF_NONE, sata_txlt_write, NULL,
2652 { SCMD_WRITE, 0x1f, 0xff, 0xff, 0xff, 0x00, 0x00 } },
2653 { SCMD_WRITE_G1, 0, SCF_NONE, sata_txlt_write, NULL,
2654 { SCMD_WRITE_G1, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0xff, 0xff,
2655 0x00 } },
2656 { SCMD_WRITE_G4, 0, SCF_NONE, sata_txlt_write, NULL,
2657 { SCMD_WRITE_G4, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
2658 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00 } },
2659 { SCMD_WRITE_G5, 0, SCF_NONE, sata_txlt_write, NULL,
2660 { SCMD_WRITE_G5, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
2661 0xff, 0x00, 0x00 } },
2662 { SCMD_SEEK, 0, SCF_NONE, sata_txlt_nodata_cmd_immediate, NULL,
2663 { SCMD_SEEK, 0x00, 0x00, 0x00, 0x00, 0x00 } },
2664 { SPC3_CMD_ATA_COMMAND_PASS_THROUGH12, 0, SCF_MAPIN,
2665 sata_txlt_ata_pass_thru, NULL,
2666 { SPC3_CMD_ATA_COMMAND_PASS_THROUGH12, 0x1e, 0xff, 0xff, 0xff,
2667 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00 } },
2668 { SPC3_CMD_ATA_COMMAND_PASS_THROUGH16, 0, SCF_MAPIN,
2669 sata_txlt_ata_pass_thru, NULL,
2670 { SPC3_CMD_ATA_COMMAND_PASS_THROUGH16, 0x1f, 0xff, 0xff, 0xff, 0xff,
2671 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff } },
2672 { SPC3_CMD_UNMAP, 0, SCF_MAPIN, sata_txlt_unmap,
2673 sata_txlt_unmap_supported, { SPC3_CMD_UNMAP, 0x00, 0x00, 0x00, 0x00,
2674 0x00, 0x00, 0xff, 0xff, 0x00 } },
2675 { SCMD_MAINTENANCE_IN, SSVC_ACTION_GET_SUPPORTED_OPERATIONS,
2676 SCF_SVC_ACT|SCF_MAPIN, sata_txlt_supported_ops, NULL,
2677 { SCMD_MAINTENANCE_IN, SSVC_ACTION_GET_SUPPORTED_OPERATIONS, 0x07,
2678 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00 } },
2679 };
2680
2681 static const struct sata_cmd_info scmd_invalid = {
2682 .sci_op = 0,
2683 .sci_svcact = 0,
2684 .sci_flags = SCF_NONE,
2685 .sci_cmd = sata_txlt_invalid_command,
2686 .sci_supported = NULL,
2687 };
2688
2689 static inline uint16_t
sata_cmd_cdblen(const struct sata_cmd_info * cmd)2690 sata_cmd_cdblen(const struct sata_cmd_info *cmd)
2691 {
2692 switch (CDB_GROUPID(cmd->sci_op)) {
2693 case CDB_GROUPID_0:
2694 return (CDB_GROUP0);
2695 case CDB_GROUPID_1:
2696 return (CDB_GROUP1);
2697 case CDB_GROUPID_2:
2698 return (CDB_GROUP2);
2699 case CDB_GROUPID_3:
2700 return (CDB_GROUP3);
2701 case CDB_GROUPID_4:
2702 return (CDB_GROUP4);
2703 case CDB_GROUPID_5:
2704 return (CDB_GROUP5);
2705 case CDB_GROUPID_6:
2706 return (CDB_GROUP6);
2707 case CDB_GROUPID_7:
2708 return (CDB_GROUP7);
2709 default:
2710 /* We should never get here */
2711 cmn_err(CE_PANIC, "invalid CDB size for op %x\n", cmd->sci_op);
2712
2713 #ifndef __CHECKER__
2714 /* Make gcc happy */
2715 return (0);
2716 #endif
2717 }
2718 }
2719
2720 /*
2721 * Implementation of scsi tran_start.
2722 * Translate scsi cmd into sata operation and return status.
2723 * ATAPI CDBs are passed to ATAPI devices - the device determines what commands
2724 * are supported.
2725 * For SATA hard disks, supported scsi commands:
2726 * SCMD_INQUIRY
2727 * SCMD_TEST_UNIT_READY
2728 * SCMD_START_STOP
2729 * SCMD_READ_CAPACITY
2730 * SCMD_SVC_ACTION_IN_G4 (READ CAPACITY (16))
2731 * SCMD_REQUEST_SENSE
2732 * SCMD_LOG_SENSE_G1
2733 * SCMD_LOG_SELECT_G1
2734 * SCMD_MODE_SENSE (specific pages)
2735 * SCMD_MODE_SENSE_G1 (specific pages)
2736 * SCMD_MODE_SELECT (specific pages)
2737 * SCMD_MODE_SELECT_G1 (specific pages)
2738 * SCMD_SYNCHRONIZE_CACHE
2739 * SCMD_SYNCHRONIZE_CACHE_G1
2740 * SCMD_READ
2741 * SCMD_READ_G1
2742 * SCMD_READ_G4
2743 * SCMD_READ_G5
2744 * SCMD_WRITE
2745 * SCMD_WRITE_BUFFER
2746 * SCMD_WRITE_G1
2747 * SCMD_WRITE_G4
2748 * SCMD_WRITE_G5
2749 * SCMD_SEEK (noop)
2750 * SCMD_SDIAG
2751 * SCMD_MAINTENANCE_IN (SSVC_ACTION_GET_SUPPORTED_OPERATIONS)
2752 *
2753 * All other commands are rejected as unsupported.
2754 *
2755 * Returns:
2756 * TRAN_ACCEPT if command was executed successfully or accepted by HBA driver
2757 * for execution. TRAN_ACCEPT may be returned also if device was removed but
2758 * a callback could be scheduled.
2759 * TRAN_BADPKT if cmd was directed to invalid address.
2760 * TRAN_FATAL_ERROR is command was rejected due to hardware error, including
2761 * some unspecified error. TRAN_FATAL_ERROR may be also returned if a device
2762 * was removed and there was no callback specified in scsi pkt.
2763 * TRAN_BUSY if command could not be executed becasue HBA driver or SATA
2764 * framework was busy performing some other operation(s).
2765 *
2766 */
2767 static int
sata_scsi_start(struct scsi_address * ap,struct scsi_pkt * pkt)2768 sata_scsi_start(struct scsi_address *ap, struct scsi_pkt *pkt)
2769 {
2770 sata_hba_inst_t *sata_hba_inst =
2771 (sata_hba_inst_t *)(ap->a_hba_tran->tran_hba_private);
2772 sata_pkt_txlate_t *spx = (sata_pkt_txlate_t *)pkt->pkt_ha_private;
2773 sata_device_t *sdevice = &spx->txlt_sata_pkt->satapkt_device;
2774 sata_drive_info_t *sdinfo = NULL;
2775 struct buf *bp;
2776 uint8_t cport, pmport;
2777 boolean_t dev_gone = B_FALSE;
2778 int rval;
2779
2780 SATADBG1(SATA_DBG_SCSI_IF, sata_hba_inst,
2781 "sata_scsi_start: cmd 0x%02x\n", pkt->pkt_cdbp[0]);
2782
2783 ASSERT3P(spx, !=, NULL);
2784 ASSERT3P(spx->txlt_scsi_pkt, ==, pkt);
2785 ASSERT3P(spx->txlt_scsi_pkt, !=, NULL);
2786
2787 cport = SCSI_TO_SATA_CPORT(ap->a_target);
2788 pmport = SCSI_TO_SATA_PMPORT(ap->a_target);
2789
2790 mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst, cport)));
2791
2792 if (sdevice->satadev_addr.qual == SATA_ADDR_DCPORT) {
2793 sdinfo = sata_get_device_info(sata_hba_inst, sdevice);
2794 if (sdinfo == NULL ||
2795 SATA_CPORT_INFO(sata_hba_inst, cport)->
2796 cport_tgtnode_clean == B_FALSE ||
2797 (sdinfo->satadrv_state & SATA_DSTATE_FAILED) != 0) {
2798 dev_gone = B_TRUE;
2799 }
2800 } else if (sdevice->satadev_addr.qual == SATA_ADDR_DPMPORT) {
2801 if (SATA_CPORT_DEV_TYPE(sata_hba_inst, cport) !=
2802 SATA_DTYPE_PMULT || SATA_PMULT_INFO(sata_hba_inst,
2803 cport) == NULL) {
2804 dev_gone = B_TRUE;
2805 } else if (SATA_PMPORT_INFO(sata_hba_inst, cport,
2806 pmport) == NULL) {
2807 dev_gone = B_TRUE;
2808 } else {
2809 mutex_enter(&(SATA_PMPORT_MUTEX(sata_hba_inst,
2810 cport, pmport)));
2811 sdinfo = sata_get_device_info(sata_hba_inst, sdevice);
2812 if (sdinfo == NULL ||
2813 SATA_PMPORT_INFO(sata_hba_inst, cport, pmport)->
2814 pmport_tgtnode_clean == B_FALSE ||
2815 (sdinfo->satadrv_state & SATA_DSTATE_FAILED) != 0) {
2816 dev_gone = B_TRUE;
2817 }
2818 mutex_exit(&(SATA_PMPORT_MUTEX(sata_hba_inst,
2819 cport, pmport)));
2820 }
2821 }
2822
2823 if (dev_gone == B_TRUE) {
2824 taskq_t *tq = SATA_TXLT_TASKQ(spx);
2825 task_func_t *func = (task_func_t *)pkt->pkt_comp;
2826 uint_t flags = servicing_interrupt() ?
2827 TQ_NOSLEEP : TQ_SLEEP;
2828
2829 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst, cport)));
2830 pkt->pkt_reason = CMD_DEV_GONE;
2831
2832 /*
2833 * The sd target driver is checking CMD_DEV_GONE pkt_reason
2834 * only in the callback function (for normal requests) and
2835 * in the dump code path.
2836 *
2837 * If the callback is available, we need to dispatch
2838 * the callback rather than returning TRAN_FATAL_ERROR here.
2839 */
2840 if (pkt->pkt_comp == NULL)
2841 return (TRAN_FATAL_ERROR);
2842
2843 if (taskq_dispatch(tq, func, pkt, flags) == TASKQID_INVALID)
2844 return (TRAN_BUSY);
2845
2846 return (TRAN_ACCEPT);
2847 }
2848
2849 if (sdinfo->satadrv_type & SATA_DTYPE_ATAPI) {
2850 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst, cport)));
2851 rval = sata_txlt_atapi(spx);
2852 SATADBG1(SATA_DBG_SCSI_IF, sata_hba_inst,
2853 "sata_scsi_start atapi: rval %d\n", rval);
2854 return (rval);
2855 }
2856
2857 /*
2858 * Checking for power state, if it was on
2859 * STOPPED state, then the drive is not capable
2860 * of processing media access command. And
2861 * TEST_UNIT_READY, REQUEST_SENSE has special handling
2862 * in the function for different power state.
2863 */
2864 if (((sdinfo->satadrv_power_level == SATA_POWER_STANDBY) ||
2865 (sdinfo->satadrv_power_level == SATA_POWER_STOPPED)) &&
2866 (SATA_IS_MEDIUM_ACCESS_CMD(pkt->pkt_cdbp[0]))) {
2867 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst, cport)));
2868 return (sata_txlt_check_condition(spx, KEY_NOT_READY,
2869 SD_SCSI_ASC_LU_NOT_READY));
2870 }
2871
2872 /* ATA Disk commands processing starts here */
2873
2874 bp = spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp;
2875
2876 /*
2877 * Default cmd to 'invalid command'. If the SCSI OP doesn't
2878 * exist in sata_cmd_info, we fall back to this (which returns
2879 * INVALID OPERATION CODE).
2880 */
2881 const struct sata_cmd_info *cmd = &scmd_invalid;
2882
2883 for (uint_t i = 0; i < ARRAY_SIZE(sata_cmd_info); i++) {
2884 if (pkt->pkt_cdbp[0] != sata_cmd_info[i].sci_op)
2885 continue;
2886
2887 if ((sata_cmd_info[i].sci_flags & SCF_SVC_ACT) != 0 &&
2888 (pkt->pkt_cdbp[1] & 0x1f) != sata_cmd_info[i].sci_svcact) {
2889 continue;
2890 }
2891
2892 cmd = &sata_cmd_info[i];
2893 break;
2894 }
2895
2896 if (cmd->sci_supported != NULL && !cmd->sci_supported(spx, sdinfo)) {
2897 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst, cport)));
2898 return (sata_txlt_invalid_command(spx));
2899 }
2900
2901 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst, cport)));
2902
2903 if ((cmd->sci_flags & SCF_MAPIN) && bp != NULL &&
2904 (bp->b_flags & (B_PHYS | B_PAGEIO))) {
2905 bp_mapin(bp);
2906 }
2907
2908 rval = cmd->sci_cmd(spx);
2909
2910 SATADBG1(SATA_DBG_SCSI_IF, sata_hba_inst,
2911 "sata_scsi_start: rval %d\n", rval);
2912
2913 return (rval);
2914 }
2915
2916 /*
2917 * Implementation of scsi tran_abort.
2918 * Abort specific pkt or all packets.
2919 *
2920 * Returns 1 if one or more packets were aborted, returns 0 otherwise
2921 *
2922 * May be called from an interrupt level.
2923 */
2924 static int
sata_scsi_abort(struct scsi_address * ap,struct scsi_pkt * scsi_pkt)2925 sata_scsi_abort(struct scsi_address *ap, struct scsi_pkt *scsi_pkt)
2926 {
2927 sata_hba_inst_t *sata_hba_inst =
2928 (sata_hba_inst_t *)(ap->a_hba_tran->tran_hba_private);
2929 sata_device_t sata_device;
2930 sata_pkt_t *sata_pkt;
2931
2932 SATADBG2(SATA_DBG_SCSI_IF, sata_hba_inst,
2933 "sata_scsi_abort: %s at target: 0x%x\n",
2934 scsi_pkt == NULL ? "all packets" : "one pkt", ap->a_target);
2935
2936 /* Validate address */
2937 if (sata_validate_scsi_address(sata_hba_inst, ap, &sata_device) != 0)
2938 /* Invalid address */
2939 return (0);
2940
2941 mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst,
2942 sata_device.satadev_addr.cport)));
2943 if (sata_get_device_info(sata_hba_inst, &sata_device) == NULL) {
2944 /* invalid address */
2945 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
2946 sata_device.satadev_addr.cport)));
2947 return (0);
2948 }
2949 if (scsi_pkt == NULL) {
2950 /*
2951 * Abort all packets.
2952 * Although we do not have specific packet, we still need
2953 * dummy packet structure to pass device address to HBA.
2954 * Allocate one, without sleeping. Fail if pkt cannot be
2955 * allocated.
2956 */
2957 sata_pkt = kmem_zalloc(sizeof (sata_pkt_t), KM_NOSLEEP);
2958 if (sata_pkt == NULL) {
2959 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
2960 sata_device.satadev_addr.cport)));
2961 SATA_LOG_D((sata_hba_inst, CE_WARN, "sata_pkt_abort: "
2962 "could not allocate sata_pkt"));
2963 return (0);
2964 }
2965 sata_pkt->satapkt_rev = SATA_PKT_REV;
2966 sata_pkt->satapkt_device = sata_device;
2967 sata_pkt->satapkt_device.satadev_rev = SATA_DEVICE_REV;
2968 } else {
2969 if (scsi_pkt->pkt_ha_private == NULL) {
2970 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
2971 sata_device.satadev_addr.cport)));
2972 return (0); /* Bad scsi pkt */
2973 }
2974 /* extract pointer to sata pkt */
2975 sata_pkt = ((sata_pkt_txlate_t *)scsi_pkt->pkt_ha_private)->
2976 txlt_sata_pkt;
2977 }
2978
2979 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
2980 sata_device.satadev_addr.cport)));
2981 /* Send abort request to HBA */
2982 if ((*SATA_ABORT_FUNC(sata_hba_inst))
2983 (SATA_DIP(sata_hba_inst), sata_pkt,
2984 scsi_pkt == NULL ? SATA_ABORT_ALL_PACKETS : SATA_ABORT_PACKET) ==
2985 SATA_SUCCESS) {
2986 if (scsi_pkt == NULL)
2987 kmem_free(sata_pkt, sizeof (sata_pkt_t));
2988 /* Success */
2989 return (1);
2990 }
2991 /* Else, something did not go right */
2992 if (scsi_pkt == NULL)
2993 kmem_free(sata_pkt, sizeof (sata_pkt_t));
2994 /* Failure */
2995 return (0);
2996 }
2997
2998
2999 /*
3000 * Implementation of scsi tran_reset.
3001 * RESET_ALL request is translated into port reset.
3002 * RESET_TARGET requests is translated into a device reset,
3003 * RESET_LUN request is accepted only for LUN 0 and translated into
3004 * device reset.
3005 * The target reset should cause all HBA active and queued packets to
3006 * be terminated and returned with pkt reason SATA_PKT_RESET prior to
3007 * the return. HBA should report reset event for the device.
3008 *
3009 * Returns 1 upon success, 0 upon failure.
3010 */
3011 static int
sata_scsi_reset(struct scsi_address * ap,int level)3012 sata_scsi_reset(struct scsi_address *ap, int level)
3013 {
3014 sata_hba_inst_t *sata_hba_inst =
3015 (sata_hba_inst_t *)(ap->a_hba_tran->tran_hba_private);
3016 sata_device_t sata_device;
3017 int val;
3018
3019 SATADBG2(SATA_DBG_SCSI_IF, sata_hba_inst,
3020 "sata_scsi_reset: level %d target: 0x%x\n",
3021 level, ap->a_target);
3022
3023 /* Validate address */
3024 val = sata_validate_scsi_address(sata_hba_inst, ap, &sata_device);
3025 if (val == -1)
3026 /* Invalid address */
3027 return (0);
3028
3029 mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst,
3030 sata_device.satadev_addr.cport)));
3031 if (sata_get_device_info(sata_hba_inst, &sata_device) == NULL) {
3032 /* invalid address */
3033 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
3034 sata_device.satadev_addr.cport)));
3035 return (0);
3036 }
3037 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
3038 sata_device.satadev_addr.cport)));
3039 if (level == RESET_ALL) {
3040 /* port reset */
3041 if (sata_device.satadev_addr.qual == SATA_ADDR_DCPORT)
3042 sata_device.satadev_addr.qual = SATA_ADDR_CPORT;
3043 else
3044 sata_device.satadev_addr.qual = SATA_ADDR_PMPORT;
3045
3046 if ((*SATA_RESET_DPORT_FUNC(sata_hba_inst))
3047 (SATA_DIP(sata_hba_inst), &sata_device) == SATA_SUCCESS)
3048 return (1);
3049 else
3050 return (0);
3051
3052 } else if (val == 0 &&
3053 (level == RESET_TARGET || level == RESET_LUN)) {
3054 /* reset device (device attached) */
3055 if ((*SATA_RESET_DPORT_FUNC(sata_hba_inst))
3056 (SATA_DIP(sata_hba_inst), &sata_device) == SATA_SUCCESS)
3057 return (1);
3058 else
3059 return (0);
3060 }
3061 return (0);
3062 }
3063
3064
3065 /*
3066 * Implementation of scsi tran_getcap (get transport/device capabilities).
3067 * Supported capabilities for SATA hard disks:
3068 * auto-rqsense (always supported)
3069 * tagged-qing (supported if HBA supports it)
3070 * untagged-qing (could be supported if disk supports it, but because
3071 * caching behavior allowing untagged queuing actually
3072 * results in reduced performance. sd tries to throttle
3073 * back to only 3 outstanding commands, which may
3074 * work for real SCSI disks, but with read ahead
3075 * caching, having more than 1 outstanding command
3076 * results in cache thrashing.)
3077 * sector_size
3078 * dma_max
3079 * interconnect-type (INTERCONNECT_SATA)
3080 *
3081 * Supported capabilities for ATAPI CD/DVD devices:
3082 * auto-rqsense (always supported)
3083 * sector_size
3084 * dma_max
3085 * max-cdb-length
3086 * interconnect-type (INTERCONNECT_SATA)
3087 *
3088 * Supported capabilities for ATAPI TAPE devices:
3089 * auto-rqsense (always supported)
3090 * dma_max
3091 * max-cdb-length
3092 *
3093 * Supported capabilities for SATA ATAPI hard disks:
3094 * auto-rqsense (always supported)
3095 * interconnect-type (INTERCONNECT_SATA)
3096 * max-cdb-length
3097 *
3098 * Request for other capabilities is rejected as unsupported.
3099 *
3100 * Returns supported capability value, or -1 if capability is unsuppported or
3101 * the address is invalid - no device.
3102 */
3103
3104 static int
sata_scsi_getcap(struct scsi_address * ap,char * cap,int whom)3105 sata_scsi_getcap(struct scsi_address *ap, char *cap, int whom)
3106 {
3107
3108 sata_hba_inst_t *sata_hba_inst =
3109 (sata_hba_inst_t *)(ap->a_hba_tran->tran_hba_private);
3110 sata_device_t sata_device;
3111 sata_drive_info_t *sdinfo;
3112 ddi_dma_attr_t adj_dma_attr;
3113 int rval;
3114
3115 SATADBG2(SATA_DBG_SCSI_IF, sata_hba_inst,
3116 "sata_scsi_getcap: target: 0x%x, cap: %s\n",
3117 ap->a_target, cap);
3118
3119 /*
3120 * We want to process the capabilities on per port granularity.
3121 * So, we are specifically restricting ourselves to whom != 0
3122 * to exclude the controller wide handling.
3123 */
3124 if (cap == NULL || whom == 0)
3125 return (-1);
3126
3127 if (sata_validate_scsi_address(sata_hba_inst, ap, &sata_device) != 0) {
3128 /* Invalid address */
3129 return (-1);
3130 }
3131 mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst,
3132 sata_device.satadev_addr.cport)));
3133 if ((sdinfo = sata_get_device_info(sata_hba_inst, &sata_device)) ==
3134 NULL) {
3135 /* invalid address */
3136 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
3137 sata_device.satadev_addr.cport)));
3138 return (-1);
3139 }
3140
3141 switch (scsi_hba_lookup_capstr(cap)) {
3142 case SCSI_CAP_ARQ:
3143 rval = 1; /* ARQ supported, turned on */
3144 break;
3145
3146 case SCSI_CAP_SECTOR_SIZE:
3147 if (sdinfo->satadrv_type == SATA_DTYPE_ATADISK)
3148 rval = SATA_DISK_SECTOR_SIZE; /* fixed size */
3149 else if (sdinfo->satadrv_type == SATA_DTYPE_ATAPICD)
3150 rval = SATA_ATAPI_SECTOR_SIZE;
3151 else rval = -1;
3152 break;
3153
3154 /*
3155 * untagged queuing cause a performance inversion because of
3156 * the way sd operates. Because of this reason we do not
3157 * use it when available.
3158 */
3159 case SCSI_CAP_UNTAGGED_QING:
3160 if (sdinfo->satadrv_features_enabled &
3161 SATA_DEV_F_E_UNTAGGED_QING)
3162 rval = 1; /* Untagged queuing available */
3163 else
3164 rval = -1; /* Untagged queuing not available */
3165 break;
3166
3167 case SCSI_CAP_TAGGED_QING:
3168 if ((sdinfo->satadrv_features_enabled &
3169 SATA_DEV_F_E_TAGGED_QING) &&
3170 (sdinfo->satadrv_max_queue_depth > 1))
3171 rval = 1; /* Tagged queuing available */
3172 else
3173 rval = -1; /* Tagged queuing not available */
3174 break;
3175
3176 case SCSI_CAP_DMA_MAX:
3177 sata_adjust_dma_attr(sdinfo, SATA_DMA_ATTR(sata_hba_inst),
3178 &adj_dma_attr);
3179 rval = (int)adj_dma_attr.dma_attr_maxxfer;
3180 /* We rely on the fact that dma_attr_maxxfer < 0x80000000 */
3181 break;
3182
3183 case SCSI_CAP_INTERCONNECT_TYPE:
3184 rval = INTERCONNECT_SATA; /* SATA interconnect type */
3185 break;
3186
3187 case SCSI_CAP_CDB_LEN:
3188 if (sdinfo->satadrv_type & SATA_DTYPE_ATAPI)
3189 rval = sdinfo->satadrv_atapi_cdb_len;
3190 else
3191 rval = -1;
3192 break;
3193
3194 default:
3195 rval = -1;
3196 break;
3197 }
3198 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
3199 sata_device.satadev_addr.cport)));
3200 return (rval);
3201 }
3202
3203 /*
3204 * Implementation of scsi tran_setcap
3205 *
3206 * Only SCSI_CAP_UNTAGGED_QING and SCSI_CAP_TAGGED_QING are changeable.
3207 *
3208 */
3209 static int
sata_scsi_setcap(struct scsi_address * ap,char * cap,int value,int whom)3210 sata_scsi_setcap(struct scsi_address *ap, char *cap, int value, int whom)
3211 {
3212 sata_hba_inst_t *sata_hba_inst =
3213 (sata_hba_inst_t *)(ap->a_hba_tran->tran_hba_private);
3214 sata_device_t sata_device;
3215 sata_drive_info_t *sdinfo;
3216 int rval;
3217
3218 SATADBG2(SATA_DBG_SCSI_IF, sata_hba_inst,
3219 "sata_scsi_setcap: target: 0x%x, cap: %s\n", ap->a_target, cap);
3220
3221 /*
3222 * We want to process the capabilities on per port granularity.
3223 * So, we are specifically restricting ourselves to whom != 0
3224 * to exclude the controller wide handling.
3225 */
3226 if (cap == NULL || whom == 0) {
3227 return (-1);
3228 }
3229
3230 if (sata_validate_scsi_address(sata_hba_inst, ap, &sata_device) != 0) {
3231 /* Invalid address */
3232 return (-1);
3233 }
3234 mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst,
3235 sata_device.satadev_addr.cport)));
3236 if ((sdinfo = sata_get_device_info(sata_hba_inst,
3237 &sata_device)) == NULL) {
3238 /* invalid address */
3239 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
3240 sata_device.satadev_addr.cport)));
3241 return (-1);
3242 }
3243 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
3244 sata_device.satadev_addr.cport)));
3245
3246 switch (scsi_hba_lookup_capstr(cap)) {
3247 case SCSI_CAP_ARQ:
3248 case SCSI_CAP_SECTOR_SIZE:
3249 case SCSI_CAP_DMA_MAX:
3250 case SCSI_CAP_INTERCONNECT_TYPE:
3251 rval = 0;
3252 break;
3253 case SCSI_CAP_UNTAGGED_QING:
3254 if (SATA_QDEPTH(sata_hba_inst) > 1) {
3255 rval = 1;
3256 if (value == 1) {
3257 sdinfo->satadrv_features_enabled |=
3258 SATA_DEV_F_E_UNTAGGED_QING;
3259 } else if (value == 0) {
3260 sdinfo->satadrv_features_enabled &=
3261 ~SATA_DEV_F_E_UNTAGGED_QING;
3262 } else {
3263 rval = -1;
3264 }
3265 } else {
3266 rval = 0;
3267 }
3268 break;
3269 case SCSI_CAP_TAGGED_QING:
3270 /* This can TCQ or NCQ */
3271 if (sata_func_enable & SATA_ENABLE_QUEUING &&
3272 ((sdinfo->satadrv_features_support & SATA_DEV_F_TCQ &&
3273 SATA_FEATURES(sata_hba_inst) & SATA_CTLF_QCMD) ||
3274 (sata_func_enable & SATA_ENABLE_NCQ &&
3275 sdinfo->satadrv_features_support & SATA_DEV_F_NCQ &&
3276 SATA_FEATURES(sata_hba_inst) & SATA_CTLF_NCQ)) &&
3277 (sdinfo->satadrv_max_queue_depth > 1)) {
3278 rval = 1;
3279 if (value == 1) {
3280 sdinfo->satadrv_features_enabled |=
3281 SATA_DEV_F_E_TAGGED_QING;
3282 } else if (value == 0) {
3283 sdinfo->satadrv_features_enabled &=
3284 ~SATA_DEV_F_E_TAGGED_QING;
3285 } else {
3286 rval = -1;
3287 }
3288 } else {
3289 rval = 0;
3290 }
3291 break;
3292 default:
3293 rval = -1;
3294 break;
3295 }
3296 return (rval);
3297 }
3298
3299 /*
3300 * Implementations of scsi tran_destroy_pkt.
3301 * Free resources allocated by sata_scsi_init_pkt()
3302 */
3303 static void
sata_scsi_destroy_pkt(struct scsi_address * ap,struct scsi_pkt * pkt)3304 sata_scsi_destroy_pkt(struct scsi_address *ap, struct scsi_pkt *pkt)
3305 {
3306 sata_pkt_txlate_t *spx;
3307
3308 spx = (sata_pkt_txlate_t *)pkt->pkt_ha_private;
3309
3310 sata_common_free_dma_rsrcs(spx);
3311
3312 spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp = NULL;
3313 sata_pkt_free(spx);
3314
3315 scsi_hba_pkt_free(ap, pkt);
3316 }
3317
3318 /*
3319 * Implementation of scsi tran_dmafree.
3320 * Free DMA resources allocated by sata_scsi_init_pkt()
3321 */
3322
3323 static void
sata_scsi_dmafree(struct scsi_address * ap,struct scsi_pkt * pkt)3324 sata_scsi_dmafree(struct scsi_address *ap, struct scsi_pkt *pkt)
3325 {
3326 #ifndef __lock_lint
3327 _NOTE(ARGUNUSED(ap))
3328 #endif
3329 sata_pkt_txlate_t *spx;
3330
3331 ASSERT(pkt != NULL);
3332 spx = (sata_pkt_txlate_t *)pkt->pkt_ha_private;
3333
3334 sata_common_free_dma_rsrcs(spx);
3335 }
3336
3337 /*
3338 * Implementation of scsi tran_sync_pkt.
3339 *
3340 * The assumption below is that pkt is unique - there is no need to check ap
3341 *
3342 * Synchronize DMA buffer and, if the intermediate buffer is used, copy data
3343 * into/from the real buffer.
3344 */
3345 static void
sata_scsi_sync_pkt(struct scsi_address * ap __unused,struct scsi_pkt * pkt)3346 sata_scsi_sync_pkt(struct scsi_address *ap __unused, struct scsi_pkt *pkt)
3347 {
3348 sata_pkt_txlate_t *spx = (sata_pkt_txlate_t *)pkt->pkt_ha_private;
3349 struct buf *bp;
3350 int direction;
3351 int rval;
3352
3353 ASSERT(spx != NULL);
3354 if (spx->txlt_buf_dma_handle == NULL)
3355 return;
3356
3357 if (spx->txlt_sata_pkt == NULL)
3358 return;
3359
3360 direction = spx->txlt_sata_pkt->
3361 satapkt_cmd.satacmd_flags.sata_data_direction;
3362
3363 if (direction == SATA_DIR_NODATA_XFER)
3364 return;
3365
3366 bp = spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp;
3367
3368 if (spx->txlt_tmp_buf != NULL && (direction & SATA_DIR_WRITE) != 0) {
3369 /* Intermediate DMA buffer used */
3370 bcopy(bp->b_un.b_addr, spx->txlt_tmp_buf, bp->b_bcount);
3371 }
3372
3373 /* Sync the buffer for device or for CPU */
3374 rval = ddi_dma_sync(spx->txlt_buf_dma_handle, 0, 0,
3375 (direction & SATA_DIR_WRITE) ?
3376 DDI_DMA_SYNC_FORDEV : DDI_DMA_SYNC_FORCPU);
3377 ASSERT3S(rval, ==, DDI_SUCCESS);
3378
3379 if (spx->txlt_tmp_buf != NULL && !(direction & SATA_DIR_WRITE)) {
3380 /* Intermediate DMA buffer used for read */
3381 bcopy(spx->txlt_tmp_buf, bp->b_un.b_addr, bp->b_bcount);
3382 }
3383 }
3384
3385
3386
3387 /* ******************* SATA - SCSI Translation functions **************** */
3388 /*
3389 * SCSI to SATA pkt and command translation and SATA to SCSI status/error
3390 * translation.
3391 */
3392
3393 /*
3394 * Checks if a device exists and can be access and translates common
3395 * scsi_pkt data to sata_pkt data.
3396 *
3397 * Flag argument indicates that a non-read/write ATA command may be sent
3398 * to HBA in arbitrary SYNC mode to execute this packet.
3399 *
3400 * Returns TRAN_ACCEPT and scsi pkt_reason CMD_CMPLT if device exists and
3401 * sata_pkt was set-up.
3402 * Returns TRAN_ACCEPT and scsi pkt_reason CMD_DEV_GONE if device does not
3403 * exist and pkt_comp callback was scheduled.
3404 * Returns other TRAN_XXXXX values when error occured and command should be
3405 * rejected with the returned TRAN_XXXXX value.
3406 *
3407 * This function should be called with port mutex held.
3408 */
3409 static int
sata_txlt_generic_pkt_info(sata_pkt_txlate_t * spx,int * reason,int flag)3410 sata_txlt_generic_pkt_info(sata_pkt_txlate_t *spx, int *reason, int flag)
3411 {
3412 sata_drive_info_t *sdinfo;
3413 sata_device_t sata_device;
3414 const struct sata_cmd_flags sata_initial_cmd_flags = {
3415 SATA_DIR_NODATA_XFER,
3416 /* all other values to 0/FALSE */
3417 };
3418 /*
3419 * Pkt_reason has to be set if the pkt_comp callback is invoked,
3420 * and that implies TRAN_ACCEPT return value. Any other returned value
3421 * indicates that the scsi packet was not accepted (the reason will not
3422 * be checked by the scsi target driver).
3423 * To make debugging easier, we set pkt_reason to know value here.
3424 * It may be changed later when different completion reason is
3425 * determined.
3426 */
3427 spx->txlt_scsi_pkt->pkt_reason = CMD_TRAN_ERR;
3428 *reason = CMD_TRAN_ERR;
3429
3430 /* Validate address */
3431 switch (sata_validate_scsi_address(spx->txlt_sata_hba_inst,
3432 &spx->txlt_scsi_pkt->pkt_address, &sata_device)) {
3433
3434 case -1:
3435 /* Invalid address or invalid device type */
3436 return (TRAN_BADPKT);
3437 case 2:
3438 /*
3439 * Valid address but device type is unknown - Chack if it is
3440 * in the reset state and therefore in an indeterminate state.
3441 */
3442 sdinfo = sata_get_device_info(spx->txlt_sata_hba_inst,
3443 &spx->txlt_sata_pkt->satapkt_device);
3444 if (sdinfo != NULL && (sdinfo->satadrv_event_flags &
3445 (SATA_EVNT_DEVICE_RESET |
3446 SATA_EVNT_INPROC_DEVICE_RESET)) != 0) {
3447 if (!ddi_in_panic()) {
3448 spx->txlt_scsi_pkt->pkt_reason = CMD_INCOMPLETE;
3449 *reason = CMD_INCOMPLETE;
3450 SATADBG1(SATA_DBG_SCSI_IF,
3451 spx->txlt_sata_hba_inst,
3452 "sata_scsi_start: rejecting command "
3453 "because of device reset state\n", NULL);
3454 return (TRAN_BUSY);
3455 }
3456 }
3457 /* FALLTHROUGH */
3458 case 1:
3459 /* valid address but no valid device - it has disappeared */
3460 spx->txlt_scsi_pkt->pkt_reason = CMD_DEV_GONE;
3461 *reason = CMD_DEV_GONE;
3462 /*
3463 * The sd target driver is checking CMD_DEV_GONE pkt_reason
3464 * only in callback function (for normal requests) and
3465 * in the dump code path.
3466 * So, if the callback is available, we need to do
3467 * the callback rather than returning TRAN_FATAL_ERROR here.
3468 */
3469 if (spx->txlt_scsi_pkt->pkt_comp != NULL) {
3470 /* scsi callback required */
3471 if (servicing_interrupt()) {
3472 if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
3473 (task_func_t *)spx->txlt_scsi_pkt->pkt_comp,
3474 (void *)spx->txlt_scsi_pkt, TQ_NOSLEEP) ==
3475 TASKQID_INVALID) {
3476 return (TRAN_BUSY);
3477 }
3478 } else if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
3479 (task_func_t *)spx->txlt_scsi_pkt->pkt_comp,
3480 spx->txlt_scsi_pkt, TQ_SLEEP) == TASKQID_INVALID) {
3481 /* Scheduling the callback failed */
3482 return (TRAN_BUSY);
3483 }
3484
3485 return (TRAN_ACCEPT);
3486 }
3487 return (TRAN_FATAL_ERROR);
3488 default:
3489 /* all OK; pkt reason will be overwritten later */
3490 break;
3491 }
3492 /*
3493 * If pkt is to be executed in polling mode and a command will not be
3494 * emulated in SATA module (requires sending a non-read/write ATA
3495 * command to HBA driver in arbitrary SYNC mode) and we are in the
3496 * interrupt context and not in the panic dump, then reject the packet
3497 * to avoid a possible interrupt stack overrun or hang caused by
3498 * a potentially blocked interrupt.
3499 */
3500 if (((spx->txlt_scsi_pkt->pkt_flags & FLAG_NOINTR) != 0 || flag != 0) &&
3501 servicing_interrupt() && !ddi_in_panic()) {
3502 SATADBG1(SATA_DBG_INTR_CTX, spx->txlt_sata_hba_inst,
3503 "sata_scsi_start: rejecting synchronous command because "
3504 "of interrupt context\n", NULL);
3505 return (TRAN_BUSY);
3506 }
3507
3508 sdinfo = sata_get_device_info(spx->txlt_sata_hba_inst,
3509 &spx->txlt_sata_pkt->satapkt_device);
3510
3511 /*
3512 * If device is in reset condition, reject the packet with
3513 * TRAN_BUSY, unless:
3514 * 1. system is panicking (dumping)
3515 * In such case only one thread is running and there is no way to
3516 * process reset.
3517 * 2. cfgadm operation is is progress (internal APCTL lock is set)
3518 * Some cfgadm operations involve drive commands, so reset condition
3519 * needs to be ignored for IOCTL operations.
3520 */
3521 if ((sdinfo->satadrv_event_flags &
3522 (SATA_EVNT_DEVICE_RESET | SATA_EVNT_INPROC_DEVICE_RESET)) != 0) {
3523
3524 if (!ddi_in_panic() &&
3525 ((SATA_CPORT_EVENT_FLAGS(spx->txlt_sata_hba_inst,
3526 sata_device.satadev_addr.cport) &
3527 SATA_APCTL_LOCK_PORT_BUSY) == 0)) {
3528 spx->txlt_scsi_pkt->pkt_reason = CMD_INCOMPLETE;
3529 *reason = CMD_INCOMPLETE;
3530 SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
3531 "sata_scsi_start: rejecting command because "
3532 "of device reset state\n", NULL);
3533 return (TRAN_BUSY);
3534 }
3535 }
3536
3537 /*
3538 * Fix the dev_type in the sata_pkt->satapkt_device. It was not set by
3539 * sata_scsi_pkt_init() because pkt init had to work also with
3540 * non-existing devices.
3541 * Now we know that the packet was set-up for a real device, so its
3542 * type is known.
3543 */
3544 spx->txlt_sata_pkt->satapkt_device.satadev_type = sdinfo->satadrv_type;
3545
3546 spx->txlt_sata_pkt->satapkt_cmd.satacmd_flags = sata_initial_cmd_flags;
3547 if ((SATA_CPORT_INFO(spx->txlt_sata_hba_inst,
3548 sata_device.satadev_addr.cport)->cport_event_flags &
3549 SATA_APCTL_LOCK_PORT_BUSY) != 0) {
3550 spx->txlt_sata_pkt->satapkt_cmd.satacmd_flags.
3551 sata_ignore_dev_reset = B_TRUE;
3552 }
3553 /*
3554 * At this point the generic translation routine determined that the
3555 * scsi packet should be accepted. Packet completion reason may be
3556 * changed later when a different completion reason is determined.
3557 */
3558 spx->txlt_scsi_pkt->pkt_reason = CMD_CMPLT;
3559 *reason = CMD_CMPLT;
3560
3561 if ((spx->txlt_scsi_pkt->pkt_flags & FLAG_NOINTR) != 0) {
3562 /* Synchronous execution */
3563 spx->txlt_sata_pkt->satapkt_op_mode = SATA_OPMODE_SYNCH |
3564 SATA_OPMODE_POLLING;
3565 spx->txlt_sata_pkt->satapkt_cmd.satacmd_flags.
3566 sata_ignore_dev_reset = ddi_in_panic();
3567 } else {
3568 /* Asynchronous execution */
3569 spx->txlt_sata_pkt->satapkt_op_mode = SATA_OPMODE_ASYNCH |
3570 SATA_OPMODE_INTERRUPTS;
3571 }
3572 /* Convert queuing information */
3573 if (spx->txlt_scsi_pkt->pkt_flags & FLAG_STAG)
3574 spx->txlt_sata_pkt->satapkt_cmd.satacmd_flags.sata_queue_stag =
3575 B_TRUE;
3576 else if (spx->txlt_scsi_pkt->pkt_flags &
3577 (FLAG_OTAG | FLAG_HTAG | FLAG_HEAD))
3578 spx->txlt_sata_pkt->satapkt_cmd.satacmd_flags.sata_queue_otag =
3579 B_TRUE;
3580
3581 /* Always limit pkt time */
3582 if (spx->txlt_scsi_pkt->pkt_time == 0)
3583 spx->txlt_sata_pkt->satapkt_time = sata_default_pkt_time;
3584 else
3585 /* Pass on scsi_pkt time */
3586 spx->txlt_sata_pkt->satapkt_time =
3587 spx->txlt_scsi_pkt->pkt_time;
3588
3589 return (TRAN_ACCEPT);
3590 }
3591
3592
3593 /*
3594 * Translate ATA Identify Device data to SCSI Inquiry data.
3595 * This function may be called only for ATA devices.
3596 * This function should not be called for ATAPI devices - they
3597 * respond directly to SCSI Inquiry command.
3598 *
3599 * SATA Identify Device data has to be valid in sata_drive_info.
3600 * Buffer has to accomodate the inquiry length (36 bytes).
3601 *
3602 * This function should be called with a port mutex held.
3603 */
3604 static void
sata_identdev_to_inquiry(sata_hba_inst_t * sata_hba_inst,sata_drive_info_t * sdinfo,uint8_t * buf)3605 sata_identdev_to_inquiry(sata_hba_inst_t *sata_hba_inst,
3606 sata_drive_info_t *sdinfo, uint8_t *buf)
3607 {
3608
3609 struct scsi_inquiry *inq = (struct scsi_inquiry *)buf;
3610 struct sata_id *sid = &sdinfo->satadrv_id;
3611
3612 /* Start with a nice clean slate */
3613 bzero((void *)inq, sizeof (struct scsi_inquiry));
3614
3615 /*
3616 * Rely on the dev_type for setting paripheral qualifier.
3617 * Assume that DTYPE_RODIRECT applies to CD/DVD R/W devices.
3618 * It could be that DTYPE_OPTICAL could also qualify in the future.
3619 * ATAPI Inquiry may provide more data to the target driver.
3620 */
3621 inq->inq_dtype = sdinfo->satadrv_type == SATA_DTYPE_ATADISK ?
3622 DTYPE_DIRECT : DTYPE_RODIRECT; /* DTYPE_UNKNOWN; */
3623
3624 /* CFA type device is not a removable media device */
3625 inq->inq_rmb = ((sid->ai_config != SATA_CFA_TYPE) &&
3626 (sid->ai_config & SATA_REM_MEDIA)) ? 1 : 0;
3627 inq->inq_qual = 0; /* Device type qualifier (obsolete in SCSI3? */
3628 inq->inq_iso = 0; /* ISO version */
3629 inq->inq_ecma = 0; /* ECMA version */
3630 inq->inq_ansi = 3; /* ANSI version - SCSI 3 */
3631 inq->inq_aenc = 0; /* Async event notification cap. */
3632 inq->inq_trmiop = 0; /* Supports TERMINATE I/O PROC msg - NO */
3633 inq->inq_normaca = 0; /* setting NACA bit supported - NO */
3634 inq->inq_rdf = RDF_SCSI2; /* Response data format- SPC-3 */
3635 inq->inq_len = 31; /* Additional length */
3636 inq->inq_dualp = 0; /* dual port device - NO */
3637 inq->inq_reladdr = 0; /* Supports relative addressing - NO */
3638 inq->inq_sync = 0; /* Supports synchronous data xfers - NO */
3639 inq->inq_linked = 0; /* Supports linked commands - NO */
3640 /*
3641 * Queuing support - controller has to
3642 * support some sort of command queuing.
3643 */
3644 if (SATA_QDEPTH(sata_hba_inst) > 1)
3645 inq->inq_cmdque = 1; /* Supports command queueing - YES */
3646 else
3647 inq->inq_cmdque = 0; /* Supports command queueing - NO */
3648 inq->inq_sftre = 0; /* Supports Soft Reset option - NO ??? */
3649 inq->inq_wbus32 = 0; /* Supports 32 bit wide data xfers - NO */
3650 inq->inq_wbus16 = 0; /* Supports 16 bit wide data xfers - NO */
3651
3652 #ifdef _LITTLE_ENDIAN
3653 /* Swap text fields to match SCSI format */
3654 bcopy("ATA ", inq->inq_vid, 8); /* Vendor ID */
3655 swab(sid->ai_model, inq->inq_pid, 16); /* Product ID */
3656 if (strncmp(&sid->ai_fw[4], " ", 4) == 0)
3657 swab(sid->ai_fw, inq->inq_revision, 4); /* Revision level */
3658 else
3659 swab(&sid->ai_fw[4], inq->inq_revision, 4); /* Rev. level */
3660 #else /* _LITTLE_ENDIAN */
3661 bcopy("ATA ", inq->inq_vid, 8); /* Vendor ID */
3662 bcopy(sid->ai_model, inq->inq_pid, 16); /* Product ID */
3663 if (strncmp(&sid->ai_fw[4], " ", 4) == 0)
3664 bcopy(sid->ai_fw, inq->inq_revision, 4); /* Revision level */
3665 else
3666 bcopy(&sid->ai_fw[4], inq->inq_revision, 4); /* Rev. level */
3667 #endif /* _LITTLE_ENDIAN */
3668 }
3669
3670
3671 /*
3672 * Scsi response set up for invalid command (command not supported)
3673 *
3674 * Returns TRAN_ACCEPT and appropriate values in scsi_pkt fields.
3675 */
3676 static int
sata_txlt_invalid_command(sata_pkt_txlate_t * spx)3677 sata_txlt_invalid_command(sata_pkt_txlate_t *spx)
3678 {
3679 struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
3680 struct scsi_extended_sense *sense;
3681
3682 scsipkt->pkt_reason = CMD_CMPLT;
3683 scsipkt->pkt_state = STATE_GOT_BUS | STATE_GOT_TARGET |
3684 STATE_SENT_CMD | STATE_GOT_STATUS;
3685
3686 *scsipkt->pkt_scbp = STATUS_CHECK;
3687
3688 sense = sata_arq_sense(spx);
3689 sense->es_key = KEY_ILLEGAL_REQUEST;
3690 sense->es_add_code = SD_SCSI_ASC_INVALID_COMMAND_CODE;
3691
3692 SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
3693 "Scsi_pkt completion reason %x\n", scsipkt->pkt_reason);
3694
3695 if ((scsipkt->pkt_flags & FLAG_NOINTR) == 0 &&
3696 scsipkt->pkt_comp != NULL) {
3697 /* scsi callback required */
3698 if (servicing_interrupt()) {
3699 if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
3700 (task_func_t *)spx->txlt_scsi_pkt->pkt_comp,
3701 (void *)spx->txlt_scsi_pkt, TQ_NOSLEEP) ==
3702 TASKQID_INVALID) {
3703 return (TRAN_BUSY);
3704 }
3705 } else if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
3706 (task_func_t *)spx->txlt_scsi_pkt->pkt_comp,
3707 (void *)spx->txlt_scsi_pkt, TQ_SLEEP) == TASKQID_INVALID) {
3708 /* Scheduling the callback failed */
3709 return (TRAN_BUSY);
3710 }
3711 }
3712 return (TRAN_ACCEPT);
3713 }
3714
3715 /*
3716 * Scsi response set up for check condition with special sense key
3717 * and additional sense code.
3718 *
3719 * Returns TRAN_ACCEPT and appropriate values in scsi_pkt fields.
3720 */
3721 static int
sata_txlt_check_condition(sata_pkt_txlate_t * spx,uchar_t key,uchar_t code)3722 sata_txlt_check_condition(sata_pkt_txlate_t *spx, uchar_t key, uchar_t code)
3723 {
3724 sata_hba_inst_t *shi = SATA_TXLT_HBA_INST(spx);
3725 int cport = SATA_TXLT_CPORT(spx);
3726 struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
3727 struct scsi_extended_sense *sense;
3728
3729 mutex_enter(&SATA_CPORT_MUTEX(shi, cport));
3730 scsipkt->pkt_reason = CMD_CMPLT;
3731 scsipkt->pkt_state = STATE_GOT_BUS | STATE_GOT_TARGET |
3732 STATE_SENT_CMD | STATE_GOT_STATUS;
3733
3734 *scsipkt->pkt_scbp = STATUS_CHECK;
3735
3736 sense = sata_arq_sense(spx);
3737 sense->es_key = key;
3738 sense->es_add_code = code;
3739
3740 mutex_exit(&SATA_CPORT_MUTEX(shi, cport));
3741
3742 SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
3743 "Scsi_pkt completion reason %x\n", scsipkt->pkt_reason);
3744
3745 if ((scsipkt->pkt_flags & FLAG_NOINTR) == 0 &&
3746 scsipkt->pkt_comp != NULL) {
3747 /* scsi callback required */
3748 if (servicing_interrupt()) {
3749 if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
3750 (task_func_t *)spx->txlt_scsi_pkt->pkt_comp,
3751 (void *)spx->txlt_scsi_pkt, TQ_NOSLEEP) ==
3752 TASKQID_INVALID) {
3753 return (TRAN_BUSY);
3754 }
3755 } else if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
3756 (task_func_t *)spx->txlt_scsi_pkt->pkt_comp,
3757 (void *)spx->txlt_scsi_pkt, TQ_SLEEP) == TASKQID_INVALID) {
3758 /* Scheduling the callback failed */
3759 return (TRAN_BUSY);
3760 }
3761 }
3762 return (TRAN_ACCEPT);
3763 }
3764
3765 /*
3766 * Scsi response setup for
3767 * emulated non-data command that requires no action/return data
3768 *
3769 * Returns TRAN_ACCEPT and appropriate values in scsi_pkt fields.
3770 */
3771 static int
sata_txlt_nodata_cmd_immediate(sata_pkt_txlate_t * spx)3772 sata_txlt_nodata_cmd_immediate(sata_pkt_txlate_t *spx)
3773 {
3774 int rval;
3775 int reason;
3776 kmutex_t *cport_mutex = &(SATA_TXLT_CPORT_MUTEX(spx));
3777
3778 mutex_enter(cport_mutex);
3779
3780 if (((rval = sata_txlt_generic_pkt_info(spx, &reason, 0)) !=
3781 TRAN_ACCEPT) || (reason == CMD_DEV_GONE)) {
3782 mutex_exit(cport_mutex);
3783 return (rval);
3784 }
3785 mutex_exit(cport_mutex);
3786
3787 spx->txlt_scsi_pkt->pkt_state = STATE_GOT_BUS | STATE_GOT_TARGET |
3788 STATE_SENT_CMD | STATE_GOT_STATUS;
3789 spx->txlt_scsi_pkt->pkt_reason = CMD_CMPLT;
3790 *(spx->txlt_scsi_pkt->pkt_scbp) = STATUS_GOOD;
3791
3792 SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
3793 "Scsi_pkt completion reason %x\n",
3794 spx->txlt_scsi_pkt->pkt_reason);
3795
3796 if ((spx->txlt_scsi_pkt->pkt_flags & FLAG_NOINTR) == 0 &&
3797 spx->txlt_scsi_pkt->pkt_comp != NULL) {
3798 /* scsi callback required */
3799 if (servicing_interrupt()) {
3800 if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
3801 (task_func_t *)spx->txlt_scsi_pkt->pkt_comp,
3802 (void *)spx->txlt_scsi_pkt, TQ_NOSLEEP) ==
3803 TASKQID_INVALID) {
3804 return (TRAN_BUSY);
3805 }
3806 } else if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
3807 (task_func_t *)spx->txlt_scsi_pkt->pkt_comp,
3808 (void *)spx->txlt_scsi_pkt, TQ_SLEEP) == TASKQID_INVALID) {
3809 /* Scheduling the callback failed */
3810 return (TRAN_BUSY);
3811 }
3812 }
3813 return (TRAN_ACCEPT);
3814 }
3815
3816
3817 /*
3818 * SATA translate command: Inquiry / Identify Device
3819 * Use cached Identify Device data for now, rather than issuing actual
3820 * Device Identify cmd request. If device is detached and re-attached,
3821 * asynchronous event processing should fetch and refresh Identify Device
3822 * data.
3823 * VPD pages supported now:
3824 * Vital Product Data page
3825 * Unit Serial Number page
3826 * Block Device Characteristics Page
3827 * ATA Information Page
3828 *
3829 * Returns TRAN_ACCEPT and appropriate values in scsi_pkt fields.
3830 */
3831
3832 #define EVPD 1 /* Extended Vital Product Data flag */
3833 #define CMDDT 2 /* Command Support Data - Obsolete */
3834 #define INQUIRY_SUP_VPD_PAGE 0 /* Supported VPD Pages Page Code */
3835 #define INQUIRY_USN_PAGE 0x80 /* Unit Serial Number Page Code */
3836 #define INQUIRY_BDC_PAGE 0xB1 /* Block Device Characteristics Page */
3837 /* Code */
3838 #define INQUIRY_ATA_INFO_PAGE 0x89 /* ATA Information Page Code */
3839 #define INQUIRY_DEV_IDENTIFICATION_PAGE 0x83 /* Device identifiers */
3840
3841 static int
sata_txlt_inquiry(sata_pkt_txlate_t * spx)3842 sata_txlt_inquiry(sata_pkt_txlate_t *spx)
3843 {
3844 struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
3845 struct buf *bp = spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp;
3846 sata_drive_info_t *sdinfo;
3847 struct scsi_extended_sense *sense;
3848 int count;
3849 uint8_t *p;
3850 int i, j;
3851 uint8_t page_buf[1024]; /* Max length */
3852 int rval, reason;
3853 ushort_t rate;
3854 kmutex_t *cport_mutex = &(SATA_TXLT_CPORT_MUTEX(spx));
3855
3856 /*
3857 * sata_txlt_generic_pkt_info() and sata_get_device_info() require
3858 * cport_mutex to be held while they are called. sdinfo is also
3859 * protected by cport_mutex, so we hold cport_mutex until after we've
3860 * finished using sdinfo.
3861 */
3862 mutex_enter(cport_mutex);
3863
3864 if (((rval = sata_txlt_generic_pkt_info(spx, &reason, 0)) !=
3865 TRAN_ACCEPT) || (reason == CMD_DEV_GONE)) {
3866 mutex_exit(cport_mutex);
3867 return (rval);
3868 }
3869
3870 sdinfo = sata_get_device_info(spx->txlt_sata_hba_inst,
3871 &spx->txlt_sata_pkt->satapkt_device);
3872
3873 ASSERT(sdinfo != NULL);
3874
3875 scsipkt->pkt_reason = CMD_CMPLT;
3876 scsipkt->pkt_state = STATE_GOT_BUS | STATE_GOT_TARGET |
3877 STATE_SENT_CMD | STATE_GOT_STATUS;
3878
3879 /* Reject not supported request */
3880 if (scsipkt->pkt_cdbp[1] & CMDDT) { /* No support for this bit */
3881 *scsipkt->pkt_scbp = STATUS_CHECK;
3882 sense = sata_arq_sense(spx);
3883 sense->es_key = KEY_ILLEGAL_REQUEST;
3884 sense->es_add_code = SD_SCSI_ASC_INVALID_FIELD_IN_CDB;
3885 goto done;
3886 }
3887
3888 /* Valid Inquiry request */
3889 *scsipkt->pkt_scbp = STATUS_GOOD;
3890
3891 if (bp == NULL || bp->b_un.b_addr == NULL || bp->b_bcount == 0)
3892 goto done;
3893
3894 /*
3895 * Because it is fully emulated command storing data
3896 * programatically in the specified buffer, release
3897 * preallocated DMA resources before storing data in the buffer,
3898 * so no unwanted DMA sync would take place.
3899 */
3900 sata_scsi_dmafree(NULL, scsipkt);
3901
3902 if (!(scsipkt->pkt_cdbp[1] & EVPD)) {
3903 /* Standard Inquiry Data request */
3904 struct scsi_inquiry inq;
3905 unsigned int bufsize;
3906
3907 sata_identdev_to_inquiry(spx->txlt_sata_hba_inst,
3908 sdinfo, (uint8_t *)&inq);
3909 /* Copy no more than requested */
3910 count = MIN(bp->b_bcount, sizeof (struct scsi_inquiry));
3911 bufsize = scsipkt->pkt_cdbp[4];
3912 bufsize |= scsipkt->pkt_cdbp[3] << 8;
3913 count = MIN(count, bufsize);
3914 bcopy(&inq, bp->b_un.b_addr, count);
3915
3916 scsipkt->pkt_state |= STATE_XFERRED_DATA;
3917 scsipkt->pkt_resid = scsipkt->pkt_cdbp[4] > count ?
3918 bufsize - count : 0;
3919 goto done;
3920 }
3921
3922 /*
3923 * peripheral_qualifier = 0;
3924 *
3925 * We are dealing only with HD and will be
3926 * dealing with CD/DVD devices soon
3927 */
3928 uint8_t peripheral_device_type =
3929 sdinfo->satadrv_type == SATA_DTYPE_ATADISK ?
3930 DTYPE_DIRECT : DTYPE_RODIRECT;
3931
3932 bzero(page_buf, sizeof (page_buf));
3933
3934 switch ((uint_t)scsipkt->pkt_cdbp[2]) {
3935 case INQUIRY_SUP_VPD_PAGE:
3936 /*
3937 * Request for supported Vital Product Data pages.
3938 */
3939 page_buf[0] = peripheral_device_type;
3940 page_buf[1] = INQUIRY_SUP_VPD_PAGE;
3941 page_buf[2] = 0;
3942 page_buf[4] = INQUIRY_SUP_VPD_PAGE;
3943 page_buf[5] = INQUIRY_USN_PAGE;
3944 page_buf[6] = INQUIRY_BDC_PAGE;
3945 /*
3946 * If WWN info is present, provide a page for it.
3947 * Modern drives always have, but some legacy ones do not.
3948 */
3949 if (sdinfo->satadrv_id.ai_naa_ieee_oui != 0) {
3950 page_buf[3] = 5; /* page length */
3951 page_buf[7] = INQUIRY_DEV_IDENTIFICATION_PAGE;
3952 page_buf[8] = INQUIRY_ATA_INFO_PAGE;
3953 count = 9;
3954 } else {
3955 page_buf[3] = 4; /* page length */
3956 page_buf[7] = INQUIRY_ATA_INFO_PAGE;
3957 count = 8;
3958 }
3959 /* Copy no more than requested */
3960 count = MIN(bp->b_bcount, count);
3961 bcopy(page_buf, bp->b_un.b_addr, count);
3962 break;
3963
3964 case INQUIRY_USN_PAGE:
3965 /*
3966 * Request for Unit Serial Number page.
3967 * Set-up the page.
3968 */
3969 page_buf[0] = peripheral_device_type;
3970 page_buf[1] = INQUIRY_USN_PAGE;
3971 page_buf[2] = 0;
3972 /* remaining page length */
3973 page_buf[3] = SATA_ID_SERIAL_LEN;
3974
3975 /*
3976 * Copy serial number from Identify Device data
3977 * words into the inquiry page and swap bytes
3978 * when necessary.
3979 */
3980 p = (uint8_t *)(sdinfo->satadrv_id.ai_drvser);
3981 #ifdef _LITTLE_ENDIAN
3982 swab(p, &page_buf[4], SATA_ID_SERIAL_LEN);
3983 #else
3984 bcopy(p, &page_buf[4], SATA_ID_SERIAL_LEN);
3985 #endif
3986 /*
3987 * Least significant character of the serial
3988 * number shall appear as the last byte,
3989 * according to SBC-3 spec.
3990 * Count trailing spaces to determine the
3991 * necessary shift length.
3992 */
3993 p = &page_buf[SATA_ID_SERIAL_LEN + 4 - 1];
3994 for (j = 0; j < SATA_ID_SERIAL_LEN; j++) {
3995 if (*(p - j) != '\0' && *(p - j) != '\040')
3996 break;
3997 }
3998
3999 /*
4000 * Shift SN string right, so that the last
4001 * non-blank character would appear in last
4002 * byte of SN field in the page.
4003 * 'j' is the shift length.
4004 */
4005 for (i = 0; i < (SATA_ID_SERIAL_LEN - j) && j != 0; i++, p--)
4006 *p = *(p - j);
4007
4008 /*
4009 * Add leading spaces - same number as the
4010 * shift size
4011 */
4012 for (; j > 0; j--)
4013 page_buf[4 + j - 1] = '\040';
4014
4015 count = MIN(bp->b_bcount, SATA_ID_SERIAL_LEN + 4);
4016 bcopy(page_buf, bp->b_un.b_addr, count);
4017 break;
4018
4019 case INQUIRY_BDC_PAGE:
4020 /*
4021 * Request for Block Device Characteristics
4022 * page. Set-up the page.
4023 */
4024 page_buf[0] = peripheral_device_type;
4025 page_buf[1] = INQUIRY_BDC_PAGE;
4026 page_buf[2] = 0;
4027 /* remaining page length */
4028 page_buf[3] = SATA_ID_BDC_LEN;
4029
4030 rate = sdinfo->satadrv_id.ai_medrotrate;
4031 page_buf[4] = (rate >> 8) & 0xff;
4032 page_buf[5] = rate & 0xff;
4033 page_buf[6] = 0;
4034 page_buf[7] = sdinfo->satadrv_id.ai_nomformfactor & 0xf;
4035
4036 count = MIN(bp->b_bcount, SATA_ID_BDC_LEN + 4);
4037 bcopy(page_buf, bp->b_un.b_addr, count);
4038 break;
4039
4040 case INQUIRY_ATA_INFO_PAGE:
4041 /*
4042 * Request for ATA Information page.
4043 */
4044 page_buf[0] = peripheral_device_type;
4045 page_buf[1] = INQUIRY_ATA_INFO_PAGE;
4046 page_buf[2] = (SATA_ID_ATA_INFO_LEN >> 8) & 0xff;
4047 page_buf[3] = SATA_ID_ATA_INFO_LEN & 0xff;
4048 /* page_buf[4-7] reserved */
4049 #ifdef _LITTLE_ENDIAN
4050 bcopy("ATA ", &page_buf[8], 8);
4051 swab(sdinfo->satadrv_id.ai_model, &page_buf[16], 16);
4052 if (strncmp(&sdinfo->satadrv_id.ai_fw[4], " ", 4) == 0) {
4053 swab(sdinfo->satadrv_id.ai_fw, &page_buf[32], 4);
4054 } else {
4055 swab(&sdinfo->satadrv_id.ai_fw[4], &page_buf[32], 4);
4056 }
4057 #else /* _LITTLE_ENDIAN */
4058 bcopy("ATA ", &page_buf[8], 8);
4059 bcopy(sdinfo->satadrv_id.ai_model, &page_buf[16], 16);
4060 if (strncmp(&sdinfo->satadrv_id.ai_fw[4], " ", 4) == 0) {
4061 bcopy(sdinfo->satadrv_id.ai_fw, &page_buf[32], 4);
4062 } else {
4063 bcopy(&sdinfo->satadrv_id.ai_fw[4], &page_buf[32], 4);
4064 }
4065 #endif /* _LITTLE_ENDIAN */
4066 /*
4067 * page_buf[36-55] which defines the device
4068 * signature is not defined at this
4069 * time.
4070 */
4071
4072 /* Set the command code */
4073 if (sdinfo->satadrv_type == SATA_DTYPE_ATADISK) {
4074 page_buf[56] = SATAC_ID_DEVICE;
4075 } else if (sdinfo->satadrv_type == SATA_DTYPE_ATAPI) {
4076 page_buf[56] = SATAC_ID_PACKET_DEVICE;
4077 }
4078 /*
4079 * If the command code, page_buf[56], is not
4080 * zero and if one of the identify commands
4081 * succeeds, return the identify data.
4082 */
4083 if (page_buf[56] != 0) {
4084 sata_drive_info_t temp_info = {
4085 .satadrv_addr = sdinfo->satadrv_addr,
4086 .satadrv_type = sdinfo->satadrv_type,
4087 };
4088
4089 /*
4090 * It appears calls to an HBA's start (sata_hba_start)
4091 * method (which sata_fetch_device_identify_data_retry()
4092 * calls) must not be done while holding cport_mutex.
4093 *
4094 * A packet's completion routine may call back into
4095 * the sata framework and deadlock (and all extant
4096 * calls to the HBA's start method either drop and
4097 * re-acquire cport_mutex, or never held cport_mutex).
4098 *
4099 * sdinfo is protected by cport_mutex, so we need to
4100 * obtain the SATA address and type from sdinfo
4101 * before releasing cport_mutex and submitting the
4102 * request. We reacquire cport_mutex to simplfy
4103 * cleanup after the done label.
4104 */
4105 mutex_exit(cport_mutex);
4106 (void) sata_fetch_device_identify_data(
4107 spx->txlt_sata_hba_inst, &temp_info);
4108 mutex_enter(cport_mutex);
4109
4110 /*
4111 * If sata_fetch_device_identify_data()
4112 * fails, the bcopy() is harmless since we're copying
4113 * zeros back over zeros. If it succeeds, we're
4114 * copying over the portion of the response we need.
4115 */
4116 bcopy(&temp_info.satadrv_id, &page_buf[60],
4117 sizeof (sata_id_t));
4118 }
4119
4120 /* Need to copy out the page_buf to bp */
4121 count = MIN(bp->b_bcount, SATA_ID_ATA_INFO_LEN + 4);
4122 bcopy(page_buf, bp->b_un.b_addr, count);
4123 break;
4124
4125 case INQUIRY_DEV_IDENTIFICATION_PAGE:
4126 if (sdinfo->satadrv_id.ai_naa_ieee_oui != 0) {
4127 /*
4128 * Page 83; SAT-5 requires this, and modern
4129 * SATA devices all support a WWN.
4130 */
4131 page_buf[0] = peripheral_device_type;
4132 page_buf[1] = INQUIRY_DEV_IDENTIFICATION_PAGE;
4133 page_buf[2] = 0;
4134 page_buf[3] = 12; /* remaining length */
4135 page_buf[4] = 0x01; /* protocol 0, code set 1 */
4136 page_buf[5] = 0x03; /* LUN, NAA type */
4137 page_buf[6] = 0;
4138 page_buf[7] = 0x08; /* length (64-bit WWN) */
4139 #ifdef _LITTLE_ENDIAN
4140 swab(&sdinfo->satadrv_id.ai_naa_ieee_oui, &page_buf[8],
4141 8);
4142 #else
4143 bcopy(&sdinfo->satadrv_id.ai_naa_ieee_oui,
4144 &page_buf[8], 8);
4145 #endif
4146 /* header + designator */
4147 count = MIN(bp->b_bcount, 12 + 4);
4148 bcopy(page_buf, bp->b_un.b_addr, count);
4149 break;
4150 }
4151 /* FALLTHROUGH */
4152
4153 default:
4154 /* Request for unsupported VPD page */
4155 *scsipkt->pkt_scbp = STATUS_CHECK;
4156 sense = sata_arq_sense(spx);
4157 sense->es_key = KEY_ILLEGAL_REQUEST;
4158 sense->es_add_code = SD_SCSI_ASC_INVALID_FIELD_IN_CDB;
4159 goto done;
4160 }
4161
4162 scsipkt->pkt_state |= STATE_XFERRED_DATA;
4163 scsipkt->pkt_resid = scsipkt->pkt_cdbp[4] > count ?
4164 scsipkt->pkt_cdbp[4] - count : 0;
4165
4166 done:
4167 mutex_exit(cport_mutex);
4168
4169 SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
4170 "Scsi_pkt completion reason %x\n",
4171 scsipkt->pkt_reason);
4172
4173 if ((scsipkt->pkt_flags & FLAG_NOINTR) == 0 &&
4174 scsipkt->pkt_comp != NULL) {
4175 /* scsi callback required */
4176 if (servicing_interrupt()) {
4177 if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
4178 (task_func_t *)spx->txlt_scsi_pkt->pkt_comp,
4179 (void *)spx->txlt_scsi_pkt, TQ_NOSLEEP) ==
4180 TASKQID_INVALID) {
4181 return (TRAN_BUSY);
4182 }
4183 } else if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
4184 (task_func_t *)spx->txlt_scsi_pkt->pkt_comp,
4185 (void *)spx->txlt_scsi_pkt, TQ_SLEEP) == TASKQID_INVALID) {
4186 /* Scheduling the callback failed */
4187 return (TRAN_BUSY);
4188 }
4189 }
4190 return (TRAN_ACCEPT);
4191 }
4192
4193 /*
4194 * SATA translate command: Request Sense.
4195 *
4196 * Returns TRAN_ACCEPT and appropriate values in scsi_pkt fields.
4197 * At the moment this is an emulated command (ATA version for SATA hard disks).
4198 * May be translated into Check Power Mode command in the future.
4199 *
4200 * Note: There is a mismatch between already implemented Informational
4201 * Exception Mode Select page 0x1C and this function.
4202 * When MRIE bit is set in page 0x1C, Request Sense is supposed to return
4203 * NO SENSE and set additional sense code to the exception code - this is not
4204 * implemented here.
4205 */
4206 static int
sata_txlt_request_sense(sata_pkt_txlate_t * spx)4207 sata_txlt_request_sense(sata_pkt_txlate_t *spx)
4208 {
4209 struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
4210 struct scsi_extended_sense sense;
4211 struct buf *bp = spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp;
4212 sata_drive_info_t *sdinfo;
4213 sata_cmd_t *scmd = &spx->txlt_sata_pkt->satapkt_cmd;
4214 int rval, reason, power_state = 0;
4215 kmutex_t *cport_mutex;
4216
4217 cport_mutex = &(SATA_TXLT_CPORT_MUTEX(spx));
4218 mutex_enter(cport_mutex);
4219
4220 if (((rval = sata_txlt_generic_pkt_info(spx, &reason, 1)) !=
4221 TRAN_ACCEPT) || (reason == CMD_DEV_GONE)) {
4222 mutex_exit(cport_mutex);
4223 return (rval);
4224 }
4225
4226 scsipkt->pkt_reason = CMD_CMPLT;
4227 scsipkt->pkt_state = STATE_GOT_BUS | STATE_GOT_TARGET |
4228 STATE_SENT_CMD | STATE_GOT_STATUS;
4229 *scsipkt->pkt_scbp = STATUS_GOOD;
4230
4231 /*
4232 * when CONTROL field's NACA bit == 1
4233 * return ILLEGAL_REQUEST
4234 */
4235 if (scsipkt->pkt_cdbp[5] & CTL_BYTE_NACA_MASK) {
4236 mutex_exit(cport_mutex);
4237 return (sata_txlt_check_condition(spx, KEY_ILLEGAL_REQUEST,
4238 SD_SCSI_ASC_CMD_SEQUENCE_ERR));
4239 }
4240
4241 sdinfo = sata_get_device_info(spx->txlt_sata_hba_inst,
4242 &spx->txlt_sata_pkt->satapkt_device);
4243 ASSERT(sdinfo != NULL);
4244
4245 spx->txlt_sata_pkt->satapkt_op_mode |= SATA_OPMODE_SYNCH;
4246
4247 sata_build_generic_cmd(scmd, SATAC_CHECK_POWER_MODE);
4248 scmd->satacmd_flags.sata_copy_out_sec_count_lsb = B_TRUE;
4249 scmd->satacmd_flags.sata_copy_out_error_reg = B_TRUE;
4250 if (sata_hba_start(spx, &rval) != 0) {
4251 mutex_exit(cport_mutex);
4252 return (rval);
4253 }
4254 if (scmd->satacmd_error_reg != 0) {
4255 mutex_exit(cport_mutex);
4256 return (sata_txlt_check_condition(spx, KEY_NO_SENSE,
4257 SD_SCSI_ASC_NO_ADD_SENSE));
4258 }
4259
4260 switch (scmd->satacmd_sec_count_lsb) {
4261 case SATA_PWRMODE_STANDBY: /* device in standby mode */
4262 if (sdinfo->satadrv_power_level == SATA_POWER_STOPPED)
4263 power_state = SATA_POWER_STOPPED;
4264 else {
4265 power_state = SATA_POWER_STANDBY;
4266 sdinfo->satadrv_power_level = SATA_POWER_STANDBY;
4267 }
4268 break;
4269 case SATA_PWRMODE_IDLE: /* device in idle mode */
4270 power_state = SATA_POWER_IDLE;
4271 sdinfo->satadrv_power_level = SATA_POWER_IDLE;
4272 break;
4273 case SATA_PWRMODE_ACTIVE: /* device in active or idle mode */
4274 default: /* 0x40, 0x41 active mode */
4275 if (sdinfo->satadrv_power_level == SATA_POWER_IDLE)
4276 power_state = SATA_POWER_IDLE;
4277 else {
4278 power_state = SATA_POWER_ACTIVE;
4279 sdinfo->satadrv_power_level = SATA_POWER_ACTIVE;
4280 }
4281 break;
4282 }
4283
4284 mutex_exit(cport_mutex);
4285
4286 if (bp != NULL && bp->b_un.b_addr && bp->b_bcount) {
4287 /*
4288 * Because it is fully emulated command storing data
4289 * programatically in the specified buffer, release
4290 * preallocated DMA resources before storing data in the buffer,
4291 * so no unwanted DMA sync would take place.
4292 */
4293 int count = MIN(bp->b_bcount,
4294 sizeof (struct scsi_extended_sense));
4295 sata_scsi_dmafree(NULL, scsipkt);
4296 bzero(&sense, sizeof (struct scsi_extended_sense));
4297 sense.es_valid = 0; /* Valid LBA */
4298 sense.es_class = 7; /* Response code 0x70 - current err */
4299 sense.es_key = KEY_NO_SENSE;
4300 sense.es_add_len = 6; /* Additional length */
4301 /* Copy no more than requested */
4302 bcopy(&sense, bp->b_un.b_addr, count);
4303 scsipkt->pkt_state |= STATE_XFERRED_DATA;
4304 scsipkt->pkt_resid = 0;
4305 switch (power_state) {
4306 case SATA_POWER_IDLE:
4307 case SATA_POWER_STANDBY:
4308 sense.es_add_code =
4309 SD_SCSI_ASC_LOW_POWER_CONDITION_ON;
4310 break;
4311 case SATA_POWER_STOPPED:
4312 sense.es_add_code = SD_SCSI_ASC_NO_ADD_SENSE;
4313 break;
4314 case SATA_POWER_ACTIVE:
4315 default:
4316 break;
4317 }
4318 }
4319
4320 SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
4321 "Scsi_pkt completion reason %x\n",
4322 scsipkt->pkt_reason);
4323
4324 if ((scsipkt->pkt_flags & FLAG_NOINTR) == 0 &&
4325 scsipkt->pkt_comp != NULL) {
4326 /* scsi callback required */
4327 if (servicing_interrupt()) {
4328 if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
4329 (task_func_t *)spx->txlt_scsi_pkt->pkt_comp,
4330 (void *)spx->txlt_scsi_pkt, TQ_NOSLEEP) ==
4331 TASKQID_INVALID) {
4332 return (TRAN_BUSY);
4333 }
4334 } else if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
4335 (task_func_t *)spx->txlt_scsi_pkt->pkt_comp,
4336 (void *)spx->txlt_scsi_pkt, TQ_SLEEP) == TASKQID_INVALID) {
4337 /* Scheduling the callback failed */
4338 return (TRAN_BUSY);
4339 }
4340 }
4341 return (TRAN_ACCEPT);
4342 }
4343
4344 /*
4345 * SATA translate command: Test Unit Ready
4346 * (ATA version for SATA hard disks).
4347 * It is translated into the Check Power Mode command.
4348 *
4349 * Returns TRAN_ACCEPT and appropriate values in scsi_pkt fields.
4350 */
4351 static int
sata_txlt_test_unit_ready(sata_pkt_txlate_t * spx)4352 sata_txlt_test_unit_ready(sata_pkt_txlate_t *spx)
4353 {
4354 struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
4355 struct scsi_extended_sense *sense;
4356 sata_cmd_t *scmd = &spx->txlt_sata_pkt->satapkt_cmd;
4357 sata_drive_info_t *sdinfo;
4358 int power_state;
4359 int rval, reason;
4360 kmutex_t *cport_mutex = &(SATA_TXLT_CPORT_MUTEX(spx));
4361
4362 mutex_enter(cport_mutex);
4363
4364 if (((rval = sata_txlt_generic_pkt_info(spx, &reason, 1)) !=
4365 TRAN_ACCEPT) || (reason == CMD_DEV_GONE)) {
4366 mutex_exit(cport_mutex);
4367 return (rval);
4368 }
4369
4370 sdinfo = sata_get_device_info(spx->txlt_sata_hba_inst,
4371 &spx->txlt_sata_pkt->satapkt_device);
4372 ASSERT(sdinfo != NULL);
4373
4374 spx->txlt_sata_pkt->satapkt_op_mode |= SATA_OPMODE_SYNCH;
4375
4376 /* send CHECK POWER MODE command */
4377 sata_build_generic_cmd(scmd, SATAC_CHECK_POWER_MODE);
4378 scmd->satacmd_flags.sata_copy_out_sec_count_lsb = B_TRUE;
4379 scmd->satacmd_flags.sata_copy_out_error_reg = B_TRUE;
4380 if (sata_hba_start(spx, &rval) != 0) {
4381 mutex_exit(cport_mutex);
4382 return (rval);
4383 }
4384
4385 if (scmd->satacmd_error_reg != 0) {
4386 mutex_exit(cport_mutex);
4387 return (sata_txlt_check_condition(spx, KEY_NOT_READY,
4388 SD_SCSI_ASC_LU_NOT_RESPONSE));
4389 }
4390
4391 power_state = scmd->satacmd_sec_count_lsb;
4392
4393 /*
4394 * return NOT READY when device in STOPPED mode
4395 */
4396 if (power_state == SATA_PWRMODE_STANDBY &&
4397 sdinfo->satadrv_power_level == SATA_POWER_STOPPED) {
4398 *scsipkt->pkt_scbp = STATUS_CHECK;
4399 sense = sata_arq_sense(spx);
4400 sense->es_key = KEY_NOT_READY;
4401 sense->es_add_code = SD_SCSI_ASC_LU_NOT_READY;
4402 } else {
4403 /*
4404 * For other power mode, return GOOD status
4405 */
4406 *scsipkt->pkt_scbp = STATUS_GOOD;
4407 }
4408
4409 scsipkt->pkt_reason = CMD_CMPLT;
4410 scsipkt->pkt_state = STATE_GOT_BUS | STATE_GOT_TARGET |
4411 STATE_SENT_CMD | STATE_GOT_STATUS;
4412
4413 mutex_exit(cport_mutex);
4414
4415 SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
4416 "Scsi_pkt completion reason %x\n", scsipkt->pkt_reason);
4417
4418 if ((scsipkt->pkt_flags & FLAG_NOINTR) == 0 &&
4419 scsipkt->pkt_comp != NULL) {
4420 /* scsi callback required */
4421 if (servicing_interrupt()) {
4422 if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
4423 (task_func_t *)spx->txlt_scsi_pkt->pkt_comp,
4424 (void *)spx->txlt_scsi_pkt, TQ_NOSLEEP) ==
4425 TASKQID_INVALID) {
4426 return (TRAN_BUSY);
4427 }
4428 } else if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
4429 (task_func_t *)spx->txlt_scsi_pkt->pkt_comp,
4430 (void *)spx->txlt_scsi_pkt, TQ_SLEEP) == TASKQID_INVALID) {
4431 /* Scheduling the callback failed */
4432 return (TRAN_BUSY);
4433 }
4434 }
4435
4436 return (TRAN_ACCEPT);
4437 }
4438
4439 /*
4440 * SATA translate command: Start Stop Unit
4441 * Translation depends on a command:
4442 *
4443 * Power condition bits will be supported
4444 * and the power level should be maintained by SATL,
4445 * When SATL received a command, it will check the
4446 * power level firstly, and return the status according
4447 * to SAT2 v2.6 and SAT-2 Standby Modifications
4448 *
4449 * SPC-4/SBC-3 SATL ATA power condition SATL SPC/SBC
4450 * -----------------------------------------------------------------------
4451 * SSU_PC1 Active <==> ATA Active <==> SSU:start_bit =1
4452 * SSU_PC2 Idle <==> ATA Idle <==> N/A
4453 * SSU_PC3 Standby <==> ATA Standby <==> N/A
4454 * SSU_PC4 Stopped <==> ATA Standby <==> SSU:start_bit = 0
4455 *
4456 * Unload Media / NOT SUPPORTED YET
4457 * Load Media / NOT SUPPROTED YET
4458 * Immediate bit / NOT SUPPORTED YET (deferred error)
4459 *
4460 * Returns TRAN_ACCEPT or code returned by sata_hba_start() and
4461 * appropriate values in scsi_pkt fields.
4462 */
4463 static int
sata_txlt_start_stop_unit(sata_pkt_txlate_t * spx)4464 sata_txlt_start_stop_unit(sata_pkt_txlate_t *spx)
4465 {
4466 struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
4467 sata_cmd_t *scmd = &spx->txlt_sata_pkt->satapkt_cmd;
4468 int rval, reason;
4469 sata_drive_info_t *sdinfo;
4470 sata_id_t *sata_id;
4471 kmutex_t *cport_mutex = &(SATA_TXLT_CPORT_MUTEX(spx));
4472
4473 SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
4474 "sata_txlt_start_stop_unit: %d\n", scsipkt->pkt_scbp[4] & 1);
4475
4476 mutex_enter(cport_mutex);
4477
4478 if (((rval = sata_txlt_generic_pkt_info(spx, &reason, 1)) !=
4479 TRAN_ACCEPT) || (reason == CMD_DEV_GONE)) {
4480 mutex_exit(cport_mutex);
4481 return (rval);
4482 }
4483
4484 if (scsipkt->pkt_cdbp[1] & START_STOP_IMMED_MASK) {
4485 /* IMMED bit - not supported */
4486 mutex_exit(cport_mutex);
4487 return (sata_txlt_check_condition(spx, KEY_ILLEGAL_REQUEST,
4488 SD_SCSI_ASC_INVALID_FIELD_IN_CDB));
4489 }
4490
4491 spx->txlt_sata_pkt->satapkt_op_mode |= SATA_OPMODE_SYNCH;
4492 spx->txlt_sata_pkt->satapkt_comp = NULL;
4493
4494 sdinfo = sata_get_device_info(spx->txlt_sata_hba_inst,
4495 &spx->txlt_sata_pkt->satapkt_device);
4496 ASSERT(sdinfo != NULL);
4497 sata_id = &sdinfo->satadrv_id;
4498
4499 switch ((scsipkt->pkt_cdbp[4] & START_STOP_POWER_COND_MASK) >> 4) {
4500 case 0:
4501 if (scsipkt->pkt_cdbp[4] & START_STOP_LOEJ_MASK) {
4502 /* Load/Unload Media - invalid request */
4503 goto err_out;
4504 }
4505 if (scsipkt->pkt_cdbp[4] & START_STOP_START_MASK) {
4506 /* Start Unit */
4507 sata_build_read_verify_cmd(scmd, 1, 5);
4508 scmd->satacmd_flags.sata_copy_out_error_reg = B_TRUE;
4509 /* Transfer command to HBA */
4510 if (sata_hba_start(spx, &rval) != 0) {
4511 /* Pkt not accepted for execution */
4512 mutex_exit(cport_mutex);
4513 return (rval);
4514 }
4515 if (scmd->satacmd_error_reg != 0) {
4516 goto err_out;
4517 }
4518 sdinfo->satadrv_power_level = SATA_POWER_ACTIVE;
4519 } else {
4520 /* Stop Unit */
4521 sata_build_generic_cmd(scmd, SATAC_FLUSH_CACHE);
4522 scmd->satacmd_flags.sata_copy_out_error_reg = B_TRUE;
4523 if (sata_hba_start(spx, &rval) != 0) {
4524 mutex_exit(cport_mutex);
4525 return (rval);
4526 } else {
4527 if (scmd->satacmd_error_reg != 0) {
4528 goto err_out;
4529 }
4530 }
4531 /* ata standby immediate command */
4532 sata_build_generic_cmd(scmd, SATAC_STANDBY_IM);
4533 scmd->satacmd_flags.sata_copy_out_error_reg = B_TRUE;
4534 if (sata_hba_start(spx, &rval) != 0) {
4535 mutex_exit(cport_mutex);
4536 return (rval);
4537 }
4538 if (scmd->satacmd_error_reg != 0) {
4539 goto err_out;
4540 }
4541 sdinfo->satadrv_power_level = SATA_POWER_STOPPED;
4542 }
4543 break;
4544 case 0x1:
4545 sata_build_generic_cmd(scmd, SATAC_IDLE);
4546 scmd->satacmd_flags.sata_copy_out_error_reg = B_TRUE;
4547 if (sata_hba_start(spx, &rval) != 0) {
4548 mutex_exit(cport_mutex);
4549 return (rval);
4550 }
4551 if (scmd->satacmd_error_reg != 0) {
4552 goto err_out;
4553 }
4554 sata_build_read_verify_cmd(scmd, 1, 5);
4555 scmd->satacmd_flags.sata_copy_out_error_reg = B_TRUE;
4556 /* Transfer command to HBA */
4557 if (sata_hba_start(spx, &rval) != 0) {
4558 /* Pkt not accepted for execution */
4559 mutex_exit(cport_mutex);
4560 return (rval);
4561 } else {
4562 if (scmd->satacmd_error_reg != 0) {
4563 goto err_out;
4564 }
4565 }
4566 sdinfo->satadrv_power_level = SATA_POWER_ACTIVE;
4567 break;
4568 case 0x2:
4569 sata_build_generic_cmd(scmd, SATAC_FLUSH_CACHE);
4570 scmd->satacmd_flags.sata_copy_out_error_reg = B_TRUE;
4571 if (!(scsipkt->pkt_cdbp[4] & START_STOP_NOFLUSH_MASK)) {
4572 if (sata_hba_start(spx, &rval) != 0) {
4573 mutex_exit(cport_mutex);
4574 return (rval);
4575 }
4576 if (scmd->satacmd_error_reg != 0) {
4577 goto err_out;
4578 }
4579 }
4580 sata_build_generic_cmd(scmd, SATAC_IDLE);
4581 scmd->satacmd_flags.sata_copy_out_error_reg = B_TRUE;
4582 if (sata_hba_start(spx, &rval) != 0) {
4583 mutex_exit(cport_mutex);
4584 return (rval);
4585 }
4586 if (scmd->satacmd_error_reg != 0) {
4587 goto err_out;
4588 }
4589 if ((scsipkt->pkt_cdbp[3] & START_STOP_MODIFIER_MASK)) {
4590 /*
4591 * POWER CONDITION MODIFIER bit set
4592 * to 0x1 or larger it will be handled
4593 * on the same way as bit = 0x1
4594 */
4595 if (!(sata_id->ai_cmdset84 &
4596 SATA_IDLE_UNLOAD_SUPPORTED)) {
4597 sdinfo->satadrv_power_level = SATA_POWER_IDLE;
4598 break;
4599 }
4600 sata_build_generic_cmd(scmd, SATAC_IDLE_IM);
4601 scmd->satacmd_features_reg = 0x44;
4602 scmd->satacmd_lba_low_lsb = 0x4c;
4603 scmd->satacmd_lba_mid_lsb = 0x4e;
4604 scmd->satacmd_lba_high_lsb = 0x55;
4605 scmd->satacmd_flags.sata_copy_out_error_reg = B_TRUE;
4606 if (sata_hba_start(spx, &rval) != 0) {
4607 mutex_exit(cport_mutex);
4608 return (rval);
4609 }
4610 if (scmd->satacmd_error_reg != 0) {
4611 goto err_out;
4612 }
4613 }
4614 sdinfo->satadrv_power_level = SATA_POWER_IDLE;
4615 break;
4616 case 0x3:
4617 sata_build_generic_cmd(scmd, SATAC_FLUSH_CACHE);
4618 scmd->satacmd_flags.sata_copy_out_error_reg = B_TRUE;
4619 if (!(scsipkt->pkt_cdbp[4] & START_STOP_NOFLUSH_MASK)) {
4620 if (sata_hba_start(spx, &rval) != 0) {
4621 mutex_exit(cport_mutex);
4622 return (rval);
4623 }
4624 if (scmd->satacmd_error_reg != 0) {
4625 goto err_out;
4626 }
4627 }
4628 sata_build_generic_cmd(scmd, SATAC_STANDBY);
4629 scmd->satacmd_flags.sata_copy_out_error_reg = B_TRUE;
4630 if (sata_hba_start(spx, &rval) != 0) {
4631 mutex_exit(cport_mutex);
4632 return (rval);
4633 }
4634 if (scmd->satacmd_error_reg != 0) {
4635 goto err_out;
4636 }
4637 sdinfo->satadrv_power_level = SATA_POWER_STANDBY;
4638 break;
4639 case 0x7:
4640 sata_build_generic_cmd(scmd, SATAC_CHECK_POWER_MODE);
4641 scmd->satacmd_flags.sata_copy_out_sec_count_lsb = B_TRUE;
4642 scmd->satacmd_flags.sata_copy_out_error_reg = B_TRUE;
4643 if (sata_hba_start(spx, &rval) != 0) {
4644 mutex_exit(cport_mutex);
4645 return (rval);
4646 }
4647 if (scmd->satacmd_error_reg != 0) {
4648 goto err_out;
4649 }
4650 switch (scmd->satacmd_sec_count_lsb) {
4651 case SATA_PWRMODE_STANDBY:
4652 sata_build_generic_cmd(scmd, SATAC_STANDBY);
4653 scmd->satacmd_sec_count_msb = sata_get_standby_timer(
4654 sdinfo->satadrv_standby_timer);
4655 scmd->satacmd_flags.sata_copy_out_error_reg = B_TRUE;
4656 if (sata_hba_start(spx, &rval) != 0) {
4657 mutex_exit(cport_mutex);
4658 return (rval);
4659 } else {
4660 if (scmd->satacmd_error_reg != 0) {
4661 goto err_out;
4662 }
4663 }
4664 break;
4665 case SATA_PWRMODE_IDLE:
4666 sata_build_generic_cmd(scmd, SATAC_IDLE);
4667 scmd->satacmd_sec_count_msb = sata_get_standby_timer(
4668 sdinfo->satadrv_standby_timer);
4669 scmd->satacmd_flags.sata_copy_out_error_reg = B_TRUE;
4670 if (sata_hba_start(spx, &rval) != 0) {
4671 mutex_exit(cport_mutex);
4672 return (rval);
4673 } else {
4674 if (scmd->satacmd_error_reg != 0) {
4675 goto err_out;
4676 }
4677 }
4678 break;
4679 case SATA_PWRMODE_ACTIVE_SPINDOWN:
4680 case SATA_PWRMODE_ACTIVE_SPINUP:
4681 case SATA_PWRMODE_ACTIVE:
4682 sata_build_generic_cmd(scmd, SATAC_IDLE);
4683 scmd->satacmd_sec_count_msb = sata_get_standby_timer(
4684 sdinfo->satadrv_standby_timer);
4685 scmd->satacmd_flags.sata_copy_out_error_reg = B_TRUE;
4686 if (sata_hba_start(spx, &rval) != 0) {
4687 mutex_exit(cport_mutex);
4688 return (rval);
4689 }
4690 if (scmd->satacmd_error_reg != 0) {
4691 goto err_out;
4692 }
4693 sata_build_read_verify_cmd(scmd, 1, 5);
4694 scmd->satacmd_flags.sata_copy_out_error_reg = B_TRUE;
4695 if (sata_hba_start(spx, &rval) != 0) {
4696 mutex_exit(cport_mutex);
4697 return (rval);
4698 }
4699 if (scmd->satacmd_error_reg != 0) {
4700 goto err_out;
4701 }
4702 break;
4703 default:
4704 goto err_out;
4705 }
4706 break;
4707 case 0xb:
4708 if ((sata_get_standby_timer(sdinfo->satadrv_standby_timer) ==
4709 0) || (!(sata_id->ai_cap & SATA_STANDBYTIMER))) {
4710 mutex_exit(cport_mutex);
4711 return (sata_txlt_check_condition(spx,
4712 KEY_ILLEGAL_REQUEST,
4713 SD_SCSI_ASC_INVALID_FIELD_IN_CDB));
4714 }
4715 sata_build_generic_cmd(scmd, SATAC_FLUSH_CACHE);
4716 scmd->satacmd_flags.sata_copy_out_error_reg = B_TRUE;
4717 if (!(scsipkt->pkt_cdbp[4] & START_STOP_NOFLUSH_MASK)) {
4718 if (sata_hba_start(spx, &rval) != 0) {
4719 mutex_exit(cport_mutex);
4720 return (rval);
4721 }
4722 if (scmd->satacmd_error_reg != 0) {
4723 goto err_out;
4724 }
4725 sata_build_generic_cmd(scmd, SATAC_STANDBY_IM);
4726 scmd->satacmd_flags.sata_copy_out_error_reg = B_TRUE;
4727 if (sata_hba_start(spx, &rval) != 0) {
4728 mutex_exit(cport_mutex);
4729 return (rval);
4730 }
4731 if (scmd->satacmd_error_reg != 0) {
4732 goto err_out;
4733 }
4734 }
4735 bzero(sdinfo->satadrv_standby_timer, sizeof (uchar_t) * 4);
4736 break;
4737 default:
4738 err_out:
4739 mutex_exit(cport_mutex);
4740 return (sata_txlt_check_condition(spx, KEY_ILLEGAL_REQUEST,
4741 SD_SCSI_ASC_INVALID_FIELD_IN_CDB));
4742 }
4743
4744 /*
4745 * Since it was a synchronous command,
4746 * a callback function will be called directly.
4747 */
4748 mutex_exit(cport_mutex);
4749 SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
4750 "synchronous execution status %x\n",
4751 spx->txlt_sata_pkt->satapkt_reason);
4752
4753 if ((scsipkt->pkt_flags & FLAG_NOINTR) == 0 &&
4754 scsipkt->pkt_comp != NULL) {
4755 sata_set_arq_data(spx->txlt_sata_pkt);
4756 if (servicing_interrupt()) {
4757 if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
4758 (task_func_t *)spx->txlt_scsi_pkt->pkt_comp,
4759 (void *)spx->txlt_scsi_pkt, TQ_NOSLEEP) ==
4760 TASKQID_INVALID) {
4761 return (TRAN_BUSY);
4762 }
4763 } else if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
4764 (task_func_t *)spx->txlt_scsi_pkt->pkt_comp,
4765 (void *)spx->txlt_scsi_pkt, TQ_SLEEP) == TASKQID_INVALID) {
4766 /* Scheduling the callback failed */
4767 return (TRAN_BUSY);
4768 }
4769 }
4770 else
4771
4772 sata_txlt_nodata_cmd_completion(spx->txlt_sata_pkt);
4773
4774 return (TRAN_ACCEPT);
4775
4776 }
4777
4778 /*
4779 * SATA translate command: Read Capacity.
4780 * Emulated command for SATA disks.
4781 * Capacity is retrieved from cached Idenifty Device data.
4782 * Identify Device data shows effective disk capacity, not the native
4783 * capacity, which may be limitted by Set Max Address command.
4784 * This is ATA version for SATA hard disks.
4785 *
4786 * Returns TRAN_ACCEPT and appropriate values in scsi_pkt fields.
4787 */
4788 static int
sata_txlt_read_capacity(sata_pkt_txlate_t * spx)4789 sata_txlt_read_capacity(sata_pkt_txlate_t *spx)
4790 {
4791 struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
4792 struct buf *bp = spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp;
4793 sata_drive_info_t *sdinfo;
4794 uint64_t val;
4795 uint32_t lbsize = DEV_BSIZE;
4796 uchar_t *rbuf;
4797 int rval, reason;
4798 kmutex_t *cport_mutex = &(SATA_TXLT_CPORT_MUTEX(spx));
4799
4800 SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
4801 "sata_txlt_read_capacity: ", NULL);
4802
4803 mutex_enter(cport_mutex);
4804
4805 if (((rval = sata_txlt_generic_pkt_info(spx, &reason, 0)) !=
4806 TRAN_ACCEPT) || (reason == CMD_DEV_GONE)) {
4807 mutex_exit(cport_mutex);
4808 return (rval);
4809 }
4810
4811 scsipkt->pkt_reason = CMD_CMPLT;
4812 scsipkt->pkt_state = STATE_GOT_BUS | STATE_GOT_TARGET |
4813 STATE_SENT_CMD | STATE_GOT_STATUS;
4814 *scsipkt->pkt_scbp = STATUS_GOOD;
4815 if (bp != NULL && bp->b_un.b_addr && bp->b_bcount) {
4816 /*
4817 * Because it is fully emulated command storing data
4818 * programatically in the specified buffer, release
4819 * preallocated DMA resources before storing data in the buffer,
4820 * so no unwanted DMA sync would take place.
4821 */
4822 sata_scsi_dmafree(NULL, scsipkt);
4823
4824 sdinfo = sata_get_device_info(
4825 spx->txlt_sata_hba_inst,
4826 &spx->txlt_sata_pkt->satapkt_device);
4827
4828 /*
4829 * As per SBC-3, the "returned LBA" is either the highest
4830 * addressable LBA or 0xffffffff, whichever is smaller.
4831 */
4832 val = MIN(sdinfo->satadrv_capacity - 1, UINT32_MAX);
4833
4834 if (sdinfo->satadrv_id.ai_phys_sect_sz & SATA_L2PS_CHECK_BIT) {
4835 /* physical/logical sector size word is valid */
4836
4837 if (sdinfo->satadrv_id.ai_phys_sect_sz &
4838 SATA_L2PS_BIG_SECTORS) {
4839 /* if this set 117-118 words are valid */
4840 lbsize = sdinfo->satadrv_id.ai_words_lsec[0] |
4841 (sdinfo->satadrv_id.ai_words_lsec[1] << 16);
4842 lbsize <<= 1; /* convert from words to bytes */
4843 }
4844 }
4845 rbuf = (uchar_t *)bp->b_un.b_addr;
4846 /* Need to swap endians to match scsi format */
4847 rbuf[0] = (val >> 24) & 0xff;
4848 rbuf[1] = (val >> 16) & 0xff;
4849 rbuf[2] = (val >> 8) & 0xff;
4850 rbuf[3] = val & 0xff;
4851 rbuf[4] = (lbsize >> 24) & 0xff;
4852 rbuf[5] = (lbsize >> 16) & 0xff;
4853 rbuf[6] = (lbsize >> 8) & 0xff;
4854 rbuf[7] = lbsize & 0xff;
4855
4856 scsipkt->pkt_state |= STATE_XFERRED_DATA;
4857 scsipkt->pkt_resid = 0;
4858
4859 SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst, "%d\n",
4860 sdinfo->satadrv_capacity -1);
4861 }
4862 mutex_exit(cport_mutex);
4863 /*
4864 * If a callback was requested, do it now.
4865 */
4866 SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
4867 "Scsi_pkt completion reason %x\n", scsipkt->pkt_reason);
4868
4869 if ((scsipkt->pkt_flags & FLAG_NOINTR) == 0 &&
4870 scsipkt->pkt_comp != NULL) {
4871 /* scsi callback required */
4872 if (servicing_interrupt()) {
4873 if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
4874 (task_func_t *)spx->txlt_scsi_pkt->pkt_comp,
4875 (void *)spx->txlt_scsi_pkt, TQ_NOSLEEP) ==
4876 TASKQID_INVALID) {
4877 return (TRAN_BUSY);
4878 }
4879 } else if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
4880 (task_func_t *)spx->txlt_scsi_pkt->pkt_comp,
4881 (void *)spx->txlt_scsi_pkt, TQ_SLEEP) == TASKQID_INVALID) {
4882 /* Scheduling the callback failed */
4883 return (TRAN_BUSY);
4884 }
4885 }
4886
4887 return (TRAN_ACCEPT);
4888 }
4889
4890 /*
4891 * SATA translate command: Read Capacity (16).
4892 * Emulated command for SATA disks.
4893 * Info is retrieved from cached Identify Device data.
4894 * Implemented to SBC-3 (draft 21) and SAT-2 (final) specifications.
4895 *
4896 * Returns TRAN_ACCEPT and appropriate values in scsi_pkt fields.
4897 */
4898 static int
sata_txlt_read_capacity16(sata_pkt_txlate_t * spx)4899 sata_txlt_read_capacity16(sata_pkt_txlate_t *spx)
4900 {
4901 struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
4902 struct buf *bp = spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp;
4903 sata_drive_info_t *sdinfo;
4904 uint64_t val;
4905 uint16_t l2p_exp;
4906 uint32_t lbsize = DEV_BSIZE;
4907 uchar_t *rbuf;
4908 int rval, reason;
4909 #define TPE 0x80
4910 #define TPRZ 0x40
4911 kmutex_t *cport_mutex = &(SATA_TXLT_CPORT_MUTEX(spx));
4912
4913 SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
4914 "sata_txlt_read_capacity: ", NULL);
4915
4916 mutex_enter(cport_mutex);
4917
4918 if (((rval = sata_txlt_generic_pkt_info(spx, &reason, 0)) !=
4919 TRAN_ACCEPT) || (reason == CMD_DEV_GONE)) {
4920 mutex_exit(cport_mutex);
4921 return (rval);
4922 }
4923
4924 scsipkt->pkt_reason = CMD_CMPLT;
4925 scsipkt->pkt_state = STATE_GOT_BUS | STATE_GOT_TARGET |
4926 STATE_SENT_CMD | STATE_GOT_STATUS;
4927 if (bp != NULL && bp->b_un.b_addr && bp->b_bcount) {
4928 /*
4929 * Because it is fully emulated command storing data
4930 * programatically in the specified buffer, release
4931 * preallocated DMA resources before storing data in the buffer,
4932 * so no unwanted DMA sync would take place.
4933 */
4934 sata_scsi_dmafree(NULL, scsipkt);
4935
4936 /* Check SERVICE ACTION field */
4937 if ((scsipkt->pkt_cdbp[1] & 0x1f) !=
4938 SSVC_ACTION_READ_CAPACITY_G4) {
4939 mutex_exit(cport_mutex);
4940 return (sata_txlt_check_condition(spx,
4941 KEY_ILLEGAL_REQUEST,
4942 SD_SCSI_ASC_INVALID_FIELD_IN_CDB));
4943 }
4944
4945 /* Check LBA field */
4946 if ((scsipkt->pkt_cdbp[2] != 0) ||
4947 (scsipkt->pkt_cdbp[3] != 0) ||
4948 (scsipkt->pkt_cdbp[4] != 0) ||
4949 (scsipkt->pkt_cdbp[5] != 0) ||
4950 (scsipkt->pkt_cdbp[6] != 0) ||
4951 (scsipkt->pkt_cdbp[7] != 0) ||
4952 (scsipkt->pkt_cdbp[8] != 0) ||
4953 (scsipkt->pkt_cdbp[9] != 0)) {
4954 mutex_exit(cport_mutex);
4955 return (sata_txlt_check_condition(spx,
4956 KEY_ILLEGAL_REQUEST,
4957 SD_SCSI_ASC_INVALID_FIELD_IN_CDB));
4958 }
4959
4960 /* Check PMI bit */
4961 if (scsipkt->pkt_cdbp[14] & 0x1) {
4962 mutex_exit(cport_mutex);
4963 return (sata_txlt_check_condition(spx,
4964 KEY_ILLEGAL_REQUEST,
4965 SD_SCSI_ASC_INVALID_FIELD_IN_CDB));
4966 }
4967
4968 *scsipkt->pkt_scbp = STATUS_GOOD;
4969
4970 sdinfo = sata_get_device_info(
4971 spx->txlt_sata_hba_inst,
4972 &spx->txlt_sata_pkt->satapkt_device);
4973
4974 /* last logical block address */
4975 val = MIN(sdinfo->satadrv_capacity - 1,
4976 SCSI_READ_CAPACITY16_MAX_LBA);
4977
4978 /* logical to physical block size exponent */
4979 l2p_exp = 0;
4980 if (sdinfo->satadrv_id.ai_phys_sect_sz & SATA_L2PS_CHECK_BIT) {
4981 /* physical/logical sector size word is valid */
4982
4983 if (sdinfo->satadrv_id.ai_phys_sect_sz &
4984 SATA_L2PS_HAS_MULT) {
4985 /* multiple logical sectors per phys sectors */
4986 l2p_exp =
4987 sdinfo->satadrv_id.ai_phys_sect_sz &
4988 SATA_L2PS_EXP_MASK;
4989 }
4990
4991 if (sdinfo->satadrv_id.ai_phys_sect_sz &
4992 SATA_L2PS_BIG_SECTORS) {
4993 /* if this set 117-118 words are valid */
4994 lbsize = sdinfo->satadrv_id.ai_words_lsec[0] |
4995 (sdinfo->satadrv_id.ai_words_lsec[1] << 16);
4996 lbsize <<= 1; /* convert from words to bytes */
4997 }
4998 }
4999
5000 rbuf = (uchar_t *)bp->b_un.b_addr;
5001 bzero(rbuf, bp->b_bcount);
5002
5003 /* returned logical block address */
5004 rbuf[0] = (val >> 56) & 0xff;
5005 rbuf[1] = (val >> 48) & 0xff;
5006 rbuf[2] = (val >> 40) & 0xff;
5007 rbuf[3] = (val >> 32) & 0xff;
5008 rbuf[4] = (val >> 24) & 0xff;
5009 rbuf[5] = (val >> 16) & 0xff;
5010 rbuf[6] = (val >> 8) & 0xff;
5011 rbuf[7] = val & 0xff;
5012 rbuf[8] = (lbsize >> 24) & 0xff;
5013 rbuf[9] = (lbsize >> 16) & 0xff;
5014 rbuf[10] = (lbsize >> 8) & 0xff;
5015 rbuf[11] = lbsize & 0xff;
5016
5017 /* p_type, prot_en, unspecified by SAT-2 */
5018 /* rbuf[12] = 0; */
5019
5020 /* p_i_exponent, undefined by SAT-2 */
5021 /* logical blocks per physical block exponent */
5022 rbuf[13] = l2p_exp;
5023
5024 /*
5025 * tpe and tprz as defined in T10/10-079 r0.
5026 * TRIM support is indicated by the relevant bit in the data
5027 * set management word. Read-after-trim behavior is indicated
5028 * by the additional bits in the identify device word. Of the
5029 * three defined possibilities, we only flag read-zero.
5030 */
5031 if (sdinfo->satadrv_id.ai_dsm & SATA_DSM_TRIM) {
5032 rbuf[14] |= TPE;
5033
5034 if ((sdinfo->satadrv_id.ai_addsupported &
5035 SATA_DETERMINISTIC_READ) &&
5036 (sdinfo->satadrv_id.ai_addsupported &
5037 SATA_READ_ZERO)) {
5038 rbuf[14] |= TPRZ;
5039 }
5040 }
5041
5042 /* lowest aligned logical block address = 0 (for now) */
5043 /* rbuf[15] = 0; */
5044
5045 scsipkt->pkt_state |= STATE_XFERRED_DATA;
5046 scsipkt->pkt_resid = 0;
5047
5048 SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst, "%llu\n",
5049 sdinfo->satadrv_capacity -1);
5050 }
5051
5052 mutex_exit(cport_mutex);
5053
5054 /*
5055 * If a callback was requested, do it now.
5056 */
5057 SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
5058 "Scsi_pkt completion reason %x\n", scsipkt->pkt_reason);
5059
5060 if ((scsipkt->pkt_flags & FLAG_NOINTR) == 0 &&
5061 scsipkt->pkt_comp != NULL) {
5062 /* scsi callback required */
5063 if (servicing_interrupt()) {
5064 if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
5065 (task_func_t *)spx->txlt_scsi_pkt->pkt_comp,
5066 (void *)spx->txlt_scsi_pkt, TQ_NOSLEEP) ==
5067 TASKQID_INVALID) {
5068 return (TRAN_BUSY);
5069 }
5070 } else if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
5071 (task_func_t *)spx->txlt_scsi_pkt->pkt_comp,
5072 (void *)spx->txlt_scsi_pkt, TQ_SLEEP) == TASKQID_INVALID) {
5073 /* Scheduling the callback failed */
5074 return (TRAN_BUSY);
5075 }
5076 }
5077
5078 return (TRAN_ACCEPT);
5079 }
5080
5081 static boolean_t
sata_txlt_unmap_supported(sata_pkt_txlate_t * spx,sata_drive_info_t * sdinfo)5082 sata_txlt_unmap_supported(sata_pkt_txlate_t *spx, sata_drive_info_t *sdinfo)
5083 {
5084 const sata_id_t *id = &sdinfo->satadrv_id;
5085
5086 ASSERT(MUTEX_HELD(&SATA_TXLT_CPORT_MUTEX(spx)));
5087
5088 /*
5089 * SAT-5 9.24.1 If the TRIM SUPPORTED bit is zero or the
5090 * DRAT SUPPORTED bit is zero, then UNMAP is not supported.
5091 */
5092 if (!(id->ai_dsm & SATA_DSM_TRIM) ||
5093 !(id->ai_addsupported & SATA_DETERMINISTIC_READ)) {
5094 return (B_FALSE);
5095 }
5096
5097 return (B_TRUE);
5098 }
5099
5100 /*
5101 * Translate command: UNMAP
5102 *
5103 * The function cannot be called in interrupt context since it may sleep.
5104 */
5105 static int
sata_txlt_unmap(sata_pkt_txlate_t * spx)5106 sata_txlt_unmap(sata_pkt_txlate_t *spx)
5107 {
5108 struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
5109 sata_cmd_t *scmd = &spx->txlt_sata_pkt->satapkt_cmd;
5110 struct buf *bp = spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp;
5111 uint16_t count = 0;
5112 int synch;
5113 int rval, reason;
5114 int i, x;
5115 int bdlen = 0;
5116 int ranges = 0;
5117 int paramlen = 8;
5118 uint8_t *data, *tmpbd;
5119 sata_drive_info_t *sdinfo;
5120 kmutex_t *cport_mutex = &(SATA_TXLT_CPORT_MUTEX(spx));
5121 #define TRIM 0x1
5122
5123 SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
5124 "sata_txlt_unmap: ", NULL);
5125
5126 mutex_enter(cport_mutex);
5127
5128 sdinfo = sata_get_device_info(spx->txlt_sata_hba_inst,
5129 &spx->txlt_sata_pkt->satapkt_device);
5130 if (sdinfo != NULL) {
5131 SATADBG2(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
5132 "DSM support 0x%x, max number of 512 byte blocks of LBA "
5133 "range entries 0x%x\n", sdinfo->satadrv_id.ai_dsm,
5134 sdinfo->satadrv_id.ai_maxcount);
5135 }
5136
5137 rval = sata_txlt_generic_pkt_info(spx, &reason, 1);
5138 if ((rval != TRAN_ACCEPT) || (reason == CMD_DEV_GONE)) {
5139 mutex_exit(cport_mutex);
5140 return (rval);
5141 }
5142
5143 if (!sata_txlt_unmap_supported(spx, sdinfo)) {
5144 mutex_exit(cport_mutex);
5145 return (sata_txlt_invalid_command(spx));
5146 }
5147
5148 /*
5149 * Need to modify bp to have TRIM data instead of UNMAP data.
5150 * Start by getting the block descriptor data length by subtracting
5151 * the 8 byte parameter list header from the parameter list length.
5152 * The block descriptor size has to be a multiple of 16 bytes.
5153 */
5154 bdlen = scsipkt->pkt_cdbp[7];
5155 bdlen = (bdlen << 8) + scsipkt->pkt_cdbp[8] - paramlen;
5156 if ((bdlen < 0) || ((bdlen % 16) != 0) ||
5157 ((bp != NULL) && (bdlen > (bp->b_bcount - paramlen)))) {
5158 SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
5159 "sata_txlt_unmap: invalid block descriptor length", NULL);
5160 mutex_exit(cport_mutex);
5161 return ((sata_txlt_check_condition(spx, KEY_ILLEGAL_REQUEST,
5162 SD_SCSI_ASC_INVALID_FIELD_IN_CDB)));
5163 }
5164 /*
5165 * If there are no parameter data or block descriptors, it is not
5166 * considered an error so just complete the command without sending
5167 * TRIM.
5168 */
5169 if ((bdlen == 0) || (bp == NULL) || (bp->b_un.b_addr == NULL) ||
5170 (bp->b_bcount == 0)) {
5171 SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
5172 "sata_txlt_unmap: no parameter data or block descriptors",
5173 NULL);
5174 mutex_exit(cport_mutex);
5175 return (sata_txlt_unmap_nodata_cmd(spx));
5176 }
5177 tmpbd = (uint8_t *)bp->b_un.b_addr + paramlen;
5178 data = kmem_zalloc(bdlen, KM_SLEEP);
5179
5180 /*
5181 * Loop through all the UNMAP block descriptors and convert the data
5182 * into TRIM format.
5183 */
5184 for (i = 0, x = 0; i < bdlen; i += 16, x += 8) {
5185 /* get range length */
5186 data[x] = tmpbd[i+7];
5187 data[x+1] = tmpbd[i+6];
5188 /* get LBA */
5189 data[x+2] = tmpbd[i+5];
5190 data[x+3] = tmpbd[i+4];
5191 data[x+4] = tmpbd[i+3];
5192 data[x+5] = tmpbd[i+2];
5193 data[x+6] = tmpbd[i+11];
5194 data[x+7] = tmpbd[i+10];
5195
5196 ranges++;
5197 }
5198
5199 /*
5200 * The TRIM command expects the data buffer to be a multiple of
5201 * 512-byte blocks of range entries. This means that the UNMAP buffer
5202 * may be too small. Free the original DMA resources and create a
5203 * local buffer.
5204 */
5205 sata_common_free_dma_rsrcs(spx);
5206
5207 /*
5208 * Get count of 512-byte blocks of range entries. The length
5209 * of a range entry is 8 bytes which means one count has 64 range
5210 * entries.
5211 */
5212 count = (ranges + 63)/64;
5213
5214 /* Allocate a buffer that is a multiple of 512 bytes. */
5215 mutex_exit(cport_mutex);
5216 bp = sata_alloc_local_buffer(spx, (size_t)count * 512);
5217 if (bp == NULL) {
5218 SATADBG1(SATA_DBG_ATAPI, spx->txlt_sata_hba_inst,
5219 "sata_txlt_unmap: "
5220 "cannot allocate buffer for TRIM command", NULL);
5221 kmem_free(data, bdlen);
5222 return (TRAN_BUSY);
5223 }
5224 bp_mapin(bp); /* make data buffer accessible */
5225 mutex_enter(cport_mutex);
5226
5227 bzero(bp->b_un.b_addr, bp->b_bcount);
5228 bcopy(data, bp->b_un.b_addr, x);
5229 kmem_free(data, bdlen);
5230 rval = ddi_dma_sync(spx->txlt_buf_dma_handle, 0, 0,
5231 DDI_DMA_SYNC_FORDEV);
5232 ASSERT(rval == DDI_SUCCESS);
5233
5234 scmd->satacmd_flags.sata_data_direction = SATA_DIR_WRITE;
5235 scmd->satacmd_addr_type = ATA_ADDR_LBA48;
5236 scmd->satacmd_cmd_reg = SATAC_DSM;
5237 scmd->satacmd_sec_count_msb = (count >> 8) & 0xff;
5238 scmd->satacmd_sec_count_lsb = count & 0xff;
5239 scmd->satacmd_features_reg = TRIM;
5240 scmd->satacmd_device_reg = SATA_ADH_LBA;
5241 scmd->satacmd_status_reg = 0;
5242 scmd->satacmd_error_reg = 0;
5243
5244 /* Start processing command */
5245 if (!(spx->txlt_sata_pkt->satapkt_op_mode & SATA_OPMODE_SYNCH)) {
5246 spx->txlt_sata_pkt->satapkt_comp =
5247 sata_txlt_unmap_completion;
5248 synch = FALSE;
5249 } else {
5250 synch = TRUE;
5251 }
5252
5253 if (sata_hba_start(spx, &rval) != 0) {
5254 mutex_exit(cport_mutex);
5255 return (rval);
5256 }
5257
5258 mutex_exit(cport_mutex);
5259
5260 if (synch) {
5261 sata_txlt_unmap_completion(spx->txlt_sata_pkt);
5262 }
5263
5264 return (TRAN_ACCEPT);
5265 }
5266
5267 /*
5268 * SATA translate command: Mode Sense.
5269 * Translated into appropriate SATA command or emulated.
5270 * Saved Values Page Control (03) are not supported.
5271 *
5272 * NOTE: only caching mode sense page is currently implemented.
5273 *
5274 * Returns TRAN_ACCEPT and appropriate values in scsi_pkt fields.
5275 */
5276
5277 #define LLBAA 0x10 /* Long LBA Accepted */
5278
5279 static int
sata_txlt_mode_sense(sata_pkt_txlate_t * spx)5280 sata_txlt_mode_sense(sata_pkt_txlate_t *spx)
5281 {
5282 struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
5283 struct buf *bp = spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp;
5284 sata_drive_info_t *sdinfo;
5285 sata_id_t *sata_id;
5286 struct scsi_extended_sense *sense;
5287 int len, bdlen, count, alc_len;
5288 int pc; /* Page Control code */
5289 uint8_t *buf; /* mode sense buffer */
5290 int rval, reason;
5291 kmutex_t *cport_mutex = &(SATA_TXLT_CPORT_MUTEX(spx));
5292
5293 SATADBG2(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
5294 "sata_txlt_mode_sense, pc %x page code 0x%02x\n",
5295 spx->txlt_scsi_pkt->pkt_cdbp[2] >> 6,
5296 spx->txlt_scsi_pkt->pkt_cdbp[2] & 0x3f);
5297
5298 if (servicing_interrupt()) {
5299 buf = kmem_zalloc(1024, KM_NOSLEEP);
5300 if (buf == NULL) {
5301 return (TRAN_BUSY);
5302 }
5303 } else {
5304 buf = kmem_zalloc(1024, KM_SLEEP);
5305 }
5306
5307 mutex_enter(cport_mutex);
5308
5309 if (((rval = sata_txlt_generic_pkt_info(spx, &reason, 0)) !=
5310 TRAN_ACCEPT) || (reason == CMD_DEV_GONE)) {
5311 mutex_exit(cport_mutex);
5312 kmem_free(buf, 1024);
5313 return (rval);
5314 }
5315
5316 scsipkt->pkt_reason = CMD_CMPLT;
5317 scsipkt->pkt_state = STATE_GOT_BUS | STATE_GOT_TARGET |
5318 STATE_SENT_CMD | STATE_GOT_STATUS;
5319
5320 pc = scsipkt->pkt_cdbp[2] >> 6;
5321
5322 if (bp != NULL && bp->b_un.b_addr && bp->b_bcount) {
5323 /*
5324 * Because it is fully emulated command storing data
5325 * programatically in the specified buffer, release
5326 * preallocated DMA resources before storing data in the buffer,
5327 * so no unwanted DMA sync would take place.
5328 */
5329 sata_scsi_dmafree(NULL, scsipkt);
5330
5331 len = 0;
5332 bdlen = 0;
5333 if (!(scsipkt->pkt_cdbp[1] & 8)) {
5334 if (scsipkt->pkt_cdbp[0] == SCMD_MODE_SENSE_G1 &&
5335 (scsipkt->pkt_cdbp[1] & LLBAA))
5336 bdlen = 16;
5337 else
5338 bdlen = 8;
5339 }
5340 /* Build mode parameter header */
5341 if (spx->txlt_scsi_pkt->pkt_cdbp[0] == SCMD_MODE_SENSE) {
5342 /* 4-byte mode parameter header */
5343 buf[len++] = 0; /* mode data length */
5344 buf[len++] = 0; /* medium type */
5345 buf[len++] = 0; /* dev-specific param */
5346 buf[len++] = bdlen; /* Block Descriptor length */
5347 } else {
5348 /* 8-byte mode parameter header */
5349 buf[len++] = 0; /* mode data length */
5350 buf[len++] = 0;
5351 buf[len++] = 0; /* medium type */
5352 buf[len++] = 0; /* dev-specific param */
5353 if (bdlen == 16)
5354 buf[len++] = 1; /* long lba descriptor */
5355 else
5356 buf[len++] = 0;
5357 buf[len++] = 0;
5358 buf[len++] = 0; /* Block Descriptor length */
5359 buf[len++] = bdlen;
5360 }
5361
5362 sdinfo = sata_get_device_info(
5363 spx->txlt_sata_hba_inst,
5364 &spx->txlt_sata_pkt->satapkt_device);
5365
5366 /* Build block descriptor only if not disabled (DBD) */
5367 if ((scsipkt->pkt_cdbp[1] & 0x08) == 0) {
5368 /* Block descriptor - direct-access device format */
5369 if (bdlen == 8) {
5370 /* build regular block descriptor */
5371 buf[len++] =
5372 (sdinfo->satadrv_capacity >> 24) & 0xff;
5373 buf[len++] =
5374 (sdinfo->satadrv_capacity >> 16) & 0xff;
5375 buf[len++] =
5376 (sdinfo->satadrv_capacity >> 8) & 0xff;
5377 buf[len++] = sdinfo->satadrv_capacity & 0xff;
5378 buf[len++] = 0; /* density code */
5379 buf[len++] = 0;
5380 if (sdinfo->satadrv_type ==
5381 SATA_DTYPE_ATADISK)
5382 buf[len++] = 2;
5383 else
5384 /* ATAPI */
5385 buf[len++] = 8;
5386 buf[len++] = 0;
5387 } else if (bdlen == 16) {
5388 /* Long LBA Accepted */
5389 /* build long lba block descriptor */
5390 #ifndef __lock_lint
5391 buf[len++] =
5392 (sdinfo->satadrv_capacity >> 56) & 0xff;
5393 buf[len++] =
5394 (sdinfo->satadrv_capacity >> 48) & 0xff;
5395 buf[len++] =
5396 (sdinfo->satadrv_capacity >> 40) & 0xff;
5397 buf[len++] =
5398 (sdinfo->satadrv_capacity >> 32) & 0xff;
5399 #endif
5400 buf[len++] =
5401 (sdinfo->satadrv_capacity >> 24) & 0xff;
5402 buf[len++] =
5403 (sdinfo->satadrv_capacity >> 16) & 0xff;
5404 buf[len++] =
5405 (sdinfo->satadrv_capacity >> 8) & 0xff;
5406 buf[len++] = sdinfo->satadrv_capacity & 0xff;
5407 buf[len++] = 0;
5408 buf[len++] = 0; /* density code */
5409 buf[len++] = 0;
5410 buf[len++] = 0;
5411 if (sdinfo->satadrv_type ==
5412 SATA_DTYPE_ATADISK)
5413 buf[len++] = 2;
5414 else
5415 /* ATAPI */
5416 buf[len++] = 8;
5417 buf[len++] = 0;
5418 }
5419 }
5420
5421 sata_id = &sdinfo->satadrv_id;
5422
5423 /*
5424 * Add requested pages.
5425 * Page 3 and 4 are obsolete and we are not supporting them.
5426 * We deal now with:
5427 * caching (read/write cache control).
5428 * We should eventually deal with following mode pages:
5429 * error recovery (0x01),
5430 * power condition (0x1a),
5431 * exception control page (enables SMART) (0x1c),
5432 * enclosure management (ses),
5433 * protocol-specific port mode (port control).
5434 */
5435 switch (scsipkt->pkt_cdbp[2] & 0x3f) {
5436 case MODEPAGE_RW_ERRRECOV:
5437 /* DAD_MODE_ERR_RECOV */
5438 /* R/W recovery */
5439 len += sata_build_msense_page_1(sdinfo, pc, buf+len);
5440 break;
5441 case MODEPAGE_CACHING:
5442 /* DAD_MODE_CACHE */
5443 /* Reject not supported request for saved parameters */
5444 if (pc == 3) {
5445 *scsipkt->pkt_scbp = STATUS_CHECK;
5446 sense = sata_arq_sense(spx);
5447 sense->es_key = KEY_ILLEGAL_REQUEST;
5448 sense->es_add_code =
5449 SD_SCSI_ASC_SAVING_PARAMS_NOT_SUPPORTED;
5450 goto done;
5451 }
5452
5453 /* caching */
5454 len += sata_build_msense_page_8(sdinfo, pc, buf+len);
5455 break;
5456 case MODEPAGE_INFO_EXCPT:
5457 /* exception cntrl */
5458 if (sata_id->ai_cmdset82 & SATA_SMART_SUPPORTED) {
5459 len += sata_build_msense_page_1c(sdinfo, pc,
5460 buf+len);
5461 }
5462 else
5463 goto err;
5464 break;
5465 case MODEPAGE_POWER_COND:
5466 /* DAD_MODE_POWER_COND */
5467 /* power condition */
5468 len += sata_build_msense_page_1a(sdinfo, pc, buf+len);
5469 break;
5470
5471 case MODEPAGE_ACOUSTIC_MANAG:
5472 /* acoustic management */
5473 len += sata_build_msense_page_30(sdinfo, pc, buf+len);
5474 break;
5475 case MODEPAGE_ALLPAGES:
5476 /* all pages */
5477 len += sata_build_msense_page_1(sdinfo, pc, buf+len);
5478 len += sata_build_msense_page_8(sdinfo, pc, buf+len);
5479 len += sata_build_msense_page_1a(sdinfo, pc, buf+len);
5480 if (sata_id->ai_cmdset82 & SATA_SMART_SUPPORTED) {
5481 len += sata_build_msense_page_1c(sdinfo, pc,
5482 buf+len);
5483 }
5484 len += sata_build_msense_page_30(sdinfo, pc, buf+len);
5485 break;
5486 default:
5487 err:
5488 /* Invalid request */
5489 *scsipkt->pkt_scbp = STATUS_CHECK;
5490 sense = sata_arq_sense(spx);
5491 sense->es_key = KEY_ILLEGAL_REQUEST;
5492 sense->es_add_code = SD_SCSI_ASC_INVALID_FIELD_IN_CDB;
5493 goto done;
5494 }
5495
5496 /* fix total mode data length */
5497 if (spx->txlt_scsi_pkt->pkt_cdbp[0] == SCMD_MODE_SENSE) {
5498 /* 4-byte mode parameter header */
5499 buf[0] = len - 1; /* mode data length */
5500 } else {
5501 buf[0] = (len -2) >> 8;
5502 buf[1] = (len -2) & 0xff;
5503 }
5504
5505
5506 /* Check allocation length */
5507 if (scsipkt->pkt_cdbp[0] == SCMD_MODE_SENSE) {
5508 alc_len = scsipkt->pkt_cdbp[4];
5509 } else {
5510 alc_len = scsipkt->pkt_cdbp[7];
5511 alc_len = (alc_len << 8) | scsipkt->pkt_cdbp[8];
5512 }
5513 /*
5514 * We do not check for possible parameters truncation
5515 * (alc_len < len) assuming that the target driver works
5516 * correctly. Just avoiding overrun.
5517 * Copy no more than requested and possible, buffer-wise.
5518 */
5519 count = MIN(alc_len, len);
5520 count = MIN(bp->b_bcount, count);
5521 bcopy(buf, bp->b_un.b_addr, count);
5522
5523 scsipkt->pkt_state |= STATE_XFERRED_DATA;
5524 scsipkt->pkt_resid = alc_len > count ? alc_len - count : 0;
5525 }
5526 *scsipkt->pkt_scbp = STATUS_GOOD;
5527 done:
5528 mutex_exit(cport_mutex);
5529 (void) kmem_free(buf, 1024);
5530
5531 SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
5532 "Scsi_pkt completion reason %x\n", scsipkt->pkt_reason);
5533
5534 if ((scsipkt->pkt_flags & FLAG_NOINTR) == 0 &&
5535 scsipkt->pkt_comp != NULL) {
5536 /* scsi callback required */
5537 if (servicing_interrupt()) {
5538 if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
5539 (task_func_t *)spx->txlt_scsi_pkt->pkt_comp,
5540 (void *)spx->txlt_scsi_pkt, TQ_NOSLEEP) ==
5541 TASKQID_INVALID) {
5542 return (TRAN_BUSY);
5543 }
5544 } else if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
5545 (task_func_t *)spx->txlt_scsi_pkt->pkt_comp,
5546 (void *)spx->txlt_scsi_pkt, TQ_SLEEP) == TASKQID_INVALID) {
5547 /* Scheduling the callback failed */
5548 return (TRAN_BUSY);
5549 }
5550 }
5551
5552 return (TRAN_ACCEPT);
5553 }
5554
5555
5556 /*
5557 * SATA translate command: Mode Select.
5558 * Translated into appropriate SATA command or emulated.
5559 * Saving parameters is not supported.
5560 * Changing device capacity is not supported (although theoretically
5561 * possible by executing SET FEATURES/SET MAX ADDRESS)
5562 *
5563 * Assumption is that the target driver is working correctly.
5564 *
5565 * More than one SATA command may be executed to perform operations specified
5566 * by mode select pages. The first error terminates further execution.
5567 * Operations performed successully are not backed-up in such case.
5568 *
5569 * NOTE: Implemented pages:
5570 * - caching page
5571 * - informational exception page
5572 * - acoustic management page
5573 * - power condition page
5574 * Caching setup is remembered so it could be re-stored in case of
5575 * an unexpected device reset.
5576 *
5577 * Returns TRAN_XXXX.
5578 * If TRAN_ACCEPT is returned, appropriate values are set in scsi_pkt fields.
5579 */
5580
5581 static int
sata_txlt_mode_select(sata_pkt_txlate_t * spx)5582 sata_txlt_mode_select(sata_pkt_txlate_t *spx)
5583 {
5584 struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
5585 struct buf *bp = spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp;
5586 struct scsi_extended_sense *sense;
5587 int len, pagelen, count, pllen;
5588 uint8_t *buf; /* mode select buffer */
5589 int rval, stat, reason;
5590 uint_t nointr_flag;
5591 int dmod = 0;
5592 kmutex_t *cport_mutex = &(SATA_TXLT_CPORT_MUTEX(spx));
5593
5594 SATADBG2(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
5595 "sata_txlt_mode_select, pc %x page code 0x%02x\n",
5596 spx->txlt_scsi_pkt->pkt_cdbp[2] >> 6,
5597 spx->txlt_scsi_pkt->pkt_cdbp[2] & 0x3f);
5598
5599 mutex_enter(cport_mutex);
5600
5601 if (((rval = sata_txlt_generic_pkt_info(spx, &reason, 1)) !=
5602 TRAN_ACCEPT) || (reason == CMD_DEV_GONE)) {
5603 mutex_exit(cport_mutex);
5604 return (rval);
5605 }
5606
5607 rval = TRAN_ACCEPT;
5608
5609 scsipkt->pkt_reason = CMD_CMPLT;
5610 scsipkt->pkt_state = STATE_GOT_BUS | STATE_GOT_TARGET |
5611 STATE_SENT_CMD | STATE_GOT_STATUS;
5612 nointr_flag = scsipkt->pkt_flags & FLAG_NOINTR;
5613
5614 /* Reject not supported request */
5615 if (! (scsipkt->pkt_cdbp[1] & 0x10)) { /* No support for PF bit = 0 */
5616 *scsipkt->pkt_scbp = STATUS_CHECK;
5617 sense = sata_arq_sense(spx);
5618 sense->es_key = KEY_ILLEGAL_REQUEST;
5619 sense->es_add_code = SD_SCSI_ASC_INVALID_FIELD_IN_CDB;
5620 goto done;
5621 }
5622
5623 if (scsipkt->pkt_cdbp[0] == SCMD_MODE_SELECT) {
5624 pllen = scsipkt->pkt_cdbp[4];
5625 } else {
5626 pllen = scsipkt->pkt_cdbp[7];
5627 pllen = (pllen << 8) | scsipkt->pkt_cdbp[7];
5628 }
5629
5630 *scsipkt->pkt_scbp = STATUS_GOOD; /* Presumed outcome */
5631
5632 if (bp != NULL && bp->b_un.b_addr && bp->b_bcount && pllen != 0) {
5633 buf = (uint8_t *)bp->b_un.b_addr;
5634 count = MIN(bp->b_bcount, pllen);
5635 scsipkt->pkt_state |= STATE_XFERRED_DATA;
5636 scsipkt->pkt_resid = 0;
5637 pllen = count;
5638
5639 /*
5640 * Check the header to skip the block descriptor(s) - we
5641 * do not support setting device capacity.
5642 * Existing macros do not recognize long LBA dscriptor,
5643 * hence manual calculation.
5644 */
5645 if (scsipkt->pkt_cdbp[0] == SCMD_MODE_SELECT) {
5646 /* 6-bytes CMD, 4 bytes header */
5647 if (count <= 4)
5648 goto done; /* header only */
5649 len = buf[3] + 4;
5650 } else {
5651 /* 10-bytes CMD, 8 bytes header */
5652 if (count <= 8)
5653 goto done; /* header only */
5654 len = buf[6];
5655 len = (len << 8) + buf[7] + 8;
5656 }
5657 if (len >= count)
5658 goto done; /* header + descriptor(s) only */
5659
5660 pllen -= len; /* remaining data length */
5661
5662 /*
5663 * We may be executing SATA command and want to execute it
5664 * in SYNCH mode, regardless of scsi_pkt setting.
5665 * Save scsi_pkt setting and indicate SYNCH mode
5666 */
5667 if ((scsipkt->pkt_flags & FLAG_NOINTR) == 0 &&
5668 scsipkt->pkt_comp != NULL) {
5669 scsipkt->pkt_flags |= FLAG_NOINTR;
5670 }
5671 spx->txlt_sata_pkt->satapkt_op_mode = SATA_OPMODE_SYNCH;
5672
5673 /*
5674 * len is now the offset to a first mode select page
5675 * Process all pages
5676 */
5677 while (pllen > 0) {
5678 switch ((int)buf[len]) {
5679 case MODEPAGE_CACHING:
5680 /* No support for SP (saving) */
5681 if (scsipkt->pkt_cdbp[1] & 0x01) {
5682 *scsipkt->pkt_scbp = STATUS_CHECK;
5683 sense = sata_arq_sense(spx);
5684 sense->es_key = KEY_ILLEGAL_REQUEST;
5685 sense->es_add_code =
5686 SD_SCSI_ASC_INVALID_FIELD_IN_CDB;
5687 goto done;
5688 }
5689 stat = sata_mode_select_page_8(spx,
5690 (struct mode_cache_scsi3 *)&buf[len],
5691 pllen, &pagelen, &rval, &dmod);
5692 /*
5693 * The pagelen value indicates the number of
5694 * parameter bytes already processed.
5695 * The rval is the return value from
5696 * sata_tran_start().
5697 * The stat indicates the overall status of
5698 * the operation(s).
5699 */
5700 if (stat != SATA_SUCCESS)
5701 /*
5702 * Page processing did not succeed -
5703 * all error info is already set-up,
5704 * just return
5705 */
5706 pllen = 0; /* this breaks the loop */
5707 else {
5708 len += pagelen;
5709 pllen -= pagelen;
5710 }
5711 break;
5712
5713 case MODEPAGE_INFO_EXCPT:
5714 stat = sata_mode_select_page_1c(spx,
5715 (struct mode_info_excpt_page *)&buf[len],
5716 pllen, &pagelen, &rval, &dmod);
5717 /*
5718 * The pagelen value indicates the number of
5719 * parameter bytes already processed.
5720 * The rval is the return value from
5721 * sata_tran_start().
5722 * The stat indicates the overall status of
5723 * the operation(s).
5724 */
5725 if (stat != SATA_SUCCESS)
5726 /*
5727 * Page processing did not succeed -
5728 * all error info is already set-up,
5729 * just return
5730 */
5731 pllen = 0; /* this breaks the loop */
5732 else {
5733 len += pagelen;
5734 pllen -= pagelen;
5735 }
5736 break;
5737
5738 case MODEPAGE_ACOUSTIC_MANAG:
5739 stat = sata_mode_select_page_30(spx,
5740 (struct mode_acoustic_management *)
5741 &buf[len], pllen, &pagelen, &rval, &dmod);
5742 /*
5743 * The pagelen value indicates the number of
5744 * parameter bytes already processed.
5745 * The rval is the return value from
5746 * sata_tran_start().
5747 * The stat indicates the overall status of
5748 * the operation(s).
5749 */
5750 if (stat != SATA_SUCCESS)
5751 /*
5752 * Page processing did not succeed -
5753 * all error info is already set-up,
5754 * just return
5755 */
5756 pllen = 0; /* this breaks the loop */
5757 else {
5758 len += pagelen;
5759 pllen -= pagelen;
5760 }
5761
5762 break;
5763 case MODEPAGE_POWER_COND:
5764 stat = sata_mode_select_page_1a(spx,
5765 (struct mode_info_power_cond *)&buf[len],
5766 pllen, &pagelen, &rval, &dmod);
5767 /*
5768 * The pagelen value indicates the number of
5769 * parameter bytes already processed.
5770 * The rval is the return value from
5771 * sata_tran_start().
5772 * The stat indicates the overall status of
5773 * the operation(s).
5774 */
5775 if (stat != SATA_SUCCESS)
5776 /*
5777 * Page processing did not succeed -
5778 * all error info is already set-up,
5779 * just return
5780 */
5781 pllen = 0; /* this breaks the loop */
5782 else {
5783 len += pagelen;
5784 pllen -= pagelen;
5785 }
5786 break;
5787 default:
5788 *scsipkt->pkt_scbp = STATUS_CHECK;
5789 sense = sata_arq_sense(spx);
5790 sense->es_key = KEY_ILLEGAL_REQUEST;
5791 sense->es_add_code =
5792 SD_SCSI_ASC_INVALID_FIELD_IN_PARAMS_LIST;
5793 goto done;
5794 }
5795 }
5796 }
5797 done:
5798 mutex_exit(cport_mutex);
5799 /*
5800 * If device parameters were modified, fetch and store the new
5801 * Identify Device data. Since port mutex could have been released
5802 * for accessing HBA driver, we need to re-check device existence.
5803 */
5804 if (dmod != 0) {
5805 sata_drive_info_t new_sdinfo, *sdinfo;
5806 int rv = 0;
5807
5808 /*
5809 * Following statement has to be changed if this function is
5810 * used for devices other than SATA hard disks.
5811 */
5812 new_sdinfo.satadrv_type = SATA_DTYPE_ATADISK;
5813
5814 new_sdinfo.satadrv_addr =
5815 spx->txlt_sata_pkt->satapkt_device.satadev_addr;
5816 rv = sata_fetch_device_identify_data(spx->txlt_sata_hba_inst,
5817 &new_sdinfo);
5818
5819 mutex_enter(cport_mutex);
5820 /*
5821 * Since port mutex could have been released when
5822 * accessing HBA driver, we need to re-check that the
5823 * framework still holds the device info structure.
5824 */
5825 sdinfo = sata_get_device_info(spx->txlt_sata_hba_inst,
5826 &spx->txlt_sata_pkt->satapkt_device);
5827 if (sdinfo != NULL) {
5828 /*
5829 * Device still has info structure in the
5830 * sata framework. Copy newly fetched info
5831 */
5832 if (rv == 0) {
5833 sdinfo->satadrv_id = new_sdinfo.satadrv_id;
5834 sata_save_drive_settings(sdinfo);
5835 } else {
5836 /*
5837 * Could not fetch new data - invalidate
5838 * sata_drive_info. That makes device
5839 * unusable.
5840 */
5841 sdinfo->satadrv_type = SATA_DTYPE_UNKNOWN;
5842 sdinfo->satadrv_state = SATA_STATE_UNKNOWN;
5843 }
5844 }
5845 if (rv != 0 || sdinfo == NULL) {
5846 /*
5847 * This changes the overall mode select completion
5848 * reason to a failed one !!!!!
5849 */
5850 *scsipkt->pkt_scbp = STATUS_CHECK;
5851 sense = sata_arq_sense(spx);
5852 scsipkt->pkt_reason = CMD_INCOMPLETE;
5853 rval = TRAN_ACCEPT;
5854 }
5855 mutex_exit(cport_mutex);
5856 }
5857 /* Restore the scsi pkt flags */
5858 scsipkt->pkt_flags &= ~FLAG_NOINTR;
5859 scsipkt->pkt_flags |= nointr_flag;
5860
5861 SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
5862 "Scsi_pkt completion reason %x\n", scsipkt->pkt_reason);
5863
5864 if ((scsipkt->pkt_flags & FLAG_NOINTR) == 0 &&
5865 scsipkt->pkt_comp != NULL) {
5866 /* scsi callback required */
5867 if (servicing_interrupt()) {
5868 if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
5869 (task_func_t *)spx->txlt_scsi_pkt->pkt_comp,
5870 (void *)spx->txlt_scsi_pkt, TQ_NOSLEEP) ==
5871 TASKQID_INVALID) {
5872 return (TRAN_BUSY);
5873 }
5874 } else if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
5875 (task_func_t *)spx->txlt_scsi_pkt->pkt_comp,
5876 (void *)spx->txlt_scsi_pkt, TQ_SLEEP) == TASKQID_INVALID) {
5877 /* Scheduling the callback failed */
5878 return (TRAN_BUSY);
5879 }
5880 }
5881
5882 return (rval);
5883 }
5884
5885 /*
5886 * Translate command: ATA Pass Through
5887 * Incomplete implementation. Only supports No-Data, PIO Data-In, and
5888 * PIO Data-Out protocols. Also supports CK_COND bit.
5889 *
5890 * Mapping of the incoming CDB bytes to the outgoing satacmd bytes is
5891 * described in Table 111 of SAT-2 (Draft 9).
5892 */
5893 static int
sata_txlt_ata_pass_thru(sata_pkt_txlate_t * spx)5894 sata_txlt_ata_pass_thru(sata_pkt_txlate_t *spx)
5895 {
5896 struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
5897 sata_cmd_t *scmd = &spx->txlt_sata_pkt->satapkt_cmd;
5898 struct buf *bp = spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp;
5899 kmutex_t *cport_mutex = &(SATA_TXLT_CPORT_MUTEX(spx));
5900 uint32_t xfer_len;
5901 int extend = 0;
5902 int synch, rval, reason;
5903
5904 mutex_enter(cport_mutex);
5905
5906 rval = sata_txlt_generic_pkt_info(spx, &reason, 1);
5907 if ((rval != TRAN_ACCEPT) || (reason == CMD_DEV_GONE)) {
5908 mutex_exit(cport_mutex);
5909 return (rval);
5910 }
5911
5912 /* T_DIR bit */
5913 if (scsipkt->pkt_cdbp[2] & SATL_APT_BM_T_DIR)
5914 scmd->satacmd_flags.sata_data_direction = SATA_DIR_READ;
5915 else
5916 scmd->satacmd_flags.sata_data_direction = SATA_DIR_WRITE;
5917
5918 /* MULTIPLE_COUNT field. If non-zero, invalid command (for now). */
5919 if (((scsipkt->pkt_cdbp[1] >> 5) & 0x7) != 0) {
5920 mutex_exit(cport_mutex);
5921 return (sata_txlt_ata_pass_thru_illegal_cmd(spx));
5922 }
5923
5924 /* OFFLINE field. If non-zero, invalid command (for now). */
5925 if (((scsipkt->pkt_cdbp[2] >> 6) & 0x3) != 0) {
5926 mutex_exit(cport_mutex);
5927 return (sata_txlt_ata_pass_thru_illegal_cmd(spx));
5928 }
5929
5930 /* PROTOCOL field */
5931 switch ((scsipkt->pkt_cdbp[1] >> 1) & 0xf) {
5932 case SATL_APT_P_HW_RESET:
5933 case SATL_APT_P_SRST:
5934 case SATL_APT_P_DMA:
5935 case SATL_APT_P_DMA_QUEUED:
5936 case SATL_APT_P_DEV_DIAG:
5937 case SATL_APT_P_DEV_RESET:
5938 case SATL_APT_P_UDMA_IN:
5939 case SATL_APT_P_UDMA_OUT:
5940 case SATL_APT_P_FPDMA:
5941 case SATL_APT_P_RET_RESP:
5942 /* Not yet implemented */
5943 default:
5944 mutex_exit(cport_mutex);
5945 return (sata_txlt_ata_pass_thru_illegal_cmd(spx));
5946
5947 case SATL_APT_P_NON_DATA:
5948 scmd->satacmd_flags.sata_data_direction = SATA_DIR_NODATA_XFER;
5949 break;
5950
5951 case SATL_APT_P_PIO_DATA_IN:
5952 /* If PROTOCOL disagrees with T_DIR, invalid command */
5953 if (scmd->satacmd_flags.sata_data_direction == SATA_DIR_WRITE) {
5954 mutex_exit(cport_mutex);
5955 return (sata_txlt_ata_pass_thru_illegal_cmd(spx));
5956 }
5957
5958 /* if there is a buffer, release its DMA resources */
5959 if ((bp != NULL) && bp->b_un.b_addr && bp->b_bcount) {
5960 sata_scsi_dmafree(NULL, scsipkt);
5961 } else {
5962 /* if there is no buffer, how do you PIO in? */
5963 mutex_exit(cport_mutex);
5964 return (sata_txlt_ata_pass_thru_illegal_cmd(spx));
5965 }
5966
5967 break;
5968
5969 case SATL_APT_P_PIO_DATA_OUT:
5970 /* If PROTOCOL disagrees with T_DIR, invalid command */
5971 if (scmd->satacmd_flags.sata_data_direction == SATA_DIR_READ) {
5972 mutex_exit(cport_mutex);
5973 return (sata_txlt_ata_pass_thru_illegal_cmd(spx));
5974 }
5975
5976 /* if there is a buffer, release its DMA resources */
5977 if ((bp != NULL) && bp->b_un.b_addr && bp->b_bcount) {
5978 sata_scsi_dmafree(NULL, scsipkt);
5979 } else {
5980 /* if there is no buffer, how do you PIO out? */
5981 mutex_exit(cport_mutex);
5982 return (sata_txlt_ata_pass_thru_illegal_cmd(spx));
5983 }
5984
5985 break;
5986 }
5987
5988 /* Assume LBA28 by default */
5989 scmd->satacmd_addr_type = ATA_ADDR_LBA28;
5990 scmd->satacmd_lba_low_msb = 0;
5991 scmd->satacmd_lba_mid_msb = 0;
5992 scmd->satacmd_lba_high_msb = 0;
5993
5994 scmd->satacmd_features_reg_ext = 0;
5995 scmd->satacmd_sec_count_msb = 0;
5996
5997 /* Parse the ATA cmd fields, transfer some straight to the satacmd */
5998 switch ((uint_t)scsipkt->pkt_cdbp[0]) {
5999 case SPC3_CMD_ATA_COMMAND_PASS_THROUGH12:
6000 scmd->satacmd_lba_low_lsb = scsipkt->pkt_cdbp[5];
6001 scmd->satacmd_lba_mid_lsb = scsipkt->pkt_cdbp[6];
6002 scmd->satacmd_lba_high_lsb = scsipkt->pkt_cdbp[7];
6003
6004 scmd->satacmd_features_reg = scsipkt->pkt_cdbp[3];
6005 scmd->satacmd_sec_count_lsb = scsipkt->pkt_cdbp[4];
6006
6007 scmd->satacmd_device_reg = scsipkt->pkt_cdbp[8];
6008 scmd->satacmd_cmd_reg = scsipkt->pkt_cdbp[9];
6009 break;
6010
6011 case SPC3_CMD_ATA_COMMAND_PASS_THROUGH16:
6012 scmd->satacmd_device_reg = scsipkt->pkt_cdbp[13];
6013 scmd->satacmd_cmd_reg = scsipkt->pkt_cdbp[14];
6014
6015 scmd->satacmd_lba_low_lsb = scsipkt->pkt_cdbp[8];
6016 scmd->satacmd_lba_mid_lsb = scsipkt->pkt_cdbp[10];
6017 scmd->satacmd_lba_high_lsb = scsipkt->pkt_cdbp[12];
6018
6019 scmd->satacmd_features_reg = scsipkt->pkt_cdbp[4];
6020 scmd->satacmd_sec_count_lsb = scsipkt->pkt_cdbp[6];
6021
6022 if (scsipkt->pkt_cdbp[1] & SATL_APT_BM_EXTEND) {
6023 extend = 1;
6024
6025 scmd->satacmd_addr_type = ATA_ADDR_LBA48;
6026 scmd->satacmd_lba_low_msb = scsipkt->pkt_cdbp[7];
6027 scmd->satacmd_lba_mid_msb = scsipkt->pkt_cdbp[9];
6028 scmd->satacmd_lba_high_msb = scsipkt->pkt_cdbp[11];
6029
6030 scmd->satacmd_features_reg_ext = scsipkt->pkt_cdbp[3];
6031 scmd->satacmd_sec_count_msb = scsipkt->pkt_cdbp[5];
6032 }
6033 break;
6034
6035 default:
6036 /* No other SCSI ops should ever reach this function */
6037 cmn_err(CE_PANIC, "unexpected ATA pass-thru cmd %x",
6038 scsipkt->pkt_cdbp[0]);
6039 }
6040
6041 /* CK_COND bit */
6042 if (scsipkt->pkt_cdbp[2] & SATL_APT_BM_CK_COND) {
6043 if (extend) {
6044 scmd->satacmd_flags.sata_copy_out_sec_count_msb = 1;
6045 scmd->satacmd_flags.sata_copy_out_lba_low_msb = 1;
6046 scmd->satacmd_flags.sata_copy_out_lba_mid_msb = 1;
6047 scmd->satacmd_flags.sata_copy_out_lba_high_msb = 1;
6048 }
6049
6050 scmd->satacmd_flags.sata_copy_out_sec_count_lsb = 1;
6051 scmd->satacmd_flags.sata_copy_out_lba_low_lsb = 1;
6052 scmd->satacmd_flags.sata_copy_out_lba_mid_lsb = 1;
6053 scmd->satacmd_flags.sata_copy_out_lba_high_lsb = 1;
6054 scmd->satacmd_flags.sata_copy_out_device_reg = 1;
6055 scmd->satacmd_flags.sata_copy_out_error_reg = 1;
6056 }
6057
6058 /* Determine transfer length */
6059 switch (scsipkt->pkt_cdbp[2] & 0x03) { /* T_LENGTH field */
6060 case 1:
6061 /* Length is in the FEATURE field */
6062 xfer_len = (uint32_t)scmd->satacmd_features_reg_ext << 8 |
6063 scmd->satacmd_features_reg;
6064
6065 /* If BYTE_BLOCK is set, above value is in units of blocks */
6066 if (((scsipkt->pkt_cdbp[2] >> 2) & 1) == 0)
6067 xfer_len *= SATA_DISK_SECTOR_SIZE;
6068 break;
6069 case 2:
6070 /* Length is in the COUNT field */
6071 xfer_len = (uint32_t)scmd->satacmd_sec_count_msb << 8 |
6072 scmd->satacmd_sec_count_lsb;
6073
6074 /* If BYTE_BLOCK is set, above value is in units of blocks */
6075 if (((scsipkt->pkt_cdbp[2] >> 2) & 1) == 0)
6076 xfer_len *= SATA_DISK_SECTOR_SIZE;
6077 break;
6078 case 3:
6079 /*
6080 * Length is transport specific. The spec is a bit vague on
6081 * this, but it seems like using buf->b_bcount is the most
6082 * reasonable analogue in our situation. b_bcount is in
6083 * units of bytes.
6084 */
6085 xfer_len = bp->b_bcount;
6086 break;
6087 default:
6088 xfer_len = 0;
6089 }
6090
6091 /* Don't allow a transfer larger than what the struct buf supports */
6092 if (xfer_len > bp->b_bcount) {
6093 mutex_exit(cport_mutex);
6094 return (sata_txlt_ata_pass_thru_illegal_cmd(spx));
6095 }
6096
6097 /* Start processing command */
6098 if (!(spx->txlt_sata_pkt->satapkt_op_mode & SATA_OPMODE_SYNCH)) {
6099 spx->txlt_sata_pkt->satapkt_comp = sata_txlt_apt_completion;
6100 synch = FALSE;
6101 } else {
6102 synch = TRUE;
6103 }
6104
6105 if (sata_hba_start(spx, &rval) != 0) {
6106 mutex_exit(cport_mutex);
6107 return (rval);
6108 }
6109
6110 mutex_exit(cport_mutex);
6111
6112 if (synch) {
6113 sata_txlt_apt_completion(spx->txlt_sata_pkt);
6114 }
6115
6116 return (TRAN_ACCEPT);
6117 }
6118
6119 /*
6120 * Translate command: Log Sense
6121 */
6122 static int
sata_txlt_log_sense(sata_pkt_txlate_t * spx)6123 sata_txlt_log_sense(sata_pkt_txlate_t *spx)
6124 {
6125 struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
6126 struct buf *bp = spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp;
6127 sata_drive_info_t *sdinfo;
6128 struct scsi_extended_sense *sense;
6129 int len, count, alc_len;
6130 int pc; /* Page Control code */
6131 int page_code; /* Page code */
6132 uint8_t *buf; /* log sense buffer */
6133 int rval, reason;
6134 #define MAX_LOG_SENSE_PAGE_SIZE 512
6135 kmutex_t *cport_mutex = &(SATA_TXLT_CPORT_MUTEX(spx));
6136
6137 SATADBG2(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
6138 "sata_txlt_log_sense, pc 0x%x, page code 0x%x\n",
6139 spx->txlt_scsi_pkt->pkt_cdbp[2] >> 6,
6140 spx->txlt_scsi_pkt->pkt_cdbp[2] & 0x3f);
6141
6142 if (servicing_interrupt()) {
6143 buf = kmem_zalloc(MAX_LOG_SENSE_PAGE_SIZE, KM_NOSLEEP);
6144 if (buf == NULL) {
6145 return (TRAN_BUSY);
6146 }
6147 } else {
6148 buf = kmem_zalloc(MAX_LOG_SENSE_PAGE_SIZE, KM_SLEEP);
6149 }
6150
6151 mutex_enter(cport_mutex);
6152
6153 if (((rval = sata_txlt_generic_pkt_info(spx, &reason, 1)) !=
6154 TRAN_ACCEPT) || (reason == CMD_DEV_GONE)) {
6155 mutex_exit(cport_mutex);
6156 kmem_free(buf, MAX_LOG_SENSE_PAGE_SIZE);
6157 return (rval);
6158 }
6159
6160 scsipkt->pkt_reason = CMD_CMPLT;
6161 scsipkt->pkt_state = STATE_GOT_BUS | STATE_GOT_TARGET |
6162 STATE_SENT_CMD | STATE_GOT_STATUS;
6163
6164 pc = scsipkt->pkt_cdbp[2] >> 6;
6165 page_code = scsipkt->pkt_cdbp[2] & 0x3f;
6166
6167 /* Reject not supported request for all but cumulative values */
6168 switch (pc) {
6169 case PC_CUMULATIVE_VALUES:
6170 break;
6171 default:
6172 *scsipkt->pkt_scbp = STATUS_CHECK;
6173 sense = sata_arq_sense(spx);
6174 sense->es_key = KEY_ILLEGAL_REQUEST;
6175 sense->es_add_code = SD_SCSI_ASC_INVALID_FIELD_IN_CDB;
6176 goto done;
6177 }
6178
6179 switch (page_code) {
6180 case PAGE_CODE_GET_SUPPORTED_LOG_PAGES:
6181 case PAGE_CODE_SELF_TEST_RESULTS:
6182 case PAGE_CODE_INFORMATION_EXCEPTIONS:
6183 case PAGE_CODE_SMART_READ_DATA:
6184 case PAGE_CODE_START_STOP_CYCLE_COUNTER:
6185 case PAGE_CODE_TEMPERATURE:
6186 case PAGE_CODE_SOLID_STATE_MEDIA:
6187 case PAGE_CODE_READ_ERRORS:
6188 case PAGE_CODE_GENERAL_STATS:
6189 break;
6190 default:
6191 *scsipkt->pkt_scbp = STATUS_CHECK;
6192 sense = sata_arq_sense(spx);
6193 sense->es_key = KEY_ILLEGAL_REQUEST;
6194 sense->es_add_code = SD_SCSI_ASC_INVALID_FIELD_IN_CDB;
6195 goto done;
6196 }
6197
6198 if (bp != NULL && bp->b_un.b_addr && bp->b_bcount) {
6199 /*
6200 * Because log sense uses local buffers for data retrieval from
6201 * the devices and sets the data programatically in the
6202 * original specified buffer, release preallocated DMA
6203 * resources before storing data in the original buffer,
6204 * so no unwanted DMA sync would take place.
6205 */
6206 sata_id_t *sata_id;
6207
6208 sata_scsi_dmafree(NULL, scsipkt);
6209
6210 len = 0;
6211
6212 /* Build log parameter header */
6213 buf[len++] = page_code; /* page code as in the CDB */
6214 buf[len++] = 0; /* reserved */
6215 buf[len++] = 0; /* Zero out page length for now (MSB) */
6216 buf[len++] = 0; /* (LSB) */
6217
6218 sdinfo = sata_get_device_info(
6219 spx->txlt_sata_hba_inst,
6220 &spx->txlt_sata_pkt->satapkt_device);
6221
6222 sata_id = &sdinfo->satadrv_id;
6223
6224 /*
6225 * Add requested pages.
6226 */
6227 switch (page_code) {
6228 case PAGE_CODE_GET_SUPPORTED_LOG_PAGES:
6229 len = sata_build_lsense_page_0(sdinfo, buf + len);
6230 break;
6231 case PAGE_CODE_SELF_TEST_RESULTS:
6232 if ((! (sata_id->ai_cmdset84 &
6233 SATA_SMART_SELF_TEST_SUPPORTED)) ||
6234 (! (sata_id->ai_features87 &
6235 SATA_SMART_SELF_TEST_SUPPORTED))) {
6236 *scsipkt->pkt_scbp = STATUS_CHECK;
6237 sense = sata_arq_sense(spx);
6238 sense->es_key = KEY_ILLEGAL_REQUEST;
6239 sense->es_add_code =
6240 SD_SCSI_ASC_INVALID_FIELD_IN_CDB;
6241
6242 goto done;
6243 }
6244 len = sata_build_lsense_page_10(sdinfo, buf + len,
6245 spx->txlt_sata_hba_inst);
6246 break;
6247 case PAGE_CODE_INFORMATION_EXCEPTIONS:
6248 if (! (sata_id->ai_cmdset82 & SATA_SMART_SUPPORTED)) {
6249 *scsipkt->pkt_scbp = STATUS_CHECK;
6250 sense = sata_arq_sense(spx);
6251 sense->es_key = KEY_ILLEGAL_REQUEST;
6252 sense->es_add_code =
6253 SD_SCSI_ASC_INVALID_FIELD_IN_CDB;
6254
6255 goto done;
6256 }
6257 if (! (sata_id->ai_features85 & SATA_SMART_ENABLED)) {
6258 *scsipkt->pkt_scbp = STATUS_CHECK;
6259 sense = sata_arq_sense(spx);
6260 sense->es_key = KEY_ABORTED_COMMAND;
6261 sense->es_add_code =
6262 SCSI_ASC_ATA_DEV_FEAT_NOT_ENABLED;
6263 sense->es_qual_code =
6264 SCSI_ASCQ_ATA_DEV_FEAT_NOT_ENABLED;
6265
6266 goto done;
6267 }
6268
6269 len = sata_build_lsense_page_2f(sdinfo, buf + len,
6270 spx->txlt_sata_hba_inst);
6271 break;
6272 case PAGE_CODE_SMART_READ_DATA:
6273 if (! (sata_id->ai_cmdset82 & SATA_SMART_SUPPORTED)) {
6274 *scsipkt->pkt_scbp = STATUS_CHECK;
6275 sense = sata_arq_sense(spx);
6276 sense->es_key = KEY_ILLEGAL_REQUEST;
6277 sense->es_add_code =
6278 SD_SCSI_ASC_INVALID_FIELD_IN_CDB;
6279
6280 goto done;
6281 }
6282 if (! (sata_id->ai_features85 & SATA_SMART_ENABLED)) {
6283 *scsipkt->pkt_scbp = STATUS_CHECK;
6284 sense = sata_arq_sense(spx);
6285 sense->es_key = KEY_ABORTED_COMMAND;
6286 sense->es_add_code =
6287 SCSI_ASC_ATA_DEV_FEAT_NOT_ENABLED;
6288 sense->es_qual_code =
6289 SCSI_ASCQ_ATA_DEV_FEAT_NOT_ENABLED;
6290
6291 goto done;
6292 }
6293
6294 /* This page doesn't include a page header */
6295 len = sata_build_lsense_page_30(sdinfo, buf,
6296 spx->txlt_sata_hba_inst);
6297 goto no_header;
6298 case PAGE_CODE_START_STOP_CYCLE_COUNTER:
6299 if (! (sata_id->ai_cmdset82 & SATA_SMART_SUPPORTED)) {
6300 *scsipkt->pkt_scbp = STATUS_CHECK;
6301 sense = sata_arq_sense(spx);
6302 sense->es_key = KEY_ILLEGAL_REQUEST;
6303 sense->es_add_code =
6304 SD_SCSI_ASC_INVALID_FIELD_IN_CDB;
6305
6306 goto done;
6307 }
6308 if (! (sata_id->ai_features85 & SATA_SMART_ENABLED)) {
6309 *scsipkt->pkt_scbp = STATUS_CHECK;
6310 sense = sata_arq_sense(spx);
6311 sense->es_key = KEY_ABORTED_COMMAND;
6312 sense->es_add_code =
6313 SCSI_ASC_ATA_DEV_FEAT_NOT_ENABLED;
6314 sense->es_qual_code =
6315 SCSI_ASCQ_ATA_DEV_FEAT_NOT_ENABLED;
6316
6317 goto done;
6318 }
6319 len = sata_build_lsense_page_0e(sdinfo, buf, spx);
6320 goto no_header;
6321 case PAGE_CODE_TEMPERATURE:
6322 len = sata_build_lsense_page_0d(sdinfo, buf + len,
6323 spx->txlt_sata_hba_inst);
6324 break;
6325 case PAGE_CODE_SOLID_STATE_MEDIA:
6326 len = sata_build_lsense_page_11(sdinfo, buf + len,
6327 spx->txlt_sata_hba_inst);
6328 break;
6329 case PAGE_CODE_READ_ERRORS:
6330 len = sata_build_lsense_page_03(sdinfo, buf + len,
6331 spx->txlt_sata_hba_inst);
6332 break;
6333 case PAGE_CODE_GENERAL_STATS:
6334 len = sata_build_lsense_page_19(sdinfo, buf + len,
6335 spx->txlt_sata_hba_inst);
6336 break;
6337 default:
6338 /* Invalid request */
6339 *scsipkt->pkt_scbp = STATUS_CHECK;
6340 sense = sata_arq_sense(spx);
6341 sense->es_key = KEY_ILLEGAL_REQUEST;
6342 sense->es_add_code = SD_SCSI_ASC_INVALID_FIELD_IN_CDB;
6343 goto done;
6344 }
6345
6346 if (len < 0) {
6347 /* Page not supported by device */
6348 *scsipkt->pkt_scbp = STATUS_CHECK;
6349 sense = sata_arq_sense(spx);
6350 sense->es_key = KEY_ILLEGAL_REQUEST;
6351 sense->es_add_code = SD_SCSI_ASC_INVALID_FIELD_IN_CDB;
6352 goto done;
6353 }
6354
6355 /* set parameter log sense data length */
6356 buf[2] = len >> 8; /* log sense length (MSB) */
6357 buf[3] = len & 0xff; /* log sense length (LSB) */
6358
6359 len += SCSI_LOG_PAGE_HDR_LEN;
6360 ASSERT(len <= MAX_LOG_SENSE_PAGE_SIZE);
6361
6362 no_header:
6363 /* Check allocation length */
6364 alc_len = scsipkt->pkt_cdbp[7];
6365 alc_len = (alc_len << 8) | scsipkt->pkt_cdbp[8];
6366
6367 /*
6368 * We do not check for possible parameters truncation
6369 * (alc_len < len) assuming that the target driver works
6370 * correctly. Just avoiding overrun.
6371 * Copy no more than requested and possible, buffer-wise.
6372 */
6373 count = MIN(alc_len, len);
6374 count = MIN(bp->b_bcount, count);
6375 bcopy(buf, bp->b_un.b_addr, count);
6376
6377 scsipkt->pkt_state |= STATE_XFERRED_DATA;
6378 scsipkt->pkt_resid = alc_len > count ? alc_len - count : 0;
6379 }
6380 *scsipkt->pkt_scbp = STATUS_GOOD;
6381 done:
6382 mutex_exit(cport_mutex);
6383 (void) kmem_free(buf, MAX_LOG_SENSE_PAGE_SIZE);
6384
6385 SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
6386 "Scsi_pkt completion reason %x\n", scsipkt->pkt_reason);
6387
6388 if ((scsipkt->pkt_flags & FLAG_NOINTR) == 0 &&
6389 scsipkt->pkt_comp != NULL) {
6390 /* scsi callback required */
6391 if (servicing_interrupt()) {
6392 if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
6393 (task_func_t *)spx->txlt_scsi_pkt->pkt_comp,
6394 (void *)spx->txlt_scsi_pkt, TQ_NOSLEEP) ==
6395 TASKQID_INVALID) {
6396 return (TRAN_BUSY);
6397 }
6398 } else if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
6399 (task_func_t *)spx->txlt_scsi_pkt->pkt_comp,
6400 (void *)spx->txlt_scsi_pkt, TQ_SLEEP) == TASKQID_INVALID) {
6401 /* Scheduling the callback failed */
6402 return (TRAN_BUSY);
6403 }
6404 }
6405
6406 return (TRAN_ACCEPT);
6407 }
6408
6409 /*
6410 * Translate command: Read (various types).
6411 * Translated into appropriate type of ATA READ command
6412 * for SATA hard disks.
6413 * Both the device capabilities and requested operation mode are
6414 * considered.
6415 *
6416 * Following scsi cdb fields are ignored:
6417 * rdprotect, dpo, fua, fua_nv, group_number.
6418 *
6419 * If SATA_ENABLE_QUEUING flag is set (in the global SATA HBA framework
6420 * enable variable sata_func_enable), the capability of the controller and
6421 * capability of a device are checked and if both support queueing, read
6422 * request will be translated to READ_DMA_QUEUEING or READ_DMA_QUEUEING_EXT
6423 * command rather than plain READ_XXX command.
6424 * If SATA_ENABLE_NCQ flag is set in addition to SATA_ENABLE_QUEUING flag and
6425 * both the controller and device suport such functionality, the read
6426 * request will be translated to READ_FPDMA_QUEUED command.
6427 * In both cases the maximum queue depth is derived as minimum of:
6428 * HBA capability,device capability and sata_max_queue_depth variable setting.
6429 * The value passed to HBA driver is decremented by 1, because only 5 bits are
6430 * used to pass max queue depth value, and the maximum possible queue depth
6431 * is 32.
6432 *
6433 * Returns TRAN_ACCEPT or code returned by sata_hba_start() and
6434 * appropriate values in scsi_pkt fields.
6435 */
6436 static int
sata_txlt_read(sata_pkt_txlate_t * spx)6437 sata_txlt_read(sata_pkt_txlate_t *spx)
6438 {
6439 struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
6440 sata_cmd_t *scmd = &spx->txlt_sata_pkt->satapkt_cmd;
6441 sata_drive_info_t *sdinfo;
6442 sata_hba_inst_t *shi = SATA_TXLT_HBA_INST(spx);
6443 kmutex_t *cport_mutex = &(SATA_TXLT_CPORT_MUTEX(spx));
6444 uint16_t sec_count;
6445 uint64_t lba;
6446 int rval, reason;
6447 int synch;
6448
6449 mutex_enter(cport_mutex);
6450
6451 if (((rval = sata_txlt_generic_pkt_info(spx, &reason, 0)) !=
6452 TRAN_ACCEPT) || (reason == CMD_DEV_GONE)) {
6453 mutex_exit(cport_mutex);
6454 return (rval);
6455 }
6456
6457 sdinfo = sata_get_device_info(spx->txlt_sata_hba_inst,
6458 &spx->txlt_sata_pkt->satapkt_device);
6459
6460 scmd->satacmd_flags.sata_data_direction = SATA_DIR_READ;
6461 /*
6462 * Extract LBA and sector count from scsi CDB.
6463 */
6464 switch ((uint_t)scsipkt->pkt_cdbp[0]) {
6465 case SCMD_READ:
6466 /* 6-byte scsi read cmd : 0x08 */
6467 lba = (scsipkt->pkt_cdbp[1] & 0x1f);
6468 lba = (lba << 8) | scsipkt->pkt_cdbp[2];
6469 lba = (lba << 8) | scsipkt->pkt_cdbp[3];
6470 sec_count = scsipkt->pkt_cdbp[4];
6471 /* sec_count 0 will be interpreted as 256 by a device */
6472 break;
6473 case SCMD_READ_G1:
6474 /* 10-bytes scsi read command : 0x28 */
6475 lba = scsipkt->pkt_cdbp[2];
6476 lba = (lba << 8) | scsipkt->pkt_cdbp[3];
6477 lba = (lba << 8) | scsipkt->pkt_cdbp[4];
6478 lba = (lba << 8) | scsipkt->pkt_cdbp[5];
6479 sec_count = scsipkt->pkt_cdbp[7];
6480 sec_count = (sec_count << 8) | scsipkt->pkt_cdbp[8];
6481 break;
6482 case SCMD_READ_G5:
6483 /* 12-bytes scsi read command : 0xA8 */
6484 lba = scsipkt->pkt_cdbp[2];
6485 lba = (lba << 8) | scsipkt->pkt_cdbp[3];
6486 lba = (lba << 8) | scsipkt->pkt_cdbp[4];
6487 lba = (lba << 8) | scsipkt->pkt_cdbp[5];
6488 sec_count = scsipkt->pkt_cdbp[6];
6489 sec_count = (sec_count << 8) | scsipkt->pkt_cdbp[7];
6490 sec_count = (sec_count << 8) | scsipkt->pkt_cdbp[8];
6491 sec_count = (sec_count << 8) | scsipkt->pkt_cdbp[9];
6492 break;
6493 case SCMD_READ_G4:
6494 /* 16-bytes scsi read command : 0x88 */
6495 lba = scsipkt->pkt_cdbp[2];
6496 lba = (lba << 8) | scsipkt->pkt_cdbp[3];
6497 lba = (lba << 8) | scsipkt->pkt_cdbp[4];
6498 lba = (lba << 8) | scsipkt->pkt_cdbp[5];
6499 lba = (lba << 8) | scsipkt->pkt_cdbp[6];
6500 lba = (lba << 8) | scsipkt->pkt_cdbp[7];
6501 lba = (lba << 8) | scsipkt->pkt_cdbp[8];
6502 lba = (lba << 8) | scsipkt->pkt_cdbp[9];
6503 sec_count = scsipkt->pkt_cdbp[10];
6504 sec_count = (sec_count << 8) | scsipkt->pkt_cdbp[11];
6505 sec_count = (sec_count << 8) | scsipkt->pkt_cdbp[12];
6506 sec_count = (sec_count << 8) | scsipkt->pkt_cdbp[13];
6507 break;
6508 default:
6509 /* Unsupported command */
6510 mutex_exit(cport_mutex);
6511 return (sata_txlt_invalid_command(spx));
6512 }
6513
6514 /*
6515 * Check if specified address exceeds device capacity
6516 */
6517 if ((lba >= sdinfo->satadrv_capacity) ||
6518 ((lba + sec_count) > sdinfo->satadrv_capacity)) {
6519 /* LBA out of range */
6520 mutex_exit(cport_mutex);
6521 return (sata_txlt_lba_out_of_range(spx));
6522 }
6523
6524 /*
6525 * For zero-length transfer, emulate good completion of the command
6526 * (reasons for rejecting the command were already checked).
6527 * No DMA resources were allocated.
6528 */
6529 if (spx->txlt_dma_cookie_list == NULL) {
6530 mutex_exit(cport_mutex);
6531 return (sata_emul_rw_completion(spx));
6532 }
6533
6534 /*
6535 * Build cmd block depending on the device capability and
6536 * requested operation mode.
6537 * Do not bother with non-dma mode - we are working only with
6538 * devices supporting DMA.
6539 */
6540 scmd->satacmd_addr_type = ATA_ADDR_LBA;
6541 scmd->satacmd_device_reg = SATA_ADH_LBA;
6542 scmd->satacmd_cmd_reg = SATAC_READ_DMA;
6543 if (sdinfo->satadrv_features_support & SATA_DEV_F_LBA48) {
6544 scmd->satacmd_addr_type = ATA_ADDR_LBA48;
6545 scmd->satacmd_cmd_reg = SATAC_READ_DMA_EXT;
6546 scmd->satacmd_sec_count_msb = sec_count >> 8;
6547 #ifndef __lock_lint
6548 scmd->satacmd_lba_low_msb = (lba >> 24) & 0xff;
6549 scmd->satacmd_lba_mid_msb = (lba >> 32) & 0xff;
6550 scmd->satacmd_lba_high_msb = lba >> 40;
6551 #endif
6552 } else if (sdinfo->satadrv_features_support & SATA_DEV_F_LBA28) {
6553 scmd->satacmd_addr_type = ATA_ADDR_LBA28;
6554 scmd->satacmd_device_reg = SATA_ADH_LBA | ((lba >> 24) & 0xf);
6555 }
6556 scmd->satacmd_sec_count_lsb = sec_count & 0xff;
6557 scmd->satacmd_lba_low_lsb = lba & 0xff;
6558 scmd->satacmd_lba_mid_lsb = (lba >> 8) & 0xff;
6559 scmd->satacmd_lba_high_lsb = (lba >> 16) & 0xff;
6560 scmd->satacmd_features_reg = 0;
6561 scmd->satacmd_status_reg = 0;
6562 scmd->satacmd_error_reg = 0;
6563
6564 /*
6565 * Check if queueing commands should be used and switch
6566 * to appropriate command if possible
6567 */
6568 if (sata_func_enable & SATA_ENABLE_QUEUING) {
6569 boolean_t using_queuing;
6570
6571 /* Queuing supported by controller and device? */
6572 if ((sata_func_enable & SATA_ENABLE_NCQ) &&
6573 (sdinfo->satadrv_features_support &
6574 SATA_DEV_F_NCQ) &&
6575 (SATA_FEATURES(spx->txlt_sata_hba_inst) &
6576 SATA_CTLF_NCQ)) {
6577 using_queuing = B_TRUE;
6578
6579 /* NCQ supported - use FPDMA READ */
6580 scmd->satacmd_cmd_reg =
6581 SATAC_READ_FPDMA_QUEUED;
6582 scmd->satacmd_features_reg_ext =
6583 scmd->satacmd_sec_count_msb;
6584 scmd->satacmd_sec_count_msb = 0;
6585 } else if ((sdinfo->satadrv_features_support &
6586 SATA_DEV_F_TCQ) &&
6587 (SATA_FEATURES(spx->txlt_sata_hba_inst) &
6588 SATA_CTLF_QCMD)) {
6589 using_queuing = B_TRUE;
6590
6591 /* Legacy queueing */
6592 if (sdinfo->satadrv_features_support &
6593 SATA_DEV_F_LBA48) {
6594 scmd->satacmd_cmd_reg =
6595 SATAC_READ_DMA_QUEUED_EXT;
6596 scmd->satacmd_features_reg_ext =
6597 scmd->satacmd_sec_count_msb;
6598 scmd->satacmd_sec_count_msb = 0;
6599 } else {
6600 scmd->satacmd_cmd_reg =
6601 SATAC_READ_DMA_QUEUED;
6602 }
6603 } else /* NCQ nor legacy queuing not supported */
6604 using_queuing = B_FALSE;
6605
6606 /*
6607 * If queuing, the sector count goes in the features register
6608 * and the secount count will contain the tag.
6609 */
6610 if (using_queuing) {
6611 scmd->satacmd_features_reg =
6612 scmd->satacmd_sec_count_lsb;
6613 scmd->satacmd_sec_count_lsb = 0;
6614 scmd->satacmd_flags.sata_queued = B_TRUE;
6615
6616 /* Set-up maximum queue depth */
6617 scmd->satacmd_flags.sata_max_queue_depth =
6618 sdinfo->satadrv_max_queue_depth - 1;
6619 } else if (sdinfo->satadrv_features_enabled &
6620 SATA_DEV_F_E_UNTAGGED_QING) {
6621 /*
6622 * Although NCQ/TCQ is not enabled, untagged queuing
6623 * may be still used.
6624 * Set-up the maximum untagged queue depth.
6625 * Use controller's queue depth from sata_hba_tran.
6626 * SATA HBA drivers may ignore this value and rely on
6627 * the internal limits.For drivers that do not
6628 * ignore untaged queue depth, limit the value to
6629 * SATA_MAX_QUEUE_DEPTH (32), as this is the
6630 * largest value that can be passed via
6631 * satacmd_flags.sata_max_queue_depth.
6632 */
6633 scmd->satacmd_flags.sata_max_queue_depth =
6634 SATA_QDEPTH(shi) <= SATA_MAX_QUEUE_DEPTH ?
6635 SATA_QDEPTH(shi) - 1: SATA_MAX_QUEUE_DEPTH - 1;
6636
6637 } else {
6638 scmd->satacmd_flags.sata_max_queue_depth = 0;
6639 }
6640 } else
6641 scmd->satacmd_flags.sata_max_queue_depth = 0;
6642
6643 SATADBG3(SATA_DBG_HBA_IF, spx->txlt_sata_hba_inst,
6644 "sata_txlt_read cmd 0x%2x, lba %llx, sec count %x\n",
6645 scmd->satacmd_cmd_reg, lba, sec_count);
6646
6647 if (!(spx->txlt_sata_pkt->satapkt_op_mode & SATA_OPMODE_SYNCH)) {
6648 /* Need callback function */
6649 spx->txlt_sata_pkt->satapkt_comp = sata_txlt_rw_completion;
6650 synch = FALSE;
6651 } else
6652 synch = TRUE;
6653
6654 /* Transfer command to HBA */
6655 if (sata_hba_start(spx, &rval) != 0) {
6656 /* Pkt not accepted for execution */
6657 mutex_exit(cport_mutex);
6658 return (rval);
6659 }
6660 mutex_exit(cport_mutex);
6661 /*
6662 * If execution is non-synchronous,
6663 * a callback function will handle potential errors, translate
6664 * the response and will do a callback to a target driver.
6665 * If it was synchronous, check execution status using the same
6666 * framework callback.
6667 */
6668 if (synch) {
6669 SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
6670 "synchronous execution status %x\n",
6671 spx->txlt_sata_pkt->satapkt_reason);
6672 sata_txlt_rw_completion(spx->txlt_sata_pkt);
6673 }
6674 return (TRAN_ACCEPT);
6675 }
6676
6677
6678 /*
6679 * SATA translate command: Write (various types)
6680 * Translated into appropriate type of ATA WRITE command
6681 * for SATA hard disks.
6682 * Both the device capabilities and requested operation mode are
6683 * considered.
6684 *
6685 * Following scsi cdb fields are ignored:
6686 * rwprotect, dpo, fua, fua_nv, group_number.
6687 *
6688 * If SATA_ENABLE_QUEUING flag is set (in the global SATA HBA framework
6689 * enable variable sata_func_enable), the capability of the controller and
6690 * capability of a device are checked and if both support queueing, write
6691 * request will be translated to WRITE_DMA_QUEUEING or WRITE_DMA_QUEUEING_EXT
6692 * command rather than plain WRITE_XXX command.
6693 * If SATA_ENABLE_NCQ flag is set in addition to SATA_ENABLE_QUEUING flag and
6694 * both the controller and device suport such functionality, the write
6695 * request will be translated to WRITE_FPDMA_QUEUED command.
6696 * In both cases the maximum queue depth is derived as minimum of:
6697 * HBA capability,device capability and sata_max_queue_depth variable setting.
6698 * The value passed to HBA driver is decremented by 1, because only 5 bits are
6699 * used to pass max queue depth value, and the maximum possible queue depth
6700 * is 32.
6701 *
6702 * Returns TRAN_ACCEPT or code returned by sata_hba_start() and
6703 * appropriate values in scsi_pkt fields.
6704 */
6705 static int
sata_txlt_write(sata_pkt_txlate_t * spx)6706 sata_txlt_write(sata_pkt_txlate_t *spx)
6707 {
6708 struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
6709 sata_cmd_t *scmd = &spx->txlt_sata_pkt->satapkt_cmd;
6710 sata_drive_info_t *sdinfo;
6711 sata_hba_inst_t *shi = SATA_TXLT_HBA_INST(spx);
6712 uint16_t sec_count;
6713 uint64_t lba;
6714 int rval, reason;
6715 int synch;
6716 kmutex_t *cport_mutex = &(SATA_TXLT_CPORT_MUTEX(spx));
6717
6718 mutex_enter(cport_mutex);
6719
6720 if (((rval = sata_txlt_generic_pkt_info(spx, &reason, 0)) !=
6721 TRAN_ACCEPT) || (reason == CMD_DEV_GONE)) {
6722 mutex_exit(cport_mutex);
6723 return (rval);
6724 }
6725
6726 sdinfo = sata_get_device_info(spx->txlt_sata_hba_inst,
6727 &spx->txlt_sata_pkt->satapkt_device);
6728
6729 scmd->satacmd_flags.sata_data_direction = SATA_DIR_WRITE;
6730 /*
6731 * Extract LBA and sector count from scsi CDB
6732 */
6733 switch ((uint_t)scsipkt->pkt_cdbp[0]) {
6734 case SCMD_WRITE:
6735 /* 6-byte scsi read cmd : 0x0A */
6736 lba = (scsipkt->pkt_cdbp[1] & 0x1f);
6737 lba = (lba << 8) | scsipkt->pkt_cdbp[2];
6738 lba = (lba << 8) | scsipkt->pkt_cdbp[3];
6739 sec_count = scsipkt->pkt_cdbp[4];
6740 /* sec_count 0 will be interpreted as 256 by a device */
6741 break;
6742 case SCMD_WRITE_G1:
6743 /* 10-bytes scsi write command : 0x2A */
6744 lba = scsipkt->pkt_cdbp[2];
6745 lba = (lba << 8) | scsipkt->pkt_cdbp[3];
6746 lba = (lba << 8) | scsipkt->pkt_cdbp[4];
6747 lba = (lba << 8) | scsipkt->pkt_cdbp[5];
6748 sec_count = scsipkt->pkt_cdbp[7];
6749 sec_count = (sec_count << 8) | scsipkt->pkt_cdbp[8];
6750 break;
6751 case SCMD_WRITE_G5:
6752 /* 12-bytes scsi read command : 0xAA */
6753 lba = scsipkt->pkt_cdbp[2];
6754 lba = (lba << 8) | scsipkt->pkt_cdbp[3];
6755 lba = (lba << 8) | scsipkt->pkt_cdbp[4];
6756 lba = (lba << 8) | scsipkt->pkt_cdbp[5];
6757 sec_count = scsipkt->pkt_cdbp[6];
6758 sec_count = (sec_count << 8) | scsipkt->pkt_cdbp[7];
6759 sec_count = (sec_count << 8) | scsipkt->pkt_cdbp[8];
6760 sec_count = (sec_count << 8) | scsipkt->pkt_cdbp[9];
6761 break;
6762 case SCMD_WRITE_G4:
6763 /* 16-bytes scsi write command : 0x8A */
6764 lba = scsipkt->pkt_cdbp[2];
6765 lba = (lba << 8) | scsipkt->pkt_cdbp[3];
6766 lba = (lba << 8) | scsipkt->pkt_cdbp[4];
6767 lba = (lba << 8) | scsipkt->pkt_cdbp[5];
6768 lba = (lba << 8) | scsipkt->pkt_cdbp[6];
6769 lba = (lba << 8) | scsipkt->pkt_cdbp[7];
6770 lba = (lba << 8) | scsipkt->pkt_cdbp[8];
6771 lba = (lba << 8) | scsipkt->pkt_cdbp[9];
6772 sec_count = scsipkt->pkt_cdbp[10];
6773 sec_count = (sec_count << 8) | scsipkt->pkt_cdbp[11];
6774 sec_count = (sec_count << 8) | scsipkt->pkt_cdbp[12];
6775 sec_count = (sec_count << 8) | scsipkt->pkt_cdbp[13];
6776 break;
6777 default:
6778 /* Unsupported command */
6779 mutex_exit(cport_mutex);
6780 return (sata_txlt_invalid_command(spx));
6781 }
6782
6783 /*
6784 * Check if specified address and length exceeds device capacity
6785 */
6786 if ((lba >= sdinfo->satadrv_capacity) ||
6787 ((lba + sec_count) > sdinfo->satadrv_capacity)) {
6788 /* LBA out of range */
6789 mutex_exit(cport_mutex);
6790 return (sata_txlt_lba_out_of_range(spx));
6791 }
6792
6793 /*
6794 * For zero-length transfer, emulate good completion of the command
6795 * (reasons for rejecting the command were already checked).
6796 * No DMA resources were allocated.
6797 */
6798 if (spx->txlt_dma_cookie_list == NULL) {
6799 mutex_exit(cport_mutex);
6800 return (sata_emul_rw_completion(spx));
6801 }
6802
6803 /*
6804 * Build cmd block depending on the device capability and
6805 * requested operation mode.
6806 * Do not bother with non-dma mode- we are working only with
6807 * devices supporting DMA.
6808 */
6809 scmd->satacmd_addr_type = ATA_ADDR_LBA;
6810 scmd->satacmd_device_reg = SATA_ADH_LBA;
6811 scmd->satacmd_cmd_reg = SATAC_WRITE_DMA;
6812 if (sdinfo->satadrv_features_support & SATA_DEV_F_LBA48) {
6813 scmd->satacmd_addr_type = ATA_ADDR_LBA48;
6814 scmd->satacmd_cmd_reg = SATAC_WRITE_DMA_EXT;
6815 scmd->satacmd_sec_count_msb = sec_count >> 8;
6816 scmd->satacmd_lba_low_msb = (lba >> 24) & 0xff;
6817 #ifndef __lock_lint
6818 scmd->satacmd_lba_mid_msb = (lba >> 32) & 0xff;
6819 scmd->satacmd_lba_high_msb = lba >> 40;
6820 #endif
6821 } else if (sdinfo->satadrv_features_support & SATA_DEV_F_LBA28) {
6822 scmd->satacmd_addr_type = ATA_ADDR_LBA28;
6823 scmd->satacmd_device_reg = SATA_ADH_LBA | ((lba >> 24) & 0xf);
6824 }
6825 scmd->satacmd_sec_count_lsb = sec_count & 0xff;
6826 scmd->satacmd_lba_low_lsb = lba & 0xff;
6827 scmd->satacmd_lba_mid_lsb = (lba >> 8) & 0xff;
6828 scmd->satacmd_lba_high_lsb = (lba >> 16) & 0xff;
6829 scmd->satacmd_features_reg = 0;
6830 scmd->satacmd_status_reg = 0;
6831 scmd->satacmd_error_reg = 0;
6832
6833 /*
6834 * Check if queueing commands should be used and switch
6835 * to appropriate command if possible
6836 */
6837 if (sata_func_enable & SATA_ENABLE_QUEUING) {
6838 boolean_t using_queuing;
6839
6840 /* Queuing supported by controller and device? */
6841 if ((sata_func_enable & SATA_ENABLE_NCQ) &&
6842 (sdinfo->satadrv_features_support &
6843 SATA_DEV_F_NCQ) &&
6844 (SATA_FEATURES(spx->txlt_sata_hba_inst) &
6845 SATA_CTLF_NCQ)) {
6846 using_queuing = B_TRUE;
6847
6848 /* NCQ supported - use FPDMA WRITE */
6849 scmd->satacmd_cmd_reg =
6850 SATAC_WRITE_FPDMA_QUEUED;
6851 scmd->satacmd_features_reg_ext =
6852 scmd->satacmd_sec_count_msb;
6853 scmd->satacmd_sec_count_msb = 0;
6854 } else if ((sdinfo->satadrv_features_support &
6855 SATA_DEV_F_TCQ) &&
6856 (SATA_FEATURES(spx->txlt_sata_hba_inst) &
6857 SATA_CTLF_QCMD)) {
6858 using_queuing = B_TRUE;
6859
6860 /* Legacy queueing */
6861 if (sdinfo->satadrv_features_support &
6862 SATA_DEV_F_LBA48) {
6863 scmd->satacmd_cmd_reg =
6864 SATAC_WRITE_DMA_QUEUED_EXT;
6865 scmd->satacmd_features_reg_ext =
6866 scmd->satacmd_sec_count_msb;
6867 scmd->satacmd_sec_count_msb = 0;
6868 } else {
6869 scmd->satacmd_cmd_reg =
6870 SATAC_WRITE_DMA_QUEUED;
6871 }
6872 } else /* NCQ nor legacy queuing not supported */
6873 using_queuing = B_FALSE;
6874
6875 if (using_queuing) {
6876 scmd->satacmd_features_reg =
6877 scmd->satacmd_sec_count_lsb;
6878 scmd->satacmd_sec_count_lsb = 0;
6879 scmd->satacmd_flags.sata_queued = B_TRUE;
6880 /* Set-up maximum queue depth */
6881 scmd->satacmd_flags.sata_max_queue_depth =
6882 sdinfo->satadrv_max_queue_depth - 1;
6883 } else if (sdinfo->satadrv_features_enabled &
6884 SATA_DEV_F_E_UNTAGGED_QING) {
6885 /*
6886 * Although NCQ/TCQ is not enabled, untagged queuing
6887 * may be still used.
6888 * Set-up the maximum untagged queue depth.
6889 * Use controller's queue depth from sata_hba_tran.
6890 * SATA HBA drivers may ignore this value and rely on
6891 * the internal limits. For drivera that do not
6892 * ignore untaged queue depth, limit the value to
6893 * SATA_MAX_QUEUE_DEPTH (32), as this is the
6894 * largest value that can be passed via
6895 * satacmd_flags.sata_max_queue_depth.
6896 */
6897 scmd->satacmd_flags.sata_max_queue_depth =
6898 SATA_QDEPTH(shi) <= SATA_MAX_QUEUE_DEPTH ?
6899 SATA_QDEPTH(shi) - 1: SATA_MAX_QUEUE_DEPTH - 1;
6900
6901 } else {
6902 scmd->satacmd_flags.sata_max_queue_depth = 0;
6903 }
6904 } else
6905 scmd->satacmd_flags.sata_max_queue_depth = 0;
6906
6907 SATADBG3(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
6908 "sata_txlt_write cmd 0x%2x, lba %llx, sec count %x\n",
6909 scmd->satacmd_cmd_reg, lba, sec_count);
6910
6911 if (!(spx->txlt_sata_pkt->satapkt_op_mode & SATA_OPMODE_SYNCH)) {
6912 /* Need callback function */
6913 spx->txlt_sata_pkt->satapkt_comp = sata_txlt_rw_completion;
6914 synch = FALSE;
6915 } else
6916 synch = TRUE;
6917
6918 /* Transfer command to HBA */
6919 if (sata_hba_start(spx, &rval) != 0) {
6920 /* Pkt not accepted for execution */
6921 mutex_exit(cport_mutex);
6922 return (rval);
6923 }
6924 mutex_exit(cport_mutex);
6925
6926 /*
6927 * If execution is non-synchronous,
6928 * a callback function will handle potential errors, translate
6929 * the response and will do a callback to a target driver.
6930 * If it was synchronous, check execution status using the same
6931 * framework callback.
6932 */
6933 if (synch) {
6934 SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
6935 "synchronous execution status %x\n",
6936 spx->txlt_sata_pkt->satapkt_reason);
6937 sata_txlt_rw_completion(spx->txlt_sata_pkt);
6938 }
6939 return (TRAN_ACCEPT);
6940 }
6941
6942
6943 /*
6944 * Implements SCSI SBC WRITE BUFFER command download microcode option
6945 */
6946 static int
sata_txlt_write_buffer(sata_pkt_txlate_t * spx)6947 sata_txlt_write_buffer(sata_pkt_txlate_t *spx)
6948 {
6949 #define WB_DOWNLOAD_MICROCODE_AND_REVERT_MODE 4
6950 #define WB_DOWNLOAD_MICROCODE_AND_SAVE_MODE 5
6951
6952 struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
6953 struct sata_pkt *sata_pkt = spx->txlt_sata_pkt;
6954 sata_cmd_t *scmd = &spx->txlt_sata_pkt->satapkt_cmd;
6955
6956 struct buf *bp = spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp;
6957 struct scsi_extended_sense *sense;
6958 int rval, mode, sector_count, reason;
6959 kmutex_t *cport_mutex = &(SATA_TXLT_CPORT_MUTEX(spx));
6960
6961 mode = scsipkt->pkt_cdbp[1] & 0x1f;
6962
6963 SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
6964 "sata_txlt_write_buffer, mode 0x%x\n", mode);
6965
6966 mutex_enter(cport_mutex);
6967
6968 if ((rval = sata_txlt_generic_pkt_info(spx, &reason, 1)) !=
6969 TRAN_ACCEPT) {
6970 mutex_exit(cport_mutex);
6971 return (rval);
6972 }
6973
6974 /* Use synchronous mode */
6975 spx->txlt_sata_pkt->satapkt_op_mode
6976 |= SATA_OPMODE_SYNCH | SATA_OPMODE_INTERRUPTS;
6977
6978 scmd->satacmd_flags.sata_data_direction = SATA_DIR_WRITE;
6979
6980 scsipkt->pkt_reason = CMD_CMPLT;
6981 scsipkt->pkt_state = STATE_GOT_BUS | STATE_GOT_TARGET |
6982 STATE_SENT_CMD | STATE_GOT_STATUS;
6983
6984 /*
6985 * The SCSI to ATA translation specification only calls
6986 * for WB_DOWNLOAD_MICROCODE_AND_SAVE_MODE.
6987 * WB_DOWNLOAD_MICROC_AND_REVERT_MODE is implemented, but
6988 * ATA 8 (draft) got rid of download microcode for temp
6989 * and it is even optional for ATA 7, so it may be aborted.
6990 * WB_DOWNLOAD_MICROCODE_WITH_OFFSET is not implemented as
6991 * it is not specified and the buffer offset for SCSI is a 16-bit
6992 * value in bytes, but for ATA it is a 16-bit offset in 512 byte
6993 * sectors. Thus the offset really doesn't buy us anything.
6994 * If and when ATA 8 is stabilized and the SCSI to ATA specification
6995 * is revised, this can be revisisted.
6996 */
6997 /* Reject not supported request */
6998 switch (mode) {
6999 case WB_DOWNLOAD_MICROCODE_AND_REVERT_MODE:
7000 scmd->satacmd_features_reg = SATA_DOWNLOAD_MCODE_TEMP;
7001 break;
7002 case WB_DOWNLOAD_MICROCODE_AND_SAVE_MODE:
7003 scmd->satacmd_features_reg = SATA_DOWNLOAD_MCODE_SAVE;
7004 break;
7005 default:
7006 goto bad_param;
7007 }
7008
7009 *scsipkt->pkt_scbp = STATUS_GOOD; /* Presumed outcome */
7010
7011 scmd->satacmd_cmd_reg = SATAC_DOWNLOAD_MICROCODE;
7012 if ((bp->b_bcount % SATA_DISK_SECTOR_SIZE) != 0)
7013 goto bad_param;
7014 sector_count = bp->b_bcount / SATA_DISK_SECTOR_SIZE;
7015 scmd->satacmd_sec_count_lsb = (uint8_t)sector_count;
7016 scmd->satacmd_lba_low_lsb = ((uint16_t)sector_count) >> 8;
7017 scmd->satacmd_lba_mid_lsb = 0;
7018 scmd->satacmd_lba_high_lsb = 0;
7019 scmd->satacmd_device_reg = 0;
7020 spx->txlt_sata_pkt->satapkt_comp = NULL;
7021 scmd->satacmd_addr_type = 0;
7022
7023 /* Transfer command to HBA */
7024 if (sata_hba_start(spx, &rval) != 0) {
7025 /* Pkt not accepted for execution */
7026 mutex_exit(cport_mutex);
7027 return (rval);
7028 }
7029
7030 mutex_exit(cport_mutex);
7031
7032 /* Then we need synchronous check the status of the disk */
7033 scsipkt->pkt_state = STATE_GOT_BUS | STATE_GOT_TARGET |
7034 STATE_SENT_CMD | STATE_XFERRED_DATA | STATE_GOT_STATUS;
7035 if (sata_pkt->satapkt_reason == SATA_PKT_COMPLETED) {
7036 scsipkt->pkt_reason = CMD_CMPLT;
7037
7038 /* Download commmand succeed, so probe and identify device */
7039 sata_reidentify_device(spx);
7040 } else {
7041 /* Something went wrong, microcode download command failed */
7042 scsipkt->pkt_reason = CMD_INCOMPLETE;
7043 *scsipkt->pkt_scbp = STATUS_CHECK;
7044 sense = sata_arq_sense(spx);
7045 switch (sata_pkt->satapkt_reason) {
7046 case SATA_PKT_PORT_ERROR:
7047 /*
7048 * We have no device data. Assume no data transfered.
7049 */
7050 sense->es_key = KEY_HARDWARE_ERROR;
7051 break;
7052
7053 case SATA_PKT_DEV_ERROR:
7054 if (sata_pkt->satapkt_cmd.satacmd_status_reg &
7055 SATA_STATUS_ERR) {
7056 /*
7057 * determine dev error reason from error
7058 * reg content
7059 */
7060 sata_decode_device_error(spx, sense);
7061 break;
7062 }
7063 /* No extended sense key - no info available */
7064 break;
7065
7066 case SATA_PKT_TIMEOUT:
7067 scsipkt->pkt_reason = CMD_TIMEOUT;
7068 scsipkt->pkt_statistics |=
7069 STAT_TIMEOUT | STAT_DEV_RESET;
7070 /* No extended sense key ? */
7071 break;
7072
7073 case SATA_PKT_ABORTED:
7074 scsipkt->pkt_reason = CMD_ABORTED;
7075 scsipkt->pkt_statistics |= STAT_ABORTED;
7076 /* No extended sense key ? */
7077 break;
7078
7079 case SATA_PKT_RESET:
7080 /* pkt aborted by an explicit reset from a host */
7081 scsipkt->pkt_reason = CMD_RESET;
7082 scsipkt->pkt_statistics |= STAT_DEV_RESET;
7083 break;
7084
7085 default:
7086 SATA_LOG_D((spx->txlt_sata_hba_inst, CE_WARN,
7087 "sata_txlt_nodata_cmd_completion: "
7088 "invalid packet completion reason %d",
7089 sata_pkt->satapkt_reason));
7090 scsipkt->pkt_reason = CMD_TRAN_ERR;
7091 break;
7092 }
7093
7094 SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
7095 "scsi_pkt completion reason %x\n", scsipkt->pkt_reason);
7096
7097 if ((scsipkt->pkt_flags & FLAG_NOINTR) == 0)
7098 /* scsi callback required */
7099 scsi_hba_pkt_comp(scsipkt);
7100 }
7101 return (TRAN_ACCEPT);
7102
7103 bad_param:
7104 mutex_exit(cport_mutex);
7105 *scsipkt->pkt_scbp = STATUS_CHECK;
7106 sense = sata_arq_sense(spx);
7107 sense->es_key = KEY_ILLEGAL_REQUEST;
7108 sense->es_add_code = SD_SCSI_ASC_INVALID_FIELD_IN_CDB;
7109 if ((scsipkt->pkt_flags & FLAG_NOINTR) == 0 &&
7110 scsipkt->pkt_comp != NULL) {
7111 /* scsi callback required */
7112 if (servicing_interrupt()) {
7113 if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
7114 (task_func_t *)spx->txlt_scsi_pkt->pkt_comp,
7115 (void *)spx->txlt_scsi_pkt, TQ_NOSLEEP) ==
7116 TASKQID_INVALID) {
7117 return (TRAN_BUSY);
7118 }
7119 } else if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
7120 (task_func_t *)spx->txlt_scsi_pkt->pkt_comp,
7121 (void *)spx->txlt_scsi_pkt, TQ_SLEEP) == TASKQID_INVALID) {
7122 /* Scheduling the callback failed */
7123 return (TRAN_BUSY);
7124 }
7125 }
7126 return (rval);
7127 }
7128
7129 /*
7130 * Re-identify device after doing a firmware download.
7131 */
7132 static void
sata_reidentify_device(sata_pkt_txlate_t * spx)7133 sata_reidentify_device(sata_pkt_txlate_t *spx)
7134 {
7135 #define DOWNLOAD_WAIT_TIME_SECS 60
7136 #define DOWNLOAD_WAIT_INTERVAL_SECS 1
7137 int rval;
7138 int retry_cnt;
7139 struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
7140 sata_hba_inst_t *sata_hba_inst = spx->txlt_sata_hba_inst;
7141 sata_device_t sata_device = spx->txlt_sata_pkt->satapkt_device;
7142 sata_drive_info_t *sdinfo;
7143
7144 /*
7145 * Before returning good status, probe device.
7146 * Device probing will get IDENTIFY DEVICE data, if possible.
7147 * The assumption is that the new microcode is applied by the
7148 * device. It is a caller responsibility to verify this.
7149 */
7150 for (retry_cnt = 0;
7151 retry_cnt < DOWNLOAD_WAIT_TIME_SECS / DOWNLOAD_WAIT_INTERVAL_SECS;
7152 retry_cnt++) {
7153 rval = sata_probe_device(sata_hba_inst, &sata_device);
7154
7155 if (rval == SATA_SUCCESS) { /* Set default features */
7156 sdinfo = sata_get_device_info(sata_hba_inst,
7157 &sata_device);
7158 if (sata_initialize_device(sata_hba_inst, sdinfo) !=
7159 SATA_SUCCESS) {
7160 /* retry */
7161 rval = sata_initialize_device(sata_hba_inst,
7162 sdinfo);
7163 if (rval == SATA_RETRY)
7164 sata_log(sata_hba_inst, CE_WARN,
7165 "SATA device at port %d pmport %d -"
7166 " default device features could not"
7167 " be set. Device may not operate "
7168 "as expected.",
7169 sata_device.satadev_addr.cport,
7170 sata_device.satadev_addr.pmport);
7171 }
7172 if ((scsipkt->pkt_flags & FLAG_NOINTR) == 0)
7173 scsi_hba_pkt_comp(scsipkt);
7174 return;
7175 } else if (rval == SATA_RETRY) {
7176 delay(drv_usectohz(1000000 *
7177 DOWNLOAD_WAIT_INTERVAL_SECS));
7178 continue;
7179 } else /* failed - no reason to retry */
7180 break;
7181 }
7182
7183 /*
7184 * Something went wrong, device probing failed.
7185 */
7186 SATA_LOG_D((sata_hba_inst, CE_WARN,
7187 "Cannot probe device after downloading microcode\n"));
7188
7189 /* Reset device to force retrying the probe. */
7190 (void) (*SATA_RESET_DPORT_FUNC(sata_hba_inst))
7191 (SATA_DIP(sata_hba_inst), &sata_device);
7192
7193 if ((scsipkt->pkt_flags & FLAG_NOINTR) == 0)
7194 scsi_hba_pkt_comp(scsipkt);
7195 }
7196
7197
7198 /*
7199 * Translate command: Synchronize Cache.
7200 * Translates into Flush Cache command for SATA hard disks.
7201 *
7202 * Returns TRAN_ACCEPT or code returned by sata_hba_start() and
7203 * appropriate values in scsi_pkt fields.
7204 */
7205 static int
sata_txlt_synchronize_cache(sata_pkt_txlate_t * spx)7206 sata_txlt_synchronize_cache(sata_pkt_txlate_t *spx)
7207 {
7208 sata_cmd_t *scmd = &spx->txlt_sata_pkt->satapkt_cmd;
7209 kmutex_t *cport_mutex = &(SATA_TXLT_CPORT_MUTEX(spx));
7210 int rval, reason;
7211 int synch;
7212
7213 mutex_enter(cport_mutex);
7214
7215 if (((rval = sata_txlt_generic_pkt_info(spx, &reason, 1)) !=
7216 TRAN_ACCEPT) || (reason == CMD_DEV_GONE)) {
7217 mutex_exit(cport_mutex);
7218 return (rval);
7219 }
7220
7221 scmd->satacmd_addr_type = 0;
7222 scmd->satacmd_cmd_reg = SATAC_FLUSH_CACHE;
7223 scmd->satacmd_device_reg = 0;
7224 scmd->satacmd_sec_count_lsb = 0;
7225 scmd->satacmd_lba_low_lsb = 0;
7226 scmd->satacmd_lba_mid_lsb = 0;
7227 scmd->satacmd_lba_high_lsb = 0;
7228 scmd->satacmd_features_reg = 0;
7229 scmd->satacmd_status_reg = 0;
7230 scmd->satacmd_error_reg = 0;
7231
7232 SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
7233 "sata_txlt_synchronize_cache\n", NULL);
7234
7235 if (!(spx->txlt_sata_pkt->satapkt_op_mode & SATA_OPMODE_SYNCH)) {
7236 /* Need to set-up a callback function */
7237 spx->txlt_sata_pkt->satapkt_comp =
7238 sata_txlt_nodata_cmd_completion;
7239 synch = FALSE;
7240 } else
7241 synch = TRUE;
7242
7243 /* Transfer command to HBA */
7244 if (sata_hba_start(spx, &rval) != 0) {
7245 /* Pkt not accepted for execution */
7246 mutex_exit(cport_mutex);
7247 return (rval);
7248 }
7249 mutex_exit(cport_mutex);
7250
7251 /*
7252 * If execution non-synchronous, it had to be completed
7253 * a callback function will handle potential errors, translate
7254 * the response and will do a callback to a target driver.
7255 * If it was synchronous, check status, using the same
7256 * framework callback.
7257 */
7258 if (synch) {
7259 SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
7260 "synchronous execution status %x\n",
7261 spx->txlt_sata_pkt->satapkt_reason);
7262 sata_txlt_nodata_cmd_completion(spx->txlt_sata_pkt);
7263 }
7264 return (TRAN_ACCEPT);
7265 }
7266
7267 #define RCTD(pkt) (pkt->pkt_cdbp[1] & 0x80)
7268 static int
sata_txlt_supported_ops(sata_pkt_txlate_t * spx)7269 sata_txlt_supported_ops(sata_pkt_txlate_t *spx)
7270 {
7271 struct scsi_pkt *pkt = spx->txlt_scsi_pkt;
7272 struct buf *bp = spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp;
7273 sata_drive_info_t *sdinfo;
7274 const struct sata_cmd_info *sci = NULL;
7275 struct sata_txlt_buf sbuf;
7276 uint32_t alc_len;
7277 uint_t i;
7278 int reason, rval;
7279 uint16_t svcact;
7280 uint8_t op, reporting_opts;
7281
7282 if (bp == NULL || bp->b_un.b_addr == 0 || bp->b_bcount == 0) {
7283 *pkt->pkt_scbp = STATUS_GOOD;
7284 goto done;
7285 }
7286
7287 mutex_enter(&SATA_TXLT_CPORT_MUTEX(spx));
7288 rval = sata_txlt_generic_pkt_info(spx, &reason, 1);
7289 if (rval != TRAN_ACCEPT || reason == CMD_DEV_GONE) {
7290 mutex_exit(&SATA_TXLT_CPORT_MUTEX(spx));
7291 return (rval);
7292 }
7293
7294 sdinfo = sata_get_device_info(spx->txlt_sata_hba_inst,
7295 &spx->txlt_sata_pkt->satapkt_device);
7296
7297 sata_scsi_dmafree(NULL, pkt);
7298
7299 pkt->pkt_reason = CMD_CMPLT;
7300 pkt->pkt_state = STATE_GOT_BUS | STATE_GOT_TARGET | STATE_SENT_CMD |
7301 STATE_GOT_STATUS;
7302
7303 op = pkt->pkt_cdbp[3];
7304 svcact = BE_IN16(&pkt->pkt_cdbp[4]);
7305 alc_len = BE_IN32(&pkt->pkt_cdbp[6]);
7306 reporting_opts = pkt->pkt_cdbp[2] & 0x07;
7307
7308 if (reporting_opts > 0x03) {
7309 /* Values > 0x03 are reserved */
7310 struct scsi_extended_sense *sense;
7311
7312 *pkt->pkt_scbp = STATUS_CHECK;
7313 sense = sata_arq_sense(spx);
7314 sense->es_key = KEY_ILLEGAL_REQUEST;
7315 sense->es_add_code = SD_SCSI_ASC_INVALID_FIELD_IN_CDB;
7316 goto done;
7317 }
7318
7319 sbuf_init(&sbuf, bp, alc_len);
7320
7321 /* Skip length when reporting all_commands */
7322 if (reporting_opts == 0)
7323 sbuf_put32(&sbuf, 0);
7324
7325 for (i = 0, sci = &sata_cmd_info[0]; i < ARRAY_SIZE(sata_cmd_info);
7326 i++, sci++) {
7327 const boolean_t has_svc_act = (sci->sci_flags & SCF_SVC_ACT) ?
7328 B_TRUE : B_FALSE;
7329
7330 if (reporting_opts == 0) {
7331 uint8_t flags = 0;
7332
7333 if (sci->sci_supported != NULL &&
7334 !sci->sci_supported(spx, sdinfo)) {
7335 continue;
7336 }
7337
7338 if (has_svc_act)
7339 flags |= 0x01;
7340 if (RCTD(pkt))
7341 flags |= 0x02;
7342
7343 /* Write all_commands parameter data format */
7344 sbuf_put8(&sbuf, sci->sci_op);
7345 sbuf_put8(&sbuf, 0); /* Reserved */
7346 sbuf_put16(&sbuf, sci->sci_svcact);
7347 sbuf_put8(&sbuf, 0); /* Reserved */
7348 sbuf_put8(&sbuf, flags);
7349 sbuf_put16(&sbuf, sata_cmd_cdblen(sci));
7350
7351 /*
7352 * SPC-5 6.34.2 Table 256 uggests that for the
7353 * all_commands paramater data format that each
7354 * command descriptor should include a command
7355 * duration timeout descriptor, however the CTDP
7356 * flag (byte 5, bit 1) implies it should only be
7357 * present when this flag is set.
7358 * sg3_utils at least believes the CTDP indicates
7359 * if a command duration timeout descriptor is
7360 * present. Since we don't support command timeouts
7361 * at all, we follow this an omit the command timeout
7362 * descriptor.
7363 */
7364 if (RCTD(pkt)) {
7365 sbuf_put16(&sbuf, 0x0a); /* Length */
7366 sbuf_put8(&sbuf, 0); /* Reserved */
7367 sbuf_put8(&sbuf, 0); /* cmd specific */
7368 sbuf_put32(&sbuf, 0); /* nominal timeout */
7369 sbuf_put32(&sbuf, 0); /* recommended to */
7370 }
7371
7372 continue;
7373 }
7374
7375 if (sci->sci_op != op)
7376 continue;
7377
7378 if (has_svc_act) {
7379 if (reporting_opts == 0x01) {
7380 struct scsi_extended_sense *sense;
7381
7382 *pkt->pkt_scbp = STATUS_CHECK;
7383 sense = sata_arq_sense(spx);
7384 sense->es_key = KEY_ILLEGAL_REQUEST;
7385 sense->es_add_code =
7386 SD_SCSI_ASC_INVALID_FIELD_IN_CDB;
7387 goto done;
7388 }
7389
7390 if (sci->sci_svcact != svcact)
7391 continue;
7392 } else {
7393 if (reporting_opts == 0x02) {
7394 struct scsi_extended_sense *sense;
7395
7396 *pkt->pkt_scbp = STATUS_CHECK;
7397 sense = sata_arq_sense(spx);
7398 sense->es_key = KEY_ILLEGAL_REQUEST;
7399 sense->es_add_code =
7400 SD_SCSI_ASC_INVALID_FIELD_IN_CDB;
7401 goto done;
7402 }
7403 }
7404
7405 /* Found a match */
7406 break;
7407 }
7408
7409 if (reporting_opts > 0) {
7410 /* Write one_command parameter data format */
7411 uint16_t cdblen;
7412 uint8_t support;
7413
7414 if (i < ARRAY_SIZE(sata_cmd_info)) {
7415 cdblen = sata_cmd_cdblen(sci);
7416
7417 if (sci->sci_supported == NULL ||
7418 sci->sci_supported(spx, sdinfo)) {
7419 support = 0x03;
7420 } else {
7421 /*
7422 * We have a command we conditionally
7423 * support translating, but the SATA disk
7424 * doesn't support the translated command
7425 * (e.g. UNMAP). SPC-5 isn't entirely clear
7426 * on the response. We return what we do know
7427 * (i.e. CDB length), but still indicate it
7428 * is not supported. We should be able to
7429 * adjust this behavior if needed (or future
7430 * revisions clarify the behavior and our
7431 * current behavior conflicts) in the future.
7432 */
7433 support = 0x01;
7434 }
7435 } else {
7436 /* A command we don't recognize at all */
7437 cdblen = 0;
7438 support = 0x01;
7439 }
7440
7441 if (RCTD(pkt))
7442 support |= 0x80;
7443
7444 /* Write one_command parameter format */
7445 sbuf_put8(&sbuf, 0); /* Reserved */
7446 sbuf_put8(&sbuf, support); /* Command supported */
7447 sbuf_put16(&sbuf, cdblen); /* CDB Length */
7448 sbuf_copy(&sbuf, sci->sci_cdbusage, cdblen);
7449
7450 if (RCTD(pkt)) {
7451 sbuf_put16(&sbuf, 0x0a); /* Length */
7452 sbuf_put8(&sbuf, 0); /* Reserved */
7453 sbuf_put8(&sbuf, 0); /* cmd specific */
7454 sbuf_put32(&sbuf, 0); /* nominal timeout */
7455 sbuf_put32(&sbuf, 0); /* recommended timeout */
7456 }
7457 }
7458
7459 /*
7460 * When reporting all_commands, set the total length in the first
7461 * 4 bytes. When reporting one_command, the output has a fixed
7462 * header which includes the CDB length, the CDB usage data,
7463 * and (if specified) the command timeout descriptor, so the
7464 * size of the output is inferred from the CDB length field (per SPC-5).
7465 */
7466 if (reporting_opts == 0)
7467 sbuf_set_len(&sbuf, 0, sizeof (uint32_t), 4);
7468
7469 pkt->pkt_state |= STATE_XFERRED_DATA;
7470 pkt->pkt_resid = sbuf_resid(&sbuf, bp, alc_len);
7471 *pkt->pkt_scbp = STATUS_GOOD;
7472
7473 done:
7474 mutex_exit(&SATA_TXLT_CPORT_MUTEX(spx));
7475
7476 SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
7477 "Scsi_pkt completion reason %x\n", pkt->pkt_reason);
7478
7479 taskq_t *tq = SATA_TXLT_TASKQ(spx);
7480 task_func_t *func = (task_func_t *)pkt->pkt_comp;
7481 uint_t tq_flags = servicing_interrupt() ? TQ_NOSLEEP : TQ_SLEEP;
7482
7483 if ((pkt->pkt_flags & FLAG_NOINTR) != 0 || pkt->pkt_comp == NULL)
7484 return (TRAN_ACCEPT);
7485
7486 if (taskq_dispatch(tq, func, pkt, tq_flags) == TASKQID_INVALID)
7487 return (TRAN_BUSY);
7488
7489 return (TRAN_ACCEPT);
7490 }
7491
7492 /*
7493 * Send pkt to SATA HBA driver
7494 *
7495 * This function may be called only if the operation is requested by scsi_pkt,
7496 * i.e. scsi_pkt is not NULL.
7497 *
7498 * This function has to be called with cport mutex held. It does release
7499 * the mutex when it calls HBA driver sata_tran_start function and
7500 * re-acquires it afterwards.
7501 *
7502 * If return value is 0, pkt was accepted, -1 otherwise
7503 * rval is set to appropriate sata_scsi_start return value.
7504 *
7505 * Note 1:If HBA driver returns value other than TRAN_ACCEPT, it should not
7506 * have called the sata_pkt callback function for this packet.
7507 *
7508 * The scsi callback has to be performed by the caller of this routine.
7509 */
7510 static int
sata_hba_start(sata_pkt_txlate_t * spx,int * rval)7511 sata_hba_start(sata_pkt_txlate_t *spx, int *rval)
7512 {
7513 int stat;
7514 uint8_t cport = SATA_TXLT_CPORT(spx);
7515 uint8_t pmport = SATA_TXLT_PMPORT(spx);
7516 sata_hba_inst_t *sata_hba_inst = spx->txlt_sata_hba_inst;
7517 sata_drive_info_t *sdinfo;
7518 sata_pmult_info_t *pminfo = NULL;
7519 sata_pmport_info_t *pmportinfo = NULL;
7520 sata_device_t *sata_device = NULL;
7521 uint8_t cmd;
7522 struct sata_cmd_flags cmd_flags;
7523
7524 ASSERT(spx->txlt_sata_pkt != NULL);
7525
7526 ASSERT(mutex_owned(&SATA_CPORT_MUTEX(sata_hba_inst, cport)));
7527
7528 sdinfo = sata_get_device_info(sata_hba_inst,
7529 &spx->txlt_sata_pkt->satapkt_device);
7530 ASSERT(sdinfo != NULL);
7531
7532 /* Clear device reset state? */
7533 /* qual should be XXX_DPMPORT, but add XXX_PMPORT in case */
7534 if (sdinfo->satadrv_addr.qual == SATA_ADDR_DPMPORT ||
7535 sdinfo->satadrv_addr.qual == SATA_ADDR_PMPORT) {
7536
7537 /*
7538 * Get the pmult_info of the its parent port multiplier, all
7539 * sub-devices share a common device reset flags on in
7540 * pmult_info.
7541 */
7542 pminfo = SATA_PMULT_INFO(sata_hba_inst, cport);
7543 pmportinfo = pminfo->pmult_dev_port[pmport];
7544 ASSERT(pminfo != NULL);
7545 if (pminfo->pmult_event_flags & SATA_EVNT_CLEAR_DEVICE_RESET) {
7546 spx->txlt_sata_pkt->satapkt_cmd.satacmd_flags.
7547 sata_clear_dev_reset = B_TRUE;
7548 pminfo->pmult_event_flags &=
7549 ~SATA_EVNT_CLEAR_DEVICE_RESET;
7550 SATADBG1(SATA_DBG_EVENTS, sata_hba_inst,
7551 "sata_hba_start: clearing device reset state"
7552 "on pmult.\n", NULL);
7553 }
7554 } else {
7555 if (sdinfo->satadrv_event_flags &
7556 SATA_EVNT_CLEAR_DEVICE_RESET) {
7557 spx->txlt_sata_pkt->satapkt_cmd.satacmd_flags.
7558 sata_clear_dev_reset = B_TRUE;
7559 sdinfo->satadrv_event_flags &=
7560 ~SATA_EVNT_CLEAR_DEVICE_RESET;
7561 SATADBG1(SATA_DBG_EVENTS, sata_hba_inst,
7562 "sata_hba_start: clearing device reset state\n",
7563 NULL);
7564 }
7565 }
7566
7567 cmd = spx->txlt_sata_pkt->satapkt_cmd.satacmd_cmd_reg;
7568 cmd_flags = spx->txlt_sata_pkt->satapkt_cmd.satacmd_flags;
7569 sata_device = &spx->txlt_sata_pkt->satapkt_device;
7570
7571 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst, cport)));
7572
7573 SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
7574 "Sata cmd 0x%2x\n", cmd);
7575
7576 stat = (*SATA_START_FUNC(sata_hba_inst))(SATA_DIP(sata_hba_inst),
7577 spx->txlt_sata_pkt);
7578 mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst, cport)));
7579 /*
7580 * If sata pkt was accepted and executed in asynchronous mode, i.e.
7581 * with the sata callback, the sata_pkt could be already destroyed
7582 * by the time we check ther return status from the hba_start()
7583 * function, because sata_scsi_destroy_pkt() could have been already
7584 * called (perhaps in the interrupt context). So, in such case, there
7585 * should be no references to it. In other cases, sata_pkt still
7586 * exists.
7587 */
7588 if (stat == SATA_TRAN_ACCEPTED) {
7589 /*
7590 * pkt accepted for execution.
7591 * If it was executed synchronously, it is already completed
7592 * and pkt completion_reason indicates completion status.
7593 */
7594 *rval = TRAN_ACCEPT;
7595 return (0);
7596 }
7597
7598 sdinfo = sata_get_device_info(sata_hba_inst, sata_device);
7599 switch (stat) {
7600 case SATA_TRAN_QUEUE_FULL:
7601 /*
7602 * Controller detected queue full condition.
7603 */
7604 SATADBG1(SATA_DBG_HBA_IF, sata_hba_inst,
7605 "sata_hba_start: queue full\n", NULL);
7606
7607 spx->txlt_scsi_pkt->pkt_reason = CMD_INCOMPLETE;
7608 *spx->txlt_scsi_pkt->pkt_scbp = STATUS_QFULL;
7609
7610 *rval = TRAN_BUSY;
7611 break;
7612
7613 case SATA_TRAN_PORT_ERROR:
7614 /*
7615 * Communication/link with device or general port error
7616 * detected before pkt execution begun.
7617 */
7618 if (spx->txlt_sata_pkt->satapkt_device.satadev_addr.qual ==
7619 SATA_ADDR_CPORT ||
7620 spx->txlt_sata_pkt->satapkt_device.satadev_addr.qual ==
7621 SATA_ADDR_DCPORT)
7622 sata_log(sata_hba_inst, CE_CONT,
7623 "SATA port %d error",
7624 sata_device->satadev_addr.cport);
7625 else
7626 sata_log(sata_hba_inst, CE_CONT,
7627 "SATA port %d:%d error\n",
7628 sata_device->satadev_addr.cport,
7629 sata_device->satadev_addr.pmport);
7630
7631 /*
7632 * Update the port/device structure.
7633 * sata_pkt should be still valid. Since port error is
7634 * returned, sata_device content should reflect port
7635 * state - it means, that sata address have been changed,
7636 * because original packet's sata address refered to a device
7637 * attached to some port.
7638 */
7639 if (sata_device->satadev_addr.qual == SATA_ADDR_DPMPORT ||
7640 sata_device->satadev_addr.qual == SATA_ADDR_PMPORT) {
7641 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst, cport)));
7642 mutex_enter(&pmportinfo->pmport_mutex);
7643 sata_update_pmport_info(sata_hba_inst, sata_device);
7644 mutex_exit(&pmportinfo->pmport_mutex);
7645 mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst, cport)));
7646 } else {
7647 sata_update_port_info(sata_hba_inst, sata_device);
7648 }
7649
7650 spx->txlt_scsi_pkt->pkt_reason = CMD_TRAN_ERR;
7651 *rval = TRAN_FATAL_ERROR;
7652 break;
7653
7654 case SATA_TRAN_CMD_UNSUPPORTED:
7655 /*
7656 * Command rejected by HBA as unsupported. It was HBA driver
7657 * that rejected the command, command was not sent to
7658 * an attached device.
7659 */
7660 if ((sdinfo != NULL) &&
7661 (sdinfo->satadrv_state & SATA_DSTATE_RESET))
7662 SATADBG1(SATA_DBG_EVENTS, sata_hba_inst,
7663 "sat_hba_start: cmd 0x%2x rejected "
7664 "with SATA_TRAN_CMD_UNSUPPORTED status\n", cmd);
7665
7666 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst, cport)));
7667 (void) sata_txlt_invalid_command(spx);
7668 mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst, cport)));
7669
7670 *rval = TRAN_ACCEPT;
7671 break;
7672
7673 case SATA_TRAN_BUSY:
7674 /*
7675 * Command rejected by HBA because other operation prevents
7676 * accepting the packet, or device is in RESET condition.
7677 */
7678 if (sdinfo != NULL) {
7679 sdinfo->satadrv_state =
7680 spx->txlt_sata_pkt->satapkt_device.satadev_state;
7681
7682 if (sdinfo->satadrv_state & SATA_DSTATE_RESET) {
7683 SATADBG1(SATA_DBG_EVENTS, sata_hba_inst,
7684 "sata_hba_start: cmd 0x%2x rejected "
7685 "because of device reset condition\n",
7686 cmd);
7687 } else {
7688 SATADBG1(SATA_DBG_EVENTS, sata_hba_inst,
7689 "sata_hba_start: cmd 0x%2x rejected "
7690 "with SATA_TRAN_BUSY status\n",
7691 cmd);
7692 }
7693 }
7694 spx->txlt_scsi_pkt->pkt_reason = CMD_INCOMPLETE;
7695 *rval = TRAN_BUSY;
7696 break;
7697
7698 default:
7699 /* Unrecognized HBA response */
7700 SATA_LOG_D((sata_hba_inst, CE_WARN,
7701 "sata_hba_start: unrecognized HBA response "
7702 "to cmd : 0x%2x resp 0x%x", cmd, rval));
7703 spx->txlt_scsi_pkt->pkt_reason = CMD_TRAN_ERR;
7704 *rval = TRAN_FATAL_ERROR;
7705 break;
7706 }
7707
7708 /*
7709 * If we got here, the packet was rejected.
7710 * Check if we need to remember reset state clearing request
7711 */
7712 if (cmd_flags.sata_clear_dev_reset) {
7713 /*
7714 * Check if device is still configured - it may have
7715 * disapeared from the configuration
7716 */
7717 sdinfo = sata_get_device_info(sata_hba_inst, sata_device);
7718 if (sdinfo != NULL) {
7719 /*
7720 * Restore the flag that requests clearing of
7721 * the device reset state,
7722 * so the next sata packet may carry it to HBA.
7723 */
7724 if (sdinfo->satadrv_addr.qual == SATA_ADDR_PMPORT ||
7725 sdinfo->satadrv_addr.qual == SATA_ADDR_DPMPORT) {
7726 pminfo->pmult_event_flags |=
7727 SATA_EVNT_CLEAR_DEVICE_RESET;
7728 } else {
7729 sdinfo->satadrv_event_flags |=
7730 SATA_EVNT_CLEAR_DEVICE_RESET;
7731 }
7732 }
7733 }
7734 return (-1);
7735 }
7736
7737 /*
7738 * Scsi response setup for invalid LBA
7739 *
7740 * Returns TRAN_ACCEPT and appropriate values in scsi_pkt fields.
7741 */
7742 static int
sata_txlt_lba_out_of_range(sata_pkt_txlate_t * spx)7743 sata_txlt_lba_out_of_range(sata_pkt_txlate_t *spx)
7744 {
7745 struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
7746 struct scsi_extended_sense *sense;
7747
7748 scsipkt->pkt_reason = CMD_CMPLT;
7749 scsipkt->pkt_state = STATE_GOT_BUS | STATE_GOT_TARGET |
7750 STATE_SENT_CMD | STATE_GOT_STATUS;
7751 *scsipkt->pkt_scbp = STATUS_CHECK;
7752
7753 *scsipkt->pkt_scbp = STATUS_CHECK;
7754 sense = sata_arq_sense(spx);
7755 sense->es_key = KEY_ILLEGAL_REQUEST;
7756 sense->es_add_code = SD_SCSI_ASC_LBA_OUT_OF_RANGE;
7757
7758 SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
7759 "Scsi_pkt completion reason %x\n", scsipkt->pkt_reason);
7760
7761 if ((scsipkt->pkt_flags & FLAG_NOINTR) == 0 &&
7762 scsipkt->pkt_comp != NULL) {
7763 /* scsi callback required */
7764 if (servicing_interrupt()) {
7765 if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
7766 (task_func_t *)spx->txlt_scsi_pkt->pkt_comp,
7767 (void *)spx->txlt_scsi_pkt, TQ_NOSLEEP) ==
7768 TASKQID_INVALID) {
7769 return (TRAN_BUSY);
7770 }
7771 } else if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
7772 (task_func_t *)spx->txlt_scsi_pkt->pkt_comp,
7773 (void *)spx->txlt_scsi_pkt, TQ_SLEEP) == TASKQID_INVALID) {
7774 /* Scheduling the callback failed */
7775 return (TRAN_BUSY);
7776 }
7777 }
7778 return (TRAN_ACCEPT);
7779 }
7780
7781
7782 /*
7783 * Analyze device status and error registers and translate them into
7784 * appropriate scsi sense codes.
7785 * NOTE: non-packet commands only for now
7786 */
7787 static void
sata_decode_device_error(sata_pkt_txlate_t * spx,struct scsi_extended_sense * sense)7788 sata_decode_device_error(sata_pkt_txlate_t *spx,
7789 struct scsi_extended_sense *sense)
7790 {
7791 uint8_t err_reg = spx->txlt_sata_pkt->satapkt_cmd.satacmd_error_reg;
7792
7793 ASSERT(sense != NULL);
7794 ASSERT(spx->txlt_sata_pkt->satapkt_cmd.satacmd_status_reg &
7795 SATA_STATUS_ERR);
7796
7797
7798 if (err_reg & SATA_ERROR_ICRC) {
7799 sense->es_key = KEY_ABORTED_COMMAND;
7800 sense->es_add_code = 0x08; /* Communication failure */
7801 return;
7802 }
7803
7804 if (err_reg & SATA_ERROR_UNC) {
7805 sense->es_key = KEY_MEDIUM_ERROR;
7806 /* Information bytes (LBA) need to be set by a caller */
7807 return;
7808 }
7809
7810 /* ADD HERE: MC error bit handling for ATAPI CD/DVD */
7811 if (err_reg & (SATA_ERROR_MCR | SATA_ERROR_NM)) {
7812 sense->es_key = KEY_UNIT_ATTENTION;
7813 sense->es_add_code = 0x3a; /* No media present */
7814 return;
7815 }
7816
7817 if (err_reg & SATA_ERROR_IDNF) {
7818 if (err_reg & SATA_ERROR_ABORT) {
7819 sense->es_key = KEY_ABORTED_COMMAND;
7820 } else {
7821 sense->es_key = KEY_ILLEGAL_REQUEST;
7822 sense->es_add_code = 0x21; /* LBA out of range */
7823 }
7824 return;
7825 }
7826
7827 if (err_reg & SATA_ERROR_ABORT) {
7828 ASSERT(spx->txlt_sata_pkt != NULL);
7829 sense->es_key = KEY_ABORTED_COMMAND;
7830 return;
7831 }
7832 }
7833
7834 /*
7835 * Extract error LBA from sata_pkt.satapkt_cmd register fields
7836 */
7837 static void
sata_extract_error_lba(sata_pkt_txlate_t * spx,uint64_t * lba)7838 sata_extract_error_lba(sata_pkt_txlate_t *spx, uint64_t *lba)
7839 {
7840 sata_cmd_t *sata_cmd = &spx->txlt_sata_pkt->satapkt_cmd;
7841
7842 *lba = 0;
7843 if (sata_cmd->satacmd_addr_type == ATA_ADDR_LBA48) {
7844 *lba = sata_cmd->satacmd_lba_high_msb;
7845 *lba = (*lba << 8) | sata_cmd->satacmd_lba_mid_msb;
7846 *lba = (*lba << 8) | sata_cmd->satacmd_lba_low_msb;
7847 } else if (sata_cmd->satacmd_addr_type == ATA_ADDR_LBA28) {
7848 *lba = sata_cmd->satacmd_device_reg & 0xf;
7849 }
7850 *lba = (*lba << 8) | sata_cmd->satacmd_lba_high_lsb;
7851 *lba = (*lba << 8) | sata_cmd->satacmd_lba_mid_lsb;
7852 *lba = (*lba << 8) | sata_cmd->satacmd_lba_low_lsb;
7853 }
7854
7855 /*
7856 * This is fixed sense format - if LBA exceeds the info field size,
7857 * no valid info will be returned (valid bit in extended sense will
7858 * be set to 0).
7859 */
7860 static struct scsi_extended_sense *
sata_arq_sense(sata_pkt_txlate_t * spx)7861 sata_arq_sense(sata_pkt_txlate_t *spx)
7862 {
7863 struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
7864 struct scsi_arq_status *arqs;
7865 struct scsi_extended_sense *sense;
7866
7867 /* Fill ARQ sense data */
7868 scsipkt->pkt_state |= STATE_ARQ_DONE;
7869 arqs = (struct scsi_arq_status *)scsipkt->pkt_scbp;
7870 *(uchar_t *)&arqs->sts_status = STATUS_CHECK;
7871 *(uchar_t *)&arqs->sts_rqpkt_status = STATUS_GOOD;
7872 arqs->sts_rqpkt_reason = CMD_CMPLT;
7873 arqs->sts_rqpkt_state = STATE_GOT_BUS | STATE_GOT_TARGET |
7874 STATE_XFERRED_DATA | STATE_SENT_CMD | STATE_GOT_STATUS;
7875 arqs->sts_rqpkt_resid = 0;
7876 sense = &arqs->sts_sensedata;
7877 bzero(sense, sizeof (struct scsi_extended_sense));
7878 sata_fixed_sense_data_preset(sense);
7879 return (sense);
7880 }
7881
7882 /*
7883 * ATA Pass Through support
7884 * Sets flags indicating that an invalid value was found in some
7885 * field in the command. It could be something illegal according to
7886 * the SAT-2 spec or it could be a feature that is not (yet?)
7887 * supported.
7888 */
7889 static int
sata_txlt_ata_pass_thru_illegal_cmd(sata_pkt_txlate_t * spx)7890 sata_txlt_ata_pass_thru_illegal_cmd(sata_pkt_txlate_t *spx)
7891 {
7892 struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
7893 struct scsi_extended_sense *sense = sata_arq_sense(spx);
7894
7895 scsipkt->pkt_reason = CMD_CMPLT;
7896 *scsipkt->pkt_scbp = STATUS_CHECK;
7897 scsipkt->pkt_state = STATE_GOT_BUS | STATE_GOT_TARGET |
7898 STATE_SENT_CMD | STATE_GOT_STATUS;
7899
7900 sense = sata_arq_sense(spx);
7901 sense->es_key = KEY_ILLEGAL_REQUEST;
7902 sense->es_add_code = SD_SCSI_ASC_INVALID_FIELD_IN_CDB;
7903
7904 if ((scsipkt->pkt_flags & FLAG_NOINTR) == 0 &&
7905 scsipkt->pkt_comp != NULL) {
7906 /* scsi callback required */
7907 if (servicing_interrupt()) {
7908 if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
7909 (task_func_t *)spx->txlt_scsi_pkt->pkt_comp,
7910 (void *)spx->txlt_scsi_pkt, TQ_NOSLEEP) ==
7911 TASKQID_INVALID) {
7912 return (TRAN_BUSY);
7913 }
7914 } else if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
7915 (task_func_t *)spx->txlt_scsi_pkt->pkt_comp,
7916 (void *)spx->txlt_scsi_pkt, TQ_SLEEP) == TASKQID_INVALID) {
7917 /* Scheduling the callback failed */
7918 return (TRAN_BUSY);
7919 }
7920 }
7921
7922 return (TRAN_ACCEPT);
7923 }
7924
7925 /*
7926 * The UNMAP command considers it not to be an error if the parameter length
7927 * or block descriptor length is 0. For this case, there is nothing for TRIM
7928 * to do so just complete the command.
7929 */
7930 static int
sata_txlt_unmap_nodata_cmd(sata_pkt_txlate_t * spx)7931 sata_txlt_unmap_nodata_cmd(sata_pkt_txlate_t *spx)
7932 {
7933 struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
7934
7935 scsipkt->pkt_reason = CMD_CMPLT;
7936 *scsipkt->pkt_scbp = STATUS_GOOD;
7937 scsipkt->pkt_state = STATE_GOT_BUS | STATE_GOT_TARGET |
7938 STATE_SENT_CMD | STATE_GOT_STATUS;
7939
7940 if ((scsipkt->pkt_flags & FLAG_NOINTR) == 0 &&
7941 scsipkt->pkt_comp != NULL) {
7942 /* scsi callback required */
7943 if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
7944 (task_func_t *)spx->txlt_scsi_pkt->pkt_comp,
7945 (void *)spx->txlt_scsi_pkt, TQ_SLEEP) == TASKQID_INVALID) {
7946 /* Scheduling the callback failed */
7947 return (TRAN_BUSY);
7948 }
7949 }
7950
7951 return (TRAN_ACCEPT);
7952 }
7953
7954 /*
7955 * Emulated SATA Read/Write command completion for zero-length requests.
7956 * This request always succedes, so in synchronous mode it always returns
7957 * TRAN_ACCEPT, and in non-synchronous mode it may return TRAN_BUSY if the
7958 * callback cannot be scheduled.
7959 */
7960 static int
sata_emul_rw_completion(sata_pkt_txlate_t * spx)7961 sata_emul_rw_completion(sata_pkt_txlate_t *spx)
7962 {
7963 struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
7964
7965 scsipkt->pkt_state = STATE_GOT_BUS | STATE_GOT_TARGET |
7966 STATE_SENT_CMD | STATE_GOT_STATUS;
7967 scsipkt->pkt_reason = CMD_CMPLT;
7968 *scsipkt->pkt_scbp = STATUS_GOOD;
7969 if (!(spx->txlt_sata_pkt->satapkt_op_mode & SATA_OPMODE_SYNCH)) {
7970 /* scsi callback required - have to schedule it */
7971 if (servicing_interrupt()) {
7972 if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
7973 (task_func_t *)spx->txlt_scsi_pkt->pkt_comp,
7974 (void *)spx->txlt_scsi_pkt, TQ_NOSLEEP) ==
7975 TASKQID_INVALID) {
7976 return (TRAN_BUSY);
7977 }
7978 } else if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
7979 (task_func_t *)spx->txlt_scsi_pkt->pkt_comp,
7980 (void *)spx->txlt_scsi_pkt, TQ_SLEEP) == TASKQID_INVALID) {
7981 /* Scheduling the callback failed */
7982 return (TRAN_BUSY);
7983 }
7984 }
7985 return (TRAN_ACCEPT);
7986 }
7987
7988
7989 /*
7990 * Translate completion status of SATA read/write commands into scsi response.
7991 * pkt completion_reason is checked to determine the completion status.
7992 * Do scsi callback if necessary.
7993 *
7994 * Note: this function may be called also for synchronously executed
7995 * commands.
7996 * This function may be used only if scsi_pkt is non-NULL.
7997 */
7998 static void
sata_txlt_rw_completion(sata_pkt_t * sata_pkt)7999 sata_txlt_rw_completion(sata_pkt_t *sata_pkt)
8000 {
8001 sata_pkt_txlate_t *spx =
8002 (sata_pkt_txlate_t *)sata_pkt->satapkt_framework_private;
8003 sata_cmd_t *scmd = &sata_pkt->satapkt_cmd;
8004 struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
8005 struct scsi_extended_sense *sense;
8006 uint64_t lba;
8007 struct buf *bp;
8008 int rval;
8009 if (sata_pkt->satapkt_reason == SATA_PKT_COMPLETED) {
8010 /* Normal completion */
8011 scsipkt->pkt_state = STATE_GOT_BUS | STATE_GOT_TARGET |
8012 STATE_SENT_CMD | STATE_XFERRED_DATA | STATE_GOT_STATUS;
8013 scsipkt->pkt_reason = CMD_CMPLT;
8014 *scsipkt->pkt_scbp = STATUS_GOOD;
8015 if (spx->txlt_tmp_buf != NULL) {
8016 /* Temporary buffer was used */
8017 bp = spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp;
8018 if (bp->b_flags & B_READ) {
8019 rval = ddi_dma_sync(
8020 spx->txlt_buf_dma_handle, 0, 0,
8021 DDI_DMA_SYNC_FORCPU);
8022 ASSERT(rval == DDI_SUCCESS);
8023 bcopy(spx->txlt_tmp_buf, bp->b_un.b_addr,
8024 bp->b_bcount);
8025 }
8026 }
8027 } else {
8028 /*
8029 * Something went wrong - analyze return
8030 */
8031 scsipkt->pkt_state = STATE_GOT_BUS | STATE_GOT_TARGET |
8032 STATE_SENT_CMD | STATE_GOT_STATUS;
8033 scsipkt->pkt_reason = CMD_INCOMPLETE;
8034 *scsipkt->pkt_scbp = STATUS_CHECK;
8035 sense = sata_arq_sense(spx);
8036 ASSERT(sense != NULL);
8037
8038 /*
8039 * SATA_PKT_DEV_ERROR is the only case where we may be able to
8040 * extract from device registers the failing LBA.
8041 */
8042 if (sata_pkt->satapkt_reason == SATA_PKT_DEV_ERROR) {
8043 if ((scmd->satacmd_addr_type == ATA_ADDR_LBA48) &&
8044 (scmd->satacmd_lba_mid_msb != 0 ||
8045 scmd->satacmd_lba_high_msb != 0)) {
8046 /*
8047 * We have problem reporting this cmd LBA
8048 * in fixed sense data format, because of
8049 * the size of the scsi LBA fields.
8050 */
8051 sense->es_valid = 0;
8052 } else {
8053 sata_extract_error_lba(spx, &lba);
8054 sense->es_info_1 = (lba & 0xFF000000) >> 24;
8055 sense->es_info_2 = (lba & 0xFF0000) >> 16;
8056 sense->es_info_3 = (lba & 0xFF00) >> 8;
8057 sense->es_info_4 = lba & 0xFF;
8058 }
8059 } else {
8060 /* Invalid extended sense info */
8061 sense->es_valid = 0;
8062 }
8063
8064 switch (sata_pkt->satapkt_reason) {
8065 case SATA_PKT_PORT_ERROR:
8066 /* We may want to handle DEV GONE state as well */
8067 /*
8068 * We have no device data. Assume no data transfered.
8069 */
8070 sense->es_key = KEY_HARDWARE_ERROR;
8071 break;
8072
8073 case SATA_PKT_DEV_ERROR:
8074 if (sata_pkt->satapkt_cmd.satacmd_status_reg &
8075 SATA_STATUS_ERR) {
8076 /*
8077 * determine dev error reason from error
8078 * reg content
8079 */
8080 sata_decode_device_error(spx, sense);
8081 if (sense->es_key == KEY_MEDIUM_ERROR) {
8082 switch (scmd->satacmd_cmd_reg) {
8083 case SATAC_READ_DMA:
8084 case SATAC_READ_DMA_EXT:
8085 case SATAC_READ_DMA_QUEUED:
8086 case SATAC_READ_DMA_QUEUED_EXT:
8087 case SATAC_READ_FPDMA_QUEUED:
8088 /* Unrecovered read error */
8089 sense->es_add_code =
8090 SD_SCSI_ASC_UNREC_READ_ERR;
8091 break;
8092 case SATAC_WRITE_DMA:
8093 case SATAC_WRITE_DMA_EXT:
8094 case SATAC_WRITE_DMA_QUEUED:
8095 case SATAC_WRITE_DMA_QUEUED_EXT:
8096 case SATAC_WRITE_FPDMA_QUEUED:
8097 /* Write error */
8098 sense->es_add_code =
8099 SD_SCSI_ASC_WRITE_ERR;
8100 break;
8101 default:
8102 /* Internal error */
8103 SATA_LOG_D((
8104 spx->txlt_sata_hba_inst,
8105 CE_WARN,
8106 "sata_txlt_rw_completion :"
8107 "internal error - invalid "
8108 "command 0x%2x",
8109 scmd->satacmd_cmd_reg));
8110 break;
8111 }
8112 }
8113 break;
8114 }
8115 /* No extended sense key - no info available */
8116 scsipkt->pkt_reason = CMD_INCOMPLETE;
8117 break;
8118
8119 case SATA_PKT_TIMEOUT:
8120 scsipkt->pkt_reason = CMD_TIMEOUT;
8121 scsipkt->pkt_statistics |=
8122 STAT_TIMEOUT | STAT_DEV_RESET;
8123 sense->es_key = KEY_ABORTED_COMMAND;
8124 break;
8125
8126 case SATA_PKT_ABORTED:
8127 scsipkt->pkt_reason = CMD_ABORTED;
8128 scsipkt->pkt_statistics |= STAT_ABORTED;
8129 sense->es_key = KEY_ABORTED_COMMAND;
8130 break;
8131
8132 case SATA_PKT_RESET:
8133 scsipkt->pkt_reason = CMD_RESET;
8134 scsipkt->pkt_statistics |= STAT_DEV_RESET;
8135 sense->es_key = KEY_ABORTED_COMMAND;
8136 break;
8137
8138 default:
8139 SATA_LOG_D((spx->txlt_sata_hba_inst, CE_WARN,
8140 "sata_txlt_rw_completion: "
8141 "invalid packet completion reason"));
8142 scsipkt->pkt_reason = CMD_TRAN_ERR;
8143 break;
8144 }
8145 }
8146 SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
8147 "Scsi_pkt completion reason %x\n", scsipkt->pkt_reason);
8148
8149 if ((scsipkt->pkt_flags & FLAG_NOINTR) == 0)
8150 /* scsi callback required */
8151 scsi_hba_pkt_comp(scsipkt);
8152 }
8153
8154
8155 /*
8156 * Translate completion status of non-data commands (i.e. commands returning
8157 * no data).
8158 * pkt completion_reason is checked to determine the completion status.
8159 * Do scsi callback if necessary (FLAG_NOINTR == 0)
8160 *
8161 * Note: this function may be called also for synchronously executed
8162 * commands.
8163 * This function may be used only if scsi_pkt is non-NULL.
8164 */
8165
8166 static void
sata_txlt_nodata_cmd_completion(sata_pkt_t * sata_pkt)8167 sata_txlt_nodata_cmd_completion(sata_pkt_t *sata_pkt)
8168 {
8169 sata_pkt_txlate_t *spx =
8170 (sata_pkt_txlate_t *)sata_pkt->satapkt_framework_private;
8171 struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
8172
8173 sata_set_arq_data(sata_pkt);
8174
8175 if ((scsipkt->pkt_flags & FLAG_NOINTR) == 0)
8176 /* scsi callback required */
8177 scsi_hba_pkt_comp(scsipkt);
8178 }
8179
8180 /*
8181 * Completion handler for ATA Pass Through command
8182 */
8183 static void
sata_txlt_apt_completion(sata_pkt_t * sata_pkt)8184 sata_txlt_apt_completion(sata_pkt_t *sata_pkt)
8185 {
8186 sata_pkt_txlate_t *spx =
8187 (sata_pkt_txlate_t *)sata_pkt->satapkt_framework_private;
8188 sata_cmd_t *scmd = &sata_pkt->satapkt_cmd;
8189 struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
8190 struct buf *bp;
8191 uint8_t sense_key = 0, addl_sense_code = 0, addl_sense_qual = 0;
8192
8193 if (sata_pkt->satapkt_reason == SATA_PKT_COMPLETED) {
8194 /* Normal completion */
8195 scsipkt->pkt_state = STATE_GOT_BUS | STATE_GOT_TARGET |
8196 STATE_SENT_CMD | STATE_XFERRED_DATA | STATE_GOT_STATUS;
8197 scsipkt->pkt_reason = CMD_CMPLT;
8198 *scsipkt->pkt_scbp = STATUS_GOOD;
8199
8200 /*
8201 * If the command has CK_COND set
8202 */
8203 if (scsipkt->pkt_cdbp[2] & SATL_APT_BM_CK_COND) {
8204 *scsipkt->pkt_scbp = STATUS_CHECK;
8205 sata_fill_ata_return_desc(sata_pkt,
8206 KEY_RECOVERABLE_ERROR,
8207 SD_SCSI_ASC_APT_INFO_AVAIL, 0x1d);
8208 }
8209
8210 if (spx->txlt_tmp_buf != NULL) {
8211 /* Temporary buffer was used */
8212 bp = spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp;
8213 if (bp->b_flags & B_READ) {
8214 bcopy(spx->txlt_tmp_buf, bp->b_un.b_addr,
8215 bp->b_bcount);
8216 }
8217 }
8218 } else {
8219 scsipkt->pkt_state = STATE_GOT_BUS | STATE_GOT_TARGET |
8220 STATE_SENT_CMD | STATE_GOT_STATUS;
8221 scsipkt->pkt_reason = CMD_INCOMPLETE;
8222 *scsipkt->pkt_scbp = STATUS_CHECK;
8223
8224 /*
8225 * If DF or ERR was set, the HBA should have copied out the
8226 * status and error registers to the satacmd structure.
8227 */
8228 if (scmd->satacmd_status_reg & SATA_STATUS_DF) {
8229 sense_key = KEY_HARDWARE_ERROR;
8230 addl_sense_code = SD_SCSI_ASC_INTERNAL_TARGET_FAILURE;
8231 addl_sense_qual = 0;
8232 } else if (scmd->satacmd_status_reg & SATA_STATUS_ERR) {
8233 if (scmd->satacmd_error_reg & SATA_ERROR_NM) {
8234 sense_key = KEY_NOT_READY;
8235 addl_sense_code =
8236 SD_SCSI_ASC_MEDIUM_NOT_PRESENT;
8237 addl_sense_qual = 0;
8238 } else if (scmd->satacmd_error_reg & SATA_ERROR_UNC) {
8239 sense_key = KEY_MEDIUM_ERROR;
8240 addl_sense_code = SD_SCSI_ASC_UNREC_READ_ERR;
8241 addl_sense_qual = 0;
8242 } else if (scmd->satacmd_error_reg & SATA_ERROR_ILI) {
8243 sense_key = KEY_DATA_PROTECT;
8244 addl_sense_code = SD_SCSI_ASC_WRITE_PROTECTED;
8245 addl_sense_qual = 0;
8246 } else if (scmd->satacmd_error_reg & SATA_ERROR_IDNF) {
8247 sense_key = KEY_ILLEGAL_REQUEST;
8248 addl_sense_code = SD_SCSI_ASC_LBA_OUT_OF_RANGE;
8249 addl_sense_qual = 0;
8250 } else if (scmd->satacmd_error_reg & SATA_ERROR_ABORT) {
8251 sense_key = KEY_ABORTED_COMMAND;
8252 addl_sense_code = SD_SCSI_ASC_NO_ADD_SENSE;
8253 addl_sense_qual = 0;
8254 } else if (scmd->satacmd_error_reg & SATA_ERROR_MC) {
8255 sense_key = KEY_UNIT_ATTENTION;
8256 addl_sense_code =
8257 SD_SCSI_ASC_MEDIUM_MAY_HAVE_CHANGED;
8258 addl_sense_qual = 0;
8259 } else if (scmd->satacmd_error_reg & SATA_ERROR_MCR) {
8260 sense_key = KEY_UNIT_ATTENTION;
8261 addl_sense_code = SD_SCSI_ASC_OP_MEDIUM_REM_REQ;
8262 addl_sense_qual = 0;
8263 } else if (scmd->satacmd_error_reg & SATA_ERROR_ICRC) {
8264 sense_key = KEY_ABORTED_COMMAND;
8265 addl_sense_code =
8266 SD_SCSI_ASC_INFO_UNIT_IUCRC_ERR;
8267 addl_sense_qual = 0;
8268 }
8269 }
8270
8271 sata_fill_ata_return_desc(sata_pkt, sense_key, addl_sense_code,
8272 addl_sense_qual);
8273 }
8274
8275 if ((scsipkt->pkt_flags & FLAG_NOINTR) == 0)
8276 /* scsi callback required */
8277 scsi_hba_pkt_comp(scsipkt);
8278 }
8279
8280 /*
8281 * Completion handler for unmap translation command
8282 */
8283 static void
sata_txlt_unmap_completion(sata_pkt_t * sata_pkt)8284 sata_txlt_unmap_completion(sata_pkt_t *sata_pkt)
8285 {
8286 sata_pkt_txlate_t *spx =
8287 (sata_pkt_txlate_t *)sata_pkt->satapkt_framework_private;
8288 sata_cmd_t *scmd = &sata_pkt->satapkt_cmd;
8289 struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
8290 struct buf *bp;
8291 uint8_t sense_key = 0, addl_sense_code = 0, addl_sense_qual = 0;
8292
8293 if (sata_pkt->satapkt_reason == SATA_PKT_COMPLETED) {
8294 /* Normal completion */
8295 scsipkt->pkt_state = STATE_GOT_BUS | STATE_GOT_TARGET |
8296 STATE_SENT_CMD | STATE_XFERRED_DATA | STATE_GOT_STATUS;
8297 scsipkt->pkt_reason = CMD_CMPLT;
8298 *scsipkt->pkt_scbp = STATUS_GOOD;
8299
8300 if (spx->txlt_tmp_buf != NULL) {
8301 /* Temporary buffer was used */
8302 bp = spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp;
8303 if (bp->b_flags & B_READ) {
8304 bcopy(spx->txlt_tmp_buf, bp->b_un.b_addr,
8305 bp->b_bcount);
8306 }
8307 }
8308 } else {
8309 scsipkt->pkt_state = STATE_GOT_BUS | STATE_GOT_TARGET |
8310 STATE_SENT_CMD | STATE_GOT_STATUS;
8311 scsipkt->pkt_reason = CMD_INCOMPLETE;
8312 *scsipkt->pkt_scbp = STATUS_CHECK;
8313
8314 /*
8315 * If DF or ERR was set, the HBA should have copied out the
8316 * status and error registers to the satacmd structure.
8317 */
8318 if (scmd->satacmd_status_reg & SATA_STATUS_DF) {
8319 sense_key = KEY_HARDWARE_ERROR;
8320 addl_sense_code = SD_SCSI_ASC_INTERNAL_TARGET_FAILURE;
8321 addl_sense_qual = 0;
8322 } else if (scmd->satacmd_status_reg & SATA_STATUS_ERR) {
8323 if (scmd->satacmd_error_reg & SATA_ERROR_NM) {
8324 sense_key = KEY_NOT_READY;
8325 addl_sense_code =
8326 SD_SCSI_ASC_MEDIUM_NOT_PRESENT;
8327 addl_sense_qual = 0;
8328 } else if (scmd->satacmd_error_reg & SATA_ERROR_UNC) {
8329 sense_key = KEY_MEDIUM_ERROR;
8330 addl_sense_code = SD_SCSI_ASC_WRITE_ERR;
8331 addl_sense_qual = 0;
8332 } else if (scmd->satacmd_error_reg & SATA_ERROR_ILI) {
8333 sense_key = KEY_DATA_PROTECT;
8334 addl_sense_code = SD_SCSI_ASC_WRITE_PROTECTED;
8335 addl_sense_qual = 0;
8336 } else if (scmd->satacmd_error_reg & SATA_ERROR_IDNF) {
8337 sense_key = KEY_ILLEGAL_REQUEST;
8338 addl_sense_code = SD_SCSI_ASC_LBA_OUT_OF_RANGE;
8339 addl_sense_qual = 0;
8340 } else if (scmd->satacmd_error_reg & SATA_ERROR_ABORT) {
8341 sense_key = KEY_ABORTED_COMMAND;
8342 addl_sense_code = SD_SCSI_ASC_NO_ADD_SENSE;
8343 addl_sense_qual = 0;
8344 } else if (scmd->satacmd_error_reg & SATA_ERROR_MC) {
8345 sense_key = KEY_UNIT_ATTENTION;
8346 addl_sense_code =
8347 SD_SCSI_ASC_MEDIUM_MAY_HAVE_CHANGED;
8348 addl_sense_qual = 0;
8349 } else if (scmd->satacmd_error_reg & SATA_ERROR_MCR) {
8350 sense_key = KEY_UNIT_ATTENTION;
8351 addl_sense_code = SD_SCSI_ASC_OP_MEDIUM_REM_REQ;
8352 addl_sense_qual = 0;
8353 } else if (scmd->satacmd_error_reg & SATA_ERROR_ICRC) {
8354 sense_key = KEY_ABORTED_COMMAND;
8355 addl_sense_code =
8356 SD_SCSI_ASC_INFO_UNIT_IUCRC_ERR;
8357 addl_sense_qual = 0;
8358 }
8359 }
8360
8361 sata_fill_ata_return_desc(sata_pkt, sense_key, addl_sense_code,
8362 addl_sense_qual);
8363 }
8364
8365 sata_free_local_buffer(spx);
8366
8367 if ((scsipkt->pkt_flags & FLAG_NOINTR) == 0)
8368 /* scsi callback required */
8369 scsi_hba_pkt_comp(scsipkt);
8370 }
8371
8372 /*
8373 *
8374 */
8375 static void
sata_fill_ata_return_desc(sata_pkt_t * sata_pkt,uint8_t sense_key,uint8_t addl_sense_code,uint8_t addl_sense_qual)8376 sata_fill_ata_return_desc(sata_pkt_t *sata_pkt, uint8_t sense_key,
8377 uint8_t addl_sense_code, uint8_t addl_sense_qual)
8378 {
8379 sata_pkt_txlate_t *spx =
8380 (sata_pkt_txlate_t *)sata_pkt->satapkt_framework_private;
8381 sata_cmd_t *scmd = &sata_pkt->satapkt_cmd;
8382 struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
8383 struct sata_apt_sense_data *apt_sd =
8384 (struct sata_apt_sense_data *)scsipkt->pkt_scbp;
8385 struct scsi_descr_sense_hdr *sds = &(apt_sd->apt_sd_hdr);
8386 struct scsi_ata_status_ret_sense_descr *ata_ret_desc =
8387 &(apt_sd->apt_sd_sense);
8388 int extend = 0;
8389
8390 if ((scsipkt->pkt_cdbp[0] == SPC3_CMD_ATA_COMMAND_PASS_THROUGH16) &&
8391 (scsipkt->pkt_cdbp[2] & SATL_APT_BM_EXTEND))
8392 extend = 1;
8393
8394 scsipkt->pkt_state |= STATE_ARQ_DONE;
8395
8396 /* update the residual count */
8397 *(uchar_t *)&apt_sd->apt_status = STATUS_CHECK;
8398 *(uchar_t *)&apt_sd->apt_rqpkt_status = STATUS_GOOD;
8399 apt_sd->apt_rqpkt_reason = CMD_CMPLT;
8400 apt_sd->apt_rqpkt_state = STATE_GOT_BUS | STATE_GOT_TARGET |
8401 STATE_XFERRED_DATA | STATE_SENT_CMD | STATE_GOT_STATUS;
8402 apt_sd->apt_rqpkt_resid = scsipkt->pkt_scblen -
8403 sizeof (struct sata_apt_sense_data);
8404
8405 /*
8406 * Fill in the Descriptor sense header
8407 */
8408 bzero(sds, sizeof (struct scsi_descr_sense_hdr));
8409 sds->ds_code = CODE_FMT_DESCR_CURRENT;
8410 sds->ds_class = CLASS_EXTENDED_SENSE;
8411 sds->ds_key = sense_key & 0xf;
8412 sds->ds_add_code = addl_sense_code;
8413 sds->ds_qual_code = addl_sense_qual;
8414 sds->ds_addl_sense_length =
8415 sizeof (struct scsi_ata_status_ret_sense_descr);
8416
8417 /*
8418 * Fill in the ATA Return descriptor sense data
8419 */
8420 bzero(ata_ret_desc, sizeof (struct scsi_ata_status_ret_sense_descr));
8421 ata_ret_desc->ars_descr_type = DESCR_ATA_STATUS_RETURN;
8422 ata_ret_desc->ars_addl_length = 0xc;
8423 ata_ret_desc->ars_error = scmd->satacmd_error_reg;
8424 ata_ret_desc->ars_sec_count_lsb = scmd->satacmd_sec_count_lsb;
8425 ata_ret_desc->ars_lba_low_lsb = scmd->satacmd_lba_low_lsb;
8426 ata_ret_desc->ars_lba_mid_lsb = scmd->satacmd_lba_mid_lsb;
8427 ata_ret_desc->ars_lba_high_lsb = scmd->satacmd_lba_high_lsb;
8428 ata_ret_desc->ars_device = scmd->satacmd_device_reg;
8429 ata_ret_desc->ars_status = scmd->satacmd_status_reg;
8430
8431 if (extend == 1) {
8432 ata_ret_desc->ars_extend = 1;
8433 ata_ret_desc->ars_sec_count_msb = scmd->satacmd_sec_count_msb;
8434 ata_ret_desc->ars_lba_low_msb = scmd->satacmd_lba_low_msb;
8435 ata_ret_desc->ars_lba_mid_msb = scmd->satacmd_lba_mid_msb;
8436 ata_ret_desc->ars_lba_high_msb = scmd->satacmd_lba_high_msb;
8437 } else {
8438 ata_ret_desc->ars_extend = 0;
8439 ata_ret_desc->ars_sec_count_msb = 0;
8440 ata_ret_desc->ars_lba_low_msb = 0;
8441 ata_ret_desc->ars_lba_mid_msb = 0;
8442 ata_ret_desc->ars_lba_high_msb = 0;
8443 }
8444 }
8445
8446 static void
sata_set_arq_data(sata_pkt_t * sata_pkt)8447 sata_set_arq_data(sata_pkt_t *sata_pkt)
8448 {
8449 sata_pkt_txlate_t *spx =
8450 (sata_pkt_txlate_t *)sata_pkt->satapkt_framework_private;
8451 struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
8452 struct scsi_extended_sense *sense;
8453
8454 scsipkt->pkt_state = STATE_GOT_BUS | STATE_GOT_TARGET |
8455 STATE_SENT_CMD | STATE_GOT_STATUS;
8456 if (sata_pkt->satapkt_reason == SATA_PKT_COMPLETED) {
8457 /* Normal completion */
8458 scsipkt->pkt_reason = CMD_CMPLT;
8459 *scsipkt->pkt_scbp = STATUS_GOOD;
8460 } else {
8461 /* Something went wrong */
8462 scsipkt->pkt_reason = CMD_INCOMPLETE;
8463 *scsipkt->pkt_scbp = STATUS_CHECK;
8464 sense = sata_arq_sense(spx);
8465 switch (sata_pkt->satapkt_reason) {
8466 case SATA_PKT_PORT_ERROR:
8467 /*
8468 * We have no device data. Assume no data transfered.
8469 */
8470 sense->es_key = KEY_HARDWARE_ERROR;
8471 break;
8472
8473 case SATA_PKT_DEV_ERROR:
8474 if (sata_pkt->satapkt_cmd.satacmd_status_reg &
8475 SATA_STATUS_ERR) {
8476 /*
8477 * determine dev error reason from error
8478 * reg content
8479 */
8480 sata_decode_device_error(spx, sense);
8481 break;
8482 }
8483 /* No extended sense key - no info available */
8484 break;
8485
8486 case SATA_PKT_TIMEOUT:
8487 scsipkt->pkt_reason = CMD_TIMEOUT;
8488 scsipkt->pkt_statistics |=
8489 STAT_TIMEOUT | STAT_DEV_RESET;
8490 /* No extended sense key ? */
8491 break;
8492
8493 case SATA_PKT_ABORTED:
8494 scsipkt->pkt_reason = CMD_ABORTED;
8495 scsipkt->pkt_statistics |= STAT_ABORTED;
8496 /* No extended sense key ? */
8497 break;
8498
8499 case SATA_PKT_RESET:
8500 /* pkt aborted by an explicit reset from a host */
8501 scsipkt->pkt_reason = CMD_RESET;
8502 scsipkt->pkt_statistics |= STAT_DEV_RESET;
8503 break;
8504
8505 default:
8506 SATA_LOG_D((spx->txlt_sata_hba_inst, CE_WARN,
8507 "sata_txlt_nodata_cmd_completion: "
8508 "invalid packet completion reason %d",
8509 sata_pkt->satapkt_reason));
8510 scsipkt->pkt_reason = CMD_TRAN_ERR;
8511 break;
8512 }
8513
8514 }
8515 SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
8516 "Scsi_pkt completion reason %x\n", scsipkt->pkt_reason);
8517 }
8518
8519
8520 /*
8521 * Build Mode sense R/W recovery page
8522 * NOT IMPLEMENTED
8523 */
8524
8525 static int
sata_build_msense_page_1(sata_drive_info_t * sdinfo,int pcntrl,uint8_t * buf)8526 sata_build_msense_page_1(sata_drive_info_t *sdinfo, int pcntrl, uint8_t *buf)
8527 {
8528 #ifndef __lock_lint
8529 _NOTE(ARGUNUSED(sdinfo))
8530 _NOTE(ARGUNUSED(pcntrl))
8531 _NOTE(ARGUNUSED(buf))
8532 #endif
8533 return (0);
8534 }
8535
8536 /*
8537 * Build Mode sense caching page - scsi-3 implementation.
8538 * Page length distinguishes previous format from scsi-3 format.
8539 * buf must have space for 0x12 bytes.
8540 * Only DRA (disable read ahead ) and WCE (write cache enable) are changeable.
8541 *
8542 */
8543 static int
sata_build_msense_page_8(sata_drive_info_t * sdinfo,int pcntrl,uint8_t * buf)8544 sata_build_msense_page_8(sata_drive_info_t *sdinfo, int pcntrl, uint8_t *buf)
8545 {
8546 struct mode_cache_scsi3 *page = (struct mode_cache_scsi3 *)buf;
8547 sata_id_t *sata_id = &sdinfo->satadrv_id;
8548
8549 /*
8550 * Most of the fields are set to 0, being not supported and/or disabled
8551 */
8552 bzero(buf, PAGELENGTH_DAD_MODE_CACHE_SCSI3);
8553
8554 /* Saved paramters not supported */
8555 if (pcntrl == 3)
8556 return (0);
8557 if (pcntrl == 0 || pcntrl == 2) {
8558 /*
8559 * For now treat current and default parameters as same
8560 * That may have to change, if target driver will complain
8561 */
8562 page->mode_page.code = MODEPAGE_CACHING; /* PS = 0 */
8563 page->mode_page.length = PAGELENGTH_DAD_MODE_CACHE_SCSI3;
8564
8565 if (SATA_READ_AHEAD_SUPPORTED(*sata_id) &&
8566 !SATA_READ_AHEAD_ENABLED(*sata_id)) {
8567 page->dra = 1; /* Read Ahead disabled */
8568 page->rcd = 1; /* Read Cache disabled */
8569 }
8570 if (SATA_WRITE_CACHE_SUPPORTED(*sata_id) &&
8571 SATA_WRITE_CACHE_ENABLED(*sata_id))
8572 page->wce = 1; /* Write Cache enabled */
8573 } else {
8574 /* Changeable parameters */
8575 page->mode_page.code = MODEPAGE_CACHING;
8576 page->mode_page.length = PAGELENGTH_DAD_MODE_CACHE_SCSI3;
8577 if (SATA_READ_AHEAD_SUPPORTED(*sata_id)) {
8578 page->dra = 1;
8579 page->rcd = 1;
8580 }
8581 if (SATA_WRITE_CACHE_SUPPORTED(*sata_id))
8582 page->wce = 1;
8583 }
8584 return (PAGELENGTH_DAD_MODE_CACHE_SCSI3 +
8585 sizeof (struct mode_page));
8586 }
8587
8588 /*
8589 * Build Mode sense exception cntrl page
8590 */
8591 static int
sata_build_msense_page_1c(sata_drive_info_t * sdinfo,int pcntrl,uint8_t * buf)8592 sata_build_msense_page_1c(sata_drive_info_t *sdinfo, int pcntrl, uint8_t *buf)
8593 {
8594 struct mode_info_excpt_page *page = (struct mode_info_excpt_page *)buf;
8595 sata_id_t *sata_id = &sdinfo->satadrv_id;
8596
8597 /*
8598 * Most of the fields are set to 0, being not supported and/or disabled
8599 */
8600 bzero(buf, PAGELENGTH_INFO_EXCPT);
8601
8602 page->mode_page.code = MODEPAGE_INFO_EXCPT;
8603 page->mode_page.length = PAGELENGTH_INFO_EXCPT;
8604
8605 /* Indicate that this is page is saveable */
8606 page->mode_page.ps = 1;
8607
8608 /*
8609 * We will return the same data for default, current and saved page.
8610 * The only changeable bit is dexcpt and that bit is required
8611 * by the ATA specification to be preserved across power cycles.
8612 */
8613 if (pcntrl != 1) {
8614 page->dexcpt = !(sata_id->ai_features85 & SATA_SMART_SUPPORTED);
8615 page->mrie = MRIE_ONLY_ON_REQUEST;
8616 }
8617 else
8618 page->dexcpt = 1; /* Only changeable parameter */
8619
8620 return (PAGELENGTH_INFO_EXCPT + sizeof (struct mode_page));
8621 }
8622
8623
8624 static int
sata_build_msense_page_30(sata_drive_info_t * sdinfo,int pcntrl,uint8_t * buf)8625 sata_build_msense_page_30(sata_drive_info_t *sdinfo, int pcntrl, uint8_t *buf)
8626 {
8627 struct mode_acoustic_management *page =
8628 (struct mode_acoustic_management *)buf;
8629 sata_id_t *sata_id = &sdinfo->satadrv_id;
8630
8631 /*
8632 * Most of the fields are set to 0, being not supported and/or disabled
8633 */
8634 bzero(buf, PAGELENGTH_DAD_MODE_ACOUSTIC_MANAGEMENT);
8635
8636 switch (pcntrl) {
8637 case P_CNTRL_DEFAULT:
8638 /* default paramters not supported */
8639 return (0);
8640
8641 case P_CNTRL_CURRENT:
8642 case P_CNTRL_SAVED:
8643 /* Saved and current are supported and are identical */
8644 page->mode_page.code = MODEPAGE_ACOUSTIC_MANAG;
8645 page->mode_page.length =
8646 PAGELENGTH_DAD_MODE_ACOUSTIC_MANAGEMENT;
8647 page->mode_page.ps = 1;
8648
8649 /* Word 83 indicates if feature is supported */
8650 /* If feature is not supported */
8651 if (!(sata_id->ai_cmdset83 & SATA_ACOUSTIC_MGMT)) {
8652 page->acoustic_manag_enable =
8653 ACOUSTIC_DISABLED;
8654 } else {
8655 page->acoustic_manag_enable =
8656 ((sata_id->ai_features86 & SATA_ACOUSTIC_MGMT)
8657 != 0);
8658 /* Word 94 inidicates the value */
8659 #ifdef _LITTLE_ENDIAN
8660 page->acoustic_manag_level =
8661 (uchar_t)sata_id->ai_acoustic;
8662 page->vendor_recommended_value =
8663 sata_id->ai_acoustic >> 8;
8664 #else
8665 page->acoustic_manag_level =
8666 sata_id->ai_acoustic >> 8;
8667 page->vendor_recommended_value =
8668 (uchar_t)sata_id->ai_acoustic;
8669 #endif
8670 }
8671 break;
8672
8673 case P_CNTRL_CHANGEABLE:
8674 page->mode_page.code = MODEPAGE_ACOUSTIC_MANAG;
8675 page->mode_page.length =
8676 PAGELENGTH_DAD_MODE_ACOUSTIC_MANAGEMENT;
8677 page->mode_page.ps = 1;
8678
8679 /* Word 83 indicates if the feature is supported */
8680 if (sata_id->ai_cmdset83 & SATA_ACOUSTIC_MGMT) {
8681 page->acoustic_manag_enable =
8682 ACOUSTIC_ENABLED;
8683 page->acoustic_manag_level = 0xff;
8684 }
8685 break;
8686 }
8687 return (PAGELENGTH_DAD_MODE_ACOUSTIC_MANAGEMENT +
8688 sizeof (struct mode_page));
8689 }
8690
8691
8692 /*
8693 * Build Mode sense power condition page.
8694 */
8695 static int
sata_build_msense_page_1a(sata_drive_info_t * sdinfo,int pcntrl,uint8_t * buf)8696 sata_build_msense_page_1a(sata_drive_info_t *sdinfo, int pcntrl, uint8_t *buf)
8697 {
8698 struct mode_info_power_cond *page = (struct mode_info_power_cond *)buf;
8699 sata_id_t *sata_id = &sdinfo->satadrv_id;
8700
8701 /*
8702 * Most of the fields are set to 0, being not supported and/or disabled
8703 * power condition page length was 0x0a
8704 */
8705 bzero(buf, sizeof (struct mode_info_power_cond));
8706
8707 if (pcntrl == P_CNTRL_DEFAULT) {
8708 /* default paramters not supported */
8709 return (0);
8710 }
8711
8712 page->mode_page.code = MODEPAGE_POWER_COND;
8713 page->mode_page.length = sizeof (struct mode_info_power_cond);
8714
8715 if (sata_id->ai_cap & SATA_STANDBYTIMER) {
8716 page->standby = 1;
8717 bcopy(sdinfo->satadrv_standby_timer, page->standby_cond_timer,
8718 sizeof (uchar_t) * 4);
8719 }
8720
8721 return (sizeof (struct mode_info_power_cond));
8722 }
8723
8724 /*
8725 * Process mode select caching page 8 (scsi3 format only).
8726 * Read Ahead (same as read cache) and Write Cache may be turned on and off
8727 * if these features are supported by the device. If these features are not
8728 * supported, the command will be terminated with STATUS_CHECK.
8729 * This function fails only if the SET FEATURE command sent to
8730 * the device fails. The page format is not verified, assuming that the
8731 * target driver operates correctly - if parameters length is too short,
8732 * we just drop the page.
8733 * Two command may be sent if both Read Cache/Read Ahead and Write Cache
8734 * setting have to be changed.
8735 * SET FEATURE command is executed synchronously, i.e. we wait here until
8736 * it is completed, regardless of the scsi pkt directives.
8737 *
8738 * Note: Mode Select Caching page RCD and DRA bits are tied together, i.e.
8739 * changing DRA will change RCD.
8740 *
8741 * More than one SATA command may be executed to perform operations specified
8742 * by mode select pages. The first error terminates further execution.
8743 * Operations performed successully are not backed-up in such case.
8744 *
8745 * Return SATA_SUCCESS if operation succeeded, SATA_FAILURE otherwise.
8746 * If operation resulted in changing device setup, dmod flag should be set to
8747 * one (1). If parameters were not changed, dmod flag should be set to 0.
8748 * Upon return, if operation required sending command to the device, the rval
8749 * should be set to the value returned by sata_hba_start. If operation
8750 * did not require device access, rval should be set to TRAN_ACCEPT.
8751 * The pagelen should be set to the length of the page.
8752 *
8753 * This function has to be called with a port mutex held.
8754 *
8755 * Returns SATA_SUCCESS if operation was successful, SATA_FAILURE otherwise.
8756 */
8757 int
sata_mode_select_page_8(sata_pkt_txlate_t * spx,struct mode_cache_scsi3 * page,int parmlen,int * pagelen,int * rval,int * dmod)8758 sata_mode_select_page_8(sata_pkt_txlate_t *spx, struct mode_cache_scsi3 *page,
8759 int parmlen, int *pagelen, int *rval, int *dmod)
8760 {
8761 struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
8762 sata_drive_info_t *sdinfo;
8763 sata_cmd_t *scmd = &spx->txlt_sata_pkt->satapkt_cmd;
8764 sata_id_t *sata_id;
8765 struct scsi_extended_sense *sense;
8766 int wce, dra; /* Current settings */
8767
8768 sdinfo = sata_get_device_info(spx->txlt_sata_hba_inst,
8769 &spx->txlt_sata_pkt->satapkt_device);
8770 sata_id = &sdinfo->satadrv_id;
8771 *dmod = 0;
8772
8773 /* Verify parameters length. If too short, drop it */
8774 if ((PAGELENGTH_DAD_MODE_CACHE_SCSI3 +
8775 sizeof (struct mode_page)) > parmlen) {
8776 *scsipkt->pkt_scbp = STATUS_CHECK;
8777 sense = sata_arq_sense(spx);
8778 sense->es_key = KEY_ILLEGAL_REQUEST;
8779 sense->es_add_code = SD_SCSI_ASC_INVALID_FIELD_IN_PARAMS_LIST;
8780 *pagelen = parmlen;
8781 *rval = TRAN_ACCEPT;
8782 return (SATA_FAILURE);
8783 }
8784
8785 *pagelen = PAGELENGTH_DAD_MODE_CACHE_SCSI3 + sizeof (struct mode_page);
8786
8787 /* Current setting of Read Ahead (and Read Cache) */
8788 if (SATA_READ_AHEAD_ENABLED(*sata_id))
8789 dra = 0; /* 0 == not disabled */
8790 else
8791 dra = 1;
8792 /* Current setting of Write Cache */
8793 if (SATA_WRITE_CACHE_ENABLED(*sata_id))
8794 wce = 1;
8795 else
8796 wce = 0;
8797
8798 if (page->dra == dra && page->wce == wce && page->rcd == dra) {
8799 /* nothing to do */
8800 *rval = TRAN_ACCEPT;
8801 return (SATA_SUCCESS);
8802 }
8803
8804 /*
8805 * Need to flip some setting
8806 * Set-up Internal SET FEATURES command(s)
8807 */
8808 scmd->satacmd_flags.sata_data_direction = SATA_DIR_NODATA_XFER;
8809 scmd->satacmd_addr_type = 0;
8810 scmd->satacmd_device_reg = 0;
8811 scmd->satacmd_status_reg = 0;
8812 scmd->satacmd_error_reg = 0;
8813 scmd->satacmd_cmd_reg = SATAC_SET_FEATURES;
8814 if (page->dra != dra || page->rcd != dra) {
8815 if (SATA_READ_AHEAD_SUPPORTED(*sata_id)) {
8816 /* Need to flip read ahead setting */
8817 if (dra == 0)
8818 /* Disable read ahead / read cache */
8819 scmd->satacmd_features_reg =
8820 SATAC_SF_DISABLE_READ_AHEAD;
8821 else
8822 /* Enable read ahead / read cache */
8823 scmd->satacmd_features_reg =
8824 SATAC_SF_ENABLE_READ_AHEAD;
8825
8826 /* Transfer command to HBA */
8827 if (sata_hba_start(spx, rval) != 0)
8828 /*
8829 * Pkt not accepted for execution.
8830 */
8831 return (SATA_FAILURE);
8832
8833 *dmod = 1;
8834
8835 /* Now process return */
8836 if (spx->txlt_sata_pkt->satapkt_reason !=
8837 SATA_PKT_COMPLETED) {
8838 goto failure; /* Terminate */
8839 }
8840 } else {
8841 *scsipkt->pkt_scbp = STATUS_CHECK;
8842 sense = sata_arq_sense(spx);
8843 sense->es_key = KEY_ILLEGAL_REQUEST;
8844 sense->es_add_code =
8845 SD_SCSI_ASC_INVALID_FIELD_IN_PARAMS_LIST;
8846 *pagelen = parmlen;
8847 *rval = TRAN_ACCEPT;
8848 return (SATA_FAILURE);
8849 }
8850 }
8851
8852 /* Note that the packet is not removed, so it could be re-used */
8853 if (page->wce != wce) {
8854 if (SATA_WRITE_CACHE_SUPPORTED(*sata_id)) {
8855 /* Need to flip Write Cache setting */
8856 if (page->wce == 1)
8857 /* Enable write cache */
8858 scmd->satacmd_features_reg =
8859 SATAC_SF_ENABLE_WRITE_CACHE;
8860 else
8861 /* Disable write cache */
8862 scmd->satacmd_features_reg =
8863 SATAC_SF_DISABLE_WRITE_CACHE;
8864
8865 /* Transfer command to HBA */
8866 if (sata_hba_start(spx, rval) != 0)
8867 /*
8868 * Pkt not accepted for execution.
8869 */
8870 return (SATA_FAILURE);
8871
8872 *dmod = 1;
8873
8874 /* Now process return */
8875 if (spx->txlt_sata_pkt->satapkt_reason !=
8876 SATA_PKT_COMPLETED) {
8877 goto failure;
8878 }
8879 } else {
8880 *scsipkt->pkt_scbp = STATUS_CHECK;
8881 sense = sata_arq_sense(spx);
8882 sense->es_key = KEY_ILLEGAL_REQUEST;
8883 sense->es_add_code =
8884 SD_SCSI_ASC_INVALID_FIELD_IN_PARAMS_LIST;
8885 *pagelen = parmlen;
8886 *rval = TRAN_ACCEPT;
8887 return (SATA_FAILURE);
8888 }
8889 }
8890 return (SATA_SUCCESS);
8891
8892 failure:
8893 sata_xlate_errors(spx);
8894
8895 return (SATA_FAILURE);
8896 }
8897
8898 /*
8899 * Process mode select informational exceptions control page 0x1c
8900 *
8901 * The only changeable bit is dexcpt (disable exceptions).
8902 * MRIE (method of reporting informational exceptions) must be
8903 * "only on request".
8904 * This page applies to informational exceptions that report
8905 * additional sense codes with the ADDITIONAL SENSE CODE field set to 5Dh
8906 * (e.g.,FAILURE PREDICTION THRESHOLD EXCEEDED) or 0Bh (e.g., WARNING_).
8907 * Informational exception conditions occur as the result of background scan
8908 * errors, background self-test errors, or vendor specific events within a
8909 * logical unit. An informational exception condition may occur asynchronous
8910 * to any commands.
8911 *
8912 * Returns: SATA_SUCCESS if operation succeeded, SATA_FAILURE otherwise.
8913 * If operation resulted in changing device setup, dmod flag should be set to
8914 * one (1). If parameters were not changed, dmod flag should be set to 0.
8915 * Upon return, if operation required sending command to the device, the rval
8916 * should be set to the value returned by sata_hba_start. If operation
8917 * did not require device access, rval should be set to TRAN_ACCEPT.
8918 * The pagelen should be set to the length of the page.
8919 *
8920 * This function has to be called with a port mutex held.
8921 *
8922 * Returns SATA_SUCCESS if operation was successful, SATA_FAILURE otherwise.
8923 *
8924 * Cannot be called in the interrupt context.
8925 */
8926 static int
sata_mode_select_page_1c(sata_pkt_txlate_t * spx,struct mode_info_excpt_page * page,int parmlen,int * pagelen,int * rval,int * dmod)8927 sata_mode_select_page_1c(
8928 sata_pkt_txlate_t *spx,
8929 struct mode_info_excpt_page *page,
8930 int parmlen,
8931 int *pagelen,
8932 int *rval,
8933 int *dmod)
8934 {
8935 struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
8936 sata_cmd_t *scmd = &spx->txlt_sata_pkt->satapkt_cmd;
8937 sata_drive_info_t *sdinfo;
8938 sata_id_t *sata_id;
8939 struct scsi_extended_sense *sense;
8940
8941 sdinfo = sata_get_device_info(spx->txlt_sata_hba_inst,
8942 &spx->txlt_sata_pkt->satapkt_device);
8943 sata_id = &sdinfo->satadrv_id;
8944
8945 *dmod = 0;
8946
8947 /* Verify parameters length. If too short, drop it */
8948 if (((PAGELENGTH_INFO_EXCPT + sizeof (struct mode_page)) > parmlen) ||
8949 page->perf || page->test || (page->mrie != MRIE_ONLY_ON_REQUEST)) {
8950 *scsipkt->pkt_scbp = STATUS_CHECK;
8951 sense = sata_arq_sense(spx);
8952 sense->es_key = KEY_ILLEGAL_REQUEST;
8953 sense->es_add_code = SD_SCSI_ASC_INVALID_FIELD_IN_PARAMS_LIST;
8954 *pagelen = parmlen;
8955 *rval = TRAN_ACCEPT;
8956 return (SATA_FAILURE);
8957 }
8958
8959 *pagelen = PAGELENGTH_INFO_EXCPT + sizeof (struct mode_page);
8960
8961 if (! (sata_id->ai_cmdset82 & SATA_SMART_SUPPORTED)) {
8962 *scsipkt->pkt_scbp = STATUS_CHECK;
8963 sense = sata_arq_sense(spx);
8964 sense->es_key = KEY_ILLEGAL_REQUEST;
8965 sense->es_add_code = SD_SCSI_ASC_INVALID_FIELD_IN_CDB;
8966 *pagelen = parmlen;
8967 *rval = TRAN_ACCEPT;
8968 return (SATA_FAILURE);
8969 }
8970
8971 /* If already in the state requested, we are done */
8972 if (page->dexcpt == ! (sata_id->ai_features85 & SATA_SMART_ENABLED)) {
8973 /* nothing to do */
8974 *rval = TRAN_ACCEPT;
8975 return (SATA_SUCCESS);
8976 }
8977
8978 scmd->satacmd_flags.sata_data_direction = SATA_DIR_NODATA_XFER;
8979
8980 /* Build SMART_ENABLE or SMART_DISABLE command */
8981 scmd->satacmd_addr_type = 0; /* N/A */
8982 scmd->satacmd_lba_mid_lsb = SMART_MAGIC_VAL_1;
8983 scmd->satacmd_lba_high_lsb = SMART_MAGIC_VAL_2;
8984 scmd->satacmd_features_reg = page->dexcpt ?
8985 SATA_SMART_DISABLE_OPS : SATA_SMART_ENABLE_OPS;
8986 scmd->satacmd_device_reg = 0; /* Always device 0 */
8987 scmd->satacmd_cmd_reg = SATAC_SMART;
8988
8989 /* Transfer command to HBA */
8990 if (sata_hba_start(spx, rval) != 0)
8991 /*
8992 * Pkt not accepted for execution.
8993 */
8994 return (SATA_FAILURE);
8995
8996 *dmod = 1; /* At least may have been modified */
8997
8998 /* Now process return */
8999 if (spx->txlt_sata_pkt->satapkt_reason == SATA_PKT_COMPLETED)
9000 return (SATA_SUCCESS);
9001
9002 /* Packet did not complete successfully */
9003 sata_xlate_errors(spx);
9004
9005 return (SATA_FAILURE);
9006 }
9007
9008 /*
9009 * Process mode select acoustic management control page 0x30
9010 *
9011 *
9012 * This function has to be called with a port mutex held.
9013 *
9014 * Returns SATA_SUCCESS if operation was successful, SATA_FAILURE otherwise.
9015 *
9016 * Cannot be called in the interrupt context.
9017 */
9018 int
sata_mode_select_page_30(sata_pkt_txlate_t * spx,struct mode_acoustic_management * page,int parmlen,int * pagelen,int * rval,int * dmod)9019 sata_mode_select_page_30(sata_pkt_txlate_t *spx, struct
9020 mode_acoustic_management *page, int parmlen, int *pagelen,
9021 int *rval, int *dmod)
9022 {
9023 struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
9024 sata_drive_info_t *sdinfo;
9025 sata_cmd_t *scmd = &spx->txlt_sata_pkt->satapkt_cmd;
9026 sata_id_t *sata_id;
9027 struct scsi_extended_sense *sense;
9028
9029 sdinfo = sata_get_device_info(spx->txlt_sata_hba_inst,
9030 &spx->txlt_sata_pkt->satapkt_device);
9031 sata_id = &sdinfo->satadrv_id;
9032 *dmod = 0;
9033
9034 /* If parmlen is too short or the feature is not supported, drop it */
9035 if (((PAGELENGTH_DAD_MODE_ACOUSTIC_MANAGEMENT +
9036 sizeof (struct mode_page)) > parmlen) ||
9037 (! (sata_id->ai_cmdset83 & SATA_ACOUSTIC_MGMT))) {
9038 *scsipkt->pkt_scbp = STATUS_CHECK;
9039 sense = sata_arq_sense(spx);
9040 sense->es_key = KEY_ILLEGAL_REQUEST;
9041 sense->es_add_code = SD_SCSI_ASC_INVALID_FIELD_IN_PARAMS_LIST;
9042 *pagelen = parmlen;
9043 *rval = TRAN_ACCEPT;
9044 return (SATA_FAILURE);
9045 }
9046
9047 *pagelen = PAGELENGTH_DAD_MODE_ACOUSTIC_MANAGEMENT +
9048 sizeof (struct mode_page);
9049
9050 /*
9051 * We can enable and disable acoustice management and
9052 * set the acoustic management level.
9053 */
9054
9055 /*
9056 * Set-up Internal SET FEATURES command(s)
9057 */
9058 scmd->satacmd_flags.sata_data_direction = SATA_DIR_NODATA_XFER;
9059 scmd->satacmd_addr_type = 0;
9060 scmd->satacmd_device_reg = 0;
9061 scmd->satacmd_status_reg = 0;
9062 scmd->satacmd_error_reg = 0;
9063 scmd->satacmd_cmd_reg = SATAC_SET_FEATURES;
9064 if (page->acoustic_manag_enable) {
9065 scmd->satacmd_features_reg = SATAC_SF_ENABLE_ACOUSTIC;
9066 scmd->satacmd_sec_count_lsb = page->acoustic_manag_level;
9067 } else { /* disabling acoustic management */
9068 scmd->satacmd_features_reg = SATAC_SF_DISABLE_ACOUSTIC;
9069 }
9070
9071 /* Transfer command to HBA */
9072 if (sata_hba_start(spx, rval) != 0)
9073 /*
9074 * Pkt not accepted for execution.
9075 */
9076 return (SATA_FAILURE);
9077
9078 /* Now process return */
9079 if (spx->txlt_sata_pkt->satapkt_reason != SATA_PKT_COMPLETED) {
9080 sata_xlate_errors(spx);
9081 return (SATA_FAILURE);
9082 }
9083
9084 *dmod = 1;
9085
9086 return (SATA_SUCCESS);
9087 }
9088
9089 /*
9090 * Process mode select power condition page 0x1a
9091 *
9092 * This function has to be called with a port mutex held.
9093 *
9094 * Returns SATA_SUCCESS if operation was successful, SATA_FAILURE otherwise.
9095 *
9096 * Cannot be called in the interrupt context.
9097 */
9098 int
sata_mode_select_page_1a(sata_pkt_txlate_t * spx,struct mode_info_power_cond * page,int parmlen,int * pagelen,int * rval,int * dmod)9099 sata_mode_select_page_1a(sata_pkt_txlate_t *spx, struct
9100 mode_info_power_cond *page, int parmlen, int *pagelen,
9101 int *rval, int *dmod)
9102 {
9103 struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
9104 sata_drive_info_t *sdinfo;
9105 sata_cmd_t *scmd = &spx->txlt_sata_pkt->satapkt_cmd;
9106 sata_id_t *sata_id;
9107 struct scsi_extended_sense *sense;
9108 uint8_t ata_count;
9109 int i, len;
9110
9111 sdinfo = sata_get_device_info(spx->txlt_sata_hba_inst,
9112 &spx->txlt_sata_pkt->satapkt_device);
9113 sata_id = &sdinfo->satadrv_id;
9114 *dmod = 0;
9115
9116 len = sizeof (struct mode_info_power_cond);
9117 len += sizeof (struct mode_page);
9118
9119 /* If parmlen is too short or the feature is not supported, drop it */
9120 if ((len < parmlen) || (page->idle == 1) ||
9121 (!(sata_id->ai_cap & SATA_STANDBYTIMER) && page->standby == 1)) {
9122 *scsipkt->pkt_scbp = STATUS_CHECK;
9123 sense = sata_arq_sense(spx);
9124 sense->es_key = KEY_ILLEGAL_REQUEST;
9125 sense->es_add_code = SD_SCSI_ASC_INVALID_FIELD_IN_PARAMS_LIST;
9126 *pagelen = parmlen;
9127 *rval = TRAN_ACCEPT;
9128 return (SATA_FAILURE);
9129 }
9130
9131 *pagelen = len;
9132
9133 /*
9134 * Set-up Internal STANDBY command(s)
9135 */
9136 if (page->standby == 0)
9137 goto out;
9138
9139 ata_count = sata_get_standby_timer(page->standby_cond_timer);
9140
9141 scmd->satacmd_addr_type = 0;
9142 scmd->satacmd_sec_count_lsb = ata_count;
9143 scmd->satacmd_lba_low_lsb = 0;
9144 scmd->satacmd_lba_mid_lsb = 0;
9145 scmd->satacmd_lba_high_lsb = 0;
9146 scmd->satacmd_features_reg = 0;
9147 scmd->satacmd_device_reg = 0;
9148 scmd->satacmd_status_reg = 0;
9149 scmd->satacmd_cmd_reg = SATAC_STANDBY;
9150 scmd->satacmd_flags.sata_special_regs = B_TRUE;
9151 scmd->satacmd_flags.sata_copy_out_error_reg = B_TRUE;
9152
9153 /* Transfer command to HBA */
9154 if (sata_hba_start(spx, rval) != 0) {
9155 return (SATA_FAILURE);
9156 } else {
9157 if ((scmd->satacmd_error_reg != 0) ||
9158 (spx->txlt_sata_pkt->satapkt_reason !=
9159 SATA_PKT_COMPLETED)) {
9160 sata_xlate_errors(spx);
9161 return (SATA_FAILURE);
9162 }
9163 }
9164
9165 for (i = 0; i < 4; i++) {
9166 sdinfo->satadrv_standby_timer[i] = page->standby_cond_timer[i];
9167 }
9168 out:
9169 *dmod = 1;
9170 return (SATA_SUCCESS);
9171 }
9172
9173 /* Helper functions for manipulating struct log_parameter */
9174
9175 CTASSERT(sizeof (struct log_parameter) == 4);
9176
9177 static inline struct log_parameter *
log_param_next(struct log_parameter * lpp)9178 log_param_next(struct log_parameter *lpp)
9179 {
9180 uint8_t *ptr = (uint8_t *)lpp;
9181
9182 ptr += sizeof (*lpp) + lpp->param_len;
9183 return ((struct log_parameter *)ptr);
9184 }
9185
9186 static inline int
log_param_size(const struct log_parameter * last,const void * startp)9187 log_param_size(const struct log_parameter *last, const void *startp)
9188 {
9189 uintptr_t b = (uintptr_t)last;
9190 uintptr_t a = (uintptr_t)startp;
9191
9192 ASSERT3U(b, >=, a);
9193 return ((int)(b - a));
9194 }
9195
9196 /*
9197 * sata_build_lsense_page0() is used to create the
9198 * SCSI LOG SENSE page 0 (supported log pages)
9199 *
9200 * Currently supported pages are 0, 0x10, 0x2f, 0x30 and 0x0e
9201 * (supported log pages, self-test results, informational exceptions
9202 * Sun vendor specific ATA SMART data, and start stop cycle counter).
9203 *
9204 * Takes a sata_drive_info t * and the address of a buffer
9205 * in which to create the page information.
9206 *
9207 * Returns the number of bytes valid in the buffer.
9208 */
9209 static int
sata_build_lsense_page_0(sata_drive_info_t * sdinfo,uint8_t * buf)9210 sata_build_lsense_page_0(sata_drive_info_t *sdinfo, uint8_t *buf)
9211 {
9212 uint8_t *ptr = buf;
9213 sata_id_t *sata_id = &sdinfo->satadrv_id;
9214
9215 /* The supported log pages should be in ascending order */
9216 *ptr++ = PAGE_CODE_GET_SUPPORTED_LOG_PAGES;
9217
9218 if (sata_id->ai_cmdset84 & SATA_GPL_SUPPORTED) {
9219 *ptr++ = PAGE_CODE_READ_ERRORS;
9220 *ptr++ = PAGE_CODE_TEMPERATURE;
9221 }
9222
9223 if (sata_id->ai_cmdset82 & SATA_SMART_SUPPORTED) {
9224 *ptr++ = PAGE_CODE_START_STOP_CYCLE_COUNTER;
9225 if (sata_id->ai_cmdset84 & SATA_SMART_SELF_TEST_SUPPORTED) {
9226 *ptr++ = PAGE_CODE_SELF_TEST_RESULTS;
9227 }
9228 }
9229
9230 if (sata_id->ai_medrotrate == 0x01 &&
9231 (sata_id->ai_cmdset84 & SATA_GPL_SUPPORTED))
9232 *ptr++ = PAGE_CODE_SOLID_STATE_MEDIA;
9233
9234 if (sata_id->ai_cmdset84 & SATA_GPL_SUPPORTED) {
9235 *ptr++ = PAGE_CODE_GENERAL_STATS;
9236 }
9237
9238 if (sata_id->ai_cmdset82 & SATA_SMART_SUPPORTED) {
9239 *ptr++ = PAGE_CODE_INFORMATION_EXCEPTIONS;
9240 *ptr++ = PAGE_CODE_SMART_READ_DATA;
9241 }
9242
9243 return ((int)((uintptr_t)ptr - (uintptr_t)buf));
9244 }
9245
9246 static int
sata_build_lsense_page_03(sata_drive_info_t * sdinfo,uint8_t * buf,sata_hba_inst_t * sata_hba_inst)9247 sata_build_lsense_page_03(sata_drive_info_t *sdinfo, uint8_t *buf,
9248 sata_hba_inst_t *sata_hba_inst)
9249 {
9250 struct log_parameter *lpp = (struct log_parameter *)buf;
9251 uint64_t *lbuf;
9252 uint64_t param;
9253 int rval;
9254
9255 if (!(sdinfo->satadrv_id.ai_cmdset84 & SATA_GPL_SUPPORTED))
9256 return (-1);
9257
9258 lbuf = kmem_zalloc(512, KM_SLEEP);
9259 rval = sata_read_log_ext(sata_hba_inst, sdinfo, DEVICE_STATS_LOG,
9260 DEVSTAT_ROTATING_MEDIA_PAGE, lbuf, 1);
9261 if (rval == 0) {
9262 param = LE_64(lbuf[5]); /* Read recovery errors */
9263 if (SATA_STAT_SUPPORTED(param) && SATA_STAT_VALID(param)) {
9264 /* Total times corrected algorithm parameter */
9265 lpp->param_code[0] = 0x00;
9266 lpp->param_code[1] = 0x04;
9267 lpp->param_ctrl_flags = LOG_CTRL_LBIN;
9268 lpp->param_len = sizeof (uint32_t);
9269 BE_OUT32(&lpp->param_values[0],
9270 SATA_STAT_VALUE(param) & 0xffffffff);
9271
9272 lpp = log_param_next(lpp);
9273 }
9274 }
9275
9276 bzero(lbuf, 512);
9277 rval = sata_read_log_ext(sata_hba_inst, sdinfo, DEVICE_STATS_LOG,
9278 DEVSTAT_GENERAL_ERRORS_PAGE, lbuf, 1);
9279 if (rval == 0) {
9280 param = LE_64(lbuf[1]); /* Reported uncorrectable errors */
9281 if (SATA_STAT_SUPPORTED(param) && SATA_STAT_VALID(param)) {
9282 /* Total Uncorrected Errors parameter */
9283 lpp->param_code[0] = 0x00;
9284 lpp->param_code[1] = 0x06;
9285 lpp->param_ctrl_flags = LOG_CTRL_LBIN;
9286 lpp->param_len = sizeof (uint32_t);
9287 BE_OUT32(&lpp->param_values[0],
9288 SATA_STAT_VALUE(param) & 0xffffffff);
9289
9290 lpp = log_param_next(lpp);
9291 }
9292 }
9293
9294 kmem_free(lbuf, 512);
9295
9296 /*
9297 * If neither stat is supported, we treat it as the page not being
9298 * supported.
9299 */
9300 return (log_param_size(lpp, buf) > 0 ? log_param_size(lpp, buf) : -1);
9301 }
9302
9303 /*
9304 * sata_build_lsense_page_10() is used to create the
9305 * SCSI LOG SENSE page 0x10 (self-test results)
9306 *
9307 * Takes a sata_drive_info t * and the address of a buffer
9308 * in which to create the page information as well as a sata_hba_inst_t *.
9309 *
9310 * Returns the number of bytes valid in the buffer.
9311 *
9312 * Note: Self test and SMART data is accessible in device log pages.
9313 * The log pages can be accessed by SMART READ/WRITE LOG (up to 255 sectors
9314 * of data can be transferred by a single command), or by the General Purpose
9315 * Logging commands (GPL) READ LOG EXT and WRITE LOG EXT (up to 65,535 sectors
9316 * - approximately 33MB - can be transferred by a single command.
9317 * The SCT Command response (either error or command) is the same for both
9318 * the SMART and GPL methods of issuing commands.
9319 * This function uses READ LOG EXT command when drive supports LBA48, and
9320 * SMART READ command otherwise.
9321 *
9322 * Since above commands are executed in a synchronous mode, this function
9323 * should not be called in an interrupt context.
9324 */
9325 static int
sata_build_lsense_page_10(sata_drive_info_t * sdinfo,uint8_t * buf,sata_hba_inst_t * sata_hba_inst)9326 sata_build_lsense_page_10(
9327 sata_drive_info_t *sdinfo,
9328 uint8_t *buf,
9329 sata_hba_inst_t *sata_hba_inst)
9330 {
9331 struct log_parameter *lpp = (struct log_parameter *)buf;
9332 int rval;
9333
9334 if (sdinfo->satadrv_features_support & SATA_DEV_F_LBA48) {
9335 struct smart_ext_selftest_log *ext_selftest_log;
9336
9337 ext_selftest_log = kmem_zalloc(
9338 sizeof (struct smart_ext_selftest_log), KM_SLEEP);
9339
9340 rval = sata_ext_smart_selftest_read_log(sata_hba_inst, sdinfo,
9341 ext_selftest_log, 0);
9342 if (rval == 0) {
9343 int index, start_index;
9344 struct smart_ext_selftest_log_entry *entry;
9345 static const struct smart_ext_selftest_log_entry empty =
9346 {0};
9347 uint16_t block_num;
9348 int count;
9349 boolean_t only_one_block = B_FALSE;
9350
9351 index = ext_selftest_log->
9352 smart_ext_selftest_log_index[0];
9353 index |= ext_selftest_log->
9354 smart_ext_selftest_log_index[1] << 8;
9355 if (index == 0)
9356 goto out;
9357
9358 --index; /* Correct for 0 origin */
9359 start_index = index; /* remember where we started */
9360 block_num = index / ENTRIES_PER_EXT_SELFTEST_LOG_BLK;
9361 if (block_num != 0) {
9362 rval = sata_ext_smart_selftest_read_log(
9363 sata_hba_inst, sdinfo, ext_selftest_log,
9364 block_num);
9365 if (rval != 0)
9366 goto out;
9367 }
9368 index %= ENTRIES_PER_EXT_SELFTEST_LOG_BLK;
9369 entry =
9370 &ext_selftest_log->
9371 smart_ext_selftest_log_entries[index];
9372
9373 for (count = 1;
9374 count <= SCSI_ENTRIES_IN_LOG_SENSE_SELFTEST_RESULTS;
9375 ++count) {
9376 uint8_t status;
9377 uint8_t code;
9378 uint8_t sense_key;
9379 uint8_t add_sense_code;
9380 uint8_t add_sense_code_qual;
9381
9382 /* If this is an unused entry, we are done */
9383 if (bcmp(entry, &empty, sizeof (empty)) == 0) {
9384 /* Broken firmware on some disks */
9385 if (index + 1 ==
9386 ENTRIES_PER_EXT_SELFTEST_LOG_BLK) {
9387 --entry;
9388 --index;
9389 if (bcmp(entry, &empty,
9390 sizeof (empty)) == 0)
9391 goto out;
9392 } else
9393 goto out;
9394 }
9395
9396 if (only_one_block &&
9397 start_index == index)
9398 goto out;
9399
9400 lpp->param_code[0] = 0;
9401 lpp->param_code[1] = count;
9402 lpp->param_ctrl_flags =
9403 LOG_CTRL_LP | LOG_CTRL_LBIN;
9404 lpp->param_len =
9405 SCSI_LOG_SENSE_SELFTEST_PARAM_LEN;
9406
9407 status = entry->smart_ext_selftest_log_status;
9408 status >>= 4;
9409 switch (status) {
9410 case 0:
9411 default:
9412 sense_key = KEY_NO_SENSE;
9413 add_sense_code =
9414 SD_SCSI_ASC_NO_ADD_SENSE;
9415 add_sense_code_qual = 0;
9416 break;
9417 case 1:
9418 sense_key = KEY_ABORTED_COMMAND;
9419 add_sense_code =
9420 DIAGNOSTIC_FAILURE_ON_COMPONENT;
9421 add_sense_code_qual = SCSI_COMPONENT_81;
9422 break;
9423 case 2:
9424 sense_key = KEY_ABORTED_COMMAND;
9425 add_sense_code =
9426 DIAGNOSTIC_FAILURE_ON_COMPONENT;
9427 add_sense_code_qual = SCSI_COMPONENT_82;
9428 break;
9429 case 3:
9430 sense_key = KEY_ABORTED_COMMAND;
9431 add_sense_code =
9432 DIAGNOSTIC_FAILURE_ON_COMPONENT;
9433 add_sense_code_qual = SCSI_COMPONENT_83;
9434 break;
9435 case 4:
9436 sense_key = KEY_HARDWARE_ERROR;
9437 add_sense_code =
9438 DIAGNOSTIC_FAILURE_ON_COMPONENT;
9439 add_sense_code_qual = SCSI_COMPONENT_84;
9440 break;
9441 case 5:
9442 sense_key = KEY_HARDWARE_ERROR;
9443 add_sense_code =
9444 DIAGNOSTIC_FAILURE_ON_COMPONENT;
9445 add_sense_code_qual = SCSI_COMPONENT_85;
9446 break;
9447 case 6:
9448 sense_key = KEY_HARDWARE_ERROR;
9449 add_sense_code =
9450 DIAGNOSTIC_FAILURE_ON_COMPONENT;
9451 add_sense_code_qual = SCSI_COMPONENT_86;
9452 break;
9453 case 7:
9454 sense_key = KEY_MEDIUM_ERROR;
9455 add_sense_code =
9456 DIAGNOSTIC_FAILURE_ON_COMPONENT;
9457 add_sense_code_qual = SCSI_COMPONENT_87;
9458 break;
9459 case 8:
9460 sense_key = KEY_HARDWARE_ERROR;
9461 add_sense_code =
9462 DIAGNOSTIC_FAILURE_ON_COMPONENT;
9463 add_sense_code_qual = SCSI_COMPONENT_88;
9464 break;
9465 }
9466 code = 0; /* unspecified */
9467 status |= (code << 4);
9468 lpp->param_values[0] = status;
9469 lpp->param_values[1] = 0; /* unspecified */
9470 lpp->param_values[2] = entry->
9471 smart_ext_selftest_log_timestamp[1];
9472 lpp->param_values[3] = entry->
9473 smart_ext_selftest_log_timestamp[0];
9474 if (status != 0) {
9475 lpp->param_values[4] = 0;
9476 lpp->param_values[5] = 0;
9477 lpp->param_values[6] = entry->
9478 smart_ext_selftest_log_failing_lba
9479 [5];
9480 lpp->param_values[7] = entry->
9481 smart_ext_selftest_log_failing_lba
9482 [4];
9483 lpp->param_values[8] = entry->
9484 smart_ext_selftest_log_failing_lba
9485 [3];
9486 lpp->param_values[9] = entry->
9487 smart_ext_selftest_log_failing_lba
9488 [2];
9489 lpp->param_values[10] = entry->
9490 smart_ext_selftest_log_failing_lba
9491 [1];
9492 lpp->param_values[11] = entry->
9493 smart_ext_selftest_log_failing_lba
9494 [0];
9495 } else { /* No bad block address */
9496 lpp->param_values[4] = 0xff;
9497 lpp->param_values[5] = 0xff;
9498 lpp->param_values[6] = 0xff;
9499 lpp->param_values[7] = 0xff;
9500 lpp->param_values[8] = 0xff;
9501 lpp->param_values[9] = 0xff;
9502 lpp->param_values[10] = 0xff;
9503 lpp->param_values[11] = 0xff;
9504 }
9505
9506 lpp->param_values[12] = sense_key;
9507 lpp->param_values[13] = add_sense_code;
9508 lpp->param_values[14] = add_sense_code_qual;
9509 lpp->param_values[15] = 0; /* undefined */
9510
9511 lpp = (struct log_parameter *)
9512 (((uint8_t *)lpp) +
9513 SCSI_LOG_PARAM_HDR_LEN +
9514 SCSI_LOG_SENSE_SELFTEST_PARAM_LEN);
9515
9516 --index; /* Back up to previous entry */
9517 if (index < 0) {
9518 if (block_num > 0) {
9519 --block_num;
9520 } else {
9521 struct read_log_ext_directory
9522 logdir;
9523
9524 rval =
9525 sata_read_log_ext_directory(
9526 sata_hba_inst, sdinfo,
9527 &logdir);
9528 if (rval == -1)
9529 goto out;
9530 if ((logdir.read_log_ext_vers
9531 [0] == 0) &&
9532 (logdir.read_log_ext_vers
9533 [1] == 0))
9534 goto out;
9535 block_num =
9536 logdir.read_log_ext_nblks
9537 [EXT_SMART_SELFTEST_LOG_PAGE
9538 - 1][0];
9539 block_num |= logdir.
9540 read_log_ext_nblks
9541 [EXT_SMART_SELFTEST_LOG_PAGE
9542 - 1][1] << 8;
9543 --block_num;
9544 only_one_block =
9545 (block_num == 0);
9546 }
9547 rval = sata_ext_smart_selftest_read_log(
9548 sata_hba_inst, sdinfo,
9549 ext_selftest_log, block_num);
9550 if (rval != 0)
9551 goto out;
9552
9553 index =
9554 ENTRIES_PER_EXT_SELFTEST_LOG_BLK -
9555 1;
9556 }
9557 index %= ENTRIES_PER_EXT_SELFTEST_LOG_BLK;
9558 entry = &ext_selftest_log->
9559 smart_ext_selftest_log_entries[index];
9560 }
9561 }
9562 out:
9563 kmem_free(ext_selftest_log,
9564 sizeof (struct smart_ext_selftest_log));
9565 } else {
9566 struct smart_selftest_log *selftest_log;
9567
9568 selftest_log = kmem_zalloc(sizeof (struct smart_selftest_log),
9569 KM_SLEEP);
9570
9571 rval = sata_smart_selftest_log(sata_hba_inst, sdinfo,
9572 selftest_log);
9573
9574 if (rval == 0) {
9575 int index;
9576 int count;
9577 struct smart_selftest_log_entry *entry;
9578 static const struct smart_selftest_log_entry empty =
9579 { 0 };
9580
9581 index = selftest_log->smart_selftest_log_index;
9582 if (index == 0)
9583 goto done;
9584 --index; /* Correct for 0 origin */
9585 entry = &selftest_log->
9586 smart_selftest_log_entries[index];
9587 for (count = 1;
9588 count <= SCSI_ENTRIES_IN_LOG_SENSE_SELFTEST_RESULTS;
9589 ++count) {
9590 uint8_t status;
9591 uint8_t code;
9592 uint8_t sense_key;
9593 uint8_t add_sense_code;
9594 uint8_t add_sense_code_qual = 0;
9595
9596 if (bcmp(entry, &empty, sizeof (empty)) == 0)
9597 goto done;
9598
9599 lpp->param_code[0] = 0;
9600 lpp->param_code[1] = count;
9601 lpp->param_ctrl_flags =
9602 LOG_CTRL_LP | LOG_CTRL_LBIN;
9603 lpp->param_len =
9604 SCSI_LOG_SENSE_SELFTEST_PARAM_LEN;
9605
9606 status = entry->smart_selftest_log_status;
9607 status >>= 4;
9608 switch (status) {
9609 case 0:
9610 default:
9611 sense_key = KEY_NO_SENSE;
9612 add_sense_code =
9613 SD_SCSI_ASC_NO_ADD_SENSE;
9614 break;
9615 case 1:
9616 sense_key = KEY_ABORTED_COMMAND;
9617 add_sense_code =
9618 DIAGNOSTIC_FAILURE_ON_COMPONENT;
9619 add_sense_code_qual = SCSI_COMPONENT_81;
9620 break;
9621 case 2:
9622 sense_key = KEY_ABORTED_COMMAND;
9623 add_sense_code =
9624 DIAGNOSTIC_FAILURE_ON_COMPONENT;
9625 add_sense_code_qual = SCSI_COMPONENT_82;
9626 break;
9627 case 3:
9628 sense_key = KEY_ABORTED_COMMAND;
9629 add_sense_code =
9630 DIAGNOSTIC_FAILURE_ON_COMPONENT;
9631 add_sense_code_qual = SCSI_COMPONENT_83;
9632 break;
9633 case 4:
9634 sense_key = KEY_HARDWARE_ERROR;
9635 add_sense_code =
9636 DIAGNOSTIC_FAILURE_ON_COMPONENT;
9637 add_sense_code_qual = SCSI_COMPONENT_84;
9638 break;
9639 case 5:
9640 sense_key = KEY_HARDWARE_ERROR;
9641 add_sense_code =
9642 DIAGNOSTIC_FAILURE_ON_COMPONENT;
9643 add_sense_code_qual = SCSI_COMPONENT_85;
9644 break;
9645 case 6:
9646 sense_key = KEY_HARDWARE_ERROR;
9647 add_sense_code =
9648 DIAGNOSTIC_FAILURE_ON_COMPONENT;
9649 add_sense_code_qual = SCSI_COMPONENT_86;
9650 break;
9651 case 7:
9652 sense_key = KEY_MEDIUM_ERROR;
9653 add_sense_code =
9654 DIAGNOSTIC_FAILURE_ON_COMPONENT;
9655 add_sense_code_qual = SCSI_COMPONENT_87;
9656 break;
9657 case 8:
9658 sense_key = KEY_HARDWARE_ERROR;
9659 add_sense_code =
9660 DIAGNOSTIC_FAILURE_ON_COMPONENT;
9661 add_sense_code_qual = SCSI_COMPONENT_88;
9662 break;
9663 }
9664 code = 0; /* unspecified */
9665 status |= (code << 4);
9666 lpp->param_values[0] = status;
9667 lpp->param_values[1] = 0; /* unspecified */
9668 lpp->param_values[2] = entry->
9669 smart_selftest_log_timestamp[1];
9670 lpp->param_values[3] = entry->
9671 smart_selftest_log_timestamp[0];
9672 if (status != 0) {
9673 lpp->param_values[4] = 0;
9674 lpp->param_values[5] = 0;
9675 lpp->param_values[6] = 0;
9676 lpp->param_values[7] = 0;
9677 lpp->param_values[8] = entry->
9678 smart_selftest_log_failing_lba[3];
9679 lpp->param_values[9] = entry->
9680 smart_selftest_log_failing_lba[2];
9681 lpp->param_values[10] = entry->
9682 smart_selftest_log_failing_lba[1];
9683 lpp->param_values[11] = entry->
9684 smart_selftest_log_failing_lba[0];
9685 } else { /* No block address */
9686 lpp->param_values[4] = 0xff;
9687 lpp->param_values[5] = 0xff;
9688 lpp->param_values[6] = 0xff;
9689 lpp->param_values[7] = 0xff;
9690 lpp->param_values[8] = 0xff;
9691 lpp->param_values[9] = 0xff;
9692 lpp->param_values[10] = 0xff;
9693 lpp->param_values[11] = 0xff;
9694 }
9695 lpp->param_values[12] = sense_key;
9696 lpp->param_values[13] = add_sense_code;
9697 lpp->param_values[14] = add_sense_code_qual;
9698 lpp->param_values[15] = 0; /* undefined */
9699
9700 lpp = (struct log_parameter *)
9701 (((uint8_t *)lpp) +
9702 SCSI_LOG_PARAM_HDR_LEN +
9703 SCSI_LOG_SENSE_SELFTEST_PARAM_LEN);
9704 --index; /* back up to previous entry */
9705 if (index < 0) {
9706 index =
9707 NUM_SMART_SELFTEST_LOG_ENTRIES - 1;
9708 }
9709 entry = &selftest_log->
9710 smart_selftest_log_entries[index];
9711 }
9712 }
9713 done:
9714 kmem_free(selftest_log, sizeof (struct smart_selftest_log));
9715 }
9716
9717 return ((SCSI_LOG_PARAM_HDR_LEN + SCSI_LOG_SENSE_SELFTEST_PARAM_LEN) *
9718 SCSI_ENTRIES_IN_LOG_SENSE_SELFTEST_RESULTS);
9719 }
9720
9721 static uint8_t
sata_sct_temp(sata_hba_inst_t * sata_hba_inst,sata_drive_info_t * sdinfo,void * p,size_t lbufsz)9722 sata_sct_temp(sata_hba_inst_t *sata_hba_inst, sata_drive_info_t *sdinfo,
9723 void *p, size_t lbufsz)
9724 {
9725 sata_id_t *sata_id = &sdinfo->satadrv_id;
9726 uint8_t *lbuf = p;
9727 int rval;
9728 uint8_t temp;
9729
9730 /* The log buffer we use should be at least 1 block in size */
9731 ASSERT3U(lbufsz, >=, 512);
9732
9733 if ((sata_id->ai_sctsupport & SATA_SCT_CMD_TRANS_SUP) == 0)
9734 return (SCSI_NO_TEMP);
9735
9736 bzero(lbuf, lbufsz);
9737 rval = sata_smart_read_log(sata_hba_inst, sdinfo, lbuf,
9738 SCT_STATUS_LOG_PAGE, 1);
9739 if (rval == -1)
9740 return (SCSI_NO_TEMP);
9741
9742 /*
9743 * ACS-3 8.2.5 Table 186 -- If the value is 0x80, the field (HDA TEMP)
9744 * is not valid)
9745 */
9746 temp = lbuf[200];
9747 if (temp == 0x80)
9748 return (SCSI_NO_TEMP);
9749
9750 /*
9751 * SATA temps are signed (with 0x80 being a sentinel value indicating
9752 * not valid as noted above). SAT-5 says that values below 0 are
9753 * truncated to 0.
9754 */
9755 if ((temp & 0x80) != 0)
9756 return (0);
9757
9758 return (temp);
9759 }
9760
9761
9762 /*
9763 * sata_build_lsense_page_2f() is used to create the
9764 * SCSI LOG SENSE page 0x2f (informational exceptions)
9765 *
9766 * Takes a sata_drive_info t * and the address of a buffer
9767 * in which to create the page information as well as a sata_hba_inst_t *.
9768 *
9769 * Returns the number of bytes valid in the buffer.
9770 *
9771 * Because it invokes function(s) that send synchronously executed command
9772 * to the HBA, it cannot be called in the interrupt context.
9773 */
9774 static int
sata_build_lsense_page_2f(sata_drive_info_t * sdinfo,uint8_t * buf,sata_hba_inst_t * sata_hba_inst)9775 sata_build_lsense_page_2f(
9776 sata_drive_info_t *sdinfo,
9777 uint8_t *buf,
9778 sata_hba_inst_t *sata_hba_inst)
9779 {
9780 struct log_parameter *lpp = (struct log_parameter *)buf;
9781 int rval;
9782 uint8_t *smart_data;
9783 uint8_t temp;
9784 sata_id_t *sata_id;
9785
9786 lpp->param_code[0] = 0;
9787 lpp->param_code[1] = 0;
9788 lpp->param_ctrl_flags = LOG_CTRL_LP | LOG_CTRL_LBIN;
9789
9790 /* Now get the SMART status w.r.t. threshold exceeded */
9791 rval = sata_fetch_smart_return_status(sata_hba_inst, sdinfo);
9792 switch (rval) {
9793 case 1:
9794 lpp->param_values[0] = SCSI_PREDICTED_FAILURE;
9795 lpp->param_values[1] = SCSI_GENERAL_HD_FAILURE;
9796 break;
9797 case 0:
9798 case -1: /* failed to get data */
9799 lpp->param_values[0] = 0; /* No failure predicted */
9800 lpp->param_values[1] = 0;
9801 break;
9802 #if defined(SATA_DEBUG)
9803 default:
9804 cmn_err(CE_PANIC, "sata_build_lsense_page_2f bad return value");
9805 /* NOTREACHED */
9806 #endif
9807 }
9808
9809 sata_id = &sdinfo->satadrv_id;
9810 if (! (sata_id->ai_sctsupport & SATA_SCT_CMD_TRANS_SUP)) {
9811 temp = SCSI_NO_TEMP;
9812 } else {
9813 /* Now get the temperature */
9814 smart_data = kmem_zalloc(512, KM_SLEEP);
9815 temp = sata_sct_temp(sata_hba_inst, sdinfo, smart_data, 512);
9816 kmem_free(smart_data, 512);
9817 }
9818
9819 lpp->param_values[2] = temp; /* most recent temperature */
9820 lpp->param_values[3] = 0; /* required vendor specific byte */
9821
9822 lpp->param_len = SCSI_INFO_EXCEPTIONS_PARAM_LEN;
9823
9824
9825 return (SCSI_INFO_EXCEPTIONS_PARAM_LEN + SCSI_LOG_PARAM_HDR_LEN);
9826 }
9827
9828 static int
sata_build_lsense_page_0d(sata_drive_info_t * sdinfo,uint8_t * buf,sata_hba_inst_t * sata_hba_inst)9829 sata_build_lsense_page_0d(sata_drive_info_t *sdinfo, uint8_t *buf,
9830 sata_hba_inst_t *sata_hba_inst)
9831 {
9832 struct log_parameter *lpp = (struct log_parameter *)buf;
9833 uint64_t *lbuf;
9834 uint64_t param;
9835 int rval;
9836 uint8_t temp, ref_temp, sct_temp;
9837
9838 if (!(sdinfo->satadrv_id.ai_sctsupport & SATA_SCT_CMD_TRANS_SUP) &&
9839 !(sdinfo->satadrv_id.ai_cmdset84 & SATA_GPL_SUPPORTED))
9840 return (-1);
9841
9842 temp = ref_temp = sct_temp = SCSI_NO_TEMP;
9843
9844 lbuf = kmem_zalloc(512, KM_SLEEP);
9845 sct_temp = sata_sct_temp(sata_hba_inst, sdinfo, lbuf, 512);
9846
9847 bzero(lbuf, 512);
9848
9849 rval = sata_read_log_ext(sata_hba_inst, sdinfo, DEVICE_STATS_LOG,
9850 DEVSTAT_TEMP_PAGE, lbuf, 1);
9851 if (rval == -1)
9852 goto done;
9853
9854 param = LE_64(lbuf[1]); /* Current temperature */
9855 if (SATA_STAT_SUPPORTED(param) && SATA_STAT_VALID(param)) {
9856 /*
9857 * SAT-5 10.3.13.2 Table 136 says that only positive
9858 * temperatures (SATA temps are signed 8-bit values) -- i.e.
9859 * bit 7 is 0 are translated, otherwise 0xff (SCSI_NO_TEMP)
9860 * is returned.
9861 */
9862 temp = SATA_STAT_VALUE(param) & 0xff;
9863 if ((temp & 0x80) != 0)
9864 temp = SCSI_NO_TEMP;
9865 }
9866
9867 param = LE_64(lbuf[11]); /* Max operating temp */
9868 if (SATA_STAT_SUPPORTED(param) && SATA_STAT_VALID(param)) {
9869 /*
9870 * Interestingly, for the reference temperature, while the
9871 * SATA value is also an 8-bit signed value), SAT-5 10.3.13.3
9872 * Table 137 says that negative temps are translated to 0
9873 * unlike the current temperature.
9874 */
9875 int8_t val = (int8_t)(SATA_STAT_VALUE(param) & 0xff);
9876 ref_temp = (val < 0) ? 0 : val;
9877 }
9878
9879 rval = 0;
9880
9881 done:
9882 kmem_free(lbuf, 512);
9883
9884 /*
9885 * If we support SCT or GPL, we'll always return a value, even if
9886 * that value is SCSI_NO_TEMP (as it may be a transient issue and
9887 * appears to be allowable per SPC-5).
9888 */
9889
9890 lpp->param_code[0] = 0;
9891 lpp->param_code[1] = 0;
9892 lpp->param_ctrl_flags = LOG_CTRL_LP | LOG_CTRL_LBIN;
9893 lpp->param_len = 2;
9894 lpp->param_values[0] = 0; /* Reserved */
9895
9896 /*
9897 * Per SAT-5 10.3.13.2 Table 136, The SCT temp is used if
9898 * valid, otherwise the current temp from the temp statistics page
9899 * is used.
9900 */
9901 lpp->param_values[1] = (sct_temp != SCSI_NO_TEMP) ? sct_temp : temp;
9902
9903 lpp = log_param_next(lpp);
9904
9905 if (ref_temp != SCSI_NO_TEMP) {
9906 lpp->param_code[0] = 0x00;
9907 lpp->param_code[1] = 0x01; /* Reference Temperature */
9908 lpp->param_ctrl_flags = LOG_CTRL_LP | LOG_CTRL_LBIN;
9909 lpp->param_len = 2;
9910 lpp->param_values[0] = 0; /* Resreved */
9911 lpp->param_values[1] = ref_temp;
9912
9913 lpp = log_param_next(lpp);
9914 }
9915
9916 return (log_param_size(lpp, buf));
9917 }
9918
9919 /*
9920 * sata_build_lsense_page_30() is used to create the
9921 * SCSI LOG SENSE page 0x30 (Sun's vendor specific page for ATA SMART data).
9922 *
9923 * Takes a sata_drive_info t * and the address of a buffer
9924 * in which to create the page information as well as a sata_hba_inst_t *.
9925 *
9926 * Returns the number of bytes valid in the buffer.
9927 */
9928 static int
sata_build_lsense_page_30(sata_drive_info_t * sdinfo,uint8_t * buf,sata_hba_inst_t * sata_hba_inst)9929 sata_build_lsense_page_30(
9930 sata_drive_info_t *sdinfo,
9931 uint8_t *buf,
9932 sata_hba_inst_t *sata_hba_inst)
9933 {
9934 struct smart_data *smart_data = (struct smart_data *)buf;
9935 int rval;
9936
9937 /* Now do the SMART READ DATA */
9938 rval = sata_fetch_smart_data(sata_hba_inst, sdinfo, smart_data);
9939 if (rval == -1)
9940 return (0);
9941
9942 return (sizeof (struct smart_data));
9943 }
9944
9945 /*
9946 * sata_build_lsense_page_0e() is used to create the
9947 * SCSI LOG SENSE page 0e (start-stop cycle counter page)
9948 *
9949 * Date of Manufacture (0x0001)
9950 * YEAR = "0000"
9951 * WEEK = "00"
9952 * Accounting Date (0x0002)
9953 * 6 ASCII space character(20h)
9954 * Specified cycle count over device lifetime
9955 * VALUE - THRESH - the delta between max and min;
9956 * Accumulated start-stop cycles
9957 * VALUE - WORST - the accumulated cycles;
9958 *
9959 * ID FLAG THRESH VALUE WORST RAW on start/stop counter attribute
9960 *
9961 * Takes a sata_drive_info t * and the address of a buffer
9962 * in which to create the page information as well as a sata_hba_inst_t *.
9963 *
9964 * Returns the number of bytes valid in the buffer.
9965 */
9966 static int
sata_build_lsense_page_0e(sata_drive_info_t * sdinfo,uint8_t * buf,sata_pkt_txlate_t * spx)9967 sata_build_lsense_page_0e(sata_drive_info_t *sdinfo, uint8_t *buf,
9968 sata_pkt_txlate_t *spx)
9969 {
9970 struct start_stop_cycle_counter_log *log_page;
9971 int i, rval, index;
9972 uint8_t smart_data[512], id, value, worst, thresh;
9973 uint32_t max_count, cycles;
9974
9975 /* Now do the SMART READ DATA */
9976 rval = sata_fetch_smart_data(spx->txlt_sata_hba_inst, sdinfo,
9977 (struct smart_data *)smart_data);
9978 if (rval == -1)
9979 return (0);
9980 for (i = 0, id = 0; i < SMART_START_STOP_COUNT_ID * 2; i++) {
9981 index = (i * 12) + 2;
9982 id = smart_data[index];
9983 if (id != SMART_START_STOP_COUNT_ID)
9984 continue;
9985 else {
9986 thresh = smart_data[index + 2];
9987 value = smart_data[index + 3];
9988 worst = smart_data[index + 4];
9989 break;
9990 }
9991 }
9992 if (id != SMART_START_STOP_COUNT_ID)
9993 return (0);
9994 max_count = value - thresh;
9995 cycles = value - worst;
9996
9997 log_page = (struct start_stop_cycle_counter_log *)buf;
9998 bzero(log_page, sizeof (struct start_stop_cycle_counter_log));
9999 log_page->code = 0x0e;
10000 log_page->page_len_low = 0x24;
10001
10002 log_page->manufactor_date_low = 0x1;
10003 log_page->param_1.fmt_link = 0x1; /* 01b */
10004 log_page->param_len_1 = 0x06;
10005 for (i = 0; i < 4; i++) {
10006 log_page->year_manu[i] = 0x30;
10007 if (i < 2)
10008 log_page->week_manu[i] = 0x30;
10009 }
10010
10011 log_page->account_date_low = 0x02;
10012 log_page->param_2.fmt_link = 0x01; /* 01b */
10013 log_page->param_len_2 = 0x06;
10014 for (i = 0; i < 4; i++) {
10015 log_page->year_account[i] = 0x20;
10016 if (i < 2)
10017 log_page->week_account[i] = 0x20;
10018 }
10019
10020 log_page->lifetime_code_low = 0x03;
10021 log_page->param_3.fmt_link = 0x03; /* 11b */
10022 log_page->param_len_3 = 0x04;
10023 /* VALUE - THRESH - the delta between max and min */
10024 log_page->cycle_code_low = 0x04;
10025 log_page->param_4.fmt_link = 0x03; /* 11b */
10026 log_page->param_len_4 = 0x04;
10027 /* WORST - THRESH - the distance from 'now' to min */
10028
10029 for (i = 0; i < 4; i++) {
10030 log_page->cycle_lifetime[i] =
10031 (max_count >> (8 * (3 - i))) & 0xff;
10032 log_page->cycle_accumulated[i] =
10033 (cycles >> (8 * (3 - i))) & 0xff;
10034 }
10035
10036 return (sizeof (struct start_stop_cycle_counter_log));
10037 }
10038
10039 static int
sata_build_lsense_page_11(sata_drive_info_t * sdinfo,uint8_t * buf,sata_hba_inst_t * sata_hba_inst)10040 sata_build_lsense_page_11(sata_drive_info_t *sdinfo, uint8_t *buf,
10041 sata_hba_inst_t *sata_hba_inst)
10042 {
10043 struct log_parameter *lpp = (struct log_parameter *)buf;
10044 uint64_t *lbuf;
10045 uint64_t param;
10046 int rval = 0;
10047
10048 /* Check if device is SSD */
10049 if (sdinfo->satadrv_id.ai_medrotrate != 0x01 ||
10050 !(sdinfo->satadrv_id.ai_cmdset84 & SATA_GPL_SUPPORTED)) {
10051 return (-1);
10052 }
10053
10054 lbuf = kmem_zalloc(512, KM_SLEEP);
10055 rval = sata_read_log_ext(sata_hba_inst, sdinfo, DEVICE_STATS_LOG,
10056 DEVSTAT_SSD_PAGE, lbuf, 1);
10057 if (rval == -1)
10058 goto done;
10059
10060 param = LE_64(lbuf[1]); /* %-age used endurance indicator */
10061 if (!SATA_STAT_SUPPORTED(param) || !SATA_STAT_VALID(param)) {
10062 /*
10063 * If the wear stat isn't supported or valid, the SAT-5
10064 * says this is unspecified. We'll treat it as the
10065 * log page being unsupported.
10066 */
10067 rval = -1;
10068 goto done;
10069 }
10070
10071 lpp->param_code[0] = 0x00;
10072 lpp->param_code[1] = 0x01;
10073 lpp->param_ctrl_flags = LOG_CTRL_LP | LOG_CTRL_LBIN;
10074 lpp->param_len = 4;
10075 BE_OUT32(&lpp->param_values[0], SATA_STAT_VALUE(param) & 0xffffffff);
10076
10077 lpp = log_param_next(lpp);
10078
10079 done:
10080 kmem_free(lbuf, 512);
10081 return ((rval < 0) ? -1 : log_param_size(lpp, buf));
10082 }
10083
10084 static int
sata_build_lsense_page_19(sata_drive_info_t * sdinfo,uint8_t * buf,sata_hba_inst_t * sata_hba_inst)10085 sata_build_lsense_page_19(sata_drive_info_t *sdinfo, uint8_t *buf,
10086 sata_hba_inst_t *sata_hba_inst)
10087 {
10088 /*
10089 * The indexes into lbuf (the SATA general statistics log)
10090 * that correspond to the values of the general access statistics
10091 * and performance log values. -1 means there is no mapping (e.g.
10092 * write 0 for that value).
10093 */
10094 static const int stat_idx[] = {
10095 6, /* # of read commands */
10096 4, /* # of write commands */
10097 3, /* Logical sectors written */
10098 5, /* Logical sectors read */
10099 -1, -1, -1, -1
10100 };
10101
10102 struct log_parameter *lpp = (struct log_parameter *)buf;
10103 uint64_t *lbuf;
10104 uint64_t *paramp;
10105 uint64_t param;
10106 uint_t nvalid;
10107 int rval;
10108
10109 if (!(sdinfo->satadrv_id.ai_cmdset84 & SATA_GPL_SUPPORTED))
10110 return (-1);
10111
10112 nvalid = 0;
10113
10114 lbuf = kmem_zalloc(512, KM_SLEEP);
10115 rval = sata_read_log_ext(sata_hba_inst, sdinfo, DEVICE_STATS_LOG,
10116 DEVSTAT_GENERAL_STATS, lbuf, 1);
10117 if (rval == -1) {
10118 kmem_free(lbuf, 512);
10119 return (-1);
10120 }
10121
10122 lpp->param_code[0] = 0x00;
10123 lpp->param_code[1] = 0x01;
10124 /*
10125 * SPC-5 and SAT-5 disagree on this value -- SPC-5 7.3.9.2 says this
10126 * should be an unbounded data counter (10b LOG_CTRL_LBIN) while SAT-5
10127 * 10.3.4.2 Table 110 says this should be a binary format list (11b
10128 * aka LOG_CTRL_LP | LOG_CTRL_LBIN). Since SAT-5 is a bit more
10129 * explicit on the value, we've followed it. So far no software
10130 * has been uncovered to date that seems to care about the value, but
10131 * it may need to be updated of the two specs are ever brought into
10132 * agreement.
10133 */
10134 lpp->param_ctrl_flags = LOG_CTRL_LP | LOG_CTRL_LBIN;
10135 lpp->param_len = 0x40;
10136
10137 paramp = (uint64_t *)&lpp->param_values[0];
10138
10139 /* Zero out all of parameter values */
10140 bzero(paramp, 0x40);
10141
10142 /* The stat parameters are 48 bits long */
10143 #define PARAM_VAL(x) ((x) & ((1ULL << 48) - 1))
10144
10145 for (uint_t i = 0; i < ARRAY_SIZE(stat_idx); i++, paramp++) {
10146 if (stat_idx[i] == -1) {
10147 continue;
10148 }
10149
10150 param = LE_64(lbuf[stat_idx[i]]);
10151
10152 if (SATA_STAT_SUPPORTED(param) && SATA_STAT_VALID(param)) {
10153 BE_OUT64(paramp, PARAM_VAL(param));
10154 nvalid++;
10155 }
10156 }
10157 #undef PARAM_VAL
10158
10159 kmem_free(lbuf, 512);
10160
10161 /* We must return at least one valid value for this page */
10162 if (nvalid == 0)
10163 return (-1);
10164
10165 /*
10166 * SPC-5 says that the IDLE TIME and TIME INTERVAL parameters
10167 * are mandatory, but SAT-5 gives no mention of either parameter.
10168 * Some utilities (e.g. sg3_utils) strictly follow the guidance of
10169 * SPC-5 and expect all three parameters, so we generate dummy
10170 * values for the IDLE TIME and TIME INTERVAL parameters.
10171 */
10172 lpp = log_param_next(lpp);
10173
10174 /* IDLE TIME */
10175 lpp->param_code[0] = 0x00;
10176 lpp->param_code[1] = 0x02;
10177 lpp->param_ctrl_flags = LOG_CTRL_LP;
10178 lpp->param_len = 0x08;
10179
10180 /*
10181 * The value is an 64-bit unsigned int, the address is almost
10182 * certainly going to be unaligned, so just set each byte
10183 * individually.
10184 */
10185 lpp->param_values[0] = lpp->param_values[1] = lpp->param_values[2] =
10186 lpp->param_values[3] = lpp->param_values[4] =
10187 lpp->param_values[5] = lpp->param_values[6] =
10188 lpp->param_values[7] = 0;
10189 lpp = log_param_next(lpp);
10190
10191 /* TIME INTERVAL */
10192 lpp->param_code[0] = 0x00;
10193 lpp->param_code[1] = 0x03;
10194 lpp->param_ctrl_flags = LOG_CTRL_LP | LOG_CTRL_LBIN;
10195 lpp->param_len = 0x08;
10196
10197 uint32_t *vp = (uint32_t *)&lpp->param_values;
10198
10199 /*
10200 * SPC-5 7.3.6.7 -- The TIME INTERVAL parameter consists of
10201 * two 32-bit unsigned ints -- EXPONENT and INTEGER.
10202 * EXPONENT is the _negative_ power of ten (e.g. '3' implies
10203 * 10^-3) and INTEGER is the mantissa (e.g. the actual value
10204 * is INTEGER * 10^(-EXPONENT)).
10205 *
10206 * SPC-5 isn't completely clear on this, but from the description
10207 * of the fields of the General Access Statistics and Performance
10208 * log parameter in section 7.3.9.2, it implies that the TIME INTERVAL
10209 * parameter is used to in conjunction with the {READ,WRITE} COMMAND
10210 * PROCESSING INTERVAL statistics value. Since these values do not
10211 * have a translation defined (there doesn't appear to be any
10212 * equivalent statistic in any SATA log page), we always return
10213 * 0 for these stats. As a TIME INTERVAL of 0^-0 would be nonsensical
10214 * (and mathematically undefined), we choose an arbitrary interval of
10215 * 1ms (1 * 10^-3).
10216 */
10217 BE_OUT32(vp, 3);
10218 vp++;
10219 BE_OUT32(vp, 1);
10220
10221 lpp = log_param_next(lpp);
10222
10223 return (log_param_size(lpp, buf));
10224 }
10225
10226
10227 /*
10228 * This function was used for build a ATA read verify sector command
10229 */
10230 static void
sata_build_read_verify_cmd(sata_cmd_t * scmd,uint16_t sec,uint64_t lba)10231 sata_build_read_verify_cmd(sata_cmd_t *scmd, uint16_t sec, uint64_t lba)
10232 {
10233 scmd->satacmd_cmd_reg = SATAC_RDVER;
10234 scmd->satacmd_addr_type = ATA_ADDR_LBA28;
10235 scmd->satacmd_flags.sata_special_regs = B_TRUE;
10236
10237 scmd->satacmd_sec_count_lsb = sec & 0xff;
10238 scmd->satacmd_lba_low_lsb = lba & 0xff;
10239 scmd->satacmd_lba_mid_lsb = (lba >> 8) & 0xff;
10240 scmd->satacmd_lba_high_lsb = (lba >> 16) & 0xff;
10241 scmd->satacmd_device_reg = (SATA_ADH_LBA | ((lba >> 24) & 0xf));
10242 scmd->satacmd_features_reg = 0;
10243 scmd->satacmd_status_reg = 0;
10244 scmd->satacmd_error_reg = 0;
10245 }
10246
10247 /*
10248 * This function was used for building an ATA
10249 * command, and only command register need to
10250 * be defined, other register will be zero or na.
10251 */
10252 static void
sata_build_generic_cmd(sata_cmd_t * scmd,uint8_t cmd)10253 sata_build_generic_cmd(sata_cmd_t *scmd, uint8_t cmd)
10254 {
10255 scmd->satacmd_addr_type = 0;
10256 scmd->satacmd_cmd_reg = cmd;
10257 scmd->satacmd_device_reg = 0;
10258 scmd->satacmd_sec_count_lsb = 0;
10259 scmd->satacmd_lba_low_lsb = 0;
10260 scmd->satacmd_lba_mid_lsb = 0;
10261 scmd->satacmd_lba_high_lsb = 0;
10262 scmd->satacmd_features_reg = 0;
10263 scmd->satacmd_status_reg = 0;
10264 scmd->satacmd_error_reg = 0;
10265 scmd->satacmd_flags.sata_special_regs = B_TRUE;
10266 }
10267
10268 /*
10269 * This function was used for changing the standby
10270 * timer format from SCSI to ATA.
10271 */
10272 static uint8_t
sata_get_standby_timer(uint8_t * timer)10273 sata_get_standby_timer(uint8_t *timer)
10274 {
10275 uint32_t i = 0, count = 0;
10276 uint8_t ata_count;
10277
10278 for (i = 0; i < 4; i++) {
10279 count = count << 8 | timer[i];
10280 }
10281
10282 if (count == 0)
10283 return (0);
10284
10285 if (count >= 1 && count <= 12000)
10286 ata_count = (count -1) / 50 + 1;
10287 else if (count > 12000 && count <= 12600)
10288 ata_count = 0xfc;
10289 else if (count > 12601 && count <= 12750)
10290 ata_count = 0xff;
10291 else if (count > 12750 && count <= 17999)
10292 ata_count = 0xf1;
10293 else if (count > 18000 && count <= 198000)
10294 ata_count = count / 18000 + 240;
10295 else
10296 ata_count = 0xfd;
10297 return (ata_count);
10298 }
10299
10300 /* ************************** ATAPI-SPECIFIC FUNCTIONS ********************** */
10301
10302 /*
10303 * Start command for ATAPI device.
10304 * This function processes scsi_pkt requests.
10305 * Now CD/DVD, tape and ATAPI disk devices are supported.
10306 * Most commands are packet without any translation into Packet Command.
10307 * Some may be trapped and executed as SATA commands (not clear which one).
10308 *
10309 * Returns TRAN_ACCEPT if command is accepted for execution (or completed
10310 * execution).
10311 * Returns other TRAN_XXXX codes if command is not accepted or completed
10312 * (see return values for sata_hba_start()).
10313 *
10314 * Note:
10315 * Inquiry cdb format differs between transport version 2 and 3.
10316 * However, the transport version 3 devices that were checked did not adhere
10317 * to the specification (ignored MSB of the allocation length). Therefore,
10318 * the transport version is not checked, but Inquiry allocation length is
10319 * truncated to 255 bytes if the original allocation length set-up by the
10320 * target driver is greater than 255 bytes.
10321 */
10322 static int
sata_txlt_atapi(sata_pkt_txlate_t * spx)10323 sata_txlt_atapi(sata_pkt_txlate_t *spx)
10324 {
10325 struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
10326 sata_cmd_t *scmd = &spx->txlt_sata_pkt->satapkt_cmd;
10327 struct buf *bp = spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp;
10328 sata_hba_inst_t *sata_hba = SATA_TXLT_HBA_INST(spx);
10329 sata_drive_info_t *sdinfo = sata_get_device_info(sata_hba,
10330 &spx->txlt_sata_pkt->satapkt_device);
10331 kmutex_t *cport_mutex = &(SATA_TXLT_CPORT_MUTEX(spx));
10332 int cdblen;
10333 int rval, reason;
10334 int synch;
10335 union scsi_cdb *cdbp = (union scsi_cdb *)scsipkt->pkt_cdbp;
10336
10337 mutex_enter(cport_mutex);
10338
10339 if (((rval = sata_txlt_generic_pkt_info(spx, &reason, 0)) !=
10340 TRAN_ACCEPT) || (reason == CMD_DEV_GONE)) {
10341 mutex_exit(cport_mutex);
10342 return (rval);
10343 }
10344
10345 /*
10346 * ATAPI device executes some ATA commands in addition to those
10347 * commands sent via PACKET command. These ATA commands may be
10348 * executed by the regular SATA translation functions. None needs
10349 * to be captured now.
10350 *
10351 * Commands sent via PACKET command include:
10352 * MMC command set for ATAPI CD/DVD device
10353 * SSC command set for ATAPI TAPE device
10354 * SBC command set for ATAPI disk device
10355 *
10356 */
10357
10358 /* Check the size of cdb */
10359
10360 switch (GETGROUP(cdbp)) {
10361 case CDB_GROUPID_3: /* Reserved, per SPC-4 */
10362 /*
10363 * opcodes 0x7e and 0x7f identify variable-length CDBs and
10364 * therefore require special handling. Return failure, for now.
10365 */
10366 mutex_exit(cport_mutex);
10367 return (TRAN_BADPKT);
10368
10369 case CDB_GROUPID_6: /* Vendor-specific, per SPC-4 */
10370 case CDB_GROUPID_7: /* Vendor-specific, per SPC-4 */
10371 /* obtain length from the scsi_pkt */
10372 cdblen = scsipkt->pkt_cdblen;
10373 break;
10374
10375 default:
10376 /* CDB's length is statically known, per SPC-4 */
10377 cdblen = scsi_cdb_size[GETGROUP(cdbp)];
10378 break;
10379 }
10380
10381 if (cdblen <= 0 || cdblen > sdinfo->satadrv_atapi_cdb_len) {
10382 sata_log(NULL, CE_WARN,
10383 "sata: invalid ATAPI cdb length %d",
10384 cdblen);
10385 mutex_exit(cport_mutex);
10386 return (TRAN_BADPKT);
10387 }
10388
10389 SATAATAPITRACE(spx, cdblen);
10390
10391 /*
10392 * For non-read/write commands we need to
10393 * map buffer
10394 */
10395 switch ((uint_t)scsipkt->pkt_cdbp[0]) {
10396 case SCMD_READ:
10397 case SCMD_READ_G1:
10398 case SCMD_READ_G5:
10399 case SCMD_READ_G4:
10400 case SCMD_WRITE:
10401 case SCMD_WRITE_G1:
10402 case SCMD_WRITE_G5:
10403 case SCMD_WRITE_G4:
10404 break;
10405 default:
10406 if (bp != NULL) {
10407 if (bp->b_flags & (B_PHYS | B_PAGEIO))
10408 bp_mapin(bp);
10409 }
10410 break;
10411 }
10412 /*
10413 * scmd->satacmd_flags.sata_data_direction default -
10414 * SATA_DIR_NODATA_XFER - is set by
10415 * sata_txlt_generic_pkt_info().
10416 */
10417 if (scmd->satacmd_bp) {
10418 if (scmd->satacmd_bp->b_flags & B_READ) {
10419 scmd->satacmd_flags.sata_data_direction = SATA_DIR_READ;
10420 } else {
10421 scmd->satacmd_flags.sata_data_direction =
10422 SATA_DIR_WRITE;
10423 }
10424 }
10425
10426 /*
10427 * Set up ATAPI packet command.
10428 */
10429
10430 sata_atapi_packet_cmd_setup(scmd, sdinfo);
10431
10432 /* Copy cdb into sata_cmd */
10433 scmd->satacmd_acdb_len = sdinfo->satadrv_atapi_cdb_len;
10434 bzero(scmd->satacmd_acdb, SATA_ATAPI_MAX_CDB_LEN);
10435 bcopy(cdbp, scmd->satacmd_acdb, cdblen);
10436
10437 /* See note in the command header */
10438 if (scmd->satacmd_acdb[0] == SCMD_INQUIRY) {
10439 if (scmd->satacmd_acdb[3] != 0)
10440 scmd->satacmd_acdb[4] = 255;
10441 }
10442
10443 #ifdef SATA_DEBUG
10444 if (sata_debug_flags & SATA_DBG_ATAPI) {
10445 uint8_t *p = scmd->satacmd_acdb;
10446 char buf[3 * SATA_ATAPI_MAX_CDB_LEN];
10447
10448 (void) snprintf(buf, SATA_ATAPI_MAX_CDB_LEN,
10449 "%02x %02x %02x %02x %02x %02x %02x %02x "
10450 "%2x %02x %02x %02x %02x %02x %02x %02x",
10451 p[0], p[1], p[2], p[3], p[4], p[5], p[6], p[7],
10452 p[8], p[9], p[10], p[11], p[12], p[13], p[14], p[15]);
10453 buf[(3 * SATA_ATAPI_MAX_CDB_LEN) - 1] = '\0';
10454 cmn_err(CE_NOTE, "ATAPI cdb: %s\n", buf);
10455 }
10456 #endif
10457
10458 /*
10459 * Preset request sense data to NO SENSE.
10460 * If there is no way to get error information via Request Sense,
10461 * the packet request sense data would not have to be modified by HBA,
10462 * but it could be returned as is.
10463 */
10464 bzero(scmd->satacmd_rqsense, SATA_ATAPI_RQSENSE_LEN);
10465 sata_fixed_sense_data_preset(
10466 (struct scsi_extended_sense *)scmd->satacmd_rqsense);
10467
10468 if (!(spx->txlt_sata_pkt->satapkt_op_mode & SATA_OPMODE_SYNCH)) {
10469 /* Need callback function */
10470 spx->txlt_sata_pkt->satapkt_comp = sata_txlt_atapi_completion;
10471 synch = FALSE;
10472 } else
10473 synch = TRUE;
10474
10475 /* Transfer command to HBA */
10476 if (sata_hba_start(spx, &rval) != 0) {
10477 /* Pkt not accepted for execution */
10478 mutex_exit(cport_mutex);
10479 return (rval);
10480 }
10481 mutex_exit(cport_mutex);
10482 /*
10483 * If execution is non-synchronous,
10484 * a callback function will handle potential errors, translate
10485 * the response and will do a callback to a target driver.
10486 * If it was synchronous, use the same framework callback to check
10487 * an execution status.
10488 */
10489 if (synch) {
10490 SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
10491 "synchronous execution status %x\n",
10492 spx->txlt_sata_pkt->satapkt_reason);
10493 sata_txlt_atapi_completion(spx->txlt_sata_pkt);
10494 }
10495 return (TRAN_ACCEPT);
10496 }
10497
10498
10499 /*
10500 * ATAPI Packet command completion.
10501 *
10502 * Failure of the command passed via Packet command are considered device
10503 * error. SATA HBA driver would have to retrieve error data (via Request
10504 * Sense command delivered via error retrieval sata packet) and copy it
10505 * to satacmd_rqsense array. From there, it is moved into scsi pkt sense data.
10506 */
10507 static void
sata_txlt_atapi_completion(sata_pkt_t * sata_pkt)10508 sata_txlt_atapi_completion(sata_pkt_t *sata_pkt)
10509 {
10510 sata_pkt_txlate_t *spx =
10511 (sata_pkt_txlate_t *)sata_pkt->satapkt_framework_private;
10512 struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
10513 struct scsi_extended_sense *sense;
10514 struct buf *bp;
10515 int rval;
10516
10517 #ifdef SATA_DEBUG
10518 uint8_t *rqsp = sata_pkt->satapkt_cmd.satacmd_rqsense;
10519 #endif
10520
10521 scsipkt->pkt_state = STATE_GOT_BUS | STATE_GOT_TARGET |
10522 STATE_SENT_CMD | STATE_GOT_STATUS;
10523
10524 if (sata_pkt->satapkt_reason == SATA_PKT_COMPLETED) {
10525 /* Normal completion */
10526 if (sata_pkt->satapkt_cmd.satacmd_bp != NULL)
10527 scsipkt->pkt_state |= STATE_XFERRED_DATA;
10528 scsipkt->pkt_reason = CMD_CMPLT;
10529 *scsipkt->pkt_scbp = STATUS_GOOD;
10530 if (spx->txlt_tmp_buf != NULL) {
10531 /* Temporary buffer was used */
10532 bp = spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp;
10533 if (bp->b_flags & B_READ) {
10534 rval = ddi_dma_sync(
10535 spx->txlt_buf_dma_handle, 0, 0,
10536 DDI_DMA_SYNC_FORCPU);
10537 ASSERT(rval == DDI_SUCCESS);
10538 bcopy(spx->txlt_tmp_buf, bp->b_un.b_addr,
10539 bp->b_bcount);
10540 }
10541 }
10542 } else {
10543 /*
10544 * Something went wrong - analyze return
10545 */
10546 *scsipkt->pkt_scbp = STATUS_CHECK;
10547 sense = sata_arq_sense(spx);
10548
10549 if (sata_pkt->satapkt_reason == SATA_PKT_DEV_ERROR) {
10550 /*
10551 * pkt_reason should be CMD_CMPLT for DEVICE ERROR.
10552 * Under this condition ERR bit is set for ATA command,
10553 * and CHK bit set for ATAPI command.
10554 *
10555 * Please check st_intr & sdintr about how pkt_reason
10556 * is used.
10557 */
10558 scsipkt->pkt_reason = CMD_CMPLT;
10559
10560 /*
10561 * We may not have ARQ data if there was a double
10562 * error. But sense data in sata packet was pre-set
10563 * with NO SENSE so it is valid even if HBA could
10564 * not retrieve a real sense data.
10565 * Just copy this sense data into scsi pkt sense area.
10566 */
10567 bcopy(sata_pkt->satapkt_cmd.satacmd_rqsense, sense,
10568 SATA_ATAPI_MIN_RQSENSE_LEN);
10569 #ifdef SATA_DEBUG
10570 if (sata_debug_flags & SATA_DBG_SCSI_IF) {
10571 sata_log(spx->txlt_sata_hba_inst, CE_WARN,
10572 "sata_txlt_atapi_completion: %02x\n"
10573 "RQSENSE: %02x %02x %02x %02x %02x %02x "
10574 " %02x %02x %02x %02x %02x %02x "
10575 " %02x %02x %02x %02x %02x %02x\n",
10576 scsipkt->pkt_reason,
10577 rqsp[0], rqsp[1], rqsp[2], rqsp[3],
10578 rqsp[4], rqsp[5], rqsp[6], rqsp[7],
10579 rqsp[8], rqsp[9], rqsp[10], rqsp[11],
10580 rqsp[12], rqsp[13], rqsp[14], rqsp[15],
10581 rqsp[16], rqsp[17]);
10582 }
10583 #endif
10584 } else {
10585 switch (sata_pkt->satapkt_reason) {
10586 case SATA_PKT_PORT_ERROR:
10587 /*
10588 * We have no device data.
10589 */
10590 scsipkt->pkt_reason = CMD_INCOMPLETE;
10591 scsipkt->pkt_state &= ~(STATE_GOT_BUS |
10592 STATE_GOT_TARGET | STATE_SENT_CMD |
10593 STATE_GOT_STATUS);
10594 sense->es_key = KEY_HARDWARE_ERROR;
10595 break;
10596
10597 case SATA_PKT_TIMEOUT:
10598 scsipkt->pkt_reason = CMD_TIMEOUT;
10599 scsipkt->pkt_statistics |=
10600 STAT_TIMEOUT | STAT_DEV_RESET;
10601 /*
10602 * Need to check if HARDWARE_ERROR/
10603 * TIMEOUT_ON_LOGICAL_UNIT 4/3E/2 would be more
10604 * appropriate.
10605 */
10606 break;
10607
10608 case SATA_PKT_ABORTED:
10609 scsipkt->pkt_reason = CMD_ABORTED;
10610 scsipkt->pkt_statistics |= STAT_ABORTED;
10611 /* Should we set key COMMAND_ABPRTED? */
10612 break;
10613
10614 case SATA_PKT_RESET:
10615 scsipkt->pkt_reason = CMD_RESET;
10616 scsipkt->pkt_statistics |= STAT_DEV_RESET;
10617 /*
10618 * May be we should set Unit Attention /
10619 * Reset. Perhaps the same should be
10620 * returned for disks....
10621 */
10622 sense->es_key = KEY_UNIT_ATTENTION;
10623 sense->es_add_code = SD_SCSI_ASC_RESET;
10624 break;
10625
10626 default:
10627 SATA_LOG_D((spx->txlt_sata_hba_inst, CE_WARN,
10628 "sata_txlt_atapi_completion: "
10629 "invalid packet completion reason"));
10630 scsipkt->pkt_reason = CMD_TRAN_ERR;
10631 scsipkt->pkt_state &= ~(STATE_GOT_BUS |
10632 STATE_GOT_TARGET | STATE_SENT_CMD |
10633 STATE_GOT_STATUS);
10634 break;
10635 }
10636 }
10637 }
10638
10639 SATAATAPITRACE(spx, 0);
10640
10641 if ((scsipkt->pkt_flags & FLAG_NOINTR) == 0 &&
10642 scsipkt->pkt_comp != NULL) {
10643 /* scsi callback required */
10644 (*scsipkt->pkt_comp)(scsipkt);
10645 }
10646 }
10647
10648 /*
10649 * Set up error retrieval sata command for ATAPI Packet Command error data
10650 * recovery.
10651 *
10652 * Returns SATA_SUCCESS when data buffer is allocated and packet set-up,
10653 * returns SATA_FAILURE otherwise.
10654 */
10655
10656 static int
sata_atapi_err_ret_cmd_setup(sata_pkt_txlate_t * spx,sata_drive_info_t * sdinfo)10657 sata_atapi_err_ret_cmd_setup(sata_pkt_txlate_t *spx, sata_drive_info_t *sdinfo)
10658 {
10659 sata_pkt_t *spkt = spx->txlt_sata_pkt;
10660 sata_cmd_t *scmd;
10661 struct buf *bp;
10662
10663 /*
10664 * Allocate dma-able buffer error data.
10665 * Buffer allocation will take care of buffer alignment and other DMA
10666 * attributes.
10667 */
10668 bp = sata_alloc_local_buffer(spx, SATA_ATAPI_MIN_RQSENSE_LEN);
10669 if (bp == NULL) {
10670 SATADBG1(SATA_DBG_ATAPI, spx->txlt_sata_hba_inst,
10671 "sata_get_err_retrieval_pkt: "
10672 "cannot allocate buffer for error data", NULL);
10673 return (SATA_FAILURE);
10674 }
10675 bp_mapin(bp); /* make data buffer accessible */
10676
10677 /* Operation modes are up to the caller */
10678 spkt->satapkt_op_mode = SATA_OPMODE_SYNCH | SATA_OPMODE_INTERRUPTS;
10679
10680 /* Synchronous mode, no callback - may be changed by the caller */
10681 spkt->satapkt_comp = NULL;
10682 spkt->satapkt_time = sata_default_pkt_time;
10683
10684 scmd = &spkt->satapkt_cmd;
10685 scmd->satacmd_flags.sata_data_direction = SATA_DIR_READ;
10686 scmd->satacmd_flags.sata_ignore_dev_reset = B_TRUE;
10687
10688 sata_atapi_packet_cmd_setup(scmd, sdinfo);
10689
10690 /*
10691 * Set-up acdb. Request Sense CDB (packet command content) is
10692 * not in DMA-able buffer. Its handling is HBA-specific (how
10693 * it is transfered into packet FIS).
10694 */
10695 scmd->satacmd_acdb_len = sdinfo->satadrv_atapi_cdb_len;
10696 bcopy(sata_rqsense_cdb, scmd->satacmd_acdb, SATA_ATAPI_RQSENSE_CDB_LEN);
10697 /* Following zeroing of pad bytes may not be necessary */
10698 bzero(&scmd->satacmd_acdb[SATA_ATAPI_RQSENSE_CDB_LEN],
10699 sdinfo->satadrv_atapi_cdb_len - SATA_ATAPI_RQSENSE_CDB_LEN);
10700
10701 /*
10702 * Set-up pointer to the buffer handle, so HBA can sync buffer
10703 * before accessing it. Handle is in usual place in translate struct.
10704 */
10705 scmd->satacmd_err_ret_buf_handle = &spx->txlt_buf_dma_handle;
10706
10707 /*
10708 * Preset request sense data to NO SENSE.
10709 * Here it is redundant, only for a symetry with scsi-originated
10710 * packets. It should not be used for anything but debugging.
10711 */
10712 bzero(scmd->satacmd_rqsense, SATA_ATAPI_RQSENSE_LEN);
10713 sata_fixed_sense_data_preset(
10714 (struct scsi_extended_sense *)scmd->satacmd_rqsense);
10715
10716 ASSERT(scmd->satacmd_num_dma_cookies != 0);
10717 ASSERT(scmd->satacmd_dma_cookie_list != NULL);
10718
10719 return (SATA_SUCCESS);
10720 }
10721
10722 /*
10723 * Set-up ATAPI packet command.
10724 * Data transfer direction has to be set-up in sata_cmd structure prior to
10725 * calling this function.
10726 *
10727 * Returns void
10728 */
10729
10730 static void
sata_atapi_packet_cmd_setup(sata_cmd_t * scmd,sata_drive_info_t * sdinfo)10731 sata_atapi_packet_cmd_setup(sata_cmd_t *scmd, sata_drive_info_t *sdinfo)
10732 {
10733 scmd->satacmd_addr_type = 0; /* N/A */
10734 scmd->satacmd_sec_count_lsb = 0; /* no tag */
10735 scmd->satacmd_lba_low_lsb = 0; /* N/A */
10736 scmd->satacmd_lba_mid_lsb = (uint8_t)SATA_ATAPI_MAX_BYTES_PER_DRQ;
10737 scmd->satacmd_lba_high_lsb =
10738 (uint8_t)(SATA_ATAPI_MAX_BYTES_PER_DRQ >> 8);
10739 scmd->satacmd_cmd_reg = SATAC_PACKET; /* Command */
10740
10741 /*
10742 * We want all data to be transfered via DMA.
10743 * But specify it only if drive supports DMA and DMA mode is
10744 * selected - some drives are sensitive about it.
10745 * Hopefully it wil work for all drives....
10746 */
10747 if (sdinfo->satadrv_settings & SATA_DEV_DMA)
10748 scmd->satacmd_features_reg = SATA_ATAPI_F_DMA;
10749
10750 /*
10751 * Features register requires special care for devices that use
10752 * Serial ATA bridge - they need an explicit specification of
10753 * the data transfer direction for Packet DMA commands.
10754 * Setting this bit is harmless if DMA is not used.
10755 *
10756 * Many drives do not implement word 80, specifying what ATA/ATAPI
10757 * spec they follow.
10758 * We are arbitrarily following the latest SerialATA 2.6 spec,
10759 * which uses ATA/ATAPI 6 specification for Identify Data, unless
10760 * ATA/ATAPI-7 support is explicitly indicated.
10761 */
10762 if (sdinfo->satadrv_id.ai_majorversion != 0 &&
10763 sdinfo->satadrv_id.ai_majorversion != 0xffff &&
10764 (sdinfo->satadrv_id.ai_majorversion & SATA_MAJVER_7) != 0) {
10765 /*
10766 * Specification of major version is valid and version 7
10767 * is supported. It does automatically imply that all
10768 * spec features are supported. For now, we assume that
10769 * DMADIR setting is valid. ATA/ATAPI7 spec is incomplete.
10770 */
10771 if ((sdinfo->satadrv_id.ai_dirdma &
10772 SATA_ATAPI_ID_DMADIR_REQ) != 0) {
10773 if (scmd->satacmd_flags.sata_data_direction ==
10774 SATA_DIR_READ) {
10775 scmd->satacmd_features_reg |=
10776 SATA_ATAPI_F_DATA_DIR_READ;
10777 }
10778 }
10779 }
10780 }
10781
10782
10783 #ifdef SATA_DEBUG
10784
10785 /* Display 18 bytes of Inquiry data */
10786 static void
sata_show_inqry_data(uint8_t * buf)10787 sata_show_inqry_data(uint8_t *buf)
10788 {
10789 struct scsi_inquiry *inq = (struct scsi_inquiry *)buf;
10790 uint8_t *p;
10791
10792 cmn_err(CE_NOTE, "Inquiry data:");
10793 cmn_err(CE_NOTE, "device type %x", inq->inq_dtype);
10794 cmn_err(CE_NOTE, "removable media %x", inq->inq_rmb);
10795 cmn_err(CE_NOTE, "version %x", inq->inq_ansi);
10796 cmn_err(CE_NOTE, "ATAPI transport version %d",
10797 SATA_ATAPI_TRANS_VERSION(inq));
10798 cmn_err(CE_NOTE, "response data format %d, aenc %d",
10799 inq->inq_rdf, inq->inq_aenc);
10800 cmn_err(CE_NOTE, " additional length %d", inq->inq_len);
10801 cmn_err(CE_NOTE, "tpgs %d", inq->inq_tpgs);
10802 p = (uint8_t *)inq->inq_vid;
10803 cmn_err(CE_NOTE, "vendor id (binary): %02x %02x %02x %02x "
10804 "%02x %02x %02x %02x",
10805 p[0], p[1], p[2], p[3], p[4], p[5], p[6], p[7]);
10806 p = (uint8_t *)inq->inq_vid;
10807 cmn_err(CE_NOTE, "vendor id: %c %c %c %c %c %c %c %c",
10808 p[0], p[1], p[2], p[3], p[4], p[5], p[6], p[7]);
10809
10810 p = (uint8_t *)inq->inq_pid;
10811 cmn_err(CE_NOTE, "product id (binary): %02x %02x %02x %02x "
10812 "%02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x",
10813 p[0], p[1], p[2], p[3], p[4], p[5], p[6], p[7],
10814 p[8], p[9], p[10], p[11], p[12], p[13], p[14], p[15]);
10815 p = (uint8_t *)inq->inq_pid;
10816 cmn_err(CE_NOTE, "product id: %c %c %c %c %c %c %c %c "
10817 "%c %c %c %c %c %c %c %c",
10818 p[0], p[1], p[2], p[3], p[4], p[5], p[6], p[7],
10819 p[8], p[9], p[10], p[11], p[12], p[13], p[14], p[15]);
10820
10821 p = (uint8_t *)inq->inq_revision;
10822 cmn_err(CE_NOTE, "revision (binary): %02x %02x %02x %02x",
10823 p[0], p[1], p[2], p[3]);
10824 p = (uint8_t *)inq->inq_revision;
10825 cmn_err(CE_NOTE, "revision: %c %c %c %c",
10826 p[0], p[1], p[2], p[3]);
10827
10828 }
10829
10830
10831 static void
sata_save_atapi_trace(sata_pkt_txlate_t * spx,int count)10832 sata_save_atapi_trace(sata_pkt_txlate_t *spx, int count)
10833 {
10834 struct scsi_pkt *scsi_pkt = spx->txlt_scsi_pkt;
10835
10836 if (scsi_pkt == NULL)
10837 return;
10838 if (count != 0) {
10839 /* saving cdb */
10840 bzero(sata_atapi_trace[sata_atapi_trace_index].acdb,
10841 SATA_ATAPI_MAX_CDB_LEN);
10842 bcopy(scsi_pkt->pkt_cdbp,
10843 sata_atapi_trace[sata_atapi_trace_index].acdb, count);
10844 } else {
10845 bcopy(&((struct scsi_arq_status *)scsi_pkt->pkt_scbp)->
10846 sts_sensedata,
10847 sata_atapi_trace[sata_atapi_trace_index].arqs,
10848 SATA_ATAPI_MIN_RQSENSE_LEN);
10849 sata_atapi_trace[sata_atapi_trace_index].scsi_pkt_reason =
10850 scsi_pkt->pkt_reason;
10851 sata_atapi_trace[sata_atapi_trace_index].sata_pkt_reason =
10852 spx->txlt_sata_pkt->satapkt_reason;
10853
10854 if (++sata_atapi_trace_index >= 64)
10855 sata_atapi_trace_index = 0;
10856 }
10857 }
10858
10859 #endif
10860
10861 /*
10862 * Fetch inquiry data from ATAPI device
10863 * Returns SATA_SUCCESS if operation was successful, SATA_FAILURE otherwise.
10864 *
10865 * Note:
10866 * inqb pointer does not point to a DMA-able buffer. It is a local buffer
10867 * where the caller expects to see the inquiry data.
10868 *
10869 */
10870
10871 static int
sata_get_atapi_inquiry_data(sata_hba_inst_t * sata_hba,sata_address_t * saddr,struct scsi_inquiry * inq)10872 sata_get_atapi_inquiry_data(sata_hba_inst_t *sata_hba,
10873 sata_address_t *saddr, struct scsi_inquiry *inq)
10874 {
10875 sata_pkt_txlate_t *spx;
10876 sata_pkt_t *spkt;
10877 struct buf *bp;
10878 sata_drive_info_t *sdinfo;
10879 sata_cmd_t *scmd;
10880 int rval;
10881 uint8_t *rqsp;
10882 dev_info_t *dip = SATA_DIP(sata_hba);
10883 #ifdef SATA_DEBUG
10884 char msg_buf[MAXPATHLEN];
10885 #endif
10886 kmutex_t *cport_mutex;
10887
10888 ASSERT(sata_hba != NULL);
10889
10890 spx = kmem_zalloc(sizeof (sata_pkt_txlate_t), KM_SLEEP);
10891 spx->txlt_sata_hba_inst = sata_hba;
10892 spx->txlt_scsi_pkt = NULL; /* No scsi pkt involved */
10893 spkt = sata_pkt_alloc(spx, NULL);
10894 if (spkt == NULL) {
10895 kmem_free(spx, sizeof (sata_pkt_txlate_t));
10896 return (SATA_FAILURE);
10897 }
10898 /* address is needed now */
10899 spkt->satapkt_device.satadev_addr = *saddr;
10900
10901 /* scsi_inquiry size buffer */
10902 bp = sata_alloc_local_buffer(spx, sizeof (struct scsi_inquiry));
10903 if (bp == NULL) {
10904 sata_pkt_free(spx);
10905 kmem_free(spx, sizeof (sata_pkt_txlate_t));
10906 SATA_LOG_D((sata_hba, CE_WARN,
10907 "sata_get_atapi_inquiry_data: "
10908 "cannot allocate data buffer"));
10909 return (SATA_FAILURE);
10910 }
10911 bp_mapin(bp); /* make data buffer accessible */
10912
10913 scmd = &spkt->satapkt_cmd;
10914 ASSERT(scmd->satacmd_num_dma_cookies != 0);
10915 ASSERT(scmd->satacmd_dma_cookie_list != NULL);
10916
10917 /* Use synchronous mode */
10918 spkt->satapkt_op_mode = SATA_OPMODE_SYNCH | SATA_OPMODE_INTERRUPTS;
10919 spkt->satapkt_comp = NULL;
10920 spkt->satapkt_time = sata_default_pkt_time;
10921
10922 /* Issue inquiry command - 6 bytes cdb, data transfer, read */
10923
10924 scmd->satacmd_flags.sata_data_direction = SATA_DIR_READ;
10925 scmd->satacmd_flags.sata_ignore_dev_reset = B_TRUE;
10926
10927 cport_mutex = &(SATA_CPORT_MUTEX(sata_hba, saddr->cport));
10928 mutex_enter(cport_mutex);
10929 sdinfo = sata_get_device_info(sata_hba,
10930 &spx->txlt_sata_pkt->satapkt_device);
10931 if (sdinfo == NULL) {
10932 /* we have to be carefull about the disapearing device */
10933 mutex_exit(cport_mutex);
10934 rval = SATA_FAILURE;
10935 goto cleanup;
10936 }
10937 sata_atapi_packet_cmd_setup(scmd, sdinfo);
10938
10939 /*
10940 * Set-up acdb. This works for atapi transport version 2 and later.
10941 */
10942 scmd->satacmd_acdb_len = sdinfo->satadrv_atapi_cdb_len;
10943 bzero(scmd->satacmd_acdb, SATA_ATAPI_MAX_CDB_LEN);
10944 scmd->satacmd_acdb[0] = 0x12; /* Inquiry */
10945 scmd->satacmd_acdb[1] = 0x00;
10946 scmd->satacmd_acdb[2] = 0x00;
10947 scmd->satacmd_acdb[3] = 0x00;
10948 scmd->satacmd_acdb[4] = sizeof (struct scsi_inquiry);
10949 scmd->satacmd_acdb[5] = 0x00;
10950
10951 sata_fixed_sense_data_preset(
10952 (struct scsi_extended_sense *)scmd->satacmd_rqsense);
10953
10954 /* Transfer command to HBA */
10955 if (sata_hba_start(spx, &rval) != 0) {
10956 /* Pkt not accepted for execution */
10957 SATADBG1(SATA_DBG_ATAPI, sata_hba,
10958 "sata_get_atapi_inquiry_data: "
10959 "Packet not accepted for execution - ret: %02x", rval);
10960 mutex_exit(cport_mutex);
10961 rval = SATA_FAILURE;
10962 goto cleanup;
10963 }
10964 mutex_exit(cport_mutex);
10965
10966 if (spkt->satapkt_reason == SATA_PKT_COMPLETED) {
10967 SATADBG1(SATA_DBG_ATAPI, sata_hba,
10968 "sata_get_atapi_inquiry_data: "
10969 "Packet completed successfully - ret: %02x", rval);
10970 if (spx->txlt_buf_dma_handle != NULL) {
10971 /*
10972 * Sync buffer. Handle is in usual place in translate
10973 * struct.
10974 */
10975 rval = ddi_dma_sync(spx->txlt_buf_dma_handle, 0, 0,
10976 DDI_DMA_SYNC_FORCPU);
10977 ASSERT(rval == DDI_SUCCESS);
10978 }
10979
10980 if (sata_check_for_dma_error(dip, spx)) {
10981 ddi_fm_service_impact(dip, DDI_SERVICE_UNAFFECTED);
10982 rval = SATA_FAILURE;
10983 } else {
10984 /*
10985 * Normal completion - copy data into caller's buffer
10986 */
10987 bcopy(bp->b_un.b_addr, (uint8_t *)inq,
10988 sizeof (struct scsi_inquiry));
10989 #ifdef SATA_DEBUG
10990 if (sata_debug_flags & SATA_DBG_ATAPI) {
10991 sata_show_inqry_data((uint8_t *)inq);
10992 }
10993 #endif
10994 rval = SATA_SUCCESS;
10995 }
10996 } else {
10997 /*
10998 * Something went wrong - analyze return - check rqsense data
10999 */
11000 rval = SATA_FAILURE;
11001 if (spkt->satapkt_reason == SATA_PKT_DEV_ERROR) {
11002 /*
11003 * ARQ data hopefull show something other than NO SENSE
11004 */
11005 rqsp = scmd->satacmd_rqsense;
11006 #ifdef SATA_DEBUG
11007 if (sata_debug_flags & SATA_DBG_ATAPI) {
11008 msg_buf[0] = '\0';
11009 (void) snprintf(msg_buf, MAXPATHLEN,
11010 "ATAPI packet completion reason: %02x\n"
11011 "RQSENSE: %02x %02x %02x %02x %02x %02x\n"
11012 " %02x %02x %02x %02x %02x %02x\n"
11013 " %02x %02x %02x %02x %02x %02x",
11014 spkt->satapkt_reason,
11015 rqsp[0], rqsp[1], rqsp[2], rqsp[3],
11016 rqsp[4], rqsp[5], rqsp[6], rqsp[7],
11017 rqsp[8], rqsp[9], rqsp[10], rqsp[11],
11018 rqsp[12], rqsp[13], rqsp[14], rqsp[15],
11019 rqsp[16], rqsp[17]);
11020 sata_log(spx->txlt_sata_hba_inst, CE_WARN,
11021 "%s", msg_buf);
11022 }
11023 #endif
11024 } else {
11025 switch (spkt->satapkt_reason) {
11026 case SATA_PKT_PORT_ERROR:
11027 SATADBG1(SATA_DBG_ATAPI, sata_hba,
11028 "sata_get_atapi_inquiry_data: "
11029 "packet reason: port error", NULL);
11030 break;
11031
11032 case SATA_PKT_TIMEOUT:
11033 SATADBG1(SATA_DBG_ATAPI, sata_hba,
11034 "sata_get_atapi_inquiry_data: "
11035 "packet reason: timeout", NULL);
11036 break;
11037
11038 case SATA_PKT_ABORTED:
11039 SATADBG1(SATA_DBG_ATAPI, sata_hba,
11040 "sata_get_atapi_inquiry_data: "
11041 "packet reason: aborted", NULL);
11042 break;
11043
11044 case SATA_PKT_RESET:
11045 SATADBG1(SATA_DBG_ATAPI, sata_hba,
11046 "sata_get_atapi_inquiry_data: "
11047 "packet reason: reset\n", NULL);
11048 break;
11049 default:
11050 SATADBG1(SATA_DBG_ATAPI, sata_hba,
11051 "sata_get_atapi_inquiry_data: "
11052 "invalid packet reason: %02x\n",
11053 spkt->satapkt_reason);
11054 break;
11055 }
11056 }
11057 }
11058 cleanup:
11059 sata_free_local_buffer(spx);
11060 sata_pkt_free(spx);
11061 kmem_free(spx, sizeof (sata_pkt_txlate_t));
11062 return (rval);
11063 }
11064
11065
11066
11067
11068
11069 #if 0
11070 #ifdef SATA_DEBUG
11071
11072 /*
11073 * Test ATAPI packet command.
11074 * Single threaded test: send packet command in synch mode, process completion
11075 *
11076 */
11077 static void
11078 sata_test_atapi_packet_command(sata_hba_inst_t *sata_hba_inst, int cport)
11079 {
11080 sata_pkt_txlate_t *spx;
11081 sata_pkt_t *spkt;
11082 struct buf *bp;
11083 sata_device_t sata_device;
11084 sata_drive_info_t *sdinfo;
11085 sata_cmd_t *scmd;
11086 int rval;
11087 uint8_t *rqsp;
11088
11089 ASSERT(sata_hba_inst != NULL);
11090 sata_device.satadev_addr.cport = cport;
11091 sata_device.satadev_addr.pmport = 0;
11092 sata_device.satadev_addr.qual = SATA_ADDR_DCPORT;
11093 sata_device.satadev_rev = SATA_DEVICE_REV;
11094 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, cport)->cport_mutex);
11095 sdinfo = sata_get_device_info(sata_hba_inst, &sata_device);
11096 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, cport)->cport_mutex);
11097 if (sdinfo == NULL) {
11098 sata_log(sata_hba_inst, CE_WARN,
11099 "sata_test_atapi_packet_command: "
11100 "no device info for cport %d",
11101 sata_device.satadev_addr.cport);
11102 return;
11103 }
11104
11105 spx = kmem_zalloc(sizeof (sata_pkt_txlate_t), KM_SLEEP);
11106 spx->txlt_sata_hba_inst = sata_hba_inst;
11107 spx->txlt_scsi_pkt = NULL; /* No scsi pkt involved */
11108 spkt = sata_pkt_alloc(spx, NULL);
11109 if (spkt == NULL) {
11110 kmem_free(spx, sizeof (sata_pkt_txlate_t));
11111 return;
11112 }
11113 /* address is needed now */
11114 spkt->satapkt_device.satadev_addr = sata_device.satadev_addr;
11115
11116 /* 1024k buffer */
11117 bp = sata_alloc_local_buffer(spx, 1024);
11118 if (bp == NULL) {
11119 sata_pkt_free(spx);
11120 kmem_free(spx, sizeof (sata_pkt_txlate_t));
11121 sata_log(sata_hba_inst, CE_WARN,
11122 "sata_test_atapi_packet_command: "
11123 "cannot allocate data buffer");
11124 return;
11125 }
11126 bp_mapin(bp); /* make data buffer accessible */
11127
11128 scmd = &spkt->satapkt_cmd;
11129 ASSERT(scmd->satacmd_num_dma_cookies != 0);
11130 ASSERT(scmd->satacmd_dma_cookie_list != NULL);
11131
11132 /* Use synchronous mode */
11133 spkt->satapkt_op_mode = SATA_OPMODE_SYNCH | SATA_OPMODE_INTERRUPTS;
11134
11135 /* Synchronous mode, no callback - may be changed by the caller */
11136 spkt->satapkt_comp = NULL;
11137 spkt->satapkt_time = sata_default_pkt_time;
11138
11139 /* Issue inquiry command - 6 bytes cdb, data transfer, read */
11140
11141 scmd->satacmd_flags.sata_data_direction = SATA_DIR_READ;
11142 scmd->satacmd_flags.sata_ignore_dev_reset = B_TRUE;
11143
11144 sata_atapi_packet_cmd_setup(scmd, sdinfo);
11145
11146 /* Set-up acdb. */
11147 scmd->satacmd_acdb_len = sdinfo->satadrv_atapi_cdb_len;
11148 bzero(scmd->satacmd_acdb, SATA_ATAPI_MAX_CDB_LEN);
11149 scmd->satacmd_acdb[0] = 0x12; /* Inquiry */
11150 scmd->satacmd_acdb[1] = 0x00;
11151 scmd->satacmd_acdb[2] = 0x00;
11152 scmd->satacmd_acdb[3] = 0x00;
11153 scmd->satacmd_acdb[4] = sizeof (struct scsi_inquiry);
11154 scmd->satacmd_acdb[5] = 0x00;
11155
11156 sata_fixed_sense_data_preset(
11157 (struct scsi_extended_sense *)scmd->satacmd_rqsense);
11158
11159 /* Transfer command to HBA */
11160 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, cport)->cport_mutex);
11161 if (sata_hba_start(spx, &rval) != 0) {
11162 /* Pkt not accepted for execution */
11163 sata_log(sata_hba_inst, CE_WARN,
11164 "sata_test_atapi_packet_command: "
11165 "Packet not accepted for execution - ret: %02x", rval);
11166 mutex_exit(
11167 &SATA_CPORT_INFO(sata_hba_inst, cport)->cport_mutex);
11168 goto cleanup;
11169 }
11170 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, cport)->cport_mutex);
11171
11172 if (spx->txlt_buf_dma_handle != NULL) {
11173 /*
11174 * Sync buffer. Handle is in usual place in translate struct.
11175 */
11176 rval = ddi_dma_sync(spx->txlt_buf_dma_handle, 0, 0,
11177 DDI_DMA_SYNC_FORCPU);
11178 ASSERT(rval == DDI_SUCCESS);
11179 }
11180 if (spkt->satapkt_reason == SATA_PKT_COMPLETED) {
11181 sata_log(sata_hba_inst, CE_WARN,
11182 "sata_test_atapi_packet_command: "
11183 "Packet completed successfully");
11184 /*
11185 * Normal completion - show inquiry data
11186 */
11187 sata_show_inqry_data((uint8_t *)bp->b_un.b_addr);
11188 } else {
11189 /*
11190 * Something went wrong - analyze return - check rqsense data
11191 */
11192 if (spkt->satapkt_reason == SATA_PKT_DEV_ERROR) {
11193 /*
11194 * ARQ data hopefull show something other than NO SENSE
11195 */
11196 rqsp = scmd->satacmd_rqsense;
11197 sata_log(spx->txlt_sata_hba_inst, CE_WARN,
11198 "ATAPI packet completion reason: %02x\n"
11199 "RQSENSE: %02x %02x %02x %02x %02x %02x "
11200 " %02x %02x %02x %02x %02x %02x "
11201 " %02x %02x %02x %02x %02x %02x\n",
11202 spkt->satapkt_reason,
11203 rqsp[0], rqsp[1], rqsp[2], rqsp[3],
11204 rqsp[4], rqsp[5], rqsp[6], rqsp[7],
11205 rqsp[8], rqsp[9], rqsp[10], rqsp[11],
11206 rqsp[12], rqsp[13], rqsp[14], rqsp[15],
11207 rqsp[16], rqsp[17]);
11208 } else {
11209 switch (spkt->satapkt_reason) {
11210 case SATA_PKT_PORT_ERROR:
11211 sata_log(sata_hba_inst, CE_WARN,
11212 "sata_test_atapi_packet_command: "
11213 "packet reason: port error\n");
11214 break;
11215
11216 case SATA_PKT_TIMEOUT:
11217 sata_log(sata_hba_inst, CE_WARN,
11218 "sata_test_atapi_packet_command: "
11219 "packet reason: timeout\n");
11220 break;
11221
11222 case SATA_PKT_ABORTED:
11223 sata_log(sata_hba_inst, CE_WARN,
11224 "sata_test_atapi_packet_command: "
11225 "packet reason: aborted\n");
11226 break;
11227
11228 case SATA_PKT_RESET:
11229 sata_log(sata_hba_inst, CE_WARN,
11230 "sata_test_atapi_packet_command: "
11231 "packet reason: reset\n");
11232 break;
11233 default:
11234 sata_log(sata_hba_inst, CE_WARN,
11235 "sata_test_atapi_packet_command: "
11236 "invalid packet reason: %02x\n",
11237 spkt->satapkt_reason);
11238 break;
11239 }
11240 }
11241 }
11242 cleanup:
11243 sata_free_local_buffer(spx);
11244 sata_pkt_free(spx);
11245 kmem_free(spx, sizeof (sata_pkt_txlate_t));
11246 }
11247
11248 #endif /* SATA_DEBUG */
11249 #endif /* 1 */
11250
11251
11252 /* ************************** LOCAL HELPER FUNCTIONS *********************** */
11253
11254 /*
11255 * Validate sata_tran info
11256 * SATA_FAILURE returns if structure is inconsistent or structure revision
11257 * does not match one used by the framework.
11258 *
11259 * Returns SATA_SUCCESS if sata_hba_tran has matching revision and contains
11260 * required function pointers.
11261 * Returns SATA_FAILURE otherwise.
11262 */
11263 static int
sata_validate_sata_hba_tran(dev_info_t * dip,sata_hba_tran_t * sata_tran)11264 sata_validate_sata_hba_tran(dev_info_t *dip, sata_hba_tran_t *sata_tran)
11265 {
11266 /*
11267 * SATA_TRAN_HBA_REV is the current (highest) revision number
11268 * of the SATA interface.
11269 */
11270 if (sata_tran->sata_tran_hba_rev > SATA_TRAN_HBA_REV) {
11271 sata_log(NULL, CE_WARN,
11272 "sata: invalid sata_hba_tran version %d for driver %s",
11273 sata_tran->sata_tran_hba_rev, ddi_driver_name(dip));
11274 return (SATA_FAILURE);
11275 }
11276
11277 if (dip != sata_tran->sata_tran_hba_dip) {
11278 SATA_LOG_D((NULL, CE_WARN,
11279 "sata: inconsistent sata_tran_hba_dip "
11280 "%p / %p", sata_tran->sata_tran_hba_dip, dip));
11281 return (SATA_FAILURE);
11282 }
11283
11284 if (sata_tran->sata_tran_probe_port == NULL ||
11285 sata_tran->sata_tran_start == NULL ||
11286 sata_tran->sata_tran_abort == NULL ||
11287 sata_tran->sata_tran_reset_dport == NULL ||
11288 sata_tran->sata_tran_hotplug_ops == NULL ||
11289 sata_tran->sata_tran_hotplug_ops->sata_tran_port_activate == NULL ||
11290 sata_tran->sata_tran_hotplug_ops->sata_tran_port_deactivate ==
11291 NULL) {
11292 SATA_LOG_D((NULL, CE_WARN, "sata: sata_hba_tran missing "
11293 "required functions"));
11294 }
11295 return (SATA_SUCCESS);
11296 }
11297
11298 /*
11299 * Remove HBA instance from sata_hba_list.
11300 */
11301 static void
sata_remove_hba_instance(dev_info_t * dip)11302 sata_remove_hba_instance(dev_info_t *dip)
11303 {
11304 sata_hba_inst_t *sata_hba_inst;
11305
11306 mutex_enter(&sata_mutex);
11307 for (sata_hba_inst = sata_hba_list;
11308 sata_hba_inst != (struct sata_hba_inst *)NULL;
11309 sata_hba_inst = sata_hba_inst->satahba_next) {
11310 if (sata_hba_inst->satahba_dip == dip)
11311 break;
11312 }
11313
11314 if (sata_hba_inst == (struct sata_hba_inst *)NULL) {
11315 #ifdef SATA_DEBUG
11316 cmn_err(CE_WARN, "sata_remove_hba_instance: "
11317 "unknown HBA instance\n");
11318 #endif
11319 ASSERT(FALSE);
11320 }
11321 if (sata_hba_inst == sata_hba_list) {
11322 sata_hba_list = sata_hba_inst->satahba_next;
11323 if (sata_hba_list) {
11324 sata_hba_list->satahba_prev =
11325 (struct sata_hba_inst *)NULL;
11326 }
11327 if (sata_hba_inst == sata_hba_list_tail) {
11328 sata_hba_list_tail = NULL;
11329 }
11330 } else if (sata_hba_inst == sata_hba_list_tail) {
11331 sata_hba_list_tail = sata_hba_inst->satahba_prev;
11332 if (sata_hba_list_tail) {
11333 sata_hba_list_tail->satahba_next =
11334 (struct sata_hba_inst *)NULL;
11335 }
11336 } else {
11337 sata_hba_inst->satahba_prev->satahba_next =
11338 sata_hba_inst->satahba_next;
11339 sata_hba_inst->satahba_next->satahba_prev =
11340 sata_hba_inst->satahba_prev;
11341 }
11342 mutex_exit(&sata_mutex);
11343 }
11344
11345 /*
11346 * Probe all SATA ports of the specified HBA instance.
11347 * The assumption is that there are no target and attachment point minor nodes
11348 * created by the boot subsystems, so we do not need to prune device tree.
11349 *
11350 * This function is called only from sata_hba_attach(). It does not have to
11351 * be protected by controller mutex, because the hba_attached flag is not set
11352 * yet and no one would be touching this HBA instance other than this thread.
11353 * Determines if port is active and what type of the device is attached
11354 * (if any). Allocates necessary structures for each port.
11355 *
11356 * An AP (Attachement Point) node is created for each SATA device port even
11357 * when there is no device attached.
11358 */
11359
11360 static void
sata_probe_ports(sata_hba_inst_t * sata_hba_inst)11361 sata_probe_ports(sata_hba_inst_t *sata_hba_inst)
11362 {
11363 dev_info_t *dip = SATA_DIP(sata_hba_inst);
11364 int ncport;
11365 sata_cport_info_t *cportinfo;
11366 sata_drive_info_t *drive;
11367 sata_device_t sata_device;
11368 int rval;
11369 dev_t minor_number;
11370 char name[16];
11371 clock_t start_time, cur_time;
11372
11373 /*
11374 * Probe controller ports first, to find port status and
11375 * any port multiplier attached.
11376 */
11377 for (ncport = 0; ncport < SATA_NUM_CPORTS(sata_hba_inst); ncport++) {
11378 /* allocate cport structure */
11379 cportinfo = kmem_zalloc(sizeof (sata_cport_info_t), KM_SLEEP);
11380 ASSERT(cportinfo != NULL);
11381 mutex_init(&cportinfo->cport_mutex, NULL, MUTEX_DRIVER, NULL);
11382
11383 mutex_enter(&cportinfo->cport_mutex);
11384
11385 cportinfo->cport_addr.cport = ncport;
11386 cportinfo->cport_addr.pmport = 0;
11387 cportinfo->cport_addr.qual = SATA_ADDR_CPORT;
11388 cportinfo->cport_state &= ~SATA_PORT_STATE_CLEAR_MASK;
11389 cportinfo->cport_state |= SATA_STATE_PROBING;
11390 SATA_CPORT_INFO(sata_hba_inst, ncport) = cportinfo;
11391
11392 /*
11393 * Regardless if a port is usable or not, create
11394 * an attachment point
11395 */
11396 mutex_exit(&cportinfo->cport_mutex);
11397 minor_number = SATA_MAKE_AP_MINOR(ddi_get_instance(dip),
11398 ncport, 0, SATA_ADDR_CPORT);
11399 (void) sprintf(name, "%d", ncport);
11400 if (ddi_create_minor_node(dip, name, S_IFCHR,
11401 minor_number, DDI_NT_SATA_ATTACHMENT_POINT, 0) !=
11402 DDI_SUCCESS) {
11403 sata_log(sata_hba_inst, CE_WARN, "sata_hba_attach: "
11404 "cannot create SATA attachment point for port %d",
11405 ncport);
11406 }
11407
11408 /* Probe port */
11409 start_time = ddi_get_lbolt();
11410 reprobe_cport:
11411 sata_device.satadev_addr.cport = ncport;
11412 sata_device.satadev_addr.pmport = 0;
11413 sata_device.satadev_addr.qual = SATA_ADDR_CPORT;
11414 sata_device.satadev_rev = SATA_DEVICE_REV;
11415
11416 rval = (*SATA_PROBE_PORT_FUNC(sata_hba_inst))
11417 (dip, &sata_device);
11418
11419 mutex_enter(&cportinfo->cport_mutex);
11420 cportinfo->cport_scr = sata_device.satadev_scr;
11421 if (rval != SATA_SUCCESS) {
11422 /* Something went wrong? Fail the port */
11423 cportinfo->cport_state = SATA_PSTATE_FAILED;
11424 mutex_exit(&cportinfo->cport_mutex);
11425 continue;
11426 }
11427 cportinfo->cport_state &= ~SATA_STATE_PROBING;
11428 cportinfo->cport_state |= SATA_STATE_PROBED;
11429 cportinfo->cport_dev_type = sata_device.satadev_type;
11430
11431 cportinfo->cport_state |= SATA_STATE_READY;
11432 if (cportinfo->cport_dev_type == SATA_DTYPE_NONE) {
11433 mutex_exit(&cportinfo->cport_mutex);
11434 continue;
11435 }
11436 if (cportinfo->cport_dev_type != SATA_DTYPE_PMULT) {
11437 /*
11438 * There is some device attached.
11439 * Allocate device info structure
11440 */
11441 if (SATA_CPORTINFO_DRV_INFO(cportinfo) == NULL) {
11442 mutex_exit(&cportinfo->cport_mutex);
11443 SATA_CPORTINFO_DRV_INFO(cportinfo) =
11444 kmem_zalloc(sizeof (sata_drive_info_t),
11445 KM_SLEEP);
11446 mutex_enter(&cportinfo->cport_mutex);
11447 }
11448 drive = SATA_CPORTINFO_DRV_INFO(cportinfo);
11449 drive->satadrv_addr = cportinfo->cport_addr;
11450 drive->satadrv_addr.qual = SATA_ADDR_DCPORT;
11451 drive->satadrv_type = cportinfo->cport_dev_type;
11452 drive->satadrv_state = SATA_STATE_UNKNOWN;
11453
11454 mutex_exit(&cportinfo->cport_mutex);
11455 if (sata_add_device(dip, sata_hba_inst, &sata_device) !=
11456 SATA_SUCCESS) {
11457 /*
11458 * Plugged device was not correctly identified.
11459 * Retry, within a SATA_DEV_IDENTIFY_TIMEOUT
11460 */
11461 cur_time = ddi_get_lbolt();
11462 if ((cur_time - start_time) <
11463 drv_usectohz(SATA_DEV_IDENTIFY_TIMEOUT)) {
11464 /* sleep for a while */
11465 delay(drv_usectohz(
11466 SATA_DEV_RETRY_DLY));
11467 goto reprobe_cport;
11468 }
11469 }
11470 } else { /* SATA_DTYPE_PMULT */
11471 mutex_exit(&cportinfo->cport_mutex);
11472
11473 /* Allocate sata_pmult_info and sata_pmport_info */
11474 if (sata_alloc_pmult(sata_hba_inst, &sata_device) !=
11475 SATA_SUCCESS)
11476 continue;
11477
11478 /* Log the information of the port multiplier */
11479 sata_show_pmult_info(sata_hba_inst, &sata_device);
11480
11481 /* Probe its pmports */
11482 sata_probe_pmports(sata_hba_inst, ncport);
11483 }
11484 }
11485 }
11486
11487 /*
11488 * Probe all device ports behind a port multiplier.
11489 *
11490 * PMult-related structure should be allocated before by sata_alloc_pmult().
11491 *
11492 * NOTE1: Only called from sata_probe_ports()
11493 * NOTE2: No mutex should be hold.
11494 */
11495 static void
sata_probe_pmports(sata_hba_inst_t * sata_hba_inst,uint8_t ncport)11496 sata_probe_pmports(sata_hba_inst_t *sata_hba_inst, uint8_t ncport)
11497 {
11498 dev_info_t *dip = SATA_DIP(sata_hba_inst);
11499 sata_pmult_info_t *pmultinfo = NULL;
11500 sata_pmport_info_t *pmportinfo = NULL;
11501 sata_drive_info_t *drive = NULL;
11502 sata_device_t sata_device;
11503
11504 clock_t start_time, cur_time;
11505 int npmport;
11506 int rval;
11507
11508 pmultinfo = SATA_PMULT_INFO(sata_hba_inst, ncport);
11509
11510 /* Probe Port Multiplier ports */
11511 for (npmport = 0; npmport < pmultinfo->pmult_num_dev_ports; npmport++) {
11512 pmportinfo = pmultinfo->pmult_dev_port[npmport];
11513 start_time = ddi_get_lbolt();
11514 reprobe_pmport:
11515 sata_device.satadev_addr.cport = ncport;
11516 sata_device.satadev_addr.pmport = npmport;
11517 sata_device.satadev_addr.qual = SATA_ADDR_PMPORT;
11518 sata_device.satadev_rev = SATA_DEVICE_REV;
11519
11520 /* Let HBA driver probe it. */
11521 rval = (*SATA_PROBE_PORT_FUNC(sata_hba_inst))
11522 (dip, &sata_device);
11523 mutex_enter(&pmportinfo->pmport_mutex);
11524
11525 pmportinfo->pmport_scr = sata_device.satadev_scr;
11526
11527 if (rval != SATA_SUCCESS) {
11528 pmportinfo->pmport_state =
11529 SATA_PSTATE_FAILED;
11530 mutex_exit(&pmportinfo->pmport_mutex);
11531 continue;
11532 }
11533 pmportinfo->pmport_state &= ~SATA_STATE_PROBING;
11534 pmportinfo->pmport_state |= SATA_STATE_PROBED;
11535 pmportinfo->pmport_dev_type = sata_device.satadev_type;
11536
11537 pmportinfo->pmport_state |= SATA_STATE_READY;
11538 if (pmportinfo->pmport_dev_type ==
11539 SATA_DTYPE_NONE) {
11540 SATADBG2(SATA_DBG_PMULT, sata_hba_inst,
11541 "no device found at port %d:%d", ncport, npmport);
11542 mutex_exit(&pmportinfo->pmport_mutex);
11543 continue;
11544 }
11545 /* Port multipliers cannot be chained */
11546 ASSERT(pmportinfo->pmport_dev_type != SATA_DTYPE_PMULT);
11547 /*
11548 * There is something attached to Port
11549 * Multiplier device port
11550 * Allocate device info structure
11551 */
11552 if (pmportinfo->pmport_sata_drive == NULL) {
11553 mutex_exit(&pmportinfo->pmport_mutex);
11554 pmportinfo->pmport_sata_drive =
11555 kmem_zalloc(sizeof (sata_drive_info_t), KM_SLEEP);
11556 mutex_enter(&pmportinfo->pmport_mutex);
11557 }
11558 drive = pmportinfo->pmport_sata_drive;
11559 drive->satadrv_addr.cport = pmportinfo->pmport_addr.cport;
11560 drive->satadrv_addr.pmport = npmport;
11561 drive->satadrv_addr.qual = SATA_ADDR_DPMPORT;
11562 drive->satadrv_type = pmportinfo-> pmport_dev_type;
11563 drive->satadrv_state = SATA_STATE_UNKNOWN;
11564
11565 mutex_exit(&pmportinfo->pmport_mutex);
11566 rval = sata_add_device(dip, sata_hba_inst, &sata_device);
11567
11568 if (rval != SATA_SUCCESS) {
11569 /*
11570 * Plugged device was not correctly identified.
11571 * Retry, within the SATA_DEV_IDENTIFY_TIMEOUT
11572 */
11573 cur_time = ddi_get_lbolt();
11574 if ((cur_time - start_time) < drv_usectohz(
11575 SATA_DEV_IDENTIFY_TIMEOUT)) {
11576 /* sleep for a while */
11577 delay(drv_usectohz(SATA_DEV_RETRY_DLY));
11578 goto reprobe_pmport;
11579 }
11580 }
11581 }
11582 }
11583
11584 /*
11585 * Add SATA device for specified HBA instance & port (SCSI target
11586 * device nodes).
11587 * This function is called (indirectly) only from sata_hba_attach().
11588 * A target node is created when there is a supported type device attached,
11589 * but may be removed if it cannot be put online.
11590 *
11591 * This function cannot be called from an interrupt context.
11592 *
11593 * Create target nodes for disk, CD/DVD, Tape and ATAPI disk devices
11594 *
11595 * Returns SATA_SUCCESS when port/device was fully processed, SATA_FAILURE when
11596 * device identification failed - adding a device could be retried.
11597 *
11598 */
11599 static int
sata_add_device(dev_info_t * pdip,sata_hba_inst_t * sata_hba_inst,sata_device_t * sata_device)11600 sata_add_device(dev_info_t *pdip, sata_hba_inst_t *sata_hba_inst,
11601 sata_device_t *sata_device)
11602 {
11603 sata_cport_info_t *cportinfo;
11604 sata_pmult_info_t *pminfo;
11605 sata_pmport_info_t *pmportinfo;
11606 dev_info_t *cdip; /* child dip */
11607 sata_address_t *saddr = &sata_device->satadev_addr;
11608 uint8_t cport, pmport;
11609 int rval;
11610
11611 cport = saddr->cport;
11612 pmport = saddr->pmport;
11613 cportinfo = SATA_CPORT_INFO(sata_hba_inst, cport);
11614 ASSERT(cportinfo->cport_dev_type != SATA_DTYPE_NONE);
11615
11616 /*
11617 * Some device is attached to a controller port.
11618 * We rely on controllers distinquishing between no-device,
11619 * attached port multiplier and other kind of attached device.
11620 * We need to get Identify Device data and determine
11621 * positively the dev type before trying to attach
11622 * the target driver.
11623 */
11624 sata_device->satadev_rev = SATA_DEVICE_REV;
11625 switch (saddr->qual) {
11626 case SATA_ADDR_CPORT:
11627 /*
11628 * Add a non-port-multiplier device at controller port.
11629 */
11630 saddr->qual = SATA_ADDR_DCPORT;
11631
11632 rval = sata_probe_device(sata_hba_inst, sata_device);
11633 if (rval != SATA_SUCCESS ||
11634 sata_device->satadev_type == SATA_DTYPE_UNKNOWN)
11635 return (SATA_FAILURE);
11636
11637 mutex_enter(&cportinfo->cport_mutex);
11638 sata_show_drive_info(sata_hba_inst,
11639 SATA_CPORTINFO_DRV_INFO(cportinfo));
11640
11641 if ((sata_device->satadev_type & SATA_VALID_DEV_TYPE) == 0) {
11642 /*
11643 * Could not determine device type or
11644 * a device is not supported.
11645 * Degrade this device to unknown.
11646 */
11647 cportinfo->cport_dev_type = SATA_DTYPE_UNKNOWN;
11648 mutex_exit(&cportinfo->cport_mutex);
11649 return (SATA_SUCCESS);
11650 }
11651 cportinfo->cport_dev_type = sata_device->satadev_type;
11652 cportinfo->cport_tgtnode_clean = B_TRUE;
11653 mutex_exit(&cportinfo->cport_mutex);
11654
11655 /*
11656 * Initialize device to the desired state. Even if it
11657 * fails, the device will still attach but syslog
11658 * will show the warning.
11659 */
11660 if (sata_initialize_device(sata_hba_inst,
11661 SATA_CPORTINFO_DRV_INFO(cportinfo)) != SATA_SUCCESS) {
11662 /* Retry */
11663 rval = sata_initialize_device(sata_hba_inst,
11664 SATA_CPORTINFO_DRV_INFO(cportinfo));
11665
11666 if (rval == SATA_RETRY)
11667 sata_log(sata_hba_inst, CE_WARN,
11668 "SATA device at port %d - "
11669 "default device features could not be set."
11670 " Device may not operate as expected.",
11671 cport);
11672 }
11673
11674 cdip = sata_create_target_node(pdip, sata_hba_inst, saddr);
11675 if (cdip == NULL) {
11676 /*
11677 * Attaching target node failed.
11678 * We retain sata_drive_info structure...
11679 */
11680 return (SATA_SUCCESS);
11681 }
11682
11683 mutex_enter(&cportinfo->cport_mutex);
11684 (SATA_CPORTINFO_DRV_INFO(cportinfo))->
11685 satadrv_state = SATA_STATE_READY;
11686 mutex_exit(&cportinfo->cport_mutex);
11687
11688 break;
11689
11690 case SATA_ADDR_PMPORT:
11691 saddr->qual = SATA_ADDR_DPMPORT;
11692
11693 mutex_enter(&cportinfo->cport_mutex);
11694 /* It must be a Port Multiplier at the controller port */
11695 ASSERT(cportinfo->cport_dev_type == SATA_DTYPE_PMULT);
11696
11697 pminfo = SATA_CPORTINFO_PMULT_INFO(cportinfo);
11698 pmportinfo = pminfo->pmult_dev_port[saddr->pmport];
11699 mutex_exit(&cportinfo->cport_mutex);
11700
11701 rval = sata_probe_device(sata_hba_inst, sata_device);
11702 if (rval != SATA_SUCCESS ||
11703 sata_device->satadev_type == SATA_DTYPE_UNKNOWN) {
11704 return (SATA_FAILURE);
11705 }
11706
11707 mutex_enter(&pmportinfo->pmport_mutex);
11708 sata_show_drive_info(sata_hba_inst,
11709 SATA_PMPORTINFO_DRV_INFO(pmportinfo));
11710
11711 if ((sata_device->satadev_type & SATA_VALID_DEV_TYPE) == 0) {
11712 /*
11713 * Could not determine device type.
11714 * Degrade this device to unknown.
11715 */
11716 pmportinfo->pmport_dev_type = SATA_DTYPE_UNKNOWN;
11717 mutex_exit(&pmportinfo->pmport_mutex);
11718 return (SATA_SUCCESS);
11719 }
11720 pmportinfo->pmport_dev_type = sata_device->satadev_type;
11721 pmportinfo->pmport_tgtnode_clean = B_TRUE;
11722 mutex_exit(&pmportinfo->pmport_mutex);
11723
11724 /*
11725 * Initialize device to the desired state.
11726 * Even if it fails, the device will still
11727 * attach but syslog will show the warning.
11728 */
11729 if (sata_initialize_device(sata_hba_inst,
11730 pmportinfo->pmport_sata_drive) != SATA_SUCCESS) {
11731 /* Retry */
11732 rval = sata_initialize_device(sata_hba_inst,
11733 pmportinfo->pmport_sata_drive);
11734
11735 if (rval == SATA_RETRY)
11736 sata_log(sata_hba_inst, CE_WARN,
11737 "SATA device at port %d:%d - "
11738 "default device features could not be set."
11739 " Device may not operate as expected.",
11740 cport, pmport);
11741 }
11742
11743 cdip = sata_create_target_node(pdip, sata_hba_inst, saddr);
11744 if (cdip == NULL) {
11745 /*
11746 * Attaching target node failed.
11747 * We retain sata_drive_info structure...
11748 */
11749 return (SATA_SUCCESS);
11750 }
11751 mutex_enter(&pmportinfo->pmport_mutex);
11752 pmportinfo->pmport_sata_drive->satadrv_state |=
11753 SATA_STATE_READY;
11754 mutex_exit(&pmportinfo->pmport_mutex);
11755
11756 break;
11757
11758 default:
11759 return (SATA_FAILURE);
11760 }
11761
11762 return (SATA_SUCCESS);
11763 }
11764
11765 /*
11766 * Clean up target node at specific address.
11767 *
11768 * NOTE: No Mutex should be hold.
11769 */
11770 static int
sata_offline_device(sata_hba_inst_t * sata_hba_inst,sata_device_t * sata_device,sata_drive_info_t * sdinfo)11771 sata_offline_device(sata_hba_inst_t *sata_hba_inst,
11772 sata_device_t *sata_device, sata_drive_info_t *sdinfo)
11773 {
11774 uint8_t cport, pmport, qual;
11775 dev_info_t *tdip;
11776
11777 cport = sata_device->satadev_addr.cport;
11778 pmport = sata_device->satadev_addr.pmport;
11779 qual = sata_device->satadev_addr.qual;
11780
11781 if (qual == SATA_ADDR_DCPORT) {
11782 SATA_LOG_D((sata_hba_inst, CE_WARN,
11783 "sata_hba_ioctl: disconnect device at port %d", cport));
11784 } else {
11785 SATA_LOG_D((sata_hba_inst, CE_WARN,
11786 "sata_hba_ioctl: disconnect device at port %d:%d",
11787 cport, pmport));
11788 }
11789
11790 /* We are addressing attached device, not a port */
11791 sata_device->satadev_addr.qual =
11792 sdinfo->satadrv_addr.qual;
11793 tdip = sata_get_scsi_target_dip(SATA_DIP(sata_hba_inst),
11794 &sata_device->satadev_addr);
11795 if (tdip != NULL && ndi_devi_offline(tdip,
11796 NDI_DEVI_REMOVE) != NDI_SUCCESS) {
11797 /*
11798 * Problem :
11799 * The target node remained attached.
11800 * This happens when the device file was open
11801 * or a node was waiting for resources.
11802 * Cannot do anything about it.
11803 */
11804 if (qual == SATA_ADDR_DCPORT) {
11805 SATA_LOG_D((sata_hba_inst, CE_WARN,
11806 "sata_hba_ioctl: disconnect: could "
11807 "not unconfigure device before "
11808 "disconnecting the SATA port %d",
11809 cport));
11810 } else {
11811 SATA_LOG_D((sata_hba_inst, CE_WARN,
11812 "sata_hba_ioctl: disconnect: could "
11813 "not unconfigure device before "
11814 "disconnecting the SATA port %d:%d",
11815 cport, pmport));
11816 }
11817 /*
11818 * Set DEVICE REMOVED state in the target
11819 * node. It will prevent access to the device
11820 * even when a new device is attached, until
11821 * the old target node is released, removed and
11822 * recreated for a new device.
11823 */
11824 sata_set_device_removed(tdip);
11825
11826 /*
11827 * Instruct event daemon to try the target
11828 * node cleanup later.
11829 */
11830 sata_set_target_node_cleanup(
11831 sata_hba_inst, &sata_device->satadev_addr);
11832 }
11833
11834
11835 return (SATA_SUCCESS);
11836 }
11837
11838
11839 /*
11840 * Create scsi target node for attached device, create node properties and
11841 * attach the node.
11842 * The node could be removed if the device onlining fails.
11843 *
11844 * A dev_info_t pointer is returned if operation is successful, NULL is
11845 * returned otherwise.
11846 */
11847
11848 static dev_info_t *
sata_create_target_node(dev_info_t * dip,sata_hba_inst_t * sata_hba_inst,sata_address_t * sata_addr)11849 sata_create_target_node(dev_info_t *dip, sata_hba_inst_t *sata_hba_inst,
11850 sata_address_t *sata_addr)
11851 {
11852 dev_info_t *cdip = NULL;
11853 int rval;
11854 char *nname = NULL;
11855 char **compatible = NULL;
11856 int ncompatible;
11857 struct scsi_inquiry inq;
11858 sata_device_t sata_device;
11859 sata_drive_info_t *sdinfo;
11860 int target;
11861 int i;
11862
11863 sata_device.satadev_rev = SATA_DEVICE_REV;
11864 sata_device.satadev_addr = *sata_addr;
11865
11866 mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst, sata_addr->cport)));
11867
11868 sdinfo = sata_get_device_info(sata_hba_inst, &sata_device);
11869
11870 target = SATA_TO_SCSI_TARGET(sata_addr->cport,
11871 sata_addr->pmport, sata_addr->qual);
11872
11873 if (sdinfo == NULL) {
11874 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
11875 sata_addr->cport)));
11876 SATA_LOG_D((sata_hba_inst, CE_WARN,
11877 "sata_create_target_node: no sdinfo for target %x",
11878 target));
11879 return (NULL);
11880 }
11881
11882 /*
11883 * create or get scsi inquiry data, expected by
11884 * scsi_hba_nodename_compatible_get()
11885 * SATA hard disks get Identify Data translated into Inguiry Data.
11886 * ATAPI devices respond directly to Inquiry request.
11887 */
11888 if (sdinfo->satadrv_type == SATA_DTYPE_ATADISK) {
11889 sata_identdev_to_inquiry(sata_hba_inst, sdinfo,
11890 (uint8_t *)&inq);
11891 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
11892 sata_addr->cport)));
11893 } else { /* Assume supported ATAPI device */
11894 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
11895 sata_addr->cport)));
11896 if (sata_get_atapi_inquiry_data(sata_hba_inst, sata_addr,
11897 &inq) == SATA_FAILURE)
11898 return (NULL);
11899 /*
11900 * Save supported ATAPI transport version
11901 */
11902 sdinfo->satadrv_atapi_trans_ver =
11903 SATA_ATAPI_TRANS_VERSION(&inq);
11904 }
11905
11906 /* determine the node name and compatible */
11907 scsi_hba_nodename_compatible_get(&inq, NULL,
11908 inq.inq_dtype, NULL, &nname, &compatible, &ncompatible);
11909
11910 #ifdef SATA_DEBUG
11911 if (sata_debug_flags & SATA_DBG_NODES) {
11912 if (nname == NULL) {
11913 cmn_err(CE_NOTE, "sata_create_target_node: "
11914 "cannot determine nodename for target %d\n",
11915 target);
11916 } else {
11917 cmn_err(CE_WARN, "sata_create_target_node: "
11918 "target %d nodename: %s\n", target, nname);
11919 }
11920 if (compatible == NULL) {
11921 cmn_err(CE_WARN,
11922 "sata_create_target_node: no compatible name\n");
11923 } else {
11924 for (i = 0; i < ncompatible; i++) {
11925 cmn_err(CE_WARN, "sata_create_target_node: "
11926 "compatible name: %s\n", compatible[i]);
11927 }
11928 }
11929 }
11930 #endif
11931
11932 /* if nodename can't be determined, log error and exit */
11933 if (nname == NULL) {
11934 SATA_LOG_D((sata_hba_inst, CE_WARN,
11935 "sata_create_target_node: cannot determine nodename "
11936 "for target %d\n", target));
11937 scsi_hba_nodename_compatible_free(nname, compatible);
11938 return (NULL);
11939 }
11940 /*
11941 * Create scsi target node
11942 */
11943 ndi_devi_alloc_sleep(dip, nname, (pnode_t)DEVI_SID_NODEID, &cdip);
11944 rval = ndi_prop_update_string(DDI_DEV_T_NONE, cdip,
11945 "device-type", "scsi");
11946
11947 if (rval != DDI_PROP_SUCCESS) {
11948 SATA_LOG_D((sata_hba_inst, CE_WARN, "sata_create_target_node: "
11949 "updating device_type prop failed %d", rval));
11950 goto fail;
11951 }
11952
11953 /*
11954 * Create target node properties: target & lun
11955 */
11956 rval = ndi_prop_update_int(DDI_DEV_T_NONE, cdip, "target", target);
11957 if (rval != DDI_PROP_SUCCESS) {
11958 SATA_LOG_D((sata_hba_inst, CE_WARN, "sata_create_target_node: "
11959 "updating target prop failed %d", rval));
11960 goto fail;
11961 }
11962 rval = ndi_prop_update_int(DDI_DEV_T_NONE, cdip, "lun", 0);
11963 if (rval != DDI_PROP_SUCCESS) {
11964 SATA_LOG_D((sata_hba_inst, CE_WARN, "sata_create_target_node: "
11965 "updating target prop failed %d", rval));
11966 goto fail;
11967 }
11968
11969 if (sdinfo->satadrv_type & SATA_DTYPE_ATAPI) {
11970 /*
11971 * Add "variant" property
11972 */
11973 rval = ndi_prop_update_string(DDI_DEV_T_NONE, cdip,
11974 "variant", "atapi");
11975 if (rval != DDI_PROP_SUCCESS) {
11976 SATA_LOG_D((sata_hba_inst, CE_WARN,
11977 "sata_create_target_node: variant atapi "
11978 "property could not be created: %d", rval));
11979 goto fail;
11980 }
11981 }
11982 /* decorate the node with compatible */
11983 if (ndi_prop_update_string_array(DDI_DEV_T_NONE, cdip, "compatible",
11984 compatible, ncompatible) != DDI_PROP_SUCCESS) {
11985 SATA_LOG_D((sata_hba_inst, CE_WARN,
11986 "sata_create_target_node: FAIL compatible props cdip 0x%p",
11987 (void *)cdip));
11988 goto fail;
11989 }
11990
11991 if (sdinfo->satadrv_type == SATA_DTYPE_ATADISK) {
11992 /*
11993 * Add "sata-phy" property
11994 */
11995 if (ndi_prop_update_int(DDI_DEV_T_NONE, cdip, "sata-phy",
11996 (int)sata_addr->cport) != DDI_PROP_SUCCESS) {
11997 SATA_LOG_D((sata_hba_inst, CE_WARN,
11998 "sata_create_target_node: failed to create "
11999 "\"sata-phy\" property: port %d",
12000 sata_addr->cport));
12001 }
12002 }
12003
12004
12005 /*
12006 * Now, try to attach the driver. If probing of the device fails,
12007 * the target node may be removed
12008 */
12009 rval = ndi_devi_online(cdip, NDI_ONLINE_ATTACH);
12010
12011 scsi_hba_nodename_compatible_free(nname, compatible);
12012
12013 if (rval == NDI_SUCCESS)
12014 return (cdip);
12015
12016 /* target node was removed - are we sure? */
12017 return (NULL);
12018
12019 fail:
12020 scsi_hba_nodename_compatible_free(nname, compatible);
12021 ddi_prop_remove_all(cdip);
12022 rval = ndi_devi_free(cdip);
12023 if (rval != NDI_SUCCESS) {
12024 SATA_LOG_D((sata_hba_inst, CE_WARN, "sata_create_target_node: "
12025 "node removal failed %d", rval));
12026 }
12027 sata_log(sata_hba_inst, CE_WARN, "sata_create_target_node: "
12028 "cannot create target node for SATA device at port %d",
12029 sata_addr->cport);
12030 return (NULL);
12031 }
12032
12033 /*
12034 * Remove a target node.
12035 */
12036 static void
sata_remove_target_node(sata_hba_inst_t * sata_hba_inst,sata_address_t * sata_addr)12037 sata_remove_target_node(sata_hba_inst_t *sata_hba_inst,
12038 sata_address_t *sata_addr)
12039 {
12040 dev_info_t *tdip;
12041 uint8_t cport = sata_addr->cport;
12042 uint8_t pmport = sata_addr->pmport;
12043 uint8_t qual = sata_addr->qual;
12044
12045 /* Note the sata daemon uses the address of the port/pmport */
12046 ASSERT(qual == SATA_ADDR_CPORT || qual == SATA_ADDR_PMPORT);
12047
12048 /* Remove target node */
12049 tdip = sata_get_target_dip(SATA_DIP(sata_hba_inst), cport, pmport);
12050 if (tdip != NULL) {
12051 /*
12052 * Target node exists. Unconfigure device
12053 * then remove the target node (one ndi
12054 * operation).
12055 */
12056 if (ndi_devi_offline(tdip, NDI_DEVI_REMOVE) != NDI_SUCCESS) {
12057 /*
12058 * PROBLEM - no device, but target node remained. This
12059 * happens when the file was open or node was waiting
12060 * for resources.
12061 */
12062 SATA_LOG_D((sata_hba_inst, CE_WARN,
12063 "sata_remove_target_node: "
12064 "Failed to remove target node for "
12065 "detached SATA device."));
12066 /*
12067 * Set target node state to DEVI_DEVICE_REMOVED. But
12068 * re-check first that the node still exists.
12069 */
12070 tdip = sata_get_target_dip(SATA_DIP(sata_hba_inst),
12071 cport, pmport);
12072 if (tdip != NULL) {
12073 sata_set_device_removed(tdip);
12074 /*
12075 * Instruct event daemon to retry the cleanup
12076 * later.
12077 */
12078 sata_set_target_node_cleanup(sata_hba_inst,
12079 sata_addr);
12080 }
12081 }
12082
12083 if (qual == SATA_ADDR_CPORT)
12084 sata_log(sata_hba_inst, CE_WARN,
12085 "SATA device detached at port %d", cport);
12086 else
12087 sata_log(sata_hba_inst, CE_WARN,
12088 "SATA device detached at port %d:%d",
12089 cport, pmport);
12090 }
12091 #ifdef SATA_DEBUG
12092 else {
12093 if (qual == SATA_ADDR_CPORT)
12094 sata_log(sata_hba_inst, CE_WARN,
12095 "target node not found at port %d", cport);
12096 else
12097 sata_log(sata_hba_inst, CE_WARN,
12098 "target node not found at port %d:%d",
12099 cport, pmport);
12100 }
12101 #endif
12102 }
12103
12104
12105 /*
12106 * Re-probe sata port, check for a device and attach info
12107 * structures when necessary. Identify Device data is fetched, if possible.
12108 * Assumption: sata address is already validated.
12109 * SATA_SUCCESS is returned if port is re-probed sucessfully, regardless of
12110 * the presence of a device and its type.
12111 *
12112 * flag arg specifies that the function should try multiple times to identify
12113 * device type and to initialize it, or it should return immediately on failure.
12114 * SATA_DEV_IDENTIFY_RETRY - retry
12115 * SATA_DEV_IDENTIFY_NORETRY - no retry
12116 *
12117 * SATA_FAILURE is returned if one of the operations failed.
12118 *
12119 * This function cannot be called in interrupt context - it may sleep.
12120 *
12121 * Note: Port multiplier is supported.
12122 */
12123 static int
sata_reprobe_port(sata_hba_inst_t * sata_hba_inst,sata_device_t * sata_device,int flag)12124 sata_reprobe_port(sata_hba_inst_t *sata_hba_inst, sata_device_t *sata_device,
12125 int flag)
12126 {
12127 sata_cport_info_t *cportinfo;
12128 sata_pmult_info_t *pmultinfo;
12129 sata_drive_info_t *sdinfo, *osdinfo;
12130 boolean_t init_device = B_FALSE;
12131 int prev_device_type = SATA_DTYPE_NONE;
12132 int prev_device_settings = 0;
12133 int prev_device_state = 0;
12134 clock_t start_time = 0;
12135 int retry = B_FALSE;
12136 uint8_t cport = sata_device->satadev_addr.cport;
12137 int rval_probe, rval_init;
12138
12139 /*
12140 * If target is pmport, sata_reprobe_pmport() will handle it.
12141 */
12142 if (sata_device->satadev_addr.qual == SATA_ADDR_PMPORT ||
12143 sata_device->satadev_addr.qual == SATA_ADDR_DPMPORT)
12144 return (sata_reprobe_pmport(sata_hba_inst, sata_device, flag));
12145
12146 /* We only care about host sata cport for now */
12147 cportinfo = SATA_CPORT_INFO(sata_hba_inst,
12148 sata_device->satadev_addr.cport);
12149
12150 /*
12151 * If a port multiplier was previously attached (we have no idea it
12152 * still there or not), sata_reprobe_pmult() will handle it.
12153 */
12154 if (cportinfo->cport_dev_type == SATA_DTYPE_PMULT)
12155 return (sata_reprobe_pmult(sata_hba_inst, sata_device, flag));
12156
12157 /* Store sata_drive_info when a non-pmult device was attached. */
12158 osdinfo = SATA_CPORTINFO_DRV_INFO(cportinfo);
12159 if (osdinfo != NULL) {
12160 /*
12161 * We are re-probing port with a previously attached device.
12162 * Save previous device type and settings.
12163 */
12164 prev_device_type = cportinfo->cport_dev_type;
12165 prev_device_settings = osdinfo->satadrv_settings;
12166 prev_device_state = osdinfo->satadrv_state;
12167 }
12168 if (flag == SATA_DEV_IDENTIFY_RETRY) {
12169 start_time = ddi_get_lbolt();
12170 retry = B_TRUE;
12171 }
12172 retry_probe:
12173
12174 /* probe port */
12175 mutex_enter(&cportinfo->cport_mutex);
12176 cportinfo->cport_state &= ~SATA_PORT_STATE_CLEAR_MASK;
12177 cportinfo->cport_state |= SATA_STATE_PROBING;
12178 mutex_exit(&cportinfo->cport_mutex);
12179
12180 rval_probe = (*SATA_PROBE_PORT_FUNC(sata_hba_inst))
12181 (SATA_DIP(sata_hba_inst), sata_device);
12182
12183 mutex_enter(&cportinfo->cport_mutex);
12184 if (rval_probe != SATA_SUCCESS) {
12185 cportinfo->cport_state = SATA_PSTATE_FAILED;
12186 mutex_exit(&cportinfo->cport_mutex);
12187 SATA_LOG_D((sata_hba_inst, CE_WARN, "sata_reprobe_port: "
12188 "SATA port %d probing failed",
12189 cportinfo->cport_addr.cport));
12190 return (SATA_FAILURE);
12191 }
12192
12193 /*
12194 * update sata port state and set device type
12195 */
12196 sata_update_port_info(sata_hba_inst, sata_device);
12197 cportinfo->cport_state &= ~SATA_STATE_PROBING;
12198
12199 /*
12200 * Sanity check - Port is active? Is the link active?
12201 * Is there any device attached?
12202 */
12203 if ((cportinfo->cport_state &
12204 (SATA_PSTATE_SHUTDOWN | SATA_PSTATE_FAILED)) ||
12205 (cportinfo->cport_scr.sstatus & SATA_PORT_DEVLINK_UP_MASK) !=
12206 SATA_PORT_DEVLINK_UP) {
12207 /*
12208 * Port in non-usable state or no link active/no device.
12209 * Free info structure if necessary (direct attached drive
12210 * only, for now!
12211 */
12212 sdinfo = SATA_CPORTINFO_DRV_INFO(cportinfo);
12213 SATA_CPORTINFO_DRV_INFO(cportinfo) = NULL;
12214 /* Add here differentiation for device attached or not */
12215 cportinfo->cport_dev_type = SATA_DTYPE_NONE;
12216 mutex_exit(&cportinfo->cport_mutex);
12217 if (sdinfo != NULL)
12218 kmem_free(sdinfo, sizeof (sata_drive_info_t));
12219 return (SATA_SUCCESS);
12220 }
12221
12222 cportinfo->cport_state |= SATA_STATE_READY;
12223 cportinfo->cport_state |= SATA_STATE_PROBED;
12224
12225 cportinfo->cport_dev_type = sata_device->satadev_type;
12226 sdinfo = SATA_CPORTINFO_DRV_INFO(cportinfo);
12227
12228 /*
12229 * If we are re-probing the port, there may be
12230 * sata_drive_info structure attached
12231 */
12232 if (sata_device->satadev_type == SATA_DTYPE_NONE) {
12233
12234 /*
12235 * There is no device, so remove device info structure,
12236 * if necessary.
12237 */
12238 /* Device change: Drive -> None */
12239 SATA_CPORTINFO_DRV_INFO(cportinfo) = NULL;
12240 cportinfo->cport_dev_type = SATA_DTYPE_NONE;
12241 if (sdinfo != NULL) {
12242 kmem_free(sdinfo, sizeof (sata_drive_info_t));
12243 sata_log(sata_hba_inst, CE_WARN,
12244 "SATA device detached "
12245 "from port %d", cportinfo->cport_addr.cport);
12246 }
12247 mutex_exit(&cportinfo->cport_mutex);
12248 return (SATA_SUCCESS);
12249
12250 }
12251
12252 if (sata_device->satadev_type != SATA_DTYPE_PMULT) {
12253
12254 /* Device (may) change: Drive -> Drive */
12255 if (sdinfo == NULL) {
12256 /*
12257 * There is some device attached, but there is
12258 * no sata_drive_info structure - allocate one
12259 */
12260 mutex_exit(&cportinfo->cport_mutex);
12261 sdinfo = kmem_zalloc(
12262 sizeof (sata_drive_info_t), KM_SLEEP);
12263 mutex_enter(&cportinfo->cport_mutex);
12264 /*
12265 * Recheck, that the port state did not change when we
12266 * released mutex.
12267 */
12268 if (cportinfo->cport_state & SATA_STATE_READY) {
12269 SATA_CPORTINFO_DRV_INFO(cportinfo) = sdinfo;
12270 sdinfo->satadrv_addr = cportinfo->cport_addr;
12271 sdinfo->satadrv_addr.qual = SATA_ADDR_DCPORT;
12272 sdinfo->satadrv_type = SATA_DTYPE_UNKNOWN;
12273 sdinfo->satadrv_state = SATA_STATE_UNKNOWN;
12274 } else {
12275 /*
12276 * Port is not in ready state, we
12277 * cannot attach a device.
12278 */
12279 mutex_exit(&cportinfo->cport_mutex);
12280 kmem_free(sdinfo, sizeof (sata_drive_info_t));
12281 return (SATA_SUCCESS);
12282 }
12283 /*
12284 * Since we are adding device, presumably new one,
12285 * indicate that it should be initalized,
12286 * as well as some internal framework states).
12287 */
12288 init_device = B_TRUE;
12289 }
12290 cportinfo->cport_dev_type = SATA_DTYPE_UNKNOWN;
12291 sata_device->satadev_addr.qual = sdinfo->satadrv_addr.qual;
12292 } else {
12293 /* Device change: Drive -> PMult */
12294 SATA_CPORTINFO_DRV_INFO(cportinfo) = NULL;
12295 if (sdinfo != NULL) {
12296 kmem_free(sdinfo, sizeof (sata_drive_info_t));
12297 sata_log(sata_hba_inst, CE_WARN,
12298 "SATA device detached "
12299 "from port %d", cportinfo->cport_addr.cport);
12300 }
12301
12302 sata_log(sata_hba_inst, CE_WARN,
12303 "SATA port multiplier detected at port %d",
12304 cportinfo->cport_addr.cport);
12305
12306 mutex_exit(&cportinfo->cport_mutex);
12307 if (sata_alloc_pmult(sata_hba_inst, sata_device) !=
12308 SATA_SUCCESS)
12309 return (SATA_FAILURE);
12310 sata_show_pmult_info(sata_hba_inst, sata_device);
12311 mutex_enter(&cportinfo->cport_mutex);
12312
12313 /*
12314 * Mark all the port multiplier port behind the port
12315 * multiplier behind with link events, so that the sata daemon
12316 * will update their status.
12317 */
12318 pmultinfo = SATA_PMULT_INFO(sata_hba_inst, cport);
12319 pmultinfo->pmult_event_flags |= SATA_EVNT_DEVICE_RESET;
12320 mutex_exit(&cportinfo->cport_mutex);
12321 return (SATA_SUCCESS);
12322 }
12323 mutex_exit(&cportinfo->cport_mutex);
12324
12325 /*
12326 * Figure out what kind of device we are really
12327 * dealing with. Failure of identifying device does not fail this
12328 * function.
12329 */
12330 rval_probe = sata_probe_device(sata_hba_inst, sata_device);
12331 rval_init = SATA_FAILURE;
12332 mutex_enter(&cportinfo->cport_mutex);
12333 if (rval_probe == SATA_SUCCESS) {
12334 /*
12335 * If we are dealing with the same type of a device as before,
12336 * restore its settings flags.
12337 */
12338 if (osdinfo != NULL &&
12339 sata_device->satadev_type == prev_device_type)
12340 sdinfo->satadrv_settings = prev_device_settings;
12341
12342 mutex_exit(&cportinfo->cport_mutex);
12343 rval_init = SATA_SUCCESS;
12344 /* Set initial device features, if necessary */
12345 if (init_device == B_TRUE) {
12346 rval_init = sata_initialize_device(sata_hba_inst,
12347 sdinfo);
12348 }
12349 if (rval_init == SATA_SUCCESS)
12350 return (rval_init);
12351 /* else we will retry if retry was asked for */
12352
12353 } else {
12354 /*
12355 * If there was some device info before we probe the device,
12356 * restore previous device setting, so we can retry from scratch
12357 * later. Providing, of course, that device has not disapear
12358 * during probing process.
12359 */
12360 if (sata_device->satadev_type != SATA_DTYPE_NONE) {
12361 if (osdinfo != NULL) {
12362 cportinfo->cport_dev_type = prev_device_type;
12363 sdinfo->satadrv_type = prev_device_type;
12364 sdinfo->satadrv_state = prev_device_state;
12365 }
12366 } else {
12367 /* device is gone */
12368 kmem_free(sdinfo, sizeof (sata_drive_info_t));
12369 cportinfo->cport_dev_type = SATA_DTYPE_NONE;
12370 SATA_CPORTINFO_DRV_INFO(cportinfo) = NULL;
12371 mutex_exit(&cportinfo->cport_mutex);
12372 return (SATA_SUCCESS);
12373 }
12374 mutex_exit(&cportinfo->cport_mutex);
12375 }
12376
12377 if (retry) {
12378 clock_t cur_time = ddi_get_lbolt();
12379 /*
12380 * A device was not successfully identified or initialized.
12381 * Track retry time for device identification.
12382 */
12383 if ((cur_time - start_time) <
12384 drv_usectohz(SATA_DEV_REPROBE_TIMEOUT)) {
12385 /* sleep for a while */
12386 delay(drv_usectohz(SATA_DEV_RETRY_DLY));
12387 goto retry_probe;
12388 }
12389 /* else no more retries */
12390 mutex_enter(&cportinfo->cport_mutex);
12391 if (SATA_CPORTINFO_DRV_INFO(cportinfo) != NULL) {
12392 if (rval_init == SATA_RETRY) {
12393 /*
12394 * Setting drive features have failed, but
12395 * because the drive is still accessible,
12396 * keep it and emit a warning message.
12397 */
12398 sata_log(sata_hba_inst, CE_WARN,
12399 "SATA device at port %d - desired "
12400 "drive features could not be set. "
12401 "Device may not operate as expected.",
12402 cportinfo->cport_addr.cport);
12403 } else {
12404 SATA_CPORTINFO_DRV_INFO(cportinfo)->
12405 satadrv_state = SATA_DSTATE_FAILED;
12406 }
12407 }
12408 mutex_exit(&cportinfo->cport_mutex);
12409 }
12410 return (SATA_SUCCESS);
12411 }
12412
12413 /*
12414 * Reprobe a controller port that connected to a port multiplier.
12415 *
12416 * NOTE: No Mutex should be hold.
12417 */
12418 static int
sata_reprobe_pmult(sata_hba_inst_t * sata_hba_inst,sata_device_t * sata_device,int flag)12419 sata_reprobe_pmult(sata_hba_inst_t *sata_hba_inst, sata_device_t *sata_device,
12420 int flag)
12421 {
12422 _NOTE(ARGUNUSED(flag))
12423 sata_cport_info_t *cportinfo;
12424 sata_pmult_info_t *pmultinfo;
12425 uint8_t cport = sata_device->satadev_addr.cport;
12426 int rval_probe;
12427
12428 cportinfo = SATA_CPORT_INFO(sata_hba_inst, cport);
12429 pmultinfo = SATA_PMULT_INFO(sata_hba_inst, cport);
12430
12431 /* probe port */
12432 mutex_enter(&cportinfo->cport_mutex);
12433 cportinfo->cport_state &= ~SATA_PORT_STATE_CLEAR_MASK;
12434 cportinfo->cport_state |= SATA_STATE_PROBING;
12435 mutex_exit(&cportinfo->cport_mutex);
12436
12437 rval_probe = (*SATA_PROBE_PORT_FUNC(sata_hba_inst))
12438 (SATA_DIP(sata_hba_inst), sata_device);
12439
12440 mutex_enter(&cportinfo->cport_mutex);
12441 if (rval_probe != SATA_SUCCESS) {
12442 cportinfo->cport_state = SATA_PSTATE_FAILED;
12443 SATA_LOG_D((sata_hba_inst, CE_WARN, "sata_reprobe_pmult: "
12444 "SATA port %d probing failed", cport));
12445 sata_log(sata_hba_inst, CE_WARN,
12446 "SATA port multiplier detached at port %d", cport);
12447 mutex_exit(&cportinfo->cport_mutex);
12448 sata_free_pmult(sata_hba_inst, sata_device);
12449 return (SATA_FAILURE);
12450 }
12451
12452 /*
12453 * update sata port state and set device type
12454 */
12455 sata_update_port_info(sata_hba_inst, sata_device);
12456 cportinfo->cport_state &= ~SATA_STATE_PROBING;
12457 cportinfo->cport_state |= SATA_STATE_PROBED;
12458
12459 /*
12460 * Sanity check - Port is active? Is the link active?
12461 * Is there any device attached?
12462 */
12463 if ((cportinfo->cport_state &
12464 (SATA_PSTATE_SHUTDOWN | SATA_PSTATE_FAILED)) ||
12465 (cportinfo->cport_scr.sstatus & SATA_PORT_DEVLINK_UP_MASK) !=
12466 SATA_PORT_DEVLINK_UP ||
12467 (sata_device->satadev_type == SATA_DTYPE_NONE)) {
12468 cportinfo->cport_dev_type = SATA_DTYPE_NONE;
12469 mutex_exit(&cportinfo->cport_mutex);
12470 sata_free_pmult(sata_hba_inst, sata_device);
12471 sata_log(sata_hba_inst, CE_WARN,
12472 "SATA port multiplier detached at port %d", cport);
12473 return (SATA_SUCCESS);
12474 }
12475
12476 /*
12477 * Device changed: PMult -> Non-PMult
12478 *
12479 * This situation is uncommon, most possibly being caused by errors
12480 * after which the port multiplier is not correct initialized and
12481 * recognized. In that case the new device will be marked as unknown
12482 * and will not be automatically probed in this routine. Instead
12483 * system administrator could manually restart it via cfgadm(8).
12484 */
12485 if (sata_device->satadev_type != SATA_DTYPE_PMULT) {
12486 cportinfo->cport_dev_type = SATA_DTYPE_UNKNOWN;
12487 mutex_exit(&cportinfo->cport_mutex);
12488 sata_free_pmult(sata_hba_inst, sata_device);
12489 sata_log(sata_hba_inst, CE_WARN,
12490 "SATA port multiplier detached at port %d", cport);
12491 return (SATA_FAILURE);
12492 }
12493
12494 /*
12495 * Now we know it is a port multiplier. However, if this is not the
12496 * previously attached port multiplier - they may have different
12497 * pmport numbers - we need to re-allocate data structures for every
12498 * pmport and drive.
12499 *
12500 * Port multipliers of the same model have identical values in these
12501 * registers, so it is still necessary to update the information of
12502 * all drives attached to the previous port multiplier afterwards.
12503 */
12504 /* Device changed: PMult -> another PMult */
12505 mutex_exit(&cportinfo->cport_mutex);
12506 sata_free_pmult(sata_hba_inst, sata_device);
12507 if (sata_alloc_pmult(sata_hba_inst, sata_device) != SATA_SUCCESS)
12508 return (SATA_FAILURE);
12509 mutex_enter(&cportinfo->cport_mutex);
12510
12511 SATADBG1(SATA_DBG_PMULT, sata_hba_inst,
12512 "SATA port multiplier [changed] at port %d", cport);
12513 sata_log(sata_hba_inst, CE_WARN,
12514 "SATA port multiplier detected at port %d", cport);
12515
12516 /*
12517 * Mark all the port multiplier port behind the port
12518 * multiplier behind with link events, so that the sata daemon
12519 * will update their status.
12520 */
12521 pmultinfo->pmult_event_flags |= SATA_EVNT_DEVICE_RESET;
12522 mutex_exit(&cportinfo->cport_mutex);
12523
12524 return (SATA_SUCCESS);
12525 }
12526
12527 /*
12528 * Re-probe a port multiplier port, check for a device and attach info
12529 * structures when necessary. Identify Device data is fetched, if possible.
12530 * Assumption: sata address is already validated as port multiplier port.
12531 * SATA_SUCCESS is returned if port is re-probed sucessfully, regardless of
12532 * the presence of a device and its type.
12533 *
12534 * flag arg specifies that the function should try multiple times to identify
12535 * device type and to initialize it, or it should return immediately on failure.
12536 * SATA_DEV_IDENTIFY_RETRY - retry
12537 * SATA_DEV_IDENTIFY_NORETRY - no retry
12538 *
12539 * SATA_FAILURE is returned if one of the operations failed.
12540 *
12541 * This function cannot be called in interrupt context - it may sleep.
12542 *
12543 * NOTE: Should be only called by sata_probe_port() in case target port is a
12544 * port multiplier port.
12545 * NOTE: No Mutex should be hold.
12546 */
12547 static int
sata_reprobe_pmport(sata_hba_inst_t * sata_hba_inst,sata_device_t * sata_device,int flag)12548 sata_reprobe_pmport(sata_hba_inst_t *sata_hba_inst, sata_device_t *sata_device,
12549 int flag)
12550 {
12551 sata_cport_info_t *cportinfo = NULL;
12552 sata_pmport_info_t *pmportinfo = NULL;
12553 sata_drive_info_t *sdinfo, *osdinfo;
12554 sata_device_t sdevice;
12555 boolean_t init_device = B_FALSE;
12556 int prev_device_type = SATA_DTYPE_NONE;
12557 int prev_device_settings = 0;
12558 int prev_device_state = 0;
12559 clock_t start_time;
12560 uint8_t cport = sata_device->satadev_addr.cport;
12561 uint8_t pmport = sata_device->satadev_addr.pmport;
12562 int rval;
12563
12564 cportinfo = SATA_CPORT_INFO(sata_hba_inst, cport);
12565 pmportinfo = SATA_PMPORT_INFO(sata_hba_inst, cport, pmport);
12566 osdinfo = SATA_PMPORTINFO_DRV_INFO(pmportinfo);
12567
12568 if (osdinfo != NULL) {
12569 /*
12570 * We are re-probing port with a previously attached device.
12571 * Save previous device type and settings.
12572 */
12573 prev_device_type = pmportinfo->pmport_dev_type;
12574 prev_device_settings = osdinfo->satadrv_settings;
12575 prev_device_state = osdinfo->satadrv_state;
12576 }
12577
12578 start_time = ddi_get_lbolt();
12579
12580 /* check parent status */
12581 mutex_enter(&cportinfo->cport_mutex);
12582 if ((cportinfo->cport_state &
12583 (SATA_PSTATE_SHUTDOWN | SATA_PSTATE_FAILED)) ||
12584 (cportinfo->cport_scr.sstatus & SATA_PORT_DEVLINK_UP_MASK) !=
12585 SATA_PORT_DEVLINK_UP) {
12586 mutex_exit(&cportinfo->cport_mutex);
12587 return (SATA_FAILURE);
12588 }
12589 mutex_exit(&cportinfo->cport_mutex);
12590
12591 retry_probe_pmport:
12592
12593 /* probe port */
12594 mutex_enter(&pmportinfo->pmport_mutex);
12595 pmportinfo->pmport_state &= ~SATA_PORT_STATE_CLEAR_MASK;
12596 pmportinfo->pmport_state |= SATA_STATE_PROBING;
12597 mutex_exit(&pmportinfo->pmport_mutex);
12598
12599 rval = (*SATA_PROBE_PORT_FUNC(sata_hba_inst))
12600 (SATA_DIP(sata_hba_inst), sata_device);
12601
12602 /* might need retry because we cannot touch registers. */
12603 if (rval == SATA_FAILURE) {
12604 mutex_enter(&pmportinfo->pmport_mutex);
12605 pmportinfo->pmport_state = SATA_PSTATE_FAILED;
12606 mutex_exit(&pmportinfo->pmport_mutex);
12607 SATA_LOG_D((sata_hba_inst, CE_WARN, "sata_reprobe_pmport: "
12608 "SATA port %d:%d probing failed",
12609 cport, pmport));
12610 return (SATA_FAILURE);
12611 } else if (rval == SATA_RETRY) {
12612 SATA_LOG_D((sata_hba_inst, CE_WARN, "sata_reprobe_pmport: "
12613 "SATA port %d:%d probing failed, retrying...",
12614 cport, pmport));
12615 clock_t cur_time = ddi_get_lbolt();
12616 /*
12617 * A device was not successfully identified or initialized.
12618 * Track retry time for device identification.
12619 */
12620 if ((cur_time - start_time) <
12621 drv_usectohz(SATA_DEV_REPROBE_TIMEOUT)) {
12622 /* sleep for a while */
12623 delay(drv_usectohz(SATA_DEV_RETRY_DLY));
12624 goto retry_probe_pmport;
12625 } else {
12626 mutex_enter(&pmportinfo->pmport_mutex);
12627 if (SATA_PMPORTINFO_DRV_INFO(pmportinfo) != NULL)
12628 SATA_PMPORTINFO_DRV_INFO(pmportinfo)->
12629 satadrv_state = SATA_DSTATE_FAILED;
12630 mutex_exit(&pmportinfo->pmport_mutex);
12631 return (SATA_SUCCESS);
12632 }
12633 }
12634
12635 /*
12636 * Sanity check - Controller port is active? Is the link active?
12637 * Is it still a port multiplier?
12638 */
12639 if ((cportinfo->cport_state &
12640 (SATA_PSTATE_SHUTDOWN | SATA_PSTATE_FAILED)) ||
12641 (cportinfo->cport_scr.sstatus & SATA_PORT_DEVLINK_UP_MASK) !=
12642 SATA_PORT_DEVLINK_UP ||
12643 (cportinfo->cport_dev_type != SATA_DTYPE_PMULT)) {
12644 /*
12645 * Port in non-usable state or no link active/no
12646 * device. Free info structure.
12647 */
12648 cportinfo->cport_dev_type = SATA_DTYPE_UNKNOWN;
12649
12650 sdevice.satadev_addr.cport = cport;
12651 sdevice.satadev_addr.pmport = pmport;
12652 sdevice.satadev_addr.qual = SATA_ADDR_PMULT;
12653 mutex_exit(&cportinfo->cport_mutex);
12654
12655 sata_free_pmult(sata_hba_inst, &sdevice);
12656 return (SATA_FAILURE);
12657 }
12658
12659 /* SATA_SUCCESS NOW */
12660 /*
12661 * update sata port state and set device type
12662 */
12663 mutex_enter(&pmportinfo->pmport_mutex);
12664 sata_update_pmport_info(sata_hba_inst, sata_device);
12665 pmportinfo->pmport_state &= ~SATA_STATE_PROBING;
12666
12667 /*
12668 * Sanity check - Port is active? Is the link active?
12669 * Is there any device attached?
12670 */
12671 if ((pmportinfo->pmport_state &
12672 (SATA_PSTATE_SHUTDOWN | SATA_PSTATE_FAILED)) ||
12673 (pmportinfo->pmport_scr.sstatus & SATA_PORT_DEVLINK_UP_MASK) !=
12674 SATA_PORT_DEVLINK_UP) {
12675 /*
12676 * Port in non-usable state or no link active/no device.
12677 * Free info structure if necessary (direct attached drive
12678 * only, for now!
12679 */
12680 sdinfo = SATA_PMPORTINFO_DRV_INFO(pmportinfo);
12681 SATA_PMPORTINFO_DRV_INFO(pmportinfo) = NULL;
12682 /* Add here differentiation for device attached or not */
12683 pmportinfo->pmport_dev_type = SATA_DTYPE_NONE;
12684 mutex_exit(&pmportinfo->pmport_mutex);
12685 if (sdinfo != NULL)
12686 kmem_free(sdinfo, sizeof (sata_drive_info_t));
12687 return (SATA_SUCCESS);
12688 }
12689
12690 pmportinfo->pmport_state |= SATA_STATE_READY;
12691 pmportinfo->pmport_dev_type = sata_device->satadev_type;
12692 sdinfo = SATA_PMPORTINFO_DRV_INFO(pmportinfo);
12693
12694 /*
12695 * If we are re-probing the port, there may be
12696 * sata_drive_info structure attached
12697 * (or sata_pm_info, if PMult is supported).
12698 */
12699 if (sata_device->satadev_type == SATA_DTYPE_NONE) {
12700 /*
12701 * There is no device, so remove device info structure,
12702 * if necessary.
12703 */
12704 SATA_PMPORTINFO_DRV_INFO(pmportinfo) = NULL;
12705 pmportinfo->pmport_dev_type = SATA_DTYPE_NONE;
12706 if (sdinfo != NULL) {
12707 kmem_free(sdinfo, sizeof (sata_drive_info_t));
12708 sata_log(sata_hba_inst, CE_WARN,
12709 "SATA device detached from port %d:%d",
12710 cport, pmport);
12711 }
12712 mutex_exit(&pmportinfo->pmport_mutex);
12713 return (SATA_SUCCESS);
12714 }
12715
12716 /* this should not be a pmult */
12717 ASSERT(sata_device->satadev_type != SATA_DTYPE_PMULT);
12718 if (sdinfo == NULL) {
12719 /*
12720 * There is some device attached, but there is
12721 * no sata_drive_info structure - allocate one
12722 */
12723 mutex_exit(&pmportinfo->pmport_mutex);
12724 sdinfo = kmem_zalloc(sizeof (sata_drive_info_t),
12725 KM_SLEEP);
12726 mutex_enter(&pmportinfo->pmport_mutex);
12727 /*
12728 * Recheck, that the port state did not change when we
12729 * released mutex.
12730 */
12731 if (pmportinfo->pmport_state & SATA_STATE_READY) {
12732 SATA_PMPORTINFO_DRV_INFO(pmportinfo) = sdinfo;
12733 sdinfo->satadrv_addr = pmportinfo->pmport_addr;
12734 sdinfo->satadrv_addr.qual = SATA_ADDR_DPMPORT;
12735 sdinfo->satadrv_type = SATA_DTYPE_UNKNOWN;
12736 sdinfo->satadrv_state = SATA_STATE_UNKNOWN;
12737 } else {
12738 /*
12739 * Port is not in ready state, we
12740 * cannot attach a device.
12741 */
12742 mutex_exit(&pmportinfo->pmport_mutex);
12743 kmem_free(sdinfo, sizeof (sata_drive_info_t));
12744 return (SATA_SUCCESS);
12745 }
12746 /*
12747 * Since we are adding device, presumably new one,
12748 * indicate that it should be initalized,
12749 * as well as some internal framework states).
12750 */
12751 init_device = B_TRUE;
12752 }
12753
12754 pmportinfo->pmport_dev_type = SATA_DTYPE_UNKNOWN;
12755 sata_device->satadev_addr.qual = sdinfo->satadrv_addr.qual;
12756
12757 mutex_exit(&pmportinfo->pmport_mutex);
12758 /*
12759 * Figure out what kind of device we are really
12760 * dealing with.
12761 */
12762 rval = sata_probe_device(sata_hba_inst, sata_device);
12763
12764 mutex_enter(&pmportinfo->pmport_mutex);
12765 if (rval == SATA_SUCCESS) {
12766 /*
12767 * If we are dealing with the same type of a device as before,
12768 * restore its settings flags.
12769 */
12770 if (osdinfo != NULL &&
12771 sata_device->satadev_type == prev_device_type)
12772 sdinfo->satadrv_settings = prev_device_settings;
12773
12774 mutex_exit(&pmportinfo->pmport_mutex);
12775 /* Set initial device features, if necessary */
12776 if (init_device == B_TRUE) {
12777 rval = sata_initialize_device(sata_hba_inst, sdinfo);
12778 }
12779 if (rval == SATA_SUCCESS)
12780 return (rval);
12781 } else {
12782 /*
12783 * If there was some device info before we probe the device,
12784 * restore previous device setting, so we can retry from scratch
12785 * later. Providing, of course, that device has not disappeared
12786 * during probing process.
12787 */
12788 if (sata_device->satadev_type != SATA_DTYPE_NONE) {
12789 if (osdinfo != NULL) {
12790 pmportinfo->pmport_dev_type = prev_device_type;
12791 sdinfo->satadrv_type = prev_device_type;
12792 sdinfo->satadrv_state = prev_device_state;
12793 }
12794 } else {
12795 /* device is gone */
12796 kmem_free(sdinfo, sizeof (sata_drive_info_t));
12797 pmportinfo->pmport_dev_type = SATA_DTYPE_NONE;
12798 SATA_PMPORTINFO_DRV_INFO(pmportinfo) = NULL;
12799 mutex_exit(&pmportinfo->pmport_mutex);
12800 return (SATA_SUCCESS);
12801 }
12802 mutex_exit(&pmportinfo->pmport_mutex);
12803 }
12804
12805 if (flag == SATA_DEV_IDENTIFY_RETRY) {
12806 clock_t cur_time = ddi_get_lbolt();
12807 /*
12808 * A device was not successfully identified or initialized.
12809 * Track retry time for device identification.
12810 */
12811 if ((cur_time - start_time) <
12812 drv_usectohz(SATA_DEV_REPROBE_TIMEOUT)) {
12813 /* sleep for a while */
12814 delay(drv_usectohz(SATA_DEV_RETRY_DLY));
12815 goto retry_probe_pmport;
12816 } else {
12817 mutex_enter(&pmportinfo->pmport_mutex);
12818 if (SATA_PMPORTINFO_DRV_INFO(pmportinfo) != NULL)
12819 SATA_PMPORTINFO_DRV_INFO(pmportinfo)->
12820 satadrv_state = SATA_DSTATE_FAILED;
12821 mutex_exit(&pmportinfo->pmport_mutex);
12822 }
12823 }
12824 return (SATA_SUCCESS);
12825 }
12826
12827 /*
12828 * Allocated related structure for a port multiplier and its device ports
12829 *
12830 * Port multiplier should be ready and probed, and related information like
12831 * the number of the device ports should be store in sata_device_t.
12832 *
12833 * NOTE: No Mutex should be hold.
12834 */
12835 static int
sata_alloc_pmult(sata_hba_inst_t * sata_hba_inst,sata_device_t * sata_device)12836 sata_alloc_pmult(sata_hba_inst_t *sata_hba_inst, sata_device_t *sata_device)
12837 {
12838 dev_info_t *dip = SATA_DIP(sata_hba_inst);
12839 sata_cport_info_t *cportinfo = NULL;
12840 sata_pmult_info_t *pmultinfo = NULL;
12841 sata_pmport_info_t *pmportinfo = NULL;
12842 sata_device_t sd;
12843 dev_t minor_number;
12844 char name[16];
12845 uint8_t cport = sata_device->satadev_addr.cport;
12846 int rval;
12847 int npmport;
12848
12849 cportinfo = SATA_CPORT_INFO(sata_hba_inst, cport);
12850
12851 /* This function might be called while a port-mult is hot-plugged. */
12852 mutex_enter(&cportinfo->cport_mutex);
12853
12854 /* dev_type's not updated when get called from sata_reprobe_port() */
12855 if (SATA_CPORTINFO_PMULT_INFO(cportinfo) == NULL) {
12856 /* Create a pmult_info structure */
12857 SATA_CPORTINFO_PMULT_INFO(cportinfo) =
12858 kmem_zalloc(sizeof (sata_pmult_info_t), KM_SLEEP);
12859 }
12860 pmultinfo = SATA_CPORTINFO_PMULT_INFO(cportinfo);
12861
12862 pmultinfo->pmult_addr = sata_device->satadev_addr;
12863 pmultinfo->pmult_addr.qual = SATA_ADDR_PMULT;
12864 pmultinfo->pmult_state = SATA_STATE_PROBING;
12865
12866 /*
12867 * Probe the port multiplier with qualifier SATA_ADDR_PMULT_SPEC,
12868 * The HBA driver should initialize and register the port multiplier,
12869 * sata_register_pmult() will fill following fields,
12870 * + sata_pmult_info.pmult_gscr
12871 * + sata_pmult_info.pmult_num_dev_ports
12872 */
12873 sd.satadev_addr = sata_device->satadev_addr;
12874 sd.satadev_addr.qual = SATA_ADDR_PMULT_SPEC;
12875 mutex_exit(&cportinfo->cport_mutex);
12876 rval = (*SATA_PROBE_PORT_FUNC(sata_hba_inst))
12877 (SATA_DIP(sata_hba_inst), &sd);
12878 mutex_enter(&cportinfo->cport_mutex);
12879
12880 if (rval != SATA_SUCCESS ||
12881 (sd.satadev_type != SATA_DTYPE_PMULT) ||
12882 !(sd.satadev_state & SATA_DSTATE_PMULT_INIT)) {
12883 SATA_CPORTINFO_PMULT_INFO(cportinfo) = NULL;
12884 kmem_free(pmultinfo, sizeof (sata_pmult_info_t));
12885 cportinfo->cport_state = SATA_PSTATE_FAILED;
12886 cportinfo->cport_dev_type = SATA_DTYPE_UNKNOWN;
12887 mutex_exit(&cportinfo->cport_mutex);
12888 SATADBG1(SATA_DBG_PMULT, sata_hba_inst,
12889 "sata_alloc_pmult: failed to initialize pmult "
12890 "at port %d.", cport)
12891 return (SATA_FAILURE);
12892 }
12893
12894 /* Initialize pmport_info structure */
12895 for (npmport = 0; npmport < pmultinfo->pmult_num_dev_ports;
12896 npmport++) {
12897
12898 /* if everything is allocated, skip */
12899 if (SATA_PMPORT_INFO(sata_hba_inst, cport, npmport) != NULL)
12900 continue;
12901
12902 pmportinfo = kmem_zalloc(sizeof (sata_pmport_info_t), KM_SLEEP);
12903 mutex_init(&pmportinfo->pmport_mutex, NULL, MUTEX_DRIVER, NULL);
12904 mutex_exit(&cportinfo->cport_mutex);
12905
12906 mutex_enter(&pmportinfo->pmport_mutex);
12907 pmportinfo->pmport_addr.cport = cport;
12908 pmportinfo->pmport_addr.pmport = (uint8_t)npmport;
12909 pmportinfo->pmport_addr.qual = SATA_ADDR_PMPORT;
12910 pmportinfo->pmport_state &= ~SATA_PORT_STATE_CLEAR_MASK;
12911 mutex_exit(&pmportinfo->pmport_mutex);
12912
12913 mutex_enter(&cportinfo->cport_mutex);
12914 SATA_PMPORT_INFO(sata_hba_inst, cport, npmport) = pmportinfo;
12915
12916 /* Create an attachment point */
12917 minor_number = SATA_MAKE_AP_MINOR(ddi_get_instance(dip),
12918 cport, (uint8_t)npmport, SATA_ADDR_PMPORT);
12919 (void) sprintf(name, "%d.%d", cport, npmport);
12920
12921 if (ddi_create_minor_node(dip, name, S_IFCHR, minor_number,
12922 DDI_NT_SATA_ATTACHMENT_POINT, 0) != DDI_SUCCESS) {
12923 sata_log(sata_hba_inst, CE_WARN, "sata_hba_attach: "
12924 "cannot create SATA attachment point for "
12925 "port %d:%d", cport, npmport);
12926 }
12927 }
12928
12929 pmultinfo->pmult_state &= ~SATA_STATE_PROBING;
12930 pmultinfo->pmult_state |= (SATA_STATE_PROBED|SATA_STATE_READY);
12931 cportinfo->cport_dev_type = SATA_DTYPE_PMULT;
12932
12933 mutex_exit(&cportinfo->cport_mutex);
12934 return (SATA_SUCCESS);
12935 }
12936
12937 /*
12938 * Free data structures when a port multiplier is removed.
12939 *
12940 * NOTE: No Mutex should be hold.
12941 */
12942 static void
sata_free_pmult(sata_hba_inst_t * sata_hba_inst,sata_device_t * sata_device)12943 sata_free_pmult(sata_hba_inst_t *sata_hba_inst, sata_device_t *sata_device)
12944 {
12945 sata_cport_info_t *cportinfo;
12946 sata_pmult_info_t *pmultinfo;
12947 sata_pmport_info_t *pmportinfo;
12948 sata_device_t pmport_device;
12949 sata_drive_info_t *sdinfo;
12950 dev_info_t *tdip;
12951 char name[16];
12952 uint8_t cport = sata_device->satadev_addr.cport;
12953 int npmport;
12954
12955 cportinfo = SATA_CPORT_INFO(sata_hba_inst, cport);
12956
12957 /* This function might be called while port-mult is hot plugged. */
12958 mutex_enter(&cportinfo->cport_mutex);
12959
12960 cportinfo->cport_dev_type = SATA_DTYPE_NONE;
12961 pmultinfo = SATA_CPORTINFO_PMULT_INFO(cportinfo);
12962 ASSERT(pmultinfo != NULL);
12963
12964 /* Free pmport_info structure */
12965 for (npmport = 0; npmport < pmultinfo->pmult_num_dev_ports;
12966 npmport++) {
12967 pmportinfo = SATA_PMPORT_INFO(sata_hba_inst, cport, npmport);
12968 if (pmportinfo == NULL)
12969 continue;
12970 mutex_exit(&cportinfo->cport_mutex);
12971
12972 mutex_enter(&pmportinfo->pmport_mutex);
12973 sdinfo = pmportinfo->pmport_sata_drive;
12974 SATA_PMPORTINFO_DRV_INFO(pmportinfo) = NULL;
12975 mutex_exit(&pmportinfo->pmport_mutex);
12976
12977 /* Remove attachment point. */
12978 name[0] = '\0';
12979 (void) sprintf(name, "%d.%d", cport, npmport);
12980 ddi_remove_minor_node(SATA_DIP(sata_hba_inst), name);
12981 sata_log(sata_hba_inst, CE_NOTE,
12982 "Remove attachment point of port %d:%d",
12983 cport, npmport);
12984
12985 /*
12986 * Rumove target node
12987 */
12988 bzero(&pmport_device, sizeof (sata_device_t));
12989 pmport_device.satadev_rev = SATA_DEVICE_REV;
12990 pmport_device.satadev_addr.cport = cport;
12991 pmport_device.satadev_addr.pmport = (uint8_t)npmport;
12992 pmport_device.satadev_addr.qual = SATA_ADDR_DPMPORT;
12993
12994 tdip = sata_get_scsi_target_dip(SATA_DIP(sata_hba_inst),
12995 &(pmport_device.satadev_addr));
12996 if (tdip != NULL && ndi_devi_offline(tdip,
12997 NDI_DEVI_REMOVE) != NDI_SUCCESS) {
12998 /*
12999 * Problem :
13000 * The target node remained attached.
13001 * This happens when the device file was open
13002 * or a node was waiting for resources.
13003 * Cannot do anything about it.
13004 */
13005 SATA_LOG_D((sata_hba_inst, CE_WARN,
13006 "sata_free_pmult: could not unconfigure device "
13007 "before disconnecting the SATA port %d:%d",
13008 cport, npmport));
13009
13010 /*
13011 * Set DEVICE REMOVED state in the target
13012 * node. It will prevent access to the device
13013 * even when a new device is attached, until
13014 * the old target node is released, removed and
13015 * recreated for a new device.
13016 */
13017 sata_set_device_removed(tdip);
13018
13019 /*
13020 * Instruct event daemon to try the target
13021 * node cleanup later.
13022 */
13023 sata_set_target_node_cleanup(
13024 sata_hba_inst, &(pmport_device.satadev_addr));
13025
13026 }
13027 mutex_enter(&cportinfo->cport_mutex);
13028
13029 /*
13030 * Add here differentiation for device attached or not
13031 */
13032 if (sdinfo != NULL) {
13033 sata_log(sata_hba_inst, CE_WARN,
13034 "SATA device detached from port %d:%d",
13035 cport, npmport);
13036 kmem_free(sdinfo, sizeof (sata_drive_info_t));
13037 }
13038
13039 mutex_destroy(&pmportinfo->pmport_mutex);
13040 kmem_free(pmportinfo, sizeof (sata_pmport_info_t));
13041 }
13042
13043 kmem_free(pmultinfo, sizeof (sata_pmult_info_t));
13044
13045 cportinfo->cport_devp.cport_sata_pmult = NULL;
13046
13047 sata_log(sata_hba_inst, CE_WARN,
13048 "SATA port multiplier detached at port %d", cport);
13049
13050 mutex_exit(&cportinfo->cport_mutex);
13051 }
13052
13053 /*
13054 * Initialize device
13055 * Specified device is initialized to a default state.
13056 *
13057 * Returns SATA_SUCCESS if all device features are set successfully,
13058 * SATA_RETRY if device is accessible but device features were not set
13059 * successfully, and SATA_FAILURE otherwise.
13060 */
13061 static int
sata_initialize_device(sata_hba_inst_t * sata_hba_inst,sata_drive_info_t * sdinfo)13062 sata_initialize_device(sata_hba_inst_t *sata_hba_inst,
13063 sata_drive_info_t *sdinfo)
13064 {
13065 int rval;
13066
13067 sata_save_drive_settings(sdinfo);
13068
13069 sdinfo->satadrv_settings |= SATA_DEV_READ_AHEAD;
13070
13071 sata_init_write_cache_mode(sdinfo);
13072
13073 rval = sata_set_drive_features(sata_hba_inst, sdinfo, 0);
13074
13075 /* Determine current data transfer mode */
13076 if ((sdinfo->satadrv_id.ai_cap & SATA_DMA_SUPPORT) == 0) {
13077 sdinfo->satadrv_settings &= ~SATA_DEV_DMA;
13078 } else if ((sdinfo->satadrv_id.ai_validinfo &
13079 SATA_VALIDINFO_88) != 0 &&
13080 (sdinfo->satadrv_id.ai_ultradma & SATA_UDMA_SEL_MASK) != 0) {
13081 sdinfo->satadrv_settings |= SATA_DEV_DMA;
13082 } else if ((sdinfo->satadrv_id.ai_dworddma &
13083 SATA_MDMA_SEL_MASK) != 0) {
13084 sdinfo->satadrv_settings |= SATA_DEV_DMA;
13085 } else
13086 /* DMA supported, not no DMA transfer mode is selected !? */
13087 sdinfo->satadrv_settings &= ~SATA_DEV_DMA;
13088
13089 if ((sdinfo->satadrv_id.ai_cmdset83 & 0x20) &&
13090 (sdinfo->satadrv_id.ai_features86 & 0x20))
13091 sdinfo->satadrv_power_level = SATA_POWER_STANDBY;
13092 else
13093 sdinfo->satadrv_power_level = SATA_POWER_ACTIVE;
13094
13095 return (rval);
13096 }
13097
13098
13099 /*
13100 * Initialize write cache mode.
13101 *
13102 * The default write cache setting for SATA HDD is provided by sata_write_cache
13103 * static variable. ATAPI CD/DVDs devices have write cache default is
13104 * determined by sata_atapicdvd_write_cache static variable.
13105 * ATAPI tape devices have write cache default is determined by
13106 * sata_atapitape_write_cache static variable.
13107 * ATAPI disk devices have write cache default is determined by
13108 * sata_atapidisk_write_cache static variable.
13109 * 1 - enable
13110 * 0 - disable
13111 * any other value - current drive setting
13112 *
13113 * Although there is not reason to disable write cache on CD/DVD devices,
13114 * tape devices and ATAPI disk devices, the default setting control is provided
13115 * for the maximun flexibility.
13116 *
13117 * In the future, it may be overridden by the
13118 * disk-write-cache-enable property setting, if it is defined.
13119 * Returns SATA_SUCCESS if all device features are set successfully,
13120 * SATA_FAILURE otherwise.
13121 */
13122 static void
sata_init_write_cache_mode(sata_drive_info_t * sdinfo)13123 sata_init_write_cache_mode(sata_drive_info_t *sdinfo)
13124 {
13125 switch (sdinfo->satadrv_type) {
13126 case SATA_DTYPE_ATADISK:
13127 if (sata_write_cache == 1)
13128 sdinfo->satadrv_settings |= SATA_DEV_WRITE_CACHE;
13129 else if (sata_write_cache == 0)
13130 sdinfo->satadrv_settings &= ~SATA_DEV_WRITE_CACHE;
13131 /*
13132 * When sata_write_cache value is not 0 or 1,
13133 * a current setting of the drive's write cache is used.
13134 */
13135 break;
13136 case SATA_DTYPE_ATAPICD:
13137 if (sata_atapicdvd_write_cache == 1)
13138 sdinfo->satadrv_settings |= SATA_DEV_WRITE_CACHE;
13139 else if (sata_atapicdvd_write_cache == 0)
13140 sdinfo->satadrv_settings &= ~SATA_DEV_WRITE_CACHE;
13141 /*
13142 * When sata_atapicdvd_write_cache value is not 0 or 1,
13143 * a current setting of the drive's write cache is used.
13144 */
13145 break;
13146 case SATA_DTYPE_ATAPITAPE:
13147 if (sata_atapitape_write_cache == 1)
13148 sdinfo->satadrv_settings |= SATA_DEV_WRITE_CACHE;
13149 else if (sata_atapitape_write_cache == 0)
13150 sdinfo->satadrv_settings &= ~SATA_DEV_WRITE_CACHE;
13151 /*
13152 * When sata_atapitape_write_cache value is not 0 or 1,
13153 * a current setting of the drive's write cache is used.
13154 */
13155 break;
13156 case SATA_DTYPE_ATAPIDISK:
13157 if (sata_atapidisk_write_cache == 1)
13158 sdinfo->satadrv_settings |= SATA_DEV_WRITE_CACHE;
13159 else if (sata_atapidisk_write_cache == 0)
13160 sdinfo->satadrv_settings &= ~SATA_DEV_WRITE_CACHE;
13161 /*
13162 * When sata_atapidisk_write_cache value is not 0 or 1,
13163 * a current setting of the drive's write cache is used.
13164 */
13165 break;
13166 }
13167 }
13168
13169
13170 /*
13171 * Validate sata address.
13172 * Specified cport, pmport and qualifier has to match
13173 * passed sata_scsi configuration info.
13174 * The presence of an attached device is not verified.
13175 *
13176 * Returns 0 when address is valid, -1 otherwise.
13177 */
13178 static int
sata_validate_sata_address(sata_hba_inst_t * sata_hba_inst,int cport,int pmport,int qual)13179 sata_validate_sata_address(sata_hba_inst_t *sata_hba_inst, int cport,
13180 int pmport, int qual)
13181 {
13182 if (qual == SATA_ADDR_DCPORT && pmport != 0)
13183 goto invalid_address;
13184 if (cport >= SATA_NUM_CPORTS(sata_hba_inst))
13185 goto invalid_address;
13186 if ((qual == SATA_ADDR_DPMPORT || qual == SATA_ADDR_PMPORT) &&
13187 ((SATA_CPORT_DEV_TYPE(sata_hba_inst, cport) != SATA_DTYPE_PMULT) ||
13188 (SATA_PMULT_INFO(sata_hba_inst, cport) == NULL) ||
13189 (pmport >= SATA_NUM_PMPORTS(sata_hba_inst, cport))))
13190 goto invalid_address;
13191
13192 return (0);
13193
13194 invalid_address:
13195 return (-1);
13196
13197 }
13198
13199 /*
13200 * Validate scsi address
13201 * SCSI target address is translated into SATA cport/pmport and compared
13202 * with a controller port/device configuration. LUN has to be 0.
13203 * Returns 0 if a scsi target refers to an attached device,
13204 * returns 1 if address is valid but no valid device is attached,
13205 * returns 2 if address is valid but device type is unknown (not valid device),
13206 * returns -1 if bad address or device is of an unsupported type.
13207 * Upon return sata_device argument is set.
13208 *
13209 * Port multiplier is supported now.
13210 */
13211 static int
sata_validate_scsi_address(sata_hba_inst_t * sata_hba_inst,struct scsi_address * ap,sata_device_t * sata_device)13212 sata_validate_scsi_address(sata_hba_inst_t *sata_hba_inst,
13213 struct scsi_address *ap, sata_device_t *sata_device)
13214 {
13215 int cport, pmport, qual, rval;
13216
13217 rval = -1; /* Invalid address */
13218 if (ap->a_lun != 0)
13219 goto out;
13220
13221 qual = SCSI_TO_SATA_ADDR_QUAL(ap->a_target);
13222 cport = SCSI_TO_SATA_CPORT(ap->a_target);
13223 pmport = SCSI_TO_SATA_PMPORT(ap->a_target);
13224
13225 if (qual != SATA_ADDR_DCPORT && qual != SATA_ADDR_DPMPORT)
13226 goto out;
13227
13228 if (sata_validate_sata_address(sata_hba_inst, cport, pmport, qual) ==
13229 0) {
13230
13231 sata_cport_info_t *cportinfo;
13232 sata_pmult_info_t *pmultinfo;
13233 sata_drive_info_t *sdinfo = NULL;
13234
13235 sata_device->satadev_addr.qual = qual;
13236 sata_device->satadev_addr.cport = cport;
13237 sata_device->satadev_addr.pmport = pmport;
13238 sata_device->satadev_rev = SATA_DEVICE_REV_1;
13239
13240 rval = 1; /* Valid sata address */
13241
13242 cportinfo = SATA_CPORT_INFO(sata_hba_inst, cport);
13243 if (qual == SATA_ADDR_DCPORT) {
13244 if (cportinfo == NULL ||
13245 cportinfo->cport_dev_type == SATA_DTYPE_NONE)
13246 goto out;
13247
13248 sdinfo = SATA_CPORTINFO_DRV_INFO(cportinfo);
13249 if (cportinfo->cport_dev_type == SATA_DTYPE_UNKNOWN &&
13250 sdinfo != NULL) {
13251 rval = 2;
13252 goto out;
13253 }
13254
13255 if ((cportinfo->cport_dev_type &
13256 SATA_VALID_DEV_TYPE) == 0) {
13257 rval = -1;
13258 goto out;
13259 }
13260
13261 } else if (qual == SATA_ADDR_DPMPORT) {
13262 pmultinfo = SATA_CPORTINFO_PMULT_INFO(cportinfo);
13263 if (pmultinfo == NULL) {
13264 rval = -1;
13265 goto out;
13266 }
13267 if (SATA_PMPORT_INFO(sata_hba_inst, cport, pmport) ==
13268 NULL ||
13269 SATA_PMPORT_DEV_TYPE(sata_hba_inst, cport,
13270 pmport) == SATA_DTYPE_NONE)
13271 goto out;
13272
13273 sdinfo = SATA_PMPORT_DRV_INFO(sata_hba_inst, cport,
13274 pmport);
13275 if (SATA_PMPORT_DEV_TYPE(sata_hba_inst, cport,
13276 pmport) == SATA_DTYPE_UNKNOWN && sdinfo != NULL) {
13277 rval = 2;
13278 goto out;
13279 }
13280
13281 if ((SATA_PMPORT_DEV_TYPE(sata_hba_inst, cport,
13282 pmport) & SATA_VALID_DEV_TYPE) == 0) {
13283 rval = -1;
13284 goto out;
13285 }
13286
13287 } else {
13288 rval = -1;
13289 goto out;
13290 }
13291 if ((sdinfo == NULL) ||
13292 (sdinfo->satadrv_type & SATA_VALID_DEV_TYPE) == 0)
13293 goto out;
13294
13295 sata_device->satadev_type = sdinfo->satadrv_type;
13296
13297 return (0);
13298 }
13299 out:
13300 if (rval > 0) {
13301 SATADBG2(SATA_DBG_SCSI_IF, sata_hba_inst,
13302 "sata_validate_scsi_address: no valid target %x lun %x",
13303 ap->a_target, ap->a_lun);
13304 }
13305 return (rval);
13306 }
13307
13308 /*
13309 * Find dip corresponding to passed device number
13310 *
13311 * Returns NULL if invalid device number is passed or device cannot be found,
13312 * Returns dip is device is found.
13313 */
13314 static dev_info_t *
sata_devt_to_devinfo(dev_t dev)13315 sata_devt_to_devinfo(dev_t dev)
13316 {
13317 dev_info_t *dip;
13318 #ifndef __lock_lint
13319 struct devnames *dnp;
13320 major_t major = getmajor(dev);
13321 int instance = SATA_MINOR2INSTANCE(getminor(dev));
13322
13323 if (major >= devcnt)
13324 return (NULL);
13325
13326 dnp = &devnamesp[major];
13327 LOCK_DEV_OPS(&(dnp->dn_lock));
13328 dip = dnp->dn_head;
13329 while (dip && (ddi_get_instance(dip) != instance)) {
13330 dip = ddi_get_next(dip);
13331 }
13332 UNLOCK_DEV_OPS(&(dnp->dn_lock));
13333 #endif
13334
13335 return (dip);
13336 }
13337
13338
13339 /*
13340 * Probe device.
13341 * This function issues Identify Device command and initializes local
13342 * sata_drive_info structure if the device can be identified.
13343 * The device type is determined by examining Identify Device
13344 * command response.
13345 * If the sata_hba_inst has linked drive info structure for this
13346 * device address, the Identify Device data is stored into sata_drive_info
13347 * structure linked to the port info structure.
13348 *
13349 * sata_device has to refer to the valid sata port(s) for HBA described
13350 * by sata_hba_inst structure.
13351 *
13352 * Returns:
13353 * SATA_SUCCESS if device type was successfully probed and port-linked
13354 * drive info structure was updated;
13355 * SATA_FAILURE if there is no device, or device was not probed
13356 * successully;
13357 * SATA_RETRY if device probe can be retried later.
13358 * If a device cannot be identified, sata_device's dev_state and dev_type
13359 * fields are set to unknown.
13360 * There are no retries in this function. Any retries should be managed by
13361 * the caller.
13362 */
13363
13364
13365 static int
sata_probe_device(sata_hba_inst_t * sata_hba_inst,sata_device_t * sata_device)13366 sata_probe_device(sata_hba_inst_t *sata_hba_inst, sata_device_t *sata_device)
13367 {
13368 sata_pmport_info_t *pmportinfo = NULL;
13369 sata_drive_info_t *sdinfo;
13370 sata_drive_info_t new_sdinfo; /* local drive info struct */
13371 int rval;
13372
13373 ASSERT((SATA_CPORT_STATE(sata_hba_inst,
13374 sata_device->satadev_addr.cport) &
13375 (SATA_STATE_PROBED | SATA_STATE_READY)) != 0);
13376
13377 sata_device->satadev_type = SATA_DTYPE_NONE;
13378
13379 mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst,
13380 sata_device->satadev_addr.cport)));
13381
13382 if (sata_device->satadev_addr.qual == SATA_ADDR_DPMPORT) {
13383 pmportinfo = SATA_PMPORT_INFO(sata_hba_inst,
13384 sata_device->satadev_addr.cport,
13385 sata_device->satadev_addr.pmport);
13386 ASSERT(pmportinfo != NULL);
13387 }
13388
13389 /* Get pointer to port-linked sata device info structure */
13390 sdinfo = sata_get_device_info(sata_hba_inst, sata_device);
13391 if (sdinfo != NULL) {
13392 sdinfo->satadrv_state &=
13393 ~(SATA_STATE_PROBED | SATA_STATE_READY);
13394 sdinfo->satadrv_state |= SATA_STATE_PROBING;
13395 } else {
13396 /* No device to probe */
13397 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
13398 sata_device->satadev_addr.cport)));
13399 sata_device->satadev_type = SATA_DTYPE_NONE;
13400 sata_device->satadev_state = SATA_STATE_UNKNOWN;
13401 return (SATA_FAILURE);
13402 }
13403 /*
13404 * Need to issue both types of identify device command and
13405 * determine device type by examining retreived data/status.
13406 * First, ATA Identify Device.
13407 */
13408 bzero(&new_sdinfo, sizeof (sata_drive_info_t));
13409 new_sdinfo.satadrv_addr = sata_device->satadev_addr;
13410 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
13411 sata_device->satadev_addr.cport)));
13412 new_sdinfo.satadrv_type = SATA_DTYPE_ATADISK;
13413 rval = sata_identify_device(sata_hba_inst, &new_sdinfo);
13414 if (rval == SATA_RETRY) {
13415 /* We may try to check for ATAPI device */
13416 if (SATA_FEATURES(sata_hba_inst) & SATA_CTLF_ATAPI) {
13417 /*
13418 * HBA supports ATAPI - try to issue Identify Packet
13419 * Device command.
13420 */
13421 new_sdinfo.satadrv_type = SATA_DTYPE_ATAPI;
13422 rval = sata_identify_device(sata_hba_inst, &new_sdinfo);
13423 }
13424 }
13425 if (rval == SATA_SUCCESS) {
13426 /*
13427 * Got something responding positively to ATA Identify Device
13428 * or to Identify Packet Device cmd.
13429 * Save last used device type.
13430 */
13431 sata_device->satadev_type = new_sdinfo.satadrv_type;
13432
13433 /* save device info, if possible */
13434 mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst,
13435 sata_device->satadev_addr.cport)));
13436 sdinfo = sata_get_device_info(sata_hba_inst, sata_device);
13437 if (sdinfo == NULL) {
13438 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
13439 sata_device->satadev_addr.cport)));
13440 return (SATA_FAILURE);
13441 }
13442 /*
13443 * Copy drive info into the port-linked drive info structure.
13444 */
13445 *sdinfo = new_sdinfo;
13446 sdinfo->satadrv_state &= ~SATA_STATE_PROBING;
13447 sdinfo->satadrv_state |= SATA_STATE_PROBED;
13448 if (sata_device->satadev_addr.qual == SATA_ADDR_DCPORT)
13449 SATA_CPORT_DEV_TYPE(sata_hba_inst,
13450 sata_device->satadev_addr.cport) =
13451 sdinfo->satadrv_type;
13452 else { /* SATA_ADDR_DPMPORT */
13453 mutex_enter(&pmportinfo->pmport_mutex);
13454 SATA_PMPORT_DEV_TYPE(sata_hba_inst,
13455 sata_device->satadev_addr.cport,
13456 sata_device->satadev_addr.pmport) =
13457 sdinfo->satadrv_type;
13458 mutex_exit(&pmportinfo->pmport_mutex);
13459 }
13460 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
13461 sata_device->satadev_addr.cport)));
13462 return (SATA_SUCCESS);
13463 }
13464
13465 /*
13466 * It may be SATA_RETRY or SATA_FAILURE return.
13467 * Looks like we cannot determine the device type at this time.
13468 */
13469 mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst,
13470 sata_device->satadev_addr.cport)));
13471 sdinfo = sata_get_device_info(sata_hba_inst, sata_device);
13472 if (sdinfo != NULL) {
13473 sata_device->satadev_type = SATA_DTYPE_UNKNOWN;
13474 sdinfo->satadrv_type = SATA_DTYPE_UNKNOWN;
13475 sdinfo->satadrv_state &= ~SATA_STATE_PROBING;
13476 sdinfo->satadrv_state |= SATA_STATE_PROBED;
13477 if (sata_device->satadev_addr.qual == SATA_ADDR_DCPORT)
13478 SATA_CPORT_DEV_TYPE(sata_hba_inst,
13479 sata_device->satadev_addr.cport) =
13480 SATA_DTYPE_UNKNOWN;
13481 else {
13482 /* SATA_ADDR_DPMPORT */
13483 mutex_enter(&pmportinfo->pmport_mutex);
13484 if ((SATA_PMULT_INFO(sata_hba_inst,
13485 sata_device->satadev_addr.cport) != NULL) &&
13486 (SATA_PMPORT_INFO(sata_hba_inst,
13487 sata_device->satadev_addr.cport,
13488 sata_device->satadev_addr.pmport) != NULL))
13489 SATA_PMPORT_DEV_TYPE(sata_hba_inst,
13490 sata_device->satadev_addr.cport,
13491 sata_device->satadev_addr.pmport) =
13492 SATA_DTYPE_UNKNOWN;
13493 mutex_exit(&pmportinfo->pmport_mutex);
13494 }
13495 }
13496 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
13497 sata_device->satadev_addr.cport)));
13498 return (rval);
13499 }
13500
13501
13502 /*
13503 * Get pointer to sata_drive_info structure.
13504 *
13505 * The sata_device has to contain address (cport, pmport and qualifier) for
13506 * specified sata_scsi structure.
13507 *
13508 * Returns NULL if device address is not valid for this HBA configuration.
13509 * Otherwise, returns a pointer to sata_drive_info structure.
13510 *
13511 * This function should be called with a port mutex held.
13512 */
13513 static sata_drive_info_t *
sata_get_device_info(sata_hba_inst_t * sata_hba_inst,sata_device_t * sata_device)13514 sata_get_device_info(sata_hba_inst_t *sata_hba_inst,
13515 sata_device_t *sata_device)
13516 {
13517 uint8_t cport = sata_device->satadev_addr.cport;
13518 uint8_t pmport = sata_device->satadev_addr.pmport;
13519 uint8_t qual = sata_device->satadev_addr.qual;
13520
13521 if (cport >= SATA_NUM_CPORTS(sata_hba_inst))
13522 return (NULL);
13523
13524 if (!(SATA_CPORT_STATE(sata_hba_inst, cport) &
13525 (SATA_STATE_PROBED | SATA_STATE_READY)))
13526 /* Port not probed yet */
13527 return (NULL);
13528
13529 if (SATA_CPORT_DEV_TYPE(sata_hba_inst, cport) == SATA_DTYPE_NONE)
13530 return (NULL);
13531
13532 if (qual == SATA_ADDR_DCPORT) {
13533 /* Request for a device on a controller port */
13534 if (SATA_CPORT_DEV_TYPE(sata_hba_inst, cport) ==
13535 SATA_DTYPE_PMULT)
13536 /* Port multiplier attached */
13537 return (NULL);
13538 return (SATA_CPORT_DRV_INFO(sata_hba_inst, cport));
13539 }
13540 if (qual == SATA_ADDR_DPMPORT) {
13541 if (SATA_CPORT_DEV_TYPE(sata_hba_inst, cport) !=
13542 SATA_DTYPE_PMULT)
13543 return (NULL);
13544
13545 if (pmport > SATA_NUM_PMPORTS(sata_hba_inst, cport))
13546 return (NULL);
13547
13548 if (!(SATA_PMPORT_STATE(sata_hba_inst, cport, pmport) &
13549 (SATA_STATE_PROBED | SATA_STATE_READY)))
13550 /* Port multiplier port not probed yet */
13551 return (NULL);
13552
13553 return (SATA_PMPORT_DRV_INFO(sata_hba_inst, cport, pmport));
13554 }
13555
13556 /* we should not get here */
13557 return (NULL);
13558 }
13559
13560
13561 /*
13562 * sata_identify_device.
13563 * Send Identify Device command to SATA HBA driver.
13564 * If command executes successfully, update sata_drive_info structure pointed
13565 * to by sdinfo argument, including Identify Device data.
13566 * If command fails, invalidate data in sata_drive_info.
13567 *
13568 * Cannot be called from interrupt level.
13569 *
13570 * Returns:
13571 * SATA_SUCCESS if the device was identified as a supported device,
13572 * SATA_RETRY if the device was not identified but could be retried,
13573 * SATA_FAILURE if the device was not identified and identify attempt
13574 * should not be retried.
13575 */
13576 static int
sata_identify_device(sata_hba_inst_t * sata_hba_inst,sata_drive_info_t * sdinfo)13577 sata_identify_device(sata_hba_inst_t *sata_hba_inst,
13578 sata_drive_info_t *sdinfo)
13579 {
13580 uint16_t cfg_word;
13581 int rval;
13582
13583 /* fetch device identify data */
13584 if ((rval = sata_fetch_device_identify_data(sata_hba_inst,
13585 sdinfo)) != SATA_SUCCESS)
13586 goto fail_unknown;
13587
13588 cfg_word = sdinfo->satadrv_id.ai_config;
13589
13590 /* Set the correct device type */
13591 if ((cfg_word & SATA_ATA_TYPE_MASK) == SATA_ATA_TYPE) {
13592 sdinfo->satadrv_type = SATA_DTYPE_ATADISK;
13593 } else if (cfg_word == SATA_CFA_TYPE) {
13594 /* It's a Compact Flash media via CF-to-SATA HDD adapter */
13595 sdinfo->satadrv_type = SATA_DTYPE_ATADISK;
13596 } else if ((cfg_word & SATA_ATAPI_TYPE_MASK) == SATA_ATAPI_TYPE) {
13597 switch (cfg_word & SATA_ATAPI_ID_DEV_TYPE) {
13598 case SATA_ATAPI_CDROM_DEV:
13599 sdinfo->satadrv_type = SATA_DTYPE_ATAPICD;
13600 break;
13601 case SATA_ATAPI_SQACC_DEV:
13602 sdinfo->satadrv_type = SATA_DTYPE_ATAPITAPE;
13603 break;
13604 case SATA_ATAPI_DIRACC_DEV:
13605 sdinfo->satadrv_type = SATA_DTYPE_ATAPIDISK;
13606 break;
13607 case SATA_ATAPI_PROC_DEV:
13608 sdinfo->satadrv_type = SATA_DTYPE_ATAPIPROC;
13609 break;
13610 default:
13611 sdinfo->satadrv_type = SATA_DTYPE_UNKNOWN;
13612 }
13613 } else {
13614 sdinfo->satadrv_type = SATA_DTYPE_UNKNOWN;
13615 }
13616
13617 if (sdinfo->satadrv_type == SATA_DTYPE_ATADISK) {
13618 if (sdinfo->satadrv_capacity == 0) {
13619 /* Non-LBA disk. Too bad... */
13620 sata_log(sata_hba_inst, CE_WARN,
13621 "SATA disk device at port %d does not support LBA",
13622 sdinfo->satadrv_addr.cport);
13623 rval = SATA_FAILURE;
13624 goto fail_unknown;
13625 }
13626 }
13627 #if 0
13628 /* Left for historical reason */
13629 /*
13630 * Some initial version of SATA spec indicated that at least
13631 * UDMA mode 4 has to be supported. It is not metioned in
13632 * SerialATA 2.6, so this restriction is removed.
13633 */
13634 /* Check for Ultra DMA modes 6 through 0 being supported */
13635 for (i = 6; i >= 0; --i) {
13636 if (sdinfo->satadrv_id.ai_ultradma & (1 << i))
13637 break;
13638 }
13639
13640 /*
13641 * At least UDMA 4 mode has to be supported. If mode 4 or
13642 * higher are not supported by the device, fail this
13643 * device.
13644 */
13645 if (i < 4) {
13646 /* No required Ultra DMA mode supported */
13647 sata_log(sata_hba_inst, CE_WARN,
13648 "SATA disk device at port %d does not support UDMA "
13649 "mode 4 or higher", sdinfo->satadrv_addr.cport);
13650 SATA_LOG_D((sata_hba_inst, CE_WARN,
13651 "mode 4 or higher required, %d supported", i));
13652 rval = SATA_FAILURE;
13653 goto fail_unknown;
13654 }
13655 #endif
13656
13657 /*
13658 * For Disk devices, if it doesn't support UDMA mode, we would
13659 * like to return failure directly.
13660 */
13661 if ((sdinfo->satadrv_type == SATA_DTYPE_ATADISK) &&
13662 !((sdinfo->satadrv_id.ai_validinfo & SATA_VALIDINFO_88) != 0 &&
13663 (sdinfo->satadrv_id.ai_ultradma & SATA_UDMA_SUP_MASK) != 0)) {
13664 sata_log(sata_hba_inst, CE_WARN,
13665 "SATA disk device at port %d does not support UDMA",
13666 sdinfo->satadrv_addr.cport);
13667 rval = SATA_FAILURE;
13668 goto fail_unknown;
13669 }
13670
13671 return (SATA_SUCCESS);
13672
13673 fail_unknown:
13674 /* Invalidate sata_drive_info ? */
13675 sdinfo->satadrv_type = SATA_DTYPE_UNKNOWN;
13676 sdinfo->satadrv_state = SATA_STATE_UNKNOWN;
13677 return (rval);
13678 }
13679
13680 /*
13681 * Log/display device information
13682 */
13683 static void
sata_show_drive_info(sata_hba_inst_t * sata_hba_inst,sata_drive_info_t * sdinfo)13684 sata_show_drive_info(sata_hba_inst_t *sata_hba_inst,
13685 sata_drive_info_t *sdinfo)
13686 {
13687 int valid_version = 0;
13688 char msg_buf[MAXPATHLEN];
13689 int i;
13690
13691 /* Show HBA path */
13692 (void) ddi_pathname(SATA_DIP(sata_hba_inst), msg_buf);
13693
13694 cmn_err(CE_CONT, "?%s :\n", msg_buf);
13695
13696 switch (sdinfo->satadrv_type) {
13697 case SATA_DTYPE_ATADISK:
13698 (void) sprintf(msg_buf, "SATA disk device at");
13699 break;
13700
13701 case SATA_DTYPE_ATAPICD:
13702 (void) sprintf(msg_buf, "SATA CD/DVD (ATAPI) device at");
13703 break;
13704
13705 case SATA_DTYPE_ATAPITAPE:
13706 (void) sprintf(msg_buf, "SATA tape (ATAPI) device at");
13707 break;
13708
13709 case SATA_DTYPE_ATAPIDISK:
13710 (void) sprintf(msg_buf, "SATA disk (ATAPI) device at");
13711 break;
13712
13713 case SATA_DTYPE_ATAPIPROC:
13714 (void) sprintf(msg_buf, "SATA processor (ATAPI) device at");
13715 break;
13716
13717 case SATA_DTYPE_UNKNOWN:
13718 (void) sprintf(msg_buf,
13719 "Unsupported SATA device type (cfg 0x%x) at ",
13720 sdinfo->satadrv_id.ai_config);
13721 break;
13722 }
13723
13724 if (sdinfo->satadrv_addr.qual == SATA_ADDR_DCPORT)
13725 cmn_err(CE_CONT, "?\t%s port %d\n",
13726 msg_buf, sdinfo->satadrv_addr.cport);
13727 else
13728 cmn_err(CE_CONT, "?\t%s port %d:%d\n",
13729 msg_buf, sdinfo->satadrv_addr.cport,
13730 sdinfo->satadrv_addr.pmport);
13731
13732 bcopy(&sdinfo->satadrv_id.ai_model, msg_buf,
13733 sizeof (sdinfo->satadrv_id.ai_model));
13734 swab(msg_buf, msg_buf, sizeof (sdinfo->satadrv_id.ai_model));
13735 msg_buf[sizeof (sdinfo->satadrv_id.ai_model)] = '\0';
13736 cmn_err(CE_CONT, "?\tmodel %s\n", msg_buf);
13737
13738 bcopy(&sdinfo->satadrv_id.ai_fw, msg_buf,
13739 sizeof (sdinfo->satadrv_id.ai_fw));
13740 swab(msg_buf, msg_buf, sizeof (sdinfo->satadrv_id.ai_fw));
13741 msg_buf[sizeof (sdinfo->satadrv_id.ai_fw)] = '\0';
13742 cmn_err(CE_CONT, "?\tfirmware %s\n", msg_buf);
13743
13744 bcopy(&sdinfo->satadrv_id.ai_drvser, msg_buf,
13745 sizeof (sdinfo->satadrv_id.ai_drvser));
13746 swab(msg_buf, msg_buf, sizeof (sdinfo->satadrv_id.ai_drvser));
13747 msg_buf[sizeof (sdinfo->satadrv_id.ai_drvser)] = '\0';
13748 if (sdinfo->satadrv_type == SATA_DTYPE_ATADISK) {
13749 cmn_err(CE_CONT, "?\tserial number %s\n", msg_buf);
13750 } else {
13751 /*
13752 * Some drives do not implement serial number and may
13753 * violate the spec by providing spaces rather than zeros
13754 * in serial number field. Scan the buffer to detect it.
13755 */
13756 for (i = 0; i < sizeof (sdinfo->satadrv_id.ai_drvser); i++) {
13757 if (msg_buf[i] != '\0' && msg_buf[i] != ' ')
13758 break;
13759 }
13760 if (i == sizeof (sdinfo->satadrv_id.ai_drvser)) {
13761 cmn_err(CE_CONT, "?\tserial number - none\n");
13762 } else {
13763 cmn_err(CE_CONT, "?\tserial number %s\n", msg_buf);
13764 }
13765 }
13766
13767 #ifdef SATA_DEBUG
13768 if (sdinfo->satadrv_id.ai_majorversion != 0 &&
13769 sdinfo->satadrv_id.ai_majorversion != 0xffff) {
13770 int i;
13771 for (i = 14; i >= 2; i--) {
13772 if (sdinfo->satadrv_id.ai_majorversion & (1 << i)) {
13773 valid_version = i;
13774 break;
13775 }
13776 }
13777 cmn_err(CE_CONT,
13778 "?\tATA/ATAPI-%d supported, majver 0x%x minver 0x%x\n",
13779 valid_version,
13780 sdinfo->satadrv_id.ai_majorversion,
13781 sdinfo->satadrv_id.ai_minorversion);
13782 }
13783 #endif
13784 /* Log some info */
13785 cmn_err(CE_CONT, "?\tsupported features:\n");
13786 msg_buf[0] = '\0';
13787 if (sdinfo->satadrv_type == SATA_DTYPE_ATADISK) {
13788 if (sdinfo->satadrv_features_support & SATA_DEV_F_LBA48)
13789 (void) strlcat(msg_buf, "48-bit LBA, ", MAXPATHLEN);
13790 else if (sdinfo->satadrv_features_support & SATA_DEV_F_LBA28)
13791 (void) strlcat(msg_buf, "28-bit LBA, ", MAXPATHLEN);
13792 }
13793 if (sdinfo->satadrv_features_support & SATA_DEV_F_DMA)
13794 (void) strlcat(msg_buf, "DMA", MAXPATHLEN);
13795 if (sdinfo->satadrv_features_support & SATA_DEV_F_NCQ)
13796 (void) strlcat(msg_buf, ", Native Command Queueing",
13797 MAXPATHLEN);
13798 if (sdinfo->satadrv_features_support & SATA_DEV_F_TCQ)
13799 (void) strlcat(msg_buf, ", Legacy Tagged Queuing", MAXPATHLEN);
13800 if ((sdinfo->satadrv_id.ai_cmdset82 & SATA_SMART_SUPPORTED) &&
13801 (sdinfo->satadrv_id.ai_features85 & SATA_SMART_ENABLED))
13802 (void) strlcat(msg_buf, ", SMART", MAXPATHLEN);
13803 if ((sdinfo->satadrv_id.ai_cmdset84 & SATA_SMART_SELF_TEST_SUPPORTED) &&
13804 (sdinfo->satadrv_id.ai_features87 & SATA_SMART_SELF_TEST_SUPPORTED))
13805 (void) strlcat(msg_buf, ", SMART self-test", MAXPATHLEN);
13806 cmn_err(CE_CONT, "?\t %s\n", msg_buf);
13807 if (sdinfo->satadrv_features_support & SATA_DEV_F_SATA3)
13808 cmn_err(CE_CONT, "?\tSATA Gen3 signaling speed (6.0Gbps)\n");
13809 else if (sdinfo->satadrv_features_support & SATA_DEV_F_SATA2)
13810 cmn_err(CE_CONT, "?\tSATA Gen2 signaling speed (3.0Gbps)\n");
13811 else if (sdinfo->satadrv_features_support & SATA_DEV_F_SATA1)
13812 cmn_err(CE_CONT, "?\tSATA Gen1 signaling speed (1.5Gbps)\n");
13813 if (sdinfo->satadrv_features_support &
13814 (SATA_DEV_F_TCQ | SATA_DEV_F_NCQ)) {
13815 msg_buf[0] = '\0';
13816 (void) snprintf(msg_buf, MAXPATHLEN,
13817 "Supported queue depth %d",
13818 sdinfo->satadrv_queue_depth);
13819 if (!(sata_func_enable &
13820 (SATA_ENABLE_QUEUING | SATA_ENABLE_NCQ)))
13821 (void) strlcat(msg_buf,
13822 " - queueing disabled globally", MAXPATHLEN);
13823 else if (sdinfo->satadrv_queue_depth >
13824 sdinfo->satadrv_max_queue_depth) {
13825 (void) snprintf(&msg_buf[strlen(msg_buf)],
13826 MAXPATHLEN - strlen(msg_buf), ", limited to %d",
13827 (int)sdinfo->satadrv_max_queue_depth);
13828 }
13829 cmn_err(CE_CONT, "?\t%s\n", msg_buf);
13830 }
13831
13832 if (sdinfo->satadrv_type == SATA_DTYPE_ATADISK) {
13833 (void) sprintf(msg_buf, "\tcapacity = %lu sectors\n",
13834 sdinfo->satadrv_capacity);
13835 cmn_err(CE_CONT, "?%s", msg_buf);
13836 }
13837 }
13838
13839 /*
13840 * Log/display port multiplier information
13841 * No Mutex should be hold.
13842 */
13843 static void
sata_show_pmult_info(sata_hba_inst_t * sata_hba_inst,sata_device_t * sata_device)13844 sata_show_pmult_info(sata_hba_inst_t *sata_hba_inst,
13845 sata_device_t *sata_device)
13846 {
13847 _NOTE(ARGUNUSED(sata_hba_inst))
13848
13849 int cport = sata_device->satadev_addr.cport;
13850 sata_pmult_info_t *pmultinfo;
13851 char msg_buf[MAXPATHLEN];
13852 uint32_t gscr0, gscr1, gscr2, gscr64;
13853
13854 mutex_enter(&SATA_CPORT_MUTEX(sata_hba_inst, cport));
13855 pmultinfo = SATA_PMULT_INFO(sata_hba_inst, cport);
13856 if (pmultinfo == NULL) {
13857 mutex_exit(&SATA_CPORT_MUTEX(sata_hba_inst, cport));
13858 return;
13859 }
13860
13861 gscr0 = pmultinfo->pmult_gscr.gscr0;
13862 gscr1 = pmultinfo->pmult_gscr.gscr1;
13863 gscr2 = pmultinfo->pmult_gscr.gscr2;
13864 gscr64 = pmultinfo->pmult_gscr.gscr64;
13865 mutex_exit(&SATA_CPORT_MUTEX(sata_hba_inst, cport));
13866
13867 cmn_err(CE_CONT, "?Port Multiplier %d device-ports found at port %d",
13868 sata_device->satadev_add_info, sata_device->satadev_addr.cport);
13869
13870 (void) sprintf(msg_buf, "\tVendor_ID 0x%04x, Module_ID 0x%04x",
13871 gscr0 & 0xffff, (gscr0 >> 16) & 0xffff);
13872 cmn_err(CE_CONT, "?%s", msg_buf);
13873
13874 (void) strcpy(msg_buf, "\tSupport SATA PMP Spec ");
13875 if (gscr1 & (1 << 3))
13876 (void) strlcat(msg_buf, "1.2", MAXPATHLEN);
13877 else if (gscr1 & (1 << 2))
13878 (void) strlcat(msg_buf, "1.1", MAXPATHLEN);
13879 else if (gscr1 & (1 << 1))
13880 (void) strlcat(msg_buf, "1.0", MAXPATHLEN);
13881 else
13882 (void) strlcat(msg_buf, "unknown", MAXPATHLEN);
13883 cmn_err(CE_CONT, "?%s", msg_buf);
13884
13885 (void) strcpy(msg_buf, "\tSupport ");
13886 if (gscr64 & (1 << 3))
13887 (void) strlcat(msg_buf, "Asy-Notif, ",
13888 MAXPATHLEN);
13889 if (gscr64 & (1 << 2))
13890 (void) strlcat(msg_buf, "Dyn-SSC, ", MAXPATHLEN);
13891 if (gscr64 & (1 << 1))
13892 (void) strlcat(msg_buf, "Iss-PMREQ, ", MAXPATHLEN);
13893 if (gscr64 & (1 << 0))
13894 (void) strlcat(msg_buf, "BIST", MAXPATHLEN);
13895 if ((gscr64 & 0xf) == 0)
13896 (void) strlcat(msg_buf, "nothing", MAXPATHLEN);
13897 cmn_err(CE_CONT, "?%s", msg_buf);
13898
13899 (void) sprintf(msg_buf, "\tNumber of exposed device fan-out ports: %d",
13900 gscr2 & SATA_PMULT_PORTNUM_MASK);
13901 cmn_err(CE_CONT, "?%s", msg_buf);
13902 }
13903
13904 /*
13905 * sata_save_drive_settings extracts current setting of the device and stores
13906 * it for future reference, in case the device setup would need to be restored
13907 * after the device reset.
13908 *
13909 * For all devices read ahead and write cache settings are saved, if the
13910 * device supports these features at all.
13911 * For ATAPI devices the Removable Media Status Notification setting is saved.
13912 */
13913 static void
sata_save_drive_settings(sata_drive_info_t * sdinfo)13914 sata_save_drive_settings(sata_drive_info_t *sdinfo)
13915 {
13916 if (SATA_READ_AHEAD_SUPPORTED(sdinfo->satadrv_id) ||
13917 SATA_WRITE_CACHE_SUPPORTED(sdinfo->satadrv_id)) {
13918
13919 /* Current setting of Read Ahead (and Read Cache) */
13920 if (SATA_READ_AHEAD_ENABLED(sdinfo->satadrv_id))
13921 sdinfo->satadrv_settings |= SATA_DEV_READ_AHEAD;
13922 else
13923 sdinfo->satadrv_settings &= ~SATA_DEV_READ_AHEAD;
13924
13925 /* Current setting of Write Cache */
13926 if (SATA_WRITE_CACHE_ENABLED(sdinfo->satadrv_id))
13927 sdinfo->satadrv_settings |= SATA_DEV_WRITE_CACHE;
13928 else
13929 sdinfo->satadrv_settings &= ~SATA_DEV_WRITE_CACHE;
13930 }
13931
13932 if (sdinfo->satadrv_type == SATA_DTYPE_ATAPICD) {
13933 if (SATA_RM_NOTIFIC_SUPPORTED(sdinfo->satadrv_id))
13934 sdinfo->satadrv_settings |= SATA_DEV_RMSN;
13935 else
13936 sdinfo->satadrv_settings &= ~SATA_DEV_RMSN;
13937 }
13938 }
13939
13940
13941 /*
13942 * sata_check_capacity function determines a disk capacity
13943 * and addressing mode (LBA28/LBA48) by examining a disk identify device data.
13944 *
13945 * NOTE: CHS mode is not supported! If a device does not support LBA,
13946 * this function is not called.
13947 *
13948 * Returns device capacity in number of blocks, i.e. largest addressable LBA+1
13949 */
13950 static uint64_t
sata_check_capacity(sata_drive_info_t * sdinfo)13951 sata_check_capacity(sata_drive_info_t *sdinfo)
13952 {
13953 uint64_t capacity = 0;
13954 int i;
13955
13956 if (sdinfo->satadrv_type != SATA_DTYPE_ATADISK ||
13957 (sdinfo->satadrv_id.ai_cap & SATA_LBA_SUPPORT) == 0)
13958 /* Capacity valid only for LBA-addressable disk devices */
13959 return (0);
13960
13961 if ((sdinfo->satadrv_id.ai_validinfo & SATA_VALIDINFO_88) &&
13962 (sdinfo->satadrv_id.ai_cmdset83 & SATA_EXT48) &&
13963 (sdinfo->satadrv_id.ai_features86 & SATA_EXT48)) {
13964 /* LBA48 mode supported and enabled */
13965 sdinfo->satadrv_features_support |= SATA_DEV_F_LBA48 |
13966 SATA_DEV_F_LBA28;
13967 for (i = 3; i >= 0; --i) {
13968 capacity <<= 16;
13969 capacity += sdinfo->satadrv_id.ai_addrsecxt[i];
13970 }
13971 } else {
13972 capacity = sdinfo->satadrv_id.ai_addrsec[1];
13973 capacity <<= 16;
13974 capacity += sdinfo->satadrv_id.ai_addrsec[0];
13975 if (capacity >= 0x1000000)
13976 /* LBA28 mode */
13977 sdinfo->satadrv_features_support |= SATA_DEV_F_LBA28;
13978 }
13979 return (capacity);
13980 }
13981
13982
13983 /*
13984 * Allocate consistent buffer for DMA transfer
13985 *
13986 * Cannot be called from interrupt level or with mutex held - it may sleep.
13987 *
13988 * Returns pointer to allocated buffer structure, or NULL if allocation failed.
13989 */
13990 static struct buf *
sata_alloc_local_buffer(sata_pkt_txlate_t * spx,size_t len)13991 sata_alloc_local_buffer(sata_pkt_txlate_t *spx, size_t len)
13992 {
13993 struct scsi_address ap;
13994 struct buf *bp;
13995 ddi_dma_attr_t cur_dma_attr;
13996
13997 ASSERT(spx->txlt_sata_pkt != NULL);
13998 ap.a_hba_tran = spx->txlt_sata_hba_inst->satahba_scsi_tran;
13999 ap.a_target = SATA_TO_SCSI_TARGET(
14000 spx->txlt_sata_pkt->satapkt_device.satadev_addr.cport,
14001 spx->txlt_sata_pkt->satapkt_device.satadev_addr.pmport,
14002 spx->txlt_sata_pkt->satapkt_device.satadev_addr.qual);
14003 ap.a_lun = 0;
14004
14005 bp = scsi_alloc_consistent_buf(&ap, NULL, len,
14006 B_READ, SLEEP_FUNC, NULL);
14007
14008 if (bp != NULL) {
14009 /* Allocate DMA resources for this buffer */
14010 spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp = bp;
14011 /*
14012 * We use a local version of the dma_attr, to account
14013 * for a device addressing limitations.
14014 * sata_adjust_dma_attr() will handle sdinfo == NULL which
14015 * will cause dma attributes to be adjusted to a lowest
14016 * acceptable level.
14017 */
14018 sata_adjust_dma_attr(NULL,
14019 SATA_DMA_ATTR(spx->txlt_sata_hba_inst), &cur_dma_attr);
14020
14021 if (sata_dma_buf_setup(spx, PKT_CONSISTENT,
14022 SLEEP_FUNC, NULL, &cur_dma_attr) != DDI_SUCCESS) {
14023 scsi_free_consistent_buf(bp);
14024 spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp = NULL;
14025 bp = NULL;
14026 }
14027 }
14028 return (bp);
14029 }
14030
14031 /*
14032 * Release local buffer (consistent buffer for DMA transfer) allocated
14033 * via sata_alloc_local_buffer().
14034 */
14035 static void
sata_free_local_buffer(sata_pkt_txlate_t * spx)14036 sata_free_local_buffer(sata_pkt_txlate_t *spx)
14037 {
14038 ASSERT(spx->txlt_sata_pkt != NULL);
14039 ASSERT(spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp != NULL);
14040
14041 spx->txlt_sata_pkt->satapkt_cmd.satacmd_num_dma_cookies = 0;
14042 spx->txlt_sata_pkt->satapkt_cmd.satacmd_dma_cookie_list = NULL;
14043
14044 sata_common_free_dma_rsrcs(spx);
14045
14046 /* Free buffer */
14047 scsi_free_consistent_buf(spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp);
14048 spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp = NULL;
14049 }
14050
14051 /*
14052 * Allocate sata_pkt
14053 * Pkt structure version and embedded strcutures version are initialized.
14054 * sata_pkt and sata_pkt_txlate structures are cross-linked.
14055 *
14056 * Since this may be called in interrupt context by sata_scsi_init_pkt,
14057 * callback argument determines if it can sleep or not.
14058 * Hence, it should not be called from interrupt context.
14059 *
14060 * If successful, non-NULL pointer to a sata pkt is returned.
14061 * Upon failure, NULL pointer is returned.
14062 */
14063 static sata_pkt_t *
sata_pkt_alloc(sata_pkt_txlate_t * spx,int (* callback)(caddr_t))14064 sata_pkt_alloc(sata_pkt_txlate_t *spx, int (*callback)(caddr_t))
14065 {
14066 sata_pkt_t *spkt;
14067 int kmsflag;
14068
14069 kmsflag = (callback == SLEEP_FUNC) ? KM_SLEEP : KM_NOSLEEP;
14070 spkt = kmem_zalloc(sizeof (sata_pkt_t), kmsflag);
14071 if (spkt == NULL) {
14072 SATA_LOG_D((spx->txlt_sata_hba_inst, CE_WARN,
14073 "sata_pkt_alloc: failed"));
14074 return (NULL);
14075 }
14076 spkt->satapkt_rev = SATA_PKT_REV;
14077 spkt->satapkt_cmd.satacmd_rev = SATA_CMD_REV;
14078 spkt->satapkt_device.satadev_rev = SATA_DEVICE_REV;
14079 spkt->satapkt_framework_private = spx;
14080 spx->txlt_sata_pkt = spkt;
14081 return (spkt);
14082 }
14083
14084 /*
14085 * Free sata pkt allocated via sata_pkt_alloc()
14086 */
14087 static void
sata_pkt_free(sata_pkt_txlate_t * spx)14088 sata_pkt_free(sata_pkt_txlate_t *spx)
14089 {
14090 ASSERT(spx->txlt_sata_pkt != NULL);
14091 ASSERT(spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp == NULL);
14092 kmem_free(spx->txlt_sata_pkt, sizeof (sata_pkt_t));
14093 spx->txlt_sata_pkt = NULL;
14094 }
14095
14096
14097 /*
14098 * Adjust DMA attributes.
14099 * SCSI cmds block count is up to 24 bits, SATA cmd block count vary
14100 * from 8 bits to 16 bits, depending on a command being used.
14101 * Limiting max block count arbitrarily to 256 for all read/write
14102 * commands may affects performance, so check both the device and
14103 * controller capability before adjusting dma attributes.
14104 */
14105 void
sata_adjust_dma_attr(sata_drive_info_t * sdinfo,ddi_dma_attr_t * dma_attr,ddi_dma_attr_t * adj_dma_attr)14106 sata_adjust_dma_attr(sata_drive_info_t *sdinfo, ddi_dma_attr_t *dma_attr,
14107 ddi_dma_attr_t *adj_dma_attr)
14108 {
14109 uint32_t count_max;
14110
14111 /* Copy original attributes */
14112 *adj_dma_attr = *dma_attr;
14113 /*
14114 * Things to consider: device addressing capability,
14115 * "excessive" controller DMA capabilities.
14116 * If a device is being probed/initialized, there are
14117 * no device info - use default limits then.
14118 */
14119 if (sdinfo == NULL) {
14120 count_max = dma_attr->dma_attr_granular * 0x100;
14121 if (dma_attr->dma_attr_count_max > count_max)
14122 adj_dma_attr->dma_attr_count_max = count_max;
14123 if (dma_attr->dma_attr_maxxfer > count_max)
14124 adj_dma_attr->dma_attr_maxxfer = count_max;
14125 return;
14126 }
14127
14128 if (sdinfo->satadrv_type == SATA_DTYPE_ATADISK) {
14129 if (sdinfo->satadrv_features_support & (SATA_DEV_F_LBA48)) {
14130 /*
14131 * 16-bit sector count may be used - we rely on
14132 * the assumption that only read and write cmds
14133 * will request more than 256 sectors worth of data
14134 */
14135 count_max = adj_dma_attr->dma_attr_granular * 0x10000;
14136 } else {
14137 /*
14138 * 8-bit sector count will be used - default limits
14139 * for dma attributes
14140 */
14141 count_max = adj_dma_attr->dma_attr_granular * 0x100;
14142 }
14143 /*
14144 * Adjust controler dma attributes, if necessary
14145 */
14146 if (dma_attr->dma_attr_count_max > count_max)
14147 adj_dma_attr->dma_attr_count_max = count_max;
14148 if (dma_attr->dma_attr_maxxfer > count_max)
14149 adj_dma_attr->dma_attr_maxxfer = count_max;
14150 }
14151 }
14152
14153
14154 /*
14155 * Allocate DMA resources for the buffer
14156 * This function handles initial DMA resource allocation as well as
14157 * DMA window shift and may be called repeatedly for the same DMA window
14158 * until all DMA cookies in the DMA window are processed.
14159 * To guarantee that there is always a coherent set of cookies to process
14160 * by SATA HBA driver (observing alignment, device granularity, etc.),
14161 * the number of slots for DMA cookies is equal to lesser of a number of
14162 * cookies in a DMA window and a max number of scatter/gather entries.
14163 *
14164 * Returns DDI_SUCCESS upon successful operation.
14165 * Return failure code of a failing command or DDI_FAILURE when
14166 * internal cleanup failed.
14167 */
14168 static int
sata_dma_buf_setup(sata_pkt_txlate_t * spx,int flags,int (* callback)(caddr_t),caddr_t arg,ddi_dma_attr_t * cur_dma_attr)14169 sata_dma_buf_setup(sata_pkt_txlate_t *spx, int flags,
14170 int (*callback)(caddr_t), caddr_t arg,
14171 ddi_dma_attr_t *cur_dma_attr)
14172 {
14173 int rval;
14174 off_t offset;
14175 size_t size;
14176 int max_sg_len, req_len, i;
14177 uint_t dma_flags;
14178 struct buf *bp;
14179 uint64_t cur_txfer_len;
14180
14181
14182 ASSERT(spx->txlt_sata_pkt != NULL);
14183 bp = spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp;
14184 ASSERT(bp != NULL);
14185
14186
14187 if (spx->txlt_buf_dma_handle == NULL) {
14188 /*
14189 * No DMA resources allocated so far - this is a first call
14190 * for this sata pkt.
14191 */
14192 rval = ddi_dma_alloc_handle(SATA_DIP(spx->txlt_sata_hba_inst),
14193 cur_dma_attr, callback, arg, &spx->txlt_buf_dma_handle);
14194
14195 if (rval != DDI_SUCCESS) {
14196 SATA_LOG_D((spx->txlt_sata_hba_inst, CE_WARN,
14197 "sata_dma_buf_setup: no buf DMA resources %x",
14198 rval));
14199 return (rval);
14200 }
14201
14202 if (bp->b_flags & B_READ)
14203 dma_flags = DDI_DMA_READ;
14204 else
14205 dma_flags = DDI_DMA_WRITE;
14206
14207 if (flags & PKT_CONSISTENT)
14208 dma_flags |= DDI_DMA_CONSISTENT;
14209
14210 if (flags & PKT_DMA_PARTIAL)
14211 dma_flags |= DDI_DMA_PARTIAL;
14212
14213 /*
14214 * Check buffer alignment and size against dma attributes
14215 * Consider dma_attr_align only. There may be requests
14216 * with the size lower than device granularity, but they
14217 * will not read/write from/to the device, so no adjustment
14218 * is necessary. The dma_attr_minxfer theoretically should
14219 * be considered, but no HBA driver is checking it.
14220 */
14221 if (IS_P2ALIGNED(bp->b_un.b_addr,
14222 cur_dma_attr->dma_attr_align)) {
14223 rval = ddi_dma_buf_bind_handle(
14224 spx->txlt_buf_dma_handle,
14225 bp, dma_flags, callback, arg,
14226 &spx->txlt_dma_cookie,
14227 &spx->txlt_curwin_num_dma_cookies);
14228 } else { /* Buffer is not aligned */
14229
14230 int (*ddicallback)(caddr_t);
14231 size_t bufsz;
14232
14233 /* Check id sleeping is allowed */
14234 ddicallback = (callback == NULL_FUNC) ?
14235 DDI_DMA_DONTWAIT : DDI_DMA_SLEEP;
14236
14237 SATADBG2(SATA_DBG_DMA_SETUP, spx->txlt_sata_hba_inst,
14238 "mis-aligned buffer: addr=0x%p, cnt=%lu",
14239 (void *)bp->b_un.b_addr, bp->b_bcount);
14240
14241 if (bp->b_flags & (B_PAGEIO|B_PHYS))
14242 /*
14243 * CPU will need to access data in the buffer
14244 * (for copying) so map it.
14245 */
14246 bp_mapin(bp);
14247
14248 ASSERT(spx->txlt_tmp_buf == NULL);
14249
14250 /* Buffer may be padded by ddi_dma_mem_alloc()! */
14251 rval = ddi_dma_mem_alloc(
14252 spx->txlt_buf_dma_handle,
14253 bp->b_bcount,
14254 &sata_acc_attr,
14255 DDI_DMA_STREAMING,
14256 ddicallback, NULL,
14257 &spx->txlt_tmp_buf,
14258 &bufsz,
14259 &spx->txlt_tmp_buf_handle);
14260
14261 if (rval != DDI_SUCCESS) {
14262 /* DMA mapping failed */
14263 (void) ddi_dma_free_handle(
14264 &spx->txlt_buf_dma_handle);
14265 spx->txlt_buf_dma_handle = NULL;
14266 #ifdef SATA_DEBUG
14267 mbuffail_count++;
14268 #endif
14269 SATADBG1(SATA_DBG_DMA_SETUP,
14270 spx->txlt_sata_hba_inst,
14271 "sata_dma_buf_setup: "
14272 "buf dma mem alloc failed %x\n", rval);
14273 return (rval);
14274 }
14275 ASSERT(IS_P2ALIGNED(spx->txlt_tmp_buf,
14276 cur_dma_attr->dma_attr_align));
14277
14278 #ifdef SATA_DEBUG
14279 mbuf_count++;
14280
14281 if (bp->b_bcount != bufsz)
14282 /*
14283 * This will require special handling, because
14284 * DMA cookies will be based on the temporary
14285 * buffer size, not the original buffer
14286 * b_bcount, so the residue may have to
14287 * be counted differently.
14288 */
14289 SATADBG2(SATA_DBG_DMA_SETUP,
14290 spx->txlt_sata_hba_inst,
14291 "sata_dma_buf_setup: bp size %x != "
14292 "bufsz %x\n", bp->b_bcount, bufsz);
14293 #endif
14294 if (dma_flags & DDI_DMA_WRITE) {
14295 /*
14296 * Write operation - copy data into
14297 * an aligned temporary buffer. Buffer will be
14298 * synced for device by ddi_dma_addr_bind_handle
14299 */
14300 bcopy(bp->b_un.b_addr, spx->txlt_tmp_buf,
14301 bp->b_bcount);
14302 }
14303
14304 rval = ddi_dma_addr_bind_handle(
14305 spx->txlt_buf_dma_handle,
14306 NULL,
14307 spx->txlt_tmp_buf,
14308 bufsz, dma_flags, ddicallback, 0,
14309 &spx->txlt_dma_cookie,
14310 &spx->txlt_curwin_num_dma_cookies);
14311 }
14312
14313 switch (rval) {
14314 case DDI_DMA_PARTIAL_MAP:
14315 SATADBG1(SATA_DBG_DMA_SETUP, spx->txlt_sata_hba_inst,
14316 "sata_dma_buf_setup: DMA Partial Map\n", NULL);
14317 /*
14318 * Partial DMA mapping.
14319 * Retrieve number of DMA windows for this request.
14320 */
14321 if (ddi_dma_numwin(spx->txlt_buf_dma_handle,
14322 &spx->txlt_num_dma_win) != DDI_SUCCESS) {
14323 if (spx->txlt_tmp_buf != NULL) {
14324 ddi_dma_mem_free(
14325 &spx->txlt_tmp_buf_handle);
14326 spx->txlt_tmp_buf = NULL;
14327 }
14328 (void) ddi_dma_unbind_handle(
14329 spx->txlt_buf_dma_handle);
14330 (void) ddi_dma_free_handle(
14331 &spx->txlt_buf_dma_handle);
14332 spx->txlt_buf_dma_handle = NULL;
14333 SATA_LOG_D((spx->txlt_sata_hba_inst, CE_WARN,
14334 "sata_dma_buf_setup: numwin failed\n"));
14335 return (DDI_FAILURE);
14336 }
14337 SATADBG2(SATA_DBG_DMA_SETUP,
14338 spx->txlt_sata_hba_inst,
14339 "sata_dma_buf_setup: windows: %d, cookies: %d\n",
14340 spx->txlt_num_dma_win,
14341 spx->txlt_curwin_num_dma_cookies);
14342 spx->txlt_cur_dma_win = 0;
14343 break;
14344
14345 case DDI_DMA_MAPPED:
14346 /* DMA fully mapped */
14347 spx->txlt_num_dma_win = 1;
14348 spx->txlt_cur_dma_win = 0;
14349 SATADBG1(SATA_DBG_DMA_SETUP,
14350 spx->txlt_sata_hba_inst,
14351 "sata_dma_buf_setup: windows: 1 "
14352 "cookies: %d\n", spx->txlt_curwin_num_dma_cookies);
14353 break;
14354
14355 default:
14356 /* DMA mapping failed */
14357 if (spx->txlt_tmp_buf != NULL) {
14358 ddi_dma_mem_free(
14359 &spx->txlt_tmp_buf_handle);
14360 spx->txlt_tmp_buf = NULL;
14361 }
14362 (void) ddi_dma_free_handle(&spx->txlt_buf_dma_handle);
14363 spx->txlt_buf_dma_handle = NULL;
14364 SATA_LOG_D((spx->txlt_sata_hba_inst, CE_WARN,
14365 "sata_dma_buf_setup: buf dma handle binding "
14366 "failed %x\n", rval));
14367 return (rval);
14368 }
14369 spx->txlt_curwin_processed_dma_cookies = 0;
14370 spx->txlt_dma_cookie_list = NULL;
14371 } else {
14372 /*
14373 * DMA setup is reused. Check if we need to process more
14374 * cookies in current window, or to get next window, if any.
14375 */
14376
14377 ASSERT(spx->txlt_curwin_processed_dma_cookies <=
14378 spx->txlt_curwin_num_dma_cookies);
14379
14380 if (spx->txlt_curwin_processed_dma_cookies ==
14381 spx->txlt_curwin_num_dma_cookies) {
14382 /*
14383 * All cookies from current DMA window were processed.
14384 * Get next DMA window.
14385 */
14386 spx->txlt_cur_dma_win++;
14387 if (spx->txlt_cur_dma_win < spx->txlt_num_dma_win) {
14388 (void) ddi_dma_getwin(spx->txlt_buf_dma_handle,
14389 spx->txlt_cur_dma_win, &offset, &size,
14390 &spx->txlt_dma_cookie,
14391 &spx->txlt_curwin_num_dma_cookies);
14392 spx->txlt_curwin_processed_dma_cookies = 0;
14393 } else {
14394 /* No more windows! End of request! */
14395 /* What to do? - panic for now */
14396 ASSERT(spx->txlt_cur_dma_win >=
14397 spx->txlt_num_dma_win);
14398
14399 spx->txlt_curwin_num_dma_cookies = 0;
14400 spx->txlt_curwin_processed_dma_cookies = 0;
14401 spx->txlt_sata_pkt->
14402 satapkt_cmd.satacmd_num_dma_cookies = 0;
14403 return (DDI_SUCCESS);
14404 }
14405 }
14406 }
14407 /* There better be at least one DMA cookie outstanding */
14408 ASSERT((spx->txlt_curwin_num_dma_cookies -
14409 spx->txlt_curwin_processed_dma_cookies) > 0);
14410
14411 if (spx->txlt_dma_cookie_list == &spx->txlt_dma_cookie) {
14412 /* The default cookie slot was used in previous run */
14413 ASSERT(spx->txlt_curwin_processed_dma_cookies == 0);
14414 spx->txlt_dma_cookie_list = NULL;
14415 spx->txlt_dma_cookie_list_len = 0;
14416 }
14417 if (spx->txlt_curwin_processed_dma_cookies == 0) {
14418 /*
14419 * Processing a new DMA window - set-up dma cookies list.
14420 * We may reuse previously allocated cookie array if it is
14421 * possible.
14422 */
14423 if (spx->txlt_dma_cookie_list != NULL &&
14424 spx->txlt_dma_cookie_list_len <
14425 spx->txlt_curwin_num_dma_cookies) {
14426 /*
14427 * New DMA window contains more cookies than
14428 * the previous one. We need larger cookie list - free
14429 * the old one.
14430 */
14431 (void) kmem_free(spx->txlt_dma_cookie_list,
14432 spx->txlt_dma_cookie_list_len *
14433 sizeof (ddi_dma_cookie_t));
14434 spx->txlt_dma_cookie_list = NULL;
14435 spx->txlt_dma_cookie_list_len = 0;
14436 }
14437 if (spx->txlt_dma_cookie_list == NULL) {
14438 /*
14439 * Calculate lesser of number of cookies in this
14440 * DMA window and number of s/g entries.
14441 */
14442 max_sg_len = cur_dma_attr->dma_attr_sgllen;
14443 req_len = MIN(max_sg_len,
14444 spx->txlt_curwin_num_dma_cookies);
14445
14446 /* Allocate new dma cookie array if necessary */
14447 if (req_len == 1) {
14448 /* Only one cookie - no need for a list */
14449 spx->txlt_dma_cookie_list =
14450 &spx->txlt_dma_cookie;
14451 spx->txlt_dma_cookie_list_len = 1;
14452 } else {
14453 /*
14454 * More than one cookie - try to allocate space.
14455 */
14456 spx->txlt_dma_cookie_list = kmem_zalloc(
14457 sizeof (ddi_dma_cookie_t) * req_len,
14458 callback == NULL_FUNC ? KM_NOSLEEP :
14459 KM_SLEEP);
14460 if (spx->txlt_dma_cookie_list == NULL) {
14461 SATADBG1(SATA_DBG_DMA_SETUP,
14462 spx->txlt_sata_hba_inst,
14463 "sata_dma_buf_setup: cookie list "
14464 "allocation failed\n", NULL);
14465 /*
14466 * We could not allocate space for
14467 * neccessary number of dma cookies in
14468 * this window, so we fail this request.
14469 * Next invocation would try again to
14470 * allocate space for cookie list.
14471 * Note:Packet residue was not modified.
14472 */
14473 return (DDI_DMA_NORESOURCES);
14474 } else {
14475 spx->txlt_dma_cookie_list_len = req_len;
14476 }
14477 }
14478 }
14479 /*
14480 * Fetch DMA cookies into cookie list in sata_pkt_txlate.
14481 * First cookie was already fetched.
14482 */
14483 *(&spx->txlt_dma_cookie_list[0]) = spx->txlt_dma_cookie;
14484 cur_txfer_len =
14485 (uint64_t)spx->txlt_dma_cookie_list[0].dmac_size;
14486 spx->txlt_sata_pkt->satapkt_cmd.satacmd_num_dma_cookies = 1;
14487 spx->txlt_curwin_processed_dma_cookies++;
14488 for (i = 1; (i < spx->txlt_dma_cookie_list_len) &&
14489 (i < spx->txlt_curwin_num_dma_cookies); i++) {
14490 ddi_dma_nextcookie(spx->txlt_buf_dma_handle,
14491 &spx->txlt_dma_cookie_list[i]);
14492 cur_txfer_len +=
14493 (uint64_t)spx->txlt_dma_cookie_list[i].dmac_size;
14494 spx->txlt_curwin_processed_dma_cookies++;
14495 spx->txlt_sata_pkt->
14496 satapkt_cmd.satacmd_num_dma_cookies += 1;
14497 }
14498 } else {
14499 SATADBG2(SATA_DBG_DMA_SETUP, spx->txlt_sata_hba_inst,
14500 "sata_dma_buf_setup: sliding within DMA window, "
14501 "cur cookie %d, total cookies %d\n",
14502 spx->txlt_curwin_processed_dma_cookies,
14503 spx->txlt_curwin_num_dma_cookies);
14504
14505 /*
14506 * Not all cookies from the current dma window were used because
14507 * of s/g limitation.
14508 * There is no need to re-size the list - it was set at
14509 * optimal size, or only default entry is used (s/g = 1).
14510 */
14511 if (spx->txlt_dma_cookie_list == NULL) {
14512 spx->txlt_dma_cookie_list = &spx->txlt_dma_cookie;
14513 spx->txlt_dma_cookie_list_len = 1;
14514 }
14515 /*
14516 * Since we are processing remaining cookies in a DMA window,
14517 * there may be less of them than the number of entries in the
14518 * current dma cookie list.
14519 */
14520 req_len = MIN(spx->txlt_dma_cookie_list_len,
14521 (spx->txlt_curwin_num_dma_cookies -
14522 spx->txlt_curwin_processed_dma_cookies));
14523
14524 /* Fetch the next batch of cookies */
14525 for (i = 0, cur_txfer_len = 0; i < req_len; i++) {
14526 ddi_dma_nextcookie(spx->txlt_buf_dma_handle,
14527 &spx->txlt_dma_cookie_list[i]);
14528 cur_txfer_len +=
14529 (uint64_t)spx->txlt_dma_cookie_list[i].dmac_size;
14530 spx->txlt_sata_pkt->
14531 satapkt_cmd.satacmd_num_dma_cookies++;
14532 spx->txlt_curwin_processed_dma_cookies++;
14533 }
14534 }
14535
14536 ASSERT(spx->txlt_sata_pkt->satapkt_cmd.satacmd_num_dma_cookies > 0);
14537
14538 /* Point sata_cmd to the cookie list */
14539 spx->txlt_sata_pkt->satapkt_cmd.satacmd_dma_cookie_list =
14540 &spx->txlt_dma_cookie_list[0];
14541
14542 /* Remember number of DMA cookies passed in sata packet */
14543 spx->txlt_num_dma_cookies =
14544 spx->txlt_sata_pkt->satapkt_cmd.satacmd_num_dma_cookies;
14545
14546 ASSERT(cur_txfer_len != 0);
14547 if (cur_txfer_len <= bp->b_bcount)
14548 spx->txlt_total_residue -= cur_txfer_len;
14549 else {
14550 /*
14551 * Temporary DMA buffer has been padded by
14552 * ddi_dma_mem_alloc()!
14553 * This requires special handling, because DMA cookies are
14554 * based on the temporary buffer size, not the b_bcount,
14555 * and we have extra bytes to transfer - but the packet
14556 * residue has to stay correct because we will copy only
14557 * the requested number of bytes.
14558 */
14559 spx->txlt_total_residue -= bp->b_bcount;
14560 }
14561
14562 return (DDI_SUCCESS);
14563 }
14564
14565 /*
14566 * Common routine for releasing DMA resources
14567 */
14568 static void
sata_common_free_dma_rsrcs(sata_pkt_txlate_t * spx)14569 sata_common_free_dma_rsrcs(sata_pkt_txlate_t *spx)
14570 {
14571 if (spx->txlt_buf_dma_handle != NULL) {
14572 if (spx->txlt_tmp_buf != NULL) {
14573 /*
14574 * Intermediate DMA buffer was allocated.
14575 * Free allocated buffer and associated access handle.
14576 */
14577 ddi_dma_mem_free(&spx->txlt_tmp_buf_handle);
14578 spx->txlt_tmp_buf = NULL;
14579 }
14580 /*
14581 * Free DMA resources - cookies and handles
14582 */
14583 /* ASSERT(spx->txlt_dma_cookie_list != NULL); */
14584 if (spx->txlt_dma_cookie_list != NULL) {
14585 if (spx->txlt_dma_cookie_list !=
14586 &spx->txlt_dma_cookie) {
14587 (void) kmem_free(spx->txlt_dma_cookie_list,
14588 spx->txlt_dma_cookie_list_len *
14589 sizeof (ddi_dma_cookie_t));
14590 spx->txlt_dma_cookie_list = NULL;
14591 }
14592 }
14593 (void) ddi_dma_unbind_handle(spx->txlt_buf_dma_handle);
14594 (void) ddi_dma_free_handle(&spx->txlt_buf_dma_handle);
14595 spx->txlt_buf_dma_handle = NULL;
14596 }
14597 }
14598
14599 /*
14600 * Free DMA resources
14601 * Used by the HBA driver to release DMA resources that it does not use.
14602 *
14603 * Returns Void
14604 */
14605 void
sata_free_dma_resources(sata_pkt_t * sata_pkt)14606 sata_free_dma_resources(sata_pkt_t *sata_pkt)
14607 {
14608 sata_pkt_txlate_t *spx;
14609
14610 if (sata_pkt == NULL)
14611 return;
14612
14613 spx = (sata_pkt_txlate_t *)sata_pkt->satapkt_framework_private;
14614
14615 sata_common_free_dma_rsrcs(spx);
14616 }
14617
14618 /*
14619 * Fetch Device Identify data.
14620 * Send DEVICE IDENTIFY or IDENTIFY PACKET DEVICE (depending on a device type)
14621 * command to a device and get the device identify data.
14622 * The device_info structure has to be set to device type (for selecting proper
14623 * device identify command).
14624 *
14625 * Returns:
14626 * SATA_SUCCESS if cmd succeeded
14627 * SATA_RETRY if cmd was rejected and could be retried,
14628 * SATA_FAILURE if cmd failed and should not be retried (port error)
14629 *
14630 * Cannot be called in an interrupt context.
14631 */
14632
14633 static int
sata_fetch_device_identify_data(sata_hba_inst_t * sata_hba_inst,sata_drive_info_t * sdinfo)14634 sata_fetch_device_identify_data(sata_hba_inst_t *sata_hba_inst,
14635 sata_drive_info_t *sdinfo)
14636 {
14637 struct buf *bp;
14638 sata_pkt_t *spkt;
14639 sata_cmd_t *scmd;
14640 sata_pkt_txlate_t *spx;
14641 int rval;
14642 dev_info_t *dip = SATA_DIP(sata_hba_inst);
14643
14644 spx = kmem_zalloc(sizeof (sata_pkt_txlate_t), KM_SLEEP);
14645 spx->txlt_sata_hba_inst = sata_hba_inst;
14646 spx->txlt_scsi_pkt = NULL; /* No scsi pkt involved */
14647 spkt = sata_pkt_alloc(spx, SLEEP_FUNC);
14648 if (spkt == NULL) {
14649 kmem_free(spx, sizeof (sata_pkt_txlate_t));
14650 return (SATA_RETRY); /* may retry later */
14651 }
14652 /* address is needed now */
14653 spkt->satapkt_device.satadev_addr = sdinfo->satadrv_addr;
14654
14655 /*
14656 * Allocate buffer for Identify Data return data
14657 */
14658 bp = sata_alloc_local_buffer(spx, sizeof (sata_id_t));
14659 if (bp == NULL) {
14660 sata_pkt_free(spx);
14661 kmem_free(spx, sizeof (sata_pkt_txlate_t));
14662 SATA_LOG_D((sata_hba_inst, CE_WARN,
14663 "sata_fetch_device_identify_data: "
14664 "cannot allocate buffer for ID"));
14665 return (SATA_RETRY); /* may retry later */
14666 }
14667
14668 /* Fill sata_pkt */
14669 sdinfo->satadrv_state = SATA_STATE_PROBING;
14670 spkt->satapkt_device.satadev_addr = sdinfo->satadrv_addr;
14671 spkt->satapkt_op_mode = SATA_OPMODE_SYNCH | SATA_OPMODE_INTERRUPTS;
14672 /* Synchronous mode, no callback */
14673 spkt->satapkt_comp = NULL;
14674 /* Timeout 30s */
14675 spkt->satapkt_time = sata_default_pkt_time;
14676
14677 scmd = &spkt->satapkt_cmd;
14678 scmd->satacmd_bp = bp;
14679 scmd->satacmd_flags.sata_data_direction = SATA_DIR_READ;
14680 scmd->satacmd_flags.sata_ignore_dev_reset = B_TRUE;
14681
14682 /* Build Identify Device cmd in the sata_pkt */
14683 scmd->satacmd_addr_type = 0; /* N/A */
14684 scmd->satacmd_sec_count_lsb = 0; /* N/A */
14685 scmd->satacmd_lba_low_lsb = 0; /* N/A */
14686 scmd->satacmd_lba_mid_lsb = 0; /* N/A */
14687 scmd->satacmd_lba_high_lsb = 0; /* N/A */
14688 scmd->satacmd_features_reg = 0; /* N/A */
14689 scmd->satacmd_device_reg = 0; /* Always device 0 */
14690 if (sdinfo->satadrv_type & SATA_DTYPE_ATAPI) {
14691 /* Identify Packet Device cmd */
14692 scmd->satacmd_cmd_reg = SATAC_ID_PACKET_DEVICE;
14693 } else {
14694 /* Identify Device cmd - mandatory for all other devices */
14695 scmd->satacmd_cmd_reg = SATAC_ID_DEVICE;
14696 }
14697
14698 /* Send pkt to SATA HBA driver */
14699 rval = (*SATA_START_FUNC(sata_hba_inst))(SATA_DIP(sata_hba_inst), spkt);
14700
14701 #ifdef SATA_INJECT_FAULTS
14702 sata_inject_pkt_fault(spkt, &rval, sata_fault_type);
14703 #endif
14704
14705 if (rval == SATA_TRAN_ACCEPTED &&
14706 spkt->satapkt_reason == SATA_PKT_COMPLETED) {
14707 if (spx->txlt_buf_dma_handle != NULL) {
14708 rval = ddi_dma_sync(spx->txlt_buf_dma_handle, 0, 0,
14709 DDI_DMA_SYNC_FORKERNEL);
14710 ASSERT(rval == DDI_SUCCESS);
14711 if (sata_check_for_dma_error(dip, spx)) {
14712 ddi_fm_service_impact(dip,
14713 DDI_SERVICE_UNAFFECTED);
14714 rval = SATA_RETRY;
14715 goto fail;
14716 }
14717
14718 }
14719 if ((((sata_id_t *)(bp->b_un.b_addr))->ai_config &
14720 SATA_INCOMPLETE_DATA) == SATA_INCOMPLETE_DATA) {
14721 SATA_LOG_D((sata_hba_inst, CE_WARN,
14722 "SATA disk device at port %d - "
14723 "partial Identify Data",
14724 sdinfo->satadrv_addr.cport));
14725 rval = SATA_RETRY; /* may retry later */
14726 goto fail;
14727 }
14728 /* Update sata_drive_info */
14729 bcopy(bp->b_un.b_addr, &sdinfo->satadrv_id,
14730 sizeof (sata_id_t));
14731
14732 sdinfo->satadrv_features_support = 0;
14733 if (sdinfo->satadrv_type == SATA_DTYPE_ATADISK) {
14734 /*
14735 * Retrieve capacity (disks only) and addressing mode
14736 */
14737 sdinfo->satadrv_capacity = sata_check_capacity(sdinfo);
14738 } else {
14739 /*
14740 * For ATAPI devices one would have to issue
14741 * Get Capacity cmd for media capacity. Not here.
14742 */
14743 sdinfo->satadrv_capacity = 0;
14744 /*
14745 * Check what cdb length is supported
14746 */
14747 if ((sdinfo->satadrv_id.ai_config &
14748 SATA_ATAPI_ID_PKT_SZ) == SATA_ATAPI_ID_PKT_16B)
14749 sdinfo->satadrv_atapi_cdb_len = 16;
14750 else
14751 sdinfo->satadrv_atapi_cdb_len = 12;
14752 }
14753 /* Setup supported features flags */
14754 if (sdinfo->satadrv_id.ai_cap & SATA_DMA_SUPPORT)
14755 sdinfo->satadrv_features_support |= SATA_DEV_F_DMA;
14756
14757 /* Check for SATA GEN and NCQ support */
14758 if (sdinfo->satadrv_id.ai_satacap != 0 &&
14759 sdinfo->satadrv_id.ai_satacap != 0xffff) {
14760 /* SATA compliance */
14761 if (sdinfo->satadrv_id.ai_satacap & SATA_NCQ)
14762 sdinfo->satadrv_features_support |=
14763 SATA_DEV_F_NCQ;
14764 if (sdinfo->satadrv_id.ai_satacap &
14765 (SATA_1_SPEED | SATA_2_SPEED | SATA_3_SPEED)) {
14766 if (sdinfo->satadrv_id.ai_satacap &
14767 SATA_3_SPEED)
14768 sdinfo->satadrv_features_support |=
14769 SATA_DEV_F_SATA3;
14770 if (sdinfo->satadrv_id.ai_satacap &
14771 SATA_2_SPEED)
14772 sdinfo->satadrv_features_support |=
14773 SATA_DEV_F_SATA2;
14774 if (sdinfo->satadrv_id.ai_satacap &
14775 SATA_1_SPEED)
14776 sdinfo->satadrv_features_support |=
14777 SATA_DEV_F_SATA1;
14778 } else {
14779 sdinfo->satadrv_features_support |=
14780 SATA_DEV_F_SATA1;
14781 }
14782 }
14783 if ((sdinfo->satadrv_id.ai_cmdset83 & SATA_RW_DMA_QUEUED_CMD) &&
14784 (sdinfo->satadrv_id.ai_features86 & SATA_RW_DMA_QUEUED_CMD))
14785 sdinfo->satadrv_features_support |= SATA_DEV_F_TCQ;
14786
14787 sdinfo->satadrv_queue_depth = sdinfo->satadrv_id.ai_qdepth;
14788 if ((sdinfo->satadrv_features_support & SATA_DEV_F_NCQ) ||
14789 (sdinfo->satadrv_features_support & SATA_DEV_F_TCQ)) {
14790 ++sdinfo->satadrv_queue_depth;
14791 /* Adjust according to controller capabilities */
14792 sdinfo->satadrv_max_queue_depth = MIN(
14793 sdinfo->satadrv_queue_depth,
14794 SATA_QDEPTH(sata_hba_inst));
14795 /* Adjust according to global queue depth limit */
14796 sdinfo->satadrv_max_queue_depth = MIN(
14797 sdinfo->satadrv_max_queue_depth,
14798 sata_current_max_qdepth);
14799 if (sdinfo->satadrv_max_queue_depth == 0)
14800 sdinfo->satadrv_max_queue_depth = 1;
14801 } else
14802 sdinfo->satadrv_max_queue_depth = 1;
14803
14804 rval = SATA_SUCCESS;
14805 } else {
14806 /*
14807 * Woops, no Identify Data.
14808 */
14809 if (rval == SATA_TRAN_BUSY || rval == SATA_TRAN_QUEUE_FULL) {
14810 rval = SATA_RETRY; /* may retry later */
14811 } else if (rval == SATA_TRAN_ACCEPTED) {
14812 if (spkt->satapkt_reason == SATA_PKT_DEV_ERROR ||
14813 spkt->satapkt_reason == SATA_PKT_ABORTED ||
14814 spkt->satapkt_reason == SATA_PKT_TIMEOUT ||
14815 spkt->satapkt_reason == SATA_PKT_RESET)
14816 rval = SATA_RETRY; /* may retry later */
14817 else
14818 rval = SATA_FAILURE;
14819 } else {
14820 rval = SATA_FAILURE;
14821 }
14822 }
14823 fail:
14824 /* Free allocated resources */
14825 sata_free_local_buffer(spx);
14826 sata_pkt_free(spx);
14827 kmem_free(spx, sizeof (sata_pkt_txlate_t));
14828
14829 return (rval);
14830 }
14831
14832
14833 /*
14834 * Some devices may not come-up with default DMA mode (UDMA or MWDMA).
14835 * UDMA mode is checked first, followed by MWDMA mode.
14836 * set correctly, so this function is setting it to the highest supported level.
14837 * Older SATA spec required that the device supports at least DMA 4 mode and
14838 * UDMA mode is selected. It is not mentioned in SerialATA 2.6, so this
14839 * restriction has been removed.
14840 *
14841 * Returns SATA_SUCCESS if proper DMA mode is selected or no DMA is supported.
14842 * Returns SATA_FAILURE if proper DMA mode could not be selected.
14843 *
14844 * NOTE: This function should be called only if DMA mode is supported.
14845 */
14846 static int
sata_set_dma_mode(sata_hba_inst_t * sata_hba_inst,sata_drive_info_t * sdinfo)14847 sata_set_dma_mode(sata_hba_inst_t *sata_hba_inst, sata_drive_info_t *sdinfo)
14848 {
14849 sata_pkt_t *spkt;
14850 sata_cmd_t *scmd;
14851 sata_pkt_txlate_t *spx;
14852 int i, mode;
14853 uint8_t subcmd;
14854 int rval = SATA_SUCCESS;
14855
14856 ASSERT(sdinfo != NULL);
14857 ASSERT(sata_hba_inst != NULL);
14858
14859 if ((sdinfo->satadrv_id.ai_validinfo & SATA_VALIDINFO_88) != 0 &&
14860 (sdinfo->satadrv_id.ai_ultradma & SATA_UDMA_SUP_MASK) != 0) {
14861 /* Find highest Ultra DMA mode supported */
14862 for (mode = 6; mode >= 0; --mode) {
14863 if (sdinfo->satadrv_id.ai_ultradma & (1 << mode))
14864 break;
14865 }
14866 #if 0
14867 /* Left for historical reasons */
14868 /*
14869 * Some initial version of SATA spec indicated that at least
14870 * UDMA mode 4 has to be supported. It is not mentioned in
14871 * SerialATA 2.6, so this restriction is removed.
14872 */
14873 if (mode < 4)
14874 return (SATA_FAILURE);
14875 #endif
14876
14877 /*
14878 * For disk, we're still going to set DMA mode whatever is
14879 * selected by default
14880 *
14881 * We saw an old maxtor sata drive will select Ultra DMA and
14882 * Multi-Word DMA simultaneouly by default, which is going
14883 * to cause DMA command timed out, so we need to select DMA
14884 * mode even when it's already done by default
14885 */
14886 if (sdinfo->satadrv_type != SATA_DTYPE_ATADISK) {
14887
14888 /* Find UDMA mode currently selected */
14889 for (i = 6; i >= 0; --i) {
14890 if (sdinfo->satadrv_id.ai_ultradma &
14891 (1 << (i + 8)))
14892 break;
14893 }
14894 if (i >= mode)
14895 /* Nothing to do */
14896 return (SATA_SUCCESS);
14897 }
14898
14899 subcmd = SATAC_TRANSFER_MODE_ULTRA_DMA;
14900
14901 } else if ((sdinfo->satadrv_id.ai_dworddma & SATA_MDMA_SUP_MASK) != 0) {
14902 /* Find highest MultiWord DMA mode supported */
14903 for (mode = 2; mode >= 0; --mode) {
14904 if (sdinfo->satadrv_id.ai_dworddma & (1 << mode))
14905 break;
14906 }
14907
14908 /*
14909 * For disk, We're still going to set DMA mode whatever is
14910 * selected by default
14911 *
14912 * We saw an old maxtor sata drive will select Ultra DMA and
14913 * Multi-Word DMA simultaneouly by default, which is going
14914 * to cause DMA command timed out, so we need to select DMA
14915 * mode even when it's already done by default
14916 */
14917 if (sdinfo->satadrv_type != SATA_DTYPE_ATADISK) {
14918
14919 /* Find highest MultiWord DMA mode selected */
14920 for (i = 2; i >= 0; --i) {
14921 if (sdinfo->satadrv_id.ai_dworddma &
14922 (1 << (i + 8)))
14923 break;
14924 }
14925 if (i >= mode)
14926 /* Nothing to do */
14927 return (SATA_SUCCESS);
14928 }
14929
14930 subcmd = SATAC_TRANSFER_MODE_MULTI_WORD_DMA;
14931 } else
14932 return (SATA_SUCCESS);
14933
14934 /*
14935 * Set DMA mode via SET FEATURES COMMAND.
14936 * Prepare packet for SET FEATURES COMMAND.
14937 */
14938 spx = kmem_zalloc(sizeof (sata_pkt_txlate_t), KM_SLEEP);
14939 spx->txlt_sata_hba_inst = sata_hba_inst;
14940 spx->txlt_scsi_pkt = NULL; /* No scsi pkt involved */
14941 spkt = sata_pkt_alloc(spx, SLEEP_FUNC);
14942 if (spkt == NULL) {
14943 SATA_LOG_D((sata_hba_inst, CE_WARN,
14944 "sata_set_dma_mode: could not set DMA mode %d", mode));
14945 rval = SATA_FAILURE;
14946 goto done;
14947 }
14948 /* Fill sata_pkt */
14949 spkt->satapkt_device.satadev_addr = sdinfo->satadrv_addr;
14950 /* Timeout 30s */
14951 spkt->satapkt_time = sata_default_pkt_time;
14952 /* Synchronous mode, no callback, interrupts */
14953 spkt->satapkt_op_mode = SATA_OPMODE_SYNCH | SATA_OPMODE_INTERRUPTS;
14954 spkt->satapkt_comp = NULL;
14955 scmd = &spkt->satapkt_cmd;
14956 scmd->satacmd_flags.sata_data_direction = SATA_DIR_NODATA_XFER;
14957 scmd->satacmd_flags.sata_ignore_dev_reset = B_TRUE;
14958 scmd->satacmd_addr_type = 0;
14959 scmd->satacmd_device_reg = 0;
14960 scmd->satacmd_status_reg = 0;
14961 scmd->satacmd_error_reg = 0;
14962 scmd->satacmd_cmd_reg = SATAC_SET_FEATURES;
14963 scmd->satacmd_features_reg = SATAC_SF_TRANSFER_MODE;
14964 scmd->satacmd_sec_count_lsb = subcmd | mode;
14965
14966 /* Transfer command to HBA */
14967 if ((*SATA_START_FUNC(sata_hba_inst))(SATA_DIP(sata_hba_inst),
14968 spkt) != SATA_TRAN_ACCEPTED ||
14969 spkt->satapkt_reason != SATA_PKT_COMPLETED) {
14970 /* Pkt execution failed */
14971 rval = SATA_FAILURE;
14972 }
14973 done:
14974
14975 /* Free allocated resources */
14976 if (spkt != NULL)
14977 sata_pkt_free(spx);
14978 (void) kmem_free(spx, sizeof (sata_pkt_txlate_t));
14979
14980 return (rval);
14981 }
14982
14983
14984 /*
14985 * Set device caching mode.
14986 * One of the following operations should be specified:
14987 * SATAC_SF_ENABLE_READ_AHEAD
14988 * SATAC_SF_DISABLE_READ_AHEAD
14989 * SATAC_SF_ENABLE_WRITE_CACHE
14990 * SATAC_SF_DISABLE_WRITE_CACHE
14991 *
14992 * If operation fails, system log messgage is emitted.
14993 * Returns SATA_SUCCESS when the operation succeeds, SATA_RETRY if
14994 * command was sent but did not succeed, and SATA_FAILURE otherwise.
14995 */
14996
14997 static int
sata_set_cache_mode(sata_hba_inst_t * sata_hba_inst,sata_drive_info_t * sdinfo,int cache_op)14998 sata_set_cache_mode(sata_hba_inst_t *sata_hba_inst, sata_drive_info_t *sdinfo,
14999 int cache_op)
15000 {
15001 sata_pkt_t *spkt;
15002 sata_cmd_t *scmd;
15003 sata_pkt_txlate_t *spx;
15004 int rval = SATA_SUCCESS;
15005 int hba_rval;
15006 char *infop = NULL;
15007
15008 ASSERT(sdinfo != NULL);
15009 ASSERT(sata_hba_inst != NULL);
15010 ASSERT(cache_op == SATAC_SF_ENABLE_READ_AHEAD ||
15011 cache_op == SATAC_SF_DISABLE_READ_AHEAD ||
15012 cache_op == SATAC_SF_ENABLE_WRITE_CACHE ||
15013 cache_op == SATAC_SF_DISABLE_WRITE_CACHE);
15014
15015
15016 /* Prepare packet for SET FEATURES COMMAND */
15017 spx = kmem_zalloc(sizeof (sata_pkt_txlate_t), KM_SLEEP);
15018 spx->txlt_sata_hba_inst = sata_hba_inst;
15019 spx->txlt_scsi_pkt = NULL; /* No scsi pkt involved */
15020 spkt = sata_pkt_alloc(spx, SLEEP_FUNC);
15021 if (spkt == NULL) {
15022 rval = SATA_FAILURE;
15023 goto failure;
15024 }
15025 /* Fill sata_pkt */
15026 spkt->satapkt_device.satadev_addr = sdinfo->satadrv_addr;
15027 /* Timeout 30s */
15028 spkt->satapkt_time = sata_default_pkt_time;
15029 /* Synchronous mode, no callback, interrupts */
15030 spkt->satapkt_op_mode =
15031 SATA_OPMODE_SYNCH | SATA_OPMODE_INTERRUPTS;
15032 spkt->satapkt_comp = NULL;
15033 scmd = &spkt->satapkt_cmd;
15034 scmd->satacmd_flags.sata_data_direction = SATA_DIR_NODATA_XFER;
15035 scmd->satacmd_flags.sata_ignore_dev_reset = B_TRUE;
15036 scmd->satacmd_addr_type = 0;
15037 scmd->satacmd_device_reg = 0;
15038 scmd->satacmd_status_reg = 0;
15039 scmd->satacmd_error_reg = 0;
15040 scmd->satacmd_cmd_reg = SATAC_SET_FEATURES;
15041 scmd->satacmd_features_reg = cache_op;
15042
15043 /* Transfer command to HBA */
15044 hba_rval = (*SATA_START_FUNC(sata_hba_inst))(
15045 SATA_DIP(sata_hba_inst), spkt);
15046
15047 #ifdef SATA_INJECT_FAULTS
15048 sata_inject_pkt_fault(spkt, &rval, sata_fault_type);
15049 #endif
15050
15051 if ((hba_rval != SATA_TRAN_ACCEPTED) ||
15052 (spkt->satapkt_reason != SATA_PKT_COMPLETED)) {
15053 /* Pkt execution failed */
15054 switch (cache_op) {
15055 case SATAC_SF_ENABLE_READ_AHEAD:
15056 infop = "enabling read ahead failed";
15057 break;
15058 case SATAC_SF_DISABLE_READ_AHEAD:
15059 infop = "disabling read ahead failed";
15060 break;
15061 case SATAC_SF_ENABLE_WRITE_CACHE:
15062 infop = "enabling write cache failed";
15063 break;
15064 case SATAC_SF_DISABLE_WRITE_CACHE:
15065 infop = "disabling write cache failed";
15066 break;
15067 }
15068 SATA_LOG_D((sata_hba_inst, CE_WARN, "%s", infop));
15069 rval = SATA_RETRY;
15070 }
15071 failure:
15072 /* Free allocated resources */
15073 if (spkt != NULL)
15074 sata_pkt_free(spx);
15075 (void) kmem_free(spx, sizeof (sata_pkt_txlate_t));
15076 return (rval);
15077 }
15078
15079 /*
15080 * Set Removable Media Status Notification (enable/disable)
15081 * state == 0 , disable
15082 * state != 0 , enable
15083 *
15084 * If operation fails, system log messgage is emitted.
15085 * Returns SATA_SUCCESS when the operation succeeds, SATA_FAILURE otherwise.
15086 */
15087
15088 static int
sata_set_rmsn(sata_hba_inst_t * sata_hba_inst,sata_drive_info_t * sdinfo,int state)15089 sata_set_rmsn(sata_hba_inst_t *sata_hba_inst, sata_drive_info_t *sdinfo,
15090 int state)
15091 {
15092 sata_pkt_t *spkt;
15093 sata_cmd_t *scmd;
15094 sata_pkt_txlate_t *spx;
15095 int rval = SATA_SUCCESS;
15096 char *infop;
15097
15098 ASSERT(sdinfo != NULL);
15099 ASSERT(sata_hba_inst != NULL);
15100
15101 /* Prepare packet for SET FEATURES COMMAND */
15102 spx = kmem_zalloc(sizeof (sata_pkt_txlate_t), KM_SLEEP);
15103 spx->txlt_sata_hba_inst = sata_hba_inst;
15104 spx->txlt_scsi_pkt = NULL; /* No scsi pkt involved */
15105 spkt = sata_pkt_alloc(spx, SLEEP_FUNC);
15106 if (spkt == NULL) {
15107 rval = SATA_FAILURE;
15108 goto failure;
15109 }
15110 /* Fill sata_pkt */
15111 spkt->satapkt_device.satadev_addr = sdinfo->satadrv_addr;
15112 /* Timeout 30s */
15113 spkt->satapkt_time = sata_default_pkt_time;
15114 /* Synchronous mode, no callback, interrupts */
15115 spkt->satapkt_op_mode =
15116 SATA_OPMODE_SYNCH | SATA_OPMODE_INTERRUPTS;
15117 spkt->satapkt_comp = NULL;
15118 scmd = &spkt->satapkt_cmd;
15119 scmd->satacmd_flags.sata_data_direction = SATA_DIR_NODATA_XFER;
15120 scmd->satacmd_flags.sata_ignore_dev_reset = B_TRUE;
15121 scmd->satacmd_addr_type = 0;
15122 scmd->satacmd_device_reg = 0;
15123 scmd->satacmd_status_reg = 0;
15124 scmd->satacmd_error_reg = 0;
15125 scmd->satacmd_cmd_reg = SATAC_SET_FEATURES;
15126 if (state == 0)
15127 scmd->satacmd_features_reg = SATAC_SF_DISABLE_RMSN;
15128 else
15129 scmd->satacmd_features_reg = SATAC_SF_ENABLE_RMSN;
15130
15131 /* Transfer command to HBA */
15132 if (((*SATA_START_FUNC(sata_hba_inst))(
15133 SATA_DIP(sata_hba_inst), spkt) != SATA_TRAN_ACCEPTED) ||
15134 (spkt->satapkt_reason != SATA_PKT_COMPLETED)) {
15135 /* Pkt execution failed */
15136 if (state == 0)
15137 infop = "disabling Removable Media Status "
15138 "Notification failed";
15139 else
15140 infop = "enabling Removable Media Status "
15141 "Notification failed";
15142
15143 SATA_LOG_D((sata_hba_inst, CE_WARN, "%s", infop));
15144 rval = SATA_FAILURE;
15145 }
15146 failure:
15147 /* Free allocated resources */
15148 if (spkt != NULL)
15149 sata_pkt_free(spx);
15150 (void) kmem_free(spx, sizeof (sata_pkt_txlate_t));
15151 return (rval);
15152 }
15153
15154
15155 /*
15156 * Update state and copy port ss* values from passed sata_device structure.
15157 * sata_address is validated - if not valid, nothing is changed in sata_scsi
15158 * configuration struct.
15159 *
15160 * SATA_PSTATE_SHUTDOWN in port state is not reset to 0 by this function
15161 * regardless of the state in device argument.
15162 *
15163 * Port mutex should be held while calling this function.
15164 */
15165 static void
sata_update_port_info(sata_hba_inst_t * sata_hba_inst,sata_device_t * sata_device)15166 sata_update_port_info(sata_hba_inst_t *sata_hba_inst,
15167 sata_device_t *sata_device)
15168 {
15169 sata_cport_info_t *cportinfo;
15170
15171 if (sata_device->satadev_addr.qual == SATA_ADDR_CPORT ||
15172 sata_device->satadev_addr.qual == SATA_ADDR_DCPORT) {
15173 if (SATA_NUM_CPORTS(sata_hba_inst) <=
15174 sata_device->satadev_addr.cport)
15175 return;
15176
15177 cportinfo = SATA_CPORT_INFO(sata_hba_inst,
15178 sata_device->satadev_addr.cport);
15179
15180 ASSERT(mutex_owned(&cportinfo->cport_mutex));
15181 cportinfo->cport_scr = sata_device->satadev_scr;
15182
15183 /* Preserve SATA_PSTATE_SHUTDOWN flag */
15184 cportinfo->cport_state &= ~(SATA_PSTATE_PWRON |
15185 SATA_PSTATE_PWROFF | SATA_PSTATE_FAILED);
15186 cportinfo->cport_state |=
15187 sata_device->satadev_state & SATA_PSTATE_VALID;
15188 }
15189 }
15190
15191 void
sata_update_pmport_info(sata_hba_inst_t * sata_hba_inst,sata_device_t * sata_device)15192 sata_update_pmport_info(sata_hba_inst_t *sata_hba_inst,
15193 sata_device_t *sata_device)
15194 {
15195 sata_pmport_info_t *pmportinfo;
15196
15197 if ((sata_device->satadev_addr.qual != SATA_ADDR_PMPORT &&
15198 sata_device->satadev_addr.qual != SATA_ADDR_DPMPORT) ||
15199 SATA_NUM_PMPORTS(sata_hba_inst,
15200 sata_device->satadev_addr.cport) <
15201 sata_device->satadev_addr.pmport) {
15202 SATADBG1(SATA_DBG_PMULT, sata_hba_inst,
15203 "sata_update_port_info: error address %p.",
15204 &sata_device->satadev_addr);
15205 return;
15206 }
15207
15208 pmportinfo = SATA_PMPORT_INFO(sata_hba_inst,
15209 sata_device->satadev_addr.cport,
15210 sata_device->satadev_addr.pmport);
15211
15212 ASSERT(mutex_owned(&pmportinfo->pmport_mutex));
15213 pmportinfo->pmport_scr = sata_device->satadev_scr;
15214
15215 /* Preserve SATA_PSTATE_SHUTDOWN flag */
15216 pmportinfo->pmport_state &=
15217 ~(SATA_PSTATE_PWRON | SATA_PSTATE_PWROFF | SATA_PSTATE_FAILED);
15218 pmportinfo->pmport_state |=
15219 sata_device->satadev_state & SATA_PSTATE_VALID;
15220 }
15221
15222 /*
15223 * Extract SATA port specification from an IOCTL argument.
15224 *
15225 * This function return the port the user land send us as is, unless it
15226 * cannot retrieve port spec, then -1 is returned.
15227 *
15228 * Support port multiplier.
15229 */
15230 static int32_t
sata_get_port_num(sata_hba_inst_t * sata_hba_inst,struct devctl_iocdata * dcp)15231 sata_get_port_num(sata_hba_inst_t *sata_hba_inst, struct devctl_iocdata *dcp)
15232 {
15233 int32_t port;
15234
15235 /* Extract port number from nvpair in dca structure */
15236 if (nvlist_lookup_int32(ndi_dc_get_ap_data(dcp), "port", &port) != 0) {
15237 SATA_LOG_D((sata_hba_inst, CE_NOTE,
15238 "sata_get_port_num: invalid port spec 0x%x in ioctl",
15239 port));
15240 port = -1;
15241 }
15242
15243 return (port);
15244 }
15245
15246 /*
15247 * Get dev_info_t pointer to the device node pointed to by port argument.
15248 * NOTE: target argument is a value used in ioctls to identify
15249 * the AP - it is not a sata_address.
15250 * It is a combination of cport, pmport and address qualifier, encodded same
15251 * way as a scsi target number.
15252 * At this moment it carries only cport number.
15253 *
15254 * PMult hotplug is supported now.
15255 *
15256 * Returns dev_info_t pointer if target device was found, NULL otherwise.
15257 */
15258
15259 static dev_info_t *
sata_get_target_dip(dev_info_t * dip,uint8_t cport,uint8_t pmport)15260 sata_get_target_dip(dev_info_t *dip, uint8_t cport, uint8_t pmport)
15261 {
15262 dev_info_t *cdip = NULL;
15263 int target, tgt;
15264 uint8_t qual;
15265
15266 sata_hba_inst_t *sata_hba_inst;
15267 scsi_hba_tran_t *scsi_hba_tran;
15268
15269 /* Get target id */
15270 scsi_hba_tran = ddi_get_driver_private(dip);
15271 if (scsi_hba_tran == NULL)
15272 return (NULL);
15273
15274 sata_hba_inst = scsi_hba_tran->tran_hba_private;
15275
15276 if (sata_hba_inst == NULL)
15277 return (NULL);
15278
15279 /* Identify a port-mult by cport_info.cport_dev_type */
15280 if (SATA_CPORT_DEV_TYPE(sata_hba_inst, cport) == SATA_DTYPE_PMULT)
15281 qual = SATA_ADDR_DPMPORT;
15282 else
15283 qual = SATA_ADDR_DCPORT;
15284
15285 target = SATA_TO_SCSI_TARGET(cport, pmport, qual);
15286
15287 /* Retrieve target dip */
15288 ndi_devi_enter(dip);
15289 for (cdip = ddi_get_child(dip); cdip != NULL; ) {
15290 dev_info_t *next = ddi_get_next_sibling(cdip);
15291
15292 tgt = ddi_prop_get_int(DDI_DEV_T_ANY, cdip,
15293 DDI_PROP_DONTPASS, "target", -1);
15294 if (tgt == -1) {
15295 /*
15296 * This is actually an error condition, but not
15297 * a fatal one. Just continue the search.
15298 */
15299 cdip = next;
15300 continue;
15301 }
15302
15303 if (tgt == target)
15304 break;
15305
15306 cdip = next;
15307 }
15308 ndi_devi_exit(dip);
15309
15310 return (cdip);
15311 }
15312
15313 /*
15314 * Get dev_info_t pointer to the device node pointed to by port argument.
15315 * NOTE: target argument is a value used in ioctls to identify
15316 * the AP - it is not a sata_address.
15317 * It is a combination of cport, pmport and address qualifier, encoded same
15318 * way as a scsi target number.
15319 *
15320 * Returns dev_info_t pointer if target device was found, NULL otherwise.
15321 */
15322
15323 static dev_info_t *
sata_get_scsi_target_dip(dev_info_t * dip,sata_address_t * saddr)15324 sata_get_scsi_target_dip(dev_info_t *dip, sata_address_t *saddr)
15325 {
15326 dev_info_t *cdip = NULL;
15327 int target, tgt;
15328
15329 target = SATA_TO_SCSI_TARGET(saddr->cport, saddr->pmport, saddr->qual);
15330
15331 ndi_devi_enter(dip);
15332 for (cdip = ddi_get_child(dip); cdip != NULL; ) {
15333 dev_info_t *next = ddi_get_next_sibling(cdip);
15334
15335 tgt = ddi_prop_get_int(DDI_DEV_T_ANY, cdip,
15336 DDI_PROP_DONTPASS, "target", -1);
15337 if (tgt == -1) {
15338 /*
15339 * This is actually an error condition, but not
15340 * a fatal one. Just continue the search.
15341 */
15342 cdip = next;
15343 continue;
15344 }
15345
15346 if (tgt == target)
15347 break;
15348
15349 cdip = next;
15350 }
15351 ndi_devi_exit(dip);
15352
15353 return (cdip);
15354 }
15355
15356 /*
15357 * Process sata port disconnect request.
15358 * Normally, cfgadm sata plugin will try to offline (unconfigure) the device
15359 * before this request. Nevertheless, if a device is still configured,
15360 * we need to attempt to offline and unconfigure device.
15361 * Regardless of the unconfigure operation results the port is marked as
15362 * deactivated and no access to the attached device is possible.
15363 * If the target node remains because unconfigure operation failed, its state
15364 * will be set to DEVICE_REMOVED, preventing it to be used again when a device
15365 * is inserted/re-inserted. The event daemon will repeatedly try to unconfigure
15366 * the device and remove old target node.
15367 *
15368 * This function invokes sata_hba_inst->satahba_tran->
15369 * sata_tran_hotplug_ops->sata_tran_port_deactivate().
15370 * If successful, the device structure (if any) attached to the specified port
15371 * is removed and state of the port marked appropriately.
15372 * Failure of the port_deactivate may keep port in the physically active state,
15373 * or may fail the port.
15374 *
15375 * NOTE: Port multiplier is supported.
15376 */
15377
15378 static int
sata_ioctl_disconnect(sata_hba_inst_t * sata_hba_inst,sata_device_t * sata_device)15379 sata_ioctl_disconnect(sata_hba_inst_t *sata_hba_inst,
15380 sata_device_t *sata_device)
15381 {
15382 sata_drive_info_t *sdinfo = NULL, *subsdinfo = NULL;
15383 sata_cport_info_t *cportinfo = NULL;
15384 sata_pmport_info_t *pmportinfo = NULL;
15385 sata_pmult_info_t *pmultinfo = NULL;
15386 sata_device_t subsdevice;
15387 int cport, pmport, qual;
15388 int rval = SATA_SUCCESS;
15389 int npmport = 0;
15390 int rv = 0;
15391
15392 cport = sata_device->satadev_addr.cport;
15393 pmport = sata_device->satadev_addr.pmport;
15394 qual = sata_device->satadev_addr.qual;
15395
15396 ASSERT(qual == SATA_ADDR_DCPORT || qual == SATA_ADDR_DPMPORT);
15397 if (qual == SATA_ADDR_DCPORT)
15398 qual = SATA_ADDR_CPORT;
15399 else
15400 qual = SATA_ADDR_PMPORT;
15401
15402 /*
15403 * DEVCTL_AP_DISCONNECT invokes sata_hba_inst->satahba_tran->
15404 * sata_tran_hotplug_ops->sata_tran_port_deactivate().
15405 * Do the sanity check.
15406 */
15407 if (SATA_PORT_DEACTIVATE_FUNC(sata_hba_inst) == NULL) {
15408 /* No physical port deactivation supported. */
15409 return (EINVAL);
15410 }
15411
15412 /* Check the current state of the port */
15413 rval = (*SATA_PROBE_PORT_FUNC(sata_hba_inst))
15414 (SATA_DIP(sata_hba_inst), sata_device);
15415
15416 cportinfo = SATA_CPORT_INFO(sata_hba_inst, cport);
15417
15418 /*
15419 * Processing port mulitiplier
15420 */
15421 if (qual == SATA_ADDR_CPORT &&
15422 SATA_CPORT_DEV_TYPE(sata_hba_inst, cport) == SATA_DTYPE_PMULT) {
15423 mutex_enter(&cportinfo->cport_mutex);
15424
15425 /* Check controller port status */
15426 sata_update_port_info(sata_hba_inst, sata_device);
15427 if (rval != SATA_SUCCESS ||
15428 (sata_device->satadev_state & SATA_PSTATE_FAILED) != 0) {
15429 /*
15430 * Device port status is unknown or it is in failed
15431 * state
15432 */
15433 SATA_CPORT_STATE(sata_hba_inst, cport) =
15434 SATA_PSTATE_FAILED;
15435 SATADBG1(SATA_DBG_IOCTL_IF, sata_hba_inst,
15436 "sata_hba_ioctl: connect: failed to deactivate "
15437 "SATA port %d", cport);
15438 mutex_exit(&cportinfo->cport_mutex);
15439 return (EIO);
15440 }
15441
15442 /* Disconnect all sub-devices. */
15443 pmultinfo = SATA_CPORTINFO_PMULT_INFO(cportinfo);
15444 if (pmultinfo != NULL) {
15445
15446 for (npmport = 0; npmport < SATA_NUM_PMPORTS(
15447 sata_hba_inst, cport); npmport ++) {
15448 subsdinfo = SATA_PMPORT_DRV_INFO(
15449 sata_hba_inst, cport, npmport);
15450 if (subsdinfo == NULL)
15451 continue;
15452
15453 subsdevice.satadev_addr = subsdinfo->
15454 satadrv_addr;
15455
15456 mutex_exit(&cportinfo->cport_mutex);
15457 if (sata_ioctl_disconnect(sata_hba_inst,
15458 &subsdevice) == SATA_SUCCESS) {
15459 SATADBG2(SATA_DBG_PMULT, sata_hba_inst,
15460 "[Remove] device at port %d:%d "
15461 "successfully.", cport, npmport);
15462 }
15463 mutex_enter(&cportinfo->cport_mutex);
15464 }
15465 }
15466
15467 /* Disconnect the port multiplier */
15468 cportinfo->cport_state &= ~SATA_STATE_READY;
15469 mutex_exit(&cportinfo->cport_mutex);
15470
15471 sata_device->satadev_addr.qual = qual;
15472 rval = (*SATA_PORT_DEACTIVATE_FUNC(sata_hba_inst))
15473 (SATA_DIP(sata_hba_inst), sata_device);
15474
15475 sata_gen_sysevent(sata_hba_inst, &sata_device->satadev_addr,
15476 SE_NO_HINT);
15477
15478 mutex_enter(&cportinfo->cport_mutex);
15479 sata_update_port_info(sata_hba_inst, sata_device);
15480 if (rval != SATA_SUCCESS &&
15481 sata_device->satadev_state & SATA_PSTATE_FAILED) {
15482 cportinfo->cport_state = SATA_PSTATE_FAILED;
15483 rv = EIO;
15484 } else {
15485 cportinfo->cport_state |= SATA_PSTATE_SHUTDOWN;
15486 }
15487 mutex_exit(&cportinfo->cport_mutex);
15488
15489 return (rv);
15490 }
15491
15492 /*
15493 * Process non-port-multiplier device - it could be a drive connected
15494 * to a port multiplier port or a controller port.
15495 */
15496 if (qual == SATA_ADDR_PMPORT) {
15497 pmportinfo = SATA_PMPORT_INFO(sata_hba_inst, cport, pmport);
15498 mutex_enter(&pmportinfo->pmport_mutex);
15499 sata_update_pmport_info(sata_hba_inst, sata_device);
15500 if (rval != SATA_SUCCESS ||
15501 (sata_device->satadev_state & SATA_PSTATE_FAILED) != 0) {
15502 SATA_PMPORT_STATE(sata_hba_inst, cport, pmport) =
15503 SATA_PSTATE_FAILED;
15504 SATADBG2(SATA_DBG_IOCTL_IF, sata_hba_inst,
15505 "sata_hba_ioctl: connect: failed to deactivate "
15506 "SATA port %d:%d", cport, pmport);
15507 mutex_exit(&pmportinfo->pmport_mutex);
15508 return (EIO);
15509 }
15510
15511 if (pmportinfo->pmport_dev_type != SATA_DTYPE_NONE) {
15512 sdinfo = pmportinfo->pmport_sata_drive;
15513 ASSERT(sdinfo != NULL);
15514 }
15515
15516 /*
15517 * Set port's dev_state to not ready - this will disable
15518 * an access to a potentially attached device.
15519 */
15520 pmportinfo->pmport_state &= ~SATA_STATE_READY;
15521
15522 /* Remove and release sata_drive info structure. */
15523 if (sdinfo != NULL) {
15524 if ((sdinfo->satadrv_type &
15525 SATA_VALID_DEV_TYPE) != 0) {
15526 /*
15527 * If a target node exists, try to offline
15528 * a device and remove target node.
15529 */
15530 mutex_exit(&pmportinfo->pmport_mutex);
15531 (void) sata_offline_device(sata_hba_inst,
15532 sata_device, sdinfo);
15533 mutex_enter(&pmportinfo->pmport_mutex);
15534 }
15535
15536 SATA_PMPORTINFO_DRV_INFO(pmportinfo) = NULL;
15537 pmportinfo->pmport_dev_type = SATA_DTYPE_NONE;
15538 (void) kmem_free((void *)sdinfo,
15539 sizeof (sata_drive_info_t));
15540 }
15541 mutex_exit(&pmportinfo->pmport_mutex);
15542
15543 } else if (qual == SATA_ADDR_CPORT) {
15544 mutex_enter(&cportinfo->cport_mutex);
15545 sata_update_port_info(sata_hba_inst, sata_device);
15546 if (rval != SATA_SUCCESS ||
15547 (sata_device->satadev_state & SATA_PSTATE_FAILED) != 0) {
15548 /*
15549 * Device port status is unknown or it is in failed
15550 * state
15551 */
15552 SATA_CPORT_STATE(sata_hba_inst, cport) =
15553 SATA_PSTATE_FAILED;
15554 SATADBG1(SATA_DBG_IOCTL_IF, sata_hba_inst,
15555 "sata_hba_ioctl: connect: failed to deactivate "
15556 "SATA port %d", cport);
15557 mutex_exit(&cportinfo->cport_mutex);
15558 return (EIO);
15559 }
15560
15561 if (cportinfo->cport_dev_type == SATA_DTYPE_PMULT) {
15562 pmultinfo = SATA_CPORTINFO_PMULT_INFO(cportinfo);
15563 ASSERT(pmultinfo != NULL);
15564 } else if (cportinfo->cport_dev_type != SATA_DTYPE_NONE) {
15565 sdinfo = SATA_CPORTINFO_DRV_INFO(cportinfo);
15566 ASSERT(sdinfo != NULL);
15567 }
15568 cportinfo->cport_state &= ~SATA_STATE_READY;
15569
15570 if (sdinfo != NULL) {
15571 if ((sdinfo->satadrv_type &
15572 SATA_VALID_DEV_TYPE) != 0) {
15573 /*
15574 * If a target node exists, try to offline
15575 * a device and remove target node.
15576 */
15577 mutex_exit(&cportinfo->cport_mutex);
15578 (void) sata_offline_device(sata_hba_inst,
15579 sata_device, sdinfo);
15580 mutex_enter(&cportinfo->cport_mutex);
15581 }
15582
15583 SATA_CPORTINFO_DRV_INFO(cportinfo) = NULL;
15584 cportinfo->cport_dev_type = SATA_DTYPE_NONE;
15585 (void) kmem_free((void *)sdinfo,
15586 sizeof (sata_drive_info_t));
15587 }
15588 mutex_exit(&cportinfo->cport_mutex);
15589 }
15590
15591 /* Just ask HBA driver to deactivate port */
15592 sata_device->satadev_addr.qual = qual;
15593
15594 rval = (*SATA_PORT_DEACTIVATE_FUNC(sata_hba_inst))
15595 (SATA_DIP(sata_hba_inst), sata_device);
15596
15597 /*
15598 * Generate sysevent - EC_DR / ESC_DR_AP_STATE_CHANGE
15599 * without the hint (to force listener to investivate the state).
15600 */
15601 sata_gen_sysevent(sata_hba_inst, &sata_device->satadev_addr,
15602 SE_NO_HINT);
15603
15604 if (qual == SATA_ADDR_PMPORT) {
15605 mutex_enter(&pmportinfo->pmport_mutex);
15606 sata_update_pmport_info(sata_hba_inst, sata_device);
15607
15608 if (rval != SATA_SUCCESS &&
15609 sata_device->satadev_state & SATA_PSTATE_FAILED) {
15610 /*
15611 * Port deactivation failure - do not change port
15612 * state unless the state returned by HBA indicates a
15613 * port failure.
15614 *
15615 * NOTE: device structures were released, so devices
15616 * now are invisible! Port reset is needed to
15617 * re-enumerate devices.
15618 */
15619 pmportinfo->pmport_state = SATA_PSTATE_FAILED;
15620 rv = EIO;
15621 } else {
15622 /*
15623 * Deactivation succeded. From now on the sata framework
15624 * will not care what is happening to the device, until
15625 * the port is activated again.
15626 */
15627 pmportinfo->pmport_state |= SATA_PSTATE_SHUTDOWN;
15628 }
15629 mutex_exit(&pmportinfo->pmport_mutex);
15630 } else if (qual == SATA_ADDR_CPORT) {
15631 mutex_enter(&cportinfo->cport_mutex);
15632 sata_update_port_info(sata_hba_inst, sata_device);
15633
15634 if (rval != SATA_SUCCESS &&
15635 sata_device->satadev_state & SATA_PSTATE_FAILED) {
15636 cportinfo->cport_state = SATA_PSTATE_FAILED;
15637 rv = EIO;
15638 } else {
15639 cportinfo->cport_state |= SATA_PSTATE_SHUTDOWN;
15640 }
15641 mutex_exit(&cportinfo->cport_mutex);
15642 }
15643
15644 return (rv);
15645 }
15646
15647
15648
15649 /*
15650 * Process sata port connect request
15651 * The sata cfgadm pluging will invoke this operation only if port was found
15652 * in the disconnect state (failed state is also treated as the disconnected
15653 * state).
15654 * DEVCTL_AP_CONNECT would invoke sata_hba_inst->satahba_tran->
15655 * sata_tran_hotplug_ops->sata_tran_port_activate().
15656 * If successful and a device is found attached to the port,
15657 * the initialization sequence is executed to attach a device structure to
15658 * a port structure. The state of the port and a device would be set
15659 * appropriately.
15660 * The device is not set in configured state (system-wise) by this operation.
15661 *
15662 * Note, that activating the port may generate link events,
15663 * so it is important that following processing and the
15664 * event processing does not interfere with each other!
15665 *
15666 * This operation may remove port failed state and will
15667 * try to make port active and in good standing.
15668 *
15669 * NOTE: Port multiplier is supported.
15670 */
15671
15672 static int
sata_ioctl_connect(sata_hba_inst_t * sata_hba_inst,sata_device_t * sata_device)15673 sata_ioctl_connect(sata_hba_inst_t *sata_hba_inst,
15674 sata_device_t *sata_device)
15675 {
15676 sata_pmport_info_t *pmportinfo = NULL;
15677 uint8_t cport, pmport, qual;
15678 int rv = 0;
15679
15680 cport = sata_device->satadev_addr.cport;
15681 pmport = sata_device->satadev_addr.pmport;
15682 qual = sata_device->satadev_addr.qual;
15683
15684 ASSERT(qual == SATA_ADDR_DCPORT || qual == SATA_ADDR_DPMPORT);
15685 if (qual == SATA_ADDR_DCPORT)
15686 qual = SATA_ADDR_CPORT;
15687 else
15688 qual = SATA_ADDR_PMPORT;
15689
15690 if (qual == SATA_ADDR_PMPORT)
15691 pmportinfo = SATA_PMPORT_INFO(sata_hba_inst, cport, pmport);
15692
15693 /*
15694 * DEVCTL_AP_CONNECT would invoke sata_hba_inst->
15695 * satahba_tran->sata_tran_hotplug_ops->sata_tran_port_activate().
15696 * Perform sanity check now.
15697 */
15698 if (SATA_PORT_ACTIVATE_FUNC(sata_hba_inst) == NULL) {
15699 /* No physical port activation supported. */
15700 return (EINVAL);
15701 }
15702
15703 /* Just ask HBA driver to activate port */
15704 if ((*SATA_PORT_ACTIVATE_FUNC(sata_hba_inst))
15705 (SATA_DIP(sata_hba_inst), sata_device) != SATA_SUCCESS) {
15706 /*
15707 * Port activation failure.
15708 */
15709 if (qual == SATA_ADDR_CPORT) {
15710 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst,
15711 cport)->cport_mutex);
15712 sata_update_port_info(sata_hba_inst, sata_device);
15713 if (sata_device->satadev_state & SATA_PSTATE_FAILED) {
15714 SATA_CPORT_STATE(sata_hba_inst, cport) =
15715 SATA_PSTATE_FAILED;
15716 SATADBG1(SATA_DBG_IOCTL_IF, sata_hba_inst,
15717 "sata_hba_ioctl: connect: failed to "
15718 "activate SATA port %d", cport);
15719 }
15720 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst,
15721 cport)->cport_mutex);
15722 } else { /* port multiplier device port */
15723 mutex_enter(&pmportinfo->pmport_mutex);
15724 sata_update_pmport_info(sata_hba_inst, sata_device);
15725 if (sata_device->satadev_state & SATA_PSTATE_FAILED) {
15726 SATA_PMPORT_STATE(sata_hba_inst, cport,
15727 pmport) = SATA_PSTATE_FAILED;
15728 SATADBG2(SATA_DBG_IOCTL_IF, sata_hba_inst,
15729 "sata_hba_ioctl: connect: failed to "
15730 "activate SATA port %d:%d", cport, pmport);
15731 }
15732 mutex_exit(&pmportinfo->pmport_mutex);
15733 }
15734 return (EIO);
15735 }
15736
15737 /* Virgin port state - will be updated by the port re-probe. */
15738 if (qual == SATA_ADDR_CPORT) {
15739 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst,
15740 cport)->cport_mutex);
15741 SATA_CPORT_STATE(sata_hba_inst, cport) = 0;
15742 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst,
15743 cport)->cport_mutex);
15744 } else { /* port multiplier device port */
15745 mutex_enter(&pmportinfo->pmport_mutex);
15746 SATA_PMPORT_STATE(sata_hba_inst, cport, pmport) = 0;
15747 mutex_exit(&pmportinfo->pmport_mutex);
15748 }
15749
15750 /*
15751 * Probe the port to find its state and attached device.
15752 */
15753 if (sata_reprobe_port(sata_hba_inst, sata_device,
15754 SATA_DEV_IDENTIFY_RETRY) == SATA_FAILURE)
15755 rv = EIO;
15756
15757 /*
15758 * Generate sysevent - EC_DR / ESC_DR_AP_STATE_CHANGE
15759 * without the hint
15760 */
15761 sata_gen_sysevent(sata_hba_inst, &sata_device->satadev_addr,
15762 SE_NO_HINT);
15763
15764 /*
15765 * If there is a device attached to the port, emit
15766 * a message.
15767 */
15768 if (sata_device->satadev_type != SATA_DTYPE_NONE) {
15769
15770 if (qual == SATA_ADDR_CPORT) {
15771 if (sata_device->satadev_type == SATA_DTYPE_PMULT) {
15772 sata_log(sata_hba_inst, CE_WARN,
15773 "SATA port multiplier detected "
15774 "at port %d", cport);
15775 } else {
15776 sata_log(sata_hba_inst, CE_WARN,
15777 "SATA device detected at port %d", cport);
15778 if (sata_device->satadev_type ==
15779 SATA_DTYPE_UNKNOWN) {
15780 /*
15781 * A device was not successfully identified
15782 */
15783 sata_log(sata_hba_inst, CE_WARN,
15784 "Could not identify SATA "
15785 "device at port %d", cport);
15786 }
15787 }
15788 } else { /* port multiplier device port */
15789 sata_log(sata_hba_inst, CE_WARN,
15790 "SATA device detected at port %d:%d",
15791 cport, pmport);
15792 if (sata_device->satadev_type == SATA_DTYPE_UNKNOWN) {
15793 /*
15794 * A device was not successfully identified
15795 */
15796 sata_log(sata_hba_inst, CE_WARN,
15797 "Could not identify SATA "
15798 "device at port %d:%d", cport, pmport);
15799 }
15800 }
15801 }
15802
15803 return (rv);
15804 }
15805
15806
15807 /*
15808 * Process sata device unconfigure request.
15809 * The unconfigure operation uses generic nexus operation to
15810 * offline a device. It leaves a target device node attached.
15811 * and obviously sata_drive_info attached as well, because
15812 * from the hardware point of view nothing has changed.
15813 */
15814 static int
sata_ioctl_unconfigure(sata_hba_inst_t * sata_hba_inst,sata_device_t * sata_device)15815 sata_ioctl_unconfigure(sata_hba_inst_t *sata_hba_inst,
15816 sata_device_t *sata_device)
15817 {
15818 int rv = 0;
15819 dev_info_t *tdip;
15820
15821 /* We are addressing attached device, not a port */
15822 if (sata_device->satadev_addr.qual == SATA_ADDR_CPORT)
15823 sata_device->satadev_addr.qual = SATA_ADDR_DCPORT;
15824 else if (sata_device->satadev_addr.qual == SATA_ADDR_PMPORT)
15825 sata_device->satadev_addr.qual = SATA_ADDR_DPMPORT;
15826
15827 if ((tdip = sata_get_scsi_target_dip(SATA_DIP(sata_hba_inst),
15828 &sata_device->satadev_addr)) != NULL) {
15829
15830 if (ndi_devi_offline(tdip, NDI_UNCONFIG) != NDI_SUCCESS) {
15831 SATA_LOG_D((sata_hba_inst, CE_WARN,
15832 "sata_hba_ioctl: unconfigure: "
15833 "failed to unconfigure device at SATA port %d:%d",
15834 sata_device->satadev_addr.cport,
15835 sata_device->satadev_addr.pmport));
15836 rv = EIO;
15837 }
15838 /*
15839 * The target node devi_state should be marked with
15840 * DEVI_DEVICE_OFFLINE by ndi_devi_offline().
15841 * This would be the indication for cfgadm that
15842 * the AP node occupant state is 'unconfigured'.
15843 */
15844
15845 } else {
15846 /*
15847 * This would indicate a failure on the part of cfgadm
15848 * to detect correct state of the node prior to this
15849 * call - one cannot unconfigure non-existing device.
15850 */
15851 SATA_LOG_D((sata_hba_inst, CE_WARN,
15852 "sata_hba_ioctl: unconfigure: "
15853 "attempt to unconfigure non-existing device "
15854 "at SATA port %d:%d",
15855 sata_device->satadev_addr.cport,
15856 sata_device->satadev_addr.pmport));
15857 rv = ENXIO;
15858 }
15859 return (rv);
15860 }
15861
15862 /*
15863 * Process sata device configure request
15864 * If port is in a failed state, operation is aborted - one has to use
15865 * an explicit connect or port activate request to try to get a port into
15866 * non-failed mode. Port reset wil also work in such situation.
15867 * If the port is in disconnected (shutdown) state, the connect operation is
15868 * attempted prior to any other action.
15869 * When port is in the active state, there is a device attached and the target
15870 * node exists, a device was most likely offlined.
15871 * If target node does not exist, a new target node is created. In both cases
15872 * an attempt is made to online (configure) the device.
15873 *
15874 * NOTE: Port multiplier is supported.
15875 */
15876 static int
sata_ioctl_configure(sata_hba_inst_t * sata_hba_inst,sata_device_t * sata_device)15877 sata_ioctl_configure(sata_hba_inst_t *sata_hba_inst,
15878 sata_device_t *sata_device)
15879 {
15880 int cport, pmport, qual;
15881 int rval;
15882 boolean_t target = B_TRUE;
15883 sata_cport_info_t *cportinfo;
15884 sata_pmport_info_t *pmportinfo = NULL;
15885 dev_info_t *tdip;
15886 sata_drive_info_t *sdinfo;
15887
15888 cport = sata_device->satadev_addr.cport;
15889 pmport = sata_device->satadev_addr.pmport;
15890 qual = sata_device->satadev_addr.qual;
15891
15892 /* Get current port state */
15893 rval = (*SATA_PROBE_PORT_FUNC(sata_hba_inst))
15894 (SATA_DIP(sata_hba_inst), sata_device);
15895
15896 cportinfo = SATA_CPORT_INFO(sata_hba_inst, cport);
15897 if (qual == SATA_ADDR_DPMPORT) {
15898 pmportinfo = SATA_PMPORT_INFO(sata_hba_inst, cport, pmport);
15899 mutex_enter(&pmportinfo->pmport_mutex);
15900 sata_update_pmport_info(sata_hba_inst, sata_device);
15901 if (rval != SATA_SUCCESS ||
15902 (sata_device->satadev_state & SATA_PSTATE_FAILED) != 0) {
15903 /*
15904 * Obviously, device on a failed port is not visible
15905 */
15906 mutex_exit(&pmportinfo->pmport_mutex);
15907 return (ENXIO);
15908 }
15909 mutex_exit(&pmportinfo->pmport_mutex);
15910 } else {
15911 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst,
15912 cport)->cport_mutex);
15913 sata_update_port_info(sata_hba_inst, sata_device);
15914 if (rval != SATA_SUCCESS ||
15915 (sata_device->satadev_state & SATA_PSTATE_FAILED) != 0) {
15916 /*
15917 * Obviously, device on a failed port is not visible
15918 */
15919 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst,
15920 cport)->cport_mutex);
15921 return (ENXIO);
15922 }
15923 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst,
15924 cport)->cport_mutex);
15925 }
15926
15927 if ((sata_device->satadev_state & SATA_PSTATE_SHUTDOWN) != 0) {
15928 /* need to activate port */
15929 target = B_FALSE;
15930
15931 /* Sanity check */
15932 if (SATA_PORT_ACTIVATE_FUNC(sata_hba_inst) == NULL)
15933 return (ENXIO);
15934
15935 /* Just let HBA driver to activate port */
15936 if ((*SATA_PORT_ACTIVATE_FUNC(sata_hba_inst))
15937 (SATA_DIP(sata_hba_inst), sata_device) != SATA_SUCCESS) {
15938 /*
15939 * Port activation failure - do not change port state
15940 * unless the state returned by HBA indicates a port
15941 * failure.
15942 */
15943 if (qual == SATA_ADDR_DPMPORT) {
15944 mutex_enter(&pmportinfo->pmport_mutex);
15945 sata_update_pmport_info(sata_hba_inst,
15946 sata_device);
15947 if (sata_device->satadev_state &
15948 SATA_PSTATE_FAILED)
15949 pmportinfo->pmport_state =
15950 SATA_PSTATE_FAILED;
15951 mutex_exit(&pmportinfo->pmport_mutex);
15952 } else {
15953 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst,
15954 cport)->cport_mutex);
15955 sata_update_port_info(sata_hba_inst,
15956 sata_device);
15957 if (sata_device->satadev_state &
15958 SATA_PSTATE_FAILED)
15959 cportinfo->cport_state =
15960 SATA_PSTATE_FAILED;
15961 mutex_exit(&SATA_CPORT_INFO(
15962 sata_hba_inst, cport)->cport_mutex);
15963 }
15964 }
15965 SATA_LOG_D((sata_hba_inst, CE_WARN,
15966 "sata_hba_ioctl: configure: "
15967 "failed to activate SATA port %d:%d",
15968 cport, pmport));
15969 return (EIO);
15970 }
15971 /*
15972 * Generate sysevent - EC_DR / ESC_DR_AP_STATE_CHANGE
15973 * without the hint.
15974 */
15975 sata_gen_sysevent(sata_hba_inst,
15976 &sata_device->satadev_addr, SE_NO_HINT);
15977
15978 /* Virgin port state */
15979 if (qual == SATA_ADDR_DPMPORT) {
15980 mutex_enter(&pmportinfo->pmport_mutex);
15981 pmportinfo->pmport_state = 0;
15982 mutex_exit(&pmportinfo->pmport_mutex);
15983 } else {
15984 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst,
15985 cport)-> cport_mutex);
15986 cportinfo->cport_state = 0;
15987 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst,
15988 cport)->cport_mutex);
15989 }
15990 /*
15991 * Always reprobe port, to get current device info.
15992 */
15993 if (sata_reprobe_port(sata_hba_inst, sata_device,
15994 SATA_DEV_IDENTIFY_RETRY) != SATA_SUCCESS)
15995 return (EIO);
15996
15997 if (sata_device->satadev_type != SATA_DTYPE_NONE && target == B_FALSE) {
15998 if (qual == SATA_ADDR_DPMPORT) {
15999 /*
16000 * That's the transition from "inactive" port
16001 * to active one with device attached.
16002 */
16003 sata_log(sata_hba_inst, CE_WARN,
16004 "SATA device detected at port %d:%d",
16005 cport, pmport);
16006 } else {
16007 /*
16008 * When PM is attached to the cport and cport is
16009 * activated, every PM device port needs to be reprobed.
16010 * We need to emit message for all devices detected
16011 * at port multiplier's device ports.
16012 * Add such code here.
16013 * For now, just inform about device attached to
16014 * cport.
16015 */
16016 sata_log(sata_hba_inst, CE_WARN,
16017 "SATA device detected at port %d", cport);
16018 }
16019 }
16020
16021 /*
16022 * This is where real configuration operation starts.
16023 *
16024 * When PM is attached to the cport and cport is activated,
16025 * devices attached PM device ports may have to be configured
16026 * explicitly. This may change when port multiplier is supported.
16027 * For now, configure only disks and other valid target devices.
16028 */
16029 if (!(sata_device->satadev_type & SATA_VALID_DEV_TYPE)) {
16030 if (qual == SATA_ADDR_DCPORT) {
16031 if (sata_device->satadev_type == SATA_DTYPE_UNKNOWN) {
16032 /*
16033 * A device was not successfully identified
16034 */
16035 sata_log(sata_hba_inst, CE_WARN,
16036 "Could not identify SATA "
16037 "device at port %d", cport);
16038 }
16039 } else { /* port multiplier device port */
16040 if (sata_device->satadev_type == SATA_DTYPE_UNKNOWN) {
16041 /*
16042 * A device was not successfully identified
16043 */
16044 sata_log(sata_hba_inst, CE_WARN,
16045 "Could not identify SATA "
16046 "device at port %d:%d", cport, pmport);
16047 }
16048 }
16049 return (ENXIO); /* No device to configure */
16050 }
16051
16052 /*
16053 * Here we may have a device in reset condition,
16054 * but because we are just configuring it, there is
16055 * no need to process the reset other than just
16056 * to clear device reset condition in the HBA driver.
16057 * Setting the flag SATA_EVNT_CLEAR_DEVICE_RESET will
16058 * cause a first command sent the HBA driver with the request
16059 * to clear device reset condition.
16060 */
16061 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, cport)->cport_mutex);
16062 if (qual == SATA_ADDR_DPMPORT)
16063 sata_device->satadev_addr.qual = SATA_ADDR_DPMPORT;
16064 else
16065 sata_device->satadev_addr.qual = SATA_ADDR_DCPORT;
16066 sdinfo = sata_get_device_info(sata_hba_inst, sata_device);
16067 if (sdinfo == NULL) {
16068 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, cport)->cport_mutex);
16069 return (ENXIO);
16070 }
16071 if (sdinfo->satadrv_event_flags &
16072 (SATA_EVNT_DEVICE_RESET | SATA_EVNT_INPROC_DEVICE_RESET)) {
16073 sdinfo->satadrv_event_flags = 0;
16074 }
16075 sdinfo->satadrv_event_flags |= SATA_EVNT_CLEAR_DEVICE_RESET;
16076 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, cport)->cport_mutex);
16077
16078 if ((tdip = sata_get_scsi_target_dip(SATA_DIP(sata_hba_inst),
16079 &sata_device->satadev_addr)) != NULL) {
16080 /*
16081 * Target node exists. Verify, that it belongs
16082 * to existing, attached device and not to
16083 * a removed device.
16084 */
16085 if (sata_check_device_removed(tdip) == B_TRUE) {
16086 if (qual == SATA_ADDR_DPMPORT)
16087 sata_log(sata_hba_inst, CE_WARN,
16088 "SATA device at port %d cannot be "
16089 "configured. "
16090 "Application(s) accessing "
16091 "previously attached device "
16092 "have to release it before newly "
16093 "inserted device can be made accessible.",
16094 cport);
16095 else
16096 sata_log(sata_hba_inst, CE_WARN,
16097 "SATA device at port %d:%d cannot be"
16098 "configured. "
16099 "Application(s) accessing "
16100 "previously attached device "
16101 "have to release it before newly "
16102 "inserted device can be made accessible.",
16103 cport, pmport);
16104 return (EIO);
16105 }
16106 /*
16107 * Device was not removed and re-inserted.
16108 * Try to online it.
16109 */
16110 if (ndi_devi_online(tdip, 0) != NDI_SUCCESS) {
16111 SATA_LOG_D((sata_hba_inst, CE_WARN,
16112 "sata_hba_ioctl: configure: "
16113 "onlining device at SATA port "
16114 "%d:%d failed", cport, pmport));
16115 return (EIO);
16116 }
16117
16118 if (qual == SATA_ADDR_DPMPORT) {
16119 mutex_enter(&pmportinfo->pmport_mutex);
16120 pmportinfo->pmport_tgtnode_clean = B_TRUE;
16121 mutex_exit(&pmportinfo->pmport_mutex);
16122 } else {
16123 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst,
16124 cport)->cport_mutex);
16125 cportinfo-> cport_tgtnode_clean = B_TRUE;
16126 mutex_exit(&SATA_CPORT_INFO(
16127 sata_hba_inst, cport)->cport_mutex);
16128 }
16129 } else {
16130 /*
16131 * No target node - need to create a new target node.
16132 */
16133 if (qual == SATA_ADDR_DPMPORT) {
16134 mutex_enter(&pmportinfo->pmport_mutex);
16135 pmportinfo->pmport_tgtnode_clean = B_TRUE;
16136 mutex_exit(&pmportinfo->pmport_mutex);
16137 } else {
16138 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, cport)->
16139 cport_mutex);
16140 cportinfo-> cport_tgtnode_clean = B_TRUE;
16141 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, cport)->
16142 cport_mutex);
16143 }
16144
16145 tdip = sata_create_target_node(SATA_DIP(sata_hba_inst),
16146 sata_hba_inst, &sata_device->satadev_addr);
16147 if (tdip == NULL) {
16148 /* Configure operation failed */
16149 SATA_LOG_D((sata_hba_inst, CE_WARN,
16150 "sata_hba_ioctl: configure: "
16151 "configuring SATA device at port %d:%d "
16152 "failed", cport, pmport));
16153 return (EIO);
16154 }
16155 }
16156 return (0);
16157 }
16158
16159
16160 /*
16161 * Process ioctl deactivate port request.
16162 * Arbitrarily unconfigure attached device, if any.
16163 * Even if the unconfigure fails, proceed with the
16164 * port deactivation.
16165 *
16166 * NOTE: Port Multiplier is supported now.
16167 */
16168
16169 static int
sata_ioctl_deactivate(sata_hba_inst_t * sata_hba_inst,sata_device_t * sata_device)16170 sata_ioctl_deactivate(sata_hba_inst_t *sata_hba_inst,
16171 sata_device_t *sata_device)
16172 {
16173 int cport, pmport, qual;
16174 int rval, rv = 0;
16175 int npmport;
16176 sata_cport_info_t *cportinfo;
16177 sata_pmport_info_t *pmportinfo;
16178 sata_pmult_info_t *pmultinfo;
16179 dev_info_t *tdip;
16180 sata_drive_info_t *sdinfo = NULL;
16181 sata_device_t subsdevice;
16182
16183 /* Sanity check */
16184 if (SATA_PORT_DEACTIVATE_FUNC(sata_hba_inst) == NULL)
16185 return (ENOTSUP);
16186
16187 cport = sata_device->satadev_addr.cport;
16188 pmport = sata_device->satadev_addr.pmport;
16189 qual = sata_device->satadev_addr.qual;
16190
16191 /* SCSI_TO_SATA_ADDR_QUAL() translate ap_id into a device qualifier */
16192 ASSERT(qual == SATA_ADDR_DCPORT || qual == SATA_ADDR_DPMPORT);
16193 if (qual == SATA_ADDR_DCPORT)
16194 qual = SATA_ADDR_CPORT;
16195 else
16196 qual = SATA_ADDR_PMPORT;
16197
16198 cportinfo = SATA_CPORT_INFO(sata_hba_inst, cport);
16199 if (qual == SATA_ADDR_PMPORT)
16200 pmportinfo = SATA_PMPORT_INFO(sata_hba_inst, cport, pmport);
16201
16202 /*
16203 * Processing port multiplier
16204 */
16205 if (qual == SATA_ADDR_CPORT &&
16206 SATA_CPORT_DEV_TYPE(sata_hba_inst, cport) == SATA_DTYPE_PMULT) {
16207 mutex_enter(&cportinfo->cport_mutex);
16208
16209 /* Deactivate all sub-deices */
16210 pmultinfo = SATA_CPORTINFO_PMULT_INFO(cportinfo);
16211 if (pmultinfo != NULL) {
16212 for (npmport = 0; npmport < SATA_NUM_PMPORTS(
16213 sata_hba_inst, cport); npmport++) {
16214
16215 subsdevice.satadev_addr.cport = cport;
16216 subsdevice.satadev_addr.pmport =
16217 (uint8_t)npmport;
16218 subsdevice.satadev_addr.qual =
16219 SATA_ADDR_DPMPORT;
16220
16221 SATADBG2(SATA_DBG_PMULT, sata_hba_inst,
16222 "sata_hba_ioctl: deactivate: trying to "
16223 "deactivate SATA port %d:%d",
16224 cport, npmport);
16225
16226 mutex_exit(&cportinfo->cport_mutex);
16227 if (sata_ioctl_deactivate(sata_hba_inst,
16228 &subsdevice) == SATA_SUCCESS) {
16229 SATADBG2(SATA_DBG_PMULT, sata_hba_inst,
16230 "[Deactivate] device at port %d:%d "
16231 "successfully.", cport, npmport);
16232 }
16233 mutex_enter(&cportinfo->cport_mutex);
16234 }
16235 }
16236
16237 /* Deactivate the port multiplier now. */
16238 cportinfo->cport_state &= ~SATA_STATE_READY;
16239 mutex_exit(&cportinfo->cport_mutex);
16240
16241 sata_device->satadev_addr.qual = qual;
16242 rval = (*SATA_PORT_DEACTIVATE_FUNC(sata_hba_inst))
16243 (SATA_DIP(sata_hba_inst), sata_device);
16244
16245 sata_gen_sysevent(sata_hba_inst, &sata_device->satadev_addr,
16246 SE_NO_HINT);
16247
16248 mutex_enter(&cportinfo->cport_mutex);
16249 sata_update_port_info(sata_hba_inst, sata_device);
16250 if (rval != SATA_SUCCESS) {
16251 if (sata_device->satadev_state & SATA_PSTATE_FAILED) {
16252 cportinfo->cport_state = SATA_PSTATE_FAILED;
16253 }
16254 rv = EIO;
16255 } else {
16256 cportinfo->cport_state |= SATA_PSTATE_SHUTDOWN;
16257 }
16258 mutex_exit(&cportinfo->cport_mutex);
16259
16260 return (rv);
16261 }
16262
16263 /*
16264 * Process non-port-multiplier device - it could be a drive connected
16265 * to a port multiplier port or a controller port.
16266 */
16267 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, cport)->cport_mutex);
16268 if (qual == SATA_ADDR_CPORT) {
16269 sata_device->satadev_addr.qual = SATA_ADDR_DCPORT;
16270 if (cportinfo->cport_dev_type != SATA_DTYPE_NONE) {
16271 /* deal only with valid devices */
16272 if ((cportinfo->cport_dev_type &
16273 SATA_VALID_DEV_TYPE) != 0)
16274 sdinfo = SATA_CPORTINFO_DRV_INFO(cportinfo);
16275 }
16276 cportinfo->cport_state &= ~SATA_STATE_READY;
16277 } else {
16278 /* Port multiplier device port */
16279 mutex_enter(&pmportinfo->pmport_mutex);
16280 sata_device->satadev_addr.qual = SATA_ADDR_DPMPORT;
16281 if (pmportinfo->pmport_dev_type != SATA_DTYPE_NONE &&
16282 (pmportinfo->pmport_dev_type & SATA_VALID_DEV_TYPE) != 0)
16283 sdinfo = SATA_PMPORTINFO_DRV_INFO(pmportinfo);
16284 pmportinfo->pmport_state &= ~SATA_STATE_READY;
16285 mutex_exit(&pmportinfo->pmport_mutex);
16286 }
16287
16288 if (sdinfo != NULL) {
16289 /*
16290 * If a target node exists, try to offline a device and
16291 * to remove a target node.
16292 */
16293 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, cport)->
16294 cport_mutex);
16295 tdip = sata_get_scsi_target_dip(SATA_DIP(sata_hba_inst),
16296 &sata_device->satadev_addr);
16297 if (tdip != NULL) {
16298 /* target node exist */
16299 SATADBG1(SATA_DBG_IOCTL_IF, sata_hba_inst,
16300 "sata_hba_ioctl: port deactivate: "
16301 "target node exists.", NULL);
16302
16303 if (ndi_devi_offline(tdip, NDI_DEVI_REMOVE) !=
16304 NDI_SUCCESS) {
16305 SATA_LOG_D((sata_hba_inst, CE_WARN,
16306 "sata_hba_ioctl: port deactivate: "
16307 "failed to unconfigure device at port "
16308 "%d:%d before deactivating the port",
16309 cport, pmport));
16310 /*
16311 * Set DEVICE REMOVED state in the target
16312 * node. It will prevent an access to
16313 * the device even when a new device is
16314 * attached, until the old target node is
16315 * released, removed and recreated for a new
16316 * device.
16317 */
16318 sata_set_device_removed(tdip);
16319
16320 /*
16321 * Instruct the event daemon to try the
16322 * target node cleanup later.
16323 */
16324 sata_set_target_node_cleanup(sata_hba_inst,
16325 &sata_device->satadev_addr);
16326 }
16327 }
16328 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, cport)->
16329 cport_mutex);
16330 /*
16331 * In any case, remove and release sata_drive_info
16332 * structure.
16333 */
16334 if (qual == SATA_ADDR_CPORT) {
16335 SATA_CPORTINFO_DRV_INFO(cportinfo) = NULL;
16336 cportinfo->cport_dev_type = SATA_DTYPE_NONE;
16337 } else { /* port multiplier device port */
16338 mutex_enter(&pmportinfo->pmport_mutex);
16339 SATA_PMPORTINFO_DRV_INFO(pmportinfo) = NULL;
16340 pmportinfo->pmport_dev_type = SATA_DTYPE_NONE;
16341 mutex_exit(&pmportinfo->pmport_mutex);
16342 }
16343 (void) kmem_free((void *)sdinfo, sizeof (sata_drive_info_t));
16344 }
16345
16346 if (qual == SATA_ADDR_CPORT) {
16347 cportinfo->cport_state &= ~(SATA_STATE_PROBED |
16348 SATA_STATE_PROBING);
16349 } else if (qual == SATA_ADDR_PMPORT) {
16350 mutex_enter(&pmportinfo->pmport_mutex);
16351 pmportinfo->pmport_state &= ~(SATA_STATE_PROBED |
16352 SATA_STATE_PROBING);
16353 mutex_exit(&pmportinfo->pmport_mutex);
16354 }
16355 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, cport)->cport_mutex);
16356
16357 /* Just let HBA driver to deactivate port */
16358 sata_device->satadev_addr.qual = qual;
16359 rval = (*SATA_PORT_DEACTIVATE_FUNC(sata_hba_inst))
16360 (SATA_DIP(sata_hba_inst), sata_device);
16361
16362 /*
16363 * Generate sysevent - EC_DR / ESC_DR_AP_STATE_CHANGE
16364 * without the hint
16365 */
16366 sata_gen_sysevent(sata_hba_inst, &sata_device->satadev_addr,
16367 SE_NO_HINT);
16368
16369 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, cport)->cport_mutex);
16370 sata_update_port_info(sata_hba_inst, sata_device);
16371 if (qual == SATA_ADDR_CPORT) {
16372 if (rval != SATA_SUCCESS) {
16373 /*
16374 * Port deactivation failure - do not change port state
16375 * unless the state returned by HBA indicates a port
16376 * failure.
16377 */
16378 if (sata_device->satadev_state & SATA_PSTATE_FAILED) {
16379 SATA_CPORT_STATE(sata_hba_inst, cport) =
16380 SATA_PSTATE_FAILED;
16381 }
16382 SATA_LOG_D((sata_hba_inst, CE_WARN,
16383 "sata_hba_ioctl: port deactivate: "
16384 "cannot deactivate SATA port %d", cport));
16385 rv = EIO;
16386 } else {
16387 cportinfo->cport_state |= SATA_PSTATE_SHUTDOWN;
16388 }
16389 } else {
16390 mutex_enter(&pmportinfo->pmport_mutex);
16391 if (rval != SATA_SUCCESS) {
16392 if (sata_device->satadev_state & SATA_PSTATE_FAILED) {
16393 SATA_PMPORT_STATE(sata_hba_inst, cport,
16394 pmport) = SATA_PSTATE_FAILED;
16395 }
16396 SATA_LOG_D((sata_hba_inst, CE_WARN,
16397 "sata_hba_ioctl: port deactivate: "
16398 "cannot deactivate SATA port %d:%d",
16399 cport, pmport));
16400 rv = EIO;
16401 } else {
16402 pmportinfo->pmport_state |= SATA_PSTATE_SHUTDOWN;
16403 }
16404 mutex_exit(&pmportinfo->pmport_mutex);
16405 }
16406
16407 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, cport)->cport_mutex);
16408
16409 return (rv);
16410 }
16411
16412 /*
16413 * Process ioctl port activate request.
16414 *
16415 * NOTE: Port multiplier is supported now.
16416 */
16417 static int
sata_ioctl_activate(sata_hba_inst_t * sata_hba_inst,sata_device_t * sata_device)16418 sata_ioctl_activate(sata_hba_inst_t *sata_hba_inst,
16419 sata_device_t *sata_device)
16420 {
16421 int cport, pmport, qual;
16422 sata_cport_info_t *cportinfo;
16423 sata_pmport_info_t *pmportinfo = NULL;
16424 boolean_t dev_existed = B_TRUE;
16425
16426 /* Sanity check */
16427 if (SATA_PORT_ACTIVATE_FUNC(sata_hba_inst) == NULL)
16428 return (ENOTSUP);
16429
16430 cport = sata_device->satadev_addr.cport;
16431 pmport = sata_device->satadev_addr.pmport;
16432 qual = sata_device->satadev_addr.qual;
16433
16434 cportinfo = SATA_CPORT_INFO(sata_hba_inst, cport);
16435
16436 /*
16437 * The qual translate from ap_id (by SCSI_TO_SATA_ADDR_QUAL())
16438 * is a device. But what we are dealing with is port/pmport.
16439 */
16440 ASSERT(qual == SATA_ADDR_DCPORT || qual == SATA_ADDR_DPMPORT);
16441 if (qual == SATA_ADDR_DCPORT)
16442 sata_device->satadev_addr.qual = qual = SATA_ADDR_CPORT;
16443 else
16444 sata_device->satadev_addr.qual = qual = SATA_ADDR_PMPORT;
16445
16446 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, cport)->cport_mutex);
16447 if (qual == SATA_ADDR_PMPORT) {
16448 pmportinfo = SATA_PMPORT_INFO(sata_hba_inst, cport, pmport);
16449 if (pmportinfo->pmport_state & SATA_PSTATE_SHUTDOWN ||
16450 pmportinfo->pmport_dev_type == SATA_DTYPE_NONE)
16451 dev_existed = B_FALSE;
16452 } else { /* cport */
16453 if (cportinfo->cport_state & SATA_PSTATE_SHUTDOWN ||
16454 cportinfo->cport_dev_type == SATA_DTYPE_NONE)
16455 dev_existed = B_FALSE;
16456 }
16457 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, cport)->cport_mutex);
16458
16459 /* Just let HBA driver to activate port, if necessary */
16460 if ((*SATA_PORT_ACTIVATE_FUNC(sata_hba_inst))
16461 (SATA_DIP(sata_hba_inst), sata_device) != SATA_SUCCESS) {
16462 /*
16463 * Port activation failure - do not change port state unless
16464 * the state returned by HBA indicates a port failure.
16465 */
16466 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst,
16467 cport)->cport_mutex);
16468 sata_update_port_info(sata_hba_inst, sata_device);
16469 if (sata_device->satadev_state & SATA_PSTATE_FAILED) {
16470 if (qual == SATA_ADDR_PMPORT) {
16471 mutex_enter(&pmportinfo->pmport_mutex);
16472 pmportinfo->pmport_state = SATA_PSTATE_FAILED;
16473 mutex_exit(&pmportinfo->pmport_mutex);
16474 } else
16475 cportinfo->cport_state = SATA_PSTATE_FAILED;
16476
16477 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst,
16478 cport)->cport_mutex);
16479 SATA_LOG_D((sata_hba_inst, CE_WARN,
16480 "sata_hba_ioctl: port activate: cannot activate "
16481 "SATA port %d:%d", cport, pmport));
16482 return (EIO);
16483 }
16484 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, cport)->cport_mutex);
16485 }
16486 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, cport)->cport_mutex);
16487 if (qual == SATA_ADDR_PMPORT) {
16488 mutex_enter(&pmportinfo->pmport_mutex);
16489 pmportinfo->pmport_state &= ~SATA_PSTATE_SHUTDOWN;
16490 mutex_exit(&pmportinfo->pmport_mutex);
16491 } else
16492 cportinfo->cport_state &= ~SATA_PSTATE_SHUTDOWN;
16493 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, cport)->cport_mutex);
16494
16495 /*
16496 * Re-probe port to find its current state and possibly attached device.
16497 * Port re-probing may change the cportinfo device type if device is
16498 * found attached.
16499 * If port probing failed, the device type would be set to
16500 * SATA_DTYPE_NONE.
16501 */
16502 (void) sata_reprobe_port(sata_hba_inst, sata_device,
16503 SATA_DEV_IDENTIFY_RETRY);
16504
16505 /*
16506 * Generate sysevent - EC_DR / ESC_DR_AP_STATE_CHANGE
16507 * without the hint.
16508 */
16509 sata_gen_sysevent(sata_hba_inst, &sata_device->satadev_addr,
16510 SE_NO_HINT);
16511
16512 if (dev_existed == B_FALSE) {
16513 if (qual == SATA_ADDR_PMPORT &&
16514 pmportinfo->pmport_dev_type != SATA_DTYPE_NONE) {
16515 /*
16516 * That's the transition from the "inactive" port state
16517 * or the active port without a device attached to the
16518 * active port state with a device attached.
16519 */
16520 sata_log(sata_hba_inst, CE_WARN,
16521 "SATA device detected at port %d:%d",
16522 cport, pmport);
16523 } else if (qual == SATA_ADDR_CPORT &&
16524 cportinfo->cport_dev_type != SATA_DTYPE_NONE) {
16525 /*
16526 * That's the transition from the "inactive" port state
16527 * or the active port without a device attached to the
16528 * active port state with a device attached.
16529 */
16530 if (cportinfo->cport_dev_type != SATA_DTYPE_PMULT) {
16531 sata_log(sata_hba_inst, CE_WARN,
16532 "SATA device detected at port %d", cport);
16533 } else {
16534 sata_log(sata_hba_inst, CE_WARN,
16535 "SATA port multiplier detected at port %d",
16536 cport);
16537 }
16538 }
16539 }
16540 return (0);
16541 }
16542
16543
16544
16545 /*
16546 * Process ioctl reset port request.
16547 *
16548 * NOTE: Port-Multiplier is supported.
16549 */
16550 static int
sata_ioctl_reset_port(sata_hba_inst_t * sata_hba_inst,sata_device_t * sata_device)16551 sata_ioctl_reset_port(sata_hba_inst_t *sata_hba_inst,
16552 sata_device_t *sata_device)
16553 {
16554 int cport, pmport, qual;
16555 int rv = 0;
16556
16557 cport = sata_device->satadev_addr.cport;
16558 pmport = sata_device->satadev_addr.pmport;
16559 qual = sata_device->satadev_addr.qual;
16560
16561 /*
16562 * The qual translate from ap_id (by SCSI_TO_SATA_ADDR_QUAL())
16563 * is a device. But what we are dealing with is port/pmport.
16564 */
16565 if (qual == SATA_ADDR_DCPORT)
16566 sata_device->satadev_addr.qual = qual = SATA_ADDR_CPORT;
16567 else
16568 sata_device->satadev_addr.qual = qual = SATA_ADDR_PMPORT;
16569 ASSERT(qual == SATA_ADDR_CPORT || qual == SATA_ADDR_PMPORT);
16570
16571 /* Sanity check */
16572 if (SATA_RESET_DPORT_FUNC(sata_hba_inst) == NULL) {
16573 SATA_LOG_D((sata_hba_inst, CE_WARN,
16574 "sata_hba_ioctl: sata_hba_tran missing required "
16575 "function sata_tran_reset_dport"));
16576 return (ENOTSUP);
16577 }
16578
16579 /* Ask HBA to reset port */
16580 if ((*SATA_RESET_DPORT_FUNC(sata_hba_inst))(SATA_DIP(sata_hba_inst),
16581 sata_device) != SATA_SUCCESS) {
16582 SATA_LOG_D((sata_hba_inst, CE_WARN,
16583 "sata_hba_ioctl: reset port: failed %d:%d",
16584 cport, pmport));
16585 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, cport)->
16586 cport_mutex);
16587 sata_update_port_info(sata_hba_inst, sata_device);
16588 if (qual == SATA_ADDR_CPORT)
16589 SATA_CPORT_STATE(sata_hba_inst, cport) =
16590 SATA_PSTATE_FAILED;
16591 else {
16592 mutex_enter(&SATA_PMPORT_MUTEX(sata_hba_inst, cport,
16593 pmport));
16594 SATA_PMPORT_STATE(sata_hba_inst, cport, pmport) =
16595 SATA_PSTATE_FAILED;
16596 mutex_exit(&SATA_PMPORT_MUTEX(sata_hba_inst, cport,
16597 pmport));
16598 }
16599 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, cport)->
16600 cport_mutex);
16601 rv = EIO;
16602 }
16603
16604 return (rv);
16605 }
16606
16607 /*
16608 * Process ioctl reset device request.
16609 *
16610 * NOTE: Port multiplier is supported.
16611 */
16612 static int
sata_ioctl_reset_device(sata_hba_inst_t * sata_hba_inst,sata_device_t * sata_device)16613 sata_ioctl_reset_device(sata_hba_inst_t *sata_hba_inst,
16614 sata_device_t *sata_device)
16615 {
16616 sata_drive_info_t *sdinfo = NULL;
16617 sata_pmult_info_t *pmultinfo = NULL;
16618 int cport, pmport;
16619 int rv = 0;
16620
16621 /* Sanity check */
16622 if (SATA_RESET_DPORT_FUNC(sata_hba_inst) == NULL) {
16623 SATA_LOG_D((sata_hba_inst, CE_WARN,
16624 "sata_hba_ioctl: sata_hba_tran missing required "
16625 "function sata_tran_reset_dport"));
16626 return (ENOTSUP);
16627 }
16628
16629 cport = sata_device->satadev_addr.cport;
16630 pmport = sata_device->satadev_addr.pmport;
16631
16632 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, cport)->cport_mutex);
16633 if (sata_device->satadev_addr.qual == SATA_ADDR_DCPORT) {
16634 if (SATA_CPORT_DEV_TYPE(sata_hba_inst, cport) ==
16635 SATA_DTYPE_PMULT)
16636 pmultinfo = SATA_CPORT_INFO(sata_hba_inst, cport)->
16637 cport_devp.cport_sata_pmult;
16638 else
16639 sdinfo = SATA_CPORT_DRV_INFO(sata_hba_inst,
16640 sata_device->satadev_addr.cport);
16641 } else { /* port multiplier */
16642 sata_device->satadev_addr.qual = SATA_ADDR_DPMPORT;
16643 sdinfo = SATA_PMPORT_DRV_INFO(sata_hba_inst,
16644 sata_device->satadev_addr.cport,
16645 sata_device->satadev_addr.pmport);
16646 }
16647 if (sdinfo == NULL && pmultinfo == NULL) {
16648 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, cport)->cport_mutex);
16649 return (EINVAL);
16650 }
16651 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, cport)->cport_mutex);
16652
16653 /* Ask HBA to reset device */
16654 if ((*SATA_RESET_DPORT_FUNC(sata_hba_inst))
16655 (SATA_DIP(sata_hba_inst), sata_device) != SATA_SUCCESS) {
16656 SATA_LOG_D((sata_hba_inst, CE_WARN,
16657 "sata_hba_ioctl: reset device: failed at port %d:%d",
16658 cport, pmport));
16659 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, cport)->
16660 cport_mutex);
16661 sata_update_port_info(sata_hba_inst, sata_device);
16662 /*
16663 * Device info structure remains attached. Another device reset
16664 * or port disconnect/connect and re-probing is
16665 * needed to change it's state
16666 */
16667 if (sdinfo != NULL) {
16668 sdinfo->satadrv_state &= ~SATA_STATE_READY;
16669 sdinfo->satadrv_state |= SATA_DSTATE_FAILED;
16670 } else if (pmultinfo != NULL) {
16671 pmultinfo->pmult_state &= ~SATA_STATE_READY;
16672 pmultinfo->pmult_state |= SATA_DSTATE_FAILED;
16673 }
16674
16675 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, cport)->cport_mutex);
16676 rv = EIO;
16677 }
16678 /*
16679 * If attached device was a port multiplier, some extra processing
16680 * may be needed to bring it back. SATA specification requies a
16681 * mandatory software reset on host port to reliably enumerate a port
16682 * multiplier, the HBA driver should handle that after reset
16683 * operation.
16684 */
16685 return (rv);
16686 }
16687
16688
16689 /*
16690 * Process ioctl reset all request.
16691 */
16692 static int
sata_ioctl_reset_all(sata_hba_inst_t * sata_hba_inst)16693 sata_ioctl_reset_all(sata_hba_inst_t *sata_hba_inst)
16694 {
16695 sata_device_t sata_device;
16696 int rv = 0;
16697 int tcport;
16698
16699 sata_device.satadev_rev = SATA_DEVICE_REV;
16700
16701 /*
16702 * There is no protection here for configured devices.
16703 */
16704 /* Sanity check */
16705 if (SATA_RESET_DPORT_FUNC(sata_hba_inst) == NULL) {
16706 SATA_LOG_D((sata_hba_inst, CE_WARN,
16707 "sata_hba_ioctl: sata_hba_tran missing required "
16708 "function sata_tran_reset_dport"));
16709 return (ENOTSUP);
16710 }
16711
16712 /*
16713 * Need to lock all ports, not just one.
16714 * If any port is locked by event processing, fail the whole operation.
16715 * One port is already locked, but for simplicity lock it again.
16716 */
16717 for (tcport = 0; tcport < SATA_NUM_CPORTS(sata_hba_inst); tcport++) {
16718 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, tcport)->
16719 cport_mutex);
16720 if (((SATA_CPORT_INFO(sata_hba_inst, tcport)->
16721 cport_event_flags) & SATA_EVNT_LOCK_PORT_BUSY) != 0) {
16722 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, tcport)->
16723 cport_mutex);
16724 rv = EBUSY;
16725 break;
16726 } else {
16727 /*
16728 * It is enough to lock cport in command-based
16729 * switching mode.
16730 */
16731 SATA_CPORT_INFO(sata_hba_inst, tcport)->
16732 cport_event_flags |= SATA_APCTL_LOCK_PORT_BUSY;
16733 }
16734 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, tcport)->
16735 cport_mutex);
16736 }
16737
16738 if (rv == 0) {
16739 /*
16740 * All cports were successfully locked.
16741 * Reset main SATA controller.
16742 * Set the device address to port 0, to have a valid device
16743 * address.
16744 */
16745 sata_device.satadev_addr.qual = SATA_ADDR_CNTRL;
16746 sata_device.satadev_addr.cport = 0;
16747 sata_device.satadev_addr.pmport = 0;
16748
16749 if ((*SATA_RESET_DPORT_FUNC(sata_hba_inst))
16750 (SATA_DIP(sata_hba_inst), &sata_device) != SATA_SUCCESS) {
16751 SATA_LOG_D((sata_hba_inst, CE_WARN,
16752 "sata_hba_ioctl: reset controller failed"));
16753 return (EIO);
16754 }
16755 }
16756 /*
16757 * Unlock all ports
16758 */
16759 for (tcport = 0; tcport < SATA_NUM_CPORTS(sata_hba_inst); tcport++) {
16760 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, tcport)->
16761 cport_mutex);
16762 SATA_CPORT_INFO(sata_hba_inst, tcport)->
16763 cport_event_flags &= ~SATA_APCTL_LOCK_PORT_BUSY;
16764 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, tcport)->
16765 cport_mutex);
16766 }
16767
16768 /*
16769 * This operation returns EFAULT if either reset
16770 * controller failed or a re-probing of any port failed.
16771 */
16772 return (rv);
16773 }
16774
16775
16776 /*
16777 * Process ioctl port self test request.
16778 *
16779 * NOTE: Port multiplier code is not completed nor tested.
16780 */
16781 static int
sata_ioctl_port_self_test(sata_hba_inst_t * sata_hba_inst,sata_device_t * sata_device)16782 sata_ioctl_port_self_test(sata_hba_inst_t *sata_hba_inst,
16783 sata_device_t *sata_device)
16784 {
16785 int cport, pmport, qual;
16786 int rv = 0;
16787
16788 /* Sanity check */
16789 if (SATA_SELFTEST_FUNC(sata_hba_inst) == NULL)
16790 return (ENOTSUP);
16791
16792 cport = sata_device->satadev_addr.cport;
16793 pmport = sata_device->satadev_addr.pmport;
16794 qual = sata_device->satadev_addr.qual;
16795
16796 /*
16797 * There is no protection here for a configured
16798 * device attached to this port.
16799 */
16800
16801 if ((*SATA_SELFTEST_FUNC(sata_hba_inst))
16802 (SATA_DIP(sata_hba_inst), sata_device) != SATA_SUCCESS) {
16803 SATA_LOG_D((sata_hba_inst, CE_WARN,
16804 "sata_hba_ioctl: port selftest: "
16805 "failed port %d:%d", cport, pmport));
16806 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, cport)->
16807 cport_mutex);
16808 sata_update_port_info(sata_hba_inst, sata_device);
16809 if (qual == SATA_ADDR_CPORT)
16810 SATA_CPORT_STATE(sata_hba_inst, cport) =
16811 SATA_PSTATE_FAILED;
16812 else { /* port multiplier device port */
16813 mutex_enter(&SATA_PMPORT_MUTEX(sata_hba_inst,
16814 cport, pmport));
16815 SATA_PMPORT_STATE(sata_hba_inst, cport, pmport) =
16816 SATA_PSTATE_FAILED;
16817 mutex_exit(&SATA_PMPORT_MUTEX(sata_hba_inst,
16818 cport, pmport));
16819 }
16820
16821 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, cport)->
16822 cport_mutex);
16823 return (EIO);
16824 }
16825 /*
16826 * Beacuse the port was reset in the course of testing, it should be
16827 * re-probed and attached device state should be restored. At this
16828 * point the port state is unknown - it's state is HBA-specific.
16829 * Force port re-probing to get it into a known state.
16830 */
16831 if (sata_reprobe_port(sata_hba_inst, sata_device,
16832 SATA_DEV_IDENTIFY_RETRY) != SATA_SUCCESS)
16833 rv = EIO;
16834 return (rv);
16835 }
16836
16837
16838 /*
16839 * sata_cfgadm_state:
16840 * Use the sata port state and state of the target node to figure out
16841 * the cfgadm_state.
16842 *
16843 * The port argument is a value with encoded cport,
16844 * pmport and address qualifier, in the same manner as a scsi target number.
16845 * SCSI_TO_SATA_CPORT macro extracts cport number,
16846 * SCSI_TO_SATA_PMPORT extracts pmport number and
16847 * SCSI_TO_SATA_ADDR_QUAL extracts port mulitplier qualifier flag.
16848 *
16849 * Port multiplier is supported.
16850 */
16851
16852 static void
sata_cfgadm_state(sata_hba_inst_t * sata_hba_inst,int32_t port,devctl_ap_state_t * ap_state)16853 sata_cfgadm_state(sata_hba_inst_t *sata_hba_inst, int32_t port,
16854 devctl_ap_state_t *ap_state)
16855 {
16856 uint8_t cport, pmport, qual;
16857 uint32_t port_state, pmult_state;
16858 uint32_t dev_type;
16859 sata_drive_info_t *sdinfo;
16860
16861 cport = SCSI_TO_SATA_CPORT(port);
16862 pmport = SCSI_TO_SATA_PMPORT(port);
16863 qual = SCSI_TO_SATA_ADDR_QUAL(port);
16864
16865 /* Check cport state */
16866 port_state = SATA_CPORT_STATE(sata_hba_inst, cport);
16867 if (port_state & SATA_PSTATE_SHUTDOWN ||
16868 port_state & SATA_PSTATE_FAILED) {
16869 ap_state->ap_rstate = AP_RSTATE_DISCONNECTED;
16870 ap_state->ap_ostate = AP_OSTATE_UNCONFIGURED;
16871 if (port_state & SATA_PSTATE_FAILED)
16872 ap_state->ap_condition = AP_COND_FAILED;
16873 else
16874 ap_state->ap_condition = AP_COND_UNKNOWN;
16875
16876 return;
16877 }
16878
16879 /* cport state is okay. Now check pmport state */
16880 if (qual == SATA_ADDR_DPMPORT || qual == SATA_ADDR_PMPORT) {
16881 /* Sanity check */
16882 if (SATA_CPORT_DEV_TYPE(sata_hba_inst, cport) !=
16883 SATA_DTYPE_PMULT || SATA_PMPORT_INFO(sata_hba_inst,
16884 cport, pmport) == NULL)
16885 return;
16886 port_state = SATA_PMPORT_STATE(sata_hba_inst, cport, pmport);
16887 if (port_state & SATA_PSTATE_SHUTDOWN ||
16888 port_state & SATA_PSTATE_FAILED) {
16889 ap_state->ap_rstate = AP_RSTATE_DISCONNECTED;
16890 ap_state->ap_ostate = AP_OSTATE_UNCONFIGURED;
16891 if (port_state & SATA_PSTATE_FAILED)
16892 ap_state->ap_condition = AP_COND_FAILED;
16893 else
16894 ap_state->ap_condition = AP_COND_UNKNOWN;
16895
16896 return;
16897 }
16898 }
16899
16900 /* Port is enabled and ready */
16901 if (qual == SATA_ADDR_DCPORT || qual == SATA_ADDR_CPORT)
16902 dev_type = SATA_CPORT_DEV_TYPE(sata_hba_inst, cport);
16903 else
16904 dev_type = SATA_PMPORT_DEV_TYPE(sata_hba_inst, cport, pmport);
16905
16906 switch (dev_type) {
16907 case SATA_DTYPE_NONE:
16908 {
16909 ap_state->ap_ostate = AP_OSTATE_UNCONFIGURED;
16910 ap_state->ap_condition = AP_COND_OK;
16911 /* No device attached */
16912 ap_state->ap_rstate = AP_RSTATE_EMPTY;
16913 break;
16914 }
16915 case SATA_DTYPE_PMULT:
16916 {
16917 /* Need to check port multiplier state */
16918 ASSERT(qual == SATA_ADDR_DCPORT);
16919 pmult_state = SATA_PMULT_INFO(sata_hba_inst, cport)->
16920 pmult_state;
16921 if (pmult_state & (SATA_PSTATE_SHUTDOWN|SATA_PSTATE_FAILED)) {
16922 ap_state->ap_rstate = AP_RSTATE_DISCONNECTED;
16923 ap_state->ap_ostate = AP_OSTATE_UNCONFIGURED;
16924 if (pmult_state & SATA_PSTATE_FAILED)
16925 ap_state->ap_condition = AP_COND_FAILED;
16926 else
16927 ap_state->ap_condition = AP_COND_UNKNOWN;
16928
16929 return;
16930 }
16931
16932 /* Port multiplier is not configurable */
16933 ap_state->ap_ostate = AP_OSTATE_CONFIGURED;
16934 ap_state->ap_rstate = AP_RSTATE_CONNECTED;
16935 ap_state->ap_condition = AP_COND_OK;
16936 break;
16937 }
16938
16939 case SATA_DTYPE_ATADISK:
16940 case SATA_DTYPE_ATAPICD:
16941 case SATA_DTYPE_ATAPITAPE:
16942 case SATA_DTYPE_ATAPIDISK:
16943 {
16944 dev_info_t *tdip = NULL;
16945 dev_info_t *dip = NULL;
16946
16947 dip = SATA_DIP(sata_hba_inst);
16948 tdip = sata_get_target_dip(dip, cport, pmport);
16949 ap_state->ap_rstate = AP_RSTATE_CONNECTED;
16950 if (tdip != NULL) {
16951 ndi_devi_enter(dip);
16952 mutex_enter(&(DEVI(tdip)->devi_lock));
16953 if (DEVI_IS_DEVICE_REMOVED(tdip)) {
16954 /*
16955 * There could be the case where previously
16956 * configured and opened device was removed
16957 * and unknown device was plugged.
16958 * In such case we want to show a device, and
16959 * its configured or unconfigured state but
16960 * indicate unusable condition untill the
16961 * old target node is released and removed.
16962 */
16963 ap_state->ap_condition = AP_COND_UNUSABLE;
16964 } else {
16965 mutex_enter(&SATA_CPORT_MUTEX(sata_hba_inst,
16966 cport));
16967 sdinfo = SATA_CPORT_DRV_INFO(sata_hba_inst,
16968 cport);
16969 if (sdinfo != NULL) {
16970 if ((sdinfo->satadrv_state &
16971 SATA_DSTATE_FAILED) != 0)
16972 ap_state->ap_condition =
16973 AP_COND_FAILED;
16974 else
16975 ap_state->ap_condition =
16976 AP_COND_OK;
16977 } else {
16978 ap_state->ap_condition =
16979 AP_COND_UNKNOWN;
16980 }
16981 mutex_exit(&SATA_CPORT_MUTEX(sata_hba_inst,
16982 cport));
16983 }
16984 if ((DEVI_IS_DEVICE_OFFLINE(tdip)) ||
16985 (DEVI_IS_DEVICE_DOWN(tdip))) {
16986 ap_state->ap_ostate =
16987 AP_OSTATE_UNCONFIGURED;
16988 } else {
16989 ap_state->ap_ostate =
16990 AP_OSTATE_CONFIGURED;
16991 }
16992 mutex_exit(&(DEVI(tdip)->devi_lock));
16993 ndi_devi_exit(dip);
16994 } else {
16995 ap_state->ap_ostate = AP_OSTATE_UNCONFIGURED;
16996 ap_state->ap_condition = AP_COND_UNKNOWN;
16997 }
16998 break;
16999 }
17000 case SATA_DTYPE_ATAPIPROC:
17001 ap_state->ap_rstate = AP_RSTATE_CONNECTED;
17002 ap_state->ap_ostate = AP_OSTATE_UNCONFIGURED;
17003 ap_state->ap_condition = AP_COND_OK;
17004 break;
17005 default:
17006 ap_state->ap_rstate = AP_RSTATE_CONNECTED;
17007 ap_state->ap_ostate = AP_OSTATE_UNCONFIGURED;
17008 ap_state->ap_condition = AP_COND_UNKNOWN;
17009 /*
17010 * This is actually internal error condition (non fatal),
17011 * because we have already checked all defined device types.
17012 */
17013 SATA_LOG_D((sata_hba_inst, CE_WARN,
17014 "sata_cfgadm_state: Internal error: "
17015 "unknown device type"));
17016 break;
17017 }
17018 }
17019
17020
17021 /*
17022 * Process ioctl get device path request.
17023 *
17024 * NOTE: Port multiplier has no target dip. Devices connected to port
17025 * multiplier have target node attached to the HBA node. The only difference
17026 * between them and the directly-attached device node is a target address.
17027 */
17028 static int
sata_ioctl_get_device_path(sata_hba_inst_t * sata_hba_inst,sata_device_t * sata_device,sata_ioctl_data_t * ioc,int mode)17029 sata_ioctl_get_device_path(sata_hba_inst_t *sata_hba_inst,
17030 sata_device_t *sata_device, sata_ioctl_data_t *ioc, int mode)
17031 {
17032 char path[MAXPATHLEN];
17033 uint32_t size;
17034 dev_info_t *tdip;
17035
17036 (void) strcpy(path, "/devices");
17037 if ((tdip = sata_get_scsi_target_dip(SATA_DIP(sata_hba_inst),
17038 &sata_device->satadev_addr)) == NULL) {
17039 /*
17040 * No such device. If this is a request for a size, do not
17041 * return EINVAL for non-existing target, because cfgadm
17042 * will then indicate a meaningless ioctl failure.
17043 * If this is a request for a path, indicate invalid
17044 * argument.
17045 */
17046 if (ioc->get_size == 0)
17047 return (EINVAL);
17048 } else {
17049 (void) ddi_pathname(tdip, path + strlen(path));
17050 }
17051 size = strlen(path) + 1;
17052
17053 if (ioc->get_size != 0) {
17054 if (ddi_copyout((void *)&size, ioc->buf, ioc->bufsiz,
17055 mode) != 0)
17056 return (EFAULT);
17057 } else {
17058 if (ioc->bufsiz != size)
17059 return (EINVAL);
17060
17061 else if (ddi_copyout((void *)&path, ioc->buf, ioc->bufsiz,
17062 mode) != 0)
17063 return (EFAULT);
17064 }
17065 return (0);
17066 }
17067
17068 /*
17069 * Process ioctl get attachment point type request.
17070 *
17071 * NOTE: Port multiplier is supported.
17072 */
17073 static int
sata_ioctl_get_ap_type(sata_hba_inst_t * sata_hba_inst,sata_device_t * sata_device,sata_ioctl_data_t * ioc,int mode)17074 sata_ioctl_get_ap_type(sata_hba_inst_t *sata_hba_inst,
17075 sata_device_t *sata_device, sata_ioctl_data_t *ioc, int mode)
17076 {
17077 uint32_t type_len;
17078 const char *ap_type;
17079 int dev_type;
17080
17081 if (sata_device->satadev_addr.qual == SATA_ADDR_DCPORT)
17082 dev_type = SATA_CPORT_DEV_TYPE(sata_hba_inst,
17083 sata_device->satadev_addr.cport);
17084 else /* pmport */
17085 dev_type = SATA_PMPORT_DEV_TYPE(sata_hba_inst,
17086 sata_device->satadev_addr.cport,
17087 sata_device->satadev_addr.pmport);
17088
17089 switch (dev_type) {
17090 case SATA_DTYPE_NONE:
17091 ap_type = "port";
17092 break;
17093
17094 case SATA_DTYPE_ATADISK:
17095 case SATA_DTYPE_ATAPIDISK:
17096 ap_type = "disk";
17097 break;
17098
17099 case SATA_DTYPE_ATAPICD:
17100 ap_type = "cd/dvd";
17101 break;
17102
17103 case SATA_DTYPE_ATAPITAPE:
17104 ap_type = "tape";
17105 break;
17106
17107 case SATA_DTYPE_ATAPIPROC:
17108 ap_type = "processor";
17109 break;
17110
17111 case SATA_DTYPE_PMULT:
17112 ap_type = "sata-pmult";
17113 break;
17114
17115 case SATA_DTYPE_UNKNOWN:
17116 ap_type = "unknown";
17117 break;
17118
17119 default:
17120 ap_type = "unsupported";
17121 break;
17122
17123 } /* end of dev_type switch */
17124
17125 type_len = strlen(ap_type) + 1;
17126
17127 if (ioc->get_size) {
17128 if (ddi_copyout((void *)&type_len, ioc->buf, ioc->bufsiz,
17129 mode) != 0)
17130 return (EFAULT);
17131 } else {
17132 if (ioc->bufsiz != type_len)
17133 return (EINVAL);
17134
17135 if (ddi_copyout((void *)ap_type, ioc->buf,
17136 ioc->bufsiz, mode) != 0)
17137 return (EFAULT);
17138 }
17139 return (0);
17140
17141 }
17142
17143 /*
17144 * Process ioctl get device model info request.
17145 * This operation should return to cfgadm the device model
17146 * information string
17147 *
17148 * NOTE: Port multiplier is supported.
17149 */
17150 static int
sata_ioctl_get_model_info(sata_hba_inst_t * sata_hba_inst,sata_device_t * sata_device,sata_ioctl_data_t * ioc,int mode)17151 sata_ioctl_get_model_info(sata_hba_inst_t *sata_hba_inst,
17152 sata_device_t *sata_device, sata_ioctl_data_t *ioc, int mode)
17153 {
17154 sata_drive_info_t *sdinfo;
17155 uint32_t info_len;
17156 char ap_info[SATA_ID_MODEL_LEN + 1];
17157
17158 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst,
17159 sata_device->satadev_addr.cport)->cport_mutex);
17160 if (sata_device->satadev_addr.qual == SATA_ADDR_DCPORT)
17161 sdinfo = SATA_CPORT_DRV_INFO(sata_hba_inst,
17162 sata_device->satadev_addr.cport);
17163 else /* port multiplier */
17164 sdinfo = SATA_PMPORT_DRV_INFO(sata_hba_inst,
17165 sata_device->satadev_addr.cport,
17166 sata_device->satadev_addr.pmport);
17167 if (sdinfo == NULL) {
17168 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst,
17169 sata_device->satadev_addr.cport)->cport_mutex);
17170 return (EINVAL);
17171 }
17172
17173 #ifdef _LITTLE_ENDIAN
17174 swab(sdinfo->satadrv_id.ai_model, ap_info, SATA_ID_MODEL_LEN);
17175 #else /* _LITTLE_ENDIAN */
17176 bcopy(sdinfo->satadrv_id.ai_model, ap_info, SATA_ID_MODEL_LEN);
17177 #endif /* _LITTLE_ENDIAN */
17178
17179 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst,
17180 sata_device->satadev_addr.cport)->cport_mutex);
17181
17182 ap_info[SATA_ID_MODEL_LEN] = '\0';
17183
17184 info_len = strlen(ap_info) + 1;
17185
17186 if (ioc->get_size) {
17187 if (ddi_copyout((void *)&info_len, ioc->buf, ioc->bufsiz,
17188 mode) != 0)
17189 return (EFAULT);
17190 } else {
17191 if (ioc->bufsiz < info_len)
17192 return (EINVAL);
17193 if (ddi_copyout((void *)ap_info, ioc->buf, ioc->bufsiz,
17194 mode) != 0)
17195 return (EFAULT);
17196 }
17197 return (0);
17198 }
17199
17200
17201 /*
17202 * Process ioctl get device firmware revision info request.
17203 * This operation should return to cfgadm the device firmware revision
17204 * information string
17205 *
17206 * Port multiplier is supported.
17207 */
17208 static int
sata_ioctl_get_revfirmware_info(sata_hba_inst_t * sata_hba_inst,sata_device_t * sata_device,sata_ioctl_data_t * ioc,int mode)17209 sata_ioctl_get_revfirmware_info(sata_hba_inst_t *sata_hba_inst,
17210 sata_device_t *sata_device, sata_ioctl_data_t *ioc, int mode)
17211 {
17212 sata_drive_info_t *sdinfo;
17213 uint32_t info_len;
17214 char ap_info[SATA_ID_FW_LEN + 1];
17215
17216 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst,
17217 sata_device->satadev_addr.cport)->cport_mutex);
17218 if (sata_device->satadev_addr.qual == SATA_ADDR_DCPORT)
17219 sdinfo = SATA_CPORT_DRV_INFO(sata_hba_inst,
17220 sata_device->satadev_addr.cport);
17221 else /* port multiplier */
17222 sdinfo = SATA_PMPORT_DRV_INFO(sata_hba_inst,
17223 sata_device->satadev_addr.cport,
17224 sata_device->satadev_addr.pmport);
17225 if (sdinfo == NULL) {
17226 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst,
17227 sata_device->satadev_addr.cport)->cport_mutex);
17228 return (EINVAL);
17229 }
17230
17231 #ifdef _LITTLE_ENDIAN
17232 swab(sdinfo->satadrv_id.ai_fw, ap_info, SATA_ID_FW_LEN);
17233 #else /* _LITTLE_ENDIAN */
17234 bcopy(sdinfo->satadrv_id.ai_fw, ap_info, SATA_ID_FW_LEN);
17235 #endif /* _LITTLE_ENDIAN */
17236
17237 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst,
17238 sata_device->satadev_addr.cport)->cport_mutex);
17239
17240 ap_info[SATA_ID_FW_LEN] = '\0';
17241
17242 info_len = strlen(ap_info) + 1;
17243
17244 if (ioc->get_size) {
17245 if (ddi_copyout((void *)&info_len, ioc->buf, ioc->bufsiz,
17246 mode) != 0)
17247 return (EFAULT);
17248 } else {
17249 if (ioc->bufsiz < info_len)
17250 return (EINVAL);
17251 if (ddi_copyout((void *)ap_info, ioc->buf, ioc->bufsiz,
17252 mode) != 0)
17253 return (EFAULT);
17254 }
17255 return (0);
17256 }
17257
17258
17259 /*
17260 * Process ioctl get device serial number info request.
17261 * This operation should return to cfgadm the device serial number string.
17262 *
17263 * NOTE: Port multiplier is supported.
17264 */
17265 static int
sata_ioctl_get_serialnumber_info(sata_hba_inst_t * sata_hba_inst,sata_device_t * sata_device,sata_ioctl_data_t * ioc,int mode)17266 sata_ioctl_get_serialnumber_info(sata_hba_inst_t *sata_hba_inst,
17267 sata_device_t *sata_device, sata_ioctl_data_t *ioc, int mode)
17268 {
17269 sata_drive_info_t *sdinfo;
17270 uint32_t info_len;
17271 char ap_info[SATA_ID_SERIAL_LEN + 1];
17272
17273 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst,
17274 sata_device->satadev_addr.cport)->cport_mutex);
17275 if (sata_device->satadev_addr.qual == SATA_ADDR_DCPORT)
17276 sdinfo = SATA_CPORT_DRV_INFO(sata_hba_inst,
17277 sata_device->satadev_addr.cport);
17278 else /* port multiplier */
17279 sdinfo = SATA_PMPORT_DRV_INFO(sata_hba_inst,
17280 sata_device->satadev_addr.cport,
17281 sata_device->satadev_addr.pmport);
17282 if (sdinfo == NULL) {
17283 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst,
17284 sata_device->satadev_addr.cport)->cport_mutex);
17285 return (EINVAL);
17286 }
17287
17288 #ifdef _LITTLE_ENDIAN
17289 swab(sdinfo->satadrv_id.ai_drvser, ap_info, SATA_ID_SERIAL_LEN);
17290 #else /* _LITTLE_ENDIAN */
17291 bcopy(sdinfo->satadrv_id.ai_drvser, ap_info, SATA_ID_SERIAL_LEN);
17292 #endif /* _LITTLE_ENDIAN */
17293
17294 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst,
17295 sata_device->satadev_addr.cport)->cport_mutex);
17296
17297 ap_info[SATA_ID_SERIAL_LEN] = '\0';
17298
17299 info_len = strlen(ap_info) + 1;
17300
17301 if (ioc->get_size) {
17302 if (ddi_copyout((void *)&info_len, ioc->buf, ioc->bufsiz,
17303 mode) != 0)
17304 return (EFAULT);
17305 } else {
17306 if (ioc->bufsiz < info_len)
17307 return (EINVAL);
17308 if (ddi_copyout((void *)ap_info, ioc->buf, ioc->bufsiz,
17309 mode) != 0)
17310 return (EFAULT);
17311 }
17312 return (0);
17313 }
17314
17315
17316 /*
17317 * Preset scsi extended sense data (to NO SENSE)
17318 * First 18 bytes of the sense data are preset to current valid sense
17319 * with a key NO SENSE data.
17320 *
17321 * Returns void
17322 */
17323 static void
sata_fixed_sense_data_preset(struct scsi_extended_sense * sense)17324 sata_fixed_sense_data_preset(struct scsi_extended_sense *sense)
17325 {
17326 sense->es_valid = 1; /* Valid sense */
17327 sense->es_class = CLASS_EXTENDED_SENSE; /* 0x70 - current err */
17328 sense->es_key = KEY_NO_SENSE;
17329 sense->es_info_1 = 0;
17330 sense->es_info_2 = 0;
17331 sense->es_info_3 = 0;
17332 sense->es_info_4 = 0;
17333 sense->es_add_len = 10; /* Additional length - replace with a def */
17334 sense->es_cmd_info[0] = 0;
17335 sense->es_cmd_info[1] = 0;
17336 sense->es_cmd_info[2] = 0;
17337 sense->es_cmd_info[3] = 0;
17338 sense->es_add_code = 0;
17339 sense->es_qual_code = 0;
17340 }
17341
17342 /*
17343 * Register a legacy cmdk-style devid for the target (disk) device.
17344 *
17345 * Note: This function is called only when the HBA devinfo node has the
17346 * property "use-cmdk-devid-format" set. This property indicates that
17347 * devid compatible with old cmdk (target) driver is to be generated
17348 * for any target device attached to this controller. This will take
17349 * precedence over the devid generated by sd (target) driver.
17350 * This function is derived from cmdk_devid_setup() function in cmdk.c.
17351 */
17352 static void
sata_target_devid_register(dev_info_t * dip,sata_drive_info_t * sdinfo)17353 sata_target_devid_register(dev_info_t *dip, sata_drive_info_t *sdinfo)
17354 {
17355 char *hwid;
17356 int modlen;
17357 int serlen;
17358 int rval;
17359 ddi_devid_t devid;
17360
17361 /*
17362 * device ID is a concatanation of model number, "=", serial number.
17363 */
17364 hwid = kmem_zalloc(LEGACY_HWID_LEN, KM_SLEEP);
17365 bcopy(&sdinfo->satadrv_id.ai_model, hwid,
17366 sizeof (sdinfo->satadrv_id.ai_model));
17367 swab(hwid, hwid, sizeof (sdinfo->satadrv_id.ai_model));
17368 modlen = sata_check_modser(hwid, sizeof (sdinfo->satadrv_id.ai_model));
17369 if (modlen == 0)
17370 goto err;
17371 hwid[modlen++] = '=';
17372 bcopy(&sdinfo->satadrv_id.ai_drvser, &hwid[modlen],
17373 sizeof (sdinfo->satadrv_id.ai_drvser));
17374 swab(&hwid[modlen], &hwid[modlen],
17375 sizeof (sdinfo->satadrv_id.ai_drvser));
17376 serlen = sata_check_modser(&hwid[modlen],
17377 sizeof (sdinfo->satadrv_id.ai_drvser));
17378 if (serlen == 0)
17379 goto err;
17380 hwid[modlen + serlen] = 0; /* terminate the hwid string */
17381
17382 /* initialize/register devid */
17383 if ((rval = ddi_devid_init(dip, DEVID_ATA_SERIAL,
17384 (ushort_t)(modlen + serlen), hwid, &devid)) == DDI_SUCCESS) {
17385 rval = ddi_devid_register(dip, devid);
17386 /*
17387 * Free up the allocated devid buffer.
17388 * NOTE: This doesn't mean unregistering devid.
17389 */
17390 ddi_devid_free(devid);
17391 }
17392
17393 if (rval != DDI_SUCCESS)
17394 cmn_err(CE_WARN, "sata: failed to create devid for the disk"
17395 " on port %d", sdinfo->satadrv_addr.cport);
17396 err:
17397 kmem_free(hwid, LEGACY_HWID_LEN);
17398 }
17399
17400 /*
17401 * valid model/serial string must contain a non-zero non-space characters.
17402 * trim trailing spaces/NULLs.
17403 */
17404 static int
sata_check_modser(char * buf,int buf_len)17405 sata_check_modser(char *buf, int buf_len)
17406 {
17407 boolean_t ret;
17408 char *s;
17409 int i;
17410 int tb = 0;
17411 char ch;
17412
17413 ret = B_FALSE;
17414 s = buf;
17415 for (i = 0; i < buf_len; i++) {
17416 ch = *s++;
17417 if (ch != ' ' && ch != '\0')
17418 tb = i + 1;
17419 if (ch != ' ' && ch != '\0' && ch != '0')
17420 ret = B_TRUE;
17421 }
17422
17423 if (ret == B_FALSE)
17424 return (0); /* invalid string */
17425
17426 return (tb); /* return length */
17427 }
17428
17429 /*
17430 * sata_set_drive_features function compares current device features setting
17431 * with the saved device features settings and, if there is a difference,
17432 * it restores device features setting to the previously saved state.
17433 * It also arbitrarily tries to select the highest supported DMA mode.
17434 * Device Identify or Identify Packet Device data has to be current.
17435 * At the moment read ahead and write cache are considered for all devices.
17436 * For atapi devices, Removable Media Status Notification is set in addition
17437 * to common features.
17438 *
17439 * This function cannot be called in the interrupt context (it may sleep).
17440 *
17441 * The input argument sdinfo should point to the drive info structure
17442 * to be updated after features are set. Note, that only
17443 * device (packet) identify data is updated, not the flags indicating the
17444 * supported features.
17445 *
17446 * Returns SATA_SUCCESS if successful or there was nothing to do.
17447 * Device Identify data in the drive info structure pointed to by the sdinfo
17448 * arguments is updated even when no features were set or changed.
17449 *
17450 * Returns SATA_FAILURE if device features could not be set or DMA mode
17451 * for a disk cannot be set and device identify data cannot be fetched.
17452 *
17453 * Returns SATA_RETRY if device features could not be set (other than disk
17454 * DMA mode) but the device identify data was fetched successfully.
17455 *
17456 * Note: This function may fail the port, making it inaccessible.
17457 * In such case the explicit port disconnect/connect or physical device
17458 * detach/attach is required to re-evaluate port state again.
17459 */
17460
17461 static int
sata_set_drive_features(sata_hba_inst_t * sata_hba_inst,sata_drive_info_t * sdinfo,int restore)17462 sata_set_drive_features(sata_hba_inst_t *sata_hba_inst,
17463 sata_drive_info_t *sdinfo, int restore)
17464 {
17465 int rval = SATA_SUCCESS;
17466 int rval_set;
17467 sata_drive_info_t new_sdinfo;
17468 char *finfo = "sata_set_drive_features: cannot";
17469 char *finfox;
17470 int cache_op;
17471
17472 bzero(&new_sdinfo, sizeof (sata_drive_info_t));
17473 new_sdinfo.satadrv_addr = sdinfo->satadrv_addr;
17474 new_sdinfo.satadrv_type = sdinfo->satadrv_type;
17475 if (sata_fetch_device_identify_data(sata_hba_inst, &new_sdinfo) != 0) {
17476 /*
17477 * Cannot get device identification - caller may retry later
17478 */
17479 SATADBG1(SATA_DBG_DEV_SETTINGS, sata_hba_inst,
17480 "%s fetch device identify data\n", finfo);
17481 return (SATA_FAILURE);
17482 }
17483 finfox = (restore != 0) ? " restore device features" :
17484 " initialize device features\n";
17485
17486 switch (sdinfo->satadrv_type) {
17487 case SATA_DTYPE_ATADISK:
17488 /* Arbitrarily set UDMA mode */
17489 if (sata_set_dma_mode(sata_hba_inst, &new_sdinfo) !=
17490 SATA_SUCCESS) {
17491 SATA_LOG_D((sata_hba_inst, CE_WARN,
17492 "%s set UDMA mode\n", finfo));
17493 return (SATA_FAILURE);
17494 }
17495 break;
17496 case SATA_DTYPE_ATAPICD:
17497 case SATA_DTYPE_ATAPITAPE:
17498 case SATA_DTYPE_ATAPIDISK:
17499 /* Set Removable Media Status Notification, if necessary */
17500 if (SATA_RM_NOTIFIC_SUPPORTED(new_sdinfo.satadrv_id) &&
17501 restore != 0) {
17502 if (((sdinfo->satadrv_settings & SATA_DEV_RMSN) &&
17503 (!SATA_RM_NOTIFIC_ENABLED(new_sdinfo.satadrv_id)))||
17504 ((!(sdinfo->satadrv_settings & SATA_DEV_RMSN)) &&
17505 SATA_RM_NOTIFIC_ENABLED(new_sdinfo.satadrv_id))) {
17506 /* Current setting does not match saved one */
17507 if (sata_set_rmsn(sata_hba_inst, sdinfo,
17508 sdinfo->satadrv_settings &
17509 SATA_DEV_RMSN) != SATA_SUCCESS)
17510 rval = SATA_FAILURE;
17511 }
17512 }
17513 /*
17514 * We have to set Multiword DMA or UDMA, if it is supported, as
17515 * we want to use DMA transfer mode whenever possible.
17516 * Some devices require explicit setting of the DMA mode.
17517 */
17518 if (new_sdinfo.satadrv_id.ai_cap & SATA_DMA_SUPPORT) {
17519 /* Set highest supported DMA mode */
17520 if (sata_set_dma_mode(sata_hba_inst, &new_sdinfo) !=
17521 SATA_SUCCESS) {
17522 SATA_LOG_D((sata_hba_inst, CE_WARN,
17523 "%s set UDMA mode\n", finfo));
17524 rval = SATA_FAILURE;
17525 }
17526 }
17527 break;
17528 }
17529
17530 if (!SATA_READ_AHEAD_SUPPORTED(new_sdinfo.satadrv_id) &&
17531 !SATA_WRITE_CACHE_SUPPORTED(new_sdinfo.satadrv_id)) {
17532 /*
17533 * neither READ AHEAD nor WRITE CACHE is supported
17534 * - do nothing
17535 */
17536 SATADBG1(SATA_DBG_DEV_SETTINGS, sata_hba_inst,
17537 "settable features not supported\n", NULL);
17538 goto update_sdinfo;
17539 }
17540
17541 if ((SATA_READ_AHEAD_ENABLED(new_sdinfo.satadrv_id) &&
17542 (sdinfo->satadrv_settings & SATA_DEV_READ_AHEAD)) &&
17543 (SATA_WRITE_CACHE_ENABLED(new_sdinfo.satadrv_id) &&
17544 (sdinfo->satadrv_settings & SATA_DEV_WRITE_CACHE))) {
17545 /*
17546 * both READ AHEAD and WRITE CACHE are enabled
17547 * - Nothing to do
17548 */
17549 SATADBG1(SATA_DBG_DEV_SETTINGS, sata_hba_inst,
17550 "no device features to set\n", NULL);
17551 goto update_sdinfo;
17552 }
17553
17554 cache_op = 0;
17555
17556 if (SATA_READ_AHEAD_SUPPORTED(new_sdinfo.satadrv_id)) {
17557 if ((sdinfo->satadrv_settings & SATA_DEV_READ_AHEAD) &&
17558 !SATA_READ_AHEAD_ENABLED(new_sdinfo.satadrv_id)) {
17559 /* Enable read ahead / read cache */
17560 cache_op = SATAC_SF_ENABLE_READ_AHEAD;
17561 SATADBG1(SATA_DBG_DEV_SETTINGS, sata_hba_inst,
17562 "enabling read cache\n", NULL);
17563 } else if (!(sdinfo->satadrv_settings & SATA_DEV_READ_AHEAD) &&
17564 SATA_READ_AHEAD_ENABLED(new_sdinfo.satadrv_id)) {
17565 /* Disable read ahead / read cache */
17566 cache_op = SATAC_SF_DISABLE_READ_AHEAD;
17567 SATADBG1(SATA_DBG_DEV_SETTINGS, sata_hba_inst,
17568 "disabling read cache\n", NULL);
17569 }
17570
17571 if (cache_op != 0) {
17572 /* Try to set read cache mode */
17573 rval_set = sata_set_cache_mode(sata_hba_inst,
17574 &new_sdinfo, cache_op);
17575 if (rval != SATA_FAILURE && rval_set != SATA_SUCCESS)
17576 rval = rval_set;
17577 }
17578 }
17579
17580 cache_op = 0;
17581
17582 if (SATA_WRITE_CACHE_SUPPORTED(new_sdinfo.satadrv_id)) {
17583 if ((sdinfo->satadrv_settings & SATA_DEV_WRITE_CACHE) &&
17584 !SATA_WRITE_CACHE_ENABLED(new_sdinfo.satadrv_id)) {
17585 /* Enable write cache */
17586 cache_op = SATAC_SF_ENABLE_WRITE_CACHE;
17587 SATADBG1(SATA_DBG_DEV_SETTINGS, sata_hba_inst,
17588 "enabling write cache\n", NULL);
17589 } else if (!(sdinfo->satadrv_settings & SATA_DEV_WRITE_CACHE) &&
17590 SATA_WRITE_CACHE_ENABLED(new_sdinfo.satadrv_id)) {
17591 /* Disable write cache */
17592 cache_op = SATAC_SF_DISABLE_WRITE_CACHE;
17593 SATADBG1(SATA_DBG_DEV_SETTINGS, sata_hba_inst,
17594 "disabling write cache\n", NULL);
17595 }
17596
17597 if (cache_op != 0) {
17598 /* Try to set write cache mode */
17599 rval_set = sata_set_cache_mode(sata_hba_inst,
17600 &new_sdinfo, cache_op);
17601 if (rval != SATA_FAILURE && rval_set != SATA_SUCCESS)
17602 rval = rval_set;
17603 }
17604 }
17605 if (rval != SATA_SUCCESS)
17606 SATA_LOG_D((sata_hba_inst, CE_WARN,
17607 "%s %s", finfo, finfox));
17608
17609 update_sdinfo:
17610 /*
17611 * We need to fetch Device Identify data again
17612 */
17613 if (sata_fetch_device_identify_data(sata_hba_inst, &new_sdinfo) != 0) {
17614 /*
17615 * Cannot get device identification - retry later
17616 */
17617 SATA_LOG_D((sata_hba_inst, CE_WARN,
17618 "%s re-fetch device identify data\n", finfo));
17619 rval = SATA_FAILURE;
17620 }
17621 /* Copy device sata info. */
17622 sdinfo->satadrv_id = new_sdinfo.satadrv_id;
17623
17624 return (rval);
17625 }
17626
17627
17628 /*
17629 *
17630 * Returns 1 if threshold exceeded, 0 if threshold not exceeded, -1 if
17631 * unable to determine.
17632 *
17633 * Cannot be called in an interrupt context.
17634 *
17635 * Called by sata_build_lsense_page_2f()
17636 */
17637
17638 static int
sata_fetch_smart_return_status(sata_hba_inst_t * sata_hba_inst,sata_drive_info_t * sdinfo)17639 sata_fetch_smart_return_status(sata_hba_inst_t *sata_hba_inst,
17640 sata_drive_info_t *sdinfo)
17641 {
17642 sata_pkt_t *spkt;
17643 sata_cmd_t *scmd;
17644 sata_pkt_txlate_t *spx;
17645 int rval;
17646
17647 spx = kmem_zalloc(sizeof (sata_pkt_txlate_t), KM_SLEEP);
17648 spx->txlt_sata_hba_inst = sata_hba_inst;
17649 spx->txlt_scsi_pkt = NULL; /* No scsi pkt involved */
17650 spkt = sata_pkt_alloc(spx, SLEEP_FUNC);
17651 if (spkt == NULL) {
17652 kmem_free(spx, sizeof (sata_pkt_txlate_t));
17653 return (-1);
17654 }
17655 /* address is needed now */
17656 spkt->satapkt_device.satadev_addr = sdinfo->satadrv_addr;
17657
17658
17659 /* Fill sata_pkt */
17660 spkt->satapkt_device.satadev_addr = sdinfo->satadrv_addr;
17661 spkt->satapkt_op_mode = SATA_OPMODE_SYNCH | SATA_OPMODE_INTERRUPTS;
17662 /* Synchronous mode, no callback */
17663 spkt->satapkt_comp = NULL;
17664 /* Timeout 30s */
17665 spkt->satapkt_time = sata_default_pkt_time;
17666
17667 scmd = &spkt->satapkt_cmd;
17668 scmd->satacmd_flags.sata_special_regs = B_TRUE;
17669 scmd->satacmd_flags.sata_data_direction = SATA_DIR_NODATA_XFER;
17670
17671 /* Set up which registers need to be returned */
17672 scmd->satacmd_flags.sata_copy_out_lba_mid_lsb = B_TRUE;
17673 scmd->satacmd_flags.sata_copy_out_lba_high_lsb = B_TRUE;
17674
17675 /* Build SMART_RETURN_STATUS cmd in the sata_pkt */
17676 scmd->satacmd_addr_type = 0; /* N/A */
17677 scmd->satacmd_sec_count_lsb = 0; /* N/A */
17678 scmd->satacmd_lba_low_lsb = 0; /* N/A */
17679 scmd->satacmd_lba_mid_lsb = SMART_MAGIC_VAL_1;
17680 scmd->satacmd_lba_high_lsb = SMART_MAGIC_VAL_2;
17681 scmd->satacmd_features_reg = SATA_SMART_RETURN_STATUS;
17682 scmd->satacmd_device_reg = 0; /* Always device 0 */
17683 scmd->satacmd_cmd_reg = SATAC_SMART;
17684 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
17685 sdinfo->satadrv_addr.cport)));
17686
17687
17688 /* Send pkt to SATA HBA driver */
17689 if ((*SATA_START_FUNC(sata_hba_inst))(SATA_DIP(sata_hba_inst), spkt) !=
17690 SATA_TRAN_ACCEPTED ||
17691 spkt->satapkt_reason != SATA_PKT_COMPLETED) {
17692 mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst,
17693 sdinfo->satadrv_addr.cport)));
17694 /*
17695 * Whoops, no SMART RETURN STATUS
17696 */
17697 rval = -1;
17698 } else {
17699 mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst,
17700 sdinfo->satadrv_addr.cport)));
17701 if (scmd->satacmd_error_reg & SATA_ERROR_ABORT) {
17702 rval = -1;
17703 goto fail;
17704 }
17705 if (scmd->satacmd_status_reg & SATA_STATUS_ERR) {
17706 rval = -1;
17707 goto fail;
17708 }
17709 if ((scmd->satacmd_lba_mid_lsb == SMART_MAGIC_VAL_1) &&
17710 (scmd->satacmd_lba_high_lsb == SMART_MAGIC_VAL_2))
17711 rval = 0;
17712 else if ((scmd->satacmd_lba_mid_lsb == SMART_MAGIC_VAL_3) &&
17713 (scmd->satacmd_lba_high_lsb == SMART_MAGIC_VAL_4))
17714 rval = 1;
17715 else {
17716 rval = -1;
17717 goto fail;
17718 }
17719 }
17720 fail:
17721 /* Free allocated resources */
17722 sata_pkt_free(spx);
17723 kmem_free(spx, sizeof (sata_pkt_txlate_t));
17724
17725 return (rval);
17726 }
17727
17728 /*
17729 *
17730 * Returns 0 if succeeded, -1 otherwise
17731 *
17732 * Cannot be called in an interrupt context.
17733 *
17734 */
17735 static int
sata_fetch_smart_data(sata_hba_inst_t * sata_hba_inst,sata_drive_info_t * sdinfo,struct smart_data * smart_data)17736 sata_fetch_smart_data(sata_hba_inst_t *sata_hba_inst, sata_drive_info_t *sdinfo,
17737 struct smart_data *smart_data)
17738 {
17739 sata_pkt_t *spkt;
17740 sata_cmd_t *scmd;
17741 sata_pkt_txlate_t *spx;
17742 int rval = 0;
17743 dev_info_t *dip = SATA_DIP(sata_hba_inst);
17744
17745 #if ! defined(lint)
17746 ASSERT(sizeof (struct smart_data) == 512);
17747 #endif
17748
17749 spx = kmem_zalloc(sizeof (sata_pkt_txlate_t), KM_SLEEP);
17750 spx->txlt_sata_hba_inst = sata_hba_inst;
17751 spx->txlt_scsi_pkt = NULL; /* No scsi pkt involved */
17752 spkt = sata_pkt_alloc(spx, SLEEP_FUNC);
17753 if (spkt == NULL) {
17754 kmem_free(spx, sizeof (sata_pkt_txlate_t));
17755 return (-1);
17756 }
17757 /* address is needed now */
17758 spkt->satapkt_device.satadev_addr = sdinfo->satadrv_addr;
17759
17760
17761 /* Fill sata_pkt */
17762 spkt->satapkt_device.satadev_addr = sdinfo->satadrv_addr;
17763 spkt->satapkt_op_mode = SATA_OPMODE_SYNCH | SATA_OPMODE_INTERRUPTS;
17764 /* Synchronous mode, no callback */
17765 spkt->satapkt_comp = NULL;
17766 /* Timeout 30s */
17767 spkt->satapkt_time = sata_default_pkt_time;
17768
17769 scmd = &spkt->satapkt_cmd;
17770 scmd->satacmd_flags.sata_data_direction = SATA_DIR_READ;
17771
17772 /*
17773 * Allocate buffer for SMART data
17774 */
17775 scmd->satacmd_bp = sata_alloc_local_buffer(spx,
17776 sizeof (struct smart_data));
17777 if (scmd->satacmd_bp == NULL) {
17778 sata_pkt_free(spx);
17779 kmem_free(spx, sizeof (sata_pkt_txlate_t));
17780 SATA_LOG_D((sata_hba_inst, CE_WARN,
17781 "sata_fetch_smart_data: "
17782 "cannot allocate buffer"));
17783 return (-1);
17784 }
17785
17786
17787 /* Build SMART_READ_DATA cmd in the sata_pkt */
17788 scmd->satacmd_addr_type = 0; /* N/A */
17789 scmd->satacmd_sec_count_lsb = 0; /* N/A */
17790 scmd->satacmd_lba_low_lsb = 0; /* N/A */
17791 scmd->satacmd_lba_mid_lsb = SMART_MAGIC_VAL_1;
17792 scmd->satacmd_lba_high_lsb = SMART_MAGIC_VAL_2;
17793 scmd->satacmd_features_reg = SATA_SMART_READ_DATA;
17794 scmd->satacmd_device_reg = 0; /* Always device 0 */
17795 scmd->satacmd_cmd_reg = SATAC_SMART;
17796 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
17797 sdinfo->satadrv_addr.cport)));
17798
17799 /* Send pkt to SATA HBA driver */
17800 if ((*SATA_START_FUNC(sata_hba_inst))(SATA_DIP(sata_hba_inst), spkt) !=
17801 SATA_TRAN_ACCEPTED ||
17802 spkt->satapkt_reason != SATA_PKT_COMPLETED) {
17803 mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst,
17804 sdinfo->satadrv_addr.cport)));
17805 /*
17806 * Whoops, no SMART DATA available
17807 */
17808 rval = -1;
17809 goto fail;
17810 } else {
17811 mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst,
17812 sdinfo->satadrv_addr.cport)));
17813 if (spx->txlt_buf_dma_handle != NULL) {
17814 rval = ddi_dma_sync(spx->txlt_buf_dma_handle, 0, 0,
17815 DDI_DMA_SYNC_FORKERNEL);
17816 ASSERT(rval == DDI_SUCCESS);
17817 if (sata_check_for_dma_error(dip, spx)) {
17818 ddi_fm_service_impact(dip,
17819 DDI_SERVICE_UNAFFECTED);
17820 rval = -1;
17821 goto fail;
17822 }
17823 }
17824 bcopy(scmd->satacmd_bp->b_un.b_addr, (uint8_t *)smart_data,
17825 sizeof (struct smart_data));
17826 }
17827
17828 fail:
17829 /* Free allocated resources */
17830 sata_free_local_buffer(spx);
17831 sata_pkt_free(spx);
17832 kmem_free(spx, sizeof (sata_pkt_txlate_t));
17833
17834 return (rval);
17835 }
17836
17837 /*
17838 * Issue a READ LOG EXT command for the given log (log_addr) and page
17839 * (page_num) of the log. The output is written to buf. nsect is the size
17840 * of buf in units of 512-byte sectors.
17841 */
17842 static int
sata_read_log_ext(sata_hba_inst_t * sata_hba_inst,sata_drive_info_t * sdinfo,uint8_t log_addr,uint16_t page_num,void * buf,uint16_t nsect)17843 sata_read_log_ext(sata_hba_inst_t *sata_hba_inst, sata_drive_info_t *sdinfo,
17844 uint8_t log_addr, uint16_t page_num, void *buf, uint16_t nsect)
17845 {
17846 dev_info_t *dip;
17847 sata_pkt_txlate_t *spx;
17848 sata_pkt_t *spkt;
17849 sata_cmd_t *scmd;
17850 kmutex_t *cmutex;
17851 int rval;
17852
17853 dip = SATA_DIP(sata_hba_inst);
17854 cmutex = &SATA_CPORT_MUTEX(sata_hba_inst, sdinfo->satadrv_addr.cport);
17855
17856 ASSERT(MUTEX_HELD(cmutex));
17857
17858 spx = kmem_zalloc(sizeof (*spx), KM_SLEEP);
17859 spx->txlt_sata_hba_inst = sata_hba_inst;
17860 spx->txlt_scsi_pkt = NULL;
17861
17862 spkt = sata_pkt_alloc(spx, SLEEP_FUNC);
17863 spkt->satapkt_device.satadev_addr = sdinfo->satadrv_addr;
17864 spkt->satapkt_op_mode = SATA_OPMODE_SYNCH | SATA_OPMODE_INTERRUPTS;
17865 spkt->satapkt_comp = NULL;
17866 spkt->satapkt_time = sata_default_pkt_time;
17867
17868 scmd = &spkt->satapkt_cmd;
17869 scmd->satacmd_bp = sata_alloc_local_buffer(spx, (size_t)nsect * 512);
17870 if (scmd->satacmd_bp == NULL) {
17871 sata_pkt_free(spx);
17872 kmem_free(spx, sizeof (*spx));
17873 SATA_LOG_D((sata_hba_inst, CE_WARN, "%s: cannot allocate bp",
17874 __func__));
17875 return (-1);
17876 }
17877
17878 scmd->satacmd_cmd_reg = SATAC_READ_LOG_EXT;
17879 scmd->satacmd_flags.sata_data_direction = SATA_DIR_READ;
17880 scmd->satacmd_addr_type = ATA_ADDR_LBA48;
17881 scmd->satacmd_sec_count_lsb = nsect & 0xff;
17882 scmd->satacmd_sec_count_msb = nsect >> 8;
17883
17884 /*
17885 * From ACS-3 7.24.3.1 Table 68
17886 * LBA[47:40] Reserved
17887 * LBA[39:32] PAGE NUMBER (15:8)
17888 * LBA[31:16] Reserved
17889 * LBA[15:8] PAGE NUMBER (7:0)
17890 * LBA[7:0] LOG ADDRESS
17891 */
17892 scmd->satacmd_lba_low_lsb = log_addr; /* LBA[7:0] */
17893 scmd->satacmd_lba_mid_lsb = page_num & 0xff; /* LBA[15:8] */
17894 scmd->satacmd_lba_high_lsb = 0; /* LBA[23:16] */
17895 scmd->satacmd_lba_low_msb = 0; /* LBA[31:24] */
17896 scmd->satacmd_lba_mid_msb = page_num >> 8; /* LBA[39:32] */
17897 scmd->satacmd_lba_high_msb = 0; /* LBA[47:40] */
17898
17899 scmd->satacmd_device_reg = 0;
17900
17901 mutex_exit(cmutex);
17902 rval = (*SATA_START_FUNC(sata_hba_inst))(dip, spkt);
17903 mutex_enter(cmutex);
17904
17905 if (rval != SATA_TRAN_ACCEPTED ||
17906 spkt->satapkt_reason != SATA_PKT_COMPLETED) {
17907 rval = -1;
17908 goto fail;
17909 }
17910
17911 if (spx->txlt_buf_dma_handle != NULL) {
17912 rval = ddi_dma_sync(spx->txlt_buf_dma_handle, 0, 0,
17913 DDI_DMA_SYNC_FORKERNEL);
17914 ASSERT3S(rval, ==, DDI_SUCCESS);
17915 if (sata_check_for_dma_error(dip, spx)) {
17916 ddi_fm_service_impact(dip, DDI_SERVICE_UNAFFECTED);
17917 rval = -1;
17918 goto fail;
17919 }
17920
17921 bcopy(scmd->satacmd_bp->b_un.b_addr, buf, (size_t)nsect * 512);
17922 rval = 0;
17923 }
17924
17925 fail:
17926 sata_free_local_buffer(spx);
17927 sata_pkt_free(spx);
17928 kmem_free(spx, sizeof (*spx));
17929
17930 return (rval);
17931 }
17932
17933 /*
17934 * Used by LOG SENSE page 0x10
17935 * Reads (in synchronous mode) the self test log data using Read Log Ext cmd.
17936 * Note: cannot be called in the interrupt context.
17937 *
17938 * return 0 for success, -1 otherwise
17939 *
17940 */
17941 CTASSERT(sizeof (struct smart_ext_selftest_log) == 512);
17942
17943 static int
sata_ext_smart_selftest_read_log(sata_hba_inst_t * sata_hba_inst,sata_drive_info_t * sdinfo,struct smart_ext_selftest_log * ext_selftest_log,uint16_t block_num)17944 sata_ext_smart_selftest_read_log(sata_hba_inst_t *sata_hba_inst,
17945 sata_drive_info_t *sdinfo, struct smart_ext_selftest_log *ext_selftest_log,
17946 uint16_t block_num)
17947 {
17948 return (sata_read_log_ext(sata_hba_inst, sdinfo,
17949 EXT_SMART_SELFTEST_LOG_PAGE, block_num, ext_selftest_log, 1));
17950 }
17951
17952 /*
17953 * Returns 0 for success, -1 otherwise
17954 *
17955 * SMART self-test log data is returned in buffer pointed to by selftest_log
17956 */
17957 static int
sata_smart_selftest_log(sata_hba_inst_t * sata_hba_inst,sata_drive_info_t * sdinfo,struct smart_selftest_log * selftest_log)17958 sata_smart_selftest_log(
17959 sata_hba_inst_t *sata_hba_inst,
17960 sata_drive_info_t *sdinfo,
17961 struct smart_selftest_log *selftest_log)
17962 {
17963 sata_pkt_t *spkt;
17964 sata_cmd_t *scmd;
17965 sata_pkt_txlate_t *spx;
17966 int rval;
17967 dev_info_t *dip = SATA_DIP(sata_hba_inst);
17968
17969 #if ! defined(lint)
17970 ASSERT(sizeof (struct smart_selftest_log) == 512);
17971 #endif
17972
17973 spx = kmem_zalloc(sizeof (sata_pkt_txlate_t), KM_SLEEP);
17974 spx->txlt_sata_hba_inst = sata_hba_inst;
17975 spx->txlt_scsi_pkt = NULL; /* No scsi pkt involved */
17976 spkt = sata_pkt_alloc(spx, SLEEP_FUNC);
17977 if (spkt == NULL) {
17978 kmem_free(spx, sizeof (sata_pkt_txlate_t));
17979 return (-1);
17980 }
17981 /* address is needed now */
17982 spkt->satapkt_device.satadev_addr = sdinfo->satadrv_addr;
17983
17984
17985 /* Fill sata_pkt */
17986 spkt->satapkt_device.satadev_addr = sdinfo->satadrv_addr;
17987 spkt->satapkt_op_mode = SATA_OPMODE_SYNCH | SATA_OPMODE_INTERRUPTS;
17988 /* Synchronous mode, no callback */
17989 spkt->satapkt_comp = NULL;
17990 /* Timeout 30s */
17991 spkt->satapkt_time = sata_default_pkt_time;
17992
17993 scmd = &spkt->satapkt_cmd;
17994 scmd->satacmd_flags.sata_data_direction = SATA_DIR_READ;
17995
17996 /*
17997 * Allocate buffer for SMART SELFTEST LOG
17998 */
17999 scmd->satacmd_bp = sata_alloc_local_buffer(spx,
18000 sizeof (struct smart_selftest_log));
18001 if (scmd->satacmd_bp == NULL) {
18002 sata_pkt_free(spx);
18003 kmem_free(spx, sizeof (sata_pkt_txlate_t));
18004 SATA_LOG_D((sata_hba_inst, CE_WARN,
18005 "sata_smart_selftest_log: "
18006 "cannot allocate buffer"));
18007 return (-1);
18008 }
18009
18010 /* Build SMART_READ_LOG cmd in the sata_pkt */
18011 scmd->satacmd_addr_type = 0; /* N/A */
18012 scmd->satacmd_sec_count_lsb = 1; /* One sector of SMART log */
18013 scmd->satacmd_lba_low_lsb = SMART_SELFTEST_LOG_PAGE;
18014 scmd->satacmd_lba_mid_lsb = SMART_MAGIC_VAL_1;
18015 scmd->satacmd_lba_high_lsb = SMART_MAGIC_VAL_2;
18016 scmd->satacmd_features_reg = SATA_SMART_READ_LOG;
18017 scmd->satacmd_device_reg = 0; /* Always device 0 */
18018 scmd->satacmd_cmd_reg = SATAC_SMART;
18019 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
18020 sdinfo->satadrv_addr.cport)));
18021
18022 /* Send pkt to SATA HBA driver */
18023 if ((*SATA_START_FUNC(sata_hba_inst))(SATA_DIP(sata_hba_inst), spkt) !=
18024 SATA_TRAN_ACCEPTED ||
18025 spkt->satapkt_reason != SATA_PKT_COMPLETED) {
18026 mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst,
18027 sdinfo->satadrv_addr.cport)));
18028 /*
18029 * Whoops, no SMART DATA available
18030 */
18031 rval = -1;
18032 goto fail;
18033 } else {
18034 mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst,
18035 sdinfo->satadrv_addr.cport)));
18036 if (spx->txlt_buf_dma_handle != NULL) {
18037 rval = ddi_dma_sync(spx->txlt_buf_dma_handle, 0, 0,
18038 DDI_DMA_SYNC_FORKERNEL);
18039 ASSERT(rval == DDI_SUCCESS);
18040 if (sata_check_for_dma_error(dip, spx)) {
18041 ddi_fm_service_impact(dip,
18042 DDI_SERVICE_UNAFFECTED);
18043 rval = -1;
18044 goto fail;
18045 }
18046 }
18047 bcopy(scmd->satacmd_bp->b_un.b_addr, (uint8_t *)selftest_log,
18048 sizeof (struct smart_selftest_log));
18049 rval = 0;
18050 }
18051
18052 fail:
18053 /* Free allocated resources */
18054 sata_free_local_buffer(spx);
18055 sata_pkt_free(spx);
18056 kmem_free(spx, sizeof (sata_pkt_txlate_t));
18057
18058 return (rval);
18059 }
18060
18061
18062 /*
18063 * Returns 0 for success, -1 otherwise
18064 *
18065 * SMART READ LOG data is returned in buffer pointed to by smart_log
18066 */
18067 static int
sata_smart_read_log(sata_hba_inst_t * sata_hba_inst,sata_drive_info_t * sdinfo,uint8_t * smart_log,uint8_t which_log,uint8_t log_size)18068 sata_smart_read_log(
18069 sata_hba_inst_t *sata_hba_inst,
18070 sata_drive_info_t *sdinfo,
18071 uint8_t *smart_log, /* where the data should be returned */
18072 uint8_t which_log, /* which log should be returned */
18073 uint8_t log_size) /* # of 512 bytes in log */
18074 {
18075 sata_pkt_t *spkt;
18076 sata_cmd_t *scmd;
18077 sata_pkt_txlate_t *spx;
18078 int rval;
18079 dev_info_t *dip = SATA_DIP(sata_hba_inst);
18080
18081 spx = kmem_zalloc(sizeof (sata_pkt_txlate_t), KM_SLEEP);
18082 spx->txlt_sata_hba_inst = sata_hba_inst;
18083 spx->txlt_scsi_pkt = NULL; /* No scsi pkt involved */
18084 spkt = sata_pkt_alloc(spx, SLEEP_FUNC);
18085 if (spkt == NULL) {
18086 kmem_free(spx, sizeof (sata_pkt_txlate_t));
18087 return (-1);
18088 }
18089 /* address is needed now */
18090 spkt->satapkt_device.satadev_addr = sdinfo->satadrv_addr;
18091
18092
18093 /* Fill sata_pkt */
18094 spkt->satapkt_device.satadev_addr = sdinfo->satadrv_addr;
18095 spkt->satapkt_op_mode = SATA_OPMODE_SYNCH | SATA_OPMODE_INTERRUPTS;
18096 /* Synchronous mode, no callback */
18097 spkt->satapkt_comp = NULL;
18098 /* Timeout 30s */
18099 spkt->satapkt_time = sata_default_pkt_time;
18100
18101 scmd = &spkt->satapkt_cmd;
18102 scmd->satacmd_flags.sata_data_direction = SATA_DIR_READ;
18103
18104 /*
18105 * Allocate buffer for SMART READ LOG
18106 */
18107 scmd->satacmd_bp = sata_alloc_local_buffer(spx, (size_t)log_size * 512);
18108 if (scmd->satacmd_bp == NULL) {
18109 sata_pkt_free(spx);
18110 kmem_free(spx, sizeof (sata_pkt_txlate_t));
18111 SATA_LOG_D((sata_hba_inst, CE_WARN,
18112 "sata_smart_read_log: " "cannot allocate buffer"));
18113 return (-1);
18114 }
18115
18116 /* Build SMART_READ_LOG cmd in the sata_pkt */
18117 scmd->satacmd_addr_type = 0; /* N/A */
18118 scmd->satacmd_sec_count_lsb = log_size; /* what the caller asked for */
18119 scmd->satacmd_lba_low_lsb = which_log; /* which log page */
18120 scmd->satacmd_lba_mid_lsb = SMART_MAGIC_VAL_1;
18121 scmd->satacmd_lba_high_lsb = SMART_MAGIC_VAL_2;
18122 scmd->satacmd_features_reg = SATA_SMART_READ_LOG;
18123 scmd->satacmd_device_reg = 0; /* Always device 0 */
18124 scmd->satacmd_cmd_reg = SATAC_SMART;
18125
18126 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
18127 sdinfo->satadrv_addr.cport)));
18128
18129 /* Send pkt to SATA HBA driver */
18130 if ((*SATA_START_FUNC(sata_hba_inst))(SATA_DIP(sata_hba_inst), spkt) !=
18131 SATA_TRAN_ACCEPTED ||
18132 spkt->satapkt_reason != SATA_PKT_COMPLETED) {
18133 mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst,
18134 sdinfo->satadrv_addr.cport)));
18135
18136 /*
18137 * Whoops, no SMART DATA available
18138 */
18139 rval = -1;
18140 goto fail;
18141 } else {
18142 mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst,
18143 sdinfo->satadrv_addr.cport)));
18144
18145 if (spx->txlt_buf_dma_handle != NULL) {
18146 rval = ddi_dma_sync(spx->txlt_buf_dma_handle, 0, 0,
18147 DDI_DMA_SYNC_FORKERNEL);
18148 ASSERT(rval == DDI_SUCCESS);
18149 if (sata_check_for_dma_error(dip, spx)) {
18150 ddi_fm_service_impact(dip,
18151 DDI_SERVICE_UNAFFECTED);
18152 rval = -1;
18153 goto fail;
18154 }
18155 }
18156 bcopy(scmd->satacmd_bp->b_un.b_addr, smart_log, log_size * 512);
18157 rval = 0;
18158 }
18159
18160 fail:
18161 /* Free allocated resources */
18162 sata_free_local_buffer(spx);
18163 sata_pkt_free(spx);
18164 kmem_free(spx, sizeof (sata_pkt_txlate_t));
18165
18166 return (rval);
18167 }
18168
18169 /*
18170 * Used by LOG SENSE page 0x10
18171 *
18172 * return 0 for success, -1 otherwise
18173 *
18174 */
18175 CTASSERT(sizeof (struct read_log_ext_directory) == 512);
18176
18177 static int
sata_read_log_ext_directory(sata_hba_inst_t * sata_hba_inst,sata_drive_info_t * sdinfo,struct read_log_ext_directory * logdir)18178 sata_read_log_ext_directory(sata_hba_inst_t *sata_hba_inst,
18179 sata_drive_info_t *sdinfo, struct read_log_ext_directory *logdir)
18180 {
18181 return (sata_read_log_ext(sata_hba_inst, sdinfo,
18182 READ_LOG_EXT_LOG_DIRECTORY, 0, logdir, 1));
18183 }
18184
18185 /*
18186 * Set up error retrieval sata command for NCQ command error data
18187 * recovery.
18188 *
18189 * Returns SATA_SUCCESS when data buffer is allocated and packet set-up,
18190 * returns SATA_FAILURE otherwise.
18191 */
18192 static int
sata_ncq_err_ret_cmd_setup(sata_pkt_txlate_t * spx,sata_drive_info_t * sdinfo)18193 sata_ncq_err_ret_cmd_setup(sata_pkt_txlate_t *spx, sata_drive_info_t *sdinfo)
18194 {
18195 #ifndef __lock_lint
18196 _NOTE(ARGUNUSED(sdinfo))
18197 #endif
18198
18199 sata_pkt_t *spkt = spx->txlt_sata_pkt;
18200 sata_cmd_t *scmd;
18201 struct buf *bp;
18202
18203 /* Operation modes are up to the caller */
18204 spkt->satapkt_op_mode = SATA_OPMODE_SYNCH | SATA_OPMODE_INTERRUPTS;
18205
18206 /* Synchronous mode, no callback - may be changed by the caller */
18207 spkt->satapkt_comp = NULL;
18208 spkt->satapkt_time = sata_default_pkt_time;
18209
18210 scmd = &spkt->satapkt_cmd;
18211 bcopy(&sata_rle_cmd, scmd, sizeof (sata_cmd_t));
18212 scmd->satacmd_flags.sata_ignore_dev_reset = B_TRUE;
18213
18214 /*
18215 * Allocate dma_able buffer error data.
18216 * Buffer allocation will take care of buffer alignment and other DMA
18217 * attributes.
18218 */
18219 bp = sata_alloc_local_buffer(spx,
18220 sizeof (struct sata_ncq_error_recovery_page));
18221 if (bp == NULL)
18222 return (SATA_FAILURE);
18223
18224 bp_mapin(bp); /* make data buffer accessible */
18225 scmd->satacmd_bp = bp;
18226
18227 /*
18228 * Set-up pointer to the buffer handle, so HBA can sync buffer
18229 * before accessing it. Handle is in usual place in translate struct.
18230 */
18231 scmd->satacmd_err_ret_buf_handle = &spx->txlt_buf_dma_handle;
18232
18233 ASSERT(scmd->satacmd_num_dma_cookies != 0);
18234 ASSERT(scmd->satacmd_dma_cookie_list != NULL);
18235
18236 return (SATA_SUCCESS);
18237 }
18238
18239 /*
18240 * sata_xlate_errors() is used to translate (S)ATA error
18241 * information to SCSI information returned in the SCSI
18242 * packet.
18243 */
18244 static void
sata_xlate_errors(sata_pkt_txlate_t * spx)18245 sata_xlate_errors(sata_pkt_txlate_t *spx)
18246 {
18247 struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
18248 struct scsi_extended_sense *sense;
18249
18250 scsipkt->pkt_reason = CMD_INCOMPLETE;
18251 *scsipkt->pkt_scbp = STATUS_CHECK;
18252 sense = sata_arq_sense(spx);
18253
18254 switch (spx->txlt_sata_pkt->satapkt_reason) {
18255 case SATA_PKT_PORT_ERROR:
18256 /*
18257 * We have no device data. Assume no data transfered.
18258 */
18259 sense->es_key = KEY_HARDWARE_ERROR;
18260 break;
18261
18262 case SATA_PKT_DEV_ERROR:
18263 if (spx->txlt_sata_pkt->satapkt_cmd.satacmd_status_reg &
18264 SATA_STATUS_ERR) {
18265 /*
18266 * determine dev error reason from error
18267 * reg content
18268 */
18269 sata_decode_device_error(spx, sense);
18270 break;
18271 }
18272 /* No extended sense key - no info available */
18273 break;
18274
18275 case SATA_PKT_TIMEOUT:
18276 scsipkt->pkt_reason = CMD_TIMEOUT;
18277 scsipkt->pkt_statistics |= STAT_TIMEOUT | STAT_DEV_RESET;
18278 /* No extended sense key */
18279 break;
18280
18281 case SATA_PKT_ABORTED:
18282 scsipkt->pkt_reason = CMD_ABORTED;
18283 scsipkt->pkt_statistics |= STAT_ABORTED;
18284 /* No extended sense key */
18285 break;
18286
18287 case SATA_PKT_RESET:
18288 /*
18289 * pkt aborted either by an explicit reset request from
18290 * a host, or due to error recovery
18291 */
18292 scsipkt->pkt_reason = CMD_RESET;
18293 scsipkt->pkt_statistics |= STAT_DEV_RESET;
18294 break;
18295
18296 default:
18297 scsipkt->pkt_reason = CMD_TRAN_ERR;
18298 break;
18299 }
18300 }
18301
18302
18303
18304
18305 /*
18306 * Log sata message
18307 * dev pathname msg line preceeds the logged message.
18308 */
18309
18310 static void
sata_log(sata_hba_inst_t * sata_hba_inst,uint_t level,char * fmt,...)18311 sata_log(sata_hba_inst_t *sata_hba_inst, uint_t level, char *fmt, ...)
18312 {
18313 char pathname[128];
18314 dev_info_t *dip = NULL;
18315 va_list ap;
18316
18317 mutex_enter(&sata_log_mutex);
18318
18319 va_start(ap, fmt);
18320 (void) vsprintf(sata_log_buf, fmt, ap);
18321 va_end(ap);
18322
18323 if (sata_hba_inst != NULL) {
18324 dip = SATA_DIP(sata_hba_inst);
18325 (void) ddi_pathname(dip, pathname);
18326 } else {
18327 pathname[0] = 0;
18328 }
18329 if (level == CE_CONT) {
18330 if (sata_debug_flags == 0)
18331 cmn_err(level, "?%s:\n %s\n", pathname, sata_log_buf);
18332 else
18333 cmn_err(level, "%s:\n %s\n", pathname, sata_log_buf);
18334 } else {
18335 if (level != CE_NOTE) {
18336 cmn_err(level, "%s:\n %s", pathname, sata_log_buf);
18337 } else if (sata_msg) {
18338 cmn_err(level, "%s:\n %s", pathname,
18339 sata_log_buf);
18340 }
18341 }
18342
18343 /* sata trace debug */
18344 sata_trace_debug(dip, sata_log_buf);
18345
18346 mutex_exit(&sata_log_mutex);
18347 }
18348
18349
18350 /* ******** Asynchronous HBA events handling & hotplugging support ******** */
18351
18352 /*
18353 * Start or terminate the thread, depending on flag arg and current state
18354 */
18355 static void
sata_event_thread_control(int startstop)18356 sata_event_thread_control(int startstop)
18357 {
18358 static int sata_event_thread_terminating = 0;
18359 static int sata_event_thread_starting = 0;
18360 int i;
18361
18362 mutex_enter(&sata_event_mutex);
18363
18364 if (startstop == 0 && (sata_event_thread_starting == 1 ||
18365 sata_event_thread_terminating == 1)) {
18366 mutex_exit(&sata_event_mutex);
18367 return;
18368 }
18369 if (startstop == 1 && sata_event_thread_starting == 1) {
18370 mutex_exit(&sata_event_mutex);
18371 return;
18372 }
18373 if (startstop == 1 && sata_event_thread_terminating == 1) {
18374 sata_event_thread_starting = 1;
18375 /* wait til terminate operation completes */
18376 i = SATA_EVNT_DAEMON_TERM_WAIT/SATA_EVNT_DAEMON_TERM_TIMEOUT;
18377 while (sata_event_thread_terminating == 1) {
18378 if (i-- <= 0) {
18379 sata_event_thread_starting = 0;
18380 mutex_exit(&sata_event_mutex);
18381 #ifdef SATA_DEBUG
18382 cmn_err(CE_WARN, "sata_event_thread_control: "
18383 "timeout waiting for thread to terminate");
18384 #endif
18385 return;
18386 }
18387 mutex_exit(&sata_event_mutex);
18388 delay(drv_usectohz(SATA_EVNT_DAEMON_TERM_TIMEOUT));
18389 mutex_enter(&sata_event_mutex);
18390 }
18391 }
18392 if (startstop == 1) {
18393 if (sata_event_thread == NULL) {
18394 sata_event_thread = thread_create(NULL, 0,
18395 (void (*)())sata_event_daemon,
18396 &sata_hba_list, 0, &p0, TS_RUN, minclsyspri);
18397 }
18398 sata_event_thread_starting = 0;
18399 mutex_exit(&sata_event_mutex);
18400 return;
18401 }
18402
18403 /*
18404 * If we got here, thread may need to be terminated
18405 */
18406 if (sata_event_thread != NULL) {
18407 int i;
18408 /* Signal event thread to go away */
18409 sata_event_thread_terminating = 1;
18410 sata_event_thread_terminate = 1;
18411 cv_signal(&sata_event_cv);
18412 /*
18413 * Wait til daemon terminates.
18414 */
18415 i = SATA_EVNT_DAEMON_TERM_WAIT/SATA_EVNT_DAEMON_TERM_TIMEOUT;
18416 while (sata_event_thread_terminate == 1) {
18417 mutex_exit(&sata_event_mutex);
18418 if (i-- <= 0) {
18419 /* Daemon did not go away !!! */
18420 #ifdef SATA_DEBUG
18421 cmn_err(CE_WARN, "sata_event_thread_control: "
18422 "cannot terminate event daemon thread");
18423 #endif
18424 mutex_enter(&sata_event_mutex);
18425 break;
18426 }
18427 delay(drv_usectohz(SATA_EVNT_DAEMON_TERM_TIMEOUT));
18428 mutex_enter(&sata_event_mutex);
18429 }
18430 sata_event_thread_terminating = 0;
18431 }
18432 ASSERT(sata_event_thread_terminating == 0);
18433 ASSERT(sata_event_thread_starting == 0);
18434 mutex_exit(&sata_event_mutex);
18435 }
18436
18437
18438 /*
18439 * SATA HBA event notification function.
18440 * Events reported by SATA HBA drivers per HBA instance relate to a change in
18441 * a port and/or device state or a controller itself.
18442 * Events for different addresses/addr types cannot be combined.
18443 * A warning message is generated for each event type.
18444 * Events are not processed by this function, so only the
18445 * event flag(s)is set for an affected entity and the event thread is
18446 * waken up. Event daemon thread processes all events.
18447 *
18448 * NOTE: Since more than one event may be reported at the same time, one
18449 * cannot determine a sequence of events when opposite event are reported, eg.
18450 * LINK_LOST and LINK_ESTABLISHED. Actual port status during event processing
18451 * is taking precedence over reported events, i.e. may cause ignoring some
18452 * events.
18453 */
18454 #define SATA_EVENT_MAX_MSG_LENGTH 79
18455
18456 void
sata_hba_event_notify(dev_info_t * dip,sata_device_t * sata_device,int event)18457 sata_hba_event_notify(dev_info_t *dip, sata_device_t *sata_device, int event)
18458 {
18459 sata_hba_inst_t *sata_hba_inst = NULL;
18460 sata_address_t *saddr;
18461 sata_pmult_info_t *pmultinfo;
18462 sata_drive_info_t *sdinfo;
18463 sata_port_stats_t *pstats;
18464 sata_cport_info_t *cportinfo = NULL;
18465 sata_pmport_info_t *pmportinfo = NULL;
18466 int cport, pmport;
18467 char buf1[SATA_EVENT_MAX_MSG_LENGTH + 1];
18468 char buf2[SATA_EVENT_MAX_MSG_LENGTH + 1];
18469 char *lcp;
18470 static char *err_msg_evnt_1 =
18471 "sata_hba_event_notify: invalid port event 0x%x ";
18472 static char *err_msg_evnt_2 =
18473 "sata_hba_event_notify: invalid device event 0x%x ";
18474 int linkevent;
18475
18476 /*
18477 * There is a possibility that an event will be generated on HBA
18478 * that has not completed attachment or is detaching. We still want
18479 * to process events until HBA is detached.
18480 */
18481 mutex_enter(&sata_mutex);
18482 for (sata_hba_inst = sata_hba_list; sata_hba_inst != NULL;
18483 sata_hba_inst = sata_hba_inst->satahba_next) {
18484 if (SATA_DIP(sata_hba_inst) == dip)
18485 if (sata_hba_inst->satahba_attached == 1)
18486 break;
18487 }
18488 mutex_exit(&sata_mutex);
18489 if (sata_hba_inst == NULL)
18490 /* HBA not attached */
18491 return;
18492
18493 ASSERT(sata_device != NULL);
18494
18495 /*
18496 * Validate address before - do not proceed with invalid address.
18497 */
18498 saddr = &sata_device->satadev_addr;
18499 if (saddr->cport >= SATA_NUM_CPORTS(sata_hba_inst))
18500 return;
18501
18502 cport = saddr->cport;
18503 pmport = saddr->pmport;
18504
18505 buf1[0] = buf2[0] = '\0';
18506
18507 /*
18508 * If event relates to port or device, check port state.
18509 * Port has to be initialized, or we cannot accept an event.
18510 */
18511 if ((saddr->qual & (SATA_ADDR_CPORT | SATA_ADDR_PMPORT |
18512 SATA_ADDR_DCPORT | SATA_ADDR_DPMPORT | SATA_ADDR_PMULT)) != 0) {
18513 mutex_enter(&sata_hba_inst->satahba_mutex);
18514 cportinfo = SATA_CPORT_INFO(sata_hba_inst, cport);
18515 mutex_exit(&sata_hba_inst->satahba_mutex);
18516 if (cportinfo == NULL || cportinfo->cport_state == 0)
18517 return;
18518 }
18519
18520 if ((saddr->qual & (SATA_ADDR_PMULT | SATA_ADDR_PMPORT |
18521 SATA_ADDR_DPMPORT)) != 0) {
18522 if (cportinfo->cport_dev_type != SATA_DTYPE_PMULT) {
18523 SATA_LOG_D((sata_hba_inst, CE_WARN,
18524 "sata_hba_event_notify: Non-pmult device (0x%x)"
18525 "is attached to port %d, ignore pmult/pmport "
18526 "event 0x%x", cportinfo->cport_dev_type,
18527 cport, event));
18528 return;
18529 }
18530
18531 mutex_enter(&cportinfo->cport_mutex);
18532 pmultinfo = SATA_PMULT_INFO(sata_hba_inst, cport);
18533 mutex_exit(&cportinfo->cport_mutex);
18534
18535 /*
18536 * The daemon might be processing attachment of port
18537 * multiplier, in that case we should ignore events on its
18538 * sub-devices.
18539 *
18540 * NOTE: Only pmult_state is checked in sata_hba_event_notify.
18541 * The pmport_state is checked by sata daemon.
18542 */
18543 if (pmultinfo == NULL ||
18544 pmultinfo->pmult_state == SATA_STATE_UNKNOWN) {
18545 SATA_LOG_D((sata_hba_inst, CE_WARN,
18546 "sata_hba_event_notify: pmult is not"
18547 "available at port %d:%d, ignore event 0x%x",
18548 cport, pmport, event));
18549 return;
18550 }
18551 }
18552
18553 if ((saddr->qual &
18554 (SATA_ADDR_PMPORT | SATA_ADDR_DPMPORT)) != 0) {
18555
18556 mutex_enter(&cportinfo->cport_mutex);
18557 if (pmport > SATA_NUM_PMPORTS(sata_hba_inst, cport)) {
18558 SATA_LOG_D((sata_hba_inst, CE_WARN,
18559 "sata_hba_event_notify: invalid/"
18560 "un-implemented port %d:%d (%d ports), "
18561 "ignore event 0x%x", cport, pmport,
18562 SATA_NUM_PMPORTS(sata_hba_inst, cport), event));
18563 mutex_exit(&cportinfo->cport_mutex);
18564 return;
18565 }
18566 mutex_exit(&cportinfo->cport_mutex);
18567
18568 mutex_enter(&sata_hba_inst->satahba_mutex);
18569 pmportinfo = SATA_PMPORT_INFO(sata_hba_inst,
18570 cport, pmport);
18571 mutex_exit(&sata_hba_inst->satahba_mutex);
18572
18573 /* pmport is implemented/valid? */
18574 if (pmportinfo == NULL) {
18575 SATA_LOG_D((sata_hba_inst, CE_WARN,
18576 "sata_hba_event_notify: invalid/"
18577 "un-implemented port %d:%d, ignore "
18578 "event 0x%x", cport, pmport, event));
18579 return;
18580 }
18581 }
18582
18583 /*
18584 * Events refer to devices, ports and controllers - each has
18585 * unique address. Events for different addresses cannot be combined.
18586 */
18587 if (saddr->qual & (SATA_ADDR_CPORT | SATA_ADDR_PMPORT)) {
18588
18589 mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst, cport)));
18590
18591 /* qualify this event(s) */
18592 if ((event & SATA_EVNT_PORT_EVENTS) == 0) {
18593 /* Invalid event for the device port */
18594 (void) sprintf(buf2, err_msg_evnt_1,
18595 event & SATA_EVNT_PORT_EVENTS);
18596 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst, cport)));
18597 goto event_info;
18598 }
18599 if (saddr->qual == SATA_ADDR_CPORT) {
18600 /* Controller's device port event */
18601
18602 (SATA_CPORT_INFO(sata_hba_inst, cport))->
18603 cport_event_flags |=
18604 event & SATA_EVNT_PORT_EVENTS;
18605 pstats =
18606 &(SATA_CPORT_INFO(sata_hba_inst, cport))->
18607 cport_stats;
18608 } else {
18609 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst, cport)));
18610 mutex_enter(&pmportinfo->pmport_mutex);
18611 /* Port multiplier's device port event */
18612 (SATA_PMPORT_INFO(sata_hba_inst, cport, pmport))->
18613 pmport_event_flags |=
18614 event & SATA_EVNT_PORT_EVENTS;
18615 pstats =
18616 &(SATA_PMPORT_INFO(sata_hba_inst, cport, pmport))->
18617 pmport_stats;
18618 mutex_exit(&pmportinfo->pmport_mutex);
18619 mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst, cport)));
18620 }
18621
18622 /*
18623 * Add to statistics and log the message. We have to do it
18624 * here rather than in the event daemon, because there may be
18625 * multiple events occuring before they are processed.
18626 */
18627 linkevent = event &
18628 (SATA_EVNT_LINK_LOST | SATA_EVNT_LINK_ESTABLISHED);
18629 if (linkevent) {
18630 if (linkevent == (SATA_EVNT_LINK_LOST |
18631 SATA_EVNT_LINK_ESTABLISHED)) {
18632 /* This is likely event combination */
18633 (void) strlcat(buf1, "link lost/established, ",
18634 SATA_EVENT_MAX_MSG_LENGTH);
18635
18636 if (pstats->link_lost < 0xffffffffffffffffULL)
18637 pstats->link_lost++;
18638 if (pstats->link_established <
18639 0xffffffffffffffffULL)
18640 pstats->link_established++;
18641 linkevent = 0;
18642 } else if (linkevent & SATA_EVNT_LINK_LOST) {
18643 (void) strlcat(buf1, "link lost, ",
18644 SATA_EVENT_MAX_MSG_LENGTH);
18645
18646 if (pstats->link_lost < 0xffffffffffffffffULL)
18647 pstats->link_lost++;
18648 } else {
18649 (void) strlcat(buf1, "link established, ",
18650 SATA_EVENT_MAX_MSG_LENGTH);
18651 if (pstats->link_established <
18652 0xffffffffffffffffULL)
18653 pstats->link_established++;
18654 }
18655 }
18656 if (event & SATA_EVNT_DEVICE_ATTACHED) {
18657 (void) strlcat(buf1, "device attached, ",
18658 SATA_EVENT_MAX_MSG_LENGTH);
18659 if (pstats->device_attached < 0xffffffffffffffffULL)
18660 pstats->device_attached++;
18661 }
18662 if (event & SATA_EVNT_DEVICE_DETACHED) {
18663 (void) strlcat(buf1, "device detached, ",
18664 SATA_EVENT_MAX_MSG_LENGTH);
18665 if (pstats->device_detached < 0xffffffffffffffffULL)
18666 pstats->device_detached++;
18667 }
18668 if (event & SATA_EVNT_PWR_LEVEL_CHANGED) {
18669 SATADBG1(SATA_DBG_EVENTS, sata_hba_inst,
18670 "port %d power level changed", cport);
18671 if (pstats->port_pwr_changed < 0xffffffffffffffffULL)
18672 pstats->port_pwr_changed++;
18673 }
18674
18675 if ((event & ~SATA_EVNT_PORT_EVENTS) != 0) {
18676 /* There should be no other events for this address */
18677 (void) sprintf(buf2, err_msg_evnt_1,
18678 event & ~SATA_EVNT_PORT_EVENTS);
18679 }
18680 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst, cport)));
18681
18682 } else if (saddr->qual & (SATA_ADDR_DCPORT | SATA_ADDR_DPMPORT)) {
18683 mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst, cport)));
18684
18685 /* qualify this event */
18686 if ((event & SATA_EVNT_DEVICE_RESET) == 0) {
18687 /* Invalid event for a device */
18688 (void) sprintf(buf2, err_msg_evnt_2,
18689 event & SATA_EVNT_DEVICE_RESET);
18690 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst, cport)));
18691 goto event_info;
18692 }
18693 /* drive event */
18694 sdinfo = sata_get_device_info(sata_hba_inst, sata_device);
18695 if (sdinfo != NULL) {
18696 if (event & SATA_EVNT_DEVICE_RESET) {
18697 (void) strlcat(buf1, "device reset, ",
18698 SATA_EVENT_MAX_MSG_LENGTH);
18699 if (sdinfo->satadrv_stats.drive_reset <
18700 0xffffffffffffffffULL)
18701 sdinfo->satadrv_stats.drive_reset++;
18702 sdinfo->satadrv_event_flags |=
18703 SATA_EVNT_DEVICE_RESET;
18704 }
18705 }
18706 if ((event & ~SATA_EVNT_DEVICE_RESET) != 0) {
18707 /* Invalid event for a device */
18708 (void) sprintf(buf2, err_msg_evnt_2,
18709 event & ~SATA_EVNT_DRIVE_EVENTS);
18710 }
18711 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst, cport)));
18712 } else if (saddr->qual == SATA_ADDR_PMULT) {
18713 mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst, cport)));
18714
18715 /* qualify this event */
18716 if ((event & (SATA_EVNT_DEVICE_RESET |
18717 SATA_EVNT_PMULT_LINK_CHANGED)) == 0) {
18718 /* Invalid event for a port multiplier */
18719 (void) sprintf(buf2, err_msg_evnt_2,
18720 event & SATA_EVNT_DEVICE_RESET);
18721 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst, cport)));
18722 goto event_info;
18723 }
18724
18725 pmultinfo = SATA_PMULT_INFO(sata_hba_inst, cport);
18726
18727 if (event & SATA_EVNT_DEVICE_RESET) {
18728
18729 SATADBG1(SATA_DBG_PMULT, sata_hba_inst,
18730 "[Reset] port-mult on cport %d", cport);
18731 pmultinfo->pmult_event_flags |=
18732 SATA_EVNT_DEVICE_RESET;
18733 (void) strlcat(buf1, "pmult reset, ",
18734 SATA_EVENT_MAX_MSG_LENGTH);
18735 }
18736
18737 if (event & SATA_EVNT_PMULT_LINK_CHANGED) {
18738
18739 SATADBG1(SATA_DBG_PMULT, sata_hba_inst,
18740 "pmult link changed on cport %d", cport);
18741 pmultinfo->pmult_event_flags |=
18742 SATA_EVNT_PMULT_LINK_CHANGED;
18743 (void) strlcat(buf1, "pmult link changed, ",
18744 SATA_EVENT_MAX_MSG_LENGTH);
18745 }
18746 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst, cport)));
18747
18748 } else {
18749 if (saddr->qual != SATA_ADDR_NULL) {
18750 /* Wrong address qualifier */
18751 SATA_LOG_D((sata_hba_inst, CE_WARN,
18752 "sata_hba_event_notify: invalid address 0x%x",
18753 *(uint32_t *)saddr));
18754 return;
18755 }
18756 if ((event & SATA_EVNT_CONTROLLER_EVENTS) == 0 ||
18757 (event & ~SATA_EVNT_CONTROLLER_EVENTS) != 0) {
18758 /* Invalid event for the controller */
18759 SATA_LOG_D((sata_hba_inst, CE_WARN,
18760 "sata_hba_event_notify: invalid event 0x%x for "
18761 "controller",
18762 event & SATA_EVNT_CONTROLLER_EVENTS));
18763 return;
18764 }
18765 buf1[0] = '\0';
18766 /* This may be a frequent and not interesting event */
18767 SATADBG1(SATA_DBG_EVENTS, sata_hba_inst,
18768 "controller power level changed\n", NULL);
18769
18770 mutex_enter(&sata_hba_inst->satahba_mutex);
18771 if (sata_hba_inst->satahba_stats.ctrl_pwr_change <
18772 0xffffffffffffffffULL)
18773 sata_hba_inst->satahba_stats.ctrl_pwr_change++;
18774
18775 sata_hba_inst->satahba_event_flags |=
18776 SATA_EVNT_PWR_LEVEL_CHANGED;
18777 mutex_exit(&sata_hba_inst->satahba_mutex);
18778 }
18779 /*
18780 * If we got here, there is something to do with this HBA
18781 * instance.
18782 */
18783 mutex_enter(&sata_hba_inst->satahba_mutex);
18784 sata_hba_inst->satahba_event_flags |= SATA_EVNT_MAIN;
18785 mutex_exit(&sata_hba_inst->satahba_mutex);
18786 mutex_enter(&sata_mutex);
18787 sata_event_pending |= SATA_EVNT_MAIN; /* global event indicator */
18788 mutex_exit(&sata_mutex);
18789
18790 /* Tickle event thread */
18791 mutex_enter(&sata_event_mutex);
18792 if (sata_event_thread_active == 0)
18793 cv_signal(&sata_event_cv);
18794 mutex_exit(&sata_event_mutex);
18795
18796 event_info:
18797 if (buf1[0] != '\0') {
18798 lcp = strrchr(buf1, ',');
18799 if (lcp != NULL)
18800 *lcp = '\0';
18801 }
18802 if (saddr->qual == SATA_ADDR_CPORT ||
18803 saddr->qual == SATA_ADDR_DCPORT) {
18804 if (buf1[0] != '\0') {
18805 sata_log(sata_hba_inst, CE_NOTE, "port %d: %s\n",
18806 cport, buf1);
18807 }
18808 if (buf2[0] != '\0') {
18809 sata_log(sata_hba_inst, CE_NOTE, "port %d: %s\n",
18810 cport, buf2);
18811 }
18812 } else if (saddr->qual == SATA_ADDR_PMPORT ||
18813 saddr->qual == SATA_ADDR_DPMPORT) {
18814 if (buf1[0] != '\0') {
18815 sata_log(sata_hba_inst, CE_NOTE,
18816 "port %d pmport %d: %s\n", cport, pmport, buf1);
18817 }
18818 if (buf2[0] != '\0') {
18819 sata_log(sata_hba_inst, CE_NOTE,
18820 "port %d pmport %d: %s\n", cport, pmport, buf2);
18821 }
18822 }
18823 }
18824
18825
18826 /*
18827 * Event processing thread.
18828 * Arg is a pointer to the sata_hba_list pointer.
18829 * It is not really needed, because sata_hba_list is global and static
18830 */
18831 static void
sata_event_daemon(void * arg)18832 sata_event_daemon(void *arg)
18833 {
18834 #ifndef __lock_lint
18835 _NOTE(ARGUNUSED(arg))
18836 #endif
18837 sata_hba_inst_t *sata_hba_inst;
18838 clock_t delta;
18839
18840 SATADBG1(SATA_DBG_EVENTS_DAEMON, NULL,
18841 "SATA event daemon started\n", NULL);
18842 loop:
18843 /*
18844 * Process events here. Walk through all registered HBAs
18845 */
18846 mutex_enter(&sata_mutex);
18847 for (sata_hba_inst = sata_hba_list; sata_hba_inst != NULL;
18848 sata_hba_inst = sata_hba_inst->satahba_next) {
18849 ASSERT(sata_hba_inst != NULL);
18850 mutex_enter(&sata_hba_inst->satahba_mutex);
18851 if (sata_hba_inst->satahba_attached == 0 ||
18852 (sata_hba_inst->satahba_event_flags &
18853 SATA_EVNT_SKIP) != 0) {
18854 mutex_exit(&sata_hba_inst->satahba_mutex);
18855 continue;
18856 }
18857 if (sata_hba_inst->satahba_event_flags & SATA_EVNT_MAIN) {
18858 sata_hba_inst->satahba_event_flags |= SATA_EVNT_SKIP;
18859 mutex_exit(&sata_hba_inst->satahba_mutex);
18860 mutex_exit(&sata_mutex);
18861 /* Got the controller with pending event */
18862 sata_process_controller_events(sata_hba_inst);
18863 /*
18864 * Since global mutex was released, there is a
18865 * possibility that HBA list has changed, so start
18866 * over from the top. Just processed controller
18867 * will be passed-over because of the SKIP flag.
18868 */
18869 goto loop;
18870 }
18871 mutex_exit(&sata_hba_inst->satahba_mutex);
18872 }
18873 /* Clear SKIP flag in all controllers */
18874 for (sata_hba_inst = sata_hba_list; sata_hba_inst != NULL;
18875 sata_hba_inst = sata_hba_inst->satahba_next) {
18876 mutex_enter(&sata_hba_inst->satahba_mutex);
18877 sata_hba_inst->satahba_event_flags &= ~SATA_EVNT_SKIP;
18878 mutex_exit(&sata_hba_inst->satahba_mutex);
18879 }
18880 mutex_exit(&sata_mutex);
18881
18882 SATADBG1(SATA_DBG_EVENTS_DAEMON, NULL,
18883 "SATA EVENT DAEMON suspending itself", NULL);
18884
18885 #ifdef SATA_DEBUG
18886 if ((sata_func_enable & SATA_ENABLE_PROCESS_EVENTS) == 0) {
18887 sata_log(sata_hba_inst, CE_WARN,
18888 "SATA EVENTS PROCESSING DISABLED\n");
18889 thread_exit(); /* Daemon will not run again */
18890 }
18891 #endif
18892 mutex_enter(&sata_event_mutex);
18893 sata_event_thread_active = 0;
18894 mutex_exit(&sata_event_mutex);
18895 /*
18896 * Go to sleep/suspend itself and wake up either because new event or
18897 * wait timeout. Exit if there is a termination request (driver
18898 * unload).
18899 */
18900 delta = drv_usectohz(SATA_EVNT_DAEMON_SLEEP_TIME);
18901 do {
18902 mutex_enter(&sata_event_mutex);
18903 (void) cv_reltimedwait(&sata_event_cv, &sata_event_mutex,
18904 delta, TR_CLOCK_TICK);
18905
18906 if (sata_event_thread_active != 0) {
18907 mutex_exit(&sata_event_mutex);
18908 continue;
18909 }
18910
18911 /* Check if it is time to go away */
18912 if (sata_event_thread_terminate == 1) {
18913 /*
18914 * It is up to the thread setting above flag to make
18915 * sure that this thread is not killed prematurely.
18916 */
18917 sata_event_thread_terminate = 0;
18918 sata_event_thread = NULL;
18919 mutex_exit(&sata_event_mutex);
18920 SATADBG1(SATA_DBG_EVENTS_DAEMON, NULL,
18921 "SATA_EVENT_DAEMON_TERMINATING", NULL);
18922 thread_exit(); { _NOTE(NOT_REACHED) }
18923 }
18924 mutex_exit(&sata_event_mutex);
18925 } while (!(sata_event_pending & SATA_EVNT_MAIN));
18926
18927 mutex_enter(&sata_event_mutex);
18928 sata_event_thread_active = 1;
18929 mutex_exit(&sata_event_mutex);
18930
18931 mutex_enter(&sata_mutex);
18932 sata_event_pending &= ~SATA_EVNT_MAIN;
18933 mutex_exit(&sata_mutex);
18934
18935 SATADBG1(SATA_DBG_EVENTS_DAEMON, NULL,
18936 "SATA EVENT DAEMON READY TO PROCESS EVENT", NULL);
18937
18938 goto loop;
18939 }
18940
18941 /*
18942 * Specific HBA instance event processing.
18943 *
18944 * NOTE: At the moment, device event processing is limited to hard disks
18945 * only.
18946 * Port multiplier is supported now.
18947 */
18948 static void
sata_process_controller_events(sata_hba_inst_t * sata_hba_inst)18949 sata_process_controller_events(sata_hba_inst_t *sata_hba_inst)
18950 {
18951 int ncport;
18952 uint32_t event_flags;
18953 sata_address_t *saddr;
18954 sata_cport_info_t *cportinfo;
18955 sata_pmult_info_t *pmultinfo;
18956
18957 SATADBG1(SATA_DBG_EVENTS_CNTRL, sata_hba_inst,
18958 "Processing controller %d event(s)",
18959 ddi_get_instance(SATA_DIP(sata_hba_inst)));
18960
18961 mutex_enter(&sata_hba_inst->satahba_mutex);
18962 sata_hba_inst->satahba_event_flags &= ~SATA_EVNT_MAIN;
18963 event_flags = sata_hba_inst->satahba_event_flags;
18964 mutex_exit(&sata_hba_inst->satahba_mutex);
18965 /*
18966 * Process controller power change first
18967 * HERE
18968 */
18969 if (event_flags & SATA_EVNT_PWR_LEVEL_CHANGED)
18970 sata_process_cntrl_pwr_level_change(sata_hba_inst);
18971
18972 /*
18973 * Search through ports/devices to identify affected port/device.
18974 * We may have to process events for more than one port/device.
18975 */
18976 for (ncport = 0; ncport < SATA_NUM_CPORTS(sata_hba_inst); ncport++) {
18977 /*
18978 * Not all ports may be processed in attach by the time we
18979 * get an event. Check if port info is initialized.
18980 */
18981 mutex_enter(&sata_hba_inst->satahba_mutex);
18982 cportinfo = SATA_CPORT_INFO(sata_hba_inst, ncport);
18983 mutex_exit(&sata_hba_inst->satahba_mutex);
18984 if (cportinfo == NULL || cportinfo->cport_state == 0)
18985 continue;
18986
18987 /* We have initialized controller port info */
18988 mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst, ncport)));
18989 event_flags = (SATA_CPORT_INFO(sata_hba_inst, ncport))->
18990 cport_event_flags;
18991 /* Check if port was locked by IOCTL processing */
18992 if (event_flags & SATA_APCTL_LOCK_PORT_BUSY) {
18993 /*
18994 * We ignore port events because port is busy
18995 * with AP control processing. Set again
18996 * controller and main event flag, so that
18997 * events may be processed by the next daemon
18998 * run.
18999 */
19000 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst, ncport)));
19001 mutex_enter(&sata_hba_inst->satahba_mutex);
19002 sata_hba_inst->satahba_event_flags |= SATA_EVNT_MAIN;
19003 mutex_exit(&sata_hba_inst->satahba_mutex);
19004 mutex_enter(&sata_mutex);
19005 sata_event_pending |= SATA_EVNT_MAIN;
19006 mutex_exit(&sata_mutex);
19007 SATADBG1(SATA_DBG_EVENTS_PROCPST, sata_hba_inst,
19008 "Event processing postponed until "
19009 "AP control processing completes",
19010 NULL);
19011 /* Check other ports */
19012 continue;
19013 } else {
19014 /*
19015 * Set BSY flag so that AP control would not
19016 * interfere with events processing for
19017 * this port.
19018 */
19019 (SATA_CPORT_INFO(sata_hba_inst, ncport))->
19020 cport_event_flags |= SATA_EVNT_LOCK_PORT_BUSY;
19021 }
19022 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst, ncport)));
19023
19024 saddr = &(SATA_CPORT_INFO(sata_hba_inst, ncport))->cport_addr;
19025
19026 if ((event_flags &
19027 (SATA_EVNT_PORT_EVENTS | SATA_EVNT_DRIVE_EVENTS)) != 0) {
19028 /*
19029 * Got port event.
19030 * We need some hierarchy of event processing as they
19031 * are affecting each other:
19032 * 1. port failed
19033 * 2. device detached/attached
19034 * 3. link events - link events may trigger device
19035 * detached or device attached events in some
19036 * circumstances.
19037 * 4. port power level changed
19038 */
19039 if (event_flags & SATA_EVNT_PORT_FAILED) {
19040 sata_process_port_failed_event(sata_hba_inst,
19041 saddr);
19042 }
19043 if (event_flags & SATA_EVNT_DEVICE_DETACHED) {
19044 sata_process_device_detached(sata_hba_inst,
19045 saddr);
19046 }
19047 if (event_flags & SATA_EVNT_DEVICE_ATTACHED) {
19048 sata_process_device_attached(sata_hba_inst,
19049 saddr);
19050 }
19051 if (event_flags &
19052 (SATA_EVNT_LINK_ESTABLISHED |
19053 SATA_EVNT_LINK_LOST)) {
19054 sata_process_port_link_events(sata_hba_inst,
19055 saddr);
19056 }
19057 if (event_flags & SATA_EVNT_PWR_LEVEL_CHANGED) {
19058 sata_process_port_pwr_change(sata_hba_inst,
19059 saddr);
19060 }
19061 if (event_flags & SATA_EVNT_TARGET_NODE_CLEANUP) {
19062 sata_process_target_node_cleanup(
19063 sata_hba_inst, saddr);
19064 }
19065 if (event_flags & SATA_EVNT_AUTOONLINE_DEVICE) {
19066 sata_process_device_autoonline(
19067 sata_hba_inst, saddr);
19068 }
19069 }
19070
19071
19072 /*
19073 * Scan port multiplier and all its sub-ports event flags.
19074 * The events are marked by
19075 * (1) sata_pmult_info.pmult_event_flags
19076 * (2) sata_pmport_info.pmport_event_flags
19077 */
19078 mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst, ncport)));
19079 if (cportinfo->cport_dev_type == SATA_DTYPE_PMULT) {
19080 /*
19081 * There should be another extra check: this
19082 * port multiplier still exists?
19083 */
19084 pmultinfo = SATA_PMULT_INFO(sata_hba_inst,
19085 ncport);
19086
19087 if (pmultinfo != NULL) {
19088 mutex_exit(&(SATA_CPORT_MUTEX(
19089 sata_hba_inst, ncport)));
19090 sata_process_pmult_events(
19091 sata_hba_inst, ncport);
19092 mutex_enter(&(SATA_CPORT_MUTEX(
19093 sata_hba_inst, ncport)));
19094 } else {
19095 SATADBG1(SATA_DBG_PMULT, sata_hba_inst,
19096 "Port-multiplier is gone. "
19097 "Ignore all sub-device events "
19098 "at port %d.", ncport);
19099 }
19100 }
19101
19102 if ((SATA_CPORT_DEV_TYPE(sata_hba_inst, ncport) !=
19103 SATA_DTYPE_NONE) &&
19104 (SATA_CPORT_DRV_INFO(sata_hba_inst, ncport) != NULL)) {
19105 if (SATA_CPORT_DRV_INFO(sata_hba_inst, ncport)->
19106 satadrv_event_flags &
19107 (SATA_EVNT_DEVICE_RESET |
19108 SATA_EVNT_INPROC_DEVICE_RESET)) {
19109 /* Have device event */
19110 sata_process_device_reset(sata_hba_inst,
19111 saddr);
19112 }
19113 }
19114 /* Release PORT_BUSY flag */
19115 (SATA_CPORT_INFO(sata_hba_inst, ncport))->
19116 cport_event_flags &= ~SATA_EVNT_LOCK_PORT_BUSY;
19117 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst, ncport)));
19118
19119 } /* End of loop through the controller SATA ports */
19120 }
19121
19122 /*
19123 * Specific port multiplier instance event processing. At the moment, device
19124 * event processing is limited to link/attach event only.
19125 *
19126 * NOTE: power management event is not supported yet.
19127 */
19128 static void
sata_process_pmult_events(sata_hba_inst_t * sata_hba_inst,uint8_t cport)19129 sata_process_pmult_events(sata_hba_inst_t *sata_hba_inst, uint8_t cport)
19130 {
19131 sata_cport_info_t *cportinfo = SATA_CPORT_INFO(sata_hba_inst, cport);
19132 sata_pmult_info_t *pmultinfo;
19133 sata_pmport_info_t *pmportinfo;
19134 sata_address_t *saddr;
19135 sata_device_t sata_device;
19136 uint32_t event_flags;
19137 int npmport;
19138 int rval;
19139
19140 SATADBG2(SATA_DBG_EVENTS_CNTRL|SATA_DBG_PMULT, sata_hba_inst,
19141 "Processing pmult event(s) on cport %d of controller %d",
19142 cport, ddi_get_instance(SATA_DIP(sata_hba_inst)));
19143
19144 /* First process events on port multiplier */
19145 mutex_enter(&cportinfo->cport_mutex);
19146 pmultinfo = SATA_PMULT_INFO(sata_hba_inst, cport);
19147 event_flags = pmultinfo->pmult_event_flags;
19148
19149 /*
19150 * Reset event (of port multiplier) has higher priority because the
19151 * port multiplier itself might be failed or removed after reset.
19152 */
19153 if (event_flags & SATA_EVNT_DEVICE_RESET) {
19154 /*
19155 * The status of the sub-links are uncertain,
19156 * so mark all sub-ports as RESET
19157 */
19158 for (npmport = 0; npmport < SATA_NUM_PMPORTS(
19159 sata_hba_inst, cport); npmport ++) {
19160 pmportinfo = SATA_PMPORT_INFO(sata_hba_inst,
19161 cport, npmport);
19162 if (pmportinfo == NULL) {
19163 /* That's weird. */
19164 SATA_LOG_D((sata_hba_inst, CE_WARN,
19165 "sata_hba_event_notify: "
19166 "invalid/un-implemented "
19167 "port %d:%d (%d ports), ",
19168 cport, npmport, SATA_NUM_PMPORTS(
19169 sata_hba_inst, cport)));
19170 continue;
19171 }
19172
19173 mutex_enter(&pmportinfo->pmport_mutex);
19174
19175 /* Mark all pmport to unknow state. */
19176 pmportinfo->pmport_state = SATA_STATE_UNKNOWN;
19177 /* Mark all pmports with link events. */
19178 pmportinfo->pmport_event_flags =
19179 (SATA_EVNT_LINK_ESTABLISHED|SATA_EVNT_LINK_LOST);
19180 mutex_exit(&pmportinfo->pmport_mutex);
19181 }
19182
19183 } else if (event_flags & SATA_EVNT_PMULT_LINK_CHANGED) {
19184 /*
19185 * We need probe the port multiplier to know what has
19186 * happened.
19187 */
19188 bzero(&sata_device, sizeof (sata_device_t));
19189 sata_device.satadev_rev = SATA_DEVICE_REV;
19190 sata_device.satadev_addr.cport = cport;
19191 sata_device.satadev_addr.pmport = SATA_PMULT_HOSTPORT;
19192 sata_device.satadev_addr.qual = SATA_ADDR_PMULT;
19193
19194 mutex_exit(&cportinfo->cport_mutex);
19195 rval = (*SATA_PROBE_PORT_FUNC(sata_hba_inst))
19196 (SATA_DIP(sata_hba_inst), &sata_device);
19197 mutex_enter(&cportinfo->cport_mutex);
19198 if (rval != SATA_SUCCESS) {
19199 /* Something went wrong? Fail the port */
19200 cportinfo->cport_state = SATA_PSTATE_FAILED;
19201 mutex_exit(&cportinfo->cport_mutex);
19202 SATA_LOG_D((sata_hba_inst, CE_WARN,
19203 "SATA port %d probing failed", cport));
19204
19205 /* PMult structure must be released. */
19206 sata_free_pmult(sata_hba_inst, &sata_device);
19207 return;
19208 }
19209
19210 sata_update_port_info(sata_hba_inst, &sata_device);
19211
19212 /*
19213 * Sanity check - Port is active? Is the link active?
19214 * The device is still a port multiplier?
19215 */
19216 if ((cportinfo->cport_state &
19217 (SATA_PSTATE_SHUTDOWN | SATA_PSTATE_FAILED)) ||
19218 ((cportinfo->cport_scr.sstatus &
19219 SATA_PORT_DEVLINK_UP_MASK) != SATA_PORT_DEVLINK_UP) ||
19220 (cportinfo->cport_dev_type != SATA_DTYPE_PMULT)) {
19221 mutex_exit(&cportinfo->cport_mutex);
19222
19223 /* PMult structure must be released. */
19224 sata_free_pmult(sata_hba_inst, &sata_device);
19225 return;
19226 }
19227
19228 /* Probed succeed, set port ready. */
19229 cportinfo->cport_state |=
19230 SATA_STATE_PROBED | SATA_STATE_READY;
19231 }
19232
19233 /* Release port multiplier event flags. */
19234 pmultinfo->pmult_event_flags &=
19235 ~(SATA_EVNT_DEVICE_RESET|SATA_EVNT_PMULT_LINK_CHANGED);
19236 mutex_exit(&cportinfo->cport_mutex);
19237
19238 /*
19239 * Check all sub-links.
19240 */
19241 for (npmport = 0; npmport < SATA_NUM_PMPORTS(sata_hba_inst, cport);
19242 npmport ++) {
19243 pmportinfo = SATA_PMPORT_INFO(sata_hba_inst, cport, npmport);
19244 mutex_enter(&pmportinfo->pmport_mutex);
19245 event_flags = pmportinfo->pmport_event_flags;
19246 mutex_exit(&pmportinfo->pmport_mutex);
19247 saddr = &pmportinfo->pmport_addr;
19248
19249 if ((event_flags &
19250 (SATA_EVNT_PORT_EVENTS | SATA_EVNT_DRIVE_EVENTS)) != 0) {
19251 /*
19252 * Got port multiplier port event.
19253 * We need some hierarchy of event processing as they
19254 * are affecting each other:
19255 * 1. device detached/attached
19256 * 2. link events - link events may trigger device
19257 * detached or device attached events in some
19258 * circumstances.
19259 */
19260 if (event_flags & SATA_EVNT_DEVICE_DETACHED) {
19261 sata_process_pmdevice_detached(sata_hba_inst,
19262 saddr);
19263 }
19264 if (event_flags & SATA_EVNT_DEVICE_ATTACHED) {
19265 sata_process_pmdevice_attached(sata_hba_inst,
19266 saddr);
19267 }
19268 if (event_flags & SATA_EVNT_LINK_ESTABLISHED ||
19269 event_flags & SATA_EVNT_LINK_LOST) {
19270 sata_process_pmport_link_events(sata_hba_inst,
19271 saddr);
19272 }
19273 if (event_flags & SATA_EVNT_TARGET_NODE_CLEANUP) {
19274 sata_process_target_node_cleanup(
19275 sata_hba_inst, saddr);
19276 }
19277 }
19278
19279 /* Checking drive event(s). */
19280 mutex_enter(&pmportinfo->pmport_mutex);
19281 if (pmportinfo->pmport_dev_type != SATA_DTYPE_NONE &&
19282 pmportinfo->pmport_sata_drive != NULL) {
19283 event_flags = pmportinfo->pmport_sata_drive->
19284 satadrv_event_flags;
19285 if (event_flags & (SATA_EVNT_DEVICE_RESET |
19286 SATA_EVNT_INPROC_DEVICE_RESET)) {
19287
19288 /* Have device event */
19289 sata_process_pmdevice_reset(sata_hba_inst,
19290 saddr);
19291 }
19292 }
19293 mutex_exit(&pmportinfo->pmport_mutex);
19294
19295 /* Release PORT_BUSY flag */
19296 mutex_enter(&cportinfo->cport_mutex);
19297 cportinfo->cport_event_flags &= ~SATA_EVNT_LOCK_PORT_BUSY;
19298 mutex_exit(&cportinfo->cport_mutex);
19299 }
19300
19301 SATADBG2(SATA_DBG_EVENTS_CNTRL|SATA_DBG_PMULT, sata_hba_inst,
19302 "[DONE] pmult event(s) on cport %d of controller %d",
19303 cport, ddi_get_instance(SATA_DIP(sata_hba_inst)));
19304 }
19305
19306 /*
19307 * Process HBA power level change reported by HBA driver.
19308 * Not implemented at this time - event is ignored.
19309 */
19310 static void
sata_process_cntrl_pwr_level_change(sata_hba_inst_t * sata_hba_inst)19311 sata_process_cntrl_pwr_level_change(sata_hba_inst_t *sata_hba_inst)
19312 {
19313 SATADBG1(SATA_DBG_EVENTS_PROC, sata_hba_inst,
19314 "Processing controller power level change", NULL);
19315
19316 /* Ignoring it for now */
19317 mutex_enter(&sata_hba_inst->satahba_mutex);
19318 sata_hba_inst->satahba_event_flags &= ~SATA_EVNT_PWR_LEVEL_CHANGED;
19319 mutex_exit(&sata_hba_inst->satahba_mutex);
19320 }
19321
19322 /*
19323 * Process port power level change reported by HBA driver.
19324 * Not implemented at this time - event is ignored.
19325 */
19326 static void
sata_process_port_pwr_change(sata_hba_inst_t * sata_hba_inst,sata_address_t * saddr)19327 sata_process_port_pwr_change(sata_hba_inst_t *sata_hba_inst,
19328 sata_address_t *saddr)
19329 {
19330 sata_cport_info_t *cportinfo;
19331
19332 SATADBG1(SATA_DBG_EVENTS_PROC, sata_hba_inst,
19333 "Processing port power level change", NULL);
19334
19335 cportinfo = SATA_CPORT_INFO(sata_hba_inst, saddr->cport);
19336 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->cport_mutex);
19337 /* Reset event flag */
19338 cportinfo->cport_event_flags &= ~SATA_EVNT_PWR_LEVEL_CHANGED;
19339 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->cport_mutex);
19340 }
19341
19342 /*
19343 * Process port failure reported by HBA driver.
19344 * cports support only - no pmports.
19345 */
19346 static void
sata_process_port_failed_event(sata_hba_inst_t * sata_hba_inst,sata_address_t * saddr)19347 sata_process_port_failed_event(sata_hba_inst_t *sata_hba_inst,
19348 sata_address_t *saddr)
19349 {
19350 sata_cport_info_t *cportinfo;
19351
19352 cportinfo = SATA_CPORT_INFO(sata_hba_inst, saddr->cport);
19353 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->cport_mutex);
19354 /* Reset event flag first */
19355 cportinfo->cport_event_flags &= ~SATA_EVNT_PORT_FAILED;
19356 /* If the port is in SHUTDOWN or FAILED state, ignore this event. */
19357 if ((cportinfo->cport_state &
19358 (SATA_PSTATE_SHUTDOWN | SATA_PSTATE_FAILED)) == 0) {
19359 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->
19360 cport_mutex);
19361 return;
19362 }
19363 /* Fail the port */
19364 cportinfo->cport_state = SATA_PSTATE_FAILED;
19365 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->cport_mutex);
19366 sata_log(sata_hba_inst, CE_WARN, "SATA port %d failed", saddr->cport);
19367 }
19368
19369 /*
19370 * Device Reset Event processing.
19371 * The sequence is managed by 3 stage flags:
19372 * - reset event reported,
19373 * - reset event being processed,
19374 * - request to clear device reset state.
19375 *
19376 * NOTE: This function has to be entered with cport mutex held. It exits with
19377 * mutex held as well, but can release mutex during the processing.
19378 */
19379 static void
sata_process_device_reset(sata_hba_inst_t * sata_hba_inst,sata_address_t * saddr)19380 sata_process_device_reset(sata_hba_inst_t *sata_hba_inst,
19381 sata_address_t *saddr)
19382 {
19383 sata_drive_info_t old_sdinfo; /* local copy of the drive info */
19384 sata_drive_info_t *sdinfo;
19385 sata_cport_info_t *cportinfo;
19386 sata_device_t sata_device;
19387 int rval_probe, rval_set;
19388
19389 /* We only care about host sata cport for now */
19390 cportinfo = SATA_CPORT_INFO(sata_hba_inst, saddr->cport);
19391 sdinfo = SATA_CPORT_DRV_INFO(sata_hba_inst, saddr->cport);
19392 /*
19393 * If the port is in SHUTDOWN or FAILED state, or device is in FAILED
19394 * state, ignore reset event.
19395 */
19396 if (((cportinfo->cport_state &
19397 (SATA_PSTATE_SHUTDOWN | SATA_PSTATE_FAILED)) != 0) ||
19398 (sdinfo->satadrv_state & SATA_DSTATE_FAILED) != 0) {
19399 sdinfo->satadrv_event_flags &=
19400 ~(SATA_EVNT_DEVICE_RESET | SATA_EVNT_INPROC_DEVICE_RESET);
19401 return;
19402 }
19403
19404 if ((SATA_CPORT_DEV_TYPE(sata_hba_inst, saddr->cport) ==
19405 SATA_DTYPE_PMULT)) {
19406 /*
19407 * Should not happened: this is already handled in
19408 * sata_hba_event_notify()
19409 */
19410 mutex_exit(&cportinfo->cport_mutex);
19411 goto done;
19412 }
19413
19414 if ((SATA_CPORT_DEV_TYPE(sata_hba_inst, saddr->cport) &
19415 SATA_VALID_DEV_TYPE) == 0) {
19416 /*
19417 * This should not happen - coding error.
19418 * But we can recover, so do not panic, just clean up
19419 * and if in debug mode, log the message.
19420 */
19421 #ifdef SATA_DEBUG
19422 sata_log(sata_hba_inst, CE_WARN,
19423 "sata_process_device_reset: "
19424 "Invalid device type with sdinfo!", NULL);
19425 #endif
19426 sdinfo->satadrv_event_flags = 0;
19427 return;
19428 }
19429
19430 #ifdef SATA_DEBUG
19431 if ((sdinfo->satadrv_event_flags &
19432 (SATA_EVNT_DEVICE_RESET | SATA_EVNT_INPROC_DEVICE_RESET)) == 0) {
19433 /* Nothing to do */
19434 /* Something is weird - why we are processing dev reset? */
19435 SATADBG1(SATA_DBG_EVENTS_PROC, sata_hba_inst,
19436 "No device reset event!!!!", NULL);
19437
19438 return;
19439 }
19440 if ((sdinfo->satadrv_event_flags &
19441 (SATA_EVNT_DEVICE_RESET | SATA_EVNT_INPROC_DEVICE_RESET)) ==
19442 (SATA_EVNT_DEVICE_RESET | SATA_EVNT_INPROC_DEVICE_RESET)) {
19443 /* Something is weird - new device reset event */
19444 SATADBG1(SATA_DBG_EVENTS_PROC, sata_hba_inst,
19445 "Overlapping device reset events!", NULL);
19446 }
19447 #endif
19448 SATADBG1(SATA_DBG_EVENTS_PROC, sata_hba_inst,
19449 "Processing port %d device reset", saddr->cport);
19450
19451 /* Clear event flag */
19452 sdinfo->satadrv_event_flags &= ~SATA_EVNT_DEVICE_RESET;
19453
19454 /* It seems that we always need to check the port state first */
19455 sata_device.satadev_rev = SATA_DEVICE_REV;
19456 sata_device.satadev_addr = *saddr;
19457 /*
19458 * We have to exit mutex, because the HBA probe port function may
19459 * block on its own mutex.
19460 */
19461 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->cport_mutex);
19462 rval_probe = (*SATA_PROBE_PORT_FUNC(sata_hba_inst))
19463 (SATA_DIP(sata_hba_inst), &sata_device);
19464 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->cport_mutex);
19465 sata_update_port_info(sata_hba_inst, &sata_device);
19466 if (rval_probe != SATA_SUCCESS) {
19467 /* Something went wrong? Fail the port */
19468 cportinfo->cport_state = SATA_PSTATE_FAILED;
19469 sdinfo = SATA_CPORT_DRV_INFO(sata_hba_inst, saddr->cport);
19470 if (sdinfo != NULL)
19471 sdinfo->satadrv_event_flags = 0;
19472 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->
19473 cport_mutex);
19474 SATA_LOG_D((sata_hba_inst, CE_WARN,
19475 "SATA port %d probing failed",
19476 saddr->cport));
19477 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst,
19478 saddr->cport)->cport_mutex);
19479 return;
19480 }
19481 if ((sata_device.satadev_scr.sstatus &
19482 SATA_PORT_DEVLINK_UP_MASK) !=
19483 SATA_PORT_DEVLINK_UP ||
19484 sata_device.satadev_type == SATA_DTYPE_NONE) {
19485 /*
19486 * No device to process, anymore. Some other event processing
19487 * would or have already performed port info cleanup.
19488 * To be safe (HBA may need it), request clearing device
19489 * reset condition.
19490 */
19491 sdinfo = SATA_CPORT_DRV_INFO(sata_hba_inst, saddr->cport);
19492 if (sdinfo != NULL) {
19493 sdinfo->satadrv_event_flags &=
19494 ~SATA_EVNT_INPROC_DEVICE_RESET;
19495 sdinfo->satadrv_event_flags |=
19496 SATA_EVNT_CLEAR_DEVICE_RESET;
19497 }
19498 return;
19499 }
19500
19501 sdinfo = SATA_CPORT_DRV_INFO(sata_hba_inst, saddr->cport);
19502 if (sdinfo == NULL) {
19503 return;
19504 }
19505 if ((sdinfo->satadrv_event_flags &
19506 SATA_EVNT_INPROC_DEVICE_RESET) == 0) {
19507 /*
19508 * Start tracking time for device feature restoration and
19509 * identification. Save current time (lbolt value).
19510 */
19511 sdinfo->satadrv_reset_time = ddi_get_lbolt();
19512 }
19513 /* Mark device reset processing as active */
19514 sdinfo->satadrv_event_flags |= SATA_EVNT_INPROC_DEVICE_RESET;
19515
19516 old_sdinfo = *sdinfo; /* local copy of the drive info */
19517 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->cport_mutex);
19518
19519 rval_set = sata_set_drive_features(sata_hba_inst, &old_sdinfo, 1);
19520
19521 if (rval_set != SATA_SUCCESS) {
19522 /*
19523 * Restoring drive setting failed.
19524 * Probe the port first, to check if the port state has changed
19525 */
19526 sata_device.satadev_rev = SATA_DEVICE_REV;
19527 sata_device.satadev_addr = *saddr;
19528 sata_device.satadev_addr.qual = SATA_ADDR_CPORT;
19529 /* probe port */
19530 rval_probe = (*SATA_PROBE_PORT_FUNC(sata_hba_inst))
19531 (SATA_DIP(sata_hba_inst), &sata_device);
19532 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->
19533 cport_mutex);
19534 if (rval_probe == SATA_SUCCESS &&
19535 (sata_device.satadev_state &
19536 (SATA_PSTATE_SHUTDOWN | SATA_PSTATE_FAILED)) == 0 &&
19537 (sata_device.satadev_scr.sstatus &
19538 SATA_PORT_DEVLINK_UP_MASK) == SATA_PORT_DEVLINK_UP &&
19539 sata_device.satadev_type != SATA_DTYPE_NONE) {
19540 /*
19541 * We may retry this a bit later - in-process reset
19542 * condition should be already set.
19543 * Track retry time for device identification.
19544 */
19545 if ((cportinfo->cport_dev_type &
19546 SATA_VALID_DEV_TYPE) != 0 &&
19547 SATA_CPORTINFO_DRV_INFO(cportinfo) != NULL &&
19548 sdinfo->satadrv_reset_time != 0) {
19549 clock_t cur_time = ddi_get_lbolt();
19550 /*
19551 * If the retry time limit was not
19552 * exceeded, retry.
19553 */
19554 if ((cur_time - sdinfo->satadrv_reset_time) <
19555 drv_usectohz(SATA_DEV_REPROBE_TIMEOUT)) {
19556 mutex_enter(
19557 &sata_hba_inst->satahba_mutex);
19558 sata_hba_inst->satahba_event_flags |=
19559 SATA_EVNT_MAIN;
19560 mutex_exit(
19561 &sata_hba_inst->satahba_mutex);
19562 mutex_enter(&sata_mutex);
19563 sata_event_pending |= SATA_EVNT_MAIN;
19564 mutex_exit(&sata_mutex);
19565 return;
19566 }
19567 if (rval_set == SATA_RETRY) {
19568 /*
19569 * Setting drive features failed, but
19570 * the drive is still accessible,
19571 * so emit a warning message before
19572 * return.
19573 */
19574 mutex_exit(&SATA_CPORT_INFO(
19575 sata_hba_inst,
19576 saddr->cport)->cport_mutex);
19577 goto done;
19578 }
19579 }
19580 /* Fail the drive */
19581 sdinfo->satadrv_state = SATA_DSTATE_FAILED;
19582
19583 sata_log(sata_hba_inst, CE_WARN,
19584 "SATA device at port %d - device failed",
19585 saddr->cport);
19586
19587 DTRACE_PROBE(port_failed_f);
19588 }
19589 /*
19590 * No point of retrying - device failed or some other event
19591 * processing or already did or will do port info cleanup.
19592 * To be safe (HBA may need it),
19593 * request clearing device reset condition.
19594 */
19595 sdinfo->satadrv_event_flags |= SATA_EVNT_CLEAR_DEVICE_RESET;
19596 sdinfo->satadrv_event_flags &= ~SATA_EVNT_INPROC_DEVICE_RESET;
19597 sdinfo->satadrv_reset_time = 0;
19598 return;
19599 }
19600 done:
19601 /*
19602 * If setting of drive features failed, but the drive is still
19603 * accessible, emit a warning message.
19604 */
19605 if (rval_set == SATA_RETRY) {
19606 sata_log(sata_hba_inst, CE_WARN,
19607 "SATA device at port %d - desired setting could not be "
19608 "restored after reset. Device may not operate as expected.",
19609 saddr->cport);
19610 }
19611 /*
19612 * Raise the flag indicating that the next sata command could
19613 * be sent with SATA_CLEAR_DEV_RESET_STATE flag, if no new device
19614 * reset is reported.
19615 */
19616 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->cport_mutex);
19617 if (SATA_CPORTINFO_DRV_INFO(cportinfo) != NULL) {
19618 sdinfo->satadrv_reset_time = 0;
19619 if ((cportinfo->cport_dev_type & SATA_VALID_DEV_TYPE) != 0) {
19620 sdinfo = SATA_CPORTINFO_DRV_INFO(cportinfo);
19621 sdinfo->satadrv_event_flags &=
19622 ~SATA_EVNT_INPROC_DEVICE_RESET;
19623 sdinfo->satadrv_event_flags |=
19624 SATA_EVNT_CLEAR_DEVICE_RESET;
19625 }
19626 }
19627 }
19628
19629
19630 /*
19631 * Port Multiplier Port Device Reset Event processing.
19632 *
19633 * NOTE: This function has to be entered with pmport mutex held. It exits with
19634 * mutex held as well, but can release mutex during the processing.
19635 */
19636 static void
sata_process_pmdevice_reset(sata_hba_inst_t * sata_hba_inst,sata_address_t * saddr)19637 sata_process_pmdevice_reset(sata_hba_inst_t *sata_hba_inst,
19638 sata_address_t *saddr)
19639 {
19640 sata_drive_info_t old_sdinfo; /* local copy of the drive info */
19641 sata_drive_info_t *sdinfo = NULL;
19642 sata_cport_info_t *cportinfo = NULL;
19643 sata_pmport_info_t *pmportinfo = NULL;
19644 sata_pmult_info_t *pminfo = NULL;
19645 sata_device_t sata_device;
19646 uint8_t cport = saddr->cport;
19647 uint8_t pmport = saddr->pmport;
19648 int rval;
19649
19650 SATADBG2(SATA_DBG_EVENTS_PROC, sata_hba_inst,
19651 "Processing drive reset at port %d:%d", cport, pmport);
19652
19653 cportinfo = SATA_CPORT_INFO(sata_hba_inst, cport);
19654 pmportinfo = SATA_PMPORT_INFO(sata_hba_inst, cport, pmport);
19655 sdinfo = SATA_PMPORT_DRV_INFO(sata_hba_inst, cport, pmport);
19656
19657 /*
19658 * If the port is in SHUTDOWN or FAILED state, or device is in FAILED
19659 * state, ignore reset event.
19660 */
19661 if (((cportinfo->cport_state &
19662 (SATA_PSTATE_SHUTDOWN | SATA_PSTATE_FAILED)) != 0) ||
19663 (sdinfo->satadrv_state & SATA_DSTATE_FAILED) != 0) {
19664 sdinfo->satadrv_event_flags &=
19665 ~(SATA_EVNT_DEVICE_RESET | SATA_EVNT_INPROC_DEVICE_RESET);
19666 return;
19667 }
19668
19669 if ((pmportinfo->pmport_dev_type & SATA_VALID_DEV_TYPE) == 0) {
19670 /*
19671 * This should not happen - coding error.
19672 * But we can recover, so do not panic, just clean up
19673 * and if in debug mode, log the message.
19674 */
19675 #ifdef SATA_DEBUG
19676 sata_log(sata_hba_inst, CE_WARN,
19677 "sata_process_pmdevice_reset: "
19678 "Invalid device type with sdinfo!", NULL);
19679 #endif
19680 sdinfo->satadrv_event_flags = 0;
19681 return;
19682 }
19683
19684 #ifdef SATA_DEBUG
19685 if ((sdinfo->satadrv_event_flags &
19686 (SATA_EVNT_DEVICE_RESET | SATA_EVNT_INPROC_DEVICE_RESET)) == 0) {
19687 /* Nothing to do */
19688 /* Something is weird - why we are processing dev reset? */
19689 SATADBG1(SATA_DBG_EVENTS_PROC, sata_hba_inst,
19690 "No device reset event!!!!", NULL);
19691
19692 return;
19693 }
19694 if ((sdinfo->satadrv_event_flags &
19695 (SATA_EVNT_DEVICE_RESET | SATA_EVNT_INPROC_DEVICE_RESET)) ==
19696 (SATA_EVNT_DEVICE_RESET | SATA_EVNT_INPROC_DEVICE_RESET)) {
19697 /* Something is weird - new device reset event */
19698 SATADBG1(SATA_DBG_EVENTS_PROC, sata_hba_inst,
19699 "Overlapping device reset events!", NULL);
19700 }
19701 #endif
19702 SATADBG2(SATA_DBG_EVENTS_PROC, sata_hba_inst,
19703 "Processing port %d:%d device reset", cport, pmport);
19704
19705 /* Clear event flag */
19706 sdinfo->satadrv_event_flags &= ~SATA_EVNT_DEVICE_RESET;
19707
19708 /* It seems that we always need to check the port state first */
19709 sata_device.satadev_rev = SATA_DEVICE_REV;
19710 sata_device.satadev_addr = *saddr;
19711 /*
19712 * We have to exit mutex, because the HBA probe port function may
19713 * block on its own mutex.
19714 */
19715 mutex_exit(&pmportinfo->pmport_mutex);
19716 rval = (*SATA_PROBE_PORT_FUNC(sata_hba_inst))
19717 (SATA_DIP(sata_hba_inst), &sata_device);
19718 mutex_enter(&pmportinfo->pmport_mutex);
19719
19720 sata_update_pmport_info(sata_hba_inst, &sata_device);
19721 if (rval != SATA_SUCCESS) {
19722 /* Something went wrong? Fail the port */
19723 pmportinfo->pmport_state = SATA_PSTATE_FAILED;
19724 sdinfo = SATA_PMPORT_DRV_INFO(sata_hba_inst, saddr->cport,
19725 saddr->pmport);
19726 if (sdinfo != NULL)
19727 sdinfo->satadrv_event_flags = 0;
19728 mutex_exit(&pmportinfo->pmport_mutex);
19729 SATA_LOG_D((sata_hba_inst, CE_WARN,
19730 "SATA port %d:%d probing failed",
19731 saddr->cport, saddr->pmport));
19732 mutex_enter(&pmportinfo->pmport_mutex);
19733 return;
19734 }
19735 if ((sata_device.satadev_scr.sstatus &
19736 SATA_PORT_DEVLINK_UP_MASK) !=
19737 SATA_PORT_DEVLINK_UP ||
19738 sata_device.satadev_type == SATA_DTYPE_NONE) {
19739 /*
19740 * No device to process, anymore. Some other event processing
19741 * would or have already performed port info cleanup.
19742 * To be safe (HBA may need it), request clearing device
19743 * reset condition.
19744 */
19745 sdinfo = SATA_PMPORT_DRV_INFO(sata_hba_inst, saddr->cport,
19746 saddr->pmport);
19747 if (sdinfo != NULL) {
19748 sdinfo->satadrv_event_flags &=
19749 ~SATA_EVNT_INPROC_DEVICE_RESET;
19750 /* must clear flags on cport */
19751 pminfo = SATA_PMULT_INFO(sata_hba_inst,
19752 saddr->cport);
19753 pminfo->pmult_event_flags |=
19754 SATA_EVNT_CLEAR_DEVICE_RESET;
19755 }
19756 return;
19757 }
19758
19759 sdinfo = SATA_PMPORT_DRV_INFO(sata_hba_inst, saddr->cport,
19760 saddr->pmport);
19761 if (sdinfo == NULL) {
19762 return;
19763 }
19764 if ((sdinfo->satadrv_event_flags &
19765 SATA_EVNT_INPROC_DEVICE_RESET) == 0) {
19766 /*
19767 * Start tracking time for device feature restoration and
19768 * identification. Save current time (lbolt value).
19769 */
19770 sdinfo->satadrv_reset_time = ddi_get_lbolt();
19771 }
19772 /* Mark device reset processing as active */
19773 sdinfo->satadrv_event_flags |= SATA_EVNT_INPROC_DEVICE_RESET;
19774
19775 old_sdinfo = *sdinfo; /* local copy of the drive info */
19776 mutex_exit(&pmportinfo->pmport_mutex);
19777
19778 if (sata_set_drive_features(sata_hba_inst, &old_sdinfo, 1) ==
19779 SATA_FAILURE) {
19780 /*
19781 * Restoring drive setting failed.
19782 * Probe the port first, to check if the port state has changed
19783 */
19784 sata_device.satadev_rev = SATA_DEVICE_REV;
19785 sata_device.satadev_addr = *saddr;
19786 sata_device.satadev_addr.qual = SATA_ADDR_PMPORT;
19787
19788 /* probe port */
19789 rval = (*SATA_PROBE_PORT_FUNC(sata_hba_inst))
19790 (SATA_DIP(sata_hba_inst), &sata_device);
19791 mutex_enter(&pmportinfo->pmport_mutex);
19792 if (rval == SATA_SUCCESS &&
19793 (sata_device.satadev_state &
19794 (SATA_PSTATE_SHUTDOWN | SATA_PSTATE_FAILED)) == 0 &&
19795 (sata_device.satadev_scr.sstatus &
19796 SATA_PORT_DEVLINK_UP_MASK) == SATA_PORT_DEVLINK_UP &&
19797 sata_device.satadev_type != SATA_DTYPE_NONE) {
19798 /*
19799 * We may retry this a bit later - in-process reset
19800 * condition should be already set.
19801 * Track retry time for device identification.
19802 */
19803 if ((pmportinfo->pmport_dev_type &
19804 SATA_VALID_DEV_TYPE) != 0 &&
19805 SATA_PMPORTINFO_DRV_INFO(pmportinfo) != NULL &&
19806 sdinfo->satadrv_reset_time != 0) {
19807 clock_t cur_time = ddi_get_lbolt();
19808 /*
19809 * If the retry time limit was not
19810 * exceeded, retry.
19811 */
19812 if ((cur_time - sdinfo->satadrv_reset_time) <
19813 drv_usectohz(SATA_DEV_REPROBE_TIMEOUT)) {
19814 mutex_enter(
19815 &sata_hba_inst->satahba_mutex);
19816 sata_hba_inst->satahba_event_flags |=
19817 SATA_EVNT_MAIN;
19818 mutex_exit(
19819 &sata_hba_inst->satahba_mutex);
19820 mutex_enter(&sata_mutex);
19821 sata_event_pending |= SATA_EVNT_MAIN;
19822 mutex_exit(&sata_mutex);
19823 return;
19824 }
19825 }
19826 /* Fail the drive */
19827 sdinfo->satadrv_state = SATA_DSTATE_FAILED;
19828
19829 sata_log(sata_hba_inst, CE_WARN,
19830 "SATA device at port %d:%d - device failed",
19831 saddr->cport, saddr->pmport);
19832 } else {
19833 /*
19834 * No point of retrying - some other event processing
19835 * would or already did port info cleanup.
19836 * To be safe (HBA may need it),
19837 * request clearing device reset condition.
19838 */
19839 sdinfo->satadrv_event_flags |=
19840 SATA_EVNT_CLEAR_DEVICE_RESET;
19841 }
19842 sdinfo->satadrv_event_flags &= ~SATA_EVNT_INPROC_DEVICE_RESET;
19843 sdinfo->satadrv_reset_time = 0;
19844 return;
19845 }
19846 /*
19847 * Raise the flag indicating that the next sata command could
19848 * be sent with SATA_CLEAR_DEV_RESET_STATE flag, if no new device
19849 * reset is reported.
19850 */
19851 mutex_enter(&pmportinfo->pmport_mutex);
19852 if (SATA_PMPORTINFO_DRV_INFO(pmportinfo) != NULL) {
19853 sdinfo->satadrv_reset_time = 0;
19854 if (pmportinfo->pmport_dev_type & SATA_VALID_DEV_TYPE) {
19855 sdinfo = SATA_PMPORTINFO_DRV_INFO(pmportinfo);
19856 sdinfo->satadrv_event_flags &=
19857 ~SATA_EVNT_INPROC_DEVICE_RESET;
19858 /* must clear flags on cport */
19859 pminfo = SATA_PMULT_INFO(sata_hba_inst,
19860 saddr->cport);
19861 pminfo->pmult_event_flags |=
19862 SATA_EVNT_CLEAR_DEVICE_RESET;
19863 }
19864 }
19865 }
19866
19867 /*
19868 * Port Link Events processing.
19869 * Every link established event may involve device reset (due to
19870 * COMRESET signal, equivalent of the hard reset) so arbitrarily
19871 * set device reset event for an attached device (if any).
19872 * If the port is in SHUTDOWN or FAILED state, ignore link events.
19873 *
19874 * The link established event processing varies, depending on the state
19875 * of the target node, HBA hotplugging capabilities, state of the port.
19876 * If the link is not active, the link established event is ignored.
19877 * If HBA cannot detect device attachment and there is no target node,
19878 * the link established event triggers device attach event processing.
19879 * Else, link established event triggers device reset event processing.
19880 *
19881 * The link lost event processing varies, depending on a HBA hotplugging
19882 * capability and the state of the port (link active or not active).
19883 * If the link is active, the lost link event is ignored.
19884 * If HBA cannot detect device removal, the lost link event triggers
19885 * device detached event processing after link lost timeout.
19886 * Else, the event is ignored.
19887 *
19888 * NOTE: Port multiplier ports events are handled by
19889 * sata_process_pmport_link_events();
19890 */
19891 static void
sata_process_port_link_events(sata_hba_inst_t * sata_hba_inst,sata_address_t * saddr)19892 sata_process_port_link_events(sata_hba_inst_t *sata_hba_inst,
19893 sata_address_t *saddr)
19894 {
19895 sata_device_t sata_device;
19896 sata_cport_info_t *cportinfo;
19897 sata_drive_info_t *sdinfo;
19898 uint32_t event_flags;
19899 int rval;
19900
19901 SATADBG1(SATA_DBG_EVENTS_PROC, sata_hba_inst,
19902 "Processing port %d link event(s)", saddr->cport);
19903
19904 cportinfo = SATA_CPORT_INFO(sata_hba_inst, saddr->cport);
19905 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->cport_mutex);
19906 event_flags = cportinfo->cport_event_flags;
19907
19908 /* Reset event flags first */
19909 cportinfo->cport_event_flags &=
19910 ~(SATA_EVNT_LINK_ESTABLISHED | SATA_EVNT_LINK_LOST);
19911
19912 /* If the port is in SHUTDOWN or FAILED state, ignore link events. */
19913 if ((cportinfo->cport_state &
19914 (SATA_PSTATE_SHUTDOWN | SATA_PSTATE_FAILED)) != 0) {
19915 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->
19916 cport_mutex);
19917 return;
19918 }
19919
19920 /*
19921 * For the sanity sake get current port state.
19922 * Set device address only. Other sata_device fields should be
19923 * set by HBA driver.
19924 */
19925 sata_device.satadev_rev = SATA_DEVICE_REV;
19926 sata_device.satadev_addr = *saddr;
19927 /*
19928 * We have to exit mutex, because the HBA probe port function may
19929 * block on its own mutex.
19930 */
19931 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->cport_mutex);
19932 rval = (*SATA_PROBE_PORT_FUNC(sata_hba_inst))
19933 (SATA_DIP(sata_hba_inst), &sata_device);
19934 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->cport_mutex);
19935 sata_update_port_info(sata_hba_inst, &sata_device);
19936 if (rval != SATA_SUCCESS) {
19937 /* Something went wrong? Fail the port */
19938 cportinfo->cport_state = SATA_PSTATE_FAILED;
19939 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->
19940 cport_mutex);
19941 SATA_LOG_D((sata_hba_inst, CE_WARN,
19942 "SATA port %d probing failed",
19943 saddr->cport));
19944 /*
19945 * We may want to release device info structure, but
19946 * it is not necessary.
19947 */
19948 return;
19949 } else {
19950 /* port probed successfully */
19951 cportinfo->cport_state |= SATA_STATE_PROBED | SATA_STATE_READY;
19952 }
19953 if (event_flags & SATA_EVNT_LINK_ESTABLISHED) {
19954
19955 if ((sata_device.satadev_scr.sstatus &
19956 SATA_PORT_DEVLINK_UP_MASK) != SATA_PORT_DEVLINK_UP) {
19957 /* Ignore event */
19958 SATADBG1(SATA_DBG_EVENTS_PROC, sata_hba_inst,
19959 "Ignoring port %d link established event - "
19960 "link down",
19961 saddr->cport);
19962 goto linklost;
19963 }
19964
19965 SATADBG1(SATA_DBG_EVENTS_PROC, sata_hba_inst,
19966 "Processing port %d link established event",
19967 saddr->cport);
19968
19969 /*
19970 * For the sanity sake check if a device is attached - check
19971 * return state of a port probing.
19972 */
19973 if (sata_device.satadev_type != SATA_DTYPE_NONE) {
19974 /*
19975 * HBA port probe indicated that there is a device
19976 * attached. Check if the framework had device info
19977 * structure attached for this device.
19978 */
19979 if (cportinfo->cport_dev_type != SATA_DTYPE_NONE) {
19980 ASSERT(SATA_CPORTINFO_DRV_INFO(cportinfo) !=
19981 NULL);
19982
19983 sdinfo = SATA_CPORTINFO_DRV_INFO(cportinfo);
19984 if ((sdinfo->satadrv_type &
19985 SATA_VALID_DEV_TYPE) != 0) {
19986 /*
19987 * Dev info structure is present.
19988 * If dev_type is set to known type in
19989 * the framework's drive info struct
19990 * then the device existed before and
19991 * the link was probably lost
19992 * momentarily - in such case
19993 * we may want to check device
19994 * identity.
19995 * Identity check is not supported now.
19996 *
19997 * Link established event
19998 * triggers device reset event.
19999 */
20000 (SATA_CPORTINFO_DRV_INFO(cportinfo))->
20001 satadrv_event_flags |=
20002 SATA_EVNT_DEVICE_RESET;
20003 }
20004 } else if (cportinfo->cport_dev_type ==
20005 SATA_DTYPE_NONE) {
20006 /*
20007 * We got new device attached! If HBA does not
20008 * generate device attached events, trigger it
20009 * here.
20010 */
20011 if (!(SATA_FEATURES(sata_hba_inst) &
20012 SATA_CTLF_HOTPLUG)) {
20013 cportinfo->cport_event_flags |=
20014 SATA_EVNT_DEVICE_ATTACHED;
20015 }
20016 }
20017 /* Reset link lost timeout */
20018 cportinfo->cport_link_lost_time = 0;
20019 }
20020 }
20021 linklost:
20022 if (event_flags & SATA_EVNT_LINK_LOST) {
20023 if ((sata_device.satadev_scr.sstatus &
20024 SATA_PORT_DEVLINK_UP_MASK) == SATA_PORT_DEVLINK_UP) {
20025 /* Ignore event */
20026 SATADBG1(SATA_DBG_EVENTS_PROC, sata_hba_inst,
20027 "Ignoring port %d link lost event - link is up",
20028 saddr->cport);
20029 goto done;
20030 }
20031 #ifdef SATA_DEBUG
20032 if (cportinfo->cport_link_lost_time == 0) {
20033 SATADBG1(SATA_DBG_EVENTS_PROC, sata_hba_inst,
20034 "Processing port %d link lost event",
20035 saddr->cport);
20036 }
20037 #endif
20038 /*
20039 * When HBA cannot generate device attached/detached events,
20040 * we need to track link lost time and eventually generate
20041 * device detach event.
20042 */
20043 if (!(SATA_FEATURES(sata_hba_inst) & SATA_CTLF_HOTPLUG)) {
20044 /* We are tracking link lost time */
20045 if (cportinfo->cport_link_lost_time == 0) {
20046 /* save current time (lbolt value) */
20047 cportinfo->cport_link_lost_time =
20048 ddi_get_lbolt();
20049 /* just keep link lost event */
20050 cportinfo->cport_event_flags |=
20051 SATA_EVNT_LINK_LOST;
20052 } else {
20053 clock_t cur_time = ddi_get_lbolt();
20054 if ((cur_time -
20055 cportinfo->cport_link_lost_time) >=
20056 drv_usectohz(
20057 SATA_EVNT_LINK_LOST_TIMEOUT)) {
20058 /* trigger device detach event */
20059 cportinfo->cport_event_flags |=
20060 SATA_EVNT_DEVICE_DETACHED;
20061 cportinfo->cport_link_lost_time = 0;
20062 SATADBG1(SATA_DBG_EVENTS,
20063 sata_hba_inst,
20064 "Triggering port %d "
20065 "device detached event",
20066 saddr->cport);
20067 } else {
20068 /* keep link lost event */
20069 cportinfo->cport_event_flags |=
20070 SATA_EVNT_LINK_LOST;
20071 }
20072 }
20073 }
20074 /*
20075 * We could change port state to disable/delay access to
20076 * the attached device until the link is recovered.
20077 */
20078 }
20079 done:
20080 event_flags = cportinfo->cport_event_flags;
20081 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->cport_mutex);
20082 if (event_flags != 0) {
20083 mutex_enter(&sata_hba_inst->satahba_mutex);
20084 sata_hba_inst->satahba_event_flags |= SATA_EVNT_MAIN;
20085 mutex_exit(&sata_hba_inst->satahba_mutex);
20086 mutex_enter(&sata_mutex);
20087 sata_event_pending |= SATA_EVNT_MAIN;
20088 mutex_exit(&sata_mutex);
20089 }
20090 }
20091
20092 /*
20093 * Port Multiplier Port Link Events processing.
20094 */
20095 static void
sata_process_pmport_link_events(sata_hba_inst_t * sata_hba_inst,sata_address_t * saddr)20096 sata_process_pmport_link_events(sata_hba_inst_t *sata_hba_inst,
20097 sata_address_t *saddr)
20098 {
20099 sata_device_t sata_device;
20100 sata_pmport_info_t *pmportinfo = NULL;
20101 sata_drive_info_t *sdinfo = NULL;
20102 uint32_t event_flags;
20103 uint8_t cport = saddr->cport;
20104 uint8_t pmport = saddr->pmport;
20105 int rval;
20106
20107 SATADBG2(SATA_DBG_EVENTS_PROC, sata_hba_inst,
20108 "Processing port %d:%d link event(s)",
20109 cport, pmport);
20110
20111 pmportinfo = SATA_PMPORT_INFO(sata_hba_inst, cport, pmport);
20112 mutex_enter(&pmportinfo->pmport_mutex);
20113 event_flags = pmportinfo->pmport_event_flags;
20114
20115 /* Reset event flags first */
20116 pmportinfo->pmport_event_flags &=
20117 ~(SATA_EVNT_LINK_ESTABLISHED | SATA_EVNT_LINK_LOST);
20118
20119 /* If the port is in SHUTDOWN or FAILED state, ignore link events. */
20120 if ((pmportinfo->pmport_state &
20121 (SATA_PSTATE_SHUTDOWN | SATA_PSTATE_FAILED)) != 0) {
20122 mutex_exit(&pmportinfo->pmport_mutex);
20123 return;
20124 }
20125
20126 /*
20127 * For the sanity sake get current port state.
20128 * Set device address only. Other sata_device fields should be
20129 * set by HBA driver.
20130 */
20131 sata_device.satadev_rev = SATA_DEVICE_REV;
20132 sata_device.satadev_addr = *saddr;
20133 /*
20134 * We have to exit mutex, because the HBA probe port function may
20135 * block on its own mutex.
20136 */
20137 mutex_exit(&SATA_PMPORT_MUTEX(sata_hba_inst, saddr->cport,
20138 saddr->pmport));
20139 rval = (*SATA_PROBE_PORT_FUNC(sata_hba_inst))
20140 (SATA_DIP(sata_hba_inst), &sata_device);
20141 mutex_enter(&SATA_PMPORT_MUTEX(sata_hba_inst, saddr->cport,
20142 saddr->pmport));
20143 sata_update_pmport_info(sata_hba_inst, &sata_device);
20144 if (rval != SATA_SUCCESS) {
20145 /* Something went wrong? Fail the port */
20146 pmportinfo->pmport_state = SATA_PSTATE_FAILED;
20147 mutex_exit(&SATA_PMPORT_MUTEX(sata_hba_inst, saddr->cport,
20148 saddr->pmport));
20149 SATA_LOG_D((sata_hba_inst, CE_WARN,
20150 "SATA port %d:%d probing failed",
20151 saddr->cport, saddr->pmport));
20152 /*
20153 * We may want to release device info structure, but
20154 * it is not necessary.
20155 */
20156 return;
20157 } else {
20158 /* port probed successfully */
20159 pmportinfo->pmport_state |=
20160 SATA_STATE_PROBED | SATA_STATE_READY;
20161 }
20162 mutex_exit(&SATA_PMPORT_MUTEX(sata_hba_inst,
20163 saddr->cport, saddr->pmport));
20164 mutex_enter(&SATA_PMPORT_MUTEX(sata_hba_inst,
20165 saddr->cport, saddr->pmport));
20166 if (event_flags & SATA_EVNT_LINK_ESTABLISHED) {
20167
20168 if ((sata_device.satadev_scr.sstatus &
20169 SATA_PORT_DEVLINK_UP_MASK) != SATA_PORT_DEVLINK_UP) {
20170 /* Ignore event */
20171 SATADBG2(SATA_DBG_EVENTS_PROC, sata_hba_inst,
20172 "Ignoring port %d:%d link established event - "
20173 "link down",
20174 saddr->cport, saddr->pmport);
20175 goto linklost;
20176 }
20177
20178 SATADBG2(SATA_DBG_EVENTS_PROC, sata_hba_inst,
20179 "Processing port %d:%d link established event",
20180 cport, pmport);
20181
20182 /*
20183 * For the sanity sake check if a device is attached - check
20184 * return state of a port probing.
20185 */
20186 if (sata_device.satadev_type != SATA_DTYPE_NONE &&
20187 sata_device.satadev_type != SATA_DTYPE_PMULT) {
20188 /*
20189 * HBA port probe indicated that there is a device
20190 * attached. Check if the framework had device info
20191 * structure attached for this device.
20192 */
20193 if (pmportinfo->pmport_dev_type != SATA_DTYPE_NONE) {
20194 ASSERT(SATA_PMPORTINFO_DRV_INFO(pmportinfo) !=
20195 NULL);
20196
20197 sdinfo = SATA_PMPORTINFO_DRV_INFO(pmportinfo);
20198 if ((sdinfo->satadrv_type &
20199 SATA_VALID_DEV_TYPE) != 0) {
20200 /*
20201 * Dev info structure is present.
20202 * If dev_type is set to known type in
20203 * the framework's drive info struct
20204 * then the device existed before and
20205 * the link was probably lost
20206 * momentarily - in such case
20207 * we may want to check device
20208 * identity.
20209 * Identity check is not supported now.
20210 *
20211 * Link established event
20212 * triggers device reset event.
20213 */
20214 (SATA_PMPORTINFO_DRV_INFO(pmportinfo))->
20215 satadrv_event_flags |=
20216 SATA_EVNT_DEVICE_RESET;
20217 }
20218 } else if (pmportinfo->pmport_dev_type ==
20219 SATA_DTYPE_NONE) {
20220 /*
20221 * We got new device attached! If HBA does not
20222 * generate device attached events, trigger it
20223 * here.
20224 */
20225 if (!(SATA_FEATURES(sata_hba_inst) &
20226 SATA_CTLF_HOTPLUG)) {
20227 pmportinfo->pmport_event_flags |=
20228 SATA_EVNT_DEVICE_ATTACHED;
20229 }
20230 }
20231 /* Reset link lost timeout */
20232 pmportinfo->pmport_link_lost_time = 0;
20233 }
20234 }
20235 linklost:
20236 if (event_flags & SATA_EVNT_LINK_LOST) {
20237 #ifdef SATA_DEBUG
20238 if (pmportinfo->pmport_link_lost_time == 0) {
20239 SATADBG2(SATA_DBG_EVENTS_PROC, sata_hba_inst,
20240 "Processing port %d:%d link lost event",
20241 saddr->cport, saddr->pmport);
20242 }
20243 #endif
20244 if ((sata_device.satadev_scr.sstatus &
20245 SATA_PORT_DEVLINK_UP_MASK) == SATA_PORT_DEVLINK_UP) {
20246 /* Ignore event */
20247 SATADBG2(SATA_DBG_EVENTS_PROC, sata_hba_inst,
20248 "Ignoring port %d:%d link lost event - link is up",
20249 saddr->cport, saddr->pmport);
20250 goto done;
20251 }
20252 /*
20253 * When HBA cannot generate device attached/detached events,
20254 * we need to track link lost time and eventually generate
20255 * device detach event.
20256 */
20257 if (!(SATA_FEATURES(sata_hba_inst) & SATA_CTLF_HOTPLUG)) {
20258 /* We are tracking link lost time */
20259 if (pmportinfo->pmport_link_lost_time == 0) {
20260 /* save current time (lbolt value) */
20261 pmportinfo->pmport_link_lost_time =
20262 ddi_get_lbolt();
20263 /* just keep link lost event */
20264 pmportinfo->pmport_event_flags |=
20265 SATA_EVNT_LINK_LOST;
20266 } else {
20267 clock_t cur_time = ddi_get_lbolt();
20268 if ((cur_time -
20269 pmportinfo->pmport_link_lost_time) >=
20270 drv_usectohz(
20271 SATA_EVNT_LINK_LOST_TIMEOUT)) {
20272 /* trigger device detach event */
20273 pmportinfo->pmport_event_flags |=
20274 SATA_EVNT_DEVICE_DETACHED;
20275 pmportinfo->pmport_link_lost_time = 0;
20276 SATADBG2(SATA_DBG_EVENTS,
20277 sata_hba_inst,
20278 "Triggering port %d:%d "
20279 "device detached event",
20280 saddr->cport, saddr->pmport);
20281 } else {
20282 /* keep link lost event */
20283 pmportinfo->pmport_event_flags |=
20284 SATA_EVNT_LINK_LOST;
20285 }
20286 }
20287 }
20288 /*
20289 * We could change port state to disable/delay access to
20290 * the attached device until the link is recovered.
20291 */
20292 }
20293 done:
20294 event_flags = pmportinfo->pmport_event_flags;
20295 mutex_exit(&SATA_PMPORT_MUTEX(sata_hba_inst, saddr->cport,
20296 saddr->pmport));
20297 if (event_flags != 0) {
20298 mutex_enter(&sata_hba_inst->satahba_mutex);
20299 sata_hba_inst->satahba_event_flags |= SATA_EVNT_MAIN;
20300 mutex_exit(&sata_hba_inst->satahba_mutex);
20301 mutex_enter(&sata_mutex);
20302 sata_event_pending |= SATA_EVNT_MAIN;
20303 mutex_exit(&sata_mutex);
20304 }
20305 }
20306
20307 /*
20308 * Device Detached Event processing.
20309 * Port is probed to find if a device is really gone. If so,
20310 * the device info structure is detached from the SATA port info structure
20311 * and released.
20312 * Port status is updated.
20313 *
20314 * NOTE: Port multiplier ports events are handled by
20315 * sata_process_pmdevice_detached()
20316 */
20317 static void
sata_process_device_detached(sata_hba_inst_t * sata_hba_inst,sata_address_t * saddr)20318 sata_process_device_detached(sata_hba_inst_t *sata_hba_inst,
20319 sata_address_t *saddr)
20320 {
20321 sata_cport_info_t *cportinfo;
20322 sata_pmport_info_t *pmportinfo;
20323 sata_drive_info_t *sdevinfo;
20324 sata_device_t sata_device;
20325 sata_address_t pmport_addr;
20326 char name[16];
20327 uint8_t cport = saddr->cport;
20328 int npmport;
20329 int rval;
20330
20331 SATADBG1(SATA_DBG_EVENTS_PROC, sata_hba_inst,
20332 "Processing port %d device detached", saddr->cport);
20333
20334 cportinfo = SATA_CPORT_INFO(sata_hba_inst, saddr->cport);
20335 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->cport_mutex);
20336 /* Clear event flag */
20337 cportinfo->cport_event_flags &= ~SATA_EVNT_DEVICE_DETACHED;
20338
20339 /* If the port is in SHUTDOWN or FAILED state, ignore detach event. */
20340 if ((cportinfo->cport_state &
20341 (SATA_PSTATE_SHUTDOWN | SATA_PSTATE_FAILED)) != 0) {
20342 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->
20343 cport_mutex);
20344 return;
20345 }
20346 /* For sanity, re-probe the port */
20347 sata_device.satadev_rev = SATA_DEVICE_REV;
20348 sata_device.satadev_addr = *saddr;
20349
20350 /*
20351 * We have to exit mutex, because the HBA probe port function may
20352 * block on its own mutex.
20353 */
20354 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->cport_mutex);
20355 rval = (*SATA_PROBE_PORT_FUNC(sata_hba_inst))
20356 (SATA_DIP(sata_hba_inst), &sata_device);
20357 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->cport_mutex);
20358 sata_update_port_info(sata_hba_inst, &sata_device);
20359 if (rval != SATA_SUCCESS) {
20360 /* Something went wrong? Fail the port */
20361 cportinfo->cport_state = SATA_PSTATE_FAILED;
20362 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->
20363 cport_mutex);
20364 SATA_LOG_D((sata_hba_inst, CE_WARN,
20365 "SATA port %d probing failed",
20366 saddr->cport));
20367 /*
20368 * We may want to release device info structure, but
20369 * it is not necessary.
20370 */
20371 return;
20372 } else {
20373 /* port probed successfully */
20374 cportinfo->cport_state |= SATA_STATE_PROBED | SATA_STATE_READY;
20375 }
20376 /*
20377 * Check if a device is still attached. For sanity, check also
20378 * link status - if no link, there is no device.
20379 */
20380 if ((sata_device.satadev_scr.sstatus & SATA_PORT_DEVLINK_UP_MASK) ==
20381 SATA_PORT_DEVLINK_UP && sata_device.satadev_type !=
20382 SATA_DTYPE_NONE) {
20383 /*
20384 * Device is still attached - ignore detach event.
20385 */
20386 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->
20387 cport_mutex);
20388 SATADBG1(SATA_DBG_EVENTS_PROC, sata_hba_inst,
20389 "Ignoring detach - device still attached to port %d",
20390 sata_device.satadev_addr.cport);
20391 return;
20392 }
20393 /*
20394 * We need to detach and release device info structure here
20395 */
20396 if (cportinfo->cport_dev_type == SATA_DTYPE_PMULT) {
20397 /*
20398 * A port-multiplier is removed.
20399 *
20400 * Calling sata_process_pmdevice_detached() does not work
20401 * here. The port multiplier is gone, so we cannot probe
20402 * sub-port any more and all pmult-related data structure must
20403 * be de-allocated immediately. Following structure of every
20404 * implemented sub-port behind the pmult are required to
20405 * released.
20406 *
20407 * - attachment point
20408 * - target node
20409 * - sata_drive_info
20410 * - sata_pmport_info
20411 */
20412 for (npmport = 0; npmport < SATA_NUM_PMPORTS(sata_hba_inst,
20413 cport); npmport ++) {
20414 SATADBG2(SATA_DBG_PMULT|SATA_DBG_EVENTS_PROC,
20415 sata_hba_inst,
20416 "Detaching target node at port %d:%d",
20417 cport, npmport);
20418
20419 mutex_exit(&SATA_CPORT_MUTEX(sata_hba_inst, cport));
20420
20421 /* Remove attachment point. */
20422 name[0] = '\0';
20423 (void) sprintf(name, "%d.%d", cport, npmport);
20424 ddi_remove_minor_node(SATA_DIP(sata_hba_inst), name);
20425 sata_log(sata_hba_inst, CE_NOTE,
20426 "Remove attachment point of port %d:%d",
20427 cport, npmport);
20428
20429 /* Remove target node */
20430 pmport_addr.cport = cport;
20431 pmport_addr.pmport = (uint8_t)npmport;
20432 pmport_addr.qual = SATA_ADDR_PMPORT;
20433 sata_remove_target_node(sata_hba_inst, &pmport_addr);
20434
20435 mutex_enter(&SATA_CPORT_MUTEX(sata_hba_inst, cport));
20436
20437 /* Release sata_pmport_info & sata_drive_info. */
20438 pmportinfo = SATA_PMPORT_INFO(sata_hba_inst,
20439 cport, npmport);
20440 ASSERT(pmportinfo != NULL);
20441
20442 sdevinfo = SATA_PMPORTINFO_DRV_INFO(pmportinfo);
20443 if (sdevinfo != NULL) {
20444 (void) kmem_free((void *) sdevinfo,
20445 sizeof (sata_drive_info_t));
20446 }
20447
20448 /* Release sata_pmport_info at last */
20449 (void) kmem_free((void *) pmportinfo,
20450 sizeof (sata_pmport_info_t));
20451 }
20452
20453 /* Finally, release sata_pmult_info */
20454 (void) kmem_free((void *)
20455 SATA_CPORTINFO_PMULT_INFO(cportinfo),
20456 sizeof (sata_pmult_info_t));
20457 SATA_CPORTINFO_PMULT_INFO(cportinfo) = NULL;
20458
20459 sata_log(sata_hba_inst, CE_WARN,
20460 "SATA port-multiplier detached at port %d", cport);
20461
20462 cportinfo->cport_dev_type = SATA_DTYPE_NONE;
20463 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst,
20464 saddr->cport)->cport_mutex);
20465 } else {
20466 if (SATA_CPORTINFO_DRV_INFO(cportinfo) != NULL) {
20467 sdevinfo = SATA_CPORTINFO_DRV_INFO(cportinfo);
20468 SATA_CPORTINFO_DRV_INFO(cportinfo) = NULL;
20469 (void) kmem_free((void *)sdevinfo,
20470 sizeof (sata_drive_info_t));
20471 }
20472 sata_log(sata_hba_inst, CE_WARN,
20473 "SATA device detached at port %d", cport);
20474
20475 cportinfo->cport_dev_type = SATA_DTYPE_NONE;
20476 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst,
20477 saddr->cport)->cport_mutex);
20478
20479 /*
20480 * Try to offline a device and remove target node
20481 * if it still exists
20482 */
20483 sata_remove_target_node(sata_hba_inst, saddr);
20484 }
20485
20486
20487 /*
20488 * Generate sysevent - EC_DR / ESC_DR_AP_STATE_CHANGE
20489 * with the hint: SE_HINT_REMOVE
20490 */
20491 sata_gen_sysevent(sata_hba_inst, saddr, SE_HINT_REMOVE);
20492 }
20493
20494 /*
20495 * Port Multiplier Port Device Deattached Event processing.
20496 *
20497 * NOTE: No Mutex should be hold.
20498 */
20499 static void
sata_process_pmdevice_detached(sata_hba_inst_t * sata_hba_inst,sata_address_t * saddr)20500 sata_process_pmdevice_detached(sata_hba_inst_t *sata_hba_inst,
20501 sata_address_t *saddr)
20502 {
20503 sata_pmport_info_t *pmportinfo;
20504 sata_drive_info_t *sdevinfo;
20505 sata_device_t sata_device;
20506 int rval;
20507 uint8_t cport, pmport;
20508
20509 cport = saddr->cport;
20510 pmport = saddr->pmport;
20511
20512 SATADBG2(SATA_DBG_EVENTS_PROC, sata_hba_inst,
20513 "Processing port %d:%d device detached",
20514 cport, pmport);
20515
20516 pmportinfo = SATA_PMPORT_INFO(sata_hba_inst, cport, pmport);
20517 mutex_enter(&SATA_PMPORT_MUTEX(sata_hba_inst, cport, pmport));
20518
20519 /* Clear event flag */
20520 pmportinfo->pmport_event_flags &= ~SATA_EVNT_DEVICE_DETACHED;
20521
20522 /* If the port is in SHUTDOWN or FAILED state, ignore detach event. */
20523 if ((pmportinfo->pmport_state &
20524 (SATA_PSTATE_SHUTDOWN | SATA_PSTATE_FAILED)) != 0) {
20525 mutex_exit(&SATA_PMPORT_MUTEX(sata_hba_inst, cport, pmport));
20526 return;
20527 }
20528 /* For sanity, re-probe the port */
20529 sata_device.satadev_rev = SATA_DEVICE_REV;
20530 sata_device.satadev_addr = *saddr;
20531
20532 /*
20533 * We have to exit mutex, because the HBA probe port function may
20534 * block on its own mutex.
20535 */
20536 mutex_exit(&SATA_PMPORT_MUTEX(sata_hba_inst, cport, pmport));
20537 rval = (*SATA_PROBE_PORT_FUNC(sata_hba_inst))
20538 (SATA_DIP(sata_hba_inst), &sata_device);
20539 mutex_enter(&SATA_PMPORT_MUTEX(sata_hba_inst, cport, pmport));
20540 sata_update_pmport_info(sata_hba_inst, &sata_device);
20541 if (rval != SATA_SUCCESS) {
20542 /* Something went wrong? Fail the port */
20543 pmportinfo->pmport_state = SATA_PSTATE_FAILED;
20544 mutex_exit(&SATA_PMPORT_MUTEX(sata_hba_inst, cport, pmport));
20545 SATA_LOG_D((sata_hba_inst, CE_WARN,
20546 "SATA port %d:%d probing failed",
20547 saddr->pmport));
20548 /*
20549 * We may want to release device info structure, but
20550 * it is not necessary.
20551 */
20552 return;
20553 } else {
20554 /* port probed successfully */
20555 pmportinfo->pmport_state |=
20556 SATA_STATE_PROBED | SATA_STATE_READY;
20557 }
20558 /*
20559 * Check if a device is still attached. For sanity, check also
20560 * link status - if no link, there is no device.
20561 */
20562 if ((sata_device.satadev_scr.sstatus & SATA_PORT_DEVLINK_UP_MASK) ==
20563 SATA_PORT_DEVLINK_UP && sata_device.satadev_type !=
20564 SATA_DTYPE_NONE) {
20565 /*
20566 * Device is still attached - ignore detach event.
20567 */
20568 mutex_exit(&SATA_PMPORT_MUTEX(sata_hba_inst, cport, pmport));
20569 SATADBG1(SATA_DBG_EVENTS_PROC, sata_hba_inst,
20570 "Ignoring detach - device still attached to port %d",
20571 sata_device.satadev_addr.pmport);
20572 return;
20573 }
20574 /*
20575 * We need to detach and release device info structure here
20576 */
20577 if (SATA_PMPORTINFO_DRV_INFO(pmportinfo) != NULL) {
20578 sdevinfo = SATA_PMPORTINFO_DRV_INFO(pmportinfo);
20579 SATA_PMPORTINFO_DRV_INFO(pmportinfo) = NULL;
20580 (void) kmem_free((void *)sdevinfo,
20581 sizeof (sata_drive_info_t));
20582 }
20583 pmportinfo->pmport_dev_type = SATA_DTYPE_NONE;
20584 /*
20585 * Device cannot be reached anymore, even if the target node may be
20586 * still present.
20587 */
20588 mutex_exit(&SATA_PMPORT_MUTEX(sata_hba_inst, cport, pmport));
20589
20590 /*
20591 * Try to offline a device and remove target node if it still exists
20592 */
20593 sata_remove_target_node(sata_hba_inst, saddr);
20594
20595 /*
20596 * Generate sysevent - EC_DR / ESC_DR_AP_STATE_CHANGE
20597 * with the hint: SE_HINT_REMOVE
20598 */
20599 sata_gen_sysevent(sata_hba_inst, saddr, SE_HINT_REMOVE);
20600 }
20601
20602
20603 /*
20604 * Device Attached Event processing.
20605 * Port state is checked to verify that a device is really attached. If so,
20606 * the device info structure is created and attached to the SATA port info
20607 * structure.
20608 *
20609 * If attached device cannot be identified or set-up, the retry for the
20610 * attach processing is set-up. Subsequent daemon run would try again to
20611 * identify the device, until the time limit is reached
20612 * (SATA_DEV_IDENTIFY_TIMEOUT).
20613 *
20614 * This function cannot be called in interrupt context (it may sleep).
20615 *
20616 * NOTE: Port multiplier ports events are handled by
20617 * sata_process_pmdevice_attached()
20618 */
20619 static void
sata_process_device_attached(sata_hba_inst_t * sata_hba_inst,sata_address_t * saddr)20620 sata_process_device_attached(sata_hba_inst_t *sata_hba_inst,
20621 sata_address_t *saddr)
20622 {
20623 sata_cport_info_t *cportinfo = NULL;
20624 sata_drive_info_t *sdevinfo = NULL;
20625 sata_pmult_info_t *pmultinfo = NULL;
20626 sata_pmport_info_t *pmportinfo = NULL;
20627 sata_device_t sata_device;
20628 dev_info_t *tdip;
20629 uint32_t event_flags = 0, pmult_event_flags = 0;
20630 int rval;
20631 int npmport;
20632
20633 SATADBG1(SATA_DBG_EVENTS_PROC, sata_hba_inst,
20634 "Processing port %d device attached", saddr->cport);
20635
20636 cportinfo = SATA_CPORT_INFO(sata_hba_inst, saddr->cport);
20637 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->cport_mutex);
20638
20639 /* Clear attach event flag first */
20640 cportinfo->cport_event_flags &= ~SATA_EVNT_DEVICE_ATTACHED;
20641
20642 /* If the port is in SHUTDOWN or FAILED state, ignore event. */
20643 if ((cportinfo->cport_state &
20644 (SATA_PSTATE_SHUTDOWN | SATA_PSTATE_FAILED)) != 0) {
20645 cportinfo->cport_dev_attach_time = 0;
20646 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->
20647 cport_mutex);
20648 return;
20649 }
20650
20651 /*
20652 * If the sata_drive_info structure is found attached to the port info,
20653 * despite the fact the device was removed and now it is re-attached,
20654 * the old drive info structure was not removed.
20655 * Arbitrarily release device info structure.
20656 */
20657 if (SATA_CPORTINFO_DRV_INFO(cportinfo) != NULL) {
20658 sdevinfo = SATA_CPORTINFO_DRV_INFO(cportinfo);
20659 SATA_CPORTINFO_DRV_INFO(cportinfo) = NULL;
20660 (void) kmem_free((void *)sdevinfo,
20661 sizeof (sata_drive_info_t));
20662 SATADBG1(SATA_DBG_EVENTS_PROC, sata_hba_inst,
20663 "Arbitrarily detaching old device info.", NULL);
20664 }
20665 cportinfo->cport_dev_type = SATA_DTYPE_NONE;
20666
20667 /* For sanity, re-probe the port */
20668 sata_device.satadev_rev = SATA_DEVICE_REV;
20669 sata_device.satadev_addr = *saddr;
20670
20671 /*
20672 * We have to exit mutex, because the HBA probe port function may
20673 * block on its own mutex.
20674 */
20675 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->cport_mutex);
20676 rval = (*SATA_PROBE_PORT_FUNC(sata_hba_inst))
20677 (SATA_DIP(sata_hba_inst), &sata_device);
20678 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->cport_mutex);
20679 sata_update_port_info(sata_hba_inst, &sata_device);
20680 if (rval != SATA_SUCCESS) {
20681 /* Something went wrong? Fail the port */
20682 cportinfo->cport_state = SATA_PSTATE_FAILED;
20683 cportinfo->cport_dev_attach_time = 0;
20684 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->
20685 cport_mutex);
20686 SATA_LOG_D((sata_hba_inst, CE_WARN,
20687 "SATA port %d probing failed",
20688 saddr->cport));
20689 return;
20690 } else {
20691 /* port probed successfully */
20692 cportinfo->cport_state |= SATA_STATE_PROBED | SATA_STATE_READY;
20693 }
20694 /*
20695 * Check if a device is still attached. For sanity, check also
20696 * link status - if no link, there is no device.
20697 */
20698 if ((sata_device.satadev_scr.sstatus & SATA_PORT_DEVLINK_UP_MASK) !=
20699 SATA_PORT_DEVLINK_UP || sata_device.satadev_type ==
20700 SATA_DTYPE_NONE) {
20701 /*
20702 * No device - ignore attach event.
20703 */
20704 cportinfo->cport_dev_attach_time = 0;
20705 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->
20706 cport_mutex);
20707 SATADBG1(SATA_DBG_EVENTS_PROC, sata_hba_inst,
20708 "Ignoring attach - no device connected to port %d",
20709 sata_device.satadev_addr.cport);
20710 return;
20711 }
20712
20713 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->cport_mutex);
20714 /*
20715 * Generate sysevent - EC_DR / ESC_DR_AP_STATE_CHANGE
20716 * with the hint: SE_HINT_INSERT
20717 */
20718 sata_gen_sysevent(sata_hba_inst, saddr, SE_HINT_INSERT);
20719
20720 /*
20721 * Port reprobing will take care of the creation of the device
20722 * info structure and determination of the device type.
20723 */
20724 sata_device.satadev_addr = *saddr;
20725 (void) sata_reprobe_port(sata_hba_inst, &sata_device,
20726 SATA_DEV_IDENTIFY_NORETRY);
20727
20728 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->
20729 cport_mutex);
20730 if ((cportinfo->cport_state & SATA_STATE_READY) &&
20731 (cportinfo->cport_dev_type != SATA_DTYPE_NONE)) {
20732 /* Some device is attached to the port */
20733 if (cportinfo->cport_dev_type == SATA_DTYPE_UNKNOWN) {
20734 /*
20735 * A device was not successfully attached.
20736 * Track retry time for device identification.
20737 */
20738 if (cportinfo->cport_dev_attach_time != 0) {
20739 clock_t cur_time = ddi_get_lbolt();
20740 /*
20741 * If the retry time limit was not exceeded,
20742 * reinstate attach event.
20743 */
20744 if ((cur_time -
20745 cportinfo->cport_dev_attach_time) <
20746 drv_usectohz(
20747 SATA_DEV_IDENTIFY_TIMEOUT)) {
20748 /* OK, restore attach event */
20749 cportinfo->cport_event_flags |=
20750 SATA_EVNT_DEVICE_ATTACHED;
20751 } else {
20752 /* Timeout - cannot identify device */
20753 cportinfo->cport_dev_attach_time = 0;
20754 sata_log(sata_hba_inst,
20755 CE_WARN,
20756 "Could not identify SATA device "
20757 "at port %d",
20758 saddr->cport);
20759 }
20760 } else {
20761 /*
20762 * Start tracking time for device
20763 * identification.
20764 * Save current time (lbolt value).
20765 */
20766 cportinfo->cport_dev_attach_time =
20767 ddi_get_lbolt();
20768 /* Restore attach event */
20769 cportinfo->cport_event_flags |=
20770 SATA_EVNT_DEVICE_ATTACHED;
20771 }
20772 } else if (cportinfo->cport_dev_type == SATA_DTYPE_PMULT) {
20773 cportinfo->cport_dev_attach_time = 0;
20774 sata_log(sata_hba_inst, CE_NOTE,
20775 "SATA port-multiplier detected at port %d",
20776 saddr->cport);
20777
20778 if (SATA_CPORTINFO_PMULT_INFO(cportinfo) != NULL) {
20779 /* Log the info of new port multiplier */
20780 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst,
20781 saddr->cport)->cport_mutex);
20782 sata_show_pmult_info(sata_hba_inst,
20783 &sata_device);
20784 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst,
20785 saddr->cport)->cport_mutex);
20786 }
20787
20788 ASSERT(SATA_CPORTINFO_PMULT_INFO(cportinfo) != NULL);
20789 pmultinfo = SATA_CPORTINFO_PMULT_INFO(cportinfo);
20790 for (npmport = 0; npmport <
20791 pmultinfo->pmult_num_dev_ports; npmport++) {
20792 pmportinfo = SATA_PMPORT_INFO(sata_hba_inst,
20793 saddr->cport, npmport);
20794 ASSERT(pmportinfo != NULL);
20795
20796 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst,
20797 saddr->cport)->cport_mutex);
20798 mutex_enter(&pmportinfo->pmport_mutex);
20799 /* Marked all pmports with link events. */
20800 pmportinfo->pmport_event_flags =
20801 SATA_EVNT_LINK_ESTABLISHED;
20802 pmult_event_flags |=
20803 pmportinfo->pmport_event_flags;
20804 mutex_exit(&pmportinfo->pmport_mutex);
20805 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst,
20806 saddr->cport)->cport_mutex);
20807 }
20808 /* Auto-online is not available for PMult now. */
20809
20810 } else {
20811 /*
20812 * If device was successfully attached, the subsequent
20813 * action depends on a state of the
20814 * sata_auto_online variable. If it is set to zero.
20815 * an explicit 'configure' command will be needed to
20816 * configure it. If its value is non-zero, we will
20817 * attempt to online (configure) the device.
20818 * First, log the message indicating that a device
20819 * was attached.
20820 */
20821 cportinfo->cport_dev_attach_time = 0;
20822 sata_log(sata_hba_inst, CE_WARN,
20823 "SATA device detected at port %d", saddr->cport);
20824
20825 if (SATA_CPORTINFO_DRV_INFO(cportinfo) != NULL) {
20826 sata_drive_info_t new_sdinfo;
20827
20828 /* Log device info data */
20829 new_sdinfo = *(SATA_CPORTINFO_DRV_INFO(
20830 cportinfo));
20831 sata_show_drive_info(sata_hba_inst,
20832 &new_sdinfo);
20833 }
20834
20835 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst,
20836 saddr->cport)->cport_mutex);
20837
20838 /*
20839 * Make sure that there is no target node for that
20840 * device. If so, release it. It should not happen,
20841 * unless we had problem removing the node when
20842 * device was detached.
20843 */
20844 tdip = sata_get_target_dip(SATA_DIP(sata_hba_inst),
20845 saddr->cport, saddr->pmport);
20846 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst,
20847 saddr->cport)->cport_mutex);
20848 if (tdip != NULL) {
20849
20850 #ifdef SATA_DEBUG
20851 if ((cportinfo->cport_event_flags &
20852 SATA_EVNT_TARGET_NODE_CLEANUP) == 0)
20853 sata_log(sata_hba_inst, CE_WARN,
20854 "sata_process_device_attached: "
20855 "old device target node exists!");
20856 #endif
20857 /*
20858 * target node exists - try to unconfigure
20859 * device and remove the node.
20860 */
20861 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst,
20862 saddr->cport)->cport_mutex);
20863 rval = ndi_devi_offline(tdip,
20864 NDI_DEVI_REMOVE);
20865 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst,
20866 saddr->cport)->cport_mutex);
20867
20868 if (rval == NDI_SUCCESS) {
20869 cportinfo->cport_event_flags &=
20870 ~SATA_EVNT_TARGET_NODE_CLEANUP;
20871 cportinfo->cport_tgtnode_clean = B_TRUE;
20872 } else {
20873 /*
20874 * PROBLEM - the target node remained
20875 * and it belongs to a previously
20876 * attached device.
20877 * This happens when the file was open
20878 * or the node was waiting for
20879 * resources at the time the
20880 * associated device was removed.
20881 * Instruct event daemon to retry the
20882 * cleanup later.
20883 */
20884 sata_log(sata_hba_inst,
20885 CE_WARN,
20886 "Application(s) accessing "
20887 "previously attached SATA "
20888 "device have to release "
20889 "it before newly inserted "
20890 "device can be made accessible.",
20891 saddr->cport);
20892 cportinfo->cport_event_flags |=
20893 SATA_EVNT_TARGET_NODE_CLEANUP;
20894 cportinfo->cport_tgtnode_clean =
20895 B_FALSE;
20896 }
20897 }
20898 if (sata_auto_online != 0) {
20899 cportinfo->cport_event_flags |=
20900 SATA_EVNT_AUTOONLINE_DEVICE;
20901 }
20902
20903 }
20904 } else {
20905 cportinfo->cport_dev_attach_time = 0;
20906 }
20907
20908 event_flags = cportinfo->cport_event_flags;
20909 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->cport_mutex);
20910 if (event_flags != 0 || pmult_event_flags != 0) {
20911 mutex_enter(&sata_hba_inst->satahba_mutex);
20912 sata_hba_inst->satahba_event_flags |= SATA_EVNT_MAIN;
20913 mutex_exit(&sata_hba_inst->satahba_mutex);
20914 mutex_enter(&sata_mutex);
20915 sata_event_pending |= SATA_EVNT_MAIN;
20916 mutex_exit(&sata_mutex);
20917 }
20918 }
20919
20920 /*
20921 * Port Multiplier Port Device Attached Event processing.
20922 *
20923 * NOTE: No Mutex should be hold.
20924 */
20925 static void
sata_process_pmdevice_attached(sata_hba_inst_t * sata_hba_inst,sata_address_t * saddr)20926 sata_process_pmdevice_attached(sata_hba_inst_t *sata_hba_inst,
20927 sata_address_t *saddr)
20928 {
20929 sata_pmport_info_t *pmportinfo;
20930 sata_drive_info_t *sdinfo;
20931 sata_device_t sata_device;
20932 dev_info_t *tdip;
20933 uint32_t event_flags;
20934 uint8_t cport = saddr->cport;
20935 uint8_t pmport = saddr->pmport;
20936 int rval;
20937
20938 SATADBG2(SATA_DBG_EVENTS_PROC, sata_hba_inst,
20939 "Processing port %d:%d device attached", cport, pmport);
20940
20941 pmportinfo = SATA_PMPORT_INFO(sata_hba_inst, cport, pmport);
20942
20943 mutex_enter(&pmportinfo->pmport_mutex);
20944
20945 /* Clear attach event flag first */
20946 pmportinfo->pmport_event_flags &= ~SATA_EVNT_DEVICE_ATTACHED;
20947
20948 /* If the port is in SHUTDOWN or FAILED state, ignore event. */
20949 if ((pmportinfo->pmport_state &
20950 (SATA_PSTATE_SHUTDOWN | SATA_PSTATE_FAILED)) != 0) {
20951 pmportinfo->pmport_dev_attach_time = 0;
20952 mutex_exit(&pmportinfo->pmport_mutex);
20953 return;
20954 }
20955
20956 /*
20957 * If the sata_drive_info structure is found attached to the port info,
20958 * despite the fact the device was removed and now it is re-attached,
20959 * the old drive info structure was not removed.
20960 * Arbitrarily release device info structure.
20961 */
20962 if (SATA_PMPORTINFO_DRV_INFO(pmportinfo) != NULL) {
20963 sdinfo = SATA_PMPORTINFO_DRV_INFO(pmportinfo);
20964 SATA_PMPORTINFO_DRV_INFO(pmportinfo) = NULL;
20965 (void) kmem_free((void *)sdinfo,
20966 sizeof (sata_drive_info_t));
20967 SATADBG1(SATA_DBG_EVENTS_PROC, sata_hba_inst,
20968 "Arbitrarily detaching old device info.", NULL);
20969 }
20970 pmportinfo->pmport_dev_type = SATA_DTYPE_NONE;
20971
20972 /* For sanity, re-probe the port */
20973 sata_device.satadev_rev = SATA_DEVICE_REV;
20974 sata_device.satadev_addr = *saddr;
20975
20976 /*
20977 * We have to exit mutex, because the HBA probe port function may
20978 * block on its own mutex.
20979 */
20980 mutex_exit(&pmportinfo->pmport_mutex);
20981 rval = (*SATA_PROBE_PORT_FUNC(sata_hba_inst))
20982 (SATA_DIP(sata_hba_inst), &sata_device);
20983 mutex_enter(&pmportinfo->pmport_mutex);
20984
20985 sata_update_pmport_info(sata_hba_inst, &sata_device);
20986 if (rval != SATA_SUCCESS) {
20987 /* Something went wrong? Fail the port */
20988 pmportinfo->pmport_state = SATA_PSTATE_FAILED;
20989 pmportinfo->pmport_dev_attach_time = 0;
20990 mutex_exit(&pmportinfo->pmport_mutex);
20991 SATA_LOG_D((sata_hba_inst, CE_WARN,
20992 "SATA port %d:%d probing failed", cport, pmport));
20993 return;
20994 } else {
20995 /* pmport probed successfully */
20996 pmportinfo->pmport_state |=
20997 SATA_STATE_PROBED | SATA_STATE_READY;
20998 }
20999 /*
21000 * Check if a device is still attached. For sanity, check also
21001 * link status - if no link, there is no device.
21002 */
21003 if ((sata_device.satadev_scr.sstatus & SATA_PORT_DEVLINK_UP_MASK) !=
21004 SATA_PORT_DEVLINK_UP || sata_device.satadev_type ==
21005 SATA_DTYPE_NONE) {
21006 /*
21007 * No device - ignore attach event.
21008 */
21009 pmportinfo->pmport_dev_attach_time = 0;
21010 mutex_exit(&pmportinfo->pmport_mutex);
21011 SATADBG2(SATA_DBG_EVENTS_PROC, sata_hba_inst,
21012 "Ignoring attach - no device connected to port %d:%d",
21013 cport, pmport);
21014 return;
21015 }
21016
21017 mutex_exit(&pmportinfo->pmport_mutex);
21018 /*
21019 * Generate sysevent - EC_DR / ESC_DR_AP_STATE_CHANGE
21020 * with the hint: SE_HINT_INSERT
21021 */
21022 sata_gen_sysevent(sata_hba_inst, saddr, SE_HINT_INSERT);
21023
21024 /*
21025 * Port reprobing will take care of the creation of the device
21026 * info structure and determination of the device type.
21027 */
21028 sata_device.satadev_addr = *saddr;
21029 (void) sata_reprobe_port(sata_hba_inst, &sata_device,
21030 SATA_DEV_IDENTIFY_NORETRY);
21031
21032 mutex_enter(&pmportinfo->pmport_mutex);
21033 if ((pmportinfo->pmport_state & SATA_STATE_READY) &&
21034 (pmportinfo->pmport_dev_type != SATA_DTYPE_NONE)) {
21035 /* Some device is attached to the port */
21036 if (pmportinfo->pmport_dev_type == SATA_DTYPE_UNKNOWN) {
21037 /*
21038 * A device was not successfully attached.
21039 * Track retry time for device identification.
21040 */
21041 if (pmportinfo->pmport_dev_attach_time != 0) {
21042 clock_t cur_time = ddi_get_lbolt();
21043 /*
21044 * If the retry time limit was not exceeded,
21045 * reinstate attach event.
21046 */
21047 if ((cur_time -
21048 pmportinfo->pmport_dev_attach_time) <
21049 drv_usectohz(
21050 SATA_DEV_IDENTIFY_TIMEOUT)) {
21051 /* OK, restore attach event */
21052 pmportinfo->pmport_event_flags |=
21053 SATA_EVNT_DEVICE_ATTACHED;
21054 } else {
21055 /* Timeout - cannot identify device */
21056 pmportinfo->pmport_dev_attach_time = 0;
21057 sata_log(sata_hba_inst, CE_WARN,
21058 "Could not identify SATA device "
21059 "at port %d:%d",
21060 cport, pmport);
21061 }
21062 } else {
21063 /*
21064 * Start tracking time for device
21065 * identification.
21066 * Save current time (lbolt value).
21067 */
21068 pmportinfo->pmport_dev_attach_time =
21069 ddi_get_lbolt();
21070 /* Restore attach event */
21071 pmportinfo->pmport_event_flags |=
21072 SATA_EVNT_DEVICE_ATTACHED;
21073 }
21074 } else {
21075 /*
21076 * If device was successfully attached, the subsequent
21077 * action depends on a state of the
21078 * sata_auto_online variable. If it is set to zero.
21079 * an explicit 'configure' command will be needed to
21080 * configure it. If its value is non-zero, we will
21081 * attempt to online (configure) the device.
21082 * First, log the message indicating that a device
21083 * was attached.
21084 */
21085 pmportinfo->pmport_dev_attach_time = 0;
21086 sata_log(sata_hba_inst, CE_WARN,
21087 "SATA device detected at port %d:%d",
21088 cport, pmport);
21089
21090 if (SATA_PMPORTINFO_DRV_INFO(pmportinfo) != NULL) {
21091 sata_drive_info_t new_sdinfo;
21092
21093 /* Log device info data */
21094 new_sdinfo = *(SATA_PMPORTINFO_DRV_INFO(
21095 pmportinfo));
21096 sata_show_drive_info(sata_hba_inst,
21097 &new_sdinfo);
21098 }
21099
21100 mutex_exit(&pmportinfo->pmport_mutex);
21101
21102 /*
21103 * Make sure that there is no target node for that
21104 * device. If so, release it. It should not happen,
21105 * unless we had problem removing the node when
21106 * device was detached.
21107 */
21108 tdip = sata_get_target_dip(SATA_DIP(sata_hba_inst),
21109 saddr->cport, saddr->pmport);
21110 mutex_enter(&pmportinfo->pmport_mutex);
21111 if (tdip != NULL) {
21112
21113 #ifdef SATA_DEBUG
21114 if ((pmportinfo->pmport_event_flags &
21115 SATA_EVNT_TARGET_NODE_CLEANUP) == 0)
21116 sata_log(sata_hba_inst, CE_WARN,
21117 "sata_process_device_attached: "
21118 "old device target node exists!");
21119 #endif
21120 /*
21121 * target node exists - try to unconfigure
21122 * device and remove the node.
21123 */
21124 mutex_exit(&pmportinfo->pmport_mutex);
21125 rval = ndi_devi_offline(tdip,
21126 NDI_DEVI_REMOVE);
21127 mutex_enter(&pmportinfo->pmport_mutex);
21128
21129 if (rval == NDI_SUCCESS) {
21130 pmportinfo->pmport_event_flags &=
21131 ~SATA_EVNT_TARGET_NODE_CLEANUP;
21132 pmportinfo->pmport_tgtnode_clean =
21133 B_TRUE;
21134 } else {
21135 /*
21136 * PROBLEM - the target node remained
21137 * and it belongs to a previously
21138 * attached device.
21139 * This happens when the file was open
21140 * or the node was waiting for
21141 * resources at the time the
21142 * associated device was removed.
21143 * Instruct event daemon to retry the
21144 * cleanup later.
21145 */
21146 sata_log(sata_hba_inst,
21147 CE_WARN,
21148 "Application(s) accessing "
21149 "previously attached SATA "
21150 "device have to release "
21151 "it before newly inserted "
21152 "device can be made accessible."
21153 "at port %d:%d",
21154 cport, pmport);
21155 pmportinfo->pmport_event_flags |=
21156 SATA_EVNT_TARGET_NODE_CLEANUP;
21157 pmportinfo->pmport_tgtnode_clean =
21158 B_FALSE;
21159 }
21160 }
21161 if (sata_auto_online != 0) {
21162 pmportinfo->pmport_event_flags |=
21163 SATA_EVNT_AUTOONLINE_DEVICE;
21164 }
21165
21166 }
21167 } else {
21168 pmportinfo->pmport_dev_attach_time = 0;
21169 }
21170
21171 event_flags = pmportinfo->pmport_event_flags;
21172 mutex_exit(&pmportinfo->pmport_mutex);
21173 if (event_flags != 0) {
21174 mutex_enter(&sata_hba_inst->satahba_mutex);
21175 sata_hba_inst->satahba_event_flags |= SATA_EVNT_MAIN;
21176 mutex_exit(&sata_hba_inst->satahba_mutex);
21177 mutex_enter(&sata_mutex);
21178 sata_event_pending |= SATA_EVNT_MAIN;
21179 mutex_exit(&sata_mutex);
21180 }
21181
21182 /* clear the reset_in_progress events */
21183 if (SATA_PMPORTINFO_DRV_INFO(pmportinfo) != NULL) {
21184 if (pmportinfo->pmport_dev_type & SATA_VALID_DEV_TYPE) {
21185 /* must clear flags on cport */
21186 sata_pmult_info_t *pminfo =
21187 SATA_PMULT_INFO(sata_hba_inst,
21188 saddr->cport);
21189 pminfo->pmult_event_flags |=
21190 SATA_EVNT_CLEAR_DEVICE_RESET;
21191 }
21192 }
21193 }
21194
21195 /*
21196 * Device Target Node Cleanup Event processing.
21197 * If the target node associated with a sata port device is in
21198 * DEVI_DEVICE_REMOVED state, an attempt is made to remove it.
21199 * If the target node cannot be removed, the event flag is left intact,
21200 * so that event daemon may re-run this function later.
21201 *
21202 * This function cannot be called in interrupt context (it may sleep).
21203 *
21204 * NOTE: Processes cport events only, not port multiplier ports.
21205 */
21206 static void
sata_process_target_node_cleanup(sata_hba_inst_t * sata_hba_inst,sata_address_t * saddr)21207 sata_process_target_node_cleanup(sata_hba_inst_t *sata_hba_inst,
21208 sata_address_t *saddr)
21209 {
21210 sata_cport_info_t *cportinfo;
21211 dev_info_t *tdip;
21212
21213 SATADBG1(SATA_DBG_EVENTS_PROC, sata_hba_inst,
21214 "Processing port %d device target node cleanup", saddr->cport);
21215
21216 cportinfo = SATA_CPORT_INFO(sata_hba_inst, saddr->cport);
21217
21218 /*
21219 * Check if there is target node for that device and it is in the
21220 * DEVI_DEVICE_REMOVED state. If so, release it.
21221 */
21222 tdip = sata_get_target_dip(SATA_DIP(sata_hba_inst), saddr->cport,
21223 saddr->pmport);
21224 if (tdip != NULL) {
21225 /*
21226 * target node exists - check if it is target node of
21227 * a removed device.
21228 */
21229 if (sata_check_device_removed(tdip) == B_TRUE) {
21230 SATADBG1(SATA_DBG_EVENTS_PROC, sata_hba_inst,
21231 "sata_process_target_node_cleanup: "
21232 "old device target node exists!", NULL);
21233 /*
21234 * Unconfigure and remove the target node
21235 */
21236 if (ndi_devi_offline(tdip, NDI_DEVI_REMOVE) ==
21237 NDI_SUCCESS) {
21238 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst,
21239 saddr->cport)->cport_mutex);
21240 cportinfo->cport_event_flags &=
21241 ~SATA_EVNT_TARGET_NODE_CLEANUP;
21242 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst,
21243 saddr->cport)->cport_mutex);
21244 return;
21245 }
21246 /*
21247 * Event daemon will retry the cleanup later.
21248 */
21249 mutex_enter(&sata_hba_inst->satahba_mutex);
21250 sata_hba_inst->satahba_event_flags |= SATA_EVNT_MAIN;
21251 mutex_exit(&sata_hba_inst->satahba_mutex);
21252 mutex_enter(&sata_mutex);
21253 sata_event_pending |= SATA_EVNT_MAIN;
21254 mutex_exit(&sata_mutex);
21255 }
21256 } else {
21257 if (saddr->qual == SATA_ADDR_CPORT ||
21258 saddr->qual == SATA_ADDR_DCPORT) {
21259 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst,
21260 saddr->cport)->cport_mutex);
21261 cportinfo->cport_event_flags &=
21262 ~SATA_EVNT_TARGET_NODE_CLEANUP;
21263 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst,
21264 saddr->cport)->cport_mutex);
21265 } else {
21266 /* sanity check */
21267 if (SATA_CPORT_DEV_TYPE(sata_hba_inst, saddr->cport) !=
21268 SATA_DTYPE_PMULT || SATA_PMULT_INFO(sata_hba_inst,
21269 saddr->cport) == NULL)
21270 return;
21271 if (SATA_PMPORT_INFO(sata_hba_inst, saddr->cport,
21272 saddr->pmport) == NULL)
21273 return;
21274
21275 mutex_enter(&SATA_PMPORT_INFO(sata_hba_inst,
21276 saddr->cport, saddr->pmport)->pmport_mutex);
21277 SATA_PMPORT_INFO(sata_hba_inst, saddr->cport,
21278 saddr->pmport)->pmport_event_flags &=
21279 ~SATA_EVNT_TARGET_NODE_CLEANUP;
21280 mutex_exit(&SATA_PMPORT_INFO(sata_hba_inst,
21281 saddr->cport, saddr->pmport)->pmport_mutex);
21282 }
21283 }
21284 }
21285
21286 /*
21287 * Device AutoOnline Event processing.
21288 * If attached device is to be onlined, an attempt is made to online this
21289 * device, but only if there is no lingering (old) target node present.
21290 * If the device cannot be onlined, the event flag is left intact,
21291 * so that event daemon may re-run this function later.
21292 *
21293 * This function cannot be called in interrupt context (it may sleep).
21294 *
21295 * NOTE: Processes cport events only, not port multiplier ports.
21296 */
21297 static void
sata_process_device_autoonline(sata_hba_inst_t * sata_hba_inst,sata_address_t * saddr)21298 sata_process_device_autoonline(sata_hba_inst_t *sata_hba_inst,
21299 sata_address_t *saddr)
21300 {
21301 sata_cport_info_t *cportinfo;
21302 sata_drive_info_t *sdinfo;
21303 sata_device_t sata_device;
21304 dev_info_t *tdip;
21305
21306 SATADBG1(SATA_DBG_EVENTS_PROC, sata_hba_inst,
21307 "Processing port %d attached device auto-onlining", saddr->cport);
21308
21309 cportinfo = SATA_CPORT_INFO(sata_hba_inst, saddr->cport);
21310
21311 /*
21312 * Check if device is present and recognized. If not, reset event.
21313 */
21314 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->cport_mutex);
21315 if ((cportinfo->cport_dev_type & SATA_VALID_DEV_TYPE) == 0) {
21316 /* Nothing to online */
21317 cportinfo->cport_event_flags &= ~SATA_EVNT_AUTOONLINE_DEVICE;
21318 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst,
21319 saddr->cport)->cport_mutex);
21320 return;
21321 }
21322 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->cport_mutex);
21323
21324 /*
21325 * Check if there is target node for this device and if it is in the
21326 * DEVI_DEVICE_REMOVED state. If so, abort onlining but keep
21327 * the event for later processing.
21328 */
21329 tdip = sata_get_target_dip(SATA_DIP(sata_hba_inst), saddr->cport,
21330 saddr->pmport);
21331 if (tdip != NULL) {
21332 /*
21333 * target node exists - check if it is target node of
21334 * a removed device.
21335 */
21336 if (sata_check_device_removed(tdip) == B_TRUE) {
21337 SATADBG1(SATA_DBG_EVENTS_PROC, sata_hba_inst,
21338 "sata_process_device_autoonline: "
21339 "old device target node exists!", NULL);
21340 /*
21341 * Event daemon will retry device onlining later.
21342 */
21343 mutex_enter(&sata_hba_inst->satahba_mutex);
21344 sata_hba_inst->satahba_event_flags |= SATA_EVNT_MAIN;
21345 mutex_exit(&sata_hba_inst->satahba_mutex);
21346 mutex_enter(&sata_mutex);
21347 sata_event_pending |= SATA_EVNT_MAIN;
21348 mutex_exit(&sata_mutex);
21349 return;
21350 }
21351 /*
21352 * If the target node is not in the 'removed" state, assume
21353 * that it belongs to this device. There is nothing more to do,
21354 * but reset the event.
21355 */
21356 } else {
21357
21358 /*
21359 * Try to online the device
21360 * If there is any reset-related event, remove it. We are
21361 * configuring the device and no state restoring is needed.
21362 */
21363 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst,
21364 saddr->cport)->cport_mutex);
21365 sata_device.satadev_addr = *saddr;
21366 if (saddr->qual == SATA_ADDR_CPORT)
21367 sata_device.satadev_addr.qual = SATA_ADDR_DCPORT;
21368 else
21369 sata_device.satadev_addr.qual = SATA_ADDR_DPMPORT;
21370 sdinfo = sata_get_device_info(sata_hba_inst, &sata_device);
21371 if (sdinfo != NULL) {
21372 if (sdinfo->satadrv_event_flags &
21373 (SATA_EVNT_DEVICE_RESET |
21374 SATA_EVNT_INPROC_DEVICE_RESET))
21375 sdinfo->satadrv_event_flags = 0;
21376 sdinfo->satadrv_event_flags |=
21377 SATA_EVNT_CLEAR_DEVICE_RESET;
21378
21379 /* Need to create a new target node. */
21380 cportinfo->cport_tgtnode_clean = B_TRUE;
21381 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst,
21382 saddr->cport)->cport_mutex);
21383 tdip = sata_create_target_node(SATA_DIP(sata_hba_inst),
21384 sata_hba_inst, &sata_device.satadev_addr);
21385 if (tdip == NULL) {
21386 /*
21387 * Configure (onlining) failed.
21388 * We will NOT retry
21389 */
21390 SATA_LOG_D((sata_hba_inst, CE_WARN,
21391 "sata_process_device_autoonline: "
21392 "configuring SATA device at port %d failed",
21393 saddr->cport));
21394 }
21395 } else {
21396 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst,
21397 saddr->cport)->cport_mutex);
21398 }
21399
21400 }
21401 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->cport_mutex);
21402 cportinfo->cport_event_flags &= ~SATA_EVNT_AUTOONLINE_DEVICE;
21403 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst,
21404 saddr->cport)->cport_mutex);
21405 }
21406
21407
21408 static void
sata_gen_sysevent(sata_hba_inst_t * sata_hba_inst,sata_address_t * saddr,int hint)21409 sata_gen_sysevent(sata_hba_inst_t *sata_hba_inst, sata_address_t *saddr,
21410 int hint)
21411 {
21412 char ap[MAXPATHLEN];
21413 nvlist_t *ev_attr_list = NULL;
21414 int err;
21415
21416 /* Allocate and build sysevent attribute list */
21417 err = nvlist_alloc(&ev_attr_list, NV_UNIQUE_NAME_TYPE, DDI_NOSLEEP);
21418 if (err != 0) {
21419 SATA_LOG_D((sata_hba_inst, CE_WARN,
21420 "sata_gen_sysevent: "
21421 "cannot allocate memory for sysevent attributes\n"));
21422 return;
21423 }
21424 /* Add hint attribute */
21425 err = nvlist_add_string(ev_attr_list, DR_HINT, SE_HINT2STR(hint));
21426 if (err != 0) {
21427 SATA_LOG_D((sata_hba_inst, CE_WARN,
21428 "sata_gen_sysevent: "
21429 "failed to add DR_HINT attr for sysevent"));
21430 nvlist_free(ev_attr_list);
21431 return;
21432 }
21433 /*
21434 * Add AP attribute.
21435 * Get controller pathname and convert it into AP pathname by adding
21436 * a target number.
21437 */
21438 (void) snprintf(ap, MAXPATHLEN, "/devices");
21439 (void) ddi_pathname(SATA_DIP(sata_hba_inst), ap + strlen(ap));
21440 (void) snprintf(ap + strlen(ap), MAXPATHLEN - strlen(ap), ":%d",
21441 SATA_MAKE_AP_NUMBER(saddr->cport, saddr->pmport, saddr->qual));
21442
21443 err = nvlist_add_string(ev_attr_list, DR_AP_ID, ap);
21444 if (err != 0) {
21445 SATA_LOG_D((sata_hba_inst, CE_WARN,
21446 "sata_gen_sysevent: "
21447 "failed to add DR_AP_ID attr for sysevent"));
21448 nvlist_free(ev_attr_list);
21449 return;
21450 }
21451
21452 /* Generate/log sysevent */
21453 err = ddi_log_sysevent(SATA_DIP(sata_hba_inst), DDI_VENDOR_SUNW, EC_DR,
21454 ESC_DR_AP_STATE_CHANGE, ev_attr_list, NULL, DDI_NOSLEEP);
21455 if (err != DDI_SUCCESS) {
21456 SATA_LOG_D((sata_hba_inst, CE_WARN,
21457 "sata_gen_sysevent: "
21458 "cannot log sysevent, err code %x\n", err));
21459 }
21460
21461 nvlist_free(ev_attr_list);
21462 }
21463
21464
21465
21466
21467 /*
21468 * Set DEVI_DEVICE_REMOVED state in the SATA device target node.
21469 */
21470 static void
sata_set_device_removed(dev_info_t * tdip)21471 sata_set_device_removed(dev_info_t *tdip)
21472 {
21473 ASSERT(tdip != NULL);
21474
21475 ndi_devi_enter(tdip);
21476 mutex_enter(&DEVI(tdip)->devi_lock);
21477 DEVI_SET_DEVICE_REMOVED(tdip);
21478 mutex_exit(&DEVI(tdip)->devi_lock);
21479 ndi_devi_exit(tdip);
21480 }
21481
21482
21483 /*
21484 * Set internal event instructing event daemon to try
21485 * to perform the target node cleanup.
21486 */
21487 static void
sata_set_target_node_cleanup(sata_hba_inst_t * sata_hba_inst,sata_address_t * saddr)21488 sata_set_target_node_cleanup(sata_hba_inst_t *sata_hba_inst,
21489 sata_address_t *saddr)
21490 {
21491 if (saddr->qual == SATA_ADDR_CPORT ||
21492 saddr->qual == SATA_ADDR_DCPORT) {
21493 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst,
21494 saddr->cport)->cport_mutex);
21495 SATA_CPORT_EVENT_FLAGS(sata_hba_inst, saddr->cport) |=
21496 SATA_EVNT_TARGET_NODE_CLEANUP;
21497 SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->
21498 cport_tgtnode_clean = B_FALSE;
21499 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst,
21500 saddr->cport)->cport_mutex);
21501 } else {
21502 mutex_enter(&SATA_PMPORT_INFO(sata_hba_inst,
21503 saddr->cport, saddr->pmport)->pmport_mutex);
21504 SATA_PMPORT_EVENT_FLAGS(sata_hba_inst, saddr->cport,
21505 saddr->pmport) |= SATA_EVNT_TARGET_NODE_CLEANUP;
21506 SATA_PMPORT_INFO(sata_hba_inst, saddr->cport, saddr->pmport)->
21507 pmport_tgtnode_clean = B_FALSE;
21508 mutex_exit(&SATA_PMPORT_INFO(sata_hba_inst,
21509 saddr->cport, saddr->pmport)->pmport_mutex);
21510 }
21511 mutex_enter(&sata_hba_inst->satahba_mutex);
21512 sata_hba_inst->satahba_event_flags |= SATA_EVNT_MAIN;
21513 mutex_exit(&sata_hba_inst->satahba_mutex);
21514 mutex_enter(&sata_mutex);
21515 sata_event_pending |= SATA_EVNT_MAIN;
21516 mutex_exit(&sata_mutex);
21517 }
21518
21519
21520 /*
21521 * Check if the SATA device target node is in DEVI_DEVICE_REMOVED state,
21522 * i.e. check if the target node state indicates that it belongs to a removed
21523 * device.
21524 *
21525 * Returns B_TRUE if the target node is in DEVI_DEVICE_REMOVED state,
21526 * B_FALSE otherwise.
21527 */
21528 static boolean_t
sata_check_device_removed(dev_info_t * tdip)21529 sata_check_device_removed(dev_info_t *tdip)
21530 {
21531 ASSERT(tdip != NULL);
21532
21533 if (DEVI_IS_DEVICE_REMOVED(tdip))
21534 return (B_TRUE);
21535 else
21536 return (B_FALSE);
21537 }
21538
21539
21540 /*
21541 * Check for DMA error. Return B_TRUE if error, B_FALSE otherwise.
21542 */
21543 static boolean_t
sata_check_for_dma_error(dev_info_t * dip,sata_pkt_txlate_t * spx)21544 sata_check_for_dma_error(dev_info_t *dip, sata_pkt_txlate_t *spx)
21545 {
21546 int fm_capability = ddi_fm_capable(dip);
21547 ddi_fm_error_t de;
21548
21549 if (fm_capability & DDI_FM_DMACHK_CAPABLE) {
21550 if (spx->txlt_buf_dma_handle != NULL) {
21551 ddi_fm_dma_err_get(spx->txlt_buf_dma_handle, &de,
21552 DDI_FME_VERSION);
21553 if (de.fme_status != DDI_SUCCESS)
21554 return (B_TRUE);
21555 }
21556 }
21557 return (B_FALSE);
21558 }
21559
21560
21561 /* ************************ FAULT INJECTTION **************************** */
21562
21563 #ifdef SATA_INJECT_FAULTS
21564
21565 static uint32_t sata_fault_count = 0;
21566 static uint32_t sata_fault_suspend_count = 0;
21567
21568 /*
21569 * Inject sata pkt fault
21570 * It modifies returned values of the sata packet.
21571 * It returns immediately if:
21572 * pkt fault injection is not enabled (via sata_inject_fault,
21573 * sata_inject_fault_count), or invalid fault is specified (sata_fault_type),
21574 * or pkt does not contain command to be faulted (set in sata_fault_cmd), or
21575 * pkt is not directed to specified fault controller/device
21576 * (sata_fault_ctrl_dev and sata_fault_device).
21577 * If fault controller is not specified, fault injection applies to all
21578 * controllers and devices.
21579 *
21580 * First argument is the pointer to the executed sata packet.
21581 * Second argument is a pointer to a value returned by the HBA tran_start
21582 * function.
21583 * Third argument specifies injected error. Injected sata packet faults
21584 * are the satapkt_reason values.
21585 * SATA_PKT_BUSY -1 Not completed, busy
21586 * SATA_PKT_DEV_ERROR 1 Device reported error
21587 * SATA_PKT_QUEUE_FULL 2 Not accepted, queue full
21588 * SATA_PKT_PORT_ERROR 3 Not completed, port error
21589 * SATA_PKT_CMD_UNSUPPORTED 4 Cmd unsupported
21590 * SATA_PKT_ABORTED 5 Aborted by request
21591 * SATA_PKT_TIMEOUT 6 Operation timeut
21592 * SATA_PKT_RESET 7 Aborted by reset request
21593 *
21594 * Additional global variables affecting the execution:
21595 *
21596 * sata_inject_fault_count variable specifies number of times in row the
21597 * error is injected. Value of -1 specifies permanent fault, ie. every time
21598 * the fault injection point is reached, the fault is injected and a pause
21599 * between fault injection specified by sata_inject_fault_pause_count is
21600 * ignored). Fault injection routine decrements sata_inject_fault_count
21601 * (if greater than zero) until it reaches 0. No fault is injected when
21602 * sata_inject_fault_count is 0 (zero).
21603 *
21604 * sata_inject_fault_pause_count variable specifies number of times a fault
21605 * injection is bypassed (pause between fault injections).
21606 * If set to 0, a fault is injected only a number of times specified by
21607 * sata_inject_fault_count.
21608 *
21609 * The fault counts are static, so for periodic errors they have to be manually
21610 * reset to start repetition sequence from scratch.
21611 * If the original value returned by the HBA tran_start function is not
21612 * SATA_TRAN_ACCEPTED and pkt reason is not SATA_PKT_COMPLETED, no error
21613 * is injected (to avoid masking real problems);
21614 *
21615 * NOTE: In its current incarnation, this function should be invoked only for
21616 * commands executed in SYNCHRONOUS mode.
21617 */
21618
21619
21620 static void
sata_inject_pkt_fault(sata_pkt_t * spkt,int * rval,int fault)21621 sata_inject_pkt_fault(sata_pkt_t *spkt, int *rval, int fault)
21622 {
21623
21624 if (sata_inject_fault != SATA_INJECT_PKT_FAULT)
21625 return;
21626
21627 if (sata_inject_fault_count == 0)
21628 return;
21629
21630 if (fault == 0)
21631 return;
21632
21633 if (sata_fault_cmd != spkt->satapkt_cmd.satacmd_cmd_reg)
21634 return;
21635
21636 if (sata_fault_ctrl != NULL) {
21637 sata_pkt_txlate_t *spx =
21638 (sata_pkt_txlate_t *)spkt->satapkt_framework_private;
21639
21640 if (sata_fault_ctrl != NULL && sata_fault_ctrl !=
21641 spx->txlt_sata_hba_inst->satahba_dip)
21642 return;
21643
21644 if (sata_fault_device.satadev_addr.cport !=
21645 spkt->satapkt_device.satadev_addr.cport ||
21646 sata_fault_device.satadev_addr.pmport !=
21647 spkt->satapkt_device.satadev_addr.pmport ||
21648 sata_fault_device.satadev_addr.qual !=
21649 spkt->satapkt_device.satadev_addr.qual)
21650 return;
21651 }
21652
21653 /* Modify pkt return parameters */
21654 if (*rval != SATA_TRAN_ACCEPTED ||
21655 spkt->satapkt_reason != SATA_PKT_COMPLETED) {
21656 sata_fault_count = 0;
21657 sata_fault_suspend_count = 0;
21658 return;
21659 }
21660 if (sata_fault_count == 0 && sata_fault_suspend_count != 0) {
21661 /* Pause in the injection */
21662 sata_fault_suspend_count -= 1;
21663 return;
21664 }
21665
21666 if (sata_fault_count == 0 && sata_fault_suspend_count == 0) {
21667 /*
21668 * Init inject fault cycle. If fault count is set to -1,
21669 * it is a permanent fault.
21670 */
21671 if (sata_inject_fault_count != -1) {
21672 sata_fault_count = sata_inject_fault_count;
21673 sata_fault_suspend_count =
21674 sata_inject_fault_pause_count;
21675 if (sata_fault_suspend_count == 0)
21676 sata_inject_fault_count = 0;
21677 }
21678 }
21679
21680 if (sata_fault_count != 0)
21681 sata_fault_count -= 1;
21682
21683 switch (fault) {
21684 case SATA_PKT_BUSY:
21685 *rval = SATA_TRAN_BUSY;
21686 spkt->satapkt_reason = SATA_PKT_BUSY;
21687 break;
21688
21689 case SATA_PKT_QUEUE_FULL:
21690 *rval = SATA_TRAN_QUEUE_FULL;
21691 spkt->satapkt_reason = SATA_PKT_QUEUE_FULL;
21692 break;
21693
21694 case SATA_PKT_CMD_UNSUPPORTED:
21695 *rval = SATA_TRAN_CMD_UNSUPPORTED;
21696 spkt->satapkt_reason = SATA_PKT_CMD_UNSUPPORTED;
21697 break;
21698
21699 case SATA_PKT_PORT_ERROR:
21700 /* This is "rejected" command */
21701 *rval = SATA_TRAN_PORT_ERROR;
21702 spkt->satapkt_reason = SATA_PKT_PORT_ERROR;
21703 /* Additional error setup could be done here - port state */
21704 break;
21705
21706 case SATA_PKT_DEV_ERROR:
21707 spkt->satapkt_reason = SATA_PKT_DEV_ERROR;
21708 /*
21709 * Additional error setup could be done here
21710 */
21711 break;
21712
21713 case SATA_PKT_ABORTED:
21714 spkt->satapkt_reason = SATA_PKT_ABORTED;
21715 break;
21716
21717 case SATA_PKT_TIMEOUT:
21718 spkt->satapkt_reason = SATA_PKT_TIMEOUT;
21719 /* Additional error setup could be done here */
21720 break;
21721
21722 case SATA_PKT_RESET:
21723 spkt->satapkt_reason = SATA_PKT_RESET;
21724 /*
21725 * Additional error setup could be done here - device reset
21726 */
21727 break;
21728
21729 default:
21730 break;
21731 }
21732 }
21733
21734 #endif
21735
21736 /*
21737 * SATA Trace Ring Buffer
21738 * ----------------------
21739 *
21740 * Overview
21741 *
21742 * The SATA trace ring buffer is a ring buffer created and managed by
21743 * the SATA framework module that can be used by any module or driver
21744 * within the SATA framework to store debug messages.
21745 *
21746 * Ring Buffer Interfaces:
21747 *
21748 * sata_vtrace_debug() <-- Adds debug message to ring buffer
21749 * sata_trace_debug() <-- Wraps varargs into sata_vtrace_debug()
21750 *
21751 * Note that the sata_trace_debug() interface was created to give
21752 * consumers the flexibilty of sending debug messages to ring buffer
21753 * as variable arguments. Consumers can send type va_list debug
21754 * messages directly to sata_vtrace_debug(). The sata_trace_debug()
21755 * and sata_vtrace_debug() relationship is similar to that of
21756 * cmn_err(9F) and vcmn_err(9F).
21757 *
21758 * Below is a diagram of the SATA trace ring buffer interfaces and
21759 * sample consumers:
21760 *
21761 * +---------------------------------+
21762 * | o o SATA Framework Module |
21763 * | o SATA o +------------------+ +------------------+
21764 * |o Trace o <--|sata_vtrace_debug/|<-----|SATA HBA Driver #1|
21765 * |o R-Buf o |sata_trace_debug |<--+ +------------------+
21766 * | o o +------------------+ | +------------------+
21767 * | o o ^ | +--|SATA HBA Driver #2|
21768 * | | | +------------------+
21769 * | +------------------+ |
21770 * | |SATA Debug Message| |
21771 * | +------------------+ |
21772 * +---------------------------------+
21773 *
21774 * Supporting Routines:
21775 *
21776 * sata_trace_rbuf_alloc() <-- Initializes ring buffer
21777 * sata_trace_rbuf_free() <-- Destroys ring buffer
21778 * sata_trace_dmsg_alloc() <-- Creates or reuses buffer in ring buffer
21779 * sata_trace_dmsg_free() <-- Destroys content of ring buffer
21780 *
21781 * The default SATA trace ring buffer size is defined by DMSG_RING_SIZE.
21782 * The ring buffer size can be adjusted by setting dmsg_ring_size in
21783 * /etc/system to desired size in unit of bytes.
21784 *
21785 * The individual debug message size in the ring buffer is restricted
21786 * to DMSG_BUF_SIZE.
21787 */
21788 void
sata_vtrace_debug(dev_info_t * dip,const char * fmt,va_list ap)21789 sata_vtrace_debug(dev_info_t *dip, const char *fmt, va_list ap)
21790 {
21791 sata_trace_dmsg_t *dmsg;
21792
21793 if (sata_debug_rbuf == NULL) {
21794 return;
21795 }
21796
21797 /*
21798 * If max size of ring buffer is smaller than size
21799 * required for one debug message then just return
21800 * since we have no room for the debug message.
21801 */
21802 if (sata_debug_rbuf->maxsize < (sizeof (sata_trace_dmsg_t))) {
21803 return;
21804 }
21805
21806 mutex_enter(&sata_debug_rbuf->lock);
21807
21808 /* alloc or reuse on ring buffer */
21809 dmsg = sata_trace_dmsg_alloc();
21810
21811 if (dmsg == NULL) {
21812 /* resource allocation failed */
21813 mutex_exit(&sata_debug_rbuf->lock);
21814 return;
21815 }
21816
21817 dmsg->dip = dip;
21818 gethrestime(&dmsg->timestamp);
21819
21820 (void) vsnprintf(dmsg->buf, sizeof (dmsg->buf), fmt, ap);
21821
21822 mutex_exit(&sata_debug_rbuf->lock);
21823 }
21824
21825 void
sata_trace_debug(dev_info_t * dip,const char * fmt,...)21826 sata_trace_debug(dev_info_t *dip, const char *fmt, ...)
21827 {
21828 va_list ap;
21829
21830 va_start(ap, fmt);
21831 sata_vtrace_debug(dip, fmt, ap);
21832 va_end(ap);
21833 }
21834
21835 /*
21836 * This routine is used to manage debug messages
21837 * on ring buffer.
21838 */
21839 static sata_trace_dmsg_t *
sata_trace_dmsg_alloc(void)21840 sata_trace_dmsg_alloc(void)
21841 {
21842 sata_trace_dmsg_t *dmsg_alloc, *dmsg = sata_debug_rbuf->dmsgp;
21843
21844 if (sata_debug_rbuf->looped == TRUE) {
21845 sata_debug_rbuf->dmsgp = dmsg->next;
21846 return (sata_debug_rbuf->dmsgp);
21847 }
21848
21849 /*
21850 * If we're looping for the first time,
21851 * connect the ring.
21852 */
21853 if (((sata_debug_rbuf->size + (sizeof (sata_trace_dmsg_t))) >
21854 sata_debug_rbuf->maxsize) && (sata_debug_rbuf->dmsgh != NULL)) {
21855 dmsg->next = sata_debug_rbuf->dmsgh;
21856 sata_debug_rbuf->dmsgp = sata_debug_rbuf->dmsgh;
21857 sata_debug_rbuf->looped = TRUE;
21858 return (sata_debug_rbuf->dmsgp);
21859 }
21860
21861 /* If we've gotten this far then memory allocation is needed */
21862 dmsg_alloc = kmem_zalloc(sizeof (sata_trace_dmsg_t), KM_NOSLEEP);
21863 if (dmsg_alloc == NULL) {
21864 sata_debug_rbuf->allocfailed++;
21865 return (dmsg_alloc);
21866 } else {
21867 sata_debug_rbuf->size += sizeof (sata_trace_dmsg_t);
21868 }
21869
21870 if (sata_debug_rbuf->dmsgp != NULL) {
21871 dmsg->next = dmsg_alloc;
21872 sata_debug_rbuf->dmsgp = dmsg->next;
21873 return (sata_debug_rbuf->dmsgp);
21874 } else {
21875 /*
21876 * We should only be here if we're initializing
21877 * the ring buffer.
21878 */
21879 if (sata_debug_rbuf->dmsgh == NULL) {
21880 sata_debug_rbuf->dmsgh = dmsg_alloc;
21881 } else {
21882 /* Something is wrong */
21883 kmem_free(dmsg_alloc, sizeof (sata_trace_dmsg_t));
21884 return (NULL);
21885 }
21886
21887 sata_debug_rbuf->dmsgp = dmsg_alloc;
21888 return (sata_debug_rbuf->dmsgp);
21889 }
21890 }
21891
21892
21893 /*
21894 * Free all messages on debug ring buffer.
21895 */
21896 static void
sata_trace_dmsg_free(void)21897 sata_trace_dmsg_free(void)
21898 {
21899 sata_trace_dmsg_t *dmsg_next, *dmsg = sata_debug_rbuf->dmsgh;
21900
21901 while (dmsg != NULL) {
21902 dmsg_next = dmsg->next;
21903 kmem_free(dmsg, sizeof (sata_trace_dmsg_t));
21904
21905 /*
21906 * If we've looped around the ring than we're done.
21907 */
21908 if (dmsg_next == sata_debug_rbuf->dmsgh) {
21909 break;
21910 } else {
21911 dmsg = dmsg_next;
21912 }
21913 }
21914 }
21915
21916
21917 /*
21918 * This function can block
21919 */
21920 static void
sata_trace_rbuf_alloc(void)21921 sata_trace_rbuf_alloc(void)
21922 {
21923 sata_debug_rbuf = kmem_zalloc(sizeof (sata_trace_rbuf_t), KM_SLEEP);
21924
21925 mutex_init(&sata_debug_rbuf->lock, NULL, MUTEX_DRIVER, NULL);
21926
21927 if (dmsg_ring_size > 0) {
21928 sata_debug_rbuf->maxsize = (size_t)dmsg_ring_size;
21929 }
21930 }
21931
21932
21933 static void
sata_trace_rbuf_free(void)21934 sata_trace_rbuf_free(void)
21935 {
21936 sata_trace_dmsg_free();
21937 mutex_destroy(&sata_debug_rbuf->lock);
21938 kmem_free(sata_debug_rbuf, sizeof (sata_trace_rbuf_t));
21939 }
21940
21941 #ifndef SATA_DEBUG
21942 /*
21943 * If SATA_DEBUG is not defined then this routine is called instead
21944 * of sata_log() via the SATA_LOG_D macro.
21945 */
21946 static void
sata_trace_log(sata_hba_inst_t * sata_hba_inst,uint_t level __unused,const char * fmt,...)21947 sata_trace_log(sata_hba_inst_t *sata_hba_inst, uint_t level __unused,
21948 const char *fmt, ...)
21949 {
21950 dev_info_t *dip = NULL;
21951 va_list ap;
21952
21953 if (sata_hba_inst != NULL) {
21954 dip = SATA_DIP(sata_hba_inst);
21955 }
21956
21957 va_start(ap, fmt);
21958 sata_vtrace_debug(dip, fmt, ap);
21959 va_end(ap);
21960 }
21961
21962 #endif /* SATA_DEBUG */
21963