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 2015 Nexenta Systems, Inc. All rights reserved.
27 * Copyright 2016 Argo Technologies SA
28 */
29
30 /*
31 * SATA Framework
32 * Generic SATA Host Adapter Implementation
33 */
34
35 #include <sys/conf.h>
36 #include <sys/file.h>
37 #include <sys/ddi.h>
38 #include <sys/sunddi.h>
39 #include <sys/modctl.h>
40 #include <sys/cmn_err.h>
41 #include <sys/errno.h>
42 #include <sys/thread.h>
43 #include <sys/kstat.h>
44 #include <sys/note.h>
45 #include <sys/sysevent.h>
46 #include <sys/sysevent/eventdefs.h>
47 #include <sys/sysevent/dr.h>
48 #include <sys/taskq.h>
49 #include <sys/disp.h>
50 #include <sys/sdt.h>
51
52 #include <sys/sata/impl/sata.h>
53 #include <sys/sata/sata_hba.h>
54 #include <sys/sata/sata_defs.h>
55 #include <sys/sata/sata_cfgadm.h>
56 #include <sys/sata/sata_blacklist.h>
57 #include <sys/sata/sata_satl.h>
58
59 #include <sys/scsi/impl/spc3_types.h>
60
61 /*
62 * FMA header files
63 */
64 #include <sys/ddifm.h>
65 #include <sys/fm/protocol.h>
66 #include <sys/fm/util.h>
67 #include <sys/fm/io/ddi.h>
68
69 /* Debug flags - defined in sata.h */
70 int sata_debug_flags = 0;
71 int sata_msg = 0;
72
73 /*
74 * Flags enabling selected SATA HBA framework functionality
75 */
76 #define SATA_ENABLE_QUEUING 1
77 #define SATA_ENABLE_NCQ 2
78 #define SATA_ENABLE_PROCESS_EVENTS 4
79 #define SATA_ENABLE_PMULT_FBS 8 /* FIS-Based Switching */
80 int sata_func_enable =
81 SATA_ENABLE_PROCESS_EVENTS | SATA_ENABLE_QUEUING | SATA_ENABLE_NCQ;
82
83 /*
84 * Global variable setting default maximum queue depth (NCQ or TCQ)
85 * Note:minimum queue depth is 1
86 */
87 int sata_max_queue_depth = SATA_MAX_QUEUE_DEPTH; /* max NCQ/TCQ queue depth */
88
89 /*
90 * Currently used default NCQ/TCQ queue depth. It is set-up during the driver
91 * initialization, using value from sata_max_queue_depth
92 * It is adjusted to minimum supported by the controller and by the device,
93 * if queueing is enabled.
94 */
95 static int sata_current_max_qdepth;
96
97 /*
98 * Global variable determining the default behavior after device hotpluggin.
99 * If non-zero, the hotplugged device is onlined (if possible) without explicit
100 * IOCTL request (AP_CONFIGURE).
101 * If zero, hotplugged device is identified, but not onlined.
102 * Enabling (AP_CONNECT) device port with an attached device does not result
103 * in device onlining regardless of the flag setting
104 */
105 int sata_auto_online = 0;
106
107 #ifdef SATA_DEBUG
108
109 #define SATA_LOG_D(args) sata_log args
110 uint64_t mbuf_count = 0;
111 uint64_t mbuffail_count = 0;
112
113 sata_atapi_cmd_t sata_atapi_trace[64];
114 uint32_t sata_atapi_trace_index = 0;
115 int sata_atapi_trace_save = 1;
116 static void sata_save_atapi_trace(sata_pkt_txlate_t *, int);
117 #define SATAATAPITRACE(spx, count) if (sata_atapi_trace_save) \
118 sata_save_atapi_trace(spx, count);
119
120 #else
121 #define SATA_LOG_D(args) sata_trace_log args
122 #define SATAATAPITRACE(spx, count)
123 #endif
124
125 #if 0
126 static void
127 sata_test_atapi_packet_command(sata_hba_inst_t *, int);
128 #endif
129
130 #ifdef SATA_INJECT_FAULTS
131
132 #define SATA_INJECT_PKT_FAULT 1
133 uint32_t sata_inject_fault = 0;
134
135 uint32_t sata_inject_fault_count = 0;
136 uint32_t sata_inject_fault_pause_count = 0;
137 uint32_t sata_fault_type = 0;
138 uint32_t sata_fault_cmd = 0;
139 dev_info_t *sata_fault_ctrl = NULL;
140 sata_device_t sata_fault_device;
141
142 static void sata_inject_pkt_fault(sata_pkt_t *, int *, int);
143
144 #endif
145
146 #define LEGACY_HWID_LEN 64 /* Model (40) + Serial (20) + pad */
147
148 static char sata_rev_tag[] = {"1.46"};
149
150 /*
151 * SATA cb_ops functions
152 */
153 static int sata_hba_open(dev_t *, int, int, cred_t *);
154 static int sata_hba_close(dev_t, int, int, cred_t *);
155 static int sata_hba_ioctl(dev_t, int, intptr_t, int, cred_t *, int *);
156
157 /*
158 * SCSA required entry points
159 */
160 static int sata_scsi_tgt_init(dev_info_t *, dev_info_t *,
161 scsi_hba_tran_t *, struct scsi_device *);
162 static int sata_scsi_tgt_probe(struct scsi_device *,
163 int (*callback)(void));
164 static void sata_scsi_tgt_free(dev_info_t *, dev_info_t *,
165 scsi_hba_tran_t *, struct scsi_device *);
166 static int sata_scsi_start(struct scsi_address *, struct scsi_pkt *);
167 static int sata_scsi_abort(struct scsi_address *, struct scsi_pkt *);
168 static int sata_scsi_reset(struct scsi_address *, int);
169 static int sata_scsi_getcap(struct scsi_address *, char *, int);
170 static int sata_scsi_setcap(struct scsi_address *, char *, int, int);
171 static struct scsi_pkt *sata_scsi_init_pkt(struct scsi_address *,
172 struct scsi_pkt *, struct buf *, int, int, int, int, int (*)(caddr_t),
173 caddr_t);
174 static void sata_scsi_destroy_pkt(struct scsi_address *, struct scsi_pkt *);
175 static void sata_scsi_dmafree(struct scsi_address *, struct scsi_pkt *);
176 static void sata_scsi_sync_pkt(struct scsi_address *, struct scsi_pkt *);
177
178 /*
179 * SATA HBA interface functions are defined in sata_hba.h header file
180 */
181
182 /* Event processing functions */
183 static void sata_event_daemon(void *);
184 static void sata_event_thread_control(int);
185 static void sata_process_controller_events(sata_hba_inst_t *sata_hba_inst);
186 static void sata_process_pmult_events(sata_hba_inst_t *, uint8_t);
187 static void sata_process_device_reset(sata_hba_inst_t *, sata_address_t *);
188 static void sata_process_pmdevice_reset(sata_hba_inst_t *, sata_address_t *);
189 static void sata_process_port_failed_event(sata_hba_inst_t *,
190 sata_address_t *);
191 static void sata_process_port_link_events(sata_hba_inst_t *,
192 sata_address_t *);
193 static void sata_process_pmport_link_events(sata_hba_inst_t *,
194 sata_address_t *);
195 static void sata_process_device_detached(sata_hba_inst_t *, sata_address_t *);
196 static void sata_process_pmdevice_detached(sata_hba_inst_t *,
197 sata_address_t *);
198 static void sata_process_device_attached(sata_hba_inst_t *, sata_address_t *);
199 static void sata_process_pmdevice_attached(sata_hba_inst_t *,
200 sata_address_t *);
201 static void sata_process_port_pwr_change(sata_hba_inst_t *, sata_address_t *);
202 static void sata_process_cntrl_pwr_level_change(sata_hba_inst_t *);
203 static void sata_process_target_node_cleanup(sata_hba_inst_t *,
204 sata_address_t *);
205 static void sata_process_device_autoonline(sata_hba_inst_t *,
206 sata_address_t *saddr);
207
208 /*
209 * Local translation functions
210 */
211 static int sata_txlt_inquiry(sata_pkt_txlate_t *);
212 static int sata_txlt_test_unit_ready(sata_pkt_txlate_t *);
213 static int sata_txlt_start_stop_unit(sata_pkt_txlate_t *);
214 static int sata_txlt_read_capacity(sata_pkt_txlate_t *);
215 static int sata_txlt_read_capacity16(sata_pkt_txlate_t *);
216 static int sata_txlt_unmap(sata_pkt_txlate_t *);
217 static int sata_txlt_request_sense(sata_pkt_txlate_t *);
218 static int sata_txlt_read(sata_pkt_txlate_t *);
219 static int sata_txlt_write(sata_pkt_txlate_t *);
220 static int sata_txlt_log_sense(sata_pkt_txlate_t *);
221 static int sata_txlt_log_select(sata_pkt_txlate_t *);
222 static int sata_txlt_mode_sense(sata_pkt_txlate_t *);
223 static int sata_txlt_mode_select(sata_pkt_txlate_t *);
224 static int sata_txlt_ata_pass_thru(sata_pkt_txlate_t *);
225 static int sata_txlt_synchronize_cache(sata_pkt_txlate_t *);
226 static int sata_txlt_write_buffer(sata_pkt_txlate_t *);
227 static int sata_txlt_nodata_cmd_immediate(sata_pkt_txlate_t *);
228
229 static int sata_hba_start(sata_pkt_txlate_t *, int *);
230 static int sata_txlt_invalid_command(sata_pkt_txlate_t *);
231 static int sata_txlt_check_condition(sata_pkt_txlate_t *, uchar_t, uchar_t);
232 static int sata_txlt_lba_out_of_range(sata_pkt_txlate_t *);
233 static int sata_txlt_ata_pass_thru_illegal_cmd(sata_pkt_txlate_t *);
234 static int sata_txlt_unmap_nodata_cmd(sata_pkt_txlate_t *);
235 static void sata_txlt_rw_completion(sata_pkt_t *);
236 static void sata_txlt_nodata_cmd_completion(sata_pkt_t *);
237 static void sata_txlt_apt_completion(sata_pkt_t *sata_pkt);
238 static void sata_txlt_unmap_completion(sata_pkt_t *sata_pkt);
239 static void sata_txlt_download_mcode_cmd_completion(sata_pkt_t *);
240 static int sata_emul_rw_completion(sata_pkt_txlate_t *);
241 static void sata_fill_ata_return_desc(sata_pkt_t *, uint8_t, uint8_t,
242 uint8_t);
243 static struct scsi_extended_sense *sata_immediate_error_response(
244 sata_pkt_txlate_t *, int);
245 static struct scsi_extended_sense *sata_arq_sense(sata_pkt_txlate_t *);
246
247 static int sata_txlt_atapi(sata_pkt_txlate_t *);
248 static void sata_txlt_atapi_completion(sata_pkt_t *);
249
250 /*
251 * Local functions for ioctl
252 */
253 static int32_t sata_get_port_num(sata_hba_inst_t *, struct devctl_iocdata *);
254 static void sata_cfgadm_state(sata_hba_inst_t *, int32_t,
255 devctl_ap_state_t *);
256 static dev_info_t *sata_get_target_dip(dev_info_t *, uint8_t, uint8_t);
257 static dev_info_t *sata_get_scsi_target_dip(dev_info_t *, sata_address_t *);
258 static dev_info_t *sata_devt_to_devinfo(dev_t);
259 static int sata_ioctl_connect(sata_hba_inst_t *, sata_device_t *);
260 static int sata_ioctl_disconnect(sata_hba_inst_t *, sata_device_t *);
261 static int sata_ioctl_configure(sata_hba_inst_t *, sata_device_t *);
262 static int sata_ioctl_unconfigure(sata_hba_inst_t *, sata_device_t *);
263 static int sata_ioctl_activate(sata_hba_inst_t *, sata_device_t *);
264 static int sata_ioctl_deactivate(sata_hba_inst_t *, sata_device_t *);
265 static int sata_ioctl_reset_port(sata_hba_inst_t *, sata_device_t *);
266 static int sata_ioctl_reset_device(sata_hba_inst_t *, sata_device_t *);
267 static int sata_ioctl_reset_all(sata_hba_inst_t *);
268 static int sata_ioctl_port_self_test(sata_hba_inst_t *, sata_device_t *);
269 static int sata_ioctl_get_device_path(sata_hba_inst_t *, sata_device_t *,
270 sata_ioctl_data_t *, int mode);
271 static int sata_ioctl_get_ap_type(sata_hba_inst_t *, sata_device_t *,
272 sata_ioctl_data_t *, int mode);
273 static int sata_ioctl_get_model_info(sata_hba_inst_t *, sata_device_t *,
274 sata_ioctl_data_t *, int mode);
275 static int sata_ioctl_get_revfirmware_info(sata_hba_inst_t *, sata_device_t *,
276 sata_ioctl_data_t *, int mode);
277 static int sata_ioctl_get_serialnumber_info(sata_hba_inst_t *,
278 sata_device_t *, sata_ioctl_data_t *, int mode);
279
280 /*
281 * Local functions
282 */
283 static void sata_remove_hba_instance(dev_info_t *);
284 static int sata_validate_sata_hba_tran(dev_info_t *, sata_hba_tran_t *);
285 static void sata_probe_ports(sata_hba_inst_t *);
286 static void sata_probe_pmports(sata_hba_inst_t *, uint8_t);
287 static int sata_reprobe_port(sata_hba_inst_t *, sata_device_t *, int);
288 static int sata_reprobe_pmult(sata_hba_inst_t *, sata_device_t *, int);
289 static int sata_reprobe_pmport(sata_hba_inst_t *, sata_device_t *, int);
290 static int sata_alloc_pmult(sata_hba_inst_t *, sata_device_t *);
291 static void sata_free_pmult(sata_hba_inst_t *, sata_device_t *);
292 static int sata_add_device(dev_info_t *, sata_hba_inst_t *, sata_device_t *);
293 static int sata_offline_device(sata_hba_inst_t *, sata_device_t *,
294 sata_drive_info_t *);
295 static dev_info_t *sata_create_target_node(dev_info_t *, sata_hba_inst_t *,
296 sata_address_t *);
297 static void sata_remove_target_node(sata_hba_inst_t *,
298 sata_address_t *);
299 static int sata_validate_scsi_address(sata_hba_inst_t *,
300 struct scsi_address *, sata_device_t *);
301 static int sata_validate_sata_address(sata_hba_inst_t *, int, int, int);
302 static sata_pkt_t *sata_pkt_alloc(sata_pkt_txlate_t *, int (*)(caddr_t));
303 static void sata_pkt_free(sata_pkt_txlate_t *);
304 static int sata_dma_buf_setup(sata_pkt_txlate_t *, int, int (*)(caddr_t),
305 caddr_t, ddi_dma_attr_t *);
306 static void sata_common_free_dma_rsrcs(sata_pkt_txlate_t *);
307 static int sata_probe_device(sata_hba_inst_t *, sata_device_t *);
308 static sata_drive_info_t *sata_get_device_info(sata_hba_inst_t *,
309 sata_device_t *);
310 static int sata_identify_device(sata_hba_inst_t *, sata_drive_info_t *);
311 static void sata_reidentify_device(sata_pkt_txlate_t *);
312 static struct buf *sata_alloc_local_buffer(sata_pkt_txlate_t *, int);
313 static void sata_free_local_buffer(sata_pkt_txlate_t *);
314 static uint64_t sata_check_capacity(sata_drive_info_t *);
315 void sata_adjust_dma_attr(sata_drive_info_t *, ddi_dma_attr_t *,
316 ddi_dma_attr_t *);
317 static int sata_fetch_device_identify_data(sata_hba_inst_t *,
318 sata_drive_info_t *);
319 static void sata_update_port_info(sata_hba_inst_t *, sata_device_t *);
320 static void sata_update_pmport_info(sata_hba_inst_t *, sata_device_t *);
321 static void sata_update_port_scr(sata_port_scr_t *, sata_device_t *);
322 static int sata_set_dma_mode(sata_hba_inst_t *, sata_drive_info_t *);
323 static int sata_set_cache_mode(sata_hba_inst_t *, sata_drive_info_t *, int);
324 static int sata_set_rmsn(sata_hba_inst_t *, sata_drive_info_t *, int);
325 static int sata_set_drive_features(sata_hba_inst_t *,
326 sata_drive_info_t *, int flag);
327 static void sata_init_write_cache_mode(sata_drive_info_t *sdinfo);
328 static int sata_initialize_device(sata_hba_inst_t *, sata_drive_info_t *);
329 static void sata_identdev_to_inquiry(sata_hba_inst_t *, sata_drive_info_t *,
330 uint8_t *);
331 static int sata_get_atapi_inquiry_data(sata_hba_inst_t *, sata_address_t *,
332 struct scsi_inquiry *);
333 static int sata_build_msense_page_1(sata_drive_info_t *, int, uint8_t *);
334 static int sata_build_msense_page_8(sata_drive_info_t *, int, uint8_t *);
335 static int sata_build_msense_page_1a(sata_drive_info_t *, int, uint8_t *);
336 static int sata_build_msense_page_1c(sata_drive_info_t *, int, uint8_t *);
337 static int sata_build_msense_page_30(sata_drive_info_t *, int, uint8_t *);
338 static int sata_mode_select_page_8(sata_pkt_txlate_t *,
339 struct mode_cache_scsi3 *, int, int *, int *, int *);
340 static int sata_mode_select_page_1a(sata_pkt_txlate_t *,
341 struct mode_info_power_cond *, int, int *, int *, int *);
342 static int sata_mode_select_page_1c(sata_pkt_txlate_t *,
343 struct mode_info_excpt_page *, int, int *, int *, int *);
344 static int sata_mode_select_page_30(sata_pkt_txlate_t *,
345 struct mode_acoustic_management *, int, int *, int *, int *);
346
347 static int sata_build_lsense_page_0(sata_drive_info_t *, uint8_t *);
348 static int sata_build_lsense_page_10(sata_drive_info_t *, uint8_t *,
349 sata_hba_inst_t *);
350 static int sata_build_lsense_page_2f(sata_drive_info_t *, uint8_t *,
351 sata_hba_inst_t *);
352 static int sata_build_lsense_page_30(sata_drive_info_t *, uint8_t *,
353 sata_hba_inst_t *);
354 static int sata_build_lsense_page_0e(sata_drive_info_t *, uint8_t *,
355 sata_pkt_txlate_t *);
356
357 static void sata_set_arq_data(sata_pkt_t *);
358 static void sata_build_read_verify_cmd(sata_cmd_t *, uint16_t, uint64_t);
359 static void sata_build_generic_cmd(sata_cmd_t *, uint8_t);
360 static uint8_t sata_get_standby_timer(uint8_t *timer);
361
362 static void sata_save_drive_settings(sata_drive_info_t *);
363 static void sata_show_drive_info(sata_hba_inst_t *, sata_drive_info_t *);
364 static void sata_show_pmult_info(sata_hba_inst_t *, sata_device_t *);
365 static void sata_log(sata_hba_inst_t *, uint_t, char *fmt, ...);
366 static void sata_trace_log(sata_hba_inst_t *, uint_t, const char *fmt, ...);
367 static int sata_fetch_smart_return_status(sata_hba_inst_t *,
368 sata_drive_info_t *);
369 static int sata_fetch_smart_data(sata_hba_inst_t *, sata_drive_info_t *,
370 struct smart_data *);
371 static int sata_smart_selftest_log(sata_hba_inst_t *,
372 sata_drive_info_t *,
373 struct smart_selftest_log *);
374 static int sata_ext_smart_selftest_read_log(sata_hba_inst_t *,
375 sata_drive_info_t *, struct smart_ext_selftest_log *, uint16_t);
376 static int sata_smart_read_log(sata_hba_inst_t *, sata_drive_info_t *,
377 uint8_t *, uint8_t, uint8_t);
378 static int sata_read_log_ext_directory(sata_hba_inst_t *, sata_drive_info_t *,
379 struct read_log_ext_directory *);
380 static void sata_gen_sysevent(sata_hba_inst_t *, sata_address_t *, int);
381 static void sata_xlate_errors(sata_pkt_txlate_t *);
382 static void sata_decode_device_error(sata_pkt_txlate_t *,
383 struct scsi_extended_sense *);
384 static void sata_set_device_removed(dev_info_t *);
385 static boolean_t sata_check_device_removed(dev_info_t *);
386 static void sata_set_target_node_cleanup(sata_hba_inst_t *, sata_address_t *);
387 static int sata_ncq_err_ret_cmd_setup(sata_pkt_txlate_t *,
388 sata_drive_info_t *);
389 static int sata_atapi_err_ret_cmd_setup(sata_pkt_txlate_t *,
390 sata_drive_info_t *);
391 static void sata_atapi_packet_cmd_setup(sata_cmd_t *, sata_drive_info_t *);
392 static void sata_fixed_sense_data_preset(struct scsi_extended_sense *);
393 static void sata_target_devid_register(dev_info_t *, sata_drive_info_t *);
394 static int sata_check_modser(char *, int);
395
396 /*
397 * FMA
398 */
399 static boolean_t sata_check_for_dma_error(dev_info_t *, sata_pkt_txlate_t *);
400
401
402 /*
403 * SATA Framework will ignore SATA HBA driver cb_ops structure and
404 * register following one with SCSA framework.
405 * Open & close are provided, so scsi framework will not use its own
406 */
407 static struct cb_ops sata_cb_ops = {
408 sata_hba_open, /* open */
409 sata_hba_close, /* close */
410 nodev, /* strategy */
411 nodev, /* print */
412 nodev, /* dump */
413 nodev, /* read */
414 nodev, /* write */
415 sata_hba_ioctl, /* ioctl */
416 nodev, /* devmap */
417 nodev, /* mmap */
418 nodev, /* segmap */
419 nochpoll, /* chpoll */
420 ddi_prop_op, /* cb_prop_op */
421 0, /* streamtab */
422 D_NEW | D_MP, /* cb_flag */
423 CB_REV, /* rev */
424 nodev, /* aread */
425 nodev /* awrite */
426 };
427
428
429 extern struct mod_ops mod_miscops;
430 extern uchar_t scsi_cdb_size[];
431
432 static struct modlmisc modlmisc = {
433 &mod_miscops, /* Type of module */
434 "SATA Module" /* module name */
435 };
436
437
438 static struct modlinkage modlinkage = {
439 MODREV_1,
440 (void *)&modlmisc,
441 NULL
442 };
443
444 /*
445 * Default sata pkt timeout. Used when a target driver scsi_pkt time is zero,
446 * i.e. when scsi_pkt has not timeout specified.
447 */
448 static int sata_default_pkt_time = 60; /* 60 seconds */
449
450 /*
451 * Intermediate buffer device access attributes - they are required,
452 * but not necessarily used.
453 */
454 static ddi_device_acc_attr_t sata_acc_attr = {
455 DDI_DEVICE_ATTR_V0,
456 DDI_STRUCTURE_LE_ACC,
457 DDI_STRICTORDER_ACC
458 };
459
460
461 /*
462 * Mutexes protecting structures in multithreaded operations.
463 * Because events are relatively rare, a single global mutex protecting
464 * data structures should be sufficient. To increase performance, add
465 * separate mutex per each sata port and use global mutex only to protect
466 * common data structures.
467 */
468 static kmutex_t sata_mutex; /* protects sata_hba_list */
469 static kmutex_t sata_log_mutex; /* protects log */
470
471 static char sata_log_buf[256];
472
473 /*
474 * sata trace debug
475 */
476 static sata_trace_rbuf_t *sata_debug_rbuf;
477 static sata_trace_dmsg_t *sata_trace_dmsg_alloc(void);
478 static void sata_trace_dmsg_free(void);
479 static void sata_trace_rbuf_alloc(void);
480 static void sata_trace_rbuf_free(void);
481
482 int dmsg_ring_size = DMSG_RING_SIZE;
483
484 /* Default write cache setting for SATA hard disks */
485 int sata_write_cache = 1; /* enabled */
486
487 /* Default write cache setting for SATA ATAPI CD/DVD */
488 int sata_atapicdvd_write_cache = 1; /* enabled */
489
490 /* Default write cache setting for SATA ATAPI tape */
491 int sata_atapitape_write_cache = 1; /* enabled */
492
493 /* Default write cache setting for SATA ATAPI disk */
494 int sata_atapidisk_write_cache = 1; /* enabled */
495
496 /*
497 * Linked list of HBA instances
498 */
499 static sata_hba_inst_t *sata_hba_list = NULL;
500 static sata_hba_inst_t *sata_hba_list_tail = NULL;
501 /*
502 * Pointer to per-instance SATA HBA soft structure is stored in sata_hba_tran
503 * structure and in sata soft state.
504 */
505
506 /*
507 * Event daemon related variables
508 */
509 static kmutex_t sata_event_mutex;
510 static kcondvar_t sata_event_cv;
511 static kthread_t *sata_event_thread = NULL;
512 static int sata_event_thread_terminate = 0;
513 static int sata_event_pending = 0;
514 static int sata_event_thread_active = 0;
515 extern pri_t minclsyspri;
516
517 /*
518 * NCQ error recovery command
519 */
520 static const sata_cmd_t sata_rle_cmd = {
521 SATA_CMD_REV,
522 NULL,
523 {
524 SATA_DIR_READ
525 },
526 ATA_ADDR_LBA48,
527 0,
528 0,
529 0,
530 0,
531 0,
532 1,
533 READ_LOG_EXT_NCQ_ERROR_RECOVERY,
534 0,
535 0,
536 0,
537 SATAC_READ_LOG_EXT,
538 0,
539 0,
540 0,
541 };
542
543 /*
544 * ATAPI error recovery CDB
545 */
546 static const uint8_t sata_rqsense_cdb[SATA_ATAPI_RQSENSE_CDB_LEN] = {
547 SCMD_REQUEST_SENSE,
548 0, /* Only fixed RQ format is supported */
549 0,
550 0,
551 SATA_ATAPI_MIN_RQSENSE_LEN, /* Less data may be returned */
552 0
553 };
554
555
556 /* Warlock directives */
557
558 _NOTE(SCHEME_PROTECTS_DATA("No Mutex Needed", scsi_hba_tran))
559 _NOTE(SCHEME_PROTECTS_DATA("No Mutex Needed", scsi_device))
560 _NOTE(SCHEME_PROTECTS_DATA("No Mutex Needed", dev_ops))
561 _NOTE(SCHEME_PROTECTS_DATA("No Mutex Needed", scsi_extended_sense))
562 _NOTE(SCHEME_PROTECTS_DATA("No Mutex Needed", scsi_arq_status))
563 _NOTE(SCHEME_PROTECTS_DATA("No Mutex Needed", ddi_dma_attr))
564 _NOTE(SCHEME_PROTECTS_DATA("No Mutex Needed", ddi_dma_cookie_t))
565 _NOTE(SCHEME_PROTECTS_DATA("No Mutex Needed", devctl_ap_state))
566 _NOTE(SCHEME_PROTECTS_DATA("No Mutex Needed", dev_info::devi_state))
_NOTE(MUTEX_PROTECTS_DATA (sata_mutex,sata_hba_list))567 _NOTE(MUTEX_PROTECTS_DATA(sata_mutex, sata_hba_list))
568 _NOTE(DATA_READABLE_WITHOUT_LOCK(sata_hba_list))
569 _NOTE(MUTEX_PROTECTS_DATA(sata_mutex, sata_hba_inst::satahba_next))
570 _NOTE(MUTEX_PROTECTS_DATA(sata_mutex, sata_hba_inst::satahba_prev))
571 _NOTE(SCHEME_PROTECTS_DATA("No Mutex Needed", \
572 sata_hba_inst::satahba_scsi_tran))
573 _NOTE(SCHEME_PROTECTS_DATA("No Mutex Needed", sata_hba_inst::satahba_tran))
574 _NOTE(SCHEME_PROTECTS_DATA("No Mutex Needed", sata_hba_inst::satahba_dip))
575 _NOTE(SCHEME_PROTECTS_DATA("Scheme", sata_hba_inst::satahba_attached))
576 _NOTE(DATA_READABLE_WITHOUT_LOCK(sata_hba_inst::satahba_dev_port))
577 _NOTE(MUTEX_PROTECTS_DATA(sata_hba_inst::satahba_mutex,
578 sata_hba_inst::satahba_event_flags))
579 _NOTE(MUTEX_PROTECTS_DATA(sata_cport_info::cport_mutex, \
580 sata_cport_info::cport_devp))
581 _NOTE(DATA_READABLE_WITHOUT_LOCK(sata_cport_info::cport_devp))
582 _NOTE(SCHEME_PROTECTS_DATA("Scheme", sata_cport_info::cport_addr))
583 _NOTE(MUTEX_PROTECTS_DATA(sata_cport_info::cport_mutex, \
584 sata_cport_info::cport_dev_type))
585 _NOTE(DATA_READABLE_WITHOUT_LOCK(sata_cport_info::cport_dev_type))
586 _NOTE(MUTEX_PROTECTS_DATA(sata_cport_info::cport_mutex, \
587 sata_cport_info::cport_state))
588 _NOTE(DATA_READABLE_WITHOUT_LOCK(sata_cport_info::cport_state))
589 _NOTE(MUTEX_PROTECTS_DATA(sata_pmport_info::pmport_mutex, \
590 sata_pmport_info::pmport_state))
591 _NOTE(DATA_READABLE_WITHOUT_LOCK(sata_pmport_info::pmport_state))
592 _NOTE(MUTEX_PROTECTS_DATA(sata_pmport_info::pmport_mutex, \
593 sata_pmport_info::pmport_dev_type))
594 _NOTE(DATA_READABLE_WITHOUT_LOCK(sata_pmport_info::pmport_dev_type))
595 _NOTE(MUTEX_PROTECTS_DATA(sata_pmport_info::pmport_mutex, \
596 sata_pmport_info::pmport_sata_drive))
597 _NOTE(MUTEX_PROTECTS_DATA(sata_pmport_info::pmport_mutex, \
598 sata_pmport_info::pmport_tgtnode_clean))
599 _NOTE(MUTEX_PROTECTS_DATA(sata_pmport_info::pmport_mutex, \
600 sata_pmport_info::pmport_event_flags))
601 _NOTE(DATA_READABLE_WITHOUT_LOCK(sata_pmport_info::pmport_sata_drive))
602 _NOTE(DATA_READABLE_WITHOUT_LOCK(sata_pmult_info::pmult_dev_port))
603 _NOTE(DATA_READABLE_WITHOUT_LOCK(sata_pmult_info::pmult_num_dev_ports))
604 #ifdef SATA_DEBUG
605 _NOTE(SCHEME_PROTECTS_DATA("No Mutex Needed", mbuf_count))
606 _NOTE(SCHEME_PROTECTS_DATA("No Mutex Needed", mbuffail_count))
607 _NOTE(SCHEME_PROTECTS_DATA("No Mutex Needed", sata_atapi_trace))
608 _NOTE(SCHEME_PROTECTS_DATA("No Mutex Needed", sata_atapi_trace_index))
609 #endif
610
611 /* End of warlock directives */
612
613 /* ************** loadable module configuration functions ************** */
614
615 int
616 _init()
617 {
618 int rval;
619
620 mutex_init(&sata_mutex, NULL, MUTEX_DRIVER, NULL);
621 mutex_init(&sata_event_mutex, NULL, MUTEX_DRIVER, NULL);
622 mutex_init(&sata_log_mutex, NULL, MUTEX_DRIVER, NULL);
623 cv_init(&sata_event_cv, NULL, CV_DRIVER, NULL);
624 sata_trace_rbuf_alloc();
625 if ((rval = mod_install(&modlinkage)) != 0) {
626 #ifdef SATA_DEBUG
627 cmn_err(CE_WARN, "sata: _init: mod_install failed\n");
628 #endif
629 sata_trace_rbuf_free();
630 mutex_destroy(&sata_log_mutex);
631 cv_destroy(&sata_event_cv);
632 mutex_destroy(&sata_event_mutex);
633 mutex_destroy(&sata_mutex);
634 }
635 return (rval);
636 }
637
638 int
_fini()639 _fini()
640 {
641 int rval;
642
643 if ((rval = mod_remove(&modlinkage)) != 0)
644 return (rval);
645
646 sata_trace_rbuf_free();
647 mutex_destroy(&sata_log_mutex);
648 cv_destroy(&sata_event_cv);
649 mutex_destroy(&sata_event_mutex);
650 mutex_destroy(&sata_mutex);
651 return (rval);
652 }
653
654 int
_info(struct modinfo * modinfop)655 _info(struct modinfo *modinfop)
656 {
657 return (mod_info(&modlinkage, modinfop));
658 }
659
660
661
662 /* ********************* SATA HBA entry points ********************* */
663
664
665 /*
666 * Called by SATA HBA from _init().
667 * Registers HBA driver instance/sata framework pair with scsi framework, by
668 * calling scsi_hba_init().
669 *
670 * SATA HBA driver cb_ops are ignored - SATA HBA framework cb_ops are used
671 * instead. SATA HBA framework cb_ops pointer overwrites SATA HBA driver
672 * cb_ops pointer in SATA HBA driver dev_ops structure.
673 * SATA HBA framework cb_ops supplies cb_open cb_close and cb_ioctl vectors.
674 *
675 * Return status of the scsi_hba_init() is returned to a calling SATA HBA
676 * driver.
677 */
678 int
sata_hba_init(struct modlinkage * modlp)679 sata_hba_init(struct modlinkage *modlp)
680 {
681 int rval;
682 struct dev_ops *hba_ops;
683
684 SATADBG1(SATA_DBG_HBA_IF, NULL,
685 "sata_hba_init: name %s \n",
686 ((struct modldrv *)(modlp->ml_linkage[0]))->drv_linkinfo);
687 /*
688 * Fill-up cb_ops and dev_ops when necessary
689 */
690 hba_ops = ((struct modldrv *)(modlp->ml_linkage[0]))->drv_dev_ops;
691 /*
692 * Provide pointer to SATA dev_ops
693 */
694 hba_ops->devo_cb_ops = &sata_cb_ops;
695
696 /*
697 * Register SATA HBA with SCSI framework
698 */
699 if ((rval = scsi_hba_init(modlp)) != 0) {
700 SATADBG1(SATA_DBG_HBA_IF, NULL,
701 "sata_hba_init: scsi hba init failed\n", NULL);
702 return (rval);
703 }
704
705 return (0);
706 }
707
708
709 /* HBA attach stages */
710 #define HBA_ATTACH_STAGE_SATA_HBA_INST 1
711 #define HBA_ATTACH_STAGE_SCSI_ATTACHED 2
712 #define HBA_ATTACH_STAGE_SETUP 4
713 #define HBA_ATTACH_STAGE_LINKED 8
714
715
716 /*
717 *
718 * Called from SATA HBA driver's attach routine to attach an instance of
719 * the HBA.
720 *
721 * For DDI_ATTACH command:
722 * sata_hba_inst structure is allocated here and initialized with pointers to
723 * SATA framework implementation of required scsi tran functions.
724 * The scsi_tran's tran_hba_private field is used by SATA Framework to point
725 * to the soft structure (sata_hba_inst) allocated by SATA framework for
726 * SATA HBA instance related data.
727 * The scsi_tran's tran_hba_private field is used by SATA framework to
728 * store a pointer to per-HBA-instance of sata_hba_inst structure.
729 * The sata_hba_inst structure is cross-linked to scsi tran structure.
730 * Among other info, a pointer to sata_hba_tran structure is stored in
731 * sata_hba_inst. The sata_hba_inst structures for different HBA instances are
732 * linked together into the list, pointed to by sata_hba_list.
733 * On the first HBA instance attach the sata event thread is initialized.
734 * Attachment points are created for all SATA ports of the HBA being attached.
735 * All HBA instance's SATA ports are probed and type of plugged devices is
736 * determined. For each device of a supported type, a target node is created.
737 *
738 * DDI_SUCCESS is returned when attachment process is successful,
739 * DDI_FAILURE is returned otherwise.
740 *
741 * For DDI_RESUME command:
742 * Not implemented at this time (postponed until phase 2 of the development).
743 */
744 int
sata_hba_attach(dev_info_t * dip,sata_hba_tran_t * sata_tran,ddi_attach_cmd_t cmd)745 sata_hba_attach(dev_info_t *dip, sata_hba_tran_t *sata_tran,
746 ddi_attach_cmd_t cmd)
747 {
748 sata_hba_inst_t *sata_hba_inst;
749 scsi_hba_tran_t *scsi_tran = NULL;
750 int hba_attach_state = 0;
751 char taskq_name[MAXPATHLEN];
752
753 SATADBG3(SATA_DBG_HBA_IF, NULL,
754 "sata_hba_attach: node %s (%s%d)\n",
755 ddi_node_name(dip), ddi_driver_name(dip),
756 ddi_get_instance(dip));
757
758 if (cmd == DDI_RESUME) {
759 /*
760 * Postponed until phase 2 of the development
761 */
762 return (DDI_FAILURE);
763 }
764
765 if (cmd != DDI_ATTACH) {
766 return (DDI_FAILURE);
767 }
768
769 /* cmd == DDI_ATTACH */
770
771 if (sata_validate_sata_hba_tran(dip, sata_tran) != SATA_SUCCESS) {
772 SATA_LOG_D((NULL, CE_WARN,
773 "sata_hba_attach: invalid sata_hba_tran"));
774 return (DDI_FAILURE);
775 }
776 /*
777 * Allocate and initialize SCSI tran structure.
778 * SATA copy of tran_bus_config is provided to create port nodes.
779 */
780 scsi_tran = scsi_hba_tran_alloc(dip, SCSI_HBA_CANSLEEP);
781 if (scsi_tran == NULL)
782 return (DDI_FAILURE);
783 /*
784 * Allocate soft structure for SATA HBA instance.
785 * There is a separate softstate for each HBA instance.
786 */
787 sata_hba_inst = kmem_zalloc(sizeof (struct sata_hba_inst), KM_SLEEP);
788 ASSERT(sata_hba_inst != NULL); /* this should not fail */
789 mutex_init(&sata_hba_inst->satahba_mutex, NULL, MUTEX_DRIVER, NULL);
790 hba_attach_state |= HBA_ATTACH_STAGE_SATA_HBA_INST;
791
792 /*
793 * scsi_trans's tran_hba_private is used by SATA Framework to point to
794 * soft structure allocated by SATA framework for
795 * SATA HBA instance related data.
796 */
797 scsi_tran->tran_hba_private = sata_hba_inst;
798 scsi_tran->tran_tgt_private = NULL;
799
800 scsi_tran->tran_tgt_init = sata_scsi_tgt_init;
801 scsi_tran->tran_tgt_probe = sata_scsi_tgt_probe;
802 scsi_tran->tran_tgt_free = sata_scsi_tgt_free;
803
804 scsi_tran->tran_start = sata_scsi_start;
805 scsi_tran->tran_reset = sata_scsi_reset;
806 scsi_tran->tran_abort = sata_scsi_abort;
807 scsi_tran->tran_getcap = sata_scsi_getcap;
808 scsi_tran->tran_setcap = sata_scsi_setcap;
809 scsi_tran->tran_init_pkt = sata_scsi_init_pkt;
810 scsi_tran->tran_destroy_pkt = sata_scsi_destroy_pkt;
811
812 scsi_tran->tran_dmafree = sata_scsi_dmafree;
813 scsi_tran->tran_sync_pkt = sata_scsi_sync_pkt;
814
815 scsi_tran->tran_reset_notify = NULL;
816 scsi_tran->tran_get_bus_addr = NULL;
817 scsi_tran->tran_quiesce = NULL;
818 scsi_tran->tran_unquiesce = NULL;
819 scsi_tran->tran_bus_reset = NULL;
820
821 if (scsi_hba_attach_setup(dip, sata_tran->sata_tran_hba_dma_attr,
822 scsi_tran, 0) != DDI_SUCCESS) {
823 #ifdef SATA_DEBUG
824 cmn_err(CE_WARN, "?SATA: %s%d hba scsi attach failed",
825 ddi_driver_name(dip), ddi_get_instance(dip));
826 #endif
827 goto fail;
828 }
829 hba_attach_state |= HBA_ATTACH_STAGE_SCSI_ATTACHED;
830
831 if (!ddi_prop_exists(DDI_DEV_T_ANY, dip, DDI_PROP_DONTPASS, "sata")) {
832 if (ddi_prop_update_int(DDI_DEV_T_NONE, dip,
833 "sata", 1) != DDI_PROP_SUCCESS) {
834 SATA_LOG_D((NULL, CE_WARN, "sata_hba_attach: "
835 "failed to create hba sata prop"));
836 goto fail;
837 }
838 }
839
840 /*
841 * Save pointers in hba instance soft state.
842 */
843 sata_hba_inst->satahba_scsi_tran = scsi_tran;
844 sata_hba_inst->satahba_tran = sata_tran;
845 sata_hba_inst->satahba_dip = dip;
846
847 /*
848 * Create a task queue to handle emulated commands completion
849 * Use node name, dash, instance number as the queue name.
850 */
851 taskq_name[0] = '\0';
852 (void) strlcat(taskq_name, DEVI(dip)->devi_node_name,
853 sizeof (taskq_name));
854 (void) snprintf(taskq_name + strlen(taskq_name),
855 sizeof (taskq_name) - strlen(taskq_name),
856 "-%d", DEVI(dip)->devi_instance);
857 sata_hba_inst->satahba_taskq = taskq_create(taskq_name, 1,
858 minclsyspri, 1, sata_tran->sata_tran_hba_num_cports * 4,
859 TASKQ_DYNAMIC);
860
861 hba_attach_state |= HBA_ATTACH_STAGE_SETUP;
862
863 /*
864 * Create events thread if not created yet.
865 */
866 sata_event_thread_control(1);
867
868 /*
869 * Link this hba instance into the list.
870 */
871 mutex_enter(&sata_mutex);
872
873 if (sata_hba_list == NULL) {
874 /*
875 * The first instance of HBA is attached.
876 * Set current/active default maximum NCQ/TCQ queue depth for
877 * all SATA devices. It is done here and now, to eliminate the
878 * possibility of the dynamic, programatic modification of the
879 * queue depth via global (and public) sata_max_queue_depth
880 * variable (this would require special handling in HBA drivers)
881 */
882 sata_current_max_qdepth = sata_max_queue_depth;
883 if (sata_current_max_qdepth > 32)
884 sata_current_max_qdepth = 32;
885 else if (sata_current_max_qdepth < 1)
886 sata_current_max_qdepth = 1;
887 }
888
889 sata_hba_inst->satahba_next = NULL;
890 sata_hba_inst->satahba_prev = sata_hba_list_tail;
891 if (sata_hba_list == NULL) {
892 sata_hba_list = sata_hba_inst;
893 }
894 if (sata_hba_list_tail != NULL) {
895 sata_hba_list_tail->satahba_next = sata_hba_inst;
896 }
897 sata_hba_list_tail = sata_hba_inst;
898 mutex_exit(&sata_mutex);
899 hba_attach_state |= HBA_ATTACH_STAGE_LINKED;
900
901 /*
902 * Create SATA HBA devctl minor node for sata_hba_open, close, ioctl
903 * SATA HBA driver should not use its own open/close entry points.
904 *
905 * Make sure that instance number doesn't overflow
906 * when forming minor numbers.
907 */
908 ASSERT(ddi_get_instance(dip) <= (L_MAXMIN >> INST_MINOR_SHIFT));
909 if (ddi_create_minor_node(dip, "devctl", S_IFCHR,
910 INST2DEVCTL(ddi_get_instance(dip)),
911 DDI_NT_SATA_NEXUS, 0) != DDI_SUCCESS) {
912 #ifdef SATA_DEBUG
913 cmn_err(CE_WARN, "sata_hba_attach: "
914 "cannot create devctl minor node");
915 #endif
916 goto fail;
917 }
918
919
920 /*
921 * Set-up kstats here, if necessary.
922 * (postponed until future phase of the development).
923 */
924
925 /*
926 * Indicate that HBA is attached. This will enable events processing
927 * for this HBA.
928 */
929 sata_hba_inst->satahba_attached = 1;
930 /*
931 * Probe controller ports. This operation will describe a current
932 * controller/port/multipliers/device configuration and will create
933 * attachment points.
934 * We may end-up with just a controller with no devices attached.
935 * For the ports with a supported device attached, device target nodes
936 * are created and devices are initialized.
937 */
938 sata_probe_ports(sata_hba_inst);
939
940 return (DDI_SUCCESS);
941
942 fail:
943 if (hba_attach_state & HBA_ATTACH_STAGE_LINKED) {
944 (void) sata_remove_hba_instance(dip);
945 if (sata_hba_list == NULL)
946 sata_event_thread_control(0);
947 }
948
949 if (hba_attach_state & HBA_ATTACH_STAGE_SETUP) {
950 (void) ddi_prop_remove(DDI_DEV_T_ANY, dip, "sata");
951 taskq_destroy(sata_hba_inst->satahba_taskq);
952 }
953
954 if (hba_attach_state & HBA_ATTACH_STAGE_SCSI_ATTACHED)
955 (void) scsi_hba_detach(dip);
956
957 if (hba_attach_state & HBA_ATTACH_STAGE_SATA_HBA_INST) {
958 mutex_destroy(&sata_hba_inst->satahba_mutex);
959 kmem_free((void *)sata_hba_inst,
960 sizeof (struct sata_hba_inst));
961 scsi_hba_tran_free(scsi_tran);
962 }
963
964 sata_log(NULL, CE_WARN, "?SATA: %s%d hba attach failed",
965 ddi_driver_name(dip), ddi_get_instance(dip));
966
967 return (DDI_FAILURE);
968 }
969
970
971 /*
972 * Called by SATA HBA from to detach an instance of the driver.
973 *
974 * For DDI_DETACH command:
975 * Free local structures allocated for SATA HBA instance during
976 * sata_hba_attach processing.
977 *
978 * Returns DDI_SUCCESS when HBA was detached, DDI_FAILURE otherwise.
979 *
980 * For DDI_SUSPEND command:
981 * Not implemented at this time (postponed until phase 2 of the development)
982 * Returnd DDI_SUCCESS.
983 *
984 * When the last HBA instance is detached, the event daemon is terminated.
985 *
986 * NOTE: Port multiplier is supported.
987 */
988 int
sata_hba_detach(dev_info_t * dip,ddi_detach_cmd_t cmd)989 sata_hba_detach(dev_info_t *dip, ddi_detach_cmd_t cmd)
990 {
991 dev_info_t *tdip;
992 sata_hba_inst_t *sata_hba_inst;
993 scsi_hba_tran_t *scsi_hba_tran;
994 sata_cport_info_t *cportinfo;
995 sata_pmult_info_t *pminfo;
996 sata_drive_info_t *sdinfo;
997 sata_device_t sdevice;
998 int ncport, npmport;
999
1000 SATADBG3(SATA_DBG_HBA_IF, NULL, "sata_hba_detach: node %s (%s%d)\n",
1001 ddi_node_name(dip), ddi_driver_name(dip), ddi_get_instance(dip));
1002
1003 switch (cmd) {
1004 case DDI_DETACH:
1005
1006 if ((scsi_hba_tran = ddi_get_driver_private(dip)) == NULL)
1007 return (DDI_FAILURE);
1008
1009 sata_hba_inst = scsi_hba_tran->tran_hba_private;
1010 if (sata_hba_inst == NULL)
1011 return (DDI_FAILURE);
1012
1013 if (scsi_hba_detach(dip) == DDI_FAILURE) {
1014 sata_hba_inst->satahba_attached = 1;
1015 return (DDI_FAILURE);
1016 }
1017
1018 /*
1019 * Free all target nodes - at this point
1020 * devices should be at least offlined
1021 * otherwise scsi_hba_detach() should not be called.
1022 */
1023 for (ncport = 0; ncport < SATA_NUM_CPORTS(sata_hba_inst);
1024 ncport++) {
1025 cportinfo = SATA_CPORT_INFO(sata_hba_inst, ncport);
1026 if (cportinfo->cport_dev_type != SATA_DTYPE_PMULT) {
1027 sdinfo = SATA_CPORTINFO_DRV_INFO(cportinfo);
1028 if (sdinfo != NULL) {
1029 tdip = sata_get_target_dip(dip,
1030 ncport, 0);
1031 if (tdip != NULL) {
1032 if (ndi_devi_offline(tdip,
1033 NDI_DEVI_REMOVE) !=
1034 NDI_SUCCESS) {
1035 SATA_LOG_D((
1036 sata_hba_inst,
1037 CE_WARN,
1038 "sata_hba_detach: "
1039 "Target node not "
1040 "removed !"));
1041 return (DDI_FAILURE);
1042 }
1043 }
1044 }
1045 } else { /* SATA_DTYPE_PMULT */
1046 mutex_enter(&cportinfo->cport_mutex);
1047 pminfo = SATA_CPORTINFO_PMULT_INFO(cportinfo);
1048
1049 if (pminfo == NULL) {
1050 SATA_LOG_D((sata_hba_inst, CE_WARN,
1051 "sata_hba_detach: Port multiplier "
1052 "not ready yet!"));
1053 mutex_exit(&cportinfo->cport_mutex);
1054 return (DDI_FAILURE);
1055 }
1056
1057 /*
1058 * Detach would fail if removal of any of the
1059 * target nodes is failed - albeit in that
1060 * case some of them may have been removed.
1061 */
1062 for (npmport = 0; npmport < SATA_NUM_PMPORTS(
1063 sata_hba_inst, ncport); npmport++) {
1064 tdip = sata_get_target_dip(dip, ncport,
1065 npmport);
1066 if (tdip != NULL) {
1067 if (ndi_devi_offline(tdip,
1068 NDI_DEVI_REMOVE) !=
1069 NDI_SUCCESS) {
1070 SATA_LOG_D((
1071 sata_hba_inst,
1072 CE_WARN,
1073 "sata_hba_detach: "
1074 "Target node not "
1075 "removed !"));
1076 mutex_exit(&cportinfo->
1077 cport_mutex);
1078 return (DDI_FAILURE);
1079 }
1080 }
1081 }
1082 mutex_exit(&cportinfo->cport_mutex);
1083 }
1084 }
1085 /*
1086 * Disable sata event daemon processing for this HBA
1087 */
1088 sata_hba_inst->satahba_attached = 0;
1089
1090 /*
1091 * Remove event daemon thread, if it is last HBA instance.
1092 */
1093
1094 mutex_enter(&sata_mutex);
1095 if (sata_hba_list->satahba_next == NULL) {
1096 mutex_exit(&sata_mutex);
1097 sata_event_thread_control(0);
1098 mutex_enter(&sata_mutex);
1099 }
1100 mutex_exit(&sata_mutex);
1101
1102 /* Remove this HBA instance from the HBA list */
1103 sata_remove_hba_instance(dip);
1104
1105 /*
1106 * At this point there should be no target nodes attached.
1107 * Detach and destroy device and port info structures.
1108 */
1109 for (ncport = 0; ncport < SATA_NUM_CPORTS(sata_hba_inst);
1110 ncport++) {
1111 cportinfo = SATA_CPORT_INFO(sata_hba_inst, ncport);
1112 if (cportinfo->cport_dev_type != SATA_DTYPE_PMULT) {
1113 sdinfo =
1114 cportinfo->cport_devp.cport_sata_drive;
1115 if (sdinfo != NULL) {
1116 /* Release device structure */
1117 kmem_free(sdinfo,
1118 sizeof (sata_drive_info_t));
1119 }
1120 /* Release cport info */
1121 mutex_destroy(&cportinfo->cport_mutex);
1122 kmem_free(cportinfo,
1123 sizeof (sata_cport_info_t));
1124 } else { /* SATA_DTYPE_PMULT */
1125 sdevice.satadev_addr.cport = (uint8_t)ncport;
1126 sdevice.satadev_addr.qual = SATA_ADDR_PMULT;
1127 sata_free_pmult(sata_hba_inst, &sdevice);
1128 }
1129 }
1130
1131 scsi_hba_tran_free(sata_hba_inst->satahba_scsi_tran);
1132
1133 (void) ddi_prop_remove(DDI_DEV_T_ANY, dip, "sata");
1134
1135 taskq_destroy(sata_hba_inst->satahba_taskq);
1136
1137 mutex_destroy(&sata_hba_inst->satahba_mutex);
1138 kmem_free((void *)sata_hba_inst,
1139 sizeof (struct sata_hba_inst));
1140
1141 return (DDI_SUCCESS);
1142
1143 case DDI_SUSPEND:
1144 /*
1145 * Postponed until phase 2
1146 */
1147 return (DDI_FAILURE);
1148
1149 default:
1150 return (DDI_FAILURE);
1151 }
1152 }
1153
1154
1155 /*
1156 * Called by an HBA drive from _fini() routine.
1157 * Unregisters SATA HBA instance/SATA framework pair from the scsi framework.
1158 */
1159 void
sata_hba_fini(struct modlinkage * modlp)1160 sata_hba_fini(struct modlinkage *modlp)
1161 {
1162 SATADBG1(SATA_DBG_HBA_IF, NULL,
1163 "sata_hba_fini: name %s\n",
1164 ((struct modldrv *)(modlp->ml_linkage[0]))->drv_linkinfo);
1165
1166 scsi_hba_fini(modlp);
1167 }
1168
1169
1170 /*
1171 * Default open and close routine for sata_hba framework.
1172 *
1173 */
1174 /*
1175 * Open devctl node.
1176 *
1177 * Returns:
1178 * 0 if node was open successfully, error code otherwise.
1179 *
1180 *
1181 */
1182
1183 static int
sata_hba_open(dev_t * devp,int flags,int otyp,cred_t * credp)1184 sata_hba_open(dev_t *devp, int flags, int otyp, cred_t *credp)
1185 {
1186 #ifndef __lock_lint
1187 _NOTE(ARGUNUSED(credp))
1188 #endif
1189 int rv = 0;
1190 dev_info_t *dip;
1191 scsi_hba_tran_t *scsi_hba_tran;
1192 sata_hba_inst_t *sata_hba_inst;
1193
1194 SATADBG1(SATA_DBG_IOCTL_IF, NULL, "sata_hba_open: entered", NULL);
1195
1196 if (otyp != OTYP_CHR)
1197 return (EINVAL);
1198
1199 dip = sata_devt_to_devinfo(*devp);
1200 if (dip == NULL)
1201 return (ENXIO);
1202
1203 if ((scsi_hba_tran = ddi_get_driver_private(dip)) == NULL)
1204 return (ENXIO);
1205
1206 sata_hba_inst = scsi_hba_tran->tran_hba_private;
1207 if (sata_hba_inst == NULL || sata_hba_inst->satahba_attached == 0)
1208 return (ENXIO);
1209
1210 mutex_enter(&sata_mutex);
1211 if (flags & FEXCL) {
1212 if (sata_hba_inst->satahba_open_flag != 0) {
1213 rv = EBUSY;
1214 } else {
1215 sata_hba_inst->satahba_open_flag =
1216 SATA_DEVCTL_EXOPENED;
1217 }
1218 } else {
1219 if (sata_hba_inst->satahba_open_flag == SATA_DEVCTL_EXOPENED) {
1220 rv = EBUSY;
1221 } else {
1222 sata_hba_inst->satahba_open_flag =
1223 SATA_DEVCTL_SOPENED;
1224 }
1225 }
1226 mutex_exit(&sata_mutex);
1227
1228 return (rv);
1229 }
1230
1231
1232 /*
1233 * Close devctl node.
1234 * Returns:
1235 * 0 if node was closed successfully, error code otherwise.
1236 *
1237 */
1238
1239 static int
sata_hba_close(dev_t dev,int flag,int otyp,cred_t * credp)1240 sata_hba_close(dev_t dev, int flag, int otyp, cred_t *credp)
1241 {
1242 #ifndef __lock_lint
1243 _NOTE(ARGUNUSED(credp))
1244 _NOTE(ARGUNUSED(flag))
1245 #endif
1246 dev_info_t *dip;
1247 scsi_hba_tran_t *scsi_hba_tran;
1248 sata_hba_inst_t *sata_hba_inst;
1249
1250 SATADBG1(SATA_DBG_IOCTL_IF, NULL, "sata_hba_close: entered", NULL);
1251
1252 if (otyp != OTYP_CHR)
1253 return (EINVAL);
1254
1255 dip = sata_devt_to_devinfo(dev);
1256 if (dip == NULL)
1257 return (ENXIO);
1258
1259 if ((scsi_hba_tran = ddi_get_driver_private(dip)) == NULL)
1260 return (ENXIO);
1261
1262 sata_hba_inst = scsi_hba_tran->tran_hba_private;
1263 if (sata_hba_inst == NULL || sata_hba_inst->satahba_attached == 0)
1264 return (ENXIO);
1265
1266 mutex_enter(&sata_mutex);
1267 sata_hba_inst->satahba_open_flag = 0;
1268 mutex_exit(&sata_mutex);
1269 return (0);
1270 }
1271
1272
1273
1274 /*
1275 * Standard IOCTL commands for SATA hotplugging.
1276 * Implemented DEVCTL_AP commands:
1277 * DEVCTL_AP_CONNECT
1278 * DEVCTL_AP_DISCONNECT
1279 * DEVCTL_AP_CONFIGURE
1280 * DEVCTL_UNCONFIGURE
1281 * DEVCTL_AP_CONTROL
1282 *
1283 * Commands passed to default ndi ioctl handler:
1284 * DEVCTL_DEVICE_GETSTATE
1285 * DEVCTL_DEVICE_ONLINE
1286 * DEVCTL_DEVICE_OFFLINE
1287 * DEVCTL_DEVICE_REMOVE
1288 * DEVCTL_DEVICE_INSERT
1289 * DEVCTL_BUS_GETSTATE
1290 *
1291 * All other cmds are passed to HBA if it provide ioctl handler, or failed
1292 * if not.
1293 *
1294 * Returns:
1295 * 0 if successful,
1296 * error code if operation failed.
1297 *
1298 * Port Multiplier support is supported now.
1299 *
1300 * NOTE: qual should be SATA_ADDR_DCPORT or SATA_ADDR_DPMPORT
1301 */
1302
1303 static int
sata_hba_ioctl(dev_t dev,int cmd,intptr_t arg,int mode,cred_t * credp,int * rvalp)1304 sata_hba_ioctl(dev_t dev, int cmd, intptr_t arg, int mode, cred_t *credp,
1305 int *rvalp)
1306 {
1307 #ifndef __lock_lint
1308 _NOTE(ARGUNUSED(credp))
1309 _NOTE(ARGUNUSED(rvalp))
1310 #endif
1311 int rv = 0;
1312 int32_t comp_port = -1;
1313 dev_info_t *dip;
1314 devctl_ap_state_t ap_state;
1315 struct devctl_iocdata *dcp = NULL;
1316 scsi_hba_tran_t *scsi_hba_tran;
1317 sata_hba_inst_t *sata_hba_inst;
1318 sata_device_t sata_device;
1319 sata_cport_info_t *cportinfo;
1320 int cport, pmport, qual;
1321 int rval = SATA_SUCCESS;
1322
1323 dip = sata_devt_to_devinfo(dev);
1324 if (dip == NULL)
1325 return (ENXIO);
1326
1327 if ((scsi_hba_tran = ddi_get_driver_private(dip)) == NULL)
1328 return (ENXIO);
1329
1330 sata_hba_inst = scsi_hba_tran->tran_hba_private;
1331 if (sata_hba_inst == NULL)
1332 return (ENXIO);
1333
1334 if (sata_hba_inst->satahba_tran == NULL)
1335 return (ENXIO);
1336
1337 switch (cmd) {
1338
1339 case DEVCTL_DEVICE_GETSTATE:
1340 case DEVCTL_DEVICE_ONLINE:
1341 case DEVCTL_DEVICE_OFFLINE:
1342 case DEVCTL_DEVICE_REMOVE:
1343 case DEVCTL_BUS_GETSTATE:
1344 /*
1345 * There may be more cases that we want to pass to default
1346 * handler rather than fail them.
1347 */
1348 return (ndi_devctl_ioctl(dip, cmd, arg, mode, 0));
1349 }
1350
1351 /* read devctl ioctl data */
1352 if (cmd != DEVCTL_AP_CONTROL) {
1353 if (ndi_dc_allochdl((void *)arg, &dcp) != NDI_SUCCESS)
1354 return (EFAULT);
1355
1356 if ((comp_port = sata_get_port_num(sata_hba_inst, dcp)) ==
1357 -1) {
1358 if (dcp)
1359 ndi_dc_freehdl(dcp);
1360 return (EINVAL);
1361 }
1362
1363 /*
1364 * According to SCSI_TO_SATA_ADDR_QUAL, qual should be either
1365 * SATA_ADDR_DCPORT or SATA_ADDR_DPMPORT.
1366 */
1367 cport = SCSI_TO_SATA_CPORT(comp_port);
1368 pmport = SCSI_TO_SATA_PMPORT(comp_port);
1369 qual = SCSI_TO_SATA_ADDR_QUAL(comp_port);
1370
1371 if (sata_validate_sata_address(sata_hba_inst, cport, pmport,
1372 qual) != 0) {
1373 ndi_dc_freehdl(dcp);
1374 return (EINVAL);
1375 }
1376
1377 cportinfo = SATA_CPORT_INFO(sata_hba_inst, cport);
1378 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, cport)->
1379 cport_mutex);
1380 if (cportinfo->cport_event_flags & SATA_EVNT_LOCK_PORT_BUSY) {
1381 /*
1382 * Cannot process ioctl request now. Come back later.
1383 */
1384 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, cport)->
1385 cport_mutex);
1386 ndi_dc_freehdl(dcp);
1387 return (EBUSY);
1388 }
1389 /* Block event processing for this port */
1390 cportinfo->cport_event_flags |= SATA_APCTL_LOCK_PORT_BUSY;
1391 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, cport)->cport_mutex);
1392
1393 sata_device.satadev_addr.cport = cport;
1394 sata_device.satadev_addr.pmport = pmport;
1395 sata_device.satadev_addr.qual = qual;
1396 sata_device.satadev_rev = SATA_DEVICE_REV;
1397 }
1398
1399 switch (cmd) {
1400
1401 case DEVCTL_AP_DISCONNECT:
1402
1403 /*
1404 * Normally, cfgadm sata plugin will try to offline
1405 * (unconfigure) device before this request. Nevertheless,
1406 * if a device is still configured, we need to
1407 * attempt to offline and unconfigure device first, and we will
1408 * deactivate the port regardless of the unconfigure
1409 * operation results.
1410 *
1411 */
1412 rv = sata_ioctl_disconnect(sata_hba_inst, &sata_device);
1413
1414 break;
1415
1416 case DEVCTL_AP_UNCONFIGURE:
1417
1418 /*
1419 * The unconfigure operation uses generic nexus operation to
1420 * offline a device. It leaves a target device node attached.
1421 * and obviously sata_drive_info attached as well, because
1422 * from the hardware point of view nothing has changed.
1423 */
1424 rv = sata_ioctl_unconfigure(sata_hba_inst, &sata_device);
1425 break;
1426
1427 case DEVCTL_AP_CONNECT:
1428 {
1429 /*
1430 * The sata cfgadm pluging will invoke this operation only if
1431 * port was found in the disconnect state (failed state
1432 * is also treated as the disconnected state).
1433 * If port activation is successful and a device is found
1434 * attached to the port, the initialization sequence is
1435 * executed to probe the port and attach
1436 * a device structure to a port structure. The device is not
1437 * set in configured state (system-wise) by this operation.
1438 */
1439
1440 rv = sata_ioctl_connect(sata_hba_inst, &sata_device);
1441
1442 break;
1443 }
1444
1445 case DEVCTL_AP_CONFIGURE:
1446 {
1447 /*
1448 * A port may be in an active or shutdown state.
1449 * If port is in a failed state, operation is aborted.
1450 * If a port is in a shutdown state, sata_tran_port_activate()
1451 * is invoked prior to any other operation.
1452 *
1453 * Onlining the device involves creating a new target node.
1454 * If there is an old target node present (belonging to
1455 * previously removed device), the operation is aborted - the
1456 * old node has to be released and removed before configure
1457 * operation is attempted.
1458 */
1459
1460 rv = sata_ioctl_configure(sata_hba_inst, &sata_device);
1461
1462 break;
1463 }
1464
1465 case DEVCTL_AP_GETSTATE:
1466
1467 sata_cfgadm_state(sata_hba_inst, comp_port, &ap_state);
1468
1469 ap_state.ap_last_change = (time_t)-1;
1470 ap_state.ap_error_code = 0;
1471 ap_state.ap_in_transition = 0;
1472
1473 /* Copy the return AP-state information to the user space */
1474 if (ndi_dc_return_ap_state(&ap_state, dcp) != NDI_SUCCESS) {
1475 rv = EFAULT;
1476 }
1477 break;
1478
1479 case DEVCTL_AP_CONTROL:
1480 {
1481 /*
1482 * Generic devctl for hardware specific functionality
1483 */
1484 sata_ioctl_data_t ioc;
1485
1486 ASSERT(dcp == NULL);
1487
1488 /* Copy in user ioctl data first */
1489 #ifdef _MULTI_DATAMODEL
1490 if (ddi_model_convert_from(mode & FMODELS) ==
1491 DDI_MODEL_ILP32) {
1492
1493 sata_ioctl_data_32_t ioc32;
1494
1495 if (ddi_copyin((void *)arg, (void *)&ioc32,
1496 sizeof (ioc32), mode) != 0) {
1497 rv = EFAULT;
1498 break;
1499 }
1500 ioc.cmd = (uint_t)ioc32.cmd;
1501 ioc.port = (uint_t)ioc32.port;
1502 ioc.get_size = (uint_t)ioc32.get_size;
1503 ioc.buf = (caddr_t)(uintptr_t)ioc32.buf;
1504 ioc.bufsiz = (uint_t)ioc32.bufsiz;
1505 ioc.misc_arg = (uint_t)ioc32.misc_arg;
1506 } else
1507 #endif /* _MULTI_DATAMODEL */
1508 if (ddi_copyin((void *)arg, (void *)&ioc, sizeof (ioc),
1509 mode) != 0) {
1510 return (EFAULT);
1511 }
1512
1513 SATADBG2(SATA_DBG_IOCTL_IF, sata_hba_inst,
1514 "sata_hba_ioctl: DEVCTL_AP_CONTROL "
1515 "cmd 0x%x, port 0x%x", ioc.cmd, ioc.port);
1516
1517 /*
1518 * To avoid BE/LE and 32/64 issues, a get_size always returns
1519 * a 32-bit number.
1520 */
1521 if (ioc.get_size != 0 && ioc.bufsiz != (sizeof (uint32_t))) {
1522 return (EINVAL);
1523 }
1524 /* validate address */
1525 cport = SCSI_TO_SATA_CPORT(ioc.port);
1526 pmport = SCSI_TO_SATA_PMPORT(ioc.port);
1527 qual = SCSI_TO_SATA_ADDR_QUAL(ioc.port);
1528
1529 SATADBG3(SATA_DBG_IOCTL_IF, sata_hba_inst,
1530 "sata_hba_ioctl: target port is %d:%d (%d)",
1531 cport, pmport, qual);
1532
1533 if (sata_validate_sata_address(sata_hba_inst, cport,
1534 pmport, qual) != 0)
1535 return (EINVAL);
1536
1537 cportinfo = SATA_CPORT_INFO(sata_hba_inst, cport);
1538 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, cport)->
1539 cport_mutex);
1540 /* Is the port locked by event processing daemon ? */
1541 if (cportinfo->cport_event_flags & SATA_EVNT_LOCK_PORT_BUSY) {
1542 /*
1543 * Cannot process ioctl request now. Come back later
1544 */
1545 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, cport)->
1546 cport_mutex);
1547 return (EBUSY);
1548 }
1549 /* Block event processing for this port */
1550 cportinfo->cport_event_flags |= SATA_APCTL_LOCK_PORT_BUSY;
1551 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, cport)->cport_mutex);
1552
1553
1554 sata_device.satadev_addr.cport = cport;
1555 sata_device.satadev_addr.pmport = pmport;
1556 sata_device.satadev_addr.qual = qual;
1557 sata_device.satadev_rev = SATA_DEVICE_REV;
1558
1559 switch (ioc.cmd) {
1560
1561 case SATA_CFGA_RESET_PORT:
1562 /*
1563 * There is no protection for configured device.
1564 */
1565 rv = sata_ioctl_reset_port(sata_hba_inst, &sata_device);
1566 break;
1567
1568 case SATA_CFGA_RESET_DEVICE:
1569 /*
1570 * There is no protection for configured device.
1571 */
1572 rv = sata_ioctl_reset_device(sata_hba_inst,
1573 &sata_device);
1574 break;
1575
1576 case SATA_CFGA_RESET_ALL:
1577 /*
1578 * There is no protection for configured devices.
1579 */
1580 rv = sata_ioctl_reset_all(sata_hba_inst);
1581 /*
1582 * We return here, because common return is for
1583 * a single port operation - we have already unlocked
1584 * all ports and no dc handle was allocated.
1585 */
1586 return (rv);
1587
1588 case SATA_CFGA_PORT_DEACTIVATE:
1589 /*
1590 * Arbitrarily unconfigure attached device, if any.
1591 * Even if the unconfigure fails, proceed with the
1592 * port deactivation.
1593 */
1594 rv = sata_ioctl_deactivate(sata_hba_inst, &sata_device);
1595
1596 break;
1597
1598 case SATA_CFGA_PORT_ACTIVATE:
1599
1600 rv = sata_ioctl_activate(sata_hba_inst, &sata_device);
1601 break;
1602
1603 case SATA_CFGA_PORT_SELF_TEST:
1604
1605 rv = sata_ioctl_port_self_test(sata_hba_inst,
1606 &sata_device);
1607 break;
1608
1609 case SATA_CFGA_GET_DEVICE_PATH:
1610
1611 rv = sata_ioctl_get_device_path(sata_hba_inst,
1612 &sata_device, &ioc, mode);
1613 break;
1614
1615 case SATA_CFGA_GET_AP_TYPE:
1616
1617 rv = sata_ioctl_get_ap_type(sata_hba_inst,
1618 &sata_device, &ioc, mode);
1619 break;
1620
1621 case SATA_CFGA_GET_MODEL_INFO:
1622
1623 rv = sata_ioctl_get_model_info(sata_hba_inst,
1624 &sata_device, &ioc, mode);
1625 break;
1626
1627 case SATA_CFGA_GET_REVFIRMWARE_INFO:
1628
1629 rv = sata_ioctl_get_revfirmware_info(sata_hba_inst,
1630 &sata_device, &ioc, mode);
1631 break;
1632
1633 case SATA_CFGA_GET_SERIALNUMBER_INFO:
1634
1635 rv = sata_ioctl_get_serialnumber_info(sata_hba_inst,
1636 &sata_device, &ioc, mode);
1637 break;
1638
1639 default:
1640 rv = EINVAL;
1641 break;
1642
1643 } /* End of DEVCTL_AP_CONTROL cmd switch */
1644
1645 break;
1646 }
1647
1648 default:
1649 {
1650 /*
1651 * If we got here, we got an IOCTL that SATA HBA Framework
1652 * does not recognize. Pass ioctl to HBA driver, in case
1653 * it could process it.
1654 */
1655 sata_hba_tran_t *sata_tran = sata_hba_inst->satahba_tran;
1656 dev_info_t *mydip = SATA_DIP(sata_hba_inst);
1657
1658 SATADBG1(SATA_DBG_IOCTL_IF, sata_hba_inst,
1659 "IOCTL 0x%2x not supported in SATA framework, "
1660 "passthrough to HBA", cmd);
1661
1662 if (sata_tran->sata_tran_ioctl == NULL) {
1663 rv = EINVAL;
1664 break;
1665 }
1666 rval = (*sata_tran->sata_tran_ioctl)(mydip, cmd, arg);
1667 if (rval != 0) {
1668 SATADBG1(SATA_DBG_IOCTL_IF, sata_hba_inst,
1669 "IOCTL 0x%2x failed in HBA", cmd);
1670 rv = rval;
1671 }
1672 break;
1673 }
1674
1675 } /* End of main IOCTL switch */
1676
1677 if (dcp) {
1678 ndi_dc_freehdl(dcp);
1679 }
1680 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, cport)->cport_mutex);
1681 cportinfo->cport_event_flags &= ~SATA_APCTL_LOCK_PORT_BUSY;
1682 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, cport)->cport_mutex);
1683
1684 return (rv);
1685 }
1686
1687
1688 /*
1689 * Create error retrieval sata packet
1690 *
1691 * A sata packet is allocated and set-up to contain specified error retrieval
1692 * command and appropriate dma-able data buffer.
1693 * No association with any scsi packet is made and no callback routine is
1694 * specified.
1695 *
1696 * Returns a pointer to sata packet upon successful packet creation.
1697 * Returns NULL, if packet cannot be created.
1698 */
1699 sata_pkt_t *
sata_get_error_retrieval_pkt(dev_info_t * dip,sata_device_t * sata_device,int pkt_type)1700 sata_get_error_retrieval_pkt(dev_info_t *dip, sata_device_t *sata_device,
1701 int pkt_type)
1702 {
1703 sata_hba_inst_t *sata_hba_inst;
1704 sata_pkt_txlate_t *spx;
1705 sata_pkt_t *spkt;
1706 sata_drive_info_t *sdinfo;
1707
1708 mutex_enter(&sata_mutex);
1709 for (sata_hba_inst = sata_hba_list; sata_hba_inst != NULL;
1710 sata_hba_inst = sata_hba_inst->satahba_next) {
1711 if (SATA_DIP(sata_hba_inst) == dip)
1712 break;
1713 }
1714 mutex_exit(&sata_mutex);
1715 ASSERT(sata_hba_inst != NULL);
1716
1717 sdinfo = sata_get_device_info(sata_hba_inst, sata_device);
1718 if (sdinfo == NULL) {
1719 sata_log(sata_hba_inst, CE_WARN,
1720 "sata: error recovery request for non-attached device at "
1721 "cport %d", sata_device->satadev_addr.cport);
1722 return (NULL);
1723 }
1724
1725 spx = kmem_zalloc(sizeof (sata_pkt_txlate_t), KM_SLEEP);
1726 spx->txlt_sata_hba_inst = sata_hba_inst;
1727 spx->txlt_scsi_pkt = NULL; /* No scsi pkt involved */
1728 spkt = sata_pkt_alloc(spx, NULL);
1729 if (spkt == NULL) {
1730 kmem_free(spx, sizeof (sata_pkt_txlate_t));
1731 return (NULL);
1732 }
1733 /* address is needed now */
1734 spkt->satapkt_device.satadev_addr = sata_device->satadev_addr;
1735
1736 switch (pkt_type) {
1737 case SATA_ERR_RETR_PKT_TYPE_NCQ:
1738 if (sata_ncq_err_ret_cmd_setup(spx, sdinfo) == SATA_SUCCESS) {
1739 if (sata_check_for_dma_error(dip, spx)) {
1740 ddi_fm_service_impact(dip,
1741 DDI_SERVICE_UNAFFECTED);
1742 break;
1743 }
1744 return (spkt);
1745 }
1746 break;
1747
1748 case SATA_ERR_RETR_PKT_TYPE_ATAPI:
1749 if (sata_atapi_err_ret_cmd_setup(spx, sdinfo) == SATA_SUCCESS) {
1750 if (sata_check_for_dma_error(dip, spx)) {
1751 ddi_fm_service_impact(dip,
1752 DDI_SERVICE_UNAFFECTED);
1753 break;
1754 }
1755 return (spkt);
1756 }
1757 break;
1758
1759 default:
1760 break;
1761 }
1762
1763 sata_pkt_free(spx);
1764 kmem_free(spx, sizeof (sata_pkt_txlate_t));
1765 return (NULL);
1766
1767 }
1768
1769
1770 /*
1771 * Free error retrieval sata packet
1772 *
1773 * Free sata packet and any associated resources allocated previously by
1774 * sata_get_error_retrieval_pkt().
1775 *
1776 * Void return.
1777 */
1778 void
sata_free_error_retrieval_pkt(sata_pkt_t * sata_pkt)1779 sata_free_error_retrieval_pkt(sata_pkt_t *sata_pkt)
1780 {
1781 sata_pkt_txlate_t *spx =
1782 (sata_pkt_txlate_t *)sata_pkt->satapkt_framework_private;
1783
1784 ASSERT(sata_pkt != NULL);
1785
1786 sata_free_local_buffer(spx);
1787 sata_pkt_free(spx);
1788 kmem_free(spx, sizeof (sata_pkt_txlate_t));
1789
1790 }
1791
1792 /*
1793 * Create READ PORT MULTIPLIER and WRITE PORT MULTIPLIER sata packet
1794 *
1795 * No association with any scsi packet is made and no callback routine is
1796 * specified.
1797 *
1798 * Returns a pointer to sata packet upon successful packet creation.
1799 * Returns NULL, if packet cannot be created.
1800 *
1801 * NOTE: Input/Output value includes 64 bits accoring to SATA Spec 2.6,
1802 * only lower 32 bits are available currently.
1803 */
1804 sata_pkt_t *
sata_get_rdwr_pmult_pkt(dev_info_t * dip,sata_device_t * sd,uint8_t regn,uint32_t regv,uint32_t type)1805 sata_get_rdwr_pmult_pkt(dev_info_t *dip, sata_device_t *sd,
1806 uint8_t regn, uint32_t regv, uint32_t type)
1807 {
1808 sata_hba_inst_t *sata_hba_inst;
1809 sata_pkt_txlate_t *spx;
1810 sata_pkt_t *spkt;
1811 sata_cmd_t *scmd;
1812
1813 /* Only READ/WRITE commands are accepted. */
1814 ASSERT(type == SATA_RDWR_PMULT_PKT_TYPE_READ ||
1815 type == SATA_RDWR_PMULT_PKT_TYPE_WRITE);
1816
1817 mutex_enter(&sata_mutex);
1818 for (sata_hba_inst = sata_hba_list; sata_hba_inst != NULL;
1819 sata_hba_inst = sata_hba_inst->satahba_next) {
1820 if (SATA_DIP(sata_hba_inst) == dip)
1821 break;
1822 }
1823 mutex_exit(&sata_mutex);
1824 ASSERT(sata_hba_inst != NULL);
1825
1826 spx = kmem_zalloc(sizeof (sata_pkt_txlate_t), KM_SLEEP);
1827 spx->txlt_sata_hba_inst = sata_hba_inst;
1828 spx->txlt_scsi_pkt = NULL; /* No scsi pkt involved */
1829 spkt = sata_pkt_alloc(spx, SLEEP_FUNC);
1830 if (spkt == NULL) {
1831 kmem_free(spx, sizeof (sata_pkt_txlate_t));
1832 return (NULL);
1833 }
1834
1835 /*
1836 * NOTE: We need to send this command to the port multiplier,
1837 * that means send to SATA_PMULT_HOSTPORT(0xf) pmport
1838 *
1839 * sata_device contains the address of actual target device, and the
1840 * pmport number in the command comes from the sata_device structure.
1841 */
1842 spkt->satapkt_device.satadev_addr = sd->satadev_addr;
1843 spkt->satapkt_device.satadev_addr.pmport = SATA_PMULT_HOSTPORT;
1844 spkt->satapkt_device.satadev_addr.qual = SATA_ADDR_PMULT;
1845
1846 /* Fill sata_pkt */
1847 spkt->satapkt_op_mode = SATA_OPMODE_SYNCH | SATA_OPMODE_POLLING;
1848 spkt->satapkt_comp = NULL; /* Synchronous mode, no callback */
1849 spkt->satapkt_time = 10; /* Timeout 10s */
1850
1851 /* Build READ PORT MULTIPLIER cmd in the sata_pkt */
1852 scmd = &spkt->satapkt_cmd;
1853 scmd->satacmd_features_reg = regn & 0xff;
1854 scmd->satacmd_features_reg_ext = (regn >> 8) & 0xff;
1855 scmd->satacmd_device_reg = sd->satadev_addr.pmport;
1856 scmd->satacmd_addr_type = 0; /* N/A */
1857
1858 scmd->satacmd_flags.sata_ignore_dev_reset = B_TRUE;
1859
1860 if (type == SATA_RDWR_PMULT_PKT_TYPE_READ) {
1861 scmd->satacmd_cmd_reg = SATAC_READ_PORTMULT;
1862 scmd->satacmd_flags.sata_data_direction = SATA_DIR_READ;
1863 scmd->satacmd_flags.sata_special_regs = 1;
1864 scmd->satacmd_flags.sata_copy_out_lba_high_lsb = 1;
1865 scmd->satacmd_flags.sata_copy_out_lba_mid_lsb = 1;
1866 scmd->satacmd_flags.sata_copy_out_lba_low_lsb = 1;
1867 scmd->satacmd_flags.sata_copy_out_sec_count_lsb = 1;
1868 } else if (type == SATA_RDWR_PMULT_PKT_TYPE_WRITE) {
1869 scmd->satacmd_cmd_reg = SATAC_WRITE_PORTMULT;
1870 scmd->satacmd_flags.sata_data_direction = SATA_DIR_WRITE;
1871 scmd->satacmd_sec_count_lsb = regv & 0xff;
1872 scmd->satacmd_lba_low_lsb = regv >> 8 & 0xff;
1873 scmd->satacmd_lba_mid_lsb = regv >> 16 & 0xff;
1874 scmd->satacmd_lba_high_lsb = regv >> 24 & 0xff;
1875 }
1876
1877 return (spkt);
1878 }
1879
1880 /*
1881 * Free sata packet and any associated resources allocated previously by
1882 * sata_get_rdwr_pmult_pkt().
1883 *
1884 * Void return.
1885 */
1886 void
sata_free_rdwr_pmult_pkt(sata_pkt_t * sata_pkt)1887 sata_free_rdwr_pmult_pkt(sata_pkt_t *sata_pkt)
1888 {
1889 sata_pkt_txlate_t *spx =
1890 (sata_pkt_txlate_t *)sata_pkt->satapkt_framework_private;
1891
1892 /* Free allocated resources */
1893 sata_pkt_free(spx);
1894 kmem_free(spx, sizeof (sata_pkt_txlate_t));
1895 }
1896
1897 /*
1898 * Register a port multiplier to framework.
1899 * 1) Store the GSCR values in the previous allocated pmult_info strctures.
1900 * 2) Search in the blacklist and update the number of the device ports of the
1901 * port multiplier.
1902 *
1903 * Void return.
1904 */
1905 void
sata_register_pmult(dev_info_t * dip,sata_device_t * sd,sata_pmult_gscr_t * sg)1906 sata_register_pmult(dev_info_t *dip, sata_device_t *sd, sata_pmult_gscr_t *sg)
1907 {
1908 sata_hba_inst_t *sata_hba_inst = NULL;
1909 sata_pmult_info_t *pmultinfo;
1910 sata_pmult_bl_t *blp;
1911 int cport = sd->satadev_addr.cport;
1912
1913 mutex_enter(&sata_mutex);
1914 for (sata_hba_inst = sata_hba_list; sata_hba_inst != NULL;
1915 sata_hba_inst = sata_hba_inst->satahba_next) {
1916 if (SATA_DIP(sata_hba_inst) == dip)
1917 if (sata_hba_inst->satahba_attached == 1)
1918 break;
1919 }
1920 mutex_exit(&sata_mutex);
1921 /* HBA not attached? */
1922 if (sata_hba_inst == NULL)
1923 return;
1924
1925 /* Number of pmports */
1926 sd->satadev_add_info = sg->gscr2 & SATA_PMULT_PORTNUM_MASK;
1927
1928 /* Check the blacklist */
1929 for (blp = sata_pmult_blacklist; blp->bl_gscr0; blp++) {
1930 if (sg->gscr0 != blp->bl_gscr0 && blp->bl_gscr0)
1931 continue;
1932 if (sg->gscr1 != blp->bl_gscr1 && blp->bl_gscr1)
1933 continue;
1934 if (sg->gscr2 != blp->bl_gscr2 && blp->bl_gscr2)
1935 continue;
1936
1937 cmn_err(CE_WARN, "!Port multiplier is on the blacklist.");
1938 sd->satadev_add_info = blp->bl_flags;
1939 break;
1940 }
1941
1942 /* Register the port multiplier GSCR */
1943 mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst, cport)));
1944 pmultinfo = SATA_PMULT_INFO(sata_hba_inst, cport);
1945 if (pmultinfo != NULL) {
1946 pmultinfo->pmult_gscr = *sg;
1947 pmultinfo->pmult_num_dev_ports =
1948 sd->satadev_add_info & SATA_PMULT_PORTNUM_MASK;
1949 SATADBG1(SATA_DBG_PMULT, sata_hba_inst,
1950 "Port multiplier registered at port %d", cport);
1951 }
1952 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst, cport)));
1953 }
1954
1955 /*
1956 * sata_split_model splits the model ID into vendor and product IDs.
1957 * It assumes that a vendor ID cannot be longer than 8 characters, and
1958 * that vendor and product ID are separated by a whitespace.
1959 */
1960 void
sata_split_model(char * model,char ** vendor,char ** product)1961 sata_split_model(char *model, char **vendor, char **product)
1962 {
1963 int i, modlen;
1964 char *vid, *pid;
1965
1966 /*
1967 * remove whitespace at the end of model
1968 */
1969 for (i = SATA_ID_MODEL_LEN; i > 0; i--)
1970 if (model[i] == ' ' || model[i] == '\t' || model[i] == '\0')
1971 model[i] = '\0';
1972 else
1973 break;
1974
1975 /*
1976 * try to split model into into vid/pid
1977 */
1978 modlen = strlen(model);
1979 for (i = 0, pid = model; i < modlen; i++, pid++)
1980 if ((*pid == ' ') || (*pid == '\t'))
1981 break;
1982
1983 /*
1984 * only use vid if it is less than 8 chars (as in SCSI)
1985 */
1986 if (i < modlen && i <= 8) {
1987 vid = model;
1988 /*
1989 * terminate vid, establish pid
1990 */
1991 *pid++ = '\0';
1992 } else {
1993 /*
1994 * vid will stay "ATA "
1995 */
1996 vid = NULL;
1997 /*
1998 * model is all pid
1999 */
2000 pid = model;
2001 }
2002
2003 *vendor = vid;
2004 *product = pid;
2005 }
2006
2007 /*
2008 * sata_name_child is for composing the name of the node
2009 * the format of the name is "target,0".
2010 */
2011 static int
sata_name_child(dev_info_t * dip,char * name,int namelen)2012 sata_name_child(dev_info_t *dip, char *name, int namelen)
2013 {
2014 int target;
2015
2016 target = ddi_prop_get_int(DDI_DEV_T_ANY, dip,
2017 DDI_PROP_DONTPASS, "target", -1);
2018 if (target == -1)
2019 return (DDI_FAILURE);
2020 (void) snprintf(name, namelen, "%x,0", target);
2021 return (DDI_SUCCESS);
2022 }
2023
2024
2025
2026 /* ****************** SCSA required entry points *********************** */
2027
2028 /*
2029 * Implementation of scsi tran_tgt_init.
2030 * sata_scsi_tgt_init() initializes scsi_device structure
2031 *
2032 * If successful, DDI_SUCCESS is returned.
2033 * DDI_FAILURE is returned if addressed device does not exist
2034 */
2035
2036 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)2037 sata_scsi_tgt_init(dev_info_t *hba_dip, dev_info_t *tgt_dip,
2038 scsi_hba_tran_t *hba_tran, struct scsi_device *sd)
2039 {
2040 #ifndef __lock_lint
2041 _NOTE(ARGUNUSED(hba_dip))
2042 _NOTE(ARGUNUSED(tgt_dip))
2043 #endif
2044 sata_device_t sata_device;
2045 sata_drive_info_t *sdinfo;
2046 struct sata_id *sid;
2047 sata_hba_inst_t *sata_hba_inst;
2048 char model[SATA_ID_MODEL_LEN + 1];
2049 char fw[SATA_ID_FW_LEN + 1];
2050 char *vid, *pid;
2051
2052 /*
2053 * Fail tran_tgt_init for .conf stub node
2054 */
2055 if (ndi_dev_is_persistent_node(tgt_dip) == 0) {
2056 (void) ndi_merge_node(tgt_dip, sata_name_child);
2057 ddi_set_name_addr(tgt_dip, NULL);
2058 return (DDI_FAILURE);
2059 }
2060
2061 sata_hba_inst = (sata_hba_inst_t *)(hba_tran->tran_hba_private);
2062
2063 /* Validate scsi device address */
2064 if (sata_validate_scsi_address(sata_hba_inst, &sd->sd_address,
2065 &sata_device) != 0)
2066 return (DDI_FAILURE);
2067
2068 mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst,
2069 sata_device.satadev_addr.cport)));
2070
2071 /* sata_device now contains a valid sata address */
2072 sdinfo = sata_get_device_info(sata_hba_inst, &sata_device);
2073 if (sdinfo == NULL) {
2074 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
2075 sata_device.satadev_addr.cport)));
2076 return (DDI_FAILURE);
2077 }
2078 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
2079 sata_device.satadev_addr.cport)));
2080
2081 /*
2082 * Check if we need to create a legacy devid (i.e cmdk style) for
2083 * the target disks.
2084 *
2085 * HBA devinfo node will have the property "use-cmdk-devid-format"
2086 * if we need to create cmdk-style devid for all the disk devices
2087 * attached to this controller. This property may have been set
2088 * from HBA driver's .conf file or by the HBA driver in its
2089 * attach(9F) function.
2090 */
2091 if ((sdinfo->satadrv_type == SATA_DTYPE_ATADISK) &&
2092 (ddi_getprop(DDI_DEV_T_ANY, hba_dip, DDI_PROP_DONTPASS,
2093 "use-cmdk-devid-format", 0) == 1)) {
2094 /* register a legacy devid for this target node */
2095 sata_target_devid_register(tgt_dip, sdinfo);
2096 }
2097
2098
2099 /*
2100 * 'Identify Device Data' does not always fit in standard SCSI
2101 * INQUIRY data, so establish INQUIRY_* properties with full-form
2102 * of information.
2103 */
2104 sid = &sdinfo->satadrv_id;
2105 #ifdef _LITTLE_ENDIAN
2106 swab(sid->ai_model, model, SATA_ID_MODEL_LEN);
2107 swab(sid->ai_fw, fw, SATA_ID_FW_LEN);
2108 #else /* _LITTLE_ENDIAN */
2109 bcopy(sid->ai_model, model, SATA_ID_MODEL_LEN);
2110 bcopy(sid->ai_fw, fw, SATA_ID_FW_LEN);
2111 #endif /* _LITTLE_ENDIAN */
2112 model[SATA_ID_MODEL_LEN] = 0;
2113 fw[SATA_ID_FW_LEN] = 0;
2114
2115 sata_split_model(model, &vid, &pid);
2116
2117 if (vid)
2118 (void) scsi_device_prop_update_inqstring(sd, INQUIRY_VENDOR_ID,
2119 vid, strlen(vid));
2120 if (pid)
2121 (void) scsi_device_prop_update_inqstring(sd, INQUIRY_PRODUCT_ID,
2122 pid, strlen(pid));
2123 (void) scsi_device_prop_update_inqstring(sd, INQUIRY_REVISION_ID,
2124 fw, strlen(fw));
2125
2126 return (DDI_SUCCESS);
2127 }
2128
2129 /*
2130 * Implementation of scsi tran_tgt_probe.
2131 * Probe target, by calling default scsi routine scsi_hba_probe()
2132 */
2133 static int
sata_scsi_tgt_probe(struct scsi_device * sd,int (* callback)(void))2134 sata_scsi_tgt_probe(struct scsi_device *sd, int (*callback)(void))
2135 {
2136 sata_hba_inst_t *sata_hba_inst =
2137 (sata_hba_inst_t *)(sd->sd_address.a_hba_tran->tran_hba_private);
2138 int rval;
2139 uint32_t pm_cap;
2140
2141 rval = scsi_hba_probe(sd, callback);
2142 pm_cap = SATA_CAP_POWER_CONDITON | SATA_CAP_SMART_PAGE |
2143 SATA_CAP_LOG_SENSE;
2144
2145 if (rval == SCSIPROBE_EXISTS) {
2146 /*
2147 * Set property "pm-capable" on the target device node, so that
2148 * the target driver will not try to fetch scsi cycle counters
2149 * before enabling device power-management.
2150 */
2151 if ((ddi_prop_update_int(DDI_DEV_T_NONE, sd->sd_dev,
2152 "pm-capable", pm_cap)) != DDI_PROP_SUCCESS) {
2153 sata_log(sata_hba_inst, CE_WARN,
2154 "SATA device at port %d: "
2155 "will not be power-managed ",
2156 SCSI_TO_SATA_CPORT(sd->sd_address.a_target));
2157 SATA_LOG_D((sata_hba_inst, CE_WARN,
2158 "failure updating pm-capable property"));
2159 }
2160 }
2161 return (rval);
2162 }
2163
2164 /*
2165 * Implementation of scsi tran_tgt_free.
2166 * Release all resources allocated for scsi_device
2167 */
2168 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)2169 sata_scsi_tgt_free(dev_info_t *hba_dip, dev_info_t *tgt_dip,
2170 scsi_hba_tran_t *hba_tran, struct scsi_device *sd)
2171 {
2172 #ifndef __lock_lint
2173 _NOTE(ARGUNUSED(hba_dip))
2174 #endif
2175 sata_device_t sata_device;
2176 sata_drive_info_t *sdinfo;
2177 sata_hba_inst_t *sata_hba_inst;
2178 ddi_devid_t devid;
2179
2180 sata_hba_inst = (sata_hba_inst_t *)(hba_tran->tran_hba_private);
2181
2182 /* Validate scsi device address */
2183 /*
2184 * Note: tgt_free relates to the SCSA view of a device. If called, there
2185 * was a device at this address, so even if the sata framework internal
2186 * resources were alredy released because a device was detached,
2187 * this function should be executed as long as its actions do
2188 * not require the internal sata view of a device and the address
2189 * refers to a valid sata address.
2190 * Validating the address here means that we do not trust SCSA...
2191 */
2192 if (sata_validate_scsi_address(sata_hba_inst, &sd->sd_address,
2193 &sata_device) == -1)
2194 return;
2195
2196 mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst,
2197 sata_device.satadev_addr.cport)));
2198
2199 /* sata_device now should contain a valid sata address */
2200 sdinfo = sata_get_device_info(sata_hba_inst, &sata_device);
2201 if (sdinfo == NULL) {
2202 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
2203 sata_device.satadev_addr.cport)));
2204 return;
2205 }
2206 /*
2207 * We did not allocate any resources in sata_scsi_tgt_init()
2208 * other than few properties.
2209 * Free them.
2210 */
2211 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
2212 sata_device.satadev_addr.cport)));
2213 (void) ndi_prop_remove(DDI_DEV_T_NONE, tgt_dip, "pm-capable");
2214
2215 /*
2216 * If devid was previously created but not freed up from
2217 * sd(7D) driver (i.e during detach(9F)) then do it here.
2218 */
2219 if ((sdinfo->satadrv_type == SATA_DTYPE_ATADISK) &&
2220 (ddi_getprop(DDI_DEV_T_ANY, hba_dip, DDI_PROP_DONTPASS,
2221 "use-cmdk-devid-format", 0) == 1) &&
2222 (ddi_devid_get(tgt_dip, &devid) == DDI_SUCCESS)) {
2223 ddi_devid_unregister(tgt_dip);
2224 ddi_devid_free(devid);
2225 }
2226 }
2227
2228 /*
2229 * Implementation of scsi tran_init_pkt
2230 * Upon successful return, scsi pkt buffer has DMA resources allocated.
2231 *
2232 * It seems that we should always allocate pkt, even if the address is
2233 * for non-existing device - just use some default for dma_attr.
2234 * The reason is that there is no way to communicate this to a caller here.
2235 * Subsequent call to sata_scsi_start may fail appropriately.
2236 * Simply returning NULL does not seem to discourage a target driver...
2237 *
2238 * Returns a pointer to initialized scsi_pkt, or NULL otherwise.
2239 */
2240 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)2241 sata_scsi_init_pkt(struct scsi_address *ap, struct scsi_pkt *pkt,
2242 struct buf *bp, int cmdlen, int statuslen, int tgtlen, int flags,
2243 int (*callback)(caddr_t), caddr_t arg)
2244 {
2245 sata_hba_inst_t *sata_hba_inst =
2246 (sata_hba_inst_t *)(ap->a_hba_tran->tran_hba_private);
2247 dev_info_t *dip = SATA_DIP(sata_hba_inst);
2248 sata_device_t sata_device;
2249 sata_drive_info_t *sdinfo;
2250 sata_pkt_txlate_t *spx;
2251 ddi_dma_attr_t cur_dma_attr;
2252 int rval;
2253 boolean_t new_pkt = B_TRUE;
2254
2255 ASSERT(ap->a_hba_tran->tran_hba_dip == dip);
2256
2257 /*
2258 * We need to translate the address, even if it could be
2259 * a bogus one, for a non-existing device
2260 */
2261 sata_device.satadev_addr.qual = SCSI_TO_SATA_ADDR_QUAL(ap->a_target);
2262 sata_device.satadev_addr.cport = SCSI_TO_SATA_CPORT(ap->a_target);
2263 sata_device.satadev_addr.pmport = SCSI_TO_SATA_PMPORT(ap->a_target);
2264 sata_device.satadev_rev = SATA_DEVICE_REV;
2265
2266 if (pkt == NULL) {
2267 /*
2268 * Have to allocate a brand new scsi packet.
2269 * We need to operate with auto request sense enabled.
2270 */
2271 pkt = scsi_hba_pkt_alloc(dip, ap, cmdlen,
2272 MAX(statuslen, SATA_MAX_SENSE_LEN),
2273 tgtlen, sizeof (sata_pkt_txlate_t), callback, arg);
2274
2275 if (pkt == NULL)
2276 return (NULL);
2277
2278 /* Fill scsi packet structure */
2279 pkt->pkt_comp = (void (*)())NULL;
2280 pkt->pkt_time = 0;
2281 pkt->pkt_resid = 0;
2282 pkt->pkt_statistics = 0;
2283 pkt->pkt_reason = 0;
2284
2285 /*
2286 * pkt_hba_private will point to sata pkt txlate structure
2287 */
2288 spx = (sata_pkt_txlate_t *)pkt->pkt_ha_private;
2289 bzero(spx, sizeof (sata_pkt_txlate_t));
2290
2291 spx->txlt_scsi_pkt = pkt;
2292 spx->txlt_sata_hba_inst = sata_hba_inst;
2293
2294 /* Allocate sata_pkt */
2295 spx->txlt_sata_pkt = sata_pkt_alloc(spx, callback);
2296 if (spx->txlt_sata_pkt == NULL) {
2297 /* Could not allocate sata pkt */
2298 scsi_hba_pkt_free(ap, pkt);
2299 return (NULL);
2300 }
2301 /* Set sata address */
2302 spx->txlt_sata_pkt->satapkt_device.satadev_addr =
2303 sata_device.satadev_addr;
2304 spx->txlt_sata_pkt->satapkt_device.satadev_rev =
2305 sata_device.satadev_rev;
2306
2307 if ((bp == NULL) || (bp->b_bcount == 0))
2308 return (pkt);
2309
2310 spx->txlt_total_residue = bp->b_bcount;
2311 } else {
2312 new_pkt = B_FALSE;
2313 /*
2314 * Packet was preallocated/initialized by previous call
2315 */
2316 spx = (sata_pkt_txlate_t *)pkt->pkt_ha_private;
2317
2318 if ((bp == NULL) || (bp->b_bcount == 0)) {
2319 return (pkt);
2320 }
2321
2322 /* Pkt is available already: spx->txlt_scsi_pkt == pkt; */
2323 }
2324
2325 spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp = bp;
2326
2327 /*
2328 * We use an adjusted version of the dma_attr, to account
2329 * for device addressing limitations.
2330 * sata_adjust_dma_attr() will handle sdinfo == NULL which may
2331 * happen when a device is not yet configured.
2332 */
2333 mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst,
2334 sata_device.satadev_addr.cport)));
2335 sdinfo = sata_get_device_info(spx->txlt_sata_hba_inst,
2336 &spx->txlt_sata_pkt->satapkt_device);
2337 /* NULL sdinfo may be passsed to sata_adjust_dma_attr() */
2338 sata_adjust_dma_attr(sdinfo,
2339 SATA_DMA_ATTR(spx->txlt_sata_hba_inst), &cur_dma_attr);
2340 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
2341 sata_device.satadev_addr.cport)));
2342 /*
2343 * Allocate necessary DMA resources for the packet's data buffer
2344 * NOTE:
2345 * In case of read/write commands, DMA resource allocation here is
2346 * based on the premise that the transfer length specified in
2347 * the read/write scsi cdb will match exactly DMA resources -
2348 * returning correct packet residue is crucial.
2349 */
2350 if ((rval = sata_dma_buf_setup(spx, flags, callback, arg,
2351 &cur_dma_attr)) != DDI_SUCCESS) {
2352 /*
2353 * If a DMA allocation request fails with
2354 * DDI_DMA_NOMAPPING, indicate the error by calling
2355 * bioerror(9F) with bp and an error code of EFAULT.
2356 * If a DMA allocation request fails with
2357 * DDI_DMA_TOOBIG, indicate the error by calling
2358 * bioerror(9F) with bp and an error code of EINVAL.
2359 * For DDI_DMA_NORESOURCES, we may have some of them allocated.
2360 * Request may be repeated later - there is no real error.
2361 */
2362 switch (rval) {
2363 case DDI_DMA_NORESOURCES:
2364 bioerror(bp, 0);
2365 break;
2366 case DDI_DMA_NOMAPPING:
2367 case DDI_DMA_BADATTR:
2368 bioerror(bp, EFAULT);
2369 break;
2370 case DDI_DMA_TOOBIG:
2371 default:
2372 bioerror(bp, EINVAL);
2373 break;
2374 }
2375 goto fail;
2376 }
2377
2378 if (sata_check_for_dma_error(dip, spx)) {
2379 ddi_fm_service_impact(dip, DDI_SERVICE_UNAFFECTED);
2380 bioerror(bp, EFAULT);
2381 goto fail;
2382 }
2383
2384 success:
2385 /* Set number of bytes that are not yet accounted for */
2386 pkt->pkt_resid = spx->txlt_total_residue;
2387 ASSERT(pkt->pkt_resid >= 0);
2388
2389 return (pkt);
2390
2391 fail:
2392 if (new_pkt == B_TRUE) {
2393 /*
2394 * Since this is a new packet, we can clean-up
2395 * everything
2396 */
2397 sata_scsi_destroy_pkt(ap, pkt);
2398 } else {
2399 /*
2400 * This is a re-used packet. It will be target driver's
2401 * responsibility to eventually destroy it (which
2402 * will free allocated resources).
2403 * Here, we just "complete" the request, leaving
2404 * allocated resources intact, so the request may
2405 * be retried.
2406 */
2407 spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp = NULL;
2408 sata_pkt_free(spx);
2409 }
2410 return (NULL);
2411 }
2412
2413 /*
2414 * Implementation of scsi tran_start.
2415 * Translate scsi cmd into sata operation and return status.
2416 * ATAPI CDBs are passed to ATAPI devices - the device determines what commands
2417 * are supported.
2418 * For SATA hard disks, supported scsi commands:
2419 * SCMD_INQUIRY
2420 * SCMD_TEST_UNIT_READY
2421 * SCMD_START_STOP
2422 * SCMD_READ_CAPACITY
2423 * SCMD_SVC_ACTION_IN_G4 (READ CAPACITY (16))
2424 * SCMD_REQUEST_SENSE
2425 * SCMD_LOG_SENSE_G1
2426 * SCMD_LOG_SELECT_G1
2427 * SCMD_MODE_SENSE (specific pages)
2428 * SCMD_MODE_SENSE_G1 (specific pages)
2429 * SCMD_MODE_SELECT (specific pages)
2430 * SCMD_MODE_SELECT_G1 (specific pages)
2431 * SCMD_SYNCHRONIZE_CACHE
2432 * SCMD_SYNCHRONIZE_CACHE_G1
2433 * SCMD_READ
2434 * SCMD_READ_G1
2435 * SCMD_READ_G4
2436 * SCMD_READ_G5
2437 * SCMD_WRITE
2438 * SCMD_WRITE_BUFFER
2439 * SCMD_WRITE_G1
2440 * SCMD_WRITE_G4
2441 * SCMD_WRITE_G5
2442 * SCMD_SEEK (noop)
2443 * SCMD_SDIAG
2444 *
2445 * All other commands are rejected as unsupported.
2446 *
2447 * Returns:
2448 * TRAN_ACCEPT if command was executed successfully or accepted by HBA driver
2449 * for execution. TRAN_ACCEPT may be returned also if device was removed but
2450 * a callback could be scheduled.
2451 * TRAN_BADPKT if cmd was directed to invalid address.
2452 * TRAN_FATAL_ERROR is command was rejected due to hardware error, including
2453 * some unspecified error. TRAN_FATAL_ERROR may be also returned if a device
2454 * was removed and there was no callback specified in scsi pkt.
2455 * TRAN_BUSY if command could not be executed becasue HBA driver or SATA
2456 * framework was busy performing some other operation(s).
2457 *
2458 */
2459 static int
sata_scsi_start(struct scsi_address * ap,struct scsi_pkt * pkt)2460 sata_scsi_start(struct scsi_address *ap, struct scsi_pkt *pkt)
2461 {
2462 sata_hba_inst_t *sata_hba_inst =
2463 (sata_hba_inst_t *)(ap->a_hba_tran->tran_hba_private);
2464 sata_pkt_txlate_t *spx = (sata_pkt_txlate_t *)pkt->pkt_ha_private;
2465 sata_device_t *sdevice = &spx->txlt_sata_pkt->satapkt_device;
2466 sata_drive_info_t *sdinfo;
2467 struct buf *bp;
2468 uint8_t cport, pmport;
2469 boolean_t dev_gone = B_FALSE;
2470 int rval;
2471
2472 SATADBG1(SATA_DBG_SCSI_IF, sata_hba_inst,
2473 "sata_scsi_start: cmd 0x%02x\n", pkt->pkt_cdbp[0]);
2474
2475 ASSERT(spx != NULL &&
2476 spx->txlt_scsi_pkt == pkt && spx->txlt_sata_pkt != NULL);
2477
2478 cport = SCSI_TO_SATA_CPORT(ap->a_target);
2479 pmport = SCSI_TO_SATA_PMPORT(ap->a_target);
2480
2481 mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst, cport)));
2482
2483 if (sdevice->satadev_addr.qual == SATA_ADDR_DCPORT) {
2484 sdinfo = sata_get_device_info(sata_hba_inst, sdevice);
2485 if (sdinfo == NULL ||
2486 SATA_CPORT_INFO(sata_hba_inst, cport)->
2487 cport_tgtnode_clean == B_FALSE ||
2488 (sdinfo->satadrv_state & SATA_DSTATE_FAILED) != 0) {
2489 dev_gone = B_TRUE;
2490 }
2491 } else if (sdevice->satadev_addr.qual == SATA_ADDR_DPMPORT) {
2492 if (SATA_CPORT_DEV_TYPE(sata_hba_inst, cport) !=
2493 SATA_DTYPE_PMULT || SATA_PMULT_INFO(sata_hba_inst,
2494 cport) == NULL) {
2495 dev_gone = B_TRUE;
2496 } else if (SATA_PMPORT_INFO(sata_hba_inst, cport,
2497 pmport) == NULL) {
2498 dev_gone = B_TRUE;
2499 } else {
2500 mutex_enter(&(SATA_PMPORT_MUTEX(sata_hba_inst,
2501 cport, pmport)));
2502 sdinfo = sata_get_device_info(sata_hba_inst, sdevice);
2503 if (sdinfo == NULL ||
2504 SATA_PMPORT_INFO(sata_hba_inst, cport, pmport)->
2505 pmport_tgtnode_clean == B_FALSE ||
2506 (sdinfo->satadrv_state & SATA_DSTATE_FAILED) != 0) {
2507 dev_gone = B_TRUE;
2508 }
2509 mutex_exit(&(SATA_PMPORT_MUTEX(sata_hba_inst,
2510 cport, pmport)));
2511 }
2512 }
2513
2514 if (dev_gone == B_TRUE) {
2515 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst, cport)));
2516 pkt->pkt_reason = CMD_DEV_GONE;
2517 /*
2518 * The sd target driver is checking CMD_DEV_GONE pkt_reason
2519 * only in callback function (for normal requests) and
2520 * in the dump code path.
2521 * So, if the callback is available, we need to do
2522 * the callback rather than returning TRAN_FATAL_ERROR here.
2523 */
2524 if (pkt->pkt_comp != NULL) {
2525 /* scsi callback required */
2526 if (servicing_interrupt()) {
2527 if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
2528 (task_func_t *)spx->txlt_scsi_pkt->pkt_comp,
2529 (void *)spx->txlt_scsi_pkt, TQ_NOSLEEP) ==
2530 NULL) {
2531 return (TRAN_BUSY);
2532 }
2533 } else if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
2534 (task_func_t *)spx->txlt_scsi_pkt->pkt_comp,
2535 (void *)spx->txlt_scsi_pkt, TQ_SLEEP) == NULL) {
2536 /* Scheduling the callback failed */
2537 return (TRAN_BUSY);
2538 }
2539 return (TRAN_ACCEPT);
2540 }
2541 /* No callback available */
2542 return (TRAN_FATAL_ERROR);
2543 }
2544
2545 if (sdinfo->satadrv_type & SATA_DTYPE_ATAPI) {
2546 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst, cport)));
2547 rval = sata_txlt_atapi(spx);
2548 SATADBG1(SATA_DBG_SCSI_IF, sata_hba_inst,
2549 "sata_scsi_start atapi: rval %d\n", rval);
2550 return (rval);
2551 }
2552 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst, cport)));
2553
2554 /*
2555 * Checking for power state, if it was on
2556 * STOPPED state, then the drive is not capable
2557 * of processing media access command. And
2558 * TEST_UNIT_READY, REQUEST_SENSE has special handling
2559 * in the function for different power state.
2560 */
2561 if (((sdinfo->satadrv_power_level == SATA_POWER_STANDBY) ||
2562 (sdinfo->satadrv_power_level == SATA_POWER_STOPPED)) &&
2563 (SATA_IS_MEDIUM_ACCESS_CMD(pkt->pkt_cdbp[0]))) {
2564 return (sata_txlt_check_condition(spx, KEY_NOT_READY,
2565 SD_SCSI_ASC_LU_NOT_READY));
2566 }
2567
2568 /* ATA Disk commands processing starts here */
2569
2570 bp = spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp;
2571
2572 switch (pkt->pkt_cdbp[0]) {
2573
2574 case SCMD_INQUIRY:
2575 /* Mapped to identify device */
2576 if (bp != NULL && (bp->b_flags & (B_PHYS | B_PAGEIO)))
2577 bp_mapin(bp);
2578 rval = sata_txlt_inquiry(spx);
2579 break;
2580
2581 case SCMD_TEST_UNIT_READY:
2582 /*
2583 * SAT "SATA to ATA Translation" doc specifies translation
2584 * to ATA CHECK POWER MODE.
2585 */
2586 rval = sata_txlt_test_unit_ready(spx);
2587 break;
2588
2589 case SCMD_START_STOP:
2590 /* Mapping depends on the command */
2591 rval = sata_txlt_start_stop_unit(spx);
2592 break;
2593
2594 case SCMD_READ_CAPACITY:
2595 if (bp != NULL && (bp->b_flags & (B_PHYS | B_PAGEIO)))
2596 bp_mapin(bp);
2597 rval = sata_txlt_read_capacity(spx);
2598 break;
2599
2600 case SCMD_SVC_ACTION_IN_G4: /* READ CAPACITY (16) */
2601 if (bp != NULL && (bp->b_flags & (B_PHYS | B_PAGEIO)))
2602 bp_mapin(bp);
2603 rval = sata_txlt_read_capacity16(spx);
2604 break;
2605
2606 case SCMD_REQUEST_SENSE:
2607 /*
2608 * Always No Sense, since we force ARQ
2609 */
2610 if (bp != NULL && (bp->b_flags & (B_PHYS | B_PAGEIO)))
2611 bp_mapin(bp);
2612 rval = sata_txlt_request_sense(spx);
2613 break;
2614
2615 case SCMD_LOG_SENSE_G1:
2616 if (bp != NULL && (bp->b_flags & (B_PHYS | B_PAGEIO)))
2617 bp_mapin(bp);
2618 rval = sata_txlt_log_sense(spx);
2619 break;
2620
2621 case SCMD_LOG_SELECT_G1:
2622 if (bp != NULL && (bp->b_flags & (B_PHYS | B_PAGEIO)))
2623 bp_mapin(bp);
2624 rval = sata_txlt_log_select(spx);
2625 break;
2626
2627 case SCMD_MODE_SENSE:
2628 case SCMD_MODE_SENSE_G1:
2629 if (bp != NULL && (bp->b_flags & (B_PHYS | B_PAGEIO)))
2630 bp_mapin(bp);
2631 rval = sata_txlt_mode_sense(spx);
2632 break;
2633
2634
2635 case SCMD_MODE_SELECT:
2636 case SCMD_MODE_SELECT_G1:
2637 if (bp != NULL && (bp->b_flags & (B_PHYS | B_PAGEIO)))
2638 bp_mapin(bp);
2639 rval = sata_txlt_mode_select(spx);
2640 break;
2641
2642 case SCMD_SYNCHRONIZE_CACHE:
2643 case SCMD_SYNCHRONIZE_CACHE_G1:
2644 rval = sata_txlt_synchronize_cache(spx);
2645 break;
2646
2647 case SCMD_READ:
2648 case SCMD_READ_G1:
2649 case SCMD_READ_G4:
2650 case SCMD_READ_G5:
2651 rval = sata_txlt_read(spx);
2652 break;
2653 case SCMD_WRITE_BUFFER:
2654 if (bp != NULL && (bp->b_flags & (B_PHYS | B_PAGEIO)))
2655 bp_mapin(bp);
2656 rval = sata_txlt_write_buffer(spx);
2657 break;
2658
2659 case SCMD_WRITE:
2660 case SCMD_WRITE_G1:
2661 case SCMD_WRITE_G4:
2662 case SCMD_WRITE_G5:
2663 rval = sata_txlt_write(spx);
2664 break;
2665
2666 case SCMD_SEEK:
2667 rval = sata_txlt_nodata_cmd_immediate(spx);
2668 break;
2669
2670 case SPC3_CMD_ATA_COMMAND_PASS_THROUGH12:
2671 case SPC3_CMD_ATA_COMMAND_PASS_THROUGH16:
2672 if (bp != NULL && (bp->b_flags & (B_PHYS | B_PAGEIO)))
2673 bp_mapin(bp);
2674 rval = sata_txlt_ata_pass_thru(spx);
2675 break;
2676
2677 /* Other cases will be filed later */
2678 /* postponed until phase 2 of the development */
2679 case SPC3_CMD_UNMAP:
2680 if (bp != NULL && (bp->b_flags & (B_PHYS | B_PAGEIO)))
2681 bp_mapin(bp);
2682 rval = sata_txlt_unmap(spx);
2683 break;
2684 default:
2685 rval = sata_txlt_invalid_command(spx);
2686 break;
2687 }
2688
2689 SATADBG1(SATA_DBG_SCSI_IF, sata_hba_inst,
2690 "sata_scsi_start: rval %d\n", rval);
2691
2692 return (rval);
2693 }
2694
2695 /*
2696 * Implementation of scsi tran_abort.
2697 * Abort specific pkt or all packets.
2698 *
2699 * Returns 1 if one or more packets were aborted, returns 0 otherwise
2700 *
2701 * May be called from an interrupt level.
2702 */
2703 static int
sata_scsi_abort(struct scsi_address * ap,struct scsi_pkt * scsi_pkt)2704 sata_scsi_abort(struct scsi_address *ap, struct scsi_pkt *scsi_pkt)
2705 {
2706 sata_hba_inst_t *sata_hba_inst =
2707 (sata_hba_inst_t *)(ap->a_hba_tran->tran_hba_private);
2708 sata_device_t sata_device;
2709 sata_pkt_t *sata_pkt;
2710
2711 SATADBG2(SATA_DBG_SCSI_IF, sata_hba_inst,
2712 "sata_scsi_abort: %s at target: 0x%x\n",
2713 scsi_pkt == NULL ? "all packets" : "one pkt", ap->a_target);
2714
2715 /* Validate address */
2716 if (sata_validate_scsi_address(sata_hba_inst, ap, &sata_device) != 0)
2717 /* Invalid address */
2718 return (0);
2719
2720 mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst,
2721 sata_device.satadev_addr.cport)));
2722 if (sata_get_device_info(sata_hba_inst, &sata_device) == NULL) {
2723 /* invalid address */
2724 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
2725 sata_device.satadev_addr.cport)));
2726 return (0);
2727 }
2728 if (scsi_pkt == NULL) {
2729 /*
2730 * Abort all packets.
2731 * Although we do not have specific packet, we still need
2732 * dummy packet structure to pass device address to HBA.
2733 * Allocate one, without sleeping. Fail if pkt cannot be
2734 * allocated.
2735 */
2736 sata_pkt = kmem_zalloc(sizeof (sata_pkt_t), KM_NOSLEEP);
2737 if (sata_pkt == NULL) {
2738 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
2739 sata_device.satadev_addr.cport)));
2740 SATA_LOG_D((sata_hba_inst, CE_WARN, "sata_pkt_abort: "
2741 "could not allocate sata_pkt"));
2742 return (0);
2743 }
2744 sata_pkt->satapkt_rev = SATA_PKT_REV;
2745 sata_pkt->satapkt_device = sata_device;
2746 sata_pkt->satapkt_device.satadev_rev = SATA_DEVICE_REV;
2747 } else {
2748 if (scsi_pkt->pkt_ha_private == NULL) {
2749 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
2750 sata_device.satadev_addr.cport)));
2751 return (0); /* Bad scsi pkt */
2752 }
2753 /* extract pointer to sata pkt */
2754 sata_pkt = ((sata_pkt_txlate_t *)scsi_pkt->pkt_ha_private)->
2755 txlt_sata_pkt;
2756 }
2757
2758 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
2759 sata_device.satadev_addr.cport)));
2760 /* Send abort request to HBA */
2761 if ((*SATA_ABORT_FUNC(sata_hba_inst))
2762 (SATA_DIP(sata_hba_inst), sata_pkt,
2763 scsi_pkt == NULL ? SATA_ABORT_ALL_PACKETS : SATA_ABORT_PACKET) ==
2764 SATA_SUCCESS) {
2765 if (scsi_pkt == NULL)
2766 kmem_free(sata_pkt, sizeof (sata_pkt_t));
2767 /* Success */
2768 return (1);
2769 }
2770 /* Else, something did not go right */
2771 if (scsi_pkt == NULL)
2772 kmem_free(sata_pkt, sizeof (sata_pkt_t));
2773 /* Failure */
2774 return (0);
2775 }
2776
2777
2778 /*
2779 * Implementation of scsi tran_reset.
2780 * RESET_ALL request is translated into port reset.
2781 * RESET_TARGET requests is translated into a device reset,
2782 * RESET_LUN request is accepted only for LUN 0 and translated into
2783 * device reset.
2784 * The target reset should cause all HBA active and queued packets to
2785 * be terminated and returned with pkt reason SATA_PKT_RESET prior to
2786 * the return. HBA should report reset event for the device.
2787 *
2788 * Returns 1 upon success, 0 upon failure.
2789 */
2790 static int
sata_scsi_reset(struct scsi_address * ap,int level)2791 sata_scsi_reset(struct scsi_address *ap, int level)
2792 {
2793 sata_hba_inst_t *sata_hba_inst =
2794 (sata_hba_inst_t *)(ap->a_hba_tran->tran_hba_private);
2795 sata_device_t sata_device;
2796 int val;
2797
2798 SATADBG2(SATA_DBG_SCSI_IF, sata_hba_inst,
2799 "sata_scsi_reset: level %d target: 0x%x\n",
2800 level, ap->a_target);
2801
2802 /* Validate address */
2803 val = sata_validate_scsi_address(sata_hba_inst, ap, &sata_device);
2804 if (val == -1)
2805 /* Invalid address */
2806 return (0);
2807
2808 mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst,
2809 sata_device.satadev_addr.cport)));
2810 if (sata_get_device_info(sata_hba_inst, &sata_device) == NULL) {
2811 /* invalid address */
2812 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
2813 sata_device.satadev_addr.cport)));
2814 return (0);
2815 }
2816 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
2817 sata_device.satadev_addr.cport)));
2818 if (level == RESET_ALL) {
2819 /* port reset */
2820 if (sata_device.satadev_addr.qual == SATA_ADDR_DCPORT)
2821 sata_device.satadev_addr.qual = SATA_ADDR_CPORT;
2822 else
2823 sata_device.satadev_addr.qual = SATA_ADDR_PMPORT;
2824
2825 if ((*SATA_RESET_DPORT_FUNC(sata_hba_inst))
2826 (SATA_DIP(sata_hba_inst), &sata_device) == SATA_SUCCESS)
2827 return (1);
2828 else
2829 return (0);
2830
2831 } else if (val == 0 &&
2832 (level == RESET_TARGET || level == RESET_LUN)) {
2833 /* reset device (device attached) */
2834 if ((*SATA_RESET_DPORT_FUNC(sata_hba_inst))
2835 (SATA_DIP(sata_hba_inst), &sata_device) == SATA_SUCCESS)
2836 return (1);
2837 else
2838 return (0);
2839 }
2840 return (0);
2841 }
2842
2843
2844 /*
2845 * Implementation of scsi tran_getcap (get transport/device capabilities).
2846 * Supported capabilities for SATA hard disks:
2847 * auto-rqsense (always supported)
2848 * tagged-qing (supported if HBA supports it)
2849 * untagged-qing (could be supported if disk supports it, but because
2850 * caching behavior allowing untagged queuing actually
2851 * results in reduced performance. sd tries to throttle
2852 * back to only 3 outstanding commands, which may
2853 * work for real SCSI disks, but with read ahead
2854 * caching, having more than 1 outstanding command
2855 * results in cache thrashing.)
2856 * sector_size
2857 * dma_max
2858 * interconnect-type (INTERCONNECT_SATA)
2859 *
2860 * Supported capabilities for ATAPI CD/DVD devices:
2861 * auto-rqsense (always supported)
2862 * sector_size
2863 * dma_max
2864 * max-cdb-length
2865 * interconnect-type (INTERCONNECT_SATA)
2866 *
2867 * Supported capabilities for ATAPI TAPE devices:
2868 * auto-rqsense (always supported)
2869 * dma_max
2870 * max-cdb-length
2871 *
2872 * Supported capabilities for SATA ATAPI hard disks:
2873 * auto-rqsense (always supported)
2874 * interconnect-type (INTERCONNECT_SATA)
2875 * max-cdb-length
2876 *
2877 * Request for other capabilities is rejected as unsupported.
2878 *
2879 * Returns supported capability value, or -1 if capability is unsuppported or
2880 * the address is invalid - no device.
2881 */
2882
2883 static int
sata_scsi_getcap(struct scsi_address * ap,char * cap,int whom)2884 sata_scsi_getcap(struct scsi_address *ap, char *cap, int whom)
2885 {
2886
2887 sata_hba_inst_t *sata_hba_inst =
2888 (sata_hba_inst_t *)(ap->a_hba_tran->tran_hba_private);
2889 sata_device_t sata_device;
2890 sata_drive_info_t *sdinfo;
2891 ddi_dma_attr_t adj_dma_attr;
2892 int rval;
2893
2894 SATADBG2(SATA_DBG_SCSI_IF, sata_hba_inst,
2895 "sata_scsi_getcap: target: 0x%x, cap: %s\n",
2896 ap->a_target, cap);
2897
2898 /*
2899 * We want to process the capabilities on per port granularity.
2900 * So, we are specifically restricting ourselves to whom != 0
2901 * to exclude the controller wide handling.
2902 */
2903 if (cap == NULL || whom == 0)
2904 return (-1);
2905
2906 if (sata_validate_scsi_address(sata_hba_inst, ap, &sata_device) != 0) {
2907 /* Invalid address */
2908 return (-1);
2909 }
2910 mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst,
2911 sata_device.satadev_addr.cport)));
2912 if ((sdinfo = sata_get_device_info(sata_hba_inst, &sata_device)) ==
2913 NULL) {
2914 /* invalid address */
2915 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
2916 sata_device.satadev_addr.cport)));
2917 return (-1);
2918 }
2919
2920 switch (scsi_hba_lookup_capstr(cap)) {
2921 case SCSI_CAP_ARQ:
2922 rval = 1; /* ARQ supported, turned on */
2923 break;
2924
2925 case SCSI_CAP_SECTOR_SIZE:
2926 if (sdinfo->satadrv_type == SATA_DTYPE_ATADISK)
2927 rval = SATA_DISK_SECTOR_SIZE; /* fixed size */
2928 else if (sdinfo->satadrv_type == SATA_DTYPE_ATAPICD)
2929 rval = SATA_ATAPI_SECTOR_SIZE;
2930 else rval = -1;
2931 break;
2932
2933 /*
2934 * untagged queuing cause a performance inversion because of
2935 * the way sd operates. Because of this reason we do not
2936 * use it when available.
2937 */
2938 case SCSI_CAP_UNTAGGED_QING:
2939 if (sdinfo->satadrv_features_enabled &
2940 SATA_DEV_F_E_UNTAGGED_QING)
2941 rval = 1; /* Untagged queuing available */
2942 else
2943 rval = -1; /* Untagged queuing not available */
2944 break;
2945
2946 case SCSI_CAP_TAGGED_QING:
2947 if ((sdinfo->satadrv_features_enabled &
2948 SATA_DEV_F_E_TAGGED_QING) &&
2949 (sdinfo->satadrv_max_queue_depth > 1))
2950 rval = 1; /* Tagged queuing available */
2951 else
2952 rval = -1; /* Tagged queuing not available */
2953 break;
2954
2955 case SCSI_CAP_DMA_MAX:
2956 sata_adjust_dma_attr(sdinfo, SATA_DMA_ATTR(sata_hba_inst),
2957 &adj_dma_attr);
2958 rval = (int)adj_dma_attr.dma_attr_maxxfer;
2959 /* We rely on the fact that dma_attr_maxxfer < 0x80000000 */
2960 break;
2961
2962 case SCSI_CAP_INTERCONNECT_TYPE:
2963 rval = INTERCONNECT_SATA; /* SATA interconnect type */
2964 break;
2965
2966 case SCSI_CAP_CDB_LEN:
2967 if (sdinfo->satadrv_type & SATA_DTYPE_ATAPI)
2968 rval = sdinfo->satadrv_atapi_cdb_len;
2969 else
2970 rval = -1;
2971 break;
2972
2973 default:
2974 rval = -1;
2975 break;
2976 }
2977 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
2978 sata_device.satadev_addr.cport)));
2979 return (rval);
2980 }
2981
2982 /*
2983 * Implementation of scsi tran_setcap
2984 *
2985 * Only SCSI_CAP_UNTAGGED_QING and SCSI_CAP_TAGGED_QING are changeable.
2986 *
2987 */
2988 static int
sata_scsi_setcap(struct scsi_address * ap,char * cap,int value,int whom)2989 sata_scsi_setcap(struct scsi_address *ap, char *cap, int value, int whom)
2990 {
2991 sata_hba_inst_t *sata_hba_inst =
2992 (sata_hba_inst_t *)(ap->a_hba_tran->tran_hba_private);
2993 sata_device_t sata_device;
2994 sata_drive_info_t *sdinfo;
2995 int rval;
2996
2997 SATADBG2(SATA_DBG_SCSI_IF, sata_hba_inst,
2998 "sata_scsi_setcap: target: 0x%x, cap: %s\n", ap->a_target, cap);
2999
3000 /*
3001 * We want to process the capabilities on per port granularity.
3002 * So, we are specifically restricting ourselves to whom != 0
3003 * to exclude the controller wide handling.
3004 */
3005 if (cap == NULL || whom == 0) {
3006 return (-1);
3007 }
3008
3009 if (sata_validate_scsi_address(sata_hba_inst, ap, &sata_device) != 0) {
3010 /* Invalid address */
3011 return (-1);
3012 }
3013 mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst,
3014 sata_device.satadev_addr.cport)));
3015 if ((sdinfo = sata_get_device_info(sata_hba_inst,
3016 &sata_device)) == NULL) {
3017 /* invalid address */
3018 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
3019 sata_device.satadev_addr.cport)));
3020 return (-1);
3021 }
3022 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
3023 sata_device.satadev_addr.cport)));
3024
3025 switch (scsi_hba_lookup_capstr(cap)) {
3026 case SCSI_CAP_ARQ:
3027 case SCSI_CAP_SECTOR_SIZE:
3028 case SCSI_CAP_DMA_MAX:
3029 case SCSI_CAP_INTERCONNECT_TYPE:
3030 rval = 0;
3031 break;
3032 case SCSI_CAP_UNTAGGED_QING:
3033 if (SATA_QDEPTH(sata_hba_inst) > 1) {
3034 rval = 1;
3035 if (value == 1) {
3036 sdinfo->satadrv_features_enabled |=
3037 SATA_DEV_F_E_UNTAGGED_QING;
3038 } else if (value == 0) {
3039 sdinfo->satadrv_features_enabled &=
3040 ~SATA_DEV_F_E_UNTAGGED_QING;
3041 } else {
3042 rval = -1;
3043 }
3044 } else {
3045 rval = 0;
3046 }
3047 break;
3048 case SCSI_CAP_TAGGED_QING:
3049 /* This can TCQ or NCQ */
3050 if (sata_func_enable & SATA_ENABLE_QUEUING &&
3051 ((sdinfo->satadrv_features_support & SATA_DEV_F_TCQ &&
3052 SATA_FEATURES(sata_hba_inst) & SATA_CTLF_QCMD) ||
3053 (sata_func_enable & SATA_ENABLE_NCQ &&
3054 sdinfo->satadrv_features_support & SATA_DEV_F_NCQ &&
3055 SATA_FEATURES(sata_hba_inst) & SATA_CTLF_NCQ)) &&
3056 (sdinfo->satadrv_max_queue_depth > 1)) {
3057 rval = 1;
3058 if (value == 1) {
3059 sdinfo->satadrv_features_enabled |=
3060 SATA_DEV_F_E_TAGGED_QING;
3061 } else if (value == 0) {
3062 sdinfo->satadrv_features_enabled &=
3063 ~SATA_DEV_F_E_TAGGED_QING;
3064 } else {
3065 rval = -1;
3066 }
3067 } else {
3068 rval = 0;
3069 }
3070 break;
3071 default:
3072 rval = -1;
3073 break;
3074 }
3075 return (rval);
3076 }
3077
3078 /*
3079 * Implementations of scsi tran_destroy_pkt.
3080 * Free resources allocated by sata_scsi_init_pkt()
3081 */
3082 static void
sata_scsi_destroy_pkt(struct scsi_address * ap,struct scsi_pkt * pkt)3083 sata_scsi_destroy_pkt(struct scsi_address *ap, struct scsi_pkt *pkt)
3084 {
3085 sata_pkt_txlate_t *spx;
3086
3087 spx = (sata_pkt_txlate_t *)pkt->pkt_ha_private;
3088
3089 sata_common_free_dma_rsrcs(spx);
3090
3091 spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp = NULL;
3092 sata_pkt_free(spx);
3093
3094 scsi_hba_pkt_free(ap, pkt);
3095 }
3096
3097 /*
3098 * Implementation of scsi tran_dmafree.
3099 * Free DMA resources allocated by sata_scsi_init_pkt()
3100 */
3101
3102 static void
sata_scsi_dmafree(struct scsi_address * ap,struct scsi_pkt * pkt)3103 sata_scsi_dmafree(struct scsi_address *ap, struct scsi_pkt *pkt)
3104 {
3105 #ifndef __lock_lint
3106 _NOTE(ARGUNUSED(ap))
3107 #endif
3108 sata_pkt_txlate_t *spx;
3109
3110 ASSERT(pkt != NULL);
3111 spx = (sata_pkt_txlate_t *)pkt->pkt_ha_private;
3112
3113 sata_common_free_dma_rsrcs(spx);
3114 }
3115
3116 /*
3117 * Implementation of scsi tran_sync_pkt.
3118 *
3119 * The assumption below is that pkt is unique - there is no need to check ap
3120 *
3121 * Synchronize DMA buffer and, if the intermediate buffer is used, copy data
3122 * into/from the real buffer.
3123 */
3124 static void
sata_scsi_sync_pkt(struct scsi_address * ap,struct scsi_pkt * pkt)3125 sata_scsi_sync_pkt(struct scsi_address *ap, struct scsi_pkt *pkt)
3126 {
3127 #ifndef __lock_lint
3128 _NOTE(ARGUNUSED(ap))
3129 #endif
3130 int rval;
3131 sata_pkt_txlate_t *spx = (sata_pkt_txlate_t *)pkt->pkt_ha_private;
3132 struct buf *bp;
3133 int direction;
3134
3135 ASSERT(spx != NULL);
3136 if (spx->txlt_buf_dma_handle != NULL) {
3137 direction = spx->txlt_sata_pkt->
3138 satapkt_cmd.satacmd_flags.sata_data_direction;
3139 if (spx->txlt_sata_pkt != NULL &&
3140 direction != SATA_DIR_NODATA_XFER) {
3141 if (spx->txlt_tmp_buf != NULL) {
3142 /* Intermediate DMA buffer used */
3143 bp = spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp;
3144
3145 if (direction & SATA_DIR_WRITE) {
3146 bcopy(bp->b_un.b_addr,
3147 spx->txlt_tmp_buf, bp->b_bcount);
3148 }
3149 }
3150 /* Sync the buffer for device or for CPU */
3151 rval = ddi_dma_sync(spx->txlt_buf_dma_handle, 0, 0,
3152 (direction & SATA_DIR_WRITE) ?
3153 DDI_DMA_SYNC_FORDEV : DDI_DMA_SYNC_FORCPU);
3154 ASSERT(rval == DDI_SUCCESS);
3155 if (spx->txlt_tmp_buf != NULL &&
3156 !(direction & SATA_DIR_WRITE)) {
3157 /* Intermediate DMA buffer used for read */
3158 bcopy(spx->txlt_tmp_buf,
3159 bp->b_un.b_addr, bp->b_bcount);
3160 }
3161
3162 }
3163 }
3164 }
3165
3166
3167
3168 /* ******************* SATA - SCSI Translation functions **************** */
3169 /*
3170 * SCSI to SATA pkt and command translation and SATA to SCSI status/error
3171 * translation.
3172 */
3173
3174 /*
3175 * Checks if a device exists and can be access and translates common
3176 * scsi_pkt data to sata_pkt data.
3177 *
3178 * Flag argument indicates that a non-read/write ATA command may be sent
3179 * to HBA in arbitrary SYNC mode to execute this packet.
3180 *
3181 * Returns TRAN_ACCEPT and scsi pkt_reason CMD_CMPLT if device exists and
3182 * sata_pkt was set-up.
3183 * Returns TRAN_ACCEPT and scsi pkt_reason CMD_DEV_GONE if device does not
3184 * exist and pkt_comp callback was scheduled.
3185 * Returns other TRAN_XXXXX values when error occured and command should be
3186 * rejected with the returned TRAN_XXXXX value.
3187 *
3188 * This function should be called with port mutex held.
3189 */
3190 static int
sata_txlt_generic_pkt_info(sata_pkt_txlate_t * spx,int * reason,int flag)3191 sata_txlt_generic_pkt_info(sata_pkt_txlate_t *spx, int *reason, int flag)
3192 {
3193 sata_drive_info_t *sdinfo;
3194 sata_device_t sata_device;
3195 const struct sata_cmd_flags sata_initial_cmd_flags = {
3196 SATA_DIR_NODATA_XFER,
3197 /* all other values to 0/FALSE */
3198 };
3199 /*
3200 * Pkt_reason has to be set if the pkt_comp callback is invoked,
3201 * and that implies TRAN_ACCEPT return value. Any other returned value
3202 * indicates that the scsi packet was not accepted (the reason will not
3203 * be checked by the scsi target driver).
3204 * To make debugging easier, we set pkt_reason to know value here.
3205 * It may be changed later when different completion reason is
3206 * determined.
3207 */
3208 spx->txlt_scsi_pkt->pkt_reason = CMD_TRAN_ERR;
3209 *reason = CMD_TRAN_ERR;
3210
3211 /* Validate address */
3212 switch (sata_validate_scsi_address(spx->txlt_sata_hba_inst,
3213 &spx->txlt_scsi_pkt->pkt_address, &sata_device)) {
3214
3215 case -1:
3216 /* Invalid address or invalid device type */
3217 return (TRAN_BADPKT);
3218 case 2:
3219 /*
3220 * Valid address but device type is unknown - Chack if it is
3221 * in the reset state and therefore in an indeterminate state.
3222 */
3223 sdinfo = sata_get_device_info(spx->txlt_sata_hba_inst,
3224 &spx->txlt_sata_pkt->satapkt_device);
3225 if (sdinfo != NULL && (sdinfo->satadrv_event_flags &
3226 (SATA_EVNT_DEVICE_RESET |
3227 SATA_EVNT_INPROC_DEVICE_RESET)) != 0) {
3228 if (!ddi_in_panic()) {
3229 spx->txlt_scsi_pkt->pkt_reason = CMD_INCOMPLETE;
3230 *reason = CMD_INCOMPLETE;
3231 SATADBG1(SATA_DBG_SCSI_IF,
3232 spx->txlt_sata_hba_inst,
3233 "sata_scsi_start: rejecting command "
3234 "because of device reset state\n", NULL);
3235 return (TRAN_BUSY);
3236 }
3237 }
3238 /* FALLTHROUGH */
3239 case 1:
3240 /* valid address but no valid device - it has disappeared */
3241 spx->txlt_scsi_pkt->pkt_reason = CMD_DEV_GONE;
3242 *reason = CMD_DEV_GONE;
3243 /*
3244 * The sd target driver is checking CMD_DEV_GONE pkt_reason
3245 * only in callback function (for normal requests) and
3246 * in the dump code path.
3247 * So, if the callback is available, we need to do
3248 * the callback rather than returning TRAN_FATAL_ERROR here.
3249 */
3250 if (spx->txlt_scsi_pkt->pkt_comp != NULL) {
3251 /* scsi callback required */
3252 if (servicing_interrupt()) {
3253 if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
3254 (task_func_t *)spx->txlt_scsi_pkt->pkt_comp,
3255 (void *)spx->txlt_scsi_pkt, TQ_NOSLEEP) ==
3256 NULL) {
3257 return (TRAN_BUSY);
3258 }
3259 } else if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
3260 (task_func_t *)spx->txlt_scsi_pkt->pkt_comp,
3261 (void *)spx->txlt_scsi_pkt, TQ_SLEEP) == NULL) {
3262 /* Scheduling the callback failed */
3263 return (TRAN_BUSY);
3264 }
3265
3266 return (TRAN_ACCEPT);
3267 }
3268 return (TRAN_FATAL_ERROR);
3269 default:
3270 /* all OK; pkt reason will be overwritten later */
3271 break;
3272 }
3273 /*
3274 * If pkt is to be executed in polling mode and a command will not be
3275 * emulated in SATA module (requires sending a non-read/write ATA
3276 * command to HBA driver in arbitrary SYNC mode) and we are in the
3277 * interrupt context and not in the panic dump, then reject the packet
3278 * to avoid a possible interrupt stack overrun or hang caused by
3279 * a potentially blocked interrupt.
3280 */
3281 if (((spx->txlt_scsi_pkt->pkt_flags & FLAG_NOINTR) != 0 || flag != 0) &&
3282 servicing_interrupt() && !ddi_in_panic()) {
3283 SATADBG1(SATA_DBG_INTR_CTX, spx->txlt_sata_hba_inst,
3284 "sata_scsi_start: rejecting synchronous command because "
3285 "of interrupt context\n", NULL);
3286 return (TRAN_BUSY);
3287 }
3288
3289 sdinfo = sata_get_device_info(spx->txlt_sata_hba_inst,
3290 &spx->txlt_sata_pkt->satapkt_device);
3291
3292 /*
3293 * If device is in reset condition, reject the packet with
3294 * TRAN_BUSY, unless:
3295 * 1. system is panicking (dumping)
3296 * In such case only one thread is running and there is no way to
3297 * process reset.
3298 * 2. cfgadm operation is is progress (internal APCTL lock is set)
3299 * Some cfgadm operations involve drive commands, so reset condition
3300 * needs to be ignored for IOCTL operations.
3301 */
3302 if ((sdinfo->satadrv_event_flags &
3303 (SATA_EVNT_DEVICE_RESET | SATA_EVNT_INPROC_DEVICE_RESET)) != 0) {
3304
3305 if (!ddi_in_panic() &&
3306 ((SATA_CPORT_EVENT_FLAGS(spx->txlt_sata_hba_inst,
3307 sata_device.satadev_addr.cport) &
3308 SATA_APCTL_LOCK_PORT_BUSY) == 0)) {
3309 spx->txlt_scsi_pkt->pkt_reason = CMD_INCOMPLETE;
3310 *reason = CMD_INCOMPLETE;
3311 SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
3312 "sata_scsi_start: rejecting command because "
3313 "of device reset state\n", NULL);
3314 return (TRAN_BUSY);
3315 }
3316 }
3317
3318 /*
3319 * Fix the dev_type in the sata_pkt->satapkt_device. It was not set by
3320 * sata_scsi_pkt_init() because pkt init had to work also with
3321 * non-existing devices.
3322 * Now we know that the packet was set-up for a real device, so its
3323 * type is known.
3324 */
3325 spx->txlt_sata_pkt->satapkt_device.satadev_type = sdinfo->satadrv_type;
3326
3327 spx->txlt_sata_pkt->satapkt_cmd.satacmd_flags = sata_initial_cmd_flags;
3328 if ((SATA_CPORT_INFO(spx->txlt_sata_hba_inst,
3329 sata_device.satadev_addr.cport)->cport_event_flags &
3330 SATA_APCTL_LOCK_PORT_BUSY) != 0) {
3331 spx->txlt_sata_pkt->satapkt_cmd.satacmd_flags.
3332 sata_ignore_dev_reset = B_TRUE;
3333 }
3334 /*
3335 * At this point the generic translation routine determined that the
3336 * scsi packet should be accepted. Packet completion reason may be
3337 * changed later when a different completion reason is determined.
3338 */
3339 spx->txlt_scsi_pkt->pkt_reason = CMD_CMPLT;
3340 *reason = CMD_CMPLT;
3341
3342 if ((spx->txlt_scsi_pkt->pkt_flags & FLAG_NOINTR) != 0) {
3343 /* Synchronous execution */
3344 spx->txlt_sata_pkt->satapkt_op_mode = SATA_OPMODE_SYNCH |
3345 SATA_OPMODE_POLLING;
3346 spx->txlt_sata_pkt->satapkt_cmd.satacmd_flags.
3347 sata_ignore_dev_reset = ddi_in_panic();
3348 } else {
3349 /* Asynchronous execution */
3350 spx->txlt_sata_pkt->satapkt_op_mode = SATA_OPMODE_ASYNCH |
3351 SATA_OPMODE_INTERRUPTS;
3352 }
3353 /* Convert queuing information */
3354 if (spx->txlt_scsi_pkt->pkt_flags & FLAG_STAG)
3355 spx->txlt_sata_pkt->satapkt_cmd.satacmd_flags.sata_queue_stag =
3356 B_TRUE;
3357 else if (spx->txlt_scsi_pkt->pkt_flags &
3358 (FLAG_OTAG | FLAG_HTAG | FLAG_HEAD))
3359 spx->txlt_sata_pkt->satapkt_cmd.satacmd_flags.sata_queue_otag =
3360 B_TRUE;
3361
3362 /* Always limit pkt time */
3363 if (spx->txlt_scsi_pkt->pkt_time == 0)
3364 spx->txlt_sata_pkt->satapkt_time = sata_default_pkt_time;
3365 else
3366 /* Pass on scsi_pkt time */
3367 spx->txlt_sata_pkt->satapkt_time =
3368 spx->txlt_scsi_pkt->pkt_time;
3369
3370 return (TRAN_ACCEPT);
3371 }
3372
3373
3374 /*
3375 * Translate ATA Identify Device data to SCSI Inquiry data.
3376 * This function may be called only for ATA devices.
3377 * This function should not be called for ATAPI devices - they
3378 * respond directly to SCSI Inquiry command.
3379 *
3380 * SATA Identify Device data has to be valid in sata_drive_info.
3381 * Buffer has to accomodate the inquiry length (36 bytes).
3382 *
3383 * This function should be called with a port mutex held.
3384 */
3385 static void
sata_identdev_to_inquiry(sata_hba_inst_t * sata_hba_inst,sata_drive_info_t * sdinfo,uint8_t * buf)3386 sata_identdev_to_inquiry(sata_hba_inst_t *sata_hba_inst,
3387 sata_drive_info_t *sdinfo, uint8_t *buf)
3388 {
3389
3390 struct scsi_inquiry *inq = (struct scsi_inquiry *)buf;
3391 struct sata_id *sid = &sdinfo->satadrv_id;
3392
3393 /* Start with a nice clean slate */
3394 bzero((void *)inq, sizeof (struct scsi_inquiry));
3395
3396 /*
3397 * Rely on the dev_type for setting paripheral qualifier.
3398 * Assume that DTYPE_RODIRECT applies to CD/DVD R/W devices.
3399 * It could be that DTYPE_OPTICAL could also qualify in the future.
3400 * ATAPI Inquiry may provide more data to the target driver.
3401 */
3402 inq->inq_dtype = sdinfo->satadrv_type == SATA_DTYPE_ATADISK ?
3403 DTYPE_DIRECT : DTYPE_RODIRECT; /* DTYPE_UNKNOWN; */
3404
3405 /* CFA type device is not a removable media device */
3406 inq->inq_rmb = ((sid->ai_config != SATA_CFA_TYPE) &&
3407 (sid->ai_config & SATA_REM_MEDIA)) ? 1 : 0;
3408 inq->inq_qual = 0; /* Device type qualifier (obsolete in SCSI3? */
3409 inq->inq_iso = 0; /* ISO version */
3410 inq->inq_ecma = 0; /* ECMA version */
3411 inq->inq_ansi = 3; /* ANSI version - SCSI 3 */
3412 inq->inq_aenc = 0; /* Async event notification cap. */
3413 inq->inq_trmiop = 0; /* Supports TERMINATE I/O PROC msg - NO */
3414 inq->inq_normaca = 0; /* setting NACA bit supported - NO */
3415 inq->inq_rdf = RDF_SCSI2; /* Response data format- SPC-3 */
3416 inq->inq_len = 31; /* Additional length */
3417 inq->inq_dualp = 0; /* dual port device - NO */
3418 inq->inq_reladdr = 0; /* Supports relative addressing - NO */
3419 inq->inq_sync = 0; /* Supports synchronous data xfers - NO */
3420 inq->inq_linked = 0; /* Supports linked commands - NO */
3421 /*
3422 * Queuing support - controller has to
3423 * support some sort of command queuing.
3424 */
3425 if (SATA_QDEPTH(sata_hba_inst) > 1)
3426 inq->inq_cmdque = 1; /* Supports command queueing - YES */
3427 else
3428 inq->inq_cmdque = 0; /* Supports command queueing - NO */
3429 inq->inq_sftre = 0; /* Supports Soft Reset option - NO ??? */
3430 inq->inq_wbus32 = 0; /* Supports 32 bit wide data xfers - NO */
3431 inq->inq_wbus16 = 0; /* Supports 16 bit wide data xfers - NO */
3432
3433 #ifdef _LITTLE_ENDIAN
3434 /* Swap text fields to match SCSI format */
3435 bcopy("ATA ", inq->inq_vid, 8); /* Vendor ID */
3436 swab(sid->ai_model, inq->inq_pid, 16); /* Product ID */
3437 if (strncmp(&sid->ai_fw[4], " ", 4) == 0)
3438 swab(sid->ai_fw, inq->inq_revision, 4); /* Revision level */
3439 else
3440 swab(&sid->ai_fw[4], inq->inq_revision, 4); /* Rev. level */
3441 #else /* _LITTLE_ENDIAN */
3442 bcopy("ATA ", inq->inq_vid, 8); /* Vendor ID */
3443 bcopy(sid->ai_model, inq->inq_pid, 16); /* Product ID */
3444 if (strncmp(&sid->ai_fw[4], " ", 4) == 0)
3445 bcopy(sid->ai_fw, inq->inq_revision, 4); /* Revision level */
3446 else
3447 bcopy(&sid->ai_fw[4], inq->inq_revision, 4); /* Rev. level */
3448 #endif /* _LITTLE_ENDIAN */
3449 }
3450
3451
3452 /*
3453 * Scsi response set up for invalid command (command not supported)
3454 *
3455 * Returns TRAN_ACCEPT and appropriate values in scsi_pkt fields.
3456 */
3457 static int
sata_txlt_invalid_command(sata_pkt_txlate_t * spx)3458 sata_txlt_invalid_command(sata_pkt_txlate_t *spx)
3459 {
3460 struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
3461 struct scsi_extended_sense *sense;
3462
3463 scsipkt->pkt_reason = CMD_CMPLT;
3464 scsipkt->pkt_state = STATE_GOT_BUS | STATE_GOT_TARGET |
3465 STATE_SENT_CMD | STATE_GOT_STATUS;
3466
3467 *scsipkt->pkt_scbp = STATUS_CHECK;
3468
3469 sense = sata_arq_sense(spx);
3470 sense->es_key = KEY_ILLEGAL_REQUEST;
3471 sense->es_add_code = SD_SCSI_ASC_INVALID_COMMAND_CODE;
3472
3473 SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
3474 "Scsi_pkt completion reason %x\n", scsipkt->pkt_reason);
3475
3476 if ((scsipkt->pkt_flags & FLAG_NOINTR) == 0 &&
3477 scsipkt->pkt_comp != NULL) {
3478 /* scsi callback required */
3479 if (servicing_interrupt()) {
3480 if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
3481 (task_func_t *)spx->txlt_scsi_pkt->pkt_comp,
3482 (void *)spx->txlt_scsi_pkt, TQ_NOSLEEP) == NULL) {
3483 return (TRAN_BUSY);
3484 }
3485 } else if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
3486 (task_func_t *)spx->txlt_scsi_pkt->pkt_comp,
3487 (void *)spx->txlt_scsi_pkt, TQ_SLEEP) == NULL) {
3488 /* Scheduling the callback failed */
3489 return (TRAN_BUSY);
3490 }
3491 }
3492 return (TRAN_ACCEPT);
3493 }
3494
3495 /*
3496 * Scsi response set up for check condition with special sense key
3497 * and additional sense code.
3498 *
3499 * Returns TRAN_ACCEPT and appropriate values in scsi_pkt fields.
3500 */
3501 static int
sata_txlt_check_condition(sata_pkt_txlate_t * spx,uchar_t key,uchar_t code)3502 sata_txlt_check_condition(sata_pkt_txlate_t *spx, uchar_t key, uchar_t code)
3503 {
3504 sata_hba_inst_t *shi = SATA_TXLT_HBA_INST(spx);
3505 int cport = SATA_TXLT_CPORT(spx);
3506 struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
3507 struct scsi_extended_sense *sense;
3508
3509 mutex_enter(&SATA_CPORT_MUTEX(shi, cport));
3510 scsipkt->pkt_reason = CMD_CMPLT;
3511 scsipkt->pkt_state = STATE_GOT_BUS | STATE_GOT_TARGET |
3512 STATE_SENT_CMD | STATE_GOT_STATUS;
3513
3514 *scsipkt->pkt_scbp = STATUS_CHECK;
3515
3516 sense = sata_arq_sense(spx);
3517 sense->es_key = key;
3518 sense->es_add_code = code;
3519
3520 mutex_exit(&SATA_CPORT_MUTEX(shi, cport));
3521
3522 SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
3523 "Scsi_pkt completion reason %x\n", scsipkt->pkt_reason);
3524
3525 if ((scsipkt->pkt_flags & FLAG_NOINTR) == 0 &&
3526 scsipkt->pkt_comp != NULL) {
3527 /* scsi callback required */
3528 if (servicing_interrupt()) {
3529 if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
3530 (task_func_t *)spx->txlt_scsi_pkt->pkt_comp,
3531 (void *)spx->txlt_scsi_pkt, TQ_NOSLEEP) == NULL) {
3532 return (TRAN_BUSY);
3533 }
3534 } else if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
3535 (task_func_t *)spx->txlt_scsi_pkt->pkt_comp,
3536 (void *)spx->txlt_scsi_pkt, TQ_SLEEP) == NULL) {
3537 /* Scheduling the callback failed */
3538 return (TRAN_BUSY);
3539 }
3540 }
3541 return (TRAN_ACCEPT);
3542 }
3543
3544 /*
3545 * Scsi response setup for
3546 * emulated non-data command that requires no action/return data
3547 *
3548 * Returns TRAN_ACCEPT and appropriate values in scsi_pkt fields.
3549 */
3550 static int
sata_txlt_nodata_cmd_immediate(sata_pkt_txlate_t * spx)3551 sata_txlt_nodata_cmd_immediate(sata_pkt_txlate_t *spx)
3552 {
3553 int rval;
3554 int reason;
3555 kmutex_t *cport_mutex = &(SATA_TXLT_CPORT_MUTEX(spx));
3556
3557 mutex_enter(cport_mutex);
3558
3559 if (((rval = sata_txlt_generic_pkt_info(spx, &reason, 0)) !=
3560 TRAN_ACCEPT) || (reason == CMD_DEV_GONE)) {
3561 mutex_exit(cport_mutex);
3562 return (rval);
3563 }
3564 mutex_exit(cport_mutex);
3565
3566 spx->txlt_scsi_pkt->pkt_state = STATE_GOT_BUS | STATE_GOT_TARGET |
3567 STATE_SENT_CMD | STATE_GOT_STATUS;
3568 spx->txlt_scsi_pkt->pkt_reason = CMD_CMPLT;
3569 *(spx->txlt_scsi_pkt->pkt_scbp) = STATUS_GOOD;
3570
3571 SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
3572 "Scsi_pkt completion reason %x\n",
3573 spx->txlt_scsi_pkt->pkt_reason);
3574
3575 if ((spx->txlt_scsi_pkt->pkt_flags & FLAG_NOINTR) == 0 &&
3576 spx->txlt_scsi_pkt->pkt_comp != NULL) {
3577 /* scsi callback required */
3578 if (servicing_interrupt()) {
3579 if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
3580 (task_func_t *)spx->txlt_scsi_pkt->pkt_comp,
3581 (void *)spx->txlt_scsi_pkt, TQ_NOSLEEP) == NULL) {
3582 return (TRAN_BUSY);
3583 }
3584 } else if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
3585 (task_func_t *)spx->txlt_scsi_pkt->pkt_comp,
3586 (void *)spx->txlt_scsi_pkt, TQ_SLEEP) == NULL) {
3587 /* Scheduling the callback failed */
3588 return (TRAN_BUSY);
3589 }
3590 }
3591 return (TRAN_ACCEPT);
3592 }
3593
3594
3595 /*
3596 * SATA translate command: Inquiry / Identify Device
3597 * Use cached Identify Device data for now, rather than issuing actual
3598 * Device Identify cmd request. If device is detached and re-attached,
3599 * asynchronous event processing should fetch and refresh Identify Device
3600 * data.
3601 * VPD pages supported now:
3602 * Vital Product Data page
3603 * Unit Serial Number page
3604 * Block Device Characteristics Page
3605 * ATA Information Page
3606 *
3607 * Returns TRAN_ACCEPT and appropriate values in scsi_pkt fields.
3608 */
3609
3610 #define EVPD 1 /* Extended Vital Product Data flag */
3611 #define CMDDT 2 /* Command Support Data - Obsolete */
3612 #define INQUIRY_SUP_VPD_PAGE 0 /* Supported VPD Pages Page Code */
3613 #define INQUIRY_USN_PAGE 0x80 /* Unit Serial Number Page Code */
3614 #define INQUIRY_BDC_PAGE 0xB1 /* Block Device Characteristics Page */
3615 /* Code */
3616 #define INQUIRY_ATA_INFO_PAGE 0x89 /* ATA Information Page Code */
3617 #define INQUIRY_DEV_IDENTIFICATION_PAGE 0x83 /* Not needed yet */
3618
3619 static int
sata_txlt_inquiry(sata_pkt_txlate_t * spx)3620 sata_txlt_inquiry(sata_pkt_txlate_t *spx)
3621 {
3622 struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
3623 struct buf *bp = spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp;
3624 sata_drive_info_t *sdinfo;
3625 struct scsi_extended_sense *sense;
3626 int count;
3627 uint8_t *p;
3628 int i, j;
3629 uint8_t page_buf[1024]; /* Max length */
3630 int rval, reason;
3631 ushort_t rate;
3632 kmutex_t *cport_mutex = &(SATA_TXLT_CPORT_MUTEX(spx));
3633
3634 mutex_enter(cport_mutex);
3635
3636 if (((rval = sata_txlt_generic_pkt_info(spx, &reason, 0)) !=
3637 TRAN_ACCEPT) || (reason == CMD_DEV_GONE)) {
3638 mutex_exit(cport_mutex);
3639 return (rval);
3640 }
3641
3642 sdinfo = sata_get_device_info(spx->txlt_sata_hba_inst,
3643 &spx->txlt_sata_pkt->satapkt_device);
3644
3645 ASSERT(sdinfo != NULL);
3646
3647 scsipkt->pkt_reason = CMD_CMPLT;
3648 scsipkt->pkt_state = STATE_GOT_BUS | STATE_GOT_TARGET |
3649 STATE_SENT_CMD | STATE_GOT_STATUS;
3650
3651 /* Reject not supported request */
3652 if (scsipkt->pkt_cdbp[1] & CMDDT) { /* No support for this bit */
3653 *scsipkt->pkt_scbp = STATUS_CHECK;
3654 sense = sata_arq_sense(spx);
3655 sense->es_key = KEY_ILLEGAL_REQUEST;
3656 sense->es_add_code = SD_SCSI_ASC_INVALID_FIELD_IN_CDB;
3657 goto done;
3658 }
3659
3660 /* Valid Inquiry request */
3661 *scsipkt->pkt_scbp = STATUS_GOOD;
3662
3663 if (bp != NULL && bp->b_un.b_addr && bp->b_bcount) {
3664
3665 /*
3666 * Because it is fully emulated command storing data
3667 * programatically in the specified buffer, release
3668 * preallocated DMA resources before storing data in the buffer,
3669 * so no unwanted DMA sync would take place.
3670 */
3671 sata_scsi_dmafree(NULL, scsipkt);
3672
3673 if (!(scsipkt->pkt_cdbp[1] & EVPD)) {
3674 /* Standard Inquiry Data request */
3675 struct scsi_inquiry inq;
3676 unsigned int bufsize;
3677
3678 sata_identdev_to_inquiry(spx->txlt_sata_hba_inst,
3679 sdinfo, (uint8_t *)&inq);
3680 /* Copy no more than requested */
3681 count = MIN(bp->b_bcount,
3682 sizeof (struct scsi_inquiry));
3683 bufsize = scsipkt->pkt_cdbp[4];
3684 bufsize |= scsipkt->pkt_cdbp[3] << 8;
3685 count = MIN(count, bufsize);
3686 bcopy(&inq, bp->b_un.b_addr, count);
3687
3688 scsipkt->pkt_state |= STATE_XFERRED_DATA;
3689 scsipkt->pkt_resid = scsipkt->pkt_cdbp[4] > count ?
3690 bufsize - count : 0;
3691 } else {
3692 /*
3693 * peripheral_qualifier = 0;
3694 *
3695 * We are dealing only with HD and will be
3696 * dealing with CD/DVD devices soon
3697 */
3698 uint8_t peripheral_device_type =
3699 sdinfo->satadrv_type == SATA_DTYPE_ATADISK ?
3700 DTYPE_DIRECT : DTYPE_RODIRECT;
3701
3702 bzero(page_buf, sizeof (page_buf));
3703
3704 switch ((uint_t)scsipkt->pkt_cdbp[2]) {
3705 case INQUIRY_SUP_VPD_PAGE:
3706 /*
3707 * Request for supported Vital Product Data
3708 * pages.
3709 */
3710 page_buf[0] = peripheral_device_type;
3711 page_buf[1] = INQUIRY_SUP_VPD_PAGE;
3712 page_buf[2] = 0;
3713 page_buf[3] = 4; /* page length */
3714 page_buf[4] = INQUIRY_SUP_VPD_PAGE;
3715 page_buf[5] = INQUIRY_USN_PAGE;
3716 page_buf[6] = INQUIRY_BDC_PAGE;
3717 page_buf[7] = INQUIRY_ATA_INFO_PAGE;
3718 /* Copy no more than requested */
3719 count = MIN(bp->b_bcount, 8);
3720 bcopy(page_buf, bp->b_un.b_addr, count);
3721 break;
3722
3723 case INQUIRY_USN_PAGE:
3724 /*
3725 * Request for Unit Serial Number page.
3726 * Set-up the page.
3727 */
3728 page_buf[0] = peripheral_device_type;
3729 page_buf[1] = INQUIRY_USN_PAGE;
3730 page_buf[2] = 0;
3731 /* remaining page length */
3732 page_buf[3] = SATA_ID_SERIAL_LEN;
3733
3734 /*
3735 * Copy serial number from Identify Device data
3736 * words into the inquiry page and swap bytes
3737 * when necessary.
3738 */
3739 p = (uint8_t *)(sdinfo->satadrv_id.ai_drvser);
3740 #ifdef _LITTLE_ENDIAN
3741 swab(p, &page_buf[4], SATA_ID_SERIAL_LEN);
3742 #else
3743 bcopy(p, &page_buf[4], SATA_ID_SERIAL_LEN);
3744 #endif
3745 /*
3746 * Least significant character of the serial
3747 * number shall appear as the last byte,
3748 * according to SBC-3 spec.
3749 * Count trailing spaces to determine the
3750 * necessary shift length.
3751 */
3752 p = &page_buf[SATA_ID_SERIAL_LEN + 4 - 1];
3753 for (j = 0; j < SATA_ID_SERIAL_LEN; j++) {
3754 if (*(p - j) != '\0' &&
3755 *(p - j) != '\040')
3756 break;
3757 }
3758
3759 /*
3760 * Shift SN string right, so that the last
3761 * non-blank character would appear in last
3762 * byte of SN field in the page.
3763 * 'j' is the shift length.
3764 */
3765 for (i = 0;
3766 i < (SATA_ID_SERIAL_LEN - j) && j != 0;
3767 i++, p--)
3768 *p = *(p - j);
3769
3770 /*
3771 * Add leading spaces - same number as the
3772 * shift size
3773 */
3774 for (; j > 0; j--)
3775 page_buf[4 + j - 1] = '\040';
3776
3777 count = MIN(bp->b_bcount,
3778 SATA_ID_SERIAL_LEN + 4);
3779 bcopy(page_buf, bp->b_un.b_addr, count);
3780 break;
3781
3782 case INQUIRY_BDC_PAGE:
3783 /*
3784 * Request for Block Device Characteristics
3785 * page. Set-up the page.
3786 */
3787 page_buf[0] = peripheral_device_type;
3788 page_buf[1] = INQUIRY_BDC_PAGE;
3789 page_buf[2] = 0;
3790 /* remaining page length */
3791 page_buf[3] = SATA_ID_BDC_LEN;
3792
3793 rate = sdinfo->satadrv_id.ai_medrotrate;
3794 page_buf[4] = (rate >> 8) & 0xff;
3795 page_buf[5] = rate & 0xff;
3796 page_buf[6] = 0;
3797 page_buf[7] = sdinfo->satadrv_id.
3798 ai_nomformfactor & 0xf;
3799
3800 count = MIN(bp->b_bcount,
3801 SATA_ID_BDC_LEN + 4);
3802 bcopy(page_buf, bp->b_un.b_addr, count);
3803 break;
3804
3805 case INQUIRY_ATA_INFO_PAGE:
3806 /*
3807 * Request for ATA Information page.
3808 */
3809 page_buf[0] = peripheral_device_type;
3810 page_buf[1] = INQUIRY_ATA_INFO_PAGE;
3811 page_buf[2] = (SATA_ID_ATA_INFO_LEN >> 8) &
3812 0xff;
3813 page_buf[3] = SATA_ID_ATA_INFO_LEN & 0xff;
3814 /* page_buf[4-7] reserved */
3815 #ifdef _LITTLE_ENDIAN
3816 bcopy("ATA ", &page_buf[8], 8);
3817 swab(sdinfo->satadrv_id.ai_model,
3818 &page_buf[16], 16);
3819 if (strncmp(&sdinfo->satadrv_id.ai_fw[4],
3820 " ", 4) == 0) {
3821 swab(sdinfo->satadrv_id.ai_fw,
3822 &page_buf[32], 4);
3823 } else {
3824 swab(&sdinfo->satadrv_id.ai_fw[4],
3825 &page_buf[32], 4);
3826 }
3827 #else /* _LITTLE_ENDIAN */
3828 bcopy("ATA ", &page_buf[8], 8);
3829 bcopy(sdinfo->satadrv_id.ai_model,
3830 &page_buf[16], 16);
3831 if (strncmp(&sdinfo->satadrv_id.ai_fw[4],
3832 " ", 4) == 0) {
3833 bcopy(sdinfo->satadrv_id.ai_fw,
3834 &page_buf[32], 4);
3835 } else {
3836 bcopy(&sdinfo->satadrv_id.ai_fw[4],
3837 &page_buf[32], 4);
3838 }
3839 #endif /* _LITTLE_ENDIAN */
3840 /*
3841 * page_buf[36-55] which defines the device
3842 * signature is not defined at this
3843 * time.
3844 */
3845
3846 /* Set the command code */
3847 if (sdinfo->satadrv_type ==
3848 SATA_DTYPE_ATADISK) {
3849 page_buf[56] = SATAC_ID_DEVICE;
3850 } else if (sdinfo->satadrv_type ==
3851 SATA_DTYPE_ATAPI) {
3852 page_buf[56] = SATAC_ID_PACKET_DEVICE;
3853 }
3854 /*
3855 * If the command code, page_buf[56], is not
3856 * zero and if one of the identify commands
3857 * succeeds, return the identify data.
3858 */
3859 if ((page_buf[56] != 0) &&
3860 (sata_fetch_device_identify_data(
3861 spx->txlt_sata_hba_inst, sdinfo) ==
3862 SATA_SUCCESS)) {
3863 bcopy(&sdinfo->satadrv_id,
3864 &page_buf[60], sizeof (sata_id_t));
3865 }
3866
3867 /* Need to copy out the page_buf to bp */
3868 count = MIN(bp->b_bcount,
3869 SATA_ID_ATA_INFO_LEN + 4);
3870 bcopy(page_buf, bp->b_un.b_addr, count);
3871 break;
3872
3873 case INQUIRY_DEV_IDENTIFICATION_PAGE:
3874 /*
3875 * We may want to implement this page, when
3876 * identifiers are common for SATA devices
3877 * But not now.
3878 */
3879 /*FALLTHROUGH*/
3880
3881 default:
3882 /* Request for unsupported VPD page */
3883 *scsipkt->pkt_scbp = STATUS_CHECK;
3884 sense = sata_arq_sense(spx);
3885 sense->es_key = KEY_ILLEGAL_REQUEST;
3886 sense->es_add_code =
3887 SD_SCSI_ASC_INVALID_FIELD_IN_CDB;
3888 goto done;
3889 }
3890 }
3891 scsipkt->pkt_state |= STATE_XFERRED_DATA;
3892 scsipkt->pkt_resid = scsipkt->pkt_cdbp[4] > count ?
3893 scsipkt->pkt_cdbp[4] - count : 0;
3894 }
3895 done:
3896 mutex_exit(cport_mutex);
3897
3898 SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
3899 "Scsi_pkt completion reason %x\n",
3900 scsipkt->pkt_reason);
3901
3902 if ((scsipkt->pkt_flags & FLAG_NOINTR) == 0 &&
3903 scsipkt->pkt_comp != NULL) {
3904 /* scsi callback required */
3905 if (servicing_interrupt()) {
3906 if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
3907 (task_func_t *)spx->txlt_scsi_pkt->pkt_comp,
3908 (void *)spx->txlt_scsi_pkt, TQ_NOSLEEP) == NULL) {
3909 return (TRAN_BUSY);
3910 }
3911 } else if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
3912 (task_func_t *)spx->txlt_scsi_pkt->pkt_comp,
3913 (void *)spx->txlt_scsi_pkt, TQ_SLEEP) == NULL) {
3914 /* Scheduling the callback failed */
3915 return (TRAN_BUSY);
3916 }
3917 }
3918 return (TRAN_ACCEPT);
3919 }
3920
3921 /*
3922 * SATA translate command: Request Sense.
3923 *
3924 * Returns TRAN_ACCEPT and appropriate values in scsi_pkt fields.
3925 * At the moment this is an emulated command (ATA version for SATA hard disks).
3926 * May be translated into Check Power Mode command in the future.
3927 *
3928 * Note: There is a mismatch between already implemented Informational
3929 * Exception Mode Select page 0x1C and this function.
3930 * When MRIE bit is set in page 0x1C, Request Sense is supposed to return
3931 * NO SENSE and set additional sense code to the exception code - this is not
3932 * implemented here.
3933 */
3934 static int
sata_txlt_request_sense(sata_pkt_txlate_t * spx)3935 sata_txlt_request_sense(sata_pkt_txlate_t *spx)
3936 {
3937 struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
3938 struct scsi_extended_sense sense;
3939 struct buf *bp = spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp;
3940 sata_drive_info_t *sdinfo;
3941 sata_cmd_t *scmd = &spx->txlt_sata_pkt->satapkt_cmd;
3942 int rval, reason, power_state = 0;
3943 kmutex_t *cport_mutex;
3944
3945 cport_mutex = &(SATA_TXLT_CPORT_MUTEX(spx));
3946 mutex_enter(cport_mutex);
3947
3948 if (((rval = sata_txlt_generic_pkt_info(spx, &reason, 1)) !=
3949 TRAN_ACCEPT) || (reason == CMD_DEV_GONE)) {
3950 mutex_exit(cport_mutex);
3951 return (rval);
3952 }
3953
3954 scsipkt->pkt_reason = CMD_CMPLT;
3955 scsipkt->pkt_state = STATE_GOT_BUS | STATE_GOT_TARGET |
3956 STATE_SENT_CMD | STATE_GOT_STATUS;
3957 *scsipkt->pkt_scbp = STATUS_GOOD;
3958
3959 /*
3960 * when CONTROL field's NACA bit == 1
3961 * return ILLEGAL_REQUEST
3962 */
3963 if (scsipkt->pkt_cdbp[5] & CTL_BYTE_NACA_MASK) {
3964 mutex_exit(cport_mutex);
3965 return (sata_txlt_check_condition(spx, KEY_ILLEGAL_REQUEST,
3966 SD_SCSI_ASC_CMD_SEQUENCE_ERR));
3967 }
3968
3969 sdinfo = sata_get_device_info(spx->txlt_sata_hba_inst,
3970 &spx->txlt_sata_pkt->satapkt_device);
3971 ASSERT(sdinfo != NULL);
3972
3973 spx->txlt_sata_pkt->satapkt_op_mode |= SATA_OPMODE_SYNCH;
3974
3975 sata_build_generic_cmd(scmd, SATAC_CHECK_POWER_MODE);
3976 scmd->satacmd_flags.sata_copy_out_sec_count_lsb = B_TRUE;
3977 scmd->satacmd_flags.sata_copy_out_error_reg = B_TRUE;
3978 if (sata_hba_start(spx, &rval) != 0) {
3979 mutex_exit(cport_mutex);
3980 return (rval);
3981 }
3982 if (scmd->satacmd_error_reg != 0) {
3983 mutex_exit(cport_mutex);
3984 return (sata_txlt_check_condition(spx, KEY_NO_SENSE,
3985 SD_SCSI_ASC_NO_ADD_SENSE));
3986 }
3987
3988 switch (scmd->satacmd_sec_count_lsb) {
3989 case SATA_PWRMODE_STANDBY: /* device in standby mode */
3990 if (sdinfo->satadrv_power_level == SATA_POWER_STOPPED)
3991 power_state = SATA_POWER_STOPPED;
3992 else {
3993 power_state = SATA_POWER_STANDBY;
3994 sdinfo->satadrv_power_level = SATA_POWER_STANDBY;
3995 }
3996 break;
3997 case SATA_PWRMODE_IDLE: /* device in idle mode */
3998 power_state = SATA_POWER_IDLE;
3999 sdinfo->satadrv_power_level = SATA_POWER_IDLE;
4000 break;
4001 case SATA_PWRMODE_ACTIVE: /* device in active or idle mode */
4002 default: /* 0x40, 0x41 active mode */
4003 if (sdinfo->satadrv_power_level == SATA_POWER_IDLE)
4004 power_state = SATA_POWER_IDLE;
4005 else {
4006 power_state = SATA_POWER_ACTIVE;
4007 sdinfo->satadrv_power_level = SATA_POWER_ACTIVE;
4008 }
4009 break;
4010 }
4011
4012 mutex_exit(cport_mutex);
4013
4014 if (bp != NULL && bp->b_un.b_addr && bp->b_bcount) {
4015 /*
4016 * Because it is fully emulated command storing data
4017 * programatically in the specified buffer, release
4018 * preallocated DMA resources before storing data in the buffer,
4019 * so no unwanted DMA sync would take place.
4020 */
4021 int count = MIN(bp->b_bcount,
4022 sizeof (struct scsi_extended_sense));
4023 sata_scsi_dmafree(NULL, scsipkt);
4024 bzero(&sense, sizeof (struct scsi_extended_sense));
4025 sense.es_valid = 0; /* Valid LBA */
4026 sense.es_class = 7; /* Response code 0x70 - current err */
4027 sense.es_key = KEY_NO_SENSE;
4028 sense.es_add_len = 6; /* Additional length */
4029 /* Copy no more than requested */
4030 bcopy(&sense, bp->b_un.b_addr, count);
4031 scsipkt->pkt_state |= STATE_XFERRED_DATA;
4032 scsipkt->pkt_resid = 0;
4033 switch (power_state) {
4034 case SATA_POWER_IDLE:
4035 case SATA_POWER_STANDBY:
4036 sense.es_add_code =
4037 SD_SCSI_ASC_LOW_POWER_CONDITION_ON;
4038 break;
4039 case SATA_POWER_STOPPED:
4040 sense.es_add_code = SD_SCSI_ASC_NO_ADD_SENSE;
4041 break;
4042 case SATA_POWER_ACTIVE:
4043 default:
4044 break;
4045 }
4046 }
4047
4048 SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
4049 "Scsi_pkt completion reason %x\n",
4050 scsipkt->pkt_reason);
4051
4052 if ((scsipkt->pkt_flags & FLAG_NOINTR) == 0 &&
4053 scsipkt->pkt_comp != NULL) {
4054 /* scsi callback required */
4055 if (servicing_interrupt()) {
4056 if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
4057 (task_func_t *)spx->txlt_scsi_pkt->pkt_comp,
4058 (void *)spx->txlt_scsi_pkt, TQ_NOSLEEP) == NULL) {
4059 return (TRAN_BUSY);
4060 }
4061 } else if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
4062 (task_func_t *)spx->txlt_scsi_pkt->pkt_comp,
4063 (void *)spx->txlt_scsi_pkt, TQ_SLEEP) == NULL) {
4064 /* Scheduling the callback failed */
4065 return (TRAN_BUSY);
4066 }
4067 }
4068 return (TRAN_ACCEPT);
4069 }
4070
4071 /*
4072 * SATA translate command: Test Unit Ready
4073 * (ATA version for SATA hard disks).
4074 * It is translated into the Check Power Mode command.
4075 *
4076 * Returns TRAN_ACCEPT and appropriate values in scsi_pkt fields.
4077 */
4078 static int
sata_txlt_test_unit_ready(sata_pkt_txlate_t * spx)4079 sata_txlt_test_unit_ready(sata_pkt_txlate_t *spx)
4080 {
4081 struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
4082 struct scsi_extended_sense *sense;
4083 sata_cmd_t *scmd = &spx->txlt_sata_pkt->satapkt_cmd;
4084 sata_drive_info_t *sdinfo;
4085 int power_state;
4086 int rval, reason;
4087 kmutex_t *cport_mutex = &(SATA_TXLT_CPORT_MUTEX(spx));
4088
4089 mutex_enter(cport_mutex);
4090
4091 if (((rval = sata_txlt_generic_pkt_info(spx, &reason, 1)) !=
4092 TRAN_ACCEPT) || (reason == CMD_DEV_GONE)) {
4093 mutex_exit(cport_mutex);
4094 return (rval);
4095 }
4096
4097 sdinfo = sata_get_device_info(spx->txlt_sata_hba_inst,
4098 &spx->txlt_sata_pkt->satapkt_device);
4099 ASSERT(sdinfo != NULL);
4100
4101 spx->txlt_sata_pkt->satapkt_op_mode |= SATA_OPMODE_SYNCH;
4102
4103 /* send CHECK POWER MODE command */
4104 sata_build_generic_cmd(scmd, SATAC_CHECK_POWER_MODE);
4105 scmd->satacmd_flags.sata_copy_out_sec_count_lsb = B_TRUE;
4106 scmd->satacmd_flags.sata_copy_out_error_reg = B_TRUE;
4107 if (sata_hba_start(spx, &rval) != 0) {
4108 mutex_exit(cport_mutex);
4109 return (rval);
4110 }
4111
4112 if (scmd->satacmd_error_reg != 0) {
4113 mutex_exit(cport_mutex);
4114 return (sata_txlt_check_condition(spx, KEY_NOT_READY,
4115 SD_SCSI_ASC_LU_NOT_RESPONSE));
4116 }
4117
4118 power_state = scmd->satacmd_sec_count_lsb;
4119
4120 /*
4121 * return NOT READY when device in STOPPED mode
4122 */
4123 if (power_state == SATA_PWRMODE_STANDBY &&
4124 sdinfo->satadrv_power_level == SATA_POWER_STOPPED) {
4125 *scsipkt->pkt_scbp = STATUS_CHECK;
4126 sense = sata_arq_sense(spx);
4127 sense->es_key = KEY_NOT_READY;
4128 sense->es_add_code = SD_SCSI_ASC_LU_NOT_READY;
4129 } else {
4130 /*
4131 * For other power mode, return GOOD status
4132 */
4133 *scsipkt->pkt_scbp = STATUS_GOOD;
4134 }
4135
4136 scsipkt->pkt_reason = CMD_CMPLT;
4137 scsipkt->pkt_state = STATE_GOT_BUS | STATE_GOT_TARGET |
4138 STATE_SENT_CMD | STATE_GOT_STATUS;
4139
4140 mutex_exit(cport_mutex);
4141
4142 SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
4143 "Scsi_pkt completion reason %x\n", scsipkt->pkt_reason);
4144
4145 if ((scsipkt->pkt_flags & FLAG_NOINTR) == 0 &&
4146 scsipkt->pkt_comp != NULL) {
4147 /* scsi callback required */
4148 if (servicing_interrupt()) {
4149 if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
4150 (task_func_t *)spx->txlt_scsi_pkt->pkt_comp,
4151 (void *)spx->txlt_scsi_pkt, TQ_NOSLEEP) == NULL) {
4152 return (TRAN_BUSY);
4153 }
4154 } else if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
4155 (task_func_t *)spx->txlt_scsi_pkt->pkt_comp,
4156 (void *)spx->txlt_scsi_pkt, TQ_SLEEP) == NULL) {
4157 /* Scheduling the callback failed */
4158 return (TRAN_BUSY);
4159 }
4160 }
4161
4162 return (TRAN_ACCEPT);
4163 }
4164
4165 /*
4166 * SATA translate command: Start Stop Unit
4167 * Translation depends on a command:
4168 *
4169 * Power condition bits will be supported
4170 * and the power level should be maintained by SATL,
4171 * When SATL received a command, it will check the
4172 * power level firstly, and return the status according
4173 * to SAT2 v2.6 and SAT-2 Standby Modifications
4174 *
4175 * SPC-4/SBC-3 SATL ATA power condition SATL SPC/SBC
4176 * -----------------------------------------------------------------------
4177 * SSU_PC1 Active <==> ATA Active <==> SSU:start_bit =1
4178 * SSU_PC2 Idle <==> ATA Idle <==> N/A
4179 * SSU_PC3 Standby <==> ATA Standby <==> N/A
4180 * SSU_PC4 Stopped <==> ATA Standby <==> SSU:start_bit = 0
4181 *
4182 * Unload Media / NOT SUPPORTED YET
4183 * Load Media / NOT SUPPROTED YET
4184 * Immediate bit / NOT SUPPORTED YET (deferred error)
4185 *
4186 * Returns TRAN_ACCEPT or code returned by sata_hba_start() and
4187 * appropriate values in scsi_pkt fields.
4188 */
4189 static int
sata_txlt_start_stop_unit(sata_pkt_txlate_t * spx)4190 sata_txlt_start_stop_unit(sata_pkt_txlate_t *spx)
4191 {
4192 struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
4193 sata_cmd_t *scmd = &spx->txlt_sata_pkt->satapkt_cmd;
4194 int rval, reason;
4195 sata_drive_info_t *sdinfo;
4196 sata_id_t *sata_id;
4197 kmutex_t *cport_mutex = &(SATA_TXLT_CPORT_MUTEX(spx));
4198
4199 SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
4200 "sata_txlt_start_stop_unit: %d\n", scsipkt->pkt_scbp[4] & 1);
4201
4202 mutex_enter(cport_mutex);
4203
4204 if (((rval = sata_txlt_generic_pkt_info(spx, &reason, 1)) !=
4205 TRAN_ACCEPT) || (reason == CMD_DEV_GONE)) {
4206 mutex_exit(cport_mutex);
4207 return (rval);
4208 }
4209
4210 if (scsipkt->pkt_cdbp[1] & START_STOP_IMMED_MASK) {
4211 /* IMMED bit - not supported */
4212 mutex_exit(cport_mutex);
4213 return (sata_txlt_check_condition(spx, KEY_ILLEGAL_REQUEST,
4214 SD_SCSI_ASC_INVALID_FIELD_IN_CDB));
4215 }
4216
4217 spx->txlt_sata_pkt->satapkt_op_mode |= SATA_OPMODE_SYNCH;
4218 spx->txlt_sata_pkt->satapkt_comp = NULL;
4219
4220 sdinfo = sata_get_device_info(spx->txlt_sata_hba_inst,
4221 &spx->txlt_sata_pkt->satapkt_device);
4222 ASSERT(sdinfo != NULL);
4223 sata_id = &sdinfo->satadrv_id;
4224
4225 switch ((scsipkt->pkt_cdbp[4] & START_STOP_POWER_COND_MASK) >> 4) {
4226 case 0:
4227 if (scsipkt->pkt_cdbp[4] & START_STOP_LOEJ_MASK) {
4228 /* Load/Unload Media - invalid request */
4229 goto err_out;
4230 }
4231 if (scsipkt->pkt_cdbp[4] & START_STOP_START_MASK) {
4232 /* Start Unit */
4233 sata_build_read_verify_cmd(scmd, 1, 5);
4234 scmd->satacmd_flags.sata_copy_out_error_reg = B_TRUE;
4235 /* Transfer command to HBA */
4236 if (sata_hba_start(spx, &rval) != 0) {
4237 /* Pkt not accepted for execution */
4238 mutex_exit(cport_mutex);
4239 return (rval);
4240 }
4241 if (scmd->satacmd_error_reg != 0) {
4242 goto err_out;
4243 }
4244 sdinfo->satadrv_power_level = SATA_POWER_ACTIVE;
4245 } else {
4246 /* Stop Unit */
4247 sata_build_generic_cmd(scmd, SATAC_FLUSH_CACHE);
4248 scmd->satacmd_flags.sata_copy_out_error_reg = B_TRUE;
4249 if (sata_hba_start(spx, &rval) != 0) {
4250 mutex_exit(cport_mutex);
4251 return (rval);
4252 } else {
4253 if (scmd->satacmd_error_reg != 0) {
4254 goto err_out;
4255 }
4256 }
4257 /* ata standby immediate command */
4258 sata_build_generic_cmd(scmd, SATAC_STANDBY_IM);
4259 scmd->satacmd_flags.sata_copy_out_error_reg = B_TRUE;
4260 if (sata_hba_start(spx, &rval) != 0) {
4261 mutex_exit(cport_mutex);
4262 return (rval);
4263 }
4264 if (scmd->satacmd_error_reg != 0) {
4265 goto err_out;
4266 }
4267 sdinfo->satadrv_power_level = SATA_POWER_STOPPED;
4268 }
4269 break;
4270 case 0x1:
4271 sata_build_generic_cmd(scmd, SATAC_IDLE);
4272 scmd->satacmd_flags.sata_copy_out_error_reg = B_TRUE;
4273 if (sata_hba_start(spx, &rval) != 0) {
4274 mutex_exit(cport_mutex);
4275 return (rval);
4276 }
4277 if (scmd->satacmd_error_reg != 0) {
4278 goto err_out;
4279 }
4280 sata_build_read_verify_cmd(scmd, 1, 5);
4281 scmd->satacmd_flags.sata_copy_out_error_reg = B_TRUE;
4282 /* Transfer command to HBA */
4283 if (sata_hba_start(spx, &rval) != 0) {
4284 /* Pkt not accepted for execution */
4285 mutex_exit(cport_mutex);
4286 return (rval);
4287 } else {
4288 if (scmd->satacmd_error_reg != 0) {
4289 goto err_out;
4290 }
4291 }
4292 sdinfo->satadrv_power_level = SATA_POWER_ACTIVE;
4293 break;
4294 case 0x2:
4295 sata_build_generic_cmd(scmd, SATAC_FLUSH_CACHE);
4296 scmd->satacmd_flags.sata_copy_out_error_reg = B_TRUE;
4297 if (!(scsipkt->pkt_cdbp[4] & START_STOP_NOFLUSH_MASK)) {
4298 if (sata_hba_start(spx, &rval) != 0) {
4299 mutex_exit(cport_mutex);
4300 return (rval);
4301 }
4302 if (scmd->satacmd_error_reg != 0) {
4303 goto err_out;
4304 }
4305 }
4306 sata_build_generic_cmd(scmd, SATAC_IDLE);
4307 scmd->satacmd_flags.sata_copy_out_error_reg = B_TRUE;
4308 if (sata_hba_start(spx, &rval) != 0) {
4309 mutex_exit(cport_mutex);
4310 return (rval);
4311 }
4312 if (scmd->satacmd_error_reg != 0) {
4313 goto err_out;
4314 }
4315 if ((scsipkt->pkt_cdbp[3] & START_STOP_MODIFIER_MASK)) {
4316 /*
4317 * POWER CONDITION MODIFIER bit set
4318 * to 0x1 or larger it will be handled
4319 * on the same way as bit = 0x1
4320 */
4321 if (!(sata_id->ai_cmdset84 &
4322 SATA_IDLE_UNLOAD_SUPPORTED)) {
4323 sdinfo->satadrv_power_level = SATA_POWER_IDLE;
4324 break;
4325 }
4326 sata_build_generic_cmd(scmd, SATAC_IDLE_IM);
4327 scmd->satacmd_features_reg = 0x44;
4328 scmd->satacmd_lba_low_lsb = 0x4c;
4329 scmd->satacmd_lba_mid_lsb = 0x4e;
4330 scmd->satacmd_lba_high_lsb = 0x55;
4331 scmd->satacmd_flags.sata_copy_out_error_reg = B_TRUE;
4332 if (sata_hba_start(spx, &rval) != 0) {
4333 mutex_exit(cport_mutex);
4334 return (rval);
4335 }
4336 if (scmd->satacmd_error_reg != 0) {
4337 goto err_out;
4338 }
4339 }
4340 sdinfo->satadrv_power_level = SATA_POWER_IDLE;
4341 break;
4342 case 0x3:
4343 sata_build_generic_cmd(scmd, SATAC_FLUSH_CACHE);
4344 scmd->satacmd_flags.sata_copy_out_error_reg = B_TRUE;
4345 if (!(scsipkt->pkt_cdbp[4] & START_STOP_NOFLUSH_MASK)) {
4346 if (sata_hba_start(spx, &rval) != 0) {
4347 mutex_exit(cport_mutex);
4348 return (rval);
4349 }
4350 if (scmd->satacmd_error_reg != 0) {
4351 goto err_out;
4352 }
4353 }
4354 sata_build_generic_cmd(scmd, SATAC_STANDBY);
4355 scmd->satacmd_flags.sata_copy_out_error_reg = B_TRUE;
4356 if (sata_hba_start(spx, &rval) != 0) {
4357 mutex_exit(cport_mutex);
4358 return (rval);
4359 }
4360 if (scmd->satacmd_error_reg != 0) {
4361 goto err_out;
4362 }
4363 sdinfo->satadrv_power_level = SATA_POWER_STANDBY;
4364 break;
4365 case 0x7:
4366 sata_build_generic_cmd(scmd, SATAC_CHECK_POWER_MODE);
4367 scmd->satacmd_flags.sata_copy_out_sec_count_lsb = B_TRUE;
4368 scmd->satacmd_flags.sata_copy_out_error_reg = B_TRUE;
4369 if (sata_hba_start(spx, &rval) != 0) {
4370 mutex_exit(cport_mutex);
4371 return (rval);
4372 }
4373 if (scmd->satacmd_error_reg != 0) {
4374 goto err_out;
4375 }
4376 switch (scmd->satacmd_sec_count_lsb) {
4377 case SATA_PWRMODE_STANDBY:
4378 sata_build_generic_cmd(scmd, SATAC_STANDBY);
4379 scmd->satacmd_sec_count_msb = sata_get_standby_timer(
4380 sdinfo->satadrv_standby_timer);
4381 scmd->satacmd_flags.sata_copy_out_error_reg = B_TRUE;
4382 if (sata_hba_start(spx, &rval) != 0) {
4383 mutex_exit(cport_mutex);
4384 return (rval);
4385 } else {
4386 if (scmd->satacmd_error_reg != 0) {
4387 goto err_out;
4388 }
4389 }
4390 break;
4391 case SATA_PWRMODE_IDLE:
4392 sata_build_generic_cmd(scmd, SATAC_IDLE);
4393 scmd->satacmd_sec_count_msb = sata_get_standby_timer(
4394 sdinfo->satadrv_standby_timer);
4395 scmd->satacmd_flags.sata_copy_out_error_reg = B_TRUE;
4396 if (sata_hba_start(spx, &rval) != 0) {
4397 mutex_exit(cport_mutex);
4398 return (rval);
4399 } else {
4400 if (scmd->satacmd_error_reg != 0) {
4401 goto err_out;
4402 }
4403 }
4404 break;
4405 case SATA_PWRMODE_ACTIVE_SPINDOWN:
4406 case SATA_PWRMODE_ACTIVE_SPINUP:
4407 case SATA_PWRMODE_ACTIVE:
4408 sata_build_generic_cmd(scmd, SATAC_IDLE);
4409 scmd->satacmd_sec_count_msb = sata_get_standby_timer(
4410 sdinfo->satadrv_standby_timer);
4411 scmd->satacmd_flags.sata_copy_out_error_reg = B_TRUE;
4412 if (sata_hba_start(spx, &rval) != 0) {
4413 mutex_exit(cport_mutex);
4414 return (rval);
4415 }
4416 if (scmd->satacmd_error_reg != 0) {
4417 goto err_out;
4418 }
4419 sata_build_read_verify_cmd(scmd, 1, 5);
4420 scmd->satacmd_flags.sata_copy_out_error_reg = B_TRUE;
4421 if (sata_hba_start(spx, &rval) != 0) {
4422 mutex_exit(cport_mutex);
4423 return (rval);
4424 }
4425 if (scmd->satacmd_error_reg != 0) {
4426 goto err_out;
4427 }
4428 break;
4429 default:
4430 goto err_out;
4431 }
4432 break;
4433 case 0xb:
4434 if ((sata_get_standby_timer(sdinfo->satadrv_standby_timer) ==
4435 0) || (!(sata_id->ai_cap & SATA_STANDBYTIMER))) {
4436 mutex_exit(cport_mutex);
4437 return (sata_txlt_check_condition(spx,
4438 KEY_ILLEGAL_REQUEST,
4439 SD_SCSI_ASC_INVALID_FIELD_IN_CDB));
4440 }
4441 sata_build_generic_cmd(scmd, SATAC_FLUSH_CACHE);
4442 scmd->satacmd_flags.sata_copy_out_error_reg = B_TRUE;
4443 if (!(scsipkt->pkt_cdbp[4] & START_STOP_NOFLUSH_MASK)) {
4444 if (sata_hba_start(spx, &rval) != 0) {
4445 mutex_exit(cport_mutex);
4446 return (rval);
4447 }
4448 if (scmd->satacmd_error_reg != 0) {
4449 goto err_out;
4450 }
4451 sata_build_generic_cmd(scmd, SATAC_STANDBY_IM);
4452 scmd->satacmd_flags.sata_copy_out_error_reg = B_TRUE;
4453 if (sata_hba_start(spx, &rval) != 0) {
4454 mutex_exit(cport_mutex);
4455 return (rval);
4456 }
4457 if (scmd->satacmd_error_reg != 0) {
4458 goto err_out;
4459 }
4460 }
4461 bzero(sdinfo->satadrv_standby_timer, sizeof (uchar_t) * 4);
4462 break;
4463 default:
4464 err_out:
4465 mutex_exit(cport_mutex);
4466 return (sata_txlt_check_condition(spx, KEY_ILLEGAL_REQUEST,
4467 SD_SCSI_ASC_INVALID_FIELD_IN_CDB));
4468 }
4469
4470 /*
4471 * Since it was a synchronous command,
4472 * a callback function will be called directly.
4473 */
4474 mutex_exit(cport_mutex);
4475 SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
4476 "synchronous execution status %x\n",
4477 spx->txlt_sata_pkt->satapkt_reason);
4478
4479 if ((scsipkt->pkt_flags & FLAG_NOINTR) == 0 &&
4480 scsipkt->pkt_comp != NULL) {
4481 sata_set_arq_data(spx->txlt_sata_pkt);
4482 if (servicing_interrupt()) {
4483 if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
4484 (task_func_t *)spx->txlt_scsi_pkt->pkt_comp,
4485 (void *)spx->txlt_scsi_pkt, TQ_NOSLEEP) == NULL) {
4486 return (TRAN_BUSY);
4487 }
4488 } else if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
4489 (task_func_t *)spx->txlt_scsi_pkt->pkt_comp,
4490 (void *)spx->txlt_scsi_pkt, TQ_SLEEP) == NULL) {
4491 /* Scheduling the callback failed */
4492 return (TRAN_BUSY);
4493 }
4494 }
4495 else
4496
4497 sata_txlt_nodata_cmd_completion(spx->txlt_sata_pkt);
4498
4499 return (TRAN_ACCEPT);
4500
4501 }
4502
4503 /*
4504 * SATA translate command: Read Capacity.
4505 * Emulated command for SATA disks.
4506 * Capacity is retrieved from cached Idenifty Device data.
4507 * Identify Device data shows effective disk capacity, not the native
4508 * capacity, which may be limitted by Set Max Address command.
4509 * This is ATA version for SATA hard disks.
4510 *
4511 * Returns TRAN_ACCEPT and appropriate values in scsi_pkt fields.
4512 */
4513 static int
sata_txlt_read_capacity(sata_pkt_txlate_t * spx)4514 sata_txlt_read_capacity(sata_pkt_txlate_t *spx)
4515 {
4516 struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
4517 struct buf *bp = spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp;
4518 sata_drive_info_t *sdinfo;
4519 uint64_t val;
4520 uint32_t lbsize = DEV_BSIZE;
4521 uchar_t *rbuf;
4522 int rval, reason;
4523 kmutex_t *cport_mutex = &(SATA_TXLT_CPORT_MUTEX(spx));
4524
4525 SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
4526 "sata_txlt_read_capacity: ", NULL);
4527
4528 mutex_enter(cport_mutex);
4529
4530 if (((rval = sata_txlt_generic_pkt_info(spx, &reason, 0)) !=
4531 TRAN_ACCEPT) || (reason == CMD_DEV_GONE)) {
4532 mutex_exit(cport_mutex);
4533 return (rval);
4534 }
4535
4536 scsipkt->pkt_reason = CMD_CMPLT;
4537 scsipkt->pkt_state = STATE_GOT_BUS | STATE_GOT_TARGET |
4538 STATE_SENT_CMD | STATE_GOT_STATUS;
4539 *scsipkt->pkt_scbp = STATUS_GOOD;
4540 if (bp != NULL && bp->b_un.b_addr && bp->b_bcount) {
4541 /*
4542 * Because it is fully emulated command storing data
4543 * programatically in the specified buffer, release
4544 * preallocated DMA resources before storing data in the buffer,
4545 * so no unwanted DMA sync would take place.
4546 */
4547 sata_scsi_dmafree(NULL, scsipkt);
4548
4549 sdinfo = sata_get_device_info(
4550 spx->txlt_sata_hba_inst,
4551 &spx->txlt_sata_pkt->satapkt_device);
4552
4553 /*
4554 * As per SBC-3, the "returned LBA" is either the highest
4555 * addressable LBA or 0xffffffff, whichever is smaller.
4556 */
4557 val = MIN(sdinfo->satadrv_capacity - 1, UINT32_MAX);
4558
4559 if (sdinfo->satadrv_id.ai_phys_sect_sz & SATA_L2PS_CHECK_BIT) {
4560 /* physical/logical sector size word is valid */
4561
4562 if (sdinfo->satadrv_id.ai_phys_sect_sz &
4563 SATA_L2PS_BIG_SECTORS) {
4564 /* if this set 117-118 words are valid */
4565 lbsize = sdinfo->satadrv_id.ai_words_lsec[0] |
4566 (sdinfo->satadrv_id.ai_words_lsec[1] << 16);
4567 lbsize <<= 1; /* convert from words to bytes */
4568 }
4569 }
4570 rbuf = (uchar_t *)bp->b_un.b_addr;
4571 /* Need to swap endians to match scsi format */
4572 rbuf[0] = (val >> 24) & 0xff;
4573 rbuf[1] = (val >> 16) & 0xff;
4574 rbuf[2] = (val >> 8) & 0xff;
4575 rbuf[3] = val & 0xff;
4576 rbuf[4] = (lbsize >> 24) & 0xff;
4577 rbuf[5] = (lbsize >> 16) & 0xff;
4578 rbuf[6] = (lbsize >> 8) & 0xff;
4579 rbuf[7] = lbsize & 0xff;
4580
4581 scsipkt->pkt_state |= STATE_XFERRED_DATA;
4582 scsipkt->pkt_resid = 0;
4583
4584 SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst, "%d\n",
4585 sdinfo->satadrv_capacity -1);
4586 }
4587 mutex_exit(cport_mutex);
4588 /*
4589 * If a callback was requested, do it now.
4590 */
4591 SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
4592 "Scsi_pkt completion reason %x\n", scsipkt->pkt_reason);
4593
4594 if ((scsipkt->pkt_flags & FLAG_NOINTR) == 0 &&
4595 scsipkt->pkt_comp != NULL) {
4596 /* scsi callback required */
4597 if (servicing_interrupt()) {
4598 if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
4599 (task_func_t *)spx->txlt_scsi_pkt->pkt_comp,
4600 (void *)spx->txlt_scsi_pkt, TQ_NOSLEEP) == NULL) {
4601 return (TRAN_BUSY);
4602 }
4603 } else if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
4604 (task_func_t *)spx->txlt_scsi_pkt->pkt_comp,
4605 (void *)spx->txlt_scsi_pkt, TQ_SLEEP) == NULL) {
4606 /* Scheduling the callback failed */
4607 return (TRAN_BUSY);
4608 }
4609 }
4610
4611 return (TRAN_ACCEPT);
4612 }
4613
4614 /*
4615 * SATA translate command: Read Capacity (16).
4616 * Emulated command for SATA disks.
4617 * Info is retrieved from cached Identify Device data.
4618 * Implemented to SBC-3 (draft 21) and SAT-2 (final) specifications.
4619 *
4620 * Returns TRAN_ACCEPT and appropriate values in scsi_pkt fields.
4621 */
4622 static int
sata_txlt_read_capacity16(sata_pkt_txlate_t * spx)4623 sata_txlt_read_capacity16(sata_pkt_txlate_t *spx)
4624 {
4625 struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
4626 struct buf *bp = spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp;
4627 sata_drive_info_t *sdinfo;
4628 uint64_t val;
4629 uint16_t l2p_exp;
4630 uint32_t lbsize = DEV_BSIZE;
4631 uchar_t *rbuf;
4632 int rval, reason;
4633 #define TPE 0x80
4634 #define TPRZ 0x40
4635 kmutex_t *cport_mutex = &(SATA_TXLT_CPORT_MUTEX(spx));
4636
4637 SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
4638 "sata_txlt_read_capacity: ", NULL);
4639
4640 mutex_enter(cport_mutex);
4641
4642 if (((rval = sata_txlt_generic_pkt_info(spx, &reason, 0)) !=
4643 TRAN_ACCEPT) || (reason == CMD_DEV_GONE)) {
4644 mutex_exit(cport_mutex);
4645 return (rval);
4646 }
4647
4648 scsipkt->pkt_reason = CMD_CMPLT;
4649 scsipkt->pkt_state = STATE_GOT_BUS | STATE_GOT_TARGET |
4650 STATE_SENT_CMD | STATE_GOT_STATUS;
4651 if (bp != NULL && bp->b_un.b_addr && bp->b_bcount) {
4652 /*
4653 * Because it is fully emulated command storing data
4654 * programatically in the specified buffer, release
4655 * preallocated DMA resources before storing data in the buffer,
4656 * so no unwanted DMA sync would take place.
4657 */
4658 sata_scsi_dmafree(NULL, scsipkt);
4659
4660 /* Check SERVICE ACTION field */
4661 if ((scsipkt->pkt_cdbp[1] & 0x1f) !=
4662 SSVC_ACTION_READ_CAPACITY_G4) {
4663 mutex_exit(cport_mutex);
4664 return (sata_txlt_check_condition(spx,
4665 KEY_ILLEGAL_REQUEST,
4666 SD_SCSI_ASC_INVALID_FIELD_IN_CDB));
4667 }
4668
4669 /* Check LBA field */
4670 if ((scsipkt->pkt_cdbp[2] != 0) ||
4671 (scsipkt->pkt_cdbp[3] != 0) ||
4672 (scsipkt->pkt_cdbp[4] != 0) ||
4673 (scsipkt->pkt_cdbp[5] != 0) ||
4674 (scsipkt->pkt_cdbp[6] != 0) ||
4675 (scsipkt->pkt_cdbp[7] != 0) ||
4676 (scsipkt->pkt_cdbp[8] != 0) ||
4677 (scsipkt->pkt_cdbp[9] != 0)) {
4678 mutex_exit(cport_mutex);
4679 return (sata_txlt_check_condition(spx,
4680 KEY_ILLEGAL_REQUEST,
4681 SD_SCSI_ASC_INVALID_FIELD_IN_CDB));
4682 }
4683
4684 /* Check PMI bit */
4685 if (scsipkt->pkt_cdbp[14] & 0x1) {
4686 mutex_exit(cport_mutex);
4687 return (sata_txlt_check_condition(spx,
4688 KEY_ILLEGAL_REQUEST,
4689 SD_SCSI_ASC_INVALID_FIELD_IN_CDB));
4690 }
4691
4692 *scsipkt->pkt_scbp = STATUS_GOOD;
4693
4694 sdinfo = sata_get_device_info(
4695 spx->txlt_sata_hba_inst,
4696 &spx->txlt_sata_pkt->satapkt_device);
4697
4698 /* last logical block address */
4699 val = MIN(sdinfo->satadrv_capacity - 1,
4700 SCSI_READ_CAPACITY16_MAX_LBA);
4701
4702 /* logical to physical block size exponent */
4703 l2p_exp = 0;
4704 if (sdinfo->satadrv_id.ai_phys_sect_sz & SATA_L2PS_CHECK_BIT) {
4705 /* physical/logical sector size word is valid */
4706
4707 if (sdinfo->satadrv_id.ai_phys_sect_sz &
4708 SATA_L2PS_HAS_MULT) {
4709 /* multiple logical sectors per phys sectors */
4710 l2p_exp =
4711 sdinfo->satadrv_id.ai_phys_sect_sz &
4712 SATA_L2PS_EXP_MASK;
4713 }
4714
4715 if (sdinfo->satadrv_id.ai_phys_sect_sz &
4716 SATA_L2PS_BIG_SECTORS) {
4717 /* if this set 117-118 words are valid */
4718 lbsize = sdinfo->satadrv_id.ai_words_lsec[0] |
4719 (sdinfo->satadrv_id.ai_words_lsec[1] << 16);
4720 lbsize <<= 1; /* convert from words to bytes */
4721 }
4722 }
4723
4724 rbuf = (uchar_t *)bp->b_un.b_addr;
4725 bzero(rbuf, bp->b_bcount);
4726
4727 /* returned logical block address */
4728 rbuf[0] = (val >> 56) & 0xff;
4729 rbuf[1] = (val >> 48) & 0xff;
4730 rbuf[2] = (val >> 40) & 0xff;
4731 rbuf[3] = (val >> 32) & 0xff;
4732 rbuf[4] = (val >> 24) & 0xff;
4733 rbuf[5] = (val >> 16) & 0xff;
4734 rbuf[6] = (val >> 8) & 0xff;
4735 rbuf[7] = val & 0xff;
4736 rbuf[8] = (lbsize >> 24) & 0xff;
4737 rbuf[9] = (lbsize >> 16) & 0xff;
4738 rbuf[10] = (lbsize >> 8) & 0xff;
4739 rbuf[11] = lbsize & 0xff;
4740
4741 /* p_type, prot_en, unspecified by SAT-2 */
4742 /* rbuf[12] = 0; */
4743
4744 /* p_i_exponent, undefined by SAT-2 */
4745 /* logical blocks per physical block exponent */
4746 rbuf[13] = l2p_exp;
4747
4748 /* lowest aligned logical block address = 0 (for now) */
4749 /* tpe and tprz as defined in T10/10-079 r0 */
4750 if (sdinfo->satadrv_id.ai_addsupported &
4751 SATA_DETERMINISTIC_READ) {
4752 if (sdinfo->satadrv_id.ai_addsupported &
4753 SATA_READ_ZERO) {
4754 rbuf[14] |= TPRZ;
4755 } else {
4756 rbuf[14] |= TPE;
4757 }
4758 }
4759 /* rbuf[15] = 0; */
4760
4761 scsipkt->pkt_state |= STATE_XFERRED_DATA;
4762 scsipkt->pkt_resid = 0;
4763
4764 SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst, "%llu\n",
4765 sdinfo->satadrv_capacity -1);
4766 }
4767
4768 mutex_exit(cport_mutex);
4769
4770 /*
4771 * If a callback was requested, do it now.
4772 */
4773 SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
4774 "Scsi_pkt completion reason %x\n", scsipkt->pkt_reason);
4775
4776 if ((scsipkt->pkt_flags & FLAG_NOINTR) == 0 &&
4777 scsipkt->pkt_comp != NULL) {
4778 /* scsi callback required */
4779 if (servicing_interrupt()) {
4780 if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
4781 (task_func_t *)spx->txlt_scsi_pkt->pkt_comp,
4782 (void *)spx->txlt_scsi_pkt, TQ_NOSLEEP) == NULL) {
4783 return (TRAN_BUSY);
4784 }
4785 } else if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
4786 (task_func_t *)spx->txlt_scsi_pkt->pkt_comp,
4787 (void *)spx->txlt_scsi_pkt, TQ_SLEEP) == NULL) {
4788 /* Scheduling the callback failed */
4789 return (TRAN_BUSY);
4790 }
4791 }
4792
4793 return (TRAN_ACCEPT);
4794 }
4795
4796 /*
4797 * Translate command: UNMAP
4798 *
4799 * The function cannot be called in interrupt context since it may sleep.
4800 */
4801 static int
sata_txlt_unmap(sata_pkt_txlate_t * spx)4802 sata_txlt_unmap(sata_pkt_txlate_t *spx)
4803 {
4804 struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
4805 sata_cmd_t *scmd = &spx->txlt_sata_pkt->satapkt_cmd;
4806 struct buf *bp = spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp;
4807 uint16_t count = 0;
4808 int synch;
4809 int rval, reason;
4810 int i, x;
4811 int bdlen = 0;
4812 int ranges = 0;
4813 int paramlen = 8;
4814 uint8_t *data, *tmpbd;
4815 sata_drive_info_t *sdinfo;
4816 kmutex_t *cport_mutex = &(SATA_TXLT_CPORT_MUTEX(spx));
4817 #define TRIM 0x1
4818
4819 SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
4820 "sata_txlt_unmap: ", NULL);
4821
4822 mutex_enter(cport_mutex);
4823
4824 sdinfo = sata_get_device_info(spx->txlt_sata_hba_inst,
4825 &spx->txlt_sata_pkt->satapkt_device);
4826 if (sdinfo != NULL) {
4827 SATADBG2(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
4828 "DSM support 0x%x, max number of 512 byte blocks of LBA "
4829 "range entries 0x%x\n", sdinfo->satadrv_id.ai_dsm,
4830 sdinfo->satadrv_id.ai_maxcount);
4831 }
4832
4833 rval = sata_txlt_generic_pkt_info(spx, &reason, 1);
4834 if ((rval != TRAN_ACCEPT) || (reason == CMD_DEV_GONE)) {
4835 mutex_exit(cport_mutex);
4836 return (rval);
4837 }
4838
4839 /*
4840 * Need to modify bp to have TRIM data instead of UNMAP data.
4841 * Start by getting the block descriptor data length by subtracting
4842 * the 8 byte parameter list header from the parameter list length.
4843 * The block descriptor size has to be a multiple of 16 bytes.
4844 */
4845 bdlen = scsipkt->pkt_cdbp[7];
4846 bdlen = (bdlen << 8) + scsipkt->pkt_cdbp[8] - paramlen;
4847 if ((bdlen < 0) || ((bdlen % 16) != 0) ||
4848 (bdlen > (bp->b_bcount - paramlen))) {
4849 SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
4850 "sata_txlt_unmap: invalid block descriptor length", NULL);
4851 mutex_exit(cport_mutex);
4852 return ((sata_txlt_check_condition(spx, KEY_ILLEGAL_REQUEST,
4853 SD_SCSI_ASC_INVALID_FIELD_IN_CDB)));
4854 }
4855 /*
4856 * If there are no parameter data or block descriptors, it is not
4857 * considered an error so just complete the command without sending
4858 * TRIM.
4859 */
4860 if ((bdlen == 0) || (bp == NULL) || (bp->b_un.b_addr == NULL) ||
4861 (bp->b_bcount == 0)) {
4862 SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
4863 "sata_txlt_unmap: no parameter data or block descriptors",
4864 NULL);
4865 mutex_exit(cport_mutex);
4866 return (sata_txlt_unmap_nodata_cmd(spx));
4867 }
4868 tmpbd = (uint8_t *)bp->b_un.b_addr + paramlen;
4869 data = kmem_zalloc(bdlen, KM_SLEEP);
4870
4871 /*
4872 * Loop through all the UNMAP block descriptors and convert the data
4873 * into TRIM format.
4874 */
4875 for (i = 0, x = 0; i < bdlen; i += 16, x += 8) {
4876 /* get range length */
4877 data[x] = tmpbd[i+7];
4878 data[x+1] = tmpbd[i+6];
4879 /* get LBA */
4880 data[x+2] = tmpbd[i+5];
4881 data[x+3] = tmpbd[i+4];
4882 data[x+4] = tmpbd[i+3];
4883 data[x+5] = tmpbd[i+2];
4884 data[x+6] = tmpbd[i+11];
4885 data[x+7] = tmpbd[i+10];
4886
4887 ranges++;
4888 }
4889
4890 /*
4891 * The TRIM command expects the data buffer to be a multiple of
4892 * 512-byte blocks of range entries. This means that the UNMAP buffer
4893 * may be too small. Free the original DMA resources and create a
4894 * local buffer.
4895 */
4896 sata_common_free_dma_rsrcs(spx);
4897
4898 /*
4899 * Get count of 512-byte blocks of range entries. The length
4900 * of a range entry is 8 bytes which means one count has 64 range
4901 * entries.
4902 */
4903 count = (ranges + 63)/64;
4904
4905 /* Allocate a buffer that is a multiple of 512 bytes. */
4906 mutex_exit(cport_mutex);
4907 bp = sata_alloc_local_buffer(spx, count * 512);
4908 if (bp == NULL) {
4909 SATADBG1(SATA_DBG_ATAPI, spx->txlt_sata_hba_inst,
4910 "sata_txlt_unmap: "
4911 "cannot allocate buffer for TRIM command", NULL);
4912 kmem_free(data, bdlen);
4913 return (TRAN_BUSY);
4914 }
4915 bp_mapin(bp); /* make data buffer accessible */
4916 mutex_enter(cport_mutex);
4917
4918 bzero(bp->b_un.b_addr, bp->b_bcount);
4919 bcopy(data, bp->b_un.b_addr, x);
4920 kmem_free(data, bdlen);
4921 rval = ddi_dma_sync(spx->txlt_buf_dma_handle, 0, 0,
4922 DDI_DMA_SYNC_FORDEV);
4923 ASSERT(rval == DDI_SUCCESS);
4924
4925 scmd->satacmd_flags.sata_data_direction = SATA_DIR_WRITE;
4926 scmd->satacmd_addr_type = ATA_ADDR_LBA48;
4927 scmd->satacmd_cmd_reg = SATAC_DSM;
4928 scmd->satacmd_sec_count_msb = (count >> 8) & 0xff;
4929 scmd->satacmd_sec_count_lsb = count & 0xff;
4930 scmd->satacmd_features_reg = TRIM;
4931 scmd->satacmd_device_reg = SATA_ADH_LBA;
4932 scmd->satacmd_status_reg = 0;
4933 scmd->satacmd_error_reg = 0;
4934
4935 /* Start processing command */
4936 if (!(spx->txlt_sata_pkt->satapkt_op_mode & SATA_OPMODE_SYNCH)) {
4937 spx->txlt_sata_pkt->satapkt_comp =
4938 sata_txlt_unmap_completion;
4939 synch = FALSE;
4940 } else {
4941 synch = TRUE;
4942 }
4943
4944 if (sata_hba_start(spx, &rval) != 0) {
4945 mutex_exit(cport_mutex);
4946 return (rval);
4947 }
4948
4949 mutex_exit(cport_mutex);
4950
4951 if (synch) {
4952 sata_txlt_unmap_completion(spx->txlt_sata_pkt);
4953 }
4954
4955 return (TRAN_ACCEPT);
4956 }
4957
4958 /*
4959 * SATA translate command: Mode Sense.
4960 * Translated into appropriate SATA command or emulated.
4961 * Saved Values Page Control (03) are not supported.
4962 *
4963 * NOTE: only caching mode sense page is currently implemented.
4964 *
4965 * Returns TRAN_ACCEPT and appropriate values in scsi_pkt fields.
4966 */
4967
4968 #define LLBAA 0x10 /* Long LBA Accepted */
4969
4970 static int
sata_txlt_mode_sense(sata_pkt_txlate_t * spx)4971 sata_txlt_mode_sense(sata_pkt_txlate_t *spx)
4972 {
4973 struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
4974 struct buf *bp = spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp;
4975 sata_drive_info_t *sdinfo;
4976 sata_id_t *sata_id;
4977 struct scsi_extended_sense *sense;
4978 int len, bdlen, count, alc_len;
4979 int pc; /* Page Control code */
4980 uint8_t *buf; /* mode sense buffer */
4981 int rval, reason;
4982 kmutex_t *cport_mutex = &(SATA_TXLT_CPORT_MUTEX(spx));
4983
4984 SATADBG2(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
4985 "sata_txlt_mode_sense, pc %x page code 0x%02x\n",
4986 spx->txlt_scsi_pkt->pkt_cdbp[2] >> 6,
4987 spx->txlt_scsi_pkt->pkt_cdbp[2] & 0x3f);
4988
4989 if (servicing_interrupt()) {
4990 buf = kmem_zalloc(1024, KM_NOSLEEP);
4991 if (buf == NULL) {
4992 return (TRAN_BUSY);
4993 }
4994 } else {
4995 buf = kmem_zalloc(1024, KM_SLEEP);
4996 }
4997
4998 mutex_enter(cport_mutex);
4999
5000 if (((rval = sata_txlt_generic_pkt_info(spx, &reason, 0)) !=
5001 TRAN_ACCEPT) || (reason == CMD_DEV_GONE)) {
5002 mutex_exit(cport_mutex);
5003 kmem_free(buf, 1024);
5004 return (rval);
5005 }
5006
5007 scsipkt->pkt_reason = CMD_CMPLT;
5008 scsipkt->pkt_state = STATE_GOT_BUS | STATE_GOT_TARGET |
5009 STATE_SENT_CMD | STATE_GOT_STATUS;
5010
5011 pc = scsipkt->pkt_cdbp[2] >> 6;
5012
5013 if (bp != NULL && bp->b_un.b_addr && bp->b_bcount) {
5014 /*
5015 * Because it is fully emulated command storing data
5016 * programatically in the specified buffer, release
5017 * preallocated DMA resources before storing data in the buffer,
5018 * so no unwanted DMA sync would take place.
5019 */
5020 sata_scsi_dmafree(NULL, scsipkt);
5021
5022 len = 0;
5023 bdlen = 0;
5024 if (!(scsipkt->pkt_cdbp[1] & 8)) {
5025 if (scsipkt->pkt_cdbp[0] == SCMD_MODE_SENSE_G1 &&
5026 (scsipkt->pkt_cdbp[1] & LLBAA))
5027 bdlen = 16;
5028 else
5029 bdlen = 8;
5030 }
5031 /* Build mode parameter header */
5032 if (spx->txlt_scsi_pkt->pkt_cdbp[0] == SCMD_MODE_SENSE) {
5033 /* 4-byte mode parameter header */
5034 buf[len++] = 0; /* mode data length */
5035 buf[len++] = 0; /* medium type */
5036 buf[len++] = 0; /* dev-specific param */
5037 buf[len++] = bdlen; /* Block Descriptor length */
5038 } else {
5039 /* 8-byte mode parameter header */
5040 buf[len++] = 0; /* mode data length */
5041 buf[len++] = 0;
5042 buf[len++] = 0; /* medium type */
5043 buf[len++] = 0; /* dev-specific param */
5044 if (bdlen == 16)
5045 buf[len++] = 1; /* long lba descriptor */
5046 else
5047 buf[len++] = 0;
5048 buf[len++] = 0;
5049 buf[len++] = 0; /* Block Descriptor length */
5050 buf[len++] = bdlen;
5051 }
5052
5053 sdinfo = sata_get_device_info(
5054 spx->txlt_sata_hba_inst,
5055 &spx->txlt_sata_pkt->satapkt_device);
5056
5057 /* Build block descriptor only if not disabled (DBD) */
5058 if ((scsipkt->pkt_cdbp[1] & 0x08) == 0) {
5059 /* Block descriptor - direct-access device format */
5060 if (bdlen == 8) {
5061 /* build regular block descriptor */
5062 buf[len++] =
5063 (sdinfo->satadrv_capacity >> 24) & 0xff;
5064 buf[len++] =
5065 (sdinfo->satadrv_capacity >> 16) & 0xff;
5066 buf[len++] =
5067 (sdinfo->satadrv_capacity >> 8) & 0xff;
5068 buf[len++] = sdinfo->satadrv_capacity & 0xff;
5069 buf[len++] = 0; /* density code */
5070 buf[len++] = 0;
5071 if (sdinfo->satadrv_type ==
5072 SATA_DTYPE_ATADISK)
5073 buf[len++] = 2;
5074 else
5075 /* ATAPI */
5076 buf[len++] = 8;
5077 buf[len++] = 0;
5078 } else if (bdlen == 16) {
5079 /* Long LBA Accepted */
5080 /* build long lba block descriptor */
5081 #ifndef __lock_lint
5082 buf[len++] =
5083 (sdinfo->satadrv_capacity >> 56) & 0xff;
5084 buf[len++] =
5085 (sdinfo->satadrv_capacity >> 48) & 0xff;
5086 buf[len++] =
5087 (sdinfo->satadrv_capacity >> 40) & 0xff;
5088 buf[len++] =
5089 (sdinfo->satadrv_capacity >> 32) & 0xff;
5090 #endif
5091 buf[len++] =
5092 (sdinfo->satadrv_capacity >> 24) & 0xff;
5093 buf[len++] =
5094 (sdinfo->satadrv_capacity >> 16) & 0xff;
5095 buf[len++] =
5096 (sdinfo->satadrv_capacity >> 8) & 0xff;
5097 buf[len++] = sdinfo->satadrv_capacity & 0xff;
5098 buf[len++] = 0;
5099 buf[len++] = 0; /* density code */
5100 buf[len++] = 0;
5101 buf[len++] = 0;
5102 if (sdinfo->satadrv_type ==
5103 SATA_DTYPE_ATADISK)
5104 buf[len++] = 2;
5105 else
5106 /* ATAPI */
5107 buf[len++] = 8;
5108 buf[len++] = 0;
5109 }
5110 }
5111
5112 sata_id = &sdinfo->satadrv_id;
5113
5114 /*
5115 * Add requested pages.
5116 * Page 3 and 4 are obsolete and we are not supporting them.
5117 * We deal now with:
5118 * caching (read/write cache control).
5119 * We should eventually deal with following mode pages:
5120 * error recovery (0x01),
5121 * power condition (0x1a),
5122 * exception control page (enables SMART) (0x1c),
5123 * enclosure management (ses),
5124 * protocol-specific port mode (port control).
5125 */
5126 switch (scsipkt->pkt_cdbp[2] & 0x3f) {
5127 case MODEPAGE_RW_ERRRECOV:
5128 /* DAD_MODE_ERR_RECOV */
5129 /* R/W recovery */
5130 len += sata_build_msense_page_1(sdinfo, pc, buf+len);
5131 break;
5132 case MODEPAGE_CACHING:
5133 /* DAD_MODE_CACHE */
5134 /* Reject not supported request for saved parameters */
5135 if (pc == 3) {
5136 *scsipkt->pkt_scbp = STATUS_CHECK;
5137 sense = sata_arq_sense(spx);
5138 sense->es_key = KEY_ILLEGAL_REQUEST;
5139 sense->es_add_code =
5140 SD_SCSI_ASC_SAVING_PARAMS_NOT_SUPPORTED;
5141 goto done;
5142 }
5143
5144 /* caching */
5145 len += sata_build_msense_page_8(sdinfo, pc, buf+len);
5146 break;
5147 case MODEPAGE_INFO_EXCPT:
5148 /* exception cntrl */
5149 if (sata_id->ai_cmdset82 & SATA_SMART_SUPPORTED) {
5150 len += sata_build_msense_page_1c(sdinfo, pc,
5151 buf+len);
5152 }
5153 else
5154 goto err;
5155 break;
5156 case MODEPAGE_POWER_COND:
5157 /* DAD_MODE_POWER_COND */
5158 /* power condition */
5159 len += sata_build_msense_page_1a(sdinfo, pc, buf+len);
5160 break;
5161
5162 case MODEPAGE_ACOUSTIC_MANAG:
5163 /* acoustic management */
5164 len += sata_build_msense_page_30(sdinfo, pc, buf+len);
5165 break;
5166 case MODEPAGE_ALLPAGES:
5167 /* all pages */
5168 len += sata_build_msense_page_1(sdinfo, pc, buf+len);
5169 len += sata_build_msense_page_8(sdinfo, pc, buf+len);
5170 len += sata_build_msense_page_1a(sdinfo, pc, buf+len);
5171 if (sata_id->ai_cmdset82 & SATA_SMART_SUPPORTED) {
5172 len += sata_build_msense_page_1c(sdinfo, pc,
5173 buf+len);
5174 }
5175 len += sata_build_msense_page_30(sdinfo, pc, buf+len);
5176 break;
5177 default:
5178 err:
5179 /* Invalid request */
5180 *scsipkt->pkt_scbp = STATUS_CHECK;
5181 sense = sata_arq_sense(spx);
5182 sense->es_key = KEY_ILLEGAL_REQUEST;
5183 sense->es_add_code = SD_SCSI_ASC_INVALID_FIELD_IN_CDB;
5184 goto done;
5185 }
5186
5187 /* fix total mode data length */
5188 if (spx->txlt_scsi_pkt->pkt_cdbp[0] == SCMD_MODE_SENSE) {
5189 /* 4-byte mode parameter header */
5190 buf[0] = len - 1; /* mode data length */
5191 } else {
5192 buf[0] = (len -2) >> 8;
5193 buf[1] = (len -2) & 0xff;
5194 }
5195
5196
5197 /* Check allocation length */
5198 if (scsipkt->pkt_cdbp[0] == SCMD_MODE_SENSE) {
5199 alc_len = scsipkt->pkt_cdbp[4];
5200 } else {
5201 alc_len = scsipkt->pkt_cdbp[7];
5202 alc_len = (len << 8) | scsipkt->pkt_cdbp[8];
5203 }
5204 /*
5205 * We do not check for possible parameters truncation
5206 * (alc_len < len) assuming that the target driver works
5207 * correctly. Just avoiding overrun.
5208 * Copy no more than requested and possible, buffer-wise.
5209 */
5210 count = MIN(alc_len, len);
5211 count = MIN(bp->b_bcount, count);
5212 bcopy(buf, bp->b_un.b_addr, count);
5213
5214 scsipkt->pkt_state |= STATE_XFERRED_DATA;
5215 scsipkt->pkt_resid = alc_len > count ? alc_len - count : 0;
5216 }
5217 *scsipkt->pkt_scbp = STATUS_GOOD;
5218 done:
5219 mutex_exit(cport_mutex);
5220 (void) kmem_free(buf, 1024);
5221
5222 SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
5223 "Scsi_pkt completion reason %x\n", scsipkt->pkt_reason);
5224
5225 if ((scsipkt->pkt_flags & FLAG_NOINTR) == 0 &&
5226 scsipkt->pkt_comp != NULL) {
5227 /* scsi callback required */
5228 if (servicing_interrupt()) {
5229 if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
5230 (task_func_t *)spx->txlt_scsi_pkt->pkt_comp,
5231 (void *)spx->txlt_scsi_pkt, TQ_NOSLEEP) == NULL) {
5232 return (TRAN_BUSY);
5233 }
5234 } else if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
5235 (task_func_t *)spx->txlt_scsi_pkt->pkt_comp,
5236 (void *)spx->txlt_scsi_pkt, TQ_SLEEP) == NULL) {
5237 /* Scheduling the callback failed */
5238 return (TRAN_BUSY);
5239 }
5240 }
5241
5242 return (TRAN_ACCEPT);
5243 }
5244
5245
5246 /*
5247 * SATA translate command: Mode Select.
5248 * Translated into appropriate SATA command or emulated.
5249 * Saving parameters is not supported.
5250 * Changing device capacity is not supported (although theoretically
5251 * possible by executing SET FEATURES/SET MAX ADDRESS)
5252 *
5253 * Assumption is that the target driver is working correctly.
5254 *
5255 * More than one SATA command may be executed to perform operations specified
5256 * by mode select pages. The first error terminates further execution.
5257 * Operations performed successully are not backed-up in such case.
5258 *
5259 * NOTE: Implemented pages:
5260 * - caching page
5261 * - informational exception page
5262 * - acoustic management page
5263 * - power condition page
5264 * Caching setup is remembered so it could be re-stored in case of
5265 * an unexpected device reset.
5266 *
5267 * Returns TRAN_XXXX.
5268 * If TRAN_ACCEPT is returned, appropriate values are set in scsi_pkt fields.
5269 */
5270
5271 static int
sata_txlt_mode_select(sata_pkt_txlate_t * spx)5272 sata_txlt_mode_select(sata_pkt_txlate_t *spx)
5273 {
5274 struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
5275 struct buf *bp = spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp;
5276 struct scsi_extended_sense *sense;
5277 int len, pagelen, count, pllen;
5278 uint8_t *buf; /* mode select buffer */
5279 int rval, stat, reason;
5280 uint_t nointr_flag;
5281 int dmod = 0;
5282 kmutex_t *cport_mutex = &(SATA_TXLT_CPORT_MUTEX(spx));
5283
5284 SATADBG2(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
5285 "sata_txlt_mode_select, pc %x page code 0x%02x\n",
5286 spx->txlt_scsi_pkt->pkt_cdbp[2] >> 6,
5287 spx->txlt_scsi_pkt->pkt_cdbp[2] & 0x3f);
5288
5289 mutex_enter(cport_mutex);
5290
5291 if (((rval = sata_txlt_generic_pkt_info(spx, &reason, 1)) !=
5292 TRAN_ACCEPT) || (reason == CMD_DEV_GONE)) {
5293 mutex_exit(cport_mutex);
5294 return (rval);
5295 }
5296
5297 rval = TRAN_ACCEPT;
5298
5299 scsipkt->pkt_reason = CMD_CMPLT;
5300 scsipkt->pkt_state = STATE_GOT_BUS | STATE_GOT_TARGET |
5301 STATE_SENT_CMD | STATE_GOT_STATUS;
5302 nointr_flag = scsipkt->pkt_flags & FLAG_NOINTR;
5303
5304 /* Reject not supported request */
5305 if (! (scsipkt->pkt_cdbp[1] & 0x10)) { /* No support for PF bit = 0 */
5306 *scsipkt->pkt_scbp = STATUS_CHECK;
5307 sense = sata_arq_sense(spx);
5308 sense->es_key = KEY_ILLEGAL_REQUEST;
5309 sense->es_add_code = SD_SCSI_ASC_INVALID_FIELD_IN_CDB;
5310 goto done;
5311 }
5312
5313 if (scsipkt->pkt_cdbp[0] == SCMD_MODE_SELECT) {
5314 pllen = scsipkt->pkt_cdbp[4];
5315 } else {
5316 pllen = scsipkt->pkt_cdbp[7];
5317 pllen = (pllen << 8) | scsipkt->pkt_cdbp[7];
5318 }
5319
5320 *scsipkt->pkt_scbp = STATUS_GOOD; /* Presumed outcome */
5321
5322 if (bp != NULL && bp->b_un.b_addr && bp->b_bcount && pllen != 0) {
5323 buf = (uint8_t *)bp->b_un.b_addr;
5324 count = MIN(bp->b_bcount, pllen);
5325 scsipkt->pkt_state |= STATE_XFERRED_DATA;
5326 scsipkt->pkt_resid = 0;
5327 pllen = count;
5328
5329 /*
5330 * Check the header to skip the block descriptor(s) - we
5331 * do not support setting device capacity.
5332 * Existing macros do not recognize long LBA dscriptor,
5333 * hence manual calculation.
5334 */
5335 if (scsipkt->pkt_cdbp[0] == SCMD_MODE_SELECT) {
5336 /* 6-bytes CMD, 4 bytes header */
5337 if (count <= 4)
5338 goto done; /* header only */
5339 len = buf[3] + 4;
5340 } else {
5341 /* 10-bytes CMD, 8 bytes header */
5342 if (count <= 8)
5343 goto done; /* header only */
5344 len = buf[6];
5345 len = (len << 8) + buf[7] + 8;
5346 }
5347 if (len >= count)
5348 goto done; /* header + descriptor(s) only */
5349
5350 pllen -= len; /* remaining data length */
5351
5352 /*
5353 * We may be executing SATA command and want to execute it
5354 * in SYNCH mode, regardless of scsi_pkt setting.
5355 * Save scsi_pkt setting and indicate SYNCH mode
5356 */
5357 if ((scsipkt->pkt_flags & FLAG_NOINTR) == 0 &&
5358 scsipkt->pkt_comp != NULL) {
5359 scsipkt->pkt_flags |= FLAG_NOINTR;
5360 }
5361 spx->txlt_sata_pkt->satapkt_op_mode = SATA_OPMODE_SYNCH;
5362
5363 /*
5364 * len is now the offset to a first mode select page
5365 * Process all pages
5366 */
5367 while (pllen > 0) {
5368 switch ((int)buf[len]) {
5369 case MODEPAGE_CACHING:
5370 /* No support for SP (saving) */
5371 if (scsipkt->pkt_cdbp[1] & 0x01) {
5372 *scsipkt->pkt_scbp = STATUS_CHECK;
5373 sense = sata_arq_sense(spx);
5374 sense->es_key = KEY_ILLEGAL_REQUEST;
5375 sense->es_add_code =
5376 SD_SCSI_ASC_INVALID_FIELD_IN_CDB;
5377 goto done;
5378 }
5379 stat = sata_mode_select_page_8(spx,
5380 (struct mode_cache_scsi3 *)&buf[len],
5381 pllen, &pagelen, &rval, &dmod);
5382 /*
5383 * The pagelen value indicates the number of
5384 * parameter bytes already processed.
5385 * The rval is the return value from
5386 * sata_tran_start().
5387 * The stat indicates the overall status of
5388 * the operation(s).
5389 */
5390 if (stat != SATA_SUCCESS)
5391 /*
5392 * Page processing did not succeed -
5393 * all error info is already set-up,
5394 * just return
5395 */
5396 pllen = 0; /* this breaks the loop */
5397 else {
5398 len += pagelen;
5399 pllen -= pagelen;
5400 }
5401 break;
5402
5403 case MODEPAGE_INFO_EXCPT:
5404 stat = sata_mode_select_page_1c(spx,
5405 (struct mode_info_excpt_page *)&buf[len],
5406 pllen, &pagelen, &rval, &dmod);
5407 /*
5408 * The pagelen value indicates the number of
5409 * parameter bytes already processed.
5410 * The rval is the return value from
5411 * sata_tran_start().
5412 * The stat indicates the overall status of
5413 * the operation(s).
5414 */
5415 if (stat != SATA_SUCCESS)
5416 /*
5417 * Page processing did not succeed -
5418 * all error info is already set-up,
5419 * just return
5420 */
5421 pllen = 0; /* this breaks the loop */
5422 else {
5423 len += pagelen;
5424 pllen -= pagelen;
5425 }
5426 break;
5427
5428 case MODEPAGE_ACOUSTIC_MANAG:
5429 stat = sata_mode_select_page_30(spx,
5430 (struct mode_acoustic_management *)
5431 &buf[len], pllen, &pagelen, &rval, &dmod);
5432 /*
5433 * The pagelen value indicates the number of
5434 * parameter bytes already processed.
5435 * The rval is the return value from
5436 * sata_tran_start().
5437 * The stat indicates the overall status of
5438 * the operation(s).
5439 */
5440 if (stat != SATA_SUCCESS)
5441 /*
5442 * Page processing did not succeed -
5443 * all error info is already set-up,
5444 * just return
5445 */
5446 pllen = 0; /* this breaks the loop */
5447 else {
5448 len += pagelen;
5449 pllen -= pagelen;
5450 }
5451
5452 break;
5453 case MODEPAGE_POWER_COND:
5454 stat = sata_mode_select_page_1a(spx,
5455 (struct mode_info_power_cond *)&buf[len],
5456 pllen, &pagelen, &rval, &dmod);
5457 /*
5458 * The pagelen value indicates the number of
5459 * parameter bytes already processed.
5460 * The rval is the return value from
5461 * sata_tran_start().
5462 * The stat indicates the overall status of
5463 * the operation(s).
5464 */
5465 if (stat != SATA_SUCCESS)
5466 /*
5467 * Page processing did not succeed -
5468 * all error info is already set-up,
5469 * just return
5470 */
5471 pllen = 0; /* this breaks the loop */
5472 else {
5473 len += pagelen;
5474 pllen -= pagelen;
5475 }
5476 break;
5477 default:
5478 *scsipkt->pkt_scbp = STATUS_CHECK;
5479 sense = sata_arq_sense(spx);
5480 sense->es_key = KEY_ILLEGAL_REQUEST;
5481 sense->es_add_code =
5482 SD_SCSI_ASC_INVALID_FIELD_IN_PARAMS_LIST;
5483 goto done;
5484 }
5485 }
5486 }
5487 done:
5488 mutex_exit(cport_mutex);
5489 /*
5490 * If device parameters were modified, fetch and store the new
5491 * Identify Device data. Since port mutex could have been released
5492 * for accessing HBA driver, we need to re-check device existence.
5493 */
5494 if (dmod != 0) {
5495 sata_drive_info_t new_sdinfo, *sdinfo;
5496 int rv = 0;
5497
5498 /*
5499 * Following statement has to be changed if this function is
5500 * used for devices other than SATA hard disks.
5501 */
5502 new_sdinfo.satadrv_type = SATA_DTYPE_ATADISK;
5503
5504 new_sdinfo.satadrv_addr =
5505 spx->txlt_sata_pkt->satapkt_device.satadev_addr;
5506 rv = sata_fetch_device_identify_data(spx->txlt_sata_hba_inst,
5507 &new_sdinfo);
5508
5509 mutex_enter(cport_mutex);
5510 /*
5511 * Since port mutex could have been released when
5512 * accessing HBA driver, we need to re-check that the
5513 * framework still holds the device info structure.
5514 */
5515 sdinfo = sata_get_device_info(spx->txlt_sata_hba_inst,
5516 &spx->txlt_sata_pkt->satapkt_device);
5517 if (sdinfo != NULL) {
5518 /*
5519 * Device still has info structure in the
5520 * sata framework. Copy newly fetched info
5521 */
5522 if (rv == 0) {
5523 sdinfo->satadrv_id = new_sdinfo.satadrv_id;
5524 sata_save_drive_settings(sdinfo);
5525 } else {
5526 /*
5527 * Could not fetch new data - invalidate
5528 * sata_drive_info. That makes device
5529 * unusable.
5530 */
5531 sdinfo->satadrv_type = SATA_DTYPE_UNKNOWN;
5532 sdinfo->satadrv_state = SATA_STATE_UNKNOWN;
5533 }
5534 }
5535 if (rv != 0 || sdinfo == NULL) {
5536 /*
5537 * This changes the overall mode select completion
5538 * reason to a failed one !!!!!
5539 */
5540 *scsipkt->pkt_scbp = STATUS_CHECK;
5541 sense = sata_arq_sense(spx);
5542 scsipkt->pkt_reason = CMD_INCOMPLETE;
5543 rval = TRAN_ACCEPT;
5544 }
5545 mutex_exit(cport_mutex);
5546 }
5547 /* Restore the scsi pkt flags */
5548 scsipkt->pkt_flags &= ~FLAG_NOINTR;
5549 scsipkt->pkt_flags |= nointr_flag;
5550
5551 SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
5552 "Scsi_pkt completion reason %x\n", scsipkt->pkt_reason);
5553
5554 if ((scsipkt->pkt_flags & FLAG_NOINTR) == 0 &&
5555 scsipkt->pkt_comp != NULL) {
5556 /* scsi callback required */
5557 if (servicing_interrupt()) {
5558 if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
5559 (task_func_t *)spx->txlt_scsi_pkt->pkt_comp,
5560 (void *)spx->txlt_scsi_pkt, TQ_NOSLEEP) == NULL) {
5561 return (TRAN_BUSY);
5562 }
5563 } else if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
5564 (task_func_t *)spx->txlt_scsi_pkt->pkt_comp,
5565 (void *)spx->txlt_scsi_pkt, TQ_SLEEP) == NULL) {
5566 /* Scheduling the callback failed */
5567 return (TRAN_BUSY);
5568 }
5569 }
5570
5571 return (rval);
5572 }
5573
5574 /*
5575 * Translate command: ATA Pass Through
5576 * Incomplete implementation. Only supports No-Data, PIO Data-In, and
5577 * PIO Data-Out protocols. Also supports CK_COND bit.
5578 *
5579 * Mapping of the incoming CDB bytes to the outgoing satacmd bytes is
5580 * described in Table 111 of SAT-2 (Draft 9).
5581 */
5582 static int
sata_txlt_ata_pass_thru(sata_pkt_txlate_t * spx)5583 sata_txlt_ata_pass_thru(sata_pkt_txlate_t *spx)
5584 {
5585 struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
5586 sata_cmd_t *scmd = &spx->txlt_sata_pkt->satapkt_cmd;
5587 struct buf *bp = spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp;
5588 int extend;
5589 uint64_t lba;
5590 uint16_t feature, sec_count;
5591 int t_len, synch;
5592 int rval, reason;
5593 kmutex_t *cport_mutex = &(SATA_TXLT_CPORT_MUTEX(spx));
5594
5595 mutex_enter(cport_mutex);
5596
5597 rval = sata_txlt_generic_pkt_info(spx, &reason, 1);
5598 if ((rval != TRAN_ACCEPT) || (reason == CMD_DEV_GONE)) {
5599 mutex_exit(cport_mutex);
5600 return (rval);
5601 }
5602
5603 /* T_DIR bit */
5604 if (scsipkt->pkt_cdbp[2] & SATL_APT_BM_T_DIR)
5605 scmd->satacmd_flags.sata_data_direction = SATA_DIR_READ;
5606 else
5607 scmd->satacmd_flags.sata_data_direction = SATA_DIR_WRITE;
5608
5609 /* MULTIPLE_COUNT field. If non-zero, invalid command (for now). */
5610 if (((scsipkt->pkt_cdbp[1] >> 5) & 0x7) != 0) {
5611 mutex_exit(cport_mutex);
5612 return (sata_txlt_ata_pass_thru_illegal_cmd(spx));
5613 }
5614
5615 /* OFFLINE field. If non-zero, invalid command (for now). */
5616 if (((scsipkt->pkt_cdbp[2] >> 6) & 0x3) != 0) {
5617 mutex_exit(cport_mutex);
5618 return (sata_txlt_ata_pass_thru_illegal_cmd(spx));
5619 }
5620
5621 /* PROTOCOL field */
5622 switch ((scsipkt->pkt_cdbp[1] >> 1) & 0xf) {
5623 case SATL_APT_P_HW_RESET:
5624 case SATL_APT_P_SRST:
5625 case SATL_APT_P_DMA:
5626 case SATL_APT_P_DMA_QUEUED:
5627 case SATL_APT_P_DEV_DIAG:
5628 case SATL_APT_P_DEV_RESET:
5629 case SATL_APT_P_UDMA_IN:
5630 case SATL_APT_P_UDMA_OUT:
5631 case SATL_APT_P_FPDMA:
5632 case SATL_APT_P_RET_RESP:
5633 /* Not yet implemented */
5634 default:
5635 mutex_exit(cport_mutex);
5636 return (sata_txlt_ata_pass_thru_illegal_cmd(spx));
5637
5638 case SATL_APT_P_NON_DATA:
5639 scmd->satacmd_flags.sata_data_direction = SATA_DIR_NODATA_XFER;
5640 break;
5641
5642 case SATL_APT_P_PIO_DATA_IN:
5643 /* If PROTOCOL disagrees with T_DIR, invalid command */
5644 if (scmd->satacmd_flags.sata_data_direction == SATA_DIR_WRITE) {
5645 mutex_exit(cport_mutex);
5646 return (sata_txlt_ata_pass_thru_illegal_cmd(spx));
5647 }
5648
5649 /* if there is a buffer, release its DMA resources */
5650 if ((bp != NULL) && bp->b_un.b_addr && bp->b_bcount) {
5651 sata_scsi_dmafree(NULL, scsipkt);
5652 } else {
5653 /* if there is no buffer, how do you PIO in? */
5654 mutex_exit(cport_mutex);
5655 return (sata_txlt_ata_pass_thru_illegal_cmd(spx));
5656 }
5657
5658 break;
5659
5660 case SATL_APT_P_PIO_DATA_OUT:
5661 /* If PROTOCOL disagrees with T_DIR, invalid command */
5662 if (scmd->satacmd_flags.sata_data_direction == SATA_DIR_READ) {
5663 mutex_exit(cport_mutex);
5664 return (sata_txlt_ata_pass_thru_illegal_cmd(spx));
5665 }
5666
5667 /* if there is a buffer, release its DMA resources */
5668 if ((bp != NULL) && bp->b_un.b_addr && bp->b_bcount) {
5669 sata_scsi_dmafree(NULL, scsipkt);
5670 } else {
5671 /* if there is no buffer, how do you PIO out? */
5672 mutex_exit(cport_mutex);
5673 return (sata_txlt_ata_pass_thru_illegal_cmd(spx));
5674 }
5675
5676 break;
5677 }
5678
5679 /* Parse the ATA cmd fields, transfer some straight to the satacmd */
5680 switch ((uint_t)scsipkt->pkt_cdbp[0]) {
5681 case SPC3_CMD_ATA_COMMAND_PASS_THROUGH12:
5682 feature = scsipkt->pkt_cdbp[3];
5683
5684 sec_count = scsipkt->pkt_cdbp[4];
5685
5686 lba = scsipkt->pkt_cdbp[8] & 0xf;
5687 lba = (lba << 8) | scsipkt->pkt_cdbp[7];
5688 lba = (lba << 8) | scsipkt->pkt_cdbp[6];
5689 lba = (lba << 8) | scsipkt->pkt_cdbp[5];
5690
5691 scmd->satacmd_device_reg = scsipkt->pkt_cdbp[13] & 0xf0;
5692 scmd->satacmd_cmd_reg = scsipkt->pkt_cdbp[9];
5693
5694 break;
5695
5696 case SPC3_CMD_ATA_COMMAND_PASS_THROUGH16:
5697 if (scsipkt->pkt_cdbp[1] & SATL_APT_BM_EXTEND) {
5698 extend = 1;
5699
5700 feature = scsipkt->pkt_cdbp[3];
5701 feature = (feature << 8) | scsipkt->pkt_cdbp[4];
5702
5703 sec_count = scsipkt->pkt_cdbp[5];
5704 sec_count = (sec_count << 8) | scsipkt->pkt_cdbp[6];
5705
5706 lba = scsipkt->pkt_cdbp[11];
5707 lba = (lba << 8) | scsipkt->pkt_cdbp[12];
5708 lba = (lba << 8) | scsipkt->pkt_cdbp[9];
5709 lba = (lba << 8) | scsipkt->pkt_cdbp[10];
5710 lba = (lba << 8) | scsipkt->pkt_cdbp[7];
5711 lba = (lba << 8) | scsipkt->pkt_cdbp[8];
5712
5713 scmd->satacmd_device_reg = scsipkt->pkt_cdbp[13];
5714 scmd->satacmd_cmd_reg = scsipkt->pkt_cdbp[14];
5715 } else {
5716 feature = scsipkt->pkt_cdbp[3];
5717
5718 sec_count = scsipkt->pkt_cdbp[5];
5719
5720 lba = scsipkt->pkt_cdbp[13] & 0xf;
5721 lba = (lba << 8) | scsipkt->pkt_cdbp[12];
5722 lba = (lba << 8) | scsipkt->pkt_cdbp[10];
5723 lba = (lba << 8) | scsipkt->pkt_cdbp[8];
5724
5725 scmd->satacmd_device_reg = scsipkt->pkt_cdbp[13] &
5726 0xf0;
5727 scmd->satacmd_cmd_reg = scsipkt->pkt_cdbp[14];
5728 }
5729
5730 break;
5731 }
5732
5733 /* CK_COND bit */
5734 if (scsipkt->pkt_cdbp[2] & SATL_APT_BM_CK_COND) {
5735 if (extend) {
5736 scmd->satacmd_flags.sata_copy_out_sec_count_msb = 1;
5737 scmd->satacmd_flags.sata_copy_out_lba_low_msb = 1;
5738 scmd->satacmd_flags.sata_copy_out_lba_mid_msb = 1;
5739 scmd->satacmd_flags.sata_copy_out_lba_high_msb = 1;
5740 }
5741
5742 scmd->satacmd_flags.sata_copy_out_sec_count_lsb = 1;
5743 scmd->satacmd_flags.sata_copy_out_lba_low_lsb = 1;
5744 scmd->satacmd_flags.sata_copy_out_lba_mid_lsb = 1;
5745 scmd->satacmd_flags.sata_copy_out_lba_high_lsb = 1;
5746 scmd->satacmd_flags.sata_copy_out_device_reg = 1;
5747 scmd->satacmd_flags.sata_copy_out_error_reg = 1;
5748 }
5749
5750 /* Transfer remaining parsed ATA cmd values to the satacmd */
5751 if (extend) {
5752 scmd->satacmd_addr_type = ATA_ADDR_LBA48;
5753
5754 scmd->satacmd_features_reg_ext = (feature >> 8) & 0xff;
5755 scmd->satacmd_sec_count_msb = (sec_count >> 8) & 0xff;
5756 scmd->satacmd_lba_low_msb = (lba >> 8) & 0xff;
5757 scmd->satacmd_lba_mid_msb = (lba >> 8) & 0xff;
5758 scmd->satacmd_lba_high_msb = lba >> 40;
5759 } else {
5760 scmd->satacmd_addr_type = ATA_ADDR_LBA28;
5761
5762 scmd->satacmd_features_reg_ext = 0;
5763 scmd->satacmd_sec_count_msb = 0;
5764 scmd->satacmd_lba_low_msb = 0;
5765 scmd->satacmd_lba_mid_msb = 0;
5766 scmd->satacmd_lba_high_msb = 0;
5767 }
5768
5769 scmd->satacmd_features_reg = feature & 0xff;
5770 scmd->satacmd_sec_count_lsb = sec_count & 0xff;
5771 scmd->satacmd_lba_low_lsb = lba & 0xff;
5772 scmd->satacmd_lba_mid_lsb = (lba >> 8) & 0xff;
5773 scmd->satacmd_lba_high_lsb = (lba >> 16) & 0xff;
5774
5775 /* Determine transfer length */
5776 switch (scsipkt->pkt_cdbp[2] & 0x3) { /* T_LENGTH field */
5777 case 1:
5778 t_len = feature;
5779 break;
5780 case 2:
5781 t_len = sec_count;
5782 break;
5783 default:
5784 t_len = 0;
5785 break;
5786 }
5787
5788 /* Adjust transfer length for the Byte Block bit */
5789 if ((scsipkt->pkt_cdbp[2] >> 2) & 1)
5790 t_len *= SATA_DISK_SECTOR_SIZE;
5791
5792 /* Start processing command */
5793 if (!(spx->txlt_sata_pkt->satapkt_op_mode & SATA_OPMODE_SYNCH)) {
5794 spx->txlt_sata_pkt->satapkt_comp = sata_txlt_apt_completion;
5795 synch = FALSE;
5796 } else {
5797 synch = TRUE;
5798 }
5799
5800 if (sata_hba_start(spx, &rval) != 0) {
5801 mutex_exit(cport_mutex);
5802 return (rval);
5803 }
5804
5805 mutex_exit(cport_mutex);
5806
5807 if (synch) {
5808 sata_txlt_apt_completion(spx->txlt_sata_pkt);
5809 }
5810
5811 return (TRAN_ACCEPT);
5812 }
5813
5814 /*
5815 * Translate command: Log Sense
5816 */
5817 static int
sata_txlt_log_sense(sata_pkt_txlate_t * spx)5818 sata_txlt_log_sense(sata_pkt_txlate_t *spx)
5819 {
5820 struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
5821 struct buf *bp = spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp;
5822 sata_drive_info_t *sdinfo;
5823 struct scsi_extended_sense *sense;
5824 int len, count, alc_len;
5825 int pc; /* Page Control code */
5826 int page_code; /* Page code */
5827 uint8_t *buf; /* log sense buffer */
5828 int rval, reason;
5829 #define MAX_LOG_SENSE_PAGE_SIZE 512
5830 kmutex_t *cport_mutex = &(SATA_TXLT_CPORT_MUTEX(spx));
5831
5832 SATADBG2(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
5833 "sata_txlt_log_sense, pc 0x%x, page code 0x%x\n",
5834 spx->txlt_scsi_pkt->pkt_cdbp[2] >> 6,
5835 spx->txlt_scsi_pkt->pkt_cdbp[2] & 0x3f);
5836
5837 if (servicing_interrupt()) {
5838 buf = kmem_zalloc(MAX_LOG_SENSE_PAGE_SIZE, KM_NOSLEEP);
5839 if (buf == NULL) {
5840 return (TRAN_BUSY);
5841 }
5842 } else {
5843 buf = kmem_zalloc(MAX_LOG_SENSE_PAGE_SIZE, KM_SLEEP);
5844 }
5845
5846 mutex_enter(cport_mutex);
5847
5848 if (((rval = sata_txlt_generic_pkt_info(spx, &reason, 1)) !=
5849 TRAN_ACCEPT) || (reason == CMD_DEV_GONE)) {
5850 mutex_exit(cport_mutex);
5851 kmem_free(buf, MAX_LOG_SENSE_PAGE_SIZE);
5852 return (rval);
5853 }
5854
5855 scsipkt->pkt_reason = CMD_CMPLT;
5856 scsipkt->pkt_state = STATE_GOT_BUS | STATE_GOT_TARGET |
5857 STATE_SENT_CMD | STATE_GOT_STATUS;
5858
5859 pc = scsipkt->pkt_cdbp[2] >> 6;
5860 page_code = scsipkt->pkt_cdbp[2] & 0x3f;
5861
5862 /* Reject not supported request for all but cumulative values */
5863 switch (pc) {
5864 case PC_CUMULATIVE_VALUES:
5865 break;
5866 default:
5867 *scsipkt->pkt_scbp = STATUS_CHECK;
5868 sense = sata_arq_sense(spx);
5869 sense->es_key = KEY_ILLEGAL_REQUEST;
5870 sense->es_add_code = SD_SCSI_ASC_INVALID_FIELD_IN_CDB;
5871 goto done;
5872 }
5873
5874 switch (page_code) {
5875 case PAGE_CODE_GET_SUPPORTED_LOG_PAGES:
5876 case PAGE_CODE_SELF_TEST_RESULTS:
5877 case PAGE_CODE_INFORMATION_EXCEPTIONS:
5878 case PAGE_CODE_SMART_READ_DATA:
5879 case PAGE_CODE_START_STOP_CYCLE_COUNTER:
5880 break;
5881 default:
5882 *scsipkt->pkt_scbp = STATUS_CHECK;
5883 sense = sata_arq_sense(spx);
5884 sense->es_key = KEY_ILLEGAL_REQUEST;
5885 sense->es_add_code = SD_SCSI_ASC_INVALID_FIELD_IN_CDB;
5886 goto done;
5887 }
5888
5889 if (bp != NULL && bp->b_un.b_addr && bp->b_bcount) {
5890 /*
5891 * Because log sense uses local buffers for data retrieval from
5892 * the devices and sets the data programatically in the
5893 * original specified buffer, release preallocated DMA
5894 * resources before storing data in the original buffer,
5895 * so no unwanted DMA sync would take place.
5896 */
5897 sata_id_t *sata_id;
5898
5899 sata_scsi_dmafree(NULL, scsipkt);
5900
5901 len = 0;
5902
5903 /* Build log parameter header */
5904 buf[len++] = page_code; /* page code as in the CDB */
5905 buf[len++] = 0; /* reserved */
5906 buf[len++] = 0; /* Zero out page length for now (MSB) */
5907 buf[len++] = 0; /* (LSB) */
5908
5909 sdinfo = sata_get_device_info(
5910 spx->txlt_sata_hba_inst,
5911 &spx->txlt_sata_pkt->satapkt_device);
5912
5913 /*
5914 * Add requested pages.
5915 */
5916 switch (page_code) {
5917 case PAGE_CODE_GET_SUPPORTED_LOG_PAGES:
5918 len = sata_build_lsense_page_0(sdinfo, buf + len);
5919 break;
5920 case PAGE_CODE_SELF_TEST_RESULTS:
5921 sata_id = &sdinfo->satadrv_id;
5922 if ((! (sata_id->ai_cmdset84 &
5923 SATA_SMART_SELF_TEST_SUPPORTED)) ||
5924 (! (sata_id->ai_features87 &
5925 SATA_SMART_SELF_TEST_SUPPORTED))) {
5926 *scsipkt->pkt_scbp = STATUS_CHECK;
5927 sense = sata_arq_sense(spx);
5928 sense->es_key = KEY_ILLEGAL_REQUEST;
5929 sense->es_add_code =
5930 SD_SCSI_ASC_INVALID_FIELD_IN_CDB;
5931
5932 goto done;
5933 }
5934 len = sata_build_lsense_page_10(sdinfo, buf + len,
5935 spx->txlt_sata_hba_inst);
5936 break;
5937 case PAGE_CODE_INFORMATION_EXCEPTIONS:
5938 sata_id = &sdinfo->satadrv_id;
5939 if (! (sata_id->ai_cmdset82 & SATA_SMART_SUPPORTED)) {
5940 *scsipkt->pkt_scbp = STATUS_CHECK;
5941 sense = sata_arq_sense(spx);
5942 sense->es_key = KEY_ILLEGAL_REQUEST;
5943 sense->es_add_code =
5944 SD_SCSI_ASC_INVALID_FIELD_IN_CDB;
5945
5946 goto done;
5947 }
5948 if (! (sata_id->ai_features85 & SATA_SMART_ENABLED)) {
5949 *scsipkt->pkt_scbp = STATUS_CHECK;
5950 sense = sata_arq_sense(spx);
5951 sense->es_key = KEY_ABORTED_COMMAND;
5952 sense->es_add_code =
5953 SCSI_ASC_ATA_DEV_FEAT_NOT_ENABLED;
5954 sense->es_qual_code =
5955 SCSI_ASCQ_ATA_DEV_FEAT_NOT_ENABLED;
5956
5957 goto done;
5958 }
5959
5960 len = sata_build_lsense_page_2f(sdinfo, buf + len,
5961 spx->txlt_sata_hba_inst);
5962 break;
5963 case PAGE_CODE_SMART_READ_DATA:
5964 sata_id = &sdinfo->satadrv_id;
5965 if (! (sata_id->ai_cmdset82 & SATA_SMART_SUPPORTED)) {
5966 *scsipkt->pkt_scbp = STATUS_CHECK;
5967 sense = sata_arq_sense(spx);
5968 sense->es_key = KEY_ILLEGAL_REQUEST;
5969 sense->es_add_code =
5970 SD_SCSI_ASC_INVALID_FIELD_IN_CDB;
5971
5972 goto done;
5973 }
5974 if (! (sata_id->ai_features85 & SATA_SMART_ENABLED)) {
5975 *scsipkt->pkt_scbp = STATUS_CHECK;
5976 sense = sata_arq_sense(spx);
5977 sense->es_key = KEY_ABORTED_COMMAND;
5978 sense->es_add_code =
5979 SCSI_ASC_ATA_DEV_FEAT_NOT_ENABLED;
5980 sense->es_qual_code =
5981 SCSI_ASCQ_ATA_DEV_FEAT_NOT_ENABLED;
5982
5983 goto done;
5984 }
5985
5986 /* This page doesn't include a page header */
5987 len = sata_build_lsense_page_30(sdinfo, buf,
5988 spx->txlt_sata_hba_inst);
5989 goto no_header;
5990 case PAGE_CODE_START_STOP_CYCLE_COUNTER:
5991 sata_id = &sdinfo->satadrv_id;
5992 if (! (sata_id->ai_cmdset82 & SATA_SMART_SUPPORTED)) {
5993 *scsipkt->pkt_scbp = STATUS_CHECK;
5994 sense = sata_arq_sense(spx);
5995 sense->es_key = KEY_ILLEGAL_REQUEST;
5996 sense->es_add_code =
5997 SD_SCSI_ASC_INVALID_FIELD_IN_CDB;
5998
5999 goto done;
6000 }
6001 if (! (sata_id->ai_features85 & SATA_SMART_ENABLED)) {
6002 *scsipkt->pkt_scbp = STATUS_CHECK;
6003 sense = sata_arq_sense(spx);
6004 sense->es_key = KEY_ABORTED_COMMAND;
6005 sense->es_add_code =
6006 SCSI_ASC_ATA_DEV_FEAT_NOT_ENABLED;
6007 sense->es_qual_code =
6008 SCSI_ASCQ_ATA_DEV_FEAT_NOT_ENABLED;
6009
6010 goto done;
6011 }
6012 len = sata_build_lsense_page_0e(sdinfo, buf, spx);
6013 goto no_header;
6014 default:
6015 /* Invalid request */
6016 *scsipkt->pkt_scbp = STATUS_CHECK;
6017 sense = sata_arq_sense(spx);
6018 sense->es_key = KEY_ILLEGAL_REQUEST;
6019 sense->es_add_code = SD_SCSI_ASC_INVALID_FIELD_IN_CDB;
6020 goto done;
6021 }
6022
6023 /* set parameter log sense data length */
6024 buf[2] = len >> 8; /* log sense length (MSB) */
6025 buf[3] = len & 0xff; /* log sense length (LSB) */
6026
6027 len += SCSI_LOG_PAGE_HDR_LEN;
6028 ASSERT(len <= MAX_LOG_SENSE_PAGE_SIZE);
6029
6030 no_header:
6031 /* Check allocation length */
6032 alc_len = scsipkt->pkt_cdbp[7];
6033 alc_len = (len << 8) | scsipkt->pkt_cdbp[8];
6034
6035 /*
6036 * We do not check for possible parameters truncation
6037 * (alc_len < len) assuming that the target driver works
6038 * correctly. Just avoiding overrun.
6039 * Copy no more than requested and possible, buffer-wise.
6040 */
6041 count = MIN(alc_len, len);
6042 count = MIN(bp->b_bcount, count);
6043 bcopy(buf, bp->b_un.b_addr, count);
6044
6045 scsipkt->pkt_state |= STATE_XFERRED_DATA;
6046 scsipkt->pkt_resid = alc_len > count ? alc_len - count : 0;
6047 }
6048 *scsipkt->pkt_scbp = STATUS_GOOD;
6049 done:
6050 mutex_exit(cport_mutex);
6051 (void) kmem_free(buf, MAX_LOG_SENSE_PAGE_SIZE);
6052
6053 SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
6054 "Scsi_pkt completion reason %x\n", scsipkt->pkt_reason);
6055
6056 if ((scsipkt->pkt_flags & FLAG_NOINTR) == 0 &&
6057 scsipkt->pkt_comp != NULL) {
6058 /* scsi callback required */
6059 if (servicing_interrupt()) {
6060 if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
6061 (task_func_t *)spx->txlt_scsi_pkt->pkt_comp,
6062 (void *)spx->txlt_scsi_pkt, TQ_NOSLEEP) == NULL) {
6063 return (TRAN_BUSY);
6064 }
6065 } else if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
6066 (task_func_t *)spx->txlt_scsi_pkt->pkt_comp,
6067 (void *)spx->txlt_scsi_pkt, TQ_SLEEP) == NULL) {
6068 /* Scheduling the callback failed */
6069 return (TRAN_BUSY);
6070 }
6071 }
6072
6073 return (TRAN_ACCEPT);
6074 }
6075
6076 /*
6077 * Translate command: Log Select
6078 * Not implemented at this time - returns invalid command response.
6079 */
6080 static int
sata_txlt_log_select(sata_pkt_txlate_t * spx)6081 sata_txlt_log_select(sata_pkt_txlate_t *spx)
6082 {
6083 SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
6084 "sata_txlt_log_select\n", NULL);
6085
6086 return (sata_txlt_invalid_command(spx));
6087 }
6088
6089
6090 /*
6091 * Translate command: Read (various types).
6092 * Translated into appropriate type of ATA READ command
6093 * for SATA hard disks.
6094 * Both the device capabilities and requested operation mode are
6095 * considered.
6096 *
6097 * Following scsi cdb fields are ignored:
6098 * rdprotect, dpo, fua, fua_nv, group_number.
6099 *
6100 * If SATA_ENABLE_QUEUING flag is set (in the global SATA HBA framework
6101 * enable variable sata_func_enable), the capability of the controller and
6102 * capability of a device are checked and if both support queueing, read
6103 * request will be translated to READ_DMA_QUEUEING or READ_DMA_QUEUEING_EXT
6104 * command rather than plain READ_XXX command.
6105 * If SATA_ENABLE_NCQ flag is set in addition to SATA_ENABLE_QUEUING flag and
6106 * both the controller and device suport such functionality, the read
6107 * request will be translated to READ_FPDMA_QUEUED command.
6108 * In both cases the maximum queue depth is derived as minimum of:
6109 * HBA capability,device capability and sata_max_queue_depth variable setting.
6110 * The value passed to HBA driver is decremented by 1, because only 5 bits are
6111 * used to pass max queue depth value, and the maximum possible queue depth
6112 * is 32.
6113 *
6114 * Returns TRAN_ACCEPT or code returned by sata_hba_start() and
6115 * appropriate values in scsi_pkt fields.
6116 */
6117 static int
sata_txlt_read(sata_pkt_txlate_t * spx)6118 sata_txlt_read(sata_pkt_txlate_t *spx)
6119 {
6120 struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
6121 sata_cmd_t *scmd = &spx->txlt_sata_pkt->satapkt_cmd;
6122 sata_drive_info_t *sdinfo;
6123 sata_hba_inst_t *shi = SATA_TXLT_HBA_INST(spx);
6124 kmutex_t *cport_mutex = &(SATA_TXLT_CPORT_MUTEX(spx));
6125 uint16_t sec_count;
6126 uint64_t lba;
6127 int rval, reason;
6128 int synch;
6129
6130 mutex_enter(cport_mutex);
6131
6132 if (((rval = sata_txlt_generic_pkt_info(spx, &reason, 0)) !=
6133 TRAN_ACCEPT) || (reason == CMD_DEV_GONE)) {
6134 mutex_exit(cport_mutex);
6135 return (rval);
6136 }
6137
6138 sdinfo = sata_get_device_info(spx->txlt_sata_hba_inst,
6139 &spx->txlt_sata_pkt->satapkt_device);
6140
6141 scmd->satacmd_flags.sata_data_direction = SATA_DIR_READ;
6142 /*
6143 * Extract LBA and sector count from scsi CDB.
6144 */
6145 switch ((uint_t)scsipkt->pkt_cdbp[0]) {
6146 case SCMD_READ:
6147 /* 6-byte scsi read cmd : 0x08 */
6148 lba = (scsipkt->pkt_cdbp[1] & 0x1f);
6149 lba = (lba << 8) | scsipkt->pkt_cdbp[2];
6150 lba = (lba << 8) | scsipkt->pkt_cdbp[3];
6151 sec_count = scsipkt->pkt_cdbp[4];
6152 /* sec_count 0 will be interpreted as 256 by a device */
6153 break;
6154 case SCMD_READ_G1:
6155 /* 10-bytes scsi read command : 0x28 */
6156 lba = scsipkt->pkt_cdbp[2];
6157 lba = (lba << 8) | scsipkt->pkt_cdbp[3];
6158 lba = (lba << 8) | scsipkt->pkt_cdbp[4];
6159 lba = (lba << 8) | scsipkt->pkt_cdbp[5];
6160 sec_count = scsipkt->pkt_cdbp[7];
6161 sec_count = (sec_count << 8) | scsipkt->pkt_cdbp[8];
6162 break;
6163 case SCMD_READ_G5:
6164 /* 12-bytes scsi read command : 0xA8 */
6165 lba = scsipkt->pkt_cdbp[2];
6166 lba = (lba << 8) | scsipkt->pkt_cdbp[3];
6167 lba = (lba << 8) | scsipkt->pkt_cdbp[4];
6168 lba = (lba << 8) | scsipkt->pkt_cdbp[5];
6169 sec_count = scsipkt->pkt_cdbp[6];
6170 sec_count = (sec_count << 8) | scsipkt->pkt_cdbp[7];
6171 sec_count = (sec_count << 8) | scsipkt->pkt_cdbp[8];
6172 sec_count = (sec_count << 8) | scsipkt->pkt_cdbp[9];
6173 break;
6174 case SCMD_READ_G4:
6175 /* 16-bytes scsi read command : 0x88 */
6176 lba = scsipkt->pkt_cdbp[2];
6177 lba = (lba << 8) | scsipkt->pkt_cdbp[3];
6178 lba = (lba << 8) | scsipkt->pkt_cdbp[4];
6179 lba = (lba << 8) | scsipkt->pkt_cdbp[5];
6180 lba = (lba << 8) | scsipkt->pkt_cdbp[6];
6181 lba = (lba << 8) | scsipkt->pkt_cdbp[7];
6182 lba = (lba << 8) | scsipkt->pkt_cdbp[8];
6183 lba = (lba << 8) | scsipkt->pkt_cdbp[9];
6184 sec_count = scsipkt->pkt_cdbp[10];
6185 sec_count = (sec_count << 8) | scsipkt->pkt_cdbp[11];
6186 sec_count = (sec_count << 8) | scsipkt->pkt_cdbp[12];
6187 sec_count = (sec_count << 8) | scsipkt->pkt_cdbp[13];
6188 break;
6189 default:
6190 /* Unsupported command */
6191 mutex_exit(cport_mutex);
6192 return (sata_txlt_invalid_command(spx));
6193 }
6194
6195 /*
6196 * Check if specified address exceeds device capacity
6197 */
6198 if ((lba >= sdinfo->satadrv_capacity) ||
6199 ((lba + sec_count) > sdinfo->satadrv_capacity)) {
6200 /* LBA out of range */
6201 mutex_exit(cport_mutex);
6202 return (sata_txlt_lba_out_of_range(spx));
6203 }
6204
6205 /*
6206 * For zero-length transfer, emulate good completion of the command
6207 * (reasons for rejecting the command were already checked).
6208 * No DMA resources were allocated.
6209 */
6210 if (spx->txlt_dma_cookie_list == NULL) {
6211 mutex_exit(cport_mutex);
6212 return (sata_emul_rw_completion(spx));
6213 }
6214
6215 /*
6216 * Build cmd block depending on the device capability and
6217 * requested operation mode.
6218 * Do not bother with non-dma mode - we are working only with
6219 * devices supporting DMA.
6220 */
6221 scmd->satacmd_addr_type = ATA_ADDR_LBA;
6222 scmd->satacmd_device_reg = SATA_ADH_LBA;
6223 scmd->satacmd_cmd_reg = SATAC_READ_DMA;
6224 if (sdinfo->satadrv_features_support & SATA_DEV_F_LBA48) {
6225 scmd->satacmd_addr_type = ATA_ADDR_LBA48;
6226 scmd->satacmd_cmd_reg = SATAC_READ_DMA_EXT;
6227 scmd->satacmd_sec_count_msb = sec_count >> 8;
6228 #ifndef __lock_lint
6229 scmd->satacmd_lba_low_msb = (lba >> 24) & 0xff;
6230 scmd->satacmd_lba_mid_msb = (lba >> 32) & 0xff;
6231 scmd->satacmd_lba_high_msb = lba >> 40;
6232 #endif
6233 } else if (sdinfo->satadrv_features_support & SATA_DEV_F_LBA28) {
6234 scmd->satacmd_addr_type = ATA_ADDR_LBA28;
6235 scmd->satacmd_device_reg = SATA_ADH_LBA | ((lba >> 24) & 0xf);
6236 }
6237 scmd->satacmd_sec_count_lsb = sec_count & 0xff;
6238 scmd->satacmd_lba_low_lsb = lba & 0xff;
6239 scmd->satacmd_lba_mid_lsb = (lba >> 8) & 0xff;
6240 scmd->satacmd_lba_high_lsb = (lba >> 16) & 0xff;
6241 scmd->satacmd_features_reg = 0;
6242 scmd->satacmd_status_reg = 0;
6243 scmd->satacmd_error_reg = 0;
6244
6245 /*
6246 * Check if queueing commands should be used and switch
6247 * to appropriate command if possible
6248 */
6249 if (sata_func_enable & SATA_ENABLE_QUEUING) {
6250 boolean_t using_queuing;
6251
6252 /* Queuing supported by controller and device? */
6253 if ((sata_func_enable & SATA_ENABLE_NCQ) &&
6254 (sdinfo->satadrv_features_support &
6255 SATA_DEV_F_NCQ) &&
6256 (SATA_FEATURES(spx->txlt_sata_hba_inst) &
6257 SATA_CTLF_NCQ)) {
6258 using_queuing = B_TRUE;
6259
6260 /* NCQ supported - use FPDMA READ */
6261 scmd->satacmd_cmd_reg =
6262 SATAC_READ_FPDMA_QUEUED;
6263 scmd->satacmd_features_reg_ext =
6264 scmd->satacmd_sec_count_msb;
6265 scmd->satacmd_sec_count_msb = 0;
6266 } else if ((sdinfo->satadrv_features_support &
6267 SATA_DEV_F_TCQ) &&
6268 (SATA_FEATURES(spx->txlt_sata_hba_inst) &
6269 SATA_CTLF_QCMD)) {
6270 using_queuing = B_TRUE;
6271
6272 /* Legacy queueing */
6273 if (sdinfo->satadrv_features_support &
6274 SATA_DEV_F_LBA48) {
6275 scmd->satacmd_cmd_reg =
6276 SATAC_READ_DMA_QUEUED_EXT;
6277 scmd->satacmd_features_reg_ext =
6278 scmd->satacmd_sec_count_msb;
6279 scmd->satacmd_sec_count_msb = 0;
6280 } else {
6281 scmd->satacmd_cmd_reg =
6282 SATAC_READ_DMA_QUEUED;
6283 }
6284 } else /* NCQ nor legacy queuing not supported */
6285 using_queuing = B_FALSE;
6286
6287 /*
6288 * If queuing, the sector count goes in the features register
6289 * and the secount count will contain the tag.
6290 */
6291 if (using_queuing) {
6292 scmd->satacmd_features_reg =
6293 scmd->satacmd_sec_count_lsb;
6294 scmd->satacmd_sec_count_lsb = 0;
6295 scmd->satacmd_flags.sata_queued = B_TRUE;
6296
6297 /* Set-up maximum queue depth */
6298 scmd->satacmd_flags.sata_max_queue_depth =
6299 sdinfo->satadrv_max_queue_depth - 1;
6300 } else if (sdinfo->satadrv_features_enabled &
6301 SATA_DEV_F_E_UNTAGGED_QING) {
6302 /*
6303 * Although NCQ/TCQ is not enabled, untagged queuing
6304 * may be still used.
6305 * Set-up the maximum untagged queue depth.
6306 * Use controller's queue depth from sata_hba_tran.
6307 * SATA HBA drivers may ignore this value and rely on
6308 * the internal limits.For drivers that do not
6309 * ignore untaged queue depth, limit the value to
6310 * SATA_MAX_QUEUE_DEPTH (32), as this is the
6311 * largest value that can be passed via
6312 * satacmd_flags.sata_max_queue_depth.
6313 */
6314 scmd->satacmd_flags.sata_max_queue_depth =
6315 SATA_QDEPTH(shi) <= SATA_MAX_QUEUE_DEPTH ?
6316 SATA_QDEPTH(shi) - 1: SATA_MAX_QUEUE_DEPTH - 1;
6317
6318 } else {
6319 scmd->satacmd_flags.sata_max_queue_depth = 0;
6320 }
6321 } else
6322 scmd->satacmd_flags.sata_max_queue_depth = 0;
6323
6324 SATADBG3(SATA_DBG_HBA_IF, spx->txlt_sata_hba_inst,
6325 "sata_txlt_read cmd 0x%2x, lba %llx, sec count %x\n",
6326 scmd->satacmd_cmd_reg, lba, sec_count);
6327
6328 if (!(spx->txlt_sata_pkt->satapkt_op_mode & SATA_OPMODE_SYNCH)) {
6329 /* Need callback function */
6330 spx->txlt_sata_pkt->satapkt_comp = sata_txlt_rw_completion;
6331 synch = FALSE;
6332 } else
6333 synch = TRUE;
6334
6335 /* Transfer command to HBA */
6336 if (sata_hba_start(spx, &rval) != 0) {
6337 /* Pkt not accepted for execution */
6338 mutex_exit(cport_mutex);
6339 return (rval);
6340 }
6341 mutex_exit(cport_mutex);
6342 /*
6343 * If execution is non-synchronous,
6344 * a callback function will handle potential errors, translate
6345 * the response and will do a callback to a target driver.
6346 * If it was synchronous, check execution status using the same
6347 * framework callback.
6348 */
6349 if (synch) {
6350 SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
6351 "synchronous execution status %x\n",
6352 spx->txlt_sata_pkt->satapkt_reason);
6353 sata_txlt_rw_completion(spx->txlt_sata_pkt);
6354 }
6355 return (TRAN_ACCEPT);
6356 }
6357
6358
6359 /*
6360 * SATA translate command: Write (various types)
6361 * Translated into appropriate type of ATA WRITE command
6362 * for SATA hard disks.
6363 * Both the device capabilities and requested operation mode are
6364 * considered.
6365 *
6366 * Following scsi cdb fields are ignored:
6367 * rwprotect, dpo, fua, fua_nv, group_number.
6368 *
6369 * If SATA_ENABLE_QUEUING flag is set (in the global SATA HBA framework
6370 * enable variable sata_func_enable), the capability of the controller and
6371 * capability of a device are checked and if both support queueing, write
6372 * request will be translated to WRITE_DMA_QUEUEING or WRITE_DMA_QUEUEING_EXT
6373 * command rather than plain WRITE_XXX command.
6374 * If SATA_ENABLE_NCQ flag is set in addition to SATA_ENABLE_QUEUING flag and
6375 * both the controller and device suport such functionality, the write
6376 * request will be translated to WRITE_FPDMA_QUEUED command.
6377 * In both cases the maximum queue depth is derived as minimum of:
6378 * HBA capability,device capability and sata_max_queue_depth variable setting.
6379 * The value passed to HBA driver is decremented by 1, because only 5 bits are
6380 * used to pass max queue depth value, and the maximum possible queue depth
6381 * is 32.
6382 *
6383 * Returns TRAN_ACCEPT or code returned by sata_hba_start() and
6384 * appropriate values in scsi_pkt fields.
6385 */
6386 static int
sata_txlt_write(sata_pkt_txlate_t * spx)6387 sata_txlt_write(sata_pkt_txlate_t *spx)
6388 {
6389 struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
6390 sata_cmd_t *scmd = &spx->txlt_sata_pkt->satapkt_cmd;
6391 sata_drive_info_t *sdinfo;
6392 sata_hba_inst_t *shi = SATA_TXLT_HBA_INST(spx);
6393 uint16_t sec_count;
6394 uint64_t lba;
6395 int rval, reason;
6396 int synch;
6397 kmutex_t *cport_mutex = &(SATA_TXLT_CPORT_MUTEX(spx));
6398
6399 mutex_enter(cport_mutex);
6400
6401 if (((rval = sata_txlt_generic_pkt_info(spx, &reason, 0)) !=
6402 TRAN_ACCEPT) || (reason == CMD_DEV_GONE)) {
6403 mutex_exit(cport_mutex);
6404 return (rval);
6405 }
6406
6407 sdinfo = sata_get_device_info(spx->txlt_sata_hba_inst,
6408 &spx->txlt_sata_pkt->satapkt_device);
6409
6410 scmd->satacmd_flags.sata_data_direction = SATA_DIR_WRITE;
6411 /*
6412 * Extract LBA and sector count from scsi CDB
6413 */
6414 switch ((uint_t)scsipkt->pkt_cdbp[0]) {
6415 case SCMD_WRITE:
6416 /* 6-byte scsi read cmd : 0x0A */
6417 lba = (scsipkt->pkt_cdbp[1] & 0x1f);
6418 lba = (lba << 8) | scsipkt->pkt_cdbp[2];
6419 lba = (lba << 8) | scsipkt->pkt_cdbp[3];
6420 sec_count = scsipkt->pkt_cdbp[4];
6421 /* sec_count 0 will be interpreted as 256 by a device */
6422 break;
6423 case SCMD_WRITE_G1:
6424 /* 10-bytes scsi write command : 0x2A */
6425 lba = scsipkt->pkt_cdbp[2];
6426 lba = (lba << 8) | scsipkt->pkt_cdbp[3];
6427 lba = (lba << 8) | scsipkt->pkt_cdbp[4];
6428 lba = (lba << 8) | scsipkt->pkt_cdbp[5];
6429 sec_count = scsipkt->pkt_cdbp[7];
6430 sec_count = (sec_count << 8) | scsipkt->pkt_cdbp[8];
6431 break;
6432 case SCMD_WRITE_G5:
6433 /* 12-bytes scsi read command : 0xAA */
6434 lba = scsipkt->pkt_cdbp[2];
6435 lba = (lba << 8) | scsipkt->pkt_cdbp[3];
6436 lba = (lba << 8) | scsipkt->pkt_cdbp[4];
6437 lba = (lba << 8) | scsipkt->pkt_cdbp[5];
6438 sec_count = scsipkt->pkt_cdbp[6];
6439 sec_count = (sec_count << 8) | scsipkt->pkt_cdbp[7];
6440 sec_count = (sec_count << 8) | scsipkt->pkt_cdbp[8];
6441 sec_count = (sec_count << 8) | scsipkt->pkt_cdbp[9];
6442 break;
6443 case SCMD_WRITE_G4:
6444 /* 16-bytes scsi write command : 0x8A */
6445 lba = scsipkt->pkt_cdbp[2];
6446 lba = (lba << 8) | scsipkt->pkt_cdbp[3];
6447 lba = (lba << 8) | scsipkt->pkt_cdbp[4];
6448 lba = (lba << 8) | scsipkt->pkt_cdbp[5];
6449 lba = (lba << 8) | scsipkt->pkt_cdbp[6];
6450 lba = (lba << 8) | scsipkt->pkt_cdbp[7];
6451 lba = (lba << 8) | scsipkt->pkt_cdbp[8];
6452 lba = (lba << 8) | scsipkt->pkt_cdbp[9];
6453 sec_count = scsipkt->pkt_cdbp[10];
6454 sec_count = (sec_count << 8) | scsipkt->pkt_cdbp[11];
6455 sec_count = (sec_count << 8) | scsipkt->pkt_cdbp[12];
6456 sec_count = (sec_count << 8) | scsipkt->pkt_cdbp[13];
6457 break;
6458 default:
6459 /* Unsupported command */
6460 mutex_exit(cport_mutex);
6461 return (sata_txlt_invalid_command(spx));
6462 }
6463
6464 /*
6465 * Check if specified address and length exceeds device capacity
6466 */
6467 if ((lba >= sdinfo->satadrv_capacity) ||
6468 ((lba + sec_count) > sdinfo->satadrv_capacity)) {
6469 /* LBA out of range */
6470 mutex_exit(cport_mutex);
6471 return (sata_txlt_lba_out_of_range(spx));
6472 }
6473
6474 /*
6475 * For zero-length transfer, emulate good completion of the command
6476 * (reasons for rejecting the command were already checked).
6477 * No DMA resources were allocated.
6478 */
6479 if (spx->txlt_dma_cookie_list == NULL) {
6480 mutex_exit(cport_mutex);
6481 return (sata_emul_rw_completion(spx));
6482 }
6483
6484 /*
6485 * Build cmd block depending on the device capability and
6486 * requested operation mode.
6487 * Do not bother with non-dma mode- we are working only with
6488 * devices supporting DMA.
6489 */
6490 scmd->satacmd_addr_type = ATA_ADDR_LBA;
6491 scmd->satacmd_device_reg = SATA_ADH_LBA;
6492 scmd->satacmd_cmd_reg = SATAC_WRITE_DMA;
6493 if (sdinfo->satadrv_features_support & SATA_DEV_F_LBA48) {
6494 scmd->satacmd_addr_type = ATA_ADDR_LBA48;
6495 scmd->satacmd_cmd_reg = SATAC_WRITE_DMA_EXT;
6496 scmd->satacmd_sec_count_msb = sec_count >> 8;
6497 scmd->satacmd_lba_low_msb = (lba >> 24) & 0xff;
6498 #ifndef __lock_lint
6499 scmd->satacmd_lba_mid_msb = (lba >> 32) & 0xff;
6500 scmd->satacmd_lba_high_msb = lba >> 40;
6501 #endif
6502 } else if (sdinfo->satadrv_features_support & SATA_DEV_F_LBA28) {
6503 scmd->satacmd_addr_type = ATA_ADDR_LBA28;
6504 scmd->satacmd_device_reg = SATA_ADH_LBA | ((lba >> 24) & 0xf);
6505 }
6506 scmd->satacmd_sec_count_lsb = sec_count & 0xff;
6507 scmd->satacmd_lba_low_lsb = lba & 0xff;
6508 scmd->satacmd_lba_mid_lsb = (lba >> 8) & 0xff;
6509 scmd->satacmd_lba_high_lsb = (lba >> 16) & 0xff;
6510 scmd->satacmd_features_reg = 0;
6511 scmd->satacmd_status_reg = 0;
6512 scmd->satacmd_error_reg = 0;
6513
6514 /*
6515 * Check if queueing commands should be used and switch
6516 * to appropriate command if possible
6517 */
6518 if (sata_func_enable & SATA_ENABLE_QUEUING) {
6519 boolean_t using_queuing;
6520
6521 /* Queuing supported by controller and device? */
6522 if ((sata_func_enable & SATA_ENABLE_NCQ) &&
6523 (sdinfo->satadrv_features_support &
6524 SATA_DEV_F_NCQ) &&
6525 (SATA_FEATURES(spx->txlt_sata_hba_inst) &
6526 SATA_CTLF_NCQ)) {
6527 using_queuing = B_TRUE;
6528
6529 /* NCQ supported - use FPDMA WRITE */
6530 scmd->satacmd_cmd_reg =
6531 SATAC_WRITE_FPDMA_QUEUED;
6532 scmd->satacmd_features_reg_ext =
6533 scmd->satacmd_sec_count_msb;
6534 scmd->satacmd_sec_count_msb = 0;
6535 } else if ((sdinfo->satadrv_features_support &
6536 SATA_DEV_F_TCQ) &&
6537 (SATA_FEATURES(spx->txlt_sata_hba_inst) &
6538 SATA_CTLF_QCMD)) {
6539 using_queuing = B_TRUE;
6540
6541 /* Legacy queueing */
6542 if (sdinfo->satadrv_features_support &
6543 SATA_DEV_F_LBA48) {
6544 scmd->satacmd_cmd_reg =
6545 SATAC_WRITE_DMA_QUEUED_EXT;
6546 scmd->satacmd_features_reg_ext =
6547 scmd->satacmd_sec_count_msb;
6548 scmd->satacmd_sec_count_msb = 0;
6549 } else {
6550 scmd->satacmd_cmd_reg =
6551 SATAC_WRITE_DMA_QUEUED;
6552 }
6553 } else /* NCQ nor legacy queuing not supported */
6554 using_queuing = B_FALSE;
6555
6556 if (using_queuing) {
6557 scmd->satacmd_features_reg =
6558 scmd->satacmd_sec_count_lsb;
6559 scmd->satacmd_sec_count_lsb = 0;
6560 scmd->satacmd_flags.sata_queued = B_TRUE;
6561 /* Set-up maximum queue depth */
6562 scmd->satacmd_flags.sata_max_queue_depth =
6563 sdinfo->satadrv_max_queue_depth - 1;
6564 } else if (sdinfo->satadrv_features_enabled &
6565 SATA_DEV_F_E_UNTAGGED_QING) {
6566 /*
6567 * Although NCQ/TCQ is not enabled, untagged queuing
6568 * may be still used.
6569 * Set-up the maximum untagged queue depth.
6570 * Use controller's queue depth from sata_hba_tran.
6571 * SATA HBA drivers may ignore this value and rely on
6572 * the internal limits. For drivera that do not
6573 * ignore untaged queue depth, limit the value to
6574 * SATA_MAX_QUEUE_DEPTH (32), as this is the
6575 * largest value that can be passed via
6576 * satacmd_flags.sata_max_queue_depth.
6577 */
6578 scmd->satacmd_flags.sata_max_queue_depth =
6579 SATA_QDEPTH(shi) <= SATA_MAX_QUEUE_DEPTH ?
6580 SATA_QDEPTH(shi) - 1: SATA_MAX_QUEUE_DEPTH - 1;
6581
6582 } else {
6583 scmd->satacmd_flags.sata_max_queue_depth = 0;
6584 }
6585 } else
6586 scmd->satacmd_flags.sata_max_queue_depth = 0;
6587
6588 SATADBG3(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
6589 "sata_txlt_write cmd 0x%2x, lba %llx, sec count %x\n",
6590 scmd->satacmd_cmd_reg, lba, sec_count);
6591
6592 if (!(spx->txlt_sata_pkt->satapkt_op_mode & SATA_OPMODE_SYNCH)) {
6593 /* Need callback function */
6594 spx->txlt_sata_pkt->satapkt_comp = sata_txlt_rw_completion;
6595 synch = FALSE;
6596 } else
6597 synch = TRUE;
6598
6599 /* Transfer command to HBA */
6600 if (sata_hba_start(spx, &rval) != 0) {
6601 /* Pkt not accepted for execution */
6602 mutex_exit(cport_mutex);
6603 return (rval);
6604 }
6605 mutex_exit(cport_mutex);
6606
6607 /*
6608 * If execution is non-synchronous,
6609 * a callback function will handle potential errors, translate
6610 * the response and will do a callback to a target driver.
6611 * If it was synchronous, check execution status using the same
6612 * framework callback.
6613 */
6614 if (synch) {
6615 SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
6616 "synchronous execution status %x\n",
6617 spx->txlt_sata_pkt->satapkt_reason);
6618 sata_txlt_rw_completion(spx->txlt_sata_pkt);
6619 }
6620 return (TRAN_ACCEPT);
6621 }
6622
6623
6624 /*
6625 * Implements SCSI SBC WRITE BUFFER command download microcode option
6626 */
6627 static int
sata_txlt_write_buffer(sata_pkt_txlate_t * spx)6628 sata_txlt_write_buffer(sata_pkt_txlate_t *spx)
6629 {
6630 #define WB_DOWNLOAD_MICROCODE_AND_REVERT_MODE 4
6631 #define WB_DOWNLOAD_MICROCODE_AND_SAVE_MODE 5
6632
6633 struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
6634 struct sata_pkt *sata_pkt = spx->txlt_sata_pkt;
6635 sata_cmd_t *scmd = &spx->txlt_sata_pkt->satapkt_cmd;
6636
6637 struct buf *bp = spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp;
6638 struct scsi_extended_sense *sense;
6639 int rval, mode, sector_count, reason;
6640 kmutex_t *cport_mutex = &(SATA_TXLT_CPORT_MUTEX(spx));
6641
6642 mode = scsipkt->pkt_cdbp[1] & 0x1f;
6643
6644 SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
6645 "sata_txlt_write_buffer, mode 0x%x\n", mode);
6646
6647 mutex_enter(cport_mutex);
6648
6649 if ((rval = sata_txlt_generic_pkt_info(spx, &reason, 1)) !=
6650 TRAN_ACCEPT) {
6651 mutex_exit(cport_mutex);
6652 return (rval);
6653 }
6654
6655 /* Use synchronous mode */
6656 spx->txlt_sata_pkt->satapkt_op_mode
6657 |= SATA_OPMODE_SYNCH | SATA_OPMODE_INTERRUPTS;
6658
6659 scmd->satacmd_flags.sata_data_direction = SATA_DIR_WRITE;
6660
6661 scsipkt->pkt_reason = CMD_CMPLT;
6662 scsipkt->pkt_state = STATE_GOT_BUS | STATE_GOT_TARGET |
6663 STATE_SENT_CMD | STATE_GOT_STATUS;
6664
6665 /*
6666 * The SCSI to ATA translation specification only calls
6667 * for WB_DOWNLOAD_MICROCODE_AND_SAVE_MODE.
6668 * WB_DOWNLOAD_MICROC_AND_REVERT_MODE is implemented, but
6669 * ATA 8 (draft) got rid of download microcode for temp
6670 * and it is even optional for ATA 7, so it may be aborted.
6671 * WB_DOWNLOAD_MICROCODE_WITH_OFFSET is not implemented as
6672 * it is not specified and the buffer offset for SCSI is a 16-bit
6673 * value in bytes, but for ATA it is a 16-bit offset in 512 byte
6674 * sectors. Thus the offset really doesn't buy us anything.
6675 * If and when ATA 8 is stabilized and the SCSI to ATA specification
6676 * is revised, this can be revisisted.
6677 */
6678 /* Reject not supported request */
6679 switch (mode) {
6680 case WB_DOWNLOAD_MICROCODE_AND_REVERT_MODE:
6681 scmd->satacmd_features_reg = SATA_DOWNLOAD_MCODE_TEMP;
6682 break;
6683 case WB_DOWNLOAD_MICROCODE_AND_SAVE_MODE:
6684 scmd->satacmd_features_reg = SATA_DOWNLOAD_MCODE_SAVE;
6685 break;
6686 default:
6687 goto bad_param;
6688 }
6689
6690 *scsipkt->pkt_scbp = STATUS_GOOD; /* Presumed outcome */
6691
6692 scmd->satacmd_cmd_reg = SATAC_DOWNLOAD_MICROCODE;
6693 if ((bp->b_bcount % SATA_DISK_SECTOR_SIZE) != 0)
6694 goto bad_param;
6695 sector_count = bp->b_bcount / SATA_DISK_SECTOR_SIZE;
6696 scmd->satacmd_sec_count_lsb = (uint8_t)sector_count;
6697 scmd->satacmd_lba_low_lsb = ((uint16_t)sector_count) >> 8;
6698 scmd->satacmd_lba_mid_lsb = 0;
6699 scmd->satacmd_lba_high_lsb = 0;
6700 scmd->satacmd_device_reg = 0;
6701 spx->txlt_sata_pkt->satapkt_comp = NULL;
6702 scmd->satacmd_addr_type = 0;
6703
6704 /* Transfer command to HBA */
6705 if (sata_hba_start(spx, &rval) != 0) {
6706 /* Pkt not accepted for execution */
6707 mutex_exit(cport_mutex);
6708 return (rval);
6709 }
6710
6711 mutex_exit(cport_mutex);
6712
6713 /* Then we need synchronous check the status of the disk */
6714 scsipkt->pkt_state = STATE_GOT_BUS | STATE_GOT_TARGET |
6715 STATE_SENT_CMD | STATE_XFERRED_DATA | STATE_GOT_STATUS;
6716 if (sata_pkt->satapkt_reason == SATA_PKT_COMPLETED) {
6717 scsipkt->pkt_reason = CMD_CMPLT;
6718
6719 /* Download commmand succeed, so probe and identify device */
6720 sata_reidentify_device(spx);
6721 } else {
6722 /* Something went wrong, microcode download command failed */
6723 scsipkt->pkt_reason = CMD_INCOMPLETE;
6724 *scsipkt->pkt_scbp = STATUS_CHECK;
6725 sense = sata_arq_sense(spx);
6726 switch (sata_pkt->satapkt_reason) {
6727 case SATA_PKT_PORT_ERROR:
6728 /*
6729 * We have no device data. Assume no data transfered.
6730 */
6731 sense->es_key = KEY_HARDWARE_ERROR;
6732 break;
6733
6734 case SATA_PKT_DEV_ERROR:
6735 if (sata_pkt->satapkt_cmd.satacmd_status_reg &
6736 SATA_STATUS_ERR) {
6737 /*
6738 * determine dev error reason from error
6739 * reg content
6740 */
6741 sata_decode_device_error(spx, sense);
6742 break;
6743 }
6744 /* No extended sense key - no info available */
6745 break;
6746
6747 case SATA_PKT_TIMEOUT:
6748 scsipkt->pkt_reason = CMD_TIMEOUT;
6749 scsipkt->pkt_statistics |=
6750 STAT_TIMEOUT | STAT_DEV_RESET;
6751 /* No extended sense key ? */
6752 break;
6753
6754 case SATA_PKT_ABORTED:
6755 scsipkt->pkt_reason = CMD_ABORTED;
6756 scsipkt->pkt_statistics |= STAT_ABORTED;
6757 /* No extended sense key ? */
6758 break;
6759
6760 case SATA_PKT_RESET:
6761 /* pkt aborted by an explicit reset from a host */
6762 scsipkt->pkt_reason = CMD_RESET;
6763 scsipkt->pkt_statistics |= STAT_DEV_RESET;
6764 break;
6765
6766 default:
6767 SATA_LOG_D((spx->txlt_sata_hba_inst, CE_WARN,
6768 "sata_txlt_nodata_cmd_completion: "
6769 "invalid packet completion reason %d",
6770 sata_pkt->satapkt_reason));
6771 scsipkt->pkt_reason = CMD_TRAN_ERR;
6772 break;
6773 }
6774
6775 SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
6776 "scsi_pkt completion reason %x\n", scsipkt->pkt_reason);
6777
6778 if ((scsipkt->pkt_flags & FLAG_NOINTR) == 0)
6779 /* scsi callback required */
6780 scsi_hba_pkt_comp(scsipkt);
6781 }
6782 return (TRAN_ACCEPT);
6783
6784 bad_param:
6785 mutex_exit(cport_mutex);
6786 *scsipkt->pkt_scbp = STATUS_CHECK;
6787 sense = sata_arq_sense(spx);
6788 sense->es_key = KEY_ILLEGAL_REQUEST;
6789 sense->es_add_code = SD_SCSI_ASC_INVALID_FIELD_IN_CDB;
6790 if ((scsipkt->pkt_flags & FLAG_NOINTR) == 0 &&
6791 scsipkt->pkt_comp != NULL) {
6792 /* scsi callback required */
6793 if (servicing_interrupt()) {
6794 if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
6795 (task_func_t *)spx->txlt_scsi_pkt->pkt_comp,
6796 (void *)spx->txlt_scsi_pkt, TQ_NOSLEEP) == NULL) {
6797 return (TRAN_BUSY);
6798 }
6799 } else if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
6800 (task_func_t *)spx->txlt_scsi_pkt->pkt_comp,
6801 (void *)spx->txlt_scsi_pkt, TQ_SLEEP) == NULL) {
6802 /* Scheduling the callback failed */
6803 return (TRAN_BUSY);
6804 }
6805 }
6806 return (rval);
6807 }
6808
6809 /*
6810 * Re-identify device after doing a firmware download.
6811 */
6812 static void
sata_reidentify_device(sata_pkt_txlate_t * spx)6813 sata_reidentify_device(sata_pkt_txlate_t *spx)
6814 {
6815 #define DOWNLOAD_WAIT_TIME_SECS 60
6816 #define DOWNLOAD_WAIT_INTERVAL_SECS 1
6817 int rval;
6818 int retry_cnt;
6819 struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
6820 sata_hba_inst_t *sata_hba_inst = spx->txlt_sata_hba_inst;
6821 sata_device_t sata_device = spx->txlt_sata_pkt->satapkt_device;
6822 sata_drive_info_t *sdinfo;
6823
6824 /*
6825 * Before returning good status, probe device.
6826 * Device probing will get IDENTIFY DEVICE data, if possible.
6827 * The assumption is that the new microcode is applied by the
6828 * device. It is a caller responsibility to verify this.
6829 */
6830 for (retry_cnt = 0;
6831 retry_cnt < DOWNLOAD_WAIT_TIME_SECS / DOWNLOAD_WAIT_INTERVAL_SECS;
6832 retry_cnt++) {
6833 rval = sata_probe_device(sata_hba_inst, &sata_device);
6834
6835 if (rval == SATA_SUCCESS) { /* Set default features */
6836 sdinfo = sata_get_device_info(sata_hba_inst,
6837 &sata_device);
6838 if (sata_initialize_device(sata_hba_inst, sdinfo) !=
6839 SATA_SUCCESS) {
6840 /* retry */
6841 rval = sata_initialize_device(sata_hba_inst,
6842 sdinfo);
6843 if (rval == SATA_RETRY)
6844 sata_log(sata_hba_inst, CE_WARN,
6845 "SATA device at port %d pmport %d -"
6846 " default device features could not"
6847 " be set. Device may not operate "
6848 "as expected.",
6849 sata_device.satadev_addr.cport,
6850 sata_device.satadev_addr.pmport);
6851 }
6852 if ((scsipkt->pkt_flags & FLAG_NOINTR) == 0)
6853 scsi_hba_pkt_comp(scsipkt);
6854 return;
6855 } else if (rval == SATA_RETRY) {
6856 delay(drv_usectohz(1000000 *
6857 DOWNLOAD_WAIT_INTERVAL_SECS));
6858 continue;
6859 } else /* failed - no reason to retry */
6860 break;
6861 }
6862
6863 /*
6864 * Something went wrong, device probing failed.
6865 */
6866 SATA_LOG_D((sata_hba_inst, CE_WARN,
6867 "Cannot probe device after downloading microcode\n"));
6868
6869 /* Reset device to force retrying the probe. */
6870 (void) (*SATA_RESET_DPORT_FUNC(sata_hba_inst))
6871 (SATA_DIP(sata_hba_inst), &sata_device);
6872
6873 if ((scsipkt->pkt_flags & FLAG_NOINTR) == 0)
6874 scsi_hba_pkt_comp(scsipkt);
6875 }
6876
6877
6878 /*
6879 * Translate command: Synchronize Cache.
6880 * Translates into Flush Cache command for SATA hard disks.
6881 *
6882 * Returns TRAN_ACCEPT or code returned by sata_hba_start() and
6883 * appropriate values in scsi_pkt fields.
6884 */
6885 static int
sata_txlt_synchronize_cache(sata_pkt_txlate_t * spx)6886 sata_txlt_synchronize_cache(sata_pkt_txlate_t *spx)
6887 {
6888 sata_cmd_t *scmd = &spx->txlt_sata_pkt->satapkt_cmd;
6889 kmutex_t *cport_mutex = &(SATA_TXLT_CPORT_MUTEX(spx));
6890 int rval, reason;
6891 int synch;
6892
6893 mutex_enter(cport_mutex);
6894
6895 if (((rval = sata_txlt_generic_pkt_info(spx, &reason, 1)) !=
6896 TRAN_ACCEPT) || (reason == CMD_DEV_GONE)) {
6897 mutex_exit(cport_mutex);
6898 return (rval);
6899 }
6900
6901 scmd->satacmd_addr_type = 0;
6902 scmd->satacmd_cmd_reg = SATAC_FLUSH_CACHE;
6903 scmd->satacmd_device_reg = 0;
6904 scmd->satacmd_sec_count_lsb = 0;
6905 scmd->satacmd_lba_low_lsb = 0;
6906 scmd->satacmd_lba_mid_lsb = 0;
6907 scmd->satacmd_lba_high_lsb = 0;
6908 scmd->satacmd_features_reg = 0;
6909 scmd->satacmd_status_reg = 0;
6910 scmd->satacmd_error_reg = 0;
6911
6912 SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
6913 "sata_txlt_synchronize_cache\n", NULL);
6914
6915 if (!(spx->txlt_sata_pkt->satapkt_op_mode & SATA_OPMODE_SYNCH)) {
6916 /* Need to set-up a callback function */
6917 spx->txlt_sata_pkt->satapkt_comp =
6918 sata_txlt_nodata_cmd_completion;
6919 synch = FALSE;
6920 } else
6921 synch = TRUE;
6922
6923 /* Transfer command to HBA */
6924 if (sata_hba_start(spx, &rval) != 0) {
6925 /* Pkt not accepted for execution */
6926 mutex_exit(cport_mutex);
6927 return (rval);
6928 }
6929 mutex_exit(cport_mutex);
6930
6931 /*
6932 * If execution non-synchronous, it had to be completed
6933 * a callback function will handle potential errors, translate
6934 * the response and will do a callback to a target driver.
6935 * If it was synchronous, check status, using the same
6936 * framework callback.
6937 */
6938 if (synch) {
6939 SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
6940 "synchronous execution status %x\n",
6941 spx->txlt_sata_pkt->satapkt_reason);
6942 sata_txlt_nodata_cmd_completion(spx->txlt_sata_pkt);
6943 }
6944 return (TRAN_ACCEPT);
6945 }
6946
6947
6948 /*
6949 * Send pkt to SATA HBA driver
6950 *
6951 * This function may be called only if the operation is requested by scsi_pkt,
6952 * i.e. scsi_pkt is not NULL.
6953 *
6954 * This function has to be called with cport mutex held. It does release
6955 * the mutex when it calls HBA driver sata_tran_start function and
6956 * re-acquires it afterwards.
6957 *
6958 * If return value is 0, pkt was accepted, -1 otherwise
6959 * rval is set to appropriate sata_scsi_start return value.
6960 *
6961 * Note 1:If HBA driver returns value other than TRAN_ACCEPT, it should not
6962 * have called the sata_pkt callback function for this packet.
6963 *
6964 * The scsi callback has to be performed by the caller of this routine.
6965 */
6966 static int
sata_hba_start(sata_pkt_txlate_t * spx,int * rval)6967 sata_hba_start(sata_pkt_txlate_t *spx, int *rval)
6968 {
6969 int stat;
6970 uint8_t cport = SATA_TXLT_CPORT(spx);
6971 uint8_t pmport = SATA_TXLT_PMPORT(spx);
6972 sata_hba_inst_t *sata_hba_inst = spx->txlt_sata_hba_inst;
6973 sata_drive_info_t *sdinfo;
6974 sata_pmult_info_t *pminfo;
6975 sata_pmport_info_t *pmportinfo = NULL;
6976 sata_device_t *sata_device = NULL;
6977 uint8_t cmd;
6978 struct sata_cmd_flags cmd_flags;
6979
6980 ASSERT(spx->txlt_sata_pkt != NULL);
6981
6982 ASSERT(mutex_owned(&SATA_CPORT_MUTEX(sata_hba_inst, cport)));
6983
6984 sdinfo = sata_get_device_info(sata_hba_inst,
6985 &spx->txlt_sata_pkt->satapkt_device);
6986 ASSERT(sdinfo != NULL);
6987
6988 /* Clear device reset state? */
6989 /* qual should be XXX_DPMPORT, but add XXX_PMPORT in case */
6990 if (sdinfo->satadrv_addr.qual == SATA_ADDR_DPMPORT ||
6991 sdinfo->satadrv_addr.qual == SATA_ADDR_PMPORT) {
6992
6993 /*
6994 * Get the pmult_info of the its parent port multiplier, all
6995 * sub-devices share a common device reset flags on in
6996 * pmult_info.
6997 */
6998 pminfo = SATA_PMULT_INFO(sata_hba_inst, cport);
6999 pmportinfo = pminfo->pmult_dev_port[pmport];
7000 ASSERT(pminfo != NULL);
7001 if (pminfo->pmult_event_flags & SATA_EVNT_CLEAR_DEVICE_RESET) {
7002 spx->txlt_sata_pkt->satapkt_cmd.satacmd_flags.
7003 sata_clear_dev_reset = B_TRUE;
7004 pminfo->pmult_event_flags &=
7005 ~SATA_EVNT_CLEAR_DEVICE_RESET;
7006 SATADBG1(SATA_DBG_EVENTS, sata_hba_inst,
7007 "sata_hba_start: clearing device reset state"
7008 "on pmult.\n", NULL);
7009 }
7010 } else {
7011 if (sdinfo->satadrv_event_flags &
7012 SATA_EVNT_CLEAR_DEVICE_RESET) {
7013 spx->txlt_sata_pkt->satapkt_cmd.satacmd_flags.
7014 sata_clear_dev_reset = B_TRUE;
7015 sdinfo->satadrv_event_flags &=
7016 ~SATA_EVNT_CLEAR_DEVICE_RESET;
7017 SATADBG1(SATA_DBG_EVENTS, sata_hba_inst,
7018 "sata_hba_start: clearing device reset state\n",
7019 NULL);
7020 }
7021 }
7022
7023 cmd = spx->txlt_sata_pkt->satapkt_cmd.satacmd_cmd_reg;
7024 cmd_flags = spx->txlt_sata_pkt->satapkt_cmd.satacmd_flags;
7025 sata_device = &spx->txlt_sata_pkt->satapkt_device;
7026
7027 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst, cport)));
7028
7029 SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
7030 "Sata cmd 0x%2x\n", cmd);
7031
7032 stat = (*SATA_START_FUNC(sata_hba_inst))(SATA_DIP(sata_hba_inst),
7033 spx->txlt_sata_pkt);
7034 mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst, cport)));
7035 /*
7036 * If sata pkt was accepted and executed in asynchronous mode, i.e.
7037 * with the sata callback, the sata_pkt could be already destroyed
7038 * by the time we check ther return status from the hba_start()
7039 * function, because sata_scsi_destroy_pkt() could have been already
7040 * called (perhaps in the interrupt context). So, in such case, there
7041 * should be no references to it. In other cases, sata_pkt still
7042 * exists.
7043 */
7044 if (stat == SATA_TRAN_ACCEPTED) {
7045 /*
7046 * pkt accepted for execution.
7047 * If it was executed synchronously, it is already completed
7048 * and pkt completion_reason indicates completion status.
7049 */
7050 *rval = TRAN_ACCEPT;
7051 return (0);
7052 }
7053
7054 sdinfo = sata_get_device_info(sata_hba_inst, sata_device);
7055 switch (stat) {
7056 case SATA_TRAN_QUEUE_FULL:
7057 /*
7058 * Controller detected queue full condition.
7059 */
7060 SATADBG1(SATA_DBG_HBA_IF, sata_hba_inst,
7061 "sata_hba_start: queue full\n", NULL);
7062
7063 spx->txlt_scsi_pkt->pkt_reason = CMD_INCOMPLETE;
7064 *spx->txlt_scsi_pkt->pkt_scbp = STATUS_QFULL;
7065
7066 *rval = TRAN_BUSY;
7067 break;
7068
7069 case SATA_TRAN_PORT_ERROR:
7070 /*
7071 * Communication/link with device or general port error
7072 * detected before pkt execution begun.
7073 */
7074 if (spx->txlt_sata_pkt->satapkt_device.satadev_addr.qual ==
7075 SATA_ADDR_CPORT ||
7076 spx->txlt_sata_pkt->satapkt_device.satadev_addr.qual ==
7077 SATA_ADDR_DCPORT)
7078 sata_log(sata_hba_inst, CE_CONT,
7079 "SATA port %d error",
7080 sata_device->satadev_addr.cport);
7081 else
7082 sata_log(sata_hba_inst, CE_CONT,
7083 "SATA port %d:%d error\n",
7084 sata_device->satadev_addr.cport,
7085 sata_device->satadev_addr.pmport);
7086
7087 /*
7088 * Update the port/device structure.
7089 * sata_pkt should be still valid. Since port error is
7090 * returned, sata_device content should reflect port
7091 * state - it means, that sata address have been changed,
7092 * because original packet's sata address refered to a device
7093 * attached to some port.
7094 */
7095 if (sata_device->satadev_addr.qual == SATA_ADDR_DPMPORT ||
7096 sata_device->satadev_addr.qual == SATA_ADDR_PMPORT) {
7097 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst, cport)));
7098 mutex_enter(&pmportinfo->pmport_mutex);
7099 sata_update_pmport_info(sata_hba_inst, sata_device);
7100 mutex_exit(&pmportinfo->pmport_mutex);
7101 mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst, cport)));
7102 } else {
7103 sata_update_port_info(sata_hba_inst, sata_device);
7104 }
7105
7106 spx->txlt_scsi_pkt->pkt_reason = CMD_TRAN_ERR;
7107 *rval = TRAN_FATAL_ERROR;
7108 break;
7109
7110 case SATA_TRAN_CMD_UNSUPPORTED:
7111 /*
7112 * Command rejected by HBA as unsupported. It was HBA driver
7113 * that rejected the command, command was not sent to
7114 * an attached device.
7115 */
7116 if ((sdinfo != NULL) &&
7117 (sdinfo->satadrv_state & SATA_DSTATE_RESET))
7118 SATADBG1(SATA_DBG_EVENTS, sata_hba_inst,
7119 "sat_hba_start: cmd 0x%2x rejected "
7120 "with SATA_TRAN_CMD_UNSUPPORTED status\n", cmd);
7121
7122 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst, cport)));
7123 (void) sata_txlt_invalid_command(spx);
7124 mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst, cport)));
7125
7126 *rval = TRAN_ACCEPT;
7127 break;
7128
7129 case SATA_TRAN_BUSY:
7130 /*
7131 * Command rejected by HBA because other operation prevents
7132 * accepting the packet, or device is in RESET condition.
7133 */
7134 if (sdinfo != NULL) {
7135 sdinfo->satadrv_state =
7136 spx->txlt_sata_pkt->satapkt_device.satadev_state;
7137
7138 if (sdinfo->satadrv_state & SATA_DSTATE_RESET) {
7139 SATADBG1(SATA_DBG_EVENTS, sata_hba_inst,
7140 "sata_hba_start: cmd 0x%2x rejected "
7141 "because of device reset condition\n",
7142 cmd);
7143 } else {
7144 SATADBG1(SATA_DBG_EVENTS, sata_hba_inst,
7145 "sata_hba_start: cmd 0x%2x rejected "
7146 "with SATA_TRAN_BUSY status\n",
7147 cmd);
7148 }
7149 }
7150 spx->txlt_scsi_pkt->pkt_reason = CMD_INCOMPLETE;
7151 *rval = TRAN_BUSY;
7152 break;
7153
7154 default:
7155 /* Unrecognized HBA response */
7156 SATA_LOG_D((sata_hba_inst, CE_WARN,
7157 "sata_hba_start: unrecognized HBA response "
7158 "to cmd : 0x%2x resp 0x%x", cmd, rval));
7159 spx->txlt_scsi_pkt->pkt_reason = CMD_TRAN_ERR;
7160 *rval = TRAN_FATAL_ERROR;
7161 break;
7162 }
7163
7164 /*
7165 * If we got here, the packet was rejected.
7166 * Check if we need to remember reset state clearing request
7167 */
7168 if (cmd_flags.sata_clear_dev_reset) {
7169 /*
7170 * Check if device is still configured - it may have
7171 * disapeared from the configuration
7172 */
7173 sdinfo = sata_get_device_info(sata_hba_inst, sata_device);
7174 if (sdinfo != NULL) {
7175 /*
7176 * Restore the flag that requests clearing of
7177 * the device reset state,
7178 * so the next sata packet may carry it to HBA.
7179 */
7180 if (sdinfo->satadrv_addr.qual == SATA_ADDR_PMPORT ||
7181 sdinfo->satadrv_addr.qual == SATA_ADDR_DPMPORT) {
7182 pminfo->pmult_event_flags |=
7183 SATA_EVNT_CLEAR_DEVICE_RESET;
7184 } else {
7185 sdinfo->satadrv_event_flags |=
7186 SATA_EVNT_CLEAR_DEVICE_RESET;
7187 }
7188 }
7189 }
7190 return (-1);
7191 }
7192
7193 /*
7194 * Scsi response setup for invalid LBA
7195 *
7196 * Returns TRAN_ACCEPT and appropriate values in scsi_pkt fields.
7197 */
7198 static int
sata_txlt_lba_out_of_range(sata_pkt_txlate_t * spx)7199 sata_txlt_lba_out_of_range(sata_pkt_txlate_t *spx)
7200 {
7201 struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
7202 struct scsi_extended_sense *sense;
7203
7204 scsipkt->pkt_reason = CMD_CMPLT;
7205 scsipkt->pkt_state = STATE_GOT_BUS | STATE_GOT_TARGET |
7206 STATE_SENT_CMD | STATE_GOT_STATUS;
7207 *scsipkt->pkt_scbp = STATUS_CHECK;
7208
7209 *scsipkt->pkt_scbp = STATUS_CHECK;
7210 sense = sata_arq_sense(spx);
7211 sense->es_key = KEY_ILLEGAL_REQUEST;
7212 sense->es_add_code = SD_SCSI_ASC_LBA_OUT_OF_RANGE;
7213
7214 SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
7215 "Scsi_pkt completion reason %x\n", scsipkt->pkt_reason);
7216
7217 if ((scsipkt->pkt_flags & FLAG_NOINTR) == 0 &&
7218 scsipkt->pkt_comp != NULL) {
7219 /* scsi callback required */
7220 if (servicing_interrupt()) {
7221 if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
7222 (task_func_t *)spx->txlt_scsi_pkt->pkt_comp,
7223 (void *)spx->txlt_scsi_pkt, TQ_NOSLEEP) == NULL) {
7224 return (TRAN_BUSY);
7225 }
7226 } else if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
7227 (task_func_t *)spx->txlt_scsi_pkt->pkt_comp,
7228 (void *)spx->txlt_scsi_pkt, TQ_SLEEP) == NULL) {
7229 /* Scheduling the callback failed */
7230 return (TRAN_BUSY);
7231 }
7232 }
7233 return (TRAN_ACCEPT);
7234 }
7235
7236
7237 /*
7238 * Analyze device status and error registers and translate them into
7239 * appropriate scsi sense codes.
7240 * NOTE: non-packet commands only for now
7241 */
7242 static void
sata_decode_device_error(sata_pkt_txlate_t * spx,struct scsi_extended_sense * sense)7243 sata_decode_device_error(sata_pkt_txlate_t *spx,
7244 struct scsi_extended_sense *sense)
7245 {
7246 uint8_t err_reg = spx->txlt_sata_pkt->satapkt_cmd.satacmd_error_reg;
7247
7248 ASSERT(sense != NULL);
7249 ASSERT(spx->txlt_sata_pkt->satapkt_cmd.satacmd_status_reg &
7250 SATA_STATUS_ERR);
7251
7252
7253 if (err_reg & SATA_ERROR_ICRC) {
7254 sense->es_key = KEY_ABORTED_COMMAND;
7255 sense->es_add_code = 0x08; /* Communication failure */
7256 return;
7257 }
7258
7259 if (err_reg & SATA_ERROR_UNC) {
7260 sense->es_key = KEY_MEDIUM_ERROR;
7261 /* Information bytes (LBA) need to be set by a caller */
7262 return;
7263 }
7264
7265 /* ADD HERE: MC error bit handling for ATAPI CD/DVD */
7266 if (err_reg & (SATA_ERROR_MCR | SATA_ERROR_NM)) {
7267 sense->es_key = KEY_UNIT_ATTENTION;
7268 sense->es_add_code = 0x3a; /* No media present */
7269 return;
7270 }
7271
7272 if (err_reg & SATA_ERROR_IDNF) {
7273 if (err_reg & SATA_ERROR_ABORT) {
7274 sense->es_key = KEY_ABORTED_COMMAND;
7275 } else {
7276 sense->es_key = KEY_ILLEGAL_REQUEST;
7277 sense->es_add_code = 0x21; /* LBA out of range */
7278 }
7279 return;
7280 }
7281
7282 if (err_reg & SATA_ERROR_ABORT) {
7283 ASSERT(spx->txlt_sata_pkt != NULL);
7284 sense->es_key = KEY_ABORTED_COMMAND;
7285 return;
7286 }
7287 }
7288
7289 /*
7290 * Extract error LBA from sata_pkt.satapkt_cmd register fields
7291 */
7292 static void
sata_extract_error_lba(sata_pkt_txlate_t * spx,uint64_t * lba)7293 sata_extract_error_lba(sata_pkt_txlate_t *spx, uint64_t *lba)
7294 {
7295 sata_cmd_t *sata_cmd = &spx->txlt_sata_pkt->satapkt_cmd;
7296
7297 *lba = 0;
7298 if (sata_cmd->satacmd_addr_type == ATA_ADDR_LBA48) {
7299 *lba = sata_cmd->satacmd_lba_high_msb;
7300 *lba = (*lba << 8) | sata_cmd->satacmd_lba_mid_msb;
7301 *lba = (*lba << 8) | sata_cmd->satacmd_lba_low_msb;
7302 } else if (sata_cmd->satacmd_addr_type == ATA_ADDR_LBA28) {
7303 *lba = sata_cmd->satacmd_device_reg & 0xf;
7304 }
7305 *lba = (*lba << 8) | sata_cmd->satacmd_lba_high_lsb;
7306 *lba = (*lba << 8) | sata_cmd->satacmd_lba_mid_lsb;
7307 *lba = (*lba << 8) | sata_cmd->satacmd_lba_low_lsb;
7308 }
7309
7310 /*
7311 * This is fixed sense format - if LBA exceeds the info field size,
7312 * no valid info will be returned (valid bit in extended sense will
7313 * be set to 0).
7314 */
7315 static struct scsi_extended_sense *
sata_arq_sense(sata_pkt_txlate_t * spx)7316 sata_arq_sense(sata_pkt_txlate_t *spx)
7317 {
7318 struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
7319 struct scsi_arq_status *arqs;
7320 struct scsi_extended_sense *sense;
7321
7322 /* Fill ARQ sense data */
7323 scsipkt->pkt_state |= STATE_ARQ_DONE;
7324 arqs = (struct scsi_arq_status *)scsipkt->pkt_scbp;
7325 *(uchar_t *)&arqs->sts_status = STATUS_CHECK;
7326 *(uchar_t *)&arqs->sts_rqpkt_status = STATUS_GOOD;
7327 arqs->sts_rqpkt_reason = CMD_CMPLT;
7328 arqs->sts_rqpkt_state = STATE_GOT_BUS | STATE_GOT_TARGET |
7329 STATE_XFERRED_DATA | STATE_SENT_CMD | STATE_GOT_STATUS;
7330 arqs->sts_rqpkt_resid = 0;
7331 sense = &arqs->sts_sensedata;
7332 bzero(sense, sizeof (struct scsi_extended_sense));
7333 sata_fixed_sense_data_preset(sense);
7334 return (sense);
7335 }
7336
7337 /*
7338 * ATA Pass Through support
7339 * Sets flags indicating that an invalid value was found in some
7340 * field in the command. It could be something illegal according to
7341 * the SAT-2 spec or it could be a feature that is not (yet?)
7342 * supported.
7343 */
7344 static int
sata_txlt_ata_pass_thru_illegal_cmd(sata_pkt_txlate_t * spx)7345 sata_txlt_ata_pass_thru_illegal_cmd(sata_pkt_txlate_t *spx)
7346 {
7347 struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
7348 struct scsi_extended_sense *sense = sata_arq_sense(spx);
7349
7350 scsipkt->pkt_reason = CMD_CMPLT;
7351 *scsipkt->pkt_scbp = STATUS_CHECK;
7352 scsipkt->pkt_state = STATE_GOT_BUS | STATE_GOT_TARGET |
7353 STATE_SENT_CMD | STATE_GOT_STATUS;
7354
7355 sense = sata_arq_sense(spx);
7356 sense->es_key = KEY_ILLEGAL_REQUEST;
7357 sense->es_add_code = SD_SCSI_ASC_INVALID_FIELD_IN_CDB;
7358
7359 if ((scsipkt->pkt_flags & FLAG_NOINTR) == 0 &&
7360 scsipkt->pkt_comp != NULL) {
7361 /* scsi callback required */
7362 if (servicing_interrupt()) {
7363 if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
7364 (task_func_t *)spx->txlt_scsi_pkt->pkt_comp,
7365 (void *)spx->txlt_scsi_pkt, TQ_NOSLEEP) == NULL) {
7366 return (TRAN_BUSY);
7367 }
7368 } else if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
7369 (task_func_t *)spx->txlt_scsi_pkt->pkt_comp,
7370 (void *)spx->txlt_scsi_pkt, TQ_SLEEP) == NULL) {
7371 /* Scheduling the callback failed */
7372 return (TRAN_BUSY);
7373 }
7374 }
7375
7376 return (TRAN_ACCEPT);
7377 }
7378
7379 /*
7380 * The UNMAP command considers it not to be an error if the parameter length
7381 * or block descriptor length is 0. For this case, there is nothing for TRIM
7382 * to do so just complete the command.
7383 */
7384 static int
sata_txlt_unmap_nodata_cmd(sata_pkt_txlate_t * spx)7385 sata_txlt_unmap_nodata_cmd(sata_pkt_txlate_t *spx)
7386 {
7387 struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
7388
7389 scsipkt->pkt_reason = CMD_CMPLT;
7390 *scsipkt->pkt_scbp = STATUS_GOOD;
7391 scsipkt->pkt_state = STATE_GOT_BUS | STATE_GOT_TARGET |
7392 STATE_SENT_CMD | STATE_GOT_STATUS;
7393
7394 if ((scsipkt->pkt_flags & FLAG_NOINTR) == 0 &&
7395 scsipkt->pkt_comp != NULL) {
7396 /* scsi callback required */
7397 if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
7398 (task_func_t *)spx->txlt_scsi_pkt->pkt_comp,
7399 (void *)spx->txlt_scsi_pkt, TQ_SLEEP) == NULL) {
7400 /* Scheduling the callback failed */
7401 return (TRAN_BUSY);
7402 }
7403 }
7404
7405 return (TRAN_ACCEPT);
7406 }
7407
7408 /*
7409 * Emulated SATA Read/Write command completion for zero-length requests.
7410 * This request always succedes, so in synchronous mode it always returns
7411 * TRAN_ACCEPT, and in non-synchronous mode it may return TRAN_BUSY if the
7412 * callback cannot be scheduled.
7413 */
7414 static int
sata_emul_rw_completion(sata_pkt_txlate_t * spx)7415 sata_emul_rw_completion(sata_pkt_txlate_t *spx)
7416 {
7417 struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
7418
7419 scsipkt->pkt_state = STATE_GOT_BUS | STATE_GOT_TARGET |
7420 STATE_SENT_CMD | STATE_GOT_STATUS;
7421 scsipkt->pkt_reason = CMD_CMPLT;
7422 *scsipkt->pkt_scbp = STATUS_GOOD;
7423 if (!(spx->txlt_sata_pkt->satapkt_op_mode & SATA_OPMODE_SYNCH)) {
7424 /* scsi callback required - have to schedule it */
7425 if (servicing_interrupt()) {
7426 if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
7427 (task_func_t *)spx->txlt_scsi_pkt->pkt_comp,
7428 (void *)spx->txlt_scsi_pkt, TQ_NOSLEEP) == NULL) {
7429 return (TRAN_BUSY);
7430 }
7431 } else if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
7432 (task_func_t *)spx->txlt_scsi_pkt->pkt_comp,
7433 (void *)spx->txlt_scsi_pkt, TQ_SLEEP) == NULL) {
7434 /* Scheduling the callback failed */
7435 return (TRAN_BUSY);
7436 }
7437 }
7438 return (TRAN_ACCEPT);
7439 }
7440
7441
7442 /*
7443 * Translate completion status of SATA read/write commands into scsi response.
7444 * pkt completion_reason is checked to determine the completion status.
7445 * Do scsi callback if necessary.
7446 *
7447 * Note: this function may be called also for synchronously executed
7448 * commands.
7449 * This function may be used only if scsi_pkt is non-NULL.
7450 */
7451 static void
sata_txlt_rw_completion(sata_pkt_t * sata_pkt)7452 sata_txlt_rw_completion(sata_pkt_t *sata_pkt)
7453 {
7454 sata_pkt_txlate_t *spx =
7455 (sata_pkt_txlate_t *)sata_pkt->satapkt_framework_private;
7456 sata_cmd_t *scmd = &sata_pkt->satapkt_cmd;
7457 struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
7458 struct scsi_extended_sense *sense;
7459 uint64_t lba;
7460 struct buf *bp;
7461 int rval;
7462 if (sata_pkt->satapkt_reason == SATA_PKT_COMPLETED) {
7463 /* Normal completion */
7464 scsipkt->pkt_state = STATE_GOT_BUS | STATE_GOT_TARGET |
7465 STATE_SENT_CMD | STATE_XFERRED_DATA | STATE_GOT_STATUS;
7466 scsipkt->pkt_reason = CMD_CMPLT;
7467 *scsipkt->pkt_scbp = STATUS_GOOD;
7468 if (spx->txlt_tmp_buf != NULL) {
7469 /* Temporary buffer was used */
7470 bp = spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp;
7471 if (bp->b_flags & B_READ) {
7472 rval = ddi_dma_sync(
7473 spx->txlt_buf_dma_handle, 0, 0,
7474 DDI_DMA_SYNC_FORCPU);
7475 ASSERT(rval == DDI_SUCCESS);
7476 bcopy(spx->txlt_tmp_buf, bp->b_un.b_addr,
7477 bp->b_bcount);
7478 }
7479 }
7480 } else {
7481 /*
7482 * Something went wrong - analyze return
7483 */
7484 scsipkt->pkt_state = STATE_GOT_BUS | STATE_GOT_TARGET |
7485 STATE_SENT_CMD | STATE_GOT_STATUS;
7486 scsipkt->pkt_reason = CMD_INCOMPLETE;
7487 *scsipkt->pkt_scbp = STATUS_CHECK;
7488 sense = sata_arq_sense(spx);
7489 ASSERT(sense != NULL);
7490
7491 /*
7492 * SATA_PKT_DEV_ERROR is the only case where we may be able to
7493 * extract from device registers the failing LBA.
7494 */
7495 if (sata_pkt->satapkt_reason == SATA_PKT_DEV_ERROR) {
7496 if ((scmd->satacmd_addr_type == ATA_ADDR_LBA48) &&
7497 (scmd->satacmd_lba_mid_msb != 0 ||
7498 scmd->satacmd_lba_high_msb != 0)) {
7499 /*
7500 * We have problem reporting this cmd LBA
7501 * in fixed sense data format, because of
7502 * the size of the scsi LBA fields.
7503 */
7504 sense->es_valid = 0;
7505 } else {
7506 sata_extract_error_lba(spx, &lba);
7507 sense->es_info_1 = (lba & 0xFF000000) >> 24;
7508 sense->es_info_2 = (lba & 0xFF0000) >> 16;
7509 sense->es_info_3 = (lba & 0xFF00) >> 8;
7510 sense->es_info_4 = lba & 0xFF;
7511 }
7512 } else {
7513 /* Invalid extended sense info */
7514 sense->es_valid = 0;
7515 }
7516
7517 switch (sata_pkt->satapkt_reason) {
7518 case SATA_PKT_PORT_ERROR:
7519 /* We may want to handle DEV GONE state as well */
7520 /*
7521 * We have no device data. Assume no data transfered.
7522 */
7523 sense->es_key = KEY_HARDWARE_ERROR;
7524 break;
7525
7526 case SATA_PKT_DEV_ERROR:
7527 if (sata_pkt->satapkt_cmd.satacmd_status_reg &
7528 SATA_STATUS_ERR) {
7529 /*
7530 * determine dev error reason from error
7531 * reg content
7532 */
7533 sata_decode_device_error(spx, sense);
7534 if (sense->es_key == KEY_MEDIUM_ERROR) {
7535 switch (scmd->satacmd_cmd_reg) {
7536 case SATAC_READ_DMA:
7537 case SATAC_READ_DMA_EXT:
7538 case SATAC_READ_DMA_QUEUED:
7539 case SATAC_READ_DMA_QUEUED_EXT:
7540 case SATAC_READ_FPDMA_QUEUED:
7541 /* Unrecovered read error */
7542 sense->es_add_code =
7543 SD_SCSI_ASC_UNREC_READ_ERR;
7544 break;
7545 case SATAC_WRITE_DMA:
7546 case SATAC_WRITE_DMA_EXT:
7547 case SATAC_WRITE_DMA_QUEUED:
7548 case SATAC_WRITE_DMA_QUEUED_EXT:
7549 case SATAC_WRITE_FPDMA_QUEUED:
7550 /* Write error */
7551 sense->es_add_code =
7552 SD_SCSI_ASC_WRITE_ERR;
7553 break;
7554 default:
7555 /* Internal error */
7556 SATA_LOG_D((
7557 spx->txlt_sata_hba_inst,
7558 CE_WARN,
7559 "sata_txlt_rw_completion :"
7560 "internal error - invalid "
7561 "command 0x%2x",
7562 scmd->satacmd_cmd_reg));
7563 break;
7564 }
7565 }
7566 break;
7567 }
7568 /* No extended sense key - no info available */
7569 scsipkt->pkt_reason = CMD_INCOMPLETE;
7570 break;
7571
7572 case SATA_PKT_TIMEOUT:
7573 scsipkt->pkt_reason = CMD_TIMEOUT;
7574 scsipkt->pkt_statistics |=
7575 STAT_TIMEOUT | STAT_DEV_RESET;
7576 sense->es_key = KEY_ABORTED_COMMAND;
7577 break;
7578
7579 case SATA_PKT_ABORTED:
7580 scsipkt->pkt_reason = CMD_ABORTED;
7581 scsipkt->pkt_statistics |= STAT_ABORTED;
7582 sense->es_key = KEY_ABORTED_COMMAND;
7583 break;
7584
7585 case SATA_PKT_RESET:
7586 scsipkt->pkt_reason = CMD_RESET;
7587 scsipkt->pkt_statistics |= STAT_DEV_RESET;
7588 sense->es_key = KEY_ABORTED_COMMAND;
7589 break;
7590
7591 default:
7592 SATA_LOG_D((spx->txlt_sata_hba_inst, CE_WARN,
7593 "sata_txlt_rw_completion: "
7594 "invalid packet completion reason"));
7595 scsipkt->pkt_reason = CMD_TRAN_ERR;
7596 break;
7597 }
7598 }
7599 SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
7600 "Scsi_pkt completion reason %x\n", scsipkt->pkt_reason);
7601
7602 if ((scsipkt->pkt_flags & FLAG_NOINTR) == 0)
7603 /* scsi callback required */
7604 scsi_hba_pkt_comp(scsipkt);
7605 }
7606
7607
7608 /*
7609 * Translate completion status of non-data commands (i.e. commands returning
7610 * no data).
7611 * pkt completion_reason is checked to determine the completion status.
7612 * Do scsi callback if necessary (FLAG_NOINTR == 0)
7613 *
7614 * Note: this function may be called also for synchronously executed
7615 * commands.
7616 * This function may be used only if scsi_pkt is non-NULL.
7617 */
7618
7619 static void
sata_txlt_nodata_cmd_completion(sata_pkt_t * sata_pkt)7620 sata_txlt_nodata_cmd_completion(sata_pkt_t *sata_pkt)
7621 {
7622 sata_pkt_txlate_t *spx =
7623 (sata_pkt_txlate_t *)sata_pkt->satapkt_framework_private;
7624 struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
7625
7626 sata_set_arq_data(sata_pkt);
7627
7628 if ((scsipkt->pkt_flags & FLAG_NOINTR) == 0)
7629 /* scsi callback required */
7630 scsi_hba_pkt_comp(scsipkt);
7631 }
7632
7633 /*
7634 * Completion handler for ATA Pass Through command
7635 */
7636 static void
sata_txlt_apt_completion(sata_pkt_t * sata_pkt)7637 sata_txlt_apt_completion(sata_pkt_t *sata_pkt)
7638 {
7639 sata_pkt_txlate_t *spx =
7640 (sata_pkt_txlate_t *)sata_pkt->satapkt_framework_private;
7641 sata_cmd_t *scmd = &sata_pkt->satapkt_cmd;
7642 struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
7643 struct buf *bp;
7644 uint8_t sense_key = 0, addl_sense_code = 0, addl_sense_qual = 0;
7645
7646 if (sata_pkt->satapkt_reason == SATA_PKT_COMPLETED) {
7647 /* Normal completion */
7648 scsipkt->pkt_state = STATE_GOT_BUS | STATE_GOT_TARGET |
7649 STATE_SENT_CMD | STATE_XFERRED_DATA | STATE_GOT_STATUS;
7650 scsipkt->pkt_reason = CMD_CMPLT;
7651 *scsipkt->pkt_scbp = STATUS_GOOD;
7652
7653 /*
7654 * If the command has CK_COND set
7655 */
7656 if (scsipkt->pkt_cdbp[2] & SATL_APT_BM_CK_COND) {
7657 *scsipkt->pkt_scbp = STATUS_CHECK;
7658 sata_fill_ata_return_desc(sata_pkt,
7659 KEY_RECOVERABLE_ERROR,
7660 SD_SCSI_ASC_APT_INFO_AVAIL, 0x1d);
7661 }
7662
7663 if (spx->txlt_tmp_buf != NULL) {
7664 /* Temporary buffer was used */
7665 bp = spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp;
7666 if (bp->b_flags & B_READ) {
7667 bcopy(spx->txlt_tmp_buf, bp->b_un.b_addr,
7668 bp->b_bcount);
7669 }
7670 }
7671 } else {
7672 scsipkt->pkt_state = STATE_GOT_BUS | STATE_GOT_TARGET |
7673 STATE_SENT_CMD | STATE_GOT_STATUS;
7674 scsipkt->pkt_reason = CMD_INCOMPLETE;
7675 *scsipkt->pkt_scbp = STATUS_CHECK;
7676
7677 /*
7678 * If DF or ERR was set, the HBA should have copied out the
7679 * status and error registers to the satacmd structure.
7680 */
7681 if (scmd->satacmd_status_reg & SATA_STATUS_DF) {
7682 sense_key = KEY_HARDWARE_ERROR;
7683 addl_sense_code = SD_SCSI_ASC_INTERNAL_TARGET_FAILURE;
7684 addl_sense_qual = 0;
7685 } else if (scmd->satacmd_status_reg & SATA_STATUS_ERR) {
7686 if (scmd->satacmd_error_reg & SATA_ERROR_NM) {
7687 sense_key = KEY_NOT_READY;
7688 addl_sense_code =
7689 SD_SCSI_ASC_MEDIUM_NOT_PRESENT;
7690 addl_sense_qual = 0;
7691 } else if (scmd->satacmd_error_reg & SATA_ERROR_UNC) {
7692 sense_key = KEY_MEDIUM_ERROR;
7693 addl_sense_code = SD_SCSI_ASC_UNREC_READ_ERR;
7694 addl_sense_qual = 0;
7695 } else if (scmd->satacmd_error_reg & SATA_ERROR_ILI) {
7696 sense_key = KEY_DATA_PROTECT;
7697 addl_sense_code = SD_SCSI_ASC_WRITE_PROTECTED;
7698 addl_sense_qual = 0;
7699 } else if (scmd->satacmd_error_reg & SATA_ERROR_IDNF) {
7700 sense_key = KEY_ILLEGAL_REQUEST;
7701 addl_sense_code = SD_SCSI_ASC_LBA_OUT_OF_RANGE;
7702 addl_sense_qual = 0;
7703 } else if (scmd->satacmd_error_reg & SATA_ERROR_ABORT) {
7704 sense_key = KEY_ABORTED_COMMAND;
7705 addl_sense_code = SD_SCSI_ASC_NO_ADD_SENSE;
7706 addl_sense_qual = 0;
7707 } else if (scmd->satacmd_error_reg & SATA_ERROR_MC) {
7708 sense_key = KEY_UNIT_ATTENTION;
7709 addl_sense_code =
7710 SD_SCSI_ASC_MEDIUM_MAY_HAVE_CHANGED;
7711 addl_sense_qual = 0;
7712 } else if (scmd->satacmd_error_reg & SATA_ERROR_MCR) {
7713 sense_key = KEY_UNIT_ATTENTION;
7714 addl_sense_code = SD_SCSI_ASC_OP_MEDIUM_REM_REQ;
7715 addl_sense_qual = 0;
7716 } else if (scmd->satacmd_error_reg & SATA_ERROR_ICRC) {
7717 sense_key = KEY_ABORTED_COMMAND;
7718 addl_sense_code =
7719 SD_SCSI_ASC_INFO_UNIT_IUCRC_ERR;
7720 addl_sense_qual = 0;
7721 }
7722 }
7723
7724 sata_fill_ata_return_desc(sata_pkt, sense_key, addl_sense_code,
7725 addl_sense_qual);
7726 }
7727
7728 if ((scsipkt->pkt_flags & FLAG_NOINTR) == 0)
7729 /* scsi callback required */
7730 scsi_hba_pkt_comp(scsipkt);
7731 }
7732
7733 /*
7734 * Completion handler for unmap translation command
7735 */
7736 static void
sata_txlt_unmap_completion(sata_pkt_t * sata_pkt)7737 sata_txlt_unmap_completion(sata_pkt_t *sata_pkt)
7738 {
7739 sata_pkt_txlate_t *spx =
7740 (sata_pkt_txlate_t *)sata_pkt->satapkt_framework_private;
7741 sata_cmd_t *scmd = &sata_pkt->satapkt_cmd;
7742 struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
7743 struct buf *bp;
7744 uint8_t sense_key = 0, addl_sense_code = 0, addl_sense_qual = 0;
7745
7746 if (sata_pkt->satapkt_reason == SATA_PKT_COMPLETED) {
7747 /* Normal completion */
7748 scsipkt->pkt_state = STATE_GOT_BUS | STATE_GOT_TARGET |
7749 STATE_SENT_CMD | STATE_XFERRED_DATA | STATE_GOT_STATUS;
7750 scsipkt->pkt_reason = CMD_CMPLT;
7751 *scsipkt->pkt_scbp = STATUS_GOOD;
7752
7753 if (spx->txlt_tmp_buf != NULL) {
7754 /* Temporary buffer was used */
7755 bp = spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp;
7756 if (bp->b_flags & B_READ) {
7757 bcopy(spx->txlt_tmp_buf, bp->b_un.b_addr,
7758 bp->b_bcount);
7759 }
7760 }
7761 } else {
7762 scsipkt->pkt_state = STATE_GOT_BUS | STATE_GOT_TARGET |
7763 STATE_SENT_CMD | STATE_GOT_STATUS;
7764 scsipkt->pkt_reason = CMD_INCOMPLETE;
7765 *scsipkt->pkt_scbp = STATUS_CHECK;
7766
7767 /*
7768 * If DF or ERR was set, the HBA should have copied out the
7769 * status and error registers to the satacmd structure.
7770 */
7771 if (scmd->satacmd_status_reg & SATA_STATUS_DF) {
7772 sense_key = KEY_HARDWARE_ERROR;
7773 addl_sense_code = SD_SCSI_ASC_INTERNAL_TARGET_FAILURE;
7774 addl_sense_qual = 0;
7775 } else if (scmd->satacmd_status_reg & SATA_STATUS_ERR) {
7776 if (scmd->satacmd_error_reg & SATA_ERROR_NM) {
7777 sense_key = KEY_NOT_READY;
7778 addl_sense_code =
7779 SD_SCSI_ASC_MEDIUM_NOT_PRESENT;
7780 addl_sense_qual = 0;
7781 } else if (scmd->satacmd_error_reg & SATA_ERROR_UNC) {
7782 sense_key = KEY_MEDIUM_ERROR;
7783 addl_sense_code = SD_SCSI_ASC_WRITE_ERR;
7784 addl_sense_qual = 0;
7785 } else if (scmd->satacmd_error_reg & SATA_ERROR_ILI) {
7786 sense_key = KEY_DATA_PROTECT;
7787 addl_sense_code = SD_SCSI_ASC_WRITE_PROTECTED;
7788 addl_sense_qual = 0;
7789 } else if (scmd->satacmd_error_reg & SATA_ERROR_IDNF) {
7790 sense_key = KEY_ILLEGAL_REQUEST;
7791 addl_sense_code = SD_SCSI_ASC_LBA_OUT_OF_RANGE;
7792 addl_sense_qual = 0;
7793 } else if (scmd->satacmd_error_reg & SATA_ERROR_ABORT) {
7794 sense_key = KEY_ABORTED_COMMAND;
7795 addl_sense_code = SD_SCSI_ASC_NO_ADD_SENSE;
7796 addl_sense_qual = 0;
7797 } else if (scmd->satacmd_error_reg & SATA_ERROR_MC) {
7798 sense_key = KEY_UNIT_ATTENTION;
7799 addl_sense_code =
7800 SD_SCSI_ASC_MEDIUM_MAY_HAVE_CHANGED;
7801 addl_sense_qual = 0;
7802 } else if (scmd->satacmd_error_reg & SATA_ERROR_MCR) {
7803 sense_key = KEY_UNIT_ATTENTION;
7804 addl_sense_code = SD_SCSI_ASC_OP_MEDIUM_REM_REQ;
7805 addl_sense_qual = 0;
7806 } else if (scmd->satacmd_error_reg & SATA_ERROR_ICRC) {
7807 sense_key = KEY_ABORTED_COMMAND;
7808 addl_sense_code =
7809 SD_SCSI_ASC_INFO_UNIT_IUCRC_ERR;
7810 addl_sense_qual = 0;
7811 }
7812 }
7813
7814 sata_fill_ata_return_desc(sata_pkt, sense_key, addl_sense_code,
7815 addl_sense_qual);
7816 }
7817
7818 sata_free_local_buffer(spx);
7819
7820 if ((scsipkt->pkt_flags & FLAG_NOINTR) == 0)
7821 /* scsi callback required */
7822 scsi_hba_pkt_comp(scsipkt);
7823 }
7824
7825 /*
7826 *
7827 */
7828 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)7829 sata_fill_ata_return_desc(sata_pkt_t *sata_pkt, uint8_t sense_key,
7830 uint8_t addl_sense_code, uint8_t addl_sense_qual)
7831 {
7832 sata_pkt_txlate_t *spx =
7833 (sata_pkt_txlate_t *)sata_pkt->satapkt_framework_private;
7834 sata_cmd_t *scmd = &sata_pkt->satapkt_cmd;
7835 struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
7836 struct sata_apt_sense_data *apt_sd =
7837 (struct sata_apt_sense_data *)scsipkt->pkt_scbp;
7838 struct scsi_descr_sense_hdr *sds = &(apt_sd->apt_sd_hdr);
7839 struct scsi_ata_status_ret_sense_descr *ata_ret_desc =
7840 &(apt_sd->apt_sd_sense);
7841 int extend = 0;
7842
7843 if ((scsipkt->pkt_cdbp[0] == SPC3_CMD_ATA_COMMAND_PASS_THROUGH16) &&
7844 (scsipkt->pkt_cdbp[2] & SATL_APT_BM_EXTEND))
7845 extend = 1;
7846
7847 scsipkt->pkt_state |= STATE_ARQ_DONE;
7848
7849 /* update the residual count */
7850 *(uchar_t *)&apt_sd->apt_status = STATUS_CHECK;
7851 *(uchar_t *)&apt_sd->apt_rqpkt_status = STATUS_GOOD;
7852 apt_sd->apt_rqpkt_reason = CMD_CMPLT;
7853 apt_sd->apt_rqpkt_state = STATE_GOT_BUS | STATE_GOT_TARGET |
7854 STATE_XFERRED_DATA | STATE_SENT_CMD | STATE_GOT_STATUS;
7855 apt_sd->apt_rqpkt_resid = scsipkt->pkt_scblen -
7856 sizeof (struct sata_apt_sense_data);
7857
7858 /*
7859 * Fill in the Descriptor sense header
7860 */
7861 bzero(sds, sizeof (struct scsi_descr_sense_hdr));
7862 sds->ds_code = CODE_FMT_DESCR_CURRENT;
7863 sds->ds_class = CLASS_EXTENDED_SENSE;
7864 sds->ds_key = sense_key & 0xf;
7865 sds->ds_add_code = addl_sense_code;
7866 sds->ds_qual_code = addl_sense_qual;
7867 sds->ds_addl_sense_length =
7868 sizeof (struct scsi_ata_status_ret_sense_descr);
7869
7870 /*
7871 * Fill in the ATA Return descriptor sense data
7872 */
7873 bzero(ata_ret_desc, sizeof (struct scsi_ata_status_ret_sense_descr));
7874 ata_ret_desc->ars_descr_type = DESCR_ATA_STATUS_RETURN;
7875 ata_ret_desc->ars_addl_length = 0xc;
7876 ata_ret_desc->ars_error = scmd->satacmd_error_reg;
7877 ata_ret_desc->ars_sec_count_lsb = scmd->satacmd_sec_count_lsb;
7878 ata_ret_desc->ars_lba_low_lsb = scmd->satacmd_lba_low_lsb;
7879 ata_ret_desc->ars_lba_mid_lsb = scmd->satacmd_lba_mid_lsb;
7880 ata_ret_desc->ars_lba_high_lsb = scmd->satacmd_lba_high_lsb;
7881 ata_ret_desc->ars_device = scmd->satacmd_device_reg;
7882 ata_ret_desc->ars_status = scmd->satacmd_status_reg;
7883
7884 if (extend == 1) {
7885 ata_ret_desc->ars_extend = 1;
7886 ata_ret_desc->ars_sec_count_msb = scmd->satacmd_sec_count_msb;
7887 ata_ret_desc->ars_lba_low_msb = scmd->satacmd_lba_low_msb;
7888 ata_ret_desc->ars_lba_mid_msb = scmd->satacmd_lba_mid_msb;
7889 ata_ret_desc->ars_lba_high_msb = scmd->satacmd_lba_high_msb;
7890 } else {
7891 ata_ret_desc->ars_extend = 0;
7892 ata_ret_desc->ars_sec_count_msb = 0;
7893 ata_ret_desc->ars_lba_low_msb = 0;
7894 ata_ret_desc->ars_lba_mid_msb = 0;
7895 ata_ret_desc->ars_lba_high_msb = 0;
7896 }
7897 }
7898
7899 static void
sata_set_arq_data(sata_pkt_t * sata_pkt)7900 sata_set_arq_data(sata_pkt_t *sata_pkt)
7901 {
7902 sata_pkt_txlate_t *spx =
7903 (sata_pkt_txlate_t *)sata_pkt->satapkt_framework_private;
7904 struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
7905 struct scsi_extended_sense *sense;
7906
7907 scsipkt->pkt_state = STATE_GOT_BUS | STATE_GOT_TARGET |
7908 STATE_SENT_CMD | STATE_GOT_STATUS;
7909 if (sata_pkt->satapkt_reason == SATA_PKT_COMPLETED) {
7910 /* Normal completion */
7911 scsipkt->pkt_reason = CMD_CMPLT;
7912 *scsipkt->pkt_scbp = STATUS_GOOD;
7913 } else {
7914 /* Something went wrong */
7915 scsipkt->pkt_reason = CMD_INCOMPLETE;
7916 *scsipkt->pkt_scbp = STATUS_CHECK;
7917 sense = sata_arq_sense(spx);
7918 switch (sata_pkt->satapkt_reason) {
7919 case SATA_PKT_PORT_ERROR:
7920 /*
7921 * We have no device data. Assume no data transfered.
7922 */
7923 sense->es_key = KEY_HARDWARE_ERROR;
7924 break;
7925
7926 case SATA_PKT_DEV_ERROR:
7927 if (sata_pkt->satapkt_cmd.satacmd_status_reg &
7928 SATA_STATUS_ERR) {
7929 /*
7930 * determine dev error reason from error
7931 * reg content
7932 */
7933 sata_decode_device_error(spx, sense);
7934 break;
7935 }
7936 /* No extended sense key - no info available */
7937 break;
7938
7939 case SATA_PKT_TIMEOUT:
7940 scsipkt->pkt_reason = CMD_TIMEOUT;
7941 scsipkt->pkt_statistics |=
7942 STAT_TIMEOUT | STAT_DEV_RESET;
7943 /* No extended sense key ? */
7944 break;
7945
7946 case SATA_PKT_ABORTED:
7947 scsipkt->pkt_reason = CMD_ABORTED;
7948 scsipkt->pkt_statistics |= STAT_ABORTED;
7949 /* No extended sense key ? */
7950 break;
7951
7952 case SATA_PKT_RESET:
7953 /* pkt aborted by an explicit reset from a host */
7954 scsipkt->pkt_reason = CMD_RESET;
7955 scsipkt->pkt_statistics |= STAT_DEV_RESET;
7956 break;
7957
7958 default:
7959 SATA_LOG_D((spx->txlt_sata_hba_inst, CE_WARN,
7960 "sata_txlt_nodata_cmd_completion: "
7961 "invalid packet completion reason %d",
7962 sata_pkt->satapkt_reason));
7963 scsipkt->pkt_reason = CMD_TRAN_ERR;
7964 break;
7965 }
7966
7967 }
7968 SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
7969 "Scsi_pkt completion reason %x\n", scsipkt->pkt_reason);
7970 }
7971
7972
7973 /*
7974 * Build Mode sense R/W recovery page
7975 * NOT IMPLEMENTED
7976 */
7977
7978 static int
sata_build_msense_page_1(sata_drive_info_t * sdinfo,int pcntrl,uint8_t * buf)7979 sata_build_msense_page_1(sata_drive_info_t *sdinfo, int pcntrl, uint8_t *buf)
7980 {
7981 #ifndef __lock_lint
7982 _NOTE(ARGUNUSED(sdinfo))
7983 _NOTE(ARGUNUSED(pcntrl))
7984 _NOTE(ARGUNUSED(buf))
7985 #endif
7986 return (0);
7987 }
7988
7989 /*
7990 * Build Mode sense caching page - scsi-3 implementation.
7991 * Page length distinguishes previous format from scsi-3 format.
7992 * buf must have space for 0x12 bytes.
7993 * Only DRA (disable read ahead ) and WCE (write cache enable) are changeable.
7994 *
7995 */
7996 static int
sata_build_msense_page_8(sata_drive_info_t * sdinfo,int pcntrl,uint8_t * buf)7997 sata_build_msense_page_8(sata_drive_info_t *sdinfo, int pcntrl, uint8_t *buf)
7998 {
7999 struct mode_cache_scsi3 *page = (struct mode_cache_scsi3 *)buf;
8000 sata_id_t *sata_id = &sdinfo->satadrv_id;
8001
8002 /*
8003 * Most of the fields are set to 0, being not supported and/or disabled
8004 */
8005 bzero(buf, PAGELENGTH_DAD_MODE_CACHE_SCSI3);
8006
8007 /* Saved paramters not supported */
8008 if (pcntrl == 3)
8009 return (0);
8010 if (pcntrl == 0 || pcntrl == 2) {
8011 /*
8012 * For now treat current and default parameters as same
8013 * That may have to change, if target driver will complain
8014 */
8015 page->mode_page.code = MODEPAGE_CACHING; /* PS = 0 */
8016 page->mode_page.length = PAGELENGTH_DAD_MODE_CACHE_SCSI3;
8017
8018 if (SATA_READ_AHEAD_SUPPORTED(*sata_id) &&
8019 !SATA_READ_AHEAD_ENABLED(*sata_id)) {
8020 page->dra = 1; /* Read Ahead disabled */
8021 page->rcd = 1; /* Read Cache disabled */
8022 }
8023 if (SATA_WRITE_CACHE_SUPPORTED(*sata_id) &&
8024 SATA_WRITE_CACHE_ENABLED(*sata_id))
8025 page->wce = 1; /* Write Cache enabled */
8026 } else {
8027 /* Changeable parameters */
8028 page->mode_page.code = MODEPAGE_CACHING;
8029 page->mode_page.length = PAGELENGTH_DAD_MODE_CACHE_SCSI3;
8030 if (SATA_READ_AHEAD_SUPPORTED(*sata_id)) {
8031 page->dra = 1;
8032 page->rcd = 1;
8033 }
8034 if (SATA_WRITE_CACHE_SUPPORTED(*sata_id))
8035 page->wce = 1;
8036 }
8037 return (PAGELENGTH_DAD_MODE_CACHE_SCSI3 +
8038 sizeof (struct mode_page));
8039 }
8040
8041 /*
8042 * Build Mode sense exception cntrl page
8043 */
8044 static int
sata_build_msense_page_1c(sata_drive_info_t * sdinfo,int pcntrl,uint8_t * buf)8045 sata_build_msense_page_1c(sata_drive_info_t *sdinfo, int pcntrl, uint8_t *buf)
8046 {
8047 struct mode_info_excpt_page *page = (struct mode_info_excpt_page *)buf;
8048 sata_id_t *sata_id = &sdinfo->satadrv_id;
8049
8050 /*
8051 * Most of the fields are set to 0, being not supported and/or disabled
8052 */
8053 bzero(buf, PAGELENGTH_INFO_EXCPT);
8054
8055 page->mode_page.code = MODEPAGE_INFO_EXCPT;
8056 page->mode_page.length = PAGELENGTH_INFO_EXCPT;
8057
8058 /* Indicate that this is page is saveable */
8059 page->mode_page.ps = 1;
8060
8061 /*
8062 * We will return the same data for default, current and saved page.
8063 * The only changeable bit is dexcpt and that bit is required
8064 * by the ATA specification to be preserved across power cycles.
8065 */
8066 if (pcntrl != 1) {
8067 page->dexcpt = !(sata_id->ai_features85 & SATA_SMART_SUPPORTED);
8068 page->mrie = MRIE_ONLY_ON_REQUEST;
8069 }
8070 else
8071 page->dexcpt = 1; /* Only changeable parameter */
8072
8073 return (PAGELENGTH_INFO_EXCPT + sizeof (struct mode_page));
8074 }
8075
8076
8077 static int
sata_build_msense_page_30(sata_drive_info_t * sdinfo,int pcntrl,uint8_t * buf)8078 sata_build_msense_page_30(sata_drive_info_t *sdinfo, int pcntrl, uint8_t *buf)
8079 {
8080 struct mode_acoustic_management *page =
8081 (struct mode_acoustic_management *)buf;
8082 sata_id_t *sata_id = &sdinfo->satadrv_id;
8083
8084 /*
8085 * Most of the fields are set to 0, being not supported and/or disabled
8086 */
8087 bzero(buf, PAGELENGTH_DAD_MODE_ACOUSTIC_MANAGEMENT);
8088
8089 switch (pcntrl) {
8090 case P_CNTRL_DEFAULT:
8091 /* default paramters not supported */
8092 return (0);
8093
8094 case P_CNTRL_CURRENT:
8095 case P_CNTRL_SAVED:
8096 /* Saved and current are supported and are identical */
8097 page->mode_page.code = MODEPAGE_ACOUSTIC_MANAG;
8098 page->mode_page.length =
8099 PAGELENGTH_DAD_MODE_ACOUSTIC_MANAGEMENT;
8100 page->mode_page.ps = 1;
8101
8102 /* Word 83 indicates if feature is supported */
8103 /* If feature is not supported */
8104 if (!(sata_id->ai_cmdset83 & SATA_ACOUSTIC_MGMT)) {
8105 page->acoustic_manag_enable =
8106 ACOUSTIC_DISABLED;
8107 } else {
8108 page->acoustic_manag_enable =
8109 ((sata_id->ai_features86 & SATA_ACOUSTIC_MGMT)
8110 != 0);
8111 /* Word 94 inidicates the value */
8112 #ifdef _LITTLE_ENDIAN
8113 page->acoustic_manag_level =
8114 (uchar_t)sata_id->ai_acoustic;
8115 page->vendor_recommended_value =
8116 sata_id->ai_acoustic >> 8;
8117 #else
8118 page->acoustic_manag_level =
8119 sata_id->ai_acoustic >> 8;
8120 page->vendor_recommended_value =
8121 (uchar_t)sata_id->ai_acoustic;
8122 #endif
8123 }
8124 break;
8125
8126 case P_CNTRL_CHANGEABLE:
8127 page->mode_page.code = MODEPAGE_ACOUSTIC_MANAG;
8128 page->mode_page.length =
8129 PAGELENGTH_DAD_MODE_ACOUSTIC_MANAGEMENT;
8130 page->mode_page.ps = 1;
8131
8132 /* Word 83 indicates if the feature is supported */
8133 if (sata_id->ai_cmdset83 & SATA_ACOUSTIC_MGMT) {
8134 page->acoustic_manag_enable =
8135 ACOUSTIC_ENABLED;
8136 page->acoustic_manag_level = 0xff;
8137 }
8138 break;
8139 }
8140 return (PAGELENGTH_DAD_MODE_ACOUSTIC_MANAGEMENT +
8141 sizeof (struct mode_page));
8142 }
8143
8144
8145 /*
8146 * Build Mode sense power condition page.
8147 */
8148 static int
sata_build_msense_page_1a(sata_drive_info_t * sdinfo,int pcntrl,uint8_t * buf)8149 sata_build_msense_page_1a(sata_drive_info_t *sdinfo, int pcntrl, uint8_t *buf)
8150 {
8151 struct mode_info_power_cond *page = (struct mode_info_power_cond *)buf;
8152 sata_id_t *sata_id = &sdinfo->satadrv_id;
8153
8154 /*
8155 * Most of the fields are set to 0, being not supported and/or disabled
8156 * power condition page length was 0x0a
8157 */
8158 bzero(buf, sizeof (struct mode_info_power_cond));
8159
8160 if (pcntrl == P_CNTRL_DEFAULT) {
8161 /* default paramters not supported */
8162 return (0);
8163 }
8164
8165 page->mode_page.code = MODEPAGE_POWER_COND;
8166 page->mode_page.length = sizeof (struct mode_info_power_cond);
8167
8168 if (sata_id->ai_cap & SATA_STANDBYTIMER) {
8169 page->standby = 1;
8170 bcopy(sdinfo->satadrv_standby_timer, page->standby_cond_timer,
8171 sizeof (uchar_t) * 4);
8172 }
8173
8174 return (sizeof (struct mode_info_power_cond));
8175 }
8176
8177 /*
8178 * Process mode select caching page 8 (scsi3 format only).
8179 * Read Ahead (same as read cache) and Write Cache may be turned on and off
8180 * if these features are supported by the device. If these features are not
8181 * supported, the command will be terminated with STATUS_CHECK.
8182 * This function fails only if the SET FEATURE command sent to
8183 * the device fails. The page format is not verified, assuming that the
8184 * target driver operates correctly - if parameters length is too short,
8185 * we just drop the page.
8186 * Two command may be sent if both Read Cache/Read Ahead and Write Cache
8187 * setting have to be changed.
8188 * SET FEATURE command is executed synchronously, i.e. we wait here until
8189 * it is completed, regardless of the scsi pkt directives.
8190 *
8191 * Note: Mode Select Caching page RCD and DRA bits are tied together, i.e.
8192 * changing DRA will change RCD.
8193 *
8194 * More than one SATA command may be executed to perform operations specified
8195 * by mode select pages. The first error terminates further execution.
8196 * Operations performed successully are not backed-up in such case.
8197 *
8198 * Return SATA_SUCCESS if operation succeeded, SATA_FAILURE otherwise.
8199 * If operation resulted in changing device setup, dmod flag should be set to
8200 * one (1). If parameters were not changed, dmod flag should be set to 0.
8201 * Upon return, if operation required sending command to the device, the rval
8202 * should be set to the value returned by sata_hba_start. If operation
8203 * did not require device access, rval should be set to TRAN_ACCEPT.
8204 * The pagelen should be set to the length of the page.
8205 *
8206 * This function has to be called with a port mutex held.
8207 *
8208 * Returns SATA_SUCCESS if operation was successful, SATA_FAILURE otherwise.
8209 */
8210 int
sata_mode_select_page_8(sata_pkt_txlate_t * spx,struct mode_cache_scsi3 * page,int parmlen,int * pagelen,int * rval,int * dmod)8211 sata_mode_select_page_8(sata_pkt_txlate_t *spx, struct mode_cache_scsi3 *page,
8212 int parmlen, int *pagelen, int *rval, int *dmod)
8213 {
8214 struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
8215 sata_drive_info_t *sdinfo;
8216 sata_cmd_t *scmd = &spx->txlt_sata_pkt->satapkt_cmd;
8217 sata_id_t *sata_id;
8218 struct scsi_extended_sense *sense;
8219 int wce, dra; /* Current settings */
8220
8221 sdinfo = sata_get_device_info(spx->txlt_sata_hba_inst,
8222 &spx->txlt_sata_pkt->satapkt_device);
8223 sata_id = &sdinfo->satadrv_id;
8224 *dmod = 0;
8225
8226 /* Verify parameters length. If too short, drop it */
8227 if ((PAGELENGTH_DAD_MODE_CACHE_SCSI3 +
8228 sizeof (struct mode_page)) > parmlen) {
8229 *scsipkt->pkt_scbp = STATUS_CHECK;
8230 sense = sata_arq_sense(spx);
8231 sense->es_key = KEY_ILLEGAL_REQUEST;
8232 sense->es_add_code = SD_SCSI_ASC_INVALID_FIELD_IN_PARAMS_LIST;
8233 *pagelen = parmlen;
8234 *rval = TRAN_ACCEPT;
8235 return (SATA_FAILURE);
8236 }
8237
8238 *pagelen = PAGELENGTH_DAD_MODE_CACHE_SCSI3 + sizeof (struct mode_page);
8239
8240 /* Current setting of Read Ahead (and Read Cache) */
8241 if (SATA_READ_AHEAD_ENABLED(*sata_id))
8242 dra = 0; /* 0 == not disabled */
8243 else
8244 dra = 1;
8245 /* Current setting of Write Cache */
8246 if (SATA_WRITE_CACHE_ENABLED(*sata_id))
8247 wce = 1;
8248 else
8249 wce = 0;
8250
8251 if (page->dra == dra && page->wce == wce && page->rcd == dra) {
8252 /* nothing to do */
8253 *rval = TRAN_ACCEPT;
8254 return (SATA_SUCCESS);
8255 }
8256
8257 /*
8258 * Need to flip some setting
8259 * Set-up Internal SET FEATURES command(s)
8260 */
8261 scmd->satacmd_flags.sata_data_direction = SATA_DIR_NODATA_XFER;
8262 scmd->satacmd_addr_type = 0;
8263 scmd->satacmd_device_reg = 0;
8264 scmd->satacmd_status_reg = 0;
8265 scmd->satacmd_error_reg = 0;
8266 scmd->satacmd_cmd_reg = SATAC_SET_FEATURES;
8267 if (page->dra != dra || page->rcd != dra) {
8268 if (SATA_READ_AHEAD_SUPPORTED(*sata_id)) {
8269 /* Need to flip read ahead setting */
8270 if (dra == 0)
8271 /* Disable read ahead / read cache */
8272 scmd->satacmd_features_reg =
8273 SATAC_SF_DISABLE_READ_AHEAD;
8274 else
8275 /* Enable read ahead / read cache */
8276 scmd->satacmd_features_reg =
8277 SATAC_SF_ENABLE_READ_AHEAD;
8278
8279 /* Transfer command to HBA */
8280 if (sata_hba_start(spx, rval) != 0)
8281 /*
8282 * Pkt not accepted for execution.
8283 */
8284 return (SATA_FAILURE);
8285
8286 *dmod = 1;
8287
8288 /* Now process return */
8289 if (spx->txlt_sata_pkt->satapkt_reason !=
8290 SATA_PKT_COMPLETED) {
8291 goto failure; /* Terminate */
8292 }
8293 } else {
8294 *scsipkt->pkt_scbp = STATUS_CHECK;
8295 sense = sata_arq_sense(spx);
8296 sense->es_key = KEY_ILLEGAL_REQUEST;
8297 sense->es_add_code =
8298 SD_SCSI_ASC_INVALID_FIELD_IN_PARAMS_LIST;
8299 *pagelen = parmlen;
8300 *rval = TRAN_ACCEPT;
8301 return (SATA_FAILURE);
8302 }
8303 }
8304
8305 /* Note that the packet is not removed, so it could be re-used */
8306 if (page->wce != wce) {
8307 if (SATA_WRITE_CACHE_SUPPORTED(*sata_id)) {
8308 /* Need to flip Write Cache setting */
8309 if (page->wce == 1)
8310 /* Enable write cache */
8311 scmd->satacmd_features_reg =
8312 SATAC_SF_ENABLE_WRITE_CACHE;
8313 else
8314 /* Disable write cache */
8315 scmd->satacmd_features_reg =
8316 SATAC_SF_DISABLE_WRITE_CACHE;
8317
8318 /* Transfer command to HBA */
8319 if (sata_hba_start(spx, rval) != 0)
8320 /*
8321 * Pkt not accepted for execution.
8322 */
8323 return (SATA_FAILURE);
8324
8325 *dmod = 1;
8326
8327 /* Now process return */
8328 if (spx->txlt_sata_pkt->satapkt_reason !=
8329 SATA_PKT_COMPLETED) {
8330 goto failure;
8331 }
8332 } else {
8333 *scsipkt->pkt_scbp = STATUS_CHECK;
8334 sense = sata_arq_sense(spx);
8335 sense->es_key = KEY_ILLEGAL_REQUEST;
8336 sense->es_add_code =
8337 SD_SCSI_ASC_INVALID_FIELD_IN_PARAMS_LIST;
8338 *pagelen = parmlen;
8339 *rval = TRAN_ACCEPT;
8340 return (SATA_FAILURE);
8341 }
8342 }
8343 return (SATA_SUCCESS);
8344
8345 failure:
8346 sata_xlate_errors(spx);
8347
8348 return (SATA_FAILURE);
8349 }
8350
8351 /*
8352 * Process mode select informational exceptions control page 0x1c
8353 *
8354 * The only changeable bit is dexcpt (disable exceptions).
8355 * MRIE (method of reporting informational exceptions) must be
8356 * "only on request".
8357 * This page applies to informational exceptions that report
8358 * additional sense codes with the ADDITIONAL SENSE CODE field set to 5Dh
8359 * (e.g.,FAILURE PREDICTION THRESHOLD EXCEEDED) or 0Bh (e.g., WARNING_).
8360 * Informational exception conditions occur as the result of background scan
8361 * errors, background self-test errors, or vendor specific events within a
8362 * logical unit. An informational exception condition may occur asynchronous
8363 * to any commands.
8364 *
8365 * Returns: SATA_SUCCESS if operation succeeded, SATA_FAILURE otherwise.
8366 * If operation resulted in changing device setup, dmod flag should be set to
8367 * one (1). If parameters were not changed, dmod flag should be set to 0.
8368 * Upon return, if operation required sending command to the device, the rval
8369 * should be set to the value returned by sata_hba_start. If operation
8370 * did not require device access, rval should be set to TRAN_ACCEPT.
8371 * The pagelen should be set to the length of the page.
8372 *
8373 * This function has to be called with a port mutex held.
8374 *
8375 * Returns SATA_SUCCESS if operation was successful, SATA_FAILURE otherwise.
8376 *
8377 * Cannot be called in the interrupt context.
8378 */
8379 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)8380 sata_mode_select_page_1c(
8381 sata_pkt_txlate_t *spx,
8382 struct mode_info_excpt_page *page,
8383 int parmlen,
8384 int *pagelen,
8385 int *rval,
8386 int *dmod)
8387 {
8388 struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
8389 sata_cmd_t *scmd = &spx->txlt_sata_pkt->satapkt_cmd;
8390 sata_drive_info_t *sdinfo;
8391 sata_id_t *sata_id;
8392 struct scsi_extended_sense *sense;
8393
8394 sdinfo = sata_get_device_info(spx->txlt_sata_hba_inst,
8395 &spx->txlt_sata_pkt->satapkt_device);
8396 sata_id = &sdinfo->satadrv_id;
8397
8398 *dmod = 0;
8399
8400 /* Verify parameters length. If too short, drop it */
8401 if (((PAGELENGTH_INFO_EXCPT + sizeof (struct mode_page)) > parmlen) ||
8402 page->perf || page->test || (page->mrie != MRIE_ONLY_ON_REQUEST)) {
8403 *scsipkt->pkt_scbp = STATUS_CHECK;
8404 sense = sata_arq_sense(spx);
8405 sense->es_key = KEY_ILLEGAL_REQUEST;
8406 sense->es_add_code = SD_SCSI_ASC_INVALID_FIELD_IN_PARAMS_LIST;
8407 *pagelen = parmlen;
8408 *rval = TRAN_ACCEPT;
8409 return (SATA_FAILURE);
8410 }
8411
8412 *pagelen = PAGELENGTH_INFO_EXCPT + sizeof (struct mode_page);
8413
8414 if (! (sata_id->ai_cmdset82 & SATA_SMART_SUPPORTED)) {
8415 *scsipkt->pkt_scbp = STATUS_CHECK;
8416 sense = sata_arq_sense(spx);
8417 sense->es_key = KEY_ILLEGAL_REQUEST;
8418 sense->es_add_code = SD_SCSI_ASC_INVALID_FIELD_IN_CDB;
8419 *pagelen = parmlen;
8420 *rval = TRAN_ACCEPT;
8421 return (SATA_FAILURE);
8422 }
8423
8424 /* If already in the state requested, we are done */
8425 if (page->dexcpt == ! (sata_id->ai_features85 & SATA_SMART_ENABLED)) {
8426 /* nothing to do */
8427 *rval = TRAN_ACCEPT;
8428 return (SATA_SUCCESS);
8429 }
8430
8431 scmd->satacmd_flags.sata_data_direction = SATA_DIR_NODATA_XFER;
8432
8433 /* Build SMART_ENABLE or SMART_DISABLE command */
8434 scmd->satacmd_addr_type = 0; /* N/A */
8435 scmd->satacmd_lba_mid_lsb = SMART_MAGIC_VAL_1;
8436 scmd->satacmd_lba_high_lsb = SMART_MAGIC_VAL_2;
8437 scmd->satacmd_features_reg = page->dexcpt ?
8438 SATA_SMART_DISABLE_OPS : SATA_SMART_ENABLE_OPS;
8439 scmd->satacmd_device_reg = 0; /* Always device 0 */
8440 scmd->satacmd_cmd_reg = SATAC_SMART;
8441
8442 /* Transfer command to HBA */
8443 if (sata_hba_start(spx, rval) != 0)
8444 /*
8445 * Pkt not accepted for execution.
8446 */
8447 return (SATA_FAILURE);
8448
8449 *dmod = 1; /* At least may have been modified */
8450
8451 /* Now process return */
8452 if (spx->txlt_sata_pkt->satapkt_reason == SATA_PKT_COMPLETED)
8453 return (SATA_SUCCESS);
8454
8455 /* Packet did not complete successfully */
8456 sata_xlate_errors(spx);
8457
8458 return (SATA_FAILURE);
8459 }
8460
8461 /*
8462 * Process mode select acoustic management control page 0x30
8463 *
8464 *
8465 * This function has to be called with a port mutex held.
8466 *
8467 * Returns SATA_SUCCESS if operation was successful, SATA_FAILURE otherwise.
8468 *
8469 * Cannot be called in the interrupt context.
8470 */
8471 int
sata_mode_select_page_30(sata_pkt_txlate_t * spx,struct mode_acoustic_management * page,int parmlen,int * pagelen,int * rval,int * dmod)8472 sata_mode_select_page_30(sata_pkt_txlate_t *spx, struct
8473 mode_acoustic_management *page, int parmlen, int *pagelen,
8474 int *rval, int *dmod)
8475 {
8476 struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
8477 sata_drive_info_t *sdinfo;
8478 sata_cmd_t *scmd = &spx->txlt_sata_pkt->satapkt_cmd;
8479 sata_id_t *sata_id;
8480 struct scsi_extended_sense *sense;
8481
8482 sdinfo = sata_get_device_info(spx->txlt_sata_hba_inst,
8483 &spx->txlt_sata_pkt->satapkt_device);
8484 sata_id = &sdinfo->satadrv_id;
8485 *dmod = 0;
8486
8487 /* If parmlen is too short or the feature is not supported, drop it */
8488 if (((PAGELENGTH_DAD_MODE_ACOUSTIC_MANAGEMENT +
8489 sizeof (struct mode_page)) > parmlen) ||
8490 (! (sata_id->ai_cmdset83 & SATA_ACOUSTIC_MGMT))) {
8491 *scsipkt->pkt_scbp = STATUS_CHECK;
8492 sense = sata_arq_sense(spx);
8493 sense->es_key = KEY_ILLEGAL_REQUEST;
8494 sense->es_add_code = SD_SCSI_ASC_INVALID_FIELD_IN_PARAMS_LIST;
8495 *pagelen = parmlen;
8496 *rval = TRAN_ACCEPT;
8497 return (SATA_FAILURE);
8498 }
8499
8500 *pagelen = PAGELENGTH_DAD_MODE_ACOUSTIC_MANAGEMENT +
8501 sizeof (struct mode_page);
8502
8503 /*
8504 * We can enable and disable acoustice management and
8505 * set the acoustic management level.
8506 */
8507
8508 /*
8509 * Set-up Internal SET FEATURES command(s)
8510 */
8511 scmd->satacmd_flags.sata_data_direction = SATA_DIR_NODATA_XFER;
8512 scmd->satacmd_addr_type = 0;
8513 scmd->satacmd_device_reg = 0;
8514 scmd->satacmd_status_reg = 0;
8515 scmd->satacmd_error_reg = 0;
8516 scmd->satacmd_cmd_reg = SATAC_SET_FEATURES;
8517 if (page->acoustic_manag_enable) {
8518 scmd->satacmd_features_reg = SATAC_SF_ENABLE_ACOUSTIC;
8519 scmd->satacmd_sec_count_lsb = page->acoustic_manag_level;
8520 } else { /* disabling acoustic management */
8521 scmd->satacmd_features_reg = SATAC_SF_DISABLE_ACOUSTIC;
8522 }
8523
8524 /* Transfer command to HBA */
8525 if (sata_hba_start(spx, rval) != 0)
8526 /*
8527 * Pkt not accepted for execution.
8528 */
8529 return (SATA_FAILURE);
8530
8531 /* Now process return */
8532 if (spx->txlt_sata_pkt->satapkt_reason != SATA_PKT_COMPLETED) {
8533 sata_xlate_errors(spx);
8534 return (SATA_FAILURE);
8535 }
8536
8537 *dmod = 1;
8538
8539 return (SATA_SUCCESS);
8540 }
8541
8542 /*
8543 * Process mode select power condition page 0x1a
8544 *
8545 * This function has to be called with a port mutex held.
8546 *
8547 * Returns SATA_SUCCESS if operation was successful, SATA_FAILURE otherwise.
8548 *
8549 * Cannot be called in the interrupt context.
8550 */
8551 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)8552 sata_mode_select_page_1a(sata_pkt_txlate_t *spx, struct
8553 mode_info_power_cond *page, int parmlen, int *pagelen,
8554 int *rval, int *dmod)
8555 {
8556 struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
8557 sata_drive_info_t *sdinfo;
8558 sata_cmd_t *scmd = &spx->txlt_sata_pkt->satapkt_cmd;
8559 sata_id_t *sata_id;
8560 struct scsi_extended_sense *sense;
8561 uint8_t ata_count;
8562 int i, len;
8563
8564 sdinfo = sata_get_device_info(spx->txlt_sata_hba_inst,
8565 &spx->txlt_sata_pkt->satapkt_device);
8566 sata_id = &sdinfo->satadrv_id;
8567 *dmod = 0;
8568
8569 len = sizeof (struct mode_info_power_cond);
8570 len += sizeof (struct mode_page);
8571
8572 /* If parmlen is too short or the feature is not supported, drop it */
8573 if ((len < parmlen) || (page->idle == 1) ||
8574 (!(sata_id->ai_cap & SATA_STANDBYTIMER) && page->standby == 1)) {
8575 *scsipkt->pkt_scbp = STATUS_CHECK;
8576 sense = sata_arq_sense(spx);
8577 sense->es_key = KEY_ILLEGAL_REQUEST;
8578 sense->es_add_code = SD_SCSI_ASC_INVALID_FIELD_IN_PARAMS_LIST;
8579 *pagelen = parmlen;
8580 *rval = TRAN_ACCEPT;
8581 return (SATA_FAILURE);
8582 }
8583
8584 *pagelen = len;
8585
8586 /*
8587 * Set-up Internal STANDBY command(s)
8588 */
8589 if (page->standby == 0)
8590 goto out;
8591
8592 ata_count = sata_get_standby_timer(page->standby_cond_timer);
8593
8594 scmd->satacmd_addr_type = 0;
8595 scmd->satacmd_sec_count_lsb = ata_count;
8596 scmd->satacmd_lba_low_lsb = 0;
8597 scmd->satacmd_lba_mid_lsb = 0;
8598 scmd->satacmd_lba_high_lsb = 0;
8599 scmd->satacmd_features_reg = 0;
8600 scmd->satacmd_device_reg = 0;
8601 scmd->satacmd_status_reg = 0;
8602 scmd->satacmd_cmd_reg = SATAC_STANDBY;
8603 scmd->satacmd_flags.sata_special_regs = B_TRUE;
8604 scmd->satacmd_flags.sata_copy_out_error_reg = B_TRUE;
8605
8606 /* Transfer command to HBA */
8607 if (sata_hba_start(spx, rval) != 0) {
8608 return (SATA_FAILURE);
8609 } else {
8610 if ((scmd->satacmd_error_reg != 0) ||
8611 (spx->txlt_sata_pkt->satapkt_reason !=
8612 SATA_PKT_COMPLETED)) {
8613 sata_xlate_errors(spx);
8614 return (SATA_FAILURE);
8615 }
8616 }
8617
8618 for (i = 0; i < 4; i++) {
8619 sdinfo->satadrv_standby_timer[i] = page->standby_cond_timer[i];
8620 }
8621 out:
8622 *dmod = 1;
8623 return (SATA_SUCCESS);
8624 }
8625
8626 /*
8627 * sata_build_lsense_page0() is used to create the
8628 * SCSI LOG SENSE page 0 (supported log pages)
8629 *
8630 * Currently supported pages are 0, 0x10, 0x2f, 0x30 and 0x0e
8631 * (supported log pages, self-test results, informational exceptions
8632 * Sun vendor specific ATA SMART data, and start stop cycle counter).
8633 *
8634 * Takes a sata_drive_info t * and the address of a buffer
8635 * in which to create the page information.
8636 *
8637 * Returns the number of bytes valid in the buffer.
8638 */
8639 static int
sata_build_lsense_page_0(sata_drive_info_t * sdinfo,uint8_t * buf)8640 sata_build_lsense_page_0(sata_drive_info_t *sdinfo, uint8_t *buf)
8641 {
8642 struct log_parameter *lpp = (struct log_parameter *)buf;
8643 uint8_t *page_ptr = (uint8_t *)lpp->param_values;
8644 int num_pages_supported = 1; /* Always have GET_SUPPORTED_LOG_PAGES */
8645 sata_id_t *sata_id = &sdinfo->satadrv_id;
8646
8647 lpp->param_code[0] = 0;
8648 lpp->param_code[1] = 0;
8649 lpp->param_ctrl_flags = LOG_CTRL_LP | LOG_CTRL_LBIN;
8650 *page_ptr++ = PAGE_CODE_GET_SUPPORTED_LOG_PAGES;
8651
8652 if (sata_id->ai_cmdset82 & SATA_SMART_SUPPORTED) {
8653 if (sata_id->ai_cmdset84 & SATA_SMART_SELF_TEST_SUPPORTED) {
8654 *page_ptr++ = PAGE_CODE_SELF_TEST_RESULTS;
8655 ++num_pages_supported;
8656 }
8657 *page_ptr++ = PAGE_CODE_INFORMATION_EXCEPTIONS;
8658 ++num_pages_supported;
8659 *page_ptr++ = PAGE_CODE_SMART_READ_DATA;
8660 ++num_pages_supported;
8661 *page_ptr++ = PAGE_CODE_START_STOP_CYCLE_COUNTER;
8662 ++num_pages_supported;
8663 }
8664
8665 lpp->param_len = num_pages_supported;
8666
8667 return ((&lpp->param_values[0] - (uint8_t *)lpp) +
8668 num_pages_supported);
8669 }
8670
8671 /*
8672 * sata_build_lsense_page_10() is used to create the
8673 * SCSI LOG SENSE page 0x10 (self-test results)
8674 *
8675 * Takes a sata_drive_info t * and the address of a buffer
8676 * in which to create the page information as well as a sata_hba_inst_t *.
8677 *
8678 * Returns the number of bytes valid in the buffer.
8679 *
8680 * Note: Self test and SMART data is accessible in device log pages.
8681 * The log pages can be accessed by SMART READ/WRITE LOG (up to 255 sectors
8682 * of data can be transferred by a single command), or by the General Purpose
8683 * Logging commands (GPL) READ LOG EXT and WRITE LOG EXT (up to 65,535 sectors
8684 * - approximately 33MB - can be transferred by a single command.
8685 * The SCT Command response (either error or command) is the same for both
8686 * the SMART and GPL methods of issuing commands.
8687 * This function uses READ LOG EXT command when drive supports LBA48, and
8688 * SMART READ command otherwise.
8689 *
8690 * Since above commands are executed in a synchronous mode, this function
8691 * should not be called in an interrupt context.
8692 */
8693 static int
sata_build_lsense_page_10(sata_drive_info_t * sdinfo,uint8_t * buf,sata_hba_inst_t * sata_hba_inst)8694 sata_build_lsense_page_10(
8695 sata_drive_info_t *sdinfo,
8696 uint8_t *buf,
8697 sata_hba_inst_t *sata_hba_inst)
8698 {
8699 struct log_parameter *lpp = (struct log_parameter *)buf;
8700 int rval;
8701
8702 if (sdinfo->satadrv_features_support & SATA_DEV_F_LBA48) {
8703 struct smart_ext_selftest_log *ext_selftest_log;
8704
8705 ext_selftest_log = kmem_zalloc(
8706 sizeof (struct smart_ext_selftest_log), KM_SLEEP);
8707
8708 rval = sata_ext_smart_selftest_read_log(sata_hba_inst, sdinfo,
8709 ext_selftest_log, 0);
8710 if (rval == 0) {
8711 int index, start_index;
8712 struct smart_ext_selftest_log_entry *entry;
8713 static const struct smart_ext_selftest_log_entry empty =
8714 {0};
8715 uint16_t block_num;
8716 int count;
8717 boolean_t only_one_block = B_FALSE;
8718
8719 index = ext_selftest_log->
8720 smart_ext_selftest_log_index[0];
8721 index |= ext_selftest_log->
8722 smart_ext_selftest_log_index[1] << 8;
8723 if (index == 0)
8724 goto out;
8725
8726 --index; /* Correct for 0 origin */
8727 start_index = index; /* remember where we started */
8728 block_num = index / ENTRIES_PER_EXT_SELFTEST_LOG_BLK;
8729 if (block_num != 0) {
8730 rval = sata_ext_smart_selftest_read_log(
8731 sata_hba_inst, sdinfo, ext_selftest_log,
8732 block_num);
8733 if (rval != 0)
8734 goto out;
8735 }
8736 index %= ENTRIES_PER_EXT_SELFTEST_LOG_BLK;
8737 entry =
8738 &ext_selftest_log->
8739 smart_ext_selftest_log_entries[index];
8740
8741 for (count = 1;
8742 count <= SCSI_ENTRIES_IN_LOG_SENSE_SELFTEST_RESULTS;
8743 ++count) {
8744 uint8_t status;
8745 uint8_t code;
8746 uint8_t sense_key;
8747 uint8_t add_sense_code;
8748 uint8_t add_sense_code_qual;
8749
8750 /* If this is an unused entry, we are done */
8751 if (bcmp(entry, &empty, sizeof (empty)) == 0) {
8752 /* Broken firmware on some disks */
8753 if (index + 1 ==
8754 ENTRIES_PER_EXT_SELFTEST_LOG_BLK) {
8755 --entry;
8756 --index;
8757 if (bcmp(entry, &empty,
8758 sizeof (empty)) == 0)
8759 goto out;
8760 } else
8761 goto out;
8762 }
8763
8764 if (only_one_block &&
8765 start_index == index)
8766 goto out;
8767
8768 lpp->param_code[0] = 0;
8769 lpp->param_code[1] = count;
8770 lpp->param_ctrl_flags =
8771 LOG_CTRL_LP | LOG_CTRL_LBIN;
8772 lpp->param_len =
8773 SCSI_LOG_SENSE_SELFTEST_PARAM_LEN;
8774
8775 status = entry->smart_ext_selftest_log_status;
8776 status >>= 4;
8777 switch (status) {
8778 case 0:
8779 default:
8780 sense_key = KEY_NO_SENSE;
8781 add_sense_code =
8782 SD_SCSI_ASC_NO_ADD_SENSE;
8783 add_sense_code_qual = 0;
8784 break;
8785 case 1:
8786 sense_key = KEY_ABORTED_COMMAND;
8787 add_sense_code =
8788 DIAGNOSTIC_FAILURE_ON_COMPONENT;
8789 add_sense_code_qual = SCSI_COMPONENT_81;
8790 break;
8791 case 2:
8792 sense_key = KEY_ABORTED_COMMAND;
8793 add_sense_code =
8794 DIAGNOSTIC_FAILURE_ON_COMPONENT;
8795 add_sense_code_qual = SCSI_COMPONENT_82;
8796 break;
8797 case 3:
8798 sense_key = KEY_ABORTED_COMMAND;
8799 add_sense_code =
8800 DIAGNOSTIC_FAILURE_ON_COMPONENT;
8801 add_sense_code_qual = SCSI_COMPONENT_83;
8802 break;
8803 case 4:
8804 sense_key = KEY_HARDWARE_ERROR;
8805 add_sense_code =
8806 DIAGNOSTIC_FAILURE_ON_COMPONENT;
8807 add_sense_code_qual = SCSI_COMPONENT_84;
8808 break;
8809 case 5:
8810 sense_key = KEY_HARDWARE_ERROR;
8811 add_sense_code =
8812 DIAGNOSTIC_FAILURE_ON_COMPONENT;
8813 add_sense_code_qual = SCSI_COMPONENT_85;
8814 break;
8815 case 6:
8816 sense_key = KEY_HARDWARE_ERROR;
8817 add_sense_code =
8818 DIAGNOSTIC_FAILURE_ON_COMPONENT;
8819 add_sense_code_qual = SCSI_COMPONENT_86;
8820 break;
8821 case 7:
8822 sense_key = KEY_MEDIUM_ERROR;
8823 add_sense_code =
8824 DIAGNOSTIC_FAILURE_ON_COMPONENT;
8825 add_sense_code_qual = SCSI_COMPONENT_87;
8826 break;
8827 case 8:
8828 sense_key = KEY_HARDWARE_ERROR;
8829 add_sense_code =
8830 DIAGNOSTIC_FAILURE_ON_COMPONENT;
8831 add_sense_code_qual = SCSI_COMPONENT_88;
8832 break;
8833 }
8834 code = 0; /* unspecified */
8835 status |= (code << 4);
8836 lpp->param_values[0] = status;
8837 lpp->param_values[1] = 0; /* unspecified */
8838 lpp->param_values[2] = entry->
8839 smart_ext_selftest_log_timestamp[1];
8840 lpp->param_values[3] = entry->
8841 smart_ext_selftest_log_timestamp[0];
8842 if (status != 0) {
8843 lpp->param_values[4] = 0;
8844 lpp->param_values[5] = 0;
8845 lpp->param_values[6] = entry->
8846 smart_ext_selftest_log_failing_lba
8847 [5];
8848 lpp->param_values[7] = entry->
8849 smart_ext_selftest_log_failing_lba
8850 [4];
8851 lpp->param_values[8] = entry->
8852 smart_ext_selftest_log_failing_lba
8853 [3];
8854 lpp->param_values[9] = entry->
8855 smart_ext_selftest_log_failing_lba
8856 [2];
8857 lpp->param_values[10] = entry->
8858 smart_ext_selftest_log_failing_lba
8859 [1];
8860 lpp->param_values[11] = entry->
8861 smart_ext_selftest_log_failing_lba
8862 [0];
8863 } else { /* No bad block address */
8864 lpp->param_values[4] = 0xff;
8865 lpp->param_values[5] = 0xff;
8866 lpp->param_values[6] = 0xff;
8867 lpp->param_values[7] = 0xff;
8868 lpp->param_values[8] = 0xff;
8869 lpp->param_values[9] = 0xff;
8870 lpp->param_values[10] = 0xff;
8871 lpp->param_values[11] = 0xff;
8872 }
8873
8874 lpp->param_values[12] = sense_key;
8875 lpp->param_values[13] = add_sense_code;
8876 lpp->param_values[14] = add_sense_code_qual;
8877 lpp->param_values[15] = 0; /* undefined */
8878
8879 lpp = (struct log_parameter *)
8880 (((uint8_t *)lpp) +
8881 SCSI_LOG_PARAM_HDR_LEN +
8882 SCSI_LOG_SENSE_SELFTEST_PARAM_LEN);
8883
8884 --index; /* Back up to previous entry */
8885 if (index < 0) {
8886 if (block_num > 0) {
8887 --block_num;
8888 } else {
8889 struct read_log_ext_directory
8890 logdir;
8891
8892 rval =
8893 sata_read_log_ext_directory(
8894 sata_hba_inst, sdinfo,
8895 &logdir);
8896 if (rval == -1)
8897 goto out;
8898 if ((logdir.read_log_ext_vers
8899 [0] == 0) &&
8900 (logdir.read_log_ext_vers
8901 [1] == 0))
8902 goto out;
8903 block_num =
8904 logdir.read_log_ext_nblks
8905 [EXT_SMART_SELFTEST_LOG_PAGE
8906 - 1][0];
8907 block_num |= logdir.
8908 read_log_ext_nblks
8909 [EXT_SMART_SELFTEST_LOG_PAGE
8910 - 1][1] << 8;
8911 --block_num;
8912 only_one_block =
8913 (block_num == 0);
8914 }
8915 rval = sata_ext_smart_selftest_read_log(
8916 sata_hba_inst, sdinfo,
8917 ext_selftest_log, block_num);
8918 if (rval != 0)
8919 goto out;
8920
8921 index =
8922 ENTRIES_PER_EXT_SELFTEST_LOG_BLK -
8923 1;
8924 }
8925 index %= ENTRIES_PER_EXT_SELFTEST_LOG_BLK;
8926 entry = &ext_selftest_log->
8927 smart_ext_selftest_log_entries[index];
8928 }
8929 }
8930 out:
8931 kmem_free(ext_selftest_log,
8932 sizeof (struct smart_ext_selftest_log));
8933 } else {
8934 struct smart_selftest_log *selftest_log;
8935
8936 selftest_log = kmem_zalloc(sizeof (struct smart_selftest_log),
8937 KM_SLEEP);
8938
8939 rval = sata_smart_selftest_log(sata_hba_inst, sdinfo,
8940 selftest_log);
8941
8942 if (rval == 0) {
8943 int index;
8944 int count;
8945 struct smart_selftest_log_entry *entry;
8946 static const struct smart_selftest_log_entry empty =
8947 { 0 };
8948
8949 index = selftest_log->smart_selftest_log_index;
8950 if (index == 0)
8951 goto done;
8952 --index; /* Correct for 0 origin */
8953 entry = &selftest_log->
8954 smart_selftest_log_entries[index];
8955 for (count = 1;
8956 count <= SCSI_ENTRIES_IN_LOG_SENSE_SELFTEST_RESULTS;
8957 ++count) {
8958 uint8_t status;
8959 uint8_t code;
8960 uint8_t sense_key;
8961 uint8_t add_sense_code;
8962 uint8_t add_sense_code_qual;
8963
8964 if (bcmp(entry, &empty, sizeof (empty)) == 0)
8965 goto done;
8966
8967 lpp->param_code[0] = 0;
8968 lpp->param_code[1] = count;
8969 lpp->param_ctrl_flags =
8970 LOG_CTRL_LP | LOG_CTRL_LBIN;
8971 lpp->param_len =
8972 SCSI_LOG_SENSE_SELFTEST_PARAM_LEN;
8973
8974 status = entry->smart_selftest_log_status;
8975 status >>= 4;
8976 switch (status) {
8977 case 0:
8978 default:
8979 sense_key = KEY_NO_SENSE;
8980 add_sense_code =
8981 SD_SCSI_ASC_NO_ADD_SENSE;
8982 break;
8983 case 1:
8984 sense_key = KEY_ABORTED_COMMAND;
8985 add_sense_code =
8986 DIAGNOSTIC_FAILURE_ON_COMPONENT;
8987 add_sense_code_qual = SCSI_COMPONENT_81;
8988 break;
8989 case 2:
8990 sense_key = KEY_ABORTED_COMMAND;
8991 add_sense_code =
8992 DIAGNOSTIC_FAILURE_ON_COMPONENT;
8993 add_sense_code_qual = SCSI_COMPONENT_82;
8994 break;
8995 case 3:
8996 sense_key = KEY_ABORTED_COMMAND;
8997 add_sense_code =
8998 DIAGNOSTIC_FAILURE_ON_COMPONENT;
8999 add_sense_code_qual = SCSI_COMPONENT_83;
9000 break;
9001 case 4:
9002 sense_key = KEY_HARDWARE_ERROR;
9003 add_sense_code =
9004 DIAGNOSTIC_FAILURE_ON_COMPONENT;
9005 add_sense_code_qual = SCSI_COMPONENT_84;
9006 break;
9007 case 5:
9008 sense_key = KEY_HARDWARE_ERROR;
9009 add_sense_code =
9010 DIAGNOSTIC_FAILURE_ON_COMPONENT;
9011 add_sense_code_qual = SCSI_COMPONENT_85;
9012 break;
9013 case 6:
9014 sense_key = KEY_HARDWARE_ERROR;
9015 add_sense_code =
9016 DIAGNOSTIC_FAILURE_ON_COMPONENT;
9017 add_sense_code_qual = SCSI_COMPONENT_86;
9018 break;
9019 case 7:
9020 sense_key = KEY_MEDIUM_ERROR;
9021 add_sense_code =
9022 DIAGNOSTIC_FAILURE_ON_COMPONENT;
9023 add_sense_code_qual = SCSI_COMPONENT_87;
9024 break;
9025 case 8:
9026 sense_key = KEY_HARDWARE_ERROR;
9027 add_sense_code =
9028 DIAGNOSTIC_FAILURE_ON_COMPONENT;
9029 add_sense_code_qual = SCSI_COMPONENT_88;
9030 break;
9031 }
9032 code = 0; /* unspecified */
9033 status |= (code << 4);
9034 lpp->param_values[0] = status;
9035 lpp->param_values[1] = 0; /* unspecified */
9036 lpp->param_values[2] = entry->
9037 smart_selftest_log_timestamp[1];
9038 lpp->param_values[3] = entry->
9039 smart_selftest_log_timestamp[0];
9040 if (status != 0) {
9041 lpp->param_values[4] = 0;
9042 lpp->param_values[5] = 0;
9043 lpp->param_values[6] = 0;
9044 lpp->param_values[7] = 0;
9045 lpp->param_values[8] = entry->
9046 smart_selftest_log_failing_lba[3];
9047 lpp->param_values[9] = entry->
9048 smart_selftest_log_failing_lba[2];
9049 lpp->param_values[10] = entry->
9050 smart_selftest_log_failing_lba[1];
9051 lpp->param_values[11] = entry->
9052 smart_selftest_log_failing_lba[0];
9053 } else { /* No block address */
9054 lpp->param_values[4] = 0xff;
9055 lpp->param_values[5] = 0xff;
9056 lpp->param_values[6] = 0xff;
9057 lpp->param_values[7] = 0xff;
9058 lpp->param_values[8] = 0xff;
9059 lpp->param_values[9] = 0xff;
9060 lpp->param_values[10] = 0xff;
9061 lpp->param_values[11] = 0xff;
9062 }
9063 lpp->param_values[12] = sense_key;
9064 lpp->param_values[13] = add_sense_code;
9065 lpp->param_values[14] = add_sense_code_qual;
9066 lpp->param_values[15] = 0; /* undefined */
9067
9068 lpp = (struct log_parameter *)
9069 (((uint8_t *)lpp) +
9070 SCSI_LOG_PARAM_HDR_LEN +
9071 SCSI_LOG_SENSE_SELFTEST_PARAM_LEN);
9072 --index; /* back up to previous entry */
9073 if (index < 0) {
9074 index =
9075 NUM_SMART_SELFTEST_LOG_ENTRIES - 1;
9076 }
9077 entry = &selftest_log->
9078 smart_selftest_log_entries[index];
9079 }
9080 }
9081 done:
9082 kmem_free(selftest_log, sizeof (struct smart_selftest_log));
9083 }
9084
9085 return ((SCSI_LOG_PARAM_HDR_LEN + SCSI_LOG_SENSE_SELFTEST_PARAM_LEN) *
9086 SCSI_ENTRIES_IN_LOG_SENSE_SELFTEST_RESULTS);
9087 }
9088
9089 /*
9090 * sata_build_lsense_page_2f() is used to create the
9091 * SCSI LOG SENSE page 0x2f (informational exceptions)
9092 *
9093 * Takes a sata_drive_info t * and the address of a buffer
9094 * in which to create the page information as well as a sata_hba_inst_t *.
9095 *
9096 * Returns the number of bytes valid in the buffer.
9097 *
9098 * Because it invokes function(s) that send synchronously executed command
9099 * to the HBA, it cannot be called in the interrupt context.
9100 */
9101 static int
sata_build_lsense_page_2f(sata_drive_info_t * sdinfo,uint8_t * buf,sata_hba_inst_t * sata_hba_inst)9102 sata_build_lsense_page_2f(
9103 sata_drive_info_t *sdinfo,
9104 uint8_t *buf,
9105 sata_hba_inst_t *sata_hba_inst)
9106 {
9107 struct log_parameter *lpp = (struct log_parameter *)buf;
9108 int rval;
9109 uint8_t *smart_data;
9110 uint8_t temp;
9111 sata_id_t *sata_id;
9112 #define SMART_NO_TEMP 0xff
9113
9114 lpp->param_code[0] = 0;
9115 lpp->param_code[1] = 0;
9116 lpp->param_ctrl_flags = LOG_CTRL_LP | LOG_CTRL_LBIN;
9117
9118 /* Now get the SMART status w.r.t. threshold exceeded */
9119 rval = sata_fetch_smart_return_status(sata_hba_inst, sdinfo);
9120 switch (rval) {
9121 case 1:
9122 lpp->param_values[0] = SCSI_PREDICTED_FAILURE;
9123 lpp->param_values[1] = SCSI_GENERAL_HD_FAILURE;
9124 break;
9125 case 0:
9126 case -1: /* failed to get data */
9127 lpp->param_values[0] = 0; /* No failure predicted */
9128 lpp->param_values[1] = 0;
9129 break;
9130 #if defined(SATA_DEBUG)
9131 default:
9132 cmn_err(CE_PANIC, "sata_build_lsense_page_2f bad return value");
9133 /* NOTREACHED */
9134 #endif
9135 }
9136
9137 sata_id = &sdinfo->satadrv_id;
9138 if (! (sata_id->ai_sctsupport & SATA_SCT_CMD_TRANS_SUP))
9139 temp = SMART_NO_TEMP;
9140 else {
9141 /* Now get the temperature */
9142 smart_data = kmem_zalloc(512, KM_SLEEP);
9143 rval = sata_smart_read_log(sata_hba_inst, sdinfo, smart_data,
9144 SCT_STATUS_LOG_PAGE, 1);
9145 if (rval == -1)
9146 temp = SMART_NO_TEMP;
9147 else {
9148 temp = smart_data[200];
9149 if (temp & 0x80) {
9150 if (temp & 0x7f)
9151 temp = 0;
9152 else
9153 temp = SMART_NO_TEMP;
9154 }
9155 }
9156 kmem_free(smart_data, 512);
9157 }
9158
9159 lpp->param_values[2] = temp; /* most recent temperature */
9160 lpp->param_values[3] = 0; /* required vendor specific byte */
9161
9162 lpp->param_len = SCSI_INFO_EXCEPTIONS_PARAM_LEN;
9163
9164
9165 return (SCSI_INFO_EXCEPTIONS_PARAM_LEN + SCSI_LOG_PARAM_HDR_LEN);
9166 }
9167
9168 /*
9169 * sata_build_lsense_page_30() is used to create the
9170 * SCSI LOG SENSE page 0x30 (Sun's vendor specific page for ATA SMART data).
9171 *
9172 * Takes a sata_drive_info t * and the address of a buffer
9173 * in which to create the page information as well as a sata_hba_inst_t *.
9174 *
9175 * Returns the number of bytes valid in the buffer.
9176 */
9177 static int
sata_build_lsense_page_30(sata_drive_info_t * sdinfo,uint8_t * buf,sata_hba_inst_t * sata_hba_inst)9178 sata_build_lsense_page_30(
9179 sata_drive_info_t *sdinfo,
9180 uint8_t *buf,
9181 sata_hba_inst_t *sata_hba_inst)
9182 {
9183 struct smart_data *smart_data = (struct smart_data *)buf;
9184 int rval;
9185
9186 /* Now do the SMART READ DATA */
9187 rval = sata_fetch_smart_data(sata_hba_inst, sdinfo, smart_data);
9188 if (rval == -1)
9189 return (0);
9190
9191 return (sizeof (struct smart_data));
9192 }
9193
9194 /*
9195 * sata_build_lsense_page_0e() is used to create the
9196 * SCSI LOG SENSE page 0e (start-stop cycle counter page)
9197 *
9198 * Date of Manufacture (0x0001)
9199 * YEAR = "0000"
9200 * WEEK = "00"
9201 * Accounting Date (0x0002)
9202 * 6 ASCII space character(20h)
9203 * Specified cycle count over device lifetime
9204 * VALUE - THRESH - the delta between max and min;
9205 * Accumulated start-stop cycles
9206 * VALUE - WORST - the accumulated cycles;
9207 *
9208 * ID FLAG THRESH VALUE WORST RAW on start/stop counter attribute
9209 *
9210 * Takes a sata_drive_info t * and the address of a buffer
9211 * in which to create the page information as well as a sata_hba_inst_t *.
9212 *
9213 * Returns the number of bytes valid in the buffer.
9214 */
9215 static int
sata_build_lsense_page_0e(sata_drive_info_t * sdinfo,uint8_t * buf,sata_pkt_txlate_t * spx)9216 sata_build_lsense_page_0e(sata_drive_info_t *sdinfo, uint8_t *buf,
9217 sata_pkt_txlate_t *spx)
9218 {
9219 struct start_stop_cycle_counter_log *log_page;
9220 int i, rval, index;
9221 uint8_t smart_data[512], id, value, worst, thresh;
9222 uint32_t max_count, cycles;
9223
9224 /* Now do the SMART READ DATA */
9225 rval = sata_fetch_smart_data(spx->txlt_sata_hba_inst, sdinfo,
9226 (struct smart_data *)smart_data);
9227 if (rval == -1)
9228 return (0);
9229 for (i = 0, id = 0; i < SMART_START_STOP_COUNT_ID * 2; i++) {
9230 index = (i * 12) + 2;
9231 id = smart_data[index];
9232 if (id != SMART_START_STOP_COUNT_ID)
9233 continue;
9234 else {
9235 thresh = smart_data[index + 2];
9236 value = smart_data[index + 3];
9237 worst = smart_data[index + 4];
9238 break;
9239 }
9240 }
9241 if (id != SMART_START_STOP_COUNT_ID)
9242 return (0);
9243 max_count = value - thresh;
9244 cycles = value - worst;
9245
9246 log_page = (struct start_stop_cycle_counter_log *)buf;
9247 bzero(log_page, sizeof (struct start_stop_cycle_counter_log));
9248 log_page->code = 0x0e;
9249 log_page->page_len_low = 0x24;
9250
9251 log_page->manufactor_date_low = 0x1;
9252 log_page->param_1.fmt_link = 0x1; /* 01b */
9253 log_page->param_len_1 = 0x06;
9254 for (i = 0; i < 4; i++) {
9255 log_page->year_manu[i] = 0x30;
9256 if (i < 2)
9257 log_page->week_manu[i] = 0x30;
9258 }
9259
9260 log_page->account_date_low = 0x02;
9261 log_page->param_2.fmt_link = 0x01; /* 01b */
9262 log_page->param_len_2 = 0x06;
9263 for (i = 0; i < 4; i++) {
9264 log_page->year_account[i] = 0x20;
9265 if (i < 2)
9266 log_page->week_account[i] = 0x20;
9267 }
9268
9269 log_page->lifetime_code_low = 0x03;
9270 log_page->param_3.fmt_link = 0x03; /* 11b */
9271 log_page->param_len_3 = 0x04;
9272 /* VALUE - THRESH - the delta between max and min */
9273 log_page->cycle_code_low = 0x04;
9274 log_page->param_4.fmt_link = 0x03; /* 11b */
9275 log_page->param_len_4 = 0x04;
9276 /* WORST - THRESH - the distance from 'now' to min */
9277
9278 for (i = 0; i < 4; i++) {
9279 log_page->cycle_lifetime[i] =
9280 (max_count >> (8 * (3 - i))) & 0xff;
9281 log_page->cycle_accumulated[i] =
9282 (cycles >> (8 * (3 - i))) & 0xff;
9283 }
9284
9285 return (sizeof (struct start_stop_cycle_counter_log));
9286 }
9287
9288 /*
9289 * This function was used for build a ATA read verify sector command
9290 */
9291 static void
sata_build_read_verify_cmd(sata_cmd_t * scmd,uint16_t sec,uint64_t lba)9292 sata_build_read_verify_cmd(sata_cmd_t *scmd, uint16_t sec, uint64_t lba)
9293 {
9294 scmd->satacmd_cmd_reg = SATAC_RDVER;
9295 scmd->satacmd_addr_type = ATA_ADDR_LBA28;
9296 scmd->satacmd_flags.sata_special_regs = B_TRUE;
9297
9298 scmd->satacmd_sec_count_lsb = sec & 0xff;
9299 scmd->satacmd_lba_low_lsb = lba & 0xff;
9300 scmd->satacmd_lba_mid_lsb = (lba >> 8) & 0xff;
9301 scmd->satacmd_lba_high_lsb = (lba >> 16) & 0xff;
9302 scmd->satacmd_device_reg = (SATA_ADH_LBA | (lba >> 24) & 0xf);
9303 scmd->satacmd_features_reg = 0;
9304 scmd->satacmd_status_reg = 0;
9305 scmd->satacmd_error_reg = 0;
9306 }
9307
9308 /*
9309 * This function was used for building an ATA
9310 * command, and only command register need to
9311 * be defined, other register will be zero or na.
9312 */
9313 static void
sata_build_generic_cmd(sata_cmd_t * scmd,uint8_t cmd)9314 sata_build_generic_cmd(sata_cmd_t *scmd, uint8_t cmd)
9315 {
9316 scmd->satacmd_addr_type = 0;
9317 scmd->satacmd_cmd_reg = cmd;
9318 scmd->satacmd_device_reg = 0;
9319 scmd->satacmd_sec_count_lsb = 0;
9320 scmd->satacmd_lba_low_lsb = 0;
9321 scmd->satacmd_lba_mid_lsb = 0;
9322 scmd->satacmd_lba_high_lsb = 0;
9323 scmd->satacmd_features_reg = 0;
9324 scmd->satacmd_status_reg = 0;
9325 scmd->satacmd_error_reg = 0;
9326 scmd->satacmd_flags.sata_special_regs = B_TRUE;
9327 }
9328
9329 /*
9330 * This function was used for changing the standby
9331 * timer format from SCSI to ATA.
9332 */
9333 static uint8_t
sata_get_standby_timer(uint8_t * timer)9334 sata_get_standby_timer(uint8_t *timer)
9335 {
9336 uint32_t i = 0, count = 0;
9337 uint8_t ata_count;
9338
9339 for (i = 0; i < 4; i++) {
9340 count = count << 8 | timer[i];
9341 }
9342
9343 if (count == 0)
9344 return (0);
9345
9346 if (count >= 1 && count <= 12000)
9347 ata_count = (count -1) / 50 + 1;
9348 else if (count > 12000 && count <= 12600)
9349 ata_count = 0xfc;
9350 else if (count > 12601 && count <= 12750)
9351 ata_count = 0xff;
9352 else if (count > 12750 && count <= 17999)
9353 ata_count = 0xf1;
9354 else if (count > 18000 && count <= 198000)
9355 ata_count = count / 18000 + 240;
9356 else
9357 ata_count = 0xfd;
9358 return (ata_count);
9359 }
9360
9361 /* ************************** ATAPI-SPECIFIC FUNCTIONS ********************** */
9362
9363 /*
9364 * Start command for ATAPI device.
9365 * This function processes scsi_pkt requests.
9366 * Now CD/DVD, tape and ATAPI disk devices are supported.
9367 * Most commands are packet without any translation into Packet Command.
9368 * Some may be trapped and executed as SATA commands (not clear which one).
9369 *
9370 * Returns TRAN_ACCEPT if command is accepted for execution (or completed
9371 * execution).
9372 * Returns other TRAN_XXXX codes if command is not accepted or completed
9373 * (see return values for sata_hba_start()).
9374 *
9375 * Note:
9376 * Inquiry cdb format differs between transport version 2 and 3.
9377 * However, the transport version 3 devices that were checked did not adhere
9378 * to the specification (ignored MSB of the allocation length). Therefore,
9379 * the transport version is not checked, but Inquiry allocation length is
9380 * truncated to 255 bytes if the original allocation length set-up by the
9381 * target driver is greater than 255 bytes.
9382 */
9383 static int
sata_txlt_atapi(sata_pkt_txlate_t * spx)9384 sata_txlt_atapi(sata_pkt_txlate_t *spx)
9385 {
9386 struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
9387 sata_cmd_t *scmd = &spx->txlt_sata_pkt->satapkt_cmd;
9388 struct buf *bp = spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp;
9389 sata_hba_inst_t *sata_hba = SATA_TXLT_HBA_INST(spx);
9390 sata_drive_info_t *sdinfo = sata_get_device_info(sata_hba,
9391 &spx->txlt_sata_pkt->satapkt_device);
9392 kmutex_t *cport_mutex = &(SATA_TXLT_CPORT_MUTEX(spx));
9393 int cdblen;
9394 int rval, reason;
9395 int synch;
9396 union scsi_cdb *cdbp = (union scsi_cdb *)scsipkt->pkt_cdbp;
9397
9398 mutex_enter(cport_mutex);
9399
9400 if (((rval = sata_txlt_generic_pkt_info(spx, &reason, 0)) !=
9401 TRAN_ACCEPT) || (reason == CMD_DEV_GONE)) {
9402 mutex_exit(cport_mutex);
9403 return (rval);
9404 }
9405
9406 /*
9407 * ATAPI device executes some ATA commands in addition to those
9408 * commands sent via PACKET command. These ATA commands may be
9409 * executed by the regular SATA translation functions. None needs
9410 * to be captured now.
9411 *
9412 * Commands sent via PACKET command include:
9413 * MMC command set for ATAPI CD/DVD device
9414 * SSC command set for ATAPI TAPE device
9415 * SBC command set for ATAPI disk device
9416 *
9417 */
9418
9419 /* Check the size of cdb */
9420
9421 switch (GETGROUP(cdbp)) {
9422 case CDB_GROUPID_3: /* Reserved, per SPC-4 */
9423 /*
9424 * opcodes 0x7e and 0x7f identify variable-length CDBs and
9425 * therefore require special handling. Return failure, for now.
9426 */
9427 mutex_exit(cport_mutex);
9428 return (TRAN_BADPKT);
9429
9430 case CDB_GROUPID_6: /* Vendor-specific, per SPC-4 */
9431 case CDB_GROUPID_7: /* Vendor-specific, per SPC-4 */
9432 /* obtain length from the scsi_pkt */
9433 cdblen = scsipkt->pkt_cdblen;
9434 break;
9435
9436 default:
9437 /* CDB's length is statically known, per SPC-4 */
9438 cdblen = scsi_cdb_size[GETGROUP(cdbp)];
9439 break;
9440 }
9441
9442 if (cdblen <= 0 || cdblen > sdinfo->satadrv_atapi_cdb_len) {
9443 sata_log(NULL, CE_WARN,
9444 "sata: invalid ATAPI cdb length %d",
9445 cdblen);
9446 mutex_exit(cport_mutex);
9447 return (TRAN_BADPKT);
9448 }
9449
9450 SATAATAPITRACE(spx, cdblen);
9451
9452 /*
9453 * For non-read/write commands we need to
9454 * map buffer
9455 */
9456 switch ((uint_t)scsipkt->pkt_cdbp[0]) {
9457 case SCMD_READ:
9458 case SCMD_READ_G1:
9459 case SCMD_READ_G5:
9460 case SCMD_READ_G4:
9461 case SCMD_WRITE:
9462 case SCMD_WRITE_G1:
9463 case SCMD_WRITE_G5:
9464 case SCMD_WRITE_G4:
9465 break;
9466 default:
9467 if (bp != NULL) {
9468 if (bp->b_flags & (B_PHYS | B_PAGEIO))
9469 bp_mapin(bp);
9470 }
9471 break;
9472 }
9473 /*
9474 * scmd->satacmd_flags.sata_data_direction default -
9475 * SATA_DIR_NODATA_XFER - is set by
9476 * sata_txlt_generic_pkt_info().
9477 */
9478 if (scmd->satacmd_bp) {
9479 if (scmd->satacmd_bp->b_flags & B_READ) {
9480 scmd->satacmd_flags.sata_data_direction = SATA_DIR_READ;
9481 } else {
9482 scmd->satacmd_flags.sata_data_direction =
9483 SATA_DIR_WRITE;
9484 }
9485 }
9486
9487 /*
9488 * Set up ATAPI packet command.
9489 */
9490
9491 sata_atapi_packet_cmd_setup(scmd, sdinfo);
9492
9493 /* Copy cdb into sata_cmd */
9494 scmd->satacmd_acdb_len = sdinfo->satadrv_atapi_cdb_len;
9495 bzero(scmd->satacmd_acdb, SATA_ATAPI_MAX_CDB_LEN);
9496 bcopy(cdbp, scmd->satacmd_acdb, cdblen);
9497
9498 /* See note in the command header */
9499 if (scmd->satacmd_acdb[0] == SCMD_INQUIRY) {
9500 if (scmd->satacmd_acdb[3] != 0)
9501 scmd->satacmd_acdb[4] = 255;
9502 }
9503
9504 #ifdef SATA_DEBUG
9505 if (sata_debug_flags & SATA_DBG_ATAPI) {
9506 uint8_t *p = scmd->satacmd_acdb;
9507 char buf[3 * SATA_ATAPI_MAX_CDB_LEN];
9508
9509 (void) snprintf(buf, SATA_ATAPI_MAX_CDB_LEN,
9510 "%02x %02x %02x %02x %02x %02x %02x %02x "
9511 "%2x %02x %02x %02x %02x %02x %02x %02x",
9512 p[0], p[1], p[2], p[3], p[4], p[5], p[6], p[7],
9513 p[8], p[9], p[10], p[11], p[12], p[13], p[14], p[15]);
9514 buf[(3 * SATA_ATAPI_MAX_CDB_LEN) - 1] = '\0';
9515 cmn_err(CE_NOTE, "ATAPI cdb: %s\n", buf);
9516 }
9517 #endif
9518
9519 /*
9520 * Preset request sense data to NO SENSE.
9521 * If there is no way to get error information via Request Sense,
9522 * the packet request sense data would not have to be modified by HBA,
9523 * but it could be returned as is.
9524 */
9525 bzero(scmd->satacmd_rqsense, SATA_ATAPI_RQSENSE_LEN);
9526 sata_fixed_sense_data_preset(
9527 (struct scsi_extended_sense *)scmd->satacmd_rqsense);
9528
9529 if (!(spx->txlt_sata_pkt->satapkt_op_mode & SATA_OPMODE_SYNCH)) {
9530 /* Need callback function */
9531 spx->txlt_sata_pkt->satapkt_comp = sata_txlt_atapi_completion;
9532 synch = FALSE;
9533 } else
9534 synch = TRUE;
9535
9536 /* Transfer command to HBA */
9537 if (sata_hba_start(spx, &rval) != 0) {
9538 /* Pkt not accepted for execution */
9539 mutex_exit(cport_mutex);
9540 return (rval);
9541 }
9542 mutex_exit(cport_mutex);
9543 /*
9544 * If execution is non-synchronous,
9545 * a callback function will handle potential errors, translate
9546 * the response and will do a callback to a target driver.
9547 * If it was synchronous, use the same framework callback to check
9548 * an execution status.
9549 */
9550 if (synch) {
9551 SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
9552 "synchronous execution status %x\n",
9553 spx->txlt_sata_pkt->satapkt_reason);
9554 sata_txlt_atapi_completion(spx->txlt_sata_pkt);
9555 }
9556 return (TRAN_ACCEPT);
9557 }
9558
9559
9560 /*
9561 * ATAPI Packet command completion.
9562 *
9563 * Failure of the command passed via Packet command are considered device
9564 * error. SATA HBA driver would have to retrieve error data (via Request
9565 * Sense command delivered via error retrieval sata packet) and copy it
9566 * to satacmd_rqsense array. From there, it is moved into scsi pkt sense data.
9567 */
9568 static void
sata_txlt_atapi_completion(sata_pkt_t * sata_pkt)9569 sata_txlt_atapi_completion(sata_pkt_t *sata_pkt)
9570 {
9571 sata_pkt_txlate_t *spx =
9572 (sata_pkt_txlate_t *)sata_pkt->satapkt_framework_private;
9573 struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
9574 struct scsi_extended_sense *sense;
9575 struct buf *bp;
9576 int rval;
9577
9578 #ifdef SATA_DEBUG
9579 uint8_t *rqsp = sata_pkt->satapkt_cmd.satacmd_rqsense;
9580 #endif
9581
9582 scsipkt->pkt_state = STATE_GOT_BUS | STATE_GOT_TARGET |
9583 STATE_SENT_CMD | STATE_GOT_STATUS;
9584
9585 if (sata_pkt->satapkt_reason == SATA_PKT_COMPLETED) {
9586 /* Normal completion */
9587 if (sata_pkt->satapkt_cmd.satacmd_bp != NULL)
9588 scsipkt->pkt_state |= STATE_XFERRED_DATA;
9589 scsipkt->pkt_reason = CMD_CMPLT;
9590 *scsipkt->pkt_scbp = STATUS_GOOD;
9591 if (spx->txlt_tmp_buf != NULL) {
9592 /* Temporary buffer was used */
9593 bp = spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp;
9594 if (bp->b_flags & B_READ) {
9595 rval = ddi_dma_sync(
9596 spx->txlt_buf_dma_handle, 0, 0,
9597 DDI_DMA_SYNC_FORCPU);
9598 ASSERT(rval == DDI_SUCCESS);
9599 bcopy(spx->txlt_tmp_buf, bp->b_un.b_addr,
9600 bp->b_bcount);
9601 }
9602 }
9603 } else {
9604 /*
9605 * Something went wrong - analyze return
9606 */
9607 *scsipkt->pkt_scbp = STATUS_CHECK;
9608 sense = sata_arq_sense(spx);
9609
9610 if (sata_pkt->satapkt_reason == SATA_PKT_DEV_ERROR) {
9611 /*
9612 * pkt_reason should be CMD_CMPLT for DEVICE ERROR.
9613 * Under this condition ERR bit is set for ATA command,
9614 * and CHK bit set for ATAPI command.
9615 *
9616 * Please check st_intr & sdintr about how pkt_reason
9617 * is used.
9618 */
9619 scsipkt->pkt_reason = CMD_CMPLT;
9620
9621 /*
9622 * We may not have ARQ data if there was a double
9623 * error. But sense data in sata packet was pre-set
9624 * with NO SENSE so it is valid even if HBA could
9625 * not retrieve a real sense data.
9626 * Just copy this sense data into scsi pkt sense area.
9627 */
9628 bcopy(sata_pkt->satapkt_cmd.satacmd_rqsense, sense,
9629 SATA_ATAPI_MIN_RQSENSE_LEN);
9630 #ifdef SATA_DEBUG
9631 if (sata_debug_flags & SATA_DBG_SCSI_IF) {
9632 sata_log(spx->txlt_sata_hba_inst, CE_WARN,
9633 "sata_txlt_atapi_completion: %02x\n"
9634 "RQSENSE: %02x %02x %02x %02x %02x %02x "
9635 " %02x %02x %02x %02x %02x %02x "
9636 " %02x %02x %02x %02x %02x %02x\n",
9637 scsipkt->pkt_reason,
9638 rqsp[0], rqsp[1], rqsp[2], rqsp[3],
9639 rqsp[4], rqsp[5], rqsp[6], rqsp[7],
9640 rqsp[8], rqsp[9], rqsp[10], rqsp[11],
9641 rqsp[12], rqsp[13], rqsp[14], rqsp[15],
9642 rqsp[16], rqsp[17]);
9643 }
9644 #endif
9645 } else {
9646 switch (sata_pkt->satapkt_reason) {
9647 case SATA_PKT_PORT_ERROR:
9648 /*
9649 * We have no device data.
9650 */
9651 scsipkt->pkt_reason = CMD_INCOMPLETE;
9652 scsipkt->pkt_state &= ~(STATE_GOT_BUS |
9653 STATE_GOT_TARGET | STATE_SENT_CMD |
9654 STATE_GOT_STATUS);
9655 sense->es_key = KEY_HARDWARE_ERROR;
9656 break;
9657
9658 case SATA_PKT_TIMEOUT:
9659 scsipkt->pkt_reason = CMD_TIMEOUT;
9660 scsipkt->pkt_statistics |=
9661 STAT_TIMEOUT | STAT_DEV_RESET;
9662 /*
9663 * Need to check if HARDWARE_ERROR/
9664 * TIMEOUT_ON_LOGICAL_UNIT 4/3E/2 would be more
9665 * appropriate.
9666 */
9667 break;
9668
9669 case SATA_PKT_ABORTED:
9670 scsipkt->pkt_reason = CMD_ABORTED;
9671 scsipkt->pkt_statistics |= STAT_ABORTED;
9672 /* Should we set key COMMAND_ABPRTED? */
9673 break;
9674
9675 case SATA_PKT_RESET:
9676 scsipkt->pkt_reason = CMD_RESET;
9677 scsipkt->pkt_statistics |= STAT_DEV_RESET;
9678 /*
9679 * May be we should set Unit Attention /
9680 * Reset. Perhaps the same should be
9681 * returned for disks....
9682 */
9683 sense->es_key = KEY_UNIT_ATTENTION;
9684 sense->es_add_code = SD_SCSI_ASC_RESET;
9685 break;
9686
9687 default:
9688 SATA_LOG_D((spx->txlt_sata_hba_inst, CE_WARN,
9689 "sata_txlt_atapi_completion: "
9690 "invalid packet completion reason"));
9691 scsipkt->pkt_reason = CMD_TRAN_ERR;
9692 scsipkt->pkt_state &= ~(STATE_GOT_BUS |
9693 STATE_GOT_TARGET | STATE_SENT_CMD |
9694 STATE_GOT_STATUS);
9695 break;
9696 }
9697 }
9698 }
9699
9700 SATAATAPITRACE(spx, 0);
9701
9702 if ((scsipkt->pkt_flags & FLAG_NOINTR) == 0 &&
9703 scsipkt->pkt_comp != NULL) {
9704 /* scsi callback required */
9705 (*scsipkt->pkt_comp)(scsipkt);
9706 }
9707 }
9708
9709 /*
9710 * Set up error retrieval sata command for ATAPI Packet Command error data
9711 * recovery.
9712 *
9713 * Returns SATA_SUCCESS when data buffer is allocated and packet set-up,
9714 * returns SATA_FAILURE otherwise.
9715 */
9716
9717 static int
sata_atapi_err_ret_cmd_setup(sata_pkt_txlate_t * spx,sata_drive_info_t * sdinfo)9718 sata_atapi_err_ret_cmd_setup(sata_pkt_txlate_t *spx, sata_drive_info_t *sdinfo)
9719 {
9720 sata_pkt_t *spkt = spx->txlt_sata_pkt;
9721 sata_cmd_t *scmd;
9722 struct buf *bp;
9723
9724 /*
9725 * Allocate dma-able buffer error data.
9726 * Buffer allocation will take care of buffer alignment and other DMA
9727 * attributes.
9728 */
9729 bp = sata_alloc_local_buffer(spx, SATA_ATAPI_MIN_RQSENSE_LEN);
9730 if (bp == NULL) {
9731 SATADBG1(SATA_DBG_ATAPI, spx->txlt_sata_hba_inst,
9732 "sata_get_err_retrieval_pkt: "
9733 "cannot allocate buffer for error data", NULL);
9734 return (SATA_FAILURE);
9735 }
9736 bp_mapin(bp); /* make data buffer accessible */
9737
9738 /* Operation modes are up to the caller */
9739 spkt->satapkt_op_mode = SATA_OPMODE_SYNCH | SATA_OPMODE_INTERRUPTS;
9740
9741 /* Synchronous mode, no callback - may be changed by the caller */
9742 spkt->satapkt_comp = NULL;
9743 spkt->satapkt_time = sata_default_pkt_time;
9744
9745 scmd = &spkt->satapkt_cmd;
9746 scmd->satacmd_flags.sata_data_direction = SATA_DIR_READ;
9747 scmd->satacmd_flags.sata_ignore_dev_reset = B_TRUE;
9748
9749 sata_atapi_packet_cmd_setup(scmd, sdinfo);
9750
9751 /*
9752 * Set-up acdb. Request Sense CDB (packet command content) is
9753 * not in DMA-able buffer. Its handling is HBA-specific (how
9754 * it is transfered into packet FIS).
9755 */
9756 scmd->satacmd_acdb_len = sdinfo->satadrv_atapi_cdb_len;
9757 bcopy(sata_rqsense_cdb, scmd->satacmd_acdb, SATA_ATAPI_RQSENSE_CDB_LEN);
9758 /* Following zeroing of pad bytes may not be necessary */
9759 bzero(&scmd->satacmd_acdb[SATA_ATAPI_RQSENSE_CDB_LEN],
9760 sdinfo->satadrv_atapi_cdb_len - SATA_ATAPI_RQSENSE_CDB_LEN);
9761
9762 /*
9763 * Set-up pointer to the buffer handle, so HBA can sync buffer
9764 * before accessing it. Handle is in usual place in translate struct.
9765 */
9766 scmd->satacmd_err_ret_buf_handle = &spx->txlt_buf_dma_handle;
9767
9768 /*
9769 * Preset request sense data to NO SENSE.
9770 * Here it is redundant, only for a symetry with scsi-originated
9771 * packets. It should not be used for anything but debugging.
9772 */
9773 bzero(scmd->satacmd_rqsense, SATA_ATAPI_RQSENSE_LEN);
9774 sata_fixed_sense_data_preset(
9775 (struct scsi_extended_sense *)scmd->satacmd_rqsense);
9776
9777 ASSERT(scmd->satacmd_num_dma_cookies != 0);
9778 ASSERT(scmd->satacmd_dma_cookie_list != NULL);
9779
9780 return (SATA_SUCCESS);
9781 }
9782
9783 /*
9784 * Set-up ATAPI packet command.
9785 * Data transfer direction has to be set-up in sata_cmd structure prior to
9786 * calling this function.
9787 *
9788 * Returns void
9789 */
9790
9791 static void
sata_atapi_packet_cmd_setup(sata_cmd_t * scmd,sata_drive_info_t * sdinfo)9792 sata_atapi_packet_cmd_setup(sata_cmd_t *scmd, sata_drive_info_t *sdinfo)
9793 {
9794 scmd->satacmd_addr_type = 0; /* N/A */
9795 scmd->satacmd_sec_count_lsb = 0; /* no tag */
9796 scmd->satacmd_lba_low_lsb = 0; /* N/A */
9797 scmd->satacmd_lba_mid_lsb = (uint8_t)SATA_ATAPI_MAX_BYTES_PER_DRQ;
9798 scmd->satacmd_lba_high_lsb =
9799 (uint8_t)(SATA_ATAPI_MAX_BYTES_PER_DRQ >> 8);
9800 scmd->satacmd_cmd_reg = SATAC_PACKET; /* Command */
9801
9802 /*
9803 * We want all data to be transfered via DMA.
9804 * But specify it only if drive supports DMA and DMA mode is
9805 * selected - some drives are sensitive about it.
9806 * Hopefully it wil work for all drives....
9807 */
9808 if (sdinfo->satadrv_settings & SATA_DEV_DMA)
9809 scmd->satacmd_features_reg = SATA_ATAPI_F_DMA;
9810
9811 /*
9812 * Features register requires special care for devices that use
9813 * Serial ATA bridge - they need an explicit specification of
9814 * the data transfer direction for Packet DMA commands.
9815 * Setting this bit is harmless if DMA is not used.
9816 *
9817 * Many drives do not implement word 80, specifying what ATA/ATAPI
9818 * spec they follow.
9819 * We are arbitrarily following the latest SerialATA 2.6 spec,
9820 * which uses ATA/ATAPI 6 specification for Identify Data, unless
9821 * ATA/ATAPI-7 support is explicitly indicated.
9822 */
9823 if (sdinfo->satadrv_id.ai_majorversion != 0 &&
9824 sdinfo->satadrv_id.ai_majorversion != 0xffff &&
9825 (sdinfo->satadrv_id.ai_majorversion & SATA_MAJVER_7) != 0) {
9826 /*
9827 * Specification of major version is valid and version 7
9828 * is supported. It does automatically imply that all
9829 * spec features are supported. For now, we assume that
9830 * DMADIR setting is valid. ATA/ATAPI7 spec is incomplete.
9831 */
9832 if ((sdinfo->satadrv_id.ai_dirdma &
9833 SATA_ATAPI_ID_DMADIR_REQ) != 0) {
9834 if (scmd->satacmd_flags.sata_data_direction ==
9835 SATA_DIR_READ)
9836 scmd->satacmd_features_reg |=
9837 SATA_ATAPI_F_DATA_DIR_READ;
9838 }
9839 }
9840 }
9841
9842
9843 #ifdef SATA_DEBUG
9844
9845 /* Display 18 bytes of Inquiry data */
9846 static void
sata_show_inqry_data(uint8_t * buf)9847 sata_show_inqry_data(uint8_t *buf)
9848 {
9849 struct scsi_inquiry *inq = (struct scsi_inquiry *)buf;
9850 uint8_t *p;
9851
9852 cmn_err(CE_NOTE, "Inquiry data:");
9853 cmn_err(CE_NOTE, "device type %x", inq->inq_dtype);
9854 cmn_err(CE_NOTE, "removable media %x", inq->inq_rmb);
9855 cmn_err(CE_NOTE, "version %x", inq->inq_ansi);
9856 cmn_err(CE_NOTE, "ATAPI transport version %d",
9857 SATA_ATAPI_TRANS_VERSION(inq));
9858 cmn_err(CE_NOTE, "response data format %d, aenc %d",
9859 inq->inq_rdf, inq->inq_aenc);
9860 cmn_err(CE_NOTE, " additional length %d", inq->inq_len);
9861 cmn_err(CE_NOTE, "tpgs %d", inq->inq_tpgs);
9862 p = (uint8_t *)inq->inq_vid;
9863 cmn_err(CE_NOTE, "vendor id (binary): %02x %02x %02x %02x "
9864 "%02x %02x %02x %02x",
9865 p[0], p[1], p[2], p[3], p[4], p[5], p[6], p[7]);
9866 p = (uint8_t *)inq->inq_vid;
9867 cmn_err(CE_NOTE, "vendor id: %c %c %c %c %c %c %c %c",
9868 p[0], p[1], p[2], p[3], p[4], p[5], p[6], p[7]);
9869
9870 p = (uint8_t *)inq->inq_pid;
9871 cmn_err(CE_NOTE, "product id (binary): %02x %02x %02x %02x "
9872 "%02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x",
9873 p[0], p[1], p[2], p[3], p[4], p[5], p[6], p[7],
9874 p[8], p[9], p[10], p[11], p[12], p[13], p[14], p[15]);
9875 p = (uint8_t *)inq->inq_pid;
9876 cmn_err(CE_NOTE, "product id: %c %c %c %c %c %c %c %c "
9877 "%c %c %c %c %c %c %c %c",
9878 p[0], p[1], p[2], p[3], p[4], p[5], p[6], p[7],
9879 p[8], p[9], p[10], p[11], p[12], p[13], p[14], p[15]);
9880
9881 p = (uint8_t *)inq->inq_revision;
9882 cmn_err(CE_NOTE, "revision (binary): %02x %02x %02x %02x",
9883 p[0], p[1], p[2], p[3]);
9884 p = (uint8_t *)inq->inq_revision;
9885 cmn_err(CE_NOTE, "revision: %c %c %c %c",
9886 p[0], p[1], p[2], p[3]);
9887
9888 }
9889
9890
9891 static void
sata_save_atapi_trace(sata_pkt_txlate_t * spx,int count)9892 sata_save_atapi_trace(sata_pkt_txlate_t *spx, int count)
9893 {
9894 struct scsi_pkt *scsi_pkt = spx->txlt_scsi_pkt;
9895
9896 if (scsi_pkt == NULL)
9897 return;
9898 if (count != 0) {
9899 /* saving cdb */
9900 bzero(sata_atapi_trace[sata_atapi_trace_index].acdb,
9901 SATA_ATAPI_MAX_CDB_LEN);
9902 bcopy(scsi_pkt->pkt_cdbp,
9903 sata_atapi_trace[sata_atapi_trace_index].acdb, count);
9904 } else {
9905 bcopy(&((struct scsi_arq_status *)scsi_pkt->pkt_scbp)->
9906 sts_sensedata,
9907 sata_atapi_trace[sata_atapi_trace_index].arqs,
9908 SATA_ATAPI_MIN_RQSENSE_LEN);
9909 sata_atapi_trace[sata_atapi_trace_index].scsi_pkt_reason =
9910 scsi_pkt->pkt_reason;
9911 sata_atapi_trace[sata_atapi_trace_index].sata_pkt_reason =
9912 spx->txlt_sata_pkt->satapkt_reason;
9913
9914 if (++sata_atapi_trace_index >= 64)
9915 sata_atapi_trace_index = 0;
9916 }
9917 }
9918
9919 #endif
9920
9921 /*
9922 * Fetch inquiry data from ATAPI device
9923 * Returns SATA_SUCCESS if operation was successful, SATA_FAILURE otherwise.
9924 *
9925 * Note:
9926 * inqb pointer does not point to a DMA-able buffer. It is a local buffer
9927 * where the caller expects to see the inquiry data.
9928 *
9929 */
9930
9931 static int
sata_get_atapi_inquiry_data(sata_hba_inst_t * sata_hba,sata_address_t * saddr,struct scsi_inquiry * inq)9932 sata_get_atapi_inquiry_data(sata_hba_inst_t *sata_hba,
9933 sata_address_t *saddr, struct scsi_inquiry *inq)
9934 {
9935 sata_pkt_txlate_t *spx;
9936 sata_pkt_t *spkt;
9937 struct buf *bp;
9938 sata_drive_info_t *sdinfo;
9939 sata_cmd_t *scmd;
9940 int rval;
9941 uint8_t *rqsp;
9942 dev_info_t *dip = SATA_DIP(sata_hba);
9943 #ifdef SATA_DEBUG
9944 char msg_buf[MAXPATHLEN];
9945 #endif
9946 kmutex_t *cport_mutex;
9947
9948 ASSERT(sata_hba != NULL);
9949
9950 spx = kmem_zalloc(sizeof (sata_pkt_txlate_t), KM_SLEEP);
9951 spx->txlt_sata_hba_inst = sata_hba;
9952 spx->txlt_scsi_pkt = NULL; /* No scsi pkt involved */
9953 spkt = sata_pkt_alloc(spx, NULL);
9954 if (spkt == NULL) {
9955 kmem_free(spx, sizeof (sata_pkt_txlate_t));
9956 return (SATA_FAILURE);
9957 }
9958 /* address is needed now */
9959 spkt->satapkt_device.satadev_addr = *saddr;
9960
9961 /* scsi_inquiry size buffer */
9962 bp = sata_alloc_local_buffer(spx, sizeof (struct scsi_inquiry));
9963 if (bp == NULL) {
9964 sata_pkt_free(spx);
9965 kmem_free(spx, sizeof (sata_pkt_txlate_t));
9966 SATA_LOG_D((sata_hba, CE_WARN,
9967 "sata_get_atapi_inquiry_data: "
9968 "cannot allocate data buffer"));
9969 return (SATA_FAILURE);
9970 }
9971 bp_mapin(bp); /* make data buffer accessible */
9972
9973 scmd = &spkt->satapkt_cmd;
9974 ASSERT(scmd->satacmd_num_dma_cookies != 0);
9975 ASSERT(scmd->satacmd_dma_cookie_list != NULL);
9976
9977 /* Use synchronous mode */
9978 spkt->satapkt_op_mode = SATA_OPMODE_SYNCH | SATA_OPMODE_INTERRUPTS;
9979 spkt->satapkt_comp = NULL;
9980 spkt->satapkt_time = sata_default_pkt_time;
9981
9982 /* Issue inquiry command - 6 bytes cdb, data transfer, read */
9983
9984 scmd->satacmd_flags.sata_data_direction = SATA_DIR_READ;
9985 scmd->satacmd_flags.sata_ignore_dev_reset = B_TRUE;
9986
9987 cport_mutex = &(SATA_CPORT_MUTEX(sata_hba, saddr->cport));
9988 mutex_enter(cport_mutex);
9989 sdinfo = sata_get_device_info(sata_hba,
9990 &spx->txlt_sata_pkt->satapkt_device);
9991 if (sdinfo == NULL) {
9992 /* we have to be carefull about the disapearing device */
9993 mutex_exit(cport_mutex);
9994 rval = SATA_FAILURE;
9995 goto cleanup;
9996 }
9997 sata_atapi_packet_cmd_setup(scmd, sdinfo);
9998
9999 /*
10000 * Set-up acdb. This works for atapi transport version 2 and later.
10001 */
10002 scmd->satacmd_acdb_len = sdinfo->satadrv_atapi_cdb_len;
10003 bzero(scmd->satacmd_acdb, SATA_ATAPI_MAX_CDB_LEN);
10004 scmd->satacmd_acdb[0] = 0x12; /* Inquiry */
10005 scmd->satacmd_acdb[1] = 0x00;
10006 scmd->satacmd_acdb[2] = 0x00;
10007 scmd->satacmd_acdb[3] = 0x00;
10008 scmd->satacmd_acdb[4] = sizeof (struct scsi_inquiry);
10009 scmd->satacmd_acdb[5] = 0x00;
10010
10011 sata_fixed_sense_data_preset(
10012 (struct scsi_extended_sense *)scmd->satacmd_rqsense);
10013
10014 /* Transfer command to HBA */
10015 if (sata_hba_start(spx, &rval) != 0) {
10016 /* Pkt not accepted for execution */
10017 SATADBG1(SATA_DBG_ATAPI, sata_hba,
10018 "sata_get_atapi_inquiry_data: "
10019 "Packet not accepted for execution - ret: %02x", rval);
10020 mutex_exit(cport_mutex);
10021 rval = SATA_FAILURE;
10022 goto cleanup;
10023 }
10024 mutex_exit(cport_mutex);
10025
10026 if (spkt->satapkt_reason == SATA_PKT_COMPLETED) {
10027 SATADBG1(SATA_DBG_ATAPI, sata_hba,
10028 "sata_get_atapi_inquiry_data: "
10029 "Packet completed successfully - ret: %02x", rval);
10030 if (spx->txlt_buf_dma_handle != NULL) {
10031 /*
10032 * Sync buffer. Handle is in usual place in translate
10033 * struct.
10034 */
10035 rval = ddi_dma_sync(spx->txlt_buf_dma_handle, 0, 0,
10036 DDI_DMA_SYNC_FORCPU);
10037 ASSERT(rval == DDI_SUCCESS);
10038 }
10039
10040 if (sata_check_for_dma_error(dip, spx)) {
10041 ddi_fm_service_impact(dip, DDI_SERVICE_UNAFFECTED);
10042 rval = SATA_FAILURE;
10043 } else {
10044 /*
10045 * Normal completion - copy data into caller's buffer
10046 */
10047 bcopy(bp->b_un.b_addr, (uint8_t *)inq,
10048 sizeof (struct scsi_inquiry));
10049 #ifdef SATA_DEBUG
10050 if (sata_debug_flags & SATA_DBG_ATAPI) {
10051 sata_show_inqry_data((uint8_t *)inq);
10052 }
10053 #endif
10054 rval = SATA_SUCCESS;
10055 }
10056 } else {
10057 /*
10058 * Something went wrong - analyze return - check rqsense data
10059 */
10060 rval = SATA_FAILURE;
10061 if (spkt->satapkt_reason == SATA_PKT_DEV_ERROR) {
10062 /*
10063 * ARQ data hopefull show something other than NO SENSE
10064 */
10065 rqsp = scmd->satacmd_rqsense;
10066 #ifdef SATA_DEBUG
10067 if (sata_debug_flags & SATA_DBG_ATAPI) {
10068 msg_buf[0] = '\0';
10069 (void) snprintf(msg_buf, MAXPATHLEN,
10070 "ATAPI packet completion reason: %02x\n"
10071 "RQSENSE: %02x %02x %02x %02x %02x %02x\n"
10072 " %02x %02x %02x %02x %02x %02x\n"
10073 " %02x %02x %02x %02x %02x %02x",
10074 spkt->satapkt_reason,
10075 rqsp[0], rqsp[1], rqsp[2], rqsp[3],
10076 rqsp[4], rqsp[5], rqsp[6], rqsp[7],
10077 rqsp[8], rqsp[9], rqsp[10], rqsp[11],
10078 rqsp[12], rqsp[13], rqsp[14], rqsp[15],
10079 rqsp[16], rqsp[17]);
10080 sata_log(spx->txlt_sata_hba_inst, CE_WARN,
10081 "%s", msg_buf);
10082 }
10083 #endif
10084 } else {
10085 switch (spkt->satapkt_reason) {
10086 case SATA_PKT_PORT_ERROR:
10087 SATADBG1(SATA_DBG_ATAPI, sata_hba,
10088 "sata_get_atapi_inquiry_data: "
10089 "packet reason: port error", NULL);
10090 break;
10091
10092 case SATA_PKT_TIMEOUT:
10093 SATADBG1(SATA_DBG_ATAPI, sata_hba,
10094 "sata_get_atapi_inquiry_data: "
10095 "packet reason: timeout", NULL);
10096 break;
10097
10098 case SATA_PKT_ABORTED:
10099 SATADBG1(SATA_DBG_ATAPI, sata_hba,
10100 "sata_get_atapi_inquiry_data: "
10101 "packet reason: aborted", NULL);
10102 break;
10103
10104 case SATA_PKT_RESET:
10105 SATADBG1(SATA_DBG_ATAPI, sata_hba,
10106 "sata_get_atapi_inquiry_data: "
10107 "packet reason: reset\n", NULL);
10108 break;
10109 default:
10110 SATADBG1(SATA_DBG_ATAPI, sata_hba,
10111 "sata_get_atapi_inquiry_data: "
10112 "invalid packet reason: %02x\n",
10113 spkt->satapkt_reason);
10114 break;
10115 }
10116 }
10117 }
10118 cleanup:
10119 sata_free_local_buffer(spx);
10120 sata_pkt_free(spx);
10121 kmem_free(spx, sizeof (sata_pkt_txlate_t));
10122 return (rval);
10123 }
10124
10125
10126
10127
10128
10129 #if 0
10130 #ifdef SATA_DEBUG
10131
10132 /*
10133 * Test ATAPI packet command.
10134 * Single threaded test: send packet command in synch mode, process completion
10135 *
10136 */
10137 static void
10138 sata_test_atapi_packet_command(sata_hba_inst_t *sata_hba_inst, int cport)
10139 {
10140 sata_pkt_txlate_t *spx;
10141 sata_pkt_t *spkt;
10142 struct buf *bp;
10143 sata_device_t sata_device;
10144 sata_drive_info_t *sdinfo;
10145 sata_cmd_t *scmd;
10146 int rval;
10147 uint8_t *rqsp;
10148
10149 ASSERT(sata_hba_inst != NULL);
10150 sata_device.satadev_addr.cport = cport;
10151 sata_device.satadev_addr.pmport = 0;
10152 sata_device.satadev_addr.qual = SATA_ADDR_DCPORT;
10153 sata_device.satadev_rev = SATA_DEVICE_REV;
10154 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, cport)->cport_mutex);
10155 sdinfo = sata_get_device_info(sata_hba_inst, &sata_device);
10156 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, cport)->cport_mutex);
10157 if (sdinfo == NULL) {
10158 sata_log(sata_hba_inst, CE_WARN,
10159 "sata_test_atapi_packet_command: "
10160 "no device info for cport %d",
10161 sata_device.satadev_addr.cport);
10162 return;
10163 }
10164
10165 spx = kmem_zalloc(sizeof (sata_pkt_txlate_t), KM_SLEEP);
10166 spx->txlt_sata_hba_inst = sata_hba_inst;
10167 spx->txlt_scsi_pkt = NULL; /* No scsi pkt involved */
10168 spkt = sata_pkt_alloc(spx, NULL);
10169 if (spkt == NULL) {
10170 kmem_free(spx, sizeof (sata_pkt_txlate_t));
10171 return;
10172 }
10173 /* address is needed now */
10174 spkt->satapkt_device.satadev_addr = sata_device.satadev_addr;
10175
10176 /* 1024k buffer */
10177 bp = sata_alloc_local_buffer(spx, 1024);
10178 if (bp == NULL) {
10179 sata_pkt_free(spx);
10180 kmem_free(spx, sizeof (sata_pkt_txlate_t));
10181 sata_log(sata_hba_inst, CE_WARN,
10182 "sata_test_atapi_packet_command: "
10183 "cannot allocate data buffer");
10184 return;
10185 }
10186 bp_mapin(bp); /* make data buffer accessible */
10187
10188 scmd = &spkt->satapkt_cmd;
10189 ASSERT(scmd->satacmd_num_dma_cookies != 0);
10190 ASSERT(scmd->satacmd_dma_cookie_list != NULL);
10191
10192 /* Use synchronous mode */
10193 spkt->satapkt_op_mode = SATA_OPMODE_SYNCH | SATA_OPMODE_INTERRUPTS;
10194
10195 /* Synchronous mode, no callback - may be changed by the caller */
10196 spkt->satapkt_comp = NULL;
10197 spkt->satapkt_time = sata_default_pkt_time;
10198
10199 /* Issue inquiry command - 6 bytes cdb, data transfer, read */
10200
10201 scmd->satacmd_flags.sata_data_direction = SATA_DIR_READ;
10202 scmd->satacmd_flags.sata_ignore_dev_reset = B_TRUE;
10203
10204 sata_atapi_packet_cmd_setup(scmd, sdinfo);
10205
10206 /* Set-up acdb. */
10207 scmd->satacmd_acdb_len = sdinfo->satadrv_atapi_cdb_len;
10208 bzero(scmd->satacmd_acdb, SATA_ATAPI_MAX_CDB_LEN);
10209 scmd->satacmd_acdb[0] = 0x12; /* Inquiry */
10210 scmd->satacmd_acdb[1] = 0x00;
10211 scmd->satacmd_acdb[2] = 0x00;
10212 scmd->satacmd_acdb[3] = 0x00;
10213 scmd->satacmd_acdb[4] = sizeof (struct scsi_inquiry);
10214 scmd->satacmd_acdb[5] = 0x00;
10215
10216 sata_fixed_sense_data_preset(
10217 (struct scsi_extended_sense *)scmd->satacmd_rqsense);
10218
10219 /* Transfer command to HBA */
10220 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, cport)->cport_mutex);
10221 if (sata_hba_start(spx, &rval) != 0) {
10222 /* Pkt not accepted for execution */
10223 sata_log(sata_hba_inst, CE_WARN,
10224 "sata_test_atapi_packet_command: "
10225 "Packet not accepted for execution - ret: %02x", rval);
10226 mutex_exit(
10227 &SATA_CPORT_INFO(sata_hba_inst, cport)->cport_mutex);
10228 goto cleanup;
10229 }
10230 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, cport)->cport_mutex);
10231
10232 if (spx->txlt_buf_dma_handle != NULL) {
10233 /*
10234 * Sync buffer. Handle is in usual place in translate struct.
10235 */
10236 rval = ddi_dma_sync(spx->txlt_buf_dma_handle, 0, 0,
10237 DDI_DMA_SYNC_FORCPU);
10238 ASSERT(rval == DDI_SUCCESS);
10239 }
10240 if (spkt->satapkt_reason == SATA_PKT_COMPLETED) {
10241 sata_log(sata_hba_inst, CE_WARN,
10242 "sata_test_atapi_packet_command: "
10243 "Packet completed successfully");
10244 /*
10245 * Normal completion - show inquiry data
10246 */
10247 sata_show_inqry_data((uint8_t *)bp->b_un.b_addr);
10248 } else {
10249 /*
10250 * Something went wrong - analyze return - check rqsense data
10251 */
10252 if (spkt->satapkt_reason == SATA_PKT_DEV_ERROR) {
10253 /*
10254 * ARQ data hopefull show something other than NO SENSE
10255 */
10256 rqsp = scmd->satacmd_rqsense;
10257 sata_log(spx->txlt_sata_hba_inst, CE_WARN,
10258 "ATAPI packet completion reason: %02x\n"
10259 "RQSENSE: %02x %02x %02x %02x %02x %02x "
10260 " %02x %02x %02x %02x %02x %02x "
10261 " %02x %02x %02x %02x %02x %02x\n",
10262 spkt->satapkt_reason,
10263 rqsp[0], rqsp[1], rqsp[2], rqsp[3],
10264 rqsp[4], rqsp[5], rqsp[6], rqsp[7],
10265 rqsp[8], rqsp[9], rqsp[10], rqsp[11],
10266 rqsp[12], rqsp[13], rqsp[14], rqsp[15],
10267 rqsp[16], rqsp[17]);
10268 } else {
10269 switch (spkt->satapkt_reason) {
10270 case SATA_PKT_PORT_ERROR:
10271 sata_log(sata_hba_inst, CE_WARN,
10272 "sata_test_atapi_packet_command: "
10273 "packet reason: port error\n");
10274 break;
10275
10276 case SATA_PKT_TIMEOUT:
10277 sata_log(sata_hba_inst, CE_WARN,
10278 "sata_test_atapi_packet_command: "
10279 "packet reason: timeout\n");
10280 break;
10281
10282 case SATA_PKT_ABORTED:
10283 sata_log(sata_hba_inst, CE_WARN,
10284 "sata_test_atapi_packet_command: "
10285 "packet reason: aborted\n");
10286 break;
10287
10288 case SATA_PKT_RESET:
10289 sata_log(sata_hba_inst, CE_WARN,
10290 "sata_test_atapi_packet_command: "
10291 "packet reason: reset\n");
10292 break;
10293 default:
10294 sata_log(sata_hba_inst, CE_WARN,
10295 "sata_test_atapi_packet_command: "
10296 "invalid packet reason: %02x\n",
10297 spkt->satapkt_reason);
10298 break;
10299 }
10300 }
10301 }
10302 cleanup:
10303 sata_free_local_buffer(spx);
10304 sata_pkt_free(spx);
10305 kmem_free(spx, sizeof (sata_pkt_txlate_t));
10306 }
10307
10308 #endif /* SATA_DEBUG */
10309 #endif /* 1 */
10310
10311
10312 /* ************************** LOCAL HELPER FUNCTIONS *********************** */
10313
10314 /*
10315 * Validate sata_tran info
10316 * SATA_FAILURE returns if structure is inconsistent or structure revision
10317 * does not match one used by the framework.
10318 *
10319 * Returns SATA_SUCCESS if sata_hba_tran has matching revision and contains
10320 * required function pointers.
10321 * Returns SATA_FAILURE otherwise.
10322 */
10323 static int
sata_validate_sata_hba_tran(dev_info_t * dip,sata_hba_tran_t * sata_tran)10324 sata_validate_sata_hba_tran(dev_info_t *dip, sata_hba_tran_t *sata_tran)
10325 {
10326 /*
10327 * SATA_TRAN_HBA_REV is the current (highest) revision number
10328 * of the SATA interface.
10329 */
10330 if (sata_tran->sata_tran_hba_rev > SATA_TRAN_HBA_REV) {
10331 sata_log(NULL, CE_WARN,
10332 "sata: invalid sata_hba_tran version %d for driver %s",
10333 sata_tran->sata_tran_hba_rev, ddi_driver_name(dip));
10334 return (SATA_FAILURE);
10335 }
10336
10337 if (dip != sata_tran->sata_tran_hba_dip) {
10338 SATA_LOG_D((NULL, CE_WARN,
10339 "sata: inconsistent sata_tran_hba_dip "
10340 "%p / %p", sata_tran->sata_tran_hba_dip, dip));
10341 return (SATA_FAILURE);
10342 }
10343
10344 if (sata_tran->sata_tran_probe_port == NULL ||
10345 sata_tran->sata_tran_start == NULL ||
10346 sata_tran->sata_tran_abort == NULL ||
10347 sata_tran->sata_tran_reset_dport == NULL ||
10348 sata_tran->sata_tran_hotplug_ops == NULL ||
10349 sata_tran->sata_tran_hotplug_ops->sata_tran_port_activate == NULL ||
10350 sata_tran->sata_tran_hotplug_ops->sata_tran_port_deactivate ==
10351 NULL) {
10352 SATA_LOG_D((NULL, CE_WARN, "sata: sata_hba_tran missing "
10353 "required functions"));
10354 }
10355 return (SATA_SUCCESS);
10356 }
10357
10358 /*
10359 * Remove HBA instance from sata_hba_list.
10360 */
10361 static void
sata_remove_hba_instance(dev_info_t * dip)10362 sata_remove_hba_instance(dev_info_t *dip)
10363 {
10364 sata_hba_inst_t *sata_hba_inst;
10365
10366 mutex_enter(&sata_mutex);
10367 for (sata_hba_inst = sata_hba_list;
10368 sata_hba_inst != (struct sata_hba_inst *)NULL;
10369 sata_hba_inst = sata_hba_inst->satahba_next) {
10370 if (sata_hba_inst->satahba_dip == dip)
10371 break;
10372 }
10373
10374 if (sata_hba_inst == (struct sata_hba_inst *)NULL) {
10375 #ifdef SATA_DEBUG
10376 cmn_err(CE_WARN, "sata_remove_hba_instance: "
10377 "unknown HBA instance\n");
10378 #endif
10379 ASSERT(FALSE);
10380 }
10381 if (sata_hba_inst == sata_hba_list) {
10382 sata_hba_list = sata_hba_inst->satahba_next;
10383 if (sata_hba_list) {
10384 sata_hba_list->satahba_prev =
10385 (struct sata_hba_inst *)NULL;
10386 }
10387 if (sata_hba_inst == sata_hba_list_tail) {
10388 sata_hba_list_tail = NULL;
10389 }
10390 } else if (sata_hba_inst == sata_hba_list_tail) {
10391 sata_hba_list_tail = sata_hba_inst->satahba_prev;
10392 if (sata_hba_list_tail) {
10393 sata_hba_list_tail->satahba_next =
10394 (struct sata_hba_inst *)NULL;
10395 }
10396 } else {
10397 sata_hba_inst->satahba_prev->satahba_next =
10398 sata_hba_inst->satahba_next;
10399 sata_hba_inst->satahba_next->satahba_prev =
10400 sata_hba_inst->satahba_prev;
10401 }
10402 mutex_exit(&sata_mutex);
10403 }
10404
10405 /*
10406 * Probe all SATA ports of the specified HBA instance.
10407 * The assumption is that there are no target and attachment point minor nodes
10408 * created by the boot subsystems, so we do not need to prune device tree.
10409 *
10410 * This function is called only from sata_hba_attach(). It does not have to
10411 * be protected by controller mutex, because the hba_attached flag is not set
10412 * yet and no one would be touching this HBA instance other than this thread.
10413 * Determines if port is active and what type of the device is attached
10414 * (if any). Allocates necessary structures for each port.
10415 *
10416 * An AP (Attachement Point) node is created for each SATA device port even
10417 * when there is no device attached.
10418 */
10419
10420 static void
sata_probe_ports(sata_hba_inst_t * sata_hba_inst)10421 sata_probe_ports(sata_hba_inst_t *sata_hba_inst)
10422 {
10423 dev_info_t *dip = SATA_DIP(sata_hba_inst);
10424 int ncport;
10425 sata_cport_info_t *cportinfo;
10426 sata_drive_info_t *drive;
10427 sata_device_t sata_device;
10428 int rval;
10429 dev_t minor_number;
10430 char name[16];
10431 clock_t start_time, cur_time;
10432
10433 /*
10434 * Probe controller ports first, to find port status and
10435 * any port multiplier attached.
10436 */
10437 for (ncport = 0; ncport < SATA_NUM_CPORTS(sata_hba_inst); ncport++) {
10438 /* allocate cport structure */
10439 cportinfo = kmem_zalloc(sizeof (sata_cport_info_t), KM_SLEEP);
10440 ASSERT(cportinfo != NULL);
10441 mutex_init(&cportinfo->cport_mutex, NULL, MUTEX_DRIVER, NULL);
10442
10443 mutex_enter(&cportinfo->cport_mutex);
10444
10445 cportinfo->cport_addr.cport = ncport;
10446 cportinfo->cport_addr.pmport = 0;
10447 cportinfo->cport_addr.qual = SATA_ADDR_CPORT;
10448 cportinfo->cport_state &= ~SATA_PORT_STATE_CLEAR_MASK;
10449 cportinfo->cport_state |= SATA_STATE_PROBING;
10450 SATA_CPORT_INFO(sata_hba_inst, ncport) = cportinfo;
10451
10452 /*
10453 * Regardless if a port is usable or not, create
10454 * an attachment point
10455 */
10456 mutex_exit(&cportinfo->cport_mutex);
10457 minor_number = SATA_MAKE_AP_MINOR(ddi_get_instance(dip),
10458 ncport, 0, SATA_ADDR_CPORT);
10459 (void) sprintf(name, "%d", ncport);
10460 if (ddi_create_minor_node(dip, name, S_IFCHR,
10461 minor_number, DDI_NT_SATA_ATTACHMENT_POINT, 0) !=
10462 DDI_SUCCESS) {
10463 sata_log(sata_hba_inst, CE_WARN, "sata_hba_attach: "
10464 "cannot create SATA attachment point for port %d",
10465 ncport);
10466 }
10467
10468 /* Probe port */
10469 start_time = ddi_get_lbolt();
10470 reprobe_cport:
10471 sata_device.satadev_addr.cport = ncport;
10472 sata_device.satadev_addr.pmport = 0;
10473 sata_device.satadev_addr.qual = SATA_ADDR_CPORT;
10474 sata_device.satadev_rev = SATA_DEVICE_REV;
10475
10476 rval = (*SATA_PROBE_PORT_FUNC(sata_hba_inst))
10477 (dip, &sata_device);
10478
10479 mutex_enter(&cportinfo->cport_mutex);
10480 cportinfo->cport_scr = sata_device.satadev_scr;
10481 if (rval != SATA_SUCCESS) {
10482 /* Something went wrong? Fail the port */
10483 cportinfo->cport_state = SATA_PSTATE_FAILED;
10484 mutex_exit(&cportinfo->cport_mutex);
10485 continue;
10486 }
10487 cportinfo->cport_state &= ~SATA_STATE_PROBING;
10488 cportinfo->cport_state |= SATA_STATE_PROBED;
10489 cportinfo->cport_dev_type = sata_device.satadev_type;
10490
10491 cportinfo->cport_state |= SATA_STATE_READY;
10492 if (cportinfo->cport_dev_type == SATA_DTYPE_NONE) {
10493 mutex_exit(&cportinfo->cport_mutex);
10494 continue;
10495 }
10496 if (cportinfo->cport_dev_type != SATA_DTYPE_PMULT) {
10497 /*
10498 * There is some device attached.
10499 * Allocate device info structure
10500 */
10501 if (SATA_CPORTINFO_DRV_INFO(cportinfo) == NULL) {
10502 mutex_exit(&cportinfo->cport_mutex);
10503 SATA_CPORTINFO_DRV_INFO(cportinfo) =
10504 kmem_zalloc(sizeof (sata_drive_info_t),
10505 KM_SLEEP);
10506 mutex_enter(&cportinfo->cport_mutex);
10507 }
10508 drive = SATA_CPORTINFO_DRV_INFO(cportinfo);
10509 drive->satadrv_addr = cportinfo->cport_addr;
10510 drive->satadrv_addr.qual = SATA_ADDR_DCPORT;
10511 drive->satadrv_type = cportinfo->cport_dev_type;
10512 drive->satadrv_state = SATA_STATE_UNKNOWN;
10513
10514 mutex_exit(&cportinfo->cport_mutex);
10515 if (sata_add_device(dip, sata_hba_inst, &sata_device) !=
10516 SATA_SUCCESS) {
10517 /*
10518 * Plugged device was not correctly identified.
10519 * Retry, within a SATA_DEV_IDENTIFY_TIMEOUT
10520 */
10521 cur_time = ddi_get_lbolt();
10522 if ((cur_time - start_time) <
10523 drv_usectohz(SATA_DEV_IDENTIFY_TIMEOUT)) {
10524 /* sleep for a while */
10525 delay(drv_usectohz(
10526 SATA_DEV_RETRY_DLY));
10527 goto reprobe_cport;
10528 }
10529 }
10530 } else { /* SATA_DTYPE_PMULT */
10531 mutex_exit(&cportinfo->cport_mutex);
10532
10533 /* Allocate sata_pmult_info and sata_pmport_info */
10534 if (sata_alloc_pmult(sata_hba_inst, &sata_device) !=
10535 SATA_SUCCESS)
10536 continue;
10537
10538 /* Log the information of the port multiplier */
10539 sata_show_pmult_info(sata_hba_inst, &sata_device);
10540
10541 /* Probe its pmports */
10542 sata_probe_pmports(sata_hba_inst, ncport);
10543 }
10544 }
10545 }
10546
10547 /*
10548 * Probe all device ports behind a port multiplier.
10549 *
10550 * PMult-related structure should be allocated before by sata_alloc_pmult().
10551 *
10552 * NOTE1: Only called from sata_probe_ports()
10553 * NOTE2: No mutex should be hold.
10554 */
10555 static void
sata_probe_pmports(sata_hba_inst_t * sata_hba_inst,uint8_t ncport)10556 sata_probe_pmports(sata_hba_inst_t *sata_hba_inst, uint8_t ncport)
10557 {
10558 dev_info_t *dip = SATA_DIP(sata_hba_inst);
10559 sata_pmult_info_t *pmultinfo = NULL;
10560 sata_pmport_info_t *pmportinfo = NULL;
10561 sata_drive_info_t *drive = NULL;
10562 sata_device_t sata_device;
10563
10564 clock_t start_time, cur_time;
10565 int npmport;
10566 int rval;
10567
10568 pmultinfo = SATA_PMULT_INFO(sata_hba_inst, ncport);
10569
10570 /* Probe Port Multiplier ports */
10571 for (npmport = 0; npmport < pmultinfo->pmult_num_dev_ports; npmport++) {
10572 pmportinfo = pmultinfo->pmult_dev_port[npmport];
10573 start_time = ddi_get_lbolt();
10574 reprobe_pmport:
10575 sata_device.satadev_addr.cport = ncport;
10576 sata_device.satadev_addr.pmport = npmport;
10577 sata_device.satadev_addr.qual = SATA_ADDR_PMPORT;
10578 sata_device.satadev_rev = SATA_DEVICE_REV;
10579
10580 /* Let HBA driver probe it. */
10581 rval = (*SATA_PROBE_PORT_FUNC(sata_hba_inst))
10582 (dip, &sata_device);
10583 mutex_enter(&pmportinfo->pmport_mutex);
10584
10585 pmportinfo->pmport_scr = sata_device.satadev_scr;
10586
10587 if (rval != SATA_SUCCESS) {
10588 pmportinfo->pmport_state =
10589 SATA_PSTATE_FAILED;
10590 mutex_exit(&pmportinfo->pmport_mutex);
10591 continue;
10592 }
10593 pmportinfo->pmport_state &= ~SATA_STATE_PROBING;
10594 pmportinfo->pmport_state |= SATA_STATE_PROBED;
10595 pmportinfo->pmport_dev_type = sata_device.satadev_type;
10596
10597 pmportinfo->pmport_state |= SATA_STATE_READY;
10598 if (pmportinfo->pmport_dev_type ==
10599 SATA_DTYPE_NONE) {
10600 SATADBG2(SATA_DBG_PMULT, sata_hba_inst,
10601 "no device found at port %d:%d", ncport, npmport);
10602 mutex_exit(&pmportinfo->pmport_mutex);
10603 continue;
10604 }
10605 /* Port multipliers cannot be chained */
10606 ASSERT(pmportinfo->pmport_dev_type != SATA_DTYPE_PMULT);
10607 /*
10608 * There is something attached to Port
10609 * Multiplier device port
10610 * Allocate device info structure
10611 */
10612 if (pmportinfo->pmport_sata_drive == NULL) {
10613 mutex_exit(&pmportinfo->pmport_mutex);
10614 pmportinfo->pmport_sata_drive =
10615 kmem_zalloc(sizeof (sata_drive_info_t), KM_SLEEP);
10616 mutex_enter(&pmportinfo->pmport_mutex);
10617 }
10618 drive = pmportinfo->pmport_sata_drive;
10619 drive->satadrv_addr.cport = pmportinfo->pmport_addr.cport;
10620 drive->satadrv_addr.pmport = npmport;
10621 drive->satadrv_addr.qual = SATA_ADDR_DPMPORT;
10622 drive->satadrv_type = pmportinfo-> pmport_dev_type;
10623 drive->satadrv_state = SATA_STATE_UNKNOWN;
10624
10625 mutex_exit(&pmportinfo->pmport_mutex);
10626 rval = sata_add_device(dip, sata_hba_inst, &sata_device);
10627
10628 if (rval != SATA_SUCCESS) {
10629 /*
10630 * Plugged device was not correctly identified.
10631 * Retry, within the SATA_DEV_IDENTIFY_TIMEOUT
10632 */
10633 cur_time = ddi_get_lbolt();
10634 if ((cur_time - start_time) < drv_usectohz(
10635 SATA_DEV_IDENTIFY_TIMEOUT)) {
10636 /* sleep for a while */
10637 delay(drv_usectohz(SATA_DEV_RETRY_DLY));
10638 goto reprobe_pmport;
10639 }
10640 }
10641 }
10642 }
10643
10644 /*
10645 * Add SATA device for specified HBA instance & port (SCSI target
10646 * device nodes).
10647 * This function is called (indirectly) only from sata_hba_attach().
10648 * A target node is created when there is a supported type device attached,
10649 * but may be removed if it cannot be put online.
10650 *
10651 * This function cannot be called from an interrupt context.
10652 *
10653 * Create target nodes for disk, CD/DVD, Tape and ATAPI disk devices
10654 *
10655 * Returns SATA_SUCCESS when port/device was fully processed, SATA_FAILURE when
10656 * device identification failed - adding a device could be retried.
10657 *
10658 */
10659 static int
sata_add_device(dev_info_t * pdip,sata_hba_inst_t * sata_hba_inst,sata_device_t * sata_device)10660 sata_add_device(dev_info_t *pdip, sata_hba_inst_t *sata_hba_inst,
10661 sata_device_t *sata_device)
10662 {
10663 sata_cport_info_t *cportinfo;
10664 sata_pmult_info_t *pminfo;
10665 sata_pmport_info_t *pmportinfo;
10666 dev_info_t *cdip; /* child dip */
10667 sata_address_t *saddr = &sata_device->satadev_addr;
10668 uint8_t cport, pmport;
10669 int rval;
10670
10671 cport = saddr->cport;
10672 pmport = saddr->pmport;
10673 cportinfo = SATA_CPORT_INFO(sata_hba_inst, cport);
10674 ASSERT(cportinfo->cport_dev_type != SATA_DTYPE_NONE);
10675
10676 /*
10677 * Some device is attached to a controller port.
10678 * We rely on controllers distinquishing between no-device,
10679 * attached port multiplier and other kind of attached device.
10680 * We need to get Identify Device data and determine
10681 * positively the dev type before trying to attach
10682 * the target driver.
10683 */
10684 sata_device->satadev_rev = SATA_DEVICE_REV;
10685 switch (saddr->qual) {
10686 case SATA_ADDR_CPORT:
10687 /*
10688 * Add a non-port-multiplier device at controller port.
10689 */
10690 saddr->qual = SATA_ADDR_DCPORT;
10691
10692 rval = sata_probe_device(sata_hba_inst, sata_device);
10693 if (rval != SATA_SUCCESS ||
10694 sata_device->satadev_type == SATA_DTYPE_UNKNOWN)
10695 return (SATA_FAILURE);
10696
10697 mutex_enter(&cportinfo->cport_mutex);
10698 sata_show_drive_info(sata_hba_inst,
10699 SATA_CPORTINFO_DRV_INFO(cportinfo));
10700
10701 if ((sata_device->satadev_type & SATA_VALID_DEV_TYPE) == 0) {
10702 /*
10703 * Could not determine device type or
10704 * a device is not supported.
10705 * Degrade this device to unknown.
10706 */
10707 cportinfo->cport_dev_type = SATA_DTYPE_UNKNOWN;
10708 mutex_exit(&cportinfo->cport_mutex);
10709 return (SATA_SUCCESS);
10710 }
10711 cportinfo->cport_dev_type = sata_device->satadev_type;
10712 cportinfo->cport_tgtnode_clean = B_TRUE;
10713 mutex_exit(&cportinfo->cport_mutex);
10714
10715 /*
10716 * Initialize device to the desired state. Even if it
10717 * fails, the device will still attach but syslog
10718 * will show the warning.
10719 */
10720 if (sata_initialize_device(sata_hba_inst,
10721 SATA_CPORTINFO_DRV_INFO(cportinfo)) != SATA_SUCCESS) {
10722 /* Retry */
10723 rval = sata_initialize_device(sata_hba_inst,
10724 SATA_CPORTINFO_DRV_INFO(cportinfo));
10725
10726 if (rval == SATA_RETRY)
10727 sata_log(sata_hba_inst, CE_WARN,
10728 "SATA device at port %d - "
10729 "default device features could not be set."
10730 " Device may not operate as expected.",
10731 cport);
10732 }
10733
10734 cdip = sata_create_target_node(pdip, sata_hba_inst, saddr);
10735 if (cdip == NULL) {
10736 /*
10737 * Attaching target node failed.
10738 * We retain sata_drive_info structure...
10739 */
10740 return (SATA_SUCCESS);
10741 }
10742
10743 mutex_enter(&cportinfo->cport_mutex);
10744 (SATA_CPORTINFO_DRV_INFO(cportinfo))->
10745 satadrv_state = SATA_STATE_READY;
10746 mutex_exit(&cportinfo->cport_mutex);
10747
10748 break;
10749
10750 case SATA_ADDR_PMPORT:
10751 saddr->qual = SATA_ADDR_DPMPORT;
10752
10753 mutex_enter(&cportinfo->cport_mutex);
10754 /* It must be a Port Multiplier at the controller port */
10755 ASSERT(cportinfo->cport_dev_type == SATA_DTYPE_PMULT);
10756
10757 pminfo = SATA_CPORTINFO_PMULT_INFO(cportinfo);
10758 pmportinfo = pminfo->pmult_dev_port[saddr->pmport];
10759 mutex_exit(&cportinfo->cport_mutex);
10760
10761 rval = sata_probe_device(sata_hba_inst, sata_device);
10762 if (rval != SATA_SUCCESS ||
10763 sata_device->satadev_type == SATA_DTYPE_UNKNOWN) {
10764 return (SATA_FAILURE);
10765 }
10766
10767 mutex_enter(&pmportinfo->pmport_mutex);
10768 sata_show_drive_info(sata_hba_inst,
10769 SATA_PMPORTINFO_DRV_INFO(pmportinfo));
10770
10771 if ((sata_device->satadev_type & SATA_VALID_DEV_TYPE) == 0) {
10772 /*
10773 * Could not determine device type.
10774 * Degrade this device to unknown.
10775 */
10776 pmportinfo->pmport_dev_type = SATA_DTYPE_UNKNOWN;
10777 mutex_exit(&pmportinfo->pmport_mutex);
10778 return (SATA_SUCCESS);
10779 }
10780 pmportinfo->pmport_dev_type = sata_device->satadev_type;
10781 pmportinfo->pmport_tgtnode_clean = B_TRUE;
10782 mutex_exit(&pmportinfo->pmport_mutex);
10783
10784 /*
10785 * Initialize device to the desired state.
10786 * Even if it fails, the device will still
10787 * attach but syslog will show the warning.
10788 */
10789 if (sata_initialize_device(sata_hba_inst,
10790 pmportinfo->pmport_sata_drive) != SATA_SUCCESS) {
10791 /* Retry */
10792 rval = sata_initialize_device(sata_hba_inst,
10793 pmportinfo->pmport_sata_drive);
10794
10795 if (rval == SATA_RETRY)
10796 sata_log(sata_hba_inst, CE_WARN,
10797 "SATA device at port %d:%d - "
10798 "default device features could not be set."
10799 " Device may not operate as expected.",
10800 cport, pmport);
10801 }
10802
10803 cdip = sata_create_target_node(pdip, sata_hba_inst, saddr);
10804 if (cdip == NULL) {
10805 /*
10806 * Attaching target node failed.
10807 * We retain sata_drive_info structure...
10808 */
10809 return (SATA_SUCCESS);
10810 }
10811 mutex_enter(&pmportinfo->pmport_mutex);
10812 pmportinfo->pmport_sata_drive->satadrv_state |=
10813 SATA_STATE_READY;
10814 mutex_exit(&pmportinfo->pmport_mutex);
10815
10816 break;
10817
10818 default:
10819 return (SATA_FAILURE);
10820 }
10821
10822 return (SATA_SUCCESS);
10823 }
10824
10825 /*
10826 * Clean up target node at specific address.
10827 *
10828 * NOTE: No Mutex should be hold.
10829 */
10830 static int
sata_offline_device(sata_hba_inst_t * sata_hba_inst,sata_device_t * sata_device,sata_drive_info_t * sdinfo)10831 sata_offline_device(sata_hba_inst_t *sata_hba_inst,
10832 sata_device_t *sata_device, sata_drive_info_t *sdinfo)
10833 {
10834 uint8_t cport, pmport, qual;
10835 dev_info_t *tdip;
10836
10837 cport = sata_device->satadev_addr.cport;
10838 pmport = sata_device->satadev_addr.pmport;
10839 qual = sata_device->satadev_addr.qual;
10840
10841 if (qual == SATA_ADDR_DCPORT) {
10842 SATA_LOG_D((sata_hba_inst, CE_WARN,
10843 "sata_hba_ioctl: disconnect device at port %d", cport));
10844 } else {
10845 SATA_LOG_D((sata_hba_inst, CE_WARN,
10846 "sata_hba_ioctl: disconnect device at port %d:%d",
10847 cport, pmport));
10848 }
10849
10850 /* We are addressing attached device, not a port */
10851 sata_device->satadev_addr.qual =
10852 sdinfo->satadrv_addr.qual;
10853 tdip = sata_get_scsi_target_dip(SATA_DIP(sata_hba_inst),
10854 &sata_device->satadev_addr);
10855 if (tdip != NULL && ndi_devi_offline(tdip,
10856 NDI_DEVI_REMOVE) != NDI_SUCCESS) {
10857 /*
10858 * Problem :
10859 * The target node remained attached.
10860 * This happens when the device file was open
10861 * or a node was waiting for resources.
10862 * Cannot do anything about it.
10863 */
10864 if (qual == SATA_ADDR_DCPORT) {
10865 SATA_LOG_D((sata_hba_inst, CE_WARN,
10866 "sata_hba_ioctl: disconnect: could "
10867 "not unconfigure device before "
10868 "disconnecting the SATA port %d",
10869 cport));
10870 } else {
10871 SATA_LOG_D((sata_hba_inst, CE_WARN,
10872 "sata_hba_ioctl: disconnect: could "
10873 "not unconfigure device before "
10874 "disconnecting the SATA port %d:%d",
10875 cport, pmport));
10876 }
10877 /*
10878 * Set DEVICE REMOVED state in the target
10879 * node. It will prevent access to the device
10880 * even when a new device is attached, until
10881 * the old target node is released, removed and
10882 * recreated for a new device.
10883 */
10884 sata_set_device_removed(tdip);
10885
10886 /*
10887 * Instruct event daemon to try the target
10888 * node cleanup later.
10889 */
10890 sata_set_target_node_cleanup(
10891 sata_hba_inst, &sata_device->satadev_addr);
10892 }
10893
10894
10895 return (SATA_SUCCESS);
10896 }
10897
10898
10899 /*
10900 * Create scsi target node for attached device, create node properties and
10901 * attach the node.
10902 * The node could be removed if the device onlining fails.
10903 *
10904 * A dev_info_t pointer is returned if operation is successful, NULL is
10905 * returned otherwise.
10906 */
10907
10908 static dev_info_t *
sata_create_target_node(dev_info_t * dip,sata_hba_inst_t * sata_hba_inst,sata_address_t * sata_addr)10909 sata_create_target_node(dev_info_t *dip, sata_hba_inst_t *sata_hba_inst,
10910 sata_address_t *sata_addr)
10911 {
10912 dev_info_t *cdip = NULL;
10913 int rval;
10914 char *nname = NULL;
10915 char **compatible = NULL;
10916 int ncompatible;
10917 struct scsi_inquiry inq;
10918 sata_device_t sata_device;
10919 sata_drive_info_t *sdinfo;
10920 int target;
10921 int i;
10922
10923 sata_device.satadev_rev = SATA_DEVICE_REV;
10924 sata_device.satadev_addr = *sata_addr;
10925
10926 mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst, sata_addr->cport)));
10927
10928 sdinfo = sata_get_device_info(sata_hba_inst, &sata_device);
10929
10930 target = SATA_TO_SCSI_TARGET(sata_addr->cport,
10931 sata_addr->pmport, sata_addr->qual);
10932
10933 if (sdinfo == NULL) {
10934 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
10935 sata_addr->cport)));
10936 SATA_LOG_D((sata_hba_inst, CE_WARN,
10937 "sata_create_target_node: no sdinfo for target %x",
10938 target));
10939 return (NULL);
10940 }
10941
10942 /*
10943 * create or get scsi inquiry data, expected by
10944 * scsi_hba_nodename_compatible_get()
10945 * SATA hard disks get Identify Data translated into Inguiry Data.
10946 * ATAPI devices respond directly to Inquiry request.
10947 */
10948 if (sdinfo->satadrv_type == SATA_DTYPE_ATADISK) {
10949 sata_identdev_to_inquiry(sata_hba_inst, sdinfo,
10950 (uint8_t *)&inq);
10951 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
10952 sata_addr->cport)));
10953 } else { /* Assume supported ATAPI device */
10954 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
10955 sata_addr->cport)));
10956 if (sata_get_atapi_inquiry_data(sata_hba_inst, sata_addr,
10957 &inq) == SATA_FAILURE)
10958 return (NULL);
10959 /*
10960 * Save supported ATAPI transport version
10961 */
10962 sdinfo->satadrv_atapi_trans_ver =
10963 SATA_ATAPI_TRANS_VERSION(&inq);
10964 }
10965
10966 /* determine the node name and compatible */
10967 scsi_hba_nodename_compatible_get(&inq, NULL,
10968 inq.inq_dtype, NULL, &nname, &compatible, &ncompatible);
10969
10970 #ifdef SATA_DEBUG
10971 if (sata_debug_flags & SATA_DBG_NODES) {
10972 if (nname == NULL) {
10973 cmn_err(CE_NOTE, "sata_create_target_node: "
10974 "cannot determine nodename for target %d\n",
10975 target);
10976 } else {
10977 cmn_err(CE_WARN, "sata_create_target_node: "
10978 "target %d nodename: %s\n", target, nname);
10979 }
10980 if (compatible == NULL) {
10981 cmn_err(CE_WARN,
10982 "sata_create_target_node: no compatible name\n");
10983 } else {
10984 for (i = 0; i < ncompatible; i++) {
10985 cmn_err(CE_WARN, "sata_create_target_node: "
10986 "compatible name: %s\n", compatible[i]);
10987 }
10988 }
10989 }
10990 #endif
10991
10992 /* if nodename can't be determined, log error and exit */
10993 if (nname == NULL) {
10994 SATA_LOG_D((sata_hba_inst, CE_WARN,
10995 "sata_create_target_node: cannot determine nodename "
10996 "for target %d\n", target));
10997 scsi_hba_nodename_compatible_free(nname, compatible);
10998 return (NULL);
10999 }
11000 /*
11001 * Create scsi target node
11002 */
11003 ndi_devi_alloc_sleep(dip, nname, (pnode_t)DEVI_SID_NODEID, &cdip);
11004 rval = ndi_prop_update_string(DDI_DEV_T_NONE, cdip,
11005 "device-type", "scsi");
11006
11007 if (rval != DDI_PROP_SUCCESS) {
11008 SATA_LOG_D((sata_hba_inst, CE_WARN, "sata_create_target_node: "
11009 "updating device_type prop failed %d", rval));
11010 goto fail;
11011 }
11012
11013 /*
11014 * Create target node properties: target & lun
11015 */
11016 rval = ndi_prop_update_int(DDI_DEV_T_NONE, cdip, "target", target);
11017 if (rval != DDI_PROP_SUCCESS) {
11018 SATA_LOG_D((sata_hba_inst, CE_WARN, "sata_create_target_node: "
11019 "updating target prop failed %d", rval));
11020 goto fail;
11021 }
11022 rval = ndi_prop_update_int(DDI_DEV_T_NONE, cdip, "lun", 0);
11023 if (rval != DDI_PROP_SUCCESS) {
11024 SATA_LOG_D((sata_hba_inst, CE_WARN, "sata_create_target_node: "
11025 "updating target prop failed %d", rval));
11026 goto fail;
11027 }
11028
11029 if (sdinfo->satadrv_type & SATA_DTYPE_ATAPI) {
11030 /*
11031 * Add "variant" property
11032 */
11033 rval = ndi_prop_update_string(DDI_DEV_T_NONE, cdip,
11034 "variant", "atapi");
11035 if (rval != DDI_PROP_SUCCESS) {
11036 SATA_LOG_D((sata_hba_inst, CE_WARN,
11037 "sata_create_target_node: variant atapi "
11038 "property could not be created: %d", rval));
11039 goto fail;
11040 }
11041 }
11042 /* decorate the node with compatible */
11043 if (ndi_prop_update_string_array(DDI_DEV_T_NONE, cdip, "compatible",
11044 compatible, ncompatible) != DDI_PROP_SUCCESS) {
11045 SATA_LOG_D((sata_hba_inst, CE_WARN,
11046 "sata_create_target_node: FAIL compatible props cdip 0x%p",
11047 (void *)cdip));
11048 goto fail;
11049 }
11050
11051 if (sdinfo->satadrv_type == SATA_DTYPE_ATADISK) {
11052 /*
11053 * Add "sata-phy" property
11054 */
11055 if (ndi_prop_update_int(DDI_DEV_T_NONE, cdip, "sata-phy",
11056 (int)sata_addr->cport) != DDI_PROP_SUCCESS) {
11057 SATA_LOG_D((sata_hba_inst, CE_WARN,
11058 "sata_create_target_node: failed to create "
11059 "\"sata-phy\" property: port %d",
11060 sata_addr->cport));
11061 }
11062 }
11063
11064
11065 /*
11066 * Now, try to attach the driver. If probing of the device fails,
11067 * the target node may be removed
11068 */
11069 rval = ndi_devi_online(cdip, NDI_ONLINE_ATTACH);
11070
11071 scsi_hba_nodename_compatible_free(nname, compatible);
11072
11073 if (rval == NDI_SUCCESS)
11074 return (cdip);
11075
11076 /* target node was removed - are we sure? */
11077 return (NULL);
11078
11079 fail:
11080 scsi_hba_nodename_compatible_free(nname, compatible);
11081 ddi_prop_remove_all(cdip);
11082 rval = ndi_devi_free(cdip);
11083 if (rval != NDI_SUCCESS) {
11084 SATA_LOG_D((sata_hba_inst, CE_WARN, "sata_create_target_node: "
11085 "node removal failed %d", rval));
11086 }
11087 sata_log(sata_hba_inst, CE_WARN, "sata_create_target_node: "
11088 "cannot create target node for SATA device at port %d",
11089 sata_addr->cport);
11090 return (NULL);
11091 }
11092
11093 /*
11094 * Remove a target node.
11095 */
11096 static void
sata_remove_target_node(sata_hba_inst_t * sata_hba_inst,sata_address_t * sata_addr)11097 sata_remove_target_node(sata_hba_inst_t *sata_hba_inst,
11098 sata_address_t *sata_addr)
11099 {
11100 dev_info_t *tdip;
11101 uint8_t cport = sata_addr->cport;
11102 uint8_t pmport = sata_addr->pmport;
11103 uint8_t qual = sata_addr->qual;
11104
11105 /* Note the sata daemon uses the address of the port/pmport */
11106 ASSERT(qual == SATA_ADDR_CPORT || qual == SATA_ADDR_PMPORT);
11107
11108 /* Remove target node */
11109 tdip = sata_get_target_dip(SATA_DIP(sata_hba_inst), cport, pmport);
11110 if (tdip != NULL) {
11111 /*
11112 * Target node exists. Unconfigure device
11113 * then remove the target node (one ndi
11114 * operation).
11115 */
11116 if (ndi_devi_offline(tdip, NDI_DEVI_REMOVE) != NDI_SUCCESS) {
11117 /*
11118 * PROBLEM - no device, but target node remained. This
11119 * happens when the file was open or node was waiting
11120 * for resources.
11121 */
11122 SATA_LOG_D((sata_hba_inst, CE_WARN,
11123 "sata_remove_target_node: "
11124 "Failed to remove target node for "
11125 "detached SATA device."));
11126 /*
11127 * Set target node state to DEVI_DEVICE_REMOVED. But
11128 * re-check first that the node still exists.
11129 */
11130 tdip = sata_get_target_dip(SATA_DIP(sata_hba_inst),
11131 cport, pmport);
11132 if (tdip != NULL) {
11133 sata_set_device_removed(tdip);
11134 /*
11135 * Instruct event daemon to retry the cleanup
11136 * later.
11137 */
11138 sata_set_target_node_cleanup(sata_hba_inst,
11139 sata_addr);
11140 }
11141 }
11142
11143 if (qual == SATA_ADDR_CPORT)
11144 sata_log(sata_hba_inst, CE_WARN,
11145 "SATA device detached at port %d", cport);
11146 else
11147 sata_log(sata_hba_inst, CE_WARN,
11148 "SATA device detached at port %d:%d",
11149 cport, pmport);
11150 }
11151 #ifdef SATA_DEBUG
11152 else {
11153 if (qual == SATA_ADDR_CPORT)
11154 sata_log(sata_hba_inst, CE_WARN,
11155 "target node not found at port %d", cport);
11156 else
11157 sata_log(sata_hba_inst, CE_WARN,
11158 "target node not found at port %d:%d",
11159 cport, pmport);
11160 }
11161 #endif
11162 }
11163
11164
11165 /*
11166 * Re-probe sata port, check for a device and attach info
11167 * structures when necessary. Identify Device data is fetched, if possible.
11168 * Assumption: sata address is already validated.
11169 * SATA_SUCCESS is returned if port is re-probed sucessfully, regardless of
11170 * the presence of a device and its type.
11171 *
11172 * flag arg specifies that the function should try multiple times to identify
11173 * device type and to initialize it, or it should return immediately on failure.
11174 * SATA_DEV_IDENTIFY_RETRY - retry
11175 * SATA_DEV_IDENTIFY_NORETRY - no retry
11176 *
11177 * SATA_FAILURE is returned if one of the operations failed.
11178 *
11179 * This function cannot be called in interrupt context - it may sleep.
11180 *
11181 * Note: Port multiplier is supported.
11182 */
11183 static int
sata_reprobe_port(sata_hba_inst_t * sata_hba_inst,sata_device_t * sata_device,int flag)11184 sata_reprobe_port(sata_hba_inst_t *sata_hba_inst, sata_device_t *sata_device,
11185 int flag)
11186 {
11187 sata_cport_info_t *cportinfo;
11188 sata_pmult_info_t *pmultinfo;
11189 sata_drive_info_t *sdinfo, *osdinfo;
11190 boolean_t init_device = B_FALSE;
11191 int prev_device_type = SATA_DTYPE_NONE;
11192 int prev_device_settings = 0;
11193 int prev_device_state = 0;
11194 clock_t start_time;
11195 int retry = B_FALSE;
11196 uint8_t cport = sata_device->satadev_addr.cport;
11197 int rval_probe, rval_init;
11198
11199 /*
11200 * If target is pmport, sata_reprobe_pmport() will handle it.
11201 */
11202 if (sata_device->satadev_addr.qual == SATA_ADDR_PMPORT ||
11203 sata_device->satadev_addr.qual == SATA_ADDR_DPMPORT)
11204 return (sata_reprobe_pmport(sata_hba_inst, sata_device, flag));
11205
11206 /* We only care about host sata cport for now */
11207 cportinfo = SATA_CPORT_INFO(sata_hba_inst,
11208 sata_device->satadev_addr.cport);
11209
11210 /*
11211 * If a port multiplier was previously attached (we have no idea it
11212 * still there or not), sata_reprobe_pmult() will handle it.
11213 */
11214 if (cportinfo->cport_dev_type == SATA_DTYPE_PMULT)
11215 return (sata_reprobe_pmult(sata_hba_inst, sata_device, flag));
11216
11217 /* Store sata_drive_info when a non-pmult device was attached. */
11218 osdinfo = SATA_CPORTINFO_DRV_INFO(cportinfo);
11219 if (osdinfo != NULL) {
11220 /*
11221 * We are re-probing port with a previously attached device.
11222 * Save previous device type and settings.
11223 */
11224 prev_device_type = cportinfo->cport_dev_type;
11225 prev_device_settings = osdinfo->satadrv_settings;
11226 prev_device_state = osdinfo->satadrv_state;
11227 }
11228 if (flag == SATA_DEV_IDENTIFY_RETRY) {
11229 start_time = ddi_get_lbolt();
11230 retry = B_TRUE;
11231 }
11232 retry_probe:
11233
11234 /* probe port */
11235 mutex_enter(&cportinfo->cport_mutex);
11236 cportinfo->cport_state &= ~SATA_PORT_STATE_CLEAR_MASK;
11237 cportinfo->cport_state |= SATA_STATE_PROBING;
11238 mutex_exit(&cportinfo->cport_mutex);
11239
11240 rval_probe = (*SATA_PROBE_PORT_FUNC(sata_hba_inst))
11241 (SATA_DIP(sata_hba_inst), sata_device);
11242
11243 mutex_enter(&cportinfo->cport_mutex);
11244 if (rval_probe != SATA_SUCCESS) {
11245 cportinfo->cport_state = SATA_PSTATE_FAILED;
11246 mutex_exit(&cportinfo->cport_mutex);
11247 SATA_LOG_D((sata_hba_inst, CE_WARN, "sata_reprobe_port: "
11248 "SATA port %d probing failed",
11249 cportinfo->cport_addr.cport));
11250 return (SATA_FAILURE);
11251 }
11252
11253 /*
11254 * update sata port state and set device type
11255 */
11256 sata_update_port_info(sata_hba_inst, sata_device);
11257 cportinfo->cport_state &= ~SATA_STATE_PROBING;
11258
11259 /*
11260 * Sanity check - Port is active? Is the link active?
11261 * Is there any device attached?
11262 */
11263 if ((cportinfo->cport_state &
11264 (SATA_PSTATE_SHUTDOWN | SATA_PSTATE_FAILED)) ||
11265 (cportinfo->cport_scr.sstatus & SATA_PORT_DEVLINK_UP_MASK) !=
11266 SATA_PORT_DEVLINK_UP) {
11267 /*
11268 * Port in non-usable state or no link active/no device.
11269 * Free info structure if necessary (direct attached drive
11270 * only, for now!
11271 */
11272 sdinfo = SATA_CPORTINFO_DRV_INFO(cportinfo);
11273 SATA_CPORTINFO_DRV_INFO(cportinfo) = NULL;
11274 /* Add here differentiation for device attached or not */
11275 cportinfo->cport_dev_type = SATA_DTYPE_NONE;
11276 mutex_exit(&cportinfo->cport_mutex);
11277 if (sdinfo != NULL)
11278 kmem_free(sdinfo, sizeof (sata_drive_info_t));
11279 return (SATA_SUCCESS);
11280 }
11281
11282 cportinfo->cport_state |= SATA_STATE_READY;
11283 cportinfo->cport_state |= SATA_STATE_PROBED;
11284
11285 cportinfo->cport_dev_type = sata_device->satadev_type;
11286 sdinfo = SATA_CPORTINFO_DRV_INFO(cportinfo);
11287
11288 /*
11289 * If we are re-probing the port, there may be
11290 * sata_drive_info structure attached
11291 */
11292 if (sata_device->satadev_type == SATA_DTYPE_NONE) {
11293
11294 /*
11295 * There is no device, so remove device info structure,
11296 * if necessary.
11297 */
11298 /* Device change: Drive -> None */
11299 SATA_CPORTINFO_DRV_INFO(cportinfo) = NULL;
11300 cportinfo->cport_dev_type = SATA_DTYPE_NONE;
11301 if (sdinfo != NULL) {
11302 kmem_free(sdinfo, sizeof (sata_drive_info_t));
11303 sata_log(sata_hba_inst, CE_WARN,
11304 "SATA device detached "
11305 "from port %d", cportinfo->cport_addr.cport);
11306 }
11307 mutex_exit(&cportinfo->cport_mutex);
11308 return (SATA_SUCCESS);
11309
11310 }
11311
11312 if (sata_device->satadev_type != SATA_DTYPE_PMULT) {
11313
11314 /* Device (may) change: Drive -> Drive */
11315 if (sdinfo == NULL) {
11316 /*
11317 * There is some device attached, but there is
11318 * no sata_drive_info structure - allocate one
11319 */
11320 mutex_exit(&cportinfo->cport_mutex);
11321 sdinfo = kmem_zalloc(
11322 sizeof (sata_drive_info_t), KM_SLEEP);
11323 mutex_enter(&cportinfo->cport_mutex);
11324 /*
11325 * Recheck, that the port state did not change when we
11326 * released mutex.
11327 */
11328 if (cportinfo->cport_state & SATA_STATE_READY) {
11329 SATA_CPORTINFO_DRV_INFO(cportinfo) = sdinfo;
11330 sdinfo->satadrv_addr = cportinfo->cport_addr;
11331 sdinfo->satadrv_addr.qual = SATA_ADDR_DCPORT;
11332 sdinfo->satadrv_type = SATA_DTYPE_UNKNOWN;
11333 sdinfo->satadrv_state = SATA_STATE_UNKNOWN;
11334 } else {
11335 /*
11336 * Port is not in ready state, we
11337 * cannot attach a device.
11338 */
11339 mutex_exit(&cportinfo->cport_mutex);
11340 kmem_free(sdinfo, sizeof (sata_drive_info_t));
11341 return (SATA_SUCCESS);
11342 }
11343 /*
11344 * Since we are adding device, presumably new one,
11345 * indicate that it should be initalized,
11346 * as well as some internal framework states).
11347 */
11348 init_device = B_TRUE;
11349 }
11350 cportinfo->cport_dev_type = SATA_DTYPE_UNKNOWN;
11351 sata_device->satadev_addr.qual = sdinfo->satadrv_addr.qual;
11352 } else {
11353 /* Device change: Drive -> PMult */
11354 SATA_CPORTINFO_DRV_INFO(cportinfo) = NULL;
11355 if (sdinfo != NULL) {
11356 kmem_free(sdinfo, sizeof (sata_drive_info_t));
11357 sata_log(sata_hba_inst, CE_WARN,
11358 "SATA device detached "
11359 "from port %d", cportinfo->cport_addr.cport);
11360 }
11361
11362 sata_log(sata_hba_inst, CE_WARN,
11363 "SATA port multiplier detected at port %d",
11364 cportinfo->cport_addr.cport);
11365
11366 mutex_exit(&cportinfo->cport_mutex);
11367 if (sata_alloc_pmult(sata_hba_inst, sata_device) !=
11368 SATA_SUCCESS)
11369 return (SATA_FAILURE);
11370 sata_show_pmult_info(sata_hba_inst, sata_device);
11371 mutex_enter(&cportinfo->cport_mutex);
11372
11373 /*
11374 * Mark all the port multiplier port behind the port
11375 * multiplier behind with link events, so that the sata daemon
11376 * will update their status.
11377 */
11378 pmultinfo = SATA_PMULT_INFO(sata_hba_inst, cport);
11379 pmultinfo->pmult_event_flags |= SATA_EVNT_DEVICE_RESET;
11380 mutex_exit(&cportinfo->cport_mutex);
11381 return (SATA_SUCCESS);
11382 }
11383 mutex_exit(&cportinfo->cport_mutex);
11384
11385 /*
11386 * Figure out what kind of device we are really
11387 * dealing with. Failure of identifying device does not fail this
11388 * function.
11389 */
11390 rval_probe = sata_probe_device(sata_hba_inst, sata_device);
11391 rval_init = SATA_FAILURE;
11392 mutex_enter(&cportinfo->cport_mutex);
11393 if (rval_probe == SATA_SUCCESS) {
11394 /*
11395 * If we are dealing with the same type of a device as before,
11396 * restore its settings flags.
11397 */
11398 if (osdinfo != NULL &&
11399 sata_device->satadev_type == prev_device_type)
11400 sdinfo->satadrv_settings = prev_device_settings;
11401
11402 mutex_exit(&cportinfo->cport_mutex);
11403 rval_init = SATA_SUCCESS;
11404 /* Set initial device features, if necessary */
11405 if (init_device == B_TRUE) {
11406 rval_init = sata_initialize_device(sata_hba_inst,
11407 sdinfo);
11408 }
11409 if (rval_init == SATA_SUCCESS)
11410 return (rval_init);
11411 /* else we will retry if retry was asked for */
11412
11413 } else {
11414 /*
11415 * If there was some device info before we probe the device,
11416 * restore previous device setting, so we can retry from scratch
11417 * later. Providing, of course, that device has not disapear
11418 * during probing process.
11419 */
11420 if (sata_device->satadev_type != SATA_DTYPE_NONE) {
11421 if (osdinfo != NULL) {
11422 cportinfo->cport_dev_type = prev_device_type;
11423 sdinfo->satadrv_type = prev_device_type;
11424 sdinfo->satadrv_state = prev_device_state;
11425 }
11426 } else {
11427 /* device is gone */
11428 kmem_free(sdinfo, sizeof (sata_drive_info_t));
11429 cportinfo->cport_dev_type = SATA_DTYPE_NONE;
11430 SATA_CPORTINFO_DRV_INFO(cportinfo) = NULL;
11431 mutex_exit(&cportinfo->cport_mutex);
11432 return (SATA_SUCCESS);
11433 }
11434 mutex_exit(&cportinfo->cport_mutex);
11435 }
11436
11437 if (retry) {
11438 clock_t cur_time = ddi_get_lbolt();
11439 /*
11440 * A device was not successfully identified or initialized.
11441 * Track retry time for device identification.
11442 */
11443 if ((cur_time - start_time) <
11444 drv_usectohz(SATA_DEV_REPROBE_TIMEOUT)) {
11445 /* sleep for a while */
11446 delay(drv_usectohz(SATA_DEV_RETRY_DLY));
11447 goto retry_probe;
11448 }
11449 /* else no more retries */
11450 mutex_enter(&cportinfo->cport_mutex);
11451 if (SATA_CPORTINFO_DRV_INFO(cportinfo) != NULL) {
11452 if (rval_init == SATA_RETRY) {
11453 /*
11454 * Setting drive features have failed, but
11455 * because the drive is still accessible,
11456 * keep it and emit a warning message.
11457 */
11458 sata_log(sata_hba_inst, CE_WARN,
11459 "SATA device at port %d - desired "
11460 "drive features could not be set. "
11461 "Device may not operate as expected.",
11462 cportinfo->cport_addr.cport);
11463 } else {
11464 SATA_CPORTINFO_DRV_INFO(cportinfo)->
11465 satadrv_state = SATA_DSTATE_FAILED;
11466 }
11467 }
11468 mutex_exit(&cportinfo->cport_mutex);
11469 }
11470 return (SATA_SUCCESS);
11471 }
11472
11473 /*
11474 * Reprobe a controller port that connected to a port multiplier.
11475 *
11476 * NOTE: No Mutex should be hold.
11477 */
11478 static int
sata_reprobe_pmult(sata_hba_inst_t * sata_hba_inst,sata_device_t * sata_device,int flag)11479 sata_reprobe_pmult(sata_hba_inst_t *sata_hba_inst, sata_device_t *sata_device,
11480 int flag)
11481 {
11482 _NOTE(ARGUNUSED(flag))
11483 sata_cport_info_t *cportinfo;
11484 sata_pmult_info_t *pmultinfo;
11485 uint8_t cport = sata_device->satadev_addr.cport;
11486 int rval_probe;
11487
11488 cportinfo = SATA_CPORT_INFO(sata_hba_inst, cport);
11489 pmultinfo = SATA_PMULT_INFO(sata_hba_inst, cport);
11490
11491 /* probe port */
11492 mutex_enter(&cportinfo->cport_mutex);
11493 cportinfo->cport_state &= ~SATA_PORT_STATE_CLEAR_MASK;
11494 cportinfo->cport_state |= SATA_STATE_PROBING;
11495 mutex_exit(&cportinfo->cport_mutex);
11496
11497 rval_probe = (*SATA_PROBE_PORT_FUNC(sata_hba_inst))
11498 (SATA_DIP(sata_hba_inst), sata_device);
11499
11500 mutex_enter(&cportinfo->cport_mutex);
11501 if (rval_probe != SATA_SUCCESS) {
11502 cportinfo->cport_state = SATA_PSTATE_FAILED;
11503 SATA_LOG_D((sata_hba_inst, CE_WARN, "sata_reprobe_pmult: "
11504 "SATA port %d probing failed", cport));
11505 sata_log(sata_hba_inst, CE_WARN,
11506 "SATA port multiplier detached at port %d", cport);
11507 mutex_exit(&cportinfo->cport_mutex);
11508 sata_free_pmult(sata_hba_inst, sata_device);
11509 return (SATA_FAILURE);
11510 }
11511
11512 /*
11513 * update sata port state and set device type
11514 */
11515 sata_update_port_info(sata_hba_inst, sata_device);
11516 cportinfo->cport_state &= ~SATA_STATE_PROBING;
11517 cportinfo->cport_state |= SATA_STATE_PROBED;
11518
11519 /*
11520 * Sanity check - Port is active? Is the link active?
11521 * Is there any device attached?
11522 */
11523 if ((cportinfo->cport_state &
11524 (SATA_PSTATE_SHUTDOWN | SATA_PSTATE_FAILED)) ||
11525 (cportinfo->cport_scr.sstatus & SATA_PORT_DEVLINK_UP_MASK) !=
11526 SATA_PORT_DEVLINK_UP ||
11527 (sata_device->satadev_type == SATA_DTYPE_NONE)) {
11528 cportinfo->cport_dev_type = SATA_DTYPE_NONE;
11529 mutex_exit(&cportinfo->cport_mutex);
11530 sata_free_pmult(sata_hba_inst, sata_device);
11531 sata_log(sata_hba_inst, CE_WARN,
11532 "SATA port multiplier detached at port %d", cport);
11533 return (SATA_SUCCESS);
11534 }
11535
11536 /*
11537 * Device changed: PMult -> Non-PMult
11538 *
11539 * This situation is uncommon, most possibly being caused by errors
11540 * after which the port multiplier is not correct initialized and
11541 * recognized. In that case the new device will be marked as unknown
11542 * and will not be automatically probed in this routine. Instead
11543 * system administrator could manually restart it via cfgadm(1M).
11544 */
11545 if (sata_device->satadev_type != SATA_DTYPE_PMULT) {
11546 cportinfo->cport_dev_type = SATA_DTYPE_UNKNOWN;
11547 mutex_exit(&cportinfo->cport_mutex);
11548 sata_free_pmult(sata_hba_inst, sata_device);
11549 sata_log(sata_hba_inst, CE_WARN,
11550 "SATA port multiplier detached at port %d", cport);
11551 return (SATA_FAILURE);
11552 }
11553
11554 /*
11555 * Now we know it is a port multiplier. However, if this is not the
11556 * previously attached port multiplier - they may have different
11557 * pmport numbers - we need to re-allocate data structures for every
11558 * pmport and drive.
11559 *
11560 * Port multipliers of the same model have identical values in these
11561 * registers, so it is still necessary to update the information of
11562 * all drives attached to the previous port multiplier afterwards.
11563 */
11564 /* Device changed: PMult -> another PMult */
11565 mutex_exit(&cportinfo->cport_mutex);
11566 sata_free_pmult(sata_hba_inst, sata_device);
11567 if (sata_alloc_pmult(sata_hba_inst, sata_device) != SATA_SUCCESS)
11568 return (SATA_FAILURE);
11569 mutex_enter(&cportinfo->cport_mutex);
11570
11571 SATADBG1(SATA_DBG_PMULT, sata_hba_inst,
11572 "SATA port multiplier [changed] at port %d", cport);
11573 sata_log(sata_hba_inst, CE_WARN,
11574 "SATA port multiplier detected at port %d", cport);
11575
11576 /*
11577 * Mark all the port multiplier port behind the port
11578 * multiplier behind with link events, so that the sata daemon
11579 * will update their status.
11580 */
11581 pmultinfo->pmult_event_flags |= SATA_EVNT_DEVICE_RESET;
11582 mutex_exit(&cportinfo->cport_mutex);
11583
11584 return (SATA_SUCCESS);
11585 }
11586
11587 /*
11588 * Re-probe a port multiplier port, check for a device and attach info
11589 * structures when necessary. Identify Device data is fetched, if possible.
11590 * Assumption: sata address is already validated as port multiplier port.
11591 * SATA_SUCCESS is returned if port is re-probed sucessfully, regardless of
11592 * the presence of a device and its type.
11593 *
11594 * flag arg specifies that the function should try multiple times to identify
11595 * device type and to initialize it, or it should return immediately on failure.
11596 * SATA_DEV_IDENTIFY_RETRY - retry
11597 * SATA_DEV_IDENTIFY_NORETRY - no retry
11598 *
11599 * SATA_FAILURE is returned if one of the operations failed.
11600 *
11601 * This function cannot be called in interrupt context - it may sleep.
11602 *
11603 * NOTE: Should be only called by sata_probe_port() in case target port is a
11604 * port multiplier port.
11605 * NOTE: No Mutex should be hold.
11606 */
11607 static int
sata_reprobe_pmport(sata_hba_inst_t * sata_hba_inst,sata_device_t * sata_device,int flag)11608 sata_reprobe_pmport(sata_hba_inst_t *sata_hba_inst, sata_device_t *sata_device,
11609 int flag)
11610 {
11611 sata_cport_info_t *cportinfo = NULL;
11612 sata_pmport_info_t *pmportinfo = NULL;
11613 sata_drive_info_t *sdinfo, *osdinfo;
11614 sata_device_t sdevice;
11615 boolean_t init_device = B_FALSE;
11616 int prev_device_type = SATA_DTYPE_NONE;
11617 int prev_device_settings = 0;
11618 int prev_device_state = 0;
11619 clock_t start_time;
11620 uint8_t cport = sata_device->satadev_addr.cport;
11621 uint8_t pmport = sata_device->satadev_addr.pmport;
11622 int rval;
11623
11624 cportinfo = SATA_CPORT_INFO(sata_hba_inst, cport);
11625 pmportinfo = SATA_PMPORT_INFO(sata_hba_inst, cport, pmport);
11626 osdinfo = SATA_PMPORTINFO_DRV_INFO(pmportinfo);
11627
11628 if (osdinfo != NULL) {
11629 /*
11630 * We are re-probing port with a previously attached device.
11631 * Save previous device type and settings.
11632 */
11633 prev_device_type = pmportinfo->pmport_dev_type;
11634 prev_device_settings = osdinfo->satadrv_settings;
11635 prev_device_state = osdinfo->satadrv_state;
11636 }
11637
11638 start_time = ddi_get_lbolt();
11639
11640 /* check parent status */
11641 mutex_enter(&cportinfo->cport_mutex);
11642 if ((cportinfo->cport_state &
11643 (SATA_PSTATE_SHUTDOWN | SATA_PSTATE_FAILED)) ||
11644 (cportinfo->cport_scr.sstatus & SATA_PORT_DEVLINK_UP_MASK) !=
11645 SATA_PORT_DEVLINK_UP) {
11646 mutex_exit(&cportinfo->cport_mutex);
11647 return (SATA_FAILURE);
11648 }
11649 mutex_exit(&cportinfo->cport_mutex);
11650
11651 retry_probe_pmport:
11652
11653 /* probe port */
11654 mutex_enter(&pmportinfo->pmport_mutex);
11655 pmportinfo->pmport_state &= ~SATA_PORT_STATE_CLEAR_MASK;
11656 pmportinfo->pmport_state |= SATA_STATE_PROBING;
11657 mutex_exit(&pmportinfo->pmport_mutex);
11658
11659 rval = (*SATA_PROBE_PORT_FUNC(sata_hba_inst))
11660 (SATA_DIP(sata_hba_inst), sata_device);
11661
11662 /* might need retry because we cannot touch registers. */
11663 if (rval == SATA_FAILURE) {
11664 mutex_enter(&pmportinfo->pmport_mutex);
11665 pmportinfo->pmport_state = SATA_PSTATE_FAILED;
11666 mutex_exit(&pmportinfo->pmport_mutex);
11667 SATA_LOG_D((sata_hba_inst, CE_WARN, "sata_reprobe_pmport: "
11668 "SATA port %d:%d probing failed",
11669 cport, pmport));
11670 return (SATA_FAILURE);
11671 } else if (rval == SATA_RETRY) {
11672 SATA_LOG_D((sata_hba_inst, CE_WARN, "sata_reprobe_pmport: "
11673 "SATA port %d:%d probing failed, retrying...",
11674 cport, pmport));
11675 clock_t cur_time = ddi_get_lbolt();
11676 /*
11677 * A device was not successfully identified or initialized.
11678 * Track retry time for device identification.
11679 */
11680 if ((cur_time - start_time) <
11681 drv_usectohz(SATA_DEV_REPROBE_TIMEOUT)) {
11682 /* sleep for a while */
11683 delay(drv_usectohz(SATA_DEV_RETRY_DLY));
11684 goto retry_probe_pmport;
11685 } else {
11686 mutex_enter(&pmportinfo->pmport_mutex);
11687 if (SATA_PMPORTINFO_DRV_INFO(pmportinfo) != NULL)
11688 SATA_PMPORTINFO_DRV_INFO(pmportinfo)->
11689 satadrv_state = SATA_DSTATE_FAILED;
11690 mutex_exit(&pmportinfo->pmport_mutex);
11691 return (SATA_SUCCESS);
11692 }
11693 }
11694
11695 /*
11696 * Sanity check - Controller port is active? Is the link active?
11697 * Is it still a port multiplier?
11698 */
11699 if ((cportinfo->cport_state &
11700 (SATA_PSTATE_SHUTDOWN | SATA_PSTATE_FAILED)) ||
11701 (cportinfo->cport_scr.sstatus & SATA_PORT_DEVLINK_UP_MASK) !=
11702 SATA_PORT_DEVLINK_UP ||
11703 (cportinfo->cport_dev_type != SATA_DTYPE_PMULT)) {
11704 /*
11705 * Port in non-usable state or no link active/no
11706 * device. Free info structure.
11707 */
11708 cportinfo->cport_dev_type = SATA_DTYPE_UNKNOWN;
11709
11710 sdevice.satadev_addr.cport = cport;
11711 sdevice.satadev_addr.pmport = pmport;
11712 sdevice.satadev_addr.qual = SATA_ADDR_PMULT;
11713 mutex_exit(&cportinfo->cport_mutex);
11714
11715 sata_free_pmult(sata_hba_inst, &sdevice);
11716 return (SATA_FAILURE);
11717 }
11718
11719 /* SATA_SUCCESS NOW */
11720 /*
11721 * update sata port state and set device type
11722 */
11723 mutex_enter(&pmportinfo->pmport_mutex);
11724 sata_update_pmport_info(sata_hba_inst, sata_device);
11725 pmportinfo->pmport_state &= ~SATA_STATE_PROBING;
11726
11727 /*
11728 * Sanity check - Port is active? Is the link active?
11729 * Is there any device attached?
11730 */
11731 if ((pmportinfo->pmport_state &
11732 (SATA_PSTATE_SHUTDOWN | SATA_PSTATE_FAILED)) ||
11733 (pmportinfo->pmport_scr.sstatus & SATA_PORT_DEVLINK_UP_MASK) !=
11734 SATA_PORT_DEVLINK_UP) {
11735 /*
11736 * Port in non-usable state or no link active/no device.
11737 * Free info structure if necessary (direct attached drive
11738 * only, for now!
11739 */
11740 sdinfo = SATA_PMPORTINFO_DRV_INFO(pmportinfo);
11741 SATA_PMPORTINFO_DRV_INFO(pmportinfo) = NULL;
11742 /* Add here differentiation for device attached or not */
11743 pmportinfo->pmport_dev_type = SATA_DTYPE_NONE;
11744 mutex_exit(&pmportinfo->pmport_mutex);
11745 if (sdinfo != NULL)
11746 kmem_free(sdinfo, sizeof (sata_drive_info_t));
11747 return (SATA_SUCCESS);
11748 }
11749
11750 pmportinfo->pmport_state |= SATA_STATE_READY;
11751 pmportinfo->pmport_dev_type = sata_device->satadev_type;
11752 sdinfo = SATA_PMPORTINFO_DRV_INFO(pmportinfo);
11753
11754 /*
11755 * If we are re-probing the port, there may be
11756 * sata_drive_info structure attached
11757 * (or sata_pm_info, if PMult is supported).
11758 */
11759 if (sata_device->satadev_type == SATA_DTYPE_NONE) {
11760 /*
11761 * There is no device, so remove device info structure,
11762 * if necessary.
11763 */
11764 SATA_PMPORTINFO_DRV_INFO(pmportinfo) = NULL;
11765 pmportinfo->pmport_dev_type = SATA_DTYPE_NONE;
11766 if (sdinfo != NULL) {
11767 kmem_free(sdinfo, sizeof (sata_drive_info_t));
11768 sata_log(sata_hba_inst, CE_WARN,
11769 "SATA device detached from port %d:%d",
11770 cport, pmport);
11771 }
11772 mutex_exit(&pmportinfo->pmport_mutex);
11773 return (SATA_SUCCESS);
11774 }
11775
11776 /* this should not be a pmult */
11777 ASSERT(sata_device->satadev_type != SATA_DTYPE_PMULT);
11778 if (sdinfo == NULL) {
11779 /*
11780 * There is some device attached, but there is
11781 * no sata_drive_info structure - allocate one
11782 */
11783 mutex_exit(&pmportinfo->pmport_mutex);
11784 sdinfo = kmem_zalloc(sizeof (sata_drive_info_t),
11785 KM_SLEEP);
11786 mutex_enter(&pmportinfo->pmport_mutex);
11787 /*
11788 * Recheck, that the port state did not change when we
11789 * released mutex.
11790 */
11791 if (pmportinfo->pmport_state & SATA_STATE_READY) {
11792 SATA_PMPORTINFO_DRV_INFO(pmportinfo) = sdinfo;
11793 sdinfo->satadrv_addr = pmportinfo->pmport_addr;
11794 sdinfo->satadrv_addr.qual = SATA_ADDR_DPMPORT;
11795 sdinfo->satadrv_type = SATA_DTYPE_UNKNOWN;
11796 sdinfo->satadrv_state = SATA_STATE_UNKNOWN;
11797 } else {
11798 /*
11799 * Port is not in ready state, we
11800 * cannot attach a device.
11801 */
11802 mutex_exit(&pmportinfo->pmport_mutex);
11803 kmem_free(sdinfo, sizeof (sata_drive_info_t));
11804 return (SATA_SUCCESS);
11805 }
11806 /*
11807 * Since we are adding device, presumably new one,
11808 * indicate that it should be initalized,
11809 * as well as some internal framework states).
11810 */
11811 init_device = B_TRUE;
11812 }
11813
11814 pmportinfo->pmport_dev_type = SATA_DTYPE_UNKNOWN;
11815 sata_device->satadev_addr.qual = sdinfo->satadrv_addr.qual;
11816
11817 mutex_exit(&pmportinfo->pmport_mutex);
11818 /*
11819 * Figure out what kind of device we are really
11820 * dealing with.
11821 */
11822 rval = sata_probe_device(sata_hba_inst, sata_device);
11823
11824 mutex_enter(&pmportinfo->pmport_mutex);
11825 if (rval == SATA_SUCCESS) {
11826 /*
11827 * If we are dealing with the same type of a device as before,
11828 * restore its settings flags.
11829 */
11830 if (osdinfo != NULL &&
11831 sata_device->satadev_type == prev_device_type)
11832 sdinfo->satadrv_settings = prev_device_settings;
11833
11834 mutex_exit(&pmportinfo->pmport_mutex);
11835 /* Set initial device features, if necessary */
11836 if (init_device == B_TRUE) {
11837 rval = sata_initialize_device(sata_hba_inst, sdinfo);
11838 }
11839 if (rval == SATA_SUCCESS)
11840 return (rval);
11841 } else {
11842 /*
11843 * If there was some device info before we probe the device,
11844 * restore previous device setting, so we can retry from scratch
11845 * later. Providing, of course, that device has not disappeared
11846 * during probing process.
11847 */
11848 if (sata_device->satadev_type != SATA_DTYPE_NONE) {
11849 if (osdinfo != NULL) {
11850 pmportinfo->pmport_dev_type = prev_device_type;
11851 sdinfo->satadrv_type = prev_device_type;
11852 sdinfo->satadrv_state = prev_device_state;
11853 }
11854 } else {
11855 /* device is gone */
11856 kmem_free(sdinfo, sizeof (sata_drive_info_t));
11857 pmportinfo->pmport_dev_type = SATA_DTYPE_NONE;
11858 SATA_PMPORTINFO_DRV_INFO(pmportinfo) = NULL;
11859 mutex_exit(&pmportinfo->pmport_mutex);
11860 return (SATA_SUCCESS);
11861 }
11862 mutex_exit(&pmportinfo->pmport_mutex);
11863 }
11864
11865 if (flag == SATA_DEV_IDENTIFY_RETRY) {
11866 clock_t cur_time = ddi_get_lbolt();
11867 /*
11868 * A device was not successfully identified or initialized.
11869 * Track retry time for device identification.
11870 */
11871 if ((cur_time - start_time) <
11872 drv_usectohz(SATA_DEV_REPROBE_TIMEOUT)) {
11873 /* sleep for a while */
11874 delay(drv_usectohz(SATA_DEV_RETRY_DLY));
11875 goto retry_probe_pmport;
11876 } else {
11877 mutex_enter(&pmportinfo->pmport_mutex);
11878 if (SATA_PMPORTINFO_DRV_INFO(pmportinfo) != NULL)
11879 SATA_PMPORTINFO_DRV_INFO(pmportinfo)->
11880 satadrv_state = SATA_DSTATE_FAILED;
11881 mutex_exit(&pmportinfo->pmport_mutex);
11882 }
11883 }
11884 return (SATA_SUCCESS);
11885 }
11886
11887 /*
11888 * Allocated related structure for a port multiplier and its device ports
11889 *
11890 * Port multiplier should be ready and probed, and related information like
11891 * the number of the device ports should be store in sata_device_t.
11892 *
11893 * NOTE: No Mutex should be hold.
11894 */
11895 static int
sata_alloc_pmult(sata_hba_inst_t * sata_hba_inst,sata_device_t * sata_device)11896 sata_alloc_pmult(sata_hba_inst_t *sata_hba_inst, sata_device_t *sata_device)
11897 {
11898 dev_info_t *dip = SATA_DIP(sata_hba_inst);
11899 sata_cport_info_t *cportinfo = NULL;
11900 sata_pmult_info_t *pmultinfo = NULL;
11901 sata_pmport_info_t *pmportinfo = NULL;
11902 sata_device_t sd;
11903 dev_t minor_number;
11904 char name[16];
11905 uint8_t cport = sata_device->satadev_addr.cport;
11906 int rval;
11907 int npmport;
11908
11909 cportinfo = SATA_CPORT_INFO(sata_hba_inst, cport);
11910
11911 /* This function might be called while a port-mult is hot-plugged. */
11912 mutex_enter(&cportinfo->cport_mutex);
11913
11914 /* dev_type's not updated when get called from sata_reprobe_port() */
11915 if (SATA_CPORTINFO_PMULT_INFO(cportinfo) == NULL) {
11916 /* Create a pmult_info structure */
11917 SATA_CPORTINFO_PMULT_INFO(cportinfo) =
11918 kmem_zalloc(sizeof (sata_pmult_info_t), KM_SLEEP);
11919 }
11920 pmultinfo = SATA_CPORTINFO_PMULT_INFO(cportinfo);
11921
11922 pmultinfo->pmult_addr = sata_device->satadev_addr;
11923 pmultinfo->pmult_addr.qual = SATA_ADDR_PMULT;
11924 pmultinfo->pmult_state = SATA_STATE_PROBING;
11925
11926 /*
11927 * Probe the port multiplier with qualifier SATA_ADDR_PMULT_SPEC,
11928 * The HBA driver should initialize and register the port multiplier,
11929 * sata_register_pmult() will fill following fields,
11930 * + sata_pmult_info.pmult_gscr
11931 * + sata_pmult_info.pmult_num_dev_ports
11932 */
11933 sd.satadev_addr = sata_device->satadev_addr;
11934 sd.satadev_addr.qual = SATA_ADDR_PMULT_SPEC;
11935 mutex_exit(&cportinfo->cport_mutex);
11936 rval = (*SATA_PROBE_PORT_FUNC(sata_hba_inst))
11937 (SATA_DIP(sata_hba_inst), &sd);
11938 mutex_enter(&cportinfo->cport_mutex);
11939
11940 if (rval != SATA_SUCCESS ||
11941 (sd.satadev_type != SATA_DTYPE_PMULT) ||
11942 !(sd.satadev_state & SATA_DSTATE_PMULT_INIT)) {
11943 SATA_CPORTINFO_PMULT_INFO(cportinfo) = NULL;
11944 kmem_free(pmultinfo, sizeof (sata_pmult_info_t));
11945 cportinfo->cport_state = SATA_PSTATE_FAILED;
11946 cportinfo->cport_dev_type = SATA_DTYPE_UNKNOWN;
11947 mutex_exit(&cportinfo->cport_mutex);
11948 SATADBG1(SATA_DBG_PMULT, sata_hba_inst,
11949 "sata_alloc_pmult: failed to initialize pmult "
11950 "at port %d.", cport)
11951 return (SATA_FAILURE);
11952 }
11953
11954 /* Initialize pmport_info structure */
11955 for (npmport = 0; npmport < pmultinfo->pmult_num_dev_ports;
11956 npmport++) {
11957
11958 /* if everything is allocated, skip */
11959 if (SATA_PMPORT_INFO(sata_hba_inst, cport, npmport) != NULL)
11960 continue;
11961
11962 pmportinfo = kmem_zalloc(sizeof (sata_pmport_info_t), KM_SLEEP);
11963 mutex_init(&pmportinfo->pmport_mutex, NULL, MUTEX_DRIVER, NULL);
11964 mutex_exit(&cportinfo->cport_mutex);
11965
11966 mutex_enter(&pmportinfo->pmport_mutex);
11967 pmportinfo->pmport_addr.cport = cport;
11968 pmportinfo->pmport_addr.pmport = (uint8_t)npmport;
11969 pmportinfo->pmport_addr.qual = SATA_ADDR_PMPORT;
11970 pmportinfo->pmport_state &= ~SATA_PORT_STATE_CLEAR_MASK;
11971 mutex_exit(&pmportinfo->pmport_mutex);
11972
11973 mutex_enter(&cportinfo->cport_mutex);
11974 SATA_PMPORT_INFO(sata_hba_inst, cport, npmport) = pmportinfo;
11975
11976 /* Create an attachment point */
11977 minor_number = SATA_MAKE_AP_MINOR(ddi_get_instance(dip),
11978 cport, (uint8_t)npmport, SATA_ADDR_PMPORT);
11979 (void) sprintf(name, "%d.%d", cport, npmport);
11980
11981 if (ddi_create_minor_node(dip, name, S_IFCHR, minor_number,
11982 DDI_NT_SATA_ATTACHMENT_POINT, 0) != DDI_SUCCESS) {
11983 sata_log(sata_hba_inst, CE_WARN, "sata_hba_attach: "
11984 "cannot create SATA attachment point for "
11985 "port %d:%d", cport, npmport);
11986 }
11987 }
11988
11989 pmultinfo->pmult_state &= ~SATA_STATE_PROBING;
11990 pmultinfo->pmult_state |= (SATA_STATE_PROBED|SATA_STATE_READY);
11991 cportinfo->cport_dev_type = SATA_DTYPE_PMULT;
11992
11993 mutex_exit(&cportinfo->cport_mutex);
11994 return (SATA_SUCCESS);
11995 }
11996
11997 /*
11998 * Free data structures when a port multiplier is removed.
11999 *
12000 * NOTE: No Mutex should be hold.
12001 */
12002 static void
sata_free_pmult(sata_hba_inst_t * sata_hba_inst,sata_device_t * sata_device)12003 sata_free_pmult(sata_hba_inst_t *sata_hba_inst, sata_device_t *sata_device)
12004 {
12005 sata_cport_info_t *cportinfo;
12006 sata_pmult_info_t *pmultinfo;
12007 sata_pmport_info_t *pmportinfo;
12008 sata_device_t pmport_device;
12009 sata_drive_info_t *sdinfo;
12010 dev_info_t *tdip;
12011 char name[16];
12012 uint8_t cport = sata_device->satadev_addr.cport;
12013 int npmport;
12014
12015 cportinfo = SATA_CPORT_INFO(sata_hba_inst, cport);
12016
12017 /* This function might be called while port-mult is hot plugged. */
12018 mutex_enter(&cportinfo->cport_mutex);
12019
12020 cportinfo->cport_dev_type = SATA_DTYPE_NONE;
12021 pmultinfo = SATA_CPORTINFO_PMULT_INFO(cportinfo);
12022 ASSERT(pmultinfo != NULL);
12023
12024 /* Free pmport_info structure */
12025 for (npmport = 0; npmport < pmultinfo->pmult_num_dev_ports;
12026 npmport++) {
12027 pmportinfo = SATA_PMPORT_INFO(sata_hba_inst, cport, npmport);
12028 if (pmportinfo == NULL)
12029 continue;
12030 mutex_exit(&cportinfo->cport_mutex);
12031
12032 mutex_enter(&pmportinfo->pmport_mutex);
12033 sdinfo = pmportinfo->pmport_sata_drive;
12034 SATA_PMPORTINFO_DRV_INFO(pmportinfo) = NULL;
12035 mutex_exit(&pmportinfo->pmport_mutex);
12036
12037 /* Remove attachment point. */
12038 name[0] = '\0';
12039 (void) sprintf(name, "%d.%d", cport, npmport);
12040 ddi_remove_minor_node(SATA_DIP(sata_hba_inst), name);
12041 sata_log(sata_hba_inst, CE_NOTE,
12042 "Remove attachment point of port %d:%d",
12043 cport, npmport);
12044
12045 /*
12046 * Rumove target node
12047 */
12048 bzero(&pmport_device, sizeof (sata_device_t));
12049 pmport_device.satadev_rev = SATA_DEVICE_REV;
12050 pmport_device.satadev_addr.cport = cport;
12051 pmport_device.satadev_addr.pmport = (uint8_t)npmport;
12052 pmport_device.satadev_addr.qual = SATA_ADDR_DPMPORT;
12053
12054 tdip = sata_get_scsi_target_dip(SATA_DIP(sata_hba_inst),
12055 &(pmport_device.satadev_addr));
12056 if (tdip != NULL && ndi_devi_offline(tdip,
12057 NDI_DEVI_REMOVE) != NDI_SUCCESS) {
12058 /*
12059 * Problem :
12060 * The target node remained attached.
12061 * This happens when the device file was open
12062 * or a node was waiting for resources.
12063 * Cannot do anything about it.
12064 */
12065 SATA_LOG_D((sata_hba_inst, CE_WARN,
12066 "sata_free_pmult: could not unconfigure device "
12067 "before disconnecting the SATA port %d:%d",
12068 cport, npmport));
12069
12070 /*
12071 * Set DEVICE REMOVED state in the target
12072 * node. It will prevent access to the device
12073 * even when a new device is attached, until
12074 * the old target node is released, removed and
12075 * recreated for a new device.
12076 */
12077 sata_set_device_removed(tdip);
12078
12079 /*
12080 * Instruct event daemon to try the target
12081 * node cleanup later.
12082 */
12083 sata_set_target_node_cleanup(
12084 sata_hba_inst, &(pmport_device.satadev_addr));
12085
12086 }
12087 mutex_enter(&cportinfo->cport_mutex);
12088
12089 /*
12090 * Add here differentiation for device attached or not
12091 */
12092 if (sdinfo != NULL) {
12093 sata_log(sata_hba_inst, CE_WARN,
12094 "SATA device detached from port %d:%d",
12095 cport, npmport);
12096 kmem_free(sdinfo, sizeof (sata_drive_info_t));
12097 }
12098
12099 mutex_destroy(&pmportinfo->pmport_mutex);
12100 kmem_free(pmportinfo, sizeof (sata_pmport_info_t));
12101 }
12102
12103 kmem_free(pmultinfo, sizeof (sata_pmult_info_t));
12104
12105 cportinfo->cport_devp.cport_sata_pmult = NULL;
12106
12107 sata_log(sata_hba_inst, CE_WARN,
12108 "SATA port multiplier detached at port %d", cport);
12109
12110 mutex_exit(&cportinfo->cport_mutex);
12111 }
12112
12113 /*
12114 * Initialize device
12115 * Specified device is initialized to a default state.
12116 *
12117 * Returns SATA_SUCCESS if all device features are set successfully,
12118 * SATA_RETRY if device is accessible but device features were not set
12119 * successfully, and SATA_FAILURE otherwise.
12120 */
12121 static int
sata_initialize_device(sata_hba_inst_t * sata_hba_inst,sata_drive_info_t * sdinfo)12122 sata_initialize_device(sata_hba_inst_t *sata_hba_inst,
12123 sata_drive_info_t *sdinfo)
12124 {
12125 int rval;
12126
12127 sata_save_drive_settings(sdinfo);
12128
12129 sdinfo->satadrv_settings |= SATA_DEV_READ_AHEAD;
12130
12131 sata_init_write_cache_mode(sdinfo);
12132
12133 rval = sata_set_drive_features(sata_hba_inst, sdinfo, 0);
12134
12135 /* Determine current data transfer mode */
12136 if ((sdinfo->satadrv_id.ai_cap & SATA_DMA_SUPPORT) == 0) {
12137 sdinfo->satadrv_settings &= ~SATA_DEV_DMA;
12138 } else if ((sdinfo->satadrv_id.ai_validinfo &
12139 SATA_VALIDINFO_88) != 0 &&
12140 (sdinfo->satadrv_id.ai_ultradma & SATA_UDMA_SEL_MASK) != 0) {
12141 sdinfo->satadrv_settings |= SATA_DEV_DMA;
12142 } else if ((sdinfo->satadrv_id.ai_dworddma &
12143 SATA_MDMA_SEL_MASK) != 0) {
12144 sdinfo->satadrv_settings |= SATA_DEV_DMA;
12145 } else
12146 /* DMA supported, not no DMA transfer mode is selected !? */
12147 sdinfo->satadrv_settings &= ~SATA_DEV_DMA;
12148
12149 if ((sdinfo->satadrv_id.ai_cmdset83 & 0x20) &&
12150 (sdinfo->satadrv_id.ai_features86 & 0x20))
12151 sdinfo->satadrv_power_level = SATA_POWER_STANDBY;
12152 else
12153 sdinfo->satadrv_power_level = SATA_POWER_ACTIVE;
12154
12155 return (rval);
12156 }
12157
12158
12159 /*
12160 * Initialize write cache mode.
12161 *
12162 * The default write cache setting for SATA HDD is provided by sata_write_cache
12163 * static variable. ATAPI CD/DVDs devices have write cache default is
12164 * determined by sata_atapicdvd_write_cache static variable.
12165 * ATAPI tape devices have write cache default is determined by
12166 * sata_atapitape_write_cache static variable.
12167 * ATAPI disk devices have write cache default is determined by
12168 * sata_atapidisk_write_cache static variable.
12169 * 1 - enable
12170 * 0 - disable
12171 * any other value - current drive setting
12172 *
12173 * Although there is not reason to disable write cache on CD/DVD devices,
12174 * tape devices and ATAPI disk devices, the default setting control is provided
12175 * for the maximun flexibility.
12176 *
12177 * In the future, it may be overridden by the
12178 * disk-write-cache-enable property setting, if it is defined.
12179 * Returns SATA_SUCCESS if all device features are set successfully,
12180 * SATA_FAILURE otherwise.
12181 */
12182 static void
sata_init_write_cache_mode(sata_drive_info_t * sdinfo)12183 sata_init_write_cache_mode(sata_drive_info_t *sdinfo)
12184 {
12185 switch (sdinfo->satadrv_type) {
12186 case SATA_DTYPE_ATADISK:
12187 if (sata_write_cache == 1)
12188 sdinfo->satadrv_settings |= SATA_DEV_WRITE_CACHE;
12189 else if (sata_write_cache == 0)
12190 sdinfo->satadrv_settings &= ~SATA_DEV_WRITE_CACHE;
12191 /*
12192 * When sata_write_cache value is not 0 or 1,
12193 * a current setting of the drive's write cache is used.
12194 */
12195 break;
12196 case SATA_DTYPE_ATAPICD:
12197 if (sata_atapicdvd_write_cache == 1)
12198 sdinfo->satadrv_settings |= SATA_DEV_WRITE_CACHE;
12199 else if (sata_atapicdvd_write_cache == 0)
12200 sdinfo->satadrv_settings &= ~SATA_DEV_WRITE_CACHE;
12201 /*
12202 * When sata_atapicdvd_write_cache value is not 0 or 1,
12203 * a current setting of the drive's write cache is used.
12204 */
12205 break;
12206 case SATA_DTYPE_ATAPITAPE:
12207 if (sata_atapitape_write_cache == 1)
12208 sdinfo->satadrv_settings |= SATA_DEV_WRITE_CACHE;
12209 else if (sata_atapitape_write_cache == 0)
12210 sdinfo->satadrv_settings &= ~SATA_DEV_WRITE_CACHE;
12211 /*
12212 * When sata_atapitape_write_cache value is not 0 or 1,
12213 * a current setting of the drive's write cache is used.
12214 */
12215 break;
12216 case SATA_DTYPE_ATAPIDISK:
12217 if (sata_atapidisk_write_cache == 1)
12218 sdinfo->satadrv_settings |= SATA_DEV_WRITE_CACHE;
12219 else if (sata_atapidisk_write_cache == 0)
12220 sdinfo->satadrv_settings &= ~SATA_DEV_WRITE_CACHE;
12221 /*
12222 * When sata_atapidisk_write_cache value is not 0 or 1,
12223 * a current setting of the drive's write cache is used.
12224 */
12225 break;
12226 }
12227 }
12228
12229
12230 /*
12231 * Validate sata address.
12232 * Specified cport, pmport and qualifier has to match
12233 * passed sata_scsi configuration info.
12234 * The presence of an attached device is not verified.
12235 *
12236 * Returns 0 when address is valid, -1 otherwise.
12237 */
12238 static int
sata_validate_sata_address(sata_hba_inst_t * sata_hba_inst,int cport,int pmport,int qual)12239 sata_validate_sata_address(sata_hba_inst_t *sata_hba_inst, int cport,
12240 int pmport, int qual)
12241 {
12242 if (qual == SATA_ADDR_DCPORT && pmport != 0)
12243 goto invalid_address;
12244 if (cport >= SATA_NUM_CPORTS(sata_hba_inst))
12245 goto invalid_address;
12246 if ((qual == SATA_ADDR_DPMPORT || qual == SATA_ADDR_PMPORT) &&
12247 ((SATA_CPORT_DEV_TYPE(sata_hba_inst, cport) != SATA_DTYPE_PMULT) ||
12248 (SATA_PMULT_INFO(sata_hba_inst, cport) == NULL) ||
12249 (pmport >= SATA_NUM_PMPORTS(sata_hba_inst, cport))))
12250 goto invalid_address;
12251
12252 return (0);
12253
12254 invalid_address:
12255 return (-1);
12256
12257 }
12258
12259 /*
12260 * Validate scsi address
12261 * SCSI target address is translated into SATA cport/pmport and compared
12262 * with a controller port/device configuration. LUN has to be 0.
12263 * Returns 0 if a scsi target refers to an attached device,
12264 * returns 1 if address is valid but no valid device is attached,
12265 * returns 2 if address is valid but device type is unknown (not valid device),
12266 * returns -1 if bad address or device is of an unsupported type.
12267 * Upon return sata_device argument is set.
12268 *
12269 * Port multiplier is supported now.
12270 */
12271 static int
sata_validate_scsi_address(sata_hba_inst_t * sata_hba_inst,struct scsi_address * ap,sata_device_t * sata_device)12272 sata_validate_scsi_address(sata_hba_inst_t *sata_hba_inst,
12273 struct scsi_address *ap, sata_device_t *sata_device)
12274 {
12275 int cport, pmport, qual, rval;
12276
12277 rval = -1; /* Invalid address */
12278 if (ap->a_lun != 0)
12279 goto out;
12280
12281 qual = SCSI_TO_SATA_ADDR_QUAL(ap->a_target);
12282 cport = SCSI_TO_SATA_CPORT(ap->a_target);
12283 pmport = SCSI_TO_SATA_PMPORT(ap->a_target);
12284
12285 if (qual != SATA_ADDR_DCPORT && qual != SATA_ADDR_DPMPORT)
12286 goto out;
12287
12288 if (sata_validate_sata_address(sata_hba_inst, cport, pmport, qual) ==
12289 0) {
12290
12291 sata_cport_info_t *cportinfo;
12292 sata_pmult_info_t *pmultinfo;
12293 sata_drive_info_t *sdinfo = NULL;
12294
12295 sata_device->satadev_addr.qual = qual;
12296 sata_device->satadev_addr.cport = cport;
12297 sata_device->satadev_addr.pmport = pmport;
12298 sata_device->satadev_rev = SATA_DEVICE_REV_1;
12299
12300 rval = 1; /* Valid sata address */
12301
12302 cportinfo = SATA_CPORT_INFO(sata_hba_inst, cport);
12303 if (qual == SATA_ADDR_DCPORT) {
12304 if (cportinfo == NULL ||
12305 cportinfo->cport_dev_type == SATA_DTYPE_NONE)
12306 goto out;
12307
12308 sdinfo = SATA_CPORTINFO_DRV_INFO(cportinfo);
12309 if (cportinfo->cport_dev_type == SATA_DTYPE_UNKNOWN &&
12310 sdinfo != NULL) {
12311 rval = 2;
12312 goto out;
12313 }
12314
12315 if ((cportinfo->cport_dev_type &
12316 SATA_VALID_DEV_TYPE) == 0) {
12317 rval = -1;
12318 goto out;
12319 }
12320
12321 } else if (qual == SATA_ADDR_DPMPORT) {
12322 pmultinfo = SATA_CPORTINFO_PMULT_INFO(cportinfo);
12323 if (pmultinfo == NULL) {
12324 rval = -1;
12325 goto out;
12326 }
12327 if (SATA_PMPORT_INFO(sata_hba_inst, cport, pmport) ==
12328 NULL ||
12329 SATA_PMPORT_DEV_TYPE(sata_hba_inst, cport,
12330 pmport) == SATA_DTYPE_NONE)
12331 goto out;
12332
12333 sdinfo = SATA_PMPORT_DRV_INFO(sata_hba_inst, cport,
12334 pmport);
12335 if (SATA_PMPORT_DEV_TYPE(sata_hba_inst, cport,
12336 pmport) == SATA_DTYPE_UNKNOWN && sdinfo != NULL) {
12337 rval = 2;
12338 goto out;
12339 }
12340
12341 if ((SATA_PMPORT_DEV_TYPE(sata_hba_inst, cport,
12342 pmport) & SATA_VALID_DEV_TYPE) == 0) {
12343 rval = -1;
12344 goto out;
12345 }
12346
12347 } else {
12348 rval = -1;
12349 goto out;
12350 }
12351 if ((sdinfo == NULL) ||
12352 (sdinfo->satadrv_type & SATA_VALID_DEV_TYPE) == 0)
12353 goto out;
12354
12355 sata_device->satadev_type = sdinfo->satadrv_type;
12356
12357 return (0);
12358 }
12359 out:
12360 if (rval > 0) {
12361 SATADBG2(SATA_DBG_SCSI_IF, sata_hba_inst,
12362 "sata_validate_scsi_address: no valid target %x lun %x",
12363 ap->a_target, ap->a_lun);
12364 }
12365 return (rval);
12366 }
12367
12368 /*
12369 * Find dip corresponding to passed device number
12370 *
12371 * Returns NULL if invalid device number is passed or device cannot be found,
12372 * Returns dip is device is found.
12373 */
12374 static dev_info_t *
sata_devt_to_devinfo(dev_t dev)12375 sata_devt_to_devinfo(dev_t dev)
12376 {
12377 dev_info_t *dip;
12378 #ifndef __lock_lint
12379 struct devnames *dnp;
12380 major_t major = getmajor(dev);
12381 int instance = SATA_MINOR2INSTANCE(getminor(dev));
12382
12383 if (major >= devcnt)
12384 return (NULL);
12385
12386 dnp = &devnamesp[major];
12387 LOCK_DEV_OPS(&(dnp->dn_lock));
12388 dip = dnp->dn_head;
12389 while (dip && (ddi_get_instance(dip) != instance)) {
12390 dip = ddi_get_next(dip);
12391 }
12392 UNLOCK_DEV_OPS(&(dnp->dn_lock));
12393 #endif
12394
12395 return (dip);
12396 }
12397
12398
12399 /*
12400 * Probe device.
12401 * This function issues Identify Device command and initializes local
12402 * sata_drive_info structure if the device can be identified.
12403 * The device type is determined by examining Identify Device
12404 * command response.
12405 * If the sata_hba_inst has linked drive info structure for this
12406 * device address, the Identify Device data is stored into sata_drive_info
12407 * structure linked to the port info structure.
12408 *
12409 * sata_device has to refer to the valid sata port(s) for HBA described
12410 * by sata_hba_inst structure.
12411 *
12412 * Returns:
12413 * SATA_SUCCESS if device type was successfully probed and port-linked
12414 * drive info structure was updated;
12415 * SATA_FAILURE if there is no device, or device was not probed
12416 * successully;
12417 * SATA_RETRY if device probe can be retried later.
12418 * If a device cannot be identified, sata_device's dev_state and dev_type
12419 * fields are set to unknown.
12420 * There are no retries in this function. Any retries should be managed by
12421 * the caller.
12422 */
12423
12424
12425 static int
sata_probe_device(sata_hba_inst_t * sata_hba_inst,sata_device_t * sata_device)12426 sata_probe_device(sata_hba_inst_t *sata_hba_inst, sata_device_t *sata_device)
12427 {
12428 sata_pmport_info_t *pmportinfo;
12429 sata_drive_info_t *sdinfo;
12430 sata_drive_info_t new_sdinfo; /* local drive info struct */
12431 int rval;
12432
12433 ASSERT((SATA_CPORT_STATE(sata_hba_inst,
12434 sata_device->satadev_addr.cport) &
12435 (SATA_STATE_PROBED | SATA_STATE_READY)) != 0);
12436
12437 sata_device->satadev_type = SATA_DTYPE_NONE;
12438
12439 mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst,
12440 sata_device->satadev_addr.cport)));
12441
12442 if (sata_device->satadev_addr.qual == SATA_ADDR_DPMPORT) {
12443 pmportinfo = SATA_PMPORT_INFO(sata_hba_inst,
12444 sata_device->satadev_addr.cport,
12445 sata_device->satadev_addr.pmport);
12446 ASSERT(pmportinfo != NULL);
12447 }
12448
12449 /* Get pointer to port-linked sata device info structure */
12450 sdinfo = sata_get_device_info(sata_hba_inst, sata_device);
12451 if (sdinfo != NULL) {
12452 sdinfo->satadrv_state &=
12453 ~(SATA_STATE_PROBED | SATA_STATE_READY);
12454 sdinfo->satadrv_state |= SATA_STATE_PROBING;
12455 } else {
12456 /* No device to probe */
12457 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
12458 sata_device->satadev_addr.cport)));
12459 sata_device->satadev_type = SATA_DTYPE_NONE;
12460 sata_device->satadev_state = SATA_STATE_UNKNOWN;
12461 return (SATA_FAILURE);
12462 }
12463 /*
12464 * Need to issue both types of identify device command and
12465 * determine device type by examining retreived data/status.
12466 * First, ATA Identify Device.
12467 */
12468 bzero(&new_sdinfo, sizeof (sata_drive_info_t));
12469 new_sdinfo.satadrv_addr = sata_device->satadev_addr;
12470 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
12471 sata_device->satadev_addr.cport)));
12472 new_sdinfo.satadrv_type = SATA_DTYPE_ATADISK;
12473 rval = sata_identify_device(sata_hba_inst, &new_sdinfo);
12474 if (rval == SATA_RETRY) {
12475 /* We may try to check for ATAPI device */
12476 if (SATA_FEATURES(sata_hba_inst) & SATA_CTLF_ATAPI) {
12477 /*
12478 * HBA supports ATAPI - try to issue Identify Packet
12479 * Device command.
12480 */
12481 new_sdinfo.satadrv_type = SATA_DTYPE_ATAPI;
12482 rval = sata_identify_device(sata_hba_inst, &new_sdinfo);
12483 }
12484 }
12485 if (rval == SATA_SUCCESS) {
12486 /*
12487 * Got something responding positively to ATA Identify Device
12488 * or to Identify Packet Device cmd.
12489 * Save last used device type.
12490 */
12491 sata_device->satadev_type = new_sdinfo.satadrv_type;
12492
12493 /* save device info, if possible */
12494 mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst,
12495 sata_device->satadev_addr.cport)));
12496 sdinfo = sata_get_device_info(sata_hba_inst, sata_device);
12497 if (sdinfo == NULL) {
12498 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
12499 sata_device->satadev_addr.cport)));
12500 return (SATA_FAILURE);
12501 }
12502 /*
12503 * Copy drive info into the port-linked drive info structure.
12504 */
12505 *sdinfo = new_sdinfo;
12506 sdinfo->satadrv_state &= ~SATA_STATE_PROBING;
12507 sdinfo->satadrv_state |= SATA_STATE_PROBED;
12508 if (sata_device->satadev_addr.qual == SATA_ADDR_DCPORT)
12509 SATA_CPORT_DEV_TYPE(sata_hba_inst,
12510 sata_device->satadev_addr.cport) =
12511 sdinfo->satadrv_type;
12512 else { /* SATA_ADDR_DPMPORT */
12513 mutex_enter(&pmportinfo->pmport_mutex);
12514 SATA_PMPORT_DEV_TYPE(sata_hba_inst,
12515 sata_device->satadev_addr.cport,
12516 sata_device->satadev_addr.pmport) =
12517 sdinfo->satadrv_type;
12518 mutex_exit(&pmportinfo->pmport_mutex);
12519 }
12520 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
12521 sata_device->satadev_addr.cport)));
12522 return (SATA_SUCCESS);
12523 }
12524
12525 /*
12526 * It may be SATA_RETRY or SATA_FAILURE return.
12527 * Looks like we cannot determine the device type at this time.
12528 */
12529 mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst,
12530 sata_device->satadev_addr.cport)));
12531 sdinfo = sata_get_device_info(sata_hba_inst, sata_device);
12532 if (sdinfo != NULL) {
12533 sata_device->satadev_type = SATA_DTYPE_UNKNOWN;
12534 sdinfo->satadrv_type = SATA_DTYPE_UNKNOWN;
12535 sdinfo->satadrv_state &= ~SATA_STATE_PROBING;
12536 sdinfo->satadrv_state |= SATA_STATE_PROBED;
12537 if (sata_device->satadev_addr.qual == SATA_ADDR_DCPORT)
12538 SATA_CPORT_DEV_TYPE(sata_hba_inst,
12539 sata_device->satadev_addr.cport) =
12540 SATA_DTYPE_UNKNOWN;
12541 else {
12542 /* SATA_ADDR_DPMPORT */
12543 mutex_enter(&pmportinfo->pmport_mutex);
12544 if ((SATA_PMULT_INFO(sata_hba_inst,
12545 sata_device->satadev_addr.cport) != NULL) &&
12546 (SATA_PMPORT_INFO(sata_hba_inst,
12547 sata_device->satadev_addr.cport,
12548 sata_device->satadev_addr.pmport) != NULL))
12549 SATA_PMPORT_DEV_TYPE(sata_hba_inst,
12550 sata_device->satadev_addr.cport,
12551 sata_device->satadev_addr.pmport) =
12552 SATA_DTYPE_UNKNOWN;
12553 mutex_exit(&pmportinfo->pmport_mutex);
12554 }
12555 }
12556 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
12557 sata_device->satadev_addr.cport)));
12558 return (rval);
12559 }
12560
12561
12562 /*
12563 * Get pointer to sata_drive_info structure.
12564 *
12565 * The sata_device has to contain address (cport, pmport and qualifier) for
12566 * specified sata_scsi structure.
12567 *
12568 * Returns NULL if device address is not valid for this HBA configuration.
12569 * Otherwise, returns a pointer to sata_drive_info structure.
12570 *
12571 * This function should be called with a port mutex held.
12572 */
12573 static sata_drive_info_t *
sata_get_device_info(sata_hba_inst_t * sata_hba_inst,sata_device_t * sata_device)12574 sata_get_device_info(sata_hba_inst_t *sata_hba_inst,
12575 sata_device_t *sata_device)
12576 {
12577 uint8_t cport = sata_device->satadev_addr.cport;
12578 uint8_t pmport = sata_device->satadev_addr.pmport;
12579 uint8_t qual = sata_device->satadev_addr.qual;
12580
12581 if (cport >= SATA_NUM_CPORTS(sata_hba_inst))
12582 return (NULL);
12583
12584 if (!(SATA_CPORT_STATE(sata_hba_inst, cport) &
12585 (SATA_STATE_PROBED | SATA_STATE_READY)))
12586 /* Port not probed yet */
12587 return (NULL);
12588
12589 if (SATA_CPORT_DEV_TYPE(sata_hba_inst, cport) == SATA_DTYPE_NONE)
12590 return (NULL);
12591
12592 if (qual == SATA_ADDR_DCPORT) {
12593 /* Request for a device on a controller port */
12594 if (SATA_CPORT_DEV_TYPE(sata_hba_inst, cport) ==
12595 SATA_DTYPE_PMULT)
12596 /* Port multiplier attached */
12597 return (NULL);
12598 return (SATA_CPORT_DRV_INFO(sata_hba_inst, cport));
12599 }
12600 if (qual == SATA_ADDR_DPMPORT) {
12601 if (SATA_CPORT_DEV_TYPE(sata_hba_inst, cport) !=
12602 SATA_DTYPE_PMULT)
12603 return (NULL);
12604
12605 if (pmport > SATA_NUM_PMPORTS(sata_hba_inst, cport))
12606 return (NULL);
12607
12608 if (!(SATA_PMPORT_STATE(sata_hba_inst, cport, pmport) &
12609 (SATA_STATE_PROBED | SATA_STATE_READY)))
12610 /* Port multiplier port not probed yet */
12611 return (NULL);
12612
12613 return (SATA_PMPORT_DRV_INFO(sata_hba_inst, cport, pmport));
12614 }
12615
12616 /* we should not get here */
12617 return (NULL);
12618 }
12619
12620
12621 /*
12622 * sata_identify_device.
12623 * Send Identify Device command to SATA HBA driver.
12624 * If command executes successfully, update sata_drive_info structure pointed
12625 * to by sdinfo argument, including Identify Device data.
12626 * If command fails, invalidate data in sata_drive_info.
12627 *
12628 * Cannot be called from interrupt level.
12629 *
12630 * Returns:
12631 * SATA_SUCCESS if the device was identified as a supported device,
12632 * SATA_RETRY if the device was not identified but could be retried,
12633 * SATA_FAILURE if the device was not identified and identify attempt
12634 * should not be retried.
12635 */
12636 static int
sata_identify_device(sata_hba_inst_t * sata_hba_inst,sata_drive_info_t * sdinfo)12637 sata_identify_device(sata_hba_inst_t *sata_hba_inst,
12638 sata_drive_info_t *sdinfo)
12639 {
12640 uint16_t cfg_word;
12641 int rval;
12642
12643 /* fetch device identify data */
12644 if ((rval = sata_fetch_device_identify_data(sata_hba_inst,
12645 sdinfo)) != SATA_SUCCESS)
12646 goto fail_unknown;
12647
12648 cfg_word = sdinfo->satadrv_id.ai_config;
12649
12650 /* Set the correct device type */
12651 if ((cfg_word & SATA_ATA_TYPE_MASK) == SATA_ATA_TYPE) {
12652 sdinfo->satadrv_type = SATA_DTYPE_ATADISK;
12653 } else if (cfg_word == SATA_CFA_TYPE) {
12654 /* It's a Compact Flash media via CF-to-SATA HDD adapter */
12655 sdinfo->satadrv_type = SATA_DTYPE_ATADISK;
12656 } else if ((cfg_word & SATA_ATAPI_TYPE_MASK) == SATA_ATAPI_TYPE) {
12657 switch (cfg_word & SATA_ATAPI_ID_DEV_TYPE) {
12658 case SATA_ATAPI_CDROM_DEV:
12659 sdinfo->satadrv_type = SATA_DTYPE_ATAPICD;
12660 break;
12661 case SATA_ATAPI_SQACC_DEV:
12662 sdinfo->satadrv_type = SATA_DTYPE_ATAPITAPE;
12663 break;
12664 case SATA_ATAPI_DIRACC_DEV:
12665 sdinfo->satadrv_type = SATA_DTYPE_ATAPIDISK;
12666 break;
12667 case SATA_ATAPI_PROC_DEV:
12668 sdinfo->satadrv_type = SATA_DTYPE_ATAPIPROC;
12669 break;
12670 default:
12671 sdinfo->satadrv_type = SATA_DTYPE_UNKNOWN;
12672 }
12673 } else {
12674 sdinfo->satadrv_type = SATA_DTYPE_UNKNOWN;
12675 }
12676
12677 if (sdinfo->satadrv_type == SATA_DTYPE_ATADISK) {
12678 if (sdinfo->satadrv_capacity == 0) {
12679 /* Non-LBA disk. Too bad... */
12680 sata_log(sata_hba_inst, CE_WARN,
12681 "SATA disk device at port %d does not support LBA",
12682 sdinfo->satadrv_addr.cport);
12683 rval = SATA_FAILURE;
12684 goto fail_unknown;
12685 }
12686 }
12687 #if 0
12688 /* Left for historical reason */
12689 /*
12690 * Some initial version of SATA spec indicated that at least
12691 * UDMA mode 4 has to be supported. It is not metioned in
12692 * SerialATA 2.6, so this restriction is removed.
12693 */
12694 /* Check for Ultra DMA modes 6 through 0 being supported */
12695 for (i = 6; i >= 0; --i) {
12696 if (sdinfo->satadrv_id.ai_ultradma & (1 << i))
12697 break;
12698 }
12699
12700 /*
12701 * At least UDMA 4 mode has to be supported. If mode 4 or
12702 * higher are not supported by the device, fail this
12703 * device.
12704 */
12705 if (i < 4) {
12706 /* No required Ultra DMA mode supported */
12707 sata_log(sata_hba_inst, CE_WARN,
12708 "SATA disk device at port %d does not support UDMA "
12709 "mode 4 or higher", sdinfo->satadrv_addr.cport);
12710 SATA_LOG_D((sata_hba_inst, CE_WARN,
12711 "mode 4 or higher required, %d supported", i));
12712 rval = SATA_FAILURE;
12713 goto fail_unknown;
12714 }
12715 #endif
12716
12717 /*
12718 * For Disk devices, if it doesn't support UDMA mode, we would
12719 * like to return failure directly.
12720 */
12721 if ((sdinfo->satadrv_type == SATA_DTYPE_ATADISK) &&
12722 !((sdinfo->satadrv_id.ai_validinfo & SATA_VALIDINFO_88) != 0 &&
12723 (sdinfo->satadrv_id.ai_ultradma & SATA_UDMA_SUP_MASK) != 0)) {
12724 sata_log(sata_hba_inst, CE_WARN,
12725 "SATA disk device at port %d does not support UDMA",
12726 sdinfo->satadrv_addr.cport);
12727 rval = SATA_FAILURE;
12728 goto fail_unknown;
12729 }
12730
12731 return (SATA_SUCCESS);
12732
12733 fail_unknown:
12734 /* Invalidate sata_drive_info ? */
12735 sdinfo->satadrv_type = SATA_DTYPE_UNKNOWN;
12736 sdinfo->satadrv_state = SATA_STATE_UNKNOWN;
12737 return (rval);
12738 }
12739
12740 /*
12741 * Log/display device information
12742 */
12743 static void
sata_show_drive_info(sata_hba_inst_t * sata_hba_inst,sata_drive_info_t * sdinfo)12744 sata_show_drive_info(sata_hba_inst_t *sata_hba_inst,
12745 sata_drive_info_t *sdinfo)
12746 {
12747 int valid_version;
12748 char msg_buf[MAXPATHLEN];
12749 int i;
12750
12751 /* Show HBA path */
12752 (void) ddi_pathname(SATA_DIP(sata_hba_inst), msg_buf);
12753
12754 cmn_err(CE_CONT, "?%s :\n", msg_buf);
12755
12756 switch (sdinfo->satadrv_type) {
12757 case SATA_DTYPE_ATADISK:
12758 (void) sprintf(msg_buf, "SATA disk device at");
12759 break;
12760
12761 case SATA_DTYPE_ATAPICD:
12762 (void) sprintf(msg_buf, "SATA CD/DVD (ATAPI) device at");
12763 break;
12764
12765 case SATA_DTYPE_ATAPITAPE:
12766 (void) sprintf(msg_buf, "SATA tape (ATAPI) device at");
12767 break;
12768
12769 case SATA_DTYPE_ATAPIDISK:
12770 (void) sprintf(msg_buf, "SATA disk (ATAPI) device at");
12771 break;
12772
12773 case SATA_DTYPE_ATAPIPROC:
12774 (void) sprintf(msg_buf, "SATA processor (ATAPI) device at");
12775 break;
12776
12777 case SATA_DTYPE_UNKNOWN:
12778 (void) sprintf(msg_buf,
12779 "Unsupported SATA device type (cfg 0x%x) at ",
12780 sdinfo->satadrv_id.ai_config);
12781 break;
12782 }
12783
12784 if (sdinfo->satadrv_addr.qual == SATA_ADDR_DCPORT)
12785 cmn_err(CE_CONT, "?\t%s port %d\n",
12786 msg_buf, sdinfo->satadrv_addr.cport);
12787 else
12788 cmn_err(CE_CONT, "?\t%s port %d:%d\n",
12789 msg_buf, sdinfo->satadrv_addr.cport,
12790 sdinfo->satadrv_addr.pmport);
12791
12792 bcopy(&sdinfo->satadrv_id.ai_model, msg_buf,
12793 sizeof (sdinfo->satadrv_id.ai_model));
12794 swab(msg_buf, msg_buf, sizeof (sdinfo->satadrv_id.ai_model));
12795 msg_buf[sizeof (sdinfo->satadrv_id.ai_model)] = '\0';
12796 cmn_err(CE_CONT, "?\tmodel %s\n", msg_buf);
12797
12798 bcopy(&sdinfo->satadrv_id.ai_fw, msg_buf,
12799 sizeof (sdinfo->satadrv_id.ai_fw));
12800 swab(msg_buf, msg_buf, sizeof (sdinfo->satadrv_id.ai_fw));
12801 msg_buf[sizeof (sdinfo->satadrv_id.ai_fw)] = '\0';
12802 cmn_err(CE_CONT, "?\tfirmware %s\n", msg_buf);
12803
12804 bcopy(&sdinfo->satadrv_id.ai_drvser, msg_buf,
12805 sizeof (sdinfo->satadrv_id.ai_drvser));
12806 swab(msg_buf, msg_buf, sizeof (sdinfo->satadrv_id.ai_drvser));
12807 msg_buf[sizeof (sdinfo->satadrv_id.ai_drvser)] = '\0';
12808 if (sdinfo->satadrv_type == SATA_DTYPE_ATADISK) {
12809 cmn_err(CE_CONT, "?\tserial number %s\n", msg_buf);
12810 } else {
12811 /*
12812 * Some drives do not implement serial number and may
12813 * violate the spec by providing spaces rather than zeros
12814 * in serial number field. Scan the buffer to detect it.
12815 */
12816 for (i = 0; i < sizeof (sdinfo->satadrv_id.ai_drvser); i++) {
12817 if (msg_buf[i] != '\0' && msg_buf[i] != ' ')
12818 break;
12819 }
12820 if (i == sizeof (sdinfo->satadrv_id.ai_drvser)) {
12821 cmn_err(CE_CONT, "?\tserial number - none\n");
12822 } else {
12823 cmn_err(CE_CONT, "?\tserial number %s\n", msg_buf);
12824 }
12825 }
12826
12827 #ifdef SATA_DEBUG
12828 if (sdinfo->satadrv_id.ai_majorversion != 0 &&
12829 sdinfo->satadrv_id.ai_majorversion != 0xffff) {
12830 int i;
12831 for (i = 14; i >= 2; i--) {
12832 if (sdinfo->satadrv_id.ai_majorversion & (1 << i)) {
12833 valid_version = i;
12834 break;
12835 }
12836 }
12837 cmn_err(CE_CONT,
12838 "?\tATA/ATAPI-%d supported, majver 0x%x minver 0x%x\n",
12839 valid_version,
12840 sdinfo->satadrv_id.ai_majorversion,
12841 sdinfo->satadrv_id.ai_minorversion);
12842 }
12843 #endif
12844 /* Log some info */
12845 cmn_err(CE_CONT, "?\tsupported features:\n");
12846 msg_buf[0] = '\0';
12847 if (sdinfo->satadrv_type == SATA_DTYPE_ATADISK) {
12848 if (sdinfo->satadrv_features_support & SATA_DEV_F_LBA48)
12849 (void) strlcat(msg_buf, "48-bit LBA, ", MAXPATHLEN);
12850 else if (sdinfo->satadrv_features_support & SATA_DEV_F_LBA28)
12851 (void) strlcat(msg_buf, "28-bit LBA, ", MAXPATHLEN);
12852 }
12853 if (sdinfo->satadrv_features_support & SATA_DEV_F_DMA)
12854 (void) strlcat(msg_buf, "DMA", MAXPATHLEN);
12855 if (sdinfo->satadrv_features_support & SATA_DEV_F_NCQ)
12856 (void) strlcat(msg_buf, ", Native Command Queueing",
12857 MAXPATHLEN);
12858 if (sdinfo->satadrv_features_support & SATA_DEV_F_TCQ)
12859 (void) strlcat(msg_buf, ", Legacy Tagged Queuing", MAXPATHLEN);
12860 if ((sdinfo->satadrv_id.ai_cmdset82 & SATA_SMART_SUPPORTED) &&
12861 (sdinfo->satadrv_id.ai_features85 & SATA_SMART_ENABLED))
12862 (void) strlcat(msg_buf, ", SMART", MAXPATHLEN);
12863 if ((sdinfo->satadrv_id.ai_cmdset84 & SATA_SMART_SELF_TEST_SUPPORTED) &&
12864 (sdinfo->satadrv_id.ai_features87 & SATA_SMART_SELF_TEST_SUPPORTED))
12865 (void) strlcat(msg_buf, ", SMART self-test", MAXPATHLEN);
12866 cmn_err(CE_CONT, "?\t %s\n", msg_buf);
12867 if (sdinfo->satadrv_features_support & SATA_DEV_F_SATA3)
12868 cmn_err(CE_CONT, "?\tSATA Gen3 signaling speed (6.0Gbps)\n");
12869 else if (sdinfo->satadrv_features_support & SATA_DEV_F_SATA2)
12870 cmn_err(CE_CONT, "?\tSATA Gen2 signaling speed (3.0Gbps)\n");
12871 else if (sdinfo->satadrv_features_support & SATA_DEV_F_SATA1)
12872 cmn_err(CE_CONT, "?\tSATA Gen1 signaling speed (1.5Gbps)\n");
12873 if (sdinfo->satadrv_features_support &
12874 (SATA_DEV_F_TCQ | SATA_DEV_F_NCQ)) {
12875 msg_buf[0] = '\0';
12876 (void) snprintf(msg_buf, MAXPATHLEN,
12877 "Supported queue depth %d",
12878 sdinfo->satadrv_queue_depth);
12879 if (!(sata_func_enable &
12880 (SATA_ENABLE_QUEUING | SATA_ENABLE_NCQ)))
12881 (void) strlcat(msg_buf,
12882 " - queueing disabled globally", MAXPATHLEN);
12883 else if (sdinfo->satadrv_queue_depth >
12884 sdinfo->satadrv_max_queue_depth) {
12885 (void) snprintf(&msg_buf[strlen(msg_buf)],
12886 MAXPATHLEN - strlen(msg_buf), ", limited to %d",
12887 (int)sdinfo->satadrv_max_queue_depth);
12888 }
12889 cmn_err(CE_CONT, "?\t%s\n", msg_buf);
12890 }
12891
12892 if (sdinfo->satadrv_type == SATA_DTYPE_ATADISK) {
12893 #ifdef __i386
12894 (void) sprintf(msg_buf, "\tcapacity = %llu sectors\n",
12895 sdinfo->satadrv_capacity);
12896 #else
12897 (void) sprintf(msg_buf, "\tcapacity = %lu sectors\n",
12898 sdinfo->satadrv_capacity);
12899 #endif
12900 cmn_err(CE_CONT, "?%s", msg_buf);
12901 }
12902 }
12903
12904 /*
12905 * Log/display port multiplier information
12906 * No Mutex should be hold.
12907 */
12908 static void
sata_show_pmult_info(sata_hba_inst_t * sata_hba_inst,sata_device_t * sata_device)12909 sata_show_pmult_info(sata_hba_inst_t *sata_hba_inst,
12910 sata_device_t *sata_device)
12911 {
12912 _NOTE(ARGUNUSED(sata_hba_inst))
12913
12914 int cport = sata_device->satadev_addr.cport;
12915 sata_pmult_info_t *pmultinfo;
12916 char msg_buf[MAXPATHLEN];
12917 uint32_t gscr0, gscr1, gscr2, gscr64;
12918
12919 mutex_enter(&SATA_CPORT_MUTEX(sata_hba_inst, cport));
12920 pmultinfo = SATA_PMULT_INFO(sata_hba_inst, cport);
12921 if (pmultinfo == NULL) {
12922 mutex_exit(&SATA_CPORT_MUTEX(sata_hba_inst, cport));
12923 return;
12924 }
12925
12926 gscr0 = pmultinfo->pmult_gscr.gscr0;
12927 gscr1 = pmultinfo->pmult_gscr.gscr1;
12928 gscr2 = pmultinfo->pmult_gscr.gscr2;
12929 gscr64 = pmultinfo->pmult_gscr.gscr64;
12930 mutex_exit(&SATA_CPORT_MUTEX(sata_hba_inst, cport));
12931
12932 cmn_err(CE_CONT, "?Port Multiplier %d device-ports found at port %d",
12933 sata_device->satadev_add_info, sata_device->satadev_addr.cport);
12934
12935 (void) sprintf(msg_buf, "\tVendor_ID 0x%04x, Module_ID 0x%04x",
12936 gscr0 & 0xffff, (gscr0 >> 16) & 0xffff);
12937 cmn_err(CE_CONT, "?%s", msg_buf);
12938
12939 (void) strcpy(msg_buf, "\tSupport SATA PMP Spec ");
12940 if (gscr1 & (1 << 3))
12941 (void) strlcat(msg_buf, "1.2", MAXPATHLEN);
12942 else if (gscr1 & (1 << 2))
12943 (void) strlcat(msg_buf, "1.1", MAXPATHLEN);
12944 else if (gscr1 & (1 << 1))
12945 (void) strlcat(msg_buf, "1.0", MAXPATHLEN);
12946 else
12947 (void) strlcat(msg_buf, "unknown", MAXPATHLEN);
12948 cmn_err(CE_CONT, "?%s", msg_buf);
12949
12950 (void) strcpy(msg_buf, "\tSupport ");
12951 if (gscr64 & (1 << 3))
12952 (void) strlcat(msg_buf, "Asy-Notif, ",
12953 MAXPATHLEN);
12954 if (gscr64 & (1 << 2))
12955 (void) strlcat(msg_buf, "Dyn-SSC, ", MAXPATHLEN);
12956 if (gscr64 & (1 << 1))
12957 (void) strlcat(msg_buf, "Iss-PMREQ, ", MAXPATHLEN);
12958 if (gscr64 & (1 << 0))
12959 (void) strlcat(msg_buf, "BIST", MAXPATHLEN);
12960 if ((gscr64 & 0xf) == 0)
12961 (void) strlcat(msg_buf, "nothing", MAXPATHLEN);
12962 cmn_err(CE_CONT, "?%s", msg_buf);
12963
12964 (void) sprintf(msg_buf, "\tNumber of exposed device fan-out ports: %d",
12965 gscr2 & SATA_PMULT_PORTNUM_MASK);
12966 cmn_err(CE_CONT, "?%s", msg_buf);
12967 }
12968
12969 /*
12970 * sata_save_drive_settings extracts current setting of the device and stores
12971 * it for future reference, in case the device setup would need to be restored
12972 * after the device reset.
12973 *
12974 * For all devices read ahead and write cache settings are saved, if the
12975 * device supports these features at all.
12976 * For ATAPI devices the Removable Media Status Notification setting is saved.
12977 */
12978 static void
sata_save_drive_settings(sata_drive_info_t * sdinfo)12979 sata_save_drive_settings(sata_drive_info_t *sdinfo)
12980 {
12981 if (SATA_READ_AHEAD_SUPPORTED(sdinfo->satadrv_id) ||
12982 SATA_WRITE_CACHE_SUPPORTED(sdinfo->satadrv_id)) {
12983
12984 /* Current setting of Read Ahead (and Read Cache) */
12985 if (SATA_READ_AHEAD_ENABLED(sdinfo->satadrv_id))
12986 sdinfo->satadrv_settings |= SATA_DEV_READ_AHEAD;
12987 else
12988 sdinfo->satadrv_settings &= ~SATA_DEV_READ_AHEAD;
12989
12990 /* Current setting of Write Cache */
12991 if (SATA_WRITE_CACHE_ENABLED(sdinfo->satadrv_id))
12992 sdinfo->satadrv_settings |= SATA_DEV_WRITE_CACHE;
12993 else
12994 sdinfo->satadrv_settings &= ~SATA_DEV_WRITE_CACHE;
12995 }
12996
12997 if (sdinfo->satadrv_type == SATA_DTYPE_ATAPICD) {
12998 if (SATA_RM_NOTIFIC_SUPPORTED(sdinfo->satadrv_id))
12999 sdinfo->satadrv_settings |= SATA_DEV_RMSN;
13000 else
13001 sdinfo->satadrv_settings &= ~SATA_DEV_RMSN;
13002 }
13003 }
13004
13005
13006 /*
13007 * sata_check_capacity function determines a disk capacity
13008 * and addressing mode (LBA28/LBA48) by examining a disk identify device data.
13009 *
13010 * NOTE: CHS mode is not supported! If a device does not support LBA,
13011 * this function is not called.
13012 *
13013 * Returns device capacity in number of blocks, i.e. largest addressable LBA+1
13014 */
13015 static uint64_t
sata_check_capacity(sata_drive_info_t * sdinfo)13016 sata_check_capacity(sata_drive_info_t *sdinfo)
13017 {
13018 uint64_t capacity = 0;
13019 int i;
13020
13021 if (sdinfo->satadrv_type != SATA_DTYPE_ATADISK ||
13022 !sdinfo->satadrv_id.ai_cap & SATA_LBA_SUPPORT)
13023 /* Capacity valid only for LBA-addressable disk devices */
13024 return (0);
13025
13026 if ((sdinfo->satadrv_id.ai_validinfo & SATA_VALIDINFO_88) &&
13027 (sdinfo->satadrv_id.ai_cmdset83 & SATA_EXT48) &&
13028 (sdinfo->satadrv_id.ai_features86 & SATA_EXT48)) {
13029 /* LBA48 mode supported and enabled */
13030 sdinfo->satadrv_features_support |= SATA_DEV_F_LBA48 |
13031 SATA_DEV_F_LBA28;
13032 for (i = 3; i >= 0; --i) {
13033 capacity <<= 16;
13034 capacity += sdinfo->satadrv_id.ai_addrsecxt[i];
13035 }
13036 } else {
13037 capacity = sdinfo->satadrv_id.ai_addrsec[1];
13038 capacity <<= 16;
13039 capacity += sdinfo->satadrv_id.ai_addrsec[0];
13040 if (capacity >= 0x1000000)
13041 /* LBA28 mode */
13042 sdinfo->satadrv_features_support |= SATA_DEV_F_LBA28;
13043 }
13044 return (capacity);
13045 }
13046
13047
13048 /*
13049 * Allocate consistent buffer for DMA transfer
13050 *
13051 * Cannot be called from interrupt level or with mutex held - it may sleep.
13052 *
13053 * Returns pointer to allocated buffer structure, or NULL if allocation failed.
13054 */
13055 static struct buf *
sata_alloc_local_buffer(sata_pkt_txlate_t * spx,int len)13056 sata_alloc_local_buffer(sata_pkt_txlate_t *spx, int len)
13057 {
13058 struct scsi_address ap;
13059 struct buf *bp;
13060 ddi_dma_attr_t cur_dma_attr;
13061
13062 ASSERT(spx->txlt_sata_pkt != NULL);
13063 ap.a_hba_tran = spx->txlt_sata_hba_inst->satahba_scsi_tran;
13064 ap.a_target = SATA_TO_SCSI_TARGET(
13065 spx->txlt_sata_pkt->satapkt_device.satadev_addr.cport,
13066 spx->txlt_sata_pkt->satapkt_device.satadev_addr.pmport,
13067 spx->txlt_sata_pkt->satapkt_device.satadev_addr.qual);
13068 ap.a_lun = 0;
13069
13070 bp = scsi_alloc_consistent_buf(&ap, NULL, len,
13071 B_READ, SLEEP_FUNC, NULL);
13072
13073 if (bp != NULL) {
13074 /* Allocate DMA resources for this buffer */
13075 spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp = bp;
13076 /*
13077 * We use a local version of the dma_attr, to account
13078 * for a device addressing limitations.
13079 * sata_adjust_dma_attr() will handle sdinfo == NULL which
13080 * will cause dma attributes to be adjusted to a lowest
13081 * acceptable level.
13082 */
13083 sata_adjust_dma_attr(NULL,
13084 SATA_DMA_ATTR(spx->txlt_sata_hba_inst), &cur_dma_attr);
13085
13086 if (sata_dma_buf_setup(spx, PKT_CONSISTENT,
13087 SLEEP_FUNC, NULL, &cur_dma_attr) != DDI_SUCCESS) {
13088 scsi_free_consistent_buf(bp);
13089 spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp = NULL;
13090 bp = NULL;
13091 }
13092 }
13093 return (bp);
13094 }
13095
13096 /*
13097 * Release local buffer (consistent buffer for DMA transfer) allocated
13098 * via sata_alloc_local_buffer().
13099 */
13100 static void
sata_free_local_buffer(sata_pkt_txlate_t * spx)13101 sata_free_local_buffer(sata_pkt_txlate_t *spx)
13102 {
13103 ASSERT(spx->txlt_sata_pkt != NULL);
13104 ASSERT(spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp != NULL);
13105
13106 spx->txlt_sata_pkt->satapkt_cmd.satacmd_num_dma_cookies = 0;
13107 spx->txlt_sata_pkt->satapkt_cmd.satacmd_dma_cookie_list = NULL;
13108
13109 sata_common_free_dma_rsrcs(spx);
13110
13111 /* Free buffer */
13112 scsi_free_consistent_buf(spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp);
13113 spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp = NULL;
13114 }
13115
13116 /*
13117 * Allocate sata_pkt
13118 * Pkt structure version and embedded strcutures version are initialized.
13119 * sata_pkt and sata_pkt_txlate structures are cross-linked.
13120 *
13121 * Since this may be called in interrupt context by sata_scsi_init_pkt,
13122 * callback argument determines if it can sleep or not.
13123 * Hence, it should not be called from interrupt context.
13124 *
13125 * If successful, non-NULL pointer to a sata pkt is returned.
13126 * Upon failure, NULL pointer is returned.
13127 */
13128 static sata_pkt_t *
sata_pkt_alloc(sata_pkt_txlate_t * spx,int (* callback)(caddr_t))13129 sata_pkt_alloc(sata_pkt_txlate_t *spx, int (*callback)(caddr_t))
13130 {
13131 sata_pkt_t *spkt;
13132 int kmsflag;
13133
13134 kmsflag = (callback == SLEEP_FUNC) ? KM_SLEEP : KM_NOSLEEP;
13135 spkt = kmem_zalloc(sizeof (sata_pkt_t), kmsflag);
13136 if (spkt == NULL) {
13137 SATA_LOG_D((spx->txlt_sata_hba_inst, CE_WARN,
13138 "sata_pkt_alloc: failed"));
13139 return (NULL);
13140 }
13141 spkt->satapkt_rev = SATA_PKT_REV;
13142 spkt->satapkt_cmd.satacmd_rev = SATA_CMD_REV;
13143 spkt->satapkt_device.satadev_rev = SATA_DEVICE_REV;
13144 spkt->satapkt_framework_private = spx;
13145 spx->txlt_sata_pkt = spkt;
13146 return (spkt);
13147 }
13148
13149 /*
13150 * Free sata pkt allocated via sata_pkt_alloc()
13151 */
13152 static void
sata_pkt_free(sata_pkt_txlate_t * spx)13153 sata_pkt_free(sata_pkt_txlate_t *spx)
13154 {
13155 ASSERT(spx->txlt_sata_pkt != NULL);
13156 ASSERT(spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp == NULL);
13157 kmem_free(spx->txlt_sata_pkt, sizeof (sata_pkt_t));
13158 spx->txlt_sata_pkt = NULL;
13159 }
13160
13161
13162 /*
13163 * Adjust DMA attributes.
13164 * SCSI cmds block count is up to 24 bits, SATA cmd block count vary
13165 * from 8 bits to 16 bits, depending on a command being used.
13166 * Limiting max block count arbitrarily to 256 for all read/write
13167 * commands may affects performance, so check both the device and
13168 * controller capability before adjusting dma attributes.
13169 */
13170 void
sata_adjust_dma_attr(sata_drive_info_t * sdinfo,ddi_dma_attr_t * dma_attr,ddi_dma_attr_t * adj_dma_attr)13171 sata_adjust_dma_attr(sata_drive_info_t *sdinfo, ddi_dma_attr_t *dma_attr,
13172 ddi_dma_attr_t *adj_dma_attr)
13173 {
13174 uint32_t count_max;
13175
13176 /* Copy original attributes */
13177 *adj_dma_attr = *dma_attr;
13178 /*
13179 * Things to consider: device addressing capability,
13180 * "excessive" controller DMA capabilities.
13181 * If a device is being probed/initialized, there are
13182 * no device info - use default limits then.
13183 */
13184 if (sdinfo == NULL) {
13185 count_max = dma_attr->dma_attr_granular * 0x100;
13186 if (dma_attr->dma_attr_count_max > count_max)
13187 adj_dma_attr->dma_attr_count_max = count_max;
13188 if (dma_attr->dma_attr_maxxfer > count_max)
13189 adj_dma_attr->dma_attr_maxxfer = count_max;
13190 return;
13191 }
13192
13193 if (sdinfo->satadrv_type == SATA_DTYPE_ATADISK) {
13194 if (sdinfo->satadrv_features_support & (SATA_DEV_F_LBA48)) {
13195 /*
13196 * 16-bit sector count may be used - we rely on
13197 * the assumption that only read and write cmds
13198 * will request more than 256 sectors worth of data
13199 */
13200 count_max = adj_dma_attr->dma_attr_granular * 0x10000;
13201 } else {
13202 /*
13203 * 8-bit sector count will be used - default limits
13204 * for dma attributes
13205 */
13206 count_max = adj_dma_attr->dma_attr_granular * 0x100;
13207 }
13208 /*
13209 * Adjust controler dma attributes, if necessary
13210 */
13211 if (dma_attr->dma_attr_count_max > count_max)
13212 adj_dma_attr->dma_attr_count_max = count_max;
13213 if (dma_attr->dma_attr_maxxfer > count_max)
13214 adj_dma_attr->dma_attr_maxxfer = count_max;
13215 }
13216 }
13217
13218
13219 /*
13220 * Allocate DMA resources for the buffer
13221 * This function handles initial DMA resource allocation as well as
13222 * DMA window shift and may be called repeatedly for the same DMA window
13223 * until all DMA cookies in the DMA window are processed.
13224 * To guarantee that there is always a coherent set of cookies to process
13225 * by SATA HBA driver (observing alignment, device granularity, etc.),
13226 * the number of slots for DMA cookies is equal to lesser of a number of
13227 * cookies in a DMA window and a max number of scatter/gather entries.
13228 *
13229 * Returns DDI_SUCCESS upon successful operation.
13230 * Return failure code of a failing command or DDI_FAILURE when
13231 * internal cleanup failed.
13232 */
13233 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)13234 sata_dma_buf_setup(sata_pkt_txlate_t *spx, int flags,
13235 int (*callback)(caddr_t), caddr_t arg,
13236 ddi_dma_attr_t *cur_dma_attr)
13237 {
13238 int rval;
13239 off_t offset;
13240 size_t size;
13241 int max_sg_len, req_len, i;
13242 uint_t dma_flags;
13243 struct buf *bp;
13244 uint64_t cur_txfer_len;
13245
13246
13247 ASSERT(spx->txlt_sata_pkt != NULL);
13248 bp = spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp;
13249 ASSERT(bp != NULL);
13250
13251
13252 if (spx->txlt_buf_dma_handle == NULL) {
13253 /*
13254 * No DMA resources allocated so far - this is a first call
13255 * for this sata pkt.
13256 */
13257 rval = ddi_dma_alloc_handle(SATA_DIP(spx->txlt_sata_hba_inst),
13258 cur_dma_attr, callback, arg, &spx->txlt_buf_dma_handle);
13259
13260 if (rval != DDI_SUCCESS) {
13261 SATA_LOG_D((spx->txlt_sata_hba_inst, CE_WARN,
13262 "sata_dma_buf_setup: no buf DMA resources %x",
13263 rval));
13264 return (rval);
13265 }
13266
13267 if (bp->b_flags & B_READ)
13268 dma_flags = DDI_DMA_READ;
13269 else
13270 dma_flags = DDI_DMA_WRITE;
13271
13272 if (flags & PKT_CONSISTENT)
13273 dma_flags |= DDI_DMA_CONSISTENT;
13274
13275 if (flags & PKT_DMA_PARTIAL)
13276 dma_flags |= DDI_DMA_PARTIAL;
13277
13278 /*
13279 * Check buffer alignment and size against dma attributes
13280 * Consider dma_attr_align only. There may be requests
13281 * with the size lower than device granularity, but they
13282 * will not read/write from/to the device, so no adjustment
13283 * is necessary. The dma_attr_minxfer theoretically should
13284 * be considered, but no HBA driver is checking it.
13285 */
13286 if (IS_P2ALIGNED(bp->b_un.b_addr,
13287 cur_dma_attr->dma_attr_align)) {
13288 rval = ddi_dma_buf_bind_handle(
13289 spx->txlt_buf_dma_handle,
13290 bp, dma_flags, callback, arg,
13291 &spx->txlt_dma_cookie,
13292 &spx->txlt_curwin_num_dma_cookies);
13293 } else { /* Buffer is not aligned */
13294
13295 int (*ddicallback)(caddr_t);
13296 size_t bufsz;
13297
13298 /* Check id sleeping is allowed */
13299 ddicallback = (callback == NULL_FUNC) ?
13300 DDI_DMA_DONTWAIT : DDI_DMA_SLEEP;
13301
13302 SATADBG2(SATA_DBG_DMA_SETUP, spx->txlt_sata_hba_inst,
13303 "mis-aligned buffer: addr=0x%p, cnt=%lu",
13304 (void *)bp->b_un.b_addr, bp->b_bcount);
13305
13306 if (bp->b_flags & (B_PAGEIO|B_PHYS))
13307 /*
13308 * CPU will need to access data in the buffer
13309 * (for copying) so map it.
13310 */
13311 bp_mapin(bp);
13312
13313 ASSERT(spx->txlt_tmp_buf == NULL);
13314
13315 /* Buffer may be padded by ddi_dma_mem_alloc()! */
13316 rval = ddi_dma_mem_alloc(
13317 spx->txlt_buf_dma_handle,
13318 bp->b_bcount,
13319 &sata_acc_attr,
13320 DDI_DMA_STREAMING,
13321 ddicallback, NULL,
13322 &spx->txlt_tmp_buf,
13323 &bufsz,
13324 &spx->txlt_tmp_buf_handle);
13325
13326 if (rval != DDI_SUCCESS) {
13327 /* DMA mapping failed */
13328 (void) ddi_dma_free_handle(
13329 &spx->txlt_buf_dma_handle);
13330 spx->txlt_buf_dma_handle = NULL;
13331 #ifdef SATA_DEBUG
13332 mbuffail_count++;
13333 #endif
13334 SATADBG1(SATA_DBG_DMA_SETUP,
13335 spx->txlt_sata_hba_inst,
13336 "sata_dma_buf_setup: "
13337 "buf dma mem alloc failed %x\n", rval);
13338 return (rval);
13339 }
13340 ASSERT(IS_P2ALIGNED(spx->txlt_tmp_buf,
13341 cur_dma_attr->dma_attr_align));
13342
13343 #ifdef SATA_DEBUG
13344 mbuf_count++;
13345
13346 if (bp->b_bcount != bufsz)
13347 /*
13348 * This will require special handling, because
13349 * DMA cookies will be based on the temporary
13350 * buffer size, not the original buffer
13351 * b_bcount, so the residue may have to
13352 * be counted differently.
13353 */
13354 SATADBG2(SATA_DBG_DMA_SETUP,
13355 spx->txlt_sata_hba_inst,
13356 "sata_dma_buf_setup: bp size %x != "
13357 "bufsz %x\n", bp->b_bcount, bufsz);
13358 #endif
13359 if (dma_flags & DDI_DMA_WRITE) {
13360 /*
13361 * Write operation - copy data into
13362 * an aligned temporary buffer. Buffer will be
13363 * synced for device by ddi_dma_addr_bind_handle
13364 */
13365 bcopy(bp->b_un.b_addr, spx->txlt_tmp_buf,
13366 bp->b_bcount);
13367 }
13368
13369 rval = ddi_dma_addr_bind_handle(
13370 spx->txlt_buf_dma_handle,
13371 NULL,
13372 spx->txlt_tmp_buf,
13373 bufsz, dma_flags, ddicallback, 0,
13374 &spx->txlt_dma_cookie,
13375 &spx->txlt_curwin_num_dma_cookies);
13376 }
13377
13378 switch (rval) {
13379 case DDI_DMA_PARTIAL_MAP:
13380 SATADBG1(SATA_DBG_DMA_SETUP, spx->txlt_sata_hba_inst,
13381 "sata_dma_buf_setup: DMA Partial Map\n", NULL);
13382 /*
13383 * Partial DMA mapping.
13384 * Retrieve number of DMA windows for this request.
13385 */
13386 if (ddi_dma_numwin(spx->txlt_buf_dma_handle,
13387 &spx->txlt_num_dma_win) != DDI_SUCCESS) {
13388 if (spx->txlt_tmp_buf != NULL) {
13389 ddi_dma_mem_free(
13390 &spx->txlt_tmp_buf_handle);
13391 spx->txlt_tmp_buf = NULL;
13392 }
13393 (void) ddi_dma_unbind_handle(
13394 spx->txlt_buf_dma_handle);
13395 (void) ddi_dma_free_handle(
13396 &spx->txlt_buf_dma_handle);
13397 spx->txlt_buf_dma_handle = NULL;
13398 SATA_LOG_D((spx->txlt_sata_hba_inst, CE_WARN,
13399 "sata_dma_buf_setup: numwin failed\n"));
13400 return (DDI_FAILURE);
13401 }
13402 SATADBG2(SATA_DBG_DMA_SETUP,
13403 spx->txlt_sata_hba_inst,
13404 "sata_dma_buf_setup: windows: %d, cookies: %d\n",
13405 spx->txlt_num_dma_win,
13406 spx->txlt_curwin_num_dma_cookies);
13407 spx->txlt_cur_dma_win = 0;
13408 break;
13409
13410 case DDI_DMA_MAPPED:
13411 /* DMA fully mapped */
13412 spx->txlt_num_dma_win = 1;
13413 spx->txlt_cur_dma_win = 0;
13414 SATADBG1(SATA_DBG_DMA_SETUP,
13415 spx->txlt_sata_hba_inst,
13416 "sata_dma_buf_setup: windows: 1 "
13417 "cookies: %d\n", spx->txlt_curwin_num_dma_cookies);
13418 break;
13419
13420 default:
13421 /* DMA mapping failed */
13422 if (spx->txlt_tmp_buf != NULL) {
13423 ddi_dma_mem_free(
13424 &spx->txlt_tmp_buf_handle);
13425 spx->txlt_tmp_buf = NULL;
13426 }
13427 (void) ddi_dma_free_handle(&spx->txlt_buf_dma_handle);
13428 spx->txlt_buf_dma_handle = NULL;
13429 SATA_LOG_D((spx->txlt_sata_hba_inst, CE_WARN,
13430 "sata_dma_buf_setup: buf dma handle binding "
13431 "failed %x\n", rval));
13432 return (rval);
13433 }
13434 spx->txlt_curwin_processed_dma_cookies = 0;
13435 spx->txlt_dma_cookie_list = NULL;
13436 } else {
13437 /*
13438 * DMA setup is reused. Check if we need to process more
13439 * cookies in current window, or to get next window, if any.
13440 */
13441
13442 ASSERT(spx->txlt_curwin_processed_dma_cookies <=
13443 spx->txlt_curwin_num_dma_cookies);
13444
13445 if (spx->txlt_curwin_processed_dma_cookies ==
13446 spx->txlt_curwin_num_dma_cookies) {
13447 /*
13448 * All cookies from current DMA window were processed.
13449 * Get next DMA window.
13450 */
13451 spx->txlt_cur_dma_win++;
13452 if (spx->txlt_cur_dma_win < spx->txlt_num_dma_win) {
13453 (void) ddi_dma_getwin(spx->txlt_buf_dma_handle,
13454 spx->txlt_cur_dma_win, &offset, &size,
13455 &spx->txlt_dma_cookie,
13456 &spx->txlt_curwin_num_dma_cookies);
13457 spx->txlt_curwin_processed_dma_cookies = 0;
13458 } else {
13459 /* No more windows! End of request! */
13460 /* What to do? - panic for now */
13461 ASSERT(spx->txlt_cur_dma_win >=
13462 spx->txlt_num_dma_win);
13463
13464 spx->txlt_curwin_num_dma_cookies = 0;
13465 spx->txlt_curwin_processed_dma_cookies = 0;
13466 spx->txlt_sata_pkt->
13467 satapkt_cmd.satacmd_num_dma_cookies = 0;
13468 return (DDI_SUCCESS);
13469 }
13470 }
13471 }
13472 /* There better be at least one DMA cookie outstanding */
13473 ASSERT((spx->txlt_curwin_num_dma_cookies -
13474 spx->txlt_curwin_processed_dma_cookies) > 0);
13475
13476 if (spx->txlt_dma_cookie_list == &spx->txlt_dma_cookie) {
13477 /* The default cookie slot was used in previous run */
13478 ASSERT(spx->txlt_curwin_processed_dma_cookies == 0);
13479 spx->txlt_dma_cookie_list = NULL;
13480 spx->txlt_dma_cookie_list_len = 0;
13481 }
13482 if (spx->txlt_curwin_processed_dma_cookies == 0) {
13483 /*
13484 * Processing a new DMA window - set-up dma cookies list.
13485 * We may reuse previously allocated cookie array if it is
13486 * possible.
13487 */
13488 if (spx->txlt_dma_cookie_list != NULL &&
13489 spx->txlt_dma_cookie_list_len <
13490 spx->txlt_curwin_num_dma_cookies) {
13491 /*
13492 * New DMA window contains more cookies than
13493 * the previous one. We need larger cookie list - free
13494 * the old one.
13495 */
13496 (void) kmem_free(spx->txlt_dma_cookie_list,
13497 spx->txlt_dma_cookie_list_len *
13498 sizeof (ddi_dma_cookie_t));
13499 spx->txlt_dma_cookie_list = NULL;
13500 spx->txlt_dma_cookie_list_len = 0;
13501 }
13502 if (spx->txlt_dma_cookie_list == NULL) {
13503 /*
13504 * Calculate lesser of number of cookies in this
13505 * DMA window and number of s/g entries.
13506 */
13507 max_sg_len = cur_dma_attr->dma_attr_sgllen;
13508 req_len = MIN(max_sg_len,
13509 spx->txlt_curwin_num_dma_cookies);
13510
13511 /* Allocate new dma cookie array if necessary */
13512 if (req_len == 1) {
13513 /* Only one cookie - no need for a list */
13514 spx->txlt_dma_cookie_list =
13515 &spx->txlt_dma_cookie;
13516 spx->txlt_dma_cookie_list_len = 1;
13517 } else {
13518 /*
13519 * More than one cookie - try to allocate space.
13520 */
13521 spx->txlt_dma_cookie_list = kmem_zalloc(
13522 sizeof (ddi_dma_cookie_t) * req_len,
13523 callback == NULL_FUNC ? KM_NOSLEEP :
13524 KM_SLEEP);
13525 if (spx->txlt_dma_cookie_list == NULL) {
13526 SATADBG1(SATA_DBG_DMA_SETUP,
13527 spx->txlt_sata_hba_inst,
13528 "sata_dma_buf_setup: cookie list "
13529 "allocation failed\n", NULL);
13530 /*
13531 * We could not allocate space for
13532 * neccessary number of dma cookies in
13533 * this window, so we fail this request.
13534 * Next invocation would try again to
13535 * allocate space for cookie list.
13536 * Note:Packet residue was not modified.
13537 */
13538 return (DDI_DMA_NORESOURCES);
13539 } else {
13540 spx->txlt_dma_cookie_list_len = req_len;
13541 }
13542 }
13543 }
13544 /*
13545 * Fetch DMA cookies into cookie list in sata_pkt_txlate.
13546 * First cookie was already fetched.
13547 */
13548 *(&spx->txlt_dma_cookie_list[0]) = spx->txlt_dma_cookie;
13549 cur_txfer_len =
13550 (uint64_t)spx->txlt_dma_cookie_list[0].dmac_size;
13551 spx->txlt_sata_pkt->satapkt_cmd.satacmd_num_dma_cookies = 1;
13552 spx->txlt_curwin_processed_dma_cookies++;
13553 for (i = 1; (i < spx->txlt_dma_cookie_list_len) &&
13554 (i < spx->txlt_curwin_num_dma_cookies); i++) {
13555 ddi_dma_nextcookie(spx->txlt_buf_dma_handle,
13556 &spx->txlt_dma_cookie_list[i]);
13557 cur_txfer_len +=
13558 (uint64_t)spx->txlt_dma_cookie_list[i].dmac_size;
13559 spx->txlt_curwin_processed_dma_cookies++;
13560 spx->txlt_sata_pkt->
13561 satapkt_cmd.satacmd_num_dma_cookies += 1;
13562 }
13563 } else {
13564 SATADBG2(SATA_DBG_DMA_SETUP, spx->txlt_sata_hba_inst,
13565 "sata_dma_buf_setup: sliding within DMA window, "
13566 "cur cookie %d, total cookies %d\n",
13567 spx->txlt_curwin_processed_dma_cookies,
13568 spx->txlt_curwin_num_dma_cookies);
13569
13570 /*
13571 * Not all cookies from the current dma window were used because
13572 * of s/g limitation.
13573 * There is no need to re-size the list - it was set at
13574 * optimal size, or only default entry is used (s/g = 1).
13575 */
13576 if (spx->txlt_dma_cookie_list == NULL) {
13577 spx->txlt_dma_cookie_list = &spx->txlt_dma_cookie;
13578 spx->txlt_dma_cookie_list_len = 1;
13579 }
13580 /*
13581 * Since we are processing remaining cookies in a DMA window,
13582 * there may be less of them than the number of entries in the
13583 * current dma cookie list.
13584 */
13585 req_len = MIN(spx->txlt_dma_cookie_list_len,
13586 (spx->txlt_curwin_num_dma_cookies -
13587 spx->txlt_curwin_processed_dma_cookies));
13588
13589 /* Fetch the next batch of cookies */
13590 for (i = 0, cur_txfer_len = 0; i < req_len; i++) {
13591 ddi_dma_nextcookie(spx->txlt_buf_dma_handle,
13592 &spx->txlt_dma_cookie_list[i]);
13593 cur_txfer_len +=
13594 (uint64_t)spx->txlt_dma_cookie_list[i].dmac_size;
13595 spx->txlt_sata_pkt->
13596 satapkt_cmd.satacmd_num_dma_cookies++;
13597 spx->txlt_curwin_processed_dma_cookies++;
13598 }
13599 }
13600
13601 ASSERT(spx->txlt_sata_pkt->satapkt_cmd.satacmd_num_dma_cookies > 0);
13602
13603 /* Point sata_cmd to the cookie list */
13604 spx->txlt_sata_pkt->satapkt_cmd.satacmd_dma_cookie_list =
13605 &spx->txlt_dma_cookie_list[0];
13606
13607 /* Remember number of DMA cookies passed in sata packet */
13608 spx->txlt_num_dma_cookies =
13609 spx->txlt_sata_pkt->satapkt_cmd.satacmd_num_dma_cookies;
13610
13611 ASSERT(cur_txfer_len != 0);
13612 if (cur_txfer_len <= bp->b_bcount)
13613 spx->txlt_total_residue -= cur_txfer_len;
13614 else {
13615 /*
13616 * Temporary DMA buffer has been padded by
13617 * ddi_dma_mem_alloc()!
13618 * This requires special handling, because DMA cookies are
13619 * based on the temporary buffer size, not the b_bcount,
13620 * and we have extra bytes to transfer - but the packet
13621 * residue has to stay correct because we will copy only
13622 * the requested number of bytes.
13623 */
13624 spx->txlt_total_residue -= bp->b_bcount;
13625 }
13626
13627 return (DDI_SUCCESS);
13628 }
13629
13630 /*
13631 * Common routine for releasing DMA resources
13632 */
13633 static void
sata_common_free_dma_rsrcs(sata_pkt_txlate_t * spx)13634 sata_common_free_dma_rsrcs(sata_pkt_txlate_t *spx)
13635 {
13636 if (spx->txlt_buf_dma_handle != NULL) {
13637 if (spx->txlt_tmp_buf != NULL) {
13638 /*
13639 * Intermediate DMA buffer was allocated.
13640 * Free allocated buffer and associated access handle.
13641 */
13642 ddi_dma_mem_free(&spx->txlt_tmp_buf_handle);
13643 spx->txlt_tmp_buf = NULL;
13644 }
13645 /*
13646 * Free DMA resources - cookies and handles
13647 */
13648 /* ASSERT(spx->txlt_dma_cookie_list != NULL); */
13649 if (spx->txlt_dma_cookie_list != NULL) {
13650 if (spx->txlt_dma_cookie_list !=
13651 &spx->txlt_dma_cookie) {
13652 (void) kmem_free(spx->txlt_dma_cookie_list,
13653 spx->txlt_dma_cookie_list_len *
13654 sizeof (ddi_dma_cookie_t));
13655 spx->txlt_dma_cookie_list = NULL;
13656 }
13657 }
13658 (void) ddi_dma_unbind_handle(spx->txlt_buf_dma_handle);
13659 (void) ddi_dma_free_handle(&spx->txlt_buf_dma_handle);
13660 spx->txlt_buf_dma_handle = NULL;
13661 }
13662 }
13663
13664 /*
13665 * Free DMA resources
13666 * Used by the HBA driver to release DMA resources that it does not use.
13667 *
13668 * Returns Void
13669 */
13670 void
sata_free_dma_resources(sata_pkt_t * sata_pkt)13671 sata_free_dma_resources(sata_pkt_t *sata_pkt)
13672 {
13673 sata_pkt_txlate_t *spx;
13674
13675 if (sata_pkt == NULL)
13676 return;
13677
13678 spx = (sata_pkt_txlate_t *)sata_pkt->satapkt_framework_private;
13679
13680 sata_common_free_dma_rsrcs(spx);
13681 }
13682
13683 /*
13684 * Fetch Device Identify data.
13685 * Send DEVICE IDENTIFY or IDENTIFY PACKET DEVICE (depending on a device type)
13686 * command to a device and get the device identify data.
13687 * The device_info structure has to be set to device type (for selecting proper
13688 * device identify command).
13689 *
13690 * Returns:
13691 * SATA_SUCCESS if cmd succeeded
13692 * SATA_RETRY if cmd was rejected and could be retried,
13693 * SATA_FAILURE if cmd failed and should not be retried (port error)
13694 *
13695 * Cannot be called in an interrupt context.
13696 */
13697
13698 static int
sata_fetch_device_identify_data(sata_hba_inst_t * sata_hba_inst,sata_drive_info_t * sdinfo)13699 sata_fetch_device_identify_data(sata_hba_inst_t *sata_hba_inst,
13700 sata_drive_info_t *sdinfo)
13701 {
13702 struct buf *bp;
13703 sata_pkt_t *spkt;
13704 sata_cmd_t *scmd;
13705 sata_pkt_txlate_t *spx;
13706 int rval;
13707 dev_info_t *dip = SATA_DIP(sata_hba_inst);
13708
13709 spx = kmem_zalloc(sizeof (sata_pkt_txlate_t), KM_SLEEP);
13710 spx->txlt_sata_hba_inst = sata_hba_inst;
13711 spx->txlt_scsi_pkt = NULL; /* No scsi pkt involved */
13712 spkt = sata_pkt_alloc(spx, SLEEP_FUNC);
13713 if (spkt == NULL) {
13714 kmem_free(spx, sizeof (sata_pkt_txlate_t));
13715 return (SATA_RETRY); /* may retry later */
13716 }
13717 /* address is needed now */
13718 spkt->satapkt_device.satadev_addr = sdinfo->satadrv_addr;
13719
13720 /*
13721 * Allocate buffer for Identify Data return data
13722 */
13723 bp = sata_alloc_local_buffer(spx, sizeof (sata_id_t));
13724 if (bp == NULL) {
13725 sata_pkt_free(spx);
13726 kmem_free(spx, sizeof (sata_pkt_txlate_t));
13727 SATA_LOG_D((sata_hba_inst, CE_WARN,
13728 "sata_fetch_device_identify_data: "
13729 "cannot allocate buffer for ID"));
13730 return (SATA_RETRY); /* may retry later */
13731 }
13732
13733 /* Fill sata_pkt */
13734 sdinfo->satadrv_state = SATA_STATE_PROBING;
13735 spkt->satapkt_device.satadev_addr = sdinfo->satadrv_addr;
13736 spkt->satapkt_op_mode = SATA_OPMODE_SYNCH | SATA_OPMODE_INTERRUPTS;
13737 /* Synchronous mode, no callback */
13738 spkt->satapkt_comp = NULL;
13739 /* Timeout 30s */
13740 spkt->satapkt_time = sata_default_pkt_time;
13741
13742 scmd = &spkt->satapkt_cmd;
13743 scmd->satacmd_bp = bp;
13744 scmd->satacmd_flags.sata_data_direction = SATA_DIR_READ;
13745 scmd->satacmd_flags.sata_ignore_dev_reset = B_TRUE;
13746
13747 /* Build Identify Device cmd in the sata_pkt */
13748 scmd->satacmd_addr_type = 0; /* N/A */
13749 scmd->satacmd_sec_count_lsb = 0; /* N/A */
13750 scmd->satacmd_lba_low_lsb = 0; /* N/A */
13751 scmd->satacmd_lba_mid_lsb = 0; /* N/A */
13752 scmd->satacmd_lba_high_lsb = 0; /* N/A */
13753 scmd->satacmd_features_reg = 0; /* N/A */
13754 scmd->satacmd_device_reg = 0; /* Always device 0 */
13755 if (sdinfo->satadrv_type & SATA_DTYPE_ATAPI) {
13756 /* Identify Packet Device cmd */
13757 scmd->satacmd_cmd_reg = SATAC_ID_PACKET_DEVICE;
13758 } else {
13759 /* Identify Device cmd - mandatory for all other devices */
13760 scmd->satacmd_cmd_reg = SATAC_ID_DEVICE;
13761 }
13762
13763 /* Send pkt to SATA HBA driver */
13764 rval = (*SATA_START_FUNC(sata_hba_inst))(SATA_DIP(sata_hba_inst), spkt);
13765
13766 #ifdef SATA_INJECT_FAULTS
13767 sata_inject_pkt_fault(spkt, &rval, sata_fault_type);
13768 #endif
13769
13770 if (rval == SATA_TRAN_ACCEPTED &&
13771 spkt->satapkt_reason == SATA_PKT_COMPLETED) {
13772 if (spx->txlt_buf_dma_handle != NULL) {
13773 rval = ddi_dma_sync(spx->txlt_buf_dma_handle, 0, 0,
13774 DDI_DMA_SYNC_FORKERNEL);
13775 ASSERT(rval == DDI_SUCCESS);
13776 if (sata_check_for_dma_error(dip, spx)) {
13777 ddi_fm_service_impact(dip,
13778 DDI_SERVICE_UNAFFECTED);
13779 rval = SATA_RETRY;
13780 goto fail;
13781 }
13782
13783 }
13784 if ((((sata_id_t *)(bp->b_un.b_addr))->ai_config &
13785 SATA_INCOMPLETE_DATA) == SATA_INCOMPLETE_DATA) {
13786 SATA_LOG_D((sata_hba_inst, CE_WARN,
13787 "SATA disk device at port %d - "
13788 "partial Identify Data",
13789 sdinfo->satadrv_addr.cport));
13790 rval = SATA_RETRY; /* may retry later */
13791 goto fail;
13792 }
13793 /* Update sata_drive_info */
13794 bcopy(bp->b_un.b_addr, &sdinfo->satadrv_id,
13795 sizeof (sata_id_t));
13796
13797 sdinfo->satadrv_features_support = 0;
13798 if (sdinfo->satadrv_type == SATA_DTYPE_ATADISK) {
13799 /*
13800 * Retrieve capacity (disks only) and addressing mode
13801 */
13802 sdinfo->satadrv_capacity = sata_check_capacity(sdinfo);
13803 } else {
13804 /*
13805 * For ATAPI devices one would have to issue
13806 * Get Capacity cmd for media capacity. Not here.
13807 */
13808 sdinfo->satadrv_capacity = 0;
13809 /*
13810 * Check what cdb length is supported
13811 */
13812 if ((sdinfo->satadrv_id.ai_config &
13813 SATA_ATAPI_ID_PKT_SZ) == SATA_ATAPI_ID_PKT_16B)
13814 sdinfo->satadrv_atapi_cdb_len = 16;
13815 else
13816 sdinfo->satadrv_atapi_cdb_len = 12;
13817 }
13818 /* Setup supported features flags */
13819 if (sdinfo->satadrv_id.ai_cap & SATA_DMA_SUPPORT)
13820 sdinfo->satadrv_features_support |= SATA_DEV_F_DMA;
13821
13822 /* Check for SATA GEN and NCQ support */
13823 if (sdinfo->satadrv_id.ai_satacap != 0 &&
13824 sdinfo->satadrv_id.ai_satacap != 0xffff) {
13825 /* SATA compliance */
13826 if (sdinfo->satadrv_id.ai_satacap & SATA_NCQ)
13827 sdinfo->satadrv_features_support |=
13828 SATA_DEV_F_NCQ;
13829 if (sdinfo->satadrv_id.ai_satacap &
13830 (SATA_1_SPEED | SATA_2_SPEED | SATA_3_SPEED)) {
13831 if (sdinfo->satadrv_id.ai_satacap &
13832 SATA_3_SPEED)
13833 sdinfo->satadrv_features_support |=
13834 SATA_DEV_F_SATA3;
13835 if (sdinfo->satadrv_id.ai_satacap &
13836 SATA_2_SPEED)
13837 sdinfo->satadrv_features_support |=
13838 SATA_DEV_F_SATA2;
13839 if (sdinfo->satadrv_id.ai_satacap &
13840 SATA_1_SPEED)
13841 sdinfo->satadrv_features_support |=
13842 SATA_DEV_F_SATA1;
13843 } else {
13844 sdinfo->satadrv_features_support |=
13845 SATA_DEV_F_SATA1;
13846 }
13847 }
13848 if ((sdinfo->satadrv_id.ai_cmdset83 & SATA_RW_DMA_QUEUED_CMD) &&
13849 (sdinfo->satadrv_id.ai_features86 & SATA_RW_DMA_QUEUED_CMD))
13850 sdinfo->satadrv_features_support |= SATA_DEV_F_TCQ;
13851
13852 sdinfo->satadrv_queue_depth = sdinfo->satadrv_id.ai_qdepth;
13853 if ((sdinfo->satadrv_features_support & SATA_DEV_F_NCQ) ||
13854 (sdinfo->satadrv_features_support & SATA_DEV_F_TCQ)) {
13855 ++sdinfo->satadrv_queue_depth;
13856 /* Adjust according to controller capabilities */
13857 sdinfo->satadrv_max_queue_depth = MIN(
13858 sdinfo->satadrv_queue_depth,
13859 SATA_QDEPTH(sata_hba_inst));
13860 /* Adjust according to global queue depth limit */
13861 sdinfo->satadrv_max_queue_depth = MIN(
13862 sdinfo->satadrv_max_queue_depth,
13863 sata_current_max_qdepth);
13864 if (sdinfo->satadrv_max_queue_depth == 0)
13865 sdinfo->satadrv_max_queue_depth = 1;
13866 } else
13867 sdinfo->satadrv_max_queue_depth = 1;
13868
13869 rval = SATA_SUCCESS;
13870 } else {
13871 /*
13872 * Woops, no Identify Data.
13873 */
13874 if (rval == SATA_TRAN_BUSY || rval == SATA_TRAN_QUEUE_FULL) {
13875 rval = SATA_RETRY; /* may retry later */
13876 } else if (rval == SATA_TRAN_ACCEPTED) {
13877 if (spkt->satapkt_reason == SATA_PKT_DEV_ERROR ||
13878 spkt->satapkt_reason == SATA_PKT_ABORTED ||
13879 spkt->satapkt_reason == SATA_PKT_TIMEOUT ||
13880 spkt->satapkt_reason == SATA_PKT_RESET)
13881 rval = SATA_RETRY; /* may retry later */
13882 else
13883 rval = SATA_FAILURE;
13884 } else {
13885 rval = SATA_FAILURE;
13886 }
13887 }
13888 fail:
13889 /* Free allocated resources */
13890 sata_free_local_buffer(spx);
13891 sata_pkt_free(spx);
13892 kmem_free(spx, sizeof (sata_pkt_txlate_t));
13893
13894 return (rval);
13895 }
13896
13897
13898 /*
13899 * Some devices may not come-up with default DMA mode (UDMA or MWDMA).
13900 * UDMA mode is checked first, followed by MWDMA mode.
13901 * set correctly, so this function is setting it to the highest supported level.
13902 * Older SATA spec required that the device supports at least DMA 4 mode and
13903 * UDMA mode is selected. It is not mentioned in SerialATA 2.6, so this
13904 * restriction has been removed.
13905 *
13906 * Returns SATA_SUCCESS if proper DMA mode is selected or no DMA is supported.
13907 * Returns SATA_FAILURE if proper DMA mode could not be selected.
13908 *
13909 * NOTE: This function should be called only if DMA mode is supported.
13910 */
13911 static int
sata_set_dma_mode(sata_hba_inst_t * sata_hba_inst,sata_drive_info_t * sdinfo)13912 sata_set_dma_mode(sata_hba_inst_t *sata_hba_inst, sata_drive_info_t *sdinfo)
13913 {
13914 sata_pkt_t *spkt;
13915 sata_cmd_t *scmd;
13916 sata_pkt_txlate_t *spx;
13917 int i, mode;
13918 uint8_t subcmd;
13919 int rval = SATA_SUCCESS;
13920
13921 ASSERT(sdinfo != NULL);
13922 ASSERT(sata_hba_inst != NULL);
13923
13924 if ((sdinfo->satadrv_id.ai_validinfo & SATA_VALIDINFO_88) != 0 &&
13925 (sdinfo->satadrv_id.ai_ultradma & SATA_UDMA_SUP_MASK) != 0) {
13926 /* Find highest Ultra DMA mode supported */
13927 for (mode = 6; mode >= 0; --mode) {
13928 if (sdinfo->satadrv_id.ai_ultradma & (1 << mode))
13929 break;
13930 }
13931 #if 0
13932 /* Left for historical reasons */
13933 /*
13934 * Some initial version of SATA spec indicated that at least
13935 * UDMA mode 4 has to be supported. It is not mentioned in
13936 * SerialATA 2.6, so this restriction is removed.
13937 */
13938 if (mode < 4)
13939 return (SATA_FAILURE);
13940 #endif
13941
13942 /*
13943 * For disk, we're still going to set DMA mode whatever is
13944 * selected by default
13945 *
13946 * We saw an old maxtor sata drive will select Ultra DMA and
13947 * Multi-Word DMA simultaneouly by default, which is going
13948 * to cause DMA command timed out, so we need to select DMA
13949 * mode even when it's already done by default
13950 */
13951 if (sdinfo->satadrv_type != SATA_DTYPE_ATADISK) {
13952
13953 /* Find UDMA mode currently selected */
13954 for (i = 6; i >= 0; --i) {
13955 if (sdinfo->satadrv_id.ai_ultradma &
13956 (1 << (i + 8)))
13957 break;
13958 }
13959 if (i >= mode)
13960 /* Nothing to do */
13961 return (SATA_SUCCESS);
13962 }
13963
13964 subcmd = SATAC_TRANSFER_MODE_ULTRA_DMA;
13965
13966 } else if ((sdinfo->satadrv_id.ai_dworddma & SATA_MDMA_SUP_MASK) != 0) {
13967 /* Find highest MultiWord DMA mode supported */
13968 for (mode = 2; mode >= 0; --mode) {
13969 if (sdinfo->satadrv_id.ai_dworddma & (1 << mode))
13970 break;
13971 }
13972
13973 /*
13974 * For disk, We're still going to set DMA mode whatever is
13975 * selected by default
13976 *
13977 * We saw an old maxtor sata drive will select Ultra DMA and
13978 * Multi-Word DMA simultaneouly by default, which is going
13979 * to cause DMA command timed out, so we need to select DMA
13980 * mode even when it's already done by default
13981 */
13982 if (sdinfo->satadrv_type != SATA_DTYPE_ATADISK) {
13983
13984 /* Find highest MultiWord DMA mode selected */
13985 for (i = 2; i >= 0; --i) {
13986 if (sdinfo->satadrv_id.ai_dworddma &
13987 (1 << (i + 8)))
13988 break;
13989 }
13990 if (i >= mode)
13991 /* Nothing to do */
13992 return (SATA_SUCCESS);
13993 }
13994
13995 subcmd = SATAC_TRANSFER_MODE_MULTI_WORD_DMA;
13996 } else
13997 return (SATA_SUCCESS);
13998
13999 /*
14000 * Set DMA mode via SET FEATURES COMMAND.
14001 * Prepare packet for SET FEATURES COMMAND.
14002 */
14003 spx = kmem_zalloc(sizeof (sata_pkt_txlate_t), KM_SLEEP);
14004 spx->txlt_sata_hba_inst = sata_hba_inst;
14005 spx->txlt_scsi_pkt = NULL; /* No scsi pkt involved */
14006 spkt = sata_pkt_alloc(spx, SLEEP_FUNC);
14007 if (spkt == NULL) {
14008 SATA_LOG_D((sata_hba_inst, CE_WARN,
14009 "sata_set_dma_mode: could not set DMA mode %d", mode));
14010 rval = SATA_FAILURE;
14011 goto done;
14012 }
14013 /* Fill sata_pkt */
14014 spkt->satapkt_device.satadev_addr = sdinfo->satadrv_addr;
14015 /* Timeout 30s */
14016 spkt->satapkt_time = sata_default_pkt_time;
14017 /* Synchronous mode, no callback, interrupts */
14018 spkt->satapkt_op_mode = SATA_OPMODE_SYNCH | SATA_OPMODE_INTERRUPTS;
14019 spkt->satapkt_comp = NULL;
14020 scmd = &spkt->satapkt_cmd;
14021 scmd->satacmd_flags.sata_data_direction = SATA_DIR_NODATA_XFER;
14022 scmd->satacmd_flags.sata_ignore_dev_reset = B_TRUE;
14023 scmd->satacmd_addr_type = 0;
14024 scmd->satacmd_device_reg = 0;
14025 scmd->satacmd_status_reg = 0;
14026 scmd->satacmd_error_reg = 0;
14027 scmd->satacmd_cmd_reg = SATAC_SET_FEATURES;
14028 scmd->satacmd_features_reg = SATAC_SF_TRANSFER_MODE;
14029 scmd->satacmd_sec_count_lsb = subcmd | mode;
14030
14031 /* Transfer command to HBA */
14032 if ((*SATA_START_FUNC(sata_hba_inst))(SATA_DIP(sata_hba_inst),
14033 spkt) != SATA_TRAN_ACCEPTED ||
14034 spkt->satapkt_reason != SATA_PKT_COMPLETED) {
14035 /* Pkt execution failed */
14036 rval = SATA_FAILURE;
14037 }
14038 done:
14039
14040 /* Free allocated resources */
14041 if (spkt != NULL)
14042 sata_pkt_free(spx);
14043 (void) kmem_free(spx, sizeof (sata_pkt_txlate_t));
14044
14045 return (rval);
14046 }
14047
14048
14049 /*
14050 * Set device caching mode.
14051 * One of the following operations should be specified:
14052 * SATAC_SF_ENABLE_READ_AHEAD
14053 * SATAC_SF_DISABLE_READ_AHEAD
14054 * SATAC_SF_ENABLE_WRITE_CACHE
14055 * SATAC_SF_DISABLE_WRITE_CACHE
14056 *
14057 * If operation fails, system log messgage is emitted.
14058 * Returns SATA_SUCCESS when the operation succeeds, SATA_RETRY if
14059 * command was sent but did not succeed, and SATA_FAILURE otherwise.
14060 */
14061
14062 static int
sata_set_cache_mode(sata_hba_inst_t * sata_hba_inst,sata_drive_info_t * sdinfo,int cache_op)14063 sata_set_cache_mode(sata_hba_inst_t *sata_hba_inst, sata_drive_info_t *sdinfo,
14064 int cache_op)
14065 {
14066 sata_pkt_t *spkt;
14067 sata_cmd_t *scmd;
14068 sata_pkt_txlate_t *spx;
14069 int rval = SATA_SUCCESS;
14070 int hba_rval;
14071 char *infop;
14072
14073 ASSERT(sdinfo != NULL);
14074 ASSERT(sata_hba_inst != NULL);
14075 ASSERT(cache_op == SATAC_SF_ENABLE_READ_AHEAD ||
14076 cache_op == SATAC_SF_DISABLE_READ_AHEAD ||
14077 cache_op == SATAC_SF_ENABLE_WRITE_CACHE ||
14078 cache_op == SATAC_SF_DISABLE_WRITE_CACHE);
14079
14080
14081 /* Prepare packet for SET FEATURES COMMAND */
14082 spx = kmem_zalloc(sizeof (sata_pkt_txlate_t), KM_SLEEP);
14083 spx->txlt_sata_hba_inst = sata_hba_inst;
14084 spx->txlt_scsi_pkt = NULL; /* No scsi pkt involved */
14085 spkt = sata_pkt_alloc(spx, SLEEP_FUNC);
14086 if (spkt == NULL) {
14087 rval = SATA_FAILURE;
14088 goto failure;
14089 }
14090 /* Fill sata_pkt */
14091 spkt->satapkt_device.satadev_addr = sdinfo->satadrv_addr;
14092 /* Timeout 30s */
14093 spkt->satapkt_time = sata_default_pkt_time;
14094 /* Synchronous mode, no callback, interrupts */
14095 spkt->satapkt_op_mode =
14096 SATA_OPMODE_SYNCH | SATA_OPMODE_INTERRUPTS;
14097 spkt->satapkt_comp = NULL;
14098 scmd = &spkt->satapkt_cmd;
14099 scmd->satacmd_flags.sata_data_direction = SATA_DIR_NODATA_XFER;
14100 scmd->satacmd_flags.sata_ignore_dev_reset = B_TRUE;
14101 scmd->satacmd_addr_type = 0;
14102 scmd->satacmd_device_reg = 0;
14103 scmd->satacmd_status_reg = 0;
14104 scmd->satacmd_error_reg = 0;
14105 scmd->satacmd_cmd_reg = SATAC_SET_FEATURES;
14106 scmd->satacmd_features_reg = cache_op;
14107
14108 /* Transfer command to HBA */
14109 hba_rval = (*SATA_START_FUNC(sata_hba_inst))(
14110 SATA_DIP(sata_hba_inst), spkt);
14111
14112 #ifdef SATA_INJECT_FAULTS
14113 sata_inject_pkt_fault(spkt, &rval, sata_fault_type);
14114 #endif
14115
14116 if ((hba_rval != SATA_TRAN_ACCEPTED) ||
14117 (spkt->satapkt_reason != SATA_PKT_COMPLETED)) {
14118 /* Pkt execution failed */
14119 switch (cache_op) {
14120 case SATAC_SF_ENABLE_READ_AHEAD:
14121 infop = "enabling read ahead failed";
14122 break;
14123 case SATAC_SF_DISABLE_READ_AHEAD:
14124 infop = "disabling read ahead failed";
14125 break;
14126 case SATAC_SF_ENABLE_WRITE_CACHE:
14127 infop = "enabling write cache failed";
14128 break;
14129 case SATAC_SF_DISABLE_WRITE_CACHE:
14130 infop = "disabling write cache failed";
14131 break;
14132 }
14133 SATA_LOG_D((sata_hba_inst, CE_WARN, "%s", infop));
14134 rval = SATA_RETRY;
14135 }
14136 failure:
14137 /* Free allocated resources */
14138 if (spkt != NULL)
14139 sata_pkt_free(spx);
14140 (void) kmem_free(spx, sizeof (sata_pkt_txlate_t));
14141 return (rval);
14142 }
14143
14144 /*
14145 * Set Removable Media Status Notification (enable/disable)
14146 * state == 0 , disable
14147 * state != 0 , enable
14148 *
14149 * If operation fails, system log messgage is emitted.
14150 * Returns SATA_SUCCESS when the operation succeeds, SATA_FAILURE otherwise.
14151 */
14152
14153 static int
sata_set_rmsn(sata_hba_inst_t * sata_hba_inst,sata_drive_info_t * sdinfo,int state)14154 sata_set_rmsn(sata_hba_inst_t *sata_hba_inst, sata_drive_info_t *sdinfo,
14155 int state)
14156 {
14157 sata_pkt_t *spkt;
14158 sata_cmd_t *scmd;
14159 sata_pkt_txlate_t *spx;
14160 int rval = SATA_SUCCESS;
14161 char *infop;
14162
14163 ASSERT(sdinfo != NULL);
14164 ASSERT(sata_hba_inst != NULL);
14165
14166 /* Prepare packet for SET FEATURES COMMAND */
14167 spx = kmem_zalloc(sizeof (sata_pkt_txlate_t), KM_SLEEP);
14168 spx->txlt_sata_hba_inst = sata_hba_inst;
14169 spx->txlt_scsi_pkt = NULL; /* No scsi pkt involved */
14170 spkt = sata_pkt_alloc(spx, SLEEP_FUNC);
14171 if (spkt == NULL) {
14172 rval = SATA_FAILURE;
14173 goto failure;
14174 }
14175 /* Fill sata_pkt */
14176 spkt->satapkt_device.satadev_addr = sdinfo->satadrv_addr;
14177 /* Timeout 30s */
14178 spkt->satapkt_time = sata_default_pkt_time;
14179 /* Synchronous mode, no callback, interrupts */
14180 spkt->satapkt_op_mode =
14181 SATA_OPMODE_SYNCH | SATA_OPMODE_INTERRUPTS;
14182 spkt->satapkt_comp = NULL;
14183 scmd = &spkt->satapkt_cmd;
14184 scmd->satacmd_flags.sata_data_direction = SATA_DIR_NODATA_XFER;
14185 scmd->satacmd_flags.sata_ignore_dev_reset = B_TRUE;
14186 scmd->satacmd_addr_type = 0;
14187 scmd->satacmd_device_reg = 0;
14188 scmd->satacmd_status_reg = 0;
14189 scmd->satacmd_error_reg = 0;
14190 scmd->satacmd_cmd_reg = SATAC_SET_FEATURES;
14191 if (state == 0)
14192 scmd->satacmd_features_reg = SATAC_SF_DISABLE_RMSN;
14193 else
14194 scmd->satacmd_features_reg = SATAC_SF_ENABLE_RMSN;
14195
14196 /* Transfer command to HBA */
14197 if (((*SATA_START_FUNC(sata_hba_inst))(
14198 SATA_DIP(sata_hba_inst), spkt) != SATA_TRAN_ACCEPTED) ||
14199 (spkt->satapkt_reason != SATA_PKT_COMPLETED)) {
14200 /* Pkt execution failed */
14201 if (state == 0)
14202 infop = "disabling Removable Media Status "
14203 "Notification failed";
14204 else
14205 infop = "enabling Removable Media Status "
14206 "Notification failed";
14207
14208 SATA_LOG_D((sata_hba_inst, CE_WARN, "%s", infop));
14209 rval = SATA_FAILURE;
14210 }
14211 failure:
14212 /* Free allocated resources */
14213 if (spkt != NULL)
14214 sata_pkt_free(spx);
14215 (void) kmem_free(spx, sizeof (sata_pkt_txlate_t));
14216 return (rval);
14217 }
14218
14219
14220 /*
14221 * Update state and copy port ss* values from passed sata_device structure.
14222 * sata_address is validated - if not valid, nothing is changed in sata_scsi
14223 * configuration struct.
14224 *
14225 * SATA_PSTATE_SHUTDOWN in port state is not reset to 0 by this function
14226 * regardless of the state in device argument.
14227 *
14228 * Port mutex should be held while calling this function.
14229 */
14230 static void
sata_update_port_info(sata_hba_inst_t * sata_hba_inst,sata_device_t * sata_device)14231 sata_update_port_info(sata_hba_inst_t *sata_hba_inst,
14232 sata_device_t *sata_device)
14233 {
14234 sata_cport_info_t *cportinfo;
14235
14236 if (sata_device->satadev_addr.qual == SATA_ADDR_CPORT ||
14237 sata_device->satadev_addr.qual == SATA_ADDR_DCPORT) {
14238 if (SATA_NUM_CPORTS(sata_hba_inst) <=
14239 sata_device->satadev_addr.cport)
14240 return;
14241
14242 cportinfo = SATA_CPORT_INFO(sata_hba_inst,
14243 sata_device->satadev_addr.cport);
14244
14245 ASSERT(mutex_owned(&cportinfo->cport_mutex));
14246 cportinfo->cport_scr = sata_device->satadev_scr;
14247
14248 /* Preserve SATA_PSTATE_SHUTDOWN flag */
14249 cportinfo->cport_state &= ~(SATA_PSTATE_PWRON |
14250 SATA_PSTATE_PWROFF | SATA_PSTATE_FAILED);
14251 cportinfo->cport_state |=
14252 sata_device->satadev_state & SATA_PSTATE_VALID;
14253 }
14254 }
14255
14256 void
sata_update_pmport_info(sata_hba_inst_t * sata_hba_inst,sata_device_t * sata_device)14257 sata_update_pmport_info(sata_hba_inst_t *sata_hba_inst,
14258 sata_device_t *sata_device)
14259 {
14260 sata_pmport_info_t *pmportinfo;
14261
14262 if ((sata_device->satadev_addr.qual != SATA_ADDR_PMPORT &&
14263 sata_device->satadev_addr.qual != SATA_ADDR_DPMPORT) ||
14264 SATA_NUM_PMPORTS(sata_hba_inst,
14265 sata_device->satadev_addr.cport) <
14266 sata_device->satadev_addr.pmport) {
14267 SATADBG1(SATA_DBG_PMULT, sata_hba_inst,
14268 "sata_update_port_info: error address %p.",
14269 &sata_device->satadev_addr);
14270 return;
14271 }
14272
14273 pmportinfo = SATA_PMPORT_INFO(sata_hba_inst,
14274 sata_device->satadev_addr.cport,
14275 sata_device->satadev_addr.pmport);
14276
14277 ASSERT(mutex_owned(&pmportinfo->pmport_mutex));
14278 pmportinfo->pmport_scr = sata_device->satadev_scr;
14279
14280 /* Preserve SATA_PSTATE_SHUTDOWN flag */
14281 pmportinfo->pmport_state &=
14282 ~(SATA_PSTATE_PWRON | SATA_PSTATE_PWROFF | SATA_PSTATE_FAILED);
14283 pmportinfo->pmport_state |=
14284 sata_device->satadev_state & SATA_PSTATE_VALID;
14285 }
14286
14287 /*
14288 * Extract SATA port specification from an IOCTL argument.
14289 *
14290 * This function return the port the user land send us as is, unless it
14291 * cannot retrieve port spec, then -1 is returned.
14292 *
14293 * Support port multiplier.
14294 */
14295 static int32_t
sata_get_port_num(sata_hba_inst_t * sata_hba_inst,struct devctl_iocdata * dcp)14296 sata_get_port_num(sata_hba_inst_t *sata_hba_inst, struct devctl_iocdata *dcp)
14297 {
14298 int32_t port;
14299
14300 /* Extract port number from nvpair in dca structure */
14301 if (nvlist_lookup_int32(ndi_dc_get_ap_data(dcp), "port", &port) != 0) {
14302 SATA_LOG_D((sata_hba_inst, CE_NOTE,
14303 "sata_get_port_num: invalid port spec 0x%x in ioctl",
14304 port));
14305 port = -1;
14306 }
14307
14308 return (port);
14309 }
14310
14311 /*
14312 * Get dev_info_t pointer to the device node pointed to by port argument.
14313 * NOTE: target argument is a value used in ioctls to identify
14314 * the AP - it is not a sata_address.
14315 * It is a combination of cport, pmport and address qualifier, encodded same
14316 * way as a scsi target number.
14317 * At this moment it carries only cport number.
14318 *
14319 * PMult hotplug is supported now.
14320 *
14321 * Returns dev_info_t pointer if target device was found, NULL otherwise.
14322 */
14323
14324 static dev_info_t *
sata_get_target_dip(dev_info_t * dip,uint8_t cport,uint8_t pmport)14325 sata_get_target_dip(dev_info_t *dip, uint8_t cport, uint8_t pmport)
14326 {
14327 dev_info_t *cdip = NULL;
14328 int target, tgt;
14329 int circ;
14330 uint8_t qual;
14331
14332 sata_hba_inst_t *sata_hba_inst;
14333 scsi_hba_tran_t *scsi_hba_tran;
14334
14335 /* Get target id */
14336 scsi_hba_tran = ddi_get_driver_private(dip);
14337 if (scsi_hba_tran == NULL)
14338 return (NULL);
14339
14340 sata_hba_inst = scsi_hba_tran->tran_hba_private;
14341
14342 if (sata_hba_inst == NULL)
14343 return (NULL);
14344
14345 /* Identify a port-mult by cport_info.cport_dev_type */
14346 if (SATA_CPORT_DEV_TYPE(sata_hba_inst, cport) == SATA_DTYPE_PMULT)
14347 qual = SATA_ADDR_DPMPORT;
14348 else
14349 qual = SATA_ADDR_DCPORT;
14350
14351 target = SATA_TO_SCSI_TARGET(cport, pmport, qual);
14352
14353 /* Retrieve target dip */
14354 ndi_devi_enter(dip, &circ);
14355 for (cdip = ddi_get_child(dip); cdip != NULL; ) {
14356 dev_info_t *next = ddi_get_next_sibling(cdip);
14357
14358 tgt = ddi_prop_get_int(DDI_DEV_T_ANY, cdip,
14359 DDI_PROP_DONTPASS, "target", -1);
14360 if (tgt == -1) {
14361 /*
14362 * This is actually an error condition, but not
14363 * a fatal one. Just continue the search.
14364 */
14365 cdip = next;
14366 continue;
14367 }
14368
14369 if (tgt == target)
14370 break;
14371
14372 cdip = next;
14373 }
14374 ndi_devi_exit(dip, circ);
14375
14376 return (cdip);
14377 }
14378
14379 /*
14380 * Get dev_info_t pointer to the device node pointed to by port argument.
14381 * NOTE: target argument is a value used in ioctls to identify
14382 * the AP - it is not a sata_address.
14383 * It is a combination of cport, pmport and address qualifier, encoded same
14384 * way as a scsi target number.
14385 *
14386 * Returns dev_info_t pointer if target device was found, NULL otherwise.
14387 */
14388
14389 static dev_info_t *
sata_get_scsi_target_dip(dev_info_t * dip,sata_address_t * saddr)14390 sata_get_scsi_target_dip(dev_info_t *dip, sata_address_t *saddr)
14391 {
14392 dev_info_t *cdip = NULL;
14393 int target, tgt;
14394 int circ;
14395
14396 target = SATA_TO_SCSI_TARGET(saddr->cport, saddr->pmport, saddr->qual);
14397
14398 ndi_devi_enter(dip, &circ);
14399 for (cdip = ddi_get_child(dip); cdip != NULL; ) {
14400 dev_info_t *next = ddi_get_next_sibling(cdip);
14401
14402 tgt = ddi_prop_get_int(DDI_DEV_T_ANY, cdip,
14403 DDI_PROP_DONTPASS, "target", -1);
14404 if (tgt == -1) {
14405 /*
14406 * This is actually an error condition, but not
14407 * a fatal one. Just continue the search.
14408 */
14409 cdip = next;
14410 continue;
14411 }
14412
14413 if (tgt == target)
14414 break;
14415
14416 cdip = next;
14417 }
14418 ndi_devi_exit(dip, circ);
14419
14420 return (cdip);
14421 }
14422
14423 /*
14424 * Process sata port disconnect request.
14425 * Normally, cfgadm sata plugin will try to offline (unconfigure) the device
14426 * before this request. Nevertheless, if a device is still configured,
14427 * we need to attempt to offline and unconfigure device.
14428 * Regardless of the unconfigure operation results the port is marked as
14429 * deactivated and no access to the attached device is possible.
14430 * If the target node remains because unconfigure operation failed, its state
14431 * will be set to DEVICE_REMOVED, preventing it to be used again when a device
14432 * is inserted/re-inserted. The event daemon will repeatedly try to unconfigure
14433 * the device and remove old target node.
14434 *
14435 * This function invokes sata_hba_inst->satahba_tran->
14436 * sata_tran_hotplug_ops->sata_tran_port_deactivate().
14437 * If successful, the device structure (if any) attached to the specified port
14438 * is removed and state of the port marked appropriately.
14439 * Failure of the port_deactivate may keep port in the physically active state,
14440 * or may fail the port.
14441 *
14442 * NOTE: Port multiplier is supported.
14443 */
14444
14445 static int
sata_ioctl_disconnect(sata_hba_inst_t * sata_hba_inst,sata_device_t * sata_device)14446 sata_ioctl_disconnect(sata_hba_inst_t *sata_hba_inst,
14447 sata_device_t *sata_device)
14448 {
14449 sata_drive_info_t *sdinfo = NULL, *subsdinfo = NULL;
14450 sata_cport_info_t *cportinfo = NULL;
14451 sata_pmport_info_t *pmportinfo = NULL;
14452 sata_pmult_info_t *pmultinfo = NULL;
14453 sata_device_t subsdevice;
14454 int cport, pmport, qual;
14455 int rval = SATA_SUCCESS;
14456 int npmport = 0;
14457 int rv = 0;
14458
14459 cport = sata_device->satadev_addr.cport;
14460 pmport = sata_device->satadev_addr.pmport;
14461 qual = sata_device->satadev_addr.qual;
14462
14463 ASSERT(qual == SATA_ADDR_DCPORT || qual == SATA_ADDR_DPMPORT);
14464 if (qual == SATA_ADDR_DCPORT)
14465 qual = SATA_ADDR_CPORT;
14466 else
14467 qual = SATA_ADDR_PMPORT;
14468
14469 /*
14470 * DEVCTL_AP_DISCONNECT invokes sata_hba_inst->satahba_tran->
14471 * sata_tran_hotplug_ops->sata_tran_port_deactivate().
14472 * Do the sanity check.
14473 */
14474 if (SATA_PORT_DEACTIVATE_FUNC(sata_hba_inst) == NULL) {
14475 /* No physical port deactivation supported. */
14476 return (EINVAL);
14477 }
14478
14479 /* Check the current state of the port */
14480 rval = (*SATA_PROBE_PORT_FUNC(sata_hba_inst))
14481 (SATA_DIP(sata_hba_inst), sata_device);
14482
14483 cportinfo = SATA_CPORT_INFO(sata_hba_inst, cport);
14484
14485 /*
14486 * Processing port mulitiplier
14487 */
14488 if (qual == SATA_ADDR_CPORT &&
14489 SATA_CPORT_DEV_TYPE(sata_hba_inst, cport) == SATA_DTYPE_PMULT) {
14490 mutex_enter(&cportinfo->cport_mutex);
14491
14492 /* Check controller port status */
14493 sata_update_port_info(sata_hba_inst, sata_device);
14494 if (rval != SATA_SUCCESS ||
14495 (sata_device->satadev_state & SATA_PSTATE_FAILED) != 0) {
14496 /*
14497 * Device port status is unknown or it is in failed
14498 * state
14499 */
14500 SATA_CPORT_STATE(sata_hba_inst, cport) =
14501 SATA_PSTATE_FAILED;
14502 SATADBG1(SATA_DBG_IOCTL_IF, sata_hba_inst,
14503 "sata_hba_ioctl: connect: failed to deactivate "
14504 "SATA port %d", cport);
14505 mutex_exit(&cportinfo->cport_mutex);
14506 return (EIO);
14507 }
14508
14509 /* Disconnect all sub-devices. */
14510 pmultinfo = SATA_CPORTINFO_PMULT_INFO(cportinfo);
14511 if (pmultinfo != NULL) {
14512
14513 for (npmport = 0; npmport < SATA_NUM_PMPORTS(
14514 sata_hba_inst, cport); npmport ++) {
14515 subsdinfo = SATA_PMPORT_DRV_INFO(
14516 sata_hba_inst, cport, npmport);
14517 if (subsdinfo == NULL)
14518 continue;
14519
14520 subsdevice.satadev_addr = subsdinfo->
14521 satadrv_addr;
14522
14523 mutex_exit(&cportinfo->cport_mutex);
14524 if (sata_ioctl_disconnect(sata_hba_inst,
14525 &subsdevice) == SATA_SUCCESS) {
14526 SATADBG2(SATA_DBG_PMULT, sata_hba_inst,
14527 "[Remove] device at port %d:%d "
14528 "successfully.", cport, npmport);
14529 }
14530 mutex_enter(&cportinfo->cport_mutex);
14531 }
14532 }
14533
14534 /* Disconnect the port multiplier */
14535 cportinfo->cport_state &= ~SATA_STATE_READY;
14536 mutex_exit(&cportinfo->cport_mutex);
14537
14538 sata_device->satadev_addr.qual = qual;
14539 rval = (*SATA_PORT_DEACTIVATE_FUNC(sata_hba_inst))
14540 (SATA_DIP(sata_hba_inst), sata_device);
14541
14542 sata_gen_sysevent(sata_hba_inst, &sata_device->satadev_addr,
14543 SE_NO_HINT);
14544
14545 mutex_enter(&cportinfo->cport_mutex);
14546 sata_update_port_info(sata_hba_inst, sata_device);
14547 if (rval != SATA_SUCCESS &&
14548 sata_device->satadev_state & SATA_PSTATE_FAILED) {
14549 cportinfo->cport_state = SATA_PSTATE_FAILED;
14550 rv = EIO;
14551 } else {
14552 cportinfo->cport_state |= SATA_PSTATE_SHUTDOWN;
14553 }
14554 mutex_exit(&cportinfo->cport_mutex);
14555
14556 return (rv);
14557 }
14558
14559 /*
14560 * Process non-port-multiplier device - it could be a drive connected
14561 * to a port multiplier port or a controller port.
14562 */
14563 if (qual == SATA_ADDR_PMPORT) {
14564 pmportinfo = SATA_PMPORT_INFO(sata_hba_inst, cport, pmport);
14565 mutex_enter(&pmportinfo->pmport_mutex);
14566 sata_update_pmport_info(sata_hba_inst, sata_device);
14567 if (rval != SATA_SUCCESS ||
14568 (sata_device->satadev_state & SATA_PSTATE_FAILED) != 0) {
14569 SATA_PMPORT_STATE(sata_hba_inst, cport, pmport) =
14570 SATA_PSTATE_FAILED;
14571 SATADBG2(SATA_DBG_IOCTL_IF, sata_hba_inst,
14572 "sata_hba_ioctl: connect: failed to deactivate "
14573 "SATA port %d:%d", cport, pmport);
14574 mutex_exit(&pmportinfo->pmport_mutex);
14575 return (EIO);
14576 }
14577
14578 if (pmportinfo->pmport_dev_type != SATA_DTYPE_NONE) {
14579 sdinfo = pmportinfo->pmport_sata_drive;
14580 ASSERT(sdinfo != NULL);
14581 }
14582
14583 /*
14584 * Set port's dev_state to not ready - this will disable
14585 * an access to a potentially attached device.
14586 */
14587 pmportinfo->pmport_state &= ~SATA_STATE_READY;
14588
14589 /* Remove and release sata_drive info structure. */
14590 if (sdinfo != NULL) {
14591 if ((sdinfo->satadrv_type &
14592 SATA_VALID_DEV_TYPE) != 0) {
14593 /*
14594 * If a target node exists, try to offline
14595 * a device and remove target node.
14596 */
14597 mutex_exit(&pmportinfo->pmport_mutex);
14598 (void) sata_offline_device(sata_hba_inst,
14599 sata_device, sdinfo);
14600 mutex_enter(&pmportinfo->pmport_mutex);
14601 }
14602
14603 SATA_PMPORTINFO_DRV_INFO(pmportinfo) = NULL;
14604 pmportinfo->pmport_dev_type = SATA_DTYPE_NONE;
14605 (void) kmem_free((void *)sdinfo,
14606 sizeof (sata_drive_info_t));
14607 }
14608 mutex_exit(&pmportinfo->pmport_mutex);
14609
14610 } else if (qual == SATA_ADDR_CPORT) {
14611 mutex_enter(&cportinfo->cport_mutex);
14612 sata_update_port_info(sata_hba_inst, sata_device);
14613 if (rval != SATA_SUCCESS ||
14614 (sata_device->satadev_state & SATA_PSTATE_FAILED) != 0) {
14615 /*
14616 * Device port status is unknown or it is in failed
14617 * state
14618 */
14619 SATA_CPORT_STATE(sata_hba_inst, cport) =
14620 SATA_PSTATE_FAILED;
14621 SATADBG1(SATA_DBG_IOCTL_IF, sata_hba_inst,
14622 "sata_hba_ioctl: connect: failed to deactivate "
14623 "SATA port %d", cport);
14624 mutex_exit(&cportinfo->cport_mutex);
14625 return (EIO);
14626 }
14627
14628 if (cportinfo->cport_dev_type == SATA_DTYPE_PMULT) {
14629 pmultinfo = SATA_CPORTINFO_PMULT_INFO(cportinfo);
14630 ASSERT(pmultinfo != NULL);
14631 } else if (cportinfo->cport_dev_type != SATA_DTYPE_NONE) {
14632 sdinfo = SATA_CPORTINFO_DRV_INFO(cportinfo);
14633 ASSERT(sdinfo != NULL);
14634 }
14635 cportinfo->cport_state &= ~SATA_STATE_READY;
14636
14637 if (sdinfo != NULL) {
14638 if ((sdinfo->satadrv_type &
14639 SATA_VALID_DEV_TYPE) != 0) {
14640 /*
14641 * If a target node exists, try to offline
14642 * a device and remove target node.
14643 */
14644 mutex_exit(&cportinfo->cport_mutex);
14645 (void) sata_offline_device(sata_hba_inst,
14646 sata_device, sdinfo);
14647 mutex_enter(&cportinfo->cport_mutex);
14648 }
14649
14650 SATA_CPORTINFO_DRV_INFO(cportinfo) = NULL;
14651 cportinfo->cport_dev_type = SATA_DTYPE_NONE;
14652 (void) kmem_free((void *)sdinfo,
14653 sizeof (sata_drive_info_t));
14654 }
14655 mutex_exit(&cportinfo->cport_mutex);
14656 }
14657
14658 /* Just ask HBA driver to deactivate port */
14659 sata_device->satadev_addr.qual = qual;
14660
14661 rval = (*SATA_PORT_DEACTIVATE_FUNC(sata_hba_inst))
14662 (SATA_DIP(sata_hba_inst), sata_device);
14663
14664 /*
14665 * Generate sysevent - EC_DR / ESC_DR_AP_STATE_CHANGE
14666 * without the hint (to force listener to investivate the state).
14667 */
14668 sata_gen_sysevent(sata_hba_inst, &sata_device->satadev_addr,
14669 SE_NO_HINT);
14670
14671 if (qual == SATA_ADDR_PMPORT) {
14672 mutex_enter(&pmportinfo->pmport_mutex);
14673 sata_update_pmport_info(sata_hba_inst, sata_device);
14674
14675 if (rval != SATA_SUCCESS &&
14676 sata_device->satadev_state & SATA_PSTATE_FAILED) {
14677 /*
14678 * Port deactivation failure - do not change port
14679 * state unless the state returned by HBA indicates a
14680 * port failure.
14681 *
14682 * NOTE: device structures were released, so devices
14683 * now are invisible! Port reset is needed to
14684 * re-enumerate devices.
14685 */
14686 pmportinfo->pmport_state = SATA_PSTATE_FAILED;
14687 rv = EIO;
14688 } else {
14689 /*
14690 * Deactivation succeded. From now on the sata framework
14691 * will not care what is happening to the device, until
14692 * the port is activated again.
14693 */
14694 pmportinfo->pmport_state |= SATA_PSTATE_SHUTDOWN;
14695 }
14696 mutex_exit(&pmportinfo->pmport_mutex);
14697 } else if (qual == SATA_ADDR_CPORT) {
14698 mutex_enter(&cportinfo->cport_mutex);
14699 sata_update_port_info(sata_hba_inst, sata_device);
14700
14701 if (rval != SATA_SUCCESS &&
14702 sata_device->satadev_state & SATA_PSTATE_FAILED) {
14703 cportinfo->cport_state = SATA_PSTATE_FAILED;
14704 rv = EIO;
14705 } else {
14706 cportinfo->cport_state |= SATA_PSTATE_SHUTDOWN;
14707 }
14708 mutex_exit(&cportinfo->cport_mutex);
14709 }
14710
14711 return (rv);
14712 }
14713
14714
14715
14716 /*
14717 * Process sata port connect request
14718 * The sata cfgadm pluging will invoke this operation only if port was found
14719 * in the disconnect state (failed state is also treated as the disconnected
14720 * state).
14721 * DEVCTL_AP_CONNECT would invoke sata_hba_inst->satahba_tran->
14722 * sata_tran_hotplug_ops->sata_tran_port_activate().
14723 * If successful and a device is found attached to the port,
14724 * the initialization sequence is executed to attach a device structure to
14725 * a port structure. The state of the port and a device would be set
14726 * appropriately.
14727 * The device is not set in configured state (system-wise) by this operation.
14728 *
14729 * Note, that activating the port may generate link events,
14730 * so it is important that following processing and the
14731 * event processing does not interfere with each other!
14732 *
14733 * This operation may remove port failed state and will
14734 * try to make port active and in good standing.
14735 *
14736 * NOTE: Port multiplier is supported.
14737 */
14738
14739 static int
sata_ioctl_connect(sata_hba_inst_t * sata_hba_inst,sata_device_t * sata_device)14740 sata_ioctl_connect(sata_hba_inst_t *sata_hba_inst,
14741 sata_device_t *sata_device)
14742 {
14743 sata_pmport_info_t *pmportinfo = NULL;
14744 uint8_t cport, pmport, qual;
14745 int rv = 0;
14746
14747 cport = sata_device->satadev_addr.cport;
14748 pmport = sata_device->satadev_addr.pmport;
14749 qual = sata_device->satadev_addr.qual;
14750
14751 ASSERT(qual == SATA_ADDR_DCPORT || qual == SATA_ADDR_DPMPORT);
14752 if (qual == SATA_ADDR_DCPORT)
14753 qual = SATA_ADDR_CPORT;
14754 else
14755 qual = SATA_ADDR_PMPORT;
14756
14757 if (qual == SATA_ADDR_PMPORT)
14758 pmportinfo = SATA_PMPORT_INFO(sata_hba_inst, cport, pmport);
14759
14760 /*
14761 * DEVCTL_AP_CONNECT would invoke sata_hba_inst->
14762 * satahba_tran->sata_tran_hotplug_ops->sata_tran_port_activate().
14763 * Perform sanity check now.
14764 */
14765 if (SATA_PORT_ACTIVATE_FUNC(sata_hba_inst) == NULL) {
14766 /* No physical port activation supported. */
14767 return (EINVAL);
14768 }
14769
14770 /* Just ask HBA driver to activate port */
14771 if ((*SATA_PORT_ACTIVATE_FUNC(sata_hba_inst))
14772 (SATA_DIP(sata_hba_inst), sata_device) != SATA_SUCCESS) {
14773 /*
14774 * Port activation failure.
14775 */
14776 if (qual == SATA_ADDR_CPORT) {
14777 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst,
14778 cport)->cport_mutex);
14779 sata_update_port_info(sata_hba_inst, sata_device);
14780 if (sata_device->satadev_state & SATA_PSTATE_FAILED) {
14781 SATA_CPORT_STATE(sata_hba_inst, cport) =
14782 SATA_PSTATE_FAILED;
14783 SATADBG1(SATA_DBG_IOCTL_IF, sata_hba_inst,
14784 "sata_hba_ioctl: connect: failed to "
14785 "activate SATA port %d", cport);
14786 }
14787 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst,
14788 cport)->cport_mutex);
14789 } else { /* port multiplier device port */
14790 mutex_enter(&pmportinfo->pmport_mutex);
14791 sata_update_pmport_info(sata_hba_inst, sata_device);
14792 if (sata_device->satadev_state & SATA_PSTATE_FAILED) {
14793 SATA_PMPORT_STATE(sata_hba_inst, cport,
14794 pmport) = SATA_PSTATE_FAILED;
14795 SATADBG2(SATA_DBG_IOCTL_IF, sata_hba_inst,
14796 "sata_hba_ioctl: connect: failed to "
14797 "activate SATA port %d:%d", cport, pmport);
14798 }
14799 mutex_exit(&pmportinfo->pmport_mutex);
14800 }
14801 return (EIO);
14802 }
14803
14804 /* Virgin port state - will be updated by the port re-probe. */
14805 if (qual == SATA_ADDR_CPORT) {
14806 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst,
14807 cport)->cport_mutex);
14808 SATA_CPORT_STATE(sata_hba_inst, cport) = 0;
14809 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst,
14810 cport)->cport_mutex);
14811 } else { /* port multiplier device port */
14812 mutex_enter(&pmportinfo->pmport_mutex);
14813 SATA_PMPORT_STATE(sata_hba_inst, cport, pmport) = 0;
14814 mutex_exit(&pmportinfo->pmport_mutex);
14815 }
14816
14817 /*
14818 * Probe the port to find its state and attached device.
14819 */
14820 if (sata_reprobe_port(sata_hba_inst, sata_device,
14821 SATA_DEV_IDENTIFY_RETRY) == SATA_FAILURE)
14822 rv = EIO;
14823
14824 /*
14825 * Generate sysevent - EC_DR / ESC_DR_AP_STATE_CHANGE
14826 * without the hint
14827 */
14828 sata_gen_sysevent(sata_hba_inst, &sata_device->satadev_addr,
14829 SE_NO_HINT);
14830
14831 /*
14832 * If there is a device attached to the port, emit
14833 * a message.
14834 */
14835 if (sata_device->satadev_type != SATA_DTYPE_NONE) {
14836
14837 if (qual == SATA_ADDR_CPORT) {
14838 if (sata_device->satadev_type == SATA_DTYPE_PMULT) {
14839 sata_log(sata_hba_inst, CE_WARN,
14840 "SATA port multiplier detected "
14841 "at port %d", cport);
14842 } else {
14843 sata_log(sata_hba_inst, CE_WARN,
14844 "SATA device detected at port %d", cport);
14845 if (sata_device->satadev_type ==
14846 SATA_DTYPE_UNKNOWN) {
14847 /*
14848 * A device was not successfully identified
14849 */
14850 sata_log(sata_hba_inst, CE_WARN,
14851 "Could not identify SATA "
14852 "device at port %d", cport);
14853 }
14854 }
14855 } else { /* port multiplier device port */
14856 sata_log(sata_hba_inst, CE_WARN,
14857 "SATA device detected at port %d:%d",
14858 cport, pmport);
14859 if (sata_device->satadev_type == SATA_DTYPE_UNKNOWN) {
14860 /*
14861 * A device was not successfully identified
14862 */
14863 sata_log(sata_hba_inst, CE_WARN,
14864 "Could not identify SATA "
14865 "device at port %d:%d", cport, pmport);
14866 }
14867 }
14868 }
14869
14870 return (rv);
14871 }
14872
14873
14874 /*
14875 * Process sata device unconfigure request.
14876 * The unconfigure operation uses generic nexus operation to
14877 * offline a device. It leaves a target device node attached.
14878 * and obviously sata_drive_info attached as well, because
14879 * from the hardware point of view nothing has changed.
14880 */
14881 static int
sata_ioctl_unconfigure(sata_hba_inst_t * sata_hba_inst,sata_device_t * sata_device)14882 sata_ioctl_unconfigure(sata_hba_inst_t *sata_hba_inst,
14883 sata_device_t *sata_device)
14884 {
14885 int rv = 0;
14886 dev_info_t *tdip;
14887
14888 /* We are addressing attached device, not a port */
14889 if (sata_device->satadev_addr.qual == SATA_ADDR_CPORT)
14890 sata_device->satadev_addr.qual = SATA_ADDR_DCPORT;
14891 else if (sata_device->satadev_addr.qual == SATA_ADDR_PMPORT)
14892 sata_device->satadev_addr.qual = SATA_ADDR_DPMPORT;
14893
14894 if ((tdip = sata_get_scsi_target_dip(SATA_DIP(sata_hba_inst),
14895 &sata_device->satadev_addr)) != NULL) {
14896
14897 if (ndi_devi_offline(tdip, NDI_UNCONFIG) != NDI_SUCCESS) {
14898 SATA_LOG_D((sata_hba_inst, CE_WARN,
14899 "sata_hba_ioctl: unconfigure: "
14900 "failed to unconfigure device at SATA port %d:%d",
14901 sata_device->satadev_addr.cport,
14902 sata_device->satadev_addr.pmport));
14903 rv = EIO;
14904 }
14905 /*
14906 * The target node devi_state should be marked with
14907 * DEVI_DEVICE_OFFLINE by ndi_devi_offline().
14908 * This would be the indication for cfgadm that
14909 * the AP node occupant state is 'unconfigured'.
14910 */
14911
14912 } else {
14913 /*
14914 * This would indicate a failure on the part of cfgadm
14915 * to detect correct state of the node prior to this
14916 * call - one cannot unconfigure non-existing device.
14917 */
14918 SATA_LOG_D((sata_hba_inst, CE_WARN,
14919 "sata_hba_ioctl: unconfigure: "
14920 "attempt to unconfigure non-existing device "
14921 "at SATA port %d:%d",
14922 sata_device->satadev_addr.cport,
14923 sata_device->satadev_addr.pmport));
14924 rv = ENXIO;
14925 }
14926 return (rv);
14927 }
14928
14929 /*
14930 * Process sata device configure request
14931 * If port is in a failed state, operation is aborted - one has to use
14932 * an explicit connect or port activate request to try to get a port into
14933 * non-failed mode. Port reset wil also work in such situation.
14934 * If the port is in disconnected (shutdown) state, the connect operation is
14935 * attempted prior to any other action.
14936 * When port is in the active state, there is a device attached and the target
14937 * node exists, a device was most likely offlined.
14938 * If target node does not exist, a new target node is created. In both cases
14939 * an attempt is made to online (configure) the device.
14940 *
14941 * NOTE: Port multiplier is supported.
14942 */
14943 static int
sata_ioctl_configure(sata_hba_inst_t * sata_hba_inst,sata_device_t * sata_device)14944 sata_ioctl_configure(sata_hba_inst_t *sata_hba_inst,
14945 sata_device_t *sata_device)
14946 {
14947 int cport, pmport, qual;
14948 int rval;
14949 boolean_t target = B_TRUE;
14950 sata_cport_info_t *cportinfo;
14951 sata_pmport_info_t *pmportinfo = NULL;
14952 dev_info_t *tdip;
14953 sata_drive_info_t *sdinfo;
14954
14955 cport = sata_device->satadev_addr.cport;
14956 pmport = sata_device->satadev_addr.pmport;
14957 qual = sata_device->satadev_addr.qual;
14958
14959 /* Get current port state */
14960 rval = (*SATA_PROBE_PORT_FUNC(sata_hba_inst))
14961 (SATA_DIP(sata_hba_inst), sata_device);
14962
14963 cportinfo = SATA_CPORT_INFO(sata_hba_inst, cport);
14964 if (qual == SATA_ADDR_DPMPORT) {
14965 pmportinfo = SATA_PMPORT_INFO(sata_hba_inst, cport, pmport);
14966 mutex_enter(&pmportinfo->pmport_mutex);
14967 sata_update_pmport_info(sata_hba_inst, sata_device);
14968 if (rval != SATA_SUCCESS ||
14969 (sata_device->satadev_state & SATA_PSTATE_FAILED) != 0) {
14970 /*
14971 * Obviously, device on a failed port is not visible
14972 */
14973 mutex_exit(&pmportinfo->pmport_mutex);
14974 return (ENXIO);
14975 }
14976 mutex_exit(&pmportinfo->pmport_mutex);
14977 } else {
14978 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst,
14979 cport)->cport_mutex);
14980 sata_update_port_info(sata_hba_inst, sata_device);
14981 if (rval != SATA_SUCCESS ||
14982 (sata_device->satadev_state & SATA_PSTATE_FAILED) != 0) {
14983 /*
14984 * Obviously, device on a failed port is not visible
14985 */
14986 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst,
14987 cport)->cport_mutex);
14988 return (ENXIO);
14989 }
14990 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst,
14991 cport)->cport_mutex);
14992 }
14993
14994 if ((sata_device->satadev_state & SATA_PSTATE_SHUTDOWN) != 0) {
14995 /* need to activate port */
14996 target = B_FALSE;
14997
14998 /* Sanity check */
14999 if (SATA_PORT_ACTIVATE_FUNC(sata_hba_inst) == NULL)
15000 return (ENXIO);
15001
15002 /* Just let HBA driver to activate port */
15003 if ((*SATA_PORT_ACTIVATE_FUNC(sata_hba_inst))
15004 (SATA_DIP(sata_hba_inst), sata_device) != SATA_SUCCESS) {
15005 /*
15006 * Port activation failure - do not change port state
15007 * unless the state returned by HBA indicates a port
15008 * failure.
15009 */
15010 if (qual == SATA_ADDR_DPMPORT) {
15011 mutex_enter(&pmportinfo->pmport_mutex);
15012 sata_update_pmport_info(sata_hba_inst,
15013 sata_device);
15014 if (sata_device->satadev_state &
15015 SATA_PSTATE_FAILED)
15016 pmportinfo->pmport_state =
15017 SATA_PSTATE_FAILED;
15018 mutex_exit(&pmportinfo->pmport_mutex);
15019 } else {
15020 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst,
15021 cport)->cport_mutex);
15022 sata_update_port_info(sata_hba_inst,
15023 sata_device);
15024 if (sata_device->satadev_state &
15025 SATA_PSTATE_FAILED)
15026 cportinfo->cport_state =
15027 SATA_PSTATE_FAILED;
15028 mutex_exit(&SATA_CPORT_INFO(
15029 sata_hba_inst, cport)->cport_mutex);
15030 }
15031 }
15032 SATA_LOG_D((sata_hba_inst, CE_WARN,
15033 "sata_hba_ioctl: configure: "
15034 "failed to activate SATA port %d:%d",
15035 cport, pmport));
15036 return (EIO);
15037 }
15038 /*
15039 * Generate sysevent - EC_DR / ESC_DR_AP_STATE_CHANGE
15040 * without the hint.
15041 */
15042 sata_gen_sysevent(sata_hba_inst,
15043 &sata_device->satadev_addr, SE_NO_HINT);
15044
15045 /* Virgin port state */
15046 if (qual == SATA_ADDR_DPMPORT) {
15047 mutex_enter(&pmportinfo->pmport_mutex);
15048 pmportinfo->pmport_state = 0;
15049 mutex_exit(&pmportinfo->pmport_mutex);
15050 } else {
15051 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst,
15052 cport)-> cport_mutex);
15053 cportinfo->cport_state = 0;
15054 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst,
15055 cport)->cport_mutex);
15056 }
15057 /*
15058 * Always reprobe port, to get current device info.
15059 */
15060 if (sata_reprobe_port(sata_hba_inst, sata_device,
15061 SATA_DEV_IDENTIFY_RETRY) != SATA_SUCCESS)
15062 return (EIO);
15063
15064 if (sata_device->satadev_type != SATA_DTYPE_NONE && target == B_FALSE) {
15065 if (qual == SATA_ADDR_DPMPORT) {
15066 /*
15067 * That's the transition from "inactive" port
15068 * to active one with device attached.
15069 */
15070 sata_log(sata_hba_inst, CE_WARN,
15071 "SATA device detected at port %d:%d",
15072 cport, pmport);
15073 } else {
15074 /*
15075 * When PM is attached to the cport and cport is
15076 * activated, every PM device port needs to be reprobed.
15077 * We need to emit message for all devices detected
15078 * at port multiplier's device ports.
15079 * Add such code here.
15080 * For now, just inform about device attached to
15081 * cport.
15082 */
15083 sata_log(sata_hba_inst, CE_WARN,
15084 "SATA device detected at port %d", cport);
15085 }
15086 }
15087
15088 /*
15089 * This is where real configuration operation starts.
15090 *
15091 * When PM is attached to the cport and cport is activated,
15092 * devices attached PM device ports may have to be configured
15093 * explicitly. This may change when port multiplier is supported.
15094 * For now, configure only disks and other valid target devices.
15095 */
15096 if (!(sata_device->satadev_type & SATA_VALID_DEV_TYPE)) {
15097 if (qual == SATA_ADDR_DCPORT) {
15098 if (sata_device->satadev_type == SATA_DTYPE_UNKNOWN) {
15099 /*
15100 * A device was not successfully identified
15101 */
15102 sata_log(sata_hba_inst, CE_WARN,
15103 "Could not identify SATA "
15104 "device at port %d", cport);
15105 }
15106 } else { /* port multiplier device port */
15107 if (sata_device->satadev_type == SATA_DTYPE_UNKNOWN) {
15108 /*
15109 * A device was not successfully identified
15110 */
15111 sata_log(sata_hba_inst, CE_WARN,
15112 "Could not identify SATA "
15113 "device at port %d:%d", cport, pmport);
15114 }
15115 }
15116 return (ENXIO); /* No device to configure */
15117 }
15118
15119 /*
15120 * Here we may have a device in reset condition,
15121 * but because we are just configuring it, there is
15122 * no need to process the reset other than just
15123 * to clear device reset condition in the HBA driver.
15124 * Setting the flag SATA_EVNT_CLEAR_DEVICE_RESET will
15125 * cause a first command sent the HBA driver with the request
15126 * to clear device reset condition.
15127 */
15128 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, cport)->cport_mutex);
15129 if (qual == SATA_ADDR_DPMPORT)
15130 sata_device->satadev_addr.qual = SATA_ADDR_DPMPORT;
15131 else
15132 sata_device->satadev_addr.qual = SATA_ADDR_DCPORT;
15133 sdinfo = sata_get_device_info(sata_hba_inst, sata_device);
15134 if (sdinfo == NULL) {
15135 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, cport)->cport_mutex);
15136 return (ENXIO);
15137 }
15138 if (sdinfo->satadrv_event_flags &
15139 (SATA_EVNT_DEVICE_RESET | SATA_EVNT_INPROC_DEVICE_RESET)) {
15140 sdinfo->satadrv_event_flags = 0;
15141 }
15142 sdinfo->satadrv_event_flags |= SATA_EVNT_CLEAR_DEVICE_RESET;
15143 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, cport)->cport_mutex);
15144
15145 if ((tdip = sata_get_scsi_target_dip(SATA_DIP(sata_hba_inst),
15146 &sata_device->satadev_addr)) != NULL) {
15147 /*
15148 * Target node exists. Verify, that it belongs
15149 * to existing, attached device and not to
15150 * a removed device.
15151 */
15152 if (sata_check_device_removed(tdip) == B_TRUE) {
15153 if (qual == SATA_ADDR_DPMPORT)
15154 sata_log(sata_hba_inst, CE_WARN,
15155 "SATA device at port %d cannot be "
15156 "configured. "
15157 "Application(s) accessing "
15158 "previously attached device "
15159 "have to release it before newly "
15160 "inserted device can be made accessible.",
15161 cport);
15162 else
15163 sata_log(sata_hba_inst, CE_WARN,
15164 "SATA device at port %d:%d cannot be"
15165 "configured. "
15166 "Application(s) accessing "
15167 "previously attached device "
15168 "have to release it before newly "
15169 "inserted device can be made accessible.",
15170 cport, pmport);
15171 return (EIO);
15172 }
15173 /*
15174 * Device was not removed and re-inserted.
15175 * Try to online it.
15176 */
15177 if (ndi_devi_online(tdip, 0) != NDI_SUCCESS) {
15178 SATA_LOG_D((sata_hba_inst, CE_WARN,
15179 "sata_hba_ioctl: configure: "
15180 "onlining device at SATA port "
15181 "%d:%d failed", cport, pmport));
15182 return (EIO);
15183 }
15184
15185 if (qual == SATA_ADDR_DPMPORT) {
15186 mutex_enter(&pmportinfo->pmport_mutex);
15187 pmportinfo->pmport_tgtnode_clean = B_TRUE;
15188 mutex_exit(&pmportinfo->pmport_mutex);
15189 } else {
15190 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst,
15191 cport)->cport_mutex);
15192 cportinfo-> cport_tgtnode_clean = B_TRUE;
15193 mutex_exit(&SATA_CPORT_INFO(
15194 sata_hba_inst, cport)->cport_mutex);
15195 }
15196 } else {
15197 /*
15198 * No target node - need to create a new target node.
15199 */
15200 if (qual == SATA_ADDR_DPMPORT) {
15201 mutex_enter(&pmportinfo->pmport_mutex);
15202 pmportinfo->pmport_tgtnode_clean = B_TRUE;
15203 mutex_exit(&pmportinfo->pmport_mutex);
15204 } else {
15205 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, cport)->
15206 cport_mutex);
15207 cportinfo-> cport_tgtnode_clean = B_TRUE;
15208 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, cport)->
15209 cport_mutex);
15210 }
15211
15212 tdip = sata_create_target_node(SATA_DIP(sata_hba_inst),
15213 sata_hba_inst, &sata_device->satadev_addr);
15214 if (tdip == NULL) {
15215 /* Configure operation failed */
15216 SATA_LOG_D((sata_hba_inst, CE_WARN,
15217 "sata_hba_ioctl: configure: "
15218 "configuring SATA device at port %d:%d "
15219 "failed", cport, pmport));
15220 return (EIO);
15221 }
15222 }
15223 return (0);
15224 }
15225
15226
15227 /*
15228 * Process ioctl deactivate port request.
15229 * Arbitrarily unconfigure attached device, if any.
15230 * Even if the unconfigure fails, proceed with the
15231 * port deactivation.
15232 *
15233 * NOTE: Port Multiplier is supported now.
15234 */
15235
15236 static int
sata_ioctl_deactivate(sata_hba_inst_t * sata_hba_inst,sata_device_t * sata_device)15237 sata_ioctl_deactivate(sata_hba_inst_t *sata_hba_inst,
15238 sata_device_t *sata_device)
15239 {
15240 int cport, pmport, qual;
15241 int rval, rv = 0;
15242 int npmport;
15243 sata_cport_info_t *cportinfo;
15244 sata_pmport_info_t *pmportinfo;
15245 sata_pmult_info_t *pmultinfo;
15246 dev_info_t *tdip;
15247 sata_drive_info_t *sdinfo = NULL;
15248 sata_device_t subsdevice;
15249
15250 /* Sanity check */
15251 if (SATA_PORT_DEACTIVATE_FUNC(sata_hba_inst) == NULL)
15252 return (ENOTSUP);
15253
15254 cport = sata_device->satadev_addr.cport;
15255 pmport = sata_device->satadev_addr.pmport;
15256 qual = sata_device->satadev_addr.qual;
15257
15258 /* SCSI_TO_SATA_ADDR_QUAL() translate ap_id into a device qualifier */
15259 ASSERT(qual == SATA_ADDR_DCPORT || qual == SATA_ADDR_DPMPORT);
15260 if (qual == SATA_ADDR_DCPORT)
15261 qual = SATA_ADDR_CPORT;
15262 else
15263 qual = SATA_ADDR_PMPORT;
15264
15265 cportinfo = SATA_CPORT_INFO(sata_hba_inst, cport);
15266 if (qual == SATA_ADDR_PMPORT)
15267 pmportinfo = SATA_PMPORT_INFO(sata_hba_inst, cport, pmport);
15268
15269 /*
15270 * Processing port multiplier
15271 */
15272 if (qual == SATA_ADDR_CPORT &&
15273 SATA_CPORT_DEV_TYPE(sata_hba_inst, cport) == SATA_DTYPE_PMULT) {
15274 mutex_enter(&cportinfo->cport_mutex);
15275
15276 /* Deactivate all sub-deices */
15277 pmultinfo = SATA_CPORTINFO_PMULT_INFO(cportinfo);
15278 if (pmultinfo != NULL) {
15279 for (npmport = 0; npmport < SATA_NUM_PMPORTS(
15280 sata_hba_inst, cport); npmport++) {
15281
15282 subsdevice.satadev_addr.cport = cport;
15283 subsdevice.satadev_addr.pmport =
15284 (uint8_t)npmport;
15285 subsdevice.satadev_addr.qual =
15286 SATA_ADDR_DPMPORT;
15287
15288 SATADBG2(SATA_DBG_PMULT, sata_hba_inst,
15289 "sata_hba_ioctl: deactivate: trying to "
15290 "deactivate SATA port %d:%d",
15291 cport, npmport);
15292
15293 mutex_exit(&cportinfo->cport_mutex);
15294 if (sata_ioctl_deactivate(sata_hba_inst,
15295 &subsdevice) == SATA_SUCCESS) {
15296 SATADBG2(SATA_DBG_PMULT, sata_hba_inst,
15297 "[Deactivate] device at port %d:%d "
15298 "successfully.", cport, npmport);
15299 }
15300 mutex_enter(&cportinfo->cport_mutex);
15301 }
15302 }
15303
15304 /* Deactivate the port multiplier now. */
15305 cportinfo->cport_state &= ~SATA_STATE_READY;
15306 mutex_exit(&cportinfo->cport_mutex);
15307
15308 sata_device->satadev_addr.qual = qual;
15309 rval = (*SATA_PORT_DEACTIVATE_FUNC(sata_hba_inst))
15310 (SATA_DIP(sata_hba_inst), sata_device);
15311
15312 sata_gen_sysevent(sata_hba_inst, &sata_device->satadev_addr,
15313 SE_NO_HINT);
15314
15315 mutex_enter(&cportinfo->cport_mutex);
15316 sata_update_port_info(sata_hba_inst, sata_device);
15317 if (rval != SATA_SUCCESS) {
15318 if (sata_device->satadev_state & SATA_PSTATE_FAILED) {
15319 cportinfo->cport_state = SATA_PSTATE_FAILED;
15320 }
15321 rv = EIO;
15322 } else {
15323 cportinfo->cport_state |= SATA_PSTATE_SHUTDOWN;
15324 }
15325 mutex_exit(&cportinfo->cport_mutex);
15326
15327 return (rv);
15328 }
15329
15330 /*
15331 * Process non-port-multiplier device - it could be a drive connected
15332 * to a port multiplier port or a controller port.
15333 */
15334 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, cport)->cport_mutex);
15335 if (qual == SATA_ADDR_CPORT) {
15336 sata_device->satadev_addr.qual = SATA_ADDR_DCPORT;
15337 if (cportinfo->cport_dev_type != SATA_DTYPE_NONE) {
15338 /* deal only with valid devices */
15339 if ((cportinfo->cport_dev_type &
15340 SATA_VALID_DEV_TYPE) != 0)
15341 sdinfo = SATA_CPORTINFO_DRV_INFO(cportinfo);
15342 }
15343 cportinfo->cport_state &= ~SATA_STATE_READY;
15344 } else {
15345 /* Port multiplier device port */
15346 mutex_enter(&pmportinfo->pmport_mutex);
15347 sata_device->satadev_addr.qual = SATA_ADDR_DPMPORT;
15348 if (pmportinfo->pmport_dev_type != SATA_DTYPE_NONE &&
15349 (pmportinfo->pmport_dev_type & SATA_VALID_DEV_TYPE) != 0)
15350 sdinfo = SATA_PMPORTINFO_DRV_INFO(pmportinfo);
15351 pmportinfo->pmport_state &= ~SATA_STATE_READY;
15352 mutex_exit(&pmportinfo->pmport_mutex);
15353 }
15354
15355 if (sdinfo != NULL) {
15356 /*
15357 * If a target node exists, try to offline a device and
15358 * to remove a target node.
15359 */
15360 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, cport)->
15361 cport_mutex);
15362 tdip = sata_get_scsi_target_dip(SATA_DIP(sata_hba_inst),
15363 &sata_device->satadev_addr);
15364 if (tdip != NULL) {
15365 /* target node exist */
15366 SATADBG1(SATA_DBG_IOCTL_IF, sata_hba_inst,
15367 "sata_hba_ioctl: port deactivate: "
15368 "target node exists.", NULL);
15369
15370 if (ndi_devi_offline(tdip, NDI_DEVI_REMOVE) !=
15371 NDI_SUCCESS) {
15372 SATA_LOG_D((sata_hba_inst, CE_WARN,
15373 "sata_hba_ioctl: port deactivate: "
15374 "failed to unconfigure device at port "
15375 "%d:%d before deactivating the port",
15376 cport, pmport));
15377 /*
15378 * Set DEVICE REMOVED state in the target
15379 * node. It will prevent an access to
15380 * the device even when a new device is
15381 * attached, until the old target node is
15382 * released, removed and recreated for a new
15383 * device.
15384 */
15385 sata_set_device_removed(tdip);
15386
15387 /*
15388 * Instruct the event daemon to try the
15389 * target node cleanup later.
15390 */
15391 sata_set_target_node_cleanup(sata_hba_inst,
15392 &sata_device->satadev_addr);
15393 }
15394 }
15395 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, cport)->
15396 cport_mutex);
15397 /*
15398 * In any case, remove and release sata_drive_info
15399 * structure.
15400 */
15401 if (qual == SATA_ADDR_CPORT) {
15402 SATA_CPORTINFO_DRV_INFO(cportinfo) = NULL;
15403 cportinfo->cport_dev_type = SATA_DTYPE_NONE;
15404 } else { /* port multiplier device port */
15405 mutex_enter(&pmportinfo->pmport_mutex);
15406 SATA_PMPORTINFO_DRV_INFO(pmportinfo) = NULL;
15407 pmportinfo->pmport_dev_type = SATA_DTYPE_NONE;
15408 mutex_exit(&pmportinfo->pmport_mutex);
15409 }
15410 (void) kmem_free((void *)sdinfo, sizeof (sata_drive_info_t));
15411 }
15412
15413 if (qual == SATA_ADDR_CPORT) {
15414 cportinfo->cport_state &= ~(SATA_STATE_PROBED |
15415 SATA_STATE_PROBING);
15416 } else if (qual == SATA_ADDR_PMPORT) {
15417 mutex_enter(&pmportinfo->pmport_mutex);
15418 pmportinfo->pmport_state &= ~(SATA_STATE_PROBED |
15419 SATA_STATE_PROBING);
15420 mutex_exit(&pmportinfo->pmport_mutex);
15421 }
15422 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, cport)->cport_mutex);
15423
15424 /* Just let HBA driver to deactivate port */
15425 sata_device->satadev_addr.qual = qual;
15426 rval = (*SATA_PORT_DEACTIVATE_FUNC(sata_hba_inst))
15427 (SATA_DIP(sata_hba_inst), sata_device);
15428
15429 /*
15430 * Generate sysevent - EC_DR / ESC_DR_AP_STATE_CHANGE
15431 * without the hint
15432 */
15433 sata_gen_sysevent(sata_hba_inst, &sata_device->satadev_addr,
15434 SE_NO_HINT);
15435
15436 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, cport)->cport_mutex);
15437 sata_update_port_info(sata_hba_inst, sata_device);
15438 if (qual == SATA_ADDR_CPORT) {
15439 if (rval != SATA_SUCCESS) {
15440 /*
15441 * Port deactivation failure - do not change port state
15442 * unless the state returned by HBA indicates a port
15443 * failure.
15444 */
15445 if (sata_device->satadev_state & SATA_PSTATE_FAILED) {
15446 SATA_CPORT_STATE(sata_hba_inst, cport) =
15447 SATA_PSTATE_FAILED;
15448 }
15449 SATA_LOG_D((sata_hba_inst, CE_WARN,
15450 "sata_hba_ioctl: port deactivate: "
15451 "cannot deactivate SATA port %d", cport));
15452 rv = EIO;
15453 } else {
15454 cportinfo->cport_state |= SATA_PSTATE_SHUTDOWN;
15455 }
15456 } else {
15457 mutex_enter(&pmportinfo->pmport_mutex);
15458 if (rval != SATA_SUCCESS) {
15459 if (sata_device->satadev_state & SATA_PSTATE_FAILED) {
15460 SATA_PMPORT_STATE(sata_hba_inst, cport,
15461 pmport) = SATA_PSTATE_FAILED;
15462 }
15463 SATA_LOG_D((sata_hba_inst, CE_WARN,
15464 "sata_hba_ioctl: port deactivate: "
15465 "cannot deactivate SATA port %d:%d",
15466 cport, pmport));
15467 rv = EIO;
15468 } else {
15469 pmportinfo->pmport_state |= SATA_PSTATE_SHUTDOWN;
15470 }
15471 mutex_exit(&pmportinfo->pmport_mutex);
15472 }
15473
15474 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, cport)->cport_mutex);
15475
15476 return (rv);
15477 }
15478
15479 /*
15480 * Process ioctl port activate request.
15481 *
15482 * NOTE: Port multiplier is supported now.
15483 */
15484 static int
sata_ioctl_activate(sata_hba_inst_t * sata_hba_inst,sata_device_t * sata_device)15485 sata_ioctl_activate(sata_hba_inst_t *sata_hba_inst,
15486 sata_device_t *sata_device)
15487 {
15488 int cport, pmport, qual;
15489 sata_cport_info_t *cportinfo;
15490 sata_pmport_info_t *pmportinfo = NULL;
15491 boolean_t dev_existed = B_TRUE;
15492
15493 /* Sanity check */
15494 if (SATA_PORT_ACTIVATE_FUNC(sata_hba_inst) == NULL)
15495 return (ENOTSUP);
15496
15497 cport = sata_device->satadev_addr.cport;
15498 pmport = sata_device->satadev_addr.pmport;
15499 qual = sata_device->satadev_addr.qual;
15500
15501 cportinfo = SATA_CPORT_INFO(sata_hba_inst, cport);
15502
15503 /*
15504 * The qual translate from ap_id (by SCSI_TO_SATA_ADDR_QUAL())
15505 * is a device. But what we are dealing with is port/pmport.
15506 */
15507 ASSERT(qual == SATA_ADDR_DCPORT || qual == SATA_ADDR_DPMPORT);
15508 if (qual == SATA_ADDR_DCPORT)
15509 sata_device->satadev_addr.qual = qual = SATA_ADDR_CPORT;
15510 else
15511 sata_device->satadev_addr.qual = qual = SATA_ADDR_PMPORT;
15512
15513 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, cport)->cport_mutex);
15514 if (qual == SATA_ADDR_PMPORT) {
15515 pmportinfo = SATA_PMPORT_INFO(sata_hba_inst, cport, pmport);
15516 if (pmportinfo->pmport_state & SATA_PSTATE_SHUTDOWN ||
15517 pmportinfo->pmport_dev_type == SATA_DTYPE_NONE)
15518 dev_existed = B_FALSE;
15519 } else { /* cport */
15520 if (cportinfo->cport_state & SATA_PSTATE_SHUTDOWN ||
15521 cportinfo->cport_dev_type == SATA_DTYPE_NONE)
15522 dev_existed = B_FALSE;
15523 }
15524 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, cport)->cport_mutex);
15525
15526 /* Just let HBA driver to activate port, if necessary */
15527 if ((*SATA_PORT_ACTIVATE_FUNC(sata_hba_inst))
15528 (SATA_DIP(sata_hba_inst), sata_device) != SATA_SUCCESS) {
15529 /*
15530 * Port activation failure - do not change port state unless
15531 * the state returned by HBA indicates a port failure.
15532 */
15533 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst,
15534 cport)->cport_mutex);
15535 sata_update_port_info(sata_hba_inst, sata_device);
15536 if (sata_device->satadev_state & SATA_PSTATE_FAILED) {
15537 if (qual == SATA_ADDR_PMPORT) {
15538 mutex_enter(&pmportinfo->pmport_mutex);
15539 pmportinfo->pmport_state = SATA_PSTATE_FAILED;
15540 mutex_exit(&pmportinfo->pmport_mutex);
15541 } else
15542 cportinfo->cport_state = SATA_PSTATE_FAILED;
15543
15544 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst,
15545 cport)->cport_mutex);
15546 SATA_LOG_D((sata_hba_inst, CE_WARN,
15547 "sata_hba_ioctl: port activate: cannot activate "
15548 "SATA port %d:%d", cport, pmport));
15549 return (EIO);
15550 }
15551 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, cport)->cport_mutex);
15552 }
15553 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, cport)->cport_mutex);
15554 if (qual == SATA_ADDR_PMPORT) {
15555 mutex_enter(&pmportinfo->pmport_mutex);
15556 pmportinfo->pmport_state &= ~SATA_PSTATE_SHUTDOWN;
15557 mutex_exit(&pmportinfo->pmport_mutex);
15558 } else
15559 cportinfo->cport_state &= ~SATA_PSTATE_SHUTDOWN;
15560 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, cport)->cport_mutex);
15561
15562 /*
15563 * Re-probe port to find its current state and possibly attached device.
15564 * Port re-probing may change the cportinfo device type if device is
15565 * found attached.
15566 * If port probing failed, the device type would be set to
15567 * SATA_DTYPE_NONE.
15568 */
15569 (void) sata_reprobe_port(sata_hba_inst, sata_device,
15570 SATA_DEV_IDENTIFY_RETRY);
15571
15572 /*
15573 * Generate sysevent - EC_DR / ESC_DR_AP_STATE_CHANGE
15574 * without the hint.
15575 */
15576 sata_gen_sysevent(sata_hba_inst, &sata_device->satadev_addr,
15577 SE_NO_HINT);
15578
15579 if (dev_existed == B_FALSE) {
15580 if (qual == SATA_ADDR_PMPORT &&
15581 pmportinfo->pmport_dev_type != SATA_DTYPE_NONE) {
15582 /*
15583 * That's the transition from the "inactive" port state
15584 * or the active port without a device attached to the
15585 * active port state with a device attached.
15586 */
15587 sata_log(sata_hba_inst, CE_WARN,
15588 "SATA device detected at port %d:%d",
15589 cport, pmport);
15590 } else if (qual == SATA_ADDR_CPORT &&
15591 cportinfo->cport_dev_type != SATA_DTYPE_NONE) {
15592 /*
15593 * That's the transition from the "inactive" port state
15594 * or the active port without a device attached to the
15595 * active port state with a device attached.
15596 */
15597 if (cportinfo->cport_dev_type != SATA_DTYPE_PMULT) {
15598 sata_log(sata_hba_inst, CE_WARN,
15599 "SATA device detected at port %d", cport);
15600 } else {
15601 sata_log(sata_hba_inst, CE_WARN,
15602 "SATA port multiplier detected at port %d",
15603 cport);
15604 }
15605 }
15606 }
15607 return (0);
15608 }
15609
15610
15611
15612 /*
15613 * Process ioctl reset port request.
15614 *
15615 * NOTE: Port-Multiplier is supported.
15616 */
15617 static int
sata_ioctl_reset_port(sata_hba_inst_t * sata_hba_inst,sata_device_t * sata_device)15618 sata_ioctl_reset_port(sata_hba_inst_t *sata_hba_inst,
15619 sata_device_t *sata_device)
15620 {
15621 int cport, pmport, qual;
15622 int rv = 0;
15623
15624 cport = sata_device->satadev_addr.cport;
15625 pmport = sata_device->satadev_addr.pmport;
15626 qual = sata_device->satadev_addr.qual;
15627
15628 /*
15629 * The qual translate from ap_id (by SCSI_TO_SATA_ADDR_QUAL())
15630 * is a device. But what we are dealing with is port/pmport.
15631 */
15632 if (qual == SATA_ADDR_DCPORT)
15633 sata_device->satadev_addr.qual = qual = SATA_ADDR_CPORT;
15634 else
15635 sata_device->satadev_addr.qual = qual = SATA_ADDR_PMPORT;
15636 ASSERT(qual == SATA_ADDR_CPORT || qual == SATA_ADDR_PMPORT);
15637
15638 /* Sanity check */
15639 if (SATA_RESET_DPORT_FUNC(sata_hba_inst) == NULL) {
15640 SATA_LOG_D((sata_hba_inst, CE_WARN,
15641 "sata_hba_ioctl: sata_hba_tran missing required "
15642 "function sata_tran_reset_dport"));
15643 return (ENOTSUP);
15644 }
15645
15646 /* Ask HBA to reset port */
15647 if ((*SATA_RESET_DPORT_FUNC(sata_hba_inst))(SATA_DIP(sata_hba_inst),
15648 sata_device) != SATA_SUCCESS) {
15649 SATA_LOG_D((sata_hba_inst, CE_WARN,
15650 "sata_hba_ioctl: reset port: failed %d:%d",
15651 cport, pmport));
15652 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, cport)->
15653 cport_mutex);
15654 sata_update_port_info(sata_hba_inst, sata_device);
15655 if (qual == SATA_ADDR_CPORT)
15656 SATA_CPORT_STATE(sata_hba_inst, cport) =
15657 SATA_PSTATE_FAILED;
15658 else {
15659 mutex_enter(&SATA_PMPORT_MUTEX(sata_hba_inst, cport,
15660 pmport));
15661 SATA_PMPORT_STATE(sata_hba_inst, cport, pmport) =
15662 SATA_PSTATE_FAILED;
15663 mutex_exit(&SATA_PMPORT_MUTEX(sata_hba_inst, cport,
15664 pmport));
15665 }
15666 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, cport)->
15667 cport_mutex);
15668 rv = EIO;
15669 }
15670
15671 return (rv);
15672 }
15673
15674 /*
15675 * Process ioctl reset device request.
15676 *
15677 * NOTE: Port multiplier is supported.
15678 */
15679 static int
sata_ioctl_reset_device(sata_hba_inst_t * sata_hba_inst,sata_device_t * sata_device)15680 sata_ioctl_reset_device(sata_hba_inst_t *sata_hba_inst,
15681 sata_device_t *sata_device)
15682 {
15683 sata_drive_info_t *sdinfo = NULL;
15684 sata_pmult_info_t *pmultinfo = NULL;
15685 int cport, pmport;
15686 int rv = 0;
15687
15688 /* Sanity check */
15689 if (SATA_RESET_DPORT_FUNC(sata_hba_inst) == NULL) {
15690 SATA_LOG_D((sata_hba_inst, CE_WARN,
15691 "sata_hba_ioctl: sata_hba_tran missing required "
15692 "function sata_tran_reset_dport"));
15693 return (ENOTSUP);
15694 }
15695
15696 cport = sata_device->satadev_addr.cport;
15697 pmport = sata_device->satadev_addr.pmport;
15698
15699 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, cport)->cport_mutex);
15700 if (sata_device->satadev_addr.qual == SATA_ADDR_DCPORT) {
15701 if (SATA_CPORT_DEV_TYPE(sata_hba_inst, cport) ==
15702 SATA_DTYPE_PMULT)
15703 pmultinfo = SATA_CPORT_INFO(sata_hba_inst, cport)->
15704 cport_devp.cport_sata_pmult;
15705 else
15706 sdinfo = SATA_CPORT_DRV_INFO(sata_hba_inst,
15707 sata_device->satadev_addr.cport);
15708 } else { /* port multiplier */
15709 sata_device->satadev_addr.qual = SATA_ADDR_DPMPORT;
15710 sdinfo = SATA_PMPORT_DRV_INFO(sata_hba_inst,
15711 sata_device->satadev_addr.cport,
15712 sata_device->satadev_addr.pmport);
15713 }
15714 if (sdinfo == NULL && pmultinfo == NULL) {
15715 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, cport)->cport_mutex);
15716 return (EINVAL);
15717 }
15718 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, cport)->cport_mutex);
15719
15720 /* Ask HBA to reset device */
15721 if ((*SATA_RESET_DPORT_FUNC(sata_hba_inst))
15722 (SATA_DIP(sata_hba_inst), sata_device) != SATA_SUCCESS) {
15723 SATA_LOG_D((sata_hba_inst, CE_WARN,
15724 "sata_hba_ioctl: reset device: failed at port %d:%d",
15725 cport, pmport));
15726 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, cport)->
15727 cport_mutex);
15728 sata_update_port_info(sata_hba_inst, sata_device);
15729 /*
15730 * Device info structure remains attached. Another device reset
15731 * or port disconnect/connect and re-probing is
15732 * needed to change it's state
15733 */
15734 if (sdinfo != NULL) {
15735 sdinfo->satadrv_state &= ~SATA_STATE_READY;
15736 sdinfo->satadrv_state |= SATA_DSTATE_FAILED;
15737 } else if (pmultinfo != NULL) {
15738 pmultinfo->pmult_state &= ~SATA_STATE_READY;
15739 pmultinfo->pmult_state |= SATA_DSTATE_FAILED;
15740 }
15741
15742 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, cport)->cport_mutex);
15743 rv = EIO;
15744 }
15745 /*
15746 * If attached device was a port multiplier, some extra processing
15747 * may be needed to bring it back. SATA specification requies a
15748 * mandatory software reset on host port to reliably enumerate a port
15749 * multiplier, the HBA driver should handle that after reset
15750 * operation.
15751 */
15752 return (rv);
15753 }
15754
15755
15756 /*
15757 * Process ioctl reset all request.
15758 */
15759 static int
sata_ioctl_reset_all(sata_hba_inst_t * sata_hba_inst)15760 sata_ioctl_reset_all(sata_hba_inst_t *sata_hba_inst)
15761 {
15762 sata_device_t sata_device;
15763 int rv = 0;
15764 int tcport;
15765
15766 sata_device.satadev_rev = SATA_DEVICE_REV;
15767
15768 /*
15769 * There is no protection here for configured devices.
15770 */
15771 /* Sanity check */
15772 if (SATA_RESET_DPORT_FUNC(sata_hba_inst) == NULL) {
15773 SATA_LOG_D((sata_hba_inst, CE_WARN,
15774 "sata_hba_ioctl: sata_hba_tran missing required "
15775 "function sata_tran_reset_dport"));
15776 return (ENOTSUP);
15777 }
15778
15779 /*
15780 * Need to lock all ports, not just one.
15781 * If any port is locked by event processing, fail the whole operation.
15782 * One port is already locked, but for simplicity lock it again.
15783 */
15784 for (tcport = 0; tcport < SATA_NUM_CPORTS(sata_hba_inst); tcport++) {
15785 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, tcport)->
15786 cport_mutex);
15787 if (((SATA_CPORT_INFO(sata_hba_inst, tcport)->
15788 cport_event_flags) & SATA_EVNT_LOCK_PORT_BUSY) != 0) {
15789 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, tcport)->
15790 cport_mutex);
15791 rv = EBUSY;
15792 break;
15793 } else {
15794 /*
15795 * It is enough to lock cport in command-based
15796 * switching mode.
15797 */
15798 SATA_CPORT_INFO(sata_hba_inst, tcport)->
15799 cport_event_flags |= SATA_APCTL_LOCK_PORT_BUSY;
15800 }
15801 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, tcport)->
15802 cport_mutex);
15803 }
15804
15805 if (rv == 0) {
15806 /*
15807 * All cports were successfully locked.
15808 * Reset main SATA controller.
15809 * Set the device address to port 0, to have a valid device
15810 * address.
15811 */
15812 sata_device.satadev_addr.qual = SATA_ADDR_CNTRL;
15813 sata_device.satadev_addr.cport = 0;
15814 sata_device.satadev_addr.pmport = 0;
15815
15816 if ((*SATA_RESET_DPORT_FUNC(sata_hba_inst))
15817 (SATA_DIP(sata_hba_inst), &sata_device) != SATA_SUCCESS) {
15818 SATA_LOG_D((sata_hba_inst, CE_WARN,
15819 "sata_hba_ioctl: reset controller failed"));
15820 return (EIO);
15821 }
15822 }
15823 /*
15824 * Unlock all ports
15825 */
15826 for (tcport = 0; tcport < SATA_NUM_CPORTS(sata_hba_inst); tcport++) {
15827 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, tcport)->
15828 cport_mutex);
15829 SATA_CPORT_INFO(sata_hba_inst, tcport)->
15830 cport_event_flags &= ~SATA_APCTL_LOCK_PORT_BUSY;
15831 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, tcport)->
15832 cport_mutex);
15833 }
15834
15835 /*
15836 * This operation returns EFAULT if either reset
15837 * controller failed or a re-probing of any port failed.
15838 */
15839 return (rv);
15840 }
15841
15842
15843 /*
15844 * Process ioctl port self test request.
15845 *
15846 * NOTE: Port multiplier code is not completed nor tested.
15847 */
15848 static int
sata_ioctl_port_self_test(sata_hba_inst_t * sata_hba_inst,sata_device_t * sata_device)15849 sata_ioctl_port_self_test(sata_hba_inst_t *sata_hba_inst,
15850 sata_device_t *sata_device)
15851 {
15852 int cport, pmport, qual;
15853 int rv = 0;
15854
15855 /* Sanity check */
15856 if (SATA_SELFTEST_FUNC(sata_hba_inst) == NULL)
15857 return (ENOTSUP);
15858
15859 cport = sata_device->satadev_addr.cport;
15860 pmport = sata_device->satadev_addr.pmport;
15861 qual = sata_device->satadev_addr.qual;
15862
15863 /*
15864 * There is no protection here for a configured
15865 * device attached to this port.
15866 */
15867
15868 if ((*SATA_SELFTEST_FUNC(sata_hba_inst))
15869 (SATA_DIP(sata_hba_inst), sata_device) != SATA_SUCCESS) {
15870 SATA_LOG_D((sata_hba_inst, CE_WARN,
15871 "sata_hba_ioctl: port selftest: "
15872 "failed port %d:%d", cport, pmport));
15873 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, cport)->
15874 cport_mutex);
15875 sata_update_port_info(sata_hba_inst, sata_device);
15876 if (qual == SATA_ADDR_CPORT)
15877 SATA_CPORT_STATE(sata_hba_inst, cport) =
15878 SATA_PSTATE_FAILED;
15879 else { /* port multiplier device port */
15880 mutex_enter(&SATA_PMPORT_MUTEX(sata_hba_inst,
15881 cport, pmport));
15882 SATA_PMPORT_STATE(sata_hba_inst, cport, pmport) =
15883 SATA_PSTATE_FAILED;
15884 mutex_exit(&SATA_PMPORT_MUTEX(sata_hba_inst,
15885 cport, pmport));
15886 }
15887
15888 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, cport)->
15889 cport_mutex);
15890 return (EIO);
15891 }
15892 /*
15893 * Beacuse the port was reset in the course of testing, it should be
15894 * re-probed and attached device state should be restored. At this
15895 * point the port state is unknown - it's state is HBA-specific.
15896 * Force port re-probing to get it into a known state.
15897 */
15898 if (sata_reprobe_port(sata_hba_inst, sata_device,
15899 SATA_DEV_IDENTIFY_RETRY) != SATA_SUCCESS)
15900 rv = EIO;
15901 return (rv);
15902 }
15903
15904
15905 /*
15906 * sata_cfgadm_state:
15907 * Use the sata port state and state of the target node to figure out
15908 * the cfgadm_state.
15909 *
15910 * The port argument is a value with encoded cport,
15911 * pmport and address qualifier, in the same manner as a scsi target number.
15912 * SCSI_TO_SATA_CPORT macro extracts cport number,
15913 * SCSI_TO_SATA_PMPORT extracts pmport number and
15914 * SCSI_TO_SATA_ADDR_QUAL extracts port mulitplier qualifier flag.
15915 *
15916 * Port multiplier is supported.
15917 */
15918
15919 static void
sata_cfgadm_state(sata_hba_inst_t * sata_hba_inst,int32_t port,devctl_ap_state_t * ap_state)15920 sata_cfgadm_state(sata_hba_inst_t *sata_hba_inst, int32_t port,
15921 devctl_ap_state_t *ap_state)
15922 {
15923 uint8_t cport, pmport, qual;
15924 uint32_t port_state, pmult_state;
15925 uint32_t dev_type;
15926 sata_drive_info_t *sdinfo;
15927
15928 cport = SCSI_TO_SATA_CPORT(port);
15929 pmport = SCSI_TO_SATA_PMPORT(port);
15930 qual = SCSI_TO_SATA_ADDR_QUAL(port);
15931
15932 /* Check cport state */
15933 port_state = SATA_CPORT_STATE(sata_hba_inst, cport);
15934 if (port_state & SATA_PSTATE_SHUTDOWN ||
15935 port_state & SATA_PSTATE_FAILED) {
15936 ap_state->ap_rstate = AP_RSTATE_DISCONNECTED;
15937 ap_state->ap_ostate = AP_OSTATE_UNCONFIGURED;
15938 if (port_state & SATA_PSTATE_FAILED)
15939 ap_state->ap_condition = AP_COND_FAILED;
15940 else
15941 ap_state->ap_condition = AP_COND_UNKNOWN;
15942
15943 return;
15944 }
15945
15946 /* cport state is okay. Now check pmport state */
15947 if (qual == SATA_ADDR_DPMPORT || qual == SATA_ADDR_PMPORT) {
15948 /* Sanity check */
15949 if (SATA_CPORT_DEV_TYPE(sata_hba_inst, cport) !=
15950 SATA_DTYPE_PMULT || SATA_PMPORT_INFO(sata_hba_inst,
15951 cport, pmport) == NULL)
15952 return;
15953 port_state = SATA_PMPORT_STATE(sata_hba_inst, cport, pmport);
15954 if (port_state & SATA_PSTATE_SHUTDOWN ||
15955 port_state & SATA_PSTATE_FAILED) {
15956 ap_state->ap_rstate = AP_RSTATE_DISCONNECTED;
15957 ap_state->ap_ostate = AP_OSTATE_UNCONFIGURED;
15958 if (port_state & SATA_PSTATE_FAILED)
15959 ap_state->ap_condition = AP_COND_FAILED;
15960 else
15961 ap_state->ap_condition = AP_COND_UNKNOWN;
15962
15963 return;
15964 }
15965 }
15966
15967 /* Port is enabled and ready */
15968 if (qual == SATA_ADDR_DCPORT || qual == SATA_ADDR_CPORT)
15969 dev_type = SATA_CPORT_DEV_TYPE(sata_hba_inst, cport);
15970 else
15971 dev_type = SATA_PMPORT_DEV_TYPE(sata_hba_inst, cport, pmport);
15972
15973 switch (dev_type) {
15974 case SATA_DTYPE_NONE:
15975 {
15976 ap_state->ap_ostate = AP_OSTATE_UNCONFIGURED;
15977 ap_state->ap_condition = AP_COND_OK;
15978 /* No device attached */
15979 ap_state->ap_rstate = AP_RSTATE_EMPTY;
15980 break;
15981 }
15982 case SATA_DTYPE_PMULT:
15983 {
15984 /* Need to check port multiplier state */
15985 ASSERT(qual == SATA_ADDR_DCPORT);
15986 pmult_state = SATA_PMULT_INFO(sata_hba_inst, cport)->
15987 pmult_state;
15988 if (pmult_state & (SATA_PSTATE_SHUTDOWN|SATA_PSTATE_FAILED)) {
15989 ap_state->ap_rstate = AP_RSTATE_DISCONNECTED;
15990 ap_state->ap_ostate = AP_OSTATE_UNCONFIGURED;
15991 if (pmult_state & SATA_PSTATE_FAILED)
15992 ap_state->ap_condition = AP_COND_FAILED;
15993 else
15994 ap_state->ap_condition = AP_COND_UNKNOWN;
15995
15996 return;
15997 }
15998
15999 /* Port multiplier is not configurable */
16000 ap_state->ap_ostate = AP_OSTATE_CONFIGURED;
16001 ap_state->ap_rstate = AP_RSTATE_CONNECTED;
16002 ap_state->ap_condition = AP_COND_OK;
16003 break;
16004 }
16005
16006 case SATA_DTYPE_ATADISK:
16007 case SATA_DTYPE_ATAPICD:
16008 case SATA_DTYPE_ATAPITAPE:
16009 case SATA_DTYPE_ATAPIDISK:
16010 {
16011 dev_info_t *tdip = NULL;
16012 dev_info_t *dip = NULL;
16013 int circ;
16014
16015 dip = SATA_DIP(sata_hba_inst);
16016 tdip = sata_get_target_dip(dip, cport, pmport);
16017 ap_state->ap_rstate = AP_RSTATE_CONNECTED;
16018 if (tdip != NULL) {
16019 ndi_devi_enter(dip, &circ);
16020 mutex_enter(&(DEVI(tdip)->devi_lock));
16021 if (DEVI_IS_DEVICE_REMOVED(tdip)) {
16022 /*
16023 * There could be the case where previously
16024 * configured and opened device was removed
16025 * and unknown device was plugged.
16026 * In such case we want to show a device, and
16027 * its configured or unconfigured state but
16028 * indicate unusable condition untill the
16029 * old target node is released and removed.
16030 */
16031 ap_state->ap_condition = AP_COND_UNUSABLE;
16032 } else {
16033 mutex_enter(&SATA_CPORT_MUTEX(sata_hba_inst,
16034 cport));
16035 sdinfo = SATA_CPORT_DRV_INFO(sata_hba_inst,
16036 cport);
16037 if (sdinfo != NULL) {
16038 if ((sdinfo->satadrv_state &
16039 SATA_DSTATE_FAILED) != 0)
16040 ap_state->ap_condition =
16041 AP_COND_FAILED;
16042 else
16043 ap_state->ap_condition =
16044 AP_COND_OK;
16045 } else {
16046 ap_state->ap_condition =
16047 AP_COND_UNKNOWN;
16048 }
16049 mutex_exit(&SATA_CPORT_MUTEX(sata_hba_inst,
16050 cport));
16051 }
16052 if ((DEVI_IS_DEVICE_OFFLINE(tdip)) ||
16053 (DEVI_IS_DEVICE_DOWN(tdip))) {
16054 ap_state->ap_ostate =
16055 AP_OSTATE_UNCONFIGURED;
16056 } else {
16057 ap_state->ap_ostate =
16058 AP_OSTATE_CONFIGURED;
16059 }
16060 mutex_exit(&(DEVI(tdip)->devi_lock));
16061 ndi_devi_exit(dip, circ);
16062 } else {
16063 ap_state->ap_ostate = AP_OSTATE_UNCONFIGURED;
16064 ap_state->ap_condition = AP_COND_UNKNOWN;
16065 }
16066 break;
16067 }
16068 case SATA_DTYPE_ATAPIPROC:
16069 ap_state->ap_rstate = AP_RSTATE_CONNECTED;
16070 ap_state->ap_ostate = AP_OSTATE_UNCONFIGURED;
16071 ap_state->ap_condition = AP_COND_OK;
16072 break;
16073 default:
16074 ap_state->ap_rstate = AP_RSTATE_CONNECTED;
16075 ap_state->ap_ostate = AP_OSTATE_UNCONFIGURED;
16076 ap_state->ap_condition = AP_COND_UNKNOWN;
16077 /*
16078 * This is actually internal error condition (non fatal),
16079 * because we have already checked all defined device types.
16080 */
16081 SATA_LOG_D((sata_hba_inst, CE_WARN,
16082 "sata_cfgadm_state: Internal error: "
16083 "unknown device type"));
16084 break;
16085 }
16086 }
16087
16088
16089 /*
16090 * Process ioctl get device path request.
16091 *
16092 * NOTE: Port multiplier has no target dip. Devices connected to port
16093 * multiplier have target node attached to the HBA node. The only difference
16094 * between them and the directly-attached device node is a target address.
16095 */
16096 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)16097 sata_ioctl_get_device_path(sata_hba_inst_t *sata_hba_inst,
16098 sata_device_t *sata_device, sata_ioctl_data_t *ioc, int mode)
16099 {
16100 char path[MAXPATHLEN];
16101 uint32_t size;
16102 dev_info_t *tdip;
16103
16104 (void) strcpy(path, "/devices");
16105 if ((tdip = sata_get_scsi_target_dip(SATA_DIP(sata_hba_inst),
16106 &sata_device->satadev_addr)) == NULL) {
16107 /*
16108 * No such device. If this is a request for a size, do not
16109 * return EINVAL for non-existing target, because cfgadm
16110 * will then indicate a meaningless ioctl failure.
16111 * If this is a request for a path, indicate invalid
16112 * argument.
16113 */
16114 if (ioc->get_size == 0)
16115 return (EINVAL);
16116 } else {
16117 (void) ddi_pathname(tdip, path + strlen(path));
16118 }
16119 size = strlen(path) + 1;
16120
16121 if (ioc->get_size != 0) {
16122 if (ddi_copyout((void *)&size, ioc->buf, ioc->bufsiz,
16123 mode) != 0)
16124 return (EFAULT);
16125 } else {
16126 if (ioc->bufsiz != size)
16127 return (EINVAL);
16128
16129 else if (ddi_copyout((void *)&path, ioc->buf, ioc->bufsiz,
16130 mode) != 0)
16131 return (EFAULT);
16132 }
16133 return (0);
16134 }
16135
16136 /*
16137 * Process ioctl get attachment point type request.
16138 *
16139 * NOTE: Port multiplier is supported.
16140 */
16141 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)16142 sata_ioctl_get_ap_type(sata_hba_inst_t *sata_hba_inst,
16143 sata_device_t *sata_device, sata_ioctl_data_t *ioc, int mode)
16144 {
16145 uint32_t type_len;
16146 const char *ap_type;
16147 int dev_type;
16148
16149 if (sata_device->satadev_addr.qual == SATA_ADDR_DCPORT)
16150 dev_type = SATA_CPORT_DEV_TYPE(sata_hba_inst,
16151 sata_device->satadev_addr.cport);
16152 else /* pmport */
16153 dev_type = SATA_PMPORT_DEV_TYPE(sata_hba_inst,
16154 sata_device->satadev_addr.cport,
16155 sata_device->satadev_addr.pmport);
16156
16157 switch (dev_type) {
16158 case SATA_DTYPE_NONE:
16159 ap_type = "port";
16160 break;
16161
16162 case SATA_DTYPE_ATADISK:
16163 case SATA_DTYPE_ATAPIDISK:
16164 ap_type = "disk";
16165 break;
16166
16167 case SATA_DTYPE_ATAPICD:
16168 ap_type = "cd/dvd";
16169 break;
16170
16171 case SATA_DTYPE_ATAPITAPE:
16172 ap_type = "tape";
16173 break;
16174
16175 case SATA_DTYPE_ATAPIPROC:
16176 ap_type = "processor";
16177 break;
16178
16179 case SATA_DTYPE_PMULT:
16180 ap_type = "sata-pmult";
16181 break;
16182
16183 case SATA_DTYPE_UNKNOWN:
16184 ap_type = "unknown";
16185 break;
16186
16187 default:
16188 ap_type = "unsupported";
16189 break;
16190
16191 } /* end of dev_type switch */
16192
16193 type_len = strlen(ap_type) + 1;
16194
16195 if (ioc->get_size) {
16196 if (ddi_copyout((void *)&type_len, ioc->buf, ioc->bufsiz,
16197 mode) != 0)
16198 return (EFAULT);
16199 } else {
16200 if (ioc->bufsiz != type_len)
16201 return (EINVAL);
16202
16203 if (ddi_copyout((void *)ap_type, ioc->buf,
16204 ioc->bufsiz, mode) != 0)
16205 return (EFAULT);
16206 }
16207 return (0);
16208
16209 }
16210
16211 /*
16212 * Process ioctl get device model info request.
16213 * This operation should return to cfgadm the device model
16214 * information string
16215 *
16216 * NOTE: Port multiplier is supported.
16217 */
16218 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)16219 sata_ioctl_get_model_info(sata_hba_inst_t *sata_hba_inst,
16220 sata_device_t *sata_device, sata_ioctl_data_t *ioc, int mode)
16221 {
16222 sata_drive_info_t *sdinfo;
16223 uint32_t info_len;
16224 char ap_info[SATA_ID_MODEL_LEN + 1];
16225
16226 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst,
16227 sata_device->satadev_addr.cport)->cport_mutex);
16228 if (sata_device->satadev_addr.qual == SATA_ADDR_DCPORT)
16229 sdinfo = SATA_CPORT_DRV_INFO(sata_hba_inst,
16230 sata_device->satadev_addr.cport);
16231 else /* port multiplier */
16232 sdinfo = SATA_PMPORT_DRV_INFO(sata_hba_inst,
16233 sata_device->satadev_addr.cport,
16234 sata_device->satadev_addr.pmport);
16235 if (sdinfo == NULL) {
16236 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst,
16237 sata_device->satadev_addr.cport)->cport_mutex);
16238 return (EINVAL);
16239 }
16240
16241 #ifdef _LITTLE_ENDIAN
16242 swab(sdinfo->satadrv_id.ai_model, ap_info, SATA_ID_MODEL_LEN);
16243 #else /* _LITTLE_ENDIAN */
16244 bcopy(sdinfo->satadrv_id.ai_model, ap_info, SATA_ID_MODEL_LEN);
16245 #endif /* _LITTLE_ENDIAN */
16246
16247 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst,
16248 sata_device->satadev_addr.cport)->cport_mutex);
16249
16250 ap_info[SATA_ID_MODEL_LEN] = '\0';
16251
16252 info_len = strlen(ap_info) + 1;
16253
16254 if (ioc->get_size) {
16255 if (ddi_copyout((void *)&info_len, ioc->buf, ioc->bufsiz,
16256 mode) != 0)
16257 return (EFAULT);
16258 } else {
16259 if (ioc->bufsiz < info_len)
16260 return (EINVAL);
16261 if (ddi_copyout((void *)ap_info, ioc->buf, ioc->bufsiz,
16262 mode) != 0)
16263 return (EFAULT);
16264 }
16265 return (0);
16266 }
16267
16268
16269 /*
16270 * Process ioctl get device firmware revision info request.
16271 * This operation should return to cfgadm the device firmware revision
16272 * information string
16273 *
16274 * Port multiplier is supported.
16275 */
16276 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)16277 sata_ioctl_get_revfirmware_info(sata_hba_inst_t *sata_hba_inst,
16278 sata_device_t *sata_device, sata_ioctl_data_t *ioc, int mode)
16279 {
16280 sata_drive_info_t *sdinfo;
16281 uint32_t info_len;
16282 char ap_info[SATA_ID_FW_LEN + 1];
16283
16284 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst,
16285 sata_device->satadev_addr.cport)->cport_mutex);
16286 if (sata_device->satadev_addr.qual == SATA_ADDR_DCPORT)
16287 sdinfo = SATA_CPORT_DRV_INFO(sata_hba_inst,
16288 sata_device->satadev_addr.cport);
16289 else /* port multiplier */
16290 sdinfo = SATA_PMPORT_DRV_INFO(sata_hba_inst,
16291 sata_device->satadev_addr.cport,
16292 sata_device->satadev_addr.pmport);
16293 if (sdinfo == NULL) {
16294 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst,
16295 sata_device->satadev_addr.cport)->cport_mutex);
16296 return (EINVAL);
16297 }
16298
16299 #ifdef _LITTLE_ENDIAN
16300 swab(sdinfo->satadrv_id.ai_fw, ap_info, SATA_ID_FW_LEN);
16301 #else /* _LITTLE_ENDIAN */
16302 bcopy(sdinfo->satadrv_id.ai_fw, ap_info, SATA_ID_FW_LEN);
16303 #endif /* _LITTLE_ENDIAN */
16304
16305 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst,
16306 sata_device->satadev_addr.cport)->cport_mutex);
16307
16308 ap_info[SATA_ID_FW_LEN] = '\0';
16309
16310 info_len = strlen(ap_info) + 1;
16311
16312 if (ioc->get_size) {
16313 if (ddi_copyout((void *)&info_len, ioc->buf, ioc->bufsiz,
16314 mode) != 0)
16315 return (EFAULT);
16316 } else {
16317 if (ioc->bufsiz < info_len)
16318 return (EINVAL);
16319 if (ddi_copyout((void *)ap_info, ioc->buf, ioc->bufsiz,
16320 mode) != 0)
16321 return (EFAULT);
16322 }
16323 return (0);
16324 }
16325
16326
16327 /*
16328 * Process ioctl get device serial number info request.
16329 * This operation should return to cfgadm the device serial number string.
16330 *
16331 * NOTE: Port multiplier is supported.
16332 */
16333 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)16334 sata_ioctl_get_serialnumber_info(sata_hba_inst_t *sata_hba_inst,
16335 sata_device_t *sata_device, sata_ioctl_data_t *ioc, int mode)
16336 {
16337 sata_drive_info_t *sdinfo;
16338 uint32_t info_len;
16339 char ap_info[SATA_ID_SERIAL_LEN + 1];
16340
16341 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst,
16342 sata_device->satadev_addr.cport)->cport_mutex);
16343 if (sata_device->satadev_addr.qual == SATA_ADDR_DCPORT)
16344 sdinfo = SATA_CPORT_DRV_INFO(sata_hba_inst,
16345 sata_device->satadev_addr.cport);
16346 else /* port multiplier */
16347 sdinfo = SATA_PMPORT_DRV_INFO(sata_hba_inst,
16348 sata_device->satadev_addr.cport,
16349 sata_device->satadev_addr.pmport);
16350 if (sdinfo == NULL) {
16351 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst,
16352 sata_device->satadev_addr.cport)->cport_mutex);
16353 return (EINVAL);
16354 }
16355
16356 #ifdef _LITTLE_ENDIAN
16357 swab(sdinfo->satadrv_id.ai_drvser, ap_info, SATA_ID_SERIAL_LEN);
16358 #else /* _LITTLE_ENDIAN */
16359 bcopy(sdinfo->satadrv_id.ai_drvser, ap_info, SATA_ID_SERIAL_LEN);
16360 #endif /* _LITTLE_ENDIAN */
16361
16362 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst,
16363 sata_device->satadev_addr.cport)->cport_mutex);
16364
16365 ap_info[SATA_ID_SERIAL_LEN] = '\0';
16366
16367 info_len = strlen(ap_info) + 1;
16368
16369 if (ioc->get_size) {
16370 if (ddi_copyout((void *)&info_len, ioc->buf, ioc->bufsiz,
16371 mode) != 0)
16372 return (EFAULT);
16373 } else {
16374 if (ioc->bufsiz < info_len)
16375 return (EINVAL);
16376 if (ddi_copyout((void *)ap_info, ioc->buf, ioc->bufsiz,
16377 mode) != 0)
16378 return (EFAULT);
16379 }
16380 return (0);
16381 }
16382
16383
16384 /*
16385 * Preset scsi extended sense data (to NO SENSE)
16386 * First 18 bytes of the sense data are preset to current valid sense
16387 * with a key NO SENSE data.
16388 *
16389 * Returns void
16390 */
16391 static void
sata_fixed_sense_data_preset(struct scsi_extended_sense * sense)16392 sata_fixed_sense_data_preset(struct scsi_extended_sense *sense)
16393 {
16394 sense->es_valid = 1; /* Valid sense */
16395 sense->es_class = CLASS_EXTENDED_SENSE; /* 0x70 - current err */
16396 sense->es_key = KEY_NO_SENSE;
16397 sense->es_info_1 = 0;
16398 sense->es_info_2 = 0;
16399 sense->es_info_3 = 0;
16400 sense->es_info_4 = 0;
16401 sense->es_add_len = 10; /* Additional length - replace with a def */
16402 sense->es_cmd_info[0] = 0;
16403 sense->es_cmd_info[1] = 0;
16404 sense->es_cmd_info[2] = 0;
16405 sense->es_cmd_info[3] = 0;
16406 sense->es_add_code = 0;
16407 sense->es_qual_code = 0;
16408 }
16409
16410 /*
16411 * Register a legacy cmdk-style devid for the target (disk) device.
16412 *
16413 * Note: This function is called only when the HBA devinfo node has the
16414 * property "use-cmdk-devid-format" set. This property indicates that
16415 * devid compatible with old cmdk (target) driver is to be generated
16416 * for any target device attached to this controller. This will take
16417 * precedence over the devid generated by sd (target) driver.
16418 * This function is derived from cmdk_devid_setup() function in cmdk.c.
16419 */
16420 static void
sata_target_devid_register(dev_info_t * dip,sata_drive_info_t * sdinfo)16421 sata_target_devid_register(dev_info_t *dip, sata_drive_info_t *sdinfo)
16422 {
16423 char *hwid;
16424 int modlen;
16425 int serlen;
16426 int rval;
16427 ddi_devid_t devid;
16428
16429 /*
16430 * device ID is a concatanation of model number, "=", serial number.
16431 */
16432 hwid = kmem_zalloc(LEGACY_HWID_LEN, KM_SLEEP);
16433 bcopy(&sdinfo->satadrv_id.ai_model, hwid,
16434 sizeof (sdinfo->satadrv_id.ai_model));
16435 swab(hwid, hwid, sizeof (sdinfo->satadrv_id.ai_model));
16436 modlen = sata_check_modser(hwid, sizeof (sdinfo->satadrv_id.ai_model));
16437 if (modlen == 0)
16438 goto err;
16439 hwid[modlen++] = '=';
16440 bcopy(&sdinfo->satadrv_id.ai_drvser, &hwid[modlen],
16441 sizeof (sdinfo->satadrv_id.ai_drvser));
16442 swab(&hwid[modlen], &hwid[modlen],
16443 sizeof (sdinfo->satadrv_id.ai_drvser));
16444 serlen = sata_check_modser(&hwid[modlen],
16445 sizeof (sdinfo->satadrv_id.ai_drvser));
16446 if (serlen == 0)
16447 goto err;
16448 hwid[modlen + serlen] = 0; /* terminate the hwid string */
16449
16450 /* initialize/register devid */
16451 if ((rval = ddi_devid_init(dip, DEVID_ATA_SERIAL,
16452 (ushort_t)(modlen + serlen), hwid, &devid)) == DDI_SUCCESS) {
16453 rval = ddi_devid_register(dip, devid);
16454 /*
16455 * Free up the allocated devid buffer.
16456 * NOTE: This doesn't mean unregistering devid.
16457 */
16458 ddi_devid_free(devid);
16459 }
16460
16461 if (rval != DDI_SUCCESS)
16462 cmn_err(CE_WARN, "sata: failed to create devid for the disk"
16463 " on port %d", sdinfo->satadrv_addr.cport);
16464 err:
16465 kmem_free(hwid, LEGACY_HWID_LEN);
16466 }
16467
16468 /*
16469 * valid model/serial string must contain a non-zero non-space characters.
16470 * trim trailing spaces/NULLs.
16471 */
16472 static int
sata_check_modser(char * buf,int buf_len)16473 sata_check_modser(char *buf, int buf_len)
16474 {
16475 boolean_t ret;
16476 char *s;
16477 int i;
16478 int tb;
16479 char ch;
16480
16481 ret = B_FALSE;
16482 s = buf;
16483 for (i = 0; i < buf_len; i++) {
16484 ch = *s++;
16485 if (ch != ' ' && ch != '\0')
16486 tb = i + 1;
16487 if (ch != ' ' && ch != '\0' && ch != '0')
16488 ret = B_TRUE;
16489 }
16490
16491 if (ret == B_FALSE)
16492 return (0); /* invalid string */
16493
16494 return (tb); /* return length */
16495 }
16496
16497 /*
16498 * sata_set_drive_features function compares current device features setting
16499 * with the saved device features settings and, if there is a difference,
16500 * it restores device features setting to the previously saved state.
16501 * It also arbitrarily tries to select the highest supported DMA mode.
16502 * Device Identify or Identify Packet Device data has to be current.
16503 * At the moment read ahead and write cache are considered for all devices.
16504 * For atapi devices, Removable Media Status Notification is set in addition
16505 * to common features.
16506 *
16507 * This function cannot be called in the interrupt context (it may sleep).
16508 *
16509 * The input argument sdinfo should point to the drive info structure
16510 * to be updated after features are set. Note, that only
16511 * device (packet) identify data is updated, not the flags indicating the
16512 * supported features.
16513 *
16514 * Returns SATA_SUCCESS if successful or there was nothing to do.
16515 * Device Identify data in the drive info structure pointed to by the sdinfo
16516 * arguments is updated even when no features were set or changed.
16517 *
16518 * Returns SATA_FAILURE if device features could not be set or DMA mode
16519 * for a disk cannot be set and device identify data cannot be fetched.
16520 *
16521 * Returns SATA_RETRY if device features could not be set (other than disk
16522 * DMA mode) but the device identify data was fetched successfully.
16523 *
16524 * Note: This function may fail the port, making it inaccessible.
16525 * In such case the explicit port disconnect/connect or physical device
16526 * detach/attach is required to re-evaluate port state again.
16527 */
16528
16529 static int
sata_set_drive_features(sata_hba_inst_t * sata_hba_inst,sata_drive_info_t * sdinfo,int restore)16530 sata_set_drive_features(sata_hba_inst_t *sata_hba_inst,
16531 sata_drive_info_t *sdinfo, int restore)
16532 {
16533 int rval = SATA_SUCCESS;
16534 int rval_set;
16535 sata_drive_info_t new_sdinfo;
16536 char *finfo = "sata_set_drive_features: cannot";
16537 char *finfox;
16538 int cache_op;
16539
16540 bzero(&new_sdinfo, sizeof (sata_drive_info_t));
16541 new_sdinfo.satadrv_addr = sdinfo->satadrv_addr;
16542 new_sdinfo.satadrv_type = sdinfo->satadrv_type;
16543 if (sata_fetch_device_identify_data(sata_hba_inst, &new_sdinfo) != 0) {
16544 /*
16545 * Cannot get device identification - caller may retry later
16546 */
16547 SATADBG1(SATA_DBG_DEV_SETTINGS, sata_hba_inst,
16548 "%s fetch device identify data\n", finfo);
16549 return (SATA_FAILURE);
16550 }
16551 finfox = (restore != 0) ? " restore device features" :
16552 " initialize device features\n";
16553
16554 switch (sdinfo->satadrv_type) {
16555 case SATA_DTYPE_ATADISK:
16556 /* Arbitrarily set UDMA mode */
16557 if (sata_set_dma_mode(sata_hba_inst, &new_sdinfo) !=
16558 SATA_SUCCESS) {
16559 SATA_LOG_D((sata_hba_inst, CE_WARN,
16560 "%s set UDMA mode\n", finfo));
16561 return (SATA_FAILURE);
16562 }
16563 break;
16564 case SATA_DTYPE_ATAPICD:
16565 case SATA_DTYPE_ATAPITAPE:
16566 case SATA_DTYPE_ATAPIDISK:
16567 /* Set Removable Media Status Notification, if necessary */
16568 if (SATA_RM_NOTIFIC_SUPPORTED(new_sdinfo.satadrv_id) &&
16569 restore != 0) {
16570 if (((sdinfo->satadrv_settings & SATA_DEV_RMSN) &&
16571 (!SATA_RM_NOTIFIC_ENABLED(new_sdinfo.satadrv_id)))||
16572 ((!(sdinfo->satadrv_settings & SATA_DEV_RMSN)) &&
16573 SATA_RM_NOTIFIC_ENABLED(new_sdinfo.satadrv_id))) {
16574 /* Current setting does not match saved one */
16575 if (sata_set_rmsn(sata_hba_inst, sdinfo,
16576 sdinfo->satadrv_settings &
16577 SATA_DEV_RMSN) != SATA_SUCCESS)
16578 rval = SATA_FAILURE;
16579 }
16580 }
16581 /*
16582 * We have to set Multiword DMA or UDMA, if it is supported, as
16583 * we want to use DMA transfer mode whenever possible.
16584 * Some devices require explicit setting of the DMA mode.
16585 */
16586 if (new_sdinfo.satadrv_id.ai_cap & SATA_DMA_SUPPORT) {
16587 /* Set highest supported DMA mode */
16588 if (sata_set_dma_mode(sata_hba_inst, &new_sdinfo) !=
16589 SATA_SUCCESS) {
16590 SATA_LOG_D((sata_hba_inst, CE_WARN,
16591 "%s set UDMA mode\n", finfo));
16592 rval = SATA_FAILURE;
16593 }
16594 }
16595 break;
16596 }
16597
16598 if (!SATA_READ_AHEAD_SUPPORTED(new_sdinfo.satadrv_id) &&
16599 !SATA_WRITE_CACHE_SUPPORTED(new_sdinfo.satadrv_id)) {
16600 /*
16601 * neither READ AHEAD nor WRITE CACHE is supported
16602 * - do nothing
16603 */
16604 SATADBG1(SATA_DBG_DEV_SETTINGS, sata_hba_inst,
16605 "settable features not supported\n", NULL);
16606 goto update_sdinfo;
16607 }
16608
16609 if ((SATA_READ_AHEAD_ENABLED(new_sdinfo.satadrv_id) &&
16610 (sdinfo->satadrv_settings & SATA_DEV_READ_AHEAD)) &&
16611 (SATA_WRITE_CACHE_ENABLED(new_sdinfo.satadrv_id) &&
16612 (sdinfo->satadrv_settings & SATA_DEV_WRITE_CACHE))) {
16613 /*
16614 * both READ AHEAD and WRITE CACHE are enabled
16615 * - Nothing to do
16616 */
16617 SATADBG1(SATA_DBG_DEV_SETTINGS, sata_hba_inst,
16618 "no device features to set\n", NULL);
16619 goto update_sdinfo;
16620 }
16621
16622 cache_op = 0;
16623
16624 if (SATA_READ_AHEAD_SUPPORTED(new_sdinfo.satadrv_id)) {
16625 if ((sdinfo->satadrv_settings & SATA_DEV_READ_AHEAD) &&
16626 !SATA_READ_AHEAD_ENABLED(new_sdinfo.satadrv_id)) {
16627 /* Enable read ahead / read cache */
16628 cache_op = SATAC_SF_ENABLE_READ_AHEAD;
16629 SATADBG1(SATA_DBG_DEV_SETTINGS, sata_hba_inst,
16630 "enabling read cache\n", NULL);
16631 } else if (!(sdinfo->satadrv_settings & SATA_DEV_READ_AHEAD) &&
16632 SATA_READ_AHEAD_ENABLED(new_sdinfo.satadrv_id)) {
16633 /* Disable read ahead / read cache */
16634 cache_op = SATAC_SF_DISABLE_READ_AHEAD;
16635 SATADBG1(SATA_DBG_DEV_SETTINGS, sata_hba_inst,
16636 "disabling read cache\n", NULL);
16637 }
16638
16639 if (cache_op != 0) {
16640 /* Try to set read cache mode */
16641 rval_set = sata_set_cache_mode(sata_hba_inst,
16642 &new_sdinfo, cache_op);
16643 if (rval != SATA_FAILURE && rval_set != SATA_SUCCESS)
16644 rval = rval_set;
16645 }
16646 }
16647
16648 cache_op = 0;
16649
16650 if (SATA_WRITE_CACHE_SUPPORTED(new_sdinfo.satadrv_id)) {
16651 if ((sdinfo->satadrv_settings & SATA_DEV_WRITE_CACHE) &&
16652 !SATA_WRITE_CACHE_ENABLED(new_sdinfo.satadrv_id)) {
16653 /* Enable write cache */
16654 cache_op = SATAC_SF_ENABLE_WRITE_CACHE;
16655 SATADBG1(SATA_DBG_DEV_SETTINGS, sata_hba_inst,
16656 "enabling write cache\n", NULL);
16657 } else if (!(sdinfo->satadrv_settings & SATA_DEV_WRITE_CACHE) &&
16658 SATA_WRITE_CACHE_ENABLED(new_sdinfo.satadrv_id)) {
16659 /* Disable write cache */
16660 cache_op = SATAC_SF_DISABLE_WRITE_CACHE;
16661 SATADBG1(SATA_DBG_DEV_SETTINGS, sata_hba_inst,
16662 "disabling write cache\n", NULL);
16663 }
16664
16665 if (cache_op != 0) {
16666 /* Try to set write cache mode */
16667 rval_set = sata_set_cache_mode(sata_hba_inst,
16668 &new_sdinfo, cache_op);
16669 if (rval != SATA_FAILURE && rval_set != SATA_SUCCESS)
16670 rval = rval_set;
16671 }
16672 }
16673 if (rval != SATA_SUCCESS)
16674 SATA_LOG_D((sata_hba_inst, CE_WARN,
16675 "%s %s", finfo, finfox));
16676
16677 update_sdinfo:
16678 /*
16679 * We need to fetch Device Identify data again
16680 */
16681 if (sata_fetch_device_identify_data(sata_hba_inst, &new_sdinfo) != 0) {
16682 /*
16683 * Cannot get device identification - retry later
16684 */
16685 SATA_LOG_D((sata_hba_inst, CE_WARN,
16686 "%s re-fetch device identify data\n", finfo));
16687 rval = SATA_FAILURE;
16688 }
16689 /* Copy device sata info. */
16690 sdinfo->satadrv_id = new_sdinfo.satadrv_id;
16691
16692 return (rval);
16693 }
16694
16695
16696 /*
16697 *
16698 * Returns 1 if threshold exceeded, 0 if threshold not exceeded, -1 if
16699 * unable to determine.
16700 *
16701 * Cannot be called in an interrupt context.
16702 *
16703 * Called by sata_build_lsense_page_2f()
16704 */
16705
16706 static int
sata_fetch_smart_return_status(sata_hba_inst_t * sata_hba_inst,sata_drive_info_t * sdinfo)16707 sata_fetch_smart_return_status(sata_hba_inst_t *sata_hba_inst,
16708 sata_drive_info_t *sdinfo)
16709 {
16710 sata_pkt_t *spkt;
16711 sata_cmd_t *scmd;
16712 sata_pkt_txlate_t *spx;
16713 int rval;
16714
16715 spx = kmem_zalloc(sizeof (sata_pkt_txlate_t), KM_SLEEP);
16716 spx->txlt_sata_hba_inst = sata_hba_inst;
16717 spx->txlt_scsi_pkt = NULL; /* No scsi pkt involved */
16718 spkt = sata_pkt_alloc(spx, SLEEP_FUNC);
16719 if (spkt == NULL) {
16720 kmem_free(spx, sizeof (sata_pkt_txlate_t));
16721 return (-1);
16722 }
16723 /* address is needed now */
16724 spkt->satapkt_device.satadev_addr = sdinfo->satadrv_addr;
16725
16726
16727 /* Fill sata_pkt */
16728 spkt->satapkt_device.satadev_addr = sdinfo->satadrv_addr;
16729 spkt->satapkt_op_mode = SATA_OPMODE_SYNCH | SATA_OPMODE_INTERRUPTS;
16730 /* Synchronous mode, no callback */
16731 spkt->satapkt_comp = NULL;
16732 /* Timeout 30s */
16733 spkt->satapkt_time = sata_default_pkt_time;
16734
16735 scmd = &spkt->satapkt_cmd;
16736 scmd->satacmd_flags.sata_special_regs = B_TRUE;
16737 scmd->satacmd_flags.sata_data_direction = SATA_DIR_NODATA_XFER;
16738
16739 /* Set up which registers need to be returned */
16740 scmd->satacmd_flags.sata_copy_out_lba_mid_lsb = B_TRUE;
16741 scmd->satacmd_flags.sata_copy_out_lba_high_lsb = B_TRUE;
16742
16743 /* Build SMART_RETURN_STATUS cmd in the sata_pkt */
16744 scmd->satacmd_addr_type = 0; /* N/A */
16745 scmd->satacmd_sec_count_lsb = 0; /* N/A */
16746 scmd->satacmd_lba_low_lsb = 0; /* N/A */
16747 scmd->satacmd_lba_mid_lsb = SMART_MAGIC_VAL_1;
16748 scmd->satacmd_lba_high_lsb = SMART_MAGIC_VAL_2;
16749 scmd->satacmd_features_reg = SATA_SMART_RETURN_STATUS;
16750 scmd->satacmd_device_reg = 0; /* Always device 0 */
16751 scmd->satacmd_cmd_reg = SATAC_SMART;
16752 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
16753 sdinfo->satadrv_addr.cport)));
16754
16755
16756 /* Send pkt to SATA HBA driver */
16757 if ((*SATA_START_FUNC(sata_hba_inst))(SATA_DIP(sata_hba_inst), spkt) !=
16758 SATA_TRAN_ACCEPTED ||
16759 spkt->satapkt_reason != SATA_PKT_COMPLETED) {
16760 mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst,
16761 sdinfo->satadrv_addr.cport)));
16762 /*
16763 * Whoops, no SMART RETURN STATUS
16764 */
16765 rval = -1;
16766 } else {
16767 mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst,
16768 sdinfo->satadrv_addr.cport)));
16769 if (scmd->satacmd_error_reg & SATA_ERROR_ABORT) {
16770 rval = -1;
16771 goto fail;
16772 }
16773 if (scmd->satacmd_status_reg & SATA_STATUS_ERR) {
16774 rval = -1;
16775 goto fail;
16776 }
16777 if ((scmd->satacmd_lba_mid_lsb == SMART_MAGIC_VAL_1) &&
16778 (scmd->satacmd_lba_high_lsb == SMART_MAGIC_VAL_2))
16779 rval = 0;
16780 else if ((scmd->satacmd_lba_mid_lsb == SMART_MAGIC_VAL_3) &&
16781 (scmd->satacmd_lba_high_lsb == SMART_MAGIC_VAL_4))
16782 rval = 1;
16783 else {
16784 rval = -1;
16785 goto fail;
16786 }
16787 }
16788 fail:
16789 /* Free allocated resources */
16790 sata_pkt_free(spx);
16791 kmem_free(spx, sizeof (sata_pkt_txlate_t));
16792
16793 return (rval);
16794 }
16795
16796 /*
16797 *
16798 * Returns 0 if succeeded, -1 otherwise
16799 *
16800 * Cannot be called in an interrupt context.
16801 *
16802 */
16803 static int
sata_fetch_smart_data(sata_hba_inst_t * sata_hba_inst,sata_drive_info_t * sdinfo,struct smart_data * smart_data)16804 sata_fetch_smart_data(
16805 sata_hba_inst_t *sata_hba_inst,
16806 sata_drive_info_t *sdinfo,
16807 struct smart_data *smart_data)
16808 {
16809 sata_pkt_t *spkt;
16810 sata_cmd_t *scmd;
16811 sata_pkt_txlate_t *spx;
16812 int rval;
16813 dev_info_t *dip = SATA_DIP(sata_hba_inst);
16814
16815 #if ! defined(lint)
16816 ASSERT(sizeof (struct smart_data) == 512);
16817 #endif
16818
16819 spx = kmem_zalloc(sizeof (sata_pkt_txlate_t), KM_SLEEP);
16820 spx->txlt_sata_hba_inst = sata_hba_inst;
16821 spx->txlt_scsi_pkt = NULL; /* No scsi pkt involved */
16822 spkt = sata_pkt_alloc(spx, SLEEP_FUNC);
16823 if (spkt == NULL) {
16824 kmem_free(spx, sizeof (sata_pkt_txlate_t));
16825 return (-1);
16826 }
16827 /* address is needed now */
16828 spkt->satapkt_device.satadev_addr = sdinfo->satadrv_addr;
16829
16830
16831 /* Fill sata_pkt */
16832 spkt->satapkt_device.satadev_addr = sdinfo->satadrv_addr;
16833 spkt->satapkt_op_mode = SATA_OPMODE_SYNCH | SATA_OPMODE_INTERRUPTS;
16834 /* Synchronous mode, no callback */
16835 spkt->satapkt_comp = NULL;
16836 /* Timeout 30s */
16837 spkt->satapkt_time = sata_default_pkt_time;
16838
16839 scmd = &spkt->satapkt_cmd;
16840 scmd->satacmd_flags.sata_data_direction = SATA_DIR_READ;
16841
16842 /*
16843 * Allocate buffer for SMART data
16844 */
16845 scmd->satacmd_bp = sata_alloc_local_buffer(spx,
16846 sizeof (struct smart_data));
16847 if (scmd->satacmd_bp == NULL) {
16848 sata_pkt_free(spx);
16849 kmem_free(spx, sizeof (sata_pkt_txlate_t));
16850 SATA_LOG_D((sata_hba_inst, CE_WARN,
16851 "sata_fetch_smart_data: "
16852 "cannot allocate buffer"));
16853 return (-1);
16854 }
16855
16856
16857 /* Build SMART_READ_DATA cmd in the sata_pkt */
16858 scmd->satacmd_addr_type = 0; /* N/A */
16859 scmd->satacmd_sec_count_lsb = 0; /* N/A */
16860 scmd->satacmd_lba_low_lsb = 0; /* N/A */
16861 scmd->satacmd_lba_mid_lsb = SMART_MAGIC_VAL_1;
16862 scmd->satacmd_lba_high_lsb = SMART_MAGIC_VAL_2;
16863 scmd->satacmd_features_reg = SATA_SMART_READ_DATA;
16864 scmd->satacmd_device_reg = 0; /* Always device 0 */
16865 scmd->satacmd_cmd_reg = SATAC_SMART;
16866 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
16867 sdinfo->satadrv_addr.cport)));
16868
16869 /* Send pkt to SATA HBA driver */
16870 if ((*SATA_START_FUNC(sata_hba_inst))(SATA_DIP(sata_hba_inst), spkt) !=
16871 SATA_TRAN_ACCEPTED ||
16872 spkt->satapkt_reason != SATA_PKT_COMPLETED) {
16873 mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst,
16874 sdinfo->satadrv_addr.cport)));
16875 /*
16876 * Whoops, no SMART DATA available
16877 */
16878 rval = -1;
16879 goto fail;
16880 } else {
16881 mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst,
16882 sdinfo->satadrv_addr.cport)));
16883 if (spx->txlt_buf_dma_handle != NULL) {
16884 rval = ddi_dma_sync(spx->txlt_buf_dma_handle, 0, 0,
16885 DDI_DMA_SYNC_FORKERNEL);
16886 ASSERT(rval == DDI_SUCCESS);
16887 if (sata_check_for_dma_error(dip, spx)) {
16888 ddi_fm_service_impact(dip,
16889 DDI_SERVICE_UNAFFECTED);
16890 rval = -1;
16891 goto fail;
16892 }
16893 }
16894 bcopy(scmd->satacmd_bp->b_un.b_addr, (uint8_t *)smart_data,
16895 sizeof (struct smart_data));
16896 }
16897
16898 fail:
16899 /* Free allocated resources */
16900 sata_free_local_buffer(spx);
16901 sata_pkt_free(spx);
16902 kmem_free(spx, sizeof (sata_pkt_txlate_t));
16903
16904 return (rval);
16905 }
16906
16907 /*
16908 * Used by LOG SENSE page 0x10
16909 * Reads (in synchronous mode) the self test log data using Read Log Ext cmd.
16910 * Note: cannot be called in the interrupt context.
16911 *
16912 * return 0 for success, -1 otherwise
16913 *
16914 */
16915 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)16916 sata_ext_smart_selftest_read_log(
16917 sata_hba_inst_t *sata_hba_inst,
16918 sata_drive_info_t *sdinfo,
16919 struct smart_ext_selftest_log *ext_selftest_log,
16920 uint16_t block_num)
16921 {
16922 sata_pkt_txlate_t *spx;
16923 sata_pkt_t *spkt;
16924 sata_cmd_t *scmd;
16925 int rval;
16926 dev_info_t *dip = SATA_DIP(sata_hba_inst);
16927
16928 #if ! defined(lint)
16929 ASSERT(sizeof (struct smart_ext_selftest_log) == 512);
16930 #endif
16931
16932 spx = kmem_zalloc(sizeof (sata_pkt_txlate_t), KM_SLEEP);
16933 spx->txlt_sata_hba_inst = sata_hba_inst;
16934 spx->txlt_scsi_pkt = NULL; /* No scsi pkt involved */
16935 spkt = sata_pkt_alloc(spx, SLEEP_FUNC);
16936 if (spkt == NULL) {
16937 kmem_free(spx, sizeof (sata_pkt_txlate_t));
16938 return (-1);
16939 }
16940 /* address is needed now */
16941 spkt->satapkt_device.satadev_addr = sdinfo->satadrv_addr;
16942
16943
16944 /* Fill sata_pkt */
16945 spkt->satapkt_device.satadev_addr = sdinfo->satadrv_addr;
16946 spkt->satapkt_op_mode = SATA_OPMODE_SYNCH | SATA_OPMODE_INTERRUPTS;
16947 /* Synchronous mode, no callback */
16948 spkt->satapkt_comp = NULL;
16949 /* Timeout 30s */
16950 spkt->satapkt_time = sata_default_pkt_time;
16951
16952 scmd = &spkt->satapkt_cmd;
16953 scmd->satacmd_flags.sata_data_direction = SATA_DIR_READ;
16954
16955 /*
16956 * Allocate buffer for SMART extended self-test log
16957 */
16958 scmd->satacmd_bp = sata_alloc_local_buffer(spx,
16959 sizeof (struct smart_ext_selftest_log));
16960 if (scmd->satacmd_bp == NULL) {
16961 sata_pkt_free(spx);
16962 kmem_free(spx, sizeof (sata_pkt_txlate_t));
16963 SATA_LOG_D((sata_hba_inst, CE_WARN,
16964 "sata_ext_smart_selftest_log: "
16965 "cannot allocate buffer"));
16966 return (-1);
16967 }
16968
16969 /* Build READ LOG EXT w/ extended self-test log cmd in the sata_pkt */
16970 scmd->satacmd_addr_type = ATA_ADDR_LBA48;
16971 scmd->satacmd_sec_count_lsb = 1; /* One sector of selftest log */
16972 scmd->satacmd_sec_count_msb = 0; /* One sector of selftest log */
16973 scmd->satacmd_lba_low_lsb = EXT_SMART_SELFTEST_LOG_PAGE;
16974 scmd->satacmd_lba_low_msb = 0;
16975 scmd->satacmd_lba_mid_lsb = block_num & 0xff;
16976 scmd->satacmd_lba_mid_msb = block_num >> 8;
16977 scmd->satacmd_device_reg = 0; /* Always device 0 */
16978 scmd->satacmd_cmd_reg = SATAC_READ_LOG_EXT;
16979
16980 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
16981 sdinfo->satadrv_addr.cport)));
16982
16983 /* Send pkt to SATA HBA driver */
16984 if ((*SATA_START_FUNC(sata_hba_inst))(SATA_DIP(sata_hba_inst), spkt) !=
16985 SATA_TRAN_ACCEPTED ||
16986 spkt->satapkt_reason != SATA_PKT_COMPLETED) {
16987 mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst,
16988 sdinfo->satadrv_addr.cport)));
16989
16990 /*
16991 * Whoops, no SMART selftest log info available
16992 */
16993 rval = -1;
16994 goto fail;
16995 } else {
16996 mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst,
16997 sdinfo->satadrv_addr.cport)));
16998
16999 if (spx->txlt_buf_dma_handle != NULL) {
17000 rval = ddi_dma_sync(spx->txlt_buf_dma_handle, 0, 0,
17001 DDI_DMA_SYNC_FORKERNEL);
17002 ASSERT(rval == DDI_SUCCESS);
17003 if (sata_check_for_dma_error(dip, spx)) {
17004 ddi_fm_service_impact(dip,
17005 DDI_SERVICE_UNAFFECTED);
17006 rval = -1;
17007 goto fail;
17008 }
17009 }
17010 bcopy(scmd->satacmd_bp->b_un.b_addr,
17011 (uint8_t *)ext_selftest_log,
17012 sizeof (struct smart_ext_selftest_log));
17013 rval = 0;
17014 }
17015
17016 fail:
17017 /* Free allocated resources */
17018 sata_free_local_buffer(spx);
17019 sata_pkt_free(spx);
17020 kmem_free(spx, sizeof (sata_pkt_txlate_t));
17021
17022 return (rval);
17023 }
17024
17025 /*
17026 * Returns 0 for success, -1 otherwise
17027 *
17028 * SMART self-test log data is returned in buffer pointed to by selftest_log
17029 */
17030 static int
sata_smart_selftest_log(sata_hba_inst_t * sata_hba_inst,sata_drive_info_t * sdinfo,struct smart_selftest_log * selftest_log)17031 sata_smart_selftest_log(
17032 sata_hba_inst_t *sata_hba_inst,
17033 sata_drive_info_t *sdinfo,
17034 struct smart_selftest_log *selftest_log)
17035 {
17036 sata_pkt_t *spkt;
17037 sata_cmd_t *scmd;
17038 sata_pkt_txlate_t *spx;
17039 int rval;
17040 dev_info_t *dip = SATA_DIP(sata_hba_inst);
17041
17042 #if ! defined(lint)
17043 ASSERT(sizeof (struct smart_selftest_log) == 512);
17044 #endif
17045
17046 spx = kmem_zalloc(sizeof (sata_pkt_txlate_t), KM_SLEEP);
17047 spx->txlt_sata_hba_inst = sata_hba_inst;
17048 spx->txlt_scsi_pkt = NULL; /* No scsi pkt involved */
17049 spkt = sata_pkt_alloc(spx, SLEEP_FUNC);
17050 if (spkt == NULL) {
17051 kmem_free(spx, sizeof (sata_pkt_txlate_t));
17052 return (-1);
17053 }
17054 /* address is needed now */
17055 spkt->satapkt_device.satadev_addr = sdinfo->satadrv_addr;
17056
17057
17058 /* Fill sata_pkt */
17059 spkt->satapkt_device.satadev_addr = sdinfo->satadrv_addr;
17060 spkt->satapkt_op_mode = SATA_OPMODE_SYNCH | SATA_OPMODE_INTERRUPTS;
17061 /* Synchronous mode, no callback */
17062 spkt->satapkt_comp = NULL;
17063 /* Timeout 30s */
17064 spkt->satapkt_time = sata_default_pkt_time;
17065
17066 scmd = &spkt->satapkt_cmd;
17067 scmd->satacmd_flags.sata_data_direction = SATA_DIR_READ;
17068
17069 /*
17070 * Allocate buffer for SMART SELFTEST LOG
17071 */
17072 scmd->satacmd_bp = sata_alloc_local_buffer(spx,
17073 sizeof (struct smart_selftest_log));
17074 if (scmd->satacmd_bp == NULL) {
17075 sata_pkt_free(spx);
17076 kmem_free(spx, sizeof (sata_pkt_txlate_t));
17077 SATA_LOG_D((sata_hba_inst, CE_WARN,
17078 "sata_smart_selftest_log: "
17079 "cannot allocate buffer"));
17080 return (-1);
17081 }
17082
17083 /* Build SMART_READ_LOG cmd in the sata_pkt */
17084 scmd->satacmd_addr_type = 0; /* N/A */
17085 scmd->satacmd_sec_count_lsb = 1; /* One sector of SMART log */
17086 scmd->satacmd_lba_low_lsb = SMART_SELFTEST_LOG_PAGE;
17087 scmd->satacmd_lba_mid_lsb = SMART_MAGIC_VAL_1;
17088 scmd->satacmd_lba_high_lsb = SMART_MAGIC_VAL_2;
17089 scmd->satacmd_features_reg = SATA_SMART_READ_LOG;
17090 scmd->satacmd_device_reg = 0; /* Always device 0 */
17091 scmd->satacmd_cmd_reg = SATAC_SMART;
17092 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
17093 sdinfo->satadrv_addr.cport)));
17094
17095 /* Send pkt to SATA HBA driver */
17096 if ((*SATA_START_FUNC(sata_hba_inst))(SATA_DIP(sata_hba_inst), spkt) !=
17097 SATA_TRAN_ACCEPTED ||
17098 spkt->satapkt_reason != SATA_PKT_COMPLETED) {
17099 mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst,
17100 sdinfo->satadrv_addr.cport)));
17101 /*
17102 * Whoops, no SMART DATA available
17103 */
17104 rval = -1;
17105 goto fail;
17106 } else {
17107 mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst,
17108 sdinfo->satadrv_addr.cport)));
17109 if (spx->txlt_buf_dma_handle != NULL) {
17110 rval = ddi_dma_sync(spx->txlt_buf_dma_handle, 0, 0,
17111 DDI_DMA_SYNC_FORKERNEL);
17112 ASSERT(rval == DDI_SUCCESS);
17113 if (sata_check_for_dma_error(dip, spx)) {
17114 ddi_fm_service_impact(dip,
17115 DDI_SERVICE_UNAFFECTED);
17116 rval = -1;
17117 goto fail;
17118 }
17119 }
17120 bcopy(scmd->satacmd_bp->b_un.b_addr, (uint8_t *)selftest_log,
17121 sizeof (struct smart_selftest_log));
17122 rval = 0;
17123 }
17124
17125 fail:
17126 /* Free allocated resources */
17127 sata_free_local_buffer(spx);
17128 sata_pkt_free(spx);
17129 kmem_free(spx, sizeof (sata_pkt_txlate_t));
17130
17131 return (rval);
17132 }
17133
17134
17135 /*
17136 * Returns 0 for success, -1 otherwise
17137 *
17138 * SMART READ LOG data is returned in buffer pointed to by smart_log
17139 */
17140 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)17141 sata_smart_read_log(
17142 sata_hba_inst_t *sata_hba_inst,
17143 sata_drive_info_t *sdinfo,
17144 uint8_t *smart_log, /* where the data should be returned */
17145 uint8_t which_log, /* which log should be returned */
17146 uint8_t log_size) /* # of 512 bytes in log */
17147 {
17148 sata_pkt_t *spkt;
17149 sata_cmd_t *scmd;
17150 sata_pkt_txlate_t *spx;
17151 int rval;
17152 dev_info_t *dip = SATA_DIP(sata_hba_inst);
17153
17154 spx = kmem_zalloc(sizeof (sata_pkt_txlate_t), KM_SLEEP);
17155 spx->txlt_sata_hba_inst = sata_hba_inst;
17156 spx->txlt_scsi_pkt = NULL; /* No scsi pkt involved */
17157 spkt = sata_pkt_alloc(spx, SLEEP_FUNC);
17158 if (spkt == NULL) {
17159 kmem_free(spx, sizeof (sata_pkt_txlate_t));
17160 return (-1);
17161 }
17162 /* address is needed now */
17163 spkt->satapkt_device.satadev_addr = sdinfo->satadrv_addr;
17164
17165
17166 /* Fill sata_pkt */
17167 spkt->satapkt_device.satadev_addr = sdinfo->satadrv_addr;
17168 spkt->satapkt_op_mode = SATA_OPMODE_SYNCH | SATA_OPMODE_INTERRUPTS;
17169 /* Synchronous mode, no callback */
17170 spkt->satapkt_comp = NULL;
17171 /* Timeout 30s */
17172 spkt->satapkt_time = sata_default_pkt_time;
17173
17174 scmd = &spkt->satapkt_cmd;
17175 scmd->satacmd_flags.sata_data_direction = SATA_DIR_READ;
17176
17177 /*
17178 * Allocate buffer for SMART READ LOG
17179 */
17180 scmd->satacmd_bp = sata_alloc_local_buffer(spx, log_size * 512);
17181 if (scmd->satacmd_bp == NULL) {
17182 sata_pkt_free(spx);
17183 kmem_free(spx, sizeof (sata_pkt_txlate_t));
17184 SATA_LOG_D((sata_hba_inst, CE_WARN,
17185 "sata_smart_read_log: " "cannot allocate buffer"));
17186 return (-1);
17187 }
17188
17189 /* Build SMART_READ_LOG cmd in the sata_pkt */
17190 scmd->satacmd_addr_type = 0; /* N/A */
17191 scmd->satacmd_sec_count_lsb = log_size; /* what the caller asked for */
17192 scmd->satacmd_lba_low_lsb = which_log; /* which log page */
17193 scmd->satacmd_lba_mid_lsb = SMART_MAGIC_VAL_1;
17194 scmd->satacmd_lba_high_lsb = SMART_MAGIC_VAL_2;
17195 scmd->satacmd_features_reg = SATA_SMART_READ_LOG;
17196 scmd->satacmd_device_reg = 0; /* Always device 0 */
17197 scmd->satacmd_cmd_reg = SATAC_SMART;
17198
17199 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
17200 sdinfo->satadrv_addr.cport)));
17201
17202 /* Send pkt to SATA HBA driver */
17203 if ((*SATA_START_FUNC(sata_hba_inst))(SATA_DIP(sata_hba_inst), spkt) !=
17204 SATA_TRAN_ACCEPTED ||
17205 spkt->satapkt_reason != SATA_PKT_COMPLETED) {
17206 mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst,
17207 sdinfo->satadrv_addr.cport)));
17208
17209 /*
17210 * Whoops, no SMART DATA available
17211 */
17212 rval = -1;
17213 goto fail;
17214 } else {
17215 mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst,
17216 sdinfo->satadrv_addr.cport)));
17217
17218 if (spx->txlt_buf_dma_handle != NULL) {
17219 rval = ddi_dma_sync(spx->txlt_buf_dma_handle, 0, 0,
17220 DDI_DMA_SYNC_FORKERNEL);
17221 ASSERT(rval == DDI_SUCCESS);
17222 if (sata_check_for_dma_error(dip, spx)) {
17223 ddi_fm_service_impact(dip,
17224 DDI_SERVICE_UNAFFECTED);
17225 rval = -1;
17226 goto fail;
17227 }
17228 }
17229 bcopy(scmd->satacmd_bp->b_un.b_addr, smart_log, log_size * 512);
17230 rval = 0;
17231 }
17232
17233 fail:
17234 /* Free allocated resources */
17235 sata_free_local_buffer(spx);
17236 sata_pkt_free(spx);
17237 kmem_free(spx, sizeof (sata_pkt_txlate_t));
17238
17239 return (rval);
17240 }
17241
17242 /*
17243 * Used by LOG SENSE page 0x10
17244 *
17245 * return 0 for success, -1 otherwise
17246 *
17247 */
17248 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)17249 sata_read_log_ext_directory(
17250 sata_hba_inst_t *sata_hba_inst,
17251 sata_drive_info_t *sdinfo,
17252 struct read_log_ext_directory *logdir)
17253 {
17254 sata_pkt_txlate_t *spx;
17255 sata_pkt_t *spkt;
17256 sata_cmd_t *scmd;
17257 int rval;
17258 dev_info_t *dip = SATA_DIP(sata_hba_inst);
17259
17260 #if ! defined(lint)
17261 ASSERT(sizeof (struct read_log_ext_directory) == 512);
17262 #endif
17263
17264 spx = kmem_zalloc(sizeof (sata_pkt_txlate_t), KM_SLEEP);
17265 spx->txlt_sata_hba_inst = sata_hba_inst;
17266 spx->txlt_scsi_pkt = NULL; /* No scsi pkt involved */
17267 spkt = sata_pkt_alloc(spx, SLEEP_FUNC);
17268 if (spkt == NULL) {
17269 kmem_free(spx, sizeof (sata_pkt_txlate_t));
17270 return (-1);
17271 }
17272
17273 /* Fill sata_pkt */
17274 spkt->satapkt_device.satadev_addr = sdinfo->satadrv_addr;
17275 spkt->satapkt_op_mode = SATA_OPMODE_SYNCH | SATA_OPMODE_INTERRUPTS;
17276 /* Synchronous mode, no callback */
17277 spkt->satapkt_comp = NULL;
17278 /* Timeout 30s */
17279 spkt->satapkt_time = sata_default_pkt_time;
17280
17281 scmd = &spkt->satapkt_cmd;
17282 scmd->satacmd_flags.sata_data_direction = SATA_DIR_READ;
17283
17284 /*
17285 * Allocate buffer for SMART READ LOG EXTENDED command
17286 */
17287 scmd->satacmd_bp = sata_alloc_local_buffer(spx,
17288 sizeof (struct read_log_ext_directory));
17289 if (scmd->satacmd_bp == NULL) {
17290 sata_pkt_free(spx);
17291 kmem_free(spx, sizeof (sata_pkt_txlate_t));
17292 SATA_LOG_D((sata_hba_inst, CE_WARN,
17293 "sata_read_log_ext_directory: "
17294 "cannot allocate buffer"));
17295 return (-1);
17296 }
17297
17298 /* Build READ LOG EXT w/ log directory cmd in the sata_pkt */
17299 scmd->satacmd_addr_type = ATA_ADDR_LBA48;
17300 scmd->satacmd_sec_count_lsb = 1; /* One sector of directory */
17301 scmd->satacmd_sec_count_msb = 0; /* One sector of directory */
17302 scmd->satacmd_lba_low_lsb = READ_LOG_EXT_LOG_DIRECTORY;
17303 scmd->satacmd_lba_low_msb = 0;
17304 scmd->satacmd_lba_mid_lsb = 0;
17305 scmd->satacmd_lba_mid_msb = 0;
17306 scmd->satacmd_device_reg = 0; /* Always device 0 */
17307 scmd->satacmd_cmd_reg = SATAC_READ_LOG_EXT;
17308
17309 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
17310 sdinfo->satadrv_addr.cport)));
17311
17312 /* Send pkt to SATA HBA driver */
17313 if ((*SATA_START_FUNC(sata_hba_inst))(SATA_DIP(sata_hba_inst), spkt) !=
17314 SATA_TRAN_ACCEPTED ||
17315 spkt->satapkt_reason != SATA_PKT_COMPLETED) {
17316 mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst,
17317 sdinfo->satadrv_addr.cport)));
17318 /*
17319 * Whoops, no SMART selftest log info available
17320 */
17321 rval = -1;
17322 goto fail;
17323 } else {
17324 mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst,
17325 sdinfo->satadrv_addr.cport)));
17326 if (spx->txlt_buf_dma_handle != NULL) {
17327 rval = ddi_dma_sync(spx->txlt_buf_dma_handle, 0, 0,
17328 DDI_DMA_SYNC_FORKERNEL);
17329 ASSERT(rval == DDI_SUCCESS);
17330 if (sata_check_for_dma_error(dip, spx)) {
17331 ddi_fm_service_impact(dip,
17332 DDI_SERVICE_UNAFFECTED);
17333 rval = -1;
17334 goto fail;
17335 }
17336 }
17337 bcopy(scmd->satacmd_bp->b_un.b_addr, (uint8_t *)logdir,
17338 sizeof (struct read_log_ext_directory));
17339 rval = 0;
17340 }
17341
17342 fail:
17343 /* Free allocated resources */
17344 sata_free_local_buffer(spx);
17345 sata_pkt_free(spx);
17346 kmem_free(spx, sizeof (sata_pkt_txlate_t));
17347
17348 return (rval);
17349 }
17350
17351 /*
17352 * Set up error retrieval sata command for NCQ command error data
17353 * recovery.
17354 *
17355 * Returns SATA_SUCCESS when data buffer is allocated and packet set-up,
17356 * returns SATA_FAILURE otherwise.
17357 */
17358 static int
sata_ncq_err_ret_cmd_setup(sata_pkt_txlate_t * spx,sata_drive_info_t * sdinfo)17359 sata_ncq_err_ret_cmd_setup(sata_pkt_txlate_t *spx, sata_drive_info_t *sdinfo)
17360 {
17361 #ifndef __lock_lint
17362 _NOTE(ARGUNUSED(sdinfo))
17363 #endif
17364
17365 sata_pkt_t *spkt = spx->txlt_sata_pkt;
17366 sata_cmd_t *scmd;
17367 struct buf *bp;
17368
17369 /* Operation modes are up to the caller */
17370 spkt->satapkt_op_mode = SATA_OPMODE_SYNCH | SATA_OPMODE_INTERRUPTS;
17371
17372 /* Synchronous mode, no callback - may be changed by the caller */
17373 spkt->satapkt_comp = NULL;
17374 spkt->satapkt_time = sata_default_pkt_time;
17375
17376 scmd = &spkt->satapkt_cmd;
17377 bcopy(&sata_rle_cmd, scmd, sizeof (sata_cmd_t));
17378 scmd->satacmd_flags.sata_ignore_dev_reset = B_TRUE;
17379
17380 /*
17381 * Allocate dma_able buffer error data.
17382 * Buffer allocation will take care of buffer alignment and other DMA
17383 * attributes.
17384 */
17385 bp = sata_alloc_local_buffer(spx,
17386 sizeof (struct sata_ncq_error_recovery_page));
17387 if (bp == NULL)
17388 return (SATA_FAILURE);
17389
17390 bp_mapin(bp); /* make data buffer accessible */
17391 scmd->satacmd_bp = bp;
17392
17393 /*
17394 * Set-up pointer to the buffer handle, so HBA can sync buffer
17395 * before accessing it. Handle is in usual place in translate struct.
17396 */
17397 scmd->satacmd_err_ret_buf_handle = &spx->txlt_buf_dma_handle;
17398
17399 ASSERT(scmd->satacmd_num_dma_cookies != 0);
17400 ASSERT(scmd->satacmd_dma_cookie_list != NULL);
17401
17402 return (SATA_SUCCESS);
17403 }
17404
17405 /*
17406 * sata_xlate_errors() is used to translate (S)ATA error
17407 * information to SCSI information returned in the SCSI
17408 * packet.
17409 */
17410 static void
sata_xlate_errors(sata_pkt_txlate_t * spx)17411 sata_xlate_errors(sata_pkt_txlate_t *spx)
17412 {
17413 struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
17414 struct scsi_extended_sense *sense;
17415
17416 scsipkt->pkt_reason = CMD_INCOMPLETE;
17417 *scsipkt->pkt_scbp = STATUS_CHECK;
17418 sense = sata_arq_sense(spx);
17419
17420 switch (spx->txlt_sata_pkt->satapkt_reason) {
17421 case SATA_PKT_PORT_ERROR:
17422 /*
17423 * We have no device data. Assume no data transfered.
17424 */
17425 sense->es_key = KEY_HARDWARE_ERROR;
17426 break;
17427
17428 case SATA_PKT_DEV_ERROR:
17429 if (spx->txlt_sata_pkt->satapkt_cmd.satacmd_status_reg &
17430 SATA_STATUS_ERR) {
17431 /*
17432 * determine dev error reason from error
17433 * reg content
17434 */
17435 sata_decode_device_error(spx, sense);
17436 break;
17437 }
17438 /* No extended sense key - no info available */
17439 break;
17440
17441 case SATA_PKT_TIMEOUT:
17442 scsipkt->pkt_reason = CMD_TIMEOUT;
17443 scsipkt->pkt_statistics |= STAT_TIMEOUT | STAT_DEV_RESET;
17444 /* No extended sense key */
17445 break;
17446
17447 case SATA_PKT_ABORTED:
17448 scsipkt->pkt_reason = CMD_ABORTED;
17449 scsipkt->pkt_statistics |= STAT_ABORTED;
17450 /* No extended sense key */
17451 break;
17452
17453 case SATA_PKT_RESET:
17454 /*
17455 * pkt aborted either by an explicit reset request from
17456 * a host, or due to error recovery
17457 */
17458 scsipkt->pkt_reason = CMD_RESET;
17459 scsipkt->pkt_statistics |= STAT_DEV_RESET;
17460 break;
17461
17462 default:
17463 scsipkt->pkt_reason = CMD_TRAN_ERR;
17464 break;
17465 }
17466 }
17467
17468
17469
17470
17471 /*
17472 * Log sata message
17473 * dev pathname msg line preceeds the logged message.
17474 */
17475
17476 static void
sata_log(sata_hba_inst_t * sata_hba_inst,uint_t level,char * fmt,...)17477 sata_log(sata_hba_inst_t *sata_hba_inst, uint_t level, char *fmt, ...)
17478 {
17479 char pathname[128];
17480 dev_info_t *dip = NULL;
17481 va_list ap;
17482
17483 mutex_enter(&sata_log_mutex);
17484
17485 va_start(ap, fmt);
17486 (void) vsprintf(sata_log_buf, fmt, ap);
17487 va_end(ap);
17488
17489 if (sata_hba_inst != NULL) {
17490 dip = SATA_DIP(sata_hba_inst);
17491 (void) ddi_pathname(dip, pathname);
17492 } else {
17493 pathname[0] = 0;
17494 }
17495 if (level == CE_CONT) {
17496 if (sata_debug_flags == 0)
17497 cmn_err(level, "?%s:\n %s\n", pathname, sata_log_buf);
17498 else
17499 cmn_err(level, "%s:\n %s\n", pathname, sata_log_buf);
17500 } else {
17501 if (level != CE_NOTE) {
17502 cmn_err(level, "%s:\n %s", pathname, sata_log_buf);
17503 } else if (sata_msg) {
17504 cmn_err(level, "%s:\n %s", pathname,
17505 sata_log_buf);
17506 }
17507 }
17508
17509 /* sata trace debug */
17510 sata_trace_debug(dip, sata_log_buf);
17511
17512 mutex_exit(&sata_log_mutex);
17513 }
17514
17515
17516 /* ******** Asynchronous HBA events handling & hotplugging support ******** */
17517
17518 /*
17519 * Start or terminate the thread, depending on flag arg and current state
17520 */
17521 static void
sata_event_thread_control(int startstop)17522 sata_event_thread_control(int startstop)
17523 {
17524 static int sata_event_thread_terminating = 0;
17525 static int sata_event_thread_starting = 0;
17526 int i;
17527
17528 mutex_enter(&sata_event_mutex);
17529
17530 if (startstop == 0 && (sata_event_thread_starting == 1 ||
17531 sata_event_thread_terminating == 1)) {
17532 mutex_exit(&sata_event_mutex);
17533 return;
17534 }
17535 if (startstop == 1 && sata_event_thread_starting == 1) {
17536 mutex_exit(&sata_event_mutex);
17537 return;
17538 }
17539 if (startstop == 1 && sata_event_thread_terminating == 1) {
17540 sata_event_thread_starting = 1;
17541 /* wait til terminate operation completes */
17542 i = SATA_EVNT_DAEMON_TERM_WAIT/SATA_EVNT_DAEMON_TERM_TIMEOUT;
17543 while (sata_event_thread_terminating == 1) {
17544 if (i-- <= 0) {
17545 sata_event_thread_starting = 0;
17546 mutex_exit(&sata_event_mutex);
17547 #ifdef SATA_DEBUG
17548 cmn_err(CE_WARN, "sata_event_thread_control: "
17549 "timeout waiting for thread to terminate");
17550 #endif
17551 return;
17552 }
17553 mutex_exit(&sata_event_mutex);
17554 delay(drv_usectohz(SATA_EVNT_DAEMON_TERM_TIMEOUT));
17555 mutex_enter(&sata_event_mutex);
17556 }
17557 }
17558 if (startstop == 1) {
17559 if (sata_event_thread == NULL) {
17560 sata_event_thread = thread_create(NULL, 0,
17561 (void (*)())sata_event_daemon,
17562 &sata_hba_list, 0, &p0, TS_RUN, minclsyspri);
17563 }
17564 sata_event_thread_starting = 0;
17565 mutex_exit(&sata_event_mutex);
17566 return;
17567 }
17568
17569 /*
17570 * If we got here, thread may need to be terminated
17571 */
17572 if (sata_event_thread != NULL) {
17573 int i;
17574 /* Signal event thread to go away */
17575 sata_event_thread_terminating = 1;
17576 sata_event_thread_terminate = 1;
17577 cv_signal(&sata_event_cv);
17578 /*
17579 * Wait til daemon terminates.
17580 */
17581 i = SATA_EVNT_DAEMON_TERM_WAIT/SATA_EVNT_DAEMON_TERM_TIMEOUT;
17582 while (sata_event_thread_terminate == 1) {
17583 mutex_exit(&sata_event_mutex);
17584 if (i-- <= 0) {
17585 /* Daemon did not go away !!! */
17586 #ifdef SATA_DEBUG
17587 cmn_err(CE_WARN, "sata_event_thread_control: "
17588 "cannot terminate event daemon thread");
17589 #endif
17590 mutex_enter(&sata_event_mutex);
17591 break;
17592 }
17593 delay(drv_usectohz(SATA_EVNT_DAEMON_TERM_TIMEOUT));
17594 mutex_enter(&sata_event_mutex);
17595 }
17596 sata_event_thread_terminating = 0;
17597 }
17598 ASSERT(sata_event_thread_terminating == 0);
17599 ASSERT(sata_event_thread_starting == 0);
17600 mutex_exit(&sata_event_mutex);
17601 }
17602
17603
17604 /*
17605 * SATA HBA event notification function.
17606 * Events reported by SATA HBA drivers per HBA instance relate to a change in
17607 * a port and/or device state or a controller itself.
17608 * Events for different addresses/addr types cannot be combined.
17609 * A warning message is generated for each event type.
17610 * Events are not processed by this function, so only the
17611 * event flag(s)is set for an affected entity and the event thread is
17612 * waken up. Event daemon thread processes all events.
17613 *
17614 * NOTE: Since more than one event may be reported at the same time, one
17615 * cannot determine a sequence of events when opposite event are reported, eg.
17616 * LINK_LOST and LINK_ESTABLISHED. Actual port status during event processing
17617 * is taking precedence over reported events, i.e. may cause ignoring some
17618 * events.
17619 */
17620 #define SATA_EVENT_MAX_MSG_LENGTH 79
17621
17622 void
sata_hba_event_notify(dev_info_t * dip,sata_device_t * sata_device,int event)17623 sata_hba_event_notify(dev_info_t *dip, sata_device_t *sata_device, int event)
17624 {
17625 sata_hba_inst_t *sata_hba_inst = NULL;
17626 sata_address_t *saddr;
17627 sata_pmult_info_t *pmultinfo;
17628 sata_drive_info_t *sdinfo;
17629 sata_port_stats_t *pstats;
17630 sata_cport_info_t *cportinfo;
17631 sata_pmport_info_t *pmportinfo;
17632 int cport, pmport;
17633 char buf1[SATA_EVENT_MAX_MSG_LENGTH + 1];
17634 char buf2[SATA_EVENT_MAX_MSG_LENGTH + 1];
17635 char *lcp;
17636 static char *err_msg_evnt_1 =
17637 "sata_hba_event_notify: invalid port event 0x%x ";
17638 static char *err_msg_evnt_2 =
17639 "sata_hba_event_notify: invalid device event 0x%x ";
17640 int linkevent;
17641
17642 /*
17643 * There is a possibility that an event will be generated on HBA
17644 * that has not completed attachment or is detaching. We still want
17645 * to process events until HBA is detached.
17646 */
17647 mutex_enter(&sata_mutex);
17648 for (sata_hba_inst = sata_hba_list; sata_hba_inst != NULL;
17649 sata_hba_inst = sata_hba_inst->satahba_next) {
17650 if (SATA_DIP(sata_hba_inst) == dip)
17651 if (sata_hba_inst->satahba_attached == 1)
17652 break;
17653 }
17654 mutex_exit(&sata_mutex);
17655 if (sata_hba_inst == NULL)
17656 /* HBA not attached */
17657 return;
17658
17659 ASSERT(sata_device != NULL);
17660
17661 /*
17662 * Validate address before - do not proceed with invalid address.
17663 */
17664 saddr = &sata_device->satadev_addr;
17665 if (saddr->cport >= SATA_NUM_CPORTS(sata_hba_inst))
17666 return;
17667
17668 cport = saddr->cport;
17669 pmport = saddr->pmport;
17670
17671 buf1[0] = buf2[0] = '\0';
17672
17673 /*
17674 * If event relates to port or device, check port state.
17675 * Port has to be initialized, or we cannot accept an event.
17676 */
17677 if ((saddr->qual & (SATA_ADDR_CPORT | SATA_ADDR_PMPORT |
17678 SATA_ADDR_DCPORT | SATA_ADDR_DPMPORT | SATA_ADDR_PMULT)) != 0) {
17679 mutex_enter(&sata_hba_inst->satahba_mutex);
17680 cportinfo = SATA_CPORT_INFO(sata_hba_inst, cport);
17681 mutex_exit(&sata_hba_inst->satahba_mutex);
17682 if (cportinfo == NULL || cportinfo->cport_state == 0)
17683 return;
17684 }
17685
17686 if ((saddr->qual & (SATA_ADDR_PMULT | SATA_ADDR_PMPORT |
17687 SATA_ADDR_DPMPORT)) != 0) {
17688 if (cportinfo->cport_dev_type != SATA_DTYPE_PMULT) {
17689 SATA_LOG_D((sata_hba_inst, CE_WARN,
17690 "sata_hba_event_notify: Non-pmult device (0x%x)"
17691 "is attached to port %d, ignore pmult/pmport "
17692 "event 0x%x", cportinfo->cport_dev_type,
17693 cport, event));
17694 return;
17695 }
17696
17697 mutex_enter(&cportinfo->cport_mutex);
17698 pmultinfo = SATA_PMULT_INFO(sata_hba_inst, cport);
17699 mutex_exit(&cportinfo->cport_mutex);
17700
17701 /*
17702 * The daemon might be processing attachment of port
17703 * multiplier, in that case we should ignore events on its
17704 * sub-devices.
17705 *
17706 * NOTE: Only pmult_state is checked in sata_hba_event_notify.
17707 * The pmport_state is checked by sata daemon.
17708 */
17709 if (pmultinfo == NULL ||
17710 pmultinfo->pmult_state == SATA_STATE_UNKNOWN) {
17711 SATA_LOG_D((sata_hba_inst, CE_WARN,
17712 "sata_hba_event_notify: pmult is not"
17713 "available at port %d:%d, ignore event 0x%x",
17714 cport, pmport, event));
17715 return;
17716 }
17717 }
17718
17719 if ((saddr->qual &
17720 (SATA_ADDR_PMPORT | SATA_ADDR_DPMPORT)) != 0) {
17721
17722 mutex_enter(&cportinfo->cport_mutex);
17723 if (pmport > SATA_NUM_PMPORTS(sata_hba_inst, cport)) {
17724 SATA_LOG_D((sata_hba_inst, CE_WARN,
17725 "sata_hba_event_notify: invalid/"
17726 "un-implemented port %d:%d (%d ports), "
17727 "ignore event 0x%x", cport, pmport,
17728 SATA_NUM_PMPORTS(sata_hba_inst, cport), event));
17729 mutex_exit(&cportinfo->cport_mutex);
17730 return;
17731 }
17732 mutex_exit(&cportinfo->cport_mutex);
17733
17734 mutex_enter(&sata_hba_inst->satahba_mutex);
17735 pmportinfo = SATA_PMPORT_INFO(sata_hba_inst,
17736 cport, pmport);
17737 mutex_exit(&sata_hba_inst->satahba_mutex);
17738
17739 /* pmport is implemented/valid? */
17740 if (pmportinfo == NULL) {
17741 SATA_LOG_D((sata_hba_inst, CE_WARN,
17742 "sata_hba_event_notify: invalid/"
17743 "un-implemented port %d:%d, ignore "
17744 "event 0x%x", cport, pmport, event));
17745 return;
17746 }
17747 }
17748
17749 /*
17750 * Events refer to devices, ports and controllers - each has
17751 * unique address. Events for different addresses cannot be combined.
17752 */
17753 if (saddr->qual & (SATA_ADDR_CPORT | SATA_ADDR_PMPORT)) {
17754
17755 mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst, cport)));
17756
17757 /* qualify this event(s) */
17758 if ((event & SATA_EVNT_PORT_EVENTS) == 0) {
17759 /* Invalid event for the device port */
17760 (void) sprintf(buf2, err_msg_evnt_1,
17761 event & SATA_EVNT_PORT_EVENTS);
17762 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst, cport)));
17763 goto event_info;
17764 }
17765 if (saddr->qual == SATA_ADDR_CPORT) {
17766 /* Controller's device port event */
17767
17768 (SATA_CPORT_INFO(sata_hba_inst, cport))->
17769 cport_event_flags |=
17770 event & SATA_EVNT_PORT_EVENTS;
17771 pstats =
17772 &(SATA_CPORT_INFO(sata_hba_inst, cport))->
17773 cport_stats;
17774 } else {
17775 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst, cport)));
17776 mutex_enter(&pmportinfo->pmport_mutex);
17777 /* Port multiplier's device port event */
17778 (SATA_PMPORT_INFO(sata_hba_inst, cport, pmport))->
17779 pmport_event_flags |=
17780 event & SATA_EVNT_PORT_EVENTS;
17781 pstats =
17782 &(SATA_PMPORT_INFO(sata_hba_inst, cport, pmport))->
17783 pmport_stats;
17784 mutex_exit(&pmportinfo->pmport_mutex);
17785 mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst, cport)));
17786 }
17787
17788 /*
17789 * Add to statistics and log the message. We have to do it
17790 * here rather than in the event daemon, because there may be
17791 * multiple events occuring before they are processed.
17792 */
17793 linkevent = event &
17794 (SATA_EVNT_LINK_LOST | SATA_EVNT_LINK_ESTABLISHED);
17795 if (linkevent) {
17796 if (linkevent == (SATA_EVNT_LINK_LOST |
17797 SATA_EVNT_LINK_ESTABLISHED)) {
17798 /* This is likely event combination */
17799 (void) strlcat(buf1, "link lost/established, ",
17800 SATA_EVENT_MAX_MSG_LENGTH);
17801
17802 if (pstats->link_lost < 0xffffffffffffffffULL)
17803 pstats->link_lost++;
17804 if (pstats->link_established <
17805 0xffffffffffffffffULL)
17806 pstats->link_established++;
17807 linkevent = 0;
17808 } else if (linkevent & SATA_EVNT_LINK_LOST) {
17809 (void) strlcat(buf1, "link lost, ",
17810 SATA_EVENT_MAX_MSG_LENGTH);
17811
17812 if (pstats->link_lost < 0xffffffffffffffffULL)
17813 pstats->link_lost++;
17814 } else {
17815 (void) strlcat(buf1, "link established, ",
17816 SATA_EVENT_MAX_MSG_LENGTH);
17817 if (pstats->link_established <
17818 0xffffffffffffffffULL)
17819 pstats->link_established++;
17820 }
17821 }
17822 if (event & SATA_EVNT_DEVICE_ATTACHED) {
17823 (void) strlcat(buf1, "device attached, ",
17824 SATA_EVENT_MAX_MSG_LENGTH);
17825 if (pstats->device_attached < 0xffffffffffffffffULL)
17826 pstats->device_attached++;
17827 }
17828 if (event & SATA_EVNT_DEVICE_DETACHED) {
17829 (void) strlcat(buf1, "device detached, ",
17830 SATA_EVENT_MAX_MSG_LENGTH);
17831 if (pstats->device_detached < 0xffffffffffffffffULL)
17832 pstats->device_detached++;
17833 }
17834 if (event & SATA_EVNT_PWR_LEVEL_CHANGED) {
17835 SATADBG1(SATA_DBG_EVENTS, sata_hba_inst,
17836 "port %d power level changed", cport);
17837 if (pstats->port_pwr_changed < 0xffffffffffffffffULL)
17838 pstats->port_pwr_changed++;
17839 }
17840
17841 if ((event & ~SATA_EVNT_PORT_EVENTS) != 0) {
17842 /* There should be no other events for this address */
17843 (void) sprintf(buf2, err_msg_evnt_1,
17844 event & ~SATA_EVNT_PORT_EVENTS);
17845 }
17846 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst, cport)));
17847
17848 } else if (saddr->qual & (SATA_ADDR_DCPORT | SATA_ADDR_DPMPORT)) {
17849 mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst, cport)));
17850
17851 /* qualify this event */
17852 if ((event & SATA_EVNT_DEVICE_RESET) == 0) {
17853 /* Invalid event for a device */
17854 (void) sprintf(buf2, err_msg_evnt_2,
17855 event & SATA_EVNT_DEVICE_RESET);
17856 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst, cport)));
17857 goto event_info;
17858 }
17859 /* drive event */
17860 sdinfo = sata_get_device_info(sata_hba_inst, sata_device);
17861 if (sdinfo != NULL) {
17862 if (event & SATA_EVNT_DEVICE_RESET) {
17863 (void) strlcat(buf1, "device reset, ",
17864 SATA_EVENT_MAX_MSG_LENGTH);
17865 if (sdinfo->satadrv_stats.drive_reset <
17866 0xffffffffffffffffULL)
17867 sdinfo->satadrv_stats.drive_reset++;
17868 sdinfo->satadrv_event_flags |=
17869 SATA_EVNT_DEVICE_RESET;
17870 }
17871 }
17872 if ((event & ~SATA_EVNT_DEVICE_RESET) != 0) {
17873 /* Invalid event for a device */
17874 (void) sprintf(buf2, err_msg_evnt_2,
17875 event & ~SATA_EVNT_DRIVE_EVENTS);
17876 }
17877 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst, cport)));
17878 } else if (saddr->qual == SATA_ADDR_PMULT) {
17879 mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst, cport)));
17880
17881 /* qualify this event */
17882 if ((event & (SATA_EVNT_DEVICE_RESET |
17883 SATA_EVNT_PMULT_LINK_CHANGED)) == 0) {
17884 /* Invalid event for a port multiplier */
17885 (void) sprintf(buf2, err_msg_evnt_2,
17886 event & SATA_EVNT_DEVICE_RESET);
17887 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst, cport)));
17888 goto event_info;
17889 }
17890
17891 pmultinfo = SATA_PMULT_INFO(sata_hba_inst, cport);
17892
17893 if (event & SATA_EVNT_DEVICE_RESET) {
17894
17895 SATADBG1(SATA_DBG_PMULT, sata_hba_inst,
17896 "[Reset] port-mult on cport %d", cport);
17897 pmultinfo->pmult_event_flags |=
17898 SATA_EVNT_DEVICE_RESET;
17899 (void) strlcat(buf1, "pmult reset, ",
17900 SATA_EVENT_MAX_MSG_LENGTH);
17901 }
17902
17903 if (event & SATA_EVNT_PMULT_LINK_CHANGED) {
17904
17905 SATADBG1(SATA_DBG_PMULT, sata_hba_inst,
17906 "pmult link changed on cport %d", cport);
17907 pmultinfo->pmult_event_flags |=
17908 SATA_EVNT_PMULT_LINK_CHANGED;
17909 (void) strlcat(buf1, "pmult link changed, ",
17910 SATA_EVENT_MAX_MSG_LENGTH);
17911 }
17912 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst, cport)));
17913
17914 } else {
17915 if (saddr->qual != SATA_ADDR_NULL) {
17916 /* Wrong address qualifier */
17917 SATA_LOG_D((sata_hba_inst, CE_WARN,
17918 "sata_hba_event_notify: invalid address 0x%x",
17919 *(uint32_t *)saddr));
17920 return;
17921 }
17922 if ((event & SATA_EVNT_CONTROLLER_EVENTS) == 0 ||
17923 (event & ~SATA_EVNT_CONTROLLER_EVENTS) != 0) {
17924 /* Invalid event for the controller */
17925 SATA_LOG_D((sata_hba_inst, CE_WARN,
17926 "sata_hba_event_notify: invalid event 0x%x for "
17927 "controller",
17928 event & SATA_EVNT_CONTROLLER_EVENTS));
17929 return;
17930 }
17931 buf1[0] = '\0';
17932 /* This may be a frequent and not interesting event */
17933 SATADBG1(SATA_DBG_EVENTS, sata_hba_inst,
17934 "controller power level changed\n", NULL);
17935
17936 mutex_enter(&sata_hba_inst->satahba_mutex);
17937 if (sata_hba_inst->satahba_stats.ctrl_pwr_change <
17938 0xffffffffffffffffULL)
17939 sata_hba_inst->satahba_stats.ctrl_pwr_change++;
17940
17941 sata_hba_inst->satahba_event_flags |=
17942 SATA_EVNT_PWR_LEVEL_CHANGED;
17943 mutex_exit(&sata_hba_inst->satahba_mutex);
17944 }
17945 /*
17946 * If we got here, there is something to do with this HBA
17947 * instance.
17948 */
17949 mutex_enter(&sata_hba_inst->satahba_mutex);
17950 sata_hba_inst->satahba_event_flags |= SATA_EVNT_MAIN;
17951 mutex_exit(&sata_hba_inst->satahba_mutex);
17952 mutex_enter(&sata_mutex);
17953 sata_event_pending |= SATA_EVNT_MAIN; /* global event indicator */
17954 mutex_exit(&sata_mutex);
17955
17956 /* Tickle event thread */
17957 mutex_enter(&sata_event_mutex);
17958 if (sata_event_thread_active == 0)
17959 cv_signal(&sata_event_cv);
17960 mutex_exit(&sata_event_mutex);
17961
17962 event_info:
17963 if (buf1[0] != '\0') {
17964 lcp = strrchr(buf1, ',');
17965 if (lcp != NULL)
17966 *lcp = '\0';
17967 }
17968 if (saddr->qual == SATA_ADDR_CPORT ||
17969 saddr->qual == SATA_ADDR_DCPORT) {
17970 if (buf1[0] != '\0') {
17971 sata_log(sata_hba_inst, CE_NOTE, "port %d: %s\n",
17972 cport, buf1);
17973 }
17974 if (buf2[0] != '\0') {
17975 sata_log(sata_hba_inst, CE_NOTE, "port %d: %s\n",
17976 cport, buf2);
17977 }
17978 } else if (saddr->qual == SATA_ADDR_PMPORT ||
17979 saddr->qual == SATA_ADDR_DPMPORT) {
17980 if (buf1[0] != '\0') {
17981 sata_log(sata_hba_inst, CE_NOTE,
17982 "port %d pmport %d: %s\n", cport, pmport, buf1);
17983 }
17984 if (buf2[0] != '\0') {
17985 sata_log(sata_hba_inst, CE_NOTE,
17986 "port %d pmport %d: %s\n", cport, pmport, buf2);
17987 }
17988 }
17989 }
17990
17991
17992 /*
17993 * Event processing thread.
17994 * Arg is a pointer to the sata_hba_list pointer.
17995 * It is not really needed, because sata_hba_list is global and static
17996 */
17997 static void
sata_event_daemon(void * arg)17998 sata_event_daemon(void *arg)
17999 {
18000 #ifndef __lock_lint
18001 _NOTE(ARGUNUSED(arg))
18002 #endif
18003 sata_hba_inst_t *sata_hba_inst;
18004 clock_t delta;
18005
18006 SATADBG1(SATA_DBG_EVENTS_DAEMON, NULL,
18007 "SATA event daemon started\n", NULL);
18008 loop:
18009 /*
18010 * Process events here. Walk through all registered HBAs
18011 */
18012 mutex_enter(&sata_mutex);
18013 for (sata_hba_inst = sata_hba_list; sata_hba_inst != NULL;
18014 sata_hba_inst = sata_hba_inst->satahba_next) {
18015 ASSERT(sata_hba_inst != NULL);
18016 mutex_enter(&sata_hba_inst->satahba_mutex);
18017 if (sata_hba_inst->satahba_attached == 0 ||
18018 (sata_hba_inst->satahba_event_flags &
18019 SATA_EVNT_SKIP) != 0) {
18020 mutex_exit(&sata_hba_inst->satahba_mutex);
18021 continue;
18022 }
18023 if (sata_hba_inst->satahba_event_flags & SATA_EVNT_MAIN) {
18024 sata_hba_inst->satahba_event_flags |= SATA_EVNT_SKIP;
18025 mutex_exit(&sata_hba_inst->satahba_mutex);
18026 mutex_exit(&sata_mutex);
18027 /* Got the controller with pending event */
18028 sata_process_controller_events(sata_hba_inst);
18029 /*
18030 * Since global mutex was released, there is a
18031 * possibility that HBA list has changed, so start
18032 * over from the top. Just processed controller
18033 * will be passed-over because of the SKIP flag.
18034 */
18035 goto loop;
18036 }
18037 mutex_exit(&sata_hba_inst->satahba_mutex);
18038 }
18039 /* Clear SKIP flag in all controllers */
18040 for (sata_hba_inst = sata_hba_list; sata_hba_inst != NULL;
18041 sata_hba_inst = sata_hba_inst->satahba_next) {
18042 mutex_enter(&sata_hba_inst->satahba_mutex);
18043 sata_hba_inst->satahba_event_flags &= ~SATA_EVNT_SKIP;
18044 mutex_exit(&sata_hba_inst->satahba_mutex);
18045 }
18046 mutex_exit(&sata_mutex);
18047
18048 SATADBG1(SATA_DBG_EVENTS_DAEMON, NULL,
18049 "SATA EVENT DAEMON suspending itself", NULL);
18050
18051 #ifdef SATA_DEBUG
18052 if ((sata_func_enable & SATA_ENABLE_PROCESS_EVENTS) == 0) {
18053 sata_log(sata_hba_inst, CE_WARN,
18054 "SATA EVENTS PROCESSING DISABLED\n");
18055 thread_exit(); /* Daemon will not run again */
18056 }
18057 #endif
18058 mutex_enter(&sata_event_mutex);
18059 sata_event_thread_active = 0;
18060 mutex_exit(&sata_event_mutex);
18061 /*
18062 * Go to sleep/suspend itself and wake up either because new event or
18063 * wait timeout. Exit if there is a termination request (driver
18064 * unload).
18065 */
18066 delta = drv_usectohz(SATA_EVNT_DAEMON_SLEEP_TIME);
18067 do {
18068 mutex_enter(&sata_event_mutex);
18069 (void) cv_reltimedwait(&sata_event_cv, &sata_event_mutex,
18070 delta, TR_CLOCK_TICK);
18071
18072 if (sata_event_thread_active != 0) {
18073 mutex_exit(&sata_event_mutex);
18074 continue;
18075 }
18076
18077 /* Check if it is time to go away */
18078 if (sata_event_thread_terminate == 1) {
18079 /*
18080 * It is up to the thread setting above flag to make
18081 * sure that this thread is not killed prematurely.
18082 */
18083 sata_event_thread_terminate = 0;
18084 sata_event_thread = NULL;
18085 mutex_exit(&sata_event_mutex);
18086 SATADBG1(SATA_DBG_EVENTS_DAEMON, NULL,
18087 "SATA_EVENT_DAEMON_TERMINATING", NULL);
18088 thread_exit(); { _NOTE(NOT_REACHED) }
18089 }
18090 mutex_exit(&sata_event_mutex);
18091 } while (!(sata_event_pending & SATA_EVNT_MAIN));
18092
18093 mutex_enter(&sata_event_mutex);
18094 sata_event_thread_active = 1;
18095 mutex_exit(&sata_event_mutex);
18096
18097 mutex_enter(&sata_mutex);
18098 sata_event_pending &= ~SATA_EVNT_MAIN;
18099 mutex_exit(&sata_mutex);
18100
18101 SATADBG1(SATA_DBG_EVENTS_DAEMON, NULL,
18102 "SATA EVENT DAEMON READY TO PROCESS EVENT", NULL);
18103
18104 goto loop;
18105 }
18106
18107 /*
18108 * Specific HBA instance event processing.
18109 *
18110 * NOTE: At the moment, device event processing is limited to hard disks
18111 * only.
18112 * Port multiplier is supported now.
18113 */
18114 static void
sata_process_controller_events(sata_hba_inst_t * sata_hba_inst)18115 sata_process_controller_events(sata_hba_inst_t *sata_hba_inst)
18116 {
18117 int ncport;
18118 uint32_t event_flags;
18119 sata_address_t *saddr;
18120 sata_cport_info_t *cportinfo;
18121 sata_pmult_info_t *pmultinfo;
18122
18123 SATADBG1(SATA_DBG_EVENTS_CNTRL, sata_hba_inst,
18124 "Processing controller %d event(s)",
18125 ddi_get_instance(SATA_DIP(sata_hba_inst)));
18126
18127 mutex_enter(&sata_hba_inst->satahba_mutex);
18128 sata_hba_inst->satahba_event_flags &= ~SATA_EVNT_MAIN;
18129 event_flags = sata_hba_inst->satahba_event_flags;
18130 mutex_exit(&sata_hba_inst->satahba_mutex);
18131 /*
18132 * Process controller power change first
18133 * HERE
18134 */
18135 if (event_flags & SATA_EVNT_PWR_LEVEL_CHANGED)
18136 sata_process_cntrl_pwr_level_change(sata_hba_inst);
18137
18138 /*
18139 * Search through ports/devices to identify affected port/device.
18140 * We may have to process events for more than one port/device.
18141 */
18142 for (ncport = 0; ncport < SATA_NUM_CPORTS(sata_hba_inst); ncport++) {
18143 /*
18144 * Not all ports may be processed in attach by the time we
18145 * get an event. Check if port info is initialized.
18146 */
18147 mutex_enter(&sata_hba_inst->satahba_mutex);
18148 cportinfo = SATA_CPORT_INFO(sata_hba_inst, ncport);
18149 mutex_exit(&sata_hba_inst->satahba_mutex);
18150 if (cportinfo == NULL || cportinfo->cport_state == NULL)
18151 continue;
18152
18153 /* We have initialized controller port info */
18154 mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst, ncport)));
18155 event_flags = (SATA_CPORT_INFO(sata_hba_inst, ncport))->
18156 cport_event_flags;
18157 /* Check if port was locked by IOCTL processing */
18158 if (event_flags & SATA_APCTL_LOCK_PORT_BUSY) {
18159 /*
18160 * We ignore port events because port is busy
18161 * with AP control processing. Set again
18162 * controller and main event flag, so that
18163 * events may be processed by the next daemon
18164 * run.
18165 */
18166 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst, ncport)));
18167 mutex_enter(&sata_hba_inst->satahba_mutex);
18168 sata_hba_inst->satahba_event_flags |= SATA_EVNT_MAIN;
18169 mutex_exit(&sata_hba_inst->satahba_mutex);
18170 mutex_enter(&sata_mutex);
18171 sata_event_pending |= SATA_EVNT_MAIN;
18172 mutex_exit(&sata_mutex);
18173 SATADBG1(SATA_DBG_EVENTS_PROCPST, sata_hba_inst,
18174 "Event processing postponed until "
18175 "AP control processing completes",
18176 NULL);
18177 /* Check other ports */
18178 continue;
18179 } else {
18180 /*
18181 * Set BSY flag so that AP control would not
18182 * interfere with events processing for
18183 * this port.
18184 */
18185 (SATA_CPORT_INFO(sata_hba_inst, ncport))->
18186 cport_event_flags |= SATA_EVNT_LOCK_PORT_BUSY;
18187 }
18188 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst, ncport)));
18189
18190 saddr = &(SATA_CPORT_INFO(sata_hba_inst, ncport))->cport_addr;
18191
18192 if ((event_flags &
18193 (SATA_EVNT_PORT_EVENTS | SATA_EVNT_DRIVE_EVENTS)) != 0) {
18194 /*
18195 * Got port event.
18196 * We need some hierarchy of event processing as they
18197 * are affecting each other:
18198 * 1. port failed
18199 * 2. device detached/attached
18200 * 3. link events - link events may trigger device
18201 * detached or device attached events in some
18202 * circumstances.
18203 * 4. port power level changed
18204 */
18205 if (event_flags & SATA_EVNT_PORT_FAILED) {
18206 sata_process_port_failed_event(sata_hba_inst,
18207 saddr);
18208 }
18209 if (event_flags & SATA_EVNT_DEVICE_DETACHED) {
18210 sata_process_device_detached(sata_hba_inst,
18211 saddr);
18212 }
18213 if (event_flags & SATA_EVNT_DEVICE_ATTACHED) {
18214 sata_process_device_attached(sata_hba_inst,
18215 saddr);
18216 }
18217 if (event_flags &
18218 (SATA_EVNT_LINK_ESTABLISHED |
18219 SATA_EVNT_LINK_LOST)) {
18220 sata_process_port_link_events(sata_hba_inst,
18221 saddr);
18222 }
18223 if (event_flags & SATA_EVNT_PWR_LEVEL_CHANGED) {
18224 sata_process_port_pwr_change(sata_hba_inst,
18225 saddr);
18226 }
18227 if (event_flags & SATA_EVNT_TARGET_NODE_CLEANUP) {
18228 sata_process_target_node_cleanup(
18229 sata_hba_inst, saddr);
18230 }
18231 if (event_flags & SATA_EVNT_AUTOONLINE_DEVICE) {
18232 sata_process_device_autoonline(
18233 sata_hba_inst, saddr);
18234 }
18235 }
18236
18237
18238 /*
18239 * Scan port multiplier and all its sub-ports event flags.
18240 * The events are marked by
18241 * (1) sata_pmult_info.pmult_event_flags
18242 * (2) sata_pmport_info.pmport_event_flags
18243 */
18244 mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst, ncport)));
18245 if (cportinfo->cport_dev_type == SATA_DTYPE_PMULT) {
18246 /*
18247 * There should be another extra check: this
18248 * port multiplier still exists?
18249 */
18250 pmultinfo = SATA_PMULT_INFO(sata_hba_inst,
18251 ncport);
18252
18253 if (pmultinfo != NULL) {
18254 mutex_exit(&(SATA_CPORT_MUTEX(
18255 sata_hba_inst, ncport)));
18256 sata_process_pmult_events(
18257 sata_hba_inst, ncport);
18258 mutex_enter(&(SATA_CPORT_MUTEX(
18259 sata_hba_inst, ncport)));
18260 } else {
18261 SATADBG1(SATA_DBG_PMULT, sata_hba_inst,
18262 "Port-multiplier is gone. "
18263 "Ignore all sub-device events "
18264 "at port %d.", ncport);
18265 }
18266 }
18267
18268 if ((SATA_CPORT_DEV_TYPE(sata_hba_inst, ncport) !=
18269 SATA_DTYPE_NONE) &&
18270 (SATA_CPORT_DRV_INFO(sata_hba_inst, ncport) != NULL)) {
18271 if (SATA_CPORT_DRV_INFO(sata_hba_inst, ncport)->
18272 satadrv_event_flags &
18273 (SATA_EVNT_DEVICE_RESET |
18274 SATA_EVNT_INPROC_DEVICE_RESET)) {
18275 /* Have device event */
18276 sata_process_device_reset(sata_hba_inst,
18277 saddr);
18278 }
18279 }
18280 /* Release PORT_BUSY flag */
18281 (SATA_CPORT_INFO(sata_hba_inst, ncport))->
18282 cport_event_flags &= ~SATA_EVNT_LOCK_PORT_BUSY;
18283 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst, ncport)));
18284
18285 } /* End of loop through the controller SATA ports */
18286 }
18287
18288 /*
18289 * Specific port multiplier instance event processing. At the moment, device
18290 * event processing is limited to link/attach event only.
18291 *
18292 * NOTE: power management event is not supported yet.
18293 */
18294 static void
sata_process_pmult_events(sata_hba_inst_t * sata_hba_inst,uint8_t cport)18295 sata_process_pmult_events(sata_hba_inst_t *sata_hba_inst, uint8_t cport)
18296 {
18297 sata_cport_info_t *cportinfo = SATA_CPORT_INFO(sata_hba_inst, cport);
18298 sata_pmult_info_t *pmultinfo;
18299 sata_pmport_info_t *pmportinfo;
18300 sata_address_t *saddr;
18301 sata_device_t sata_device;
18302 uint32_t event_flags;
18303 int npmport;
18304 int rval;
18305
18306 SATADBG2(SATA_DBG_EVENTS_CNTRL|SATA_DBG_PMULT, sata_hba_inst,
18307 "Processing pmult event(s) on cport %d of controller %d",
18308 cport, ddi_get_instance(SATA_DIP(sata_hba_inst)));
18309
18310 /* First process events on port multiplier */
18311 mutex_enter(&cportinfo->cport_mutex);
18312 pmultinfo = SATA_PMULT_INFO(sata_hba_inst, cport);
18313 event_flags = pmultinfo->pmult_event_flags;
18314
18315 /*
18316 * Reset event (of port multiplier) has higher priority because the
18317 * port multiplier itself might be failed or removed after reset.
18318 */
18319 if (event_flags & SATA_EVNT_DEVICE_RESET) {
18320 /*
18321 * The status of the sub-links are uncertain,
18322 * so mark all sub-ports as RESET
18323 */
18324 for (npmport = 0; npmport < SATA_NUM_PMPORTS(
18325 sata_hba_inst, cport); npmport ++) {
18326 pmportinfo = SATA_PMPORT_INFO(sata_hba_inst,
18327 cport, npmport);
18328 if (pmportinfo == NULL) {
18329 /* That's weird. */
18330 SATA_LOG_D((sata_hba_inst, CE_WARN,
18331 "sata_hba_event_notify: "
18332 "invalid/un-implemented "
18333 "port %d:%d (%d ports), ",
18334 cport, npmport, SATA_NUM_PMPORTS(
18335 sata_hba_inst, cport)));
18336 continue;
18337 }
18338
18339 mutex_enter(&pmportinfo->pmport_mutex);
18340
18341 /* Mark all pmport to unknow state. */
18342 pmportinfo->pmport_state = SATA_STATE_UNKNOWN;
18343 /* Mark all pmports with link events. */
18344 pmportinfo->pmport_event_flags =
18345 (SATA_EVNT_LINK_ESTABLISHED|SATA_EVNT_LINK_LOST);
18346 mutex_exit(&pmportinfo->pmport_mutex);
18347 }
18348
18349 } else if (event_flags & SATA_EVNT_PMULT_LINK_CHANGED) {
18350 /*
18351 * We need probe the port multiplier to know what has
18352 * happened.
18353 */
18354 bzero(&sata_device, sizeof (sata_device_t));
18355 sata_device.satadev_rev = SATA_DEVICE_REV;
18356 sata_device.satadev_addr.cport = cport;
18357 sata_device.satadev_addr.pmport = SATA_PMULT_HOSTPORT;
18358 sata_device.satadev_addr.qual = SATA_ADDR_PMULT;
18359
18360 mutex_exit(&cportinfo->cport_mutex);
18361 rval = (*SATA_PROBE_PORT_FUNC(sata_hba_inst))
18362 (SATA_DIP(sata_hba_inst), &sata_device);
18363 mutex_enter(&cportinfo->cport_mutex);
18364 if (rval != SATA_SUCCESS) {
18365 /* Something went wrong? Fail the port */
18366 cportinfo->cport_state = SATA_PSTATE_FAILED;
18367 mutex_exit(&cportinfo->cport_mutex);
18368 SATA_LOG_D((sata_hba_inst, CE_WARN,
18369 "SATA port %d probing failed", cport));
18370
18371 /* PMult structure must be released. */
18372 sata_free_pmult(sata_hba_inst, &sata_device);
18373 return;
18374 }
18375
18376 sata_update_port_info(sata_hba_inst, &sata_device);
18377
18378 /*
18379 * Sanity check - Port is active? Is the link active?
18380 * The device is still a port multiplier?
18381 */
18382 if ((cportinfo->cport_state &
18383 (SATA_PSTATE_SHUTDOWN | SATA_PSTATE_FAILED)) ||
18384 ((cportinfo->cport_scr.sstatus &
18385 SATA_PORT_DEVLINK_UP_MASK) != SATA_PORT_DEVLINK_UP) ||
18386 (cportinfo->cport_dev_type != SATA_DTYPE_PMULT)) {
18387 mutex_exit(&cportinfo->cport_mutex);
18388
18389 /* PMult structure must be released. */
18390 sata_free_pmult(sata_hba_inst, &sata_device);
18391 return;
18392 }
18393
18394 /* Probed succeed, set port ready. */
18395 cportinfo->cport_state |=
18396 SATA_STATE_PROBED | SATA_STATE_READY;
18397 }
18398
18399 /* Release port multiplier event flags. */
18400 pmultinfo->pmult_event_flags &=
18401 ~(SATA_EVNT_DEVICE_RESET|SATA_EVNT_PMULT_LINK_CHANGED);
18402 mutex_exit(&cportinfo->cport_mutex);
18403
18404 /*
18405 * Check all sub-links.
18406 */
18407 for (npmport = 0; npmport < SATA_NUM_PMPORTS(sata_hba_inst, cport);
18408 npmport ++) {
18409 pmportinfo = SATA_PMPORT_INFO(sata_hba_inst, cport, npmport);
18410 mutex_enter(&pmportinfo->pmport_mutex);
18411 event_flags = pmportinfo->pmport_event_flags;
18412 mutex_exit(&pmportinfo->pmport_mutex);
18413 saddr = &pmportinfo->pmport_addr;
18414
18415 if ((event_flags &
18416 (SATA_EVNT_PORT_EVENTS | SATA_EVNT_DRIVE_EVENTS)) != 0) {
18417 /*
18418 * Got port multiplier port event.
18419 * We need some hierarchy of event processing as they
18420 * are affecting each other:
18421 * 1. device detached/attached
18422 * 2. link events - link events may trigger device
18423 * detached or device attached events in some
18424 * circumstances.
18425 */
18426 if (event_flags & SATA_EVNT_DEVICE_DETACHED) {
18427 sata_process_pmdevice_detached(sata_hba_inst,
18428 saddr);
18429 }
18430 if (event_flags & SATA_EVNT_DEVICE_ATTACHED) {
18431 sata_process_pmdevice_attached(sata_hba_inst,
18432 saddr);
18433 }
18434 if (event_flags & SATA_EVNT_LINK_ESTABLISHED ||
18435 event_flags & SATA_EVNT_LINK_LOST) {
18436 sata_process_pmport_link_events(sata_hba_inst,
18437 saddr);
18438 }
18439 if (event_flags & SATA_EVNT_TARGET_NODE_CLEANUP) {
18440 sata_process_target_node_cleanup(
18441 sata_hba_inst, saddr);
18442 }
18443 }
18444
18445 /* Checking drive event(s). */
18446 mutex_enter(&pmportinfo->pmport_mutex);
18447 if (pmportinfo->pmport_dev_type != SATA_DTYPE_NONE &&
18448 pmportinfo->pmport_sata_drive != NULL) {
18449 event_flags = pmportinfo->pmport_sata_drive->
18450 satadrv_event_flags;
18451 if (event_flags & (SATA_EVNT_DEVICE_RESET |
18452 SATA_EVNT_INPROC_DEVICE_RESET)) {
18453
18454 /* Have device event */
18455 sata_process_pmdevice_reset(sata_hba_inst,
18456 saddr);
18457 }
18458 }
18459 mutex_exit(&pmportinfo->pmport_mutex);
18460
18461 /* Release PORT_BUSY flag */
18462 mutex_enter(&cportinfo->cport_mutex);
18463 cportinfo->cport_event_flags &= ~SATA_EVNT_LOCK_PORT_BUSY;
18464 mutex_exit(&cportinfo->cport_mutex);
18465 }
18466
18467 SATADBG2(SATA_DBG_EVENTS_CNTRL|SATA_DBG_PMULT, sata_hba_inst,
18468 "[DONE] pmult event(s) on cport %d of controller %d",
18469 cport, ddi_get_instance(SATA_DIP(sata_hba_inst)));
18470 }
18471
18472 /*
18473 * Process HBA power level change reported by HBA driver.
18474 * Not implemented at this time - event is ignored.
18475 */
18476 static void
sata_process_cntrl_pwr_level_change(sata_hba_inst_t * sata_hba_inst)18477 sata_process_cntrl_pwr_level_change(sata_hba_inst_t *sata_hba_inst)
18478 {
18479 SATADBG1(SATA_DBG_EVENTS_PROC, sata_hba_inst,
18480 "Processing controller power level change", NULL);
18481
18482 /* Ignoring it for now */
18483 mutex_enter(&sata_hba_inst->satahba_mutex);
18484 sata_hba_inst->satahba_event_flags &= ~SATA_EVNT_PWR_LEVEL_CHANGED;
18485 mutex_exit(&sata_hba_inst->satahba_mutex);
18486 }
18487
18488 /*
18489 * Process port power level change reported by HBA driver.
18490 * Not implemented at this time - event is ignored.
18491 */
18492 static void
sata_process_port_pwr_change(sata_hba_inst_t * sata_hba_inst,sata_address_t * saddr)18493 sata_process_port_pwr_change(sata_hba_inst_t *sata_hba_inst,
18494 sata_address_t *saddr)
18495 {
18496 sata_cport_info_t *cportinfo;
18497
18498 SATADBG1(SATA_DBG_EVENTS_PROC, sata_hba_inst,
18499 "Processing port power level change", NULL);
18500
18501 cportinfo = SATA_CPORT_INFO(sata_hba_inst, saddr->cport);
18502 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->cport_mutex);
18503 /* Reset event flag */
18504 cportinfo->cport_event_flags &= ~SATA_EVNT_PWR_LEVEL_CHANGED;
18505 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->cport_mutex);
18506 }
18507
18508 /*
18509 * Process port failure reported by HBA driver.
18510 * cports support only - no pmports.
18511 */
18512 static void
sata_process_port_failed_event(sata_hba_inst_t * sata_hba_inst,sata_address_t * saddr)18513 sata_process_port_failed_event(sata_hba_inst_t *sata_hba_inst,
18514 sata_address_t *saddr)
18515 {
18516 sata_cport_info_t *cportinfo;
18517
18518 cportinfo = SATA_CPORT_INFO(sata_hba_inst, saddr->cport);
18519 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->cport_mutex);
18520 /* Reset event flag first */
18521 cportinfo->cport_event_flags &= ~SATA_EVNT_PORT_FAILED;
18522 /* If the port is in SHUTDOWN or FAILED state, ignore this event. */
18523 if ((cportinfo->cport_state &
18524 (SATA_PSTATE_SHUTDOWN | SATA_PSTATE_FAILED)) == 0) {
18525 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->
18526 cport_mutex);
18527 return;
18528 }
18529 /* Fail the port */
18530 cportinfo->cport_state = SATA_PSTATE_FAILED;
18531 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->cport_mutex);
18532 sata_log(sata_hba_inst, CE_WARN, "SATA port %d failed", saddr->cport);
18533 }
18534
18535 /*
18536 * Device Reset Event processing.
18537 * The sequence is managed by 3 stage flags:
18538 * - reset event reported,
18539 * - reset event being processed,
18540 * - request to clear device reset state.
18541 *
18542 * NOTE: This function has to be entered with cport mutex held. It exits with
18543 * mutex held as well, but can release mutex during the processing.
18544 */
18545 static void
sata_process_device_reset(sata_hba_inst_t * sata_hba_inst,sata_address_t * saddr)18546 sata_process_device_reset(sata_hba_inst_t *sata_hba_inst,
18547 sata_address_t *saddr)
18548 {
18549 sata_drive_info_t old_sdinfo; /* local copy of the drive info */
18550 sata_drive_info_t *sdinfo;
18551 sata_cport_info_t *cportinfo;
18552 sata_device_t sata_device;
18553 int rval_probe, rval_set;
18554
18555 /* We only care about host sata cport for now */
18556 cportinfo = SATA_CPORT_INFO(sata_hba_inst, saddr->cport);
18557 sdinfo = SATA_CPORT_DRV_INFO(sata_hba_inst, saddr->cport);
18558 /*
18559 * If the port is in SHUTDOWN or FAILED state, or device is in FAILED
18560 * state, ignore reset event.
18561 */
18562 if (((cportinfo->cport_state &
18563 (SATA_PSTATE_SHUTDOWN | SATA_PSTATE_FAILED)) != 0) ||
18564 (sdinfo->satadrv_state & SATA_DSTATE_FAILED) != 0) {
18565 sdinfo->satadrv_event_flags &=
18566 ~(SATA_EVNT_DEVICE_RESET | SATA_EVNT_INPROC_DEVICE_RESET);
18567 return;
18568 }
18569
18570 if ((SATA_CPORT_DEV_TYPE(sata_hba_inst, saddr->cport) ==
18571 SATA_DTYPE_PMULT)) {
18572 /*
18573 * Should not happened: this is already handled in
18574 * sata_hba_event_notify()
18575 */
18576 mutex_exit(&cportinfo->cport_mutex);
18577 goto done;
18578 }
18579
18580 if ((SATA_CPORT_DEV_TYPE(sata_hba_inst, saddr->cport) &
18581 SATA_VALID_DEV_TYPE) == 0) {
18582 /*
18583 * This should not happen - coding error.
18584 * But we can recover, so do not panic, just clean up
18585 * and if in debug mode, log the message.
18586 */
18587 #ifdef SATA_DEBUG
18588 sata_log(sata_hba_inst, CE_WARN,
18589 "sata_process_device_reset: "
18590 "Invalid device type with sdinfo!", NULL);
18591 #endif
18592 sdinfo->satadrv_event_flags = 0;
18593 return;
18594 }
18595
18596 #ifdef SATA_DEBUG
18597 if ((sdinfo->satadrv_event_flags &
18598 (SATA_EVNT_DEVICE_RESET | SATA_EVNT_INPROC_DEVICE_RESET)) == 0) {
18599 /* Nothing to do */
18600 /* Something is weird - why we are processing dev reset? */
18601 SATADBG1(SATA_DBG_EVENTS_PROC, sata_hba_inst,
18602 "No device reset event!!!!", NULL);
18603
18604 return;
18605 }
18606 if ((sdinfo->satadrv_event_flags &
18607 (SATA_EVNT_DEVICE_RESET | SATA_EVNT_INPROC_DEVICE_RESET)) ==
18608 (SATA_EVNT_DEVICE_RESET | SATA_EVNT_INPROC_DEVICE_RESET)) {
18609 /* Something is weird - new device reset event */
18610 SATADBG1(SATA_DBG_EVENTS_PROC, sata_hba_inst,
18611 "Overlapping device reset events!", NULL);
18612 }
18613 #endif
18614 SATADBG1(SATA_DBG_EVENTS_PROC, sata_hba_inst,
18615 "Processing port %d device reset", saddr->cport);
18616
18617 /* Clear event flag */
18618 sdinfo->satadrv_event_flags &= ~SATA_EVNT_DEVICE_RESET;
18619
18620 /* It seems that we always need to check the port state first */
18621 sata_device.satadev_rev = SATA_DEVICE_REV;
18622 sata_device.satadev_addr = *saddr;
18623 /*
18624 * We have to exit mutex, because the HBA probe port function may
18625 * block on its own mutex.
18626 */
18627 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->cport_mutex);
18628 rval_probe = (*SATA_PROBE_PORT_FUNC(sata_hba_inst))
18629 (SATA_DIP(sata_hba_inst), &sata_device);
18630 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->cport_mutex);
18631 sata_update_port_info(sata_hba_inst, &sata_device);
18632 if (rval_probe != SATA_SUCCESS) {
18633 /* Something went wrong? Fail the port */
18634 cportinfo->cport_state = SATA_PSTATE_FAILED;
18635 sdinfo = SATA_CPORT_DRV_INFO(sata_hba_inst, saddr->cport);
18636 if (sdinfo != NULL)
18637 sdinfo->satadrv_event_flags = 0;
18638 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->
18639 cport_mutex);
18640 SATA_LOG_D((sata_hba_inst, CE_WARN,
18641 "SATA port %d probing failed",
18642 saddr->cport));
18643 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst,
18644 saddr->cport)->cport_mutex);
18645 return;
18646 }
18647 if ((sata_device.satadev_scr.sstatus &
18648 SATA_PORT_DEVLINK_UP_MASK) !=
18649 SATA_PORT_DEVLINK_UP ||
18650 sata_device.satadev_type == SATA_DTYPE_NONE) {
18651 /*
18652 * No device to process, anymore. Some other event processing
18653 * would or have already performed port info cleanup.
18654 * To be safe (HBA may need it), request clearing device
18655 * reset condition.
18656 */
18657 sdinfo = SATA_CPORT_DRV_INFO(sata_hba_inst, saddr->cport);
18658 if (sdinfo != NULL) {
18659 sdinfo->satadrv_event_flags &=
18660 ~SATA_EVNT_INPROC_DEVICE_RESET;
18661 sdinfo->satadrv_event_flags |=
18662 SATA_EVNT_CLEAR_DEVICE_RESET;
18663 }
18664 return;
18665 }
18666
18667 sdinfo = SATA_CPORT_DRV_INFO(sata_hba_inst, saddr->cport);
18668 if (sdinfo == NULL) {
18669 return;
18670 }
18671 if ((sdinfo->satadrv_event_flags &
18672 SATA_EVNT_INPROC_DEVICE_RESET) == 0) {
18673 /*
18674 * Start tracking time for device feature restoration and
18675 * identification. Save current time (lbolt value).
18676 */
18677 sdinfo->satadrv_reset_time = ddi_get_lbolt();
18678 }
18679 /* Mark device reset processing as active */
18680 sdinfo->satadrv_event_flags |= SATA_EVNT_INPROC_DEVICE_RESET;
18681
18682 old_sdinfo = *sdinfo; /* local copy of the drive info */
18683 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->cport_mutex);
18684
18685 rval_set = sata_set_drive_features(sata_hba_inst, &old_sdinfo, 1);
18686
18687 if (rval_set != SATA_SUCCESS) {
18688 /*
18689 * Restoring drive setting failed.
18690 * Probe the port first, to check if the port state has changed
18691 */
18692 sata_device.satadev_rev = SATA_DEVICE_REV;
18693 sata_device.satadev_addr = *saddr;
18694 sata_device.satadev_addr.qual = SATA_ADDR_CPORT;
18695 /* probe port */
18696 rval_probe = (*SATA_PROBE_PORT_FUNC(sata_hba_inst))
18697 (SATA_DIP(sata_hba_inst), &sata_device);
18698 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->
18699 cport_mutex);
18700 if (rval_probe == SATA_SUCCESS &&
18701 (sata_device.satadev_state &
18702 (SATA_PSTATE_SHUTDOWN | SATA_PSTATE_FAILED)) == 0 &&
18703 (sata_device.satadev_scr.sstatus &
18704 SATA_PORT_DEVLINK_UP_MASK) == SATA_PORT_DEVLINK_UP &&
18705 sata_device.satadev_type != SATA_DTYPE_NONE) {
18706 /*
18707 * We may retry this a bit later - in-process reset
18708 * condition should be already set.
18709 * Track retry time for device identification.
18710 */
18711 if ((cportinfo->cport_dev_type &
18712 SATA_VALID_DEV_TYPE) != 0 &&
18713 SATA_CPORTINFO_DRV_INFO(cportinfo) != NULL &&
18714 sdinfo->satadrv_reset_time != 0) {
18715 clock_t cur_time = ddi_get_lbolt();
18716 /*
18717 * If the retry time limit was not
18718 * exceeded, retry.
18719 */
18720 if ((cur_time - sdinfo->satadrv_reset_time) <
18721 drv_usectohz(SATA_DEV_REPROBE_TIMEOUT)) {
18722 mutex_enter(
18723 &sata_hba_inst->satahba_mutex);
18724 sata_hba_inst->satahba_event_flags |=
18725 SATA_EVNT_MAIN;
18726 mutex_exit(
18727 &sata_hba_inst->satahba_mutex);
18728 mutex_enter(&sata_mutex);
18729 sata_event_pending |= SATA_EVNT_MAIN;
18730 mutex_exit(&sata_mutex);
18731 return;
18732 }
18733 if (rval_set == SATA_RETRY) {
18734 /*
18735 * Setting drive features failed, but
18736 * the drive is still accessible,
18737 * so emit a warning message before
18738 * return.
18739 */
18740 mutex_exit(&SATA_CPORT_INFO(
18741 sata_hba_inst,
18742 saddr->cport)->cport_mutex);
18743 goto done;
18744 }
18745 }
18746 /* Fail the drive */
18747 sdinfo->satadrv_state = SATA_DSTATE_FAILED;
18748
18749 sata_log(sata_hba_inst, CE_WARN,
18750 "SATA device at port %d - device failed",
18751 saddr->cport);
18752
18753 DTRACE_PROBE(port_failed_f);
18754 }
18755 /*
18756 * No point of retrying - device failed or some other event
18757 * processing or already did or will do port info cleanup.
18758 * To be safe (HBA may need it),
18759 * request clearing device reset condition.
18760 */
18761 sdinfo->satadrv_event_flags |= SATA_EVNT_CLEAR_DEVICE_RESET;
18762 sdinfo->satadrv_event_flags &= ~SATA_EVNT_INPROC_DEVICE_RESET;
18763 sdinfo->satadrv_reset_time = 0;
18764 return;
18765 }
18766 done:
18767 /*
18768 * If setting of drive features failed, but the drive is still
18769 * accessible, emit a warning message.
18770 */
18771 if (rval_set == SATA_RETRY) {
18772 sata_log(sata_hba_inst, CE_WARN,
18773 "SATA device at port %d - desired setting could not be "
18774 "restored after reset. Device may not operate as expected.",
18775 saddr->cport);
18776 }
18777 /*
18778 * Raise the flag indicating that the next sata command could
18779 * be sent with SATA_CLEAR_DEV_RESET_STATE flag, if no new device
18780 * reset is reported.
18781 */
18782 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->cport_mutex);
18783 if (SATA_CPORTINFO_DRV_INFO(cportinfo) != NULL) {
18784 sdinfo->satadrv_reset_time = 0;
18785 if ((cportinfo->cport_dev_type & SATA_VALID_DEV_TYPE) != 0) {
18786 sdinfo = SATA_CPORTINFO_DRV_INFO(cportinfo);
18787 sdinfo->satadrv_event_flags &=
18788 ~SATA_EVNT_INPROC_DEVICE_RESET;
18789 sdinfo->satadrv_event_flags |=
18790 SATA_EVNT_CLEAR_DEVICE_RESET;
18791 }
18792 }
18793 }
18794
18795
18796 /*
18797 * Port Multiplier Port Device Reset Event processing.
18798 *
18799 * NOTE: This function has to be entered with pmport mutex held. It exits with
18800 * mutex held as well, but can release mutex during the processing.
18801 */
18802 static void
sata_process_pmdevice_reset(sata_hba_inst_t * sata_hba_inst,sata_address_t * saddr)18803 sata_process_pmdevice_reset(sata_hba_inst_t *sata_hba_inst,
18804 sata_address_t *saddr)
18805 {
18806 sata_drive_info_t old_sdinfo; /* local copy of the drive info */
18807 sata_drive_info_t *sdinfo = NULL;
18808 sata_cport_info_t *cportinfo = NULL;
18809 sata_pmport_info_t *pmportinfo = NULL;
18810 sata_pmult_info_t *pminfo = NULL;
18811 sata_device_t sata_device;
18812 uint8_t cport = saddr->cport;
18813 uint8_t pmport = saddr->pmport;
18814 int rval;
18815
18816 SATADBG2(SATA_DBG_EVENTS_PROC, sata_hba_inst,
18817 "Processing drive reset at port %d:%d", cport, pmport);
18818
18819 cportinfo = SATA_CPORT_INFO(sata_hba_inst, cport);
18820 pmportinfo = SATA_PMPORT_INFO(sata_hba_inst, cport, pmport);
18821 sdinfo = SATA_PMPORT_DRV_INFO(sata_hba_inst, cport, pmport);
18822
18823 /*
18824 * If the port is in SHUTDOWN or FAILED state, or device is in FAILED
18825 * state, ignore reset event.
18826 */
18827 if (((cportinfo->cport_state &
18828 (SATA_PSTATE_SHUTDOWN | SATA_PSTATE_FAILED)) != 0) ||
18829 (sdinfo->satadrv_state & SATA_DSTATE_FAILED) != 0) {
18830 sdinfo->satadrv_event_flags &=
18831 ~(SATA_EVNT_DEVICE_RESET | SATA_EVNT_INPROC_DEVICE_RESET);
18832 return;
18833 }
18834
18835 if ((pmportinfo->pmport_dev_type & SATA_VALID_DEV_TYPE) == 0) {
18836 /*
18837 * This should not happen - coding error.
18838 * But we can recover, so do not panic, just clean up
18839 * and if in debug mode, log the message.
18840 */
18841 #ifdef SATA_DEBUG
18842 sata_log(sata_hba_inst, CE_WARN,
18843 "sata_process_pmdevice_reset: "
18844 "Invalid device type with sdinfo!", NULL);
18845 #endif
18846 sdinfo->satadrv_event_flags = 0;
18847 return;
18848 }
18849
18850 #ifdef SATA_DEBUG
18851 if ((sdinfo->satadrv_event_flags &
18852 (SATA_EVNT_DEVICE_RESET | SATA_EVNT_INPROC_DEVICE_RESET)) == 0) {
18853 /* Nothing to do */
18854 /* Something is weird - why we are processing dev reset? */
18855 SATADBG1(SATA_DBG_EVENTS_PROC, sata_hba_inst,
18856 "No device reset event!!!!", NULL);
18857
18858 return;
18859 }
18860 if ((sdinfo->satadrv_event_flags &
18861 (SATA_EVNT_DEVICE_RESET | SATA_EVNT_INPROC_DEVICE_RESET)) ==
18862 (SATA_EVNT_DEVICE_RESET | SATA_EVNT_INPROC_DEVICE_RESET)) {
18863 /* Something is weird - new device reset event */
18864 SATADBG1(SATA_DBG_EVENTS_PROC, sata_hba_inst,
18865 "Overlapping device reset events!", NULL);
18866 }
18867 #endif
18868 SATADBG2(SATA_DBG_EVENTS_PROC, sata_hba_inst,
18869 "Processing port %d:%d device reset", cport, pmport);
18870
18871 /* Clear event flag */
18872 sdinfo->satadrv_event_flags &= ~SATA_EVNT_DEVICE_RESET;
18873
18874 /* It seems that we always need to check the port state first */
18875 sata_device.satadev_rev = SATA_DEVICE_REV;
18876 sata_device.satadev_addr = *saddr;
18877 /*
18878 * We have to exit mutex, because the HBA probe port function may
18879 * block on its own mutex.
18880 */
18881 mutex_exit(&pmportinfo->pmport_mutex);
18882 rval = (*SATA_PROBE_PORT_FUNC(sata_hba_inst))
18883 (SATA_DIP(sata_hba_inst), &sata_device);
18884 mutex_enter(&pmportinfo->pmport_mutex);
18885
18886 sata_update_pmport_info(sata_hba_inst, &sata_device);
18887 if (rval != SATA_SUCCESS) {
18888 /* Something went wrong? Fail the port */
18889 pmportinfo->pmport_state = SATA_PSTATE_FAILED;
18890 sdinfo = SATA_PMPORT_DRV_INFO(sata_hba_inst, saddr->cport,
18891 saddr->pmport);
18892 if (sdinfo != NULL)
18893 sdinfo->satadrv_event_flags = 0;
18894 mutex_exit(&pmportinfo->pmport_mutex);
18895 SATA_LOG_D((sata_hba_inst, CE_WARN,
18896 "SATA port %d:%d probing failed",
18897 saddr->cport, saddr->pmport));
18898 mutex_enter(&pmportinfo->pmport_mutex);
18899 return;
18900 }
18901 if ((sata_device.satadev_scr.sstatus &
18902 SATA_PORT_DEVLINK_UP_MASK) !=
18903 SATA_PORT_DEVLINK_UP ||
18904 sata_device.satadev_type == SATA_DTYPE_NONE) {
18905 /*
18906 * No device to process, anymore. Some other event processing
18907 * would or have already performed port info cleanup.
18908 * To be safe (HBA may need it), request clearing device
18909 * reset condition.
18910 */
18911 sdinfo = SATA_PMPORT_DRV_INFO(sata_hba_inst, saddr->cport,
18912 saddr->pmport);
18913 if (sdinfo != NULL) {
18914 sdinfo->satadrv_event_flags &=
18915 ~SATA_EVNT_INPROC_DEVICE_RESET;
18916 /* must clear flags on cport */
18917 pminfo = SATA_PMULT_INFO(sata_hba_inst,
18918 saddr->cport);
18919 pminfo->pmult_event_flags |=
18920 SATA_EVNT_CLEAR_DEVICE_RESET;
18921 }
18922 return;
18923 }
18924
18925 sdinfo = SATA_PMPORT_DRV_INFO(sata_hba_inst, saddr->cport,
18926 saddr->pmport);
18927 if (sdinfo == NULL) {
18928 return;
18929 }
18930 if ((sdinfo->satadrv_event_flags &
18931 SATA_EVNT_INPROC_DEVICE_RESET) == 0) {
18932 /*
18933 * Start tracking time for device feature restoration and
18934 * identification. Save current time (lbolt value).
18935 */
18936 sdinfo->satadrv_reset_time = ddi_get_lbolt();
18937 }
18938 /* Mark device reset processing as active */
18939 sdinfo->satadrv_event_flags |= SATA_EVNT_INPROC_DEVICE_RESET;
18940
18941 old_sdinfo = *sdinfo; /* local copy of the drive info */
18942 mutex_exit(&pmportinfo->pmport_mutex);
18943
18944 if (sata_set_drive_features(sata_hba_inst, &old_sdinfo, 1) ==
18945 SATA_FAILURE) {
18946 /*
18947 * Restoring drive setting failed.
18948 * Probe the port first, to check if the port state has changed
18949 */
18950 sata_device.satadev_rev = SATA_DEVICE_REV;
18951 sata_device.satadev_addr = *saddr;
18952 sata_device.satadev_addr.qual = SATA_ADDR_PMPORT;
18953
18954 /* probe port */
18955 rval = (*SATA_PROBE_PORT_FUNC(sata_hba_inst))
18956 (SATA_DIP(sata_hba_inst), &sata_device);
18957 mutex_enter(&pmportinfo->pmport_mutex);
18958 if (rval == SATA_SUCCESS &&
18959 (sata_device.satadev_state &
18960 (SATA_PSTATE_SHUTDOWN | SATA_PSTATE_FAILED)) == 0 &&
18961 (sata_device.satadev_scr.sstatus &
18962 SATA_PORT_DEVLINK_UP_MASK) == SATA_PORT_DEVLINK_UP &&
18963 sata_device.satadev_type != SATA_DTYPE_NONE) {
18964 /*
18965 * We may retry this a bit later - in-process reset
18966 * condition should be already set.
18967 * Track retry time for device identification.
18968 */
18969 if ((pmportinfo->pmport_dev_type &
18970 SATA_VALID_DEV_TYPE) != 0 &&
18971 SATA_PMPORTINFO_DRV_INFO(pmportinfo) != NULL &&
18972 sdinfo->satadrv_reset_time != 0) {
18973 clock_t cur_time = ddi_get_lbolt();
18974 /*
18975 * If the retry time limit was not
18976 * exceeded, retry.
18977 */
18978 if ((cur_time - sdinfo->satadrv_reset_time) <
18979 drv_usectohz(SATA_DEV_REPROBE_TIMEOUT)) {
18980 mutex_enter(
18981 &sata_hba_inst->satahba_mutex);
18982 sata_hba_inst->satahba_event_flags |=
18983 SATA_EVNT_MAIN;
18984 mutex_exit(
18985 &sata_hba_inst->satahba_mutex);
18986 mutex_enter(&sata_mutex);
18987 sata_event_pending |= SATA_EVNT_MAIN;
18988 mutex_exit(&sata_mutex);
18989 return;
18990 }
18991 }
18992 /* Fail the drive */
18993 sdinfo->satadrv_state = SATA_DSTATE_FAILED;
18994
18995 sata_log(sata_hba_inst, CE_WARN,
18996 "SATA device at port %d:%d - device failed",
18997 saddr->cport, saddr->pmport);
18998 } else {
18999 /*
19000 * No point of retrying - some other event processing
19001 * would or already did port info cleanup.
19002 * To be safe (HBA may need it),
19003 * request clearing device reset condition.
19004 */
19005 sdinfo->satadrv_event_flags |=
19006 SATA_EVNT_CLEAR_DEVICE_RESET;
19007 }
19008 sdinfo->satadrv_event_flags &= ~SATA_EVNT_INPROC_DEVICE_RESET;
19009 sdinfo->satadrv_reset_time = 0;
19010 return;
19011 }
19012 /*
19013 * Raise the flag indicating that the next sata command could
19014 * be sent with SATA_CLEAR_DEV_RESET_STATE flag, if no new device
19015 * reset is reported.
19016 */
19017 mutex_enter(&pmportinfo->pmport_mutex);
19018 if (SATA_PMPORTINFO_DRV_INFO(pmportinfo) != NULL) {
19019 sdinfo->satadrv_reset_time = 0;
19020 if (pmportinfo->pmport_dev_type & SATA_VALID_DEV_TYPE) {
19021 sdinfo = SATA_PMPORTINFO_DRV_INFO(pmportinfo);
19022 sdinfo->satadrv_event_flags &=
19023 ~SATA_EVNT_INPROC_DEVICE_RESET;
19024 /* must clear flags on cport */
19025 pminfo = SATA_PMULT_INFO(sata_hba_inst,
19026 saddr->cport);
19027 pminfo->pmult_event_flags |=
19028 SATA_EVNT_CLEAR_DEVICE_RESET;
19029 }
19030 }
19031 }
19032
19033 /*
19034 * Port Link Events processing.
19035 * Every link established event may involve device reset (due to
19036 * COMRESET signal, equivalent of the hard reset) so arbitrarily
19037 * set device reset event for an attached device (if any).
19038 * If the port is in SHUTDOWN or FAILED state, ignore link events.
19039 *
19040 * The link established event processing varies, depending on the state
19041 * of the target node, HBA hotplugging capabilities, state of the port.
19042 * If the link is not active, the link established event is ignored.
19043 * If HBA cannot detect device attachment and there is no target node,
19044 * the link established event triggers device attach event processing.
19045 * Else, link established event triggers device reset event processing.
19046 *
19047 * The link lost event processing varies, depending on a HBA hotplugging
19048 * capability and the state of the port (link active or not active).
19049 * If the link is active, the lost link event is ignored.
19050 * If HBA cannot detect device removal, the lost link event triggers
19051 * device detached event processing after link lost timeout.
19052 * Else, the event is ignored.
19053 *
19054 * NOTE: Port multiplier ports events are handled by
19055 * sata_process_pmport_link_events();
19056 */
19057 static void
sata_process_port_link_events(sata_hba_inst_t * sata_hba_inst,sata_address_t * saddr)19058 sata_process_port_link_events(sata_hba_inst_t *sata_hba_inst,
19059 sata_address_t *saddr)
19060 {
19061 sata_device_t sata_device;
19062 sata_cport_info_t *cportinfo;
19063 sata_drive_info_t *sdinfo;
19064 uint32_t event_flags;
19065 int rval;
19066
19067 SATADBG1(SATA_DBG_EVENTS_PROC, sata_hba_inst,
19068 "Processing port %d link event(s)", saddr->cport);
19069
19070 cportinfo = SATA_CPORT_INFO(sata_hba_inst, saddr->cport);
19071 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->cport_mutex);
19072 event_flags = cportinfo->cport_event_flags;
19073
19074 /* Reset event flags first */
19075 cportinfo->cport_event_flags &=
19076 ~(SATA_EVNT_LINK_ESTABLISHED | SATA_EVNT_LINK_LOST);
19077
19078 /* If the port is in SHUTDOWN or FAILED state, ignore link events. */
19079 if ((cportinfo->cport_state &
19080 (SATA_PSTATE_SHUTDOWN | SATA_PSTATE_FAILED)) != 0) {
19081 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->
19082 cport_mutex);
19083 return;
19084 }
19085
19086 /*
19087 * For the sanity sake get current port state.
19088 * Set device address only. Other sata_device fields should be
19089 * set by HBA driver.
19090 */
19091 sata_device.satadev_rev = SATA_DEVICE_REV;
19092 sata_device.satadev_addr = *saddr;
19093 /*
19094 * We have to exit mutex, because the HBA probe port function may
19095 * block on its own mutex.
19096 */
19097 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->cport_mutex);
19098 rval = (*SATA_PROBE_PORT_FUNC(sata_hba_inst))
19099 (SATA_DIP(sata_hba_inst), &sata_device);
19100 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->cport_mutex);
19101 sata_update_port_info(sata_hba_inst, &sata_device);
19102 if (rval != SATA_SUCCESS) {
19103 /* Something went wrong? Fail the port */
19104 cportinfo->cport_state = SATA_PSTATE_FAILED;
19105 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->
19106 cport_mutex);
19107 SATA_LOG_D((sata_hba_inst, CE_WARN,
19108 "SATA port %d probing failed",
19109 saddr->cport));
19110 /*
19111 * We may want to release device info structure, but
19112 * it is not necessary.
19113 */
19114 return;
19115 } else {
19116 /* port probed successfully */
19117 cportinfo->cport_state |= SATA_STATE_PROBED | SATA_STATE_READY;
19118 }
19119 if (event_flags & SATA_EVNT_LINK_ESTABLISHED) {
19120
19121 if ((sata_device.satadev_scr.sstatus &
19122 SATA_PORT_DEVLINK_UP_MASK) != SATA_PORT_DEVLINK_UP) {
19123 /* Ignore event */
19124 SATADBG1(SATA_DBG_EVENTS_PROC, sata_hba_inst,
19125 "Ignoring port %d link established event - "
19126 "link down",
19127 saddr->cport);
19128 goto linklost;
19129 }
19130
19131 SATADBG1(SATA_DBG_EVENTS_PROC, sata_hba_inst,
19132 "Processing port %d link established event",
19133 saddr->cport);
19134
19135 /*
19136 * For the sanity sake check if a device is attached - check
19137 * return state of a port probing.
19138 */
19139 if (sata_device.satadev_type != SATA_DTYPE_NONE) {
19140 /*
19141 * HBA port probe indicated that there is a device
19142 * attached. Check if the framework had device info
19143 * structure attached for this device.
19144 */
19145 if (cportinfo->cport_dev_type != SATA_DTYPE_NONE) {
19146 ASSERT(SATA_CPORTINFO_DRV_INFO(cportinfo) !=
19147 NULL);
19148
19149 sdinfo = SATA_CPORTINFO_DRV_INFO(cportinfo);
19150 if ((sdinfo->satadrv_type &
19151 SATA_VALID_DEV_TYPE) != 0) {
19152 /*
19153 * Dev info structure is present.
19154 * If dev_type is set to known type in
19155 * the framework's drive info struct
19156 * then the device existed before and
19157 * the link was probably lost
19158 * momentarily - in such case
19159 * we may want to check device
19160 * identity.
19161 * Identity check is not supported now.
19162 *
19163 * Link established event
19164 * triggers device reset event.
19165 */
19166 (SATA_CPORTINFO_DRV_INFO(cportinfo))->
19167 satadrv_event_flags |=
19168 SATA_EVNT_DEVICE_RESET;
19169 }
19170 } else if (cportinfo->cport_dev_type ==
19171 SATA_DTYPE_NONE) {
19172 /*
19173 * We got new device attached! If HBA does not
19174 * generate device attached events, trigger it
19175 * here.
19176 */
19177 if (!(SATA_FEATURES(sata_hba_inst) &
19178 SATA_CTLF_HOTPLUG)) {
19179 cportinfo->cport_event_flags |=
19180 SATA_EVNT_DEVICE_ATTACHED;
19181 }
19182 }
19183 /* Reset link lost timeout */
19184 cportinfo->cport_link_lost_time = 0;
19185 }
19186 }
19187 linklost:
19188 if (event_flags & SATA_EVNT_LINK_LOST) {
19189 if ((sata_device.satadev_scr.sstatus &
19190 SATA_PORT_DEVLINK_UP_MASK) == SATA_PORT_DEVLINK_UP) {
19191 /* Ignore event */
19192 SATADBG1(SATA_DBG_EVENTS_PROC, sata_hba_inst,
19193 "Ignoring port %d link lost event - link is up",
19194 saddr->cport);
19195 goto done;
19196 }
19197 #ifdef SATA_DEBUG
19198 if (cportinfo->cport_link_lost_time == 0) {
19199 SATADBG1(SATA_DBG_EVENTS_PROC, sata_hba_inst,
19200 "Processing port %d link lost event",
19201 saddr->cport);
19202 }
19203 #endif
19204 /*
19205 * When HBA cannot generate device attached/detached events,
19206 * we need to track link lost time and eventually generate
19207 * device detach event.
19208 */
19209 if (!(SATA_FEATURES(sata_hba_inst) & SATA_CTLF_HOTPLUG)) {
19210 /* We are tracking link lost time */
19211 if (cportinfo->cport_link_lost_time == 0) {
19212 /* save current time (lbolt value) */
19213 cportinfo->cport_link_lost_time =
19214 ddi_get_lbolt();
19215 /* just keep link lost event */
19216 cportinfo->cport_event_flags |=
19217 SATA_EVNT_LINK_LOST;
19218 } else {
19219 clock_t cur_time = ddi_get_lbolt();
19220 if ((cur_time -
19221 cportinfo->cport_link_lost_time) >=
19222 drv_usectohz(
19223 SATA_EVNT_LINK_LOST_TIMEOUT)) {
19224 /* trigger device detach event */
19225 cportinfo->cport_event_flags |=
19226 SATA_EVNT_DEVICE_DETACHED;
19227 cportinfo->cport_link_lost_time = 0;
19228 SATADBG1(SATA_DBG_EVENTS,
19229 sata_hba_inst,
19230 "Triggering port %d "
19231 "device detached event",
19232 saddr->cport);
19233 } else {
19234 /* keep link lost event */
19235 cportinfo->cport_event_flags |=
19236 SATA_EVNT_LINK_LOST;
19237 }
19238 }
19239 }
19240 /*
19241 * We could change port state to disable/delay access to
19242 * the attached device until the link is recovered.
19243 */
19244 }
19245 done:
19246 event_flags = cportinfo->cport_event_flags;
19247 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->cport_mutex);
19248 if (event_flags != 0) {
19249 mutex_enter(&sata_hba_inst->satahba_mutex);
19250 sata_hba_inst->satahba_event_flags |= SATA_EVNT_MAIN;
19251 mutex_exit(&sata_hba_inst->satahba_mutex);
19252 mutex_enter(&sata_mutex);
19253 sata_event_pending |= SATA_EVNT_MAIN;
19254 mutex_exit(&sata_mutex);
19255 }
19256 }
19257
19258 /*
19259 * Port Multiplier Port Link Events processing.
19260 */
19261 static void
sata_process_pmport_link_events(sata_hba_inst_t * sata_hba_inst,sata_address_t * saddr)19262 sata_process_pmport_link_events(sata_hba_inst_t *sata_hba_inst,
19263 sata_address_t *saddr)
19264 {
19265 sata_device_t sata_device;
19266 sata_pmport_info_t *pmportinfo = NULL;
19267 sata_drive_info_t *sdinfo = NULL;
19268 uint32_t event_flags;
19269 uint8_t cport = saddr->cport;
19270 uint8_t pmport = saddr->pmport;
19271 int rval;
19272
19273 SATADBG2(SATA_DBG_EVENTS_PROC, sata_hba_inst,
19274 "Processing port %d:%d link event(s)",
19275 cport, pmport);
19276
19277 pmportinfo = SATA_PMPORT_INFO(sata_hba_inst, cport, pmport);
19278 mutex_enter(&pmportinfo->pmport_mutex);
19279 event_flags = pmportinfo->pmport_event_flags;
19280
19281 /* Reset event flags first */
19282 pmportinfo->pmport_event_flags &=
19283 ~(SATA_EVNT_LINK_ESTABLISHED | SATA_EVNT_LINK_LOST);
19284
19285 /* If the port is in SHUTDOWN or FAILED state, ignore link events. */
19286 if ((pmportinfo->pmport_state &
19287 (SATA_PSTATE_SHUTDOWN | SATA_PSTATE_FAILED)) != 0) {
19288 mutex_exit(&pmportinfo->pmport_mutex);
19289 return;
19290 }
19291
19292 /*
19293 * For the sanity sake get current port state.
19294 * Set device address only. Other sata_device fields should be
19295 * set by HBA driver.
19296 */
19297 sata_device.satadev_rev = SATA_DEVICE_REV;
19298 sata_device.satadev_addr = *saddr;
19299 /*
19300 * We have to exit mutex, because the HBA probe port function may
19301 * block on its own mutex.
19302 */
19303 mutex_exit(&SATA_PMPORT_MUTEX(sata_hba_inst, saddr->cport,
19304 saddr->pmport));
19305 rval = (*SATA_PROBE_PORT_FUNC(sata_hba_inst))
19306 (SATA_DIP(sata_hba_inst), &sata_device);
19307 mutex_enter(&SATA_PMPORT_MUTEX(sata_hba_inst, saddr->cport,
19308 saddr->pmport));
19309 sata_update_pmport_info(sata_hba_inst, &sata_device);
19310 if (rval != SATA_SUCCESS) {
19311 /* Something went wrong? Fail the port */
19312 pmportinfo->pmport_state = SATA_PSTATE_FAILED;
19313 mutex_exit(&SATA_PMPORT_MUTEX(sata_hba_inst, saddr->cport,
19314 saddr->pmport));
19315 SATA_LOG_D((sata_hba_inst, CE_WARN,
19316 "SATA port %d:%d probing failed",
19317 saddr->cport, saddr->pmport));
19318 /*
19319 * We may want to release device info structure, but
19320 * it is not necessary.
19321 */
19322 return;
19323 } else {
19324 /* port probed successfully */
19325 pmportinfo->pmport_state |=
19326 SATA_STATE_PROBED | SATA_STATE_READY;
19327 }
19328 mutex_exit(&SATA_PMPORT_MUTEX(sata_hba_inst,
19329 saddr->cport, saddr->pmport));
19330 mutex_enter(&SATA_PMPORT_MUTEX(sata_hba_inst,
19331 saddr->cport, saddr->pmport));
19332 if (event_flags & SATA_EVNT_LINK_ESTABLISHED) {
19333
19334 if ((sata_device.satadev_scr.sstatus &
19335 SATA_PORT_DEVLINK_UP_MASK) != SATA_PORT_DEVLINK_UP) {
19336 /* Ignore event */
19337 SATADBG2(SATA_DBG_EVENTS_PROC, sata_hba_inst,
19338 "Ignoring port %d:%d link established event - "
19339 "link down",
19340 saddr->cport, saddr->pmport);
19341 goto linklost;
19342 }
19343
19344 SATADBG2(SATA_DBG_EVENTS_PROC, sata_hba_inst,
19345 "Processing port %d:%d link established event",
19346 cport, pmport);
19347
19348 /*
19349 * For the sanity sake check if a device is attached - check
19350 * return state of a port probing.
19351 */
19352 if (sata_device.satadev_type != SATA_DTYPE_NONE &&
19353 sata_device.satadev_type != SATA_DTYPE_PMULT) {
19354 /*
19355 * HBA port probe indicated that there is a device
19356 * attached. Check if the framework had device info
19357 * structure attached for this device.
19358 */
19359 if (pmportinfo->pmport_dev_type != SATA_DTYPE_NONE) {
19360 ASSERT(SATA_PMPORTINFO_DRV_INFO(pmportinfo) !=
19361 NULL);
19362
19363 sdinfo = SATA_PMPORTINFO_DRV_INFO(pmportinfo);
19364 if ((sdinfo->satadrv_type &
19365 SATA_VALID_DEV_TYPE) != 0) {
19366 /*
19367 * Dev info structure is present.
19368 * If dev_type is set to known type in
19369 * the framework's drive info struct
19370 * then the device existed before and
19371 * the link was probably lost
19372 * momentarily - in such case
19373 * we may want to check device
19374 * identity.
19375 * Identity check is not supported now.
19376 *
19377 * Link established event
19378 * triggers device reset event.
19379 */
19380 (SATA_PMPORTINFO_DRV_INFO(pmportinfo))->
19381 satadrv_event_flags |=
19382 SATA_EVNT_DEVICE_RESET;
19383 }
19384 } else if (pmportinfo->pmport_dev_type ==
19385 SATA_DTYPE_NONE) {
19386 /*
19387 * We got new device attached! If HBA does not
19388 * generate device attached events, trigger it
19389 * here.
19390 */
19391 if (!(SATA_FEATURES(sata_hba_inst) &
19392 SATA_CTLF_HOTPLUG)) {
19393 pmportinfo->pmport_event_flags |=
19394 SATA_EVNT_DEVICE_ATTACHED;
19395 }
19396 }
19397 /* Reset link lost timeout */
19398 pmportinfo->pmport_link_lost_time = 0;
19399 }
19400 }
19401 linklost:
19402 if (event_flags & SATA_EVNT_LINK_LOST) {
19403 #ifdef SATA_DEBUG
19404 if (pmportinfo->pmport_link_lost_time == 0) {
19405 SATADBG2(SATA_DBG_EVENTS_PROC, sata_hba_inst,
19406 "Processing port %d:%d link lost event",
19407 saddr->cport, saddr->pmport);
19408 }
19409 #endif
19410 if ((sata_device.satadev_scr.sstatus &
19411 SATA_PORT_DEVLINK_UP_MASK) == SATA_PORT_DEVLINK_UP) {
19412 /* Ignore event */
19413 SATADBG2(SATA_DBG_EVENTS_PROC, sata_hba_inst,
19414 "Ignoring port %d:%d link lost event - link is up",
19415 saddr->cport, saddr->pmport);
19416 goto done;
19417 }
19418 /*
19419 * When HBA cannot generate device attached/detached events,
19420 * we need to track link lost time and eventually generate
19421 * device detach event.
19422 */
19423 if (!(SATA_FEATURES(sata_hba_inst) & SATA_CTLF_HOTPLUG)) {
19424 /* We are tracking link lost time */
19425 if (pmportinfo->pmport_link_lost_time == 0) {
19426 /* save current time (lbolt value) */
19427 pmportinfo->pmport_link_lost_time =
19428 ddi_get_lbolt();
19429 /* just keep link lost event */
19430 pmportinfo->pmport_event_flags |=
19431 SATA_EVNT_LINK_LOST;
19432 } else {
19433 clock_t cur_time = ddi_get_lbolt();
19434 if ((cur_time -
19435 pmportinfo->pmport_link_lost_time) >=
19436 drv_usectohz(
19437 SATA_EVNT_LINK_LOST_TIMEOUT)) {
19438 /* trigger device detach event */
19439 pmportinfo->pmport_event_flags |=
19440 SATA_EVNT_DEVICE_DETACHED;
19441 pmportinfo->pmport_link_lost_time = 0;
19442 SATADBG2(SATA_DBG_EVENTS,
19443 sata_hba_inst,
19444 "Triggering port %d:%d "
19445 "device detached event",
19446 saddr->cport, saddr->pmport);
19447 } else {
19448 /* keep link lost event */
19449 pmportinfo->pmport_event_flags |=
19450 SATA_EVNT_LINK_LOST;
19451 }
19452 }
19453 }
19454 /*
19455 * We could change port state to disable/delay access to
19456 * the attached device until the link is recovered.
19457 */
19458 }
19459 done:
19460 event_flags = pmportinfo->pmport_event_flags;
19461 mutex_exit(&SATA_PMPORT_MUTEX(sata_hba_inst, saddr->cport,
19462 saddr->pmport));
19463 if (event_flags != 0) {
19464 mutex_enter(&sata_hba_inst->satahba_mutex);
19465 sata_hba_inst->satahba_event_flags |= SATA_EVNT_MAIN;
19466 mutex_exit(&sata_hba_inst->satahba_mutex);
19467 mutex_enter(&sata_mutex);
19468 sata_event_pending |= SATA_EVNT_MAIN;
19469 mutex_exit(&sata_mutex);
19470 }
19471 }
19472
19473 /*
19474 * Device Detached Event processing.
19475 * Port is probed to find if a device is really gone. If so,
19476 * the device info structure is detached from the SATA port info structure
19477 * and released.
19478 * Port status is updated.
19479 *
19480 * NOTE: Port multiplier ports events are handled by
19481 * sata_process_pmdevice_detached()
19482 */
19483 static void
sata_process_device_detached(sata_hba_inst_t * sata_hba_inst,sata_address_t * saddr)19484 sata_process_device_detached(sata_hba_inst_t *sata_hba_inst,
19485 sata_address_t *saddr)
19486 {
19487 sata_cport_info_t *cportinfo;
19488 sata_pmport_info_t *pmportinfo;
19489 sata_drive_info_t *sdevinfo;
19490 sata_device_t sata_device;
19491 sata_address_t pmport_addr;
19492 char name[16];
19493 uint8_t cport = saddr->cport;
19494 int npmport;
19495 int rval;
19496
19497 SATADBG1(SATA_DBG_EVENTS_PROC, sata_hba_inst,
19498 "Processing port %d device detached", saddr->cport);
19499
19500 cportinfo = SATA_CPORT_INFO(sata_hba_inst, saddr->cport);
19501 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->cport_mutex);
19502 /* Clear event flag */
19503 cportinfo->cport_event_flags &= ~SATA_EVNT_DEVICE_DETACHED;
19504
19505 /* If the port is in SHUTDOWN or FAILED state, ignore detach event. */
19506 if ((cportinfo->cport_state &
19507 (SATA_PSTATE_SHUTDOWN | SATA_PSTATE_FAILED)) != 0) {
19508 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->
19509 cport_mutex);
19510 return;
19511 }
19512 /* For sanity, re-probe the port */
19513 sata_device.satadev_rev = SATA_DEVICE_REV;
19514 sata_device.satadev_addr = *saddr;
19515
19516 /*
19517 * We have to exit mutex, because the HBA probe port function may
19518 * block on its own mutex.
19519 */
19520 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->cport_mutex);
19521 rval = (*SATA_PROBE_PORT_FUNC(sata_hba_inst))
19522 (SATA_DIP(sata_hba_inst), &sata_device);
19523 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->cport_mutex);
19524 sata_update_port_info(sata_hba_inst, &sata_device);
19525 if (rval != SATA_SUCCESS) {
19526 /* Something went wrong? Fail the port */
19527 cportinfo->cport_state = SATA_PSTATE_FAILED;
19528 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->
19529 cport_mutex);
19530 SATA_LOG_D((sata_hba_inst, CE_WARN,
19531 "SATA port %d probing failed",
19532 saddr->cport));
19533 /*
19534 * We may want to release device info structure, but
19535 * it is not necessary.
19536 */
19537 return;
19538 } else {
19539 /* port probed successfully */
19540 cportinfo->cport_state |= SATA_STATE_PROBED | SATA_STATE_READY;
19541 }
19542 /*
19543 * Check if a device is still attached. For sanity, check also
19544 * link status - if no link, there is no device.
19545 */
19546 if ((sata_device.satadev_scr.sstatus & SATA_PORT_DEVLINK_UP_MASK) ==
19547 SATA_PORT_DEVLINK_UP && sata_device.satadev_type !=
19548 SATA_DTYPE_NONE) {
19549 /*
19550 * Device is still attached - ignore detach event.
19551 */
19552 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->
19553 cport_mutex);
19554 SATADBG1(SATA_DBG_EVENTS_PROC, sata_hba_inst,
19555 "Ignoring detach - device still attached to port %d",
19556 sata_device.satadev_addr.cport);
19557 return;
19558 }
19559 /*
19560 * We need to detach and release device info structure here
19561 */
19562 if (cportinfo->cport_dev_type == SATA_DTYPE_PMULT) {
19563 /*
19564 * A port-multiplier is removed.
19565 *
19566 * Calling sata_process_pmdevice_detached() does not work
19567 * here. The port multiplier is gone, so we cannot probe
19568 * sub-port any more and all pmult-related data structure must
19569 * be de-allocated immediately. Following structure of every
19570 * implemented sub-port behind the pmult are required to
19571 * released.
19572 *
19573 * - attachment point
19574 * - target node
19575 * - sata_drive_info
19576 * - sata_pmport_info
19577 */
19578 for (npmport = 0; npmport < SATA_NUM_PMPORTS(sata_hba_inst,
19579 cport); npmport ++) {
19580 SATADBG2(SATA_DBG_PMULT|SATA_DBG_EVENTS_PROC,
19581 sata_hba_inst,
19582 "Detaching target node at port %d:%d",
19583 cport, npmport);
19584
19585 mutex_exit(&SATA_CPORT_MUTEX(sata_hba_inst, cport));
19586
19587 /* Remove attachment point. */
19588 name[0] = '\0';
19589 (void) sprintf(name, "%d.%d", cport, npmport);
19590 ddi_remove_minor_node(SATA_DIP(sata_hba_inst), name);
19591 sata_log(sata_hba_inst, CE_NOTE,
19592 "Remove attachment point of port %d:%d",
19593 cport, npmport);
19594
19595 /* Remove target node */
19596 pmport_addr.cport = cport;
19597 pmport_addr.pmport = (uint8_t)npmport;
19598 pmport_addr.qual = SATA_ADDR_PMPORT;
19599 sata_remove_target_node(sata_hba_inst, &pmport_addr);
19600
19601 mutex_enter(&SATA_CPORT_MUTEX(sata_hba_inst, cport));
19602
19603 /* Release sata_pmport_info & sata_drive_info. */
19604 pmportinfo = SATA_PMPORT_INFO(sata_hba_inst,
19605 cport, npmport);
19606 ASSERT(pmportinfo != NULL);
19607
19608 sdevinfo = SATA_PMPORTINFO_DRV_INFO(pmportinfo);
19609 if (sdevinfo != NULL) {
19610 (void) kmem_free((void *) sdevinfo,
19611 sizeof (sata_drive_info_t));
19612 }
19613
19614 /* Release sata_pmport_info at last */
19615 (void) kmem_free((void *) pmportinfo,
19616 sizeof (sata_pmport_info_t));
19617 }
19618
19619 /* Finally, release sata_pmult_info */
19620 (void) kmem_free((void *)
19621 SATA_CPORTINFO_PMULT_INFO(cportinfo),
19622 sizeof (sata_pmult_info_t));
19623 SATA_CPORTINFO_PMULT_INFO(cportinfo) = NULL;
19624
19625 sata_log(sata_hba_inst, CE_WARN,
19626 "SATA port-multiplier detached at port %d", cport);
19627
19628 cportinfo->cport_dev_type = SATA_DTYPE_NONE;
19629 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst,
19630 saddr->cport)->cport_mutex);
19631 } else {
19632 if (SATA_CPORTINFO_DRV_INFO(cportinfo) != NULL) {
19633 sdevinfo = SATA_CPORTINFO_DRV_INFO(cportinfo);
19634 SATA_CPORTINFO_DRV_INFO(cportinfo) = NULL;
19635 (void) kmem_free((void *)sdevinfo,
19636 sizeof (sata_drive_info_t));
19637 }
19638 sata_log(sata_hba_inst, CE_WARN,
19639 "SATA device detached at port %d", cport);
19640
19641 cportinfo->cport_dev_type = SATA_DTYPE_NONE;
19642 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst,
19643 saddr->cport)->cport_mutex);
19644
19645 /*
19646 * Try to offline a device and remove target node
19647 * if it still exists
19648 */
19649 sata_remove_target_node(sata_hba_inst, saddr);
19650 }
19651
19652
19653 /*
19654 * Generate sysevent - EC_DR / ESC_DR_AP_STATE_CHANGE
19655 * with the hint: SE_HINT_REMOVE
19656 */
19657 sata_gen_sysevent(sata_hba_inst, saddr, SE_HINT_REMOVE);
19658 }
19659
19660 /*
19661 * Port Multiplier Port Device Deattached Event processing.
19662 *
19663 * NOTE: No Mutex should be hold.
19664 */
19665 static void
sata_process_pmdevice_detached(sata_hba_inst_t * sata_hba_inst,sata_address_t * saddr)19666 sata_process_pmdevice_detached(sata_hba_inst_t *sata_hba_inst,
19667 sata_address_t *saddr)
19668 {
19669 sata_pmport_info_t *pmportinfo;
19670 sata_drive_info_t *sdevinfo;
19671 sata_device_t sata_device;
19672 int rval;
19673 uint8_t cport, pmport;
19674
19675 cport = saddr->cport;
19676 pmport = saddr->pmport;
19677
19678 SATADBG2(SATA_DBG_EVENTS_PROC, sata_hba_inst,
19679 "Processing port %d:%d device detached",
19680 cport, pmport);
19681
19682 pmportinfo = SATA_PMPORT_INFO(sata_hba_inst, cport, pmport);
19683 mutex_enter(&SATA_PMPORT_MUTEX(sata_hba_inst, cport, pmport));
19684
19685 /* Clear event flag */
19686 pmportinfo->pmport_event_flags &= ~SATA_EVNT_DEVICE_DETACHED;
19687
19688 /* If the port is in SHUTDOWN or FAILED state, ignore detach event. */
19689 if ((pmportinfo->pmport_state &
19690 (SATA_PSTATE_SHUTDOWN | SATA_PSTATE_FAILED)) != 0) {
19691 mutex_exit(&SATA_PMPORT_MUTEX(sata_hba_inst, cport, pmport));
19692 return;
19693 }
19694 /* For sanity, re-probe the port */
19695 sata_device.satadev_rev = SATA_DEVICE_REV;
19696 sata_device.satadev_addr = *saddr;
19697
19698 /*
19699 * We have to exit mutex, because the HBA probe port function may
19700 * block on its own mutex.
19701 */
19702 mutex_exit(&SATA_PMPORT_MUTEX(sata_hba_inst, cport, pmport));
19703 rval = (*SATA_PROBE_PORT_FUNC(sata_hba_inst))
19704 (SATA_DIP(sata_hba_inst), &sata_device);
19705 mutex_enter(&SATA_PMPORT_MUTEX(sata_hba_inst, cport, pmport));
19706 sata_update_pmport_info(sata_hba_inst, &sata_device);
19707 if (rval != SATA_SUCCESS) {
19708 /* Something went wrong? Fail the port */
19709 pmportinfo->pmport_state = SATA_PSTATE_FAILED;
19710 mutex_exit(&SATA_PMPORT_MUTEX(sata_hba_inst, cport, pmport));
19711 SATA_LOG_D((sata_hba_inst, CE_WARN,
19712 "SATA port %d:%d probing failed",
19713 saddr->pmport));
19714 /*
19715 * We may want to release device info structure, but
19716 * it is not necessary.
19717 */
19718 return;
19719 } else {
19720 /* port probed successfully */
19721 pmportinfo->pmport_state |=
19722 SATA_STATE_PROBED | SATA_STATE_READY;
19723 }
19724 /*
19725 * Check if a device is still attached. For sanity, check also
19726 * link status - if no link, there is no device.
19727 */
19728 if ((sata_device.satadev_scr.sstatus & SATA_PORT_DEVLINK_UP_MASK) ==
19729 SATA_PORT_DEVLINK_UP && sata_device.satadev_type !=
19730 SATA_DTYPE_NONE) {
19731 /*
19732 * Device is still attached - ignore detach event.
19733 */
19734 mutex_exit(&SATA_PMPORT_MUTEX(sata_hba_inst, cport, pmport));
19735 SATADBG1(SATA_DBG_EVENTS_PROC, sata_hba_inst,
19736 "Ignoring detach - device still attached to port %d",
19737 sata_device.satadev_addr.pmport);
19738 return;
19739 }
19740 /*
19741 * We need to detach and release device info structure here
19742 */
19743 if (SATA_PMPORTINFO_DRV_INFO(pmportinfo) != NULL) {
19744 sdevinfo = SATA_PMPORTINFO_DRV_INFO(pmportinfo);
19745 SATA_PMPORTINFO_DRV_INFO(pmportinfo) = NULL;
19746 (void) kmem_free((void *)sdevinfo,
19747 sizeof (sata_drive_info_t));
19748 }
19749 pmportinfo->pmport_dev_type = SATA_DTYPE_NONE;
19750 /*
19751 * Device cannot be reached anymore, even if the target node may be
19752 * still present.
19753 */
19754 mutex_exit(&SATA_PMPORT_MUTEX(sata_hba_inst, cport, pmport));
19755
19756 /*
19757 * Try to offline a device and remove target node if it still exists
19758 */
19759 sata_remove_target_node(sata_hba_inst, saddr);
19760
19761 /*
19762 * Generate sysevent - EC_DR / ESC_DR_AP_STATE_CHANGE
19763 * with the hint: SE_HINT_REMOVE
19764 */
19765 sata_gen_sysevent(sata_hba_inst, saddr, SE_HINT_REMOVE);
19766 }
19767
19768
19769 /*
19770 * Device Attached Event processing.
19771 * Port state is checked to verify that a device is really attached. If so,
19772 * the device info structure is created and attached to the SATA port info
19773 * structure.
19774 *
19775 * If attached device cannot be identified or set-up, the retry for the
19776 * attach processing is set-up. Subsequent daemon run would try again to
19777 * identify the device, until the time limit is reached
19778 * (SATA_DEV_IDENTIFY_TIMEOUT).
19779 *
19780 * This function cannot be called in interrupt context (it may sleep).
19781 *
19782 * NOTE: Port multiplier ports events are handled by
19783 * sata_process_pmdevice_attached()
19784 */
19785 static void
sata_process_device_attached(sata_hba_inst_t * sata_hba_inst,sata_address_t * saddr)19786 sata_process_device_attached(sata_hba_inst_t *sata_hba_inst,
19787 sata_address_t *saddr)
19788 {
19789 sata_cport_info_t *cportinfo = NULL;
19790 sata_drive_info_t *sdevinfo = NULL;
19791 sata_pmult_info_t *pmultinfo = NULL;
19792 sata_pmport_info_t *pmportinfo = NULL;
19793 sata_device_t sata_device;
19794 dev_info_t *tdip;
19795 uint32_t event_flags = 0, pmult_event_flags = 0;
19796 int rval;
19797 int npmport;
19798
19799 SATADBG1(SATA_DBG_EVENTS_PROC, sata_hba_inst,
19800 "Processing port %d device attached", saddr->cport);
19801
19802 cportinfo = SATA_CPORT_INFO(sata_hba_inst, saddr->cport);
19803 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->cport_mutex);
19804
19805 /* Clear attach event flag first */
19806 cportinfo->cport_event_flags &= ~SATA_EVNT_DEVICE_ATTACHED;
19807
19808 /* If the port is in SHUTDOWN or FAILED state, ignore event. */
19809 if ((cportinfo->cport_state &
19810 (SATA_PSTATE_SHUTDOWN | SATA_PSTATE_FAILED)) != 0) {
19811 cportinfo->cport_dev_attach_time = 0;
19812 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->
19813 cport_mutex);
19814 return;
19815 }
19816
19817 /*
19818 * If the sata_drive_info structure is found attached to the port info,
19819 * despite the fact the device was removed and now it is re-attached,
19820 * the old drive info structure was not removed.
19821 * Arbitrarily release device info structure.
19822 */
19823 if (SATA_CPORTINFO_DRV_INFO(cportinfo) != NULL) {
19824 sdevinfo = SATA_CPORTINFO_DRV_INFO(cportinfo);
19825 SATA_CPORTINFO_DRV_INFO(cportinfo) = NULL;
19826 (void) kmem_free((void *)sdevinfo,
19827 sizeof (sata_drive_info_t));
19828 SATADBG1(SATA_DBG_EVENTS_PROC, sata_hba_inst,
19829 "Arbitrarily detaching old device info.", NULL);
19830 }
19831 cportinfo->cport_dev_type = SATA_DTYPE_NONE;
19832
19833 /* For sanity, re-probe the port */
19834 sata_device.satadev_rev = SATA_DEVICE_REV;
19835 sata_device.satadev_addr = *saddr;
19836
19837 /*
19838 * We have to exit mutex, because the HBA probe port function may
19839 * block on its own mutex.
19840 */
19841 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->cport_mutex);
19842 rval = (*SATA_PROBE_PORT_FUNC(sata_hba_inst))
19843 (SATA_DIP(sata_hba_inst), &sata_device);
19844 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->cport_mutex);
19845 sata_update_port_info(sata_hba_inst, &sata_device);
19846 if (rval != SATA_SUCCESS) {
19847 /* Something went wrong? Fail the port */
19848 cportinfo->cport_state = SATA_PSTATE_FAILED;
19849 cportinfo->cport_dev_attach_time = 0;
19850 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->
19851 cport_mutex);
19852 SATA_LOG_D((sata_hba_inst, CE_WARN,
19853 "SATA port %d probing failed",
19854 saddr->cport));
19855 return;
19856 } else {
19857 /* port probed successfully */
19858 cportinfo->cport_state |= SATA_STATE_PROBED | SATA_STATE_READY;
19859 }
19860 /*
19861 * Check if a device is still attached. For sanity, check also
19862 * link status - if no link, there is no device.
19863 */
19864 if ((sata_device.satadev_scr.sstatus & SATA_PORT_DEVLINK_UP_MASK) !=
19865 SATA_PORT_DEVLINK_UP || sata_device.satadev_type ==
19866 SATA_DTYPE_NONE) {
19867 /*
19868 * No device - ignore attach event.
19869 */
19870 cportinfo->cport_dev_attach_time = 0;
19871 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->
19872 cport_mutex);
19873 SATADBG1(SATA_DBG_EVENTS_PROC, sata_hba_inst,
19874 "Ignoring attach - no device connected to port %d",
19875 sata_device.satadev_addr.cport);
19876 return;
19877 }
19878
19879 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->cport_mutex);
19880 /*
19881 * Generate sysevent - EC_DR / ESC_DR_AP_STATE_CHANGE
19882 * with the hint: SE_HINT_INSERT
19883 */
19884 sata_gen_sysevent(sata_hba_inst, saddr, SE_HINT_INSERT);
19885
19886 /*
19887 * Port reprobing will take care of the creation of the device
19888 * info structure and determination of the device type.
19889 */
19890 sata_device.satadev_addr = *saddr;
19891 (void) sata_reprobe_port(sata_hba_inst, &sata_device,
19892 SATA_DEV_IDENTIFY_NORETRY);
19893
19894 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->
19895 cport_mutex);
19896 if ((cportinfo->cport_state & SATA_STATE_READY) &&
19897 (cportinfo->cport_dev_type != SATA_DTYPE_NONE)) {
19898 /* Some device is attached to the port */
19899 if (cportinfo->cport_dev_type == SATA_DTYPE_UNKNOWN) {
19900 /*
19901 * A device was not successfully attached.
19902 * Track retry time for device identification.
19903 */
19904 if (cportinfo->cport_dev_attach_time != 0) {
19905 clock_t cur_time = ddi_get_lbolt();
19906 /*
19907 * If the retry time limit was not exceeded,
19908 * reinstate attach event.
19909 */
19910 if ((cur_time -
19911 cportinfo->cport_dev_attach_time) <
19912 drv_usectohz(
19913 SATA_DEV_IDENTIFY_TIMEOUT)) {
19914 /* OK, restore attach event */
19915 cportinfo->cport_event_flags |=
19916 SATA_EVNT_DEVICE_ATTACHED;
19917 } else {
19918 /* Timeout - cannot identify device */
19919 cportinfo->cport_dev_attach_time = 0;
19920 sata_log(sata_hba_inst,
19921 CE_WARN,
19922 "Could not identify SATA device "
19923 "at port %d",
19924 saddr->cport);
19925 }
19926 } else {
19927 /*
19928 * Start tracking time for device
19929 * identification.
19930 * Save current time (lbolt value).
19931 */
19932 cportinfo->cport_dev_attach_time =
19933 ddi_get_lbolt();
19934 /* Restore attach event */
19935 cportinfo->cport_event_flags |=
19936 SATA_EVNT_DEVICE_ATTACHED;
19937 }
19938 } else if (cportinfo->cport_dev_type == SATA_DTYPE_PMULT) {
19939 cportinfo->cport_dev_attach_time = 0;
19940 sata_log(sata_hba_inst, CE_NOTE,
19941 "SATA port-multiplier detected at port %d",
19942 saddr->cport);
19943
19944 if (SATA_CPORTINFO_PMULT_INFO(cportinfo) != NULL) {
19945 /* Log the info of new port multiplier */
19946 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst,
19947 saddr->cport)->cport_mutex);
19948 sata_show_pmult_info(sata_hba_inst,
19949 &sata_device);
19950 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst,
19951 saddr->cport)->cport_mutex);
19952 }
19953
19954 ASSERT(SATA_CPORTINFO_PMULT_INFO(cportinfo) != NULL);
19955 pmultinfo = SATA_CPORTINFO_PMULT_INFO(cportinfo);
19956 for (npmport = 0; npmport <
19957 pmultinfo->pmult_num_dev_ports; npmport++) {
19958 pmportinfo = SATA_PMPORT_INFO(sata_hba_inst,
19959 saddr->cport, npmport);
19960 ASSERT(pmportinfo != NULL);
19961
19962 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst,
19963 saddr->cport)->cport_mutex);
19964 mutex_enter(&pmportinfo->pmport_mutex);
19965 /* Marked all pmports with link events. */
19966 pmportinfo->pmport_event_flags =
19967 SATA_EVNT_LINK_ESTABLISHED;
19968 pmult_event_flags |=
19969 pmportinfo->pmport_event_flags;
19970 mutex_exit(&pmportinfo->pmport_mutex);
19971 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst,
19972 saddr->cport)->cport_mutex);
19973 }
19974 /* Auto-online is not available for PMult now. */
19975
19976 } else {
19977 /*
19978 * If device was successfully attached, the subsequent
19979 * action depends on a state of the
19980 * sata_auto_online variable. If it is set to zero.
19981 * an explicit 'configure' command will be needed to
19982 * configure it. If its value is non-zero, we will
19983 * attempt to online (configure) the device.
19984 * First, log the message indicating that a device
19985 * was attached.
19986 */
19987 cportinfo->cport_dev_attach_time = 0;
19988 sata_log(sata_hba_inst, CE_WARN,
19989 "SATA device detected at port %d", saddr->cport);
19990
19991 if (SATA_CPORTINFO_DRV_INFO(cportinfo) != NULL) {
19992 sata_drive_info_t new_sdinfo;
19993
19994 /* Log device info data */
19995 new_sdinfo = *(SATA_CPORTINFO_DRV_INFO(
19996 cportinfo));
19997 sata_show_drive_info(sata_hba_inst,
19998 &new_sdinfo);
19999 }
20000
20001 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst,
20002 saddr->cport)->cport_mutex);
20003
20004 /*
20005 * Make sure that there is no target node for that
20006 * device. If so, release it. It should not happen,
20007 * unless we had problem removing the node when
20008 * device was detached.
20009 */
20010 tdip = sata_get_target_dip(SATA_DIP(sata_hba_inst),
20011 saddr->cport, saddr->pmport);
20012 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst,
20013 saddr->cport)->cport_mutex);
20014 if (tdip != NULL) {
20015
20016 #ifdef SATA_DEBUG
20017 if ((cportinfo->cport_event_flags &
20018 SATA_EVNT_TARGET_NODE_CLEANUP) == 0)
20019 sata_log(sata_hba_inst, CE_WARN,
20020 "sata_process_device_attached: "
20021 "old device target node exists!");
20022 #endif
20023 /*
20024 * target node exists - try to unconfigure
20025 * device and remove the node.
20026 */
20027 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst,
20028 saddr->cport)->cport_mutex);
20029 rval = ndi_devi_offline(tdip,
20030 NDI_DEVI_REMOVE);
20031 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst,
20032 saddr->cport)->cport_mutex);
20033
20034 if (rval == NDI_SUCCESS) {
20035 cportinfo->cport_event_flags &=
20036 ~SATA_EVNT_TARGET_NODE_CLEANUP;
20037 cportinfo->cport_tgtnode_clean = B_TRUE;
20038 } else {
20039 /*
20040 * PROBLEM - the target node remained
20041 * and it belongs to a previously
20042 * attached device.
20043 * This happens when the file was open
20044 * or the node was waiting for
20045 * resources at the time the
20046 * associated device was removed.
20047 * Instruct event daemon to retry the
20048 * cleanup later.
20049 */
20050 sata_log(sata_hba_inst,
20051 CE_WARN,
20052 "Application(s) accessing "
20053 "previously attached SATA "
20054 "device have to release "
20055 "it before newly inserted "
20056 "device can be made accessible.",
20057 saddr->cport);
20058 cportinfo->cport_event_flags |=
20059 SATA_EVNT_TARGET_NODE_CLEANUP;
20060 cportinfo->cport_tgtnode_clean =
20061 B_FALSE;
20062 }
20063 }
20064 if (sata_auto_online != 0) {
20065 cportinfo->cport_event_flags |=
20066 SATA_EVNT_AUTOONLINE_DEVICE;
20067 }
20068
20069 }
20070 } else {
20071 cportinfo->cport_dev_attach_time = 0;
20072 }
20073
20074 event_flags = cportinfo->cport_event_flags;
20075 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->cport_mutex);
20076 if (event_flags != 0 || pmult_event_flags != 0) {
20077 mutex_enter(&sata_hba_inst->satahba_mutex);
20078 sata_hba_inst->satahba_event_flags |= SATA_EVNT_MAIN;
20079 mutex_exit(&sata_hba_inst->satahba_mutex);
20080 mutex_enter(&sata_mutex);
20081 sata_event_pending |= SATA_EVNT_MAIN;
20082 mutex_exit(&sata_mutex);
20083 }
20084 }
20085
20086 /*
20087 * Port Multiplier Port Device Attached Event processing.
20088 *
20089 * NOTE: No Mutex should be hold.
20090 */
20091 static void
sata_process_pmdevice_attached(sata_hba_inst_t * sata_hba_inst,sata_address_t * saddr)20092 sata_process_pmdevice_attached(sata_hba_inst_t *sata_hba_inst,
20093 sata_address_t *saddr)
20094 {
20095 sata_pmport_info_t *pmportinfo;
20096 sata_drive_info_t *sdinfo;
20097 sata_device_t sata_device;
20098 dev_info_t *tdip;
20099 uint32_t event_flags;
20100 uint8_t cport = saddr->cport;
20101 uint8_t pmport = saddr->pmport;
20102 int rval;
20103
20104 SATADBG2(SATA_DBG_EVENTS_PROC, sata_hba_inst,
20105 "Processing port %d:%d device attached", cport, pmport);
20106
20107 pmportinfo = SATA_PMPORT_INFO(sata_hba_inst, cport, pmport);
20108
20109 mutex_enter(&pmportinfo->pmport_mutex);
20110
20111 /* Clear attach event flag first */
20112 pmportinfo->pmport_event_flags &= ~SATA_EVNT_DEVICE_ATTACHED;
20113
20114 /* If the port is in SHUTDOWN or FAILED state, ignore event. */
20115 if ((pmportinfo->pmport_state &
20116 (SATA_PSTATE_SHUTDOWN | SATA_PSTATE_FAILED)) != 0) {
20117 pmportinfo->pmport_dev_attach_time = 0;
20118 mutex_exit(&pmportinfo->pmport_mutex);
20119 return;
20120 }
20121
20122 /*
20123 * If the sata_drive_info structure is found attached to the port info,
20124 * despite the fact the device was removed and now it is re-attached,
20125 * the old drive info structure was not removed.
20126 * Arbitrarily release device info structure.
20127 */
20128 if (SATA_PMPORTINFO_DRV_INFO(pmportinfo) != NULL) {
20129 sdinfo = SATA_PMPORTINFO_DRV_INFO(pmportinfo);
20130 SATA_PMPORTINFO_DRV_INFO(pmportinfo) = NULL;
20131 (void) kmem_free((void *)sdinfo,
20132 sizeof (sata_drive_info_t));
20133 SATADBG1(SATA_DBG_EVENTS_PROC, sata_hba_inst,
20134 "Arbitrarily detaching old device info.", NULL);
20135 }
20136 pmportinfo->pmport_dev_type = SATA_DTYPE_NONE;
20137
20138 /* For sanity, re-probe the port */
20139 sata_device.satadev_rev = SATA_DEVICE_REV;
20140 sata_device.satadev_addr = *saddr;
20141
20142 /*
20143 * We have to exit mutex, because the HBA probe port function may
20144 * block on its own mutex.
20145 */
20146 mutex_exit(&pmportinfo->pmport_mutex);
20147 rval = (*SATA_PROBE_PORT_FUNC(sata_hba_inst))
20148 (SATA_DIP(sata_hba_inst), &sata_device);
20149 mutex_enter(&pmportinfo->pmport_mutex);
20150
20151 sata_update_pmport_info(sata_hba_inst, &sata_device);
20152 if (rval != SATA_SUCCESS) {
20153 /* Something went wrong? Fail the port */
20154 pmportinfo->pmport_state = SATA_PSTATE_FAILED;
20155 pmportinfo->pmport_dev_attach_time = 0;
20156 mutex_exit(&pmportinfo->pmport_mutex);
20157 SATA_LOG_D((sata_hba_inst, CE_WARN,
20158 "SATA port %d:%d probing failed", cport, pmport));
20159 return;
20160 } else {
20161 /* pmport probed successfully */
20162 pmportinfo->pmport_state |=
20163 SATA_STATE_PROBED | SATA_STATE_READY;
20164 }
20165 /*
20166 * Check if a device is still attached. For sanity, check also
20167 * link status - if no link, there is no device.
20168 */
20169 if ((sata_device.satadev_scr.sstatus & SATA_PORT_DEVLINK_UP_MASK) !=
20170 SATA_PORT_DEVLINK_UP || sata_device.satadev_type ==
20171 SATA_DTYPE_NONE) {
20172 /*
20173 * No device - ignore attach event.
20174 */
20175 pmportinfo->pmport_dev_attach_time = 0;
20176 mutex_exit(&pmportinfo->pmport_mutex);
20177 SATADBG2(SATA_DBG_EVENTS_PROC, sata_hba_inst,
20178 "Ignoring attach - no device connected to port %d:%d",
20179 cport, pmport);
20180 return;
20181 }
20182
20183 mutex_exit(&pmportinfo->pmport_mutex);
20184 /*
20185 * Generate sysevent - EC_DR / ESC_DR_AP_STATE_CHANGE
20186 * with the hint: SE_HINT_INSERT
20187 */
20188 sata_gen_sysevent(sata_hba_inst, saddr, SE_HINT_INSERT);
20189
20190 /*
20191 * Port reprobing will take care of the creation of the device
20192 * info structure and determination of the device type.
20193 */
20194 sata_device.satadev_addr = *saddr;
20195 (void) sata_reprobe_port(sata_hba_inst, &sata_device,
20196 SATA_DEV_IDENTIFY_NORETRY);
20197
20198 mutex_enter(&pmportinfo->pmport_mutex);
20199 if ((pmportinfo->pmport_state & SATA_STATE_READY) &&
20200 (pmportinfo->pmport_dev_type != SATA_DTYPE_NONE)) {
20201 /* Some device is attached to the port */
20202 if (pmportinfo->pmport_dev_type == SATA_DTYPE_UNKNOWN) {
20203 /*
20204 * A device was not successfully attached.
20205 * Track retry time for device identification.
20206 */
20207 if (pmportinfo->pmport_dev_attach_time != 0) {
20208 clock_t cur_time = ddi_get_lbolt();
20209 /*
20210 * If the retry time limit was not exceeded,
20211 * reinstate attach event.
20212 */
20213 if ((cur_time -
20214 pmportinfo->pmport_dev_attach_time) <
20215 drv_usectohz(
20216 SATA_DEV_IDENTIFY_TIMEOUT)) {
20217 /* OK, restore attach event */
20218 pmportinfo->pmport_event_flags |=
20219 SATA_EVNT_DEVICE_ATTACHED;
20220 } else {
20221 /* Timeout - cannot identify device */
20222 pmportinfo->pmport_dev_attach_time = 0;
20223 sata_log(sata_hba_inst, CE_WARN,
20224 "Could not identify SATA device "
20225 "at port %d:%d",
20226 cport, pmport);
20227 }
20228 } else {
20229 /*
20230 * Start tracking time for device
20231 * identification.
20232 * Save current time (lbolt value).
20233 */
20234 pmportinfo->pmport_dev_attach_time =
20235 ddi_get_lbolt();
20236 /* Restore attach event */
20237 pmportinfo->pmport_event_flags |=
20238 SATA_EVNT_DEVICE_ATTACHED;
20239 }
20240 } else {
20241 /*
20242 * If device was successfully attached, the subsequent
20243 * action depends on a state of the
20244 * sata_auto_online variable. If it is set to zero.
20245 * an explicit 'configure' command will be needed to
20246 * configure it. If its value is non-zero, we will
20247 * attempt to online (configure) the device.
20248 * First, log the message indicating that a device
20249 * was attached.
20250 */
20251 pmportinfo->pmport_dev_attach_time = 0;
20252 sata_log(sata_hba_inst, CE_WARN,
20253 "SATA device detected at port %d:%d",
20254 cport, pmport);
20255
20256 if (SATA_PMPORTINFO_DRV_INFO(pmportinfo) != NULL) {
20257 sata_drive_info_t new_sdinfo;
20258
20259 /* Log device info data */
20260 new_sdinfo = *(SATA_PMPORTINFO_DRV_INFO(
20261 pmportinfo));
20262 sata_show_drive_info(sata_hba_inst,
20263 &new_sdinfo);
20264 }
20265
20266 mutex_exit(&pmportinfo->pmport_mutex);
20267
20268 /*
20269 * Make sure that there is no target node for that
20270 * device. If so, release it. It should not happen,
20271 * unless we had problem removing the node when
20272 * device was detached.
20273 */
20274 tdip = sata_get_target_dip(SATA_DIP(sata_hba_inst),
20275 saddr->cport, saddr->pmport);
20276 mutex_enter(&pmportinfo->pmport_mutex);
20277 if (tdip != NULL) {
20278
20279 #ifdef SATA_DEBUG
20280 if ((pmportinfo->pmport_event_flags &
20281 SATA_EVNT_TARGET_NODE_CLEANUP) == 0)
20282 sata_log(sata_hba_inst, CE_WARN,
20283 "sata_process_device_attached: "
20284 "old device target node exists!");
20285 #endif
20286 /*
20287 * target node exists - try to unconfigure
20288 * device and remove the node.
20289 */
20290 mutex_exit(&pmportinfo->pmport_mutex);
20291 rval = ndi_devi_offline(tdip,
20292 NDI_DEVI_REMOVE);
20293 mutex_enter(&pmportinfo->pmport_mutex);
20294
20295 if (rval == NDI_SUCCESS) {
20296 pmportinfo->pmport_event_flags &=
20297 ~SATA_EVNT_TARGET_NODE_CLEANUP;
20298 pmportinfo->pmport_tgtnode_clean =
20299 B_TRUE;
20300 } else {
20301 /*
20302 * PROBLEM - the target node remained
20303 * and it belongs to a previously
20304 * attached device.
20305 * This happens when the file was open
20306 * or the node was waiting for
20307 * resources at the time the
20308 * associated device was removed.
20309 * Instruct event daemon to retry the
20310 * cleanup later.
20311 */
20312 sata_log(sata_hba_inst,
20313 CE_WARN,
20314 "Application(s) accessing "
20315 "previously attached SATA "
20316 "device have to release "
20317 "it before newly inserted "
20318 "device can be made accessible."
20319 "at port %d:%d",
20320 cport, pmport);
20321 pmportinfo->pmport_event_flags |=
20322 SATA_EVNT_TARGET_NODE_CLEANUP;
20323 pmportinfo->pmport_tgtnode_clean =
20324 B_FALSE;
20325 }
20326 }
20327 if (sata_auto_online != 0) {
20328 pmportinfo->pmport_event_flags |=
20329 SATA_EVNT_AUTOONLINE_DEVICE;
20330 }
20331
20332 }
20333 } else {
20334 pmportinfo->pmport_dev_attach_time = 0;
20335 }
20336
20337 event_flags = pmportinfo->pmport_event_flags;
20338 mutex_exit(&pmportinfo->pmport_mutex);
20339 if (event_flags != 0) {
20340 mutex_enter(&sata_hba_inst->satahba_mutex);
20341 sata_hba_inst->satahba_event_flags |= SATA_EVNT_MAIN;
20342 mutex_exit(&sata_hba_inst->satahba_mutex);
20343 mutex_enter(&sata_mutex);
20344 sata_event_pending |= SATA_EVNT_MAIN;
20345 mutex_exit(&sata_mutex);
20346 }
20347
20348 /* clear the reset_in_progress events */
20349 if (SATA_PMPORTINFO_DRV_INFO(pmportinfo) != NULL) {
20350 if (pmportinfo->pmport_dev_type & SATA_VALID_DEV_TYPE) {
20351 /* must clear flags on cport */
20352 sata_pmult_info_t *pminfo =
20353 SATA_PMULT_INFO(sata_hba_inst,
20354 saddr->cport);
20355 pminfo->pmult_event_flags |=
20356 SATA_EVNT_CLEAR_DEVICE_RESET;
20357 }
20358 }
20359 }
20360
20361 /*
20362 * Device Target Node Cleanup Event processing.
20363 * If the target node associated with a sata port device is in
20364 * DEVI_DEVICE_REMOVED state, an attempt is made to remove it.
20365 * If the target node cannot be removed, the event flag is left intact,
20366 * so that event daemon may re-run this function later.
20367 *
20368 * This function cannot be called in interrupt context (it may sleep).
20369 *
20370 * NOTE: Processes cport events only, not port multiplier ports.
20371 */
20372 static void
sata_process_target_node_cleanup(sata_hba_inst_t * sata_hba_inst,sata_address_t * saddr)20373 sata_process_target_node_cleanup(sata_hba_inst_t *sata_hba_inst,
20374 sata_address_t *saddr)
20375 {
20376 sata_cport_info_t *cportinfo;
20377 dev_info_t *tdip;
20378
20379 SATADBG1(SATA_DBG_EVENTS_PROC, sata_hba_inst,
20380 "Processing port %d device target node cleanup", saddr->cport);
20381
20382 cportinfo = SATA_CPORT_INFO(sata_hba_inst, saddr->cport);
20383
20384 /*
20385 * Check if there is target node for that device and it is in the
20386 * DEVI_DEVICE_REMOVED state. If so, release it.
20387 */
20388 tdip = sata_get_target_dip(SATA_DIP(sata_hba_inst), saddr->cport,
20389 saddr->pmport);
20390 if (tdip != NULL) {
20391 /*
20392 * target node exists - check if it is target node of
20393 * a removed device.
20394 */
20395 if (sata_check_device_removed(tdip) == B_TRUE) {
20396 SATADBG1(SATA_DBG_EVENTS_PROC, sata_hba_inst,
20397 "sata_process_target_node_cleanup: "
20398 "old device target node exists!", NULL);
20399 /*
20400 * Unconfigure and remove the target node
20401 */
20402 if (ndi_devi_offline(tdip, NDI_DEVI_REMOVE) ==
20403 NDI_SUCCESS) {
20404 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst,
20405 saddr->cport)->cport_mutex);
20406 cportinfo->cport_event_flags &=
20407 ~SATA_EVNT_TARGET_NODE_CLEANUP;
20408 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst,
20409 saddr->cport)->cport_mutex);
20410 return;
20411 }
20412 /*
20413 * Event daemon will retry the cleanup later.
20414 */
20415 mutex_enter(&sata_hba_inst->satahba_mutex);
20416 sata_hba_inst->satahba_event_flags |= SATA_EVNT_MAIN;
20417 mutex_exit(&sata_hba_inst->satahba_mutex);
20418 mutex_enter(&sata_mutex);
20419 sata_event_pending |= SATA_EVNT_MAIN;
20420 mutex_exit(&sata_mutex);
20421 }
20422 } else {
20423 if (saddr->qual == SATA_ADDR_CPORT ||
20424 saddr->qual == SATA_ADDR_DCPORT) {
20425 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst,
20426 saddr->cport)->cport_mutex);
20427 cportinfo->cport_event_flags &=
20428 ~SATA_EVNT_TARGET_NODE_CLEANUP;
20429 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst,
20430 saddr->cport)->cport_mutex);
20431 } else {
20432 /* sanity check */
20433 if (SATA_CPORT_DEV_TYPE(sata_hba_inst, saddr->cport) !=
20434 SATA_DTYPE_PMULT || SATA_PMULT_INFO(sata_hba_inst,
20435 saddr->cport) == NULL)
20436 return;
20437 if (SATA_PMPORT_INFO(sata_hba_inst, saddr->cport,
20438 saddr->pmport) == NULL)
20439 return;
20440
20441 mutex_enter(&SATA_PMPORT_INFO(sata_hba_inst,
20442 saddr->cport, saddr->pmport)->pmport_mutex);
20443 SATA_PMPORT_INFO(sata_hba_inst, saddr->cport,
20444 saddr->pmport)->pmport_event_flags &=
20445 ~SATA_EVNT_TARGET_NODE_CLEANUP;
20446 mutex_exit(&SATA_PMPORT_INFO(sata_hba_inst,
20447 saddr->cport, saddr->pmport)->pmport_mutex);
20448 }
20449 }
20450 }
20451
20452 /*
20453 * Device AutoOnline Event processing.
20454 * If attached device is to be onlined, an attempt is made to online this
20455 * device, but only if there is no lingering (old) target node present.
20456 * If the device cannot be onlined, the event flag is left intact,
20457 * so that event daemon may re-run this function later.
20458 *
20459 * This function cannot be called in interrupt context (it may sleep).
20460 *
20461 * NOTE: Processes cport events only, not port multiplier ports.
20462 */
20463 static void
sata_process_device_autoonline(sata_hba_inst_t * sata_hba_inst,sata_address_t * saddr)20464 sata_process_device_autoonline(sata_hba_inst_t *sata_hba_inst,
20465 sata_address_t *saddr)
20466 {
20467 sata_cport_info_t *cportinfo;
20468 sata_drive_info_t *sdinfo;
20469 sata_device_t sata_device;
20470 dev_info_t *tdip;
20471
20472 SATADBG1(SATA_DBG_EVENTS_PROC, sata_hba_inst,
20473 "Processing port %d attached device auto-onlining", saddr->cport);
20474
20475 cportinfo = SATA_CPORT_INFO(sata_hba_inst, saddr->cport);
20476
20477 /*
20478 * Check if device is present and recognized. If not, reset event.
20479 */
20480 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->cport_mutex);
20481 if ((cportinfo->cport_dev_type & SATA_VALID_DEV_TYPE) == 0) {
20482 /* Nothing to online */
20483 cportinfo->cport_event_flags &= ~SATA_EVNT_AUTOONLINE_DEVICE;
20484 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst,
20485 saddr->cport)->cport_mutex);
20486 return;
20487 }
20488 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->cport_mutex);
20489
20490 /*
20491 * Check if there is target node for this device and if it is in the
20492 * DEVI_DEVICE_REMOVED state. If so, abort onlining but keep
20493 * the event for later processing.
20494 */
20495 tdip = sata_get_target_dip(SATA_DIP(sata_hba_inst), saddr->cport,
20496 saddr->pmport);
20497 if (tdip != NULL) {
20498 /*
20499 * target node exists - check if it is target node of
20500 * a removed device.
20501 */
20502 if (sata_check_device_removed(tdip) == B_TRUE) {
20503 SATADBG1(SATA_DBG_EVENTS_PROC, sata_hba_inst,
20504 "sata_process_device_autoonline: "
20505 "old device target node exists!", NULL);
20506 /*
20507 * Event daemon will retry device onlining later.
20508 */
20509 mutex_enter(&sata_hba_inst->satahba_mutex);
20510 sata_hba_inst->satahba_event_flags |= SATA_EVNT_MAIN;
20511 mutex_exit(&sata_hba_inst->satahba_mutex);
20512 mutex_enter(&sata_mutex);
20513 sata_event_pending |= SATA_EVNT_MAIN;
20514 mutex_exit(&sata_mutex);
20515 return;
20516 }
20517 /*
20518 * If the target node is not in the 'removed" state, assume
20519 * that it belongs to this device. There is nothing more to do,
20520 * but reset the event.
20521 */
20522 } else {
20523
20524 /*
20525 * Try to online the device
20526 * If there is any reset-related event, remove it. We are
20527 * configuring the device and no state restoring is needed.
20528 */
20529 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst,
20530 saddr->cport)->cport_mutex);
20531 sata_device.satadev_addr = *saddr;
20532 if (saddr->qual == SATA_ADDR_CPORT)
20533 sata_device.satadev_addr.qual = SATA_ADDR_DCPORT;
20534 else
20535 sata_device.satadev_addr.qual = SATA_ADDR_DPMPORT;
20536 sdinfo = sata_get_device_info(sata_hba_inst, &sata_device);
20537 if (sdinfo != NULL) {
20538 if (sdinfo->satadrv_event_flags &
20539 (SATA_EVNT_DEVICE_RESET |
20540 SATA_EVNT_INPROC_DEVICE_RESET))
20541 sdinfo->satadrv_event_flags = 0;
20542 sdinfo->satadrv_event_flags |=
20543 SATA_EVNT_CLEAR_DEVICE_RESET;
20544
20545 /* Need to create a new target node. */
20546 cportinfo->cport_tgtnode_clean = B_TRUE;
20547 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst,
20548 saddr->cport)->cport_mutex);
20549 tdip = sata_create_target_node(SATA_DIP(sata_hba_inst),
20550 sata_hba_inst, &sata_device.satadev_addr);
20551 if (tdip == NULL) {
20552 /*
20553 * Configure (onlining) failed.
20554 * We will NOT retry
20555 */
20556 SATA_LOG_D((sata_hba_inst, CE_WARN,
20557 "sata_process_device_autoonline: "
20558 "configuring SATA device at port %d failed",
20559 saddr->cport));
20560 }
20561 } else {
20562 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst,
20563 saddr->cport)->cport_mutex);
20564 }
20565
20566 }
20567 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->cport_mutex);
20568 cportinfo->cport_event_flags &= ~SATA_EVNT_AUTOONLINE_DEVICE;
20569 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst,
20570 saddr->cport)->cport_mutex);
20571 }
20572
20573
20574 static void
sata_gen_sysevent(sata_hba_inst_t * sata_hba_inst,sata_address_t * saddr,int hint)20575 sata_gen_sysevent(sata_hba_inst_t *sata_hba_inst, sata_address_t *saddr,
20576 int hint)
20577 {
20578 char ap[MAXPATHLEN];
20579 nvlist_t *ev_attr_list = NULL;
20580 int err;
20581
20582 /* Allocate and build sysevent attribute list */
20583 err = nvlist_alloc(&ev_attr_list, NV_UNIQUE_NAME_TYPE, DDI_NOSLEEP);
20584 if (err != 0) {
20585 SATA_LOG_D((sata_hba_inst, CE_WARN,
20586 "sata_gen_sysevent: "
20587 "cannot allocate memory for sysevent attributes\n"));
20588 return;
20589 }
20590 /* Add hint attribute */
20591 err = nvlist_add_string(ev_attr_list, DR_HINT, SE_HINT2STR(hint));
20592 if (err != 0) {
20593 SATA_LOG_D((sata_hba_inst, CE_WARN,
20594 "sata_gen_sysevent: "
20595 "failed to add DR_HINT attr for sysevent"));
20596 nvlist_free(ev_attr_list);
20597 return;
20598 }
20599 /*
20600 * Add AP attribute.
20601 * Get controller pathname and convert it into AP pathname by adding
20602 * a target number.
20603 */
20604 (void) snprintf(ap, MAXPATHLEN, "/devices");
20605 (void) ddi_pathname(SATA_DIP(sata_hba_inst), ap + strlen(ap));
20606 (void) snprintf(ap + strlen(ap), MAXPATHLEN - strlen(ap), ":%d",
20607 SATA_MAKE_AP_NUMBER(saddr->cport, saddr->pmport, saddr->qual));
20608
20609 err = nvlist_add_string(ev_attr_list, DR_AP_ID, ap);
20610 if (err != 0) {
20611 SATA_LOG_D((sata_hba_inst, CE_WARN,
20612 "sata_gen_sysevent: "
20613 "failed to add DR_AP_ID attr for sysevent"));
20614 nvlist_free(ev_attr_list);
20615 return;
20616 }
20617
20618 /* Generate/log sysevent */
20619 err = ddi_log_sysevent(SATA_DIP(sata_hba_inst), DDI_VENDOR_SUNW, EC_DR,
20620 ESC_DR_AP_STATE_CHANGE, ev_attr_list, NULL, DDI_NOSLEEP);
20621 if (err != DDI_SUCCESS) {
20622 SATA_LOG_D((sata_hba_inst, CE_WARN,
20623 "sata_gen_sysevent: "
20624 "cannot log sysevent, err code %x\n", err));
20625 }
20626
20627 nvlist_free(ev_attr_list);
20628 }
20629
20630
20631
20632
20633 /*
20634 * Set DEVI_DEVICE_REMOVED state in the SATA device target node.
20635 */
20636 static void
sata_set_device_removed(dev_info_t * tdip)20637 sata_set_device_removed(dev_info_t *tdip)
20638 {
20639 int circ;
20640
20641 ASSERT(tdip != NULL);
20642
20643 ndi_devi_enter(tdip, &circ);
20644 mutex_enter(&DEVI(tdip)->devi_lock);
20645 DEVI_SET_DEVICE_REMOVED(tdip);
20646 mutex_exit(&DEVI(tdip)->devi_lock);
20647 ndi_devi_exit(tdip, circ);
20648 }
20649
20650
20651 /*
20652 * Set internal event instructing event daemon to try
20653 * to perform the target node cleanup.
20654 */
20655 static void
sata_set_target_node_cleanup(sata_hba_inst_t * sata_hba_inst,sata_address_t * saddr)20656 sata_set_target_node_cleanup(sata_hba_inst_t *sata_hba_inst,
20657 sata_address_t *saddr)
20658 {
20659 if (saddr->qual == SATA_ADDR_CPORT ||
20660 saddr->qual == SATA_ADDR_DCPORT) {
20661 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst,
20662 saddr->cport)->cport_mutex);
20663 SATA_CPORT_EVENT_FLAGS(sata_hba_inst, saddr->cport) |=
20664 SATA_EVNT_TARGET_NODE_CLEANUP;
20665 SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->
20666 cport_tgtnode_clean = B_FALSE;
20667 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst,
20668 saddr->cport)->cport_mutex);
20669 } else {
20670 mutex_enter(&SATA_PMPORT_INFO(sata_hba_inst,
20671 saddr->cport, saddr->pmport)->pmport_mutex);
20672 SATA_PMPORT_EVENT_FLAGS(sata_hba_inst, saddr->cport,
20673 saddr->pmport) |= SATA_EVNT_TARGET_NODE_CLEANUP;
20674 SATA_PMPORT_INFO(sata_hba_inst, saddr->cport, saddr->pmport)->
20675 pmport_tgtnode_clean = B_FALSE;
20676 mutex_exit(&SATA_PMPORT_INFO(sata_hba_inst,
20677 saddr->cport, saddr->pmport)->pmport_mutex);
20678 }
20679 mutex_enter(&sata_hba_inst->satahba_mutex);
20680 sata_hba_inst->satahba_event_flags |= SATA_EVNT_MAIN;
20681 mutex_exit(&sata_hba_inst->satahba_mutex);
20682 mutex_enter(&sata_mutex);
20683 sata_event_pending |= SATA_EVNT_MAIN;
20684 mutex_exit(&sata_mutex);
20685 }
20686
20687
20688 /*
20689 * Check if the SATA device target node is in DEVI_DEVICE_REMOVED state,
20690 * i.e. check if the target node state indicates that it belongs to a removed
20691 * device.
20692 *
20693 * Returns B_TRUE if the target node is in DEVI_DEVICE_REMOVED state,
20694 * B_FALSE otherwise.
20695 */
20696 static boolean_t
sata_check_device_removed(dev_info_t * tdip)20697 sata_check_device_removed(dev_info_t *tdip)
20698 {
20699 ASSERT(tdip != NULL);
20700
20701 if (DEVI_IS_DEVICE_REMOVED(tdip))
20702 return (B_TRUE);
20703 else
20704 return (B_FALSE);
20705 }
20706
20707
20708 /*
20709 * Check for DMA error. Return B_TRUE if error, B_FALSE otherwise.
20710 */
20711 static boolean_t
sata_check_for_dma_error(dev_info_t * dip,sata_pkt_txlate_t * spx)20712 sata_check_for_dma_error(dev_info_t *dip, sata_pkt_txlate_t *spx)
20713 {
20714 int fm_capability = ddi_fm_capable(dip);
20715 ddi_fm_error_t de;
20716
20717 if (fm_capability & DDI_FM_DMACHK_CAPABLE) {
20718 if (spx->txlt_buf_dma_handle != NULL) {
20719 ddi_fm_dma_err_get(spx->txlt_buf_dma_handle, &de,
20720 DDI_FME_VERSION);
20721 if (de.fme_status != DDI_SUCCESS)
20722 return (B_TRUE);
20723 }
20724 }
20725 return (B_FALSE);
20726 }
20727
20728
20729 /* ************************ FAULT INJECTTION **************************** */
20730
20731 #ifdef SATA_INJECT_FAULTS
20732
20733 static uint32_t sata_fault_count = 0;
20734 static uint32_t sata_fault_suspend_count = 0;
20735
20736 /*
20737 * Inject sata pkt fault
20738 * It modifies returned values of the sata packet.
20739 * It returns immediately if:
20740 * pkt fault injection is not enabled (via sata_inject_fault,
20741 * sata_inject_fault_count), or invalid fault is specified (sata_fault_type),
20742 * or pkt does not contain command to be faulted (set in sata_fault_cmd), or
20743 * pkt is not directed to specified fault controller/device
20744 * (sata_fault_ctrl_dev and sata_fault_device).
20745 * If fault controller is not specified, fault injection applies to all
20746 * controllers and devices.
20747 *
20748 * First argument is the pointer to the executed sata packet.
20749 * Second argument is a pointer to a value returned by the HBA tran_start
20750 * function.
20751 * Third argument specifies injected error. Injected sata packet faults
20752 * are the satapkt_reason values.
20753 * SATA_PKT_BUSY -1 Not completed, busy
20754 * SATA_PKT_DEV_ERROR 1 Device reported error
20755 * SATA_PKT_QUEUE_FULL 2 Not accepted, queue full
20756 * SATA_PKT_PORT_ERROR 3 Not completed, port error
20757 * SATA_PKT_CMD_UNSUPPORTED 4 Cmd unsupported
20758 * SATA_PKT_ABORTED 5 Aborted by request
20759 * SATA_PKT_TIMEOUT 6 Operation timeut
20760 * SATA_PKT_RESET 7 Aborted by reset request
20761 *
20762 * Additional global variables affecting the execution:
20763 *
20764 * sata_inject_fault_count variable specifies number of times in row the
20765 * error is injected. Value of -1 specifies permanent fault, ie. every time
20766 * the fault injection point is reached, the fault is injected and a pause
20767 * between fault injection specified by sata_inject_fault_pause_count is
20768 * ignored). Fault injection routine decrements sata_inject_fault_count
20769 * (if greater than zero) until it reaches 0. No fault is injected when
20770 * sata_inject_fault_count is 0 (zero).
20771 *
20772 * sata_inject_fault_pause_count variable specifies number of times a fault
20773 * injection is bypassed (pause between fault injections).
20774 * If set to 0, a fault is injected only a number of times specified by
20775 * sata_inject_fault_count.
20776 *
20777 * The fault counts are static, so for periodic errors they have to be manually
20778 * reset to start repetition sequence from scratch.
20779 * If the original value returned by the HBA tran_start function is not
20780 * SATA_TRAN_ACCEPTED and pkt reason is not SATA_PKT_COMPLETED, no error
20781 * is injected (to avoid masking real problems);
20782 *
20783 * NOTE: In its current incarnation, this function should be invoked only for
20784 * commands executed in SYNCHRONOUS mode.
20785 */
20786
20787
20788 static void
sata_inject_pkt_fault(sata_pkt_t * spkt,int * rval,int fault)20789 sata_inject_pkt_fault(sata_pkt_t *spkt, int *rval, int fault)
20790 {
20791
20792 if (sata_inject_fault != SATA_INJECT_PKT_FAULT)
20793 return;
20794
20795 if (sata_inject_fault_count == 0)
20796 return;
20797
20798 if (fault == 0)
20799 return;
20800
20801 if (sata_fault_cmd != spkt->satapkt_cmd.satacmd_cmd_reg)
20802 return;
20803
20804 if (sata_fault_ctrl != NULL) {
20805 sata_pkt_txlate_t *spx =
20806 (sata_pkt_txlate_t *)spkt->satapkt_framework_private;
20807
20808 if (sata_fault_ctrl != NULL && sata_fault_ctrl !=
20809 spx->txlt_sata_hba_inst->satahba_dip)
20810 return;
20811
20812 if (sata_fault_device.satadev_addr.cport !=
20813 spkt->satapkt_device.satadev_addr.cport ||
20814 sata_fault_device.satadev_addr.pmport !=
20815 spkt->satapkt_device.satadev_addr.pmport ||
20816 sata_fault_device.satadev_addr.qual !=
20817 spkt->satapkt_device.satadev_addr.qual)
20818 return;
20819 }
20820
20821 /* Modify pkt return parameters */
20822 if (*rval != SATA_TRAN_ACCEPTED ||
20823 spkt->satapkt_reason != SATA_PKT_COMPLETED) {
20824 sata_fault_count = 0;
20825 sata_fault_suspend_count = 0;
20826 return;
20827 }
20828 if (sata_fault_count == 0 && sata_fault_suspend_count != 0) {
20829 /* Pause in the injection */
20830 sata_fault_suspend_count -= 1;
20831 return;
20832 }
20833
20834 if (sata_fault_count == 0 && sata_fault_suspend_count == 0) {
20835 /*
20836 * Init inject fault cycle. If fault count is set to -1,
20837 * it is a permanent fault.
20838 */
20839 if (sata_inject_fault_count != -1) {
20840 sata_fault_count = sata_inject_fault_count;
20841 sata_fault_suspend_count =
20842 sata_inject_fault_pause_count;
20843 if (sata_fault_suspend_count == 0)
20844 sata_inject_fault_count = 0;
20845 }
20846 }
20847
20848 if (sata_fault_count != 0)
20849 sata_fault_count -= 1;
20850
20851 switch (fault) {
20852 case SATA_PKT_BUSY:
20853 *rval = SATA_TRAN_BUSY;
20854 spkt->satapkt_reason = SATA_PKT_BUSY;
20855 break;
20856
20857 case SATA_PKT_QUEUE_FULL:
20858 *rval = SATA_TRAN_QUEUE_FULL;
20859 spkt->satapkt_reason = SATA_PKT_QUEUE_FULL;
20860 break;
20861
20862 case SATA_PKT_CMD_UNSUPPORTED:
20863 *rval = SATA_TRAN_CMD_UNSUPPORTED;
20864 spkt->satapkt_reason = SATA_PKT_CMD_UNSUPPORTED;
20865 break;
20866
20867 case SATA_PKT_PORT_ERROR:
20868 /* This is "rejected" command */
20869 *rval = SATA_TRAN_PORT_ERROR;
20870 spkt->satapkt_reason = SATA_PKT_PORT_ERROR;
20871 /* Additional error setup could be done here - port state */
20872 break;
20873
20874 case SATA_PKT_DEV_ERROR:
20875 spkt->satapkt_reason = SATA_PKT_DEV_ERROR;
20876 /*
20877 * Additional error setup could be done here
20878 */
20879 break;
20880
20881 case SATA_PKT_ABORTED:
20882 spkt->satapkt_reason = SATA_PKT_ABORTED;
20883 break;
20884
20885 case SATA_PKT_TIMEOUT:
20886 spkt->satapkt_reason = SATA_PKT_TIMEOUT;
20887 /* Additional error setup could be done here */
20888 break;
20889
20890 case SATA_PKT_RESET:
20891 spkt->satapkt_reason = SATA_PKT_RESET;
20892 /*
20893 * Additional error setup could be done here - device reset
20894 */
20895 break;
20896
20897 default:
20898 break;
20899 }
20900 }
20901
20902 #endif
20903
20904 /*
20905 * SATA Trace Ring Buffer
20906 * ----------------------
20907 *
20908 * Overview
20909 *
20910 * The SATA trace ring buffer is a ring buffer created and managed by
20911 * the SATA framework module that can be used by any module or driver
20912 * within the SATA framework to store debug messages.
20913 *
20914 * Ring Buffer Interfaces:
20915 *
20916 * sata_vtrace_debug() <-- Adds debug message to ring buffer
20917 * sata_trace_debug() <-- Wraps varargs into sata_vtrace_debug()
20918 *
20919 * Note that the sata_trace_debug() interface was created to give
20920 * consumers the flexibilty of sending debug messages to ring buffer
20921 * as variable arguments. Consumers can send type va_list debug
20922 * messages directly to sata_vtrace_debug(). The sata_trace_debug()
20923 * and sata_vtrace_debug() relationship is similar to that of
20924 * cmn_err(9F) and vcmn_err(9F).
20925 *
20926 * Below is a diagram of the SATA trace ring buffer interfaces and
20927 * sample consumers:
20928 *
20929 * +---------------------------------+
20930 * | o o SATA Framework Module |
20931 * | o SATA o +------------------+ +------------------+
20932 * |o Trace o <--|sata_vtrace_debug/|<-----|SATA HBA Driver #1|
20933 * |o R-Buf o |sata_trace_debug |<--+ +------------------+
20934 * | o o +------------------+ | +------------------+
20935 * | o o ^ | +--|SATA HBA Driver #2|
20936 * | | | +------------------+
20937 * | +------------------+ |
20938 * | |SATA Debug Message| |
20939 * | +------------------+ |
20940 * +---------------------------------+
20941 *
20942 * Supporting Routines:
20943 *
20944 * sata_trace_rbuf_alloc() <-- Initializes ring buffer
20945 * sata_trace_rbuf_free() <-- Destroys ring buffer
20946 * sata_trace_dmsg_alloc() <-- Creates or reuses buffer in ring buffer
20947 * sata_trace_dmsg_free() <-- Destroys content of ring buffer
20948 *
20949 * The default SATA trace ring buffer size is defined by DMSG_RING_SIZE.
20950 * The ring buffer size can be adjusted by setting dmsg_ring_size in
20951 * /etc/system to desired size in unit of bytes.
20952 *
20953 * The individual debug message size in the ring buffer is restricted
20954 * to DMSG_BUF_SIZE.
20955 */
20956 void
sata_vtrace_debug(dev_info_t * dip,const char * fmt,va_list ap)20957 sata_vtrace_debug(dev_info_t *dip, const char *fmt, va_list ap)
20958 {
20959 sata_trace_dmsg_t *dmsg;
20960
20961 if (sata_debug_rbuf == NULL) {
20962 return;
20963 }
20964
20965 /*
20966 * If max size of ring buffer is smaller than size
20967 * required for one debug message then just return
20968 * since we have no room for the debug message.
20969 */
20970 if (sata_debug_rbuf->maxsize < (sizeof (sata_trace_dmsg_t))) {
20971 return;
20972 }
20973
20974 mutex_enter(&sata_debug_rbuf->lock);
20975
20976 /* alloc or reuse on ring buffer */
20977 dmsg = sata_trace_dmsg_alloc();
20978
20979 if (dmsg == NULL) {
20980 /* resource allocation failed */
20981 mutex_exit(&sata_debug_rbuf->lock);
20982 return;
20983 }
20984
20985 dmsg->dip = dip;
20986 gethrestime(&dmsg->timestamp);
20987
20988 (void) vsnprintf(dmsg->buf, sizeof (dmsg->buf), fmt, ap);
20989
20990 mutex_exit(&sata_debug_rbuf->lock);
20991 }
20992
20993 void
sata_trace_debug(dev_info_t * dip,const char * fmt,...)20994 sata_trace_debug(dev_info_t *dip, const char *fmt, ...)
20995 {
20996 va_list ap;
20997
20998 va_start(ap, fmt);
20999 sata_vtrace_debug(dip, fmt, ap);
21000 va_end(ap);
21001 }
21002
21003 /*
21004 * This routine is used to manage debug messages
21005 * on ring buffer.
21006 */
21007 static sata_trace_dmsg_t *
sata_trace_dmsg_alloc(void)21008 sata_trace_dmsg_alloc(void)
21009 {
21010 sata_trace_dmsg_t *dmsg_alloc, *dmsg = sata_debug_rbuf->dmsgp;
21011
21012 if (sata_debug_rbuf->looped == TRUE) {
21013 sata_debug_rbuf->dmsgp = dmsg->next;
21014 return (sata_debug_rbuf->dmsgp);
21015 }
21016
21017 /*
21018 * If we're looping for the first time,
21019 * connect the ring.
21020 */
21021 if (((sata_debug_rbuf->size + (sizeof (sata_trace_dmsg_t))) >
21022 sata_debug_rbuf->maxsize) && (sata_debug_rbuf->dmsgh != NULL)) {
21023 dmsg->next = sata_debug_rbuf->dmsgh;
21024 sata_debug_rbuf->dmsgp = sata_debug_rbuf->dmsgh;
21025 sata_debug_rbuf->looped = TRUE;
21026 return (sata_debug_rbuf->dmsgp);
21027 }
21028
21029 /* If we've gotten this far then memory allocation is needed */
21030 dmsg_alloc = kmem_zalloc(sizeof (sata_trace_dmsg_t), KM_NOSLEEP);
21031 if (dmsg_alloc == NULL) {
21032 sata_debug_rbuf->allocfailed++;
21033 return (dmsg_alloc);
21034 } else {
21035 sata_debug_rbuf->size += sizeof (sata_trace_dmsg_t);
21036 }
21037
21038 if (sata_debug_rbuf->dmsgp != NULL) {
21039 dmsg->next = dmsg_alloc;
21040 sata_debug_rbuf->dmsgp = dmsg->next;
21041 return (sata_debug_rbuf->dmsgp);
21042 } else {
21043 /*
21044 * We should only be here if we're initializing
21045 * the ring buffer.
21046 */
21047 if (sata_debug_rbuf->dmsgh == NULL) {
21048 sata_debug_rbuf->dmsgh = dmsg_alloc;
21049 } else {
21050 /* Something is wrong */
21051 kmem_free(dmsg_alloc, sizeof (sata_trace_dmsg_t));
21052 return (NULL);
21053 }
21054
21055 sata_debug_rbuf->dmsgp = dmsg_alloc;
21056 return (sata_debug_rbuf->dmsgp);
21057 }
21058 }
21059
21060
21061 /*
21062 * Free all messages on debug ring buffer.
21063 */
21064 static void
sata_trace_dmsg_free(void)21065 sata_trace_dmsg_free(void)
21066 {
21067 sata_trace_dmsg_t *dmsg_next, *dmsg = sata_debug_rbuf->dmsgh;
21068
21069 while (dmsg != NULL) {
21070 dmsg_next = dmsg->next;
21071 kmem_free(dmsg, sizeof (sata_trace_dmsg_t));
21072
21073 /*
21074 * If we've looped around the ring than we're done.
21075 */
21076 if (dmsg_next == sata_debug_rbuf->dmsgh) {
21077 break;
21078 } else {
21079 dmsg = dmsg_next;
21080 }
21081 }
21082 }
21083
21084
21085 /*
21086 * This function can block
21087 */
21088 static void
sata_trace_rbuf_alloc(void)21089 sata_trace_rbuf_alloc(void)
21090 {
21091 sata_debug_rbuf = kmem_zalloc(sizeof (sata_trace_rbuf_t), KM_SLEEP);
21092
21093 mutex_init(&sata_debug_rbuf->lock, NULL, MUTEX_DRIVER, NULL);
21094
21095 if (dmsg_ring_size > 0) {
21096 sata_debug_rbuf->maxsize = (size_t)dmsg_ring_size;
21097 }
21098 }
21099
21100
21101 static void
sata_trace_rbuf_free(void)21102 sata_trace_rbuf_free(void)
21103 {
21104 sata_trace_dmsg_free();
21105 mutex_destroy(&sata_debug_rbuf->lock);
21106 kmem_free(sata_debug_rbuf, sizeof (sata_trace_rbuf_t));
21107 }
21108
21109 /*
21110 * If SATA_DEBUG is not defined then this routine is called instead
21111 * of sata_log() via the SATA_LOG_D macro.
21112 */
21113 static void
sata_trace_log(sata_hba_inst_t * sata_hba_inst,uint_t level,const char * fmt,...)21114 sata_trace_log(sata_hba_inst_t *sata_hba_inst, uint_t level,
21115 const char *fmt, ...)
21116 {
21117 #ifndef __lock_lint
21118 _NOTE(ARGUNUSED(level))
21119 #endif
21120
21121 dev_info_t *dip = NULL;
21122 va_list ap;
21123
21124 if (sata_hba_inst != NULL) {
21125 dip = SATA_DIP(sata_hba_inst);
21126 }
21127
21128 va_start(ap, fmt);
21129 sata_vtrace_debug(dip, fmt, ap);
21130 va_end(ap);
21131 }
21132