Print this page
MFV: illumos-gate@fd6d41c5025e9fb45a115fc82d86e9983d1e9fd6
9815 Want basic AHCI enclosure services
Reviewed by: Patrick Mooney <patrick.mooney@joyent.com>
Reviewed by: Rob Johnston <rob.johnston@joyent.com>
Reviewed by: Yuri Pankov <yuripv@yuripv.net>
Approved by: Dan McDonald <danmcd@joyent.com>
Author: Robert Mustacchi <rm@joyent.com>
Conflicts:
usr/src/cmd/Makefile
NEX-5834 panic in sata module while running trim
Reviewed by: Dan Fields <dan.fields@nexenta.com>
Reviewed by: Roman Strashkin <roman.strashkin@nexenta.com>
NEX-4418 SATA inquiry property generation doesn't work as advertised
Reviewed by: Dan McDonald <danmcd@omniti.com>
Reviewed by: Garrett D'Amore <garrett@damore.org>
Reviewed by: Josef 'Jeff' Sipek <josef.sipek@nexenta.com>
1787 SATL fails to handle returned SMART sense data
Reviewed by: Richard Elling <richard.elling@richardelling.com>
Reviewed by: Saso Kiselkov <skiselkov.ml@gmail.com>
Reviewed by: Garrett D'Amore <garrett@damore.org>
Approved by: Robert Mustacchi <rm@joyent.com>
re #12164 Marvell 88SE9128: Appliance hard hangs on boot probing duplicated ahci device
| Split |
Close |
| Expand all |
| Collapse all |
--- old/usr/src/uts/common/io/sata/impl/sata.c
+++ new/usr/src/uts/common/io/sata/impl/sata.c
1 1 /*
2 2 * CDDL HEADER START
3 3 *
4 4 * The contents of this file are subject to the terms of the
5 5 * Common Development and Distribution License (the "License").
6 6 * You may not use this file except in compliance with the License.
7 7 *
8 8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9 9 * or http://www.opensolaris.org/os/licensing.
10 10 * See the License for the specific language governing permissions
11 11 * and limitations under the License.
12 12 *
13 13 * When distributing Covered Code, include this CDDL HEADER in each
|
↓ open down ↓ |
13 lines elided |
↑ open up ↑ |
14 14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15 15 * If applicable, add the following below this CDDL HEADER, with the
16 16 * fields enclosed by brackets "[]" replaced with your own identifying
17 17 * information: Portions Copyright [yyyy] [name of copyright owner]
18 18 *
19 19 * CDDL HEADER END
20 20 */
21 21
22 22 /*
23 23 * Copyright (c) 2006, 2010, Oracle and/or its affiliates. All rights reserved.
24 - */
25 -/*
26 - * Copyright 2015 Nexenta Systems, Inc. All rights reserved.
24 + * Copyright 2016 Nexenta Systems, Inc.
27 25 * Copyright 2016 Argo Technologies SA
26 + * Copyright (c) 2018, Joyent, Inc.
28 27 */
29 28
30 29 /*
31 30 * SATA Framework
32 31 * Generic SATA Host Adapter Implementation
33 32 */
34 33
35 34 #include <sys/conf.h>
36 35 #include <sys/file.h>
37 36 #include <sys/ddi.h>
38 37 #include <sys/sunddi.h>
39 38 #include <sys/modctl.h>
40 39 #include <sys/cmn_err.h>
41 40 #include <sys/errno.h>
42 41 #include <sys/thread.h>
43 42 #include <sys/kstat.h>
44 43 #include <sys/note.h>
45 44 #include <sys/sysevent.h>
46 45 #include <sys/sysevent/eventdefs.h>
47 46 #include <sys/sysevent/dr.h>
48 47 #include <sys/taskq.h>
49 48 #include <sys/disp.h>
50 49 #include <sys/sdt.h>
51 50
52 51 #include <sys/sata/impl/sata.h>
53 52 #include <sys/sata/sata_hba.h>
54 53 #include <sys/sata/sata_defs.h>
55 54 #include <sys/sata/sata_cfgadm.h>
56 55 #include <sys/sata/sata_blacklist.h>
57 56 #include <sys/sata/sata_satl.h>
58 57
59 58 #include <sys/scsi/impl/spc3_types.h>
60 59
61 60 /*
62 61 * FMA header files
63 62 */
64 63 #include <sys/ddifm.h>
65 64 #include <sys/fm/protocol.h>
66 65 #include <sys/fm/util.h>
67 66 #include <sys/fm/io/ddi.h>
68 67
69 68 /* Debug flags - defined in sata.h */
70 69 int sata_debug_flags = 0;
71 70 int sata_msg = 0;
72 71
73 72 /*
74 73 * Flags enabling selected SATA HBA framework functionality
75 74 */
76 75 #define SATA_ENABLE_QUEUING 1
77 76 #define SATA_ENABLE_NCQ 2
78 77 #define SATA_ENABLE_PROCESS_EVENTS 4
79 78 #define SATA_ENABLE_PMULT_FBS 8 /* FIS-Based Switching */
80 79 int sata_func_enable =
81 80 SATA_ENABLE_PROCESS_EVENTS | SATA_ENABLE_QUEUING | SATA_ENABLE_NCQ;
82 81
83 82 /*
84 83 * Global variable setting default maximum queue depth (NCQ or TCQ)
85 84 * Note:minimum queue depth is 1
86 85 */
87 86 int sata_max_queue_depth = SATA_MAX_QUEUE_DEPTH; /* max NCQ/TCQ queue depth */
88 87
89 88 /*
90 89 * Currently used default NCQ/TCQ queue depth. It is set-up during the driver
91 90 * initialization, using value from sata_max_queue_depth
92 91 * It is adjusted to minimum supported by the controller and by the device,
93 92 * if queueing is enabled.
94 93 */
95 94 static int sata_current_max_qdepth;
96 95
97 96 /*
98 97 * Global variable determining the default behavior after device hotpluggin.
99 98 * If non-zero, the hotplugged device is onlined (if possible) without explicit
100 99 * IOCTL request (AP_CONFIGURE).
101 100 * If zero, hotplugged device is identified, but not onlined.
102 101 * Enabling (AP_CONNECT) device port with an attached device does not result
103 102 * in device onlining regardless of the flag setting
104 103 */
105 104 int sata_auto_online = 0;
106 105
107 106 #ifdef SATA_DEBUG
108 107
109 108 #define SATA_LOG_D(args) sata_log args
110 109 uint64_t mbuf_count = 0;
111 110 uint64_t mbuffail_count = 0;
112 111
113 112 sata_atapi_cmd_t sata_atapi_trace[64];
114 113 uint32_t sata_atapi_trace_index = 0;
115 114 int sata_atapi_trace_save = 1;
116 115 static void sata_save_atapi_trace(sata_pkt_txlate_t *, int);
117 116 #define SATAATAPITRACE(spx, count) if (sata_atapi_trace_save) \
118 117 sata_save_atapi_trace(spx, count);
119 118
120 119 #else
121 120 #define SATA_LOG_D(args) sata_trace_log args
122 121 #define SATAATAPITRACE(spx, count)
123 122 #endif
124 123
125 124 #if 0
126 125 static void
127 126 sata_test_atapi_packet_command(sata_hba_inst_t *, int);
128 127 #endif
129 128
130 129 #ifdef SATA_INJECT_FAULTS
131 130
132 131 #define SATA_INJECT_PKT_FAULT 1
133 132 uint32_t sata_inject_fault = 0;
134 133
135 134 uint32_t sata_inject_fault_count = 0;
136 135 uint32_t sata_inject_fault_pause_count = 0;
137 136 uint32_t sata_fault_type = 0;
138 137 uint32_t sata_fault_cmd = 0;
139 138 dev_info_t *sata_fault_ctrl = NULL;
140 139 sata_device_t sata_fault_device;
141 140
142 141 static void sata_inject_pkt_fault(sata_pkt_t *, int *, int);
143 142
144 143 #endif
145 144
146 145 #define LEGACY_HWID_LEN 64 /* Model (40) + Serial (20) + pad */
147 146
148 147 static char sata_rev_tag[] = {"1.46"};
149 148
150 149 /*
151 150 * SATA cb_ops functions
152 151 */
153 152 static int sata_hba_open(dev_t *, int, int, cred_t *);
154 153 static int sata_hba_close(dev_t, int, int, cred_t *);
155 154 static int sata_hba_ioctl(dev_t, int, intptr_t, int, cred_t *, int *);
156 155
157 156 /*
158 157 * SCSA required entry points
159 158 */
160 159 static int sata_scsi_tgt_init(dev_info_t *, dev_info_t *,
161 160 scsi_hba_tran_t *, struct scsi_device *);
162 161 static int sata_scsi_tgt_probe(struct scsi_device *,
163 162 int (*callback)(void));
164 163 static void sata_scsi_tgt_free(dev_info_t *, dev_info_t *,
165 164 scsi_hba_tran_t *, struct scsi_device *);
166 165 static int sata_scsi_start(struct scsi_address *, struct scsi_pkt *);
167 166 static int sata_scsi_abort(struct scsi_address *, struct scsi_pkt *);
168 167 static int sata_scsi_reset(struct scsi_address *, int);
169 168 static int sata_scsi_getcap(struct scsi_address *, char *, int);
170 169 static int sata_scsi_setcap(struct scsi_address *, char *, int, int);
171 170 static struct scsi_pkt *sata_scsi_init_pkt(struct scsi_address *,
172 171 struct scsi_pkt *, struct buf *, int, int, int, int, int (*)(caddr_t),
173 172 caddr_t);
174 173 static void sata_scsi_destroy_pkt(struct scsi_address *, struct scsi_pkt *);
175 174 static void sata_scsi_dmafree(struct scsi_address *, struct scsi_pkt *);
176 175 static void sata_scsi_sync_pkt(struct scsi_address *, struct scsi_pkt *);
177 176
178 177 /*
179 178 * SATA HBA interface functions are defined in sata_hba.h header file
180 179 */
181 180
182 181 /* Event processing functions */
183 182 static void sata_event_daemon(void *);
184 183 static void sata_event_thread_control(int);
185 184 static void sata_process_controller_events(sata_hba_inst_t *sata_hba_inst);
186 185 static void sata_process_pmult_events(sata_hba_inst_t *, uint8_t);
187 186 static void sata_process_device_reset(sata_hba_inst_t *, sata_address_t *);
188 187 static void sata_process_pmdevice_reset(sata_hba_inst_t *, sata_address_t *);
189 188 static void sata_process_port_failed_event(sata_hba_inst_t *,
190 189 sata_address_t *);
191 190 static void sata_process_port_link_events(sata_hba_inst_t *,
192 191 sata_address_t *);
193 192 static void sata_process_pmport_link_events(sata_hba_inst_t *,
194 193 sata_address_t *);
195 194 static void sata_process_device_detached(sata_hba_inst_t *, sata_address_t *);
196 195 static void sata_process_pmdevice_detached(sata_hba_inst_t *,
197 196 sata_address_t *);
198 197 static void sata_process_device_attached(sata_hba_inst_t *, sata_address_t *);
199 198 static void sata_process_pmdevice_attached(sata_hba_inst_t *,
200 199 sata_address_t *);
201 200 static void sata_process_port_pwr_change(sata_hba_inst_t *, sata_address_t *);
202 201 static void sata_process_cntrl_pwr_level_change(sata_hba_inst_t *);
203 202 static void sata_process_target_node_cleanup(sata_hba_inst_t *,
204 203 sata_address_t *);
205 204 static void sata_process_device_autoonline(sata_hba_inst_t *,
206 205 sata_address_t *saddr);
207 206
208 207 /*
209 208 * Local translation functions
210 209 */
211 210 static int sata_txlt_inquiry(sata_pkt_txlate_t *);
212 211 static int sata_txlt_test_unit_ready(sata_pkt_txlate_t *);
213 212 static int sata_txlt_start_stop_unit(sata_pkt_txlate_t *);
214 213 static int sata_txlt_read_capacity(sata_pkt_txlate_t *);
215 214 static int sata_txlt_read_capacity16(sata_pkt_txlate_t *);
216 215 static int sata_txlt_unmap(sata_pkt_txlate_t *);
217 216 static int sata_txlt_request_sense(sata_pkt_txlate_t *);
218 217 static int sata_txlt_read(sata_pkt_txlate_t *);
219 218 static int sata_txlt_write(sata_pkt_txlate_t *);
220 219 static int sata_txlt_log_sense(sata_pkt_txlate_t *);
221 220 static int sata_txlt_log_select(sata_pkt_txlate_t *);
222 221 static int sata_txlt_mode_sense(sata_pkt_txlate_t *);
223 222 static int sata_txlt_mode_select(sata_pkt_txlate_t *);
224 223 static int sata_txlt_ata_pass_thru(sata_pkt_txlate_t *);
225 224 static int sata_txlt_synchronize_cache(sata_pkt_txlate_t *);
226 225 static int sata_txlt_write_buffer(sata_pkt_txlate_t *);
227 226 static int sata_txlt_nodata_cmd_immediate(sata_pkt_txlate_t *);
228 227
229 228 static int sata_hba_start(sata_pkt_txlate_t *, int *);
230 229 static int sata_txlt_invalid_command(sata_pkt_txlate_t *);
231 230 static int sata_txlt_check_condition(sata_pkt_txlate_t *, uchar_t, uchar_t);
232 231 static int sata_txlt_lba_out_of_range(sata_pkt_txlate_t *);
233 232 static int sata_txlt_ata_pass_thru_illegal_cmd(sata_pkt_txlate_t *);
234 233 static int sata_txlt_unmap_nodata_cmd(sata_pkt_txlate_t *);
235 234 static void sata_txlt_rw_completion(sata_pkt_t *);
236 235 static void sata_txlt_nodata_cmd_completion(sata_pkt_t *);
237 236 static void sata_txlt_apt_completion(sata_pkt_t *sata_pkt);
238 237 static void sata_txlt_unmap_completion(sata_pkt_t *sata_pkt);
239 238 static void sata_txlt_download_mcode_cmd_completion(sata_pkt_t *);
240 239 static int sata_emul_rw_completion(sata_pkt_txlate_t *);
241 240 static void sata_fill_ata_return_desc(sata_pkt_t *, uint8_t, uint8_t,
242 241 uint8_t);
243 242 static struct scsi_extended_sense *sata_immediate_error_response(
244 243 sata_pkt_txlate_t *, int);
245 244 static struct scsi_extended_sense *sata_arq_sense(sata_pkt_txlate_t *);
246 245
247 246 static int sata_txlt_atapi(sata_pkt_txlate_t *);
248 247 static void sata_txlt_atapi_completion(sata_pkt_t *);
249 248
250 249 /*
251 250 * Local functions for ioctl
252 251 */
253 252 static int32_t sata_get_port_num(sata_hba_inst_t *, struct devctl_iocdata *);
254 253 static void sata_cfgadm_state(sata_hba_inst_t *, int32_t,
255 254 devctl_ap_state_t *);
256 255 static dev_info_t *sata_get_target_dip(dev_info_t *, uint8_t, uint8_t);
257 256 static dev_info_t *sata_get_scsi_target_dip(dev_info_t *, sata_address_t *);
258 257 static dev_info_t *sata_devt_to_devinfo(dev_t);
259 258 static int sata_ioctl_connect(sata_hba_inst_t *, sata_device_t *);
260 259 static int sata_ioctl_disconnect(sata_hba_inst_t *, sata_device_t *);
261 260 static int sata_ioctl_configure(sata_hba_inst_t *, sata_device_t *);
262 261 static int sata_ioctl_unconfigure(sata_hba_inst_t *, sata_device_t *);
263 262 static int sata_ioctl_activate(sata_hba_inst_t *, sata_device_t *);
264 263 static int sata_ioctl_deactivate(sata_hba_inst_t *, sata_device_t *);
265 264 static int sata_ioctl_reset_port(sata_hba_inst_t *, sata_device_t *);
266 265 static int sata_ioctl_reset_device(sata_hba_inst_t *, sata_device_t *);
267 266 static int sata_ioctl_reset_all(sata_hba_inst_t *);
268 267 static int sata_ioctl_port_self_test(sata_hba_inst_t *, sata_device_t *);
269 268 static int sata_ioctl_get_device_path(sata_hba_inst_t *, sata_device_t *,
270 269 sata_ioctl_data_t *, int mode);
271 270 static int sata_ioctl_get_ap_type(sata_hba_inst_t *, sata_device_t *,
272 271 sata_ioctl_data_t *, int mode);
273 272 static int sata_ioctl_get_model_info(sata_hba_inst_t *, sata_device_t *,
274 273 sata_ioctl_data_t *, int mode);
275 274 static int sata_ioctl_get_revfirmware_info(sata_hba_inst_t *, sata_device_t *,
276 275 sata_ioctl_data_t *, int mode);
277 276 static int sata_ioctl_get_serialnumber_info(sata_hba_inst_t *,
278 277 sata_device_t *, sata_ioctl_data_t *, int mode);
279 278
280 279 /*
281 280 * Local functions
282 281 */
283 282 static void sata_remove_hba_instance(dev_info_t *);
284 283 static int sata_validate_sata_hba_tran(dev_info_t *, sata_hba_tran_t *);
285 284 static void sata_probe_ports(sata_hba_inst_t *);
286 285 static void sata_probe_pmports(sata_hba_inst_t *, uint8_t);
287 286 static int sata_reprobe_port(sata_hba_inst_t *, sata_device_t *, int);
288 287 static int sata_reprobe_pmult(sata_hba_inst_t *, sata_device_t *, int);
289 288 static int sata_reprobe_pmport(sata_hba_inst_t *, sata_device_t *, int);
290 289 static int sata_alloc_pmult(sata_hba_inst_t *, sata_device_t *);
291 290 static void sata_free_pmult(sata_hba_inst_t *, sata_device_t *);
292 291 static int sata_add_device(dev_info_t *, sata_hba_inst_t *, sata_device_t *);
293 292 static int sata_offline_device(sata_hba_inst_t *, sata_device_t *,
294 293 sata_drive_info_t *);
295 294 static dev_info_t *sata_create_target_node(dev_info_t *, sata_hba_inst_t *,
296 295 sata_address_t *);
297 296 static void sata_remove_target_node(sata_hba_inst_t *,
298 297 sata_address_t *);
299 298 static int sata_validate_scsi_address(sata_hba_inst_t *,
300 299 struct scsi_address *, sata_device_t *);
301 300 static int sata_validate_sata_address(sata_hba_inst_t *, int, int, int);
302 301 static sata_pkt_t *sata_pkt_alloc(sata_pkt_txlate_t *, int (*)(caddr_t));
303 302 static void sata_pkt_free(sata_pkt_txlate_t *);
304 303 static int sata_dma_buf_setup(sata_pkt_txlate_t *, int, int (*)(caddr_t),
305 304 caddr_t, ddi_dma_attr_t *);
306 305 static void sata_common_free_dma_rsrcs(sata_pkt_txlate_t *);
307 306 static int sata_probe_device(sata_hba_inst_t *, sata_device_t *);
308 307 static sata_drive_info_t *sata_get_device_info(sata_hba_inst_t *,
309 308 sata_device_t *);
310 309 static int sata_identify_device(sata_hba_inst_t *, sata_drive_info_t *);
311 310 static void sata_reidentify_device(sata_pkt_txlate_t *);
312 311 static struct buf *sata_alloc_local_buffer(sata_pkt_txlate_t *, int);
313 312 static void sata_free_local_buffer(sata_pkt_txlate_t *);
314 313 static uint64_t sata_check_capacity(sata_drive_info_t *);
315 314 void sata_adjust_dma_attr(sata_drive_info_t *, ddi_dma_attr_t *,
316 315 ddi_dma_attr_t *);
317 316 static int sata_fetch_device_identify_data(sata_hba_inst_t *,
318 317 sata_drive_info_t *);
319 318 static void sata_update_port_info(sata_hba_inst_t *, sata_device_t *);
320 319 static void sata_update_pmport_info(sata_hba_inst_t *, sata_device_t *);
321 320 static void sata_update_port_scr(sata_port_scr_t *, sata_device_t *);
322 321 static int sata_set_dma_mode(sata_hba_inst_t *, sata_drive_info_t *);
323 322 static int sata_set_cache_mode(sata_hba_inst_t *, sata_drive_info_t *, int);
324 323 static int sata_set_rmsn(sata_hba_inst_t *, sata_drive_info_t *, int);
325 324 static int sata_set_drive_features(sata_hba_inst_t *,
326 325 sata_drive_info_t *, int flag);
327 326 static void sata_init_write_cache_mode(sata_drive_info_t *sdinfo);
328 327 static int sata_initialize_device(sata_hba_inst_t *, sata_drive_info_t *);
329 328 static void sata_identdev_to_inquiry(sata_hba_inst_t *, sata_drive_info_t *,
330 329 uint8_t *);
331 330 static int sata_get_atapi_inquiry_data(sata_hba_inst_t *, sata_address_t *,
332 331 struct scsi_inquiry *);
333 332 static int sata_build_msense_page_1(sata_drive_info_t *, int, uint8_t *);
334 333 static int sata_build_msense_page_8(sata_drive_info_t *, int, uint8_t *);
335 334 static int sata_build_msense_page_1a(sata_drive_info_t *, int, uint8_t *);
336 335 static int sata_build_msense_page_1c(sata_drive_info_t *, int, uint8_t *);
337 336 static int sata_build_msense_page_30(sata_drive_info_t *, int, uint8_t *);
338 337 static int sata_mode_select_page_8(sata_pkt_txlate_t *,
339 338 struct mode_cache_scsi3 *, int, int *, int *, int *);
340 339 static int sata_mode_select_page_1a(sata_pkt_txlate_t *,
341 340 struct mode_info_power_cond *, int, int *, int *, int *);
342 341 static int sata_mode_select_page_1c(sata_pkt_txlate_t *,
343 342 struct mode_info_excpt_page *, int, int *, int *, int *);
344 343 static int sata_mode_select_page_30(sata_pkt_txlate_t *,
345 344 struct mode_acoustic_management *, int, int *, int *, int *);
346 345
347 346 static int sata_build_lsense_page_0(sata_drive_info_t *, uint8_t *);
348 347 static int sata_build_lsense_page_10(sata_drive_info_t *, uint8_t *,
349 348 sata_hba_inst_t *);
350 349 static int sata_build_lsense_page_2f(sata_drive_info_t *, uint8_t *,
351 350 sata_hba_inst_t *);
352 351 static int sata_build_lsense_page_30(sata_drive_info_t *, uint8_t *,
353 352 sata_hba_inst_t *);
354 353 static int sata_build_lsense_page_0e(sata_drive_info_t *, uint8_t *,
355 354 sata_pkt_txlate_t *);
356 355
357 356 static void sata_set_arq_data(sata_pkt_t *);
358 357 static void sata_build_read_verify_cmd(sata_cmd_t *, uint16_t, uint64_t);
359 358 static void sata_build_generic_cmd(sata_cmd_t *, uint8_t);
360 359 static uint8_t sata_get_standby_timer(uint8_t *timer);
361 360
362 361 static void sata_save_drive_settings(sata_drive_info_t *);
363 362 static void sata_show_drive_info(sata_hba_inst_t *, sata_drive_info_t *);
364 363 static void sata_show_pmult_info(sata_hba_inst_t *, sata_device_t *);
365 364 static void sata_log(sata_hba_inst_t *, uint_t, char *fmt, ...);
366 365 static void sata_trace_log(sata_hba_inst_t *, uint_t, const char *fmt, ...);
367 366 static int sata_fetch_smart_return_status(sata_hba_inst_t *,
368 367 sata_drive_info_t *);
369 368 static int sata_fetch_smart_data(sata_hba_inst_t *, sata_drive_info_t *,
370 369 struct smart_data *);
371 370 static int sata_smart_selftest_log(sata_hba_inst_t *,
372 371 sata_drive_info_t *,
373 372 struct smart_selftest_log *);
374 373 static int sata_ext_smart_selftest_read_log(sata_hba_inst_t *,
375 374 sata_drive_info_t *, struct smart_ext_selftest_log *, uint16_t);
376 375 static int sata_smart_read_log(sata_hba_inst_t *, sata_drive_info_t *,
377 376 uint8_t *, uint8_t, uint8_t);
378 377 static int sata_read_log_ext_directory(sata_hba_inst_t *, sata_drive_info_t *,
379 378 struct read_log_ext_directory *);
380 379 static void sata_gen_sysevent(sata_hba_inst_t *, sata_address_t *, int);
381 380 static void sata_xlate_errors(sata_pkt_txlate_t *);
382 381 static void sata_decode_device_error(sata_pkt_txlate_t *,
383 382 struct scsi_extended_sense *);
384 383 static void sata_set_device_removed(dev_info_t *);
385 384 static boolean_t sata_check_device_removed(dev_info_t *);
386 385 static void sata_set_target_node_cleanup(sata_hba_inst_t *, sata_address_t *);
387 386 static int sata_ncq_err_ret_cmd_setup(sata_pkt_txlate_t *,
388 387 sata_drive_info_t *);
389 388 static int sata_atapi_err_ret_cmd_setup(sata_pkt_txlate_t *,
390 389 sata_drive_info_t *);
391 390 static void sata_atapi_packet_cmd_setup(sata_cmd_t *, sata_drive_info_t *);
392 391 static void sata_fixed_sense_data_preset(struct scsi_extended_sense *);
393 392 static void sata_target_devid_register(dev_info_t *, sata_drive_info_t *);
394 393 static int sata_check_modser(char *, int);
395 394
396 395 /*
397 396 * FMA
398 397 */
399 398 static boolean_t sata_check_for_dma_error(dev_info_t *, sata_pkt_txlate_t *);
400 399
401 400
402 401 /*
403 402 * SATA Framework will ignore SATA HBA driver cb_ops structure and
404 403 * register following one with SCSA framework.
405 404 * Open & close are provided, so scsi framework will not use its own
406 405 */
407 406 static struct cb_ops sata_cb_ops = {
408 407 sata_hba_open, /* open */
409 408 sata_hba_close, /* close */
410 409 nodev, /* strategy */
411 410 nodev, /* print */
412 411 nodev, /* dump */
413 412 nodev, /* read */
414 413 nodev, /* write */
415 414 sata_hba_ioctl, /* ioctl */
416 415 nodev, /* devmap */
417 416 nodev, /* mmap */
418 417 nodev, /* segmap */
419 418 nochpoll, /* chpoll */
420 419 ddi_prop_op, /* cb_prop_op */
421 420 0, /* streamtab */
422 421 D_NEW | D_MP, /* cb_flag */
423 422 CB_REV, /* rev */
424 423 nodev, /* aread */
425 424 nodev /* awrite */
426 425 };
427 426
428 427
429 428 extern struct mod_ops mod_miscops;
430 429 extern uchar_t scsi_cdb_size[];
431 430
432 431 static struct modlmisc modlmisc = {
433 432 &mod_miscops, /* Type of module */
434 433 "SATA Module" /* module name */
435 434 };
436 435
437 436
438 437 static struct modlinkage modlinkage = {
439 438 MODREV_1,
440 439 (void *)&modlmisc,
441 440 NULL
442 441 };
443 442
444 443 /*
445 444 * Default sata pkt timeout. Used when a target driver scsi_pkt time is zero,
446 445 * i.e. when scsi_pkt has not timeout specified.
447 446 */
448 447 static int sata_default_pkt_time = 60; /* 60 seconds */
449 448
450 449 /*
451 450 * Intermediate buffer device access attributes - they are required,
452 451 * but not necessarily used.
453 452 */
454 453 static ddi_device_acc_attr_t sata_acc_attr = {
455 454 DDI_DEVICE_ATTR_V0,
456 455 DDI_STRUCTURE_LE_ACC,
457 456 DDI_STRICTORDER_ACC
458 457 };
459 458
460 459
461 460 /*
462 461 * Mutexes protecting structures in multithreaded operations.
463 462 * Because events are relatively rare, a single global mutex protecting
464 463 * data structures should be sufficient. To increase performance, add
465 464 * separate mutex per each sata port and use global mutex only to protect
466 465 * common data structures.
467 466 */
468 467 static kmutex_t sata_mutex; /* protects sata_hba_list */
469 468 static kmutex_t sata_log_mutex; /* protects log */
470 469
471 470 static char sata_log_buf[256];
472 471
473 472 /*
474 473 * sata trace debug
475 474 */
476 475 static sata_trace_rbuf_t *sata_debug_rbuf;
477 476 static sata_trace_dmsg_t *sata_trace_dmsg_alloc(void);
478 477 static void sata_trace_dmsg_free(void);
479 478 static void sata_trace_rbuf_alloc(void);
480 479 static void sata_trace_rbuf_free(void);
481 480
482 481 int dmsg_ring_size = DMSG_RING_SIZE;
483 482
484 483 /* Default write cache setting for SATA hard disks */
485 484 int sata_write_cache = 1; /* enabled */
486 485
487 486 /* Default write cache setting for SATA ATAPI CD/DVD */
488 487 int sata_atapicdvd_write_cache = 1; /* enabled */
489 488
490 489 /* Default write cache setting for SATA ATAPI tape */
491 490 int sata_atapitape_write_cache = 1; /* enabled */
492 491
493 492 /* Default write cache setting for SATA ATAPI disk */
494 493 int sata_atapidisk_write_cache = 1; /* enabled */
495 494
496 495 /*
497 496 * Linked list of HBA instances
498 497 */
499 498 static sata_hba_inst_t *sata_hba_list = NULL;
500 499 static sata_hba_inst_t *sata_hba_list_tail = NULL;
501 500 /*
502 501 * Pointer to per-instance SATA HBA soft structure is stored in sata_hba_tran
503 502 * structure and in sata soft state.
504 503 */
505 504
506 505 /*
507 506 * Event daemon related variables
508 507 */
509 508 static kmutex_t sata_event_mutex;
510 509 static kcondvar_t sata_event_cv;
511 510 static kthread_t *sata_event_thread = NULL;
512 511 static int sata_event_thread_terminate = 0;
513 512 static int sata_event_pending = 0;
514 513 static int sata_event_thread_active = 0;
515 514 extern pri_t minclsyspri;
516 515
517 516 /*
518 517 * NCQ error recovery command
519 518 */
520 519 static const sata_cmd_t sata_rle_cmd = {
521 520 SATA_CMD_REV,
522 521 NULL,
523 522 {
524 523 SATA_DIR_READ
525 524 },
526 525 ATA_ADDR_LBA48,
527 526 0,
528 527 0,
529 528 0,
530 529 0,
531 530 0,
532 531 1,
533 532 READ_LOG_EXT_NCQ_ERROR_RECOVERY,
534 533 0,
535 534 0,
536 535 0,
537 536 SATAC_READ_LOG_EXT,
538 537 0,
539 538 0,
540 539 0,
541 540 };
542 541
543 542 /*
544 543 * ATAPI error recovery CDB
545 544 */
546 545 static const uint8_t sata_rqsense_cdb[SATA_ATAPI_RQSENSE_CDB_LEN] = {
547 546 SCMD_REQUEST_SENSE,
548 547 0, /* Only fixed RQ format is supported */
549 548 0,
550 549 0,
551 550 SATA_ATAPI_MIN_RQSENSE_LEN, /* Less data may be returned */
552 551 0
553 552 };
554 553
555 554
556 555 /* Warlock directives */
557 556
558 557 _NOTE(SCHEME_PROTECTS_DATA("No Mutex Needed", scsi_hba_tran))
559 558 _NOTE(SCHEME_PROTECTS_DATA("No Mutex Needed", scsi_device))
560 559 _NOTE(SCHEME_PROTECTS_DATA("No Mutex Needed", dev_ops))
561 560 _NOTE(SCHEME_PROTECTS_DATA("No Mutex Needed", scsi_extended_sense))
562 561 _NOTE(SCHEME_PROTECTS_DATA("No Mutex Needed", scsi_arq_status))
563 562 _NOTE(SCHEME_PROTECTS_DATA("No Mutex Needed", ddi_dma_attr))
564 563 _NOTE(SCHEME_PROTECTS_DATA("No Mutex Needed", ddi_dma_cookie_t))
565 564 _NOTE(SCHEME_PROTECTS_DATA("No Mutex Needed", devctl_ap_state))
566 565 _NOTE(SCHEME_PROTECTS_DATA("No Mutex Needed", dev_info::devi_state))
567 566 _NOTE(MUTEX_PROTECTS_DATA(sata_mutex, sata_hba_list))
568 567 _NOTE(DATA_READABLE_WITHOUT_LOCK(sata_hba_list))
569 568 _NOTE(MUTEX_PROTECTS_DATA(sata_mutex, sata_hba_inst::satahba_next))
570 569 _NOTE(MUTEX_PROTECTS_DATA(sata_mutex, sata_hba_inst::satahba_prev))
571 570 _NOTE(SCHEME_PROTECTS_DATA("No Mutex Needed", \
572 571 sata_hba_inst::satahba_scsi_tran))
573 572 _NOTE(SCHEME_PROTECTS_DATA("No Mutex Needed", sata_hba_inst::satahba_tran))
574 573 _NOTE(SCHEME_PROTECTS_DATA("No Mutex Needed", sata_hba_inst::satahba_dip))
575 574 _NOTE(SCHEME_PROTECTS_DATA("Scheme", sata_hba_inst::satahba_attached))
576 575 _NOTE(DATA_READABLE_WITHOUT_LOCK(sata_hba_inst::satahba_dev_port))
577 576 _NOTE(MUTEX_PROTECTS_DATA(sata_hba_inst::satahba_mutex,
578 577 sata_hba_inst::satahba_event_flags))
579 578 _NOTE(MUTEX_PROTECTS_DATA(sata_cport_info::cport_mutex, \
580 579 sata_cport_info::cport_devp))
581 580 _NOTE(DATA_READABLE_WITHOUT_LOCK(sata_cport_info::cport_devp))
582 581 _NOTE(SCHEME_PROTECTS_DATA("Scheme", sata_cport_info::cport_addr))
583 582 _NOTE(MUTEX_PROTECTS_DATA(sata_cport_info::cport_mutex, \
584 583 sata_cport_info::cport_dev_type))
585 584 _NOTE(DATA_READABLE_WITHOUT_LOCK(sata_cport_info::cport_dev_type))
586 585 _NOTE(MUTEX_PROTECTS_DATA(sata_cport_info::cport_mutex, \
587 586 sata_cport_info::cport_state))
588 587 _NOTE(DATA_READABLE_WITHOUT_LOCK(sata_cport_info::cport_state))
589 588 _NOTE(MUTEX_PROTECTS_DATA(sata_pmport_info::pmport_mutex, \
590 589 sata_pmport_info::pmport_state))
591 590 _NOTE(DATA_READABLE_WITHOUT_LOCK(sata_pmport_info::pmport_state))
592 591 _NOTE(MUTEX_PROTECTS_DATA(sata_pmport_info::pmport_mutex, \
593 592 sata_pmport_info::pmport_dev_type))
594 593 _NOTE(DATA_READABLE_WITHOUT_LOCK(sata_pmport_info::pmport_dev_type))
595 594 _NOTE(MUTEX_PROTECTS_DATA(sata_pmport_info::pmport_mutex, \
596 595 sata_pmport_info::pmport_sata_drive))
597 596 _NOTE(MUTEX_PROTECTS_DATA(sata_pmport_info::pmport_mutex, \
598 597 sata_pmport_info::pmport_tgtnode_clean))
599 598 _NOTE(MUTEX_PROTECTS_DATA(sata_pmport_info::pmport_mutex, \
600 599 sata_pmport_info::pmport_event_flags))
601 600 _NOTE(DATA_READABLE_WITHOUT_LOCK(sata_pmport_info::pmport_sata_drive))
602 601 _NOTE(DATA_READABLE_WITHOUT_LOCK(sata_pmult_info::pmult_dev_port))
603 602 _NOTE(DATA_READABLE_WITHOUT_LOCK(sata_pmult_info::pmult_num_dev_ports))
604 603 #ifdef SATA_DEBUG
605 604 _NOTE(SCHEME_PROTECTS_DATA("No Mutex Needed", mbuf_count))
606 605 _NOTE(SCHEME_PROTECTS_DATA("No Mutex Needed", mbuffail_count))
607 606 _NOTE(SCHEME_PROTECTS_DATA("No Mutex Needed", sata_atapi_trace))
608 607 _NOTE(SCHEME_PROTECTS_DATA("No Mutex Needed", sata_atapi_trace_index))
609 608 #endif
610 609
611 610 /* End of warlock directives */
612 611
613 612 /* ************** loadable module configuration functions ************** */
614 613
615 614 int
616 615 _init()
617 616 {
618 617 int rval;
619 618
620 619 mutex_init(&sata_mutex, NULL, MUTEX_DRIVER, NULL);
621 620 mutex_init(&sata_event_mutex, NULL, MUTEX_DRIVER, NULL);
622 621 mutex_init(&sata_log_mutex, NULL, MUTEX_DRIVER, NULL);
623 622 cv_init(&sata_event_cv, NULL, CV_DRIVER, NULL);
624 623 sata_trace_rbuf_alloc();
625 624 if ((rval = mod_install(&modlinkage)) != 0) {
626 625 #ifdef SATA_DEBUG
627 626 cmn_err(CE_WARN, "sata: _init: mod_install failed\n");
628 627 #endif
629 628 sata_trace_rbuf_free();
630 629 mutex_destroy(&sata_log_mutex);
631 630 cv_destroy(&sata_event_cv);
632 631 mutex_destroy(&sata_event_mutex);
633 632 mutex_destroy(&sata_mutex);
634 633 }
635 634 return (rval);
636 635 }
637 636
638 637 int
639 638 _fini()
640 639 {
641 640 int rval;
642 641
643 642 if ((rval = mod_remove(&modlinkage)) != 0)
644 643 return (rval);
645 644
646 645 sata_trace_rbuf_free();
647 646 mutex_destroy(&sata_log_mutex);
648 647 cv_destroy(&sata_event_cv);
649 648 mutex_destroy(&sata_event_mutex);
650 649 mutex_destroy(&sata_mutex);
651 650 return (rval);
652 651 }
653 652
654 653 int
655 654 _info(struct modinfo *modinfop)
656 655 {
657 656 return (mod_info(&modlinkage, modinfop));
658 657 }
659 658
660 659
661 660
662 661 /* ********************* SATA HBA entry points ********************* */
663 662
664 663
665 664 /*
666 665 * Called by SATA HBA from _init().
667 666 * Registers HBA driver instance/sata framework pair with scsi framework, by
668 667 * calling scsi_hba_init().
669 668 *
670 669 * SATA HBA driver cb_ops are ignored - SATA HBA framework cb_ops are used
671 670 * instead. SATA HBA framework cb_ops pointer overwrites SATA HBA driver
672 671 * cb_ops pointer in SATA HBA driver dev_ops structure.
673 672 * SATA HBA framework cb_ops supplies cb_open cb_close and cb_ioctl vectors.
674 673 *
675 674 * Return status of the scsi_hba_init() is returned to a calling SATA HBA
676 675 * driver.
677 676 */
678 677 int
679 678 sata_hba_init(struct modlinkage *modlp)
680 679 {
681 680 int rval;
682 681 struct dev_ops *hba_ops;
683 682
684 683 SATADBG1(SATA_DBG_HBA_IF, NULL,
685 684 "sata_hba_init: name %s \n",
686 685 ((struct modldrv *)(modlp->ml_linkage[0]))->drv_linkinfo);
687 686 /*
688 687 * Fill-up cb_ops and dev_ops when necessary
689 688 */
690 689 hba_ops = ((struct modldrv *)(modlp->ml_linkage[0]))->drv_dev_ops;
691 690 /*
692 691 * Provide pointer to SATA dev_ops
693 692 */
694 693 hba_ops->devo_cb_ops = &sata_cb_ops;
695 694
696 695 /*
697 696 * Register SATA HBA with SCSI framework
698 697 */
699 698 if ((rval = scsi_hba_init(modlp)) != 0) {
700 699 SATADBG1(SATA_DBG_HBA_IF, NULL,
701 700 "sata_hba_init: scsi hba init failed\n", NULL);
702 701 return (rval);
703 702 }
704 703
705 704 return (0);
706 705 }
707 706
708 707
709 708 /* HBA attach stages */
710 709 #define HBA_ATTACH_STAGE_SATA_HBA_INST 1
711 710 #define HBA_ATTACH_STAGE_SCSI_ATTACHED 2
712 711 #define HBA_ATTACH_STAGE_SETUP 4
713 712 #define HBA_ATTACH_STAGE_LINKED 8
714 713
715 714
716 715 /*
717 716 *
718 717 * Called from SATA HBA driver's attach routine to attach an instance of
719 718 * the HBA.
720 719 *
721 720 * For DDI_ATTACH command:
722 721 * sata_hba_inst structure is allocated here and initialized with pointers to
723 722 * SATA framework implementation of required scsi tran functions.
724 723 * The scsi_tran's tran_hba_private field is used by SATA Framework to point
725 724 * to the soft structure (sata_hba_inst) allocated by SATA framework for
726 725 * SATA HBA instance related data.
727 726 * The scsi_tran's tran_hba_private field is used by SATA framework to
728 727 * store a pointer to per-HBA-instance of sata_hba_inst structure.
729 728 * The sata_hba_inst structure is cross-linked to scsi tran structure.
730 729 * Among other info, a pointer to sata_hba_tran structure is stored in
731 730 * sata_hba_inst. The sata_hba_inst structures for different HBA instances are
732 731 * linked together into the list, pointed to by sata_hba_list.
733 732 * On the first HBA instance attach the sata event thread is initialized.
734 733 * Attachment points are created for all SATA ports of the HBA being attached.
735 734 * All HBA instance's SATA ports are probed and type of plugged devices is
736 735 * determined. For each device of a supported type, a target node is created.
737 736 *
738 737 * DDI_SUCCESS is returned when attachment process is successful,
739 738 * DDI_FAILURE is returned otherwise.
740 739 *
741 740 * For DDI_RESUME command:
742 741 * Not implemented at this time (postponed until phase 2 of the development).
743 742 */
744 743 int
745 744 sata_hba_attach(dev_info_t *dip, sata_hba_tran_t *sata_tran,
746 745 ddi_attach_cmd_t cmd)
747 746 {
748 747 sata_hba_inst_t *sata_hba_inst;
749 748 scsi_hba_tran_t *scsi_tran = NULL;
750 749 int hba_attach_state = 0;
751 750 char taskq_name[MAXPATHLEN];
752 751
753 752 SATADBG3(SATA_DBG_HBA_IF, NULL,
754 753 "sata_hba_attach: node %s (%s%d)\n",
755 754 ddi_node_name(dip), ddi_driver_name(dip),
756 755 ddi_get_instance(dip));
757 756
758 757 if (cmd == DDI_RESUME) {
759 758 /*
760 759 * Postponed until phase 2 of the development
761 760 */
762 761 return (DDI_FAILURE);
763 762 }
764 763
765 764 if (cmd != DDI_ATTACH) {
766 765 return (DDI_FAILURE);
767 766 }
768 767
769 768 /* cmd == DDI_ATTACH */
770 769
771 770 if (sata_validate_sata_hba_tran(dip, sata_tran) != SATA_SUCCESS) {
772 771 SATA_LOG_D((NULL, CE_WARN,
773 772 "sata_hba_attach: invalid sata_hba_tran"));
774 773 return (DDI_FAILURE);
775 774 }
776 775 /*
777 776 * Allocate and initialize SCSI tran structure.
778 777 * SATA copy of tran_bus_config is provided to create port nodes.
779 778 */
780 779 scsi_tran = scsi_hba_tran_alloc(dip, SCSI_HBA_CANSLEEP);
781 780 if (scsi_tran == NULL)
782 781 return (DDI_FAILURE);
783 782 /*
784 783 * Allocate soft structure for SATA HBA instance.
785 784 * There is a separate softstate for each HBA instance.
786 785 */
787 786 sata_hba_inst = kmem_zalloc(sizeof (struct sata_hba_inst), KM_SLEEP);
788 787 ASSERT(sata_hba_inst != NULL); /* this should not fail */
789 788 mutex_init(&sata_hba_inst->satahba_mutex, NULL, MUTEX_DRIVER, NULL);
790 789 hba_attach_state |= HBA_ATTACH_STAGE_SATA_HBA_INST;
791 790
792 791 /*
793 792 * scsi_trans's tran_hba_private is used by SATA Framework to point to
794 793 * soft structure allocated by SATA framework for
795 794 * SATA HBA instance related data.
796 795 */
797 796 scsi_tran->tran_hba_private = sata_hba_inst;
798 797 scsi_tran->tran_tgt_private = NULL;
799 798
800 799 scsi_tran->tran_tgt_init = sata_scsi_tgt_init;
801 800 scsi_tran->tran_tgt_probe = sata_scsi_tgt_probe;
802 801 scsi_tran->tran_tgt_free = sata_scsi_tgt_free;
803 802
804 803 scsi_tran->tran_start = sata_scsi_start;
805 804 scsi_tran->tran_reset = sata_scsi_reset;
806 805 scsi_tran->tran_abort = sata_scsi_abort;
807 806 scsi_tran->tran_getcap = sata_scsi_getcap;
808 807 scsi_tran->tran_setcap = sata_scsi_setcap;
809 808 scsi_tran->tran_init_pkt = sata_scsi_init_pkt;
810 809 scsi_tran->tran_destroy_pkt = sata_scsi_destroy_pkt;
811 810
812 811 scsi_tran->tran_dmafree = sata_scsi_dmafree;
813 812 scsi_tran->tran_sync_pkt = sata_scsi_sync_pkt;
814 813
815 814 scsi_tran->tran_reset_notify = NULL;
816 815 scsi_tran->tran_get_bus_addr = NULL;
817 816 scsi_tran->tran_quiesce = NULL;
818 817 scsi_tran->tran_unquiesce = NULL;
819 818 scsi_tran->tran_bus_reset = NULL;
820 819
821 820 if (scsi_hba_attach_setup(dip, sata_tran->sata_tran_hba_dma_attr,
822 821 scsi_tran, 0) != DDI_SUCCESS) {
823 822 #ifdef SATA_DEBUG
824 823 cmn_err(CE_WARN, "?SATA: %s%d hba scsi attach failed",
825 824 ddi_driver_name(dip), ddi_get_instance(dip));
826 825 #endif
827 826 goto fail;
828 827 }
829 828 hba_attach_state |= HBA_ATTACH_STAGE_SCSI_ATTACHED;
830 829
831 830 if (!ddi_prop_exists(DDI_DEV_T_ANY, dip, DDI_PROP_DONTPASS, "sata")) {
832 831 if (ddi_prop_update_int(DDI_DEV_T_NONE, dip,
833 832 "sata", 1) != DDI_PROP_SUCCESS) {
834 833 SATA_LOG_D((NULL, CE_WARN, "sata_hba_attach: "
835 834 "failed to create hba sata prop"));
836 835 goto fail;
837 836 }
838 837 }
839 838
840 839 /*
841 840 * Save pointers in hba instance soft state.
842 841 */
843 842 sata_hba_inst->satahba_scsi_tran = scsi_tran;
844 843 sata_hba_inst->satahba_tran = sata_tran;
845 844 sata_hba_inst->satahba_dip = dip;
846 845
847 846 /*
848 847 * Create a task queue to handle emulated commands completion
849 848 * Use node name, dash, instance number as the queue name.
850 849 */
851 850 taskq_name[0] = '\0';
852 851 (void) strlcat(taskq_name, DEVI(dip)->devi_node_name,
853 852 sizeof (taskq_name));
854 853 (void) snprintf(taskq_name + strlen(taskq_name),
855 854 sizeof (taskq_name) - strlen(taskq_name),
856 855 "-%d", DEVI(dip)->devi_instance);
857 856 sata_hba_inst->satahba_taskq = taskq_create(taskq_name, 1,
858 857 minclsyspri, 1, sata_tran->sata_tran_hba_num_cports * 4,
859 858 TASKQ_DYNAMIC);
860 859
861 860 hba_attach_state |= HBA_ATTACH_STAGE_SETUP;
862 861
863 862 /*
864 863 * Create events thread if not created yet.
865 864 */
866 865 sata_event_thread_control(1);
867 866
868 867 /*
869 868 * Link this hba instance into the list.
870 869 */
871 870 mutex_enter(&sata_mutex);
872 871
873 872 if (sata_hba_list == NULL) {
874 873 /*
875 874 * The first instance of HBA is attached.
876 875 * Set current/active default maximum NCQ/TCQ queue depth for
877 876 * all SATA devices. It is done here and now, to eliminate the
878 877 * possibility of the dynamic, programatic modification of the
879 878 * queue depth via global (and public) sata_max_queue_depth
880 879 * variable (this would require special handling in HBA drivers)
881 880 */
882 881 sata_current_max_qdepth = sata_max_queue_depth;
883 882 if (sata_current_max_qdepth > 32)
884 883 sata_current_max_qdepth = 32;
885 884 else if (sata_current_max_qdepth < 1)
886 885 sata_current_max_qdepth = 1;
887 886 }
888 887
889 888 sata_hba_inst->satahba_next = NULL;
890 889 sata_hba_inst->satahba_prev = sata_hba_list_tail;
891 890 if (sata_hba_list == NULL) {
892 891 sata_hba_list = sata_hba_inst;
893 892 }
894 893 if (sata_hba_list_tail != NULL) {
895 894 sata_hba_list_tail->satahba_next = sata_hba_inst;
896 895 }
897 896 sata_hba_list_tail = sata_hba_inst;
898 897 mutex_exit(&sata_mutex);
899 898 hba_attach_state |= HBA_ATTACH_STAGE_LINKED;
900 899
901 900 /*
902 901 * Create SATA HBA devctl minor node for sata_hba_open, close, ioctl
903 902 * SATA HBA driver should not use its own open/close entry points.
904 903 *
905 904 * Make sure that instance number doesn't overflow
906 905 * when forming minor numbers.
907 906 */
908 907 ASSERT(ddi_get_instance(dip) <= (L_MAXMIN >> INST_MINOR_SHIFT));
909 908 if (ddi_create_minor_node(dip, "devctl", S_IFCHR,
910 909 INST2DEVCTL(ddi_get_instance(dip)),
911 910 DDI_NT_SATA_NEXUS, 0) != DDI_SUCCESS) {
912 911 #ifdef SATA_DEBUG
913 912 cmn_err(CE_WARN, "sata_hba_attach: "
914 913 "cannot create devctl minor node");
915 914 #endif
916 915 goto fail;
917 916 }
918 917
919 918
920 919 /*
921 920 * Set-up kstats here, if necessary.
922 921 * (postponed until future phase of the development).
923 922 */
924 923
925 924 /*
926 925 * Indicate that HBA is attached. This will enable events processing
927 926 * for this HBA.
928 927 */
929 928 sata_hba_inst->satahba_attached = 1;
930 929 /*
931 930 * Probe controller ports. This operation will describe a current
932 931 * controller/port/multipliers/device configuration and will create
933 932 * attachment points.
934 933 * We may end-up with just a controller with no devices attached.
935 934 * For the ports with a supported device attached, device target nodes
936 935 * are created and devices are initialized.
937 936 */
938 937 sata_probe_ports(sata_hba_inst);
939 938
940 939 return (DDI_SUCCESS);
941 940
942 941 fail:
943 942 if (hba_attach_state & HBA_ATTACH_STAGE_LINKED) {
944 943 (void) sata_remove_hba_instance(dip);
945 944 if (sata_hba_list == NULL)
946 945 sata_event_thread_control(0);
947 946 }
948 947
949 948 if (hba_attach_state & HBA_ATTACH_STAGE_SETUP) {
950 949 (void) ddi_prop_remove(DDI_DEV_T_ANY, dip, "sata");
951 950 taskq_destroy(sata_hba_inst->satahba_taskq);
952 951 }
953 952
954 953 if (hba_attach_state & HBA_ATTACH_STAGE_SCSI_ATTACHED)
955 954 (void) scsi_hba_detach(dip);
956 955
957 956 if (hba_attach_state & HBA_ATTACH_STAGE_SATA_HBA_INST) {
958 957 mutex_destroy(&sata_hba_inst->satahba_mutex);
959 958 kmem_free((void *)sata_hba_inst,
960 959 sizeof (struct sata_hba_inst));
961 960 scsi_hba_tran_free(scsi_tran);
962 961 }
963 962
964 963 sata_log(NULL, CE_WARN, "?SATA: %s%d hba attach failed",
965 964 ddi_driver_name(dip), ddi_get_instance(dip));
966 965
967 966 return (DDI_FAILURE);
968 967 }
969 968
970 969
971 970 /*
972 971 * Called by SATA HBA from to detach an instance of the driver.
973 972 *
974 973 * For DDI_DETACH command:
975 974 * Free local structures allocated for SATA HBA instance during
976 975 * sata_hba_attach processing.
977 976 *
978 977 * Returns DDI_SUCCESS when HBA was detached, DDI_FAILURE otherwise.
979 978 *
980 979 * For DDI_SUSPEND command:
981 980 * Not implemented at this time (postponed until phase 2 of the development)
982 981 * Returnd DDI_SUCCESS.
983 982 *
984 983 * When the last HBA instance is detached, the event daemon is terminated.
985 984 *
986 985 * NOTE: Port multiplier is supported.
987 986 */
988 987 int
989 988 sata_hba_detach(dev_info_t *dip, ddi_detach_cmd_t cmd)
990 989 {
991 990 dev_info_t *tdip;
992 991 sata_hba_inst_t *sata_hba_inst;
993 992 scsi_hba_tran_t *scsi_hba_tran;
994 993 sata_cport_info_t *cportinfo;
995 994 sata_pmult_info_t *pminfo;
996 995 sata_drive_info_t *sdinfo;
997 996 sata_device_t sdevice;
998 997 int ncport, npmport;
999 998
1000 999 SATADBG3(SATA_DBG_HBA_IF, NULL, "sata_hba_detach: node %s (%s%d)\n",
1001 1000 ddi_node_name(dip), ddi_driver_name(dip), ddi_get_instance(dip));
1002 1001
1003 1002 switch (cmd) {
1004 1003 case DDI_DETACH:
1005 1004
1006 1005 if ((scsi_hba_tran = ddi_get_driver_private(dip)) == NULL)
1007 1006 return (DDI_FAILURE);
1008 1007
1009 1008 sata_hba_inst = scsi_hba_tran->tran_hba_private;
1010 1009 if (sata_hba_inst == NULL)
1011 1010 return (DDI_FAILURE);
1012 1011
1013 1012 if (scsi_hba_detach(dip) == DDI_FAILURE) {
1014 1013 sata_hba_inst->satahba_attached = 1;
1015 1014 return (DDI_FAILURE);
1016 1015 }
1017 1016
1018 1017 /*
1019 1018 * Free all target nodes - at this point
1020 1019 * devices should be at least offlined
1021 1020 * otherwise scsi_hba_detach() should not be called.
1022 1021 */
1023 1022 for (ncport = 0; ncport < SATA_NUM_CPORTS(sata_hba_inst);
1024 1023 ncport++) {
1025 1024 cportinfo = SATA_CPORT_INFO(sata_hba_inst, ncport);
1026 1025 if (cportinfo->cport_dev_type != SATA_DTYPE_PMULT) {
1027 1026 sdinfo = SATA_CPORTINFO_DRV_INFO(cportinfo);
1028 1027 if (sdinfo != NULL) {
1029 1028 tdip = sata_get_target_dip(dip,
1030 1029 ncport, 0);
1031 1030 if (tdip != NULL) {
1032 1031 if (ndi_devi_offline(tdip,
1033 1032 NDI_DEVI_REMOVE) !=
1034 1033 NDI_SUCCESS) {
1035 1034 SATA_LOG_D((
1036 1035 sata_hba_inst,
1037 1036 CE_WARN,
1038 1037 "sata_hba_detach: "
1039 1038 "Target node not "
1040 1039 "removed !"));
1041 1040 return (DDI_FAILURE);
1042 1041 }
1043 1042 }
1044 1043 }
1045 1044 } else { /* SATA_DTYPE_PMULT */
1046 1045 mutex_enter(&cportinfo->cport_mutex);
1047 1046 pminfo = SATA_CPORTINFO_PMULT_INFO(cportinfo);
1048 1047
1049 1048 if (pminfo == NULL) {
1050 1049 SATA_LOG_D((sata_hba_inst, CE_WARN,
1051 1050 "sata_hba_detach: Port multiplier "
1052 1051 "not ready yet!"));
1053 1052 mutex_exit(&cportinfo->cport_mutex);
1054 1053 return (DDI_FAILURE);
1055 1054 }
1056 1055
1057 1056 /*
1058 1057 * Detach would fail if removal of any of the
1059 1058 * target nodes is failed - albeit in that
1060 1059 * case some of them may have been removed.
1061 1060 */
1062 1061 for (npmport = 0; npmport < SATA_NUM_PMPORTS(
1063 1062 sata_hba_inst, ncport); npmport++) {
1064 1063 tdip = sata_get_target_dip(dip, ncport,
1065 1064 npmport);
1066 1065 if (tdip != NULL) {
1067 1066 if (ndi_devi_offline(tdip,
1068 1067 NDI_DEVI_REMOVE) !=
1069 1068 NDI_SUCCESS) {
1070 1069 SATA_LOG_D((
1071 1070 sata_hba_inst,
1072 1071 CE_WARN,
1073 1072 "sata_hba_detach: "
1074 1073 "Target node not "
1075 1074 "removed !"));
1076 1075 mutex_exit(&cportinfo->
1077 1076 cport_mutex);
1078 1077 return (DDI_FAILURE);
1079 1078 }
1080 1079 }
1081 1080 }
1082 1081 mutex_exit(&cportinfo->cport_mutex);
1083 1082 }
1084 1083 }
1085 1084 /*
1086 1085 * Disable sata event daemon processing for this HBA
1087 1086 */
1088 1087 sata_hba_inst->satahba_attached = 0;
1089 1088
1090 1089 /*
1091 1090 * Remove event daemon thread, if it is last HBA instance.
1092 1091 */
1093 1092
1094 1093 mutex_enter(&sata_mutex);
1095 1094 if (sata_hba_list->satahba_next == NULL) {
1096 1095 mutex_exit(&sata_mutex);
1097 1096 sata_event_thread_control(0);
1098 1097 mutex_enter(&sata_mutex);
1099 1098 }
1100 1099 mutex_exit(&sata_mutex);
1101 1100
1102 1101 /* Remove this HBA instance from the HBA list */
1103 1102 sata_remove_hba_instance(dip);
1104 1103
1105 1104 /*
1106 1105 * At this point there should be no target nodes attached.
1107 1106 * Detach and destroy device and port info structures.
1108 1107 */
1109 1108 for (ncport = 0; ncport < SATA_NUM_CPORTS(sata_hba_inst);
1110 1109 ncport++) {
1111 1110 cportinfo = SATA_CPORT_INFO(sata_hba_inst, ncport);
1112 1111 if (cportinfo->cport_dev_type != SATA_DTYPE_PMULT) {
1113 1112 sdinfo =
1114 1113 cportinfo->cport_devp.cport_sata_drive;
1115 1114 if (sdinfo != NULL) {
1116 1115 /* Release device structure */
1117 1116 kmem_free(sdinfo,
1118 1117 sizeof (sata_drive_info_t));
1119 1118 }
1120 1119 /* Release cport info */
1121 1120 mutex_destroy(&cportinfo->cport_mutex);
1122 1121 kmem_free(cportinfo,
1123 1122 sizeof (sata_cport_info_t));
1124 1123 } else { /* SATA_DTYPE_PMULT */
1125 1124 sdevice.satadev_addr.cport = (uint8_t)ncport;
1126 1125 sdevice.satadev_addr.qual = SATA_ADDR_PMULT;
1127 1126 sata_free_pmult(sata_hba_inst, &sdevice);
1128 1127 }
1129 1128 }
1130 1129
1131 1130 scsi_hba_tran_free(sata_hba_inst->satahba_scsi_tran);
1132 1131
1133 1132 (void) ddi_prop_remove(DDI_DEV_T_ANY, dip, "sata");
1134 1133
1135 1134 taskq_destroy(sata_hba_inst->satahba_taskq);
1136 1135
1137 1136 mutex_destroy(&sata_hba_inst->satahba_mutex);
1138 1137 kmem_free((void *)sata_hba_inst,
1139 1138 sizeof (struct sata_hba_inst));
1140 1139
1141 1140 return (DDI_SUCCESS);
1142 1141
1143 1142 case DDI_SUSPEND:
1144 1143 /*
1145 1144 * Postponed until phase 2
1146 1145 */
1147 1146 return (DDI_FAILURE);
1148 1147
1149 1148 default:
1150 1149 return (DDI_FAILURE);
1151 1150 }
1152 1151 }
1153 1152
1154 1153
1155 1154 /*
1156 1155 * Called by an HBA drive from _fini() routine.
1157 1156 * Unregisters SATA HBA instance/SATA framework pair from the scsi framework.
1158 1157 */
1159 1158 void
1160 1159 sata_hba_fini(struct modlinkage *modlp)
1161 1160 {
1162 1161 SATADBG1(SATA_DBG_HBA_IF, NULL,
1163 1162 "sata_hba_fini: name %s\n",
1164 1163 ((struct modldrv *)(modlp->ml_linkage[0]))->drv_linkinfo);
1165 1164
1166 1165 scsi_hba_fini(modlp);
1167 1166 }
1168 1167
1169 1168
1170 1169 /*
1171 1170 * Default open and close routine for sata_hba framework.
1172 1171 *
1173 1172 */
1174 1173 /*
1175 1174 * Open devctl node.
1176 1175 *
1177 1176 * Returns:
1178 1177 * 0 if node was open successfully, error code otherwise.
1179 1178 *
1180 1179 *
1181 1180 */
1182 1181
1183 1182 static int
1184 1183 sata_hba_open(dev_t *devp, int flags, int otyp, cred_t *credp)
1185 1184 {
1186 1185 #ifndef __lock_lint
1187 1186 _NOTE(ARGUNUSED(credp))
1188 1187 #endif
1189 1188 int rv = 0;
1190 1189 dev_info_t *dip;
1191 1190 scsi_hba_tran_t *scsi_hba_tran;
1192 1191 sata_hba_inst_t *sata_hba_inst;
1193 1192
1194 1193 SATADBG1(SATA_DBG_IOCTL_IF, NULL, "sata_hba_open: entered", NULL);
1195 1194
1196 1195 if (otyp != OTYP_CHR)
1197 1196 return (EINVAL);
1198 1197
1199 1198 dip = sata_devt_to_devinfo(*devp);
1200 1199 if (dip == NULL)
1201 1200 return (ENXIO);
1202 1201
1203 1202 if ((scsi_hba_tran = ddi_get_driver_private(dip)) == NULL)
1204 1203 return (ENXIO);
1205 1204
1206 1205 sata_hba_inst = scsi_hba_tran->tran_hba_private;
1207 1206 if (sata_hba_inst == NULL || sata_hba_inst->satahba_attached == 0)
1208 1207 return (ENXIO);
1209 1208
1210 1209 mutex_enter(&sata_mutex);
1211 1210 if (flags & FEXCL) {
1212 1211 if (sata_hba_inst->satahba_open_flag != 0) {
1213 1212 rv = EBUSY;
1214 1213 } else {
1215 1214 sata_hba_inst->satahba_open_flag =
1216 1215 SATA_DEVCTL_EXOPENED;
1217 1216 }
1218 1217 } else {
1219 1218 if (sata_hba_inst->satahba_open_flag == SATA_DEVCTL_EXOPENED) {
1220 1219 rv = EBUSY;
1221 1220 } else {
1222 1221 sata_hba_inst->satahba_open_flag =
1223 1222 SATA_DEVCTL_SOPENED;
1224 1223 }
1225 1224 }
1226 1225 mutex_exit(&sata_mutex);
1227 1226
1228 1227 return (rv);
1229 1228 }
1230 1229
1231 1230
1232 1231 /*
1233 1232 * Close devctl node.
1234 1233 * Returns:
1235 1234 * 0 if node was closed successfully, error code otherwise.
1236 1235 *
1237 1236 */
1238 1237
1239 1238 static int
1240 1239 sata_hba_close(dev_t dev, int flag, int otyp, cred_t *credp)
1241 1240 {
1242 1241 #ifndef __lock_lint
1243 1242 _NOTE(ARGUNUSED(credp))
1244 1243 _NOTE(ARGUNUSED(flag))
1245 1244 #endif
1246 1245 dev_info_t *dip;
1247 1246 scsi_hba_tran_t *scsi_hba_tran;
1248 1247 sata_hba_inst_t *sata_hba_inst;
1249 1248
1250 1249 SATADBG1(SATA_DBG_IOCTL_IF, NULL, "sata_hba_close: entered", NULL);
1251 1250
1252 1251 if (otyp != OTYP_CHR)
1253 1252 return (EINVAL);
1254 1253
1255 1254 dip = sata_devt_to_devinfo(dev);
1256 1255 if (dip == NULL)
1257 1256 return (ENXIO);
1258 1257
1259 1258 if ((scsi_hba_tran = ddi_get_driver_private(dip)) == NULL)
1260 1259 return (ENXIO);
1261 1260
1262 1261 sata_hba_inst = scsi_hba_tran->tran_hba_private;
1263 1262 if (sata_hba_inst == NULL || sata_hba_inst->satahba_attached == 0)
1264 1263 return (ENXIO);
1265 1264
1266 1265 mutex_enter(&sata_mutex);
1267 1266 sata_hba_inst->satahba_open_flag = 0;
1268 1267 mutex_exit(&sata_mutex);
1269 1268 return (0);
1270 1269 }
1271 1270
1272 1271
1273 1272
1274 1273 /*
1275 1274 * Standard IOCTL commands for SATA hotplugging.
1276 1275 * Implemented DEVCTL_AP commands:
1277 1276 * DEVCTL_AP_CONNECT
1278 1277 * DEVCTL_AP_DISCONNECT
1279 1278 * DEVCTL_AP_CONFIGURE
1280 1279 * DEVCTL_UNCONFIGURE
1281 1280 * DEVCTL_AP_CONTROL
1282 1281 *
1283 1282 * Commands passed to default ndi ioctl handler:
1284 1283 * DEVCTL_DEVICE_GETSTATE
1285 1284 * DEVCTL_DEVICE_ONLINE
1286 1285 * DEVCTL_DEVICE_OFFLINE
1287 1286 * DEVCTL_DEVICE_REMOVE
1288 1287 * DEVCTL_DEVICE_INSERT
1289 1288 * DEVCTL_BUS_GETSTATE
1290 1289 *
1291 1290 * All other cmds are passed to HBA if it provide ioctl handler, or failed
1292 1291 * if not.
1293 1292 *
1294 1293 * Returns:
1295 1294 * 0 if successful,
1296 1295 * error code if operation failed.
1297 1296 *
1298 1297 * Port Multiplier support is supported now.
1299 1298 *
1300 1299 * NOTE: qual should be SATA_ADDR_DCPORT or SATA_ADDR_DPMPORT
1301 1300 */
1302 1301
1303 1302 static int
1304 1303 sata_hba_ioctl(dev_t dev, int cmd, intptr_t arg, int mode, cred_t *credp,
1305 1304 int *rvalp)
1306 1305 {
1307 1306 #ifndef __lock_lint
1308 1307 _NOTE(ARGUNUSED(credp))
1309 1308 _NOTE(ARGUNUSED(rvalp))
1310 1309 #endif
1311 1310 int rv = 0;
1312 1311 int32_t comp_port = -1;
1313 1312 dev_info_t *dip;
1314 1313 devctl_ap_state_t ap_state;
1315 1314 struct devctl_iocdata *dcp = NULL;
1316 1315 scsi_hba_tran_t *scsi_hba_tran;
1317 1316 sata_hba_inst_t *sata_hba_inst;
1318 1317 sata_device_t sata_device;
1319 1318 sata_cport_info_t *cportinfo;
1320 1319 int cport, pmport, qual;
1321 1320 int rval = SATA_SUCCESS;
1322 1321
1323 1322 dip = sata_devt_to_devinfo(dev);
1324 1323 if (dip == NULL)
1325 1324 return (ENXIO);
1326 1325
1327 1326 if ((scsi_hba_tran = ddi_get_driver_private(dip)) == NULL)
1328 1327 return (ENXIO);
1329 1328
1330 1329 sata_hba_inst = scsi_hba_tran->tran_hba_private;
1331 1330 if (sata_hba_inst == NULL)
1332 1331 return (ENXIO);
1333 1332
1334 1333 if (sata_hba_inst->satahba_tran == NULL)
1335 1334 return (ENXIO);
1336 1335
1337 1336 switch (cmd) {
1338 1337
1339 1338 case DEVCTL_DEVICE_GETSTATE:
1340 1339 case DEVCTL_DEVICE_ONLINE:
1341 1340 case DEVCTL_DEVICE_OFFLINE:
|
↓ open down ↓ |
1304 lines elided |
↑ open up ↑ |
1342 1341 case DEVCTL_DEVICE_REMOVE:
1343 1342 case DEVCTL_BUS_GETSTATE:
1344 1343 /*
1345 1344 * There may be more cases that we want to pass to default
1346 1345 * handler rather than fail them.
1347 1346 */
1348 1347 return (ndi_devctl_ioctl(dip, cmd, arg, mode, 0));
1349 1348 }
1350 1349
1351 1350 /* read devctl ioctl data */
1352 - if (cmd != DEVCTL_AP_CONTROL) {
1351 + if (cmd != DEVCTL_AP_CONTROL && cmd >= DEVCTL_IOC &&
1352 + cmd <= DEVCTL_IOC_MAX) {
1353 1353 if (ndi_dc_allochdl((void *)arg, &dcp) != NDI_SUCCESS)
1354 1354 return (EFAULT);
1355 1355
1356 1356 if ((comp_port = sata_get_port_num(sata_hba_inst, dcp)) ==
1357 1357 -1) {
1358 1358 if (dcp)
1359 1359 ndi_dc_freehdl(dcp);
1360 1360 return (EINVAL);
1361 1361 }
1362 1362
1363 1363 /*
1364 1364 * According to SCSI_TO_SATA_ADDR_QUAL, qual should be either
1365 1365 * SATA_ADDR_DCPORT or SATA_ADDR_DPMPORT.
1366 1366 */
1367 1367 cport = SCSI_TO_SATA_CPORT(comp_port);
1368 1368 pmport = SCSI_TO_SATA_PMPORT(comp_port);
1369 1369 qual = SCSI_TO_SATA_ADDR_QUAL(comp_port);
1370 1370
1371 1371 if (sata_validate_sata_address(sata_hba_inst, cport, pmport,
1372 1372 qual) != 0) {
1373 1373 ndi_dc_freehdl(dcp);
1374 1374 return (EINVAL);
1375 1375 }
1376 1376
1377 1377 cportinfo = SATA_CPORT_INFO(sata_hba_inst, cport);
1378 1378 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, cport)->
1379 1379 cport_mutex);
1380 1380 if (cportinfo->cport_event_flags & SATA_EVNT_LOCK_PORT_BUSY) {
1381 1381 /*
1382 1382 * Cannot process ioctl request now. Come back later.
1383 1383 */
1384 1384 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, cport)->
1385 1385 cport_mutex);
1386 1386 ndi_dc_freehdl(dcp);
1387 1387 return (EBUSY);
1388 1388 }
1389 1389 /* Block event processing for this port */
1390 1390 cportinfo->cport_event_flags |= SATA_APCTL_LOCK_PORT_BUSY;
1391 1391 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, cport)->cport_mutex);
1392 1392
1393 1393 sata_device.satadev_addr.cport = cport;
1394 1394 sata_device.satadev_addr.pmport = pmport;
1395 1395 sata_device.satadev_addr.qual = qual;
1396 1396 sata_device.satadev_rev = SATA_DEVICE_REV;
1397 1397 }
1398 1398
1399 1399 switch (cmd) {
1400 1400
1401 1401 case DEVCTL_AP_DISCONNECT:
1402 1402
1403 1403 /*
1404 1404 * Normally, cfgadm sata plugin will try to offline
1405 1405 * (unconfigure) device before this request. Nevertheless,
1406 1406 * if a device is still configured, we need to
1407 1407 * attempt to offline and unconfigure device first, and we will
1408 1408 * deactivate the port regardless of the unconfigure
1409 1409 * operation results.
1410 1410 *
1411 1411 */
1412 1412 rv = sata_ioctl_disconnect(sata_hba_inst, &sata_device);
1413 1413
1414 1414 break;
1415 1415
1416 1416 case DEVCTL_AP_UNCONFIGURE:
1417 1417
1418 1418 /*
1419 1419 * The unconfigure operation uses generic nexus operation to
1420 1420 * offline a device. It leaves a target device node attached.
1421 1421 * and obviously sata_drive_info attached as well, because
1422 1422 * from the hardware point of view nothing has changed.
1423 1423 */
1424 1424 rv = sata_ioctl_unconfigure(sata_hba_inst, &sata_device);
1425 1425 break;
1426 1426
1427 1427 case DEVCTL_AP_CONNECT:
1428 1428 {
1429 1429 /*
1430 1430 * The sata cfgadm pluging will invoke this operation only if
1431 1431 * port was found in the disconnect state (failed state
1432 1432 * is also treated as the disconnected state).
1433 1433 * If port activation is successful and a device is found
1434 1434 * attached to the port, the initialization sequence is
1435 1435 * executed to probe the port and attach
1436 1436 * a device structure to a port structure. The device is not
1437 1437 * set in configured state (system-wise) by this operation.
1438 1438 */
1439 1439
1440 1440 rv = sata_ioctl_connect(sata_hba_inst, &sata_device);
1441 1441
1442 1442 break;
1443 1443 }
1444 1444
1445 1445 case DEVCTL_AP_CONFIGURE:
1446 1446 {
1447 1447 /*
1448 1448 * A port may be in an active or shutdown state.
1449 1449 * If port is in a failed state, operation is aborted.
1450 1450 * If a port is in a shutdown state, sata_tran_port_activate()
1451 1451 * is invoked prior to any other operation.
1452 1452 *
1453 1453 * Onlining the device involves creating a new target node.
1454 1454 * If there is an old target node present (belonging to
1455 1455 * previously removed device), the operation is aborted - the
1456 1456 * old node has to be released and removed before configure
1457 1457 * operation is attempted.
1458 1458 */
1459 1459
1460 1460 rv = sata_ioctl_configure(sata_hba_inst, &sata_device);
1461 1461
1462 1462 break;
1463 1463 }
1464 1464
1465 1465 case DEVCTL_AP_GETSTATE:
1466 1466
1467 1467 sata_cfgadm_state(sata_hba_inst, comp_port, &ap_state);
1468 1468
1469 1469 ap_state.ap_last_change = (time_t)-1;
1470 1470 ap_state.ap_error_code = 0;
1471 1471 ap_state.ap_in_transition = 0;
1472 1472
1473 1473 /* Copy the return AP-state information to the user space */
1474 1474 if (ndi_dc_return_ap_state(&ap_state, dcp) != NDI_SUCCESS) {
1475 1475 rv = EFAULT;
1476 1476 }
1477 1477 break;
1478 1478
1479 1479 case DEVCTL_AP_CONTROL:
1480 1480 {
1481 1481 /*
1482 1482 * Generic devctl for hardware specific functionality
1483 1483 */
1484 1484 sata_ioctl_data_t ioc;
1485 1485
1486 1486 ASSERT(dcp == NULL);
1487 1487
1488 1488 /* Copy in user ioctl data first */
1489 1489 #ifdef _MULTI_DATAMODEL
1490 1490 if (ddi_model_convert_from(mode & FMODELS) ==
1491 1491 DDI_MODEL_ILP32) {
1492 1492
1493 1493 sata_ioctl_data_32_t ioc32;
1494 1494
1495 1495 if (ddi_copyin((void *)arg, (void *)&ioc32,
1496 1496 sizeof (ioc32), mode) != 0) {
1497 1497 rv = EFAULT;
1498 1498 break;
1499 1499 }
1500 1500 ioc.cmd = (uint_t)ioc32.cmd;
1501 1501 ioc.port = (uint_t)ioc32.port;
1502 1502 ioc.get_size = (uint_t)ioc32.get_size;
1503 1503 ioc.buf = (caddr_t)(uintptr_t)ioc32.buf;
1504 1504 ioc.bufsiz = (uint_t)ioc32.bufsiz;
1505 1505 ioc.misc_arg = (uint_t)ioc32.misc_arg;
1506 1506 } else
1507 1507 #endif /* _MULTI_DATAMODEL */
1508 1508 if (ddi_copyin((void *)arg, (void *)&ioc, sizeof (ioc),
1509 1509 mode) != 0) {
1510 1510 return (EFAULT);
1511 1511 }
1512 1512
1513 1513 SATADBG2(SATA_DBG_IOCTL_IF, sata_hba_inst,
1514 1514 "sata_hba_ioctl: DEVCTL_AP_CONTROL "
1515 1515 "cmd 0x%x, port 0x%x", ioc.cmd, ioc.port);
1516 1516
1517 1517 /*
1518 1518 * To avoid BE/LE and 32/64 issues, a get_size always returns
1519 1519 * a 32-bit number.
1520 1520 */
1521 1521 if (ioc.get_size != 0 && ioc.bufsiz != (sizeof (uint32_t))) {
1522 1522 return (EINVAL);
1523 1523 }
1524 1524 /* validate address */
1525 1525 cport = SCSI_TO_SATA_CPORT(ioc.port);
1526 1526 pmport = SCSI_TO_SATA_PMPORT(ioc.port);
1527 1527 qual = SCSI_TO_SATA_ADDR_QUAL(ioc.port);
1528 1528
1529 1529 SATADBG3(SATA_DBG_IOCTL_IF, sata_hba_inst,
1530 1530 "sata_hba_ioctl: target port is %d:%d (%d)",
1531 1531 cport, pmport, qual);
1532 1532
1533 1533 if (sata_validate_sata_address(sata_hba_inst, cport,
1534 1534 pmport, qual) != 0)
1535 1535 return (EINVAL);
1536 1536
1537 1537 cportinfo = SATA_CPORT_INFO(sata_hba_inst, cport);
1538 1538 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, cport)->
1539 1539 cport_mutex);
1540 1540 /* Is the port locked by event processing daemon ? */
1541 1541 if (cportinfo->cport_event_flags & SATA_EVNT_LOCK_PORT_BUSY) {
1542 1542 /*
1543 1543 * Cannot process ioctl request now. Come back later
1544 1544 */
1545 1545 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, cport)->
1546 1546 cport_mutex);
1547 1547 return (EBUSY);
1548 1548 }
1549 1549 /* Block event processing for this port */
1550 1550 cportinfo->cport_event_flags |= SATA_APCTL_LOCK_PORT_BUSY;
1551 1551 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, cport)->cport_mutex);
1552 1552
1553 1553
1554 1554 sata_device.satadev_addr.cport = cport;
1555 1555 sata_device.satadev_addr.pmport = pmport;
1556 1556 sata_device.satadev_addr.qual = qual;
1557 1557 sata_device.satadev_rev = SATA_DEVICE_REV;
1558 1558
1559 1559 switch (ioc.cmd) {
1560 1560
1561 1561 case SATA_CFGA_RESET_PORT:
1562 1562 /*
1563 1563 * There is no protection for configured device.
1564 1564 */
1565 1565 rv = sata_ioctl_reset_port(sata_hba_inst, &sata_device);
1566 1566 break;
1567 1567
1568 1568 case SATA_CFGA_RESET_DEVICE:
1569 1569 /*
1570 1570 * There is no protection for configured device.
1571 1571 */
1572 1572 rv = sata_ioctl_reset_device(sata_hba_inst,
1573 1573 &sata_device);
1574 1574 break;
1575 1575
1576 1576 case SATA_CFGA_RESET_ALL:
1577 1577 /*
1578 1578 * There is no protection for configured devices.
1579 1579 */
1580 1580 rv = sata_ioctl_reset_all(sata_hba_inst);
1581 1581 /*
1582 1582 * We return here, because common return is for
1583 1583 * a single port operation - we have already unlocked
1584 1584 * all ports and no dc handle was allocated.
1585 1585 */
1586 1586 return (rv);
1587 1587
1588 1588 case SATA_CFGA_PORT_DEACTIVATE:
1589 1589 /*
1590 1590 * Arbitrarily unconfigure attached device, if any.
1591 1591 * Even if the unconfigure fails, proceed with the
1592 1592 * port deactivation.
1593 1593 */
1594 1594 rv = sata_ioctl_deactivate(sata_hba_inst, &sata_device);
1595 1595
1596 1596 break;
1597 1597
1598 1598 case SATA_CFGA_PORT_ACTIVATE:
1599 1599
1600 1600 rv = sata_ioctl_activate(sata_hba_inst, &sata_device);
1601 1601 break;
1602 1602
1603 1603 case SATA_CFGA_PORT_SELF_TEST:
1604 1604
1605 1605 rv = sata_ioctl_port_self_test(sata_hba_inst,
1606 1606 &sata_device);
1607 1607 break;
1608 1608
1609 1609 case SATA_CFGA_GET_DEVICE_PATH:
1610 1610
1611 1611 rv = sata_ioctl_get_device_path(sata_hba_inst,
1612 1612 &sata_device, &ioc, mode);
1613 1613 break;
1614 1614
1615 1615 case SATA_CFGA_GET_AP_TYPE:
1616 1616
1617 1617 rv = sata_ioctl_get_ap_type(sata_hba_inst,
1618 1618 &sata_device, &ioc, mode);
1619 1619 break;
1620 1620
1621 1621 case SATA_CFGA_GET_MODEL_INFO:
1622 1622
1623 1623 rv = sata_ioctl_get_model_info(sata_hba_inst,
1624 1624 &sata_device, &ioc, mode);
1625 1625 break;
1626 1626
1627 1627 case SATA_CFGA_GET_REVFIRMWARE_INFO:
1628 1628
1629 1629 rv = sata_ioctl_get_revfirmware_info(sata_hba_inst,
1630 1630 &sata_device, &ioc, mode);
1631 1631 break;
1632 1632
1633 1633 case SATA_CFGA_GET_SERIALNUMBER_INFO:
1634 1634
1635 1635 rv = sata_ioctl_get_serialnumber_info(sata_hba_inst,
1636 1636 &sata_device, &ioc, mode);
1637 1637 break;
1638 1638
1639 1639 default:
1640 1640 rv = EINVAL;
1641 1641 break;
1642 1642
1643 1643 } /* End of DEVCTL_AP_CONTROL cmd switch */
1644 1644
1645 1645 break;
1646 1646 }
1647 1647
1648 1648 default:
1649 1649 {
1650 1650 /*
1651 1651 * If we got here, we got an IOCTL that SATA HBA Framework
1652 1652 * does not recognize. Pass ioctl to HBA driver, in case
1653 1653 * it could process it.
1654 1654 */
1655 1655 sata_hba_tran_t *sata_tran = sata_hba_inst->satahba_tran;
1656 1656 dev_info_t *mydip = SATA_DIP(sata_hba_inst);
1657 1657
1658 1658 SATADBG1(SATA_DBG_IOCTL_IF, sata_hba_inst,
1659 1659 "IOCTL 0x%2x not supported in SATA framework, "
1660 1660 "passthrough to HBA", cmd);
1661 1661
1662 1662 if (sata_tran->sata_tran_ioctl == NULL) {
1663 1663 rv = EINVAL;
1664 1664 break;
1665 1665 }
1666 1666 rval = (*sata_tran->sata_tran_ioctl)(mydip, cmd, arg);
1667 1667 if (rval != 0) {
1668 1668 SATADBG1(SATA_DBG_IOCTL_IF, sata_hba_inst,
1669 1669 "IOCTL 0x%2x failed in HBA", cmd);
|
↓ open down ↓ |
307 lines elided |
↑ open up ↑ |
1670 1670 rv = rval;
1671 1671 }
1672 1672 break;
1673 1673 }
1674 1674
1675 1675 } /* End of main IOCTL switch */
1676 1676
1677 1677 if (dcp) {
1678 1678 ndi_dc_freehdl(dcp);
1679 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 1680
1681 + if (cmd >= DEVCTL_IOC && cmd <= DEVCTL_IOC_MAX) {
1682 + mutex_enter(&SATA_CPORT_INFO(sata_hba_inst,
1683 + cport)->cport_mutex);
1684 + cportinfo->cport_event_flags &= ~SATA_APCTL_LOCK_PORT_BUSY;
1685 + mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, cport)->cport_mutex);
1686 + }
1687 +
1684 1688 return (rv);
1685 1689 }
1686 1690
1687 1691
1688 1692 /*
1689 1693 * Create error retrieval sata packet
1690 1694 *
1691 1695 * A sata packet is allocated and set-up to contain specified error retrieval
1692 1696 * command and appropriate dma-able data buffer.
1693 1697 * No association with any scsi packet is made and no callback routine is
1694 1698 * specified.
1695 1699 *
1696 1700 * Returns a pointer to sata packet upon successful packet creation.
1697 1701 * Returns NULL, if packet cannot be created.
1698 1702 */
1699 1703 sata_pkt_t *
1700 1704 sata_get_error_retrieval_pkt(dev_info_t *dip, sata_device_t *sata_device,
1701 1705 int pkt_type)
1702 1706 {
1703 1707 sata_hba_inst_t *sata_hba_inst;
1704 1708 sata_pkt_txlate_t *spx;
1705 1709 sata_pkt_t *spkt;
1706 1710 sata_drive_info_t *sdinfo;
1707 1711
1708 1712 mutex_enter(&sata_mutex);
1709 1713 for (sata_hba_inst = sata_hba_list; sata_hba_inst != NULL;
1710 1714 sata_hba_inst = sata_hba_inst->satahba_next) {
1711 1715 if (SATA_DIP(sata_hba_inst) == dip)
1712 1716 break;
1713 1717 }
1714 1718 mutex_exit(&sata_mutex);
1715 1719 ASSERT(sata_hba_inst != NULL);
1716 1720
1717 1721 sdinfo = sata_get_device_info(sata_hba_inst, sata_device);
1718 1722 if (sdinfo == NULL) {
1719 1723 sata_log(sata_hba_inst, CE_WARN,
1720 1724 "sata: error recovery request for non-attached device at "
1721 1725 "cport %d", sata_device->satadev_addr.cport);
1722 1726 return (NULL);
1723 1727 }
1724 1728
1725 1729 spx = kmem_zalloc(sizeof (sata_pkt_txlate_t), KM_SLEEP);
1726 1730 spx->txlt_sata_hba_inst = sata_hba_inst;
1727 1731 spx->txlt_scsi_pkt = NULL; /* No scsi pkt involved */
1728 1732 spkt = sata_pkt_alloc(spx, NULL);
1729 1733 if (spkt == NULL) {
1730 1734 kmem_free(spx, sizeof (sata_pkt_txlate_t));
1731 1735 return (NULL);
1732 1736 }
1733 1737 /* address is needed now */
1734 1738 spkt->satapkt_device.satadev_addr = sata_device->satadev_addr;
1735 1739
1736 1740 switch (pkt_type) {
1737 1741 case SATA_ERR_RETR_PKT_TYPE_NCQ:
1738 1742 if (sata_ncq_err_ret_cmd_setup(spx, sdinfo) == SATA_SUCCESS) {
1739 1743 if (sata_check_for_dma_error(dip, spx)) {
1740 1744 ddi_fm_service_impact(dip,
1741 1745 DDI_SERVICE_UNAFFECTED);
1742 1746 break;
1743 1747 }
1744 1748 return (spkt);
1745 1749 }
1746 1750 break;
1747 1751
1748 1752 case SATA_ERR_RETR_PKT_TYPE_ATAPI:
1749 1753 if (sata_atapi_err_ret_cmd_setup(spx, sdinfo) == SATA_SUCCESS) {
1750 1754 if (sata_check_for_dma_error(dip, spx)) {
1751 1755 ddi_fm_service_impact(dip,
1752 1756 DDI_SERVICE_UNAFFECTED);
1753 1757 break;
1754 1758 }
1755 1759 return (spkt);
1756 1760 }
1757 1761 break;
1758 1762
1759 1763 default:
1760 1764 break;
1761 1765 }
1762 1766
1763 1767 sata_pkt_free(spx);
1764 1768 kmem_free(spx, sizeof (sata_pkt_txlate_t));
1765 1769 return (NULL);
1766 1770
1767 1771 }
1768 1772
1769 1773
1770 1774 /*
1771 1775 * Free error retrieval sata packet
1772 1776 *
1773 1777 * Free sata packet and any associated resources allocated previously by
1774 1778 * sata_get_error_retrieval_pkt().
1775 1779 *
1776 1780 * Void return.
1777 1781 */
1778 1782 void
1779 1783 sata_free_error_retrieval_pkt(sata_pkt_t *sata_pkt)
1780 1784 {
1781 1785 sata_pkt_txlate_t *spx =
1782 1786 (sata_pkt_txlate_t *)sata_pkt->satapkt_framework_private;
1783 1787
1784 1788 ASSERT(sata_pkt != NULL);
1785 1789
1786 1790 sata_free_local_buffer(spx);
1787 1791 sata_pkt_free(spx);
1788 1792 kmem_free(spx, sizeof (sata_pkt_txlate_t));
1789 1793
1790 1794 }
1791 1795
1792 1796 /*
1793 1797 * Create READ PORT MULTIPLIER and WRITE PORT MULTIPLIER sata packet
1794 1798 *
1795 1799 * No association with any scsi packet is made and no callback routine is
1796 1800 * specified.
1797 1801 *
1798 1802 * Returns a pointer to sata packet upon successful packet creation.
1799 1803 * Returns NULL, if packet cannot be created.
1800 1804 *
1801 1805 * NOTE: Input/Output value includes 64 bits accoring to SATA Spec 2.6,
1802 1806 * only lower 32 bits are available currently.
1803 1807 */
1804 1808 sata_pkt_t *
1805 1809 sata_get_rdwr_pmult_pkt(dev_info_t *dip, sata_device_t *sd,
1806 1810 uint8_t regn, uint32_t regv, uint32_t type)
1807 1811 {
1808 1812 sata_hba_inst_t *sata_hba_inst;
1809 1813 sata_pkt_txlate_t *spx;
1810 1814 sata_pkt_t *spkt;
1811 1815 sata_cmd_t *scmd;
1812 1816
1813 1817 /* Only READ/WRITE commands are accepted. */
1814 1818 ASSERT(type == SATA_RDWR_PMULT_PKT_TYPE_READ ||
1815 1819 type == SATA_RDWR_PMULT_PKT_TYPE_WRITE);
1816 1820
1817 1821 mutex_enter(&sata_mutex);
1818 1822 for (sata_hba_inst = sata_hba_list; sata_hba_inst != NULL;
1819 1823 sata_hba_inst = sata_hba_inst->satahba_next) {
1820 1824 if (SATA_DIP(sata_hba_inst) == dip)
1821 1825 break;
1822 1826 }
1823 1827 mutex_exit(&sata_mutex);
1824 1828 ASSERT(sata_hba_inst != NULL);
1825 1829
1826 1830 spx = kmem_zalloc(sizeof (sata_pkt_txlate_t), KM_SLEEP);
1827 1831 spx->txlt_sata_hba_inst = sata_hba_inst;
1828 1832 spx->txlt_scsi_pkt = NULL; /* No scsi pkt involved */
1829 1833 spkt = sata_pkt_alloc(spx, SLEEP_FUNC);
1830 1834 if (spkt == NULL) {
1831 1835 kmem_free(spx, sizeof (sata_pkt_txlate_t));
1832 1836 return (NULL);
1833 1837 }
1834 1838
1835 1839 /*
1836 1840 * NOTE: We need to send this command to the port multiplier,
1837 1841 * that means send to SATA_PMULT_HOSTPORT(0xf) pmport
1838 1842 *
1839 1843 * sata_device contains the address of actual target device, and the
1840 1844 * pmport number in the command comes from the sata_device structure.
1841 1845 */
1842 1846 spkt->satapkt_device.satadev_addr = sd->satadev_addr;
1843 1847 spkt->satapkt_device.satadev_addr.pmport = SATA_PMULT_HOSTPORT;
1844 1848 spkt->satapkt_device.satadev_addr.qual = SATA_ADDR_PMULT;
1845 1849
1846 1850 /* Fill sata_pkt */
1847 1851 spkt->satapkt_op_mode = SATA_OPMODE_SYNCH | SATA_OPMODE_POLLING;
1848 1852 spkt->satapkt_comp = NULL; /* Synchronous mode, no callback */
1849 1853 spkt->satapkt_time = 10; /* Timeout 10s */
1850 1854
1851 1855 /* Build READ PORT MULTIPLIER cmd in the sata_pkt */
1852 1856 scmd = &spkt->satapkt_cmd;
1853 1857 scmd->satacmd_features_reg = regn & 0xff;
1854 1858 scmd->satacmd_features_reg_ext = (regn >> 8) & 0xff;
1855 1859 scmd->satacmd_device_reg = sd->satadev_addr.pmport;
1856 1860 scmd->satacmd_addr_type = 0; /* N/A */
1857 1861
1858 1862 scmd->satacmd_flags.sata_ignore_dev_reset = B_TRUE;
1859 1863
1860 1864 if (type == SATA_RDWR_PMULT_PKT_TYPE_READ) {
1861 1865 scmd->satacmd_cmd_reg = SATAC_READ_PORTMULT;
1862 1866 scmd->satacmd_flags.sata_data_direction = SATA_DIR_READ;
1863 1867 scmd->satacmd_flags.sata_special_regs = 1;
1864 1868 scmd->satacmd_flags.sata_copy_out_lba_high_lsb = 1;
1865 1869 scmd->satacmd_flags.sata_copy_out_lba_mid_lsb = 1;
1866 1870 scmd->satacmd_flags.sata_copy_out_lba_low_lsb = 1;
1867 1871 scmd->satacmd_flags.sata_copy_out_sec_count_lsb = 1;
1868 1872 } else if (type == SATA_RDWR_PMULT_PKT_TYPE_WRITE) {
1869 1873 scmd->satacmd_cmd_reg = SATAC_WRITE_PORTMULT;
1870 1874 scmd->satacmd_flags.sata_data_direction = SATA_DIR_WRITE;
1871 1875 scmd->satacmd_sec_count_lsb = regv & 0xff;
1872 1876 scmd->satacmd_lba_low_lsb = regv >> 8 & 0xff;
1873 1877 scmd->satacmd_lba_mid_lsb = regv >> 16 & 0xff;
1874 1878 scmd->satacmd_lba_high_lsb = regv >> 24 & 0xff;
1875 1879 }
1876 1880
1877 1881 return (spkt);
1878 1882 }
1879 1883
1880 1884 /*
1881 1885 * Free sata packet and any associated resources allocated previously by
1882 1886 * sata_get_rdwr_pmult_pkt().
1883 1887 *
1884 1888 * Void return.
1885 1889 */
1886 1890 void
1887 1891 sata_free_rdwr_pmult_pkt(sata_pkt_t *sata_pkt)
1888 1892 {
1889 1893 sata_pkt_txlate_t *spx =
1890 1894 (sata_pkt_txlate_t *)sata_pkt->satapkt_framework_private;
1891 1895
1892 1896 /* Free allocated resources */
1893 1897 sata_pkt_free(spx);
1894 1898 kmem_free(spx, sizeof (sata_pkt_txlate_t));
1895 1899 }
1896 1900
1897 1901 /*
1898 1902 * Register a port multiplier to framework.
1899 1903 * 1) Store the GSCR values in the previous allocated pmult_info strctures.
1900 1904 * 2) Search in the blacklist and update the number of the device ports of the
1901 1905 * port multiplier.
1902 1906 *
1903 1907 * Void return.
1904 1908 */
1905 1909 void
1906 1910 sata_register_pmult(dev_info_t *dip, sata_device_t *sd, sata_pmult_gscr_t *sg)
1907 1911 {
1908 1912 sata_hba_inst_t *sata_hba_inst = NULL;
1909 1913 sata_pmult_info_t *pmultinfo;
1910 1914 sata_pmult_bl_t *blp;
1911 1915 int cport = sd->satadev_addr.cport;
1912 1916
1913 1917 mutex_enter(&sata_mutex);
1914 1918 for (sata_hba_inst = sata_hba_list; sata_hba_inst != NULL;
1915 1919 sata_hba_inst = sata_hba_inst->satahba_next) {
1916 1920 if (SATA_DIP(sata_hba_inst) == dip)
1917 1921 if (sata_hba_inst->satahba_attached == 1)
1918 1922 break;
1919 1923 }
1920 1924 mutex_exit(&sata_mutex);
1921 1925 /* HBA not attached? */
1922 1926 if (sata_hba_inst == NULL)
1923 1927 return;
1924 1928
1925 1929 /* Number of pmports */
1926 1930 sd->satadev_add_info = sg->gscr2 & SATA_PMULT_PORTNUM_MASK;
1927 1931
1928 1932 /* Check the blacklist */
1929 1933 for (blp = sata_pmult_blacklist; blp->bl_gscr0; blp++) {
1930 1934 if (sg->gscr0 != blp->bl_gscr0 && blp->bl_gscr0)
1931 1935 continue;
1932 1936 if (sg->gscr1 != blp->bl_gscr1 && blp->bl_gscr1)
1933 1937 continue;
1934 1938 if (sg->gscr2 != blp->bl_gscr2 && blp->bl_gscr2)
1935 1939 continue;
1936 1940
1937 1941 cmn_err(CE_WARN, "!Port multiplier is on the blacklist.");
1938 1942 sd->satadev_add_info = blp->bl_flags;
1939 1943 break;
1940 1944 }
1941 1945
1942 1946 /* Register the port multiplier GSCR */
1943 1947 mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst, cport)));
1944 1948 pmultinfo = SATA_PMULT_INFO(sata_hba_inst, cport);
1945 1949 if (pmultinfo != NULL) {
1946 1950 pmultinfo->pmult_gscr = *sg;
1947 1951 pmultinfo->pmult_num_dev_ports =
1948 1952 sd->satadev_add_info & SATA_PMULT_PORTNUM_MASK;
1949 1953 SATADBG1(SATA_DBG_PMULT, sata_hba_inst,
1950 1954 "Port multiplier registered at port %d", cport);
1951 1955 }
1952 1956 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst, cport)));
1953 1957 }
1954 1958
1955 1959 /*
1956 1960 * sata_split_model splits the model ID into vendor and product IDs.
1957 1961 * It assumes that a vendor ID cannot be longer than 8 characters, and
1958 1962 * that vendor and product ID are separated by a whitespace.
1959 1963 */
1960 1964 void
1961 1965 sata_split_model(char *model, char **vendor, char **product)
1962 1966 {
1963 1967 int i, modlen;
1964 1968 char *vid, *pid;
1965 1969
1966 1970 /*
1967 1971 * remove whitespace at the end of model
1968 1972 */
1969 1973 for (i = SATA_ID_MODEL_LEN; i > 0; i--)
1970 1974 if (model[i] == ' ' || model[i] == '\t' || model[i] == '\0')
1971 1975 model[i] = '\0';
1972 1976 else
1973 1977 break;
1974 1978
1975 1979 /*
1976 1980 * try to split model into into vid/pid
1977 1981 */
1978 1982 modlen = strlen(model);
1979 1983 for (i = 0, pid = model; i < modlen; i++, pid++)
1980 1984 if ((*pid == ' ') || (*pid == '\t'))
1981 1985 break;
1982 1986
1983 1987 /*
1984 1988 * only use vid if it is less than 8 chars (as in SCSI)
1985 1989 */
1986 1990 if (i < modlen && i <= 8) {
1987 1991 vid = model;
1988 1992 /*
1989 1993 * terminate vid, establish pid
1990 1994 */
1991 1995 *pid++ = '\0';
1992 1996 } else {
1993 1997 /*
1994 1998 * vid will stay "ATA "
1995 1999 */
1996 2000 vid = NULL;
1997 2001 /*
1998 2002 * model is all pid
1999 2003 */
2000 2004 pid = model;
2001 2005 }
2002 2006
2003 2007 *vendor = vid;
2004 2008 *product = pid;
2005 2009 }
2006 2010
2007 2011 /*
2008 2012 * sata_name_child is for composing the name of the node
2009 2013 * the format of the name is "target,0".
2010 2014 */
2011 2015 static int
2012 2016 sata_name_child(dev_info_t *dip, char *name, int namelen)
2013 2017 {
2014 2018 int target;
2015 2019
2016 2020 target = ddi_prop_get_int(DDI_DEV_T_ANY, dip,
2017 2021 DDI_PROP_DONTPASS, "target", -1);
2018 2022 if (target == -1)
2019 2023 return (DDI_FAILURE);
2020 2024 (void) snprintf(name, namelen, "%x,0", target);
2021 2025 return (DDI_SUCCESS);
2022 2026 }
2023 2027
2024 2028
2025 2029
2026 2030 /* ****************** SCSA required entry points *********************** */
2027 2031
2028 2032 /*
2029 2033 * Implementation of scsi tran_tgt_init.
2030 2034 * sata_scsi_tgt_init() initializes scsi_device structure
2031 2035 *
2032 2036 * If successful, DDI_SUCCESS is returned.
2033 2037 * DDI_FAILURE is returned if addressed device does not exist
2034 2038 */
2035 2039
2036 2040 static int
2037 2041 sata_scsi_tgt_init(dev_info_t *hba_dip, dev_info_t *tgt_dip,
2038 2042 scsi_hba_tran_t *hba_tran, struct scsi_device *sd)
2039 2043 {
2040 2044 #ifndef __lock_lint
2041 2045 _NOTE(ARGUNUSED(hba_dip))
2042 2046 _NOTE(ARGUNUSED(tgt_dip))
2043 2047 #endif
2044 2048 sata_device_t sata_device;
2045 2049 sata_drive_info_t *sdinfo;
2046 2050 struct sata_id *sid;
2047 2051 sata_hba_inst_t *sata_hba_inst;
2048 2052 char model[SATA_ID_MODEL_LEN + 1];
2049 2053 char fw[SATA_ID_FW_LEN + 1];
2050 2054 char *vid, *pid;
2051 2055
2052 2056 /*
2053 2057 * Fail tran_tgt_init for .conf stub node
2054 2058 */
2055 2059 if (ndi_dev_is_persistent_node(tgt_dip) == 0) {
2056 2060 (void) ndi_merge_node(tgt_dip, sata_name_child);
2057 2061 ddi_set_name_addr(tgt_dip, NULL);
2058 2062 return (DDI_FAILURE);
2059 2063 }
2060 2064
2061 2065 sata_hba_inst = (sata_hba_inst_t *)(hba_tran->tran_hba_private);
2062 2066
2063 2067 /* Validate scsi device address */
2064 2068 if (sata_validate_scsi_address(sata_hba_inst, &sd->sd_address,
2065 2069 &sata_device) != 0)
2066 2070 return (DDI_FAILURE);
2067 2071
2068 2072 mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst,
2069 2073 sata_device.satadev_addr.cport)));
2070 2074
2071 2075 /* sata_device now contains a valid sata address */
2072 2076 sdinfo = sata_get_device_info(sata_hba_inst, &sata_device);
2073 2077 if (sdinfo == NULL) {
2074 2078 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
2075 2079 sata_device.satadev_addr.cport)));
2076 2080 return (DDI_FAILURE);
2077 2081 }
2078 2082 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
2079 2083 sata_device.satadev_addr.cport)));
2080 2084
2081 2085 /*
2082 2086 * Check if we need to create a legacy devid (i.e cmdk style) for
2083 2087 * the target disks.
2084 2088 *
2085 2089 * HBA devinfo node will have the property "use-cmdk-devid-format"
2086 2090 * if we need to create cmdk-style devid for all the disk devices
2087 2091 * attached to this controller. This property may have been set
2088 2092 * from HBA driver's .conf file or by the HBA driver in its
2089 2093 * attach(9F) function.
2090 2094 */
2091 2095 if ((sdinfo->satadrv_type == SATA_DTYPE_ATADISK) &&
2092 2096 (ddi_getprop(DDI_DEV_T_ANY, hba_dip, DDI_PROP_DONTPASS,
2093 2097 "use-cmdk-devid-format", 0) == 1)) {
2094 2098 /* register a legacy devid for this target node */
2095 2099 sata_target_devid_register(tgt_dip, sdinfo);
2096 2100 }
2097 2101
2098 2102
2099 2103 /*
2100 2104 * 'Identify Device Data' does not always fit in standard SCSI
2101 2105 * INQUIRY data, so establish INQUIRY_* properties with full-form
2102 2106 * of information.
2103 2107 */
2104 2108 sid = &sdinfo->satadrv_id;
2105 2109 #ifdef _LITTLE_ENDIAN
2106 2110 swab(sid->ai_model, model, SATA_ID_MODEL_LEN);
2107 2111 swab(sid->ai_fw, fw, SATA_ID_FW_LEN);
2108 2112 #else /* _LITTLE_ENDIAN */
2109 2113 bcopy(sid->ai_model, model, SATA_ID_MODEL_LEN);
2110 2114 bcopy(sid->ai_fw, fw, SATA_ID_FW_LEN);
2111 2115 #endif /* _LITTLE_ENDIAN */
2112 2116 model[SATA_ID_MODEL_LEN] = 0;
2113 2117 fw[SATA_ID_FW_LEN] = 0;
2114 2118
2115 2119 sata_split_model(model, &vid, &pid);
2116 2120
2117 2121 if (vid)
2118 2122 (void) scsi_device_prop_update_inqstring(sd, INQUIRY_VENDOR_ID,
2119 2123 vid, strlen(vid));
2120 2124 if (pid)
2121 2125 (void) scsi_device_prop_update_inqstring(sd, INQUIRY_PRODUCT_ID,
2122 2126 pid, strlen(pid));
2123 2127 (void) scsi_device_prop_update_inqstring(sd, INQUIRY_REVISION_ID,
2124 2128 fw, strlen(fw));
2125 2129
2126 2130 return (DDI_SUCCESS);
2127 2131 }
2128 2132
2129 2133 /*
2130 2134 * Implementation of scsi tran_tgt_probe.
2131 2135 * Probe target, by calling default scsi routine scsi_hba_probe()
2132 2136 */
2133 2137 static int
2134 2138 sata_scsi_tgt_probe(struct scsi_device *sd, int (*callback)(void))
2135 2139 {
2136 2140 sata_hba_inst_t *sata_hba_inst =
2137 2141 (sata_hba_inst_t *)(sd->sd_address.a_hba_tran->tran_hba_private);
2138 2142 int rval;
2139 2143 uint32_t pm_cap;
2140 2144
2141 2145 rval = scsi_hba_probe(sd, callback);
2142 2146 pm_cap = SATA_CAP_POWER_CONDITON | SATA_CAP_SMART_PAGE |
2143 2147 SATA_CAP_LOG_SENSE;
2144 2148
2145 2149 if (rval == SCSIPROBE_EXISTS) {
2146 2150 /*
2147 2151 * Set property "pm-capable" on the target device node, so that
2148 2152 * the target driver will not try to fetch scsi cycle counters
2149 2153 * before enabling device power-management.
2150 2154 */
2151 2155 if ((ddi_prop_update_int(DDI_DEV_T_NONE, sd->sd_dev,
2152 2156 "pm-capable", pm_cap)) != DDI_PROP_SUCCESS) {
2153 2157 sata_log(sata_hba_inst, CE_WARN,
2154 2158 "SATA device at port %d: "
2155 2159 "will not be power-managed ",
2156 2160 SCSI_TO_SATA_CPORT(sd->sd_address.a_target));
2157 2161 SATA_LOG_D((sata_hba_inst, CE_WARN,
2158 2162 "failure updating pm-capable property"));
2159 2163 }
2160 2164 }
2161 2165 return (rval);
2162 2166 }
2163 2167
2164 2168 /*
2165 2169 * Implementation of scsi tran_tgt_free.
2166 2170 * Release all resources allocated for scsi_device
2167 2171 */
2168 2172 static void
2169 2173 sata_scsi_tgt_free(dev_info_t *hba_dip, dev_info_t *tgt_dip,
2170 2174 scsi_hba_tran_t *hba_tran, struct scsi_device *sd)
2171 2175 {
2172 2176 #ifndef __lock_lint
2173 2177 _NOTE(ARGUNUSED(hba_dip))
2174 2178 #endif
2175 2179 sata_device_t sata_device;
2176 2180 sata_drive_info_t *sdinfo;
2177 2181 sata_hba_inst_t *sata_hba_inst;
2178 2182 ddi_devid_t devid;
2179 2183
2180 2184 sata_hba_inst = (sata_hba_inst_t *)(hba_tran->tran_hba_private);
2181 2185
2182 2186 /* Validate scsi device address */
2183 2187 /*
2184 2188 * Note: tgt_free relates to the SCSA view of a device. If called, there
2185 2189 * was a device at this address, so even if the sata framework internal
2186 2190 * resources were alredy released because a device was detached,
2187 2191 * this function should be executed as long as its actions do
2188 2192 * not require the internal sata view of a device and the address
2189 2193 * refers to a valid sata address.
2190 2194 * Validating the address here means that we do not trust SCSA...
2191 2195 */
2192 2196 if (sata_validate_scsi_address(sata_hba_inst, &sd->sd_address,
2193 2197 &sata_device) == -1)
2194 2198 return;
2195 2199
2196 2200 mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst,
2197 2201 sata_device.satadev_addr.cport)));
2198 2202
2199 2203 /* sata_device now should contain a valid sata address */
2200 2204 sdinfo = sata_get_device_info(sata_hba_inst, &sata_device);
2201 2205 if (sdinfo == NULL) {
2202 2206 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
2203 2207 sata_device.satadev_addr.cport)));
2204 2208 return;
2205 2209 }
2206 2210 /*
2207 2211 * We did not allocate any resources in sata_scsi_tgt_init()
2208 2212 * other than few properties.
2209 2213 * Free them.
2210 2214 */
2211 2215 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
2212 2216 sata_device.satadev_addr.cport)));
2213 2217 (void) ndi_prop_remove(DDI_DEV_T_NONE, tgt_dip, "pm-capable");
2214 2218
2215 2219 /*
2216 2220 * If devid was previously created but not freed up from
2217 2221 * sd(7D) driver (i.e during detach(9F)) then do it here.
2218 2222 */
2219 2223 if ((sdinfo->satadrv_type == SATA_DTYPE_ATADISK) &&
2220 2224 (ddi_getprop(DDI_DEV_T_ANY, hba_dip, DDI_PROP_DONTPASS,
2221 2225 "use-cmdk-devid-format", 0) == 1) &&
2222 2226 (ddi_devid_get(tgt_dip, &devid) == DDI_SUCCESS)) {
2223 2227 ddi_devid_unregister(tgt_dip);
2224 2228 ddi_devid_free(devid);
2225 2229 }
2226 2230 }
2227 2231
2228 2232 /*
2229 2233 * Implementation of scsi tran_init_pkt
2230 2234 * Upon successful return, scsi pkt buffer has DMA resources allocated.
2231 2235 *
2232 2236 * It seems that we should always allocate pkt, even if the address is
2233 2237 * for non-existing device - just use some default for dma_attr.
2234 2238 * The reason is that there is no way to communicate this to a caller here.
2235 2239 * Subsequent call to sata_scsi_start may fail appropriately.
2236 2240 * Simply returning NULL does not seem to discourage a target driver...
2237 2241 *
2238 2242 * Returns a pointer to initialized scsi_pkt, or NULL otherwise.
2239 2243 */
2240 2244 static struct scsi_pkt *
2241 2245 sata_scsi_init_pkt(struct scsi_address *ap, struct scsi_pkt *pkt,
2242 2246 struct buf *bp, int cmdlen, int statuslen, int tgtlen, int flags,
2243 2247 int (*callback)(caddr_t), caddr_t arg)
2244 2248 {
2245 2249 sata_hba_inst_t *sata_hba_inst =
2246 2250 (sata_hba_inst_t *)(ap->a_hba_tran->tran_hba_private);
2247 2251 dev_info_t *dip = SATA_DIP(sata_hba_inst);
2248 2252 sata_device_t sata_device;
2249 2253 sata_drive_info_t *sdinfo;
2250 2254 sata_pkt_txlate_t *spx;
2251 2255 ddi_dma_attr_t cur_dma_attr;
2252 2256 int rval;
2253 2257 boolean_t new_pkt = B_TRUE;
2254 2258
2255 2259 ASSERT(ap->a_hba_tran->tran_hba_dip == dip);
2256 2260
2257 2261 /*
2258 2262 * We need to translate the address, even if it could be
2259 2263 * a bogus one, for a non-existing device
2260 2264 */
2261 2265 sata_device.satadev_addr.qual = SCSI_TO_SATA_ADDR_QUAL(ap->a_target);
2262 2266 sata_device.satadev_addr.cport = SCSI_TO_SATA_CPORT(ap->a_target);
2263 2267 sata_device.satadev_addr.pmport = SCSI_TO_SATA_PMPORT(ap->a_target);
2264 2268 sata_device.satadev_rev = SATA_DEVICE_REV;
2265 2269
2266 2270 if (pkt == NULL) {
2267 2271 /*
2268 2272 * Have to allocate a brand new scsi packet.
2269 2273 * We need to operate with auto request sense enabled.
2270 2274 */
2271 2275 pkt = scsi_hba_pkt_alloc(dip, ap, cmdlen,
2272 2276 MAX(statuslen, SATA_MAX_SENSE_LEN),
2273 2277 tgtlen, sizeof (sata_pkt_txlate_t), callback, arg);
2274 2278
2275 2279 if (pkt == NULL)
2276 2280 return (NULL);
2277 2281
2278 2282 /* Fill scsi packet structure */
2279 2283 pkt->pkt_comp = (void (*)())NULL;
2280 2284 pkt->pkt_time = 0;
2281 2285 pkt->pkt_resid = 0;
2282 2286 pkt->pkt_statistics = 0;
2283 2287 pkt->pkt_reason = 0;
2284 2288
2285 2289 /*
2286 2290 * pkt_hba_private will point to sata pkt txlate structure
2287 2291 */
2288 2292 spx = (sata_pkt_txlate_t *)pkt->pkt_ha_private;
2289 2293 bzero(spx, sizeof (sata_pkt_txlate_t));
2290 2294
2291 2295 spx->txlt_scsi_pkt = pkt;
2292 2296 spx->txlt_sata_hba_inst = sata_hba_inst;
2293 2297
2294 2298 /* Allocate sata_pkt */
2295 2299 spx->txlt_sata_pkt = sata_pkt_alloc(spx, callback);
2296 2300 if (spx->txlt_sata_pkt == NULL) {
2297 2301 /* Could not allocate sata pkt */
2298 2302 scsi_hba_pkt_free(ap, pkt);
2299 2303 return (NULL);
2300 2304 }
2301 2305 /* Set sata address */
2302 2306 spx->txlt_sata_pkt->satapkt_device.satadev_addr =
2303 2307 sata_device.satadev_addr;
2304 2308 spx->txlt_sata_pkt->satapkt_device.satadev_rev =
2305 2309 sata_device.satadev_rev;
2306 2310
2307 2311 if ((bp == NULL) || (bp->b_bcount == 0))
2308 2312 return (pkt);
2309 2313
2310 2314 spx->txlt_total_residue = bp->b_bcount;
2311 2315 } else {
2312 2316 new_pkt = B_FALSE;
2313 2317 /*
2314 2318 * Packet was preallocated/initialized by previous call
2315 2319 */
2316 2320 spx = (sata_pkt_txlate_t *)pkt->pkt_ha_private;
2317 2321
2318 2322 if ((bp == NULL) || (bp->b_bcount == 0)) {
2319 2323 return (pkt);
2320 2324 }
2321 2325
2322 2326 /* Pkt is available already: spx->txlt_scsi_pkt == pkt; */
2323 2327 }
2324 2328
2325 2329 spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp = bp;
2326 2330
2327 2331 /*
2328 2332 * We use an adjusted version of the dma_attr, to account
2329 2333 * for device addressing limitations.
2330 2334 * sata_adjust_dma_attr() will handle sdinfo == NULL which may
2331 2335 * happen when a device is not yet configured.
2332 2336 */
2333 2337 mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst,
2334 2338 sata_device.satadev_addr.cport)));
2335 2339 sdinfo = sata_get_device_info(spx->txlt_sata_hba_inst,
2336 2340 &spx->txlt_sata_pkt->satapkt_device);
2337 2341 /* NULL sdinfo may be passsed to sata_adjust_dma_attr() */
2338 2342 sata_adjust_dma_attr(sdinfo,
2339 2343 SATA_DMA_ATTR(spx->txlt_sata_hba_inst), &cur_dma_attr);
2340 2344 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
2341 2345 sata_device.satadev_addr.cport)));
2342 2346 /*
2343 2347 * Allocate necessary DMA resources for the packet's data buffer
2344 2348 * NOTE:
2345 2349 * In case of read/write commands, DMA resource allocation here is
2346 2350 * based on the premise that the transfer length specified in
2347 2351 * the read/write scsi cdb will match exactly DMA resources -
2348 2352 * returning correct packet residue is crucial.
2349 2353 */
2350 2354 if ((rval = sata_dma_buf_setup(spx, flags, callback, arg,
2351 2355 &cur_dma_attr)) != DDI_SUCCESS) {
2352 2356 /*
2353 2357 * If a DMA allocation request fails with
2354 2358 * DDI_DMA_NOMAPPING, indicate the error by calling
2355 2359 * bioerror(9F) with bp and an error code of EFAULT.
2356 2360 * If a DMA allocation request fails with
2357 2361 * DDI_DMA_TOOBIG, indicate the error by calling
2358 2362 * bioerror(9F) with bp and an error code of EINVAL.
2359 2363 * For DDI_DMA_NORESOURCES, we may have some of them allocated.
2360 2364 * Request may be repeated later - there is no real error.
2361 2365 */
2362 2366 switch (rval) {
2363 2367 case DDI_DMA_NORESOURCES:
2364 2368 bioerror(bp, 0);
2365 2369 break;
2366 2370 case DDI_DMA_NOMAPPING:
2367 2371 case DDI_DMA_BADATTR:
2368 2372 bioerror(bp, EFAULT);
2369 2373 break;
2370 2374 case DDI_DMA_TOOBIG:
2371 2375 default:
2372 2376 bioerror(bp, EINVAL);
2373 2377 break;
2374 2378 }
2375 2379 goto fail;
2376 2380 }
2377 2381
2378 2382 if (sata_check_for_dma_error(dip, spx)) {
2379 2383 ddi_fm_service_impact(dip, DDI_SERVICE_UNAFFECTED);
2380 2384 bioerror(bp, EFAULT);
2381 2385 goto fail;
2382 2386 }
2383 2387
2384 2388 success:
2385 2389 /* Set number of bytes that are not yet accounted for */
2386 2390 pkt->pkt_resid = spx->txlt_total_residue;
2387 2391 ASSERT(pkt->pkt_resid >= 0);
2388 2392
2389 2393 return (pkt);
2390 2394
2391 2395 fail:
2392 2396 if (new_pkt == B_TRUE) {
2393 2397 /*
2394 2398 * Since this is a new packet, we can clean-up
2395 2399 * everything
2396 2400 */
2397 2401 sata_scsi_destroy_pkt(ap, pkt);
2398 2402 } else {
2399 2403 /*
2400 2404 * This is a re-used packet. It will be target driver's
2401 2405 * responsibility to eventually destroy it (which
2402 2406 * will free allocated resources).
2403 2407 * Here, we just "complete" the request, leaving
2404 2408 * allocated resources intact, so the request may
2405 2409 * be retried.
2406 2410 */
2407 2411 spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp = NULL;
2408 2412 sata_pkt_free(spx);
2409 2413 }
2410 2414 return (NULL);
2411 2415 }
2412 2416
2413 2417 /*
2414 2418 * Implementation of scsi tran_start.
2415 2419 * Translate scsi cmd into sata operation and return status.
2416 2420 * ATAPI CDBs are passed to ATAPI devices - the device determines what commands
2417 2421 * are supported.
2418 2422 * For SATA hard disks, supported scsi commands:
2419 2423 * SCMD_INQUIRY
2420 2424 * SCMD_TEST_UNIT_READY
2421 2425 * SCMD_START_STOP
2422 2426 * SCMD_READ_CAPACITY
2423 2427 * SCMD_SVC_ACTION_IN_G4 (READ CAPACITY (16))
2424 2428 * SCMD_REQUEST_SENSE
2425 2429 * SCMD_LOG_SENSE_G1
2426 2430 * SCMD_LOG_SELECT_G1
2427 2431 * SCMD_MODE_SENSE (specific pages)
2428 2432 * SCMD_MODE_SENSE_G1 (specific pages)
2429 2433 * SCMD_MODE_SELECT (specific pages)
2430 2434 * SCMD_MODE_SELECT_G1 (specific pages)
2431 2435 * SCMD_SYNCHRONIZE_CACHE
2432 2436 * SCMD_SYNCHRONIZE_CACHE_G1
2433 2437 * SCMD_READ
2434 2438 * SCMD_READ_G1
2435 2439 * SCMD_READ_G4
2436 2440 * SCMD_READ_G5
2437 2441 * SCMD_WRITE
2438 2442 * SCMD_WRITE_BUFFER
2439 2443 * SCMD_WRITE_G1
2440 2444 * SCMD_WRITE_G4
2441 2445 * SCMD_WRITE_G5
2442 2446 * SCMD_SEEK (noop)
2443 2447 * SCMD_SDIAG
2444 2448 *
2445 2449 * All other commands are rejected as unsupported.
2446 2450 *
2447 2451 * Returns:
2448 2452 * TRAN_ACCEPT if command was executed successfully or accepted by HBA driver
2449 2453 * for execution. TRAN_ACCEPT may be returned also if device was removed but
2450 2454 * a callback could be scheduled.
2451 2455 * TRAN_BADPKT if cmd was directed to invalid address.
2452 2456 * TRAN_FATAL_ERROR is command was rejected due to hardware error, including
2453 2457 * some unspecified error. TRAN_FATAL_ERROR may be also returned if a device
2454 2458 * was removed and there was no callback specified in scsi pkt.
2455 2459 * TRAN_BUSY if command could not be executed becasue HBA driver or SATA
2456 2460 * framework was busy performing some other operation(s).
2457 2461 *
2458 2462 */
2459 2463 static int
2460 2464 sata_scsi_start(struct scsi_address *ap, struct scsi_pkt *pkt)
2461 2465 {
2462 2466 sata_hba_inst_t *sata_hba_inst =
2463 2467 (sata_hba_inst_t *)(ap->a_hba_tran->tran_hba_private);
2464 2468 sata_pkt_txlate_t *spx = (sata_pkt_txlate_t *)pkt->pkt_ha_private;
2465 2469 sata_device_t *sdevice = &spx->txlt_sata_pkt->satapkt_device;
2466 2470 sata_drive_info_t *sdinfo;
2467 2471 struct buf *bp;
2468 2472 uint8_t cport, pmport;
2469 2473 boolean_t dev_gone = B_FALSE;
2470 2474 int rval;
2471 2475
2472 2476 SATADBG1(SATA_DBG_SCSI_IF, sata_hba_inst,
2473 2477 "sata_scsi_start: cmd 0x%02x\n", pkt->pkt_cdbp[0]);
2474 2478
2475 2479 ASSERT(spx != NULL &&
2476 2480 spx->txlt_scsi_pkt == pkt && spx->txlt_sata_pkt != NULL);
2477 2481
2478 2482 cport = SCSI_TO_SATA_CPORT(ap->a_target);
2479 2483 pmport = SCSI_TO_SATA_PMPORT(ap->a_target);
2480 2484
2481 2485 mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst, cport)));
2482 2486
2483 2487 if (sdevice->satadev_addr.qual == SATA_ADDR_DCPORT) {
2484 2488 sdinfo = sata_get_device_info(sata_hba_inst, sdevice);
2485 2489 if (sdinfo == NULL ||
2486 2490 SATA_CPORT_INFO(sata_hba_inst, cport)->
2487 2491 cport_tgtnode_clean == B_FALSE ||
2488 2492 (sdinfo->satadrv_state & SATA_DSTATE_FAILED) != 0) {
2489 2493 dev_gone = B_TRUE;
2490 2494 }
2491 2495 } else if (sdevice->satadev_addr.qual == SATA_ADDR_DPMPORT) {
2492 2496 if (SATA_CPORT_DEV_TYPE(sata_hba_inst, cport) !=
2493 2497 SATA_DTYPE_PMULT || SATA_PMULT_INFO(sata_hba_inst,
2494 2498 cport) == NULL) {
2495 2499 dev_gone = B_TRUE;
2496 2500 } else if (SATA_PMPORT_INFO(sata_hba_inst, cport,
2497 2501 pmport) == NULL) {
2498 2502 dev_gone = B_TRUE;
2499 2503 } else {
2500 2504 mutex_enter(&(SATA_PMPORT_MUTEX(sata_hba_inst,
2501 2505 cport, pmport)));
2502 2506 sdinfo = sata_get_device_info(sata_hba_inst, sdevice);
2503 2507 if (sdinfo == NULL ||
2504 2508 SATA_PMPORT_INFO(sata_hba_inst, cport, pmport)->
2505 2509 pmport_tgtnode_clean == B_FALSE ||
2506 2510 (sdinfo->satadrv_state & SATA_DSTATE_FAILED) != 0) {
2507 2511 dev_gone = B_TRUE;
2508 2512 }
2509 2513 mutex_exit(&(SATA_PMPORT_MUTEX(sata_hba_inst,
2510 2514 cport, pmport)));
2511 2515 }
2512 2516 }
2513 2517
2514 2518 if (dev_gone == B_TRUE) {
2515 2519 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst, cport)));
2516 2520 pkt->pkt_reason = CMD_DEV_GONE;
2517 2521 /*
2518 2522 * The sd target driver is checking CMD_DEV_GONE pkt_reason
2519 2523 * only in callback function (for normal requests) and
2520 2524 * in the dump code path.
2521 2525 * So, if the callback is available, we need to do
2522 2526 * the callback rather than returning TRAN_FATAL_ERROR here.
2523 2527 */
2524 2528 if (pkt->pkt_comp != NULL) {
2525 2529 /* scsi callback required */
2526 2530 if (servicing_interrupt()) {
2527 2531 if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
2528 2532 (task_func_t *)spx->txlt_scsi_pkt->pkt_comp,
2529 2533 (void *)spx->txlt_scsi_pkt, TQ_NOSLEEP) ==
2530 2534 NULL) {
2531 2535 return (TRAN_BUSY);
2532 2536 }
2533 2537 } else if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
2534 2538 (task_func_t *)spx->txlt_scsi_pkt->pkt_comp,
2535 2539 (void *)spx->txlt_scsi_pkt, TQ_SLEEP) == NULL) {
2536 2540 /* Scheduling the callback failed */
2537 2541 return (TRAN_BUSY);
2538 2542 }
2539 2543 return (TRAN_ACCEPT);
2540 2544 }
2541 2545 /* No callback available */
2542 2546 return (TRAN_FATAL_ERROR);
2543 2547 }
2544 2548
2545 2549 if (sdinfo->satadrv_type & SATA_DTYPE_ATAPI) {
2546 2550 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst, cport)));
2547 2551 rval = sata_txlt_atapi(spx);
2548 2552 SATADBG1(SATA_DBG_SCSI_IF, sata_hba_inst,
2549 2553 "sata_scsi_start atapi: rval %d\n", rval);
2550 2554 return (rval);
2551 2555 }
2552 2556 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst, cport)));
2553 2557
2554 2558 /*
2555 2559 * Checking for power state, if it was on
2556 2560 * STOPPED state, then the drive is not capable
2557 2561 * of processing media access command. And
2558 2562 * TEST_UNIT_READY, REQUEST_SENSE has special handling
2559 2563 * in the function for different power state.
2560 2564 */
2561 2565 if (((sdinfo->satadrv_power_level == SATA_POWER_STANDBY) ||
2562 2566 (sdinfo->satadrv_power_level == SATA_POWER_STOPPED)) &&
2563 2567 (SATA_IS_MEDIUM_ACCESS_CMD(pkt->pkt_cdbp[0]))) {
2564 2568 return (sata_txlt_check_condition(spx, KEY_NOT_READY,
2565 2569 SD_SCSI_ASC_LU_NOT_READY));
2566 2570 }
2567 2571
2568 2572 /* ATA Disk commands processing starts here */
2569 2573
2570 2574 bp = spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp;
2571 2575
2572 2576 switch (pkt->pkt_cdbp[0]) {
2573 2577
2574 2578 case SCMD_INQUIRY:
2575 2579 /* Mapped to identify device */
2576 2580 if (bp != NULL && (bp->b_flags & (B_PHYS | B_PAGEIO)))
2577 2581 bp_mapin(bp);
2578 2582 rval = sata_txlt_inquiry(spx);
2579 2583 break;
2580 2584
2581 2585 case SCMD_TEST_UNIT_READY:
2582 2586 /*
2583 2587 * SAT "SATA to ATA Translation" doc specifies translation
2584 2588 * to ATA CHECK POWER MODE.
2585 2589 */
2586 2590 rval = sata_txlt_test_unit_ready(spx);
2587 2591 break;
2588 2592
2589 2593 case SCMD_START_STOP:
2590 2594 /* Mapping depends on the command */
2591 2595 rval = sata_txlt_start_stop_unit(spx);
2592 2596 break;
2593 2597
2594 2598 case SCMD_READ_CAPACITY:
2595 2599 if (bp != NULL && (bp->b_flags & (B_PHYS | B_PAGEIO)))
2596 2600 bp_mapin(bp);
2597 2601 rval = sata_txlt_read_capacity(spx);
2598 2602 break;
2599 2603
2600 2604 case SCMD_SVC_ACTION_IN_G4: /* READ CAPACITY (16) */
2601 2605 if (bp != NULL && (bp->b_flags & (B_PHYS | B_PAGEIO)))
2602 2606 bp_mapin(bp);
2603 2607 rval = sata_txlt_read_capacity16(spx);
2604 2608 break;
2605 2609
2606 2610 case SCMD_REQUEST_SENSE:
2607 2611 /*
2608 2612 * Always No Sense, since we force ARQ
2609 2613 */
2610 2614 if (bp != NULL && (bp->b_flags & (B_PHYS | B_PAGEIO)))
2611 2615 bp_mapin(bp);
2612 2616 rval = sata_txlt_request_sense(spx);
2613 2617 break;
2614 2618
2615 2619 case SCMD_LOG_SENSE_G1:
2616 2620 if (bp != NULL && (bp->b_flags & (B_PHYS | B_PAGEIO)))
2617 2621 bp_mapin(bp);
2618 2622 rval = sata_txlt_log_sense(spx);
2619 2623 break;
2620 2624
2621 2625 case SCMD_LOG_SELECT_G1:
2622 2626 if (bp != NULL && (bp->b_flags & (B_PHYS | B_PAGEIO)))
2623 2627 bp_mapin(bp);
2624 2628 rval = sata_txlt_log_select(spx);
2625 2629 break;
2626 2630
2627 2631 case SCMD_MODE_SENSE:
2628 2632 case SCMD_MODE_SENSE_G1:
2629 2633 if (bp != NULL && (bp->b_flags & (B_PHYS | B_PAGEIO)))
2630 2634 bp_mapin(bp);
2631 2635 rval = sata_txlt_mode_sense(spx);
2632 2636 break;
2633 2637
2634 2638
2635 2639 case SCMD_MODE_SELECT:
2636 2640 case SCMD_MODE_SELECT_G1:
2637 2641 if (bp != NULL && (bp->b_flags & (B_PHYS | B_PAGEIO)))
2638 2642 bp_mapin(bp);
2639 2643 rval = sata_txlt_mode_select(spx);
2640 2644 break;
2641 2645
2642 2646 case SCMD_SYNCHRONIZE_CACHE:
2643 2647 case SCMD_SYNCHRONIZE_CACHE_G1:
2644 2648 rval = sata_txlt_synchronize_cache(spx);
2645 2649 break;
2646 2650
2647 2651 case SCMD_READ:
2648 2652 case SCMD_READ_G1:
2649 2653 case SCMD_READ_G4:
2650 2654 case SCMD_READ_G5:
2651 2655 rval = sata_txlt_read(spx);
2652 2656 break;
2653 2657 case SCMD_WRITE_BUFFER:
2654 2658 if (bp != NULL && (bp->b_flags & (B_PHYS | B_PAGEIO)))
2655 2659 bp_mapin(bp);
2656 2660 rval = sata_txlt_write_buffer(spx);
2657 2661 break;
2658 2662
2659 2663 case SCMD_WRITE:
2660 2664 case SCMD_WRITE_G1:
2661 2665 case SCMD_WRITE_G4:
2662 2666 case SCMD_WRITE_G5:
2663 2667 rval = sata_txlt_write(spx);
2664 2668 break;
2665 2669
2666 2670 case SCMD_SEEK:
2667 2671 rval = sata_txlt_nodata_cmd_immediate(spx);
2668 2672 break;
2669 2673
2670 2674 case SPC3_CMD_ATA_COMMAND_PASS_THROUGH12:
2671 2675 case SPC3_CMD_ATA_COMMAND_PASS_THROUGH16:
2672 2676 if (bp != NULL && (bp->b_flags & (B_PHYS | B_PAGEIO)))
2673 2677 bp_mapin(bp);
2674 2678 rval = sata_txlt_ata_pass_thru(spx);
2675 2679 break;
2676 2680
2677 2681 /* Other cases will be filed later */
2678 2682 /* postponed until phase 2 of the development */
2679 2683 case SPC3_CMD_UNMAP:
2680 2684 if (bp != NULL && (bp->b_flags & (B_PHYS | B_PAGEIO)))
2681 2685 bp_mapin(bp);
2682 2686 rval = sata_txlt_unmap(spx);
2683 2687 break;
2684 2688 default:
2685 2689 rval = sata_txlt_invalid_command(spx);
2686 2690 break;
2687 2691 }
2688 2692
2689 2693 SATADBG1(SATA_DBG_SCSI_IF, sata_hba_inst,
2690 2694 "sata_scsi_start: rval %d\n", rval);
2691 2695
2692 2696 return (rval);
2693 2697 }
2694 2698
2695 2699 /*
2696 2700 * Implementation of scsi tran_abort.
2697 2701 * Abort specific pkt or all packets.
2698 2702 *
2699 2703 * Returns 1 if one or more packets were aborted, returns 0 otherwise
2700 2704 *
2701 2705 * May be called from an interrupt level.
2702 2706 */
2703 2707 static int
2704 2708 sata_scsi_abort(struct scsi_address *ap, struct scsi_pkt *scsi_pkt)
2705 2709 {
2706 2710 sata_hba_inst_t *sata_hba_inst =
2707 2711 (sata_hba_inst_t *)(ap->a_hba_tran->tran_hba_private);
2708 2712 sata_device_t sata_device;
2709 2713 sata_pkt_t *sata_pkt;
2710 2714
2711 2715 SATADBG2(SATA_DBG_SCSI_IF, sata_hba_inst,
2712 2716 "sata_scsi_abort: %s at target: 0x%x\n",
2713 2717 scsi_pkt == NULL ? "all packets" : "one pkt", ap->a_target);
2714 2718
2715 2719 /* Validate address */
2716 2720 if (sata_validate_scsi_address(sata_hba_inst, ap, &sata_device) != 0)
2717 2721 /* Invalid address */
2718 2722 return (0);
2719 2723
2720 2724 mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst,
2721 2725 sata_device.satadev_addr.cport)));
2722 2726 if (sata_get_device_info(sata_hba_inst, &sata_device) == NULL) {
2723 2727 /* invalid address */
2724 2728 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
2725 2729 sata_device.satadev_addr.cport)));
2726 2730 return (0);
2727 2731 }
2728 2732 if (scsi_pkt == NULL) {
2729 2733 /*
2730 2734 * Abort all packets.
2731 2735 * Although we do not have specific packet, we still need
2732 2736 * dummy packet structure to pass device address to HBA.
2733 2737 * Allocate one, without sleeping. Fail if pkt cannot be
2734 2738 * allocated.
2735 2739 */
2736 2740 sata_pkt = kmem_zalloc(sizeof (sata_pkt_t), KM_NOSLEEP);
2737 2741 if (sata_pkt == NULL) {
2738 2742 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
2739 2743 sata_device.satadev_addr.cport)));
2740 2744 SATA_LOG_D((sata_hba_inst, CE_WARN, "sata_pkt_abort: "
2741 2745 "could not allocate sata_pkt"));
2742 2746 return (0);
2743 2747 }
2744 2748 sata_pkt->satapkt_rev = SATA_PKT_REV;
2745 2749 sata_pkt->satapkt_device = sata_device;
2746 2750 sata_pkt->satapkt_device.satadev_rev = SATA_DEVICE_REV;
2747 2751 } else {
2748 2752 if (scsi_pkt->pkt_ha_private == NULL) {
2749 2753 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
2750 2754 sata_device.satadev_addr.cport)));
2751 2755 return (0); /* Bad scsi pkt */
2752 2756 }
2753 2757 /* extract pointer to sata pkt */
2754 2758 sata_pkt = ((sata_pkt_txlate_t *)scsi_pkt->pkt_ha_private)->
2755 2759 txlt_sata_pkt;
2756 2760 }
2757 2761
2758 2762 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
2759 2763 sata_device.satadev_addr.cport)));
2760 2764 /* Send abort request to HBA */
2761 2765 if ((*SATA_ABORT_FUNC(sata_hba_inst))
2762 2766 (SATA_DIP(sata_hba_inst), sata_pkt,
2763 2767 scsi_pkt == NULL ? SATA_ABORT_ALL_PACKETS : SATA_ABORT_PACKET) ==
2764 2768 SATA_SUCCESS) {
2765 2769 if (scsi_pkt == NULL)
2766 2770 kmem_free(sata_pkt, sizeof (sata_pkt_t));
2767 2771 /* Success */
2768 2772 return (1);
2769 2773 }
2770 2774 /* Else, something did not go right */
2771 2775 if (scsi_pkt == NULL)
2772 2776 kmem_free(sata_pkt, sizeof (sata_pkt_t));
2773 2777 /* Failure */
2774 2778 return (0);
2775 2779 }
2776 2780
2777 2781
2778 2782 /*
2779 2783 * Implementation of scsi tran_reset.
2780 2784 * RESET_ALL request is translated into port reset.
2781 2785 * RESET_TARGET requests is translated into a device reset,
2782 2786 * RESET_LUN request is accepted only for LUN 0 and translated into
2783 2787 * device reset.
2784 2788 * The target reset should cause all HBA active and queued packets to
2785 2789 * be terminated and returned with pkt reason SATA_PKT_RESET prior to
2786 2790 * the return. HBA should report reset event for the device.
2787 2791 *
2788 2792 * Returns 1 upon success, 0 upon failure.
2789 2793 */
2790 2794 static int
2791 2795 sata_scsi_reset(struct scsi_address *ap, int level)
2792 2796 {
2793 2797 sata_hba_inst_t *sata_hba_inst =
2794 2798 (sata_hba_inst_t *)(ap->a_hba_tran->tran_hba_private);
2795 2799 sata_device_t sata_device;
2796 2800 int val;
2797 2801
2798 2802 SATADBG2(SATA_DBG_SCSI_IF, sata_hba_inst,
2799 2803 "sata_scsi_reset: level %d target: 0x%x\n",
2800 2804 level, ap->a_target);
2801 2805
2802 2806 /* Validate address */
2803 2807 val = sata_validate_scsi_address(sata_hba_inst, ap, &sata_device);
2804 2808 if (val == -1)
2805 2809 /* Invalid address */
2806 2810 return (0);
2807 2811
2808 2812 mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst,
2809 2813 sata_device.satadev_addr.cport)));
2810 2814 if (sata_get_device_info(sata_hba_inst, &sata_device) == NULL) {
2811 2815 /* invalid address */
2812 2816 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
2813 2817 sata_device.satadev_addr.cport)));
2814 2818 return (0);
2815 2819 }
2816 2820 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
2817 2821 sata_device.satadev_addr.cport)));
2818 2822 if (level == RESET_ALL) {
2819 2823 /* port reset */
2820 2824 if (sata_device.satadev_addr.qual == SATA_ADDR_DCPORT)
2821 2825 sata_device.satadev_addr.qual = SATA_ADDR_CPORT;
2822 2826 else
2823 2827 sata_device.satadev_addr.qual = SATA_ADDR_PMPORT;
2824 2828
2825 2829 if ((*SATA_RESET_DPORT_FUNC(sata_hba_inst))
2826 2830 (SATA_DIP(sata_hba_inst), &sata_device) == SATA_SUCCESS)
2827 2831 return (1);
2828 2832 else
2829 2833 return (0);
2830 2834
2831 2835 } else if (val == 0 &&
2832 2836 (level == RESET_TARGET || level == RESET_LUN)) {
2833 2837 /* reset device (device attached) */
2834 2838 if ((*SATA_RESET_DPORT_FUNC(sata_hba_inst))
2835 2839 (SATA_DIP(sata_hba_inst), &sata_device) == SATA_SUCCESS)
2836 2840 return (1);
2837 2841 else
2838 2842 return (0);
2839 2843 }
2840 2844 return (0);
2841 2845 }
2842 2846
2843 2847
2844 2848 /*
2845 2849 * Implementation of scsi tran_getcap (get transport/device capabilities).
2846 2850 * Supported capabilities for SATA hard disks:
2847 2851 * auto-rqsense (always supported)
2848 2852 * tagged-qing (supported if HBA supports it)
2849 2853 * untagged-qing (could be supported if disk supports it, but because
2850 2854 * caching behavior allowing untagged queuing actually
2851 2855 * results in reduced performance. sd tries to throttle
2852 2856 * back to only 3 outstanding commands, which may
2853 2857 * work for real SCSI disks, but with read ahead
2854 2858 * caching, having more than 1 outstanding command
2855 2859 * results in cache thrashing.)
2856 2860 * sector_size
2857 2861 * dma_max
2858 2862 * interconnect-type (INTERCONNECT_SATA)
2859 2863 *
2860 2864 * Supported capabilities for ATAPI CD/DVD devices:
2861 2865 * auto-rqsense (always supported)
2862 2866 * sector_size
2863 2867 * dma_max
2864 2868 * max-cdb-length
2865 2869 * interconnect-type (INTERCONNECT_SATA)
2866 2870 *
2867 2871 * Supported capabilities for ATAPI TAPE devices:
2868 2872 * auto-rqsense (always supported)
2869 2873 * dma_max
2870 2874 * max-cdb-length
2871 2875 *
2872 2876 * Supported capabilities for SATA ATAPI hard disks:
2873 2877 * auto-rqsense (always supported)
2874 2878 * interconnect-type (INTERCONNECT_SATA)
2875 2879 * max-cdb-length
2876 2880 *
2877 2881 * Request for other capabilities is rejected as unsupported.
2878 2882 *
2879 2883 * Returns supported capability value, or -1 if capability is unsuppported or
2880 2884 * the address is invalid - no device.
2881 2885 */
2882 2886
2883 2887 static int
2884 2888 sata_scsi_getcap(struct scsi_address *ap, char *cap, int whom)
2885 2889 {
2886 2890
2887 2891 sata_hba_inst_t *sata_hba_inst =
2888 2892 (sata_hba_inst_t *)(ap->a_hba_tran->tran_hba_private);
2889 2893 sata_device_t sata_device;
2890 2894 sata_drive_info_t *sdinfo;
2891 2895 ddi_dma_attr_t adj_dma_attr;
2892 2896 int rval;
2893 2897
2894 2898 SATADBG2(SATA_DBG_SCSI_IF, sata_hba_inst,
2895 2899 "sata_scsi_getcap: target: 0x%x, cap: %s\n",
2896 2900 ap->a_target, cap);
2897 2901
2898 2902 /*
2899 2903 * We want to process the capabilities on per port granularity.
2900 2904 * So, we are specifically restricting ourselves to whom != 0
2901 2905 * to exclude the controller wide handling.
2902 2906 */
2903 2907 if (cap == NULL || whom == 0)
2904 2908 return (-1);
2905 2909
2906 2910 if (sata_validate_scsi_address(sata_hba_inst, ap, &sata_device) != 0) {
2907 2911 /* Invalid address */
2908 2912 return (-1);
2909 2913 }
2910 2914 mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst,
2911 2915 sata_device.satadev_addr.cport)));
2912 2916 if ((sdinfo = sata_get_device_info(sata_hba_inst, &sata_device)) ==
2913 2917 NULL) {
2914 2918 /* invalid address */
2915 2919 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
2916 2920 sata_device.satadev_addr.cport)));
2917 2921 return (-1);
2918 2922 }
2919 2923
2920 2924 switch (scsi_hba_lookup_capstr(cap)) {
2921 2925 case SCSI_CAP_ARQ:
2922 2926 rval = 1; /* ARQ supported, turned on */
2923 2927 break;
2924 2928
2925 2929 case SCSI_CAP_SECTOR_SIZE:
2926 2930 if (sdinfo->satadrv_type == SATA_DTYPE_ATADISK)
2927 2931 rval = SATA_DISK_SECTOR_SIZE; /* fixed size */
2928 2932 else if (sdinfo->satadrv_type == SATA_DTYPE_ATAPICD)
2929 2933 rval = SATA_ATAPI_SECTOR_SIZE;
2930 2934 else rval = -1;
2931 2935 break;
2932 2936
2933 2937 /*
2934 2938 * untagged queuing cause a performance inversion because of
2935 2939 * the way sd operates. Because of this reason we do not
2936 2940 * use it when available.
2937 2941 */
2938 2942 case SCSI_CAP_UNTAGGED_QING:
2939 2943 if (sdinfo->satadrv_features_enabled &
2940 2944 SATA_DEV_F_E_UNTAGGED_QING)
2941 2945 rval = 1; /* Untagged queuing available */
2942 2946 else
2943 2947 rval = -1; /* Untagged queuing not available */
2944 2948 break;
2945 2949
2946 2950 case SCSI_CAP_TAGGED_QING:
2947 2951 if ((sdinfo->satadrv_features_enabled &
2948 2952 SATA_DEV_F_E_TAGGED_QING) &&
2949 2953 (sdinfo->satadrv_max_queue_depth > 1))
2950 2954 rval = 1; /* Tagged queuing available */
2951 2955 else
2952 2956 rval = -1; /* Tagged queuing not available */
2953 2957 break;
2954 2958
2955 2959 case SCSI_CAP_DMA_MAX:
2956 2960 sata_adjust_dma_attr(sdinfo, SATA_DMA_ATTR(sata_hba_inst),
2957 2961 &adj_dma_attr);
2958 2962 rval = (int)adj_dma_attr.dma_attr_maxxfer;
2959 2963 /* We rely on the fact that dma_attr_maxxfer < 0x80000000 */
2960 2964 break;
2961 2965
2962 2966 case SCSI_CAP_INTERCONNECT_TYPE:
2963 2967 rval = INTERCONNECT_SATA; /* SATA interconnect type */
2964 2968 break;
2965 2969
2966 2970 case SCSI_CAP_CDB_LEN:
2967 2971 if (sdinfo->satadrv_type & SATA_DTYPE_ATAPI)
2968 2972 rval = sdinfo->satadrv_atapi_cdb_len;
2969 2973 else
2970 2974 rval = -1;
2971 2975 break;
2972 2976
2973 2977 default:
2974 2978 rval = -1;
2975 2979 break;
2976 2980 }
2977 2981 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
2978 2982 sata_device.satadev_addr.cport)));
2979 2983 return (rval);
2980 2984 }
2981 2985
2982 2986 /*
2983 2987 * Implementation of scsi tran_setcap
2984 2988 *
2985 2989 * Only SCSI_CAP_UNTAGGED_QING and SCSI_CAP_TAGGED_QING are changeable.
2986 2990 *
2987 2991 */
2988 2992 static int
2989 2993 sata_scsi_setcap(struct scsi_address *ap, char *cap, int value, int whom)
2990 2994 {
2991 2995 sata_hba_inst_t *sata_hba_inst =
2992 2996 (sata_hba_inst_t *)(ap->a_hba_tran->tran_hba_private);
2993 2997 sata_device_t sata_device;
2994 2998 sata_drive_info_t *sdinfo;
2995 2999 int rval;
2996 3000
2997 3001 SATADBG2(SATA_DBG_SCSI_IF, sata_hba_inst,
2998 3002 "sata_scsi_setcap: target: 0x%x, cap: %s\n", ap->a_target, cap);
2999 3003
3000 3004 /*
3001 3005 * We want to process the capabilities on per port granularity.
3002 3006 * So, we are specifically restricting ourselves to whom != 0
3003 3007 * to exclude the controller wide handling.
3004 3008 */
3005 3009 if (cap == NULL || whom == 0) {
3006 3010 return (-1);
3007 3011 }
3008 3012
3009 3013 if (sata_validate_scsi_address(sata_hba_inst, ap, &sata_device) != 0) {
3010 3014 /* Invalid address */
3011 3015 return (-1);
3012 3016 }
3013 3017 mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst,
3014 3018 sata_device.satadev_addr.cport)));
3015 3019 if ((sdinfo = sata_get_device_info(sata_hba_inst,
3016 3020 &sata_device)) == NULL) {
3017 3021 /* invalid address */
3018 3022 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
3019 3023 sata_device.satadev_addr.cport)));
3020 3024 return (-1);
3021 3025 }
3022 3026 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
3023 3027 sata_device.satadev_addr.cport)));
3024 3028
3025 3029 switch (scsi_hba_lookup_capstr(cap)) {
3026 3030 case SCSI_CAP_ARQ:
3027 3031 case SCSI_CAP_SECTOR_SIZE:
3028 3032 case SCSI_CAP_DMA_MAX:
3029 3033 case SCSI_CAP_INTERCONNECT_TYPE:
3030 3034 rval = 0;
3031 3035 break;
3032 3036 case SCSI_CAP_UNTAGGED_QING:
3033 3037 if (SATA_QDEPTH(sata_hba_inst) > 1) {
3034 3038 rval = 1;
3035 3039 if (value == 1) {
3036 3040 sdinfo->satadrv_features_enabled |=
3037 3041 SATA_DEV_F_E_UNTAGGED_QING;
3038 3042 } else if (value == 0) {
3039 3043 sdinfo->satadrv_features_enabled &=
3040 3044 ~SATA_DEV_F_E_UNTAGGED_QING;
3041 3045 } else {
3042 3046 rval = -1;
3043 3047 }
3044 3048 } else {
3045 3049 rval = 0;
3046 3050 }
3047 3051 break;
3048 3052 case SCSI_CAP_TAGGED_QING:
3049 3053 /* This can TCQ or NCQ */
3050 3054 if (sata_func_enable & SATA_ENABLE_QUEUING &&
3051 3055 ((sdinfo->satadrv_features_support & SATA_DEV_F_TCQ &&
3052 3056 SATA_FEATURES(sata_hba_inst) & SATA_CTLF_QCMD) ||
3053 3057 (sata_func_enable & SATA_ENABLE_NCQ &&
3054 3058 sdinfo->satadrv_features_support & SATA_DEV_F_NCQ &&
3055 3059 SATA_FEATURES(sata_hba_inst) & SATA_CTLF_NCQ)) &&
3056 3060 (sdinfo->satadrv_max_queue_depth > 1)) {
3057 3061 rval = 1;
3058 3062 if (value == 1) {
3059 3063 sdinfo->satadrv_features_enabled |=
3060 3064 SATA_DEV_F_E_TAGGED_QING;
3061 3065 } else if (value == 0) {
3062 3066 sdinfo->satadrv_features_enabled &=
3063 3067 ~SATA_DEV_F_E_TAGGED_QING;
3064 3068 } else {
3065 3069 rval = -1;
3066 3070 }
3067 3071 } else {
3068 3072 rval = 0;
3069 3073 }
3070 3074 break;
3071 3075 default:
3072 3076 rval = -1;
3073 3077 break;
3074 3078 }
3075 3079 return (rval);
3076 3080 }
3077 3081
3078 3082 /*
3079 3083 * Implementations of scsi tran_destroy_pkt.
3080 3084 * Free resources allocated by sata_scsi_init_pkt()
3081 3085 */
3082 3086 static void
3083 3087 sata_scsi_destroy_pkt(struct scsi_address *ap, struct scsi_pkt *pkt)
3084 3088 {
3085 3089 sata_pkt_txlate_t *spx;
3086 3090
3087 3091 spx = (sata_pkt_txlate_t *)pkt->pkt_ha_private;
3088 3092
3089 3093 sata_common_free_dma_rsrcs(spx);
3090 3094
3091 3095 spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp = NULL;
3092 3096 sata_pkt_free(spx);
3093 3097
3094 3098 scsi_hba_pkt_free(ap, pkt);
3095 3099 }
3096 3100
3097 3101 /*
3098 3102 * Implementation of scsi tran_dmafree.
3099 3103 * Free DMA resources allocated by sata_scsi_init_pkt()
3100 3104 */
3101 3105
3102 3106 static void
3103 3107 sata_scsi_dmafree(struct scsi_address *ap, struct scsi_pkt *pkt)
3104 3108 {
3105 3109 #ifndef __lock_lint
3106 3110 _NOTE(ARGUNUSED(ap))
3107 3111 #endif
3108 3112 sata_pkt_txlate_t *spx;
3109 3113
3110 3114 ASSERT(pkt != NULL);
3111 3115 spx = (sata_pkt_txlate_t *)pkt->pkt_ha_private;
3112 3116
3113 3117 sata_common_free_dma_rsrcs(spx);
3114 3118 }
3115 3119
3116 3120 /*
3117 3121 * Implementation of scsi tran_sync_pkt.
3118 3122 *
3119 3123 * The assumption below is that pkt is unique - there is no need to check ap
3120 3124 *
3121 3125 * Synchronize DMA buffer and, if the intermediate buffer is used, copy data
3122 3126 * into/from the real buffer.
3123 3127 */
3124 3128 static void
3125 3129 sata_scsi_sync_pkt(struct scsi_address *ap, struct scsi_pkt *pkt)
3126 3130 {
3127 3131 #ifndef __lock_lint
3128 3132 _NOTE(ARGUNUSED(ap))
3129 3133 #endif
3130 3134 int rval;
3131 3135 sata_pkt_txlate_t *spx = (sata_pkt_txlate_t *)pkt->pkt_ha_private;
3132 3136 struct buf *bp;
3133 3137 int direction;
3134 3138
3135 3139 ASSERT(spx != NULL);
3136 3140 if (spx->txlt_buf_dma_handle != NULL) {
3137 3141 direction = spx->txlt_sata_pkt->
3138 3142 satapkt_cmd.satacmd_flags.sata_data_direction;
3139 3143 if (spx->txlt_sata_pkt != NULL &&
3140 3144 direction != SATA_DIR_NODATA_XFER) {
3141 3145 if (spx->txlt_tmp_buf != NULL) {
3142 3146 /* Intermediate DMA buffer used */
3143 3147 bp = spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp;
3144 3148
3145 3149 if (direction & SATA_DIR_WRITE) {
3146 3150 bcopy(bp->b_un.b_addr,
3147 3151 spx->txlt_tmp_buf, bp->b_bcount);
3148 3152 }
3149 3153 }
3150 3154 /* Sync the buffer for device or for CPU */
3151 3155 rval = ddi_dma_sync(spx->txlt_buf_dma_handle, 0, 0,
3152 3156 (direction & SATA_DIR_WRITE) ?
3153 3157 DDI_DMA_SYNC_FORDEV : DDI_DMA_SYNC_FORCPU);
3154 3158 ASSERT(rval == DDI_SUCCESS);
3155 3159 if (spx->txlt_tmp_buf != NULL &&
3156 3160 !(direction & SATA_DIR_WRITE)) {
3157 3161 /* Intermediate DMA buffer used for read */
3158 3162 bcopy(spx->txlt_tmp_buf,
3159 3163 bp->b_un.b_addr, bp->b_bcount);
3160 3164 }
3161 3165
3162 3166 }
3163 3167 }
3164 3168 }
3165 3169
3166 3170
3167 3171
3168 3172 /* ******************* SATA - SCSI Translation functions **************** */
3169 3173 /*
3170 3174 * SCSI to SATA pkt and command translation and SATA to SCSI status/error
3171 3175 * translation.
3172 3176 */
3173 3177
3174 3178 /*
3175 3179 * Checks if a device exists and can be access and translates common
3176 3180 * scsi_pkt data to sata_pkt data.
3177 3181 *
3178 3182 * Flag argument indicates that a non-read/write ATA command may be sent
3179 3183 * to HBA in arbitrary SYNC mode to execute this packet.
3180 3184 *
3181 3185 * Returns TRAN_ACCEPT and scsi pkt_reason CMD_CMPLT if device exists and
3182 3186 * sata_pkt was set-up.
3183 3187 * Returns TRAN_ACCEPT and scsi pkt_reason CMD_DEV_GONE if device does not
3184 3188 * exist and pkt_comp callback was scheduled.
3185 3189 * Returns other TRAN_XXXXX values when error occured and command should be
3186 3190 * rejected with the returned TRAN_XXXXX value.
3187 3191 *
3188 3192 * This function should be called with port mutex held.
3189 3193 */
3190 3194 static int
3191 3195 sata_txlt_generic_pkt_info(sata_pkt_txlate_t *spx, int *reason, int flag)
3192 3196 {
3193 3197 sata_drive_info_t *sdinfo;
3194 3198 sata_device_t sata_device;
3195 3199 const struct sata_cmd_flags sata_initial_cmd_flags = {
3196 3200 SATA_DIR_NODATA_XFER,
3197 3201 /* all other values to 0/FALSE */
3198 3202 };
3199 3203 /*
3200 3204 * Pkt_reason has to be set if the pkt_comp callback is invoked,
3201 3205 * and that implies TRAN_ACCEPT return value. Any other returned value
3202 3206 * indicates that the scsi packet was not accepted (the reason will not
3203 3207 * be checked by the scsi target driver).
3204 3208 * To make debugging easier, we set pkt_reason to know value here.
3205 3209 * It may be changed later when different completion reason is
3206 3210 * determined.
3207 3211 */
3208 3212 spx->txlt_scsi_pkt->pkt_reason = CMD_TRAN_ERR;
3209 3213 *reason = CMD_TRAN_ERR;
3210 3214
3211 3215 /* Validate address */
3212 3216 switch (sata_validate_scsi_address(spx->txlt_sata_hba_inst,
3213 3217 &spx->txlt_scsi_pkt->pkt_address, &sata_device)) {
3214 3218
3215 3219 case -1:
3216 3220 /* Invalid address or invalid device type */
3217 3221 return (TRAN_BADPKT);
3218 3222 case 2:
3219 3223 /*
3220 3224 * Valid address but device type is unknown - Chack if it is
3221 3225 * in the reset state and therefore in an indeterminate state.
3222 3226 */
3223 3227 sdinfo = sata_get_device_info(spx->txlt_sata_hba_inst,
3224 3228 &spx->txlt_sata_pkt->satapkt_device);
3225 3229 if (sdinfo != NULL && (sdinfo->satadrv_event_flags &
3226 3230 (SATA_EVNT_DEVICE_RESET |
3227 3231 SATA_EVNT_INPROC_DEVICE_RESET)) != 0) {
3228 3232 if (!ddi_in_panic()) {
3229 3233 spx->txlt_scsi_pkt->pkt_reason = CMD_INCOMPLETE;
3230 3234 *reason = CMD_INCOMPLETE;
3231 3235 SATADBG1(SATA_DBG_SCSI_IF,
3232 3236 spx->txlt_sata_hba_inst,
3233 3237 "sata_scsi_start: rejecting command "
3234 3238 "because of device reset state\n", NULL);
3235 3239 return (TRAN_BUSY);
3236 3240 }
3237 3241 }
3238 3242 /* FALLTHROUGH */
3239 3243 case 1:
3240 3244 /* valid address but no valid device - it has disappeared */
3241 3245 spx->txlt_scsi_pkt->pkt_reason = CMD_DEV_GONE;
3242 3246 *reason = CMD_DEV_GONE;
3243 3247 /*
3244 3248 * The sd target driver is checking CMD_DEV_GONE pkt_reason
3245 3249 * only in callback function (for normal requests) and
3246 3250 * in the dump code path.
3247 3251 * So, if the callback is available, we need to do
3248 3252 * the callback rather than returning TRAN_FATAL_ERROR here.
3249 3253 */
3250 3254 if (spx->txlt_scsi_pkt->pkt_comp != NULL) {
3251 3255 /* scsi callback required */
3252 3256 if (servicing_interrupt()) {
3253 3257 if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
3254 3258 (task_func_t *)spx->txlt_scsi_pkt->pkt_comp,
3255 3259 (void *)spx->txlt_scsi_pkt, TQ_NOSLEEP) ==
3256 3260 NULL) {
3257 3261 return (TRAN_BUSY);
3258 3262 }
3259 3263 } else if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
3260 3264 (task_func_t *)spx->txlt_scsi_pkt->pkt_comp,
3261 3265 (void *)spx->txlt_scsi_pkt, TQ_SLEEP) == NULL) {
3262 3266 /* Scheduling the callback failed */
3263 3267 return (TRAN_BUSY);
3264 3268 }
3265 3269
3266 3270 return (TRAN_ACCEPT);
3267 3271 }
3268 3272 return (TRAN_FATAL_ERROR);
3269 3273 default:
3270 3274 /* all OK; pkt reason will be overwritten later */
3271 3275 break;
3272 3276 }
3273 3277 /*
3274 3278 * If pkt is to be executed in polling mode and a command will not be
3275 3279 * emulated in SATA module (requires sending a non-read/write ATA
3276 3280 * command to HBA driver in arbitrary SYNC mode) and we are in the
3277 3281 * interrupt context and not in the panic dump, then reject the packet
3278 3282 * to avoid a possible interrupt stack overrun or hang caused by
3279 3283 * a potentially blocked interrupt.
3280 3284 */
3281 3285 if (((spx->txlt_scsi_pkt->pkt_flags & FLAG_NOINTR) != 0 || flag != 0) &&
3282 3286 servicing_interrupt() && !ddi_in_panic()) {
3283 3287 SATADBG1(SATA_DBG_INTR_CTX, spx->txlt_sata_hba_inst,
3284 3288 "sata_scsi_start: rejecting synchronous command because "
3285 3289 "of interrupt context\n", NULL);
3286 3290 return (TRAN_BUSY);
3287 3291 }
3288 3292
3289 3293 sdinfo = sata_get_device_info(spx->txlt_sata_hba_inst,
3290 3294 &spx->txlt_sata_pkt->satapkt_device);
3291 3295
3292 3296 /*
3293 3297 * If device is in reset condition, reject the packet with
3294 3298 * TRAN_BUSY, unless:
3295 3299 * 1. system is panicking (dumping)
3296 3300 * In such case only one thread is running and there is no way to
3297 3301 * process reset.
3298 3302 * 2. cfgadm operation is is progress (internal APCTL lock is set)
3299 3303 * Some cfgadm operations involve drive commands, so reset condition
3300 3304 * needs to be ignored for IOCTL operations.
3301 3305 */
3302 3306 if ((sdinfo->satadrv_event_flags &
3303 3307 (SATA_EVNT_DEVICE_RESET | SATA_EVNT_INPROC_DEVICE_RESET)) != 0) {
3304 3308
3305 3309 if (!ddi_in_panic() &&
3306 3310 ((SATA_CPORT_EVENT_FLAGS(spx->txlt_sata_hba_inst,
3307 3311 sata_device.satadev_addr.cport) &
3308 3312 SATA_APCTL_LOCK_PORT_BUSY) == 0)) {
3309 3313 spx->txlt_scsi_pkt->pkt_reason = CMD_INCOMPLETE;
3310 3314 *reason = CMD_INCOMPLETE;
3311 3315 SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
3312 3316 "sata_scsi_start: rejecting command because "
3313 3317 "of device reset state\n", NULL);
3314 3318 return (TRAN_BUSY);
3315 3319 }
3316 3320 }
3317 3321
3318 3322 /*
3319 3323 * Fix the dev_type in the sata_pkt->satapkt_device. It was not set by
3320 3324 * sata_scsi_pkt_init() because pkt init had to work also with
3321 3325 * non-existing devices.
3322 3326 * Now we know that the packet was set-up for a real device, so its
3323 3327 * type is known.
3324 3328 */
3325 3329 spx->txlt_sata_pkt->satapkt_device.satadev_type = sdinfo->satadrv_type;
3326 3330
3327 3331 spx->txlt_sata_pkt->satapkt_cmd.satacmd_flags = sata_initial_cmd_flags;
3328 3332 if ((SATA_CPORT_INFO(spx->txlt_sata_hba_inst,
3329 3333 sata_device.satadev_addr.cport)->cport_event_flags &
3330 3334 SATA_APCTL_LOCK_PORT_BUSY) != 0) {
3331 3335 spx->txlt_sata_pkt->satapkt_cmd.satacmd_flags.
3332 3336 sata_ignore_dev_reset = B_TRUE;
3333 3337 }
3334 3338 /*
3335 3339 * At this point the generic translation routine determined that the
3336 3340 * scsi packet should be accepted. Packet completion reason may be
3337 3341 * changed later when a different completion reason is determined.
3338 3342 */
3339 3343 spx->txlt_scsi_pkt->pkt_reason = CMD_CMPLT;
3340 3344 *reason = CMD_CMPLT;
3341 3345
3342 3346 if ((spx->txlt_scsi_pkt->pkt_flags & FLAG_NOINTR) != 0) {
3343 3347 /* Synchronous execution */
3344 3348 spx->txlt_sata_pkt->satapkt_op_mode = SATA_OPMODE_SYNCH |
3345 3349 SATA_OPMODE_POLLING;
3346 3350 spx->txlt_sata_pkt->satapkt_cmd.satacmd_flags.
3347 3351 sata_ignore_dev_reset = ddi_in_panic();
3348 3352 } else {
3349 3353 /* Asynchronous execution */
3350 3354 spx->txlt_sata_pkt->satapkt_op_mode = SATA_OPMODE_ASYNCH |
3351 3355 SATA_OPMODE_INTERRUPTS;
3352 3356 }
3353 3357 /* Convert queuing information */
3354 3358 if (spx->txlt_scsi_pkt->pkt_flags & FLAG_STAG)
3355 3359 spx->txlt_sata_pkt->satapkt_cmd.satacmd_flags.sata_queue_stag =
3356 3360 B_TRUE;
3357 3361 else if (spx->txlt_scsi_pkt->pkt_flags &
3358 3362 (FLAG_OTAG | FLAG_HTAG | FLAG_HEAD))
3359 3363 spx->txlt_sata_pkt->satapkt_cmd.satacmd_flags.sata_queue_otag =
3360 3364 B_TRUE;
3361 3365
3362 3366 /* Always limit pkt time */
3363 3367 if (spx->txlt_scsi_pkt->pkt_time == 0)
3364 3368 spx->txlt_sata_pkt->satapkt_time = sata_default_pkt_time;
3365 3369 else
3366 3370 /* Pass on scsi_pkt time */
3367 3371 spx->txlt_sata_pkt->satapkt_time =
3368 3372 spx->txlt_scsi_pkt->pkt_time;
3369 3373
3370 3374 return (TRAN_ACCEPT);
3371 3375 }
3372 3376
3373 3377
3374 3378 /*
3375 3379 * Translate ATA Identify Device data to SCSI Inquiry data.
3376 3380 * This function may be called only for ATA devices.
3377 3381 * This function should not be called for ATAPI devices - they
3378 3382 * respond directly to SCSI Inquiry command.
3379 3383 *
3380 3384 * SATA Identify Device data has to be valid in sata_drive_info.
3381 3385 * Buffer has to accomodate the inquiry length (36 bytes).
3382 3386 *
3383 3387 * This function should be called with a port mutex held.
3384 3388 */
3385 3389 static void
3386 3390 sata_identdev_to_inquiry(sata_hba_inst_t *sata_hba_inst,
3387 3391 sata_drive_info_t *sdinfo, uint8_t *buf)
3388 3392 {
3389 3393
3390 3394 struct scsi_inquiry *inq = (struct scsi_inquiry *)buf;
3391 3395 struct sata_id *sid = &sdinfo->satadrv_id;
3392 3396
3393 3397 /* Start with a nice clean slate */
3394 3398 bzero((void *)inq, sizeof (struct scsi_inquiry));
3395 3399
3396 3400 /*
3397 3401 * Rely on the dev_type for setting paripheral qualifier.
3398 3402 * Assume that DTYPE_RODIRECT applies to CD/DVD R/W devices.
3399 3403 * It could be that DTYPE_OPTICAL could also qualify in the future.
3400 3404 * ATAPI Inquiry may provide more data to the target driver.
3401 3405 */
3402 3406 inq->inq_dtype = sdinfo->satadrv_type == SATA_DTYPE_ATADISK ?
3403 3407 DTYPE_DIRECT : DTYPE_RODIRECT; /* DTYPE_UNKNOWN; */
3404 3408
3405 3409 /* CFA type device is not a removable media device */
3406 3410 inq->inq_rmb = ((sid->ai_config != SATA_CFA_TYPE) &&
3407 3411 (sid->ai_config & SATA_REM_MEDIA)) ? 1 : 0;
3408 3412 inq->inq_qual = 0; /* Device type qualifier (obsolete in SCSI3? */
3409 3413 inq->inq_iso = 0; /* ISO version */
3410 3414 inq->inq_ecma = 0; /* ECMA version */
3411 3415 inq->inq_ansi = 3; /* ANSI version - SCSI 3 */
3412 3416 inq->inq_aenc = 0; /* Async event notification cap. */
3413 3417 inq->inq_trmiop = 0; /* Supports TERMINATE I/O PROC msg - NO */
3414 3418 inq->inq_normaca = 0; /* setting NACA bit supported - NO */
3415 3419 inq->inq_rdf = RDF_SCSI2; /* Response data format- SPC-3 */
3416 3420 inq->inq_len = 31; /* Additional length */
3417 3421 inq->inq_dualp = 0; /* dual port device - NO */
3418 3422 inq->inq_reladdr = 0; /* Supports relative addressing - NO */
3419 3423 inq->inq_sync = 0; /* Supports synchronous data xfers - NO */
3420 3424 inq->inq_linked = 0; /* Supports linked commands - NO */
3421 3425 /*
3422 3426 * Queuing support - controller has to
3423 3427 * support some sort of command queuing.
3424 3428 */
3425 3429 if (SATA_QDEPTH(sata_hba_inst) > 1)
3426 3430 inq->inq_cmdque = 1; /* Supports command queueing - YES */
3427 3431 else
3428 3432 inq->inq_cmdque = 0; /* Supports command queueing - NO */
3429 3433 inq->inq_sftre = 0; /* Supports Soft Reset option - NO ??? */
3430 3434 inq->inq_wbus32 = 0; /* Supports 32 bit wide data xfers - NO */
3431 3435 inq->inq_wbus16 = 0; /* Supports 16 bit wide data xfers - NO */
3432 3436
3433 3437 #ifdef _LITTLE_ENDIAN
3434 3438 /* Swap text fields to match SCSI format */
3435 3439 bcopy("ATA ", inq->inq_vid, 8); /* Vendor ID */
3436 3440 swab(sid->ai_model, inq->inq_pid, 16); /* Product ID */
3437 3441 if (strncmp(&sid->ai_fw[4], " ", 4) == 0)
3438 3442 swab(sid->ai_fw, inq->inq_revision, 4); /* Revision level */
3439 3443 else
3440 3444 swab(&sid->ai_fw[4], inq->inq_revision, 4); /* Rev. level */
3441 3445 #else /* _LITTLE_ENDIAN */
3442 3446 bcopy("ATA ", inq->inq_vid, 8); /* Vendor ID */
3443 3447 bcopy(sid->ai_model, inq->inq_pid, 16); /* Product ID */
3444 3448 if (strncmp(&sid->ai_fw[4], " ", 4) == 0)
3445 3449 bcopy(sid->ai_fw, inq->inq_revision, 4); /* Revision level */
3446 3450 else
3447 3451 bcopy(&sid->ai_fw[4], inq->inq_revision, 4); /* Rev. level */
3448 3452 #endif /* _LITTLE_ENDIAN */
3449 3453 }
3450 3454
3451 3455
3452 3456 /*
3453 3457 * Scsi response set up for invalid command (command not supported)
3454 3458 *
3455 3459 * Returns TRAN_ACCEPT and appropriate values in scsi_pkt fields.
3456 3460 */
3457 3461 static int
3458 3462 sata_txlt_invalid_command(sata_pkt_txlate_t *spx)
3459 3463 {
3460 3464 struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
3461 3465 struct scsi_extended_sense *sense;
3462 3466
3463 3467 scsipkt->pkt_reason = CMD_CMPLT;
3464 3468 scsipkt->pkt_state = STATE_GOT_BUS | STATE_GOT_TARGET |
3465 3469 STATE_SENT_CMD | STATE_GOT_STATUS;
3466 3470
3467 3471 *scsipkt->pkt_scbp = STATUS_CHECK;
3468 3472
3469 3473 sense = sata_arq_sense(spx);
3470 3474 sense->es_key = KEY_ILLEGAL_REQUEST;
3471 3475 sense->es_add_code = SD_SCSI_ASC_INVALID_COMMAND_CODE;
3472 3476
3473 3477 SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
3474 3478 "Scsi_pkt completion reason %x\n", scsipkt->pkt_reason);
3475 3479
3476 3480 if ((scsipkt->pkt_flags & FLAG_NOINTR) == 0 &&
3477 3481 scsipkt->pkt_comp != NULL) {
3478 3482 /* scsi callback required */
3479 3483 if (servicing_interrupt()) {
3480 3484 if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
3481 3485 (task_func_t *)spx->txlt_scsi_pkt->pkt_comp,
3482 3486 (void *)spx->txlt_scsi_pkt, TQ_NOSLEEP) == NULL) {
3483 3487 return (TRAN_BUSY);
3484 3488 }
3485 3489 } else if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
3486 3490 (task_func_t *)spx->txlt_scsi_pkt->pkt_comp,
3487 3491 (void *)spx->txlt_scsi_pkt, TQ_SLEEP) == NULL) {
3488 3492 /* Scheduling the callback failed */
3489 3493 return (TRAN_BUSY);
3490 3494 }
3491 3495 }
3492 3496 return (TRAN_ACCEPT);
3493 3497 }
3494 3498
3495 3499 /*
3496 3500 * Scsi response set up for check condition with special sense key
3497 3501 * and additional sense code.
3498 3502 *
3499 3503 * Returns TRAN_ACCEPT and appropriate values in scsi_pkt fields.
3500 3504 */
3501 3505 static int
3502 3506 sata_txlt_check_condition(sata_pkt_txlate_t *spx, uchar_t key, uchar_t code)
3503 3507 {
3504 3508 sata_hba_inst_t *shi = SATA_TXLT_HBA_INST(spx);
3505 3509 int cport = SATA_TXLT_CPORT(spx);
3506 3510 struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
3507 3511 struct scsi_extended_sense *sense;
3508 3512
3509 3513 mutex_enter(&SATA_CPORT_MUTEX(shi, cport));
3510 3514 scsipkt->pkt_reason = CMD_CMPLT;
3511 3515 scsipkt->pkt_state = STATE_GOT_BUS | STATE_GOT_TARGET |
3512 3516 STATE_SENT_CMD | STATE_GOT_STATUS;
3513 3517
3514 3518 *scsipkt->pkt_scbp = STATUS_CHECK;
3515 3519
3516 3520 sense = sata_arq_sense(spx);
3517 3521 sense->es_key = key;
3518 3522 sense->es_add_code = code;
3519 3523
3520 3524 mutex_exit(&SATA_CPORT_MUTEX(shi, cport));
3521 3525
3522 3526 SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
3523 3527 "Scsi_pkt completion reason %x\n", scsipkt->pkt_reason);
3524 3528
3525 3529 if ((scsipkt->pkt_flags & FLAG_NOINTR) == 0 &&
3526 3530 scsipkt->pkt_comp != NULL) {
3527 3531 /* scsi callback required */
3528 3532 if (servicing_interrupt()) {
3529 3533 if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
3530 3534 (task_func_t *)spx->txlt_scsi_pkt->pkt_comp,
3531 3535 (void *)spx->txlt_scsi_pkt, TQ_NOSLEEP) == NULL) {
3532 3536 return (TRAN_BUSY);
3533 3537 }
3534 3538 } else if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
3535 3539 (task_func_t *)spx->txlt_scsi_pkt->pkt_comp,
3536 3540 (void *)spx->txlt_scsi_pkt, TQ_SLEEP) == NULL) {
3537 3541 /* Scheduling the callback failed */
3538 3542 return (TRAN_BUSY);
3539 3543 }
3540 3544 }
3541 3545 return (TRAN_ACCEPT);
3542 3546 }
3543 3547
3544 3548 /*
3545 3549 * Scsi response setup for
3546 3550 * emulated non-data command that requires no action/return data
3547 3551 *
3548 3552 * Returns TRAN_ACCEPT and appropriate values in scsi_pkt fields.
3549 3553 */
3550 3554 static int
3551 3555 sata_txlt_nodata_cmd_immediate(sata_pkt_txlate_t *spx)
3552 3556 {
3553 3557 int rval;
3554 3558 int reason;
3555 3559 kmutex_t *cport_mutex = &(SATA_TXLT_CPORT_MUTEX(spx));
3556 3560
3557 3561 mutex_enter(cport_mutex);
3558 3562
3559 3563 if (((rval = sata_txlt_generic_pkt_info(spx, &reason, 0)) !=
3560 3564 TRAN_ACCEPT) || (reason == CMD_DEV_GONE)) {
3561 3565 mutex_exit(cport_mutex);
3562 3566 return (rval);
3563 3567 }
3564 3568 mutex_exit(cport_mutex);
3565 3569
3566 3570 spx->txlt_scsi_pkt->pkt_state = STATE_GOT_BUS | STATE_GOT_TARGET |
3567 3571 STATE_SENT_CMD | STATE_GOT_STATUS;
3568 3572 spx->txlt_scsi_pkt->pkt_reason = CMD_CMPLT;
3569 3573 *(spx->txlt_scsi_pkt->pkt_scbp) = STATUS_GOOD;
3570 3574
3571 3575 SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
3572 3576 "Scsi_pkt completion reason %x\n",
3573 3577 spx->txlt_scsi_pkt->pkt_reason);
3574 3578
3575 3579 if ((spx->txlt_scsi_pkt->pkt_flags & FLAG_NOINTR) == 0 &&
3576 3580 spx->txlt_scsi_pkt->pkt_comp != NULL) {
3577 3581 /* scsi callback required */
3578 3582 if (servicing_interrupt()) {
3579 3583 if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
3580 3584 (task_func_t *)spx->txlt_scsi_pkt->pkt_comp,
3581 3585 (void *)spx->txlt_scsi_pkt, TQ_NOSLEEP) == NULL) {
3582 3586 return (TRAN_BUSY);
3583 3587 }
3584 3588 } else if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
3585 3589 (task_func_t *)spx->txlt_scsi_pkt->pkt_comp,
3586 3590 (void *)spx->txlt_scsi_pkt, TQ_SLEEP) == NULL) {
3587 3591 /* Scheduling the callback failed */
3588 3592 return (TRAN_BUSY);
3589 3593 }
3590 3594 }
3591 3595 return (TRAN_ACCEPT);
3592 3596 }
3593 3597
3594 3598
3595 3599 /*
3596 3600 * SATA translate command: Inquiry / Identify Device
3597 3601 * Use cached Identify Device data for now, rather than issuing actual
3598 3602 * Device Identify cmd request. If device is detached and re-attached,
3599 3603 * asynchronous event processing should fetch and refresh Identify Device
3600 3604 * data.
3601 3605 * VPD pages supported now:
3602 3606 * Vital Product Data page
3603 3607 * Unit Serial Number page
3604 3608 * Block Device Characteristics Page
3605 3609 * ATA Information Page
3606 3610 *
3607 3611 * Returns TRAN_ACCEPT and appropriate values in scsi_pkt fields.
3608 3612 */
3609 3613
3610 3614 #define EVPD 1 /* Extended Vital Product Data flag */
3611 3615 #define CMDDT 2 /* Command Support Data - Obsolete */
3612 3616 #define INQUIRY_SUP_VPD_PAGE 0 /* Supported VPD Pages Page Code */
3613 3617 #define INQUIRY_USN_PAGE 0x80 /* Unit Serial Number Page Code */
3614 3618 #define INQUIRY_BDC_PAGE 0xB1 /* Block Device Characteristics Page */
3615 3619 /* Code */
3616 3620 #define INQUIRY_ATA_INFO_PAGE 0x89 /* ATA Information Page Code */
3617 3621 #define INQUIRY_DEV_IDENTIFICATION_PAGE 0x83 /* Not needed yet */
3618 3622
3619 3623 static int
3620 3624 sata_txlt_inquiry(sata_pkt_txlate_t *spx)
3621 3625 {
3622 3626 struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
3623 3627 struct buf *bp = spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp;
3624 3628 sata_drive_info_t *sdinfo;
3625 3629 struct scsi_extended_sense *sense;
3626 3630 int count;
3627 3631 uint8_t *p;
3628 3632 int i, j;
3629 3633 uint8_t page_buf[1024]; /* Max length */
3630 3634 int rval, reason;
3631 3635 ushort_t rate;
3632 3636 kmutex_t *cport_mutex = &(SATA_TXLT_CPORT_MUTEX(spx));
3633 3637
3634 3638 mutex_enter(cport_mutex);
3635 3639
3636 3640 if (((rval = sata_txlt_generic_pkt_info(spx, &reason, 0)) !=
3637 3641 TRAN_ACCEPT) || (reason == CMD_DEV_GONE)) {
3638 3642 mutex_exit(cport_mutex);
3639 3643 return (rval);
3640 3644 }
3641 3645
3642 3646 sdinfo = sata_get_device_info(spx->txlt_sata_hba_inst,
3643 3647 &spx->txlt_sata_pkt->satapkt_device);
3644 3648
3645 3649 ASSERT(sdinfo != NULL);
3646 3650
3647 3651 scsipkt->pkt_reason = CMD_CMPLT;
3648 3652 scsipkt->pkt_state = STATE_GOT_BUS | STATE_GOT_TARGET |
3649 3653 STATE_SENT_CMD | STATE_GOT_STATUS;
3650 3654
3651 3655 /* Reject not supported request */
3652 3656 if (scsipkt->pkt_cdbp[1] & CMDDT) { /* No support for this bit */
3653 3657 *scsipkt->pkt_scbp = STATUS_CHECK;
3654 3658 sense = sata_arq_sense(spx);
3655 3659 sense->es_key = KEY_ILLEGAL_REQUEST;
3656 3660 sense->es_add_code = SD_SCSI_ASC_INVALID_FIELD_IN_CDB;
3657 3661 goto done;
3658 3662 }
3659 3663
3660 3664 /* Valid Inquiry request */
3661 3665 *scsipkt->pkt_scbp = STATUS_GOOD;
3662 3666
3663 3667 if (bp != NULL && bp->b_un.b_addr && bp->b_bcount) {
3664 3668
3665 3669 /*
3666 3670 * Because it is fully emulated command storing data
3667 3671 * programatically in the specified buffer, release
3668 3672 * preallocated DMA resources before storing data in the buffer,
3669 3673 * so no unwanted DMA sync would take place.
3670 3674 */
3671 3675 sata_scsi_dmafree(NULL, scsipkt);
3672 3676
3673 3677 if (!(scsipkt->pkt_cdbp[1] & EVPD)) {
3674 3678 /* Standard Inquiry Data request */
3675 3679 struct scsi_inquiry inq;
3676 3680 unsigned int bufsize;
3677 3681
3678 3682 sata_identdev_to_inquiry(spx->txlt_sata_hba_inst,
3679 3683 sdinfo, (uint8_t *)&inq);
3680 3684 /* Copy no more than requested */
3681 3685 count = MIN(bp->b_bcount,
3682 3686 sizeof (struct scsi_inquiry));
3683 3687 bufsize = scsipkt->pkt_cdbp[4];
3684 3688 bufsize |= scsipkt->pkt_cdbp[3] << 8;
3685 3689 count = MIN(count, bufsize);
3686 3690 bcopy(&inq, bp->b_un.b_addr, count);
3687 3691
3688 3692 scsipkt->pkt_state |= STATE_XFERRED_DATA;
3689 3693 scsipkt->pkt_resid = scsipkt->pkt_cdbp[4] > count ?
3690 3694 bufsize - count : 0;
3691 3695 } else {
3692 3696 /*
3693 3697 * peripheral_qualifier = 0;
3694 3698 *
3695 3699 * We are dealing only with HD and will be
3696 3700 * dealing with CD/DVD devices soon
3697 3701 */
3698 3702 uint8_t peripheral_device_type =
3699 3703 sdinfo->satadrv_type == SATA_DTYPE_ATADISK ?
3700 3704 DTYPE_DIRECT : DTYPE_RODIRECT;
3701 3705
3702 3706 bzero(page_buf, sizeof (page_buf));
3703 3707
3704 3708 switch ((uint_t)scsipkt->pkt_cdbp[2]) {
3705 3709 case INQUIRY_SUP_VPD_PAGE:
3706 3710 /*
3707 3711 * Request for supported Vital Product Data
3708 3712 * pages.
3709 3713 */
3710 3714 page_buf[0] = peripheral_device_type;
3711 3715 page_buf[1] = INQUIRY_SUP_VPD_PAGE;
3712 3716 page_buf[2] = 0;
3713 3717 page_buf[3] = 4; /* page length */
3714 3718 page_buf[4] = INQUIRY_SUP_VPD_PAGE;
3715 3719 page_buf[5] = INQUIRY_USN_PAGE;
3716 3720 page_buf[6] = INQUIRY_BDC_PAGE;
3717 3721 page_buf[7] = INQUIRY_ATA_INFO_PAGE;
3718 3722 /* Copy no more than requested */
3719 3723 count = MIN(bp->b_bcount, 8);
3720 3724 bcopy(page_buf, bp->b_un.b_addr, count);
3721 3725 break;
3722 3726
3723 3727 case INQUIRY_USN_PAGE:
3724 3728 /*
3725 3729 * Request for Unit Serial Number page.
3726 3730 * Set-up the page.
3727 3731 */
3728 3732 page_buf[0] = peripheral_device_type;
3729 3733 page_buf[1] = INQUIRY_USN_PAGE;
3730 3734 page_buf[2] = 0;
3731 3735 /* remaining page length */
3732 3736 page_buf[3] = SATA_ID_SERIAL_LEN;
3733 3737
3734 3738 /*
3735 3739 * Copy serial number from Identify Device data
3736 3740 * words into the inquiry page and swap bytes
3737 3741 * when necessary.
3738 3742 */
3739 3743 p = (uint8_t *)(sdinfo->satadrv_id.ai_drvser);
3740 3744 #ifdef _LITTLE_ENDIAN
3741 3745 swab(p, &page_buf[4], SATA_ID_SERIAL_LEN);
3742 3746 #else
3743 3747 bcopy(p, &page_buf[4], SATA_ID_SERIAL_LEN);
3744 3748 #endif
3745 3749 /*
3746 3750 * Least significant character of the serial
3747 3751 * number shall appear as the last byte,
3748 3752 * according to SBC-3 spec.
3749 3753 * Count trailing spaces to determine the
3750 3754 * necessary shift length.
3751 3755 */
3752 3756 p = &page_buf[SATA_ID_SERIAL_LEN + 4 - 1];
3753 3757 for (j = 0; j < SATA_ID_SERIAL_LEN; j++) {
3754 3758 if (*(p - j) != '\0' &&
3755 3759 *(p - j) != '\040')
3756 3760 break;
3757 3761 }
3758 3762
3759 3763 /*
3760 3764 * Shift SN string right, so that the last
3761 3765 * non-blank character would appear in last
3762 3766 * byte of SN field in the page.
3763 3767 * 'j' is the shift length.
3764 3768 */
3765 3769 for (i = 0;
3766 3770 i < (SATA_ID_SERIAL_LEN - j) && j != 0;
3767 3771 i++, p--)
3768 3772 *p = *(p - j);
3769 3773
3770 3774 /*
3771 3775 * Add leading spaces - same number as the
3772 3776 * shift size
3773 3777 */
3774 3778 for (; j > 0; j--)
3775 3779 page_buf[4 + j - 1] = '\040';
3776 3780
3777 3781 count = MIN(bp->b_bcount,
3778 3782 SATA_ID_SERIAL_LEN + 4);
3779 3783 bcopy(page_buf, bp->b_un.b_addr, count);
3780 3784 break;
3781 3785
3782 3786 case INQUIRY_BDC_PAGE:
3783 3787 /*
3784 3788 * Request for Block Device Characteristics
3785 3789 * page. Set-up the page.
3786 3790 */
3787 3791 page_buf[0] = peripheral_device_type;
3788 3792 page_buf[1] = INQUIRY_BDC_PAGE;
3789 3793 page_buf[2] = 0;
3790 3794 /* remaining page length */
3791 3795 page_buf[3] = SATA_ID_BDC_LEN;
3792 3796
3793 3797 rate = sdinfo->satadrv_id.ai_medrotrate;
3794 3798 page_buf[4] = (rate >> 8) & 0xff;
3795 3799 page_buf[5] = rate & 0xff;
3796 3800 page_buf[6] = 0;
3797 3801 page_buf[7] = sdinfo->satadrv_id.
3798 3802 ai_nomformfactor & 0xf;
3799 3803
3800 3804 count = MIN(bp->b_bcount,
3801 3805 SATA_ID_BDC_LEN + 4);
3802 3806 bcopy(page_buf, bp->b_un.b_addr, count);
3803 3807 break;
3804 3808
3805 3809 case INQUIRY_ATA_INFO_PAGE:
3806 3810 /*
3807 3811 * Request for ATA Information page.
3808 3812 */
3809 3813 page_buf[0] = peripheral_device_type;
3810 3814 page_buf[1] = INQUIRY_ATA_INFO_PAGE;
3811 3815 page_buf[2] = (SATA_ID_ATA_INFO_LEN >> 8) &
3812 3816 0xff;
3813 3817 page_buf[3] = SATA_ID_ATA_INFO_LEN & 0xff;
3814 3818 /* page_buf[4-7] reserved */
3815 3819 #ifdef _LITTLE_ENDIAN
3816 3820 bcopy("ATA ", &page_buf[8], 8);
3817 3821 swab(sdinfo->satadrv_id.ai_model,
3818 3822 &page_buf[16], 16);
3819 3823 if (strncmp(&sdinfo->satadrv_id.ai_fw[4],
3820 3824 " ", 4) == 0) {
3821 3825 swab(sdinfo->satadrv_id.ai_fw,
3822 3826 &page_buf[32], 4);
3823 3827 } else {
3824 3828 swab(&sdinfo->satadrv_id.ai_fw[4],
3825 3829 &page_buf[32], 4);
3826 3830 }
3827 3831 #else /* _LITTLE_ENDIAN */
3828 3832 bcopy("ATA ", &page_buf[8], 8);
3829 3833 bcopy(sdinfo->satadrv_id.ai_model,
3830 3834 &page_buf[16], 16);
3831 3835 if (strncmp(&sdinfo->satadrv_id.ai_fw[4],
3832 3836 " ", 4) == 0) {
3833 3837 bcopy(sdinfo->satadrv_id.ai_fw,
3834 3838 &page_buf[32], 4);
3835 3839 } else {
3836 3840 bcopy(&sdinfo->satadrv_id.ai_fw[4],
3837 3841 &page_buf[32], 4);
3838 3842 }
3839 3843 #endif /* _LITTLE_ENDIAN */
3840 3844 /*
3841 3845 * page_buf[36-55] which defines the device
3842 3846 * signature is not defined at this
3843 3847 * time.
3844 3848 */
3845 3849
3846 3850 /* Set the command code */
3847 3851 if (sdinfo->satadrv_type ==
3848 3852 SATA_DTYPE_ATADISK) {
3849 3853 page_buf[56] = SATAC_ID_DEVICE;
3850 3854 } else if (sdinfo->satadrv_type ==
3851 3855 SATA_DTYPE_ATAPI) {
3852 3856 page_buf[56] = SATAC_ID_PACKET_DEVICE;
3853 3857 }
3854 3858 /*
3855 3859 * If the command code, page_buf[56], is not
3856 3860 * zero and if one of the identify commands
3857 3861 * succeeds, return the identify data.
3858 3862 */
3859 3863 if ((page_buf[56] != 0) &&
3860 3864 (sata_fetch_device_identify_data(
3861 3865 spx->txlt_sata_hba_inst, sdinfo) ==
3862 3866 SATA_SUCCESS)) {
3863 3867 bcopy(&sdinfo->satadrv_id,
3864 3868 &page_buf[60], sizeof (sata_id_t));
3865 3869 }
3866 3870
3867 3871 /* Need to copy out the page_buf to bp */
3868 3872 count = MIN(bp->b_bcount,
3869 3873 SATA_ID_ATA_INFO_LEN + 4);
3870 3874 bcopy(page_buf, bp->b_un.b_addr, count);
3871 3875 break;
3872 3876
3873 3877 case INQUIRY_DEV_IDENTIFICATION_PAGE:
3874 3878 /*
3875 3879 * We may want to implement this page, when
3876 3880 * identifiers are common for SATA devices
3877 3881 * But not now.
3878 3882 */
3879 3883 /*FALLTHROUGH*/
3880 3884
3881 3885 default:
3882 3886 /* Request for unsupported VPD page */
3883 3887 *scsipkt->pkt_scbp = STATUS_CHECK;
3884 3888 sense = sata_arq_sense(spx);
3885 3889 sense->es_key = KEY_ILLEGAL_REQUEST;
3886 3890 sense->es_add_code =
3887 3891 SD_SCSI_ASC_INVALID_FIELD_IN_CDB;
3888 3892 goto done;
3889 3893 }
3890 3894 }
3891 3895 scsipkt->pkt_state |= STATE_XFERRED_DATA;
3892 3896 scsipkt->pkt_resid = scsipkt->pkt_cdbp[4] > count ?
3893 3897 scsipkt->pkt_cdbp[4] - count : 0;
3894 3898 }
3895 3899 done:
3896 3900 mutex_exit(cport_mutex);
3897 3901
3898 3902 SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
3899 3903 "Scsi_pkt completion reason %x\n",
3900 3904 scsipkt->pkt_reason);
3901 3905
3902 3906 if ((scsipkt->pkt_flags & FLAG_NOINTR) == 0 &&
3903 3907 scsipkt->pkt_comp != NULL) {
3904 3908 /* scsi callback required */
3905 3909 if (servicing_interrupt()) {
3906 3910 if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
3907 3911 (task_func_t *)spx->txlt_scsi_pkt->pkt_comp,
3908 3912 (void *)spx->txlt_scsi_pkt, TQ_NOSLEEP) == NULL) {
3909 3913 return (TRAN_BUSY);
3910 3914 }
3911 3915 } else if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
3912 3916 (task_func_t *)spx->txlt_scsi_pkt->pkt_comp,
3913 3917 (void *)spx->txlt_scsi_pkt, TQ_SLEEP) == NULL) {
3914 3918 /* Scheduling the callback failed */
3915 3919 return (TRAN_BUSY);
3916 3920 }
3917 3921 }
3918 3922 return (TRAN_ACCEPT);
3919 3923 }
3920 3924
3921 3925 /*
3922 3926 * SATA translate command: Request Sense.
3923 3927 *
3924 3928 * Returns TRAN_ACCEPT and appropriate values in scsi_pkt fields.
3925 3929 * At the moment this is an emulated command (ATA version for SATA hard disks).
3926 3930 * May be translated into Check Power Mode command in the future.
3927 3931 *
3928 3932 * Note: There is a mismatch between already implemented Informational
3929 3933 * Exception Mode Select page 0x1C and this function.
3930 3934 * When MRIE bit is set in page 0x1C, Request Sense is supposed to return
3931 3935 * NO SENSE and set additional sense code to the exception code - this is not
3932 3936 * implemented here.
3933 3937 */
3934 3938 static int
3935 3939 sata_txlt_request_sense(sata_pkt_txlate_t *spx)
3936 3940 {
3937 3941 struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
3938 3942 struct scsi_extended_sense sense;
3939 3943 struct buf *bp = spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp;
3940 3944 sata_drive_info_t *sdinfo;
3941 3945 sata_cmd_t *scmd = &spx->txlt_sata_pkt->satapkt_cmd;
3942 3946 int rval, reason, power_state = 0;
3943 3947 kmutex_t *cport_mutex;
3944 3948
3945 3949 cport_mutex = &(SATA_TXLT_CPORT_MUTEX(spx));
3946 3950 mutex_enter(cport_mutex);
3947 3951
3948 3952 if (((rval = sata_txlt_generic_pkt_info(spx, &reason, 1)) !=
3949 3953 TRAN_ACCEPT) || (reason == CMD_DEV_GONE)) {
3950 3954 mutex_exit(cport_mutex);
3951 3955 return (rval);
3952 3956 }
3953 3957
3954 3958 scsipkt->pkt_reason = CMD_CMPLT;
3955 3959 scsipkt->pkt_state = STATE_GOT_BUS | STATE_GOT_TARGET |
3956 3960 STATE_SENT_CMD | STATE_GOT_STATUS;
3957 3961 *scsipkt->pkt_scbp = STATUS_GOOD;
3958 3962
3959 3963 /*
3960 3964 * when CONTROL field's NACA bit == 1
3961 3965 * return ILLEGAL_REQUEST
3962 3966 */
3963 3967 if (scsipkt->pkt_cdbp[5] & CTL_BYTE_NACA_MASK) {
3964 3968 mutex_exit(cport_mutex);
3965 3969 return (sata_txlt_check_condition(spx, KEY_ILLEGAL_REQUEST,
3966 3970 SD_SCSI_ASC_CMD_SEQUENCE_ERR));
3967 3971 }
3968 3972
3969 3973 sdinfo = sata_get_device_info(spx->txlt_sata_hba_inst,
3970 3974 &spx->txlt_sata_pkt->satapkt_device);
3971 3975 ASSERT(sdinfo != NULL);
3972 3976
3973 3977 spx->txlt_sata_pkt->satapkt_op_mode |= SATA_OPMODE_SYNCH;
3974 3978
3975 3979 sata_build_generic_cmd(scmd, SATAC_CHECK_POWER_MODE);
3976 3980 scmd->satacmd_flags.sata_copy_out_sec_count_lsb = B_TRUE;
3977 3981 scmd->satacmd_flags.sata_copy_out_error_reg = B_TRUE;
3978 3982 if (sata_hba_start(spx, &rval) != 0) {
3979 3983 mutex_exit(cport_mutex);
3980 3984 return (rval);
3981 3985 }
3982 3986 if (scmd->satacmd_error_reg != 0) {
3983 3987 mutex_exit(cport_mutex);
3984 3988 return (sata_txlt_check_condition(spx, KEY_NO_SENSE,
3985 3989 SD_SCSI_ASC_NO_ADD_SENSE));
3986 3990 }
3987 3991
3988 3992 switch (scmd->satacmd_sec_count_lsb) {
3989 3993 case SATA_PWRMODE_STANDBY: /* device in standby mode */
3990 3994 if (sdinfo->satadrv_power_level == SATA_POWER_STOPPED)
3991 3995 power_state = SATA_POWER_STOPPED;
3992 3996 else {
3993 3997 power_state = SATA_POWER_STANDBY;
3994 3998 sdinfo->satadrv_power_level = SATA_POWER_STANDBY;
3995 3999 }
3996 4000 break;
3997 4001 case SATA_PWRMODE_IDLE: /* device in idle mode */
3998 4002 power_state = SATA_POWER_IDLE;
3999 4003 sdinfo->satadrv_power_level = SATA_POWER_IDLE;
4000 4004 break;
4001 4005 case SATA_PWRMODE_ACTIVE: /* device in active or idle mode */
4002 4006 default: /* 0x40, 0x41 active mode */
4003 4007 if (sdinfo->satadrv_power_level == SATA_POWER_IDLE)
4004 4008 power_state = SATA_POWER_IDLE;
4005 4009 else {
4006 4010 power_state = SATA_POWER_ACTIVE;
4007 4011 sdinfo->satadrv_power_level = SATA_POWER_ACTIVE;
4008 4012 }
4009 4013 break;
4010 4014 }
4011 4015
4012 4016 mutex_exit(cport_mutex);
4013 4017
4014 4018 if (bp != NULL && bp->b_un.b_addr && bp->b_bcount) {
4015 4019 /*
4016 4020 * Because it is fully emulated command storing data
4017 4021 * programatically in the specified buffer, release
4018 4022 * preallocated DMA resources before storing data in the buffer,
4019 4023 * so no unwanted DMA sync would take place.
4020 4024 */
4021 4025 int count = MIN(bp->b_bcount,
4022 4026 sizeof (struct scsi_extended_sense));
4023 4027 sata_scsi_dmafree(NULL, scsipkt);
4024 4028 bzero(&sense, sizeof (struct scsi_extended_sense));
4025 4029 sense.es_valid = 0; /* Valid LBA */
4026 4030 sense.es_class = 7; /* Response code 0x70 - current err */
4027 4031 sense.es_key = KEY_NO_SENSE;
4028 4032 sense.es_add_len = 6; /* Additional length */
4029 4033 /* Copy no more than requested */
4030 4034 bcopy(&sense, bp->b_un.b_addr, count);
4031 4035 scsipkt->pkt_state |= STATE_XFERRED_DATA;
4032 4036 scsipkt->pkt_resid = 0;
4033 4037 switch (power_state) {
4034 4038 case SATA_POWER_IDLE:
4035 4039 case SATA_POWER_STANDBY:
4036 4040 sense.es_add_code =
4037 4041 SD_SCSI_ASC_LOW_POWER_CONDITION_ON;
4038 4042 break;
4039 4043 case SATA_POWER_STOPPED:
4040 4044 sense.es_add_code = SD_SCSI_ASC_NO_ADD_SENSE;
4041 4045 break;
4042 4046 case SATA_POWER_ACTIVE:
4043 4047 default:
4044 4048 break;
4045 4049 }
4046 4050 }
4047 4051
4048 4052 SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
4049 4053 "Scsi_pkt completion reason %x\n",
4050 4054 scsipkt->pkt_reason);
4051 4055
4052 4056 if ((scsipkt->pkt_flags & FLAG_NOINTR) == 0 &&
4053 4057 scsipkt->pkt_comp != NULL) {
4054 4058 /* scsi callback required */
4055 4059 if (servicing_interrupt()) {
4056 4060 if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
4057 4061 (task_func_t *)spx->txlt_scsi_pkt->pkt_comp,
4058 4062 (void *)spx->txlt_scsi_pkt, TQ_NOSLEEP) == NULL) {
4059 4063 return (TRAN_BUSY);
4060 4064 }
4061 4065 } else if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
4062 4066 (task_func_t *)spx->txlt_scsi_pkt->pkt_comp,
4063 4067 (void *)spx->txlt_scsi_pkt, TQ_SLEEP) == NULL) {
4064 4068 /* Scheduling the callback failed */
4065 4069 return (TRAN_BUSY);
4066 4070 }
4067 4071 }
4068 4072 return (TRAN_ACCEPT);
4069 4073 }
4070 4074
4071 4075 /*
4072 4076 * SATA translate command: Test Unit Ready
4073 4077 * (ATA version for SATA hard disks).
4074 4078 * It is translated into the Check Power Mode command.
4075 4079 *
4076 4080 * Returns TRAN_ACCEPT and appropriate values in scsi_pkt fields.
4077 4081 */
4078 4082 static int
4079 4083 sata_txlt_test_unit_ready(sata_pkt_txlate_t *spx)
4080 4084 {
4081 4085 struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
4082 4086 struct scsi_extended_sense *sense;
4083 4087 sata_cmd_t *scmd = &spx->txlt_sata_pkt->satapkt_cmd;
4084 4088 sata_drive_info_t *sdinfo;
4085 4089 int power_state;
4086 4090 int rval, reason;
4087 4091 kmutex_t *cport_mutex = &(SATA_TXLT_CPORT_MUTEX(spx));
4088 4092
4089 4093 mutex_enter(cport_mutex);
4090 4094
4091 4095 if (((rval = sata_txlt_generic_pkt_info(spx, &reason, 1)) !=
4092 4096 TRAN_ACCEPT) || (reason == CMD_DEV_GONE)) {
4093 4097 mutex_exit(cport_mutex);
4094 4098 return (rval);
4095 4099 }
4096 4100
4097 4101 sdinfo = sata_get_device_info(spx->txlt_sata_hba_inst,
4098 4102 &spx->txlt_sata_pkt->satapkt_device);
4099 4103 ASSERT(sdinfo != NULL);
4100 4104
4101 4105 spx->txlt_sata_pkt->satapkt_op_mode |= SATA_OPMODE_SYNCH;
4102 4106
4103 4107 /* send CHECK POWER MODE command */
4104 4108 sata_build_generic_cmd(scmd, SATAC_CHECK_POWER_MODE);
4105 4109 scmd->satacmd_flags.sata_copy_out_sec_count_lsb = B_TRUE;
4106 4110 scmd->satacmd_flags.sata_copy_out_error_reg = B_TRUE;
4107 4111 if (sata_hba_start(spx, &rval) != 0) {
4108 4112 mutex_exit(cport_mutex);
4109 4113 return (rval);
4110 4114 }
4111 4115
4112 4116 if (scmd->satacmd_error_reg != 0) {
4113 4117 mutex_exit(cport_mutex);
4114 4118 return (sata_txlt_check_condition(spx, KEY_NOT_READY,
4115 4119 SD_SCSI_ASC_LU_NOT_RESPONSE));
4116 4120 }
4117 4121
4118 4122 power_state = scmd->satacmd_sec_count_lsb;
4119 4123
4120 4124 /*
4121 4125 * return NOT READY when device in STOPPED mode
4122 4126 */
4123 4127 if (power_state == SATA_PWRMODE_STANDBY &&
4124 4128 sdinfo->satadrv_power_level == SATA_POWER_STOPPED) {
4125 4129 *scsipkt->pkt_scbp = STATUS_CHECK;
4126 4130 sense = sata_arq_sense(spx);
4127 4131 sense->es_key = KEY_NOT_READY;
4128 4132 sense->es_add_code = SD_SCSI_ASC_LU_NOT_READY;
4129 4133 } else {
4130 4134 /*
4131 4135 * For other power mode, return GOOD status
4132 4136 */
4133 4137 *scsipkt->pkt_scbp = STATUS_GOOD;
4134 4138 }
4135 4139
4136 4140 scsipkt->pkt_reason = CMD_CMPLT;
4137 4141 scsipkt->pkt_state = STATE_GOT_BUS | STATE_GOT_TARGET |
4138 4142 STATE_SENT_CMD | STATE_GOT_STATUS;
4139 4143
4140 4144 mutex_exit(cport_mutex);
4141 4145
4142 4146 SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
4143 4147 "Scsi_pkt completion reason %x\n", scsipkt->pkt_reason);
4144 4148
4145 4149 if ((scsipkt->pkt_flags & FLAG_NOINTR) == 0 &&
4146 4150 scsipkt->pkt_comp != NULL) {
4147 4151 /* scsi callback required */
4148 4152 if (servicing_interrupt()) {
4149 4153 if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
4150 4154 (task_func_t *)spx->txlt_scsi_pkt->pkt_comp,
4151 4155 (void *)spx->txlt_scsi_pkt, TQ_NOSLEEP) == NULL) {
4152 4156 return (TRAN_BUSY);
4153 4157 }
4154 4158 } else if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
4155 4159 (task_func_t *)spx->txlt_scsi_pkt->pkt_comp,
4156 4160 (void *)spx->txlt_scsi_pkt, TQ_SLEEP) == NULL) {
4157 4161 /* Scheduling the callback failed */
4158 4162 return (TRAN_BUSY);
4159 4163 }
4160 4164 }
4161 4165
4162 4166 return (TRAN_ACCEPT);
4163 4167 }
4164 4168
4165 4169 /*
4166 4170 * SATA translate command: Start Stop Unit
4167 4171 * Translation depends on a command:
4168 4172 *
4169 4173 * Power condition bits will be supported
4170 4174 * and the power level should be maintained by SATL,
4171 4175 * When SATL received a command, it will check the
4172 4176 * power level firstly, and return the status according
4173 4177 * to SAT2 v2.6 and SAT-2 Standby Modifications
4174 4178 *
4175 4179 * SPC-4/SBC-3 SATL ATA power condition SATL SPC/SBC
4176 4180 * -----------------------------------------------------------------------
4177 4181 * SSU_PC1 Active <==> ATA Active <==> SSU:start_bit =1
4178 4182 * SSU_PC2 Idle <==> ATA Idle <==> N/A
4179 4183 * SSU_PC3 Standby <==> ATA Standby <==> N/A
4180 4184 * SSU_PC4 Stopped <==> ATA Standby <==> SSU:start_bit = 0
4181 4185 *
4182 4186 * Unload Media / NOT SUPPORTED YET
4183 4187 * Load Media / NOT SUPPROTED YET
4184 4188 * Immediate bit / NOT SUPPORTED YET (deferred error)
4185 4189 *
4186 4190 * Returns TRAN_ACCEPT or code returned by sata_hba_start() and
4187 4191 * appropriate values in scsi_pkt fields.
4188 4192 */
4189 4193 static int
4190 4194 sata_txlt_start_stop_unit(sata_pkt_txlate_t *spx)
4191 4195 {
4192 4196 struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
4193 4197 sata_cmd_t *scmd = &spx->txlt_sata_pkt->satapkt_cmd;
4194 4198 int rval, reason;
4195 4199 sata_drive_info_t *sdinfo;
4196 4200 sata_id_t *sata_id;
4197 4201 kmutex_t *cport_mutex = &(SATA_TXLT_CPORT_MUTEX(spx));
4198 4202
4199 4203 SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
4200 4204 "sata_txlt_start_stop_unit: %d\n", scsipkt->pkt_scbp[4] & 1);
4201 4205
4202 4206 mutex_enter(cport_mutex);
4203 4207
4204 4208 if (((rval = sata_txlt_generic_pkt_info(spx, &reason, 1)) !=
4205 4209 TRAN_ACCEPT) || (reason == CMD_DEV_GONE)) {
4206 4210 mutex_exit(cport_mutex);
4207 4211 return (rval);
4208 4212 }
4209 4213
4210 4214 if (scsipkt->pkt_cdbp[1] & START_STOP_IMMED_MASK) {
4211 4215 /* IMMED bit - not supported */
4212 4216 mutex_exit(cport_mutex);
4213 4217 return (sata_txlt_check_condition(spx, KEY_ILLEGAL_REQUEST,
4214 4218 SD_SCSI_ASC_INVALID_FIELD_IN_CDB));
4215 4219 }
4216 4220
4217 4221 spx->txlt_sata_pkt->satapkt_op_mode |= SATA_OPMODE_SYNCH;
4218 4222 spx->txlt_sata_pkt->satapkt_comp = NULL;
4219 4223
4220 4224 sdinfo = sata_get_device_info(spx->txlt_sata_hba_inst,
4221 4225 &spx->txlt_sata_pkt->satapkt_device);
4222 4226 ASSERT(sdinfo != NULL);
4223 4227 sata_id = &sdinfo->satadrv_id;
4224 4228
4225 4229 switch ((scsipkt->pkt_cdbp[4] & START_STOP_POWER_COND_MASK) >> 4) {
4226 4230 case 0:
4227 4231 if (scsipkt->pkt_cdbp[4] & START_STOP_LOEJ_MASK) {
4228 4232 /* Load/Unload Media - invalid request */
4229 4233 goto err_out;
4230 4234 }
4231 4235 if (scsipkt->pkt_cdbp[4] & START_STOP_START_MASK) {
4232 4236 /* Start Unit */
4233 4237 sata_build_read_verify_cmd(scmd, 1, 5);
4234 4238 scmd->satacmd_flags.sata_copy_out_error_reg = B_TRUE;
4235 4239 /* Transfer command to HBA */
4236 4240 if (sata_hba_start(spx, &rval) != 0) {
4237 4241 /* Pkt not accepted for execution */
4238 4242 mutex_exit(cport_mutex);
4239 4243 return (rval);
4240 4244 }
4241 4245 if (scmd->satacmd_error_reg != 0) {
4242 4246 goto err_out;
4243 4247 }
4244 4248 sdinfo->satadrv_power_level = SATA_POWER_ACTIVE;
4245 4249 } else {
4246 4250 /* Stop Unit */
4247 4251 sata_build_generic_cmd(scmd, SATAC_FLUSH_CACHE);
4248 4252 scmd->satacmd_flags.sata_copy_out_error_reg = B_TRUE;
4249 4253 if (sata_hba_start(spx, &rval) != 0) {
4250 4254 mutex_exit(cport_mutex);
4251 4255 return (rval);
4252 4256 } else {
4253 4257 if (scmd->satacmd_error_reg != 0) {
4254 4258 goto err_out;
4255 4259 }
4256 4260 }
4257 4261 /* ata standby immediate command */
4258 4262 sata_build_generic_cmd(scmd, SATAC_STANDBY_IM);
4259 4263 scmd->satacmd_flags.sata_copy_out_error_reg = B_TRUE;
4260 4264 if (sata_hba_start(spx, &rval) != 0) {
4261 4265 mutex_exit(cport_mutex);
4262 4266 return (rval);
4263 4267 }
4264 4268 if (scmd->satacmd_error_reg != 0) {
4265 4269 goto err_out;
4266 4270 }
4267 4271 sdinfo->satadrv_power_level = SATA_POWER_STOPPED;
4268 4272 }
4269 4273 break;
4270 4274 case 0x1:
4271 4275 sata_build_generic_cmd(scmd, SATAC_IDLE);
4272 4276 scmd->satacmd_flags.sata_copy_out_error_reg = B_TRUE;
4273 4277 if (sata_hba_start(spx, &rval) != 0) {
4274 4278 mutex_exit(cport_mutex);
4275 4279 return (rval);
4276 4280 }
4277 4281 if (scmd->satacmd_error_reg != 0) {
4278 4282 goto err_out;
4279 4283 }
4280 4284 sata_build_read_verify_cmd(scmd, 1, 5);
4281 4285 scmd->satacmd_flags.sata_copy_out_error_reg = B_TRUE;
4282 4286 /* Transfer command to HBA */
4283 4287 if (sata_hba_start(spx, &rval) != 0) {
4284 4288 /* Pkt not accepted for execution */
4285 4289 mutex_exit(cport_mutex);
4286 4290 return (rval);
4287 4291 } else {
4288 4292 if (scmd->satacmd_error_reg != 0) {
4289 4293 goto err_out;
4290 4294 }
4291 4295 }
4292 4296 sdinfo->satadrv_power_level = SATA_POWER_ACTIVE;
4293 4297 break;
4294 4298 case 0x2:
4295 4299 sata_build_generic_cmd(scmd, SATAC_FLUSH_CACHE);
4296 4300 scmd->satacmd_flags.sata_copy_out_error_reg = B_TRUE;
4297 4301 if (!(scsipkt->pkt_cdbp[4] & START_STOP_NOFLUSH_MASK)) {
4298 4302 if (sata_hba_start(spx, &rval) != 0) {
4299 4303 mutex_exit(cport_mutex);
4300 4304 return (rval);
4301 4305 }
4302 4306 if (scmd->satacmd_error_reg != 0) {
4303 4307 goto err_out;
4304 4308 }
4305 4309 }
4306 4310 sata_build_generic_cmd(scmd, SATAC_IDLE);
4307 4311 scmd->satacmd_flags.sata_copy_out_error_reg = B_TRUE;
4308 4312 if (sata_hba_start(spx, &rval) != 0) {
4309 4313 mutex_exit(cport_mutex);
4310 4314 return (rval);
4311 4315 }
4312 4316 if (scmd->satacmd_error_reg != 0) {
4313 4317 goto err_out;
4314 4318 }
4315 4319 if ((scsipkt->pkt_cdbp[3] & START_STOP_MODIFIER_MASK)) {
4316 4320 /*
4317 4321 * POWER CONDITION MODIFIER bit set
4318 4322 * to 0x1 or larger it will be handled
4319 4323 * on the same way as bit = 0x1
4320 4324 */
4321 4325 if (!(sata_id->ai_cmdset84 &
4322 4326 SATA_IDLE_UNLOAD_SUPPORTED)) {
4323 4327 sdinfo->satadrv_power_level = SATA_POWER_IDLE;
4324 4328 break;
4325 4329 }
4326 4330 sata_build_generic_cmd(scmd, SATAC_IDLE_IM);
4327 4331 scmd->satacmd_features_reg = 0x44;
4328 4332 scmd->satacmd_lba_low_lsb = 0x4c;
4329 4333 scmd->satacmd_lba_mid_lsb = 0x4e;
4330 4334 scmd->satacmd_lba_high_lsb = 0x55;
4331 4335 scmd->satacmd_flags.sata_copy_out_error_reg = B_TRUE;
4332 4336 if (sata_hba_start(spx, &rval) != 0) {
4333 4337 mutex_exit(cport_mutex);
4334 4338 return (rval);
4335 4339 }
4336 4340 if (scmd->satacmd_error_reg != 0) {
4337 4341 goto err_out;
4338 4342 }
4339 4343 }
4340 4344 sdinfo->satadrv_power_level = SATA_POWER_IDLE;
4341 4345 break;
4342 4346 case 0x3:
4343 4347 sata_build_generic_cmd(scmd, SATAC_FLUSH_CACHE);
4344 4348 scmd->satacmd_flags.sata_copy_out_error_reg = B_TRUE;
4345 4349 if (!(scsipkt->pkt_cdbp[4] & START_STOP_NOFLUSH_MASK)) {
4346 4350 if (sata_hba_start(spx, &rval) != 0) {
4347 4351 mutex_exit(cport_mutex);
4348 4352 return (rval);
4349 4353 }
4350 4354 if (scmd->satacmd_error_reg != 0) {
4351 4355 goto err_out;
4352 4356 }
4353 4357 }
4354 4358 sata_build_generic_cmd(scmd, SATAC_STANDBY);
4355 4359 scmd->satacmd_flags.sata_copy_out_error_reg = B_TRUE;
4356 4360 if (sata_hba_start(spx, &rval) != 0) {
4357 4361 mutex_exit(cport_mutex);
4358 4362 return (rval);
4359 4363 }
4360 4364 if (scmd->satacmd_error_reg != 0) {
4361 4365 goto err_out;
4362 4366 }
4363 4367 sdinfo->satadrv_power_level = SATA_POWER_STANDBY;
4364 4368 break;
4365 4369 case 0x7:
4366 4370 sata_build_generic_cmd(scmd, SATAC_CHECK_POWER_MODE);
4367 4371 scmd->satacmd_flags.sata_copy_out_sec_count_lsb = B_TRUE;
4368 4372 scmd->satacmd_flags.sata_copy_out_error_reg = B_TRUE;
4369 4373 if (sata_hba_start(spx, &rval) != 0) {
4370 4374 mutex_exit(cport_mutex);
4371 4375 return (rval);
4372 4376 }
4373 4377 if (scmd->satacmd_error_reg != 0) {
4374 4378 goto err_out;
4375 4379 }
4376 4380 switch (scmd->satacmd_sec_count_lsb) {
4377 4381 case SATA_PWRMODE_STANDBY:
4378 4382 sata_build_generic_cmd(scmd, SATAC_STANDBY);
4379 4383 scmd->satacmd_sec_count_msb = sata_get_standby_timer(
4380 4384 sdinfo->satadrv_standby_timer);
4381 4385 scmd->satacmd_flags.sata_copy_out_error_reg = B_TRUE;
4382 4386 if (sata_hba_start(spx, &rval) != 0) {
4383 4387 mutex_exit(cport_mutex);
4384 4388 return (rval);
4385 4389 } else {
4386 4390 if (scmd->satacmd_error_reg != 0) {
4387 4391 goto err_out;
4388 4392 }
4389 4393 }
4390 4394 break;
4391 4395 case SATA_PWRMODE_IDLE:
4392 4396 sata_build_generic_cmd(scmd, SATAC_IDLE);
4393 4397 scmd->satacmd_sec_count_msb = sata_get_standby_timer(
4394 4398 sdinfo->satadrv_standby_timer);
4395 4399 scmd->satacmd_flags.sata_copy_out_error_reg = B_TRUE;
4396 4400 if (sata_hba_start(spx, &rval) != 0) {
4397 4401 mutex_exit(cport_mutex);
4398 4402 return (rval);
4399 4403 } else {
4400 4404 if (scmd->satacmd_error_reg != 0) {
4401 4405 goto err_out;
4402 4406 }
4403 4407 }
4404 4408 break;
4405 4409 case SATA_PWRMODE_ACTIVE_SPINDOWN:
4406 4410 case SATA_PWRMODE_ACTIVE_SPINUP:
4407 4411 case SATA_PWRMODE_ACTIVE:
4408 4412 sata_build_generic_cmd(scmd, SATAC_IDLE);
4409 4413 scmd->satacmd_sec_count_msb = sata_get_standby_timer(
4410 4414 sdinfo->satadrv_standby_timer);
4411 4415 scmd->satacmd_flags.sata_copy_out_error_reg = B_TRUE;
4412 4416 if (sata_hba_start(spx, &rval) != 0) {
4413 4417 mutex_exit(cport_mutex);
4414 4418 return (rval);
4415 4419 }
4416 4420 if (scmd->satacmd_error_reg != 0) {
4417 4421 goto err_out;
4418 4422 }
4419 4423 sata_build_read_verify_cmd(scmd, 1, 5);
4420 4424 scmd->satacmd_flags.sata_copy_out_error_reg = B_TRUE;
4421 4425 if (sata_hba_start(spx, &rval) != 0) {
4422 4426 mutex_exit(cport_mutex);
4423 4427 return (rval);
4424 4428 }
4425 4429 if (scmd->satacmd_error_reg != 0) {
4426 4430 goto err_out;
4427 4431 }
4428 4432 break;
4429 4433 default:
4430 4434 goto err_out;
4431 4435 }
4432 4436 break;
4433 4437 case 0xb:
4434 4438 if ((sata_get_standby_timer(sdinfo->satadrv_standby_timer) ==
4435 4439 0) || (!(sata_id->ai_cap & SATA_STANDBYTIMER))) {
4436 4440 mutex_exit(cport_mutex);
4437 4441 return (sata_txlt_check_condition(spx,
4438 4442 KEY_ILLEGAL_REQUEST,
4439 4443 SD_SCSI_ASC_INVALID_FIELD_IN_CDB));
4440 4444 }
4441 4445 sata_build_generic_cmd(scmd, SATAC_FLUSH_CACHE);
4442 4446 scmd->satacmd_flags.sata_copy_out_error_reg = B_TRUE;
4443 4447 if (!(scsipkt->pkt_cdbp[4] & START_STOP_NOFLUSH_MASK)) {
4444 4448 if (sata_hba_start(spx, &rval) != 0) {
4445 4449 mutex_exit(cport_mutex);
4446 4450 return (rval);
4447 4451 }
4448 4452 if (scmd->satacmd_error_reg != 0) {
4449 4453 goto err_out;
4450 4454 }
4451 4455 sata_build_generic_cmd(scmd, SATAC_STANDBY_IM);
4452 4456 scmd->satacmd_flags.sata_copy_out_error_reg = B_TRUE;
4453 4457 if (sata_hba_start(spx, &rval) != 0) {
4454 4458 mutex_exit(cport_mutex);
4455 4459 return (rval);
4456 4460 }
4457 4461 if (scmd->satacmd_error_reg != 0) {
4458 4462 goto err_out;
4459 4463 }
4460 4464 }
4461 4465 bzero(sdinfo->satadrv_standby_timer, sizeof (uchar_t) * 4);
4462 4466 break;
4463 4467 default:
4464 4468 err_out:
4465 4469 mutex_exit(cport_mutex);
4466 4470 return (sata_txlt_check_condition(spx, KEY_ILLEGAL_REQUEST,
4467 4471 SD_SCSI_ASC_INVALID_FIELD_IN_CDB));
4468 4472 }
4469 4473
4470 4474 /*
4471 4475 * Since it was a synchronous command,
4472 4476 * a callback function will be called directly.
4473 4477 */
4474 4478 mutex_exit(cport_mutex);
4475 4479 SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
4476 4480 "synchronous execution status %x\n",
4477 4481 spx->txlt_sata_pkt->satapkt_reason);
4478 4482
4479 4483 if ((scsipkt->pkt_flags & FLAG_NOINTR) == 0 &&
4480 4484 scsipkt->pkt_comp != NULL) {
4481 4485 sata_set_arq_data(spx->txlt_sata_pkt);
4482 4486 if (servicing_interrupt()) {
4483 4487 if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
4484 4488 (task_func_t *)spx->txlt_scsi_pkt->pkt_comp,
4485 4489 (void *)spx->txlt_scsi_pkt, TQ_NOSLEEP) == NULL) {
4486 4490 return (TRAN_BUSY);
4487 4491 }
4488 4492 } else if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
4489 4493 (task_func_t *)spx->txlt_scsi_pkt->pkt_comp,
4490 4494 (void *)spx->txlt_scsi_pkt, TQ_SLEEP) == NULL) {
4491 4495 /* Scheduling the callback failed */
4492 4496 return (TRAN_BUSY);
4493 4497 }
4494 4498 }
4495 4499 else
4496 4500
4497 4501 sata_txlt_nodata_cmd_completion(spx->txlt_sata_pkt);
4498 4502
4499 4503 return (TRAN_ACCEPT);
4500 4504
4501 4505 }
4502 4506
4503 4507 /*
4504 4508 * SATA translate command: Read Capacity.
4505 4509 * Emulated command for SATA disks.
4506 4510 * Capacity is retrieved from cached Idenifty Device data.
4507 4511 * Identify Device data shows effective disk capacity, not the native
4508 4512 * capacity, which may be limitted by Set Max Address command.
4509 4513 * This is ATA version for SATA hard disks.
4510 4514 *
4511 4515 * Returns TRAN_ACCEPT and appropriate values in scsi_pkt fields.
4512 4516 */
4513 4517 static int
4514 4518 sata_txlt_read_capacity(sata_pkt_txlate_t *spx)
4515 4519 {
4516 4520 struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
4517 4521 struct buf *bp = spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp;
4518 4522 sata_drive_info_t *sdinfo;
4519 4523 uint64_t val;
4520 4524 uint32_t lbsize = DEV_BSIZE;
4521 4525 uchar_t *rbuf;
4522 4526 int rval, reason;
4523 4527 kmutex_t *cport_mutex = &(SATA_TXLT_CPORT_MUTEX(spx));
4524 4528
4525 4529 SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
4526 4530 "sata_txlt_read_capacity: ", NULL);
4527 4531
4528 4532 mutex_enter(cport_mutex);
4529 4533
4530 4534 if (((rval = sata_txlt_generic_pkt_info(spx, &reason, 0)) !=
4531 4535 TRAN_ACCEPT) || (reason == CMD_DEV_GONE)) {
4532 4536 mutex_exit(cport_mutex);
4533 4537 return (rval);
4534 4538 }
4535 4539
4536 4540 scsipkt->pkt_reason = CMD_CMPLT;
4537 4541 scsipkt->pkt_state = STATE_GOT_BUS | STATE_GOT_TARGET |
4538 4542 STATE_SENT_CMD | STATE_GOT_STATUS;
4539 4543 *scsipkt->pkt_scbp = STATUS_GOOD;
4540 4544 if (bp != NULL && bp->b_un.b_addr && bp->b_bcount) {
4541 4545 /*
4542 4546 * Because it is fully emulated command storing data
4543 4547 * programatically in the specified buffer, release
4544 4548 * preallocated DMA resources before storing data in the buffer,
4545 4549 * so no unwanted DMA sync would take place.
4546 4550 */
4547 4551 sata_scsi_dmafree(NULL, scsipkt);
4548 4552
4549 4553 sdinfo = sata_get_device_info(
4550 4554 spx->txlt_sata_hba_inst,
4551 4555 &spx->txlt_sata_pkt->satapkt_device);
4552 4556
4553 4557 /*
4554 4558 * As per SBC-3, the "returned LBA" is either the highest
4555 4559 * addressable LBA or 0xffffffff, whichever is smaller.
4556 4560 */
4557 4561 val = MIN(sdinfo->satadrv_capacity - 1, UINT32_MAX);
4558 4562
4559 4563 if (sdinfo->satadrv_id.ai_phys_sect_sz & SATA_L2PS_CHECK_BIT) {
4560 4564 /* physical/logical sector size word is valid */
4561 4565
4562 4566 if (sdinfo->satadrv_id.ai_phys_sect_sz &
4563 4567 SATA_L2PS_BIG_SECTORS) {
4564 4568 /* if this set 117-118 words are valid */
4565 4569 lbsize = sdinfo->satadrv_id.ai_words_lsec[0] |
4566 4570 (sdinfo->satadrv_id.ai_words_lsec[1] << 16);
4567 4571 lbsize <<= 1; /* convert from words to bytes */
4568 4572 }
4569 4573 }
4570 4574 rbuf = (uchar_t *)bp->b_un.b_addr;
4571 4575 /* Need to swap endians to match scsi format */
4572 4576 rbuf[0] = (val >> 24) & 0xff;
4573 4577 rbuf[1] = (val >> 16) & 0xff;
4574 4578 rbuf[2] = (val >> 8) & 0xff;
4575 4579 rbuf[3] = val & 0xff;
4576 4580 rbuf[4] = (lbsize >> 24) & 0xff;
4577 4581 rbuf[5] = (lbsize >> 16) & 0xff;
4578 4582 rbuf[6] = (lbsize >> 8) & 0xff;
4579 4583 rbuf[7] = lbsize & 0xff;
4580 4584
4581 4585 scsipkt->pkt_state |= STATE_XFERRED_DATA;
4582 4586 scsipkt->pkt_resid = 0;
4583 4587
4584 4588 SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst, "%d\n",
4585 4589 sdinfo->satadrv_capacity -1);
4586 4590 }
4587 4591 mutex_exit(cport_mutex);
4588 4592 /*
4589 4593 * If a callback was requested, do it now.
4590 4594 */
4591 4595 SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
4592 4596 "Scsi_pkt completion reason %x\n", scsipkt->pkt_reason);
4593 4597
4594 4598 if ((scsipkt->pkt_flags & FLAG_NOINTR) == 0 &&
4595 4599 scsipkt->pkt_comp != NULL) {
4596 4600 /* scsi callback required */
4597 4601 if (servicing_interrupt()) {
4598 4602 if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
4599 4603 (task_func_t *)spx->txlt_scsi_pkt->pkt_comp,
4600 4604 (void *)spx->txlt_scsi_pkt, TQ_NOSLEEP) == NULL) {
4601 4605 return (TRAN_BUSY);
4602 4606 }
4603 4607 } else if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
4604 4608 (task_func_t *)spx->txlt_scsi_pkt->pkt_comp,
4605 4609 (void *)spx->txlt_scsi_pkt, TQ_SLEEP) == NULL) {
4606 4610 /* Scheduling the callback failed */
4607 4611 return (TRAN_BUSY);
4608 4612 }
4609 4613 }
4610 4614
4611 4615 return (TRAN_ACCEPT);
4612 4616 }
4613 4617
4614 4618 /*
4615 4619 * SATA translate command: Read Capacity (16).
4616 4620 * Emulated command for SATA disks.
4617 4621 * Info is retrieved from cached Identify Device data.
4618 4622 * Implemented to SBC-3 (draft 21) and SAT-2 (final) specifications.
4619 4623 *
4620 4624 * Returns TRAN_ACCEPT and appropriate values in scsi_pkt fields.
4621 4625 */
4622 4626 static int
4623 4627 sata_txlt_read_capacity16(sata_pkt_txlate_t *spx)
4624 4628 {
4625 4629 struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
4626 4630 struct buf *bp = spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp;
4627 4631 sata_drive_info_t *sdinfo;
4628 4632 uint64_t val;
4629 4633 uint16_t l2p_exp;
4630 4634 uint32_t lbsize = DEV_BSIZE;
4631 4635 uchar_t *rbuf;
4632 4636 int rval, reason;
4633 4637 #define TPE 0x80
4634 4638 #define TPRZ 0x40
4635 4639 kmutex_t *cport_mutex = &(SATA_TXLT_CPORT_MUTEX(spx));
4636 4640
4637 4641 SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
4638 4642 "sata_txlt_read_capacity: ", NULL);
4639 4643
4640 4644 mutex_enter(cport_mutex);
4641 4645
4642 4646 if (((rval = sata_txlt_generic_pkt_info(spx, &reason, 0)) !=
4643 4647 TRAN_ACCEPT) || (reason == CMD_DEV_GONE)) {
4644 4648 mutex_exit(cport_mutex);
4645 4649 return (rval);
4646 4650 }
4647 4651
4648 4652 scsipkt->pkt_reason = CMD_CMPLT;
4649 4653 scsipkt->pkt_state = STATE_GOT_BUS | STATE_GOT_TARGET |
4650 4654 STATE_SENT_CMD | STATE_GOT_STATUS;
4651 4655 if (bp != NULL && bp->b_un.b_addr && bp->b_bcount) {
4652 4656 /*
4653 4657 * Because it is fully emulated command storing data
4654 4658 * programatically in the specified buffer, release
4655 4659 * preallocated DMA resources before storing data in the buffer,
4656 4660 * so no unwanted DMA sync would take place.
4657 4661 */
4658 4662 sata_scsi_dmafree(NULL, scsipkt);
4659 4663
4660 4664 /* Check SERVICE ACTION field */
4661 4665 if ((scsipkt->pkt_cdbp[1] & 0x1f) !=
4662 4666 SSVC_ACTION_READ_CAPACITY_G4) {
4663 4667 mutex_exit(cport_mutex);
4664 4668 return (sata_txlt_check_condition(spx,
4665 4669 KEY_ILLEGAL_REQUEST,
4666 4670 SD_SCSI_ASC_INVALID_FIELD_IN_CDB));
4667 4671 }
4668 4672
4669 4673 /* Check LBA field */
4670 4674 if ((scsipkt->pkt_cdbp[2] != 0) ||
4671 4675 (scsipkt->pkt_cdbp[3] != 0) ||
4672 4676 (scsipkt->pkt_cdbp[4] != 0) ||
4673 4677 (scsipkt->pkt_cdbp[5] != 0) ||
4674 4678 (scsipkt->pkt_cdbp[6] != 0) ||
4675 4679 (scsipkt->pkt_cdbp[7] != 0) ||
4676 4680 (scsipkt->pkt_cdbp[8] != 0) ||
4677 4681 (scsipkt->pkt_cdbp[9] != 0)) {
4678 4682 mutex_exit(cport_mutex);
4679 4683 return (sata_txlt_check_condition(spx,
4680 4684 KEY_ILLEGAL_REQUEST,
4681 4685 SD_SCSI_ASC_INVALID_FIELD_IN_CDB));
4682 4686 }
4683 4687
4684 4688 /* Check PMI bit */
4685 4689 if (scsipkt->pkt_cdbp[14] & 0x1) {
4686 4690 mutex_exit(cport_mutex);
4687 4691 return (sata_txlt_check_condition(spx,
4688 4692 KEY_ILLEGAL_REQUEST,
4689 4693 SD_SCSI_ASC_INVALID_FIELD_IN_CDB));
4690 4694 }
4691 4695
4692 4696 *scsipkt->pkt_scbp = STATUS_GOOD;
4693 4697
4694 4698 sdinfo = sata_get_device_info(
4695 4699 spx->txlt_sata_hba_inst,
4696 4700 &spx->txlt_sata_pkt->satapkt_device);
4697 4701
4698 4702 /* last logical block address */
4699 4703 val = MIN(sdinfo->satadrv_capacity - 1,
4700 4704 SCSI_READ_CAPACITY16_MAX_LBA);
4701 4705
4702 4706 /* logical to physical block size exponent */
4703 4707 l2p_exp = 0;
4704 4708 if (sdinfo->satadrv_id.ai_phys_sect_sz & SATA_L2PS_CHECK_BIT) {
4705 4709 /* physical/logical sector size word is valid */
4706 4710
4707 4711 if (sdinfo->satadrv_id.ai_phys_sect_sz &
4708 4712 SATA_L2PS_HAS_MULT) {
4709 4713 /* multiple logical sectors per phys sectors */
4710 4714 l2p_exp =
4711 4715 sdinfo->satadrv_id.ai_phys_sect_sz &
4712 4716 SATA_L2PS_EXP_MASK;
4713 4717 }
4714 4718
4715 4719 if (sdinfo->satadrv_id.ai_phys_sect_sz &
4716 4720 SATA_L2PS_BIG_SECTORS) {
4717 4721 /* if this set 117-118 words are valid */
4718 4722 lbsize = sdinfo->satadrv_id.ai_words_lsec[0] |
4719 4723 (sdinfo->satadrv_id.ai_words_lsec[1] << 16);
4720 4724 lbsize <<= 1; /* convert from words to bytes */
4721 4725 }
4722 4726 }
4723 4727
4724 4728 rbuf = (uchar_t *)bp->b_un.b_addr;
4725 4729 bzero(rbuf, bp->b_bcount);
4726 4730
4727 4731 /* returned logical block address */
4728 4732 rbuf[0] = (val >> 56) & 0xff;
4729 4733 rbuf[1] = (val >> 48) & 0xff;
4730 4734 rbuf[2] = (val >> 40) & 0xff;
4731 4735 rbuf[3] = (val >> 32) & 0xff;
4732 4736 rbuf[4] = (val >> 24) & 0xff;
4733 4737 rbuf[5] = (val >> 16) & 0xff;
4734 4738 rbuf[6] = (val >> 8) & 0xff;
4735 4739 rbuf[7] = val & 0xff;
4736 4740 rbuf[8] = (lbsize >> 24) & 0xff;
4737 4741 rbuf[9] = (lbsize >> 16) & 0xff;
4738 4742 rbuf[10] = (lbsize >> 8) & 0xff;
4739 4743 rbuf[11] = lbsize & 0xff;
4740 4744
4741 4745 /* p_type, prot_en, unspecified by SAT-2 */
4742 4746 /* rbuf[12] = 0; */
4743 4747
4744 4748 /* p_i_exponent, undefined by SAT-2 */
4745 4749 /* logical blocks per physical block exponent */
4746 4750 rbuf[13] = l2p_exp;
4747 4751
4748 4752 /* lowest aligned logical block address = 0 (for now) */
4749 4753 /* tpe and tprz as defined in T10/10-079 r0 */
4750 4754 if (sdinfo->satadrv_id.ai_addsupported &
4751 4755 SATA_DETERMINISTIC_READ) {
4752 4756 if (sdinfo->satadrv_id.ai_addsupported &
4753 4757 SATA_READ_ZERO) {
4754 4758 rbuf[14] |= TPRZ;
4755 4759 } else {
4756 4760 rbuf[14] |= TPE;
4757 4761 }
4758 4762 }
4759 4763 /* rbuf[15] = 0; */
4760 4764
4761 4765 scsipkt->pkt_state |= STATE_XFERRED_DATA;
4762 4766 scsipkt->pkt_resid = 0;
4763 4767
4764 4768 SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst, "%llu\n",
4765 4769 sdinfo->satadrv_capacity -1);
4766 4770 }
4767 4771
4768 4772 mutex_exit(cport_mutex);
4769 4773
4770 4774 /*
4771 4775 * If a callback was requested, do it now.
4772 4776 */
4773 4777 SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
4774 4778 "Scsi_pkt completion reason %x\n", scsipkt->pkt_reason);
4775 4779
4776 4780 if ((scsipkt->pkt_flags & FLAG_NOINTR) == 0 &&
4777 4781 scsipkt->pkt_comp != NULL) {
4778 4782 /* scsi callback required */
4779 4783 if (servicing_interrupt()) {
4780 4784 if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
4781 4785 (task_func_t *)spx->txlt_scsi_pkt->pkt_comp,
4782 4786 (void *)spx->txlt_scsi_pkt, TQ_NOSLEEP) == NULL) {
4783 4787 return (TRAN_BUSY);
4784 4788 }
4785 4789 } else if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
4786 4790 (task_func_t *)spx->txlt_scsi_pkt->pkt_comp,
4787 4791 (void *)spx->txlt_scsi_pkt, TQ_SLEEP) == NULL) {
4788 4792 /* Scheduling the callback failed */
4789 4793 return (TRAN_BUSY);
4790 4794 }
4791 4795 }
4792 4796
4793 4797 return (TRAN_ACCEPT);
4794 4798 }
4795 4799
4796 4800 /*
4797 4801 * Translate command: UNMAP
4798 4802 *
4799 4803 * The function cannot be called in interrupt context since it may sleep.
4800 4804 */
4801 4805 static int
4802 4806 sata_txlt_unmap(sata_pkt_txlate_t *spx)
4803 4807 {
4804 4808 struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
4805 4809 sata_cmd_t *scmd = &spx->txlt_sata_pkt->satapkt_cmd;
4806 4810 struct buf *bp = spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp;
4807 4811 uint16_t count = 0;
4808 4812 int synch;
4809 4813 int rval, reason;
4810 4814 int i, x;
4811 4815 int bdlen = 0;
4812 4816 int ranges = 0;
4813 4817 int paramlen = 8;
4814 4818 uint8_t *data, *tmpbd;
4815 4819 sata_drive_info_t *sdinfo;
4816 4820 kmutex_t *cport_mutex = &(SATA_TXLT_CPORT_MUTEX(spx));
4817 4821 #define TRIM 0x1
4818 4822
4819 4823 SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
4820 4824 "sata_txlt_unmap: ", NULL);
4821 4825
4822 4826 mutex_enter(cport_mutex);
4823 4827
4824 4828 sdinfo = sata_get_device_info(spx->txlt_sata_hba_inst,
4825 4829 &spx->txlt_sata_pkt->satapkt_device);
4826 4830 if (sdinfo != NULL) {
4827 4831 SATADBG2(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
4828 4832 "DSM support 0x%x, max number of 512 byte blocks of LBA "
4829 4833 "range entries 0x%x\n", sdinfo->satadrv_id.ai_dsm,
4830 4834 sdinfo->satadrv_id.ai_maxcount);
4831 4835 }
4832 4836
4833 4837 rval = sata_txlt_generic_pkt_info(spx, &reason, 1);
4834 4838 if ((rval != TRAN_ACCEPT) || (reason == CMD_DEV_GONE)) {
4835 4839 mutex_exit(cport_mutex);
4836 4840 return (rval);
4837 4841 }
|
↓ open down ↓ |
3144 lines elided |
↑ open up ↑ |
4838 4842
4839 4843 /*
4840 4844 * Need to modify bp to have TRIM data instead of UNMAP data.
4841 4845 * Start by getting the block descriptor data length by subtracting
4842 4846 * the 8 byte parameter list header from the parameter list length.
4843 4847 * The block descriptor size has to be a multiple of 16 bytes.
4844 4848 */
4845 4849 bdlen = scsipkt->pkt_cdbp[7];
4846 4850 bdlen = (bdlen << 8) + scsipkt->pkt_cdbp[8] - paramlen;
4847 4851 if ((bdlen < 0) || ((bdlen % 16) != 0) ||
4848 - (bdlen > (bp->b_bcount - paramlen))) {
4852 + ((bp != NULL) && (bdlen > (bp->b_bcount - paramlen)))) {
4849 4853 SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
4850 4854 "sata_txlt_unmap: invalid block descriptor length", NULL);
4851 4855 mutex_exit(cport_mutex);
4852 4856 return ((sata_txlt_check_condition(spx, KEY_ILLEGAL_REQUEST,
4853 4857 SD_SCSI_ASC_INVALID_FIELD_IN_CDB)));
4854 4858 }
4855 4859 /*
4856 4860 * If there are no parameter data or block descriptors, it is not
4857 4861 * considered an error so just complete the command without sending
4858 4862 * TRIM.
4859 4863 */
4860 4864 if ((bdlen == 0) || (bp == NULL) || (bp->b_un.b_addr == NULL) ||
4861 4865 (bp->b_bcount == 0)) {
4862 4866 SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
4863 4867 "sata_txlt_unmap: no parameter data or block descriptors",
4864 4868 NULL);
4865 4869 mutex_exit(cport_mutex);
4866 4870 return (sata_txlt_unmap_nodata_cmd(spx));
4867 4871 }
4868 4872 tmpbd = (uint8_t *)bp->b_un.b_addr + paramlen;
4869 4873 data = kmem_zalloc(bdlen, KM_SLEEP);
4870 4874
4871 4875 /*
4872 4876 * Loop through all the UNMAP block descriptors and convert the data
4873 4877 * into TRIM format.
4874 4878 */
4875 4879 for (i = 0, x = 0; i < bdlen; i += 16, x += 8) {
4876 4880 /* get range length */
4877 4881 data[x] = tmpbd[i+7];
4878 4882 data[x+1] = tmpbd[i+6];
4879 4883 /* get LBA */
4880 4884 data[x+2] = tmpbd[i+5];
4881 4885 data[x+3] = tmpbd[i+4];
4882 4886 data[x+4] = tmpbd[i+3];
4883 4887 data[x+5] = tmpbd[i+2];
4884 4888 data[x+6] = tmpbd[i+11];
4885 4889 data[x+7] = tmpbd[i+10];
4886 4890
4887 4891 ranges++;
4888 4892 }
4889 4893
4890 4894 /*
4891 4895 * The TRIM command expects the data buffer to be a multiple of
4892 4896 * 512-byte blocks of range entries. This means that the UNMAP buffer
4893 4897 * may be too small. Free the original DMA resources and create a
4894 4898 * local buffer.
4895 4899 */
4896 4900 sata_common_free_dma_rsrcs(spx);
4897 4901
4898 4902 /*
4899 4903 * Get count of 512-byte blocks of range entries. The length
4900 4904 * of a range entry is 8 bytes which means one count has 64 range
4901 4905 * entries.
4902 4906 */
4903 4907 count = (ranges + 63)/64;
4904 4908
4905 4909 /* Allocate a buffer that is a multiple of 512 bytes. */
4906 4910 mutex_exit(cport_mutex);
4907 4911 bp = sata_alloc_local_buffer(spx, count * 512);
4908 4912 if (bp == NULL) {
4909 4913 SATADBG1(SATA_DBG_ATAPI, spx->txlt_sata_hba_inst,
4910 4914 "sata_txlt_unmap: "
4911 4915 "cannot allocate buffer for TRIM command", NULL);
4912 4916 kmem_free(data, bdlen);
4913 4917 return (TRAN_BUSY);
4914 4918 }
4915 4919 bp_mapin(bp); /* make data buffer accessible */
4916 4920 mutex_enter(cport_mutex);
4917 4921
4918 4922 bzero(bp->b_un.b_addr, bp->b_bcount);
4919 4923 bcopy(data, bp->b_un.b_addr, x);
4920 4924 kmem_free(data, bdlen);
4921 4925 rval = ddi_dma_sync(spx->txlt_buf_dma_handle, 0, 0,
4922 4926 DDI_DMA_SYNC_FORDEV);
4923 4927 ASSERT(rval == DDI_SUCCESS);
4924 4928
4925 4929 scmd->satacmd_flags.sata_data_direction = SATA_DIR_WRITE;
4926 4930 scmd->satacmd_addr_type = ATA_ADDR_LBA48;
4927 4931 scmd->satacmd_cmd_reg = SATAC_DSM;
4928 4932 scmd->satacmd_sec_count_msb = (count >> 8) & 0xff;
4929 4933 scmd->satacmd_sec_count_lsb = count & 0xff;
4930 4934 scmd->satacmd_features_reg = TRIM;
4931 4935 scmd->satacmd_device_reg = SATA_ADH_LBA;
4932 4936 scmd->satacmd_status_reg = 0;
4933 4937 scmd->satacmd_error_reg = 0;
4934 4938
4935 4939 /* Start processing command */
4936 4940 if (!(spx->txlt_sata_pkt->satapkt_op_mode & SATA_OPMODE_SYNCH)) {
4937 4941 spx->txlt_sata_pkt->satapkt_comp =
4938 4942 sata_txlt_unmap_completion;
4939 4943 synch = FALSE;
4940 4944 } else {
4941 4945 synch = TRUE;
4942 4946 }
4943 4947
4944 4948 if (sata_hba_start(spx, &rval) != 0) {
4945 4949 mutex_exit(cport_mutex);
4946 4950 return (rval);
4947 4951 }
4948 4952
4949 4953 mutex_exit(cport_mutex);
4950 4954
4951 4955 if (synch) {
4952 4956 sata_txlt_unmap_completion(spx->txlt_sata_pkt);
4953 4957 }
4954 4958
4955 4959 return (TRAN_ACCEPT);
4956 4960 }
4957 4961
4958 4962 /*
4959 4963 * SATA translate command: Mode Sense.
4960 4964 * Translated into appropriate SATA command or emulated.
4961 4965 * Saved Values Page Control (03) are not supported.
4962 4966 *
4963 4967 * NOTE: only caching mode sense page is currently implemented.
4964 4968 *
4965 4969 * Returns TRAN_ACCEPT and appropriate values in scsi_pkt fields.
4966 4970 */
4967 4971
4968 4972 #define LLBAA 0x10 /* Long LBA Accepted */
4969 4973
4970 4974 static int
4971 4975 sata_txlt_mode_sense(sata_pkt_txlate_t *spx)
4972 4976 {
4973 4977 struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
4974 4978 struct buf *bp = spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp;
4975 4979 sata_drive_info_t *sdinfo;
4976 4980 sata_id_t *sata_id;
4977 4981 struct scsi_extended_sense *sense;
4978 4982 int len, bdlen, count, alc_len;
4979 4983 int pc; /* Page Control code */
4980 4984 uint8_t *buf; /* mode sense buffer */
4981 4985 int rval, reason;
4982 4986 kmutex_t *cport_mutex = &(SATA_TXLT_CPORT_MUTEX(spx));
4983 4987
4984 4988 SATADBG2(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
4985 4989 "sata_txlt_mode_sense, pc %x page code 0x%02x\n",
4986 4990 spx->txlt_scsi_pkt->pkt_cdbp[2] >> 6,
4987 4991 spx->txlt_scsi_pkt->pkt_cdbp[2] & 0x3f);
4988 4992
4989 4993 if (servicing_interrupt()) {
4990 4994 buf = kmem_zalloc(1024, KM_NOSLEEP);
4991 4995 if (buf == NULL) {
4992 4996 return (TRAN_BUSY);
4993 4997 }
4994 4998 } else {
4995 4999 buf = kmem_zalloc(1024, KM_SLEEP);
4996 5000 }
4997 5001
4998 5002 mutex_enter(cport_mutex);
4999 5003
5000 5004 if (((rval = sata_txlt_generic_pkt_info(spx, &reason, 0)) !=
5001 5005 TRAN_ACCEPT) || (reason == CMD_DEV_GONE)) {
5002 5006 mutex_exit(cport_mutex);
5003 5007 kmem_free(buf, 1024);
5004 5008 return (rval);
5005 5009 }
5006 5010
5007 5011 scsipkt->pkt_reason = CMD_CMPLT;
5008 5012 scsipkt->pkt_state = STATE_GOT_BUS | STATE_GOT_TARGET |
5009 5013 STATE_SENT_CMD | STATE_GOT_STATUS;
5010 5014
5011 5015 pc = scsipkt->pkt_cdbp[2] >> 6;
5012 5016
5013 5017 if (bp != NULL && bp->b_un.b_addr && bp->b_bcount) {
5014 5018 /*
5015 5019 * Because it is fully emulated command storing data
5016 5020 * programatically in the specified buffer, release
5017 5021 * preallocated DMA resources before storing data in the buffer,
5018 5022 * so no unwanted DMA sync would take place.
5019 5023 */
5020 5024 sata_scsi_dmafree(NULL, scsipkt);
5021 5025
5022 5026 len = 0;
5023 5027 bdlen = 0;
5024 5028 if (!(scsipkt->pkt_cdbp[1] & 8)) {
5025 5029 if (scsipkt->pkt_cdbp[0] == SCMD_MODE_SENSE_G1 &&
5026 5030 (scsipkt->pkt_cdbp[1] & LLBAA))
5027 5031 bdlen = 16;
5028 5032 else
5029 5033 bdlen = 8;
5030 5034 }
5031 5035 /* Build mode parameter header */
5032 5036 if (spx->txlt_scsi_pkt->pkt_cdbp[0] == SCMD_MODE_SENSE) {
5033 5037 /* 4-byte mode parameter header */
5034 5038 buf[len++] = 0; /* mode data length */
5035 5039 buf[len++] = 0; /* medium type */
5036 5040 buf[len++] = 0; /* dev-specific param */
5037 5041 buf[len++] = bdlen; /* Block Descriptor length */
5038 5042 } else {
5039 5043 /* 8-byte mode parameter header */
5040 5044 buf[len++] = 0; /* mode data length */
5041 5045 buf[len++] = 0;
5042 5046 buf[len++] = 0; /* medium type */
5043 5047 buf[len++] = 0; /* dev-specific param */
5044 5048 if (bdlen == 16)
5045 5049 buf[len++] = 1; /* long lba descriptor */
5046 5050 else
5047 5051 buf[len++] = 0;
5048 5052 buf[len++] = 0;
5049 5053 buf[len++] = 0; /* Block Descriptor length */
5050 5054 buf[len++] = bdlen;
5051 5055 }
5052 5056
5053 5057 sdinfo = sata_get_device_info(
5054 5058 spx->txlt_sata_hba_inst,
5055 5059 &spx->txlt_sata_pkt->satapkt_device);
5056 5060
5057 5061 /* Build block descriptor only if not disabled (DBD) */
5058 5062 if ((scsipkt->pkt_cdbp[1] & 0x08) == 0) {
5059 5063 /* Block descriptor - direct-access device format */
5060 5064 if (bdlen == 8) {
5061 5065 /* build regular block descriptor */
5062 5066 buf[len++] =
5063 5067 (sdinfo->satadrv_capacity >> 24) & 0xff;
5064 5068 buf[len++] =
5065 5069 (sdinfo->satadrv_capacity >> 16) & 0xff;
5066 5070 buf[len++] =
5067 5071 (sdinfo->satadrv_capacity >> 8) & 0xff;
5068 5072 buf[len++] = sdinfo->satadrv_capacity & 0xff;
5069 5073 buf[len++] = 0; /* density code */
5070 5074 buf[len++] = 0;
5071 5075 if (sdinfo->satadrv_type ==
5072 5076 SATA_DTYPE_ATADISK)
5073 5077 buf[len++] = 2;
5074 5078 else
5075 5079 /* ATAPI */
5076 5080 buf[len++] = 8;
5077 5081 buf[len++] = 0;
5078 5082 } else if (bdlen == 16) {
5079 5083 /* Long LBA Accepted */
5080 5084 /* build long lba block descriptor */
5081 5085 #ifndef __lock_lint
5082 5086 buf[len++] =
5083 5087 (sdinfo->satadrv_capacity >> 56) & 0xff;
5084 5088 buf[len++] =
5085 5089 (sdinfo->satadrv_capacity >> 48) & 0xff;
5086 5090 buf[len++] =
5087 5091 (sdinfo->satadrv_capacity >> 40) & 0xff;
5088 5092 buf[len++] =
5089 5093 (sdinfo->satadrv_capacity >> 32) & 0xff;
5090 5094 #endif
5091 5095 buf[len++] =
5092 5096 (sdinfo->satadrv_capacity >> 24) & 0xff;
5093 5097 buf[len++] =
5094 5098 (sdinfo->satadrv_capacity >> 16) & 0xff;
5095 5099 buf[len++] =
5096 5100 (sdinfo->satadrv_capacity >> 8) & 0xff;
5097 5101 buf[len++] = sdinfo->satadrv_capacity & 0xff;
5098 5102 buf[len++] = 0;
5099 5103 buf[len++] = 0; /* density code */
5100 5104 buf[len++] = 0;
5101 5105 buf[len++] = 0;
5102 5106 if (sdinfo->satadrv_type ==
5103 5107 SATA_DTYPE_ATADISK)
5104 5108 buf[len++] = 2;
5105 5109 else
5106 5110 /* ATAPI */
5107 5111 buf[len++] = 8;
5108 5112 buf[len++] = 0;
5109 5113 }
5110 5114 }
5111 5115
5112 5116 sata_id = &sdinfo->satadrv_id;
5113 5117
5114 5118 /*
5115 5119 * Add requested pages.
5116 5120 * Page 3 and 4 are obsolete and we are not supporting them.
5117 5121 * We deal now with:
5118 5122 * caching (read/write cache control).
5119 5123 * We should eventually deal with following mode pages:
5120 5124 * error recovery (0x01),
5121 5125 * power condition (0x1a),
5122 5126 * exception control page (enables SMART) (0x1c),
5123 5127 * enclosure management (ses),
5124 5128 * protocol-specific port mode (port control).
5125 5129 */
5126 5130 switch (scsipkt->pkt_cdbp[2] & 0x3f) {
5127 5131 case MODEPAGE_RW_ERRRECOV:
5128 5132 /* DAD_MODE_ERR_RECOV */
5129 5133 /* R/W recovery */
5130 5134 len += sata_build_msense_page_1(sdinfo, pc, buf+len);
5131 5135 break;
5132 5136 case MODEPAGE_CACHING:
5133 5137 /* DAD_MODE_CACHE */
5134 5138 /* Reject not supported request for saved parameters */
5135 5139 if (pc == 3) {
5136 5140 *scsipkt->pkt_scbp = STATUS_CHECK;
5137 5141 sense = sata_arq_sense(spx);
5138 5142 sense->es_key = KEY_ILLEGAL_REQUEST;
5139 5143 sense->es_add_code =
5140 5144 SD_SCSI_ASC_SAVING_PARAMS_NOT_SUPPORTED;
5141 5145 goto done;
5142 5146 }
5143 5147
5144 5148 /* caching */
5145 5149 len += sata_build_msense_page_8(sdinfo, pc, buf+len);
5146 5150 break;
5147 5151 case MODEPAGE_INFO_EXCPT:
5148 5152 /* exception cntrl */
5149 5153 if (sata_id->ai_cmdset82 & SATA_SMART_SUPPORTED) {
5150 5154 len += sata_build_msense_page_1c(sdinfo, pc,
5151 5155 buf+len);
5152 5156 }
5153 5157 else
5154 5158 goto err;
5155 5159 break;
5156 5160 case MODEPAGE_POWER_COND:
5157 5161 /* DAD_MODE_POWER_COND */
5158 5162 /* power condition */
5159 5163 len += sata_build_msense_page_1a(sdinfo, pc, buf+len);
5160 5164 break;
5161 5165
5162 5166 case MODEPAGE_ACOUSTIC_MANAG:
5163 5167 /* acoustic management */
5164 5168 len += sata_build_msense_page_30(sdinfo, pc, buf+len);
5165 5169 break;
5166 5170 case MODEPAGE_ALLPAGES:
5167 5171 /* all pages */
5168 5172 len += sata_build_msense_page_1(sdinfo, pc, buf+len);
5169 5173 len += sata_build_msense_page_8(sdinfo, pc, buf+len);
5170 5174 len += sata_build_msense_page_1a(sdinfo, pc, buf+len);
5171 5175 if (sata_id->ai_cmdset82 & SATA_SMART_SUPPORTED) {
5172 5176 len += sata_build_msense_page_1c(sdinfo, pc,
5173 5177 buf+len);
5174 5178 }
5175 5179 len += sata_build_msense_page_30(sdinfo, pc, buf+len);
5176 5180 break;
5177 5181 default:
5178 5182 err:
5179 5183 /* Invalid request */
5180 5184 *scsipkt->pkt_scbp = STATUS_CHECK;
5181 5185 sense = sata_arq_sense(spx);
5182 5186 sense->es_key = KEY_ILLEGAL_REQUEST;
5183 5187 sense->es_add_code = SD_SCSI_ASC_INVALID_FIELD_IN_CDB;
5184 5188 goto done;
5185 5189 }
5186 5190
5187 5191 /* fix total mode data length */
5188 5192 if (spx->txlt_scsi_pkt->pkt_cdbp[0] == SCMD_MODE_SENSE) {
5189 5193 /* 4-byte mode parameter header */
5190 5194 buf[0] = len - 1; /* mode data length */
5191 5195 } else {
5192 5196 buf[0] = (len -2) >> 8;
5193 5197 buf[1] = (len -2) & 0xff;
5194 5198 }
5195 5199
5196 5200
5197 5201 /* Check allocation length */
5198 5202 if (scsipkt->pkt_cdbp[0] == SCMD_MODE_SENSE) {
5199 5203 alc_len = scsipkt->pkt_cdbp[4];
5200 5204 } else {
5201 5205 alc_len = scsipkt->pkt_cdbp[7];
5202 5206 alc_len = (len << 8) | scsipkt->pkt_cdbp[8];
5203 5207 }
5204 5208 /*
5205 5209 * We do not check for possible parameters truncation
5206 5210 * (alc_len < len) assuming that the target driver works
5207 5211 * correctly. Just avoiding overrun.
5208 5212 * Copy no more than requested and possible, buffer-wise.
5209 5213 */
5210 5214 count = MIN(alc_len, len);
5211 5215 count = MIN(bp->b_bcount, count);
5212 5216 bcopy(buf, bp->b_un.b_addr, count);
5213 5217
5214 5218 scsipkt->pkt_state |= STATE_XFERRED_DATA;
5215 5219 scsipkt->pkt_resid = alc_len > count ? alc_len - count : 0;
5216 5220 }
5217 5221 *scsipkt->pkt_scbp = STATUS_GOOD;
5218 5222 done:
5219 5223 mutex_exit(cport_mutex);
5220 5224 (void) kmem_free(buf, 1024);
5221 5225
5222 5226 SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
5223 5227 "Scsi_pkt completion reason %x\n", scsipkt->pkt_reason);
5224 5228
5225 5229 if ((scsipkt->pkt_flags & FLAG_NOINTR) == 0 &&
5226 5230 scsipkt->pkt_comp != NULL) {
5227 5231 /* scsi callback required */
5228 5232 if (servicing_interrupt()) {
5229 5233 if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
5230 5234 (task_func_t *)spx->txlt_scsi_pkt->pkt_comp,
5231 5235 (void *)spx->txlt_scsi_pkt, TQ_NOSLEEP) == NULL) {
5232 5236 return (TRAN_BUSY);
5233 5237 }
5234 5238 } else if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
5235 5239 (task_func_t *)spx->txlt_scsi_pkt->pkt_comp,
5236 5240 (void *)spx->txlt_scsi_pkt, TQ_SLEEP) == NULL) {
5237 5241 /* Scheduling the callback failed */
5238 5242 return (TRAN_BUSY);
5239 5243 }
5240 5244 }
5241 5245
5242 5246 return (TRAN_ACCEPT);
5243 5247 }
5244 5248
5245 5249
5246 5250 /*
5247 5251 * SATA translate command: Mode Select.
5248 5252 * Translated into appropriate SATA command or emulated.
5249 5253 * Saving parameters is not supported.
5250 5254 * Changing device capacity is not supported (although theoretically
5251 5255 * possible by executing SET FEATURES/SET MAX ADDRESS)
5252 5256 *
5253 5257 * Assumption is that the target driver is working correctly.
5254 5258 *
5255 5259 * More than one SATA command may be executed to perform operations specified
5256 5260 * by mode select pages. The first error terminates further execution.
5257 5261 * Operations performed successully are not backed-up in such case.
5258 5262 *
5259 5263 * NOTE: Implemented pages:
5260 5264 * - caching page
5261 5265 * - informational exception page
5262 5266 * - acoustic management page
5263 5267 * - power condition page
5264 5268 * Caching setup is remembered so it could be re-stored in case of
5265 5269 * an unexpected device reset.
5266 5270 *
5267 5271 * Returns TRAN_XXXX.
5268 5272 * If TRAN_ACCEPT is returned, appropriate values are set in scsi_pkt fields.
5269 5273 */
5270 5274
5271 5275 static int
5272 5276 sata_txlt_mode_select(sata_pkt_txlate_t *spx)
5273 5277 {
5274 5278 struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
5275 5279 struct buf *bp = spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp;
5276 5280 struct scsi_extended_sense *sense;
5277 5281 int len, pagelen, count, pllen;
5278 5282 uint8_t *buf; /* mode select buffer */
5279 5283 int rval, stat, reason;
5280 5284 uint_t nointr_flag;
5281 5285 int dmod = 0;
5282 5286 kmutex_t *cport_mutex = &(SATA_TXLT_CPORT_MUTEX(spx));
5283 5287
5284 5288 SATADBG2(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
5285 5289 "sata_txlt_mode_select, pc %x page code 0x%02x\n",
5286 5290 spx->txlt_scsi_pkt->pkt_cdbp[2] >> 6,
5287 5291 spx->txlt_scsi_pkt->pkt_cdbp[2] & 0x3f);
5288 5292
5289 5293 mutex_enter(cport_mutex);
5290 5294
5291 5295 if (((rval = sata_txlt_generic_pkt_info(spx, &reason, 1)) !=
5292 5296 TRAN_ACCEPT) || (reason == CMD_DEV_GONE)) {
5293 5297 mutex_exit(cport_mutex);
5294 5298 return (rval);
5295 5299 }
5296 5300
5297 5301 rval = TRAN_ACCEPT;
5298 5302
5299 5303 scsipkt->pkt_reason = CMD_CMPLT;
5300 5304 scsipkt->pkt_state = STATE_GOT_BUS | STATE_GOT_TARGET |
5301 5305 STATE_SENT_CMD | STATE_GOT_STATUS;
5302 5306 nointr_flag = scsipkt->pkt_flags & FLAG_NOINTR;
5303 5307
5304 5308 /* Reject not supported request */
5305 5309 if (! (scsipkt->pkt_cdbp[1] & 0x10)) { /* No support for PF bit = 0 */
5306 5310 *scsipkt->pkt_scbp = STATUS_CHECK;
5307 5311 sense = sata_arq_sense(spx);
5308 5312 sense->es_key = KEY_ILLEGAL_REQUEST;
5309 5313 sense->es_add_code = SD_SCSI_ASC_INVALID_FIELD_IN_CDB;
5310 5314 goto done;
5311 5315 }
5312 5316
5313 5317 if (scsipkt->pkt_cdbp[0] == SCMD_MODE_SELECT) {
5314 5318 pllen = scsipkt->pkt_cdbp[4];
5315 5319 } else {
5316 5320 pllen = scsipkt->pkt_cdbp[7];
5317 5321 pllen = (pllen << 8) | scsipkt->pkt_cdbp[7];
5318 5322 }
5319 5323
5320 5324 *scsipkt->pkt_scbp = STATUS_GOOD; /* Presumed outcome */
5321 5325
5322 5326 if (bp != NULL && bp->b_un.b_addr && bp->b_bcount && pllen != 0) {
5323 5327 buf = (uint8_t *)bp->b_un.b_addr;
5324 5328 count = MIN(bp->b_bcount, pllen);
5325 5329 scsipkt->pkt_state |= STATE_XFERRED_DATA;
5326 5330 scsipkt->pkt_resid = 0;
5327 5331 pllen = count;
5328 5332
5329 5333 /*
5330 5334 * Check the header to skip the block descriptor(s) - we
5331 5335 * do not support setting device capacity.
5332 5336 * Existing macros do not recognize long LBA dscriptor,
5333 5337 * hence manual calculation.
5334 5338 */
5335 5339 if (scsipkt->pkt_cdbp[0] == SCMD_MODE_SELECT) {
5336 5340 /* 6-bytes CMD, 4 bytes header */
5337 5341 if (count <= 4)
5338 5342 goto done; /* header only */
5339 5343 len = buf[3] + 4;
5340 5344 } else {
5341 5345 /* 10-bytes CMD, 8 bytes header */
5342 5346 if (count <= 8)
5343 5347 goto done; /* header only */
5344 5348 len = buf[6];
5345 5349 len = (len << 8) + buf[7] + 8;
5346 5350 }
5347 5351 if (len >= count)
5348 5352 goto done; /* header + descriptor(s) only */
5349 5353
5350 5354 pllen -= len; /* remaining data length */
5351 5355
5352 5356 /*
5353 5357 * We may be executing SATA command and want to execute it
5354 5358 * in SYNCH mode, regardless of scsi_pkt setting.
5355 5359 * Save scsi_pkt setting and indicate SYNCH mode
5356 5360 */
5357 5361 if ((scsipkt->pkt_flags & FLAG_NOINTR) == 0 &&
5358 5362 scsipkt->pkt_comp != NULL) {
5359 5363 scsipkt->pkt_flags |= FLAG_NOINTR;
5360 5364 }
5361 5365 spx->txlt_sata_pkt->satapkt_op_mode = SATA_OPMODE_SYNCH;
5362 5366
5363 5367 /*
5364 5368 * len is now the offset to a first mode select page
5365 5369 * Process all pages
5366 5370 */
5367 5371 while (pllen > 0) {
5368 5372 switch ((int)buf[len]) {
5369 5373 case MODEPAGE_CACHING:
5370 5374 /* No support for SP (saving) */
5371 5375 if (scsipkt->pkt_cdbp[1] & 0x01) {
5372 5376 *scsipkt->pkt_scbp = STATUS_CHECK;
5373 5377 sense = sata_arq_sense(spx);
5374 5378 sense->es_key = KEY_ILLEGAL_REQUEST;
5375 5379 sense->es_add_code =
5376 5380 SD_SCSI_ASC_INVALID_FIELD_IN_CDB;
5377 5381 goto done;
5378 5382 }
5379 5383 stat = sata_mode_select_page_8(spx,
5380 5384 (struct mode_cache_scsi3 *)&buf[len],
5381 5385 pllen, &pagelen, &rval, &dmod);
5382 5386 /*
5383 5387 * The pagelen value indicates the number of
5384 5388 * parameter bytes already processed.
5385 5389 * The rval is the return value from
5386 5390 * sata_tran_start().
5387 5391 * The stat indicates the overall status of
5388 5392 * the operation(s).
5389 5393 */
5390 5394 if (stat != SATA_SUCCESS)
5391 5395 /*
5392 5396 * Page processing did not succeed -
5393 5397 * all error info is already set-up,
5394 5398 * just return
5395 5399 */
5396 5400 pllen = 0; /* this breaks the loop */
5397 5401 else {
5398 5402 len += pagelen;
5399 5403 pllen -= pagelen;
5400 5404 }
5401 5405 break;
5402 5406
5403 5407 case MODEPAGE_INFO_EXCPT:
5404 5408 stat = sata_mode_select_page_1c(spx,
5405 5409 (struct mode_info_excpt_page *)&buf[len],
5406 5410 pllen, &pagelen, &rval, &dmod);
5407 5411 /*
5408 5412 * The pagelen value indicates the number of
5409 5413 * parameter bytes already processed.
5410 5414 * The rval is the return value from
5411 5415 * sata_tran_start().
5412 5416 * The stat indicates the overall status of
5413 5417 * the operation(s).
5414 5418 */
5415 5419 if (stat != SATA_SUCCESS)
5416 5420 /*
5417 5421 * Page processing did not succeed -
5418 5422 * all error info is already set-up,
5419 5423 * just return
5420 5424 */
5421 5425 pllen = 0; /* this breaks the loop */
5422 5426 else {
5423 5427 len += pagelen;
5424 5428 pllen -= pagelen;
5425 5429 }
5426 5430 break;
5427 5431
5428 5432 case MODEPAGE_ACOUSTIC_MANAG:
5429 5433 stat = sata_mode_select_page_30(spx,
5430 5434 (struct mode_acoustic_management *)
5431 5435 &buf[len], pllen, &pagelen, &rval, &dmod);
5432 5436 /*
5433 5437 * The pagelen value indicates the number of
5434 5438 * parameter bytes already processed.
5435 5439 * The rval is the return value from
5436 5440 * sata_tran_start().
5437 5441 * The stat indicates the overall status of
5438 5442 * the operation(s).
5439 5443 */
5440 5444 if (stat != SATA_SUCCESS)
5441 5445 /*
5442 5446 * Page processing did not succeed -
5443 5447 * all error info is already set-up,
5444 5448 * just return
5445 5449 */
5446 5450 pllen = 0; /* this breaks the loop */
5447 5451 else {
5448 5452 len += pagelen;
5449 5453 pllen -= pagelen;
5450 5454 }
5451 5455
5452 5456 break;
5453 5457 case MODEPAGE_POWER_COND:
5454 5458 stat = sata_mode_select_page_1a(spx,
5455 5459 (struct mode_info_power_cond *)&buf[len],
5456 5460 pllen, &pagelen, &rval, &dmod);
5457 5461 /*
5458 5462 * The pagelen value indicates the number of
5459 5463 * parameter bytes already processed.
5460 5464 * The rval is the return value from
5461 5465 * sata_tran_start().
5462 5466 * The stat indicates the overall status of
5463 5467 * the operation(s).
5464 5468 */
5465 5469 if (stat != SATA_SUCCESS)
5466 5470 /*
5467 5471 * Page processing did not succeed -
5468 5472 * all error info is already set-up,
5469 5473 * just return
5470 5474 */
5471 5475 pllen = 0; /* this breaks the loop */
5472 5476 else {
5473 5477 len += pagelen;
5474 5478 pllen -= pagelen;
5475 5479 }
5476 5480 break;
5477 5481 default:
5478 5482 *scsipkt->pkt_scbp = STATUS_CHECK;
5479 5483 sense = sata_arq_sense(spx);
5480 5484 sense->es_key = KEY_ILLEGAL_REQUEST;
5481 5485 sense->es_add_code =
5482 5486 SD_SCSI_ASC_INVALID_FIELD_IN_PARAMS_LIST;
5483 5487 goto done;
5484 5488 }
5485 5489 }
5486 5490 }
5487 5491 done:
5488 5492 mutex_exit(cport_mutex);
5489 5493 /*
5490 5494 * If device parameters were modified, fetch and store the new
5491 5495 * Identify Device data. Since port mutex could have been released
5492 5496 * for accessing HBA driver, we need to re-check device existence.
5493 5497 */
5494 5498 if (dmod != 0) {
5495 5499 sata_drive_info_t new_sdinfo, *sdinfo;
5496 5500 int rv = 0;
5497 5501
5498 5502 /*
5499 5503 * Following statement has to be changed if this function is
5500 5504 * used for devices other than SATA hard disks.
5501 5505 */
5502 5506 new_sdinfo.satadrv_type = SATA_DTYPE_ATADISK;
5503 5507
5504 5508 new_sdinfo.satadrv_addr =
5505 5509 spx->txlt_sata_pkt->satapkt_device.satadev_addr;
5506 5510 rv = sata_fetch_device_identify_data(spx->txlt_sata_hba_inst,
5507 5511 &new_sdinfo);
5508 5512
5509 5513 mutex_enter(cport_mutex);
5510 5514 /*
5511 5515 * Since port mutex could have been released when
5512 5516 * accessing HBA driver, we need to re-check that the
5513 5517 * framework still holds the device info structure.
5514 5518 */
5515 5519 sdinfo = sata_get_device_info(spx->txlt_sata_hba_inst,
5516 5520 &spx->txlt_sata_pkt->satapkt_device);
5517 5521 if (sdinfo != NULL) {
5518 5522 /*
5519 5523 * Device still has info structure in the
5520 5524 * sata framework. Copy newly fetched info
5521 5525 */
5522 5526 if (rv == 0) {
5523 5527 sdinfo->satadrv_id = new_sdinfo.satadrv_id;
5524 5528 sata_save_drive_settings(sdinfo);
5525 5529 } else {
5526 5530 /*
5527 5531 * Could not fetch new data - invalidate
5528 5532 * sata_drive_info. That makes device
5529 5533 * unusable.
5530 5534 */
5531 5535 sdinfo->satadrv_type = SATA_DTYPE_UNKNOWN;
5532 5536 sdinfo->satadrv_state = SATA_STATE_UNKNOWN;
5533 5537 }
5534 5538 }
5535 5539 if (rv != 0 || sdinfo == NULL) {
5536 5540 /*
5537 5541 * This changes the overall mode select completion
5538 5542 * reason to a failed one !!!!!
5539 5543 */
5540 5544 *scsipkt->pkt_scbp = STATUS_CHECK;
5541 5545 sense = sata_arq_sense(spx);
5542 5546 scsipkt->pkt_reason = CMD_INCOMPLETE;
5543 5547 rval = TRAN_ACCEPT;
5544 5548 }
5545 5549 mutex_exit(cport_mutex);
5546 5550 }
5547 5551 /* Restore the scsi pkt flags */
5548 5552 scsipkt->pkt_flags &= ~FLAG_NOINTR;
5549 5553 scsipkt->pkt_flags |= nointr_flag;
5550 5554
5551 5555 SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
5552 5556 "Scsi_pkt completion reason %x\n", scsipkt->pkt_reason);
5553 5557
5554 5558 if ((scsipkt->pkt_flags & FLAG_NOINTR) == 0 &&
5555 5559 scsipkt->pkt_comp != NULL) {
5556 5560 /* scsi callback required */
5557 5561 if (servicing_interrupt()) {
5558 5562 if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
5559 5563 (task_func_t *)spx->txlt_scsi_pkt->pkt_comp,
5560 5564 (void *)spx->txlt_scsi_pkt, TQ_NOSLEEP) == NULL) {
5561 5565 return (TRAN_BUSY);
5562 5566 }
5563 5567 } else if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
5564 5568 (task_func_t *)spx->txlt_scsi_pkt->pkt_comp,
5565 5569 (void *)spx->txlt_scsi_pkt, TQ_SLEEP) == NULL) {
5566 5570 /* Scheduling the callback failed */
5567 5571 return (TRAN_BUSY);
5568 5572 }
5569 5573 }
5570 5574
5571 5575 return (rval);
5572 5576 }
5573 5577
5574 5578 /*
5575 5579 * Translate command: ATA Pass Through
5576 5580 * Incomplete implementation. Only supports No-Data, PIO Data-In, and
5577 5581 * PIO Data-Out protocols. Also supports CK_COND bit.
5578 5582 *
5579 5583 * Mapping of the incoming CDB bytes to the outgoing satacmd bytes is
5580 5584 * described in Table 111 of SAT-2 (Draft 9).
5581 5585 */
5582 5586 static int
5583 5587 sata_txlt_ata_pass_thru(sata_pkt_txlate_t *spx)
5584 5588 {
5585 5589 struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
5586 5590 sata_cmd_t *scmd = &spx->txlt_sata_pkt->satapkt_cmd;
5587 5591 struct buf *bp = spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp;
5588 5592 int extend;
5589 5593 uint64_t lba;
5590 5594 uint16_t feature, sec_count;
5591 5595 int t_len, synch;
5592 5596 int rval, reason;
5593 5597 kmutex_t *cport_mutex = &(SATA_TXLT_CPORT_MUTEX(spx));
5594 5598
5595 5599 mutex_enter(cport_mutex);
5596 5600
5597 5601 rval = sata_txlt_generic_pkt_info(spx, &reason, 1);
5598 5602 if ((rval != TRAN_ACCEPT) || (reason == CMD_DEV_GONE)) {
5599 5603 mutex_exit(cport_mutex);
5600 5604 return (rval);
5601 5605 }
5602 5606
5603 5607 /* T_DIR bit */
5604 5608 if (scsipkt->pkt_cdbp[2] & SATL_APT_BM_T_DIR)
5605 5609 scmd->satacmd_flags.sata_data_direction = SATA_DIR_READ;
5606 5610 else
5607 5611 scmd->satacmd_flags.sata_data_direction = SATA_DIR_WRITE;
5608 5612
5609 5613 /* MULTIPLE_COUNT field. If non-zero, invalid command (for now). */
5610 5614 if (((scsipkt->pkt_cdbp[1] >> 5) & 0x7) != 0) {
5611 5615 mutex_exit(cport_mutex);
5612 5616 return (sata_txlt_ata_pass_thru_illegal_cmd(spx));
5613 5617 }
5614 5618
5615 5619 /* OFFLINE field. If non-zero, invalid command (for now). */
5616 5620 if (((scsipkt->pkt_cdbp[2] >> 6) & 0x3) != 0) {
5617 5621 mutex_exit(cport_mutex);
5618 5622 return (sata_txlt_ata_pass_thru_illegal_cmd(spx));
5619 5623 }
5620 5624
5621 5625 /* PROTOCOL field */
5622 5626 switch ((scsipkt->pkt_cdbp[1] >> 1) & 0xf) {
5623 5627 case SATL_APT_P_HW_RESET:
5624 5628 case SATL_APT_P_SRST:
5625 5629 case SATL_APT_P_DMA:
5626 5630 case SATL_APT_P_DMA_QUEUED:
5627 5631 case SATL_APT_P_DEV_DIAG:
5628 5632 case SATL_APT_P_DEV_RESET:
5629 5633 case SATL_APT_P_UDMA_IN:
5630 5634 case SATL_APT_P_UDMA_OUT:
5631 5635 case SATL_APT_P_FPDMA:
5632 5636 case SATL_APT_P_RET_RESP:
5633 5637 /* Not yet implemented */
5634 5638 default:
5635 5639 mutex_exit(cport_mutex);
5636 5640 return (sata_txlt_ata_pass_thru_illegal_cmd(spx));
5637 5641
5638 5642 case SATL_APT_P_NON_DATA:
5639 5643 scmd->satacmd_flags.sata_data_direction = SATA_DIR_NODATA_XFER;
5640 5644 break;
5641 5645
5642 5646 case SATL_APT_P_PIO_DATA_IN:
5643 5647 /* If PROTOCOL disagrees with T_DIR, invalid command */
5644 5648 if (scmd->satacmd_flags.sata_data_direction == SATA_DIR_WRITE) {
5645 5649 mutex_exit(cport_mutex);
5646 5650 return (sata_txlt_ata_pass_thru_illegal_cmd(spx));
5647 5651 }
5648 5652
5649 5653 /* if there is a buffer, release its DMA resources */
5650 5654 if ((bp != NULL) && bp->b_un.b_addr && bp->b_bcount) {
5651 5655 sata_scsi_dmafree(NULL, scsipkt);
5652 5656 } else {
5653 5657 /* if there is no buffer, how do you PIO in? */
5654 5658 mutex_exit(cport_mutex);
5655 5659 return (sata_txlt_ata_pass_thru_illegal_cmd(spx));
5656 5660 }
5657 5661
5658 5662 break;
5659 5663
5660 5664 case SATL_APT_P_PIO_DATA_OUT:
5661 5665 /* If PROTOCOL disagrees with T_DIR, invalid command */
5662 5666 if (scmd->satacmd_flags.sata_data_direction == SATA_DIR_READ) {
5663 5667 mutex_exit(cport_mutex);
5664 5668 return (sata_txlt_ata_pass_thru_illegal_cmd(spx));
5665 5669 }
5666 5670
5667 5671 /* if there is a buffer, release its DMA resources */
5668 5672 if ((bp != NULL) && bp->b_un.b_addr && bp->b_bcount) {
5669 5673 sata_scsi_dmafree(NULL, scsipkt);
5670 5674 } else {
5671 5675 /* if there is no buffer, how do you PIO out? */
5672 5676 mutex_exit(cport_mutex);
5673 5677 return (sata_txlt_ata_pass_thru_illegal_cmd(spx));
5674 5678 }
5675 5679
5676 5680 break;
5677 5681 }
5678 5682
5679 5683 /* Parse the ATA cmd fields, transfer some straight to the satacmd */
5680 5684 switch ((uint_t)scsipkt->pkt_cdbp[0]) {
5681 5685 case SPC3_CMD_ATA_COMMAND_PASS_THROUGH12:
5682 5686 feature = scsipkt->pkt_cdbp[3];
5683 5687
5684 5688 sec_count = scsipkt->pkt_cdbp[4];
5685 5689
5686 5690 lba = scsipkt->pkt_cdbp[8] & 0xf;
5687 5691 lba = (lba << 8) | scsipkt->pkt_cdbp[7];
5688 5692 lba = (lba << 8) | scsipkt->pkt_cdbp[6];
5689 5693 lba = (lba << 8) | scsipkt->pkt_cdbp[5];
5690 5694
5691 5695 scmd->satacmd_device_reg = scsipkt->pkt_cdbp[13] & 0xf0;
5692 5696 scmd->satacmd_cmd_reg = scsipkt->pkt_cdbp[9];
5693 5697
5694 5698 break;
5695 5699
5696 5700 case SPC3_CMD_ATA_COMMAND_PASS_THROUGH16:
5697 5701 if (scsipkt->pkt_cdbp[1] & SATL_APT_BM_EXTEND) {
5698 5702 extend = 1;
5699 5703
5700 5704 feature = scsipkt->pkt_cdbp[3];
5701 5705 feature = (feature << 8) | scsipkt->pkt_cdbp[4];
5702 5706
5703 5707 sec_count = scsipkt->pkt_cdbp[5];
5704 5708 sec_count = (sec_count << 8) | scsipkt->pkt_cdbp[6];
5705 5709
5706 5710 lba = scsipkt->pkt_cdbp[11];
5707 5711 lba = (lba << 8) | scsipkt->pkt_cdbp[12];
5708 5712 lba = (lba << 8) | scsipkt->pkt_cdbp[9];
5709 5713 lba = (lba << 8) | scsipkt->pkt_cdbp[10];
5710 5714 lba = (lba << 8) | scsipkt->pkt_cdbp[7];
5711 5715 lba = (lba << 8) | scsipkt->pkt_cdbp[8];
5712 5716
5713 5717 scmd->satacmd_device_reg = scsipkt->pkt_cdbp[13];
5714 5718 scmd->satacmd_cmd_reg = scsipkt->pkt_cdbp[14];
5715 5719 } else {
5716 5720 feature = scsipkt->pkt_cdbp[3];
5717 5721
5718 5722 sec_count = scsipkt->pkt_cdbp[5];
5719 5723
5720 5724 lba = scsipkt->pkt_cdbp[13] & 0xf;
5721 5725 lba = (lba << 8) | scsipkt->pkt_cdbp[12];
5722 5726 lba = (lba << 8) | scsipkt->pkt_cdbp[10];
5723 5727 lba = (lba << 8) | scsipkt->pkt_cdbp[8];
5724 5728
5725 5729 scmd->satacmd_device_reg = scsipkt->pkt_cdbp[13] &
5726 5730 0xf0;
5727 5731 scmd->satacmd_cmd_reg = scsipkt->pkt_cdbp[14];
5728 5732 }
5729 5733
5730 5734 break;
5731 5735 }
5732 5736
5733 5737 /* CK_COND bit */
5734 5738 if (scsipkt->pkt_cdbp[2] & SATL_APT_BM_CK_COND) {
5735 5739 if (extend) {
5736 5740 scmd->satacmd_flags.sata_copy_out_sec_count_msb = 1;
5737 5741 scmd->satacmd_flags.sata_copy_out_lba_low_msb = 1;
5738 5742 scmd->satacmd_flags.sata_copy_out_lba_mid_msb = 1;
5739 5743 scmd->satacmd_flags.sata_copy_out_lba_high_msb = 1;
5740 5744 }
5741 5745
5742 5746 scmd->satacmd_flags.sata_copy_out_sec_count_lsb = 1;
5743 5747 scmd->satacmd_flags.sata_copy_out_lba_low_lsb = 1;
5744 5748 scmd->satacmd_flags.sata_copy_out_lba_mid_lsb = 1;
5745 5749 scmd->satacmd_flags.sata_copy_out_lba_high_lsb = 1;
5746 5750 scmd->satacmd_flags.sata_copy_out_device_reg = 1;
5747 5751 scmd->satacmd_flags.sata_copy_out_error_reg = 1;
5748 5752 }
5749 5753
5750 5754 /* Transfer remaining parsed ATA cmd values to the satacmd */
5751 5755 if (extend) {
5752 5756 scmd->satacmd_addr_type = ATA_ADDR_LBA48;
5753 5757
5754 5758 scmd->satacmd_features_reg_ext = (feature >> 8) & 0xff;
5755 5759 scmd->satacmd_sec_count_msb = (sec_count >> 8) & 0xff;
5756 5760 scmd->satacmd_lba_low_msb = (lba >> 8) & 0xff;
5757 5761 scmd->satacmd_lba_mid_msb = (lba >> 8) & 0xff;
5758 5762 scmd->satacmd_lba_high_msb = lba >> 40;
5759 5763 } else {
5760 5764 scmd->satacmd_addr_type = ATA_ADDR_LBA28;
5761 5765
5762 5766 scmd->satacmd_features_reg_ext = 0;
5763 5767 scmd->satacmd_sec_count_msb = 0;
5764 5768 scmd->satacmd_lba_low_msb = 0;
5765 5769 scmd->satacmd_lba_mid_msb = 0;
5766 5770 scmd->satacmd_lba_high_msb = 0;
5767 5771 }
5768 5772
5769 5773 scmd->satacmd_features_reg = feature & 0xff;
5770 5774 scmd->satacmd_sec_count_lsb = sec_count & 0xff;
5771 5775 scmd->satacmd_lba_low_lsb = lba & 0xff;
5772 5776 scmd->satacmd_lba_mid_lsb = (lba >> 8) & 0xff;
5773 5777 scmd->satacmd_lba_high_lsb = (lba >> 16) & 0xff;
5774 5778
5775 5779 /* Determine transfer length */
5776 5780 switch (scsipkt->pkt_cdbp[2] & 0x3) { /* T_LENGTH field */
5777 5781 case 1:
5778 5782 t_len = feature;
5779 5783 break;
5780 5784 case 2:
5781 5785 t_len = sec_count;
5782 5786 break;
5783 5787 default:
5784 5788 t_len = 0;
5785 5789 break;
5786 5790 }
5787 5791
5788 5792 /* Adjust transfer length for the Byte Block bit */
5789 5793 if ((scsipkt->pkt_cdbp[2] >> 2) & 1)
5790 5794 t_len *= SATA_DISK_SECTOR_SIZE;
5791 5795
5792 5796 /* Start processing command */
5793 5797 if (!(spx->txlt_sata_pkt->satapkt_op_mode & SATA_OPMODE_SYNCH)) {
5794 5798 spx->txlt_sata_pkt->satapkt_comp = sata_txlt_apt_completion;
5795 5799 synch = FALSE;
5796 5800 } else {
5797 5801 synch = TRUE;
5798 5802 }
5799 5803
5800 5804 if (sata_hba_start(spx, &rval) != 0) {
5801 5805 mutex_exit(cport_mutex);
5802 5806 return (rval);
5803 5807 }
5804 5808
5805 5809 mutex_exit(cport_mutex);
5806 5810
5807 5811 if (synch) {
5808 5812 sata_txlt_apt_completion(spx->txlt_sata_pkt);
5809 5813 }
5810 5814
5811 5815 return (TRAN_ACCEPT);
5812 5816 }
5813 5817
5814 5818 /*
5815 5819 * Translate command: Log Sense
5816 5820 */
5817 5821 static int
5818 5822 sata_txlt_log_sense(sata_pkt_txlate_t *spx)
5819 5823 {
5820 5824 struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
5821 5825 struct buf *bp = spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp;
5822 5826 sata_drive_info_t *sdinfo;
5823 5827 struct scsi_extended_sense *sense;
5824 5828 int len, count, alc_len;
5825 5829 int pc; /* Page Control code */
5826 5830 int page_code; /* Page code */
5827 5831 uint8_t *buf; /* log sense buffer */
5828 5832 int rval, reason;
5829 5833 #define MAX_LOG_SENSE_PAGE_SIZE 512
5830 5834 kmutex_t *cport_mutex = &(SATA_TXLT_CPORT_MUTEX(spx));
5831 5835
5832 5836 SATADBG2(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
5833 5837 "sata_txlt_log_sense, pc 0x%x, page code 0x%x\n",
5834 5838 spx->txlt_scsi_pkt->pkt_cdbp[2] >> 6,
5835 5839 spx->txlt_scsi_pkt->pkt_cdbp[2] & 0x3f);
5836 5840
5837 5841 if (servicing_interrupt()) {
5838 5842 buf = kmem_zalloc(MAX_LOG_SENSE_PAGE_SIZE, KM_NOSLEEP);
5839 5843 if (buf == NULL) {
5840 5844 return (TRAN_BUSY);
5841 5845 }
5842 5846 } else {
5843 5847 buf = kmem_zalloc(MAX_LOG_SENSE_PAGE_SIZE, KM_SLEEP);
5844 5848 }
5845 5849
5846 5850 mutex_enter(cport_mutex);
5847 5851
5848 5852 if (((rval = sata_txlt_generic_pkt_info(spx, &reason, 1)) !=
5849 5853 TRAN_ACCEPT) || (reason == CMD_DEV_GONE)) {
5850 5854 mutex_exit(cport_mutex);
5851 5855 kmem_free(buf, MAX_LOG_SENSE_PAGE_SIZE);
5852 5856 return (rval);
5853 5857 }
5854 5858
5855 5859 scsipkt->pkt_reason = CMD_CMPLT;
5856 5860 scsipkt->pkt_state = STATE_GOT_BUS | STATE_GOT_TARGET |
5857 5861 STATE_SENT_CMD | STATE_GOT_STATUS;
5858 5862
5859 5863 pc = scsipkt->pkt_cdbp[2] >> 6;
5860 5864 page_code = scsipkt->pkt_cdbp[2] & 0x3f;
5861 5865
5862 5866 /* Reject not supported request for all but cumulative values */
5863 5867 switch (pc) {
5864 5868 case PC_CUMULATIVE_VALUES:
5865 5869 break;
5866 5870 default:
5867 5871 *scsipkt->pkt_scbp = STATUS_CHECK;
5868 5872 sense = sata_arq_sense(spx);
5869 5873 sense->es_key = KEY_ILLEGAL_REQUEST;
5870 5874 sense->es_add_code = SD_SCSI_ASC_INVALID_FIELD_IN_CDB;
5871 5875 goto done;
5872 5876 }
5873 5877
5874 5878 switch (page_code) {
5875 5879 case PAGE_CODE_GET_SUPPORTED_LOG_PAGES:
5876 5880 case PAGE_CODE_SELF_TEST_RESULTS:
5877 5881 case PAGE_CODE_INFORMATION_EXCEPTIONS:
5878 5882 case PAGE_CODE_SMART_READ_DATA:
5879 5883 case PAGE_CODE_START_STOP_CYCLE_COUNTER:
5880 5884 break;
5881 5885 default:
5882 5886 *scsipkt->pkt_scbp = STATUS_CHECK;
5883 5887 sense = sata_arq_sense(spx);
5884 5888 sense->es_key = KEY_ILLEGAL_REQUEST;
5885 5889 sense->es_add_code = SD_SCSI_ASC_INVALID_FIELD_IN_CDB;
5886 5890 goto done;
5887 5891 }
5888 5892
5889 5893 if (bp != NULL && bp->b_un.b_addr && bp->b_bcount) {
5890 5894 /*
5891 5895 * Because log sense uses local buffers for data retrieval from
5892 5896 * the devices and sets the data programatically in the
5893 5897 * original specified buffer, release preallocated DMA
5894 5898 * resources before storing data in the original buffer,
5895 5899 * so no unwanted DMA sync would take place.
5896 5900 */
5897 5901 sata_id_t *sata_id;
5898 5902
5899 5903 sata_scsi_dmafree(NULL, scsipkt);
5900 5904
5901 5905 len = 0;
5902 5906
5903 5907 /* Build log parameter header */
5904 5908 buf[len++] = page_code; /* page code as in the CDB */
5905 5909 buf[len++] = 0; /* reserved */
5906 5910 buf[len++] = 0; /* Zero out page length for now (MSB) */
5907 5911 buf[len++] = 0; /* (LSB) */
5908 5912
5909 5913 sdinfo = sata_get_device_info(
5910 5914 spx->txlt_sata_hba_inst,
5911 5915 &spx->txlt_sata_pkt->satapkt_device);
5912 5916
5913 5917 /*
5914 5918 * Add requested pages.
5915 5919 */
5916 5920 switch (page_code) {
5917 5921 case PAGE_CODE_GET_SUPPORTED_LOG_PAGES:
5918 5922 len = sata_build_lsense_page_0(sdinfo, buf + len);
5919 5923 break;
5920 5924 case PAGE_CODE_SELF_TEST_RESULTS:
5921 5925 sata_id = &sdinfo->satadrv_id;
5922 5926 if ((! (sata_id->ai_cmdset84 &
5923 5927 SATA_SMART_SELF_TEST_SUPPORTED)) ||
5924 5928 (! (sata_id->ai_features87 &
5925 5929 SATA_SMART_SELF_TEST_SUPPORTED))) {
5926 5930 *scsipkt->pkt_scbp = STATUS_CHECK;
5927 5931 sense = sata_arq_sense(spx);
5928 5932 sense->es_key = KEY_ILLEGAL_REQUEST;
5929 5933 sense->es_add_code =
5930 5934 SD_SCSI_ASC_INVALID_FIELD_IN_CDB;
5931 5935
5932 5936 goto done;
5933 5937 }
5934 5938 len = sata_build_lsense_page_10(sdinfo, buf + len,
5935 5939 spx->txlt_sata_hba_inst);
5936 5940 break;
5937 5941 case PAGE_CODE_INFORMATION_EXCEPTIONS:
5938 5942 sata_id = &sdinfo->satadrv_id;
5939 5943 if (! (sata_id->ai_cmdset82 & SATA_SMART_SUPPORTED)) {
5940 5944 *scsipkt->pkt_scbp = STATUS_CHECK;
5941 5945 sense = sata_arq_sense(spx);
5942 5946 sense->es_key = KEY_ILLEGAL_REQUEST;
5943 5947 sense->es_add_code =
5944 5948 SD_SCSI_ASC_INVALID_FIELD_IN_CDB;
5945 5949
5946 5950 goto done;
5947 5951 }
5948 5952 if (! (sata_id->ai_features85 & SATA_SMART_ENABLED)) {
5949 5953 *scsipkt->pkt_scbp = STATUS_CHECK;
5950 5954 sense = sata_arq_sense(spx);
5951 5955 sense->es_key = KEY_ABORTED_COMMAND;
5952 5956 sense->es_add_code =
5953 5957 SCSI_ASC_ATA_DEV_FEAT_NOT_ENABLED;
5954 5958 sense->es_qual_code =
5955 5959 SCSI_ASCQ_ATA_DEV_FEAT_NOT_ENABLED;
5956 5960
5957 5961 goto done;
5958 5962 }
5959 5963
5960 5964 len = sata_build_lsense_page_2f(sdinfo, buf + len,
5961 5965 spx->txlt_sata_hba_inst);
5962 5966 break;
5963 5967 case PAGE_CODE_SMART_READ_DATA:
5964 5968 sata_id = &sdinfo->satadrv_id;
5965 5969 if (! (sata_id->ai_cmdset82 & SATA_SMART_SUPPORTED)) {
5966 5970 *scsipkt->pkt_scbp = STATUS_CHECK;
5967 5971 sense = sata_arq_sense(spx);
5968 5972 sense->es_key = KEY_ILLEGAL_REQUEST;
5969 5973 sense->es_add_code =
5970 5974 SD_SCSI_ASC_INVALID_FIELD_IN_CDB;
5971 5975
5972 5976 goto done;
5973 5977 }
5974 5978 if (! (sata_id->ai_features85 & SATA_SMART_ENABLED)) {
5975 5979 *scsipkt->pkt_scbp = STATUS_CHECK;
5976 5980 sense = sata_arq_sense(spx);
5977 5981 sense->es_key = KEY_ABORTED_COMMAND;
5978 5982 sense->es_add_code =
5979 5983 SCSI_ASC_ATA_DEV_FEAT_NOT_ENABLED;
5980 5984 sense->es_qual_code =
5981 5985 SCSI_ASCQ_ATA_DEV_FEAT_NOT_ENABLED;
5982 5986
5983 5987 goto done;
5984 5988 }
5985 5989
5986 5990 /* This page doesn't include a page header */
5987 5991 len = sata_build_lsense_page_30(sdinfo, buf,
5988 5992 spx->txlt_sata_hba_inst);
5989 5993 goto no_header;
5990 5994 case PAGE_CODE_START_STOP_CYCLE_COUNTER:
5991 5995 sata_id = &sdinfo->satadrv_id;
5992 5996 if (! (sata_id->ai_cmdset82 & SATA_SMART_SUPPORTED)) {
5993 5997 *scsipkt->pkt_scbp = STATUS_CHECK;
5994 5998 sense = sata_arq_sense(spx);
5995 5999 sense->es_key = KEY_ILLEGAL_REQUEST;
5996 6000 sense->es_add_code =
5997 6001 SD_SCSI_ASC_INVALID_FIELD_IN_CDB;
5998 6002
5999 6003 goto done;
6000 6004 }
6001 6005 if (! (sata_id->ai_features85 & SATA_SMART_ENABLED)) {
6002 6006 *scsipkt->pkt_scbp = STATUS_CHECK;
6003 6007 sense = sata_arq_sense(spx);
6004 6008 sense->es_key = KEY_ABORTED_COMMAND;
6005 6009 sense->es_add_code =
6006 6010 SCSI_ASC_ATA_DEV_FEAT_NOT_ENABLED;
6007 6011 sense->es_qual_code =
6008 6012 SCSI_ASCQ_ATA_DEV_FEAT_NOT_ENABLED;
6009 6013
6010 6014 goto done;
6011 6015 }
6012 6016 len = sata_build_lsense_page_0e(sdinfo, buf, spx);
6013 6017 goto no_header;
6014 6018 default:
6015 6019 /* Invalid request */
6016 6020 *scsipkt->pkt_scbp = STATUS_CHECK;
6017 6021 sense = sata_arq_sense(spx);
6018 6022 sense->es_key = KEY_ILLEGAL_REQUEST;
6019 6023 sense->es_add_code = SD_SCSI_ASC_INVALID_FIELD_IN_CDB;
6020 6024 goto done;
6021 6025 }
6022 6026
6023 6027 /* set parameter log sense data length */
6024 6028 buf[2] = len >> 8; /* log sense length (MSB) */
6025 6029 buf[3] = len & 0xff; /* log sense length (LSB) */
6026 6030
6027 6031 len += SCSI_LOG_PAGE_HDR_LEN;
6028 6032 ASSERT(len <= MAX_LOG_SENSE_PAGE_SIZE);
6029 6033
6030 6034 no_header:
6031 6035 /* Check allocation length */
6032 6036 alc_len = scsipkt->pkt_cdbp[7];
6033 6037 alc_len = (len << 8) | scsipkt->pkt_cdbp[8];
6034 6038
6035 6039 /*
6036 6040 * We do not check for possible parameters truncation
6037 6041 * (alc_len < len) assuming that the target driver works
6038 6042 * correctly. Just avoiding overrun.
6039 6043 * Copy no more than requested and possible, buffer-wise.
6040 6044 */
6041 6045 count = MIN(alc_len, len);
6042 6046 count = MIN(bp->b_bcount, count);
6043 6047 bcopy(buf, bp->b_un.b_addr, count);
6044 6048
6045 6049 scsipkt->pkt_state |= STATE_XFERRED_DATA;
6046 6050 scsipkt->pkt_resid = alc_len > count ? alc_len - count : 0;
6047 6051 }
6048 6052 *scsipkt->pkt_scbp = STATUS_GOOD;
6049 6053 done:
6050 6054 mutex_exit(cport_mutex);
6051 6055 (void) kmem_free(buf, MAX_LOG_SENSE_PAGE_SIZE);
6052 6056
6053 6057 SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
6054 6058 "Scsi_pkt completion reason %x\n", scsipkt->pkt_reason);
6055 6059
6056 6060 if ((scsipkt->pkt_flags & FLAG_NOINTR) == 0 &&
6057 6061 scsipkt->pkt_comp != NULL) {
6058 6062 /* scsi callback required */
6059 6063 if (servicing_interrupt()) {
6060 6064 if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
6061 6065 (task_func_t *)spx->txlt_scsi_pkt->pkt_comp,
6062 6066 (void *)spx->txlt_scsi_pkt, TQ_NOSLEEP) == NULL) {
6063 6067 return (TRAN_BUSY);
6064 6068 }
6065 6069 } else if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
6066 6070 (task_func_t *)spx->txlt_scsi_pkt->pkt_comp,
6067 6071 (void *)spx->txlt_scsi_pkt, TQ_SLEEP) == NULL) {
6068 6072 /* Scheduling the callback failed */
6069 6073 return (TRAN_BUSY);
6070 6074 }
6071 6075 }
6072 6076
6073 6077 return (TRAN_ACCEPT);
6074 6078 }
6075 6079
6076 6080 /*
6077 6081 * Translate command: Log Select
6078 6082 * Not implemented at this time - returns invalid command response.
6079 6083 */
6080 6084 static int
6081 6085 sata_txlt_log_select(sata_pkt_txlate_t *spx)
6082 6086 {
6083 6087 SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
6084 6088 "sata_txlt_log_select\n", NULL);
6085 6089
6086 6090 return (sata_txlt_invalid_command(spx));
6087 6091 }
6088 6092
6089 6093
6090 6094 /*
6091 6095 * Translate command: Read (various types).
6092 6096 * Translated into appropriate type of ATA READ command
6093 6097 * for SATA hard disks.
6094 6098 * Both the device capabilities and requested operation mode are
6095 6099 * considered.
6096 6100 *
6097 6101 * Following scsi cdb fields are ignored:
6098 6102 * rdprotect, dpo, fua, fua_nv, group_number.
6099 6103 *
6100 6104 * If SATA_ENABLE_QUEUING flag is set (in the global SATA HBA framework
6101 6105 * enable variable sata_func_enable), the capability of the controller and
6102 6106 * capability of a device are checked and if both support queueing, read
6103 6107 * request will be translated to READ_DMA_QUEUEING or READ_DMA_QUEUEING_EXT
6104 6108 * command rather than plain READ_XXX command.
6105 6109 * If SATA_ENABLE_NCQ flag is set in addition to SATA_ENABLE_QUEUING flag and
6106 6110 * both the controller and device suport such functionality, the read
6107 6111 * request will be translated to READ_FPDMA_QUEUED command.
6108 6112 * In both cases the maximum queue depth is derived as minimum of:
6109 6113 * HBA capability,device capability and sata_max_queue_depth variable setting.
6110 6114 * The value passed to HBA driver is decremented by 1, because only 5 bits are
6111 6115 * used to pass max queue depth value, and the maximum possible queue depth
6112 6116 * is 32.
6113 6117 *
6114 6118 * Returns TRAN_ACCEPT or code returned by sata_hba_start() and
6115 6119 * appropriate values in scsi_pkt fields.
6116 6120 */
6117 6121 static int
6118 6122 sata_txlt_read(sata_pkt_txlate_t *spx)
6119 6123 {
6120 6124 struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
6121 6125 sata_cmd_t *scmd = &spx->txlt_sata_pkt->satapkt_cmd;
6122 6126 sata_drive_info_t *sdinfo;
6123 6127 sata_hba_inst_t *shi = SATA_TXLT_HBA_INST(spx);
6124 6128 kmutex_t *cport_mutex = &(SATA_TXLT_CPORT_MUTEX(spx));
6125 6129 uint16_t sec_count;
6126 6130 uint64_t lba;
6127 6131 int rval, reason;
6128 6132 int synch;
6129 6133
6130 6134 mutex_enter(cport_mutex);
6131 6135
6132 6136 if (((rval = sata_txlt_generic_pkt_info(spx, &reason, 0)) !=
6133 6137 TRAN_ACCEPT) || (reason == CMD_DEV_GONE)) {
6134 6138 mutex_exit(cport_mutex);
6135 6139 return (rval);
6136 6140 }
6137 6141
6138 6142 sdinfo = sata_get_device_info(spx->txlt_sata_hba_inst,
6139 6143 &spx->txlt_sata_pkt->satapkt_device);
6140 6144
6141 6145 scmd->satacmd_flags.sata_data_direction = SATA_DIR_READ;
6142 6146 /*
6143 6147 * Extract LBA and sector count from scsi CDB.
6144 6148 */
6145 6149 switch ((uint_t)scsipkt->pkt_cdbp[0]) {
6146 6150 case SCMD_READ:
6147 6151 /* 6-byte scsi read cmd : 0x08 */
6148 6152 lba = (scsipkt->pkt_cdbp[1] & 0x1f);
6149 6153 lba = (lba << 8) | scsipkt->pkt_cdbp[2];
6150 6154 lba = (lba << 8) | scsipkt->pkt_cdbp[3];
6151 6155 sec_count = scsipkt->pkt_cdbp[4];
6152 6156 /* sec_count 0 will be interpreted as 256 by a device */
6153 6157 break;
6154 6158 case SCMD_READ_G1:
6155 6159 /* 10-bytes scsi read command : 0x28 */
6156 6160 lba = scsipkt->pkt_cdbp[2];
6157 6161 lba = (lba << 8) | scsipkt->pkt_cdbp[3];
6158 6162 lba = (lba << 8) | scsipkt->pkt_cdbp[4];
6159 6163 lba = (lba << 8) | scsipkt->pkt_cdbp[5];
6160 6164 sec_count = scsipkt->pkt_cdbp[7];
6161 6165 sec_count = (sec_count << 8) | scsipkt->pkt_cdbp[8];
6162 6166 break;
6163 6167 case SCMD_READ_G5:
6164 6168 /* 12-bytes scsi read command : 0xA8 */
6165 6169 lba = scsipkt->pkt_cdbp[2];
6166 6170 lba = (lba << 8) | scsipkt->pkt_cdbp[3];
6167 6171 lba = (lba << 8) | scsipkt->pkt_cdbp[4];
6168 6172 lba = (lba << 8) | scsipkt->pkt_cdbp[5];
6169 6173 sec_count = scsipkt->pkt_cdbp[6];
6170 6174 sec_count = (sec_count << 8) | scsipkt->pkt_cdbp[7];
6171 6175 sec_count = (sec_count << 8) | scsipkt->pkt_cdbp[8];
6172 6176 sec_count = (sec_count << 8) | scsipkt->pkt_cdbp[9];
6173 6177 break;
6174 6178 case SCMD_READ_G4:
6175 6179 /* 16-bytes scsi read command : 0x88 */
6176 6180 lba = scsipkt->pkt_cdbp[2];
6177 6181 lba = (lba << 8) | scsipkt->pkt_cdbp[3];
6178 6182 lba = (lba << 8) | scsipkt->pkt_cdbp[4];
6179 6183 lba = (lba << 8) | scsipkt->pkt_cdbp[5];
6180 6184 lba = (lba << 8) | scsipkt->pkt_cdbp[6];
6181 6185 lba = (lba << 8) | scsipkt->pkt_cdbp[7];
6182 6186 lba = (lba << 8) | scsipkt->pkt_cdbp[8];
6183 6187 lba = (lba << 8) | scsipkt->pkt_cdbp[9];
6184 6188 sec_count = scsipkt->pkt_cdbp[10];
6185 6189 sec_count = (sec_count << 8) | scsipkt->pkt_cdbp[11];
6186 6190 sec_count = (sec_count << 8) | scsipkt->pkt_cdbp[12];
6187 6191 sec_count = (sec_count << 8) | scsipkt->pkt_cdbp[13];
6188 6192 break;
6189 6193 default:
6190 6194 /* Unsupported command */
6191 6195 mutex_exit(cport_mutex);
6192 6196 return (sata_txlt_invalid_command(spx));
6193 6197 }
6194 6198
6195 6199 /*
6196 6200 * Check if specified address exceeds device capacity
6197 6201 */
6198 6202 if ((lba >= sdinfo->satadrv_capacity) ||
6199 6203 ((lba + sec_count) > sdinfo->satadrv_capacity)) {
6200 6204 /* LBA out of range */
6201 6205 mutex_exit(cport_mutex);
6202 6206 return (sata_txlt_lba_out_of_range(spx));
6203 6207 }
6204 6208
6205 6209 /*
6206 6210 * For zero-length transfer, emulate good completion of the command
6207 6211 * (reasons for rejecting the command were already checked).
6208 6212 * No DMA resources were allocated.
6209 6213 */
6210 6214 if (spx->txlt_dma_cookie_list == NULL) {
6211 6215 mutex_exit(cport_mutex);
6212 6216 return (sata_emul_rw_completion(spx));
6213 6217 }
6214 6218
6215 6219 /*
6216 6220 * Build cmd block depending on the device capability and
6217 6221 * requested operation mode.
6218 6222 * Do not bother with non-dma mode - we are working only with
6219 6223 * devices supporting DMA.
6220 6224 */
6221 6225 scmd->satacmd_addr_type = ATA_ADDR_LBA;
6222 6226 scmd->satacmd_device_reg = SATA_ADH_LBA;
6223 6227 scmd->satacmd_cmd_reg = SATAC_READ_DMA;
6224 6228 if (sdinfo->satadrv_features_support & SATA_DEV_F_LBA48) {
6225 6229 scmd->satacmd_addr_type = ATA_ADDR_LBA48;
6226 6230 scmd->satacmd_cmd_reg = SATAC_READ_DMA_EXT;
6227 6231 scmd->satacmd_sec_count_msb = sec_count >> 8;
6228 6232 #ifndef __lock_lint
6229 6233 scmd->satacmd_lba_low_msb = (lba >> 24) & 0xff;
6230 6234 scmd->satacmd_lba_mid_msb = (lba >> 32) & 0xff;
6231 6235 scmd->satacmd_lba_high_msb = lba >> 40;
6232 6236 #endif
6233 6237 } else if (sdinfo->satadrv_features_support & SATA_DEV_F_LBA28) {
6234 6238 scmd->satacmd_addr_type = ATA_ADDR_LBA28;
6235 6239 scmd->satacmd_device_reg = SATA_ADH_LBA | ((lba >> 24) & 0xf);
6236 6240 }
6237 6241 scmd->satacmd_sec_count_lsb = sec_count & 0xff;
6238 6242 scmd->satacmd_lba_low_lsb = lba & 0xff;
6239 6243 scmd->satacmd_lba_mid_lsb = (lba >> 8) & 0xff;
6240 6244 scmd->satacmd_lba_high_lsb = (lba >> 16) & 0xff;
6241 6245 scmd->satacmd_features_reg = 0;
6242 6246 scmd->satacmd_status_reg = 0;
6243 6247 scmd->satacmd_error_reg = 0;
6244 6248
6245 6249 /*
6246 6250 * Check if queueing commands should be used and switch
6247 6251 * to appropriate command if possible
6248 6252 */
6249 6253 if (sata_func_enable & SATA_ENABLE_QUEUING) {
6250 6254 boolean_t using_queuing;
6251 6255
6252 6256 /* Queuing supported by controller and device? */
6253 6257 if ((sata_func_enable & SATA_ENABLE_NCQ) &&
6254 6258 (sdinfo->satadrv_features_support &
6255 6259 SATA_DEV_F_NCQ) &&
6256 6260 (SATA_FEATURES(spx->txlt_sata_hba_inst) &
6257 6261 SATA_CTLF_NCQ)) {
6258 6262 using_queuing = B_TRUE;
6259 6263
6260 6264 /* NCQ supported - use FPDMA READ */
6261 6265 scmd->satacmd_cmd_reg =
6262 6266 SATAC_READ_FPDMA_QUEUED;
6263 6267 scmd->satacmd_features_reg_ext =
6264 6268 scmd->satacmd_sec_count_msb;
6265 6269 scmd->satacmd_sec_count_msb = 0;
6266 6270 } else if ((sdinfo->satadrv_features_support &
6267 6271 SATA_DEV_F_TCQ) &&
6268 6272 (SATA_FEATURES(spx->txlt_sata_hba_inst) &
6269 6273 SATA_CTLF_QCMD)) {
6270 6274 using_queuing = B_TRUE;
6271 6275
6272 6276 /* Legacy queueing */
6273 6277 if (sdinfo->satadrv_features_support &
6274 6278 SATA_DEV_F_LBA48) {
6275 6279 scmd->satacmd_cmd_reg =
6276 6280 SATAC_READ_DMA_QUEUED_EXT;
6277 6281 scmd->satacmd_features_reg_ext =
6278 6282 scmd->satacmd_sec_count_msb;
6279 6283 scmd->satacmd_sec_count_msb = 0;
6280 6284 } else {
6281 6285 scmd->satacmd_cmd_reg =
6282 6286 SATAC_READ_DMA_QUEUED;
6283 6287 }
6284 6288 } else /* NCQ nor legacy queuing not supported */
6285 6289 using_queuing = B_FALSE;
6286 6290
6287 6291 /*
6288 6292 * If queuing, the sector count goes in the features register
6289 6293 * and the secount count will contain the tag.
6290 6294 */
6291 6295 if (using_queuing) {
6292 6296 scmd->satacmd_features_reg =
6293 6297 scmd->satacmd_sec_count_lsb;
6294 6298 scmd->satacmd_sec_count_lsb = 0;
6295 6299 scmd->satacmd_flags.sata_queued = B_TRUE;
6296 6300
6297 6301 /* Set-up maximum queue depth */
6298 6302 scmd->satacmd_flags.sata_max_queue_depth =
6299 6303 sdinfo->satadrv_max_queue_depth - 1;
6300 6304 } else if (sdinfo->satadrv_features_enabled &
6301 6305 SATA_DEV_F_E_UNTAGGED_QING) {
6302 6306 /*
6303 6307 * Although NCQ/TCQ is not enabled, untagged queuing
6304 6308 * may be still used.
6305 6309 * Set-up the maximum untagged queue depth.
6306 6310 * Use controller's queue depth from sata_hba_tran.
6307 6311 * SATA HBA drivers may ignore this value and rely on
6308 6312 * the internal limits.For drivers that do not
6309 6313 * ignore untaged queue depth, limit the value to
6310 6314 * SATA_MAX_QUEUE_DEPTH (32), as this is the
6311 6315 * largest value that can be passed via
6312 6316 * satacmd_flags.sata_max_queue_depth.
6313 6317 */
6314 6318 scmd->satacmd_flags.sata_max_queue_depth =
6315 6319 SATA_QDEPTH(shi) <= SATA_MAX_QUEUE_DEPTH ?
6316 6320 SATA_QDEPTH(shi) - 1: SATA_MAX_QUEUE_DEPTH - 1;
6317 6321
6318 6322 } else {
6319 6323 scmd->satacmd_flags.sata_max_queue_depth = 0;
6320 6324 }
6321 6325 } else
6322 6326 scmd->satacmd_flags.sata_max_queue_depth = 0;
6323 6327
6324 6328 SATADBG3(SATA_DBG_HBA_IF, spx->txlt_sata_hba_inst,
6325 6329 "sata_txlt_read cmd 0x%2x, lba %llx, sec count %x\n",
6326 6330 scmd->satacmd_cmd_reg, lba, sec_count);
6327 6331
6328 6332 if (!(spx->txlt_sata_pkt->satapkt_op_mode & SATA_OPMODE_SYNCH)) {
6329 6333 /* Need callback function */
6330 6334 spx->txlt_sata_pkt->satapkt_comp = sata_txlt_rw_completion;
6331 6335 synch = FALSE;
6332 6336 } else
6333 6337 synch = TRUE;
6334 6338
6335 6339 /* Transfer command to HBA */
6336 6340 if (sata_hba_start(spx, &rval) != 0) {
6337 6341 /* Pkt not accepted for execution */
6338 6342 mutex_exit(cport_mutex);
6339 6343 return (rval);
6340 6344 }
6341 6345 mutex_exit(cport_mutex);
6342 6346 /*
6343 6347 * If execution is non-synchronous,
6344 6348 * a callback function will handle potential errors, translate
6345 6349 * the response and will do a callback to a target driver.
6346 6350 * If it was synchronous, check execution status using the same
6347 6351 * framework callback.
6348 6352 */
6349 6353 if (synch) {
6350 6354 SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
6351 6355 "synchronous execution status %x\n",
6352 6356 spx->txlt_sata_pkt->satapkt_reason);
6353 6357 sata_txlt_rw_completion(spx->txlt_sata_pkt);
6354 6358 }
6355 6359 return (TRAN_ACCEPT);
6356 6360 }
6357 6361
6358 6362
6359 6363 /*
6360 6364 * SATA translate command: Write (various types)
6361 6365 * Translated into appropriate type of ATA WRITE command
6362 6366 * for SATA hard disks.
6363 6367 * Both the device capabilities and requested operation mode are
6364 6368 * considered.
6365 6369 *
6366 6370 * Following scsi cdb fields are ignored:
6367 6371 * rwprotect, dpo, fua, fua_nv, group_number.
6368 6372 *
6369 6373 * If SATA_ENABLE_QUEUING flag is set (in the global SATA HBA framework
6370 6374 * enable variable sata_func_enable), the capability of the controller and
6371 6375 * capability of a device are checked and if both support queueing, write
6372 6376 * request will be translated to WRITE_DMA_QUEUEING or WRITE_DMA_QUEUEING_EXT
6373 6377 * command rather than plain WRITE_XXX command.
6374 6378 * If SATA_ENABLE_NCQ flag is set in addition to SATA_ENABLE_QUEUING flag and
6375 6379 * both the controller and device suport such functionality, the write
6376 6380 * request will be translated to WRITE_FPDMA_QUEUED command.
6377 6381 * In both cases the maximum queue depth is derived as minimum of:
6378 6382 * HBA capability,device capability and sata_max_queue_depth variable setting.
6379 6383 * The value passed to HBA driver is decremented by 1, because only 5 bits are
6380 6384 * used to pass max queue depth value, and the maximum possible queue depth
6381 6385 * is 32.
6382 6386 *
6383 6387 * Returns TRAN_ACCEPT or code returned by sata_hba_start() and
6384 6388 * appropriate values in scsi_pkt fields.
6385 6389 */
6386 6390 static int
6387 6391 sata_txlt_write(sata_pkt_txlate_t *spx)
6388 6392 {
6389 6393 struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
6390 6394 sata_cmd_t *scmd = &spx->txlt_sata_pkt->satapkt_cmd;
6391 6395 sata_drive_info_t *sdinfo;
6392 6396 sata_hba_inst_t *shi = SATA_TXLT_HBA_INST(spx);
6393 6397 uint16_t sec_count;
6394 6398 uint64_t lba;
6395 6399 int rval, reason;
6396 6400 int synch;
6397 6401 kmutex_t *cport_mutex = &(SATA_TXLT_CPORT_MUTEX(spx));
6398 6402
6399 6403 mutex_enter(cport_mutex);
6400 6404
6401 6405 if (((rval = sata_txlt_generic_pkt_info(spx, &reason, 0)) !=
6402 6406 TRAN_ACCEPT) || (reason == CMD_DEV_GONE)) {
6403 6407 mutex_exit(cport_mutex);
6404 6408 return (rval);
6405 6409 }
6406 6410
6407 6411 sdinfo = sata_get_device_info(spx->txlt_sata_hba_inst,
6408 6412 &spx->txlt_sata_pkt->satapkt_device);
6409 6413
6410 6414 scmd->satacmd_flags.sata_data_direction = SATA_DIR_WRITE;
6411 6415 /*
6412 6416 * Extract LBA and sector count from scsi CDB
6413 6417 */
6414 6418 switch ((uint_t)scsipkt->pkt_cdbp[0]) {
6415 6419 case SCMD_WRITE:
6416 6420 /* 6-byte scsi read cmd : 0x0A */
6417 6421 lba = (scsipkt->pkt_cdbp[1] & 0x1f);
6418 6422 lba = (lba << 8) | scsipkt->pkt_cdbp[2];
6419 6423 lba = (lba << 8) | scsipkt->pkt_cdbp[3];
6420 6424 sec_count = scsipkt->pkt_cdbp[4];
6421 6425 /* sec_count 0 will be interpreted as 256 by a device */
6422 6426 break;
6423 6427 case SCMD_WRITE_G1:
6424 6428 /* 10-bytes scsi write command : 0x2A */
6425 6429 lba = scsipkt->pkt_cdbp[2];
6426 6430 lba = (lba << 8) | scsipkt->pkt_cdbp[3];
6427 6431 lba = (lba << 8) | scsipkt->pkt_cdbp[4];
6428 6432 lba = (lba << 8) | scsipkt->pkt_cdbp[5];
6429 6433 sec_count = scsipkt->pkt_cdbp[7];
6430 6434 sec_count = (sec_count << 8) | scsipkt->pkt_cdbp[8];
6431 6435 break;
6432 6436 case SCMD_WRITE_G5:
6433 6437 /* 12-bytes scsi read command : 0xAA */
6434 6438 lba = scsipkt->pkt_cdbp[2];
6435 6439 lba = (lba << 8) | scsipkt->pkt_cdbp[3];
6436 6440 lba = (lba << 8) | scsipkt->pkt_cdbp[4];
6437 6441 lba = (lba << 8) | scsipkt->pkt_cdbp[5];
6438 6442 sec_count = scsipkt->pkt_cdbp[6];
6439 6443 sec_count = (sec_count << 8) | scsipkt->pkt_cdbp[7];
6440 6444 sec_count = (sec_count << 8) | scsipkt->pkt_cdbp[8];
6441 6445 sec_count = (sec_count << 8) | scsipkt->pkt_cdbp[9];
6442 6446 break;
6443 6447 case SCMD_WRITE_G4:
6444 6448 /* 16-bytes scsi write command : 0x8A */
6445 6449 lba = scsipkt->pkt_cdbp[2];
6446 6450 lba = (lba << 8) | scsipkt->pkt_cdbp[3];
6447 6451 lba = (lba << 8) | scsipkt->pkt_cdbp[4];
6448 6452 lba = (lba << 8) | scsipkt->pkt_cdbp[5];
6449 6453 lba = (lba << 8) | scsipkt->pkt_cdbp[6];
6450 6454 lba = (lba << 8) | scsipkt->pkt_cdbp[7];
6451 6455 lba = (lba << 8) | scsipkt->pkt_cdbp[8];
6452 6456 lba = (lba << 8) | scsipkt->pkt_cdbp[9];
6453 6457 sec_count = scsipkt->pkt_cdbp[10];
6454 6458 sec_count = (sec_count << 8) | scsipkt->pkt_cdbp[11];
6455 6459 sec_count = (sec_count << 8) | scsipkt->pkt_cdbp[12];
6456 6460 sec_count = (sec_count << 8) | scsipkt->pkt_cdbp[13];
6457 6461 break;
6458 6462 default:
6459 6463 /* Unsupported command */
6460 6464 mutex_exit(cport_mutex);
6461 6465 return (sata_txlt_invalid_command(spx));
6462 6466 }
6463 6467
6464 6468 /*
6465 6469 * Check if specified address and length exceeds device capacity
6466 6470 */
6467 6471 if ((lba >= sdinfo->satadrv_capacity) ||
6468 6472 ((lba + sec_count) > sdinfo->satadrv_capacity)) {
6469 6473 /* LBA out of range */
6470 6474 mutex_exit(cport_mutex);
6471 6475 return (sata_txlt_lba_out_of_range(spx));
6472 6476 }
6473 6477
6474 6478 /*
6475 6479 * For zero-length transfer, emulate good completion of the command
6476 6480 * (reasons for rejecting the command were already checked).
6477 6481 * No DMA resources were allocated.
6478 6482 */
6479 6483 if (spx->txlt_dma_cookie_list == NULL) {
6480 6484 mutex_exit(cport_mutex);
6481 6485 return (sata_emul_rw_completion(spx));
6482 6486 }
6483 6487
6484 6488 /*
6485 6489 * Build cmd block depending on the device capability and
6486 6490 * requested operation mode.
6487 6491 * Do not bother with non-dma mode- we are working only with
6488 6492 * devices supporting DMA.
6489 6493 */
6490 6494 scmd->satacmd_addr_type = ATA_ADDR_LBA;
6491 6495 scmd->satacmd_device_reg = SATA_ADH_LBA;
6492 6496 scmd->satacmd_cmd_reg = SATAC_WRITE_DMA;
6493 6497 if (sdinfo->satadrv_features_support & SATA_DEV_F_LBA48) {
6494 6498 scmd->satacmd_addr_type = ATA_ADDR_LBA48;
6495 6499 scmd->satacmd_cmd_reg = SATAC_WRITE_DMA_EXT;
6496 6500 scmd->satacmd_sec_count_msb = sec_count >> 8;
6497 6501 scmd->satacmd_lba_low_msb = (lba >> 24) & 0xff;
6498 6502 #ifndef __lock_lint
6499 6503 scmd->satacmd_lba_mid_msb = (lba >> 32) & 0xff;
6500 6504 scmd->satacmd_lba_high_msb = lba >> 40;
6501 6505 #endif
6502 6506 } else if (sdinfo->satadrv_features_support & SATA_DEV_F_LBA28) {
6503 6507 scmd->satacmd_addr_type = ATA_ADDR_LBA28;
6504 6508 scmd->satacmd_device_reg = SATA_ADH_LBA | ((lba >> 24) & 0xf);
6505 6509 }
6506 6510 scmd->satacmd_sec_count_lsb = sec_count & 0xff;
6507 6511 scmd->satacmd_lba_low_lsb = lba & 0xff;
6508 6512 scmd->satacmd_lba_mid_lsb = (lba >> 8) & 0xff;
6509 6513 scmd->satacmd_lba_high_lsb = (lba >> 16) & 0xff;
6510 6514 scmd->satacmd_features_reg = 0;
6511 6515 scmd->satacmd_status_reg = 0;
6512 6516 scmd->satacmd_error_reg = 0;
6513 6517
6514 6518 /*
6515 6519 * Check if queueing commands should be used and switch
6516 6520 * to appropriate command if possible
6517 6521 */
6518 6522 if (sata_func_enable & SATA_ENABLE_QUEUING) {
6519 6523 boolean_t using_queuing;
6520 6524
6521 6525 /* Queuing supported by controller and device? */
6522 6526 if ((sata_func_enable & SATA_ENABLE_NCQ) &&
6523 6527 (sdinfo->satadrv_features_support &
6524 6528 SATA_DEV_F_NCQ) &&
6525 6529 (SATA_FEATURES(spx->txlt_sata_hba_inst) &
6526 6530 SATA_CTLF_NCQ)) {
6527 6531 using_queuing = B_TRUE;
6528 6532
6529 6533 /* NCQ supported - use FPDMA WRITE */
6530 6534 scmd->satacmd_cmd_reg =
6531 6535 SATAC_WRITE_FPDMA_QUEUED;
6532 6536 scmd->satacmd_features_reg_ext =
6533 6537 scmd->satacmd_sec_count_msb;
6534 6538 scmd->satacmd_sec_count_msb = 0;
6535 6539 } else if ((sdinfo->satadrv_features_support &
6536 6540 SATA_DEV_F_TCQ) &&
6537 6541 (SATA_FEATURES(spx->txlt_sata_hba_inst) &
6538 6542 SATA_CTLF_QCMD)) {
6539 6543 using_queuing = B_TRUE;
6540 6544
6541 6545 /* Legacy queueing */
6542 6546 if (sdinfo->satadrv_features_support &
6543 6547 SATA_DEV_F_LBA48) {
6544 6548 scmd->satacmd_cmd_reg =
6545 6549 SATAC_WRITE_DMA_QUEUED_EXT;
6546 6550 scmd->satacmd_features_reg_ext =
6547 6551 scmd->satacmd_sec_count_msb;
6548 6552 scmd->satacmd_sec_count_msb = 0;
6549 6553 } else {
6550 6554 scmd->satacmd_cmd_reg =
6551 6555 SATAC_WRITE_DMA_QUEUED;
6552 6556 }
6553 6557 } else /* NCQ nor legacy queuing not supported */
6554 6558 using_queuing = B_FALSE;
6555 6559
6556 6560 if (using_queuing) {
6557 6561 scmd->satacmd_features_reg =
6558 6562 scmd->satacmd_sec_count_lsb;
6559 6563 scmd->satacmd_sec_count_lsb = 0;
6560 6564 scmd->satacmd_flags.sata_queued = B_TRUE;
6561 6565 /* Set-up maximum queue depth */
6562 6566 scmd->satacmd_flags.sata_max_queue_depth =
6563 6567 sdinfo->satadrv_max_queue_depth - 1;
6564 6568 } else if (sdinfo->satadrv_features_enabled &
6565 6569 SATA_DEV_F_E_UNTAGGED_QING) {
6566 6570 /*
6567 6571 * Although NCQ/TCQ is not enabled, untagged queuing
6568 6572 * may be still used.
6569 6573 * Set-up the maximum untagged queue depth.
6570 6574 * Use controller's queue depth from sata_hba_tran.
6571 6575 * SATA HBA drivers may ignore this value and rely on
6572 6576 * the internal limits. For drivera that do not
6573 6577 * ignore untaged queue depth, limit the value to
6574 6578 * SATA_MAX_QUEUE_DEPTH (32), as this is the
6575 6579 * largest value that can be passed via
6576 6580 * satacmd_flags.sata_max_queue_depth.
6577 6581 */
6578 6582 scmd->satacmd_flags.sata_max_queue_depth =
6579 6583 SATA_QDEPTH(shi) <= SATA_MAX_QUEUE_DEPTH ?
6580 6584 SATA_QDEPTH(shi) - 1: SATA_MAX_QUEUE_DEPTH - 1;
6581 6585
6582 6586 } else {
6583 6587 scmd->satacmd_flags.sata_max_queue_depth = 0;
6584 6588 }
6585 6589 } else
6586 6590 scmd->satacmd_flags.sata_max_queue_depth = 0;
6587 6591
6588 6592 SATADBG3(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
6589 6593 "sata_txlt_write cmd 0x%2x, lba %llx, sec count %x\n",
6590 6594 scmd->satacmd_cmd_reg, lba, sec_count);
6591 6595
6592 6596 if (!(spx->txlt_sata_pkt->satapkt_op_mode & SATA_OPMODE_SYNCH)) {
6593 6597 /* Need callback function */
6594 6598 spx->txlt_sata_pkt->satapkt_comp = sata_txlt_rw_completion;
6595 6599 synch = FALSE;
6596 6600 } else
6597 6601 synch = TRUE;
6598 6602
6599 6603 /* Transfer command to HBA */
6600 6604 if (sata_hba_start(spx, &rval) != 0) {
6601 6605 /* Pkt not accepted for execution */
6602 6606 mutex_exit(cport_mutex);
6603 6607 return (rval);
6604 6608 }
6605 6609 mutex_exit(cport_mutex);
6606 6610
6607 6611 /*
6608 6612 * If execution is non-synchronous,
6609 6613 * a callback function will handle potential errors, translate
6610 6614 * the response and will do a callback to a target driver.
6611 6615 * If it was synchronous, check execution status using the same
6612 6616 * framework callback.
6613 6617 */
6614 6618 if (synch) {
6615 6619 SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
6616 6620 "synchronous execution status %x\n",
6617 6621 spx->txlt_sata_pkt->satapkt_reason);
6618 6622 sata_txlt_rw_completion(spx->txlt_sata_pkt);
6619 6623 }
6620 6624 return (TRAN_ACCEPT);
6621 6625 }
6622 6626
6623 6627
6624 6628 /*
6625 6629 * Implements SCSI SBC WRITE BUFFER command download microcode option
6626 6630 */
6627 6631 static int
6628 6632 sata_txlt_write_buffer(sata_pkt_txlate_t *spx)
6629 6633 {
6630 6634 #define WB_DOWNLOAD_MICROCODE_AND_REVERT_MODE 4
6631 6635 #define WB_DOWNLOAD_MICROCODE_AND_SAVE_MODE 5
6632 6636
6633 6637 struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
6634 6638 struct sata_pkt *sata_pkt = spx->txlt_sata_pkt;
6635 6639 sata_cmd_t *scmd = &spx->txlt_sata_pkt->satapkt_cmd;
6636 6640
6637 6641 struct buf *bp = spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp;
6638 6642 struct scsi_extended_sense *sense;
6639 6643 int rval, mode, sector_count, reason;
6640 6644 kmutex_t *cport_mutex = &(SATA_TXLT_CPORT_MUTEX(spx));
6641 6645
6642 6646 mode = scsipkt->pkt_cdbp[1] & 0x1f;
6643 6647
6644 6648 SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
6645 6649 "sata_txlt_write_buffer, mode 0x%x\n", mode);
6646 6650
6647 6651 mutex_enter(cport_mutex);
6648 6652
6649 6653 if ((rval = sata_txlt_generic_pkt_info(spx, &reason, 1)) !=
6650 6654 TRAN_ACCEPT) {
6651 6655 mutex_exit(cport_mutex);
6652 6656 return (rval);
6653 6657 }
6654 6658
6655 6659 /* Use synchronous mode */
6656 6660 spx->txlt_sata_pkt->satapkt_op_mode
6657 6661 |= SATA_OPMODE_SYNCH | SATA_OPMODE_INTERRUPTS;
6658 6662
6659 6663 scmd->satacmd_flags.sata_data_direction = SATA_DIR_WRITE;
6660 6664
6661 6665 scsipkt->pkt_reason = CMD_CMPLT;
6662 6666 scsipkt->pkt_state = STATE_GOT_BUS | STATE_GOT_TARGET |
6663 6667 STATE_SENT_CMD | STATE_GOT_STATUS;
6664 6668
6665 6669 /*
6666 6670 * The SCSI to ATA translation specification only calls
6667 6671 * for WB_DOWNLOAD_MICROCODE_AND_SAVE_MODE.
6668 6672 * WB_DOWNLOAD_MICROC_AND_REVERT_MODE is implemented, but
6669 6673 * ATA 8 (draft) got rid of download microcode for temp
6670 6674 * and it is even optional for ATA 7, so it may be aborted.
6671 6675 * WB_DOWNLOAD_MICROCODE_WITH_OFFSET is not implemented as
6672 6676 * it is not specified and the buffer offset for SCSI is a 16-bit
6673 6677 * value in bytes, but for ATA it is a 16-bit offset in 512 byte
6674 6678 * sectors. Thus the offset really doesn't buy us anything.
6675 6679 * If and when ATA 8 is stabilized and the SCSI to ATA specification
6676 6680 * is revised, this can be revisisted.
6677 6681 */
6678 6682 /* Reject not supported request */
6679 6683 switch (mode) {
6680 6684 case WB_DOWNLOAD_MICROCODE_AND_REVERT_MODE:
6681 6685 scmd->satacmd_features_reg = SATA_DOWNLOAD_MCODE_TEMP;
6682 6686 break;
6683 6687 case WB_DOWNLOAD_MICROCODE_AND_SAVE_MODE:
6684 6688 scmd->satacmd_features_reg = SATA_DOWNLOAD_MCODE_SAVE;
6685 6689 break;
6686 6690 default:
6687 6691 goto bad_param;
6688 6692 }
6689 6693
6690 6694 *scsipkt->pkt_scbp = STATUS_GOOD; /* Presumed outcome */
6691 6695
6692 6696 scmd->satacmd_cmd_reg = SATAC_DOWNLOAD_MICROCODE;
6693 6697 if ((bp->b_bcount % SATA_DISK_SECTOR_SIZE) != 0)
6694 6698 goto bad_param;
6695 6699 sector_count = bp->b_bcount / SATA_DISK_SECTOR_SIZE;
6696 6700 scmd->satacmd_sec_count_lsb = (uint8_t)sector_count;
6697 6701 scmd->satacmd_lba_low_lsb = ((uint16_t)sector_count) >> 8;
6698 6702 scmd->satacmd_lba_mid_lsb = 0;
6699 6703 scmd->satacmd_lba_high_lsb = 0;
6700 6704 scmd->satacmd_device_reg = 0;
6701 6705 spx->txlt_sata_pkt->satapkt_comp = NULL;
6702 6706 scmd->satacmd_addr_type = 0;
6703 6707
6704 6708 /* Transfer command to HBA */
6705 6709 if (sata_hba_start(spx, &rval) != 0) {
6706 6710 /* Pkt not accepted for execution */
6707 6711 mutex_exit(cport_mutex);
6708 6712 return (rval);
6709 6713 }
6710 6714
6711 6715 mutex_exit(cport_mutex);
6712 6716
6713 6717 /* Then we need synchronous check the status of the disk */
6714 6718 scsipkt->pkt_state = STATE_GOT_BUS | STATE_GOT_TARGET |
6715 6719 STATE_SENT_CMD | STATE_XFERRED_DATA | STATE_GOT_STATUS;
6716 6720 if (sata_pkt->satapkt_reason == SATA_PKT_COMPLETED) {
6717 6721 scsipkt->pkt_reason = CMD_CMPLT;
6718 6722
6719 6723 /* Download commmand succeed, so probe and identify device */
6720 6724 sata_reidentify_device(spx);
6721 6725 } else {
6722 6726 /* Something went wrong, microcode download command failed */
6723 6727 scsipkt->pkt_reason = CMD_INCOMPLETE;
6724 6728 *scsipkt->pkt_scbp = STATUS_CHECK;
6725 6729 sense = sata_arq_sense(spx);
6726 6730 switch (sata_pkt->satapkt_reason) {
6727 6731 case SATA_PKT_PORT_ERROR:
6728 6732 /*
6729 6733 * We have no device data. Assume no data transfered.
6730 6734 */
6731 6735 sense->es_key = KEY_HARDWARE_ERROR;
6732 6736 break;
6733 6737
6734 6738 case SATA_PKT_DEV_ERROR:
6735 6739 if (sata_pkt->satapkt_cmd.satacmd_status_reg &
6736 6740 SATA_STATUS_ERR) {
6737 6741 /*
6738 6742 * determine dev error reason from error
6739 6743 * reg content
6740 6744 */
6741 6745 sata_decode_device_error(spx, sense);
6742 6746 break;
6743 6747 }
6744 6748 /* No extended sense key - no info available */
6745 6749 break;
6746 6750
6747 6751 case SATA_PKT_TIMEOUT:
6748 6752 scsipkt->pkt_reason = CMD_TIMEOUT;
6749 6753 scsipkt->pkt_statistics |=
6750 6754 STAT_TIMEOUT | STAT_DEV_RESET;
6751 6755 /* No extended sense key ? */
6752 6756 break;
6753 6757
6754 6758 case SATA_PKT_ABORTED:
6755 6759 scsipkt->pkt_reason = CMD_ABORTED;
6756 6760 scsipkt->pkt_statistics |= STAT_ABORTED;
6757 6761 /* No extended sense key ? */
6758 6762 break;
6759 6763
6760 6764 case SATA_PKT_RESET:
6761 6765 /* pkt aborted by an explicit reset from a host */
6762 6766 scsipkt->pkt_reason = CMD_RESET;
6763 6767 scsipkt->pkt_statistics |= STAT_DEV_RESET;
6764 6768 break;
6765 6769
6766 6770 default:
6767 6771 SATA_LOG_D((spx->txlt_sata_hba_inst, CE_WARN,
6768 6772 "sata_txlt_nodata_cmd_completion: "
6769 6773 "invalid packet completion reason %d",
6770 6774 sata_pkt->satapkt_reason));
6771 6775 scsipkt->pkt_reason = CMD_TRAN_ERR;
6772 6776 break;
6773 6777 }
6774 6778
6775 6779 SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
6776 6780 "scsi_pkt completion reason %x\n", scsipkt->pkt_reason);
6777 6781
6778 6782 if ((scsipkt->pkt_flags & FLAG_NOINTR) == 0)
6779 6783 /* scsi callback required */
6780 6784 scsi_hba_pkt_comp(scsipkt);
6781 6785 }
6782 6786 return (TRAN_ACCEPT);
6783 6787
6784 6788 bad_param:
6785 6789 mutex_exit(cport_mutex);
6786 6790 *scsipkt->pkt_scbp = STATUS_CHECK;
6787 6791 sense = sata_arq_sense(spx);
6788 6792 sense->es_key = KEY_ILLEGAL_REQUEST;
6789 6793 sense->es_add_code = SD_SCSI_ASC_INVALID_FIELD_IN_CDB;
6790 6794 if ((scsipkt->pkt_flags & FLAG_NOINTR) == 0 &&
6791 6795 scsipkt->pkt_comp != NULL) {
6792 6796 /* scsi callback required */
6793 6797 if (servicing_interrupt()) {
6794 6798 if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
6795 6799 (task_func_t *)spx->txlt_scsi_pkt->pkt_comp,
6796 6800 (void *)spx->txlt_scsi_pkt, TQ_NOSLEEP) == NULL) {
6797 6801 return (TRAN_BUSY);
6798 6802 }
6799 6803 } else if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
6800 6804 (task_func_t *)spx->txlt_scsi_pkt->pkt_comp,
6801 6805 (void *)spx->txlt_scsi_pkt, TQ_SLEEP) == NULL) {
6802 6806 /* Scheduling the callback failed */
6803 6807 return (TRAN_BUSY);
6804 6808 }
6805 6809 }
6806 6810 return (rval);
6807 6811 }
6808 6812
6809 6813 /*
6810 6814 * Re-identify device after doing a firmware download.
6811 6815 */
6812 6816 static void
6813 6817 sata_reidentify_device(sata_pkt_txlate_t *spx)
6814 6818 {
6815 6819 #define DOWNLOAD_WAIT_TIME_SECS 60
6816 6820 #define DOWNLOAD_WAIT_INTERVAL_SECS 1
6817 6821 int rval;
6818 6822 int retry_cnt;
6819 6823 struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
6820 6824 sata_hba_inst_t *sata_hba_inst = spx->txlt_sata_hba_inst;
6821 6825 sata_device_t sata_device = spx->txlt_sata_pkt->satapkt_device;
6822 6826 sata_drive_info_t *sdinfo;
6823 6827
6824 6828 /*
6825 6829 * Before returning good status, probe device.
6826 6830 * Device probing will get IDENTIFY DEVICE data, if possible.
6827 6831 * The assumption is that the new microcode is applied by the
6828 6832 * device. It is a caller responsibility to verify this.
6829 6833 */
6830 6834 for (retry_cnt = 0;
6831 6835 retry_cnt < DOWNLOAD_WAIT_TIME_SECS / DOWNLOAD_WAIT_INTERVAL_SECS;
6832 6836 retry_cnt++) {
6833 6837 rval = sata_probe_device(sata_hba_inst, &sata_device);
6834 6838
6835 6839 if (rval == SATA_SUCCESS) { /* Set default features */
6836 6840 sdinfo = sata_get_device_info(sata_hba_inst,
6837 6841 &sata_device);
6838 6842 if (sata_initialize_device(sata_hba_inst, sdinfo) !=
6839 6843 SATA_SUCCESS) {
6840 6844 /* retry */
6841 6845 rval = sata_initialize_device(sata_hba_inst,
6842 6846 sdinfo);
6843 6847 if (rval == SATA_RETRY)
6844 6848 sata_log(sata_hba_inst, CE_WARN,
6845 6849 "SATA device at port %d pmport %d -"
6846 6850 " default device features could not"
6847 6851 " be set. Device may not operate "
6848 6852 "as expected.",
6849 6853 sata_device.satadev_addr.cport,
6850 6854 sata_device.satadev_addr.pmport);
6851 6855 }
6852 6856 if ((scsipkt->pkt_flags & FLAG_NOINTR) == 0)
6853 6857 scsi_hba_pkt_comp(scsipkt);
6854 6858 return;
6855 6859 } else if (rval == SATA_RETRY) {
6856 6860 delay(drv_usectohz(1000000 *
6857 6861 DOWNLOAD_WAIT_INTERVAL_SECS));
6858 6862 continue;
6859 6863 } else /* failed - no reason to retry */
6860 6864 break;
6861 6865 }
6862 6866
6863 6867 /*
6864 6868 * Something went wrong, device probing failed.
6865 6869 */
6866 6870 SATA_LOG_D((sata_hba_inst, CE_WARN,
6867 6871 "Cannot probe device after downloading microcode\n"));
6868 6872
6869 6873 /* Reset device to force retrying the probe. */
6870 6874 (void) (*SATA_RESET_DPORT_FUNC(sata_hba_inst))
6871 6875 (SATA_DIP(sata_hba_inst), &sata_device);
6872 6876
6873 6877 if ((scsipkt->pkt_flags & FLAG_NOINTR) == 0)
6874 6878 scsi_hba_pkt_comp(scsipkt);
6875 6879 }
6876 6880
6877 6881
6878 6882 /*
6879 6883 * Translate command: Synchronize Cache.
6880 6884 * Translates into Flush Cache command for SATA hard disks.
6881 6885 *
6882 6886 * Returns TRAN_ACCEPT or code returned by sata_hba_start() and
6883 6887 * appropriate values in scsi_pkt fields.
6884 6888 */
6885 6889 static int
6886 6890 sata_txlt_synchronize_cache(sata_pkt_txlate_t *spx)
6887 6891 {
6888 6892 sata_cmd_t *scmd = &spx->txlt_sata_pkt->satapkt_cmd;
6889 6893 kmutex_t *cport_mutex = &(SATA_TXLT_CPORT_MUTEX(spx));
6890 6894 int rval, reason;
6891 6895 int synch;
6892 6896
6893 6897 mutex_enter(cport_mutex);
6894 6898
6895 6899 if (((rval = sata_txlt_generic_pkt_info(spx, &reason, 1)) !=
6896 6900 TRAN_ACCEPT) || (reason == CMD_DEV_GONE)) {
6897 6901 mutex_exit(cport_mutex);
6898 6902 return (rval);
6899 6903 }
6900 6904
6901 6905 scmd->satacmd_addr_type = 0;
6902 6906 scmd->satacmd_cmd_reg = SATAC_FLUSH_CACHE;
6903 6907 scmd->satacmd_device_reg = 0;
6904 6908 scmd->satacmd_sec_count_lsb = 0;
6905 6909 scmd->satacmd_lba_low_lsb = 0;
6906 6910 scmd->satacmd_lba_mid_lsb = 0;
6907 6911 scmd->satacmd_lba_high_lsb = 0;
6908 6912 scmd->satacmd_features_reg = 0;
6909 6913 scmd->satacmd_status_reg = 0;
6910 6914 scmd->satacmd_error_reg = 0;
6911 6915
6912 6916 SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
6913 6917 "sata_txlt_synchronize_cache\n", NULL);
6914 6918
6915 6919 if (!(spx->txlt_sata_pkt->satapkt_op_mode & SATA_OPMODE_SYNCH)) {
6916 6920 /* Need to set-up a callback function */
6917 6921 spx->txlt_sata_pkt->satapkt_comp =
6918 6922 sata_txlt_nodata_cmd_completion;
6919 6923 synch = FALSE;
6920 6924 } else
6921 6925 synch = TRUE;
6922 6926
6923 6927 /* Transfer command to HBA */
6924 6928 if (sata_hba_start(spx, &rval) != 0) {
6925 6929 /* Pkt not accepted for execution */
6926 6930 mutex_exit(cport_mutex);
6927 6931 return (rval);
6928 6932 }
6929 6933 mutex_exit(cport_mutex);
6930 6934
6931 6935 /*
6932 6936 * If execution non-synchronous, it had to be completed
6933 6937 * a callback function will handle potential errors, translate
6934 6938 * the response and will do a callback to a target driver.
6935 6939 * If it was synchronous, check status, using the same
6936 6940 * framework callback.
6937 6941 */
6938 6942 if (synch) {
6939 6943 SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
6940 6944 "synchronous execution status %x\n",
6941 6945 spx->txlt_sata_pkt->satapkt_reason);
6942 6946 sata_txlt_nodata_cmd_completion(spx->txlt_sata_pkt);
6943 6947 }
6944 6948 return (TRAN_ACCEPT);
6945 6949 }
6946 6950
6947 6951
6948 6952 /*
6949 6953 * Send pkt to SATA HBA driver
6950 6954 *
6951 6955 * This function may be called only if the operation is requested by scsi_pkt,
6952 6956 * i.e. scsi_pkt is not NULL.
6953 6957 *
6954 6958 * This function has to be called with cport mutex held. It does release
6955 6959 * the mutex when it calls HBA driver sata_tran_start function and
6956 6960 * re-acquires it afterwards.
6957 6961 *
6958 6962 * If return value is 0, pkt was accepted, -1 otherwise
6959 6963 * rval is set to appropriate sata_scsi_start return value.
6960 6964 *
6961 6965 * Note 1:If HBA driver returns value other than TRAN_ACCEPT, it should not
6962 6966 * have called the sata_pkt callback function for this packet.
6963 6967 *
6964 6968 * The scsi callback has to be performed by the caller of this routine.
6965 6969 */
6966 6970 static int
6967 6971 sata_hba_start(sata_pkt_txlate_t *spx, int *rval)
6968 6972 {
6969 6973 int stat;
6970 6974 uint8_t cport = SATA_TXLT_CPORT(spx);
6971 6975 uint8_t pmport = SATA_TXLT_PMPORT(spx);
6972 6976 sata_hba_inst_t *sata_hba_inst = spx->txlt_sata_hba_inst;
6973 6977 sata_drive_info_t *sdinfo;
6974 6978 sata_pmult_info_t *pminfo;
6975 6979 sata_pmport_info_t *pmportinfo = NULL;
6976 6980 sata_device_t *sata_device = NULL;
6977 6981 uint8_t cmd;
6978 6982 struct sata_cmd_flags cmd_flags;
6979 6983
6980 6984 ASSERT(spx->txlt_sata_pkt != NULL);
6981 6985
6982 6986 ASSERT(mutex_owned(&SATA_CPORT_MUTEX(sata_hba_inst, cport)));
6983 6987
6984 6988 sdinfo = sata_get_device_info(sata_hba_inst,
6985 6989 &spx->txlt_sata_pkt->satapkt_device);
6986 6990 ASSERT(sdinfo != NULL);
6987 6991
6988 6992 /* Clear device reset state? */
6989 6993 /* qual should be XXX_DPMPORT, but add XXX_PMPORT in case */
6990 6994 if (sdinfo->satadrv_addr.qual == SATA_ADDR_DPMPORT ||
6991 6995 sdinfo->satadrv_addr.qual == SATA_ADDR_PMPORT) {
6992 6996
6993 6997 /*
6994 6998 * Get the pmult_info of the its parent port multiplier, all
6995 6999 * sub-devices share a common device reset flags on in
6996 7000 * pmult_info.
6997 7001 */
6998 7002 pminfo = SATA_PMULT_INFO(sata_hba_inst, cport);
6999 7003 pmportinfo = pminfo->pmult_dev_port[pmport];
7000 7004 ASSERT(pminfo != NULL);
7001 7005 if (pminfo->pmult_event_flags & SATA_EVNT_CLEAR_DEVICE_RESET) {
7002 7006 spx->txlt_sata_pkt->satapkt_cmd.satacmd_flags.
7003 7007 sata_clear_dev_reset = B_TRUE;
7004 7008 pminfo->pmult_event_flags &=
7005 7009 ~SATA_EVNT_CLEAR_DEVICE_RESET;
7006 7010 SATADBG1(SATA_DBG_EVENTS, sata_hba_inst,
7007 7011 "sata_hba_start: clearing device reset state"
7008 7012 "on pmult.\n", NULL);
7009 7013 }
7010 7014 } else {
7011 7015 if (sdinfo->satadrv_event_flags &
7012 7016 SATA_EVNT_CLEAR_DEVICE_RESET) {
7013 7017 spx->txlt_sata_pkt->satapkt_cmd.satacmd_flags.
7014 7018 sata_clear_dev_reset = B_TRUE;
7015 7019 sdinfo->satadrv_event_flags &=
7016 7020 ~SATA_EVNT_CLEAR_DEVICE_RESET;
7017 7021 SATADBG1(SATA_DBG_EVENTS, sata_hba_inst,
7018 7022 "sata_hba_start: clearing device reset state\n",
7019 7023 NULL);
7020 7024 }
7021 7025 }
7022 7026
7023 7027 cmd = spx->txlt_sata_pkt->satapkt_cmd.satacmd_cmd_reg;
7024 7028 cmd_flags = spx->txlt_sata_pkt->satapkt_cmd.satacmd_flags;
7025 7029 sata_device = &spx->txlt_sata_pkt->satapkt_device;
7026 7030
7027 7031 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst, cport)));
7028 7032
7029 7033 SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
7030 7034 "Sata cmd 0x%2x\n", cmd);
7031 7035
7032 7036 stat = (*SATA_START_FUNC(sata_hba_inst))(SATA_DIP(sata_hba_inst),
7033 7037 spx->txlt_sata_pkt);
7034 7038 mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst, cport)));
7035 7039 /*
7036 7040 * If sata pkt was accepted and executed in asynchronous mode, i.e.
7037 7041 * with the sata callback, the sata_pkt could be already destroyed
7038 7042 * by the time we check ther return status from the hba_start()
7039 7043 * function, because sata_scsi_destroy_pkt() could have been already
7040 7044 * called (perhaps in the interrupt context). So, in such case, there
7041 7045 * should be no references to it. In other cases, sata_pkt still
7042 7046 * exists.
7043 7047 */
7044 7048 if (stat == SATA_TRAN_ACCEPTED) {
7045 7049 /*
7046 7050 * pkt accepted for execution.
7047 7051 * If it was executed synchronously, it is already completed
7048 7052 * and pkt completion_reason indicates completion status.
7049 7053 */
7050 7054 *rval = TRAN_ACCEPT;
7051 7055 return (0);
7052 7056 }
7053 7057
7054 7058 sdinfo = sata_get_device_info(sata_hba_inst, sata_device);
7055 7059 switch (stat) {
7056 7060 case SATA_TRAN_QUEUE_FULL:
7057 7061 /*
7058 7062 * Controller detected queue full condition.
7059 7063 */
7060 7064 SATADBG1(SATA_DBG_HBA_IF, sata_hba_inst,
7061 7065 "sata_hba_start: queue full\n", NULL);
7062 7066
7063 7067 spx->txlt_scsi_pkt->pkt_reason = CMD_INCOMPLETE;
7064 7068 *spx->txlt_scsi_pkt->pkt_scbp = STATUS_QFULL;
7065 7069
7066 7070 *rval = TRAN_BUSY;
7067 7071 break;
7068 7072
7069 7073 case SATA_TRAN_PORT_ERROR:
7070 7074 /*
7071 7075 * Communication/link with device or general port error
7072 7076 * detected before pkt execution begun.
7073 7077 */
7074 7078 if (spx->txlt_sata_pkt->satapkt_device.satadev_addr.qual ==
7075 7079 SATA_ADDR_CPORT ||
7076 7080 spx->txlt_sata_pkt->satapkt_device.satadev_addr.qual ==
7077 7081 SATA_ADDR_DCPORT)
7078 7082 sata_log(sata_hba_inst, CE_CONT,
7079 7083 "SATA port %d error",
7080 7084 sata_device->satadev_addr.cport);
7081 7085 else
7082 7086 sata_log(sata_hba_inst, CE_CONT,
7083 7087 "SATA port %d:%d error\n",
7084 7088 sata_device->satadev_addr.cport,
7085 7089 sata_device->satadev_addr.pmport);
7086 7090
7087 7091 /*
7088 7092 * Update the port/device structure.
7089 7093 * sata_pkt should be still valid. Since port error is
7090 7094 * returned, sata_device content should reflect port
7091 7095 * state - it means, that sata address have been changed,
7092 7096 * because original packet's sata address refered to a device
7093 7097 * attached to some port.
7094 7098 */
7095 7099 if (sata_device->satadev_addr.qual == SATA_ADDR_DPMPORT ||
7096 7100 sata_device->satadev_addr.qual == SATA_ADDR_PMPORT) {
7097 7101 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst, cport)));
7098 7102 mutex_enter(&pmportinfo->pmport_mutex);
7099 7103 sata_update_pmport_info(sata_hba_inst, sata_device);
7100 7104 mutex_exit(&pmportinfo->pmport_mutex);
7101 7105 mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst, cport)));
7102 7106 } else {
7103 7107 sata_update_port_info(sata_hba_inst, sata_device);
7104 7108 }
7105 7109
7106 7110 spx->txlt_scsi_pkt->pkt_reason = CMD_TRAN_ERR;
7107 7111 *rval = TRAN_FATAL_ERROR;
7108 7112 break;
7109 7113
7110 7114 case SATA_TRAN_CMD_UNSUPPORTED:
7111 7115 /*
7112 7116 * Command rejected by HBA as unsupported. It was HBA driver
7113 7117 * that rejected the command, command was not sent to
7114 7118 * an attached device.
7115 7119 */
7116 7120 if ((sdinfo != NULL) &&
7117 7121 (sdinfo->satadrv_state & SATA_DSTATE_RESET))
7118 7122 SATADBG1(SATA_DBG_EVENTS, sata_hba_inst,
7119 7123 "sat_hba_start: cmd 0x%2x rejected "
7120 7124 "with SATA_TRAN_CMD_UNSUPPORTED status\n", cmd);
7121 7125
7122 7126 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst, cport)));
7123 7127 (void) sata_txlt_invalid_command(spx);
7124 7128 mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst, cport)));
7125 7129
7126 7130 *rval = TRAN_ACCEPT;
7127 7131 break;
7128 7132
7129 7133 case SATA_TRAN_BUSY:
7130 7134 /*
7131 7135 * Command rejected by HBA because other operation prevents
7132 7136 * accepting the packet, or device is in RESET condition.
7133 7137 */
7134 7138 if (sdinfo != NULL) {
7135 7139 sdinfo->satadrv_state =
7136 7140 spx->txlt_sata_pkt->satapkt_device.satadev_state;
7137 7141
7138 7142 if (sdinfo->satadrv_state & SATA_DSTATE_RESET) {
7139 7143 SATADBG1(SATA_DBG_EVENTS, sata_hba_inst,
7140 7144 "sata_hba_start: cmd 0x%2x rejected "
7141 7145 "because of device reset condition\n",
7142 7146 cmd);
7143 7147 } else {
7144 7148 SATADBG1(SATA_DBG_EVENTS, sata_hba_inst,
7145 7149 "sata_hba_start: cmd 0x%2x rejected "
7146 7150 "with SATA_TRAN_BUSY status\n",
7147 7151 cmd);
7148 7152 }
7149 7153 }
7150 7154 spx->txlt_scsi_pkt->pkt_reason = CMD_INCOMPLETE;
7151 7155 *rval = TRAN_BUSY;
7152 7156 break;
7153 7157
7154 7158 default:
7155 7159 /* Unrecognized HBA response */
7156 7160 SATA_LOG_D((sata_hba_inst, CE_WARN,
7157 7161 "sata_hba_start: unrecognized HBA response "
7158 7162 "to cmd : 0x%2x resp 0x%x", cmd, rval));
7159 7163 spx->txlt_scsi_pkt->pkt_reason = CMD_TRAN_ERR;
7160 7164 *rval = TRAN_FATAL_ERROR;
7161 7165 break;
7162 7166 }
7163 7167
7164 7168 /*
7165 7169 * If we got here, the packet was rejected.
7166 7170 * Check if we need to remember reset state clearing request
7167 7171 */
7168 7172 if (cmd_flags.sata_clear_dev_reset) {
7169 7173 /*
7170 7174 * Check if device is still configured - it may have
7171 7175 * disapeared from the configuration
7172 7176 */
7173 7177 sdinfo = sata_get_device_info(sata_hba_inst, sata_device);
7174 7178 if (sdinfo != NULL) {
7175 7179 /*
7176 7180 * Restore the flag that requests clearing of
7177 7181 * the device reset state,
7178 7182 * so the next sata packet may carry it to HBA.
7179 7183 */
7180 7184 if (sdinfo->satadrv_addr.qual == SATA_ADDR_PMPORT ||
7181 7185 sdinfo->satadrv_addr.qual == SATA_ADDR_DPMPORT) {
7182 7186 pminfo->pmult_event_flags |=
7183 7187 SATA_EVNT_CLEAR_DEVICE_RESET;
7184 7188 } else {
7185 7189 sdinfo->satadrv_event_flags |=
7186 7190 SATA_EVNT_CLEAR_DEVICE_RESET;
7187 7191 }
7188 7192 }
7189 7193 }
7190 7194 return (-1);
7191 7195 }
7192 7196
7193 7197 /*
7194 7198 * Scsi response setup for invalid LBA
7195 7199 *
7196 7200 * Returns TRAN_ACCEPT and appropriate values in scsi_pkt fields.
7197 7201 */
7198 7202 static int
7199 7203 sata_txlt_lba_out_of_range(sata_pkt_txlate_t *spx)
7200 7204 {
7201 7205 struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
7202 7206 struct scsi_extended_sense *sense;
7203 7207
7204 7208 scsipkt->pkt_reason = CMD_CMPLT;
7205 7209 scsipkt->pkt_state = STATE_GOT_BUS | STATE_GOT_TARGET |
7206 7210 STATE_SENT_CMD | STATE_GOT_STATUS;
7207 7211 *scsipkt->pkt_scbp = STATUS_CHECK;
7208 7212
7209 7213 *scsipkt->pkt_scbp = STATUS_CHECK;
7210 7214 sense = sata_arq_sense(spx);
7211 7215 sense->es_key = KEY_ILLEGAL_REQUEST;
7212 7216 sense->es_add_code = SD_SCSI_ASC_LBA_OUT_OF_RANGE;
7213 7217
7214 7218 SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
7215 7219 "Scsi_pkt completion reason %x\n", scsipkt->pkt_reason);
7216 7220
7217 7221 if ((scsipkt->pkt_flags & FLAG_NOINTR) == 0 &&
7218 7222 scsipkt->pkt_comp != NULL) {
7219 7223 /* scsi callback required */
7220 7224 if (servicing_interrupt()) {
7221 7225 if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
7222 7226 (task_func_t *)spx->txlt_scsi_pkt->pkt_comp,
7223 7227 (void *)spx->txlt_scsi_pkt, TQ_NOSLEEP) == NULL) {
7224 7228 return (TRAN_BUSY);
7225 7229 }
7226 7230 } else if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
7227 7231 (task_func_t *)spx->txlt_scsi_pkt->pkt_comp,
7228 7232 (void *)spx->txlt_scsi_pkt, TQ_SLEEP) == NULL) {
7229 7233 /* Scheduling the callback failed */
7230 7234 return (TRAN_BUSY);
7231 7235 }
7232 7236 }
7233 7237 return (TRAN_ACCEPT);
7234 7238 }
7235 7239
7236 7240
7237 7241 /*
7238 7242 * Analyze device status and error registers and translate them into
7239 7243 * appropriate scsi sense codes.
7240 7244 * NOTE: non-packet commands only for now
7241 7245 */
7242 7246 static void
7243 7247 sata_decode_device_error(sata_pkt_txlate_t *spx,
7244 7248 struct scsi_extended_sense *sense)
7245 7249 {
7246 7250 uint8_t err_reg = spx->txlt_sata_pkt->satapkt_cmd.satacmd_error_reg;
7247 7251
7248 7252 ASSERT(sense != NULL);
7249 7253 ASSERT(spx->txlt_sata_pkt->satapkt_cmd.satacmd_status_reg &
7250 7254 SATA_STATUS_ERR);
7251 7255
7252 7256
7253 7257 if (err_reg & SATA_ERROR_ICRC) {
7254 7258 sense->es_key = KEY_ABORTED_COMMAND;
7255 7259 sense->es_add_code = 0x08; /* Communication failure */
7256 7260 return;
7257 7261 }
7258 7262
7259 7263 if (err_reg & SATA_ERROR_UNC) {
7260 7264 sense->es_key = KEY_MEDIUM_ERROR;
7261 7265 /* Information bytes (LBA) need to be set by a caller */
7262 7266 return;
7263 7267 }
7264 7268
7265 7269 /* ADD HERE: MC error bit handling for ATAPI CD/DVD */
7266 7270 if (err_reg & (SATA_ERROR_MCR | SATA_ERROR_NM)) {
7267 7271 sense->es_key = KEY_UNIT_ATTENTION;
7268 7272 sense->es_add_code = 0x3a; /* No media present */
7269 7273 return;
7270 7274 }
7271 7275
7272 7276 if (err_reg & SATA_ERROR_IDNF) {
7273 7277 if (err_reg & SATA_ERROR_ABORT) {
7274 7278 sense->es_key = KEY_ABORTED_COMMAND;
7275 7279 } else {
7276 7280 sense->es_key = KEY_ILLEGAL_REQUEST;
7277 7281 sense->es_add_code = 0x21; /* LBA out of range */
7278 7282 }
7279 7283 return;
7280 7284 }
7281 7285
7282 7286 if (err_reg & SATA_ERROR_ABORT) {
7283 7287 ASSERT(spx->txlt_sata_pkt != NULL);
7284 7288 sense->es_key = KEY_ABORTED_COMMAND;
7285 7289 return;
7286 7290 }
7287 7291 }
7288 7292
7289 7293 /*
7290 7294 * Extract error LBA from sata_pkt.satapkt_cmd register fields
7291 7295 */
7292 7296 static void
7293 7297 sata_extract_error_lba(sata_pkt_txlate_t *spx, uint64_t *lba)
7294 7298 {
7295 7299 sata_cmd_t *sata_cmd = &spx->txlt_sata_pkt->satapkt_cmd;
7296 7300
7297 7301 *lba = 0;
7298 7302 if (sata_cmd->satacmd_addr_type == ATA_ADDR_LBA48) {
7299 7303 *lba = sata_cmd->satacmd_lba_high_msb;
7300 7304 *lba = (*lba << 8) | sata_cmd->satacmd_lba_mid_msb;
7301 7305 *lba = (*lba << 8) | sata_cmd->satacmd_lba_low_msb;
7302 7306 } else if (sata_cmd->satacmd_addr_type == ATA_ADDR_LBA28) {
7303 7307 *lba = sata_cmd->satacmd_device_reg & 0xf;
7304 7308 }
7305 7309 *lba = (*lba << 8) | sata_cmd->satacmd_lba_high_lsb;
7306 7310 *lba = (*lba << 8) | sata_cmd->satacmd_lba_mid_lsb;
7307 7311 *lba = (*lba << 8) | sata_cmd->satacmd_lba_low_lsb;
7308 7312 }
7309 7313
7310 7314 /*
7311 7315 * This is fixed sense format - if LBA exceeds the info field size,
7312 7316 * no valid info will be returned (valid bit in extended sense will
7313 7317 * be set to 0).
7314 7318 */
7315 7319 static struct scsi_extended_sense *
7316 7320 sata_arq_sense(sata_pkt_txlate_t *spx)
7317 7321 {
7318 7322 struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
7319 7323 struct scsi_arq_status *arqs;
7320 7324 struct scsi_extended_sense *sense;
7321 7325
7322 7326 /* Fill ARQ sense data */
7323 7327 scsipkt->pkt_state |= STATE_ARQ_DONE;
7324 7328 arqs = (struct scsi_arq_status *)scsipkt->pkt_scbp;
7325 7329 *(uchar_t *)&arqs->sts_status = STATUS_CHECK;
7326 7330 *(uchar_t *)&arqs->sts_rqpkt_status = STATUS_GOOD;
7327 7331 arqs->sts_rqpkt_reason = CMD_CMPLT;
7328 7332 arqs->sts_rqpkt_state = STATE_GOT_BUS | STATE_GOT_TARGET |
7329 7333 STATE_XFERRED_DATA | STATE_SENT_CMD | STATE_GOT_STATUS;
7330 7334 arqs->sts_rqpkt_resid = 0;
7331 7335 sense = &arqs->sts_sensedata;
7332 7336 bzero(sense, sizeof (struct scsi_extended_sense));
7333 7337 sata_fixed_sense_data_preset(sense);
7334 7338 return (sense);
7335 7339 }
7336 7340
7337 7341 /*
7338 7342 * ATA Pass Through support
7339 7343 * Sets flags indicating that an invalid value was found in some
7340 7344 * field in the command. It could be something illegal according to
7341 7345 * the SAT-2 spec or it could be a feature that is not (yet?)
7342 7346 * supported.
7343 7347 */
7344 7348 static int
7345 7349 sata_txlt_ata_pass_thru_illegal_cmd(sata_pkt_txlate_t *spx)
7346 7350 {
7347 7351 struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
7348 7352 struct scsi_extended_sense *sense = sata_arq_sense(spx);
7349 7353
7350 7354 scsipkt->pkt_reason = CMD_CMPLT;
7351 7355 *scsipkt->pkt_scbp = STATUS_CHECK;
7352 7356 scsipkt->pkt_state = STATE_GOT_BUS | STATE_GOT_TARGET |
7353 7357 STATE_SENT_CMD | STATE_GOT_STATUS;
7354 7358
7355 7359 sense = sata_arq_sense(spx);
7356 7360 sense->es_key = KEY_ILLEGAL_REQUEST;
7357 7361 sense->es_add_code = SD_SCSI_ASC_INVALID_FIELD_IN_CDB;
7358 7362
7359 7363 if ((scsipkt->pkt_flags & FLAG_NOINTR) == 0 &&
7360 7364 scsipkt->pkt_comp != NULL) {
7361 7365 /* scsi callback required */
7362 7366 if (servicing_interrupt()) {
7363 7367 if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
7364 7368 (task_func_t *)spx->txlt_scsi_pkt->pkt_comp,
7365 7369 (void *)spx->txlt_scsi_pkt, TQ_NOSLEEP) == NULL) {
7366 7370 return (TRAN_BUSY);
7367 7371 }
7368 7372 } else if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
7369 7373 (task_func_t *)spx->txlt_scsi_pkt->pkt_comp,
7370 7374 (void *)spx->txlt_scsi_pkt, TQ_SLEEP) == NULL) {
7371 7375 /* Scheduling the callback failed */
7372 7376 return (TRAN_BUSY);
7373 7377 }
7374 7378 }
7375 7379
7376 7380 return (TRAN_ACCEPT);
7377 7381 }
7378 7382
7379 7383 /*
7380 7384 * The UNMAP command considers it not to be an error if the parameter length
7381 7385 * or block descriptor length is 0. For this case, there is nothing for TRIM
7382 7386 * to do so just complete the command.
7383 7387 */
7384 7388 static int
7385 7389 sata_txlt_unmap_nodata_cmd(sata_pkt_txlate_t *spx)
7386 7390 {
7387 7391 struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
7388 7392
7389 7393 scsipkt->pkt_reason = CMD_CMPLT;
7390 7394 *scsipkt->pkt_scbp = STATUS_GOOD;
7391 7395 scsipkt->pkt_state = STATE_GOT_BUS | STATE_GOT_TARGET |
7392 7396 STATE_SENT_CMD | STATE_GOT_STATUS;
7393 7397
7394 7398 if ((scsipkt->pkt_flags & FLAG_NOINTR) == 0 &&
7395 7399 scsipkt->pkt_comp != NULL) {
7396 7400 /* scsi callback required */
7397 7401 if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
7398 7402 (task_func_t *)spx->txlt_scsi_pkt->pkt_comp,
7399 7403 (void *)spx->txlt_scsi_pkt, TQ_SLEEP) == NULL) {
7400 7404 /* Scheduling the callback failed */
7401 7405 return (TRAN_BUSY);
7402 7406 }
7403 7407 }
7404 7408
7405 7409 return (TRAN_ACCEPT);
7406 7410 }
7407 7411
7408 7412 /*
7409 7413 * Emulated SATA Read/Write command completion for zero-length requests.
7410 7414 * This request always succedes, so in synchronous mode it always returns
7411 7415 * TRAN_ACCEPT, and in non-synchronous mode it may return TRAN_BUSY if the
7412 7416 * callback cannot be scheduled.
7413 7417 */
7414 7418 static int
7415 7419 sata_emul_rw_completion(sata_pkt_txlate_t *spx)
7416 7420 {
7417 7421 struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
7418 7422
7419 7423 scsipkt->pkt_state = STATE_GOT_BUS | STATE_GOT_TARGET |
7420 7424 STATE_SENT_CMD | STATE_GOT_STATUS;
7421 7425 scsipkt->pkt_reason = CMD_CMPLT;
7422 7426 *scsipkt->pkt_scbp = STATUS_GOOD;
7423 7427 if (!(spx->txlt_sata_pkt->satapkt_op_mode & SATA_OPMODE_SYNCH)) {
7424 7428 /* scsi callback required - have to schedule it */
7425 7429 if (servicing_interrupt()) {
7426 7430 if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
7427 7431 (task_func_t *)spx->txlt_scsi_pkt->pkt_comp,
7428 7432 (void *)spx->txlt_scsi_pkt, TQ_NOSLEEP) == NULL) {
7429 7433 return (TRAN_BUSY);
7430 7434 }
7431 7435 } else if (taskq_dispatch(SATA_TXLT_TASKQ(spx),
7432 7436 (task_func_t *)spx->txlt_scsi_pkt->pkt_comp,
7433 7437 (void *)spx->txlt_scsi_pkt, TQ_SLEEP) == NULL) {
7434 7438 /* Scheduling the callback failed */
7435 7439 return (TRAN_BUSY);
7436 7440 }
7437 7441 }
7438 7442 return (TRAN_ACCEPT);
7439 7443 }
7440 7444
7441 7445
7442 7446 /*
7443 7447 * Translate completion status of SATA read/write commands into scsi response.
7444 7448 * pkt completion_reason is checked to determine the completion status.
7445 7449 * Do scsi callback if necessary.
7446 7450 *
7447 7451 * Note: this function may be called also for synchronously executed
7448 7452 * commands.
7449 7453 * This function may be used only if scsi_pkt is non-NULL.
7450 7454 */
7451 7455 static void
7452 7456 sata_txlt_rw_completion(sata_pkt_t *sata_pkt)
7453 7457 {
7454 7458 sata_pkt_txlate_t *spx =
7455 7459 (sata_pkt_txlate_t *)sata_pkt->satapkt_framework_private;
7456 7460 sata_cmd_t *scmd = &sata_pkt->satapkt_cmd;
7457 7461 struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
7458 7462 struct scsi_extended_sense *sense;
7459 7463 uint64_t lba;
7460 7464 struct buf *bp;
7461 7465 int rval;
7462 7466 if (sata_pkt->satapkt_reason == SATA_PKT_COMPLETED) {
7463 7467 /* Normal completion */
7464 7468 scsipkt->pkt_state = STATE_GOT_BUS | STATE_GOT_TARGET |
7465 7469 STATE_SENT_CMD | STATE_XFERRED_DATA | STATE_GOT_STATUS;
7466 7470 scsipkt->pkt_reason = CMD_CMPLT;
7467 7471 *scsipkt->pkt_scbp = STATUS_GOOD;
7468 7472 if (spx->txlt_tmp_buf != NULL) {
7469 7473 /* Temporary buffer was used */
7470 7474 bp = spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp;
7471 7475 if (bp->b_flags & B_READ) {
7472 7476 rval = ddi_dma_sync(
7473 7477 spx->txlt_buf_dma_handle, 0, 0,
7474 7478 DDI_DMA_SYNC_FORCPU);
7475 7479 ASSERT(rval == DDI_SUCCESS);
7476 7480 bcopy(spx->txlt_tmp_buf, bp->b_un.b_addr,
7477 7481 bp->b_bcount);
7478 7482 }
7479 7483 }
7480 7484 } else {
7481 7485 /*
7482 7486 * Something went wrong - analyze return
7483 7487 */
7484 7488 scsipkt->pkt_state = STATE_GOT_BUS | STATE_GOT_TARGET |
7485 7489 STATE_SENT_CMD | STATE_GOT_STATUS;
7486 7490 scsipkt->pkt_reason = CMD_INCOMPLETE;
7487 7491 *scsipkt->pkt_scbp = STATUS_CHECK;
7488 7492 sense = sata_arq_sense(spx);
7489 7493 ASSERT(sense != NULL);
7490 7494
7491 7495 /*
7492 7496 * SATA_PKT_DEV_ERROR is the only case where we may be able to
7493 7497 * extract from device registers the failing LBA.
7494 7498 */
7495 7499 if (sata_pkt->satapkt_reason == SATA_PKT_DEV_ERROR) {
7496 7500 if ((scmd->satacmd_addr_type == ATA_ADDR_LBA48) &&
7497 7501 (scmd->satacmd_lba_mid_msb != 0 ||
7498 7502 scmd->satacmd_lba_high_msb != 0)) {
7499 7503 /*
7500 7504 * We have problem reporting this cmd LBA
7501 7505 * in fixed sense data format, because of
7502 7506 * the size of the scsi LBA fields.
7503 7507 */
7504 7508 sense->es_valid = 0;
7505 7509 } else {
7506 7510 sata_extract_error_lba(spx, &lba);
7507 7511 sense->es_info_1 = (lba & 0xFF000000) >> 24;
7508 7512 sense->es_info_2 = (lba & 0xFF0000) >> 16;
7509 7513 sense->es_info_3 = (lba & 0xFF00) >> 8;
7510 7514 sense->es_info_4 = lba & 0xFF;
7511 7515 }
7512 7516 } else {
7513 7517 /* Invalid extended sense info */
7514 7518 sense->es_valid = 0;
7515 7519 }
7516 7520
7517 7521 switch (sata_pkt->satapkt_reason) {
7518 7522 case SATA_PKT_PORT_ERROR:
7519 7523 /* We may want to handle DEV GONE state as well */
7520 7524 /*
7521 7525 * We have no device data. Assume no data transfered.
7522 7526 */
7523 7527 sense->es_key = KEY_HARDWARE_ERROR;
7524 7528 break;
7525 7529
7526 7530 case SATA_PKT_DEV_ERROR:
7527 7531 if (sata_pkt->satapkt_cmd.satacmd_status_reg &
7528 7532 SATA_STATUS_ERR) {
7529 7533 /*
7530 7534 * determine dev error reason from error
7531 7535 * reg content
7532 7536 */
7533 7537 sata_decode_device_error(spx, sense);
7534 7538 if (sense->es_key == KEY_MEDIUM_ERROR) {
7535 7539 switch (scmd->satacmd_cmd_reg) {
7536 7540 case SATAC_READ_DMA:
7537 7541 case SATAC_READ_DMA_EXT:
7538 7542 case SATAC_READ_DMA_QUEUED:
7539 7543 case SATAC_READ_DMA_QUEUED_EXT:
7540 7544 case SATAC_READ_FPDMA_QUEUED:
7541 7545 /* Unrecovered read error */
7542 7546 sense->es_add_code =
7543 7547 SD_SCSI_ASC_UNREC_READ_ERR;
7544 7548 break;
7545 7549 case SATAC_WRITE_DMA:
7546 7550 case SATAC_WRITE_DMA_EXT:
7547 7551 case SATAC_WRITE_DMA_QUEUED:
7548 7552 case SATAC_WRITE_DMA_QUEUED_EXT:
7549 7553 case SATAC_WRITE_FPDMA_QUEUED:
7550 7554 /* Write error */
7551 7555 sense->es_add_code =
7552 7556 SD_SCSI_ASC_WRITE_ERR;
7553 7557 break;
7554 7558 default:
7555 7559 /* Internal error */
7556 7560 SATA_LOG_D((
7557 7561 spx->txlt_sata_hba_inst,
7558 7562 CE_WARN,
7559 7563 "sata_txlt_rw_completion :"
7560 7564 "internal error - invalid "
7561 7565 "command 0x%2x",
7562 7566 scmd->satacmd_cmd_reg));
7563 7567 break;
7564 7568 }
7565 7569 }
7566 7570 break;
7567 7571 }
7568 7572 /* No extended sense key - no info available */
7569 7573 scsipkt->pkt_reason = CMD_INCOMPLETE;
7570 7574 break;
7571 7575
7572 7576 case SATA_PKT_TIMEOUT:
7573 7577 scsipkt->pkt_reason = CMD_TIMEOUT;
7574 7578 scsipkt->pkt_statistics |=
7575 7579 STAT_TIMEOUT | STAT_DEV_RESET;
7576 7580 sense->es_key = KEY_ABORTED_COMMAND;
7577 7581 break;
7578 7582
7579 7583 case SATA_PKT_ABORTED:
7580 7584 scsipkt->pkt_reason = CMD_ABORTED;
7581 7585 scsipkt->pkt_statistics |= STAT_ABORTED;
7582 7586 sense->es_key = KEY_ABORTED_COMMAND;
7583 7587 break;
7584 7588
7585 7589 case SATA_PKT_RESET:
7586 7590 scsipkt->pkt_reason = CMD_RESET;
7587 7591 scsipkt->pkt_statistics |= STAT_DEV_RESET;
7588 7592 sense->es_key = KEY_ABORTED_COMMAND;
7589 7593 break;
7590 7594
7591 7595 default:
7592 7596 SATA_LOG_D((spx->txlt_sata_hba_inst, CE_WARN,
7593 7597 "sata_txlt_rw_completion: "
7594 7598 "invalid packet completion reason"));
7595 7599 scsipkt->pkt_reason = CMD_TRAN_ERR;
7596 7600 break;
7597 7601 }
7598 7602 }
7599 7603 SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
7600 7604 "Scsi_pkt completion reason %x\n", scsipkt->pkt_reason);
7601 7605
7602 7606 if ((scsipkt->pkt_flags & FLAG_NOINTR) == 0)
7603 7607 /* scsi callback required */
7604 7608 scsi_hba_pkt_comp(scsipkt);
7605 7609 }
7606 7610
7607 7611
7608 7612 /*
7609 7613 * Translate completion status of non-data commands (i.e. commands returning
7610 7614 * no data).
7611 7615 * pkt completion_reason is checked to determine the completion status.
7612 7616 * Do scsi callback if necessary (FLAG_NOINTR == 0)
7613 7617 *
7614 7618 * Note: this function may be called also for synchronously executed
7615 7619 * commands.
7616 7620 * This function may be used only if scsi_pkt is non-NULL.
7617 7621 */
7618 7622
7619 7623 static void
7620 7624 sata_txlt_nodata_cmd_completion(sata_pkt_t *sata_pkt)
7621 7625 {
7622 7626 sata_pkt_txlate_t *spx =
7623 7627 (sata_pkt_txlate_t *)sata_pkt->satapkt_framework_private;
7624 7628 struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
7625 7629
7626 7630 sata_set_arq_data(sata_pkt);
7627 7631
7628 7632 if ((scsipkt->pkt_flags & FLAG_NOINTR) == 0)
7629 7633 /* scsi callback required */
7630 7634 scsi_hba_pkt_comp(scsipkt);
7631 7635 }
7632 7636
7633 7637 /*
7634 7638 * Completion handler for ATA Pass Through command
7635 7639 */
7636 7640 static void
7637 7641 sata_txlt_apt_completion(sata_pkt_t *sata_pkt)
7638 7642 {
7639 7643 sata_pkt_txlate_t *spx =
7640 7644 (sata_pkt_txlate_t *)sata_pkt->satapkt_framework_private;
7641 7645 sata_cmd_t *scmd = &sata_pkt->satapkt_cmd;
7642 7646 struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
7643 7647 struct buf *bp;
7644 7648 uint8_t sense_key = 0, addl_sense_code = 0, addl_sense_qual = 0;
7645 7649
7646 7650 if (sata_pkt->satapkt_reason == SATA_PKT_COMPLETED) {
7647 7651 /* Normal completion */
7648 7652 scsipkt->pkt_state = STATE_GOT_BUS | STATE_GOT_TARGET |
7649 7653 STATE_SENT_CMD | STATE_XFERRED_DATA | STATE_GOT_STATUS;
7650 7654 scsipkt->pkt_reason = CMD_CMPLT;
7651 7655 *scsipkt->pkt_scbp = STATUS_GOOD;
7652 7656
7653 7657 /*
7654 7658 * If the command has CK_COND set
7655 7659 */
7656 7660 if (scsipkt->pkt_cdbp[2] & SATL_APT_BM_CK_COND) {
7657 7661 *scsipkt->pkt_scbp = STATUS_CHECK;
7658 7662 sata_fill_ata_return_desc(sata_pkt,
7659 7663 KEY_RECOVERABLE_ERROR,
7660 7664 SD_SCSI_ASC_APT_INFO_AVAIL, 0x1d);
7661 7665 }
7662 7666
7663 7667 if (spx->txlt_tmp_buf != NULL) {
7664 7668 /* Temporary buffer was used */
7665 7669 bp = spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp;
7666 7670 if (bp->b_flags & B_READ) {
7667 7671 bcopy(spx->txlt_tmp_buf, bp->b_un.b_addr,
7668 7672 bp->b_bcount);
7669 7673 }
7670 7674 }
7671 7675 } else {
7672 7676 scsipkt->pkt_state = STATE_GOT_BUS | STATE_GOT_TARGET |
7673 7677 STATE_SENT_CMD | STATE_GOT_STATUS;
7674 7678 scsipkt->pkt_reason = CMD_INCOMPLETE;
7675 7679 *scsipkt->pkt_scbp = STATUS_CHECK;
7676 7680
7677 7681 /*
7678 7682 * If DF or ERR was set, the HBA should have copied out the
7679 7683 * status and error registers to the satacmd structure.
7680 7684 */
7681 7685 if (scmd->satacmd_status_reg & SATA_STATUS_DF) {
7682 7686 sense_key = KEY_HARDWARE_ERROR;
7683 7687 addl_sense_code = SD_SCSI_ASC_INTERNAL_TARGET_FAILURE;
7684 7688 addl_sense_qual = 0;
7685 7689 } else if (scmd->satacmd_status_reg & SATA_STATUS_ERR) {
7686 7690 if (scmd->satacmd_error_reg & SATA_ERROR_NM) {
7687 7691 sense_key = KEY_NOT_READY;
7688 7692 addl_sense_code =
7689 7693 SD_SCSI_ASC_MEDIUM_NOT_PRESENT;
7690 7694 addl_sense_qual = 0;
7691 7695 } else if (scmd->satacmd_error_reg & SATA_ERROR_UNC) {
7692 7696 sense_key = KEY_MEDIUM_ERROR;
7693 7697 addl_sense_code = SD_SCSI_ASC_UNREC_READ_ERR;
7694 7698 addl_sense_qual = 0;
7695 7699 } else if (scmd->satacmd_error_reg & SATA_ERROR_ILI) {
7696 7700 sense_key = KEY_DATA_PROTECT;
7697 7701 addl_sense_code = SD_SCSI_ASC_WRITE_PROTECTED;
7698 7702 addl_sense_qual = 0;
7699 7703 } else if (scmd->satacmd_error_reg & SATA_ERROR_IDNF) {
7700 7704 sense_key = KEY_ILLEGAL_REQUEST;
7701 7705 addl_sense_code = SD_SCSI_ASC_LBA_OUT_OF_RANGE;
7702 7706 addl_sense_qual = 0;
7703 7707 } else if (scmd->satacmd_error_reg & SATA_ERROR_ABORT) {
7704 7708 sense_key = KEY_ABORTED_COMMAND;
7705 7709 addl_sense_code = SD_SCSI_ASC_NO_ADD_SENSE;
7706 7710 addl_sense_qual = 0;
7707 7711 } else if (scmd->satacmd_error_reg & SATA_ERROR_MC) {
7708 7712 sense_key = KEY_UNIT_ATTENTION;
7709 7713 addl_sense_code =
7710 7714 SD_SCSI_ASC_MEDIUM_MAY_HAVE_CHANGED;
7711 7715 addl_sense_qual = 0;
7712 7716 } else if (scmd->satacmd_error_reg & SATA_ERROR_MCR) {
7713 7717 sense_key = KEY_UNIT_ATTENTION;
7714 7718 addl_sense_code = SD_SCSI_ASC_OP_MEDIUM_REM_REQ;
7715 7719 addl_sense_qual = 0;
7716 7720 } else if (scmd->satacmd_error_reg & SATA_ERROR_ICRC) {
7717 7721 sense_key = KEY_ABORTED_COMMAND;
7718 7722 addl_sense_code =
7719 7723 SD_SCSI_ASC_INFO_UNIT_IUCRC_ERR;
7720 7724 addl_sense_qual = 0;
7721 7725 }
7722 7726 }
7723 7727
7724 7728 sata_fill_ata_return_desc(sata_pkt, sense_key, addl_sense_code,
7725 7729 addl_sense_qual);
7726 7730 }
7727 7731
7728 7732 if ((scsipkt->pkt_flags & FLAG_NOINTR) == 0)
7729 7733 /* scsi callback required */
7730 7734 scsi_hba_pkt_comp(scsipkt);
7731 7735 }
7732 7736
7733 7737 /*
7734 7738 * Completion handler for unmap translation command
7735 7739 */
7736 7740 static void
7737 7741 sata_txlt_unmap_completion(sata_pkt_t *sata_pkt)
7738 7742 {
7739 7743 sata_pkt_txlate_t *spx =
7740 7744 (sata_pkt_txlate_t *)sata_pkt->satapkt_framework_private;
7741 7745 sata_cmd_t *scmd = &sata_pkt->satapkt_cmd;
7742 7746 struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
7743 7747 struct buf *bp;
7744 7748 uint8_t sense_key = 0, addl_sense_code = 0, addl_sense_qual = 0;
7745 7749
7746 7750 if (sata_pkt->satapkt_reason == SATA_PKT_COMPLETED) {
7747 7751 /* Normal completion */
7748 7752 scsipkt->pkt_state = STATE_GOT_BUS | STATE_GOT_TARGET |
7749 7753 STATE_SENT_CMD | STATE_XFERRED_DATA | STATE_GOT_STATUS;
7750 7754 scsipkt->pkt_reason = CMD_CMPLT;
7751 7755 *scsipkt->pkt_scbp = STATUS_GOOD;
7752 7756
7753 7757 if (spx->txlt_tmp_buf != NULL) {
7754 7758 /* Temporary buffer was used */
7755 7759 bp = spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp;
7756 7760 if (bp->b_flags & B_READ) {
7757 7761 bcopy(spx->txlt_tmp_buf, bp->b_un.b_addr,
7758 7762 bp->b_bcount);
7759 7763 }
7760 7764 }
7761 7765 } else {
7762 7766 scsipkt->pkt_state = STATE_GOT_BUS | STATE_GOT_TARGET |
7763 7767 STATE_SENT_CMD | STATE_GOT_STATUS;
7764 7768 scsipkt->pkt_reason = CMD_INCOMPLETE;
7765 7769 *scsipkt->pkt_scbp = STATUS_CHECK;
7766 7770
7767 7771 /*
7768 7772 * If DF or ERR was set, the HBA should have copied out the
7769 7773 * status and error registers to the satacmd structure.
7770 7774 */
7771 7775 if (scmd->satacmd_status_reg & SATA_STATUS_DF) {
7772 7776 sense_key = KEY_HARDWARE_ERROR;
7773 7777 addl_sense_code = SD_SCSI_ASC_INTERNAL_TARGET_FAILURE;
7774 7778 addl_sense_qual = 0;
7775 7779 } else if (scmd->satacmd_status_reg & SATA_STATUS_ERR) {
7776 7780 if (scmd->satacmd_error_reg & SATA_ERROR_NM) {
7777 7781 sense_key = KEY_NOT_READY;
7778 7782 addl_sense_code =
7779 7783 SD_SCSI_ASC_MEDIUM_NOT_PRESENT;
7780 7784 addl_sense_qual = 0;
7781 7785 } else if (scmd->satacmd_error_reg & SATA_ERROR_UNC) {
7782 7786 sense_key = KEY_MEDIUM_ERROR;
7783 7787 addl_sense_code = SD_SCSI_ASC_WRITE_ERR;
7784 7788 addl_sense_qual = 0;
7785 7789 } else if (scmd->satacmd_error_reg & SATA_ERROR_ILI) {
7786 7790 sense_key = KEY_DATA_PROTECT;
7787 7791 addl_sense_code = SD_SCSI_ASC_WRITE_PROTECTED;
7788 7792 addl_sense_qual = 0;
7789 7793 } else if (scmd->satacmd_error_reg & SATA_ERROR_IDNF) {
7790 7794 sense_key = KEY_ILLEGAL_REQUEST;
7791 7795 addl_sense_code = SD_SCSI_ASC_LBA_OUT_OF_RANGE;
7792 7796 addl_sense_qual = 0;
7793 7797 } else if (scmd->satacmd_error_reg & SATA_ERROR_ABORT) {
7794 7798 sense_key = KEY_ABORTED_COMMAND;
7795 7799 addl_sense_code = SD_SCSI_ASC_NO_ADD_SENSE;
7796 7800 addl_sense_qual = 0;
7797 7801 } else if (scmd->satacmd_error_reg & SATA_ERROR_MC) {
7798 7802 sense_key = KEY_UNIT_ATTENTION;
7799 7803 addl_sense_code =
7800 7804 SD_SCSI_ASC_MEDIUM_MAY_HAVE_CHANGED;
7801 7805 addl_sense_qual = 0;
7802 7806 } else if (scmd->satacmd_error_reg & SATA_ERROR_MCR) {
7803 7807 sense_key = KEY_UNIT_ATTENTION;
7804 7808 addl_sense_code = SD_SCSI_ASC_OP_MEDIUM_REM_REQ;
7805 7809 addl_sense_qual = 0;
7806 7810 } else if (scmd->satacmd_error_reg & SATA_ERROR_ICRC) {
7807 7811 sense_key = KEY_ABORTED_COMMAND;
7808 7812 addl_sense_code =
7809 7813 SD_SCSI_ASC_INFO_UNIT_IUCRC_ERR;
7810 7814 addl_sense_qual = 0;
7811 7815 }
7812 7816 }
7813 7817
7814 7818 sata_fill_ata_return_desc(sata_pkt, sense_key, addl_sense_code,
7815 7819 addl_sense_qual);
7816 7820 }
7817 7821
7818 7822 sata_free_local_buffer(spx);
7819 7823
7820 7824 if ((scsipkt->pkt_flags & FLAG_NOINTR) == 0)
7821 7825 /* scsi callback required */
7822 7826 scsi_hba_pkt_comp(scsipkt);
7823 7827 }
7824 7828
7825 7829 /*
7826 7830 *
7827 7831 */
7828 7832 static void
7829 7833 sata_fill_ata_return_desc(sata_pkt_t *sata_pkt, uint8_t sense_key,
7830 7834 uint8_t addl_sense_code, uint8_t addl_sense_qual)
7831 7835 {
7832 7836 sata_pkt_txlate_t *spx =
7833 7837 (sata_pkt_txlate_t *)sata_pkt->satapkt_framework_private;
7834 7838 sata_cmd_t *scmd = &sata_pkt->satapkt_cmd;
7835 7839 struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
7836 7840 struct sata_apt_sense_data *apt_sd =
7837 7841 (struct sata_apt_sense_data *)scsipkt->pkt_scbp;
7838 7842 struct scsi_descr_sense_hdr *sds = &(apt_sd->apt_sd_hdr);
7839 7843 struct scsi_ata_status_ret_sense_descr *ata_ret_desc =
7840 7844 &(apt_sd->apt_sd_sense);
7841 7845 int extend = 0;
7842 7846
7843 7847 if ((scsipkt->pkt_cdbp[0] == SPC3_CMD_ATA_COMMAND_PASS_THROUGH16) &&
7844 7848 (scsipkt->pkt_cdbp[2] & SATL_APT_BM_EXTEND))
7845 7849 extend = 1;
7846 7850
7847 7851 scsipkt->pkt_state |= STATE_ARQ_DONE;
7848 7852
7849 7853 /* update the residual count */
7850 7854 *(uchar_t *)&apt_sd->apt_status = STATUS_CHECK;
7851 7855 *(uchar_t *)&apt_sd->apt_rqpkt_status = STATUS_GOOD;
7852 7856 apt_sd->apt_rqpkt_reason = CMD_CMPLT;
7853 7857 apt_sd->apt_rqpkt_state = STATE_GOT_BUS | STATE_GOT_TARGET |
7854 7858 STATE_XFERRED_DATA | STATE_SENT_CMD | STATE_GOT_STATUS;
7855 7859 apt_sd->apt_rqpkt_resid = scsipkt->pkt_scblen -
7856 7860 sizeof (struct sata_apt_sense_data);
7857 7861
7858 7862 /*
7859 7863 * Fill in the Descriptor sense header
7860 7864 */
7861 7865 bzero(sds, sizeof (struct scsi_descr_sense_hdr));
7862 7866 sds->ds_code = CODE_FMT_DESCR_CURRENT;
7863 7867 sds->ds_class = CLASS_EXTENDED_SENSE;
7864 7868 sds->ds_key = sense_key & 0xf;
7865 7869 sds->ds_add_code = addl_sense_code;
7866 7870 sds->ds_qual_code = addl_sense_qual;
7867 7871 sds->ds_addl_sense_length =
7868 7872 sizeof (struct scsi_ata_status_ret_sense_descr);
7869 7873
7870 7874 /*
7871 7875 * Fill in the ATA Return descriptor sense data
7872 7876 */
7873 7877 bzero(ata_ret_desc, sizeof (struct scsi_ata_status_ret_sense_descr));
7874 7878 ata_ret_desc->ars_descr_type = DESCR_ATA_STATUS_RETURN;
7875 7879 ata_ret_desc->ars_addl_length = 0xc;
7876 7880 ata_ret_desc->ars_error = scmd->satacmd_error_reg;
7877 7881 ata_ret_desc->ars_sec_count_lsb = scmd->satacmd_sec_count_lsb;
7878 7882 ata_ret_desc->ars_lba_low_lsb = scmd->satacmd_lba_low_lsb;
7879 7883 ata_ret_desc->ars_lba_mid_lsb = scmd->satacmd_lba_mid_lsb;
7880 7884 ata_ret_desc->ars_lba_high_lsb = scmd->satacmd_lba_high_lsb;
7881 7885 ata_ret_desc->ars_device = scmd->satacmd_device_reg;
7882 7886 ata_ret_desc->ars_status = scmd->satacmd_status_reg;
7883 7887
7884 7888 if (extend == 1) {
7885 7889 ata_ret_desc->ars_extend = 1;
7886 7890 ata_ret_desc->ars_sec_count_msb = scmd->satacmd_sec_count_msb;
7887 7891 ata_ret_desc->ars_lba_low_msb = scmd->satacmd_lba_low_msb;
7888 7892 ata_ret_desc->ars_lba_mid_msb = scmd->satacmd_lba_mid_msb;
7889 7893 ata_ret_desc->ars_lba_high_msb = scmd->satacmd_lba_high_msb;
7890 7894 } else {
7891 7895 ata_ret_desc->ars_extend = 0;
7892 7896 ata_ret_desc->ars_sec_count_msb = 0;
7893 7897 ata_ret_desc->ars_lba_low_msb = 0;
7894 7898 ata_ret_desc->ars_lba_mid_msb = 0;
7895 7899 ata_ret_desc->ars_lba_high_msb = 0;
7896 7900 }
7897 7901 }
7898 7902
7899 7903 static void
7900 7904 sata_set_arq_data(sata_pkt_t *sata_pkt)
7901 7905 {
7902 7906 sata_pkt_txlate_t *spx =
7903 7907 (sata_pkt_txlate_t *)sata_pkt->satapkt_framework_private;
7904 7908 struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
7905 7909 struct scsi_extended_sense *sense;
7906 7910
7907 7911 scsipkt->pkt_state = STATE_GOT_BUS | STATE_GOT_TARGET |
7908 7912 STATE_SENT_CMD | STATE_GOT_STATUS;
7909 7913 if (sata_pkt->satapkt_reason == SATA_PKT_COMPLETED) {
7910 7914 /* Normal completion */
7911 7915 scsipkt->pkt_reason = CMD_CMPLT;
7912 7916 *scsipkt->pkt_scbp = STATUS_GOOD;
7913 7917 } else {
7914 7918 /* Something went wrong */
7915 7919 scsipkt->pkt_reason = CMD_INCOMPLETE;
7916 7920 *scsipkt->pkt_scbp = STATUS_CHECK;
7917 7921 sense = sata_arq_sense(spx);
7918 7922 switch (sata_pkt->satapkt_reason) {
7919 7923 case SATA_PKT_PORT_ERROR:
7920 7924 /*
7921 7925 * We have no device data. Assume no data transfered.
7922 7926 */
7923 7927 sense->es_key = KEY_HARDWARE_ERROR;
7924 7928 break;
7925 7929
7926 7930 case SATA_PKT_DEV_ERROR:
7927 7931 if (sata_pkt->satapkt_cmd.satacmd_status_reg &
7928 7932 SATA_STATUS_ERR) {
7929 7933 /*
7930 7934 * determine dev error reason from error
7931 7935 * reg content
7932 7936 */
7933 7937 sata_decode_device_error(spx, sense);
7934 7938 break;
7935 7939 }
7936 7940 /* No extended sense key - no info available */
7937 7941 break;
7938 7942
7939 7943 case SATA_PKT_TIMEOUT:
7940 7944 scsipkt->pkt_reason = CMD_TIMEOUT;
7941 7945 scsipkt->pkt_statistics |=
7942 7946 STAT_TIMEOUT | STAT_DEV_RESET;
7943 7947 /* No extended sense key ? */
7944 7948 break;
7945 7949
7946 7950 case SATA_PKT_ABORTED:
7947 7951 scsipkt->pkt_reason = CMD_ABORTED;
7948 7952 scsipkt->pkt_statistics |= STAT_ABORTED;
7949 7953 /* No extended sense key ? */
7950 7954 break;
7951 7955
7952 7956 case SATA_PKT_RESET:
7953 7957 /* pkt aborted by an explicit reset from a host */
7954 7958 scsipkt->pkt_reason = CMD_RESET;
7955 7959 scsipkt->pkt_statistics |= STAT_DEV_RESET;
7956 7960 break;
7957 7961
7958 7962 default:
7959 7963 SATA_LOG_D((spx->txlt_sata_hba_inst, CE_WARN,
7960 7964 "sata_txlt_nodata_cmd_completion: "
7961 7965 "invalid packet completion reason %d",
7962 7966 sata_pkt->satapkt_reason));
7963 7967 scsipkt->pkt_reason = CMD_TRAN_ERR;
7964 7968 break;
7965 7969 }
7966 7970
7967 7971 }
7968 7972 SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
7969 7973 "Scsi_pkt completion reason %x\n", scsipkt->pkt_reason);
7970 7974 }
7971 7975
7972 7976
7973 7977 /*
7974 7978 * Build Mode sense R/W recovery page
7975 7979 * NOT IMPLEMENTED
7976 7980 */
7977 7981
7978 7982 static int
7979 7983 sata_build_msense_page_1(sata_drive_info_t *sdinfo, int pcntrl, uint8_t *buf)
7980 7984 {
7981 7985 #ifndef __lock_lint
7982 7986 _NOTE(ARGUNUSED(sdinfo))
7983 7987 _NOTE(ARGUNUSED(pcntrl))
7984 7988 _NOTE(ARGUNUSED(buf))
7985 7989 #endif
7986 7990 return (0);
7987 7991 }
7988 7992
7989 7993 /*
7990 7994 * Build Mode sense caching page - scsi-3 implementation.
7991 7995 * Page length distinguishes previous format from scsi-3 format.
7992 7996 * buf must have space for 0x12 bytes.
7993 7997 * Only DRA (disable read ahead ) and WCE (write cache enable) are changeable.
7994 7998 *
7995 7999 */
7996 8000 static int
7997 8001 sata_build_msense_page_8(sata_drive_info_t *sdinfo, int pcntrl, uint8_t *buf)
7998 8002 {
7999 8003 struct mode_cache_scsi3 *page = (struct mode_cache_scsi3 *)buf;
8000 8004 sata_id_t *sata_id = &sdinfo->satadrv_id;
8001 8005
8002 8006 /*
8003 8007 * Most of the fields are set to 0, being not supported and/or disabled
8004 8008 */
8005 8009 bzero(buf, PAGELENGTH_DAD_MODE_CACHE_SCSI3);
8006 8010
8007 8011 /* Saved paramters not supported */
8008 8012 if (pcntrl == 3)
8009 8013 return (0);
8010 8014 if (pcntrl == 0 || pcntrl == 2) {
8011 8015 /*
8012 8016 * For now treat current and default parameters as same
8013 8017 * That may have to change, if target driver will complain
8014 8018 */
8015 8019 page->mode_page.code = MODEPAGE_CACHING; /* PS = 0 */
8016 8020 page->mode_page.length = PAGELENGTH_DAD_MODE_CACHE_SCSI3;
8017 8021
8018 8022 if (SATA_READ_AHEAD_SUPPORTED(*sata_id) &&
8019 8023 !SATA_READ_AHEAD_ENABLED(*sata_id)) {
8020 8024 page->dra = 1; /* Read Ahead disabled */
8021 8025 page->rcd = 1; /* Read Cache disabled */
8022 8026 }
8023 8027 if (SATA_WRITE_CACHE_SUPPORTED(*sata_id) &&
8024 8028 SATA_WRITE_CACHE_ENABLED(*sata_id))
8025 8029 page->wce = 1; /* Write Cache enabled */
8026 8030 } else {
8027 8031 /* Changeable parameters */
8028 8032 page->mode_page.code = MODEPAGE_CACHING;
8029 8033 page->mode_page.length = PAGELENGTH_DAD_MODE_CACHE_SCSI3;
8030 8034 if (SATA_READ_AHEAD_SUPPORTED(*sata_id)) {
8031 8035 page->dra = 1;
8032 8036 page->rcd = 1;
8033 8037 }
8034 8038 if (SATA_WRITE_CACHE_SUPPORTED(*sata_id))
8035 8039 page->wce = 1;
8036 8040 }
8037 8041 return (PAGELENGTH_DAD_MODE_CACHE_SCSI3 +
8038 8042 sizeof (struct mode_page));
8039 8043 }
8040 8044
8041 8045 /*
8042 8046 * Build Mode sense exception cntrl page
8043 8047 */
8044 8048 static int
8045 8049 sata_build_msense_page_1c(sata_drive_info_t *sdinfo, int pcntrl, uint8_t *buf)
8046 8050 {
8047 8051 struct mode_info_excpt_page *page = (struct mode_info_excpt_page *)buf;
8048 8052 sata_id_t *sata_id = &sdinfo->satadrv_id;
8049 8053
8050 8054 /*
8051 8055 * Most of the fields are set to 0, being not supported and/or disabled
8052 8056 */
8053 8057 bzero(buf, PAGELENGTH_INFO_EXCPT);
8054 8058
8055 8059 page->mode_page.code = MODEPAGE_INFO_EXCPT;
8056 8060 page->mode_page.length = PAGELENGTH_INFO_EXCPT;
8057 8061
8058 8062 /* Indicate that this is page is saveable */
8059 8063 page->mode_page.ps = 1;
8060 8064
8061 8065 /*
8062 8066 * We will return the same data for default, current and saved page.
8063 8067 * The only changeable bit is dexcpt and that bit is required
8064 8068 * by the ATA specification to be preserved across power cycles.
8065 8069 */
8066 8070 if (pcntrl != 1) {
8067 8071 page->dexcpt = !(sata_id->ai_features85 & SATA_SMART_SUPPORTED);
8068 8072 page->mrie = MRIE_ONLY_ON_REQUEST;
8069 8073 }
8070 8074 else
8071 8075 page->dexcpt = 1; /* Only changeable parameter */
8072 8076
8073 8077 return (PAGELENGTH_INFO_EXCPT + sizeof (struct mode_page));
8074 8078 }
8075 8079
8076 8080
8077 8081 static int
8078 8082 sata_build_msense_page_30(sata_drive_info_t *sdinfo, int pcntrl, uint8_t *buf)
8079 8083 {
8080 8084 struct mode_acoustic_management *page =
8081 8085 (struct mode_acoustic_management *)buf;
8082 8086 sata_id_t *sata_id = &sdinfo->satadrv_id;
8083 8087
8084 8088 /*
8085 8089 * Most of the fields are set to 0, being not supported and/or disabled
8086 8090 */
8087 8091 bzero(buf, PAGELENGTH_DAD_MODE_ACOUSTIC_MANAGEMENT);
8088 8092
8089 8093 switch (pcntrl) {
8090 8094 case P_CNTRL_DEFAULT:
8091 8095 /* default paramters not supported */
8092 8096 return (0);
8093 8097
8094 8098 case P_CNTRL_CURRENT:
8095 8099 case P_CNTRL_SAVED:
8096 8100 /* Saved and current are supported and are identical */
8097 8101 page->mode_page.code = MODEPAGE_ACOUSTIC_MANAG;
8098 8102 page->mode_page.length =
8099 8103 PAGELENGTH_DAD_MODE_ACOUSTIC_MANAGEMENT;
8100 8104 page->mode_page.ps = 1;
8101 8105
8102 8106 /* Word 83 indicates if feature is supported */
8103 8107 /* If feature is not supported */
8104 8108 if (!(sata_id->ai_cmdset83 & SATA_ACOUSTIC_MGMT)) {
8105 8109 page->acoustic_manag_enable =
8106 8110 ACOUSTIC_DISABLED;
8107 8111 } else {
8108 8112 page->acoustic_manag_enable =
8109 8113 ((sata_id->ai_features86 & SATA_ACOUSTIC_MGMT)
8110 8114 != 0);
8111 8115 /* Word 94 inidicates the value */
8112 8116 #ifdef _LITTLE_ENDIAN
8113 8117 page->acoustic_manag_level =
8114 8118 (uchar_t)sata_id->ai_acoustic;
8115 8119 page->vendor_recommended_value =
8116 8120 sata_id->ai_acoustic >> 8;
8117 8121 #else
8118 8122 page->acoustic_manag_level =
8119 8123 sata_id->ai_acoustic >> 8;
8120 8124 page->vendor_recommended_value =
8121 8125 (uchar_t)sata_id->ai_acoustic;
8122 8126 #endif
8123 8127 }
8124 8128 break;
8125 8129
8126 8130 case P_CNTRL_CHANGEABLE:
8127 8131 page->mode_page.code = MODEPAGE_ACOUSTIC_MANAG;
8128 8132 page->mode_page.length =
8129 8133 PAGELENGTH_DAD_MODE_ACOUSTIC_MANAGEMENT;
8130 8134 page->mode_page.ps = 1;
8131 8135
8132 8136 /* Word 83 indicates if the feature is supported */
8133 8137 if (sata_id->ai_cmdset83 & SATA_ACOUSTIC_MGMT) {
8134 8138 page->acoustic_manag_enable =
8135 8139 ACOUSTIC_ENABLED;
8136 8140 page->acoustic_manag_level = 0xff;
8137 8141 }
8138 8142 break;
8139 8143 }
8140 8144 return (PAGELENGTH_DAD_MODE_ACOUSTIC_MANAGEMENT +
8141 8145 sizeof (struct mode_page));
8142 8146 }
8143 8147
8144 8148
8145 8149 /*
8146 8150 * Build Mode sense power condition page.
8147 8151 */
8148 8152 static int
8149 8153 sata_build_msense_page_1a(sata_drive_info_t *sdinfo, int pcntrl, uint8_t *buf)
8150 8154 {
8151 8155 struct mode_info_power_cond *page = (struct mode_info_power_cond *)buf;
8152 8156 sata_id_t *sata_id = &sdinfo->satadrv_id;
8153 8157
8154 8158 /*
8155 8159 * Most of the fields are set to 0, being not supported and/or disabled
8156 8160 * power condition page length was 0x0a
8157 8161 */
8158 8162 bzero(buf, sizeof (struct mode_info_power_cond));
8159 8163
8160 8164 if (pcntrl == P_CNTRL_DEFAULT) {
8161 8165 /* default paramters not supported */
8162 8166 return (0);
8163 8167 }
8164 8168
8165 8169 page->mode_page.code = MODEPAGE_POWER_COND;
8166 8170 page->mode_page.length = sizeof (struct mode_info_power_cond);
8167 8171
8168 8172 if (sata_id->ai_cap & SATA_STANDBYTIMER) {
8169 8173 page->standby = 1;
8170 8174 bcopy(sdinfo->satadrv_standby_timer, page->standby_cond_timer,
8171 8175 sizeof (uchar_t) * 4);
8172 8176 }
8173 8177
8174 8178 return (sizeof (struct mode_info_power_cond));
8175 8179 }
8176 8180
8177 8181 /*
8178 8182 * Process mode select caching page 8 (scsi3 format only).
8179 8183 * Read Ahead (same as read cache) and Write Cache may be turned on and off
8180 8184 * if these features are supported by the device. If these features are not
8181 8185 * supported, the command will be terminated with STATUS_CHECK.
8182 8186 * This function fails only if the SET FEATURE command sent to
8183 8187 * the device fails. The page format is not verified, assuming that the
8184 8188 * target driver operates correctly - if parameters length is too short,
8185 8189 * we just drop the page.
8186 8190 * Two command may be sent if both Read Cache/Read Ahead and Write Cache
8187 8191 * setting have to be changed.
8188 8192 * SET FEATURE command is executed synchronously, i.e. we wait here until
8189 8193 * it is completed, regardless of the scsi pkt directives.
8190 8194 *
8191 8195 * Note: Mode Select Caching page RCD and DRA bits are tied together, i.e.
8192 8196 * changing DRA will change RCD.
8193 8197 *
8194 8198 * More than one SATA command may be executed to perform operations specified
8195 8199 * by mode select pages. The first error terminates further execution.
8196 8200 * Operations performed successully are not backed-up in such case.
8197 8201 *
8198 8202 * Return SATA_SUCCESS if operation succeeded, SATA_FAILURE otherwise.
8199 8203 * If operation resulted in changing device setup, dmod flag should be set to
8200 8204 * one (1). If parameters were not changed, dmod flag should be set to 0.
8201 8205 * Upon return, if operation required sending command to the device, the rval
8202 8206 * should be set to the value returned by sata_hba_start. If operation
8203 8207 * did not require device access, rval should be set to TRAN_ACCEPT.
8204 8208 * The pagelen should be set to the length of the page.
8205 8209 *
8206 8210 * This function has to be called with a port mutex held.
8207 8211 *
8208 8212 * Returns SATA_SUCCESS if operation was successful, SATA_FAILURE otherwise.
8209 8213 */
8210 8214 int
8211 8215 sata_mode_select_page_8(sata_pkt_txlate_t *spx, struct mode_cache_scsi3 *page,
8212 8216 int parmlen, int *pagelen, int *rval, int *dmod)
8213 8217 {
8214 8218 struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
8215 8219 sata_drive_info_t *sdinfo;
8216 8220 sata_cmd_t *scmd = &spx->txlt_sata_pkt->satapkt_cmd;
8217 8221 sata_id_t *sata_id;
8218 8222 struct scsi_extended_sense *sense;
8219 8223 int wce, dra; /* Current settings */
8220 8224
8221 8225 sdinfo = sata_get_device_info(spx->txlt_sata_hba_inst,
8222 8226 &spx->txlt_sata_pkt->satapkt_device);
8223 8227 sata_id = &sdinfo->satadrv_id;
8224 8228 *dmod = 0;
8225 8229
8226 8230 /* Verify parameters length. If too short, drop it */
8227 8231 if ((PAGELENGTH_DAD_MODE_CACHE_SCSI3 +
8228 8232 sizeof (struct mode_page)) > parmlen) {
8229 8233 *scsipkt->pkt_scbp = STATUS_CHECK;
8230 8234 sense = sata_arq_sense(spx);
8231 8235 sense->es_key = KEY_ILLEGAL_REQUEST;
8232 8236 sense->es_add_code = SD_SCSI_ASC_INVALID_FIELD_IN_PARAMS_LIST;
8233 8237 *pagelen = parmlen;
8234 8238 *rval = TRAN_ACCEPT;
8235 8239 return (SATA_FAILURE);
8236 8240 }
8237 8241
8238 8242 *pagelen = PAGELENGTH_DAD_MODE_CACHE_SCSI3 + sizeof (struct mode_page);
8239 8243
8240 8244 /* Current setting of Read Ahead (and Read Cache) */
8241 8245 if (SATA_READ_AHEAD_ENABLED(*sata_id))
8242 8246 dra = 0; /* 0 == not disabled */
8243 8247 else
8244 8248 dra = 1;
8245 8249 /* Current setting of Write Cache */
8246 8250 if (SATA_WRITE_CACHE_ENABLED(*sata_id))
8247 8251 wce = 1;
8248 8252 else
8249 8253 wce = 0;
8250 8254
8251 8255 if (page->dra == dra && page->wce == wce && page->rcd == dra) {
8252 8256 /* nothing to do */
8253 8257 *rval = TRAN_ACCEPT;
8254 8258 return (SATA_SUCCESS);
8255 8259 }
8256 8260
8257 8261 /*
8258 8262 * Need to flip some setting
8259 8263 * Set-up Internal SET FEATURES command(s)
8260 8264 */
8261 8265 scmd->satacmd_flags.sata_data_direction = SATA_DIR_NODATA_XFER;
8262 8266 scmd->satacmd_addr_type = 0;
8263 8267 scmd->satacmd_device_reg = 0;
8264 8268 scmd->satacmd_status_reg = 0;
8265 8269 scmd->satacmd_error_reg = 0;
8266 8270 scmd->satacmd_cmd_reg = SATAC_SET_FEATURES;
8267 8271 if (page->dra != dra || page->rcd != dra) {
8268 8272 if (SATA_READ_AHEAD_SUPPORTED(*sata_id)) {
8269 8273 /* Need to flip read ahead setting */
8270 8274 if (dra == 0)
8271 8275 /* Disable read ahead / read cache */
8272 8276 scmd->satacmd_features_reg =
8273 8277 SATAC_SF_DISABLE_READ_AHEAD;
8274 8278 else
8275 8279 /* Enable read ahead / read cache */
8276 8280 scmd->satacmd_features_reg =
8277 8281 SATAC_SF_ENABLE_READ_AHEAD;
8278 8282
8279 8283 /* Transfer command to HBA */
8280 8284 if (sata_hba_start(spx, rval) != 0)
8281 8285 /*
8282 8286 * Pkt not accepted for execution.
8283 8287 */
8284 8288 return (SATA_FAILURE);
8285 8289
8286 8290 *dmod = 1;
8287 8291
8288 8292 /* Now process return */
8289 8293 if (spx->txlt_sata_pkt->satapkt_reason !=
8290 8294 SATA_PKT_COMPLETED) {
8291 8295 goto failure; /* Terminate */
8292 8296 }
8293 8297 } else {
8294 8298 *scsipkt->pkt_scbp = STATUS_CHECK;
8295 8299 sense = sata_arq_sense(spx);
8296 8300 sense->es_key = KEY_ILLEGAL_REQUEST;
8297 8301 sense->es_add_code =
8298 8302 SD_SCSI_ASC_INVALID_FIELD_IN_PARAMS_LIST;
8299 8303 *pagelen = parmlen;
8300 8304 *rval = TRAN_ACCEPT;
8301 8305 return (SATA_FAILURE);
8302 8306 }
8303 8307 }
8304 8308
8305 8309 /* Note that the packet is not removed, so it could be re-used */
8306 8310 if (page->wce != wce) {
8307 8311 if (SATA_WRITE_CACHE_SUPPORTED(*sata_id)) {
8308 8312 /* Need to flip Write Cache setting */
8309 8313 if (page->wce == 1)
8310 8314 /* Enable write cache */
8311 8315 scmd->satacmd_features_reg =
8312 8316 SATAC_SF_ENABLE_WRITE_CACHE;
8313 8317 else
8314 8318 /* Disable write cache */
8315 8319 scmd->satacmd_features_reg =
8316 8320 SATAC_SF_DISABLE_WRITE_CACHE;
8317 8321
8318 8322 /* Transfer command to HBA */
8319 8323 if (sata_hba_start(spx, rval) != 0)
8320 8324 /*
8321 8325 * Pkt not accepted for execution.
8322 8326 */
8323 8327 return (SATA_FAILURE);
8324 8328
8325 8329 *dmod = 1;
8326 8330
8327 8331 /* Now process return */
8328 8332 if (spx->txlt_sata_pkt->satapkt_reason !=
8329 8333 SATA_PKT_COMPLETED) {
8330 8334 goto failure;
8331 8335 }
8332 8336 } else {
8333 8337 *scsipkt->pkt_scbp = STATUS_CHECK;
8334 8338 sense = sata_arq_sense(spx);
8335 8339 sense->es_key = KEY_ILLEGAL_REQUEST;
8336 8340 sense->es_add_code =
8337 8341 SD_SCSI_ASC_INVALID_FIELD_IN_PARAMS_LIST;
8338 8342 *pagelen = parmlen;
8339 8343 *rval = TRAN_ACCEPT;
8340 8344 return (SATA_FAILURE);
8341 8345 }
8342 8346 }
8343 8347 return (SATA_SUCCESS);
8344 8348
8345 8349 failure:
8346 8350 sata_xlate_errors(spx);
8347 8351
8348 8352 return (SATA_FAILURE);
8349 8353 }
8350 8354
8351 8355 /*
8352 8356 * Process mode select informational exceptions control page 0x1c
8353 8357 *
8354 8358 * The only changeable bit is dexcpt (disable exceptions).
8355 8359 * MRIE (method of reporting informational exceptions) must be
8356 8360 * "only on request".
8357 8361 * This page applies to informational exceptions that report
8358 8362 * additional sense codes with the ADDITIONAL SENSE CODE field set to 5Dh
8359 8363 * (e.g.,FAILURE PREDICTION THRESHOLD EXCEEDED) or 0Bh (e.g., WARNING_).
8360 8364 * Informational exception conditions occur as the result of background scan
8361 8365 * errors, background self-test errors, or vendor specific events within a
8362 8366 * logical unit. An informational exception condition may occur asynchronous
8363 8367 * to any commands.
8364 8368 *
8365 8369 * Returns: SATA_SUCCESS if operation succeeded, SATA_FAILURE otherwise.
8366 8370 * If operation resulted in changing device setup, dmod flag should be set to
8367 8371 * one (1). If parameters were not changed, dmod flag should be set to 0.
8368 8372 * Upon return, if operation required sending command to the device, the rval
8369 8373 * should be set to the value returned by sata_hba_start. If operation
8370 8374 * did not require device access, rval should be set to TRAN_ACCEPT.
8371 8375 * The pagelen should be set to the length of the page.
8372 8376 *
8373 8377 * This function has to be called with a port mutex held.
8374 8378 *
8375 8379 * Returns SATA_SUCCESS if operation was successful, SATA_FAILURE otherwise.
8376 8380 *
8377 8381 * Cannot be called in the interrupt context.
8378 8382 */
8379 8383 static int
8380 8384 sata_mode_select_page_1c(
8381 8385 sata_pkt_txlate_t *spx,
8382 8386 struct mode_info_excpt_page *page,
8383 8387 int parmlen,
8384 8388 int *pagelen,
8385 8389 int *rval,
8386 8390 int *dmod)
8387 8391 {
8388 8392 struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
8389 8393 sata_cmd_t *scmd = &spx->txlt_sata_pkt->satapkt_cmd;
8390 8394 sata_drive_info_t *sdinfo;
8391 8395 sata_id_t *sata_id;
8392 8396 struct scsi_extended_sense *sense;
8393 8397
8394 8398 sdinfo = sata_get_device_info(spx->txlt_sata_hba_inst,
8395 8399 &spx->txlt_sata_pkt->satapkt_device);
8396 8400 sata_id = &sdinfo->satadrv_id;
8397 8401
8398 8402 *dmod = 0;
8399 8403
8400 8404 /* Verify parameters length. If too short, drop it */
8401 8405 if (((PAGELENGTH_INFO_EXCPT + sizeof (struct mode_page)) > parmlen) ||
8402 8406 page->perf || page->test || (page->mrie != MRIE_ONLY_ON_REQUEST)) {
8403 8407 *scsipkt->pkt_scbp = STATUS_CHECK;
8404 8408 sense = sata_arq_sense(spx);
8405 8409 sense->es_key = KEY_ILLEGAL_REQUEST;
8406 8410 sense->es_add_code = SD_SCSI_ASC_INVALID_FIELD_IN_PARAMS_LIST;
8407 8411 *pagelen = parmlen;
8408 8412 *rval = TRAN_ACCEPT;
8409 8413 return (SATA_FAILURE);
8410 8414 }
8411 8415
8412 8416 *pagelen = PAGELENGTH_INFO_EXCPT + sizeof (struct mode_page);
8413 8417
8414 8418 if (! (sata_id->ai_cmdset82 & SATA_SMART_SUPPORTED)) {
8415 8419 *scsipkt->pkt_scbp = STATUS_CHECK;
8416 8420 sense = sata_arq_sense(spx);
8417 8421 sense->es_key = KEY_ILLEGAL_REQUEST;
8418 8422 sense->es_add_code = SD_SCSI_ASC_INVALID_FIELD_IN_CDB;
8419 8423 *pagelen = parmlen;
8420 8424 *rval = TRAN_ACCEPT;
8421 8425 return (SATA_FAILURE);
8422 8426 }
8423 8427
8424 8428 /* If already in the state requested, we are done */
8425 8429 if (page->dexcpt == ! (sata_id->ai_features85 & SATA_SMART_ENABLED)) {
8426 8430 /* nothing to do */
8427 8431 *rval = TRAN_ACCEPT;
8428 8432 return (SATA_SUCCESS);
8429 8433 }
8430 8434
8431 8435 scmd->satacmd_flags.sata_data_direction = SATA_DIR_NODATA_XFER;
8432 8436
8433 8437 /* Build SMART_ENABLE or SMART_DISABLE command */
8434 8438 scmd->satacmd_addr_type = 0; /* N/A */
8435 8439 scmd->satacmd_lba_mid_lsb = SMART_MAGIC_VAL_1;
8436 8440 scmd->satacmd_lba_high_lsb = SMART_MAGIC_VAL_2;
8437 8441 scmd->satacmd_features_reg = page->dexcpt ?
8438 8442 SATA_SMART_DISABLE_OPS : SATA_SMART_ENABLE_OPS;
8439 8443 scmd->satacmd_device_reg = 0; /* Always device 0 */
8440 8444 scmd->satacmd_cmd_reg = SATAC_SMART;
8441 8445
8442 8446 /* Transfer command to HBA */
8443 8447 if (sata_hba_start(spx, rval) != 0)
8444 8448 /*
8445 8449 * Pkt not accepted for execution.
8446 8450 */
8447 8451 return (SATA_FAILURE);
8448 8452
8449 8453 *dmod = 1; /* At least may have been modified */
8450 8454
8451 8455 /* Now process return */
8452 8456 if (spx->txlt_sata_pkt->satapkt_reason == SATA_PKT_COMPLETED)
8453 8457 return (SATA_SUCCESS);
8454 8458
8455 8459 /* Packet did not complete successfully */
8456 8460 sata_xlate_errors(spx);
8457 8461
8458 8462 return (SATA_FAILURE);
8459 8463 }
8460 8464
8461 8465 /*
8462 8466 * Process mode select acoustic management control page 0x30
8463 8467 *
8464 8468 *
8465 8469 * This function has to be called with a port mutex held.
8466 8470 *
8467 8471 * Returns SATA_SUCCESS if operation was successful, SATA_FAILURE otherwise.
8468 8472 *
8469 8473 * Cannot be called in the interrupt context.
8470 8474 */
8471 8475 int
8472 8476 sata_mode_select_page_30(sata_pkt_txlate_t *spx, struct
8473 8477 mode_acoustic_management *page, int parmlen, int *pagelen,
8474 8478 int *rval, int *dmod)
8475 8479 {
8476 8480 struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
8477 8481 sata_drive_info_t *sdinfo;
8478 8482 sata_cmd_t *scmd = &spx->txlt_sata_pkt->satapkt_cmd;
8479 8483 sata_id_t *sata_id;
8480 8484 struct scsi_extended_sense *sense;
8481 8485
8482 8486 sdinfo = sata_get_device_info(spx->txlt_sata_hba_inst,
8483 8487 &spx->txlt_sata_pkt->satapkt_device);
8484 8488 sata_id = &sdinfo->satadrv_id;
8485 8489 *dmod = 0;
8486 8490
8487 8491 /* If parmlen is too short or the feature is not supported, drop it */
8488 8492 if (((PAGELENGTH_DAD_MODE_ACOUSTIC_MANAGEMENT +
8489 8493 sizeof (struct mode_page)) > parmlen) ||
8490 8494 (! (sata_id->ai_cmdset83 & SATA_ACOUSTIC_MGMT))) {
8491 8495 *scsipkt->pkt_scbp = STATUS_CHECK;
8492 8496 sense = sata_arq_sense(spx);
8493 8497 sense->es_key = KEY_ILLEGAL_REQUEST;
8494 8498 sense->es_add_code = SD_SCSI_ASC_INVALID_FIELD_IN_PARAMS_LIST;
8495 8499 *pagelen = parmlen;
8496 8500 *rval = TRAN_ACCEPT;
8497 8501 return (SATA_FAILURE);
8498 8502 }
8499 8503
8500 8504 *pagelen = PAGELENGTH_DAD_MODE_ACOUSTIC_MANAGEMENT +
8501 8505 sizeof (struct mode_page);
8502 8506
8503 8507 /*
8504 8508 * We can enable and disable acoustice management and
8505 8509 * set the acoustic management level.
8506 8510 */
8507 8511
8508 8512 /*
8509 8513 * Set-up Internal SET FEATURES command(s)
8510 8514 */
8511 8515 scmd->satacmd_flags.sata_data_direction = SATA_DIR_NODATA_XFER;
8512 8516 scmd->satacmd_addr_type = 0;
8513 8517 scmd->satacmd_device_reg = 0;
8514 8518 scmd->satacmd_status_reg = 0;
8515 8519 scmd->satacmd_error_reg = 0;
8516 8520 scmd->satacmd_cmd_reg = SATAC_SET_FEATURES;
8517 8521 if (page->acoustic_manag_enable) {
8518 8522 scmd->satacmd_features_reg = SATAC_SF_ENABLE_ACOUSTIC;
8519 8523 scmd->satacmd_sec_count_lsb = page->acoustic_manag_level;
8520 8524 } else { /* disabling acoustic management */
8521 8525 scmd->satacmd_features_reg = SATAC_SF_DISABLE_ACOUSTIC;
8522 8526 }
8523 8527
8524 8528 /* Transfer command to HBA */
8525 8529 if (sata_hba_start(spx, rval) != 0)
8526 8530 /*
8527 8531 * Pkt not accepted for execution.
8528 8532 */
8529 8533 return (SATA_FAILURE);
8530 8534
8531 8535 /* Now process return */
8532 8536 if (spx->txlt_sata_pkt->satapkt_reason != SATA_PKT_COMPLETED) {
8533 8537 sata_xlate_errors(spx);
8534 8538 return (SATA_FAILURE);
8535 8539 }
8536 8540
8537 8541 *dmod = 1;
8538 8542
8539 8543 return (SATA_SUCCESS);
8540 8544 }
8541 8545
8542 8546 /*
8543 8547 * Process mode select power condition page 0x1a
8544 8548 *
8545 8549 * This function has to be called with a port mutex held.
8546 8550 *
8547 8551 * Returns SATA_SUCCESS if operation was successful, SATA_FAILURE otherwise.
8548 8552 *
8549 8553 * Cannot be called in the interrupt context.
8550 8554 */
8551 8555 int
8552 8556 sata_mode_select_page_1a(sata_pkt_txlate_t *spx, struct
8553 8557 mode_info_power_cond *page, int parmlen, int *pagelen,
8554 8558 int *rval, int *dmod)
8555 8559 {
8556 8560 struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
8557 8561 sata_drive_info_t *sdinfo;
8558 8562 sata_cmd_t *scmd = &spx->txlt_sata_pkt->satapkt_cmd;
8559 8563 sata_id_t *sata_id;
8560 8564 struct scsi_extended_sense *sense;
8561 8565 uint8_t ata_count;
8562 8566 int i, len;
8563 8567
8564 8568 sdinfo = sata_get_device_info(spx->txlt_sata_hba_inst,
8565 8569 &spx->txlt_sata_pkt->satapkt_device);
8566 8570 sata_id = &sdinfo->satadrv_id;
8567 8571 *dmod = 0;
8568 8572
8569 8573 len = sizeof (struct mode_info_power_cond);
8570 8574 len += sizeof (struct mode_page);
8571 8575
8572 8576 /* If parmlen is too short or the feature is not supported, drop it */
8573 8577 if ((len < parmlen) || (page->idle == 1) ||
8574 8578 (!(sata_id->ai_cap & SATA_STANDBYTIMER) && page->standby == 1)) {
8575 8579 *scsipkt->pkt_scbp = STATUS_CHECK;
8576 8580 sense = sata_arq_sense(spx);
8577 8581 sense->es_key = KEY_ILLEGAL_REQUEST;
8578 8582 sense->es_add_code = SD_SCSI_ASC_INVALID_FIELD_IN_PARAMS_LIST;
8579 8583 *pagelen = parmlen;
8580 8584 *rval = TRAN_ACCEPT;
8581 8585 return (SATA_FAILURE);
8582 8586 }
8583 8587
8584 8588 *pagelen = len;
8585 8589
8586 8590 /*
8587 8591 * Set-up Internal STANDBY command(s)
8588 8592 */
8589 8593 if (page->standby == 0)
8590 8594 goto out;
8591 8595
8592 8596 ata_count = sata_get_standby_timer(page->standby_cond_timer);
8593 8597
8594 8598 scmd->satacmd_addr_type = 0;
8595 8599 scmd->satacmd_sec_count_lsb = ata_count;
8596 8600 scmd->satacmd_lba_low_lsb = 0;
8597 8601 scmd->satacmd_lba_mid_lsb = 0;
8598 8602 scmd->satacmd_lba_high_lsb = 0;
8599 8603 scmd->satacmd_features_reg = 0;
8600 8604 scmd->satacmd_device_reg = 0;
8601 8605 scmd->satacmd_status_reg = 0;
8602 8606 scmd->satacmd_cmd_reg = SATAC_STANDBY;
8603 8607 scmd->satacmd_flags.sata_special_regs = B_TRUE;
8604 8608 scmd->satacmd_flags.sata_copy_out_error_reg = B_TRUE;
8605 8609
8606 8610 /* Transfer command to HBA */
8607 8611 if (sata_hba_start(spx, rval) != 0) {
8608 8612 return (SATA_FAILURE);
8609 8613 } else {
8610 8614 if ((scmd->satacmd_error_reg != 0) ||
8611 8615 (spx->txlt_sata_pkt->satapkt_reason !=
8612 8616 SATA_PKT_COMPLETED)) {
8613 8617 sata_xlate_errors(spx);
8614 8618 return (SATA_FAILURE);
8615 8619 }
8616 8620 }
8617 8621
8618 8622 for (i = 0; i < 4; i++) {
8619 8623 sdinfo->satadrv_standby_timer[i] = page->standby_cond_timer[i];
8620 8624 }
8621 8625 out:
8622 8626 *dmod = 1;
8623 8627 return (SATA_SUCCESS);
8624 8628 }
8625 8629
8626 8630 /*
8627 8631 * sata_build_lsense_page0() is used to create the
8628 8632 * SCSI LOG SENSE page 0 (supported log pages)
8629 8633 *
8630 8634 * Currently supported pages are 0, 0x10, 0x2f, 0x30 and 0x0e
8631 8635 * (supported log pages, self-test results, informational exceptions
8632 8636 * Sun vendor specific ATA SMART data, and start stop cycle counter).
8633 8637 *
8634 8638 * Takes a sata_drive_info t * and the address of a buffer
8635 8639 * in which to create the page information.
8636 8640 *
8637 8641 * Returns the number of bytes valid in the buffer.
8638 8642 */
8639 8643 static int
8640 8644 sata_build_lsense_page_0(sata_drive_info_t *sdinfo, uint8_t *buf)
8641 8645 {
8642 8646 struct log_parameter *lpp = (struct log_parameter *)buf;
8643 8647 uint8_t *page_ptr = (uint8_t *)lpp->param_values;
8644 8648 int num_pages_supported = 1; /* Always have GET_SUPPORTED_LOG_PAGES */
8645 8649 sata_id_t *sata_id = &sdinfo->satadrv_id;
8646 8650
8647 8651 lpp->param_code[0] = 0;
8648 8652 lpp->param_code[1] = 0;
8649 8653 lpp->param_ctrl_flags = LOG_CTRL_LP | LOG_CTRL_LBIN;
8650 8654 *page_ptr++ = PAGE_CODE_GET_SUPPORTED_LOG_PAGES;
8651 8655
8652 8656 if (sata_id->ai_cmdset82 & SATA_SMART_SUPPORTED) {
8653 8657 if (sata_id->ai_cmdset84 & SATA_SMART_SELF_TEST_SUPPORTED) {
8654 8658 *page_ptr++ = PAGE_CODE_SELF_TEST_RESULTS;
8655 8659 ++num_pages_supported;
8656 8660 }
8657 8661 *page_ptr++ = PAGE_CODE_INFORMATION_EXCEPTIONS;
8658 8662 ++num_pages_supported;
8659 8663 *page_ptr++ = PAGE_CODE_SMART_READ_DATA;
8660 8664 ++num_pages_supported;
8661 8665 *page_ptr++ = PAGE_CODE_START_STOP_CYCLE_COUNTER;
8662 8666 ++num_pages_supported;
8663 8667 }
8664 8668
8665 8669 lpp->param_len = num_pages_supported;
8666 8670
8667 8671 return ((&lpp->param_values[0] - (uint8_t *)lpp) +
8668 8672 num_pages_supported);
8669 8673 }
8670 8674
8671 8675 /*
8672 8676 * sata_build_lsense_page_10() is used to create the
8673 8677 * SCSI LOG SENSE page 0x10 (self-test results)
8674 8678 *
8675 8679 * Takes a sata_drive_info t * and the address of a buffer
8676 8680 * in which to create the page information as well as a sata_hba_inst_t *.
8677 8681 *
8678 8682 * Returns the number of bytes valid in the buffer.
8679 8683 *
8680 8684 * Note: Self test and SMART data is accessible in device log pages.
8681 8685 * The log pages can be accessed by SMART READ/WRITE LOG (up to 255 sectors
8682 8686 * of data can be transferred by a single command), or by the General Purpose
8683 8687 * Logging commands (GPL) READ LOG EXT and WRITE LOG EXT (up to 65,535 sectors
8684 8688 * - approximately 33MB - can be transferred by a single command.
8685 8689 * The SCT Command response (either error or command) is the same for both
8686 8690 * the SMART and GPL methods of issuing commands.
8687 8691 * This function uses READ LOG EXT command when drive supports LBA48, and
8688 8692 * SMART READ command otherwise.
8689 8693 *
8690 8694 * Since above commands are executed in a synchronous mode, this function
8691 8695 * should not be called in an interrupt context.
8692 8696 */
8693 8697 static int
8694 8698 sata_build_lsense_page_10(
8695 8699 sata_drive_info_t *sdinfo,
8696 8700 uint8_t *buf,
8697 8701 sata_hba_inst_t *sata_hba_inst)
8698 8702 {
8699 8703 struct log_parameter *lpp = (struct log_parameter *)buf;
8700 8704 int rval;
8701 8705
8702 8706 if (sdinfo->satadrv_features_support & SATA_DEV_F_LBA48) {
8703 8707 struct smart_ext_selftest_log *ext_selftest_log;
8704 8708
8705 8709 ext_selftest_log = kmem_zalloc(
8706 8710 sizeof (struct smart_ext_selftest_log), KM_SLEEP);
8707 8711
8708 8712 rval = sata_ext_smart_selftest_read_log(sata_hba_inst, sdinfo,
8709 8713 ext_selftest_log, 0);
8710 8714 if (rval == 0) {
8711 8715 int index, start_index;
8712 8716 struct smart_ext_selftest_log_entry *entry;
8713 8717 static const struct smart_ext_selftest_log_entry empty =
8714 8718 {0};
8715 8719 uint16_t block_num;
8716 8720 int count;
8717 8721 boolean_t only_one_block = B_FALSE;
8718 8722
8719 8723 index = ext_selftest_log->
8720 8724 smart_ext_selftest_log_index[0];
8721 8725 index |= ext_selftest_log->
8722 8726 smart_ext_selftest_log_index[1] << 8;
8723 8727 if (index == 0)
8724 8728 goto out;
8725 8729
8726 8730 --index; /* Correct for 0 origin */
8727 8731 start_index = index; /* remember where we started */
8728 8732 block_num = index / ENTRIES_PER_EXT_SELFTEST_LOG_BLK;
8729 8733 if (block_num != 0) {
8730 8734 rval = sata_ext_smart_selftest_read_log(
8731 8735 sata_hba_inst, sdinfo, ext_selftest_log,
8732 8736 block_num);
8733 8737 if (rval != 0)
8734 8738 goto out;
8735 8739 }
8736 8740 index %= ENTRIES_PER_EXT_SELFTEST_LOG_BLK;
8737 8741 entry =
8738 8742 &ext_selftest_log->
8739 8743 smart_ext_selftest_log_entries[index];
8740 8744
8741 8745 for (count = 1;
8742 8746 count <= SCSI_ENTRIES_IN_LOG_SENSE_SELFTEST_RESULTS;
8743 8747 ++count) {
8744 8748 uint8_t status;
8745 8749 uint8_t code;
8746 8750 uint8_t sense_key;
8747 8751 uint8_t add_sense_code;
8748 8752 uint8_t add_sense_code_qual;
8749 8753
8750 8754 /* If this is an unused entry, we are done */
8751 8755 if (bcmp(entry, &empty, sizeof (empty)) == 0) {
8752 8756 /* Broken firmware on some disks */
8753 8757 if (index + 1 ==
8754 8758 ENTRIES_PER_EXT_SELFTEST_LOG_BLK) {
8755 8759 --entry;
8756 8760 --index;
8757 8761 if (bcmp(entry, &empty,
8758 8762 sizeof (empty)) == 0)
8759 8763 goto out;
8760 8764 } else
8761 8765 goto out;
8762 8766 }
8763 8767
8764 8768 if (only_one_block &&
8765 8769 start_index == index)
8766 8770 goto out;
8767 8771
8768 8772 lpp->param_code[0] = 0;
8769 8773 lpp->param_code[1] = count;
8770 8774 lpp->param_ctrl_flags =
8771 8775 LOG_CTRL_LP | LOG_CTRL_LBIN;
8772 8776 lpp->param_len =
8773 8777 SCSI_LOG_SENSE_SELFTEST_PARAM_LEN;
8774 8778
8775 8779 status = entry->smart_ext_selftest_log_status;
8776 8780 status >>= 4;
8777 8781 switch (status) {
8778 8782 case 0:
8779 8783 default:
8780 8784 sense_key = KEY_NO_SENSE;
8781 8785 add_sense_code =
8782 8786 SD_SCSI_ASC_NO_ADD_SENSE;
8783 8787 add_sense_code_qual = 0;
8784 8788 break;
8785 8789 case 1:
8786 8790 sense_key = KEY_ABORTED_COMMAND;
8787 8791 add_sense_code =
8788 8792 DIAGNOSTIC_FAILURE_ON_COMPONENT;
8789 8793 add_sense_code_qual = SCSI_COMPONENT_81;
8790 8794 break;
8791 8795 case 2:
8792 8796 sense_key = KEY_ABORTED_COMMAND;
8793 8797 add_sense_code =
8794 8798 DIAGNOSTIC_FAILURE_ON_COMPONENT;
8795 8799 add_sense_code_qual = SCSI_COMPONENT_82;
8796 8800 break;
8797 8801 case 3:
8798 8802 sense_key = KEY_ABORTED_COMMAND;
8799 8803 add_sense_code =
8800 8804 DIAGNOSTIC_FAILURE_ON_COMPONENT;
8801 8805 add_sense_code_qual = SCSI_COMPONENT_83;
8802 8806 break;
8803 8807 case 4:
8804 8808 sense_key = KEY_HARDWARE_ERROR;
8805 8809 add_sense_code =
8806 8810 DIAGNOSTIC_FAILURE_ON_COMPONENT;
8807 8811 add_sense_code_qual = SCSI_COMPONENT_84;
8808 8812 break;
8809 8813 case 5:
8810 8814 sense_key = KEY_HARDWARE_ERROR;
8811 8815 add_sense_code =
8812 8816 DIAGNOSTIC_FAILURE_ON_COMPONENT;
8813 8817 add_sense_code_qual = SCSI_COMPONENT_85;
8814 8818 break;
8815 8819 case 6:
8816 8820 sense_key = KEY_HARDWARE_ERROR;
8817 8821 add_sense_code =
8818 8822 DIAGNOSTIC_FAILURE_ON_COMPONENT;
8819 8823 add_sense_code_qual = SCSI_COMPONENT_86;
8820 8824 break;
8821 8825 case 7:
8822 8826 sense_key = KEY_MEDIUM_ERROR;
8823 8827 add_sense_code =
8824 8828 DIAGNOSTIC_FAILURE_ON_COMPONENT;
8825 8829 add_sense_code_qual = SCSI_COMPONENT_87;
8826 8830 break;
8827 8831 case 8:
8828 8832 sense_key = KEY_HARDWARE_ERROR;
8829 8833 add_sense_code =
8830 8834 DIAGNOSTIC_FAILURE_ON_COMPONENT;
8831 8835 add_sense_code_qual = SCSI_COMPONENT_88;
8832 8836 break;
8833 8837 }
8834 8838 code = 0; /* unspecified */
8835 8839 status |= (code << 4);
8836 8840 lpp->param_values[0] = status;
8837 8841 lpp->param_values[1] = 0; /* unspecified */
8838 8842 lpp->param_values[2] = entry->
8839 8843 smart_ext_selftest_log_timestamp[1];
8840 8844 lpp->param_values[3] = entry->
8841 8845 smart_ext_selftest_log_timestamp[0];
8842 8846 if (status != 0) {
8843 8847 lpp->param_values[4] = 0;
8844 8848 lpp->param_values[5] = 0;
8845 8849 lpp->param_values[6] = entry->
8846 8850 smart_ext_selftest_log_failing_lba
8847 8851 [5];
8848 8852 lpp->param_values[7] = entry->
8849 8853 smart_ext_selftest_log_failing_lba
8850 8854 [4];
8851 8855 lpp->param_values[8] = entry->
8852 8856 smart_ext_selftest_log_failing_lba
8853 8857 [3];
8854 8858 lpp->param_values[9] = entry->
8855 8859 smart_ext_selftest_log_failing_lba
8856 8860 [2];
8857 8861 lpp->param_values[10] = entry->
8858 8862 smart_ext_selftest_log_failing_lba
8859 8863 [1];
8860 8864 lpp->param_values[11] = entry->
8861 8865 smart_ext_selftest_log_failing_lba
8862 8866 [0];
8863 8867 } else { /* No bad block address */
8864 8868 lpp->param_values[4] = 0xff;
8865 8869 lpp->param_values[5] = 0xff;
8866 8870 lpp->param_values[6] = 0xff;
8867 8871 lpp->param_values[7] = 0xff;
8868 8872 lpp->param_values[8] = 0xff;
8869 8873 lpp->param_values[9] = 0xff;
8870 8874 lpp->param_values[10] = 0xff;
8871 8875 lpp->param_values[11] = 0xff;
8872 8876 }
8873 8877
8874 8878 lpp->param_values[12] = sense_key;
8875 8879 lpp->param_values[13] = add_sense_code;
8876 8880 lpp->param_values[14] = add_sense_code_qual;
8877 8881 lpp->param_values[15] = 0; /* undefined */
8878 8882
8879 8883 lpp = (struct log_parameter *)
8880 8884 (((uint8_t *)lpp) +
8881 8885 SCSI_LOG_PARAM_HDR_LEN +
8882 8886 SCSI_LOG_SENSE_SELFTEST_PARAM_LEN);
8883 8887
8884 8888 --index; /* Back up to previous entry */
8885 8889 if (index < 0) {
8886 8890 if (block_num > 0) {
8887 8891 --block_num;
8888 8892 } else {
8889 8893 struct read_log_ext_directory
8890 8894 logdir;
8891 8895
8892 8896 rval =
8893 8897 sata_read_log_ext_directory(
8894 8898 sata_hba_inst, sdinfo,
8895 8899 &logdir);
8896 8900 if (rval == -1)
8897 8901 goto out;
8898 8902 if ((logdir.read_log_ext_vers
8899 8903 [0] == 0) &&
8900 8904 (logdir.read_log_ext_vers
8901 8905 [1] == 0))
8902 8906 goto out;
8903 8907 block_num =
8904 8908 logdir.read_log_ext_nblks
8905 8909 [EXT_SMART_SELFTEST_LOG_PAGE
8906 8910 - 1][0];
8907 8911 block_num |= logdir.
8908 8912 read_log_ext_nblks
8909 8913 [EXT_SMART_SELFTEST_LOG_PAGE
8910 8914 - 1][1] << 8;
8911 8915 --block_num;
8912 8916 only_one_block =
8913 8917 (block_num == 0);
8914 8918 }
8915 8919 rval = sata_ext_smart_selftest_read_log(
8916 8920 sata_hba_inst, sdinfo,
8917 8921 ext_selftest_log, block_num);
8918 8922 if (rval != 0)
8919 8923 goto out;
8920 8924
8921 8925 index =
8922 8926 ENTRIES_PER_EXT_SELFTEST_LOG_BLK -
8923 8927 1;
8924 8928 }
8925 8929 index %= ENTRIES_PER_EXT_SELFTEST_LOG_BLK;
8926 8930 entry = &ext_selftest_log->
8927 8931 smart_ext_selftest_log_entries[index];
8928 8932 }
8929 8933 }
8930 8934 out:
8931 8935 kmem_free(ext_selftest_log,
8932 8936 sizeof (struct smart_ext_selftest_log));
8933 8937 } else {
8934 8938 struct smart_selftest_log *selftest_log;
8935 8939
8936 8940 selftest_log = kmem_zalloc(sizeof (struct smart_selftest_log),
8937 8941 KM_SLEEP);
8938 8942
8939 8943 rval = sata_smart_selftest_log(sata_hba_inst, sdinfo,
8940 8944 selftest_log);
8941 8945
8942 8946 if (rval == 0) {
8943 8947 int index;
8944 8948 int count;
8945 8949 struct smart_selftest_log_entry *entry;
8946 8950 static const struct smart_selftest_log_entry empty =
8947 8951 { 0 };
8948 8952
8949 8953 index = selftest_log->smart_selftest_log_index;
8950 8954 if (index == 0)
8951 8955 goto done;
8952 8956 --index; /* Correct for 0 origin */
8953 8957 entry = &selftest_log->
8954 8958 smart_selftest_log_entries[index];
8955 8959 for (count = 1;
8956 8960 count <= SCSI_ENTRIES_IN_LOG_SENSE_SELFTEST_RESULTS;
8957 8961 ++count) {
8958 8962 uint8_t status;
8959 8963 uint8_t code;
8960 8964 uint8_t sense_key;
8961 8965 uint8_t add_sense_code;
8962 8966 uint8_t add_sense_code_qual;
8963 8967
8964 8968 if (bcmp(entry, &empty, sizeof (empty)) == 0)
8965 8969 goto done;
8966 8970
8967 8971 lpp->param_code[0] = 0;
8968 8972 lpp->param_code[1] = count;
8969 8973 lpp->param_ctrl_flags =
8970 8974 LOG_CTRL_LP | LOG_CTRL_LBIN;
8971 8975 lpp->param_len =
8972 8976 SCSI_LOG_SENSE_SELFTEST_PARAM_LEN;
8973 8977
8974 8978 status = entry->smart_selftest_log_status;
8975 8979 status >>= 4;
8976 8980 switch (status) {
8977 8981 case 0:
8978 8982 default:
8979 8983 sense_key = KEY_NO_SENSE;
8980 8984 add_sense_code =
8981 8985 SD_SCSI_ASC_NO_ADD_SENSE;
8982 8986 break;
8983 8987 case 1:
8984 8988 sense_key = KEY_ABORTED_COMMAND;
8985 8989 add_sense_code =
8986 8990 DIAGNOSTIC_FAILURE_ON_COMPONENT;
8987 8991 add_sense_code_qual = SCSI_COMPONENT_81;
8988 8992 break;
8989 8993 case 2:
8990 8994 sense_key = KEY_ABORTED_COMMAND;
8991 8995 add_sense_code =
8992 8996 DIAGNOSTIC_FAILURE_ON_COMPONENT;
8993 8997 add_sense_code_qual = SCSI_COMPONENT_82;
8994 8998 break;
8995 8999 case 3:
8996 9000 sense_key = KEY_ABORTED_COMMAND;
8997 9001 add_sense_code =
8998 9002 DIAGNOSTIC_FAILURE_ON_COMPONENT;
8999 9003 add_sense_code_qual = SCSI_COMPONENT_83;
9000 9004 break;
9001 9005 case 4:
9002 9006 sense_key = KEY_HARDWARE_ERROR;
9003 9007 add_sense_code =
9004 9008 DIAGNOSTIC_FAILURE_ON_COMPONENT;
9005 9009 add_sense_code_qual = SCSI_COMPONENT_84;
9006 9010 break;
9007 9011 case 5:
9008 9012 sense_key = KEY_HARDWARE_ERROR;
9009 9013 add_sense_code =
9010 9014 DIAGNOSTIC_FAILURE_ON_COMPONENT;
9011 9015 add_sense_code_qual = SCSI_COMPONENT_85;
9012 9016 break;
9013 9017 case 6:
9014 9018 sense_key = KEY_HARDWARE_ERROR;
9015 9019 add_sense_code =
9016 9020 DIAGNOSTIC_FAILURE_ON_COMPONENT;
9017 9021 add_sense_code_qual = SCSI_COMPONENT_86;
9018 9022 break;
9019 9023 case 7:
9020 9024 sense_key = KEY_MEDIUM_ERROR;
9021 9025 add_sense_code =
9022 9026 DIAGNOSTIC_FAILURE_ON_COMPONENT;
9023 9027 add_sense_code_qual = SCSI_COMPONENT_87;
9024 9028 break;
9025 9029 case 8:
9026 9030 sense_key = KEY_HARDWARE_ERROR;
9027 9031 add_sense_code =
9028 9032 DIAGNOSTIC_FAILURE_ON_COMPONENT;
9029 9033 add_sense_code_qual = SCSI_COMPONENT_88;
9030 9034 break;
9031 9035 }
9032 9036 code = 0; /* unspecified */
9033 9037 status |= (code << 4);
9034 9038 lpp->param_values[0] = status;
9035 9039 lpp->param_values[1] = 0; /* unspecified */
9036 9040 lpp->param_values[2] = entry->
9037 9041 smart_selftest_log_timestamp[1];
9038 9042 lpp->param_values[3] = entry->
9039 9043 smart_selftest_log_timestamp[0];
9040 9044 if (status != 0) {
9041 9045 lpp->param_values[4] = 0;
9042 9046 lpp->param_values[5] = 0;
9043 9047 lpp->param_values[6] = 0;
9044 9048 lpp->param_values[7] = 0;
9045 9049 lpp->param_values[8] = entry->
9046 9050 smart_selftest_log_failing_lba[3];
9047 9051 lpp->param_values[9] = entry->
9048 9052 smart_selftest_log_failing_lba[2];
9049 9053 lpp->param_values[10] = entry->
9050 9054 smart_selftest_log_failing_lba[1];
9051 9055 lpp->param_values[11] = entry->
9052 9056 smart_selftest_log_failing_lba[0];
9053 9057 } else { /* No block address */
9054 9058 lpp->param_values[4] = 0xff;
9055 9059 lpp->param_values[5] = 0xff;
9056 9060 lpp->param_values[6] = 0xff;
9057 9061 lpp->param_values[7] = 0xff;
9058 9062 lpp->param_values[8] = 0xff;
9059 9063 lpp->param_values[9] = 0xff;
9060 9064 lpp->param_values[10] = 0xff;
9061 9065 lpp->param_values[11] = 0xff;
9062 9066 }
9063 9067 lpp->param_values[12] = sense_key;
9064 9068 lpp->param_values[13] = add_sense_code;
9065 9069 lpp->param_values[14] = add_sense_code_qual;
9066 9070 lpp->param_values[15] = 0; /* undefined */
9067 9071
9068 9072 lpp = (struct log_parameter *)
9069 9073 (((uint8_t *)lpp) +
9070 9074 SCSI_LOG_PARAM_HDR_LEN +
9071 9075 SCSI_LOG_SENSE_SELFTEST_PARAM_LEN);
9072 9076 --index; /* back up to previous entry */
9073 9077 if (index < 0) {
9074 9078 index =
9075 9079 NUM_SMART_SELFTEST_LOG_ENTRIES - 1;
9076 9080 }
9077 9081 entry = &selftest_log->
9078 9082 smart_selftest_log_entries[index];
9079 9083 }
9080 9084 }
9081 9085 done:
9082 9086 kmem_free(selftest_log, sizeof (struct smart_selftest_log));
9083 9087 }
9084 9088
9085 9089 return ((SCSI_LOG_PARAM_HDR_LEN + SCSI_LOG_SENSE_SELFTEST_PARAM_LEN) *
9086 9090 SCSI_ENTRIES_IN_LOG_SENSE_SELFTEST_RESULTS);
9087 9091 }
9088 9092
9089 9093 /*
9090 9094 * sata_build_lsense_page_2f() is used to create the
9091 9095 * SCSI LOG SENSE page 0x2f (informational exceptions)
9092 9096 *
9093 9097 * Takes a sata_drive_info t * and the address of a buffer
9094 9098 * in which to create the page information as well as a sata_hba_inst_t *.
9095 9099 *
9096 9100 * Returns the number of bytes valid in the buffer.
9097 9101 *
9098 9102 * Because it invokes function(s) that send synchronously executed command
9099 9103 * to the HBA, it cannot be called in the interrupt context.
9100 9104 */
9101 9105 static int
9102 9106 sata_build_lsense_page_2f(
9103 9107 sata_drive_info_t *sdinfo,
9104 9108 uint8_t *buf,
9105 9109 sata_hba_inst_t *sata_hba_inst)
9106 9110 {
9107 9111 struct log_parameter *lpp = (struct log_parameter *)buf;
9108 9112 int rval;
9109 9113 uint8_t *smart_data;
9110 9114 uint8_t temp;
9111 9115 sata_id_t *sata_id;
9112 9116 #define SMART_NO_TEMP 0xff
9113 9117
9114 9118 lpp->param_code[0] = 0;
9115 9119 lpp->param_code[1] = 0;
9116 9120 lpp->param_ctrl_flags = LOG_CTRL_LP | LOG_CTRL_LBIN;
9117 9121
9118 9122 /* Now get the SMART status w.r.t. threshold exceeded */
9119 9123 rval = sata_fetch_smart_return_status(sata_hba_inst, sdinfo);
9120 9124 switch (rval) {
9121 9125 case 1:
9122 9126 lpp->param_values[0] = SCSI_PREDICTED_FAILURE;
9123 9127 lpp->param_values[1] = SCSI_GENERAL_HD_FAILURE;
9124 9128 break;
9125 9129 case 0:
9126 9130 case -1: /* failed to get data */
9127 9131 lpp->param_values[0] = 0; /* No failure predicted */
9128 9132 lpp->param_values[1] = 0;
9129 9133 break;
9130 9134 #if defined(SATA_DEBUG)
9131 9135 default:
9132 9136 cmn_err(CE_PANIC, "sata_build_lsense_page_2f bad return value");
9133 9137 /* NOTREACHED */
9134 9138 #endif
9135 9139 }
9136 9140
9137 9141 sata_id = &sdinfo->satadrv_id;
9138 9142 if (! (sata_id->ai_sctsupport & SATA_SCT_CMD_TRANS_SUP))
9139 9143 temp = SMART_NO_TEMP;
9140 9144 else {
9141 9145 /* Now get the temperature */
9142 9146 smart_data = kmem_zalloc(512, KM_SLEEP);
9143 9147 rval = sata_smart_read_log(sata_hba_inst, sdinfo, smart_data,
9144 9148 SCT_STATUS_LOG_PAGE, 1);
9145 9149 if (rval == -1)
9146 9150 temp = SMART_NO_TEMP;
9147 9151 else {
9148 9152 temp = smart_data[200];
9149 9153 if (temp & 0x80) {
9150 9154 if (temp & 0x7f)
9151 9155 temp = 0;
9152 9156 else
9153 9157 temp = SMART_NO_TEMP;
9154 9158 }
9155 9159 }
9156 9160 kmem_free(smart_data, 512);
9157 9161 }
9158 9162
9159 9163 lpp->param_values[2] = temp; /* most recent temperature */
9160 9164 lpp->param_values[3] = 0; /* required vendor specific byte */
9161 9165
9162 9166 lpp->param_len = SCSI_INFO_EXCEPTIONS_PARAM_LEN;
9163 9167
9164 9168
9165 9169 return (SCSI_INFO_EXCEPTIONS_PARAM_LEN + SCSI_LOG_PARAM_HDR_LEN);
9166 9170 }
9167 9171
9168 9172 /*
9169 9173 * sata_build_lsense_page_30() is used to create the
9170 9174 * SCSI LOG SENSE page 0x30 (Sun's vendor specific page for ATA SMART data).
9171 9175 *
9172 9176 * Takes a sata_drive_info t * and the address of a buffer
9173 9177 * in which to create the page information as well as a sata_hba_inst_t *.
9174 9178 *
9175 9179 * Returns the number of bytes valid in the buffer.
9176 9180 */
9177 9181 static int
9178 9182 sata_build_lsense_page_30(
9179 9183 sata_drive_info_t *sdinfo,
9180 9184 uint8_t *buf,
9181 9185 sata_hba_inst_t *sata_hba_inst)
9182 9186 {
9183 9187 struct smart_data *smart_data = (struct smart_data *)buf;
9184 9188 int rval;
9185 9189
9186 9190 /* Now do the SMART READ DATA */
9187 9191 rval = sata_fetch_smart_data(sata_hba_inst, sdinfo, smart_data);
9188 9192 if (rval == -1)
9189 9193 return (0);
9190 9194
9191 9195 return (sizeof (struct smart_data));
9192 9196 }
9193 9197
9194 9198 /*
9195 9199 * sata_build_lsense_page_0e() is used to create the
9196 9200 * SCSI LOG SENSE page 0e (start-stop cycle counter page)
9197 9201 *
9198 9202 * Date of Manufacture (0x0001)
9199 9203 * YEAR = "0000"
9200 9204 * WEEK = "00"
9201 9205 * Accounting Date (0x0002)
9202 9206 * 6 ASCII space character(20h)
9203 9207 * Specified cycle count over device lifetime
9204 9208 * VALUE - THRESH - the delta between max and min;
9205 9209 * Accumulated start-stop cycles
9206 9210 * VALUE - WORST - the accumulated cycles;
|
↓ open down ↓ |
4348 lines elided |
↑ open up ↑ |
9207 9211 *
9208 9212 * ID FLAG THRESH VALUE WORST RAW on start/stop counter attribute
9209 9213 *
9210 9214 * Takes a sata_drive_info t * and the address of a buffer
9211 9215 * in which to create the page information as well as a sata_hba_inst_t *.
9212 9216 *
9213 9217 * Returns the number of bytes valid in the buffer.
9214 9218 */
9215 9219 static int
9216 9220 sata_build_lsense_page_0e(sata_drive_info_t *sdinfo, uint8_t *buf,
9217 - sata_pkt_txlate_t *spx)
9221 + sata_pkt_txlate_t *spx)
9218 9222 {
9219 9223 struct start_stop_cycle_counter_log *log_page;
9220 9224 int i, rval, index;
9221 9225 uint8_t smart_data[512], id, value, worst, thresh;
9222 9226 uint32_t max_count, cycles;
9223 9227
9224 9228 /* Now do the SMART READ DATA */
9225 9229 rval = sata_fetch_smart_data(spx->txlt_sata_hba_inst, sdinfo,
9226 9230 (struct smart_data *)smart_data);
9227 9231 if (rval == -1)
9228 9232 return (0);
9229 9233 for (i = 0, id = 0; i < SMART_START_STOP_COUNT_ID * 2; i++) {
9230 9234 index = (i * 12) + 2;
9231 9235 id = smart_data[index];
9232 9236 if (id != SMART_START_STOP_COUNT_ID)
9233 9237 continue;
9234 9238 else {
9235 9239 thresh = smart_data[index + 2];
9236 9240 value = smart_data[index + 3];
9237 9241 worst = smart_data[index + 4];
9238 9242 break;
9239 9243 }
9240 9244 }
9241 9245 if (id != SMART_START_STOP_COUNT_ID)
9242 9246 return (0);
9243 9247 max_count = value - thresh;
9244 9248 cycles = value - worst;
9245 9249
9246 9250 log_page = (struct start_stop_cycle_counter_log *)buf;
9247 9251 bzero(log_page, sizeof (struct start_stop_cycle_counter_log));
9248 9252 log_page->code = 0x0e;
9249 9253 log_page->page_len_low = 0x24;
9250 9254
9251 9255 log_page->manufactor_date_low = 0x1;
9252 9256 log_page->param_1.fmt_link = 0x1; /* 01b */
9253 9257 log_page->param_len_1 = 0x06;
9254 9258 for (i = 0; i < 4; i++) {
9255 9259 log_page->year_manu[i] = 0x30;
9256 9260 if (i < 2)
9257 9261 log_page->week_manu[i] = 0x30;
9258 9262 }
9259 9263
9260 9264 log_page->account_date_low = 0x02;
9261 9265 log_page->param_2.fmt_link = 0x01; /* 01b */
9262 9266 log_page->param_len_2 = 0x06;
9263 9267 for (i = 0; i < 4; i++) {
9264 9268 log_page->year_account[i] = 0x20;
9265 9269 if (i < 2)
9266 9270 log_page->week_account[i] = 0x20;
9267 9271 }
9268 9272
9269 9273 log_page->lifetime_code_low = 0x03;
9270 9274 log_page->param_3.fmt_link = 0x03; /* 11b */
9271 9275 log_page->param_len_3 = 0x04;
9272 9276 /* VALUE - THRESH - the delta between max and min */
9273 9277 log_page->cycle_code_low = 0x04;
9274 9278 log_page->param_4.fmt_link = 0x03; /* 11b */
9275 9279 log_page->param_len_4 = 0x04;
9276 9280 /* WORST - THRESH - the distance from 'now' to min */
9277 9281
9278 9282 for (i = 0; i < 4; i++) {
9279 9283 log_page->cycle_lifetime[i] =
9280 9284 (max_count >> (8 * (3 - i))) & 0xff;
9281 9285 log_page->cycle_accumulated[i] =
9282 9286 (cycles >> (8 * (3 - i))) & 0xff;
9283 9287 }
9284 9288
9285 9289 return (sizeof (struct start_stop_cycle_counter_log));
9286 9290 }
9287 9291
9288 9292 /*
9289 9293 * This function was used for build a ATA read verify sector command
9290 9294 */
9291 9295 static void
9292 9296 sata_build_read_verify_cmd(sata_cmd_t *scmd, uint16_t sec, uint64_t lba)
9293 9297 {
9294 9298 scmd->satacmd_cmd_reg = SATAC_RDVER;
9295 9299 scmd->satacmd_addr_type = ATA_ADDR_LBA28;
9296 9300 scmd->satacmd_flags.sata_special_regs = B_TRUE;
9297 9301
9298 9302 scmd->satacmd_sec_count_lsb = sec & 0xff;
9299 9303 scmd->satacmd_lba_low_lsb = lba & 0xff;
9300 9304 scmd->satacmd_lba_mid_lsb = (lba >> 8) & 0xff;
9301 9305 scmd->satacmd_lba_high_lsb = (lba >> 16) & 0xff;
9302 9306 scmd->satacmd_device_reg = (SATA_ADH_LBA | (lba >> 24) & 0xf);
9303 9307 scmd->satacmd_features_reg = 0;
9304 9308 scmd->satacmd_status_reg = 0;
9305 9309 scmd->satacmd_error_reg = 0;
9306 9310 }
9307 9311
9308 9312 /*
9309 9313 * This function was used for building an ATA
9310 9314 * command, and only command register need to
9311 9315 * be defined, other register will be zero or na.
9312 9316 */
9313 9317 static void
9314 9318 sata_build_generic_cmd(sata_cmd_t *scmd, uint8_t cmd)
9315 9319 {
9316 9320 scmd->satacmd_addr_type = 0;
9317 9321 scmd->satacmd_cmd_reg = cmd;
9318 9322 scmd->satacmd_device_reg = 0;
9319 9323 scmd->satacmd_sec_count_lsb = 0;
9320 9324 scmd->satacmd_lba_low_lsb = 0;
9321 9325 scmd->satacmd_lba_mid_lsb = 0;
9322 9326 scmd->satacmd_lba_high_lsb = 0;
9323 9327 scmd->satacmd_features_reg = 0;
9324 9328 scmd->satacmd_status_reg = 0;
9325 9329 scmd->satacmd_error_reg = 0;
9326 9330 scmd->satacmd_flags.sata_special_regs = B_TRUE;
9327 9331 }
9328 9332
9329 9333 /*
9330 9334 * This function was used for changing the standby
9331 9335 * timer format from SCSI to ATA.
9332 9336 */
9333 9337 static uint8_t
9334 9338 sata_get_standby_timer(uint8_t *timer)
9335 9339 {
9336 9340 uint32_t i = 0, count = 0;
9337 9341 uint8_t ata_count;
9338 9342
9339 9343 for (i = 0; i < 4; i++) {
9340 9344 count = count << 8 | timer[i];
9341 9345 }
9342 9346
9343 9347 if (count == 0)
9344 9348 return (0);
9345 9349
9346 9350 if (count >= 1 && count <= 12000)
9347 9351 ata_count = (count -1) / 50 + 1;
9348 9352 else if (count > 12000 && count <= 12600)
9349 9353 ata_count = 0xfc;
9350 9354 else if (count > 12601 && count <= 12750)
9351 9355 ata_count = 0xff;
9352 9356 else if (count > 12750 && count <= 17999)
9353 9357 ata_count = 0xf1;
9354 9358 else if (count > 18000 && count <= 198000)
9355 9359 ata_count = count / 18000 + 240;
9356 9360 else
9357 9361 ata_count = 0xfd;
9358 9362 return (ata_count);
9359 9363 }
9360 9364
9361 9365 /* ************************** ATAPI-SPECIFIC FUNCTIONS ********************** */
9362 9366
9363 9367 /*
9364 9368 * Start command for ATAPI device.
9365 9369 * This function processes scsi_pkt requests.
9366 9370 * Now CD/DVD, tape and ATAPI disk devices are supported.
9367 9371 * Most commands are packet without any translation into Packet Command.
9368 9372 * Some may be trapped and executed as SATA commands (not clear which one).
9369 9373 *
9370 9374 * Returns TRAN_ACCEPT if command is accepted for execution (or completed
9371 9375 * execution).
9372 9376 * Returns other TRAN_XXXX codes if command is not accepted or completed
9373 9377 * (see return values for sata_hba_start()).
9374 9378 *
9375 9379 * Note:
9376 9380 * Inquiry cdb format differs between transport version 2 and 3.
9377 9381 * However, the transport version 3 devices that were checked did not adhere
9378 9382 * to the specification (ignored MSB of the allocation length). Therefore,
9379 9383 * the transport version is not checked, but Inquiry allocation length is
9380 9384 * truncated to 255 bytes if the original allocation length set-up by the
9381 9385 * target driver is greater than 255 bytes.
9382 9386 */
9383 9387 static int
9384 9388 sata_txlt_atapi(sata_pkt_txlate_t *spx)
9385 9389 {
9386 9390 struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
9387 9391 sata_cmd_t *scmd = &spx->txlt_sata_pkt->satapkt_cmd;
9388 9392 struct buf *bp = spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp;
9389 9393 sata_hba_inst_t *sata_hba = SATA_TXLT_HBA_INST(spx);
9390 9394 sata_drive_info_t *sdinfo = sata_get_device_info(sata_hba,
9391 9395 &spx->txlt_sata_pkt->satapkt_device);
9392 9396 kmutex_t *cport_mutex = &(SATA_TXLT_CPORT_MUTEX(spx));
9393 9397 int cdblen;
9394 9398 int rval, reason;
9395 9399 int synch;
9396 9400 union scsi_cdb *cdbp = (union scsi_cdb *)scsipkt->pkt_cdbp;
9397 9401
9398 9402 mutex_enter(cport_mutex);
9399 9403
9400 9404 if (((rval = sata_txlt_generic_pkt_info(spx, &reason, 0)) !=
9401 9405 TRAN_ACCEPT) || (reason == CMD_DEV_GONE)) {
9402 9406 mutex_exit(cport_mutex);
9403 9407 return (rval);
9404 9408 }
9405 9409
9406 9410 /*
9407 9411 * ATAPI device executes some ATA commands in addition to those
9408 9412 * commands sent via PACKET command. These ATA commands may be
9409 9413 * executed by the regular SATA translation functions. None needs
9410 9414 * to be captured now.
9411 9415 *
9412 9416 * Commands sent via PACKET command include:
9413 9417 * MMC command set for ATAPI CD/DVD device
9414 9418 * SSC command set for ATAPI TAPE device
9415 9419 * SBC command set for ATAPI disk device
9416 9420 *
9417 9421 */
9418 9422
9419 9423 /* Check the size of cdb */
9420 9424
9421 9425 switch (GETGROUP(cdbp)) {
9422 9426 case CDB_GROUPID_3: /* Reserved, per SPC-4 */
9423 9427 /*
9424 9428 * opcodes 0x7e and 0x7f identify variable-length CDBs and
9425 9429 * therefore require special handling. Return failure, for now.
9426 9430 */
9427 9431 mutex_exit(cport_mutex);
9428 9432 return (TRAN_BADPKT);
9429 9433
9430 9434 case CDB_GROUPID_6: /* Vendor-specific, per SPC-4 */
9431 9435 case CDB_GROUPID_7: /* Vendor-specific, per SPC-4 */
9432 9436 /* obtain length from the scsi_pkt */
9433 9437 cdblen = scsipkt->pkt_cdblen;
9434 9438 break;
9435 9439
9436 9440 default:
9437 9441 /* CDB's length is statically known, per SPC-4 */
9438 9442 cdblen = scsi_cdb_size[GETGROUP(cdbp)];
9439 9443 break;
9440 9444 }
9441 9445
9442 9446 if (cdblen <= 0 || cdblen > sdinfo->satadrv_atapi_cdb_len) {
9443 9447 sata_log(NULL, CE_WARN,
9444 9448 "sata: invalid ATAPI cdb length %d",
9445 9449 cdblen);
9446 9450 mutex_exit(cport_mutex);
9447 9451 return (TRAN_BADPKT);
9448 9452 }
9449 9453
9450 9454 SATAATAPITRACE(spx, cdblen);
9451 9455
9452 9456 /*
9453 9457 * For non-read/write commands we need to
9454 9458 * map buffer
9455 9459 */
9456 9460 switch ((uint_t)scsipkt->pkt_cdbp[0]) {
9457 9461 case SCMD_READ:
9458 9462 case SCMD_READ_G1:
9459 9463 case SCMD_READ_G5:
9460 9464 case SCMD_READ_G4:
9461 9465 case SCMD_WRITE:
9462 9466 case SCMD_WRITE_G1:
9463 9467 case SCMD_WRITE_G5:
9464 9468 case SCMD_WRITE_G4:
9465 9469 break;
9466 9470 default:
9467 9471 if (bp != NULL) {
9468 9472 if (bp->b_flags & (B_PHYS | B_PAGEIO))
9469 9473 bp_mapin(bp);
9470 9474 }
9471 9475 break;
9472 9476 }
9473 9477 /*
9474 9478 * scmd->satacmd_flags.sata_data_direction default -
9475 9479 * SATA_DIR_NODATA_XFER - is set by
9476 9480 * sata_txlt_generic_pkt_info().
9477 9481 */
9478 9482 if (scmd->satacmd_bp) {
9479 9483 if (scmd->satacmd_bp->b_flags & B_READ) {
9480 9484 scmd->satacmd_flags.sata_data_direction = SATA_DIR_READ;
9481 9485 } else {
9482 9486 scmd->satacmd_flags.sata_data_direction =
9483 9487 SATA_DIR_WRITE;
9484 9488 }
9485 9489 }
9486 9490
9487 9491 /*
9488 9492 * Set up ATAPI packet command.
9489 9493 */
9490 9494
9491 9495 sata_atapi_packet_cmd_setup(scmd, sdinfo);
9492 9496
9493 9497 /* Copy cdb into sata_cmd */
9494 9498 scmd->satacmd_acdb_len = sdinfo->satadrv_atapi_cdb_len;
9495 9499 bzero(scmd->satacmd_acdb, SATA_ATAPI_MAX_CDB_LEN);
9496 9500 bcopy(cdbp, scmd->satacmd_acdb, cdblen);
9497 9501
9498 9502 /* See note in the command header */
9499 9503 if (scmd->satacmd_acdb[0] == SCMD_INQUIRY) {
9500 9504 if (scmd->satacmd_acdb[3] != 0)
9501 9505 scmd->satacmd_acdb[4] = 255;
9502 9506 }
9503 9507
9504 9508 #ifdef SATA_DEBUG
9505 9509 if (sata_debug_flags & SATA_DBG_ATAPI) {
9506 9510 uint8_t *p = scmd->satacmd_acdb;
9507 9511 char buf[3 * SATA_ATAPI_MAX_CDB_LEN];
9508 9512
9509 9513 (void) snprintf(buf, SATA_ATAPI_MAX_CDB_LEN,
9510 9514 "%02x %02x %02x %02x %02x %02x %02x %02x "
9511 9515 "%2x %02x %02x %02x %02x %02x %02x %02x",
9512 9516 p[0], p[1], p[2], p[3], p[4], p[5], p[6], p[7],
9513 9517 p[8], p[9], p[10], p[11], p[12], p[13], p[14], p[15]);
9514 9518 buf[(3 * SATA_ATAPI_MAX_CDB_LEN) - 1] = '\0';
9515 9519 cmn_err(CE_NOTE, "ATAPI cdb: %s\n", buf);
9516 9520 }
9517 9521 #endif
9518 9522
9519 9523 /*
9520 9524 * Preset request sense data to NO SENSE.
9521 9525 * If there is no way to get error information via Request Sense,
9522 9526 * the packet request sense data would not have to be modified by HBA,
9523 9527 * but it could be returned as is.
9524 9528 */
9525 9529 bzero(scmd->satacmd_rqsense, SATA_ATAPI_RQSENSE_LEN);
9526 9530 sata_fixed_sense_data_preset(
9527 9531 (struct scsi_extended_sense *)scmd->satacmd_rqsense);
9528 9532
9529 9533 if (!(spx->txlt_sata_pkt->satapkt_op_mode & SATA_OPMODE_SYNCH)) {
9530 9534 /* Need callback function */
9531 9535 spx->txlt_sata_pkt->satapkt_comp = sata_txlt_atapi_completion;
9532 9536 synch = FALSE;
9533 9537 } else
9534 9538 synch = TRUE;
9535 9539
9536 9540 /* Transfer command to HBA */
9537 9541 if (sata_hba_start(spx, &rval) != 0) {
9538 9542 /* Pkt not accepted for execution */
9539 9543 mutex_exit(cport_mutex);
9540 9544 return (rval);
9541 9545 }
9542 9546 mutex_exit(cport_mutex);
9543 9547 /*
9544 9548 * If execution is non-synchronous,
9545 9549 * a callback function will handle potential errors, translate
9546 9550 * the response and will do a callback to a target driver.
9547 9551 * If it was synchronous, use the same framework callback to check
9548 9552 * an execution status.
9549 9553 */
9550 9554 if (synch) {
9551 9555 SATADBG1(SATA_DBG_SCSI_IF, spx->txlt_sata_hba_inst,
9552 9556 "synchronous execution status %x\n",
9553 9557 spx->txlt_sata_pkt->satapkt_reason);
9554 9558 sata_txlt_atapi_completion(spx->txlt_sata_pkt);
9555 9559 }
9556 9560 return (TRAN_ACCEPT);
9557 9561 }
9558 9562
9559 9563
9560 9564 /*
9561 9565 * ATAPI Packet command completion.
9562 9566 *
9563 9567 * Failure of the command passed via Packet command are considered device
9564 9568 * error. SATA HBA driver would have to retrieve error data (via Request
9565 9569 * Sense command delivered via error retrieval sata packet) and copy it
9566 9570 * to satacmd_rqsense array. From there, it is moved into scsi pkt sense data.
9567 9571 */
9568 9572 static void
9569 9573 sata_txlt_atapi_completion(sata_pkt_t *sata_pkt)
9570 9574 {
9571 9575 sata_pkt_txlate_t *spx =
9572 9576 (sata_pkt_txlate_t *)sata_pkt->satapkt_framework_private;
9573 9577 struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
9574 9578 struct scsi_extended_sense *sense;
9575 9579 struct buf *bp;
9576 9580 int rval;
9577 9581
9578 9582 #ifdef SATA_DEBUG
9579 9583 uint8_t *rqsp = sata_pkt->satapkt_cmd.satacmd_rqsense;
9580 9584 #endif
9581 9585
9582 9586 scsipkt->pkt_state = STATE_GOT_BUS | STATE_GOT_TARGET |
9583 9587 STATE_SENT_CMD | STATE_GOT_STATUS;
9584 9588
9585 9589 if (sata_pkt->satapkt_reason == SATA_PKT_COMPLETED) {
9586 9590 /* Normal completion */
9587 9591 if (sata_pkt->satapkt_cmd.satacmd_bp != NULL)
9588 9592 scsipkt->pkt_state |= STATE_XFERRED_DATA;
9589 9593 scsipkt->pkt_reason = CMD_CMPLT;
9590 9594 *scsipkt->pkt_scbp = STATUS_GOOD;
9591 9595 if (spx->txlt_tmp_buf != NULL) {
9592 9596 /* Temporary buffer was used */
9593 9597 bp = spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp;
9594 9598 if (bp->b_flags & B_READ) {
9595 9599 rval = ddi_dma_sync(
9596 9600 spx->txlt_buf_dma_handle, 0, 0,
9597 9601 DDI_DMA_SYNC_FORCPU);
9598 9602 ASSERT(rval == DDI_SUCCESS);
9599 9603 bcopy(spx->txlt_tmp_buf, bp->b_un.b_addr,
9600 9604 bp->b_bcount);
9601 9605 }
9602 9606 }
9603 9607 } else {
9604 9608 /*
9605 9609 * Something went wrong - analyze return
9606 9610 */
9607 9611 *scsipkt->pkt_scbp = STATUS_CHECK;
9608 9612 sense = sata_arq_sense(spx);
9609 9613
9610 9614 if (sata_pkt->satapkt_reason == SATA_PKT_DEV_ERROR) {
9611 9615 /*
9612 9616 * pkt_reason should be CMD_CMPLT for DEVICE ERROR.
9613 9617 * Under this condition ERR bit is set for ATA command,
9614 9618 * and CHK bit set for ATAPI command.
9615 9619 *
9616 9620 * Please check st_intr & sdintr about how pkt_reason
9617 9621 * is used.
9618 9622 */
9619 9623 scsipkt->pkt_reason = CMD_CMPLT;
9620 9624
9621 9625 /*
9622 9626 * We may not have ARQ data if there was a double
9623 9627 * error. But sense data in sata packet was pre-set
9624 9628 * with NO SENSE so it is valid even if HBA could
9625 9629 * not retrieve a real sense data.
9626 9630 * Just copy this sense data into scsi pkt sense area.
9627 9631 */
9628 9632 bcopy(sata_pkt->satapkt_cmd.satacmd_rqsense, sense,
9629 9633 SATA_ATAPI_MIN_RQSENSE_LEN);
9630 9634 #ifdef SATA_DEBUG
9631 9635 if (sata_debug_flags & SATA_DBG_SCSI_IF) {
9632 9636 sata_log(spx->txlt_sata_hba_inst, CE_WARN,
9633 9637 "sata_txlt_atapi_completion: %02x\n"
9634 9638 "RQSENSE: %02x %02x %02x %02x %02x %02x "
9635 9639 " %02x %02x %02x %02x %02x %02x "
9636 9640 " %02x %02x %02x %02x %02x %02x\n",
9637 9641 scsipkt->pkt_reason,
9638 9642 rqsp[0], rqsp[1], rqsp[2], rqsp[3],
9639 9643 rqsp[4], rqsp[5], rqsp[6], rqsp[7],
9640 9644 rqsp[8], rqsp[9], rqsp[10], rqsp[11],
9641 9645 rqsp[12], rqsp[13], rqsp[14], rqsp[15],
9642 9646 rqsp[16], rqsp[17]);
9643 9647 }
9644 9648 #endif
9645 9649 } else {
9646 9650 switch (sata_pkt->satapkt_reason) {
9647 9651 case SATA_PKT_PORT_ERROR:
9648 9652 /*
9649 9653 * We have no device data.
9650 9654 */
9651 9655 scsipkt->pkt_reason = CMD_INCOMPLETE;
9652 9656 scsipkt->pkt_state &= ~(STATE_GOT_BUS |
9653 9657 STATE_GOT_TARGET | STATE_SENT_CMD |
9654 9658 STATE_GOT_STATUS);
9655 9659 sense->es_key = KEY_HARDWARE_ERROR;
9656 9660 break;
9657 9661
9658 9662 case SATA_PKT_TIMEOUT:
9659 9663 scsipkt->pkt_reason = CMD_TIMEOUT;
9660 9664 scsipkt->pkt_statistics |=
9661 9665 STAT_TIMEOUT | STAT_DEV_RESET;
9662 9666 /*
9663 9667 * Need to check if HARDWARE_ERROR/
9664 9668 * TIMEOUT_ON_LOGICAL_UNIT 4/3E/2 would be more
9665 9669 * appropriate.
9666 9670 */
9667 9671 break;
9668 9672
9669 9673 case SATA_PKT_ABORTED:
9670 9674 scsipkt->pkt_reason = CMD_ABORTED;
9671 9675 scsipkt->pkt_statistics |= STAT_ABORTED;
9672 9676 /* Should we set key COMMAND_ABPRTED? */
9673 9677 break;
9674 9678
9675 9679 case SATA_PKT_RESET:
9676 9680 scsipkt->pkt_reason = CMD_RESET;
9677 9681 scsipkt->pkt_statistics |= STAT_DEV_RESET;
9678 9682 /*
9679 9683 * May be we should set Unit Attention /
9680 9684 * Reset. Perhaps the same should be
9681 9685 * returned for disks....
9682 9686 */
9683 9687 sense->es_key = KEY_UNIT_ATTENTION;
9684 9688 sense->es_add_code = SD_SCSI_ASC_RESET;
9685 9689 break;
9686 9690
9687 9691 default:
9688 9692 SATA_LOG_D((spx->txlt_sata_hba_inst, CE_WARN,
9689 9693 "sata_txlt_atapi_completion: "
9690 9694 "invalid packet completion reason"));
9691 9695 scsipkt->pkt_reason = CMD_TRAN_ERR;
9692 9696 scsipkt->pkt_state &= ~(STATE_GOT_BUS |
9693 9697 STATE_GOT_TARGET | STATE_SENT_CMD |
9694 9698 STATE_GOT_STATUS);
9695 9699 break;
9696 9700 }
9697 9701 }
9698 9702 }
9699 9703
9700 9704 SATAATAPITRACE(spx, 0);
9701 9705
9702 9706 if ((scsipkt->pkt_flags & FLAG_NOINTR) == 0 &&
9703 9707 scsipkt->pkt_comp != NULL) {
9704 9708 /* scsi callback required */
9705 9709 (*scsipkt->pkt_comp)(scsipkt);
9706 9710 }
9707 9711 }
9708 9712
9709 9713 /*
9710 9714 * Set up error retrieval sata command for ATAPI Packet Command error data
9711 9715 * recovery.
9712 9716 *
9713 9717 * Returns SATA_SUCCESS when data buffer is allocated and packet set-up,
9714 9718 * returns SATA_FAILURE otherwise.
9715 9719 */
9716 9720
9717 9721 static int
9718 9722 sata_atapi_err_ret_cmd_setup(sata_pkt_txlate_t *spx, sata_drive_info_t *sdinfo)
9719 9723 {
9720 9724 sata_pkt_t *spkt = spx->txlt_sata_pkt;
9721 9725 sata_cmd_t *scmd;
9722 9726 struct buf *bp;
9723 9727
9724 9728 /*
9725 9729 * Allocate dma-able buffer error data.
9726 9730 * Buffer allocation will take care of buffer alignment and other DMA
9727 9731 * attributes.
9728 9732 */
9729 9733 bp = sata_alloc_local_buffer(spx, SATA_ATAPI_MIN_RQSENSE_LEN);
9730 9734 if (bp == NULL) {
9731 9735 SATADBG1(SATA_DBG_ATAPI, spx->txlt_sata_hba_inst,
9732 9736 "sata_get_err_retrieval_pkt: "
9733 9737 "cannot allocate buffer for error data", NULL);
9734 9738 return (SATA_FAILURE);
9735 9739 }
9736 9740 bp_mapin(bp); /* make data buffer accessible */
9737 9741
9738 9742 /* Operation modes are up to the caller */
9739 9743 spkt->satapkt_op_mode = SATA_OPMODE_SYNCH | SATA_OPMODE_INTERRUPTS;
9740 9744
9741 9745 /* Synchronous mode, no callback - may be changed by the caller */
9742 9746 spkt->satapkt_comp = NULL;
9743 9747 spkt->satapkt_time = sata_default_pkt_time;
9744 9748
9745 9749 scmd = &spkt->satapkt_cmd;
9746 9750 scmd->satacmd_flags.sata_data_direction = SATA_DIR_READ;
9747 9751 scmd->satacmd_flags.sata_ignore_dev_reset = B_TRUE;
9748 9752
9749 9753 sata_atapi_packet_cmd_setup(scmd, sdinfo);
9750 9754
9751 9755 /*
9752 9756 * Set-up acdb. Request Sense CDB (packet command content) is
9753 9757 * not in DMA-able buffer. Its handling is HBA-specific (how
9754 9758 * it is transfered into packet FIS).
9755 9759 */
9756 9760 scmd->satacmd_acdb_len = sdinfo->satadrv_atapi_cdb_len;
9757 9761 bcopy(sata_rqsense_cdb, scmd->satacmd_acdb, SATA_ATAPI_RQSENSE_CDB_LEN);
9758 9762 /* Following zeroing of pad bytes may not be necessary */
9759 9763 bzero(&scmd->satacmd_acdb[SATA_ATAPI_RQSENSE_CDB_LEN],
9760 9764 sdinfo->satadrv_atapi_cdb_len - SATA_ATAPI_RQSENSE_CDB_LEN);
9761 9765
9762 9766 /*
9763 9767 * Set-up pointer to the buffer handle, so HBA can sync buffer
9764 9768 * before accessing it. Handle is in usual place in translate struct.
9765 9769 */
9766 9770 scmd->satacmd_err_ret_buf_handle = &spx->txlt_buf_dma_handle;
9767 9771
9768 9772 /*
9769 9773 * Preset request sense data to NO SENSE.
9770 9774 * Here it is redundant, only for a symetry with scsi-originated
9771 9775 * packets. It should not be used for anything but debugging.
9772 9776 */
9773 9777 bzero(scmd->satacmd_rqsense, SATA_ATAPI_RQSENSE_LEN);
9774 9778 sata_fixed_sense_data_preset(
9775 9779 (struct scsi_extended_sense *)scmd->satacmd_rqsense);
9776 9780
9777 9781 ASSERT(scmd->satacmd_num_dma_cookies != 0);
9778 9782 ASSERT(scmd->satacmd_dma_cookie_list != NULL);
9779 9783
9780 9784 return (SATA_SUCCESS);
9781 9785 }
9782 9786
9783 9787 /*
9784 9788 * Set-up ATAPI packet command.
9785 9789 * Data transfer direction has to be set-up in sata_cmd structure prior to
9786 9790 * calling this function.
9787 9791 *
9788 9792 * Returns void
9789 9793 */
9790 9794
9791 9795 static void
9792 9796 sata_atapi_packet_cmd_setup(sata_cmd_t *scmd, sata_drive_info_t *sdinfo)
9793 9797 {
9794 9798 scmd->satacmd_addr_type = 0; /* N/A */
9795 9799 scmd->satacmd_sec_count_lsb = 0; /* no tag */
9796 9800 scmd->satacmd_lba_low_lsb = 0; /* N/A */
9797 9801 scmd->satacmd_lba_mid_lsb = (uint8_t)SATA_ATAPI_MAX_BYTES_PER_DRQ;
9798 9802 scmd->satacmd_lba_high_lsb =
9799 9803 (uint8_t)(SATA_ATAPI_MAX_BYTES_PER_DRQ >> 8);
9800 9804 scmd->satacmd_cmd_reg = SATAC_PACKET; /* Command */
9801 9805
9802 9806 /*
9803 9807 * We want all data to be transfered via DMA.
9804 9808 * But specify it only if drive supports DMA and DMA mode is
9805 9809 * selected - some drives are sensitive about it.
9806 9810 * Hopefully it wil work for all drives....
9807 9811 */
9808 9812 if (sdinfo->satadrv_settings & SATA_DEV_DMA)
9809 9813 scmd->satacmd_features_reg = SATA_ATAPI_F_DMA;
9810 9814
9811 9815 /*
9812 9816 * Features register requires special care for devices that use
9813 9817 * Serial ATA bridge - they need an explicit specification of
9814 9818 * the data transfer direction for Packet DMA commands.
9815 9819 * Setting this bit is harmless if DMA is not used.
9816 9820 *
9817 9821 * Many drives do not implement word 80, specifying what ATA/ATAPI
9818 9822 * spec they follow.
9819 9823 * We are arbitrarily following the latest SerialATA 2.6 spec,
9820 9824 * which uses ATA/ATAPI 6 specification for Identify Data, unless
9821 9825 * ATA/ATAPI-7 support is explicitly indicated.
9822 9826 */
9823 9827 if (sdinfo->satadrv_id.ai_majorversion != 0 &&
9824 9828 sdinfo->satadrv_id.ai_majorversion != 0xffff &&
9825 9829 (sdinfo->satadrv_id.ai_majorversion & SATA_MAJVER_7) != 0) {
9826 9830 /*
9827 9831 * Specification of major version is valid and version 7
9828 9832 * is supported. It does automatically imply that all
9829 9833 * spec features are supported. For now, we assume that
9830 9834 * DMADIR setting is valid. ATA/ATAPI7 spec is incomplete.
9831 9835 */
9832 9836 if ((sdinfo->satadrv_id.ai_dirdma &
9833 9837 SATA_ATAPI_ID_DMADIR_REQ) != 0) {
9834 9838 if (scmd->satacmd_flags.sata_data_direction ==
9835 9839 SATA_DIR_READ)
9836 9840 scmd->satacmd_features_reg |=
9837 9841 SATA_ATAPI_F_DATA_DIR_READ;
9838 9842 }
9839 9843 }
9840 9844 }
9841 9845
9842 9846
9843 9847 #ifdef SATA_DEBUG
9844 9848
9845 9849 /* Display 18 bytes of Inquiry data */
9846 9850 static void
9847 9851 sata_show_inqry_data(uint8_t *buf)
9848 9852 {
9849 9853 struct scsi_inquiry *inq = (struct scsi_inquiry *)buf;
9850 9854 uint8_t *p;
9851 9855
9852 9856 cmn_err(CE_NOTE, "Inquiry data:");
9853 9857 cmn_err(CE_NOTE, "device type %x", inq->inq_dtype);
9854 9858 cmn_err(CE_NOTE, "removable media %x", inq->inq_rmb);
9855 9859 cmn_err(CE_NOTE, "version %x", inq->inq_ansi);
9856 9860 cmn_err(CE_NOTE, "ATAPI transport version %d",
9857 9861 SATA_ATAPI_TRANS_VERSION(inq));
9858 9862 cmn_err(CE_NOTE, "response data format %d, aenc %d",
9859 9863 inq->inq_rdf, inq->inq_aenc);
9860 9864 cmn_err(CE_NOTE, " additional length %d", inq->inq_len);
9861 9865 cmn_err(CE_NOTE, "tpgs %d", inq->inq_tpgs);
9862 9866 p = (uint8_t *)inq->inq_vid;
9863 9867 cmn_err(CE_NOTE, "vendor id (binary): %02x %02x %02x %02x "
9864 9868 "%02x %02x %02x %02x",
9865 9869 p[0], p[1], p[2], p[3], p[4], p[5], p[6], p[7]);
9866 9870 p = (uint8_t *)inq->inq_vid;
9867 9871 cmn_err(CE_NOTE, "vendor id: %c %c %c %c %c %c %c %c",
9868 9872 p[0], p[1], p[2], p[3], p[4], p[5], p[6], p[7]);
9869 9873
9870 9874 p = (uint8_t *)inq->inq_pid;
9871 9875 cmn_err(CE_NOTE, "product id (binary): %02x %02x %02x %02x "
9872 9876 "%02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x",
9873 9877 p[0], p[1], p[2], p[3], p[4], p[5], p[6], p[7],
9874 9878 p[8], p[9], p[10], p[11], p[12], p[13], p[14], p[15]);
9875 9879 p = (uint8_t *)inq->inq_pid;
9876 9880 cmn_err(CE_NOTE, "product id: %c %c %c %c %c %c %c %c "
9877 9881 "%c %c %c %c %c %c %c %c",
9878 9882 p[0], p[1], p[2], p[3], p[4], p[5], p[6], p[7],
9879 9883 p[8], p[9], p[10], p[11], p[12], p[13], p[14], p[15]);
9880 9884
9881 9885 p = (uint8_t *)inq->inq_revision;
9882 9886 cmn_err(CE_NOTE, "revision (binary): %02x %02x %02x %02x",
9883 9887 p[0], p[1], p[2], p[3]);
9884 9888 p = (uint8_t *)inq->inq_revision;
9885 9889 cmn_err(CE_NOTE, "revision: %c %c %c %c",
9886 9890 p[0], p[1], p[2], p[3]);
9887 9891
9888 9892 }
9889 9893
9890 9894
9891 9895 static void
9892 9896 sata_save_atapi_trace(sata_pkt_txlate_t *spx, int count)
9893 9897 {
9894 9898 struct scsi_pkt *scsi_pkt = spx->txlt_scsi_pkt;
9895 9899
9896 9900 if (scsi_pkt == NULL)
9897 9901 return;
9898 9902 if (count != 0) {
9899 9903 /* saving cdb */
9900 9904 bzero(sata_atapi_trace[sata_atapi_trace_index].acdb,
9901 9905 SATA_ATAPI_MAX_CDB_LEN);
9902 9906 bcopy(scsi_pkt->pkt_cdbp,
9903 9907 sata_atapi_trace[sata_atapi_trace_index].acdb, count);
9904 9908 } else {
9905 9909 bcopy(&((struct scsi_arq_status *)scsi_pkt->pkt_scbp)->
9906 9910 sts_sensedata,
9907 9911 sata_atapi_trace[sata_atapi_trace_index].arqs,
9908 9912 SATA_ATAPI_MIN_RQSENSE_LEN);
9909 9913 sata_atapi_trace[sata_atapi_trace_index].scsi_pkt_reason =
9910 9914 scsi_pkt->pkt_reason;
9911 9915 sata_atapi_trace[sata_atapi_trace_index].sata_pkt_reason =
9912 9916 spx->txlt_sata_pkt->satapkt_reason;
9913 9917
9914 9918 if (++sata_atapi_trace_index >= 64)
9915 9919 sata_atapi_trace_index = 0;
9916 9920 }
9917 9921 }
9918 9922
9919 9923 #endif
9920 9924
9921 9925 /*
9922 9926 * Fetch inquiry data from ATAPI device
9923 9927 * Returns SATA_SUCCESS if operation was successful, SATA_FAILURE otherwise.
9924 9928 *
9925 9929 * Note:
9926 9930 * inqb pointer does not point to a DMA-able buffer. It is a local buffer
9927 9931 * where the caller expects to see the inquiry data.
9928 9932 *
9929 9933 */
9930 9934
9931 9935 static int
9932 9936 sata_get_atapi_inquiry_data(sata_hba_inst_t *sata_hba,
9933 9937 sata_address_t *saddr, struct scsi_inquiry *inq)
9934 9938 {
9935 9939 sata_pkt_txlate_t *spx;
9936 9940 sata_pkt_t *spkt;
9937 9941 struct buf *bp;
9938 9942 sata_drive_info_t *sdinfo;
9939 9943 sata_cmd_t *scmd;
9940 9944 int rval;
9941 9945 uint8_t *rqsp;
9942 9946 dev_info_t *dip = SATA_DIP(sata_hba);
9943 9947 #ifdef SATA_DEBUG
9944 9948 char msg_buf[MAXPATHLEN];
9945 9949 #endif
9946 9950 kmutex_t *cport_mutex;
9947 9951
9948 9952 ASSERT(sata_hba != NULL);
9949 9953
9950 9954 spx = kmem_zalloc(sizeof (sata_pkt_txlate_t), KM_SLEEP);
9951 9955 spx->txlt_sata_hba_inst = sata_hba;
9952 9956 spx->txlt_scsi_pkt = NULL; /* No scsi pkt involved */
9953 9957 spkt = sata_pkt_alloc(spx, NULL);
9954 9958 if (spkt == NULL) {
9955 9959 kmem_free(spx, sizeof (sata_pkt_txlate_t));
9956 9960 return (SATA_FAILURE);
9957 9961 }
9958 9962 /* address is needed now */
9959 9963 spkt->satapkt_device.satadev_addr = *saddr;
9960 9964
9961 9965 /* scsi_inquiry size buffer */
9962 9966 bp = sata_alloc_local_buffer(spx, sizeof (struct scsi_inquiry));
9963 9967 if (bp == NULL) {
9964 9968 sata_pkt_free(spx);
9965 9969 kmem_free(spx, sizeof (sata_pkt_txlate_t));
9966 9970 SATA_LOG_D((sata_hba, CE_WARN,
9967 9971 "sata_get_atapi_inquiry_data: "
9968 9972 "cannot allocate data buffer"));
9969 9973 return (SATA_FAILURE);
9970 9974 }
9971 9975 bp_mapin(bp); /* make data buffer accessible */
9972 9976
9973 9977 scmd = &spkt->satapkt_cmd;
9974 9978 ASSERT(scmd->satacmd_num_dma_cookies != 0);
9975 9979 ASSERT(scmd->satacmd_dma_cookie_list != NULL);
9976 9980
9977 9981 /* Use synchronous mode */
9978 9982 spkt->satapkt_op_mode = SATA_OPMODE_SYNCH | SATA_OPMODE_INTERRUPTS;
9979 9983 spkt->satapkt_comp = NULL;
9980 9984 spkt->satapkt_time = sata_default_pkt_time;
9981 9985
9982 9986 /* Issue inquiry command - 6 bytes cdb, data transfer, read */
9983 9987
9984 9988 scmd->satacmd_flags.sata_data_direction = SATA_DIR_READ;
9985 9989 scmd->satacmd_flags.sata_ignore_dev_reset = B_TRUE;
9986 9990
9987 9991 cport_mutex = &(SATA_CPORT_MUTEX(sata_hba, saddr->cport));
9988 9992 mutex_enter(cport_mutex);
9989 9993 sdinfo = sata_get_device_info(sata_hba,
9990 9994 &spx->txlt_sata_pkt->satapkt_device);
9991 9995 if (sdinfo == NULL) {
9992 9996 /* we have to be carefull about the disapearing device */
9993 9997 mutex_exit(cport_mutex);
9994 9998 rval = SATA_FAILURE;
9995 9999 goto cleanup;
9996 10000 }
9997 10001 sata_atapi_packet_cmd_setup(scmd, sdinfo);
9998 10002
9999 10003 /*
10000 10004 * Set-up acdb. This works for atapi transport version 2 and later.
10001 10005 */
10002 10006 scmd->satacmd_acdb_len = sdinfo->satadrv_atapi_cdb_len;
10003 10007 bzero(scmd->satacmd_acdb, SATA_ATAPI_MAX_CDB_LEN);
10004 10008 scmd->satacmd_acdb[0] = 0x12; /* Inquiry */
10005 10009 scmd->satacmd_acdb[1] = 0x00;
10006 10010 scmd->satacmd_acdb[2] = 0x00;
10007 10011 scmd->satacmd_acdb[3] = 0x00;
10008 10012 scmd->satacmd_acdb[4] = sizeof (struct scsi_inquiry);
10009 10013 scmd->satacmd_acdb[5] = 0x00;
10010 10014
10011 10015 sata_fixed_sense_data_preset(
10012 10016 (struct scsi_extended_sense *)scmd->satacmd_rqsense);
10013 10017
10014 10018 /* Transfer command to HBA */
10015 10019 if (sata_hba_start(spx, &rval) != 0) {
10016 10020 /* Pkt not accepted for execution */
10017 10021 SATADBG1(SATA_DBG_ATAPI, sata_hba,
10018 10022 "sata_get_atapi_inquiry_data: "
10019 10023 "Packet not accepted for execution - ret: %02x", rval);
10020 10024 mutex_exit(cport_mutex);
10021 10025 rval = SATA_FAILURE;
10022 10026 goto cleanup;
10023 10027 }
10024 10028 mutex_exit(cport_mutex);
10025 10029
10026 10030 if (spkt->satapkt_reason == SATA_PKT_COMPLETED) {
10027 10031 SATADBG1(SATA_DBG_ATAPI, sata_hba,
10028 10032 "sata_get_atapi_inquiry_data: "
10029 10033 "Packet completed successfully - ret: %02x", rval);
10030 10034 if (spx->txlt_buf_dma_handle != NULL) {
10031 10035 /*
10032 10036 * Sync buffer. Handle is in usual place in translate
10033 10037 * struct.
10034 10038 */
10035 10039 rval = ddi_dma_sync(spx->txlt_buf_dma_handle, 0, 0,
10036 10040 DDI_DMA_SYNC_FORCPU);
10037 10041 ASSERT(rval == DDI_SUCCESS);
10038 10042 }
10039 10043
10040 10044 if (sata_check_for_dma_error(dip, spx)) {
10041 10045 ddi_fm_service_impact(dip, DDI_SERVICE_UNAFFECTED);
10042 10046 rval = SATA_FAILURE;
10043 10047 } else {
10044 10048 /*
10045 10049 * Normal completion - copy data into caller's buffer
10046 10050 */
10047 10051 bcopy(bp->b_un.b_addr, (uint8_t *)inq,
10048 10052 sizeof (struct scsi_inquiry));
10049 10053 #ifdef SATA_DEBUG
10050 10054 if (sata_debug_flags & SATA_DBG_ATAPI) {
10051 10055 sata_show_inqry_data((uint8_t *)inq);
10052 10056 }
10053 10057 #endif
10054 10058 rval = SATA_SUCCESS;
10055 10059 }
10056 10060 } else {
10057 10061 /*
10058 10062 * Something went wrong - analyze return - check rqsense data
10059 10063 */
10060 10064 rval = SATA_FAILURE;
10061 10065 if (spkt->satapkt_reason == SATA_PKT_DEV_ERROR) {
10062 10066 /*
10063 10067 * ARQ data hopefull show something other than NO SENSE
10064 10068 */
10065 10069 rqsp = scmd->satacmd_rqsense;
10066 10070 #ifdef SATA_DEBUG
10067 10071 if (sata_debug_flags & SATA_DBG_ATAPI) {
10068 10072 msg_buf[0] = '\0';
10069 10073 (void) snprintf(msg_buf, MAXPATHLEN,
10070 10074 "ATAPI packet completion reason: %02x\n"
10071 10075 "RQSENSE: %02x %02x %02x %02x %02x %02x\n"
10072 10076 " %02x %02x %02x %02x %02x %02x\n"
10073 10077 " %02x %02x %02x %02x %02x %02x",
10074 10078 spkt->satapkt_reason,
10075 10079 rqsp[0], rqsp[1], rqsp[2], rqsp[3],
10076 10080 rqsp[4], rqsp[5], rqsp[6], rqsp[7],
10077 10081 rqsp[8], rqsp[9], rqsp[10], rqsp[11],
10078 10082 rqsp[12], rqsp[13], rqsp[14], rqsp[15],
10079 10083 rqsp[16], rqsp[17]);
10080 10084 sata_log(spx->txlt_sata_hba_inst, CE_WARN,
10081 10085 "%s", msg_buf);
10082 10086 }
10083 10087 #endif
10084 10088 } else {
10085 10089 switch (spkt->satapkt_reason) {
10086 10090 case SATA_PKT_PORT_ERROR:
10087 10091 SATADBG1(SATA_DBG_ATAPI, sata_hba,
10088 10092 "sata_get_atapi_inquiry_data: "
10089 10093 "packet reason: port error", NULL);
10090 10094 break;
10091 10095
10092 10096 case SATA_PKT_TIMEOUT:
10093 10097 SATADBG1(SATA_DBG_ATAPI, sata_hba,
10094 10098 "sata_get_atapi_inquiry_data: "
10095 10099 "packet reason: timeout", NULL);
10096 10100 break;
10097 10101
10098 10102 case SATA_PKT_ABORTED:
10099 10103 SATADBG1(SATA_DBG_ATAPI, sata_hba,
10100 10104 "sata_get_atapi_inquiry_data: "
10101 10105 "packet reason: aborted", NULL);
10102 10106 break;
10103 10107
10104 10108 case SATA_PKT_RESET:
10105 10109 SATADBG1(SATA_DBG_ATAPI, sata_hba,
10106 10110 "sata_get_atapi_inquiry_data: "
10107 10111 "packet reason: reset\n", NULL);
10108 10112 break;
10109 10113 default:
10110 10114 SATADBG1(SATA_DBG_ATAPI, sata_hba,
10111 10115 "sata_get_atapi_inquiry_data: "
10112 10116 "invalid packet reason: %02x\n",
10113 10117 spkt->satapkt_reason);
10114 10118 break;
10115 10119 }
10116 10120 }
10117 10121 }
10118 10122 cleanup:
10119 10123 sata_free_local_buffer(spx);
10120 10124 sata_pkt_free(spx);
10121 10125 kmem_free(spx, sizeof (sata_pkt_txlate_t));
10122 10126 return (rval);
10123 10127 }
10124 10128
10125 10129
10126 10130
10127 10131
10128 10132
10129 10133 #if 0
10130 10134 #ifdef SATA_DEBUG
10131 10135
10132 10136 /*
10133 10137 * Test ATAPI packet command.
10134 10138 * Single threaded test: send packet command in synch mode, process completion
10135 10139 *
10136 10140 */
10137 10141 static void
10138 10142 sata_test_atapi_packet_command(sata_hba_inst_t *sata_hba_inst, int cport)
10139 10143 {
10140 10144 sata_pkt_txlate_t *spx;
10141 10145 sata_pkt_t *spkt;
10142 10146 struct buf *bp;
10143 10147 sata_device_t sata_device;
10144 10148 sata_drive_info_t *sdinfo;
10145 10149 sata_cmd_t *scmd;
10146 10150 int rval;
10147 10151 uint8_t *rqsp;
10148 10152
10149 10153 ASSERT(sata_hba_inst != NULL);
10150 10154 sata_device.satadev_addr.cport = cport;
10151 10155 sata_device.satadev_addr.pmport = 0;
10152 10156 sata_device.satadev_addr.qual = SATA_ADDR_DCPORT;
10153 10157 sata_device.satadev_rev = SATA_DEVICE_REV;
10154 10158 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, cport)->cport_mutex);
10155 10159 sdinfo = sata_get_device_info(sata_hba_inst, &sata_device);
10156 10160 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, cport)->cport_mutex);
10157 10161 if (sdinfo == NULL) {
10158 10162 sata_log(sata_hba_inst, CE_WARN,
10159 10163 "sata_test_atapi_packet_command: "
10160 10164 "no device info for cport %d",
10161 10165 sata_device.satadev_addr.cport);
10162 10166 return;
10163 10167 }
10164 10168
10165 10169 spx = kmem_zalloc(sizeof (sata_pkt_txlate_t), KM_SLEEP);
10166 10170 spx->txlt_sata_hba_inst = sata_hba_inst;
10167 10171 spx->txlt_scsi_pkt = NULL; /* No scsi pkt involved */
10168 10172 spkt = sata_pkt_alloc(spx, NULL);
10169 10173 if (spkt == NULL) {
10170 10174 kmem_free(spx, sizeof (sata_pkt_txlate_t));
10171 10175 return;
10172 10176 }
10173 10177 /* address is needed now */
10174 10178 spkt->satapkt_device.satadev_addr = sata_device.satadev_addr;
10175 10179
10176 10180 /* 1024k buffer */
10177 10181 bp = sata_alloc_local_buffer(spx, 1024);
10178 10182 if (bp == NULL) {
10179 10183 sata_pkt_free(spx);
10180 10184 kmem_free(spx, sizeof (sata_pkt_txlate_t));
10181 10185 sata_log(sata_hba_inst, CE_WARN,
10182 10186 "sata_test_atapi_packet_command: "
10183 10187 "cannot allocate data buffer");
10184 10188 return;
10185 10189 }
10186 10190 bp_mapin(bp); /* make data buffer accessible */
10187 10191
10188 10192 scmd = &spkt->satapkt_cmd;
10189 10193 ASSERT(scmd->satacmd_num_dma_cookies != 0);
10190 10194 ASSERT(scmd->satacmd_dma_cookie_list != NULL);
10191 10195
10192 10196 /* Use synchronous mode */
10193 10197 spkt->satapkt_op_mode = SATA_OPMODE_SYNCH | SATA_OPMODE_INTERRUPTS;
10194 10198
10195 10199 /* Synchronous mode, no callback - may be changed by the caller */
10196 10200 spkt->satapkt_comp = NULL;
10197 10201 spkt->satapkt_time = sata_default_pkt_time;
10198 10202
10199 10203 /* Issue inquiry command - 6 bytes cdb, data transfer, read */
10200 10204
10201 10205 scmd->satacmd_flags.sata_data_direction = SATA_DIR_READ;
10202 10206 scmd->satacmd_flags.sata_ignore_dev_reset = B_TRUE;
10203 10207
10204 10208 sata_atapi_packet_cmd_setup(scmd, sdinfo);
10205 10209
10206 10210 /* Set-up acdb. */
10207 10211 scmd->satacmd_acdb_len = sdinfo->satadrv_atapi_cdb_len;
10208 10212 bzero(scmd->satacmd_acdb, SATA_ATAPI_MAX_CDB_LEN);
10209 10213 scmd->satacmd_acdb[0] = 0x12; /* Inquiry */
10210 10214 scmd->satacmd_acdb[1] = 0x00;
10211 10215 scmd->satacmd_acdb[2] = 0x00;
10212 10216 scmd->satacmd_acdb[3] = 0x00;
10213 10217 scmd->satacmd_acdb[4] = sizeof (struct scsi_inquiry);
10214 10218 scmd->satacmd_acdb[5] = 0x00;
10215 10219
10216 10220 sata_fixed_sense_data_preset(
10217 10221 (struct scsi_extended_sense *)scmd->satacmd_rqsense);
10218 10222
10219 10223 /* Transfer command to HBA */
10220 10224 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, cport)->cport_mutex);
10221 10225 if (sata_hba_start(spx, &rval) != 0) {
10222 10226 /* Pkt not accepted for execution */
10223 10227 sata_log(sata_hba_inst, CE_WARN,
10224 10228 "sata_test_atapi_packet_command: "
10225 10229 "Packet not accepted for execution - ret: %02x", rval);
10226 10230 mutex_exit(
10227 10231 &SATA_CPORT_INFO(sata_hba_inst, cport)->cport_mutex);
10228 10232 goto cleanup;
10229 10233 }
10230 10234 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, cport)->cport_mutex);
10231 10235
10232 10236 if (spx->txlt_buf_dma_handle != NULL) {
10233 10237 /*
10234 10238 * Sync buffer. Handle is in usual place in translate struct.
10235 10239 */
10236 10240 rval = ddi_dma_sync(spx->txlt_buf_dma_handle, 0, 0,
10237 10241 DDI_DMA_SYNC_FORCPU);
10238 10242 ASSERT(rval == DDI_SUCCESS);
10239 10243 }
10240 10244 if (spkt->satapkt_reason == SATA_PKT_COMPLETED) {
10241 10245 sata_log(sata_hba_inst, CE_WARN,
10242 10246 "sata_test_atapi_packet_command: "
10243 10247 "Packet completed successfully");
10244 10248 /*
10245 10249 * Normal completion - show inquiry data
10246 10250 */
10247 10251 sata_show_inqry_data((uint8_t *)bp->b_un.b_addr);
10248 10252 } else {
10249 10253 /*
10250 10254 * Something went wrong - analyze return - check rqsense data
10251 10255 */
10252 10256 if (spkt->satapkt_reason == SATA_PKT_DEV_ERROR) {
10253 10257 /*
10254 10258 * ARQ data hopefull show something other than NO SENSE
10255 10259 */
10256 10260 rqsp = scmd->satacmd_rqsense;
10257 10261 sata_log(spx->txlt_sata_hba_inst, CE_WARN,
10258 10262 "ATAPI packet completion reason: %02x\n"
10259 10263 "RQSENSE: %02x %02x %02x %02x %02x %02x "
10260 10264 " %02x %02x %02x %02x %02x %02x "
10261 10265 " %02x %02x %02x %02x %02x %02x\n",
10262 10266 spkt->satapkt_reason,
10263 10267 rqsp[0], rqsp[1], rqsp[2], rqsp[3],
10264 10268 rqsp[4], rqsp[5], rqsp[6], rqsp[7],
10265 10269 rqsp[8], rqsp[9], rqsp[10], rqsp[11],
10266 10270 rqsp[12], rqsp[13], rqsp[14], rqsp[15],
10267 10271 rqsp[16], rqsp[17]);
10268 10272 } else {
10269 10273 switch (spkt->satapkt_reason) {
10270 10274 case SATA_PKT_PORT_ERROR:
10271 10275 sata_log(sata_hba_inst, CE_WARN,
10272 10276 "sata_test_atapi_packet_command: "
10273 10277 "packet reason: port error\n");
10274 10278 break;
10275 10279
10276 10280 case SATA_PKT_TIMEOUT:
10277 10281 sata_log(sata_hba_inst, CE_WARN,
10278 10282 "sata_test_atapi_packet_command: "
10279 10283 "packet reason: timeout\n");
10280 10284 break;
10281 10285
10282 10286 case SATA_PKT_ABORTED:
10283 10287 sata_log(sata_hba_inst, CE_WARN,
10284 10288 "sata_test_atapi_packet_command: "
10285 10289 "packet reason: aborted\n");
10286 10290 break;
10287 10291
10288 10292 case SATA_PKT_RESET:
10289 10293 sata_log(sata_hba_inst, CE_WARN,
10290 10294 "sata_test_atapi_packet_command: "
10291 10295 "packet reason: reset\n");
10292 10296 break;
10293 10297 default:
10294 10298 sata_log(sata_hba_inst, CE_WARN,
10295 10299 "sata_test_atapi_packet_command: "
10296 10300 "invalid packet reason: %02x\n",
10297 10301 spkt->satapkt_reason);
10298 10302 break;
10299 10303 }
10300 10304 }
10301 10305 }
10302 10306 cleanup:
10303 10307 sata_free_local_buffer(spx);
10304 10308 sata_pkt_free(spx);
10305 10309 kmem_free(spx, sizeof (sata_pkt_txlate_t));
10306 10310 }
10307 10311
10308 10312 #endif /* SATA_DEBUG */
10309 10313 #endif /* 1 */
10310 10314
10311 10315
10312 10316 /* ************************** LOCAL HELPER FUNCTIONS *********************** */
10313 10317
10314 10318 /*
10315 10319 * Validate sata_tran info
10316 10320 * SATA_FAILURE returns if structure is inconsistent or structure revision
10317 10321 * does not match one used by the framework.
10318 10322 *
10319 10323 * Returns SATA_SUCCESS if sata_hba_tran has matching revision and contains
10320 10324 * required function pointers.
10321 10325 * Returns SATA_FAILURE otherwise.
10322 10326 */
10323 10327 static int
10324 10328 sata_validate_sata_hba_tran(dev_info_t *dip, sata_hba_tran_t *sata_tran)
10325 10329 {
10326 10330 /*
10327 10331 * SATA_TRAN_HBA_REV is the current (highest) revision number
10328 10332 * of the SATA interface.
10329 10333 */
10330 10334 if (sata_tran->sata_tran_hba_rev > SATA_TRAN_HBA_REV) {
10331 10335 sata_log(NULL, CE_WARN,
10332 10336 "sata: invalid sata_hba_tran version %d for driver %s",
10333 10337 sata_tran->sata_tran_hba_rev, ddi_driver_name(dip));
10334 10338 return (SATA_FAILURE);
10335 10339 }
10336 10340
10337 10341 if (dip != sata_tran->sata_tran_hba_dip) {
10338 10342 SATA_LOG_D((NULL, CE_WARN,
10339 10343 "sata: inconsistent sata_tran_hba_dip "
10340 10344 "%p / %p", sata_tran->sata_tran_hba_dip, dip));
10341 10345 return (SATA_FAILURE);
10342 10346 }
10343 10347
10344 10348 if (sata_tran->sata_tran_probe_port == NULL ||
10345 10349 sata_tran->sata_tran_start == NULL ||
10346 10350 sata_tran->sata_tran_abort == NULL ||
10347 10351 sata_tran->sata_tran_reset_dport == NULL ||
10348 10352 sata_tran->sata_tran_hotplug_ops == NULL ||
10349 10353 sata_tran->sata_tran_hotplug_ops->sata_tran_port_activate == NULL ||
10350 10354 sata_tran->sata_tran_hotplug_ops->sata_tran_port_deactivate ==
10351 10355 NULL) {
10352 10356 SATA_LOG_D((NULL, CE_WARN, "sata: sata_hba_tran missing "
10353 10357 "required functions"));
10354 10358 }
10355 10359 return (SATA_SUCCESS);
10356 10360 }
10357 10361
10358 10362 /*
10359 10363 * Remove HBA instance from sata_hba_list.
10360 10364 */
10361 10365 static void
10362 10366 sata_remove_hba_instance(dev_info_t *dip)
10363 10367 {
10364 10368 sata_hba_inst_t *sata_hba_inst;
10365 10369
10366 10370 mutex_enter(&sata_mutex);
10367 10371 for (sata_hba_inst = sata_hba_list;
10368 10372 sata_hba_inst != (struct sata_hba_inst *)NULL;
10369 10373 sata_hba_inst = sata_hba_inst->satahba_next) {
10370 10374 if (sata_hba_inst->satahba_dip == dip)
10371 10375 break;
10372 10376 }
10373 10377
10374 10378 if (sata_hba_inst == (struct sata_hba_inst *)NULL) {
10375 10379 #ifdef SATA_DEBUG
10376 10380 cmn_err(CE_WARN, "sata_remove_hba_instance: "
10377 10381 "unknown HBA instance\n");
10378 10382 #endif
10379 10383 ASSERT(FALSE);
10380 10384 }
10381 10385 if (sata_hba_inst == sata_hba_list) {
10382 10386 sata_hba_list = sata_hba_inst->satahba_next;
10383 10387 if (sata_hba_list) {
10384 10388 sata_hba_list->satahba_prev =
10385 10389 (struct sata_hba_inst *)NULL;
10386 10390 }
10387 10391 if (sata_hba_inst == sata_hba_list_tail) {
10388 10392 sata_hba_list_tail = NULL;
10389 10393 }
10390 10394 } else if (sata_hba_inst == sata_hba_list_tail) {
10391 10395 sata_hba_list_tail = sata_hba_inst->satahba_prev;
10392 10396 if (sata_hba_list_tail) {
10393 10397 sata_hba_list_tail->satahba_next =
10394 10398 (struct sata_hba_inst *)NULL;
10395 10399 }
10396 10400 } else {
10397 10401 sata_hba_inst->satahba_prev->satahba_next =
10398 10402 sata_hba_inst->satahba_next;
10399 10403 sata_hba_inst->satahba_next->satahba_prev =
10400 10404 sata_hba_inst->satahba_prev;
10401 10405 }
10402 10406 mutex_exit(&sata_mutex);
10403 10407 }
10404 10408
10405 10409 /*
10406 10410 * Probe all SATA ports of the specified HBA instance.
10407 10411 * The assumption is that there are no target and attachment point minor nodes
10408 10412 * created by the boot subsystems, so we do not need to prune device tree.
10409 10413 *
10410 10414 * This function is called only from sata_hba_attach(). It does not have to
10411 10415 * be protected by controller mutex, because the hba_attached flag is not set
10412 10416 * yet and no one would be touching this HBA instance other than this thread.
10413 10417 * Determines if port is active and what type of the device is attached
10414 10418 * (if any). Allocates necessary structures for each port.
10415 10419 *
10416 10420 * An AP (Attachement Point) node is created for each SATA device port even
10417 10421 * when there is no device attached.
10418 10422 */
10419 10423
10420 10424 static void
10421 10425 sata_probe_ports(sata_hba_inst_t *sata_hba_inst)
10422 10426 {
10423 10427 dev_info_t *dip = SATA_DIP(sata_hba_inst);
10424 10428 int ncport;
10425 10429 sata_cport_info_t *cportinfo;
10426 10430 sata_drive_info_t *drive;
10427 10431 sata_device_t sata_device;
10428 10432 int rval;
10429 10433 dev_t minor_number;
10430 10434 char name[16];
10431 10435 clock_t start_time, cur_time;
10432 10436
10433 10437 /*
10434 10438 * Probe controller ports first, to find port status and
10435 10439 * any port multiplier attached.
10436 10440 */
10437 10441 for (ncport = 0; ncport < SATA_NUM_CPORTS(sata_hba_inst); ncport++) {
10438 10442 /* allocate cport structure */
10439 10443 cportinfo = kmem_zalloc(sizeof (sata_cport_info_t), KM_SLEEP);
10440 10444 ASSERT(cportinfo != NULL);
10441 10445 mutex_init(&cportinfo->cport_mutex, NULL, MUTEX_DRIVER, NULL);
10442 10446
10443 10447 mutex_enter(&cportinfo->cport_mutex);
10444 10448
10445 10449 cportinfo->cport_addr.cport = ncport;
10446 10450 cportinfo->cport_addr.pmport = 0;
10447 10451 cportinfo->cport_addr.qual = SATA_ADDR_CPORT;
10448 10452 cportinfo->cport_state &= ~SATA_PORT_STATE_CLEAR_MASK;
10449 10453 cportinfo->cport_state |= SATA_STATE_PROBING;
10450 10454 SATA_CPORT_INFO(sata_hba_inst, ncport) = cportinfo;
10451 10455
10452 10456 /*
10453 10457 * Regardless if a port is usable or not, create
10454 10458 * an attachment point
10455 10459 */
10456 10460 mutex_exit(&cportinfo->cport_mutex);
10457 10461 minor_number = SATA_MAKE_AP_MINOR(ddi_get_instance(dip),
10458 10462 ncport, 0, SATA_ADDR_CPORT);
10459 10463 (void) sprintf(name, "%d", ncport);
10460 10464 if (ddi_create_minor_node(dip, name, S_IFCHR,
10461 10465 minor_number, DDI_NT_SATA_ATTACHMENT_POINT, 0) !=
10462 10466 DDI_SUCCESS) {
10463 10467 sata_log(sata_hba_inst, CE_WARN, "sata_hba_attach: "
10464 10468 "cannot create SATA attachment point for port %d",
10465 10469 ncport);
10466 10470 }
10467 10471
10468 10472 /* Probe port */
10469 10473 start_time = ddi_get_lbolt();
10470 10474 reprobe_cport:
10471 10475 sata_device.satadev_addr.cport = ncport;
10472 10476 sata_device.satadev_addr.pmport = 0;
10473 10477 sata_device.satadev_addr.qual = SATA_ADDR_CPORT;
10474 10478 sata_device.satadev_rev = SATA_DEVICE_REV;
10475 10479
10476 10480 rval = (*SATA_PROBE_PORT_FUNC(sata_hba_inst))
10477 10481 (dip, &sata_device);
10478 10482
10479 10483 mutex_enter(&cportinfo->cport_mutex);
10480 10484 cportinfo->cport_scr = sata_device.satadev_scr;
10481 10485 if (rval != SATA_SUCCESS) {
10482 10486 /* Something went wrong? Fail the port */
10483 10487 cportinfo->cport_state = SATA_PSTATE_FAILED;
10484 10488 mutex_exit(&cportinfo->cport_mutex);
10485 10489 continue;
10486 10490 }
10487 10491 cportinfo->cport_state &= ~SATA_STATE_PROBING;
10488 10492 cportinfo->cport_state |= SATA_STATE_PROBED;
10489 10493 cportinfo->cport_dev_type = sata_device.satadev_type;
10490 10494
10491 10495 cportinfo->cport_state |= SATA_STATE_READY;
10492 10496 if (cportinfo->cport_dev_type == SATA_DTYPE_NONE) {
10493 10497 mutex_exit(&cportinfo->cport_mutex);
10494 10498 continue;
10495 10499 }
10496 10500 if (cportinfo->cport_dev_type != SATA_DTYPE_PMULT) {
10497 10501 /*
10498 10502 * There is some device attached.
10499 10503 * Allocate device info structure
10500 10504 */
10501 10505 if (SATA_CPORTINFO_DRV_INFO(cportinfo) == NULL) {
10502 10506 mutex_exit(&cportinfo->cport_mutex);
10503 10507 SATA_CPORTINFO_DRV_INFO(cportinfo) =
10504 10508 kmem_zalloc(sizeof (sata_drive_info_t),
10505 10509 KM_SLEEP);
10506 10510 mutex_enter(&cportinfo->cport_mutex);
10507 10511 }
10508 10512 drive = SATA_CPORTINFO_DRV_INFO(cportinfo);
10509 10513 drive->satadrv_addr = cportinfo->cport_addr;
10510 10514 drive->satadrv_addr.qual = SATA_ADDR_DCPORT;
10511 10515 drive->satadrv_type = cportinfo->cport_dev_type;
10512 10516 drive->satadrv_state = SATA_STATE_UNKNOWN;
10513 10517
10514 10518 mutex_exit(&cportinfo->cport_mutex);
10515 10519 if (sata_add_device(dip, sata_hba_inst, &sata_device) !=
10516 10520 SATA_SUCCESS) {
10517 10521 /*
10518 10522 * Plugged device was not correctly identified.
10519 10523 * Retry, within a SATA_DEV_IDENTIFY_TIMEOUT
10520 10524 */
10521 10525 cur_time = ddi_get_lbolt();
10522 10526 if ((cur_time - start_time) <
10523 10527 drv_usectohz(SATA_DEV_IDENTIFY_TIMEOUT)) {
10524 10528 /* sleep for a while */
10525 10529 delay(drv_usectohz(
10526 10530 SATA_DEV_RETRY_DLY));
10527 10531 goto reprobe_cport;
10528 10532 }
10529 10533 }
10530 10534 } else { /* SATA_DTYPE_PMULT */
10531 10535 mutex_exit(&cportinfo->cport_mutex);
10532 10536
10533 10537 /* Allocate sata_pmult_info and sata_pmport_info */
10534 10538 if (sata_alloc_pmult(sata_hba_inst, &sata_device) !=
10535 10539 SATA_SUCCESS)
10536 10540 continue;
10537 10541
10538 10542 /* Log the information of the port multiplier */
10539 10543 sata_show_pmult_info(sata_hba_inst, &sata_device);
10540 10544
10541 10545 /* Probe its pmports */
10542 10546 sata_probe_pmports(sata_hba_inst, ncport);
10543 10547 }
10544 10548 }
10545 10549 }
10546 10550
10547 10551 /*
10548 10552 * Probe all device ports behind a port multiplier.
10549 10553 *
10550 10554 * PMult-related structure should be allocated before by sata_alloc_pmult().
10551 10555 *
10552 10556 * NOTE1: Only called from sata_probe_ports()
10553 10557 * NOTE2: No mutex should be hold.
10554 10558 */
10555 10559 static void
10556 10560 sata_probe_pmports(sata_hba_inst_t *sata_hba_inst, uint8_t ncport)
10557 10561 {
10558 10562 dev_info_t *dip = SATA_DIP(sata_hba_inst);
10559 10563 sata_pmult_info_t *pmultinfo = NULL;
10560 10564 sata_pmport_info_t *pmportinfo = NULL;
10561 10565 sata_drive_info_t *drive = NULL;
10562 10566 sata_device_t sata_device;
10563 10567
10564 10568 clock_t start_time, cur_time;
10565 10569 int npmport;
10566 10570 int rval;
10567 10571
10568 10572 pmultinfo = SATA_PMULT_INFO(sata_hba_inst, ncport);
10569 10573
10570 10574 /* Probe Port Multiplier ports */
10571 10575 for (npmport = 0; npmport < pmultinfo->pmult_num_dev_ports; npmport++) {
10572 10576 pmportinfo = pmultinfo->pmult_dev_port[npmport];
10573 10577 start_time = ddi_get_lbolt();
10574 10578 reprobe_pmport:
10575 10579 sata_device.satadev_addr.cport = ncport;
10576 10580 sata_device.satadev_addr.pmport = npmport;
10577 10581 sata_device.satadev_addr.qual = SATA_ADDR_PMPORT;
10578 10582 sata_device.satadev_rev = SATA_DEVICE_REV;
10579 10583
10580 10584 /* Let HBA driver probe it. */
10581 10585 rval = (*SATA_PROBE_PORT_FUNC(sata_hba_inst))
10582 10586 (dip, &sata_device);
10583 10587 mutex_enter(&pmportinfo->pmport_mutex);
10584 10588
10585 10589 pmportinfo->pmport_scr = sata_device.satadev_scr;
10586 10590
10587 10591 if (rval != SATA_SUCCESS) {
10588 10592 pmportinfo->pmport_state =
10589 10593 SATA_PSTATE_FAILED;
10590 10594 mutex_exit(&pmportinfo->pmport_mutex);
10591 10595 continue;
10592 10596 }
10593 10597 pmportinfo->pmport_state &= ~SATA_STATE_PROBING;
10594 10598 pmportinfo->pmport_state |= SATA_STATE_PROBED;
10595 10599 pmportinfo->pmport_dev_type = sata_device.satadev_type;
10596 10600
10597 10601 pmportinfo->pmport_state |= SATA_STATE_READY;
10598 10602 if (pmportinfo->pmport_dev_type ==
10599 10603 SATA_DTYPE_NONE) {
10600 10604 SATADBG2(SATA_DBG_PMULT, sata_hba_inst,
10601 10605 "no device found at port %d:%d", ncport, npmport);
10602 10606 mutex_exit(&pmportinfo->pmport_mutex);
10603 10607 continue;
10604 10608 }
10605 10609 /* Port multipliers cannot be chained */
10606 10610 ASSERT(pmportinfo->pmport_dev_type != SATA_DTYPE_PMULT);
10607 10611 /*
10608 10612 * There is something attached to Port
10609 10613 * Multiplier device port
10610 10614 * Allocate device info structure
10611 10615 */
10612 10616 if (pmportinfo->pmport_sata_drive == NULL) {
10613 10617 mutex_exit(&pmportinfo->pmport_mutex);
10614 10618 pmportinfo->pmport_sata_drive =
10615 10619 kmem_zalloc(sizeof (sata_drive_info_t), KM_SLEEP);
10616 10620 mutex_enter(&pmportinfo->pmport_mutex);
10617 10621 }
10618 10622 drive = pmportinfo->pmport_sata_drive;
10619 10623 drive->satadrv_addr.cport = pmportinfo->pmport_addr.cport;
10620 10624 drive->satadrv_addr.pmport = npmport;
10621 10625 drive->satadrv_addr.qual = SATA_ADDR_DPMPORT;
10622 10626 drive->satadrv_type = pmportinfo-> pmport_dev_type;
10623 10627 drive->satadrv_state = SATA_STATE_UNKNOWN;
10624 10628
10625 10629 mutex_exit(&pmportinfo->pmport_mutex);
10626 10630 rval = sata_add_device(dip, sata_hba_inst, &sata_device);
10627 10631
10628 10632 if (rval != SATA_SUCCESS) {
10629 10633 /*
10630 10634 * Plugged device was not correctly identified.
10631 10635 * Retry, within the SATA_DEV_IDENTIFY_TIMEOUT
10632 10636 */
10633 10637 cur_time = ddi_get_lbolt();
10634 10638 if ((cur_time - start_time) < drv_usectohz(
10635 10639 SATA_DEV_IDENTIFY_TIMEOUT)) {
10636 10640 /* sleep for a while */
10637 10641 delay(drv_usectohz(SATA_DEV_RETRY_DLY));
10638 10642 goto reprobe_pmport;
10639 10643 }
10640 10644 }
10641 10645 }
10642 10646 }
10643 10647
10644 10648 /*
10645 10649 * Add SATA device for specified HBA instance & port (SCSI target
10646 10650 * device nodes).
10647 10651 * This function is called (indirectly) only from sata_hba_attach().
10648 10652 * A target node is created when there is a supported type device attached,
10649 10653 * but may be removed if it cannot be put online.
10650 10654 *
10651 10655 * This function cannot be called from an interrupt context.
10652 10656 *
10653 10657 * Create target nodes for disk, CD/DVD, Tape and ATAPI disk devices
10654 10658 *
10655 10659 * Returns SATA_SUCCESS when port/device was fully processed, SATA_FAILURE when
10656 10660 * device identification failed - adding a device could be retried.
10657 10661 *
10658 10662 */
10659 10663 static int
10660 10664 sata_add_device(dev_info_t *pdip, sata_hba_inst_t *sata_hba_inst,
10661 10665 sata_device_t *sata_device)
10662 10666 {
10663 10667 sata_cport_info_t *cportinfo;
10664 10668 sata_pmult_info_t *pminfo;
10665 10669 sata_pmport_info_t *pmportinfo;
10666 10670 dev_info_t *cdip; /* child dip */
10667 10671 sata_address_t *saddr = &sata_device->satadev_addr;
10668 10672 uint8_t cport, pmport;
10669 10673 int rval;
10670 10674
10671 10675 cport = saddr->cport;
10672 10676 pmport = saddr->pmport;
10673 10677 cportinfo = SATA_CPORT_INFO(sata_hba_inst, cport);
10674 10678 ASSERT(cportinfo->cport_dev_type != SATA_DTYPE_NONE);
10675 10679
10676 10680 /*
10677 10681 * Some device is attached to a controller port.
10678 10682 * We rely on controllers distinquishing between no-device,
10679 10683 * attached port multiplier and other kind of attached device.
10680 10684 * We need to get Identify Device data and determine
10681 10685 * positively the dev type before trying to attach
10682 10686 * the target driver.
10683 10687 */
10684 10688 sata_device->satadev_rev = SATA_DEVICE_REV;
10685 10689 switch (saddr->qual) {
10686 10690 case SATA_ADDR_CPORT:
10687 10691 /*
10688 10692 * Add a non-port-multiplier device at controller port.
10689 10693 */
10690 10694 saddr->qual = SATA_ADDR_DCPORT;
10691 10695
10692 10696 rval = sata_probe_device(sata_hba_inst, sata_device);
10693 10697 if (rval != SATA_SUCCESS ||
10694 10698 sata_device->satadev_type == SATA_DTYPE_UNKNOWN)
10695 10699 return (SATA_FAILURE);
10696 10700
10697 10701 mutex_enter(&cportinfo->cport_mutex);
10698 10702 sata_show_drive_info(sata_hba_inst,
10699 10703 SATA_CPORTINFO_DRV_INFO(cportinfo));
10700 10704
10701 10705 if ((sata_device->satadev_type & SATA_VALID_DEV_TYPE) == 0) {
10702 10706 /*
10703 10707 * Could not determine device type or
10704 10708 * a device is not supported.
10705 10709 * Degrade this device to unknown.
10706 10710 */
10707 10711 cportinfo->cport_dev_type = SATA_DTYPE_UNKNOWN;
10708 10712 mutex_exit(&cportinfo->cport_mutex);
10709 10713 return (SATA_SUCCESS);
10710 10714 }
10711 10715 cportinfo->cport_dev_type = sata_device->satadev_type;
10712 10716 cportinfo->cport_tgtnode_clean = B_TRUE;
10713 10717 mutex_exit(&cportinfo->cport_mutex);
10714 10718
10715 10719 /*
10716 10720 * Initialize device to the desired state. Even if it
10717 10721 * fails, the device will still attach but syslog
10718 10722 * will show the warning.
10719 10723 */
10720 10724 if (sata_initialize_device(sata_hba_inst,
10721 10725 SATA_CPORTINFO_DRV_INFO(cportinfo)) != SATA_SUCCESS) {
10722 10726 /* Retry */
10723 10727 rval = sata_initialize_device(sata_hba_inst,
10724 10728 SATA_CPORTINFO_DRV_INFO(cportinfo));
10725 10729
10726 10730 if (rval == SATA_RETRY)
10727 10731 sata_log(sata_hba_inst, CE_WARN,
10728 10732 "SATA device at port %d - "
10729 10733 "default device features could not be set."
10730 10734 " Device may not operate as expected.",
10731 10735 cport);
10732 10736 }
10733 10737
10734 10738 cdip = sata_create_target_node(pdip, sata_hba_inst, saddr);
10735 10739 if (cdip == NULL) {
10736 10740 /*
10737 10741 * Attaching target node failed.
10738 10742 * We retain sata_drive_info structure...
10739 10743 */
10740 10744 return (SATA_SUCCESS);
10741 10745 }
10742 10746
10743 10747 mutex_enter(&cportinfo->cport_mutex);
10744 10748 (SATA_CPORTINFO_DRV_INFO(cportinfo))->
10745 10749 satadrv_state = SATA_STATE_READY;
10746 10750 mutex_exit(&cportinfo->cport_mutex);
10747 10751
10748 10752 break;
10749 10753
10750 10754 case SATA_ADDR_PMPORT:
10751 10755 saddr->qual = SATA_ADDR_DPMPORT;
10752 10756
10753 10757 mutex_enter(&cportinfo->cport_mutex);
10754 10758 /* It must be a Port Multiplier at the controller port */
10755 10759 ASSERT(cportinfo->cport_dev_type == SATA_DTYPE_PMULT);
10756 10760
10757 10761 pminfo = SATA_CPORTINFO_PMULT_INFO(cportinfo);
10758 10762 pmportinfo = pminfo->pmult_dev_port[saddr->pmport];
10759 10763 mutex_exit(&cportinfo->cport_mutex);
10760 10764
10761 10765 rval = sata_probe_device(sata_hba_inst, sata_device);
10762 10766 if (rval != SATA_SUCCESS ||
10763 10767 sata_device->satadev_type == SATA_DTYPE_UNKNOWN) {
10764 10768 return (SATA_FAILURE);
10765 10769 }
10766 10770
10767 10771 mutex_enter(&pmportinfo->pmport_mutex);
10768 10772 sata_show_drive_info(sata_hba_inst,
10769 10773 SATA_PMPORTINFO_DRV_INFO(pmportinfo));
10770 10774
10771 10775 if ((sata_device->satadev_type & SATA_VALID_DEV_TYPE) == 0) {
10772 10776 /*
10773 10777 * Could not determine device type.
10774 10778 * Degrade this device to unknown.
10775 10779 */
10776 10780 pmportinfo->pmport_dev_type = SATA_DTYPE_UNKNOWN;
10777 10781 mutex_exit(&pmportinfo->pmport_mutex);
10778 10782 return (SATA_SUCCESS);
10779 10783 }
10780 10784 pmportinfo->pmport_dev_type = sata_device->satadev_type;
10781 10785 pmportinfo->pmport_tgtnode_clean = B_TRUE;
10782 10786 mutex_exit(&pmportinfo->pmport_mutex);
10783 10787
10784 10788 /*
10785 10789 * Initialize device to the desired state.
10786 10790 * Even if it fails, the device will still
10787 10791 * attach but syslog will show the warning.
10788 10792 */
10789 10793 if (sata_initialize_device(sata_hba_inst,
10790 10794 pmportinfo->pmport_sata_drive) != SATA_SUCCESS) {
10791 10795 /* Retry */
10792 10796 rval = sata_initialize_device(sata_hba_inst,
10793 10797 pmportinfo->pmport_sata_drive);
10794 10798
10795 10799 if (rval == SATA_RETRY)
10796 10800 sata_log(sata_hba_inst, CE_WARN,
10797 10801 "SATA device at port %d:%d - "
10798 10802 "default device features could not be set."
10799 10803 " Device may not operate as expected.",
10800 10804 cport, pmport);
10801 10805 }
10802 10806
10803 10807 cdip = sata_create_target_node(pdip, sata_hba_inst, saddr);
10804 10808 if (cdip == NULL) {
10805 10809 /*
10806 10810 * Attaching target node failed.
10807 10811 * We retain sata_drive_info structure...
10808 10812 */
10809 10813 return (SATA_SUCCESS);
10810 10814 }
10811 10815 mutex_enter(&pmportinfo->pmport_mutex);
10812 10816 pmportinfo->pmport_sata_drive->satadrv_state |=
10813 10817 SATA_STATE_READY;
10814 10818 mutex_exit(&pmportinfo->pmport_mutex);
10815 10819
10816 10820 break;
10817 10821
10818 10822 default:
10819 10823 return (SATA_FAILURE);
10820 10824 }
10821 10825
10822 10826 return (SATA_SUCCESS);
10823 10827 }
10824 10828
10825 10829 /*
10826 10830 * Clean up target node at specific address.
10827 10831 *
10828 10832 * NOTE: No Mutex should be hold.
10829 10833 */
10830 10834 static int
10831 10835 sata_offline_device(sata_hba_inst_t *sata_hba_inst,
10832 10836 sata_device_t *sata_device, sata_drive_info_t *sdinfo)
10833 10837 {
10834 10838 uint8_t cport, pmport, qual;
10835 10839 dev_info_t *tdip;
10836 10840
10837 10841 cport = sata_device->satadev_addr.cport;
10838 10842 pmport = sata_device->satadev_addr.pmport;
10839 10843 qual = sata_device->satadev_addr.qual;
10840 10844
10841 10845 if (qual == SATA_ADDR_DCPORT) {
10842 10846 SATA_LOG_D((sata_hba_inst, CE_WARN,
10843 10847 "sata_hba_ioctl: disconnect device at port %d", cport));
10844 10848 } else {
10845 10849 SATA_LOG_D((sata_hba_inst, CE_WARN,
10846 10850 "sata_hba_ioctl: disconnect device at port %d:%d",
10847 10851 cport, pmport));
10848 10852 }
10849 10853
10850 10854 /* We are addressing attached device, not a port */
10851 10855 sata_device->satadev_addr.qual =
10852 10856 sdinfo->satadrv_addr.qual;
10853 10857 tdip = sata_get_scsi_target_dip(SATA_DIP(sata_hba_inst),
10854 10858 &sata_device->satadev_addr);
10855 10859 if (tdip != NULL && ndi_devi_offline(tdip,
10856 10860 NDI_DEVI_REMOVE) != NDI_SUCCESS) {
10857 10861 /*
10858 10862 * Problem :
10859 10863 * The target node remained attached.
10860 10864 * This happens when the device file was open
10861 10865 * or a node was waiting for resources.
10862 10866 * Cannot do anything about it.
10863 10867 */
10864 10868 if (qual == SATA_ADDR_DCPORT) {
10865 10869 SATA_LOG_D((sata_hba_inst, CE_WARN,
10866 10870 "sata_hba_ioctl: disconnect: could "
10867 10871 "not unconfigure device before "
10868 10872 "disconnecting the SATA port %d",
10869 10873 cport));
10870 10874 } else {
10871 10875 SATA_LOG_D((sata_hba_inst, CE_WARN,
10872 10876 "sata_hba_ioctl: disconnect: could "
10873 10877 "not unconfigure device before "
10874 10878 "disconnecting the SATA port %d:%d",
10875 10879 cport, pmport));
10876 10880 }
10877 10881 /*
10878 10882 * Set DEVICE REMOVED state in the target
10879 10883 * node. It will prevent access to the device
10880 10884 * even when a new device is attached, until
10881 10885 * the old target node is released, removed and
10882 10886 * recreated for a new device.
10883 10887 */
10884 10888 sata_set_device_removed(tdip);
10885 10889
10886 10890 /*
10887 10891 * Instruct event daemon to try the target
10888 10892 * node cleanup later.
10889 10893 */
10890 10894 sata_set_target_node_cleanup(
10891 10895 sata_hba_inst, &sata_device->satadev_addr);
10892 10896 }
10893 10897
10894 10898
10895 10899 return (SATA_SUCCESS);
10896 10900 }
10897 10901
10898 10902
10899 10903 /*
|
↓ open down ↓ |
1672 lines elided |
↑ open up ↑ |
10900 10904 * Create scsi target node for attached device, create node properties and
10901 10905 * attach the node.
10902 10906 * The node could be removed if the device onlining fails.
10903 10907 *
10904 10908 * A dev_info_t pointer is returned if operation is successful, NULL is
10905 10909 * returned otherwise.
10906 10910 */
10907 10911
10908 10912 static dev_info_t *
10909 10913 sata_create_target_node(dev_info_t *dip, sata_hba_inst_t *sata_hba_inst,
10910 - sata_address_t *sata_addr)
10914 + sata_address_t *sata_addr)
10911 10915 {
10912 10916 dev_info_t *cdip = NULL;
10913 10917 int rval;
10914 10918 char *nname = NULL;
10915 10919 char **compatible = NULL;
10916 10920 int ncompatible;
10917 10921 struct scsi_inquiry inq;
10918 10922 sata_device_t sata_device;
10919 10923 sata_drive_info_t *sdinfo;
10920 10924 int target;
10921 10925 int i;
10922 10926
10923 10927 sata_device.satadev_rev = SATA_DEVICE_REV;
10924 10928 sata_device.satadev_addr = *sata_addr;
10925 10929
10926 10930 mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst, sata_addr->cport)));
10927 10931
10928 10932 sdinfo = sata_get_device_info(sata_hba_inst, &sata_device);
10929 10933
10930 10934 target = SATA_TO_SCSI_TARGET(sata_addr->cport,
10931 10935 sata_addr->pmport, sata_addr->qual);
10932 10936
10933 10937 if (sdinfo == NULL) {
10934 10938 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
10935 10939 sata_addr->cport)));
10936 10940 SATA_LOG_D((sata_hba_inst, CE_WARN,
10937 10941 "sata_create_target_node: no sdinfo for target %x",
10938 10942 target));
10939 10943 return (NULL);
10940 10944 }
10941 10945
10942 10946 /*
10943 10947 * create or get scsi inquiry data, expected by
10944 10948 * scsi_hba_nodename_compatible_get()
10945 10949 * SATA hard disks get Identify Data translated into Inguiry Data.
10946 10950 * ATAPI devices respond directly to Inquiry request.
10947 10951 */
10948 10952 if (sdinfo->satadrv_type == SATA_DTYPE_ATADISK) {
10949 10953 sata_identdev_to_inquiry(sata_hba_inst, sdinfo,
10950 10954 (uint8_t *)&inq);
10951 10955 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
10952 10956 sata_addr->cport)));
10953 10957 } else { /* Assume supported ATAPI device */
10954 10958 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
10955 10959 sata_addr->cport)));
10956 10960 if (sata_get_atapi_inquiry_data(sata_hba_inst, sata_addr,
10957 10961 &inq) == SATA_FAILURE)
10958 10962 return (NULL);
10959 10963 /*
10960 10964 * Save supported ATAPI transport version
10961 10965 */
10962 10966 sdinfo->satadrv_atapi_trans_ver =
10963 10967 SATA_ATAPI_TRANS_VERSION(&inq);
10964 10968 }
10965 10969
10966 10970 /* determine the node name and compatible */
10967 10971 scsi_hba_nodename_compatible_get(&inq, NULL,
10968 10972 inq.inq_dtype, NULL, &nname, &compatible, &ncompatible);
10969 10973
10970 10974 #ifdef SATA_DEBUG
10971 10975 if (sata_debug_flags & SATA_DBG_NODES) {
10972 10976 if (nname == NULL) {
10973 10977 cmn_err(CE_NOTE, "sata_create_target_node: "
10974 10978 "cannot determine nodename for target %d\n",
10975 10979 target);
10976 10980 } else {
10977 10981 cmn_err(CE_WARN, "sata_create_target_node: "
10978 10982 "target %d nodename: %s\n", target, nname);
10979 10983 }
10980 10984 if (compatible == NULL) {
10981 10985 cmn_err(CE_WARN,
10982 10986 "sata_create_target_node: no compatible name\n");
10983 10987 } else {
10984 10988 for (i = 0; i < ncompatible; i++) {
10985 10989 cmn_err(CE_WARN, "sata_create_target_node: "
10986 10990 "compatible name: %s\n", compatible[i]);
10987 10991 }
10988 10992 }
10989 10993 }
10990 10994 #endif
10991 10995
10992 10996 /* if nodename can't be determined, log error and exit */
10993 10997 if (nname == NULL) {
10994 10998 SATA_LOG_D((sata_hba_inst, CE_WARN,
10995 10999 "sata_create_target_node: cannot determine nodename "
10996 11000 "for target %d\n", target));
10997 11001 scsi_hba_nodename_compatible_free(nname, compatible);
10998 11002 return (NULL);
10999 11003 }
11000 11004 /*
11001 11005 * Create scsi target node
11002 11006 */
11003 11007 ndi_devi_alloc_sleep(dip, nname, (pnode_t)DEVI_SID_NODEID, &cdip);
11004 11008 rval = ndi_prop_update_string(DDI_DEV_T_NONE, cdip,
11005 11009 "device-type", "scsi");
11006 11010
11007 11011 if (rval != DDI_PROP_SUCCESS) {
11008 11012 SATA_LOG_D((sata_hba_inst, CE_WARN, "sata_create_target_node: "
11009 11013 "updating device_type prop failed %d", rval));
11010 11014 goto fail;
11011 11015 }
11012 11016
11013 11017 /*
11014 11018 * Create target node properties: target & lun
11015 11019 */
11016 11020 rval = ndi_prop_update_int(DDI_DEV_T_NONE, cdip, "target", target);
11017 11021 if (rval != DDI_PROP_SUCCESS) {
11018 11022 SATA_LOG_D((sata_hba_inst, CE_WARN, "sata_create_target_node: "
11019 11023 "updating target prop failed %d", rval));
11020 11024 goto fail;
11021 11025 }
11022 11026 rval = ndi_prop_update_int(DDI_DEV_T_NONE, cdip, "lun", 0);
11023 11027 if (rval != DDI_PROP_SUCCESS) {
11024 11028 SATA_LOG_D((sata_hba_inst, CE_WARN, "sata_create_target_node: "
11025 11029 "updating target prop failed %d", rval));
11026 11030 goto fail;
11027 11031 }
11028 11032
11029 11033 if (sdinfo->satadrv_type & SATA_DTYPE_ATAPI) {
11030 11034 /*
11031 11035 * Add "variant" property
11032 11036 */
11033 11037 rval = ndi_prop_update_string(DDI_DEV_T_NONE, cdip,
11034 11038 "variant", "atapi");
11035 11039 if (rval != DDI_PROP_SUCCESS) {
11036 11040 SATA_LOG_D((sata_hba_inst, CE_WARN,
11037 11041 "sata_create_target_node: variant atapi "
11038 11042 "property could not be created: %d", rval));
11039 11043 goto fail;
11040 11044 }
11041 11045 }
11042 11046 /* decorate the node with compatible */
11043 11047 if (ndi_prop_update_string_array(DDI_DEV_T_NONE, cdip, "compatible",
11044 11048 compatible, ncompatible) != DDI_PROP_SUCCESS) {
11045 11049 SATA_LOG_D((sata_hba_inst, CE_WARN,
11046 11050 "sata_create_target_node: FAIL compatible props cdip 0x%p",
11047 11051 (void *)cdip));
11048 11052 goto fail;
11049 11053 }
11050 11054
11051 11055 if (sdinfo->satadrv_type == SATA_DTYPE_ATADISK) {
11052 11056 /*
11053 11057 * Add "sata-phy" property
11054 11058 */
11055 11059 if (ndi_prop_update_int(DDI_DEV_T_NONE, cdip, "sata-phy",
11056 11060 (int)sata_addr->cport) != DDI_PROP_SUCCESS) {
11057 11061 SATA_LOG_D((sata_hba_inst, CE_WARN,
11058 11062 "sata_create_target_node: failed to create "
11059 11063 "\"sata-phy\" property: port %d",
11060 11064 sata_addr->cport));
11061 11065 }
11062 11066 }
11063 11067
11064 11068
11065 11069 /*
11066 11070 * Now, try to attach the driver. If probing of the device fails,
11067 11071 * the target node may be removed
11068 11072 */
11069 11073 rval = ndi_devi_online(cdip, NDI_ONLINE_ATTACH);
11070 11074
11071 11075 scsi_hba_nodename_compatible_free(nname, compatible);
11072 11076
11073 11077 if (rval == NDI_SUCCESS)
11074 11078 return (cdip);
11075 11079
11076 11080 /* target node was removed - are we sure? */
11077 11081 return (NULL);
11078 11082
11079 11083 fail:
11080 11084 scsi_hba_nodename_compatible_free(nname, compatible);
11081 11085 ddi_prop_remove_all(cdip);
11082 11086 rval = ndi_devi_free(cdip);
11083 11087 if (rval != NDI_SUCCESS) {
11084 11088 SATA_LOG_D((sata_hba_inst, CE_WARN, "sata_create_target_node: "
11085 11089 "node removal failed %d", rval));
11086 11090 }
11087 11091 sata_log(sata_hba_inst, CE_WARN, "sata_create_target_node: "
|
↓ open down ↓ |
167 lines elided |
↑ open up ↑ |
11088 11092 "cannot create target node for SATA device at port %d",
11089 11093 sata_addr->cport);
11090 11094 return (NULL);
11091 11095 }
11092 11096
11093 11097 /*
11094 11098 * Remove a target node.
11095 11099 */
11096 11100 static void
11097 11101 sata_remove_target_node(sata_hba_inst_t *sata_hba_inst,
11098 - sata_address_t *sata_addr)
11102 + sata_address_t *sata_addr)
11099 11103 {
11100 11104 dev_info_t *tdip;
11101 11105 uint8_t cport = sata_addr->cport;
11102 11106 uint8_t pmport = sata_addr->pmport;
11103 11107 uint8_t qual = sata_addr->qual;
11104 11108
11105 11109 /* Note the sata daemon uses the address of the port/pmport */
11106 11110 ASSERT(qual == SATA_ADDR_CPORT || qual == SATA_ADDR_PMPORT);
11107 11111
11108 11112 /* Remove target node */
11109 11113 tdip = sata_get_target_dip(SATA_DIP(sata_hba_inst), cport, pmport);
11110 11114 if (tdip != NULL) {
11111 11115 /*
11112 11116 * Target node exists. Unconfigure device
11113 11117 * then remove the target node (one ndi
11114 11118 * operation).
11115 11119 */
11116 11120 if (ndi_devi_offline(tdip, NDI_DEVI_REMOVE) != NDI_SUCCESS) {
11117 11121 /*
11118 11122 * PROBLEM - no device, but target node remained. This
11119 11123 * happens when the file was open or node was waiting
11120 11124 * for resources.
11121 11125 */
11122 11126 SATA_LOG_D((sata_hba_inst, CE_WARN,
11123 11127 "sata_remove_target_node: "
11124 11128 "Failed to remove target node for "
11125 11129 "detached SATA device."));
11126 11130 /*
11127 11131 * Set target node state to DEVI_DEVICE_REMOVED. But
11128 11132 * re-check first that the node still exists.
11129 11133 */
11130 11134 tdip = sata_get_target_dip(SATA_DIP(sata_hba_inst),
11131 11135 cport, pmport);
11132 11136 if (tdip != NULL) {
11133 11137 sata_set_device_removed(tdip);
11134 11138 /*
11135 11139 * Instruct event daemon to retry the cleanup
11136 11140 * later.
11137 11141 */
11138 11142 sata_set_target_node_cleanup(sata_hba_inst,
11139 11143 sata_addr);
11140 11144 }
11141 11145 }
11142 11146
11143 11147 if (qual == SATA_ADDR_CPORT)
11144 11148 sata_log(sata_hba_inst, CE_WARN,
11145 11149 "SATA device detached at port %d", cport);
11146 11150 else
11147 11151 sata_log(sata_hba_inst, CE_WARN,
11148 11152 "SATA device detached at port %d:%d",
11149 11153 cport, pmport);
11150 11154 }
11151 11155 #ifdef SATA_DEBUG
11152 11156 else {
11153 11157 if (qual == SATA_ADDR_CPORT)
11154 11158 sata_log(sata_hba_inst, CE_WARN,
11155 11159 "target node not found at port %d", cport);
11156 11160 else
11157 11161 sata_log(sata_hba_inst, CE_WARN,
11158 11162 "target node not found at port %d:%d",
11159 11163 cport, pmport);
11160 11164 }
11161 11165 #endif
11162 11166 }
11163 11167
11164 11168
11165 11169 /*
11166 11170 * Re-probe sata port, check for a device and attach info
11167 11171 * structures when necessary. Identify Device data is fetched, if possible.
11168 11172 * Assumption: sata address is already validated.
11169 11173 * SATA_SUCCESS is returned if port is re-probed sucessfully, regardless of
11170 11174 * the presence of a device and its type.
11171 11175 *
11172 11176 * flag arg specifies that the function should try multiple times to identify
11173 11177 * device type and to initialize it, or it should return immediately on failure.
11174 11178 * SATA_DEV_IDENTIFY_RETRY - retry
11175 11179 * SATA_DEV_IDENTIFY_NORETRY - no retry
11176 11180 *
11177 11181 * SATA_FAILURE is returned if one of the operations failed.
11178 11182 *
11179 11183 * This function cannot be called in interrupt context - it may sleep.
11180 11184 *
11181 11185 * Note: Port multiplier is supported.
11182 11186 */
11183 11187 static int
11184 11188 sata_reprobe_port(sata_hba_inst_t *sata_hba_inst, sata_device_t *sata_device,
11185 11189 int flag)
11186 11190 {
11187 11191 sata_cport_info_t *cportinfo;
11188 11192 sata_pmult_info_t *pmultinfo;
11189 11193 sata_drive_info_t *sdinfo, *osdinfo;
11190 11194 boolean_t init_device = B_FALSE;
11191 11195 int prev_device_type = SATA_DTYPE_NONE;
11192 11196 int prev_device_settings = 0;
11193 11197 int prev_device_state = 0;
11194 11198 clock_t start_time;
11195 11199 int retry = B_FALSE;
11196 11200 uint8_t cport = sata_device->satadev_addr.cport;
11197 11201 int rval_probe, rval_init;
11198 11202
11199 11203 /*
11200 11204 * If target is pmport, sata_reprobe_pmport() will handle it.
11201 11205 */
11202 11206 if (sata_device->satadev_addr.qual == SATA_ADDR_PMPORT ||
11203 11207 sata_device->satadev_addr.qual == SATA_ADDR_DPMPORT)
11204 11208 return (sata_reprobe_pmport(sata_hba_inst, sata_device, flag));
11205 11209
11206 11210 /* We only care about host sata cport for now */
11207 11211 cportinfo = SATA_CPORT_INFO(sata_hba_inst,
11208 11212 sata_device->satadev_addr.cport);
11209 11213
11210 11214 /*
11211 11215 * If a port multiplier was previously attached (we have no idea it
11212 11216 * still there or not), sata_reprobe_pmult() will handle it.
11213 11217 */
11214 11218 if (cportinfo->cport_dev_type == SATA_DTYPE_PMULT)
11215 11219 return (sata_reprobe_pmult(sata_hba_inst, sata_device, flag));
11216 11220
11217 11221 /* Store sata_drive_info when a non-pmult device was attached. */
11218 11222 osdinfo = SATA_CPORTINFO_DRV_INFO(cportinfo);
11219 11223 if (osdinfo != NULL) {
11220 11224 /*
11221 11225 * We are re-probing port with a previously attached device.
11222 11226 * Save previous device type and settings.
11223 11227 */
11224 11228 prev_device_type = cportinfo->cport_dev_type;
11225 11229 prev_device_settings = osdinfo->satadrv_settings;
11226 11230 prev_device_state = osdinfo->satadrv_state;
11227 11231 }
11228 11232 if (flag == SATA_DEV_IDENTIFY_RETRY) {
11229 11233 start_time = ddi_get_lbolt();
11230 11234 retry = B_TRUE;
11231 11235 }
11232 11236 retry_probe:
11233 11237
11234 11238 /* probe port */
11235 11239 mutex_enter(&cportinfo->cport_mutex);
11236 11240 cportinfo->cport_state &= ~SATA_PORT_STATE_CLEAR_MASK;
11237 11241 cportinfo->cport_state |= SATA_STATE_PROBING;
11238 11242 mutex_exit(&cportinfo->cport_mutex);
11239 11243
11240 11244 rval_probe = (*SATA_PROBE_PORT_FUNC(sata_hba_inst))
11241 11245 (SATA_DIP(sata_hba_inst), sata_device);
11242 11246
11243 11247 mutex_enter(&cportinfo->cport_mutex);
11244 11248 if (rval_probe != SATA_SUCCESS) {
11245 11249 cportinfo->cport_state = SATA_PSTATE_FAILED;
11246 11250 mutex_exit(&cportinfo->cport_mutex);
11247 11251 SATA_LOG_D((sata_hba_inst, CE_WARN, "sata_reprobe_port: "
11248 11252 "SATA port %d probing failed",
11249 11253 cportinfo->cport_addr.cport));
11250 11254 return (SATA_FAILURE);
11251 11255 }
11252 11256
11253 11257 /*
11254 11258 * update sata port state and set device type
11255 11259 */
11256 11260 sata_update_port_info(sata_hba_inst, sata_device);
11257 11261 cportinfo->cport_state &= ~SATA_STATE_PROBING;
11258 11262
11259 11263 /*
11260 11264 * Sanity check - Port is active? Is the link active?
11261 11265 * Is there any device attached?
11262 11266 */
11263 11267 if ((cportinfo->cport_state &
11264 11268 (SATA_PSTATE_SHUTDOWN | SATA_PSTATE_FAILED)) ||
11265 11269 (cportinfo->cport_scr.sstatus & SATA_PORT_DEVLINK_UP_MASK) !=
11266 11270 SATA_PORT_DEVLINK_UP) {
11267 11271 /*
11268 11272 * Port in non-usable state or no link active/no device.
11269 11273 * Free info structure if necessary (direct attached drive
11270 11274 * only, for now!
11271 11275 */
11272 11276 sdinfo = SATA_CPORTINFO_DRV_INFO(cportinfo);
11273 11277 SATA_CPORTINFO_DRV_INFO(cportinfo) = NULL;
11274 11278 /* Add here differentiation for device attached or not */
11275 11279 cportinfo->cport_dev_type = SATA_DTYPE_NONE;
11276 11280 mutex_exit(&cportinfo->cport_mutex);
11277 11281 if (sdinfo != NULL)
11278 11282 kmem_free(sdinfo, sizeof (sata_drive_info_t));
11279 11283 return (SATA_SUCCESS);
11280 11284 }
11281 11285
11282 11286 cportinfo->cport_state |= SATA_STATE_READY;
11283 11287 cportinfo->cport_state |= SATA_STATE_PROBED;
11284 11288
11285 11289 cportinfo->cport_dev_type = sata_device->satadev_type;
11286 11290 sdinfo = SATA_CPORTINFO_DRV_INFO(cportinfo);
11287 11291
11288 11292 /*
11289 11293 * If we are re-probing the port, there may be
11290 11294 * sata_drive_info structure attached
11291 11295 */
11292 11296 if (sata_device->satadev_type == SATA_DTYPE_NONE) {
11293 11297
11294 11298 /*
11295 11299 * There is no device, so remove device info structure,
11296 11300 * if necessary.
11297 11301 */
11298 11302 /* Device change: Drive -> None */
11299 11303 SATA_CPORTINFO_DRV_INFO(cportinfo) = NULL;
11300 11304 cportinfo->cport_dev_type = SATA_DTYPE_NONE;
11301 11305 if (sdinfo != NULL) {
11302 11306 kmem_free(sdinfo, sizeof (sata_drive_info_t));
11303 11307 sata_log(sata_hba_inst, CE_WARN,
11304 11308 "SATA device detached "
11305 11309 "from port %d", cportinfo->cport_addr.cport);
11306 11310 }
11307 11311 mutex_exit(&cportinfo->cport_mutex);
11308 11312 return (SATA_SUCCESS);
11309 11313
11310 11314 }
11311 11315
11312 11316 if (sata_device->satadev_type != SATA_DTYPE_PMULT) {
11313 11317
11314 11318 /* Device (may) change: Drive -> Drive */
11315 11319 if (sdinfo == NULL) {
11316 11320 /*
11317 11321 * There is some device attached, but there is
11318 11322 * no sata_drive_info structure - allocate one
11319 11323 */
11320 11324 mutex_exit(&cportinfo->cport_mutex);
11321 11325 sdinfo = kmem_zalloc(
11322 11326 sizeof (sata_drive_info_t), KM_SLEEP);
11323 11327 mutex_enter(&cportinfo->cport_mutex);
11324 11328 /*
11325 11329 * Recheck, that the port state did not change when we
11326 11330 * released mutex.
11327 11331 */
11328 11332 if (cportinfo->cport_state & SATA_STATE_READY) {
11329 11333 SATA_CPORTINFO_DRV_INFO(cportinfo) = sdinfo;
11330 11334 sdinfo->satadrv_addr = cportinfo->cport_addr;
11331 11335 sdinfo->satadrv_addr.qual = SATA_ADDR_DCPORT;
11332 11336 sdinfo->satadrv_type = SATA_DTYPE_UNKNOWN;
11333 11337 sdinfo->satadrv_state = SATA_STATE_UNKNOWN;
11334 11338 } else {
11335 11339 /*
11336 11340 * Port is not in ready state, we
11337 11341 * cannot attach a device.
11338 11342 */
11339 11343 mutex_exit(&cportinfo->cport_mutex);
11340 11344 kmem_free(sdinfo, sizeof (sata_drive_info_t));
11341 11345 return (SATA_SUCCESS);
11342 11346 }
11343 11347 /*
11344 11348 * Since we are adding device, presumably new one,
11345 11349 * indicate that it should be initalized,
11346 11350 * as well as some internal framework states).
11347 11351 */
11348 11352 init_device = B_TRUE;
11349 11353 }
11350 11354 cportinfo->cport_dev_type = SATA_DTYPE_UNKNOWN;
11351 11355 sata_device->satadev_addr.qual = sdinfo->satadrv_addr.qual;
11352 11356 } else {
11353 11357 /* Device change: Drive -> PMult */
11354 11358 SATA_CPORTINFO_DRV_INFO(cportinfo) = NULL;
11355 11359 if (sdinfo != NULL) {
11356 11360 kmem_free(sdinfo, sizeof (sata_drive_info_t));
11357 11361 sata_log(sata_hba_inst, CE_WARN,
11358 11362 "SATA device detached "
11359 11363 "from port %d", cportinfo->cport_addr.cport);
11360 11364 }
11361 11365
11362 11366 sata_log(sata_hba_inst, CE_WARN,
11363 11367 "SATA port multiplier detected at port %d",
11364 11368 cportinfo->cport_addr.cport);
11365 11369
11366 11370 mutex_exit(&cportinfo->cport_mutex);
11367 11371 if (sata_alloc_pmult(sata_hba_inst, sata_device) !=
11368 11372 SATA_SUCCESS)
11369 11373 return (SATA_FAILURE);
11370 11374 sata_show_pmult_info(sata_hba_inst, sata_device);
11371 11375 mutex_enter(&cportinfo->cport_mutex);
11372 11376
11373 11377 /*
11374 11378 * Mark all the port multiplier port behind the port
11375 11379 * multiplier behind with link events, so that the sata daemon
11376 11380 * will update their status.
11377 11381 */
11378 11382 pmultinfo = SATA_PMULT_INFO(sata_hba_inst, cport);
11379 11383 pmultinfo->pmult_event_flags |= SATA_EVNT_DEVICE_RESET;
11380 11384 mutex_exit(&cportinfo->cport_mutex);
11381 11385 return (SATA_SUCCESS);
11382 11386 }
11383 11387 mutex_exit(&cportinfo->cport_mutex);
11384 11388
11385 11389 /*
11386 11390 * Figure out what kind of device we are really
11387 11391 * dealing with. Failure of identifying device does not fail this
11388 11392 * function.
11389 11393 */
11390 11394 rval_probe = sata_probe_device(sata_hba_inst, sata_device);
11391 11395 rval_init = SATA_FAILURE;
11392 11396 mutex_enter(&cportinfo->cport_mutex);
11393 11397 if (rval_probe == SATA_SUCCESS) {
11394 11398 /*
11395 11399 * If we are dealing with the same type of a device as before,
11396 11400 * restore its settings flags.
11397 11401 */
11398 11402 if (osdinfo != NULL &&
11399 11403 sata_device->satadev_type == prev_device_type)
11400 11404 sdinfo->satadrv_settings = prev_device_settings;
11401 11405
11402 11406 mutex_exit(&cportinfo->cport_mutex);
11403 11407 rval_init = SATA_SUCCESS;
11404 11408 /* Set initial device features, if necessary */
11405 11409 if (init_device == B_TRUE) {
11406 11410 rval_init = sata_initialize_device(sata_hba_inst,
11407 11411 sdinfo);
11408 11412 }
11409 11413 if (rval_init == SATA_SUCCESS)
11410 11414 return (rval_init);
11411 11415 /* else we will retry if retry was asked for */
11412 11416
11413 11417 } else {
11414 11418 /*
11415 11419 * If there was some device info before we probe the device,
11416 11420 * restore previous device setting, so we can retry from scratch
11417 11421 * later. Providing, of course, that device has not disapear
11418 11422 * during probing process.
11419 11423 */
11420 11424 if (sata_device->satadev_type != SATA_DTYPE_NONE) {
11421 11425 if (osdinfo != NULL) {
11422 11426 cportinfo->cport_dev_type = prev_device_type;
11423 11427 sdinfo->satadrv_type = prev_device_type;
11424 11428 sdinfo->satadrv_state = prev_device_state;
11425 11429 }
11426 11430 } else {
11427 11431 /* device is gone */
11428 11432 kmem_free(sdinfo, sizeof (sata_drive_info_t));
11429 11433 cportinfo->cport_dev_type = SATA_DTYPE_NONE;
11430 11434 SATA_CPORTINFO_DRV_INFO(cportinfo) = NULL;
11431 11435 mutex_exit(&cportinfo->cport_mutex);
11432 11436 return (SATA_SUCCESS);
11433 11437 }
11434 11438 mutex_exit(&cportinfo->cport_mutex);
11435 11439 }
11436 11440
11437 11441 if (retry) {
11438 11442 clock_t cur_time = ddi_get_lbolt();
11439 11443 /*
11440 11444 * A device was not successfully identified or initialized.
11441 11445 * Track retry time for device identification.
11442 11446 */
11443 11447 if ((cur_time - start_time) <
11444 11448 drv_usectohz(SATA_DEV_REPROBE_TIMEOUT)) {
11445 11449 /* sleep for a while */
11446 11450 delay(drv_usectohz(SATA_DEV_RETRY_DLY));
11447 11451 goto retry_probe;
11448 11452 }
11449 11453 /* else no more retries */
11450 11454 mutex_enter(&cportinfo->cport_mutex);
11451 11455 if (SATA_CPORTINFO_DRV_INFO(cportinfo) != NULL) {
11452 11456 if (rval_init == SATA_RETRY) {
11453 11457 /*
11454 11458 * Setting drive features have failed, but
11455 11459 * because the drive is still accessible,
11456 11460 * keep it and emit a warning message.
11457 11461 */
11458 11462 sata_log(sata_hba_inst, CE_WARN,
11459 11463 "SATA device at port %d - desired "
11460 11464 "drive features could not be set. "
11461 11465 "Device may not operate as expected.",
11462 11466 cportinfo->cport_addr.cport);
11463 11467 } else {
11464 11468 SATA_CPORTINFO_DRV_INFO(cportinfo)->
11465 11469 satadrv_state = SATA_DSTATE_FAILED;
11466 11470 }
11467 11471 }
11468 11472 mutex_exit(&cportinfo->cport_mutex);
11469 11473 }
11470 11474 return (SATA_SUCCESS);
11471 11475 }
11472 11476
11473 11477 /*
11474 11478 * Reprobe a controller port that connected to a port multiplier.
11475 11479 *
11476 11480 * NOTE: No Mutex should be hold.
11477 11481 */
11478 11482 static int
11479 11483 sata_reprobe_pmult(sata_hba_inst_t *sata_hba_inst, sata_device_t *sata_device,
11480 11484 int flag)
11481 11485 {
11482 11486 _NOTE(ARGUNUSED(flag))
11483 11487 sata_cport_info_t *cportinfo;
11484 11488 sata_pmult_info_t *pmultinfo;
11485 11489 uint8_t cport = sata_device->satadev_addr.cport;
11486 11490 int rval_probe;
11487 11491
11488 11492 cportinfo = SATA_CPORT_INFO(sata_hba_inst, cport);
11489 11493 pmultinfo = SATA_PMULT_INFO(sata_hba_inst, cport);
11490 11494
11491 11495 /* probe port */
11492 11496 mutex_enter(&cportinfo->cport_mutex);
11493 11497 cportinfo->cport_state &= ~SATA_PORT_STATE_CLEAR_MASK;
11494 11498 cportinfo->cport_state |= SATA_STATE_PROBING;
11495 11499 mutex_exit(&cportinfo->cport_mutex);
11496 11500
11497 11501 rval_probe = (*SATA_PROBE_PORT_FUNC(sata_hba_inst))
11498 11502 (SATA_DIP(sata_hba_inst), sata_device);
11499 11503
11500 11504 mutex_enter(&cportinfo->cport_mutex);
11501 11505 if (rval_probe != SATA_SUCCESS) {
11502 11506 cportinfo->cport_state = SATA_PSTATE_FAILED;
11503 11507 SATA_LOG_D((sata_hba_inst, CE_WARN, "sata_reprobe_pmult: "
11504 11508 "SATA port %d probing failed", cport));
11505 11509 sata_log(sata_hba_inst, CE_WARN,
11506 11510 "SATA port multiplier detached at port %d", cport);
11507 11511 mutex_exit(&cportinfo->cport_mutex);
11508 11512 sata_free_pmult(sata_hba_inst, sata_device);
11509 11513 return (SATA_FAILURE);
11510 11514 }
11511 11515
11512 11516 /*
11513 11517 * update sata port state and set device type
11514 11518 */
11515 11519 sata_update_port_info(sata_hba_inst, sata_device);
11516 11520 cportinfo->cport_state &= ~SATA_STATE_PROBING;
11517 11521 cportinfo->cport_state |= SATA_STATE_PROBED;
11518 11522
11519 11523 /*
11520 11524 * Sanity check - Port is active? Is the link active?
11521 11525 * Is there any device attached?
11522 11526 */
11523 11527 if ((cportinfo->cport_state &
11524 11528 (SATA_PSTATE_SHUTDOWN | SATA_PSTATE_FAILED)) ||
11525 11529 (cportinfo->cport_scr.sstatus & SATA_PORT_DEVLINK_UP_MASK) !=
11526 11530 SATA_PORT_DEVLINK_UP ||
11527 11531 (sata_device->satadev_type == SATA_DTYPE_NONE)) {
11528 11532 cportinfo->cport_dev_type = SATA_DTYPE_NONE;
11529 11533 mutex_exit(&cportinfo->cport_mutex);
11530 11534 sata_free_pmult(sata_hba_inst, sata_device);
11531 11535 sata_log(sata_hba_inst, CE_WARN,
11532 11536 "SATA port multiplier detached at port %d", cport);
11533 11537 return (SATA_SUCCESS);
11534 11538 }
11535 11539
11536 11540 /*
11537 11541 * Device changed: PMult -> Non-PMult
11538 11542 *
11539 11543 * This situation is uncommon, most possibly being caused by errors
11540 11544 * after which the port multiplier is not correct initialized and
11541 11545 * recognized. In that case the new device will be marked as unknown
11542 11546 * and will not be automatically probed in this routine. Instead
11543 11547 * system administrator could manually restart it via cfgadm(1M).
11544 11548 */
11545 11549 if (sata_device->satadev_type != SATA_DTYPE_PMULT) {
11546 11550 cportinfo->cport_dev_type = SATA_DTYPE_UNKNOWN;
11547 11551 mutex_exit(&cportinfo->cport_mutex);
11548 11552 sata_free_pmult(sata_hba_inst, sata_device);
11549 11553 sata_log(sata_hba_inst, CE_WARN,
11550 11554 "SATA port multiplier detached at port %d", cport);
11551 11555 return (SATA_FAILURE);
11552 11556 }
11553 11557
11554 11558 /*
11555 11559 * Now we know it is a port multiplier. However, if this is not the
11556 11560 * previously attached port multiplier - they may have different
11557 11561 * pmport numbers - we need to re-allocate data structures for every
11558 11562 * pmport and drive.
11559 11563 *
11560 11564 * Port multipliers of the same model have identical values in these
11561 11565 * registers, so it is still necessary to update the information of
11562 11566 * all drives attached to the previous port multiplier afterwards.
11563 11567 */
11564 11568 /* Device changed: PMult -> another PMult */
11565 11569 mutex_exit(&cportinfo->cport_mutex);
11566 11570 sata_free_pmult(sata_hba_inst, sata_device);
11567 11571 if (sata_alloc_pmult(sata_hba_inst, sata_device) != SATA_SUCCESS)
11568 11572 return (SATA_FAILURE);
11569 11573 mutex_enter(&cportinfo->cport_mutex);
11570 11574
11571 11575 SATADBG1(SATA_DBG_PMULT, sata_hba_inst,
11572 11576 "SATA port multiplier [changed] at port %d", cport);
11573 11577 sata_log(sata_hba_inst, CE_WARN,
11574 11578 "SATA port multiplier detected at port %d", cport);
11575 11579
11576 11580 /*
11577 11581 * Mark all the port multiplier port behind the port
11578 11582 * multiplier behind with link events, so that the sata daemon
11579 11583 * will update their status.
11580 11584 */
11581 11585 pmultinfo->pmult_event_flags |= SATA_EVNT_DEVICE_RESET;
11582 11586 mutex_exit(&cportinfo->cport_mutex);
11583 11587
11584 11588 return (SATA_SUCCESS);
11585 11589 }
11586 11590
11587 11591 /*
11588 11592 * Re-probe a port multiplier port, check for a device and attach info
11589 11593 * structures when necessary. Identify Device data is fetched, if possible.
11590 11594 * Assumption: sata address is already validated as port multiplier port.
11591 11595 * SATA_SUCCESS is returned if port is re-probed sucessfully, regardless of
11592 11596 * the presence of a device and its type.
11593 11597 *
11594 11598 * flag arg specifies that the function should try multiple times to identify
11595 11599 * device type and to initialize it, or it should return immediately on failure.
11596 11600 * SATA_DEV_IDENTIFY_RETRY - retry
11597 11601 * SATA_DEV_IDENTIFY_NORETRY - no retry
11598 11602 *
11599 11603 * SATA_FAILURE is returned if one of the operations failed.
11600 11604 *
11601 11605 * This function cannot be called in interrupt context - it may sleep.
11602 11606 *
11603 11607 * NOTE: Should be only called by sata_probe_port() in case target port is a
11604 11608 * port multiplier port.
11605 11609 * NOTE: No Mutex should be hold.
11606 11610 */
11607 11611 static int
11608 11612 sata_reprobe_pmport(sata_hba_inst_t *sata_hba_inst, sata_device_t *sata_device,
11609 11613 int flag)
11610 11614 {
11611 11615 sata_cport_info_t *cportinfo = NULL;
11612 11616 sata_pmport_info_t *pmportinfo = NULL;
11613 11617 sata_drive_info_t *sdinfo, *osdinfo;
11614 11618 sata_device_t sdevice;
11615 11619 boolean_t init_device = B_FALSE;
11616 11620 int prev_device_type = SATA_DTYPE_NONE;
11617 11621 int prev_device_settings = 0;
11618 11622 int prev_device_state = 0;
11619 11623 clock_t start_time;
11620 11624 uint8_t cport = sata_device->satadev_addr.cport;
11621 11625 uint8_t pmport = sata_device->satadev_addr.pmport;
11622 11626 int rval;
11623 11627
11624 11628 cportinfo = SATA_CPORT_INFO(sata_hba_inst, cport);
11625 11629 pmportinfo = SATA_PMPORT_INFO(sata_hba_inst, cport, pmport);
11626 11630 osdinfo = SATA_PMPORTINFO_DRV_INFO(pmportinfo);
11627 11631
11628 11632 if (osdinfo != NULL) {
11629 11633 /*
11630 11634 * We are re-probing port with a previously attached device.
11631 11635 * Save previous device type and settings.
11632 11636 */
11633 11637 prev_device_type = pmportinfo->pmport_dev_type;
11634 11638 prev_device_settings = osdinfo->satadrv_settings;
11635 11639 prev_device_state = osdinfo->satadrv_state;
11636 11640 }
11637 11641
11638 11642 start_time = ddi_get_lbolt();
11639 11643
11640 11644 /* check parent status */
11641 11645 mutex_enter(&cportinfo->cport_mutex);
11642 11646 if ((cportinfo->cport_state &
11643 11647 (SATA_PSTATE_SHUTDOWN | SATA_PSTATE_FAILED)) ||
11644 11648 (cportinfo->cport_scr.sstatus & SATA_PORT_DEVLINK_UP_MASK) !=
11645 11649 SATA_PORT_DEVLINK_UP) {
11646 11650 mutex_exit(&cportinfo->cport_mutex);
11647 11651 return (SATA_FAILURE);
11648 11652 }
11649 11653 mutex_exit(&cportinfo->cport_mutex);
11650 11654
11651 11655 retry_probe_pmport:
11652 11656
11653 11657 /* probe port */
11654 11658 mutex_enter(&pmportinfo->pmport_mutex);
11655 11659 pmportinfo->pmport_state &= ~SATA_PORT_STATE_CLEAR_MASK;
11656 11660 pmportinfo->pmport_state |= SATA_STATE_PROBING;
11657 11661 mutex_exit(&pmportinfo->pmport_mutex);
11658 11662
11659 11663 rval = (*SATA_PROBE_PORT_FUNC(sata_hba_inst))
11660 11664 (SATA_DIP(sata_hba_inst), sata_device);
11661 11665
11662 11666 /* might need retry because we cannot touch registers. */
11663 11667 if (rval == SATA_FAILURE) {
11664 11668 mutex_enter(&pmportinfo->pmport_mutex);
11665 11669 pmportinfo->pmport_state = SATA_PSTATE_FAILED;
11666 11670 mutex_exit(&pmportinfo->pmport_mutex);
11667 11671 SATA_LOG_D((sata_hba_inst, CE_WARN, "sata_reprobe_pmport: "
11668 11672 "SATA port %d:%d probing failed",
11669 11673 cport, pmport));
11670 11674 return (SATA_FAILURE);
11671 11675 } else if (rval == SATA_RETRY) {
11672 11676 SATA_LOG_D((sata_hba_inst, CE_WARN, "sata_reprobe_pmport: "
11673 11677 "SATA port %d:%d probing failed, retrying...",
11674 11678 cport, pmport));
11675 11679 clock_t cur_time = ddi_get_lbolt();
11676 11680 /*
11677 11681 * A device was not successfully identified or initialized.
11678 11682 * Track retry time for device identification.
11679 11683 */
11680 11684 if ((cur_time - start_time) <
11681 11685 drv_usectohz(SATA_DEV_REPROBE_TIMEOUT)) {
11682 11686 /* sleep for a while */
11683 11687 delay(drv_usectohz(SATA_DEV_RETRY_DLY));
11684 11688 goto retry_probe_pmport;
11685 11689 } else {
11686 11690 mutex_enter(&pmportinfo->pmport_mutex);
11687 11691 if (SATA_PMPORTINFO_DRV_INFO(pmportinfo) != NULL)
11688 11692 SATA_PMPORTINFO_DRV_INFO(pmportinfo)->
11689 11693 satadrv_state = SATA_DSTATE_FAILED;
11690 11694 mutex_exit(&pmportinfo->pmport_mutex);
11691 11695 return (SATA_SUCCESS);
11692 11696 }
11693 11697 }
11694 11698
11695 11699 /*
11696 11700 * Sanity check - Controller port is active? Is the link active?
11697 11701 * Is it still a port multiplier?
11698 11702 */
11699 11703 if ((cportinfo->cport_state &
11700 11704 (SATA_PSTATE_SHUTDOWN | SATA_PSTATE_FAILED)) ||
11701 11705 (cportinfo->cport_scr.sstatus & SATA_PORT_DEVLINK_UP_MASK) !=
11702 11706 SATA_PORT_DEVLINK_UP ||
11703 11707 (cportinfo->cport_dev_type != SATA_DTYPE_PMULT)) {
11704 11708 /*
11705 11709 * Port in non-usable state or no link active/no
11706 11710 * device. Free info structure.
11707 11711 */
11708 11712 cportinfo->cport_dev_type = SATA_DTYPE_UNKNOWN;
11709 11713
11710 11714 sdevice.satadev_addr.cport = cport;
11711 11715 sdevice.satadev_addr.pmport = pmport;
11712 11716 sdevice.satadev_addr.qual = SATA_ADDR_PMULT;
11713 11717 mutex_exit(&cportinfo->cport_mutex);
11714 11718
11715 11719 sata_free_pmult(sata_hba_inst, &sdevice);
11716 11720 return (SATA_FAILURE);
11717 11721 }
11718 11722
11719 11723 /* SATA_SUCCESS NOW */
11720 11724 /*
11721 11725 * update sata port state and set device type
11722 11726 */
11723 11727 mutex_enter(&pmportinfo->pmport_mutex);
11724 11728 sata_update_pmport_info(sata_hba_inst, sata_device);
11725 11729 pmportinfo->pmport_state &= ~SATA_STATE_PROBING;
11726 11730
11727 11731 /*
11728 11732 * Sanity check - Port is active? Is the link active?
11729 11733 * Is there any device attached?
11730 11734 */
11731 11735 if ((pmportinfo->pmport_state &
11732 11736 (SATA_PSTATE_SHUTDOWN | SATA_PSTATE_FAILED)) ||
11733 11737 (pmportinfo->pmport_scr.sstatus & SATA_PORT_DEVLINK_UP_MASK) !=
11734 11738 SATA_PORT_DEVLINK_UP) {
11735 11739 /*
11736 11740 * Port in non-usable state or no link active/no device.
11737 11741 * Free info structure if necessary (direct attached drive
11738 11742 * only, for now!
11739 11743 */
11740 11744 sdinfo = SATA_PMPORTINFO_DRV_INFO(pmportinfo);
11741 11745 SATA_PMPORTINFO_DRV_INFO(pmportinfo) = NULL;
11742 11746 /* Add here differentiation for device attached or not */
11743 11747 pmportinfo->pmport_dev_type = SATA_DTYPE_NONE;
11744 11748 mutex_exit(&pmportinfo->pmport_mutex);
11745 11749 if (sdinfo != NULL)
11746 11750 kmem_free(sdinfo, sizeof (sata_drive_info_t));
11747 11751 return (SATA_SUCCESS);
11748 11752 }
11749 11753
11750 11754 pmportinfo->pmport_state |= SATA_STATE_READY;
11751 11755 pmportinfo->pmport_dev_type = sata_device->satadev_type;
11752 11756 sdinfo = SATA_PMPORTINFO_DRV_INFO(pmportinfo);
11753 11757
11754 11758 /*
11755 11759 * If we are re-probing the port, there may be
11756 11760 * sata_drive_info structure attached
11757 11761 * (or sata_pm_info, if PMult is supported).
11758 11762 */
11759 11763 if (sata_device->satadev_type == SATA_DTYPE_NONE) {
11760 11764 /*
11761 11765 * There is no device, so remove device info structure,
11762 11766 * if necessary.
11763 11767 */
11764 11768 SATA_PMPORTINFO_DRV_INFO(pmportinfo) = NULL;
11765 11769 pmportinfo->pmport_dev_type = SATA_DTYPE_NONE;
11766 11770 if (sdinfo != NULL) {
11767 11771 kmem_free(sdinfo, sizeof (sata_drive_info_t));
11768 11772 sata_log(sata_hba_inst, CE_WARN,
11769 11773 "SATA device detached from port %d:%d",
11770 11774 cport, pmport);
11771 11775 }
11772 11776 mutex_exit(&pmportinfo->pmport_mutex);
11773 11777 return (SATA_SUCCESS);
11774 11778 }
11775 11779
11776 11780 /* this should not be a pmult */
11777 11781 ASSERT(sata_device->satadev_type != SATA_DTYPE_PMULT);
11778 11782 if (sdinfo == NULL) {
11779 11783 /*
11780 11784 * There is some device attached, but there is
11781 11785 * no sata_drive_info structure - allocate one
11782 11786 */
11783 11787 mutex_exit(&pmportinfo->pmport_mutex);
11784 11788 sdinfo = kmem_zalloc(sizeof (sata_drive_info_t),
11785 11789 KM_SLEEP);
11786 11790 mutex_enter(&pmportinfo->pmport_mutex);
11787 11791 /*
11788 11792 * Recheck, that the port state did not change when we
11789 11793 * released mutex.
11790 11794 */
11791 11795 if (pmportinfo->pmport_state & SATA_STATE_READY) {
11792 11796 SATA_PMPORTINFO_DRV_INFO(pmportinfo) = sdinfo;
11793 11797 sdinfo->satadrv_addr = pmportinfo->pmport_addr;
11794 11798 sdinfo->satadrv_addr.qual = SATA_ADDR_DPMPORT;
11795 11799 sdinfo->satadrv_type = SATA_DTYPE_UNKNOWN;
11796 11800 sdinfo->satadrv_state = SATA_STATE_UNKNOWN;
11797 11801 } else {
11798 11802 /*
11799 11803 * Port is not in ready state, we
11800 11804 * cannot attach a device.
11801 11805 */
11802 11806 mutex_exit(&pmportinfo->pmport_mutex);
11803 11807 kmem_free(sdinfo, sizeof (sata_drive_info_t));
11804 11808 return (SATA_SUCCESS);
11805 11809 }
11806 11810 /*
11807 11811 * Since we are adding device, presumably new one,
11808 11812 * indicate that it should be initalized,
11809 11813 * as well as some internal framework states).
11810 11814 */
11811 11815 init_device = B_TRUE;
11812 11816 }
11813 11817
11814 11818 pmportinfo->pmport_dev_type = SATA_DTYPE_UNKNOWN;
11815 11819 sata_device->satadev_addr.qual = sdinfo->satadrv_addr.qual;
11816 11820
11817 11821 mutex_exit(&pmportinfo->pmport_mutex);
11818 11822 /*
11819 11823 * Figure out what kind of device we are really
11820 11824 * dealing with.
11821 11825 */
11822 11826 rval = sata_probe_device(sata_hba_inst, sata_device);
11823 11827
11824 11828 mutex_enter(&pmportinfo->pmport_mutex);
11825 11829 if (rval == SATA_SUCCESS) {
11826 11830 /*
11827 11831 * If we are dealing with the same type of a device as before,
11828 11832 * restore its settings flags.
11829 11833 */
11830 11834 if (osdinfo != NULL &&
11831 11835 sata_device->satadev_type == prev_device_type)
11832 11836 sdinfo->satadrv_settings = prev_device_settings;
11833 11837
11834 11838 mutex_exit(&pmportinfo->pmport_mutex);
11835 11839 /* Set initial device features, if necessary */
11836 11840 if (init_device == B_TRUE) {
11837 11841 rval = sata_initialize_device(sata_hba_inst, sdinfo);
11838 11842 }
11839 11843 if (rval == SATA_SUCCESS)
11840 11844 return (rval);
11841 11845 } else {
11842 11846 /*
11843 11847 * If there was some device info before we probe the device,
11844 11848 * restore previous device setting, so we can retry from scratch
11845 11849 * later. Providing, of course, that device has not disappeared
11846 11850 * during probing process.
11847 11851 */
11848 11852 if (sata_device->satadev_type != SATA_DTYPE_NONE) {
11849 11853 if (osdinfo != NULL) {
11850 11854 pmportinfo->pmport_dev_type = prev_device_type;
11851 11855 sdinfo->satadrv_type = prev_device_type;
11852 11856 sdinfo->satadrv_state = prev_device_state;
11853 11857 }
11854 11858 } else {
11855 11859 /* device is gone */
11856 11860 kmem_free(sdinfo, sizeof (sata_drive_info_t));
11857 11861 pmportinfo->pmport_dev_type = SATA_DTYPE_NONE;
11858 11862 SATA_PMPORTINFO_DRV_INFO(pmportinfo) = NULL;
11859 11863 mutex_exit(&pmportinfo->pmport_mutex);
11860 11864 return (SATA_SUCCESS);
11861 11865 }
11862 11866 mutex_exit(&pmportinfo->pmport_mutex);
11863 11867 }
11864 11868
11865 11869 if (flag == SATA_DEV_IDENTIFY_RETRY) {
11866 11870 clock_t cur_time = ddi_get_lbolt();
11867 11871 /*
11868 11872 * A device was not successfully identified or initialized.
11869 11873 * Track retry time for device identification.
11870 11874 */
11871 11875 if ((cur_time - start_time) <
11872 11876 drv_usectohz(SATA_DEV_REPROBE_TIMEOUT)) {
11873 11877 /* sleep for a while */
11874 11878 delay(drv_usectohz(SATA_DEV_RETRY_DLY));
11875 11879 goto retry_probe_pmport;
11876 11880 } else {
11877 11881 mutex_enter(&pmportinfo->pmport_mutex);
11878 11882 if (SATA_PMPORTINFO_DRV_INFO(pmportinfo) != NULL)
11879 11883 SATA_PMPORTINFO_DRV_INFO(pmportinfo)->
11880 11884 satadrv_state = SATA_DSTATE_FAILED;
11881 11885 mutex_exit(&pmportinfo->pmport_mutex);
11882 11886 }
11883 11887 }
11884 11888 return (SATA_SUCCESS);
11885 11889 }
11886 11890
11887 11891 /*
11888 11892 * Allocated related structure for a port multiplier and its device ports
11889 11893 *
11890 11894 * Port multiplier should be ready and probed, and related information like
11891 11895 * the number of the device ports should be store in sata_device_t.
11892 11896 *
11893 11897 * NOTE: No Mutex should be hold.
11894 11898 */
11895 11899 static int
11896 11900 sata_alloc_pmult(sata_hba_inst_t *sata_hba_inst, sata_device_t *sata_device)
11897 11901 {
11898 11902 dev_info_t *dip = SATA_DIP(sata_hba_inst);
11899 11903 sata_cport_info_t *cportinfo = NULL;
11900 11904 sata_pmult_info_t *pmultinfo = NULL;
11901 11905 sata_pmport_info_t *pmportinfo = NULL;
11902 11906 sata_device_t sd;
11903 11907 dev_t minor_number;
11904 11908 char name[16];
11905 11909 uint8_t cport = sata_device->satadev_addr.cport;
11906 11910 int rval;
11907 11911 int npmport;
11908 11912
11909 11913 cportinfo = SATA_CPORT_INFO(sata_hba_inst, cport);
11910 11914
11911 11915 /* This function might be called while a port-mult is hot-plugged. */
11912 11916 mutex_enter(&cportinfo->cport_mutex);
11913 11917
11914 11918 /* dev_type's not updated when get called from sata_reprobe_port() */
11915 11919 if (SATA_CPORTINFO_PMULT_INFO(cportinfo) == NULL) {
11916 11920 /* Create a pmult_info structure */
11917 11921 SATA_CPORTINFO_PMULT_INFO(cportinfo) =
11918 11922 kmem_zalloc(sizeof (sata_pmult_info_t), KM_SLEEP);
11919 11923 }
11920 11924 pmultinfo = SATA_CPORTINFO_PMULT_INFO(cportinfo);
11921 11925
11922 11926 pmultinfo->pmult_addr = sata_device->satadev_addr;
11923 11927 pmultinfo->pmult_addr.qual = SATA_ADDR_PMULT;
11924 11928 pmultinfo->pmult_state = SATA_STATE_PROBING;
11925 11929
11926 11930 /*
11927 11931 * Probe the port multiplier with qualifier SATA_ADDR_PMULT_SPEC,
11928 11932 * The HBA driver should initialize and register the port multiplier,
11929 11933 * sata_register_pmult() will fill following fields,
11930 11934 * + sata_pmult_info.pmult_gscr
11931 11935 * + sata_pmult_info.pmult_num_dev_ports
11932 11936 */
11933 11937 sd.satadev_addr = sata_device->satadev_addr;
11934 11938 sd.satadev_addr.qual = SATA_ADDR_PMULT_SPEC;
11935 11939 mutex_exit(&cportinfo->cport_mutex);
11936 11940 rval = (*SATA_PROBE_PORT_FUNC(sata_hba_inst))
11937 11941 (SATA_DIP(sata_hba_inst), &sd);
11938 11942 mutex_enter(&cportinfo->cport_mutex);
11939 11943
11940 11944 if (rval != SATA_SUCCESS ||
11941 11945 (sd.satadev_type != SATA_DTYPE_PMULT) ||
11942 11946 !(sd.satadev_state & SATA_DSTATE_PMULT_INIT)) {
11943 11947 SATA_CPORTINFO_PMULT_INFO(cportinfo) = NULL;
11944 11948 kmem_free(pmultinfo, sizeof (sata_pmult_info_t));
11945 11949 cportinfo->cport_state = SATA_PSTATE_FAILED;
11946 11950 cportinfo->cport_dev_type = SATA_DTYPE_UNKNOWN;
11947 11951 mutex_exit(&cportinfo->cport_mutex);
11948 11952 SATADBG1(SATA_DBG_PMULT, sata_hba_inst,
11949 11953 "sata_alloc_pmult: failed to initialize pmult "
11950 11954 "at port %d.", cport)
11951 11955 return (SATA_FAILURE);
11952 11956 }
11953 11957
11954 11958 /* Initialize pmport_info structure */
11955 11959 for (npmport = 0; npmport < pmultinfo->pmult_num_dev_ports;
11956 11960 npmport++) {
11957 11961
11958 11962 /* if everything is allocated, skip */
11959 11963 if (SATA_PMPORT_INFO(sata_hba_inst, cport, npmport) != NULL)
11960 11964 continue;
11961 11965
11962 11966 pmportinfo = kmem_zalloc(sizeof (sata_pmport_info_t), KM_SLEEP);
11963 11967 mutex_init(&pmportinfo->pmport_mutex, NULL, MUTEX_DRIVER, NULL);
11964 11968 mutex_exit(&cportinfo->cport_mutex);
11965 11969
11966 11970 mutex_enter(&pmportinfo->pmport_mutex);
11967 11971 pmportinfo->pmport_addr.cport = cport;
11968 11972 pmportinfo->pmport_addr.pmport = (uint8_t)npmport;
11969 11973 pmportinfo->pmport_addr.qual = SATA_ADDR_PMPORT;
11970 11974 pmportinfo->pmport_state &= ~SATA_PORT_STATE_CLEAR_MASK;
11971 11975 mutex_exit(&pmportinfo->pmport_mutex);
11972 11976
11973 11977 mutex_enter(&cportinfo->cport_mutex);
11974 11978 SATA_PMPORT_INFO(sata_hba_inst, cport, npmport) = pmportinfo;
11975 11979
11976 11980 /* Create an attachment point */
11977 11981 minor_number = SATA_MAKE_AP_MINOR(ddi_get_instance(dip),
11978 11982 cport, (uint8_t)npmport, SATA_ADDR_PMPORT);
11979 11983 (void) sprintf(name, "%d.%d", cport, npmport);
11980 11984
11981 11985 if (ddi_create_minor_node(dip, name, S_IFCHR, minor_number,
11982 11986 DDI_NT_SATA_ATTACHMENT_POINT, 0) != DDI_SUCCESS) {
11983 11987 sata_log(sata_hba_inst, CE_WARN, "sata_hba_attach: "
11984 11988 "cannot create SATA attachment point for "
11985 11989 "port %d:%d", cport, npmport);
11986 11990 }
11987 11991 }
11988 11992
11989 11993 pmultinfo->pmult_state &= ~SATA_STATE_PROBING;
11990 11994 pmultinfo->pmult_state |= (SATA_STATE_PROBED|SATA_STATE_READY);
11991 11995 cportinfo->cport_dev_type = SATA_DTYPE_PMULT;
11992 11996
11993 11997 mutex_exit(&cportinfo->cport_mutex);
11994 11998 return (SATA_SUCCESS);
11995 11999 }
11996 12000
11997 12001 /*
11998 12002 * Free data structures when a port multiplier is removed.
11999 12003 *
12000 12004 * NOTE: No Mutex should be hold.
12001 12005 */
12002 12006 static void
12003 12007 sata_free_pmult(sata_hba_inst_t *sata_hba_inst, sata_device_t *sata_device)
12004 12008 {
12005 12009 sata_cport_info_t *cportinfo;
12006 12010 sata_pmult_info_t *pmultinfo;
12007 12011 sata_pmport_info_t *pmportinfo;
12008 12012 sata_device_t pmport_device;
12009 12013 sata_drive_info_t *sdinfo;
12010 12014 dev_info_t *tdip;
12011 12015 char name[16];
12012 12016 uint8_t cport = sata_device->satadev_addr.cport;
12013 12017 int npmport;
12014 12018
12015 12019 cportinfo = SATA_CPORT_INFO(sata_hba_inst, cport);
12016 12020
12017 12021 /* This function might be called while port-mult is hot plugged. */
12018 12022 mutex_enter(&cportinfo->cport_mutex);
12019 12023
12020 12024 cportinfo->cport_dev_type = SATA_DTYPE_NONE;
12021 12025 pmultinfo = SATA_CPORTINFO_PMULT_INFO(cportinfo);
12022 12026 ASSERT(pmultinfo != NULL);
12023 12027
12024 12028 /* Free pmport_info structure */
12025 12029 for (npmport = 0; npmport < pmultinfo->pmult_num_dev_ports;
12026 12030 npmport++) {
12027 12031 pmportinfo = SATA_PMPORT_INFO(sata_hba_inst, cport, npmport);
12028 12032 if (pmportinfo == NULL)
12029 12033 continue;
12030 12034 mutex_exit(&cportinfo->cport_mutex);
12031 12035
12032 12036 mutex_enter(&pmportinfo->pmport_mutex);
12033 12037 sdinfo = pmportinfo->pmport_sata_drive;
12034 12038 SATA_PMPORTINFO_DRV_INFO(pmportinfo) = NULL;
12035 12039 mutex_exit(&pmportinfo->pmport_mutex);
12036 12040
12037 12041 /* Remove attachment point. */
12038 12042 name[0] = '\0';
12039 12043 (void) sprintf(name, "%d.%d", cport, npmport);
12040 12044 ddi_remove_minor_node(SATA_DIP(sata_hba_inst), name);
12041 12045 sata_log(sata_hba_inst, CE_NOTE,
12042 12046 "Remove attachment point of port %d:%d",
12043 12047 cport, npmport);
12044 12048
12045 12049 /*
12046 12050 * Rumove target node
12047 12051 */
12048 12052 bzero(&pmport_device, sizeof (sata_device_t));
12049 12053 pmport_device.satadev_rev = SATA_DEVICE_REV;
12050 12054 pmport_device.satadev_addr.cport = cport;
12051 12055 pmport_device.satadev_addr.pmport = (uint8_t)npmport;
12052 12056 pmport_device.satadev_addr.qual = SATA_ADDR_DPMPORT;
12053 12057
12054 12058 tdip = sata_get_scsi_target_dip(SATA_DIP(sata_hba_inst),
12055 12059 &(pmport_device.satadev_addr));
12056 12060 if (tdip != NULL && ndi_devi_offline(tdip,
12057 12061 NDI_DEVI_REMOVE) != NDI_SUCCESS) {
12058 12062 /*
12059 12063 * Problem :
12060 12064 * The target node remained attached.
12061 12065 * This happens when the device file was open
12062 12066 * or a node was waiting for resources.
12063 12067 * Cannot do anything about it.
12064 12068 */
12065 12069 SATA_LOG_D((sata_hba_inst, CE_WARN,
12066 12070 "sata_free_pmult: could not unconfigure device "
12067 12071 "before disconnecting the SATA port %d:%d",
12068 12072 cport, npmport));
12069 12073
12070 12074 /*
12071 12075 * Set DEVICE REMOVED state in the target
12072 12076 * node. It will prevent access to the device
12073 12077 * even when a new device is attached, until
12074 12078 * the old target node is released, removed and
12075 12079 * recreated for a new device.
12076 12080 */
12077 12081 sata_set_device_removed(tdip);
12078 12082
12079 12083 /*
12080 12084 * Instruct event daemon to try the target
12081 12085 * node cleanup later.
12082 12086 */
12083 12087 sata_set_target_node_cleanup(
12084 12088 sata_hba_inst, &(pmport_device.satadev_addr));
12085 12089
12086 12090 }
12087 12091 mutex_enter(&cportinfo->cport_mutex);
12088 12092
12089 12093 /*
12090 12094 * Add here differentiation for device attached or not
12091 12095 */
12092 12096 if (sdinfo != NULL) {
12093 12097 sata_log(sata_hba_inst, CE_WARN,
12094 12098 "SATA device detached from port %d:%d",
12095 12099 cport, npmport);
12096 12100 kmem_free(sdinfo, sizeof (sata_drive_info_t));
12097 12101 }
12098 12102
12099 12103 mutex_destroy(&pmportinfo->pmport_mutex);
12100 12104 kmem_free(pmportinfo, sizeof (sata_pmport_info_t));
12101 12105 }
12102 12106
12103 12107 kmem_free(pmultinfo, sizeof (sata_pmult_info_t));
12104 12108
12105 12109 cportinfo->cport_devp.cport_sata_pmult = NULL;
12106 12110
12107 12111 sata_log(sata_hba_inst, CE_WARN,
12108 12112 "SATA port multiplier detached at port %d", cport);
12109 12113
12110 12114 mutex_exit(&cportinfo->cport_mutex);
12111 12115 }
12112 12116
12113 12117 /*
12114 12118 * Initialize device
12115 12119 * Specified device is initialized to a default state.
12116 12120 *
12117 12121 * Returns SATA_SUCCESS if all device features are set successfully,
12118 12122 * SATA_RETRY if device is accessible but device features were not set
12119 12123 * successfully, and SATA_FAILURE otherwise.
12120 12124 */
12121 12125 static int
12122 12126 sata_initialize_device(sata_hba_inst_t *sata_hba_inst,
12123 12127 sata_drive_info_t *sdinfo)
12124 12128 {
12125 12129 int rval;
12126 12130
12127 12131 sata_save_drive_settings(sdinfo);
12128 12132
12129 12133 sdinfo->satadrv_settings |= SATA_DEV_READ_AHEAD;
12130 12134
12131 12135 sata_init_write_cache_mode(sdinfo);
12132 12136
12133 12137 rval = sata_set_drive_features(sata_hba_inst, sdinfo, 0);
12134 12138
12135 12139 /* Determine current data transfer mode */
12136 12140 if ((sdinfo->satadrv_id.ai_cap & SATA_DMA_SUPPORT) == 0) {
12137 12141 sdinfo->satadrv_settings &= ~SATA_DEV_DMA;
12138 12142 } else if ((sdinfo->satadrv_id.ai_validinfo &
12139 12143 SATA_VALIDINFO_88) != 0 &&
12140 12144 (sdinfo->satadrv_id.ai_ultradma & SATA_UDMA_SEL_MASK) != 0) {
12141 12145 sdinfo->satadrv_settings |= SATA_DEV_DMA;
12142 12146 } else if ((sdinfo->satadrv_id.ai_dworddma &
12143 12147 SATA_MDMA_SEL_MASK) != 0) {
12144 12148 sdinfo->satadrv_settings |= SATA_DEV_DMA;
12145 12149 } else
12146 12150 /* DMA supported, not no DMA transfer mode is selected !? */
12147 12151 sdinfo->satadrv_settings &= ~SATA_DEV_DMA;
12148 12152
12149 12153 if ((sdinfo->satadrv_id.ai_cmdset83 & 0x20) &&
12150 12154 (sdinfo->satadrv_id.ai_features86 & 0x20))
12151 12155 sdinfo->satadrv_power_level = SATA_POWER_STANDBY;
12152 12156 else
12153 12157 sdinfo->satadrv_power_level = SATA_POWER_ACTIVE;
12154 12158
12155 12159 return (rval);
12156 12160 }
12157 12161
12158 12162
12159 12163 /*
12160 12164 * Initialize write cache mode.
12161 12165 *
12162 12166 * The default write cache setting for SATA HDD is provided by sata_write_cache
12163 12167 * static variable. ATAPI CD/DVDs devices have write cache default is
12164 12168 * determined by sata_atapicdvd_write_cache static variable.
12165 12169 * ATAPI tape devices have write cache default is determined by
12166 12170 * sata_atapitape_write_cache static variable.
12167 12171 * ATAPI disk devices have write cache default is determined by
12168 12172 * sata_atapidisk_write_cache static variable.
12169 12173 * 1 - enable
12170 12174 * 0 - disable
12171 12175 * any other value - current drive setting
12172 12176 *
12173 12177 * Although there is not reason to disable write cache on CD/DVD devices,
12174 12178 * tape devices and ATAPI disk devices, the default setting control is provided
12175 12179 * for the maximun flexibility.
12176 12180 *
12177 12181 * In the future, it may be overridden by the
12178 12182 * disk-write-cache-enable property setting, if it is defined.
12179 12183 * Returns SATA_SUCCESS if all device features are set successfully,
12180 12184 * SATA_FAILURE otherwise.
12181 12185 */
12182 12186 static void
12183 12187 sata_init_write_cache_mode(sata_drive_info_t *sdinfo)
12184 12188 {
12185 12189 switch (sdinfo->satadrv_type) {
12186 12190 case SATA_DTYPE_ATADISK:
12187 12191 if (sata_write_cache == 1)
12188 12192 sdinfo->satadrv_settings |= SATA_DEV_WRITE_CACHE;
12189 12193 else if (sata_write_cache == 0)
12190 12194 sdinfo->satadrv_settings &= ~SATA_DEV_WRITE_CACHE;
12191 12195 /*
12192 12196 * When sata_write_cache value is not 0 or 1,
12193 12197 * a current setting of the drive's write cache is used.
12194 12198 */
12195 12199 break;
12196 12200 case SATA_DTYPE_ATAPICD:
12197 12201 if (sata_atapicdvd_write_cache == 1)
12198 12202 sdinfo->satadrv_settings |= SATA_DEV_WRITE_CACHE;
12199 12203 else if (sata_atapicdvd_write_cache == 0)
12200 12204 sdinfo->satadrv_settings &= ~SATA_DEV_WRITE_CACHE;
12201 12205 /*
12202 12206 * When sata_atapicdvd_write_cache value is not 0 or 1,
12203 12207 * a current setting of the drive's write cache is used.
12204 12208 */
12205 12209 break;
12206 12210 case SATA_DTYPE_ATAPITAPE:
12207 12211 if (sata_atapitape_write_cache == 1)
12208 12212 sdinfo->satadrv_settings |= SATA_DEV_WRITE_CACHE;
12209 12213 else if (sata_atapitape_write_cache == 0)
12210 12214 sdinfo->satadrv_settings &= ~SATA_DEV_WRITE_CACHE;
12211 12215 /*
12212 12216 * When sata_atapitape_write_cache value is not 0 or 1,
12213 12217 * a current setting of the drive's write cache is used.
12214 12218 */
12215 12219 break;
12216 12220 case SATA_DTYPE_ATAPIDISK:
12217 12221 if (sata_atapidisk_write_cache == 1)
12218 12222 sdinfo->satadrv_settings |= SATA_DEV_WRITE_CACHE;
12219 12223 else if (sata_atapidisk_write_cache == 0)
12220 12224 sdinfo->satadrv_settings &= ~SATA_DEV_WRITE_CACHE;
12221 12225 /*
12222 12226 * When sata_atapidisk_write_cache value is not 0 or 1,
12223 12227 * a current setting of the drive's write cache is used.
12224 12228 */
12225 12229 break;
12226 12230 }
12227 12231 }
12228 12232
12229 12233
|
↓ open down ↓ |
1121 lines elided |
↑ open up ↑ |
12230 12234 /*
12231 12235 * Validate sata address.
12232 12236 * Specified cport, pmport and qualifier has to match
12233 12237 * passed sata_scsi configuration info.
12234 12238 * The presence of an attached device is not verified.
12235 12239 *
12236 12240 * Returns 0 when address is valid, -1 otherwise.
12237 12241 */
12238 12242 static int
12239 12243 sata_validate_sata_address(sata_hba_inst_t *sata_hba_inst, int cport,
12240 - int pmport, int qual)
12244 + int pmport, int qual)
12241 12245 {
12242 12246 if (qual == SATA_ADDR_DCPORT && pmport != 0)
12243 12247 goto invalid_address;
12244 12248 if (cport >= SATA_NUM_CPORTS(sata_hba_inst))
12245 12249 goto invalid_address;
12246 12250 if ((qual == SATA_ADDR_DPMPORT || qual == SATA_ADDR_PMPORT) &&
12247 12251 ((SATA_CPORT_DEV_TYPE(sata_hba_inst, cport) != SATA_DTYPE_PMULT) ||
12248 12252 (SATA_PMULT_INFO(sata_hba_inst, cport) == NULL) ||
12249 12253 (pmport >= SATA_NUM_PMPORTS(sata_hba_inst, cport))))
12250 12254 goto invalid_address;
12251 12255
12252 12256 return (0);
12253 12257
12254 12258 invalid_address:
12255 12259 return (-1);
12256 12260
12257 12261 }
12258 12262
12259 12263 /*
12260 12264 * Validate scsi address
12261 12265 * SCSI target address is translated into SATA cport/pmport and compared
12262 12266 * with a controller port/device configuration. LUN has to be 0.
|
↓ open down ↓ |
12 lines elided |
↑ open up ↑ |
12263 12267 * Returns 0 if a scsi target refers to an attached device,
12264 12268 * returns 1 if address is valid but no valid device is attached,
12265 12269 * returns 2 if address is valid but device type is unknown (not valid device),
12266 12270 * returns -1 if bad address or device is of an unsupported type.
12267 12271 * Upon return sata_device argument is set.
12268 12272 *
12269 12273 * Port multiplier is supported now.
12270 12274 */
12271 12275 static int
12272 12276 sata_validate_scsi_address(sata_hba_inst_t *sata_hba_inst,
12273 - struct scsi_address *ap, sata_device_t *sata_device)
12277 + struct scsi_address *ap, sata_device_t *sata_device)
12274 12278 {
12275 12279 int cport, pmport, qual, rval;
12276 12280
12277 12281 rval = -1; /* Invalid address */
12278 12282 if (ap->a_lun != 0)
12279 12283 goto out;
12280 12284
12281 12285 qual = SCSI_TO_SATA_ADDR_QUAL(ap->a_target);
12282 12286 cport = SCSI_TO_SATA_CPORT(ap->a_target);
12283 12287 pmport = SCSI_TO_SATA_PMPORT(ap->a_target);
12284 12288
12285 12289 if (qual != SATA_ADDR_DCPORT && qual != SATA_ADDR_DPMPORT)
12286 12290 goto out;
12287 12291
12288 12292 if (sata_validate_sata_address(sata_hba_inst, cport, pmport, qual) ==
12289 12293 0) {
12290 12294
12291 12295 sata_cport_info_t *cportinfo;
12292 12296 sata_pmult_info_t *pmultinfo;
12293 12297 sata_drive_info_t *sdinfo = NULL;
12294 12298
12295 12299 sata_device->satadev_addr.qual = qual;
12296 12300 sata_device->satadev_addr.cport = cport;
12297 12301 sata_device->satadev_addr.pmport = pmport;
12298 12302 sata_device->satadev_rev = SATA_DEVICE_REV_1;
12299 12303
12300 12304 rval = 1; /* Valid sata address */
12301 12305
12302 12306 cportinfo = SATA_CPORT_INFO(sata_hba_inst, cport);
12303 12307 if (qual == SATA_ADDR_DCPORT) {
12304 12308 if (cportinfo == NULL ||
12305 12309 cportinfo->cport_dev_type == SATA_DTYPE_NONE)
12306 12310 goto out;
12307 12311
12308 12312 sdinfo = SATA_CPORTINFO_DRV_INFO(cportinfo);
12309 12313 if (cportinfo->cport_dev_type == SATA_DTYPE_UNKNOWN &&
12310 12314 sdinfo != NULL) {
12311 12315 rval = 2;
12312 12316 goto out;
12313 12317 }
12314 12318
12315 12319 if ((cportinfo->cport_dev_type &
12316 12320 SATA_VALID_DEV_TYPE) == 0) {
12317 12321 rval = -1;
12318 12322 goto out;
12319 12323 }
12320 12324
12321 12325 } else if (qual == SATA_ADDR_DPMPORT) {
12322 12326 pmultinfo = SATA_CPORTINFO_PMULT_INFO(cportinfo);
12323 12327 if (pmultinfo == NULL) {
12324 12328 rval = -1;
12325 12329 goto out;
12326 12330 }
12327 12331 if (SATA_PMPORT_INFO(sata_hba_inst, cport, pmport) ==
12328 12332 NULL ||
12329 12333 SATA_PMPORT_DEV_TYPE(sata_hba_inst, cport,
12330 12334 pmport) == SATA_DTYPE_NONE)
12331 12335 goto out;
12332 12336
12333 12337 sdinfo = SATA_PMPORT_DRV_INFO(sata_hba_inst, cport,
12334 12338 pmport);
12335 12339 if (SATA_PMPORT_DEV_TYPE(sata_hba_inst, cport,
12336 12340 pmport) == SATA_DTYPE_UNKNOWN && sdinfo != NULL) {
12337 12341 rval = 2;
12338 12342 goto out;
12339 12343 }
12340 12344
12341 12345 if ((SATA_PMPORT_DEV_TYPE(sata_hba_inst, cport,
12342 12346 pmport) & SATA_VALID_DEV_TYPE) == 0) {
12343 12347 rval = -1;
12344 12348 goto out;
12345 12349 }
12346 12350
12347 12351 } else {
12348 12352 rval = -1;
12349 12353 goto out;
12350 12354 }
12351 12355 if ((sdinfo == NULL) ||
12352 12356 (sdinfo->satadrv_type & SATA_VALID_DEV_TYPE) == 0)
12353 12357 goto out;
12354 12358
12355 12359 sata_device->satadev_type = sdinfo->satadrv_type;
12356 12360
12357 12361 return (0);
12358 12362 }
12359 12363 out:
12360 12364 if (rval > 0) {
12361 12365 SATADBG2(SATA_DBG_SCSI_IF, sata_hba_inst,
12362 12366 "sata_validate_scsi_address: no valid target %x lun %x",
12363 12367 ap->a_target, ap->a_lun);
12364 12368 }
12365 12369 return (rval);
12366 12370 }
12367 12371
12368 12372 /*
12369 12373 * Find dip corresponding to passed device number
12370 12374 *
12371 12375 * Returns NULL if invalid device number is passed or device cannot be found,
12372 12376 * Returns dip is device is found.
12373 12377 */
12374 12378 static dev_info_t *
12375 12379 sata_devt_to_devinfo(dev_t dev)
12376 12380 {
12377 12381 dev_info_t *dip;
12378 12382 #ifndef __lock_lint
12379 12383 struct devnames *dnp;
12380 12384 major_t major = getmajor(dev);
12381 12385 int instance = SATA_MINOR2INSTANCE(getminor(dev));
12382 12386
12383 12387 if (major >= devcnt)
12384 12388 return (NULL);
12385 12389
12386 12390 dnp = &devnamesp[major];
12387 12391 LOCK_DEV_OPS(&(dnp->dn_lock));
12388 12392 dip = dnp->dn_head;
12389 12393 while (dip && (ddi_get_instance(dip) != instance)) {
12390 12394 dip = ddi_get_next(dip);
12391 12395 }
12392 12396 UNLOCK_DEV_OPS(&(dnp->dn_lock));
12393 12397 #endif
12394 12398
12395 12399 return (dip);
12396 12400 }
12397 12401
12398 12402
12399 12403 /*
12400 12404 * Probe device.
12401 12405 * This function issues Identify Device command and initializes local
12402 12406 * sata_drive_info structure if the device can be identified.
12403 12407 * The device type is determined by examining Identify Device
12404 12408 * command response.
12405 12409 * If the sata_hba_inst has linked drive info structure for this
12406 12410 * device address, the Identify Device data is stored into sata_drive_info
12407 12411 * structure linked to the port info structure.
12408 12412 *
12409 12413 * sata_device has to refer to the valid sata port(s) for HBA described
12410 12414 * by sata_hba_inst structure.
12411 12415 *
12412 12416 * Returns:
12413 12417 * SATA_SUCCESS if device type was successfully probed and port-linked
12414 12418 * drive info structure was updated;
12415 12419 * SATA_FAILURE if there is no device, or device was not probed
12416 12420 * successully;
12417 12421 * SATA_RETRY if device probe can be retried later.
12418 12422 * If a device cannot be identified, sata_device's dev_state and dev_type
12419 12423 * fields are set to unknown.
12420 12424 * There are no retries in this function. Any retries should be managed by
12421 12425 * the caller.
12422 12426 */
12423 12427
12424 12428
12425 12429 static int
12426 12430 sata_probe_device(sata_hba_inst_t *sata_hba_inst, sata_device_t *sata_device)
12427 12431 {
12428 12432 sata_pmport_info_t *pmportinfo;
12429 12433 sata_drive_info_t *sdinfo;
12430 12434 sata_drive_info_t new_sdinfo; /* local drive info struct */
12431 12435 int rval;
12432 12436
12433 12437 ASSERT((SATA_CPORT_STATE(sata_hba_inst,
12434 12438 sata_device->satadev_addr.cport) &
12435 12439 (SATA_STATE_PROBED | SATA_STATE_READY)) != 0);
12436 12440
12437 12441 sata_device->satadev_type = SATA_DTYPE_NONE;
12438 12442
12439 12443 mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst,
12440 12444 sata_device->satadev_addr.cport)));
12441 12445
12442 12446 if (sata_device->satadev_addr.qual == SATA_ADDR_DPMPORT) {
12443 12447 pmportinfo = SATA_PMPORT_INFO(sata_hba_inst,
12444 12448 sata_device->satadev_addr.cport,
12445 12449 sata_device->satadev_addr.pmport);
12446 12450 ASSERT(pmportinfo != NULL);
12447 12451 }
12448 12452
12449 12453 /* Get pointer to port-linked sata device info structure */
12450 12454 sdinfo = sata_get_device_info(sata_hba_inst, sata_device);
12451 12455 if (sdinfo != NULL) {
12452 12456 sdinfo->satadrv_state &=
12453 12457 ~(SATA_STATE_PROBED | SATA_STATE_READY);
12454 12458 sdinfo->satadrv_state |= SATA_STATE_PROBING;
12455 12459 } else {
12456 12460 /* No device to probe */
12457 12461 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
12458 12462 sata_device->satadev_addr.cport)));
12459 12463 sata_device->satadev_type = SATA_DTYPE_NONE;
12460 12464 sata_device->satadev_state = SATA_STATE_UNKNOWN;
12461 12465 return (SATA_FAILURE);
12462 12466 }
12463 12467 /*
12464 12468 * Need to issue both types of identify device command and
12465 12469 * determine device type by examining retreived data/status.
12466 12470 * First, ATA Identify Device.
12467 12471 */
12468 12472 bzero(&new_sdinfo, sizeof (sata_drive_info_t));
12469 12473 new_sdinfo.satadrv_addr = sata_device->satadev_addr;
12470 12474 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
12471 12475 sata_device->satadev_addr.cport)));
12472 12476 new_sdinfo.satadrv_type = SATA_DTYPE_ATADISK;
12473 12477 rval = sata_identify_device(sata_hba_inst, &new_sdinfo);
12474 12478 if (rval == SATA_RETRY) {
12475 12479 /* We may try to check for ATAPI device */
12476 12480 if (SATA_FEATURES(sata_hba_inst) & SATA_CTLF_ATAPI) {
12477 12481 /*
12478 12482 * HBA supports ATAPI - try to issue Identify Packet
12479 12483 * Device command.
12480 12484 */
12481 12485 new_sdinfo.satadrv_type = SATA_DTYPE_ATAPI;
12482 12486 rval = sata_identify_device(sata_hba_inst, &new_sdinfo);
12483 12487 }
12484 12488 }
12485 12489 if (rval == SATA_SUCCESS) {
12486 12490 /*
12487 12491 * Got something responding positively to ATA Identify Device
12488 12492 * or to Identify Packet Device cmd.
12489 12493 * Save last used device type.
12490 12494 */
12491 12495 sata_device->satadev_type = new_sdinfo.satadrv_type;
12492 12496
12493 12497 /* save device info, if possible */
12494 12498 mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst,
12495 12499 sata_device->satadev_addr.cport)));
12496 12500 sdinfo = sata_get_device_info(sata_hba_inst, sata_device);
12497 12501 if (sdinfo == NULL) {
12498 12502 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
12499 12503 sata_device->satadev_addr.cport)));
12500 12504 return (SATA_FAILURE);
12501 12505 }
12502 12506 /*
12503 12507 * Copy drive info into the port-linked drive info structure.
12504 12508 */
12505 12509 *sdinfo = new_sdinfo;
12506 12510 sdinfo->satadrv_state &= ~SATA_STATE_PROBING;
12507 12511 sdinfo->satadrv_state |= SATA_STATE_PROBED;
12508 12512 if (sata_device->satadev_addr.qual == SATA_ADDR_DCPORT)
12509 12513 SATA_CPORT_DEV_TYPE(sata_hba_inst,
12510 12514 sata_device->satadev_addr.cport) =
12511 12515 sdinfo->satadrv_type;
12512 12516 else { /* SATA_ADDR_DPMPORT */
12513 12517 mutex_enter(&pmportinfo->pmport_mutex);
12514 12518 SATA_PMPORT_DEV_TYPE(sata_hba_inst,
12515 12519 sata_device->satadev_addr.cport,
12516 12520 sata_device->satadev_addr.pmport) =
12517 12521 sdinfo->satadrv_type;
12518 12522 mutex_exit(&pmportinfo->pmport_mutex);
12519 12523 }
12520 12524 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
12521 12525 sata_device->satadev_addr.cport)));
12522 12526 return (SATA_SUCCESS);
12523 12527 }
12524 12528
12525 12529 /*
12526 12530 * It may be SATA_RETRY or SATA_FAILURE return.
12527 12531 * Looks like we cannot determine the device type at this time.
12528 12532 */
12529 12533 mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst,
12530 12534 sata_device->satadev_addr.cport)));
12531 12535 sdinfo = sata_get_device_info(sata_hba_inst, sata_device);
12532 12536 if (sdinfo != NULL) {
12533 12537 sata_device->satadev_type = SATA_DTYPE_UNKNOWN;
12534 12538 sdinfo->satadrv_type = SATA_DTYPE_UNKNOWN;
12535 12539 sdinfo->satadrv_state &= ~SATA_STATE_PROBING;
12536 12540 sdinfo->satadrv_state |= SATA_STATE_PROBED;
12537 12541 if (sata_device->satadev_addr.qual == SATA_ADDR_DCPORT)
12538 12542 SATA_CPORT_DEV_TYPE(sata_hba_inst,
12539 12543 sata_device->satadev_addr.cport) =
12540 12544 SATA_DTYPE_UNKNOWN;
12541 12545 else {
12542 12546 /* SATA_ADDR_DPMPORT */
12543 12547 mutex_enter(&pmportinfo->pmport_mutex);
12544 12548 if ((SATA_PMULT_INFO(sata_hba_inst,
12545 12549 sata_device->satadev_addr.cport) != NULL) &&
12546 12550 (SATA_PMPORT_INFO(sata_hba_inst,
12547 12551 sata_device->satadev_addr.cport,
12548 12552 sata_device->satadev_addr.pmport) != NULL))
12549 12553 SATA_PMPORT_DEV_TYPE(sata_hba_inst,
12550 12554 sata_device->satadev_addr.cport,
12551 12555 sata_device->satadev_addr.pmport) =
12552 12556 SATA_DTYPE_UNKNOWN;
12553 12557 mutex_exit(&pmportinfo->pmport_mutex);
12554 12558 }
12555 12559 }
12556 12560 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
12557 12561 sata_device->satadev_addr.cport)));
12558 12562 return (rval);
12559 12563 }
12560 12564
12561 12565
12562 12566 /*
12563 12567 * Get pointer to sata_drive_info structure.
12564 12568 *
12565 12569 * The sata_device has to contain address (cport, pmport and qualifier) for
12566 12570 * specified sata_scsi structure.
12567 12571 *
12568 12572 * Returns NULL if device address is not valid for this HBA configuration.
12569 12573 * Otherwise, returns a pointer to sata_drive_info structure.
12570 12574 *
12571 12575 * This function should be called with a port mutex held.
12572 12576 */
12573 12577 static sata_drive_info_t *
12574 12578 sata_get_device_info(sata_hba_inst_t *sata_hba_inst,
12575 12579 sata_device_t *sata_device)
12576 12580 {
12577 12581 uint8_t cport = sata_device->satadev_addr.cport;
12578 12582 uint8_t pmport = sata_device->satadev_addr.pmport;
12579 12583 uint8_t qual = sata_device->satadev_addr.qual;
12580 12584
12581 12585 if (cport >= SATA_NUM_CPORTS(sata_hba_inst))
12582 12586 return (NULL);
12583 12587
12584 12588 if (!(SATA_CPORT_STATE(sata_hba_inst, cport) &
12585 12589 (SATA_STATE_PROBED | SATA_STATE_READY)))
12586 12590 /* Port not probed yet */
12587 12591 return (NULL);
12588 12592
12589 12593 if (SATA_CPORT_DEV_TYPE(sata_hba_inst, cport) == SATA_DTYPE_NONE)
12590 12594 return (NULL);
12591 12595
12592 12596 if (qual == SATA_ADDR_DCPORT) {
12593 12597 /* Request for a device on a controller port */
12594 12598 if (SATA_CPORT_DEV_TYPE(sata_hba_inst, cport) ==
12595 12599 SATA_DTYPE_PMULT)
12596 12600 /* Port multiplier attached */
12597 12601 return (NULL);
12598 12602 return (SATA_CPORT_DRV_INFO(sata_hba_inst, cport));
12599 12603 }
12600 12604 if (qual == SATA_ADDR_DPMPORT) {
12601 12605 if (SATA_CPORT_DEV_TYPE(sata_hba_inst, cport) !=
12602 12606 SATA_DTYPE_PMULT)
12603 12607 return (NULL);
12604 12608
12605 12609 if (pmport > SATA_NUM_PMPORTS(sata_hba_inst, cport))
12606 12610 return (NULL);
12607 12611
12608 12612 if (!(SATA_PMPORT_STATE(sata_hba_inst, cport, pmport) &
12609 12613 (SATA_STATE_PROBED | SATA_STATE_READY)))
12610 12614 /* Port multiplier port not probed yet */
12611 12615 return (NULL);
12612 12616
12613 12617 return (SATA_PMPORT_DRV_INFO(sata_hba_inst, cport, pmport));
12614 12618 }
12615 12619
12616 12620 /* we should not get here */
12617 12621 return (NULL);
12618 12622 }
12619 12623
12620 12624
12621 12625 /*
12622 12626 * sata_identify_device.
12623 12627 * Send Identify Device command to SATA HBA driver.
12624 12628 * If command executes successfully, update sata_drive_info structure pointed
12625 12629 * to by sdinfo argument, including Identify Device data.
12626 12630 * If command fails, invalidate data in sata_drive_info.
12627 12631 *
12628 12632 * Cannot be called from interrupt level.
12629 12633 *
12630 12634 * Returns:
12631 12635 * SATA_SUCCESS if the device was identified as a supported device,
12632 12636 * SATA_RETRY if the device was not identified but could be retried,
12633 12637 * SATA_FAILURE if the device was not identified and identify attempt
12634 12638 * should not be retried.
12635 12639 */
12636 12640 static int
12637 12641 sata_identify_device(sata_hba_inst_t *sata_hba_inst,
12638 12642 sata_drive_info_t *sdinfo)
12639 12643 {
12640 12644 uint16_t cfg_word;
12641 12645 int rval;
12642 12646
12643 12647 /* fetch device identify data */
12644 12648 if ((rval = sata_fetch_device_identify_data(sata_hba_inst,
12645 12649 sdinfo)) != SATA_SUCCESS)
12646 12650 goto fail_unknown;
12647 12651
12648 12652 cfg_word = sdinfo->satadrv_id.ai_config;
12649 12653
12650 12654 /* Set the correct device type */
12651 12655 if ((cfg_word & SATA_ATA_TYPE_MASK) == SATA_ATA_TYPE) {
12652 12656 sdinfo->satadrv_type = SATA_DTYPE_ATADISK;
12653 12657 } else if (cfg_word == SATA_CFA_TYPE) {
12654 12658 /* It's a Compact Flash media via CF-to-SATA HDD adapter */
12655 12659 sdinfo->satadrv_type = SATA_DTYPE_ATADISK;
12656 12660 } else if ((cfg_word & SATA_ATAPI_TYPE_MASK) == SATA_ATAPI_TYPE) {
12657 12661 switch (cfg_word & SATA_ATAPI_ID_DEV_TYPE) {
12658 12662 case SATA_ATAPI_CDROM_DEV:
12659 12663 sdinfo->satadrv_type = SATA_DTYPE_ATAPICD;
12660 12664 break;
12661 12665 case SATA_ATAPI_SQACC_DEV:
12662 12666 sdinfo->satadrv_type = SATA_DTYPE_ATAPITAPE;
12663 12667 break;
12664 12668 case SATA_ATAPI_DIRACC_DEV:
12665 12669 sdinfo->satadrv_type = SATA_DTYPE_ATAPIDISK;
12666 12670 break;
12667 12671 case SATA_ATAPI_PROC_DEV:
12668 12672 sdinfo->satadrv_type = SATA_DTYPE_ATAPIPROC;
12669 12673 break;
12670 12674 default:
12671 12675 sdinfo->satadrv_type = SATA_DTYPE_UNKNOWN;
12672 12676 }
12673 12677 } else {
12674 12678 sdinfo->satadrv_type = SATA_DTYPE_UNKNOWN;
12675 12679 }
12676 12680
12677 12681 if (sdinfo->satadrv_type == SATA_DTYPE_ATADISK) {
12678 12682 if (sdinfo->satadrv_capacity == 0) {
12679 12683 /* Non-LBA disk. Too bad... */
12680 12684 sata_log(sata_hba_inst, CE_WARN,
12681 12685 "SATA disk device at port %d does not support LBA",
12682 12686 sdinfo->satadrv_addr.cport);
12683 12687 rval = SATA_FAILURE;
12684 12688 goto fail_unknown;
12685 12689 }
12686 12690 }
12687 12691 #if 0
12688 12692 /* Left for historical reason */
12689 12693 /*
12690 12694 * Some initial version of SATA spec indicated that at least
12691 12695 * UDMA mode 4 has to be supported. It is not metioned in
12692 12696 * SerialATA 2.6, so this restriction is removed.
12693 12697 */
12694 12698 /* Check for Ultra DMA modes 6 through 0 being supported */
12695 12699 for (i = 6; i >= 0; --i) {
12696 12700 if (sdinfo->satadrv_id.ai_ultradma & (1 << i))
12697 12701 break;
12698 12702 }
12699 12703
12700 12704 /*
12701 12705 * At least UDMA 4 mode has to be supported. If mode 4 or
12702 12706 * higher are not supported by the device, fail this
12703 12707 * device.
12704 12708 */
12705 12709 if (i < 4) {
12706 12710 /* No required Ultra DMA mode supported */
12707 12711 sata_log(sata_hba_inst, CE_WARN,
12708 12712 "SATA disk device at port %d does not support UDMA "
12709 12713 "mode 4 or higher", sdinfo->satadrv_addr.cport);
12710 12714 SATA_LOG_D((sata_hba_inst, CE_WARN,
12711 12715 "mode 4 or higher required, %d supported", i));
12712 12716 rval = SATA_FAILURE;
12713 12717 goto fail_unknown;
12714 12718 }
12715 12719 #endif
12716 12720
12717 12721 /*
12718 12722 * For Disk devices, if it doesn't support UDMA mode, we would
12719 12723 * like to return failure directly.
12720 12724 */
12721 12725 if ((sdinfo->satadrv_type == SATA_DTYPE_ATADISK) &&
12722 12726 !((sdinfo->satadrv_id.ai_validinfo & SATA_VALIDINFO_88) != 0 &&
12723 12727 (sdinfo->satadrv_id.ai_ultradma & SATA_UDMA_SUP_MASK) != 0)) {
12724 12728 sata_log(sata_hba_inst, CE_WARN,
12725 12729 "SATA disk device at port %d does not support UDMA",
12726 12730 sdinfo->satadrv_addr.cport);
12727 12731 rval = SATA_FAILURE;
12728 12732 goto fail_unknown;
12729 12733 }
12730 12734
12731 12735 return (SATA_SUCCESS);
12732 12736
12733 12737 fail_unknown:
12734 12738 /* Invalidate sata_drive_info ? */
12735 12739 sdinfo->satadrv_type = SATA_DTYPE_UNKNOWN;
12736 12740 sdinfo->satadrv_state = SATA_STATE_UNKNOWN;
12737 12741 return (rval);
12738 12742 }
12739 12743
12740 12744 /*
12741 12745 * Log/display device information
12742 12746 */
12743 12747 static void
12744 12748 sata_show_drive_info(sata_hba_inst_t *sata_hba_inst,
12745 12749 sata_drive_info_t *sdinfo)
12746 12750 {
12747 12751 int valid_version;
12748 12752 char msg_buf[MAXPATHLEN];
12749 12753 int i;
12750 12754
12751 12755 /* Show HBA path */
12752 12756 (void) ddi_pathname(SATA_DIP(sata_hba_inst), msg_buf);
12753 12757
12754 12758 cmn_err(CE_CONT, "?%s :\n", msg_buf);
12755 12759
12756 12760 switch (sdinfo->satadrv_type) {
12757 12761 case SATA_DTYPE_ATADISK:
12758 12762 (void) sprintf(msg_buf, "SATA disk device at");
12759 12763 break;
12760 12764
12761 12765 case SATA_DTYPE_ATAPICD:
12762 12766 (void) sprintf(msg_buf, "SATA CD/DVD (ATAPI) device at");
12763 12767 break;
12764 12768
12765 12769 case SATA_DTYPE_ATAPITAPE:
12766 12770 (void) sprintf(msg_buf, "SATA tape (ATAPI) device at");
12767 12771 break;
12768 12772
12769 12773 case SATA_DTYPE_ATAPIDISK:
12770 12774 (void) sprintf(msg_buf, "SATA disk (ATAPI) device at");
12771 12775 break;
12772 12776
12773 12777 case SATA_DTYPE_ATAPIPROC:
12774 12778 (void) sprintf(msg_buf, "SATA processor (ATAPI) device at");
12775 12779 break;
12776 12780
12777 12781 case SATA_DTYPE_UNKNOWN:
12778 12782 (void) sprintf(msg_buf,
12779 12783 "Unsupported SATA device type (cfg 0x%x) at ",
12780 12784 sdinfo->satadrv_id.ai_config);
12781 12785 break;
12782 12786 }
12783 12787
12784 12788 if (sdinfo->satadrv_addr.qual == SATA_ADDR_DCPORT)
12785 12789 cmn_err(CE_CONT, "?\t%s port %d\n",
12786 12790 msg_buf, sdinfo->satadrv_addr.cport);
12787 12791 else
12788 12792 cmn_err(CE_CONT, "?\t%s port %d:%d\n",
12789 12793 msg_buf, sdinfo->satadrv_addr.cport,
12790 12794 sdinfo->satadrv_addr.pmport);
12791 12795
12792 12796 bcopy(&sdinfo->satadrv_id.ai_model, msg_buf,
12793 12797 sizeof (sdinfo->satadrv_id.ai_model));
12794 12798 swab(msg_buf, msg_buf, sizeof (sdinfo->satadrv_id.ai_model));
12795 12799 msg_buf[sizeof (sdinfo->satadrv_id.ai_model)] = '\0';
12796 12800 cmn_err(CE_CONT, "?\tmodel %s\n", msg_buf);
12797 12801
12798 12802 bcopy(&sdinfo->satadrv_id.ai_fw, msg_buf,
12799 12803 sizeof (sdinfo->satadrv_id.ai_fw));
12800 12804 swab(msg_buf, msg_buf, sizeof (sdinfo->satadrv_id.ai_fw));
12801 12805 msg_buf[sizeof (sdinfo->satadrv_id.ai_fw)] = '\0';
12802 12806 cmn_err(CE_CONT, "?\tfirmware %s\n", msg_buf);
12803 12807
12804 12808 bcopy(&sdinfo->satadrv_id.ai_drvser, msg_buf,
12805 12809 sizeof (sdinfo->satadrv_id.ai_drvser));
12806 12810 swab(msg_buf, msg_buf, sizeof (sdinfo->satadrv_id.ai_drvser));
12807 12811 msg_buf[sizeof (sdinfo->satadrv_id.ai_drvser)] = '\0';
12808 12812 if (sdinfo->satadrv_type == SATA_DTYPE_ATADISK) {
12809 12813 cmn_err(CE_CONT, "?\tserial number %s\n", msg_buf);
12810 12814 } else {
12811 12815 /*
12812 12816 * Some drives do not implement serial number and may
12813 12817 * violate the spec by providing spaces rather than zeros
12814 12818 * in serial number field. Scan the buffer to detect it.
12815 12819 */
12816 12820 for (i = 0; i < sizeof (sdinfo->satadrv_id.ai_drvser); i++) {
12817 12821 if (msg_buf[i] != '\0' && msg_buf[i] != ' ')
12818 12822 break;
12819 12823 }
12820 12824 if (i == sizeof (sdinfo->satadrv_id.ai_drvser)) {
12821 12825 cmn_err(CE_CONT, "?\tserial number - none\n");
12822 12826 } else {
12823 12827 cmn_err(CE_CONT, "?\tserial number %s\n", msg_buf);
12824 12828 }
12825 12829 }
12826 12830
12827 12831 #ifdef SATA_DEBUG
12828 12832 if (sdinfo->satadrv_id.ai_majorversion != 0 &&
12829 12833 sdinfo->satadrv_id.ai_majorversion != 0xffff) {
12830 12834 int i;
12831 12835 for (i = 14; i >= 2; i--) {
12832 12836 if (sdinfo->satadrv_id.ai_majorversion & (1 << i)) {
12833 12837 valid_version = i;
12834 12838 break;
12835 12839 }
12836 12840 }
12837 12841 cmn_err(CE_CONT,
12838 12842 "?\tATA/ATAPI-%d supported, majver 0x%x minver 0x%x\n",
12839 12843 valid_version,
12840 12844 sdinfo->satadrv_id.ai_majorversion,
12841 12845 sdinfo->satadrv_id.ai_minorversion);
12842 12846 }
12843 12847 #endif
12844 12848 /* Log some info */
12845 12849 cmn_err(CE_CONT, "?\tsupported features:\n");
12846 12850 msg_buf[0] = '\0';
12847 12851 if (sdinfo->satadrv_type == SATA_DTYPE_ATADISK) {
12848 12852 if (sdinfo->satadrv_features_support & SATA_DEV_F_LBA48)
12849 12853 (void) strlcat(msg_buf, "48-bit LBA, ", MAXPATHLEN);
12850 12854 else if (sdinfo->satadrv_features_support & SATA_DEV_F_LBA28)
12851 12855 (void) strlcat(msg_buf, "28-bit LBA, ", MAXPATHLEN);
12852 12856 }
12853 12857 if (sdinfo->satadrv_features_support & SATA_DEV_F_DMA)
12854 12858 (void) strlcat(msg_buf, "DMA", MAXPATHLEN);
12855 12859 if (sdinfo->satadrv_features_support & SATA_DEV_F_NCQ)
12856 12860 (void) strlcat(msg_buf, ", Native Command Queueing",
12857 12861 MAXPATHLEN);
12858 12862 if (sdinfo->satadrv_features_support & SATA_DEV_F_TCQ)
12859 12863 (void) strlcat(msg_buf, ", Legacy Tagged Queuing", MAXPATHLEN);
12860 12864 if ((sdinfo->satadrv_id.ai_cmdset82 & SATA_SMART_SUPPORTED) &&
12861 12865 (sdinfo->satadrv_id.ai_features85 & SATA_SMART_ENABLED))
12862 12866 (void) strlcat(msg_buf, ", SMART", MAXPATHLEN);
12863 12867 if ((sdinfo->satadrv_id.ai_cmdset84 & SATA_SMART_SELF_TEST_SUPPORTED) &&
12864 12868 (sdinfo->satadrv_id.ai_features87 & SATA_SMART_SELF_TEST_SUPPORTED))
12865 12869 (void) strlcat(msg_buf, ", SMART self-test", MAXPATHLEN);
12866 12870 cmn_err(CE_CONT, "?\t %s\n", msg_buf);
12867 12871 if (sdinfo->satadrv_features_support & SATA_DEV_F_SATA3)
12868 12872 cmn_err(CE_CONT, "?\tSATA Gen3 signaling speed (6.0Gbps)\n");
12869 12873 else if (sdinfo->satadrv_features_support & SATA_DEV_F_SATA2)
12870 12874 cmn_err(CE_CONT, "?\tSATA Gen2 signaling speed (3.0Gbps)\n");
12871 12875 else if (sdinfo->satadrv_features_support & SATA_DEV_F_SATA1)
12872 12876 cmn_err(CE_CONT, "?\tSATA Gen1 signaling speed (1.5Gbps)\n");
12873 12877 if (sdinfo->satadrv_features_support &
12874 12878 (SATA_DEV_F_TCQ | SATA_DEV_F_NCQ)) {
12875 12879 msg_buf[0] = '\0';
12876 12880 (void) snprintf(msg_buf, MAXPATHLEN,
12877 12881 "Supported queue depth %d",
12878 12882 sdinfo->satadrv_queue_depth);
12879 12883 if (!(sata_func_enable &
12880 12884 (SATA_ENABLE_QUEUING | SATA_ENABLE_NCQ)))
12881 12885 (void) strlcat(msg_buf,
12882 12886 " - queueing disabled globally", MAXPATHLEN);
12883 12887 else if (sdinfo->satadrv_queue_depth >
12884 12888 sdinfo->satadrv_max_queue_depth) {
12885 12889 (void) snprintf(&msg_buf[strlen(msg_buf)],
12886 12890 MAXPATHLEN - strlen(msg_buf), ", limited to %d",
12887 12891 (int)sdinfo->satadrv_max_queue_depth);
12888 12892 }
12889 12893 cmn_err(CE_CONT, "?\t%s\n", msg_buf);
12890 12894 }
12891 12895
12892 12896 if (sdinfo->satadrv_type == SATA_DTYPE_ATADISK) {
12893 12897 #ifdef __i386
12894 12898 (void) sprintf(msg_buf, "\tcapacity = %llu sectors\n",
12895 12899 sdinfo->satadrv_capacity);
12896 12900 #else
12897 12901 (void) sprintf(msg_buf, "\tcapacity = %lu sectors\n",
12898 12902 sdinfo->satadrv_capacity);
12899 12903 #endif
12900 12904 cmn_err(CE_CONT, "?%s", msg_buf);
12901 12905 }
12902 12906 }
12903 12907
12904 12908 /*
12905 12909 * Log/display port multiplier information
12906 12910 * No Mutex should be hold.
12907 12911 */
12908 12912 static void
12909 12913 sata_show_pmult_info(sata_hba_inst_t *sata_hba_inst,
12910 12914 sata_device_t *sata_device)
12911 12915 {
12912 12916 _NOTE(ARGUNUSED(sata_hba_inst))
12913 12917
12914 12918 int cport = sata_device->satadev_addr.cport;
12915 12919 sata_pmult_info_t *pmultinfo;
12916 12920 char msg_buf[MAXPATHLEN];
12917 12921 uint32_t gscr0, gscr1, gscr2, gscr64;
12918 12922
12919 12923 mutex_enter(&SATA_CPORT_MUTEX(sata_hba_inst, cport));
12920 12924 pmultinfo = SATA_PMULT_INFO(sata_hba_inst, cport);
12921 12925 if (pmultinfo == NULL) {
12922 12926 mutex_exit(&SATA_CPORT_MUTEX(sata_hba_inst, cport));
12923 12927 return;
12924 12928 }
12925 12929
12926 12930 gscr0 = pmultinfo->pmult_gscr.gscr0;
12927 12931 gscr1 = pmultinfo->pmult_gscr.gscr1;
12928 12932 gscr2 = pmultinfo->pmult_gscr.gscr2;
12929 12933 gscr64 = pmultinfo->pmult_gscr.gscr64;
12930 12934 mutex_exit(&SATA_CPORT_MUTEX(sata_hba_inst, cport));
12931 12935
12932 12936 cmn_err(CE_CONT, "?Port Multiplier %d device-ports found at port %d",
12933 12937 sata_device->satadev_add_info, sata_device->satadev_addr.cport);
12934 12938
12935 12939 (void) sprintf(msg_buf, "\tVendor_ID 0x%04x, Module_ID 0x%04x",
12936 12940 gscr0 & 0xffff, (gscr0 >> 16) & 0xffff);
12937 12941 cmn_err(CE_CONT, "?%s", msg_buf);
12938 12942
12939 12943 (void) strcpy(msg_buf, "\tSupport SATA PMP Spec ");
12940 12944 if (gscr1 & (1 << 3))
12941 12945 (void) strlcat(msg_buf, "1.2", MAXPATHLEN);
12942 12946 else if (gscr1 & (1 << 2))
12943 12947 (void) strlcat(msg_buf, "1.1", MAXPATHLEN);
12944 12948 else if (gscr1 & (1 << 1))
12945 12949 (void) strlcat(msg_buf, "1.0", MAXPATHLEN);
12946 12950 else
12947 12951 (void) strlcat(msg_buf, "unknown", MAXPATHLEN);
12948 12952 cmn_err(CE_CONT, "?%s", msg_buf);
12949 12953
12950 12954 (void) strcpy(msg_buf, "\tSupport ");
12951 12955 if (gscr64 & (1 << 3))
12952 12956 (void) strlcat(msg_buf, "Asy-Notif, ",
12953 12957 MAXPATHLEN);
12954 12958 if (gscr64 & (1 << 2))
12955 12959 (void) strlcat(msg_buf, "Dyn-SSC, ", MAXPATHLEN);
12956 12960 if (gscr64 & (1 << 1))
12957 12961 (void) strlcat(msg_buf, "Iss-PMREQ, ", MAXPATHLEN);
12958 12962 if (gscr64 & (1 << 0))
12959 12963 (void) strlcat(msg_buf, "BIST", MAXPATHLEN);
12960 12964 if ((gscr64 & 0xf) == 0)
12961 12965 (void) strlcat(msg_buf, "nothing", MAXPATHLEN);
12962 12966 cmn_err(CE_CONT, "?%s", msg_buf);
12963 12967
12964 12968 (void) sprintf(msg_buf, "\tNumber of exposed device fan-out ports: %d",
12965 12969 gscr2 & SATA_PMULT_PORTNUM_MASK);
12966 12970 cmn_err(CE_CONT, "?%s", msg_buf);
12967 12971 }
12968 12972
12969 12973 /*
12970 12974 * sata_save_drive_settings extracts current setting of the device and stores
12971 12975 * it for future reference, in case the device setup would need to be restored
12972 12976 * after the device reset.
12973 12977 *
12974 12978 * For all devices read ahead and write cache settings are saved, if the
12975 12979 * device supports these features at all.
12976 12980 * For ATAPI devices the Removable Media Status Notification setting is saved.
12977 12981 */
12978 12982 static void
12979 12983 sata_save_drive_settings(sata_drive_info_t *sdinfo)
12980 12984 {
12981 12985 if (SATA_READ_AHEAD_SUPPORTED(sdinfo->satadrv_id) ||
12982 12986 SATA_WRITE_CACHE_SUPPORTED(sdinfo->satadrv_id)) {
12983 12987
12984 12988 /* Current setting of Read Ahead (and Read Cache) */
12985 12989 if (SATA_READ_AHEAD_ENABLED(sdinfo->satadrv_id))
12986 12990 sdinfo->satadrv_settings |= SATA_DEV_READ_AHEAD;
12987 12991 else
12988 12992 sdinfo->satadrv_settings &= ~SATA_DEV_READ_AHEAD;
12989 12993
12990 12994 /* Current setting of Write Cache */
12991 12995 if (SATA_WRITE_CACHE_ENABLED(sdinfo->satadrv_id))
12992 12996 sdinfo->satadrv_settings |= SATA_DEV_WRITE_CACHE;
12993 12997 else
12994 12998 sdinfo->satadrv_settings &= ~SATA_DEV_WRITE_CACHE;
12995 12999 }
12996 13000
12997 13001 if (sdinfo->satadrv_type == SATA_DTYPE_ATAPICD) {
12998 13002 if (SATA_RM_NOTIFIC_SUPPORTED(sdinfo->satadrv_id))
12999 13003 sdinfo->satadrv_settings |= SATA_DEV_RMSN;
13000 13004 else
13001 13005 sdinfo->satadrv_settings &= ~SATA_DEV_RMSN;
13002 13006 }
13003 13007 }
13004 13008
13005 13009
13006 13010 /*
13007 13011 * sata_check_capacity function determines a disk capacity
13008 13012 * and addressing mode (LBA28/LBA48) by examining a disk identify device data.
13009 13013 *
13010 13014 * NOTE: CHS mode is not supported! If a device does not support LBA,
13011 13015 * this function is not called.
13012 13016 *
13013 13017 * Returns device capacity in number of blocks, i.e. largest addressable LBA+1
13014 13018 */
13015 13019 static uint64_t
13016 13020 sata_check_capacity(sata_drive_info_t *sdinfo)
13017 13021 {
13018 13022 uint64_t capacity = 0;
13019 13023 int i;
13020 13024
13021 13025 if (sdinfo->satadrv_type != SATA_DTYPE_ATADISK ||
13022 13026 !sdinfo->satadrv_id.ai_cap & SATA_LBA_SUPPORT)
13023 13027 /* Capacity valid only for LBA-addressable disk devices */
13024 13028 return (0);
13025 13029
13026 13030 if ((sdinfo->satadrv_id.ai_validinfo & SATA_VALIDINFO_88) &&
13027 13031 (sdinfo->satadrv_id.ai_cmdset83 & SATA_EXT48) &&
13028 13032 (sdinfo->satadrv_id.ai_features86 & SATA_EXT48)) {
13029 13033 /* LBA48 mode supported and enabled */
13030 13034 sdinfo->satadrv_features_support |= SATA_DEV_F_LBA48 |
13031 13035 SATA_DEV_F_LBA28;
13032 13036 for (i = 3; i >= 0; --i) {
13033 13037 capacity <<= 16;
13034 13038 capacity += sdinfo->satadrv_id.ai_addrsecxt[i];
13035 13039 }
13036 13040 } else {
13037 13041 capacity = sdinfo->satadrv_id.ai_addrsec[1];
13038 13042 capacity <<= 16;
13039 13043 capacity += sdinfo->satadrv_id.ai_addrsec[0];
13040 13044 if (capacity >= 0x1000000)
13041 13045 /* LBA28 mode */
13042 13046 sdinfo->satadrv_features_support |= SATA_DEV_F_LBA28;
13043 13047 }
13044 13048 return (capacity);
13045 13049 }
13046 13050
13047 13051
13048 13052 /*
13049 13053 * Allocate consistent buffer for DMA transfer
13050 13054 *
13051 13055 * Cannot be called from interrupt level or with mutex held - it may sleep.
13052 13056 *
13053 13057 * Returns pointer to allocated buffer structure, or NULL if allocation failed.
13054 13058 */
13055 13059 static struct buf *
13056 13060 sata_alloc_local_buffer(sata_pkt_txlate_t *spx, int len)
13057 13061 {
13058 13062 struct scsi_address ap;
13059 13063 struct buf *bp;
13060 13064 ddi_dma_attr_t cur_dma_attr;
13061 13065
13062 13066 ASSERT(spx->txlt_sata_pkt != NULL);
13063 13067 ap.a_hba_tran = spx->txlt_sata_hba_inst->satahba_scsi_tran;
13064 13068 ap.a_target = SATA_TO_SCSI_TARGET(
13065 13069 spx->txlt_sata_pkt->satapkt_device.satadev_addr.cport,
13066 13070 spx->txlt_sata_pkt->satapkt_device.satadev_addr.pmport,
13067 13071 spx->txlt_sata_pkt->satapkt_device.satadev_addr.qual);
13068 13072 ap.a_lun = 0;
13069 13073
13070 13074 bp = scsi_alloc_consistent_buf(&ap, NULL, len,
13071 13075 B_READ, SLEEP_FUNC, NULL);
13072 13076
13073 13077 if (bp != NULL) {
13074 13078 /* Allocate DMA resources for this buffer */
13075 13079 spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp = bp;
13076 13080 /*
13077 13081 * We use a local version of the dma_attr, to account
13078 13082 * for a device addressing limitations.
13079 13083 * sata_adjust_dma_attr() will handle sdinfo == NULL which
13080 13084 * will cause dma attributes to be adjusted to a lowest
13081 13085 * acceptable level.
13082 13086 */
13083 13087 sata_adjust_dma_attr(NULL,
13084 13088 SATA_DMA_ATTR(spx->txlt_sata_hba_inst), &cur_dma_attr);
13085 13089
13086 13090 if (sata_dma_buf_setup(spx, PKT_CONSISTENT,
13087 13091 SLEEP_FUNC, NULL, &cur_dma_attr) != DDI_SUCCESS) {
13088 13092 scsi_free_consistent_buf(bp);
13089 13093 spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp = NULL;
13090 13094 bp = NULL;
13091 13095 }
13092 13096 }
13093 13097 return (bp);
13094 13098 }
13095 13099
13096 13100 /*
13097 13101 * Release local buffer (consistent buffer for DMA transfer) allocated
13098 13102 * via sata_alloc_local_buffer().
13099 13103 */
13100 13104 static void
13101 13105 sata_free_local_buffer(sata_pkt_txlate_t *spx)
13102 13106 {
13103 13107 ASSERT(spx->txlt_sata_pkt != NULL);
13104 13108 ASSERT(spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp != NULL);
13105 13109
13106 13110 spx->txlt_sata_pkt->satapkt_cmd.satacmd_num_dma_cookies = 0;
13107 13111 spx->txlt_sata_pkt->satapkt_cmd.satacmd_dma_cookie_list = NULL;
13108 13112
13109 13113 sata_common_free_dma_rsrcs(spx);
13110 13114
13111 13115 /* Free buffer */
13112 13116 scsi_free_consistent_buf(spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp);
13113 13117 spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp = NULL;
13114 13118 }
13115 13119
13116 13120 /*
13117 13121 * Allocate sata_pkt
13118 13122 * Pkt structure version and embedded strcutures version are initialized.
13119 13123 * sata_pkt and sata_pkt_txlate structures are cross-linked.
13120 13124 *
13121 13125 * Since this may be called in interrupt context by sata_scsi_init_pkt,
13122 13126 * callback argument determines if it can sleep or not.
13123 13127 * Hence, it should not be called from interrupt context.
13124 13128 *
13125 13129 * If successful, non-NULL pointer to a sata pkt is returned.
13126 13130 * Upon failure, NULL pointer is returned.
13127 13131 */
13128 13132 static sata_pkt_t *
13129 13133 sata_pkt_alloc(sata_pkt_txlate_t *spx, int (*callback)(caddr_t))
13130 13134 {
13131 13135 sata_pkt_t *spkt;
13132 13136 int kmsflag;
13133 13137
13134 13138 kmsflag = (callback == SLEEP_FUNC) ? KM_SLEEP : KM_NOSLEEP;
13135 13139 spkt = kmem_zalloc(sizeof (sata_pkt_t), kmsflag);
13136 13140 if (spkt == NULL) {
13137 13141 SATA_LOG_D((spx->txlt_sata_hba_inst, CE_WARN,
13138 13142 "sata_pkt_alloc: failed"));
13139 13143 return (NULL);
13140 13144 }
13141 13145 spkt->satapkt_rev = SATA_PKT_REV;
13142 13146 spkt->satapkt_cmd.satacmd_rev = SATA_CMD_REV;
13143 13147 spkt->satapkt_device.satadev_rev = SATA_DEVICE_REV;
13144 13148 spkt->satapkt_framework_private = spx;
13145 13149 spx->txlt_sata_pkt = spkt;
13146 13150 return (spkt);
13147 13151 }
13148 13152
13149 13153 /*
13150 13154 * Free sata pkt allocated via sata_pkt_alloc()
13151 13155 */
13152 13156 static void
13153 13157 sata_pkt_free(sata_pkt_txlate_t *spx)
13154 13158 {
13155 13159 ASSERT(spx->txlt_sata_pkt != NULL);
13156 13160 ASSERT(spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp == NULL);
13157 13161 kmem_free(spx->txlt_sata_pkt, sizeof (sata_pkt_t));
13158 13162 spx->txlt_sata_pkt = NULL;
13159 13163 }
13160 13164
13161 13165
13162 13166 /*
13163 13167 * Adjust DMA attributes.
13164 13168 * SCSI cmds block count is up to 24 bits, SATA cmd block count vary
13165 13169 * from 8 bits to 16 bits, depending on a command being used.
13166 13170 * Limiting max block count arbitrarily to 256 for all read/write
13167 13171 * commands may affects performance, so check both the device and
13168 13172 * controller capability before adjusting dma attributes.
13169 13173 */
13170 13174 void
13171 13175 sata_adjust_dma_attr(sata_drive_info_t *sdinfo, ddi_dma_attr_t *dma_attr,
13172 13176 ddi_dma_attr_t *adj_dma_attr)
13173 13177 {
13174 13178 uint32_t count_max;
13175 13179
13176 13180 /* Copy original attributes */
13177 13181 *adj_dma_attr = *dma_attr;
13178 13182 /*
13179 13183 * Things to consider: device addressing capability,
13180 13184 * "excessive" controller DMA capabilities.
13181 13185 * If a device is being probed/initialized, there are
13182 13186 * no device info - use default limits then.
13183 13187 */
13184 13188 if (sdinfo == NULL) {
13185 13189 count_max = dma_attr->dma_attr_granular * 0x100;
13186 13190 if (dma_attr->dma_attr_count_max > count_max)
13187 13191 adj_dma_attr->dma_attr_count_max = count_max;
13188 13192 if (dma_attr->dma_attr_maxxfer > count_max)
13189 13193 adj_dma_attr->dma_attr_maxxfer = count_max;
13190 13194 return;
13191 13195 }
13192 13196
13193 13197 if (sdinfo->satadrv_type == SATA_DTYPE_ATADISK) {
13194 13198 if (sdinfo->satadrv_features_support & (SATA_DEV_F_LBA48)) {
13195 13199 /*
13196 13200 * 16-bit sector count may be used - we rely on
13197 13201 * the assumption that only read and write cmds
13198 13202 * will request more than 256 sectors worth of data
13199 13203 */
13200 13204 count_max = adj_dma_attr->dma_attr_granular * 0x10000;
13201 13205 } else {
13202 13206 /*
13203 13207 * 8-bit sector count will be used - default limits
13204 13208 * for dma attributes
13205 13209 */
13206 13210 count_max = adj_dma_attr->dma_attr_granular * 0x100;
13207 13211 }
13208 13212 /*
13209 13213 * Adjust controler dma attributes, if necessary
13210 13214 */
13211 13215 if (dma_attr->dma_attr_count_max > count_max)
13212 13216 adj_dma_attr->dma_attr_count_max = count_max;
13213 13217 if (dma_attr->dma_attr_maxxfer > count_max)
13214 13218 adj_dma_attr->dma_attr_maxxfer = count_max;
13215 13219 }
13216 13220 }
13217 13221
13218 13222
13219 13223 /*
13220 13224 * Allocate DMA resources for the buffer
13221 13225 * This function handles initial DMA resource allocation as well as
13222 13226 * DMA window shift and may be called repeatedly for the same DMA window
13223 13227 * until all DMA cookies in the DMA window are processed.
13224 13228 * To guarantee that there is always a coherent set of cookies to process
13225 13229 * by SATA HBA driver (observing alignment, device granularity, etc.),
13226 13230 * the number of slots for DMA cookies is equal to lesser of a number of
13227 13231 * cookies in a DMA window and a max number of scatter/gather entries.
13228 13232 *
13229 13233 * Returns DDI_SUCCESS upon successful operation.
13230 13234 * Return failure code of a failing command or DDI_FAILURE when
13231 13235 * internal cleanup failed.
13232 13236 */
13233 13237 static int
13234 13238 sata_dma_buf_setup(sata_pkt_txlate_t *spx, int flags,
13235 13239 int (*callback)(caddr_t), caddr_t arg,
13236 13240 ddi_dma_attr_t *cur_dma_attr)
13237 13241 {
13238 13242 int rval;
13239 13243 off_t offset;
13240 13244 size_t size;
13241 13245 int max_sg_len, req_len, i;
13242 13246 uint_t dma_flags;
13243 13247 struct buf *bp;
13244 13248 uint64_t cur_txfer_len;
13245 13249
13246 13250
13247 13251 ASSERT(spx->txlt_sata_pkt != NULL);
13248 13252 bp = spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp;
13249 13253 ASSERT(bp != NULL);
13250 13254
13251 13255
13252 13256 if (spx->txlt_buf_dma_handle == NULL) {
13253 13257 /*
13254 13258 * No DMA resources allocated so far - this is a first call
13255 13259 * for this sata pkt.
13256 13260 */
13257 13261 rval = ddi_dma_alloc_handle(SATA_DIP(spx->txlt_sata_hba_inst),
13258 13262 cur_dma_attr, callback, arg, &spx->txlt_buf_dma_handle);
13259 13263
13260 13264 if (rval != DDI_SUCCESS) {
13261 13265 SATA_LOG_D((spx->txlt_sata_hba_inst, CE_WARN,
13262 13266 "sata_dma_buf_setup: no buf DMA resources %x",
13263 13267 rval));
13264 13268 return (rval);
13265 13269 }
13266 13270
13267 13271 if (bp->b_flags & B_READ)
13268 13272 dma_flags = DDI_DMA_READ;
13269 13273 else
13270 13274 dma_flags = DDI_DMA_WRITE;
13271 13275
13272 13276 if (flags & PKT_CONSISTENT)
13273 13277 dma_flags |= DDI_DMA_CONSISTENT;
13274 13278
13275 13279 if (flags & PKT_DMA_PARTIAL)
13276 13280 dma_flags |= DDI_DMA_PARTIAL;
13277 13281
13278 13282 /*
13279 13283 * Check buffer alignment and size against dma attributes
13280 13284 * Consider dma_attr_align only. There may be requests
13281 13285 * with the size lower than device granularity, but they
13282 13286 * will not read/write from/to the device, so no adjustment
13283 13287 * is necessary. The dma_attr_minxfer theoretically should
13284 13288 * be considered, but no HBA driver is checking it.
13285 13289 */
13286 13290 if (IS_P2ALIGNED(bp->b_un.b_addr,
13287 13291 cur_dma_attr->dma_attr_align)) {
13288 13292 rval = ddi_dma_buf_bind_handle(
13289 13293 spx->txlt_buf_dma_handle,
13290 13294 bp, dma_flags, callback, arg,
13291 13295 &spx->txlt_dma_cookie,
13292 13296 &spx->txlt_curwin_num_dma_cookies);
13293 13297 } else { /* Buffer is not aligned */
13294 13298
13295 13299 int (*ddicallback)(caddr_t);
13296 13300 size_t bufsz;
13297 13301
13298 13302 /* Check id sleeping is allowed */
13299 13303 ddicallback = (callback == NULL_FUNC) ?
13300 13304 DDI_DMA_DONTWAIT : DDI_DMA_SLEEP;
13301 13305
13302 13306 SATADBG2(SATA_DBG_DMA_SETUP, spx->txlt_sata_hba_inst,
13303 13307 "mis-aligned buffer: addr=0x%p, cnt=%lu",
13304 13308 (void *)bp->b_un.b_addr, bp->b_bcount);
13305 13309
13306 13310 if (bp->b_flags & (B_PAGEIO|B_PHYS))
13307 13311 /*
13308 13312 * CPU will need to access data in the buffer
13309 13313 * (for copying) so map it.
13310 13314 */
13311 13315 bp_mapin(bp);
13312 13316
13313 13317 ASSERT(spx->txlt_tmp_buf == NULL);
13314 13318
13315 13319 /* Buffer may be padded by ddi_dma_mem_alloc()! */
13316 13320 rval = ddi_dma_mem_alloc(
13317 13321 spx->txlt_buf_dma_handle,
13318 13322 bp->b_bcount,
13319 13323 &sata_acc_attr,
13320 13324 DDI_DMA_STREAMING,
13321 13325 ddicallback, NULL,
13322 13326 &spx->txlt_tmp_buf,
13323 13327 &bufsz,
13324 13328 &spx->txlt_tmp_buf_handle);
13325 13329
13326 13330 if (rval != DDI_SUCCESS) {
13327 13331 /* DMA mapping failed */
13328 13332 (void) ddi_dma_free_handle(
13329 13333 &spx->txlt_buf_dma_handle);
13330 13334 spx->txlt_buf_dma_handle = NULL;
13331 13335 #ifdef SATA_DEBUG
13332 13336 mbuffail_count++;
13333 13337 #endif
13334 13338 SATADBG1(SATA_DBG_DMA_SETUP,
13335 13339 spx->txlt_sata_hba_inst,
13336 13340 "sata_dma_buf_setup: "
13337 13341 "buf dma mem alloc failed %x\n", rval);
13338 13342 return (rval);
13339 13343 }
13340 13344 ASSERT(IS_P2ALIGNED(spx->txlt_tmp_buf,
13341 13345 cur_dma_attr->dma_attr_align));
13342 13346
13343 13347 #ifdef SATA_DEBUG
13344 13348 mbuf_count++;
13345 13349
13346 13350 if (bp->b_bcount != bufsz)
13347 13351 /*
13348 13352 * This will require special handling, because
13349 13353 * DMA cookies will be based on the temporary
13350 13354 * buffer size, not the original buffer
13351 13355 * b_bcount, so the residue may have to
13352 13356 * be counted differently.
13353 13357 */
13354 13358 SATADBG2(SATA_DBG_DMA_SETUP,
13355 13359 spx->txlt_sata_hba_inst,
13356 13360 "sata_dma_buf_setup: bp size %x != "
13357 13361 "bufsz %x\n", bp->b_bcount, bufsz);
13358 13362 #endif
13359 13363 if (dma_flags & DDI_DMA_WRITE) {
13360 13364 /*
13361 13365 * Write operation - copy data into
13362 13366 * an aligned temporary buffer. Buffer will be
13363 13367 * synced for device by ddi_dma_addr_bind_handle
13364 13368 */
13365 13369 bcopy(bp->b_un.b_addr, spx->txlt_tmp_buf,
13366 13370 bp->b_bcount);
13367 13371 }
13368 13372
13369 13373 rval = ddi_dma_addr_bind_handle(
13370 13374 spx->txlt_buf_dma_handle,
13371 13375 NULL,
13372 13376 spx->txlt_tmp_buf,
13373 13377 bufsz, dma_flags, ddicallback, 0,
13374 13378 &spx->txlt_dma_cookie,
13375 13379 &spx->txlt_curwin_num_dma_cookies);
13376 13380 }
13377 13381
13378 13382 switch (rval) {
13379 13383 case DDI_DMA_PARTIAL_MAP:
13380 13384 SATADBG1(SATA_DBG_DMA_SETUP, spx->txlt_sata_hba_inst,
13381 13385 "sata_dma_buf_setup: DMA Partial Map\n", NULL);
13382 13386 /*
13383 13387 * Partial DMA mapping.
13384 13388 * Retrieve number of DMA windows for this request.
13385 13389 */
13386 13390 if (ddi_dma_numwin(spx->txlt_buf_dma_handle,
13387 13391 &spx->txlt_num_dma_win) != DDI_SUCCESS) {
13388 13392 if (spx->txlt_tmp_buf != NULL) {
13389 13393 ddi_dma_mem_free(
13390 13394 &spx->txlt_tmp_buf_handle);
13391 13395 spx->txlt_tmp_buf = NULL;
13392 13396 }
13393 13397 (void) ddi_dma_unbind_handle(
13394 13398 spx->txlt_buf_dma_handle);
13395 13399 (void) ddi_dma_free_handle(
13396 13400 &spx->txlt_buf_dma_handle);
13397 13401 spx->txlt_buf_dma_handle = NULL;
13398 13402 SATA_LOG_D((spx->txlt_sata_hba_inst, CE_WARN,
13399 13403 "sata_dma_buf_setup: numwin failed\n"));
13400 13404 return (DDI_FAILURE);
13401 13405 }
13402 13406 SATADBG2(SATA_DBG_DMA_SETUP,
13403 13407 spx->txlt_sata_hba_inst,
13404 13408 "sata_dma_buf_setup: windows: %d, cookies: %d\n",
13405 13409 spx->txlt_num_dma_win,
13406 13410 spx->txlt_curwin_num_dma_cookies);
13407 13411 spx->txlt_cur_dma_win = 0;
13408 13412 break;
13409 13413
13410 13414 case DDI_DMA_MAPPED:
13411 13415 /* DMA fully mapped */
13412 13416 spx->txlt_num_dma_win = 1;
13413 13417 spx->txlt_cur_dma_win = 0;
13414 13418 SATADBG1(SATA_DBG_DMA_SETUP,
13415 13419 spx->txlt_sata_hba_inst,
13416 13420 "sata_dma_buf_setup: windows: 1 "
13417 13421 "cookies: %d\n", spx->txlt_curwin_num_dma_cookies);
13418 13422 break;
13419 13423
13420 13424 default:
13421 13425 /* DMA mapping failed */
13422 13426 if (spx->txlt_tmp_buf != NULL) {
13423 13427 ddi_dma_mem_free(
13424 13428 &spx->txlt_tmp_buf_handle);
13425 13429 spx->txlt_tmp_buf = NULL;
13426 13430 }
13427 13431 (void) ddi_dma_free_handle(&spx->txlt_buf_dma_handle);
13428 13432 spx->txlt_buf_dma_handle = NULL;
13429 13433 SATA_LOG_D((spx->txlt_sata_hba_inst, CE_WARN,
13430 13434 "sata_dma_buf_setup: buf dma handle binding "
13431 13435 "failed %x\n", rval));
13432 13436 return (rval);
13433 13437 }
13434 13438 spx->txlt_curwin_processed_dma_cookies = 0;
13435 13439 spx->txlt_dma_cookie_list = NULL;
13436 13440 } else {
13437 13441 /*
13438 13442 * DMA setup is reused. Check if we need to process more
13439 13443 * cookies in current window, or to get next window, if any.
13440 13444 */
13441 13445
13442 13446 ASSERT(spx->txlt_curwin_processed_dma_cookies <=
13443 13447 spx->txlt_curwin_num_dma_cookies);
13444 13448
13445 13449 if (spx->txlt_curwin_processed_dma_cookies ==
13446 13450 spx->txlt_curwin_num_dma_cookies) {
13447 13451 /*
13448 13452 * All cookies from current DMA window were processed.
13449 13453 * Get next DMA window.
13450 13454 */
13451 13455 spx->txlt_cur_dma_win++;
13452 13456 if (spx->txlt_cur_dma_win < spx->txlt_num_dma_win) {
13453 13457 (void) ddi_dma_getwin(spx->txlt_buf_dma_handle,
13454 13458 spx->txlt_cur_dma_win, &offset, &size,
13455 13459 &spx->txlt_dma_cookie,
13456 13460 &spx->txlt_curwin_num_dma_cookies);
13457 13461 spx->txlt_curwin_processed_dma_cookies = 0;
13458 13462 } else {
13459 13463 /* No more windows! End of request! */
13460 13464 /* What to do? - panic for now */
13461 13465 ASSERT(spx->txlt_cur_dma_win >=
13462 13466 spx->txlt_num_dma_win);
13463 13467
13464 13468 spx->txlt_curwin_num_dma_cookies = 0;
13465 13469 spx->txlt_curwin_processed_dma_cookies = 0;
13466 13470 spx->txlt_sata_pkt->
13467 13471 satapkt_cmd.satacmd_num_dma_cookies = 0;
13468 13472 return (DDI_SUCCESS);
13469 13473 }
13470 13474 }
13471 13475 }
13472 13476 /* There better be at least one DMA cookie outstanding */
13473 13477 ASSERT((spx->txlt_curwin_num_dma_cookies -
13474 13478 spx->txlt_curwin_processed_dma_cookies) > 0);
13475 13479
13476 13480 if (spx->txlt_dma_cookie_list == &spx->txlt_dma_cookie) {
13477 13481 /* The default cookie slot was used in previous run */
13478 13482 ASSERT(spx->txlt_curwin_processed_dma_cookies == 0);
13479 13483 spx->txlt_dma_cookie_list = NULL;
13480 13484 spx->txlt_dma_cookie_list_len = 0;
13481 13485 }
13482 13486 if (spx->txlt_curwin_processed_dma_cookies == 0) {
13483 13487 /*
13484 13488 * Processing a new DMA window - set-up dma cookies list.
13485 13489 * We may reuse previously allocated cookie array if it is
13486 13490 * possible.
13487 13491 */
13488 13492 if (spx->txlt_dma_cookie_list != NULL &&
13489 13493 spx->txlt_dma_cookie_list_len <
13490 13494 spx->txlt_curwin_num_dma_cookies) {
13491 13495 /*
13492 13496 * New DMA window contains more cookies than
13493 13497 * the previous one. We need larger cookie list - free
13494 13498 * the old one.
13495 13499 */
13496 13500 (void) kmem_free(spx->txlt_dma_cookie_list,
13497 13501 spx->txlt_dma_cookie_list_len *
13498 13502 sizeof (ddi_dma_cookie_t));
13499 13503 spx->txlt_dma_cookie_list = NULL;
13500 13504 spx->txlt_dma_cookie_list_len = 0;
13501 13505 }
13502 13506 if (spx->txlt_dma_cookie_list == NULL) {
13503 13507 /*
13504 13508 * Calculate lesser of number of cookies in this
13505 13509 * DMA window and number of s/g entries.
13506 13510 */
13507 13511 max_sg_len = cur_dma_attr->dma_attr_sgllen;
13508 13512 req_len = MIN(max_sg_len,
13509 13513 spx->txlt_curwin_num_dma_cookies);
13510 13514
13511 13515 /* Allocate new dma cookie array if necessary */
13512 13516 if (req_len == 1) {
13513 13517 /* Only one cookie - no need for a list */
13514 13518 spx->txlt_dma_cookie_list =
13515 13519 &spx->txlt_dma_cookie;
13516 13520 spx->txlt_dma_cookie_list_len = 1;
13517 13521 } else {
13518 13522 /*
13519 13523 * More than one cookie - try to allocate space.
13520 13524 */
13521 13525 spx->txlt_dma_cookie_list = kmem_zalloc(
13522 13526 sizeof (ddi_dma_cookie_t) * req_len,
13523 13527 callback == NULL_FUNC ? KM_NOSLEEP :
13524 13528 KM_SLEEP);
13525 13529 if (spx->txlt_dma_cookie_list == NULL) {
13526 13530 SATADBG1(SATA_DBG_DMA_SETUP,
13527 13531 spx->txlt_sata_hba_inst,
13528 13532 "sata_dma_buf_setup: cookie list "
13529 13533 "allocation failed\n", NULL);
13530 13534 /*
13531 13535 * We could not allocate space for
13532 13536 * neccessary number of dma cookies in
13533 13537 * this window, so we fail this request.
13534 13538 * Next invocation would try again to
13535 13539 * allocate space for cookie list.
13536 13540 * Note:Packet residue was not modified.
13537 13541 */
13538 13542 return (DDI_DMA_NORESOURCES);
13539 13543 } else {
13540 13544 spx->txlt_dma_cookie_list_len = req_len;
13541 13545 }
13542 13546 }
13543 13547 }
13544 13548 /*
13545 13549 * Fetch DMA cookies into cookie list in sata_pkt_txlate.
13546 13550 * First cookie was already fetched.
13547 13551 */
13548 13552 *(&spx->txlt_dma_cookie_list[0]) = spx->txlt_dma_cookie;
13549 13553 cur_txfer_len =
13550 13554 (uint64_t)spx->txlt_dma_cookie_list[0].dmac_size;
13551 13555 spx->txlt_sata_pkt->satapkt_cmd.satacmd_num_dma_cookies = 1;
13552 13556 spx->txlt_curwin_processed_dma_cookies++;
13553 13557 for (i = 1; (i < spx->txlt_dma_cookie_list_len) &&
13554 13558 (i < spx->txlt_curwin_num_dma_cookies); i++) {
13555 13559 ddi_dma_nextcookie(spx->txlt_buf_dma_handle,
13556 13560 &spx->txlt_dma_cookie_list[i]);
13557 13561 cur_txfer_len +=
13558 13562 (uint64_t)spx->txlt_dma_cookie_list[i].dmac_size;
13559 13563 spx->txlt_curwin_processed_dma_cookies++;
13560 13564 spx->txlt_sata_pkt->
13561 13565 satapkt_cmd.satacmd_num_dma_cookies += 1;
13562 13566 }
13563 13567 } else {
13564 13568 SATADBG2(SATA_DBG_DMA_SETUP, spx->txlt_sata_hba_inst,
13565 13569 "sata_dma_buf_setup: sliding within DMA window, "
13566 13570 "cur cookie %d, total cookies %d\n",
13567 13571 spx->txlt_curwin_processed_dma_cookies,
13568 13572 spx->txlt_curwin_num_dma_cookies);
13569 13573
13570 13574 /*
13571 13575 * Not all cookies from the current dma window were used because
13572 13576 * of s/g limitation.
13573 13577 * There is no need to re-size the list - it was set at
13574 13578 * optimal size, or only default entry is used (s/g = 1).
13575 13579 */
13576 13580 if (spx->txlt_dma_cookie_list == NULL) {
13577 13581 spx->txlt_dma_cookie_list = &spx->txlt_dma_cookie;
13578 13582 spx->txlt_dma_cookie_list_len = 1;
13579 13583 }
13580 13584 /*
13581 13585 * Since we are processing remaining cookies in a DMA window,
13582 13586 * there may be less of them than the number of entries in the
13583 13587 * current dma cookie list.
13584 13588 */
13585 13589 req_len = MIN(spx->txlt_dma_cookie_list_len,
13586 13590 (spx->txlt_curwin_num_dma_cookies -
13587 13591 spx->txlt_curwin_processed_dma_cookies));
13588 13592
13589 13593 /* Fetch the next batch of cookies */
13590 13594 for (i = 0, cur_txfer_len = 0; i < req_len; i++) {
13591 13595 ddi_dma_nextcookie(spx->txlt_buf_dma_handle,
13592 13596 &spx->txlt_dma_cookie_list[i]);
13593 13597 cur_txfer_len +=
13594 13598 (uint64_t)spx->txlt_dma_cookie_list[i].dmac_size;
13595 13599 spx->txlt_sata_pkt->
13596 13600 satapkt_cmd.satacmd_num_dma_cookies++;
13597 13601 spx->txlt_curwin_processed_dma_cookies++;
13598 13602 }
13599 13603 }
13600 13604
13601 13605 ASSERT(spx->txlt_sata_pkt->satapkt_cmd.satacmd_num_dma_cookies > 0);
13602 13606
13603 13607 /* Point sata_cmd to the cookie list */
13604 13608 spx->txlt_sata_pkt->satapkt_cmd.satacmd_dma_cookie_list =
13605 13609 &spx->txlt_dma_cookie_list[0];
13606 13610
13607 13611 /* Remember number of DMA cookies passed in sata packet */
13608 13612 spx->txlt_num_dma_cookies =
13609 13613 spx->txlt_sata_pkt->satapkt_cmd.satacmd_num_dma_cookies;
13610 13614
13611 13615 ASSERT(cur_txfer_len != 0);
13612 13616 if (cur_txfer_len <= bp->b_bcount)
13613 13617 spx->txlt_total_residue -= cur_txfer_len;
13614 13618 else {
13615 13619 /*
13616 13620 * Temporary DMA buffer has been padded by
13617 13621 * ddi_dma_mem_alloc()!
13618 13622 * This requires special handling, because DMA cookies are
13619 13623 * based on the temporary buffer size, not the b_bcount,
13620 13624 * and we have extra bytes to transfer - but the packet
13621 13625 * residue has to stay correct because we will copy only
13622 13626 * the requested number of bytes.
13623 13627 */
13624 13628 spx->txlt_total_residue -= bp->b_bcount;
13625 13629 }
13626 13630
13627 13631 return (DDI_SUCCESS);
13628 13632 }
13629 13633
13630 13634 /*
13631 13635 * Common routine for releasing DMA resources
13632 13636 */
13633 13637 static void
13634 13638 sata_common_free_dma_rsrcs(sata_pkt_txlate_t *spx)
13635 13639 {
13636 13640 if (spx->txlt_buf_dma_handle != NULL) {
13637 13641 if (spx->txlt_tmp_buf != NULL) {
13638 13642 /*
13639 13643 * Intermediate DMA buffer was allocated.
13640 13644 * Free allocated buffer and associated access handle.
13641 13645 */
13642 13646 ddi_dma_mem_free(&spx->txlt_tmp_buf_handle);
13643 13647 spx->txlt_tmp_buf = NULL;
13644 13648 }
13645 13649 /*
13646 13650 * Free DMA resources - cookies and handles
13647 13651 */
13648 13652 /* ASSERT(spx->txlt_dma_cookie_list != NULL); */
13649 13653 if (spx->txlt_dma_cookie_list != NULL) {
13650 13654 if (spx->txlt_dma_cookie_list !=
13651 13655 &spx->txlt_dma_cookie) {
13652 13656 (void) kmem_free(spx->txlt_dma_cookie_list,
13653 13657 spx->txlt_dma_cookie_list_len *
13654 13658 sizeof (ddi_dma_cookie_t));
13655 13659 spx->txlt_dma_cookie_list = NULL;
13656 13660 }
13657 13661 }
13658 13662 (void) ddi_dma_unbind_handle(spx->txlt_buf_dma_handle);
13659 13663 (void) ddi_dma_free_handle(&spx->txlt_buf_dma_handle);
13660 13664 spx->txlt_buf_dma_handle = NULL;
13661 13665 }
13662 13666 }
13663 13667
13664 13668 /*
13665 13669 * Free DMA resources
13666 13670 * Used by the HBA driver to release DMA resources that it does not use.
13667 13671 *
13668 13672 * Returns Void
13669 13673 */
13670 13674 void
13671 13675 sata_free_dma_resources(sata_pkt_t *sata_pkt)
13672 13676 {
13673 13677 sata_pkt_txlate_t *spx;
13674 13678
13675 13679 if (sata_pkt == NULL)
13676 13680 return;
13677 13681
13678 13682 spx = (sata_pkt_txlate_t *)sata_pkt->satapkt_framework_private;
13679 13683
13680 13684 sata_common_free_dma_rsrcs(spx);
13681 13685 }
13682 13686
13683 13687 /*
13684 13688 * Fetch Device Identify data.
13685 13689 * Send DEVICE IDENTIFY or IDENTIFY PACKET DEVICE (depending on a device type)
13686 13690 * command to a device and get the device identify data.
13687 13691 * The device_info structure has to be set to device type (for selecting proper
13688 13692 * device identify command).
13689 13693 *
13690 13694 * Returns:
13691 13695 * SATA_SUCCESS if cmd succeeded
13692 13696 * SATA_RETRY if cmd was rejected and could be retried,
13693 13697 * SATA_FAILURE if cmd failed and should not be retried (port error)
13694 13698 *
13695 13699 * Cannot be called in an interrupt context.
13696 13700 */
13697 13701
13698 13702 static int
13699 13703 sata_fetch_device_identify_data(sata_hba_inst_t *sata_hba_inst,
13700 13704 sata_drive_info_t *sdinfo)
13701 13705 {
13702 13706 struct buf *bp;
13703 13707 sata_pkt_t *spkt;
13704 13708 sata_cmd_t *scmd;
13705 13709 sata_pkt_txlate_t *spx;
13706 13710 int rval;
13707 13711 dev_info_t *dip = SATA_DIP(sata_hba_inst);
13708 13712
13709 13713 spx = kmem_zalloc(sizeof (sata_pkt_txlate_t), KM_SLEEP);
13710 13714 spx->txlt_sata_hba_inst = sata_hba_inst;
13711 13715 spx->txlt_scsi_pkt = NULL; /* No scsi pkt involved */
13712 13716 spkt = sata_pkt_alloc(spx, SLEEP_FUNC);
13713 13717 if (spkt == NULL) {
13714 13718 kmem_free(spx, sizeof (sata_pkt_txlate_t));
13715 13719 return (SATA_RETRY); /* may retry later */
13716 13720 }
13717 13721 /* address is needed now */
13718 13722 spkt->satapkt_device.satadev_addr = sdinfo->satadrv_addr;
13719 13723
13720 13724 /*
13721 13725 * Allocate buffer for Identify Data return data
13722 13726 */
13723 13727 bp = sata_alloc_local_buffer(spx, sizeof (sata_id_t));
13724 13728 if (bp == NULL) {
13725 13729 sata_pkt_free(spx);
13726 13730 kmem_free(spx, sizeof (sata_pkt_txlate_t));
13727 13731 SATA_LOG_D((sata_hba_inst, CE_WARN,
13728 13732 "sata_fetch_device_identify_data: "
13729 13733 "cannot allocate buffer for ID"));
13730 13734 return (SATA_RETRY); /* may retry later */
13731 13735 }
13732 13736
13733 13737 /* Fill sata_pkt */
13734 13738 sdinfo->satadrv_state = SATA_STATE_PROBING;
13735 13739 spkt->satapkt_device.satadev_addr = sdinfo->satadrv_addr;
13736 13740 spkt->satapkt_op_mode = SATA_OPMODE_SYNCH | SATA_OPMODE_INTERRUPTS;
13737 13741 /* Synchronous mode, no callback */
13738 13742 spkt->satapkt_comp = NULL;
13739 13743 /* Timeout 30s */
13740 13744 spkt->satapkt_time = sata_default_pkt_time;
13741 13745
13742 13746 scmd = &spkt->satapkt_cmd;
13743 13747 scmd->satacmd_bp = bp;
13744 13748 scmd->satacmd_flags.sata_data_direction = SATA_DIR_READ;
13745 13749 scmd->satacmd_flags.sata_ignore_dev_reset = B_TRUE;
13746 13750
13747 13751 /* Build Identify Device cmd in the sata_pkt */
13748 13752 scmd->satacmd_addr_type = 0; /* N/A */
13749 13753 scmd->satacmd_sec_count_lsb = 0; /* N/A */
13750 13754 scmd->satacmd_lba_low_lsb = 0; /* N/A */
13751 13755 scmd->satacmd_lba_mid_lsb = 0; /* N/A */
13752 13756 scmd->satacmd_lba_high_lsb = 0; /* N/A */
13753 13757 scmd->satacmd_features_reg = 0; /* N/A */
13754 13758 scmd->satacmd_device_reg = 0; /* Always device 0 */
13755 13759 if (sdinfo->satadrv_type & SATA_DTYPE_ATAPI) {
13756 13760 /* Identify Packet Device cmd */
13757 13761 scmd->satacmd_cmd_reg = SATAC_ID_PACKET_DEVICE;
13758 13762 } else {
13759 13763 /* Identify Device cmd - mandatory for all other devices */
13760 13764 scmd->satacmd_cmd_reg = SATAC_ID_DEVICE;
13761 13765 }
13762 13766
13763 13767 /* Send pkt to SATA HBA driver */
13764 13768 rval = (*SATA_START_FUNC(sata_hba_inst))(SATA_DIP(sata_hba_inst), spkt);
13765 13769
13766 13770 #ifdef SATA_INJECT_FAULTS
13767 13771 sata_inject_pkt_fault(spkt, &rval, sata_fault_type);
13768 13772 #endif
13769 13773
13770 13774 if (rval == SATA_TRAN_ACCEPTED &&
13771 13775 spkt->satapkt_reason == SATA_PKT_COMPLETED) {
13772 13776 if (spx->txlt_buf_dma_handle != NULL) {
13773 13777 rval = ddi_dma_sync(spx->txlt_buf_dma_handle, 0, 0,
13774 13778 DDI_DMA_SYNC_FORKERNEL);
13775 13779 ASSERT(rval == DDI_SUCCESS);
13776 13780 if (sata_check_for_dma_error(dip, spx)) {
13777 13781 ddi_fm_service_impact(dip,
13778 13782 DDI_SERVICE_UNAFFECTED);
13779 13783 rval = SATA_RETRY;
13780 13784 goto fail;
13781 13785 }
13782 13786
13783 13787 }
13784 13788 if ((((sata_id_t *)(bp->b_un.b_addr))->ai_config &
13785 13789 SATA_INCOMPLETE_DATA) == SATA_INCOMPLETE_DATA) {
13786 13790 SATA_LOG_D((sata_hba_inst, CE_WARN,
13787 13791 "SATA disk device at port %d - "
13788 13792 "partial Identify Data",
13789 13793 sdinfo->satadrv_addr.cport));
13790 13794 rval = SATA_RETRY; /* may retry later */
13791 13795 goto fail;
13792 13796 }
13793 13797 /* Update sata_drive_info */
13794 13798 bcopy(bp->b_un.b_addr, &sdinfo->satadrv_id,
13795 13799 sizeof (sata_id_t));
13796 13800
13797 13801 sdinfo->satadrv_features_support = 0;
13798 13802 if (sdinfo->satadrv_type == SATA_DTYPE_ATADISK) {
13799 13803 /*
13800 13804 * Retrieve capacity (disks only) and addressing mode
13801 13805 */
13802 13806 sdinfo->satadrv_capacity = sata_check_capacity(sdinfo);
13803 13807 } else {
13804 13808 /*
13805 13809 * For ATAPI devices one would have to issue
13806 13810 * Get Capacity cmd for media capacity. Not here.
13807 13811 */
13808 13812 sdinfo->satadrv_capacity = 0;
13809 13813 /*
13810 13814 * Check what cdb length is supported
13811 13815 */
13812 13816 if ((sdinfo->satadrv_id.ai_config &
13813 13817 SATA_ATAPI_ID_PKT_SZ) == SATA_ATAPI_ID_PKT_16B)
13814 13818 sdinfo->satadrv_atapi_cdb_len = 16;
13815 13819 else
13816 13820 sdinfo->satadrv_atapi_cdb_len = 12;
13817 13821 }
13818 13822 /* Setup supported features flags */
13819 13823 if (sdinfo->satadrv_id.ai_cap & SATA_DMA_SUPPORT)
13820 13824 sdinfo->satadrv_features_support |= SATA_DEV_F_DMA;
13821 13825
13822 13826 /* Check for SATA GEN and NCQ support */
13823 13827 if (sdinfo->satadrv_id.ai_satacap != 0 &&
13824 13828 sdinfo->satadrv_id.ai_satacap != 0xffff) {
13825 13829 /* SATA compliance */
13826 13830 if (sdinfo->satadrv_id.ai_satacap & SATA_NCQ)
13827 13831 sdinfo->satadrv_features_support |=
13828 13832 SATA_DEV_F_NCQ;
13829 13833 if (sdinfo->satadrv_id.ai_satacap &
13830 13834 (SATA_1_SPEED | SATA_2_SPEED | SATA_3_SPEED)) {
13831 13835 if (sdinfo->satadrv_id.ai_satacap &
13832 13836 SATA_3_SPEED)
13833 13837 sdinfo->satadrv_features_support |=
13834 13838 SATA_DEV_F_SATA3;
13835 13839 if (sdinfo->satadrv_id.ai_satacap &
13836 13840 SATA_2_SPEED)
13837 13841 sdinfo->satadrv_features_support |=
13838 13842 SATA_DEV_F_SATA2;
13839 13843 if (sdinfo->satadrv_id.ai_satacap &
13840 13844 SATA_1_SPEED)
13841 13845 sdinfo->satadrv_features_support |=
13842 13846 SATA_DEV_F_SATA1;
13843 13847 } else {
13844 13848 sdinfo->satadrv_features_support |=
13845 13849 SATA_DEV_F_SATA1;
13846 13850 }
13847 13851 }
13848 13852 if ((sdinfo->satadrv_id.ai_cmdset83 & SATA_RW_DMA_QUEUED_CMD) &&
13849 13853 (sdinfo->satadrv_id.ai_features86 & SATA_RW_DMA_QUEUED_CMD))
13850 13854 sdinfo->satadrv_features_support |= SATA_DEV_F_TCQ;
13851 13855
13852 13856 sdinfo->satadrv_queue_depth = sdinfo->satadrv_id.ai_qdepth;
13853 13857 if ((sdinfo->satadrv_features_support & SATA_DEV_F_NCQ) ||
13854 13858 (sdinfo->satadrv_features_support & SATA_DEV_F_TCQ)) {
13855 13859 ++sdinfo->satadrv_queue_depth;
13856 13860 /* Adjust according to controller capabilities */
13857 13861 sdinfo->satadrv_max_queue_depth = MIN(
13858 13862 sdinfo->satadrv_queue_depth,
13859 13863 SATA_QDEPTH(sata_hba_inst));
13860 13864 /* Adjust according to global queue depth limit */
13861 13865 sdinfo->satadrv_max_queue_depth = MIN(
13862 13866 sdinfo->satadrv_max_queue_depth,
13863 13867 sata_current_max_qdepth);
13864 13868 if (sdinfo->satadrv_max_queue_depth == 0)
13865 13869 sdinfo->satadrv_max_queue_depth = 1;
13866 13870 } else
13867 13871 sdinfo->satadrv_max_queue_depth = 1;
13868 13872
13869 13873 rval = SATA_SUCCESS;
13870 13874 } else {
13871 13875 /*
13872 13876 * Woops, no Identify Data.
13873 13877 */
13874 13878 if (rval == SATA_TRAN_BUSY || rval == SATA_TRAN_QUEUE_FULL) {
13875 13879 rval = SATA_RETRY; /* may retry later */
13876 13880 } else if (rval == SATA_TRAN_ACCEPTED) {
13877 13881 if (spkt->satapkt_reason == SATA_PKT_DEV_ERROR ||
13878 13882 spkt->satapkt_reason == SATA_PKT_ABORTED ||
13879 13883 spkt->satapkt_reason == SATA_PKT_TIMEOUT ||
13880 13884 spkt->satapkt_reason == SATA_PKT_RESET)
13881 13885 rval = SATA_RETRY; /* may retry later */
13882 13886 else
13883 13887 rval = SATA_FAILURE;
13884 13888 } else {
13885 13889 rval = SATA_FAILURE;
13886 13890 }
13887 13891 }
13888 13892 fail:
13889 13893 /* Free allocated resources */
13890 13894 sata_free_local_buffer(spx);
13891 13895 sata_pkt_free(spx);
13892 13896 kmem_free(spx, sizeof (sata_pkt_txlate_t));
13893 13897
13894 13898 return (rval);
13895 13899 }
13896 13900
13897 13901
13898 13902 /*
13899 13903 * Some devices may not come-up with default DMA mode (UDMA or MWDMA).
13900 13904 * UDMA mode is checked first, followed by MWDMA mode.
13901 13905 * set correctly, so this function is setting it to the highest supported level.
13902 13906 * Older SATA spec required that the device supports at least DMA 4 mode and
13903 13907 * UDMA mode is selected. It is not mentioned in SerialATA 2.6, so this
13904 13908 * restriction has been removed.
13905 13909 *
13906 13910 * Returns SATA_SUCCESS if proper DMA mode is selected or no DMA is supported.
13907 13911 * Returns SATA_FAILURE if proper DMA mode could not be selected.
13908 13912 *
13909 13913 * NOTE: This function should be called only if DMA mode is supported.
13910 13914 */
13911 13915 static int
13912 13916 sata_set_dma_mode(sata_hba_inst_t *sata_hba_inst, sata_drive_info_t *sdinfo)
13913 13917 {
13914 13918 sata_pkt_t *spkt;
13915 13919 sata_cmd_t *scmd;
13916 13920 sata_pkt_txlate_t *spx;
13917 13921 int i, mode;
13918 13922 uint8_t subcmd;
13919 13923 int rval = SATA_SUCCESS;
13920 13924
13921 13925 ASSERT(sdinfo != NULL);
13922 13926 ASSERT(sata_hba_inst != NULL);
13923 13927
13924 13928 if ((sdinfo->satadrv_id.ai_validinfo & SATA_VALIDINFO_88) != 0 &&
13925 13929 (sdinfo->satadrv_id.ai_ultradma & SATA_UDMA_SUP_MASK) != 0) {
13926 13930 /* Find highest Ultra DMA mode supported */
13927 13931 for (mode = 6; mode >= 0; --mode) {
13928 13932 if (sdinfo->satadrv_id.ai_ultradma & (1 << mode))
13929 13933 break;
13930 13934 }
13931 13935 #if 0
13932 13936 /* Left for historical reasons */
13933 13937 /*
13934 13938 * Some initial version of SATA spec indicated that at least
13935 13939 * UDMA mode 4 has to be supported. It is not mentioned in
13936 13940 * SerialATA 2.6, so this restriction is removed.
13937 13941 */
13938 13942 if (mode < 4)
13939 13943 return (SATA_FAILURE);
13940 13944 #endif
13941 13945
13942 13946 /*
13943 13947 * For disk, we're still going to set DMA mode whatever is
13944 13948 * selected by default
13945 13949 *
13946 13950 * We saw an old maxtor sata drive will select Ultra DMA and
13947 13951 * Multi-Word DMA simultaneouly by default, which is going
13948 13952 * to cause DMA command timed out, so we need to select DMA
13949 13953 * mode even when it's already done by default
13950 13954 */
13951 13955 if (sdinfo->satadrv_type != SATA_DTYPE_ATADISK) {
13952 13956
13953 13957 /* Find UDMA mode currently selected */
13954 13958 for (i = 6; i >= 0; --i) {
13955 13959 if (sdinfo->satadrv_id.ai_ultradma &
13956 13960 (1 << (i + 8)))
13957 13961 break;
13958 13962 }
13959 13963 if (i >= mode)
13960 13964 /* Nothing to do */
13961 13965 return (SATA_SUCCESS);
13962 13966 }
13963 13967
13964 13968 subcmd = SATAC_TRANSFER_MODE_ULTRA_DMA;
13965 13969
13966 13970 } else if ((sdinfo->satadrv_id.ai_dworddma & SATA_MDMA_SUP_MASK) != 0) {
13967 13971 /* Find highest MultiWord DMA mode supported */
13968 13972 for (mode = 2; mode >= 0; --mode) {
13969 13973 if (sdinfo->satadrv_id.ai_dworddma & (1 << mode))
13970 13974 break;
13971 13975 }
13972 13976
13973 13977 /*
13974 13978 * For disk, We're still going to set DMA mode whatever is
13975 13979 * selected by default
13976 13980 *
13977 13981 * We saw an old maxtor sata drive will select Ultra DMA and
13978 13982 * Multi-Word DMA simultaneouly by default, which is going
13979 13983 * to cause DMA command timed out, so we need to select DMA
13980 13984 * mode even when it's already done by default
13981 13985 */
13982 13986 if (sdinfo->satadrv_type != SATA_DTYPE_ATADISK) {
13983 13987
13984 13988 /* Find highest MultiWord DMA mode selected */
13985 13989 for (i = 2; i >= 0; --i) {
13986 13990 if (sdinfo->satadrv_id.ai_dworddma &
13987 13991 (1 << (i + 8)))
13988 13992 break;
13989 13993 }
13990 13994 if (i >= mode)
13991 13995 /* Nothing to do */
13992 13996 return (SATA_SUCCESS);
13993 13997 }
13994 13998
13995 13999 subcmd = SATAC_TRANSFER_MODE_MULTI_WORD_DMA;
13996 14000 } else
13997 14001 return (SATA_SUCCESS);
13998 14002
13999 14003 /*
14000 14004 * Set DMA mode via SET FEATURES COMMAND.
14001 14005 * Prepare packet for SET FEATURES COMMAND.
14002 14006 */
14003 14007 spx = kmem_zalloc(sizeof (sata_pkt_txlate_t), KM_SLEEP);
14004 14008 spx->txlt_sata_hba_inst = sata_hba_inst;
14005 14009 spx->txlt_scsi_pkt = NULL; /* No scsi pkt involved */
14006 14010 spkt = sata_pkt_alloc(spx, SLEEP_FUNC);
14007 14011 if (spkt == NULL) {
14008 14012 SATA_LOG_D((sata_hba_inst, CE_WARN,
14009 14013 "sata_set_dma_mode: could not set DMA mode %d", mode));
14010 14014 rval = SATA_FAILURE;
14011 14015 goto done;
14012 14016 }
14013 14017 /* Fill sata_pkt */
14014 14018 spkt->satapkt_device.satadev_addr = sdinfo->satadrv_addr;
14015 14019 /* Timeout 30s */
14016 14020 spkt->satapkt_time = sata_default_pkt_time;
14017 14021 /* Synchronous mode, no callback, interrupts */
14018 14022 spkt->satapkt_op_mode = SATA_OPMODE_SYNCH | SATA_OPMODE_INTERRUPTS;
14019 14023 spkt->satapkt_comp = NULL;
14020 14024 scmd = &spkt->satapkt_cmd;
14021 14025 scmd->satacmd_flags.sata_data_direction = SATA_DIR_NODATA_XFER;
14022 14026 scmd->satacmd_flags.sata_ignore_dev_reset = B_TRUE;
14023 14027 scmd->satacmd_addr_type = 0;
14024 14028 scmd->satacmd_device_reg = 0;
14025 14029 scmd->satacmd_status_reg = 0;
14026 14030 scmd->satacmd_error_reg = 0;
14027 14031 scmd->satacmd_cmd_reg = SATAC_SET_FEATURES;
14028 14032 scmd->satacmd_features_reg = SATAC_SF_TRANSFER_MODE;
14029 14033 scmd->satacmd_sec_count_lsb = subcmd | mode;
14030 14034
14031 14035 /* Transfer command to HBA */
14032 14036 if ((*SATA_START_FUNC(sata_hba_inst))(SATA_DIP(sata_hba_inst),
14033 14037 spkt) != SATA_TRAN_ACCEPTED ||
14034 14038 spkt->satapkt_reason != SATA_PKT_COMPLETED) {
14035 14039 /* Pkt execution failed */
14036 14040 rval = SATA_FAILURE;
14037 14041 }
14038 14042 done:
14039 14043
14040 14044 /* Free allocated resources */
14041 14045 if (spkt != NULL)
14042 14046 sata_pkt_free(spx);
14043 14047 (void) kmem_free(spx, sizeof (sata_pkt_txlate_t));
14044 14048
14045 14049 return (rval);
14046 14050 }
14047 14051
14048 14052
14049 14053 /*
14050 14054 * Set device caching mode.
14051 14055 * One of the following operations should be specified:
14052 14056 * SATAC_SF_ENABLE_READ_AHEAD
14053 14057 * SATAC_SF_DISABLE_READ_AHEAD
14054 14058 * SATAC_SF_ENABLE_WRITE_CACHE
14055 14059 * SATAC_SF_DISABLE_WRITE_CACHE
14056 14060 *
14057 14061 * If operation fails, system log messgage is emitted.
14058 14062 * Returns SATA_SUCCESS when the operation succeeds, SATA_RETRY if
14059 14063 * command was sent but did not succeed, and SATA_FAILURE otherwise.
14060 14064 */
14061 14065
14062 14066 static int
14063 14067 sata_set_cache_mode(sata_hba_inst_t *sata_hba_inst, sata_drive_info_t *sdinfo,
14064 14068 int cache_op)
14065 14069 {
14066 14070 sata_pkt_t *spkt;
14067 14071 sata_cmd_t *scmd;
14068 14072 sata_pkt_txlate_t *spx;
14069 14073 int rval = SATA_SUCCESS;
14070 14074 int hba_rval;
14071 14075 char *infop;
14072 14076
14073 14077 ASSERT(sdinfo != NULL);
14074 14078 ASSERT(sata_hba_inst != NULL);
14075 14079 ASSERT(cache_op == SATAC_SF_ENABLE_READ_AHEAD ||
14076 14080 cache_op == SATAC_SF_DISABLE_READ_AHEAD ||
14077 14081 cache_op == SATAC_SF_ENABLE_WRITE_CACHE ||
14078 14082 cache_op == SATAC_SF_DISABLE_WRITE_CACHE);
14079 14083
14080 14084
14081 14085 /* Prepare packet for SET FEATURES COMMAND */
14082 14086 spx = kmem_zalloc(sizeof (sata_pkt_txlate_t), KM_SLEEP);
14083 14087 spx->txlt_sata_hba_inst = sata_hba_inst;
14084 14088 spx->txlt_scsi_pkt = NULL; /* No scsi pkt involved */
14085 14089 spkt = sata_pkt_alloc(spx, SLEEP_FUNC);
14086 14090 if (spkt == NULL) {
14087 14091 rval = SATA_FAILURE;
14088 14092 goto failure;
14089 14093 }
14090 14094 /* Fill sata_pkt */
14091 14095 spkt->satapkt_device.satadev_addr = sdinfo->satadrv_addr;
14092 14096 /* Timeout 30s */
14093 14097 spkt->satapkt_time = sata_default_pkt_time;
14094 14098 /* Synchronous mode, no callback, interrupts */
14095 14099 spkt->satapkt_op_mode =
14096 14100 SATA_OPMODE_SYNCH | SATA_OPMODE_INTERRUPTS;
14097 14101 spkt->satapkt_comp = NULL;
14098 14102 scmd = &spkt->satapkt_cmd;
14099 14103 scmd->satacmd_flags.sata_data_direction = SATA_DIR_NODATA_XFER;
14100 14104 scmd->satacmd_flags.sata_ignore_dev_reset = B_TRUE;
14101 14105 scmd->satacmd_addr_type = 0;
14102 14106 scmd->satacmd_device_reg = 0;
14103 14107 scmd->satacmd_status_reg = 0;
14104 14108 scmd->satacmd_error_reg = 0;
14105 14109 scmd->satacmd_cmd_reg = SATAC_SET_FEATURES;
14106 14110 scmd->satacmd_features_reg = cache_op;
14107 14111
14108 14112 /* Transfer command to HBA */
14109 14113 hba_rval = (*SATA_START_FUNC(sata_hba_inst))(
14110 14114 SATA_DIP(sata_hba_inst), spkt);
14111 14115
14112 14116 #ifdef SATA_INJECT_FAULTS
14113 14117 sata_inject_pkt_fault(spkt, &rval, sata_fault_type);
14114 14118 #endif
14115 14119
14116 14120 if ((hba_rval != SATA_TRAN_ACCEPTED) ||
14117 14121 (spkt->satapkt_reason != SATA_PKT_COMPLETED)) {
14118 14122 /* Pkt execution failed */
14119 14123 switch (cache_op) {
14120 14124 case SATAC_SF_ENABLE_READ_AHEAD:
14121 14125 infop = "enabling read ahead failed";
14122 14126 break;
14123 14127 case SATAC_SF_DISABLE_READ_AHEAD:
14124 14128 infop = "disabling read ahead failed";
14125 14129 break;
14126 14130 case SATAC_SF_ENABLE_WRITE_CACHE:
14127 14131 infop = "enabling write cache failed";
14128 14132 break;
14129 14133 case SATAC_SF_DISABLE_WRITE_CACHE:
14130 14134 infop = "disabling write cache failed";
14131 14135 break;
14132 14136 }
14133 14137 SATA_LOG_D((sata_hba_inst, CE_WARN, "%s", infop));
14134 14138 rval = SATA_RETRY;
14135 14139 }
14136 14140 failure:
14137 14141 /* Free allocated resources */
14138 14142 if (spkt != NULL)
14139 14143 sata_pkt_free(spx);
14140 14144 (void) kmem_free(spx, sizeof (sata_pkt_txlate_t));
14141 14145 return (rval);
14142 14146 }
14143 14147
14144 14148 /*
14145 14149 * Set Removable Media Status Notification (enable/disable)
14146 14150 * state == 0 , disable
14147 14151 * state != 0 , enable
14148 14152 *
14149 14153 * If operation fails, system log messgage is emitted.
14150 14154 * Returns SATA_SUCCESS when the operation succeeds, SATA_FAILURE otherwise.
14151 14155 */
14152 14156
14153 14157 static int
14154 14158 sata_set_rmsn(sata_hba_inst_t *sata_hba_inst, sata_drive_info_t *sdinfo,
14155 14159 int state)
14156 14160 {
14157 14161 sata_pkt_t *spkt;
14158 14162 sata_cmd_t *scmd;
14159 14163 sata_pkt_txlate_t *spx;
14160 14164 int rval = SATA_SUCCESS;
14161 14165 char *infop;
14162 14166
14163 14167 ASSERT(sdinfo != NULL);
14164 14168 ASSERT(sata_hba_inst != NULL);
14165 14169
14166 14170 /* Prepare packet for SET FEATURES COMMAND */
14167 14171 spx = kmem_zalloc(sizeof (sata_pkt_txlate_t), KM_SLEEP);
14168 14172 spx->txlt_sata_hba_inst = sata_hba_inst;
14169 14173 spx->txlt_scsi_pkt = NULL; /* No scsi pkt involved */
14170 14174 spkt = sata_pkt_alloc(spx, SLEEP_FUNC);
14171 14175 if (spkt == NULL) {
14172 14176 rval = SATA_FAILURE;
14173 14177 goto failure;
14174 14178 }
14175 14179 /* Fill sata_pkt */
14176 14180 spkt->satapkt_device.satadev_addr = sdinfo->satadrv_addr;
14177 14181 /* Timeout 30s */
14178 14182 spkt->satapkt_time = sata_default_pkt_time;
14179 14183 /* Synchronous mode, no callback, interrupts */
14180 14184 spkt->satapkt_op_mode =
14181 14185 SATA_OPMODE_SYNCH | SATA_OPMODE_INTERRUPTS;
14182 14186 spkt->satapkt_comp = NULL;
14183 14187 scmd = &spkt->satapkt_cmd;
14184 14188 scmd->satacmd_flags.sata_data_direction = SATA_DIR_NODATA_XFER;
14185 14189 scmd->satacmd_flags.sata_ignore_dev_reset = B_TRUE;
14186 14190 scmd->satacmd_addr_type = 0;
14187 14191 scmd->satacmd_device_reg = 0;
14188 14192 scmd->satacmd_status_reg = 0;
14189 14193 scmd->satacmd_error_reg = 0;
14190 14194 scmd->satacmd_cmd_reg = SATAC_SET_FEATURES;
14191 14195 if (state == 0)
14192 14196 scmd->satacmd_features_reg = SATAC_SF_DISABLE_RMSN;
14193 14197 else
14194 14198 scmd->satacmd_features_reg = SATAC_SF_ENABLE_RMSN;
14195 14199
14196 14200 /* Transfer command to HBA */
14197 14201 if (((*SATA_START_FUNC(sata_hba_inst))(
14198 14202 SATA_DIP(sata_hba_inst), spkt) != SATA_TRAN_ACCEPTED) ||
14199 14203 (spkt->satapkt_reason != SATA_PKT_COMPLETED)) {
14200 14204 /* Pkt execution failed */
14201 14205 if (state == 0)
14202 14206 infop = "disabling Removable Media Status "
14203 14207 "Notification failed";
14204 14208 else
14205 14209 infop = "enabling Removable Media Status "
14206 14210 "Notification failed";
14207 14211
14208 14212 SATA_LOG_D((sata_hba_inst, CE_WARN, "%s", infop));
14209 14213 rval = SATA_FAILURE;
14210 14214 }
14211 14215 failure:
14212 14216 /* Free allocated resources */
14213 14217 if (spkt != NULL)
14214 14218 sata_pkt_free(spx);
14215 14219 (void) kmem_free(spx, sizeof (sata_pkt_txlate_t));
14216 14220 return (rval);
14217 14221 }
14218 14222
14219 14223
14220 14224 /*
14221 14225 * Update state and copy port ss* values from passed sata_device structure.
14222 14226 * sata_address is validated - if not valid, nothing is changed in sata_scsi
14223 14227 * configuration struct.
14224 14228 *
14225 14229 * SATA_PSTATE_SHUTDOWN in port state is not reset to 0 by this function
14226 14230 * regardless of the state in device argument.
14227 14231 *
14228 14232 * Port mutex should be held while calling this function.
14229 14233 */
14230 14234 static void
14231 14235 sata_update_port_info(sata_hba_inst_t *sata_hba_inst,
14232 14236 sata_device_t *sata_device)
14233 14237 {
14234 14238 sata_cport_info_t *cportinfo;
14235 14239
14236 14240 if (sata_device->satadev_addr.qual == SATA_ADDR_CPORT ||
14237 14241 sata_device->satadev_addr.qual == SATA_ADDR_DCPORT) {
14238 14242 if (SATA_NUM_CPORTS(sata_hba_inst) <=
14239 14243 sata_device->satadev_addr.cport)
14240 14244 return;
14241 14245
14242 14246 cportinfo = SATA_CPORT_INFO(sata_hba_inst,
14243 14247 sata_device->satadev_addr.cport);
14244 14248
14245 14249 ASSERT(mutex_owned(&cportinfo->cport_mutex));
14246 14250 cportinfo->cport_scr = sata_device->satadev_scr;
14247 14251
14248 14252 /* Preserve SATA_PSTATE_SHUTDOWN flag */
14249 14253 cportinfo->cport_state &= ~(SATA_PSTATE_PWRON |
14250 14254 SATA_PSTATE_PWROFF | SATA_PSTATE_FAILED);
14251 14255 cportinfo->cport_state |=
14252 14256 sata_device->satadev_state & SATA_PSTATE_VALID;
14253 14257 }
14254 14258 }
14255 14259
14256 14260 void
14257 14261 sata_update_pmport_info(sata_hba_inst_t *sata_hba_inst,
14258 14262 sata_device_t *sata_device)
14259 14263 {
14260 14264 sata_pmport_info_t *pmportinfo;
14261 14265
14262 14266 if ((sata_device->satadev_addr.qual != SATA_ADDR_PMPORT &&
14263 14267 sata_device->satadev_addr.qual != SATA_ADDR_DPMPORT) ||
14264 14268 SATA_NUM_PMPORTS(sata_hba_inst,
14265 14269 sata_device->satadev_addr.cport) <
14266 14270 sata_device->satadev_addr.pmport) {
14267 14271 SATADBG1(SATA_DBG_PMULT, sata_hba_inst,
14268 14272 "sata_update_port_info: error address %p.",
14269 14273 &sata_device->satadev_addr);
14270 14274 return;
14271 14275 }
14272 14276
14273 14277 pmportinfo = SATA_PMPORT_INFO(sata_hba_inst,
14274 14278 sata_device->satadev_addr.cport,
14275 14279 sata_device->satadev_addr.pmport);
14276 14280
14277 14281 ASSERT(mutex_owned(&pmportinfo->pmport_mutex));
14278 14282 pmportinfo->pmport_scr = sata_device->satadev_scr;
14279 14283
14280 14284 /* Preserve SATA_PSTATE_SHUTDOWN flag */
14281 14285 pmportinfo->pmport_state &=
14282 14286 ~(SATA_PSTATE_PWRON | SATA_PSTATE_PWROFF | SATA_PSTATE_FAILED);
14283 14287 pmportinfo->pmport_state |=
14284 14288 sata_device->satadev_state & SATA_PSTATE_VALID;
14285 14289 }
14286 14290
14287 14291 /*
14288 14292 * Extract SATA port specification from an IOCTL argument.
14289 14293 *
14290 14294 * This function return the port the user land send us as is, unless it
14291 14295 * cannot retrieve port spec, then -1 is returned.
14292 14296 *
14293 14297 * Support port multiplier.
14294 14298 */
14295 14299 static int32_t
14296 14300 sata_get_port_num(sata_hba_inst_t *sata_hba_inst, struct devctl_iocdata *dcp)
14297 14301 {
14298 14302 int32_t port;
14299 14303
14300 14304 /* Extract port number from nvpair in dca structure */
14301 14305 if (nvlist_lookup_int32(ndi_dc_get_ap_data(dcp), "port", &port) != 0) {
14302 14306 SATA_LOG_D((sata_hba_inst, CE_NOTE,
14303 14307 "sata_get_port_num: invalid port spec 0x%x in ioctl",
14304 14308 port));
14305 14309 port = -1;
14306 14310 }
14307 14311
14308 14312 return (port);
14309 14313 }
14310 14314
14311 14315 /*
14312 14316 * Get dev_info_t pointer to the device node pointed to by port argument.
14313 14317 * NOTE: target argument is a value used in ioctls to identify
14314 14318 * the AP - it is not a sata_address.
14315 14319 * It is a combination of cport, pmport and address qualifier, encodded same
14316 14320 * way as a scsi target number.
14317 14321 * At this moment it carries only cport number.
14318 14322 *
14319 14323 * PMult hotplug is supported now.
14320 14324 *
14321 14325 * Returns dev_info_t pointer if target device was found, NULL otherwise.
14322 14326 */
14323 14327
14324 14328 static dev_info_t *
14325 14329 sata_get_target_dip(dev_info_t *dip, uint8_t cport, uint8_t pmport)
14326 14330 {
14327 14331 dev_info_t *cdip = NULL;
14328 14332 int target, tgt;
14329 14333 int circ;
14330 14334 uint8_t qual;
14331 14335
14332 14336 sata_hba_inst_t *sata_hba_inst;
14333 14337 scsi_hba_tran_t *scsi_hba_tran;
14334 14338
14335 14339 /* Get target id */
14336 14340 scsi_hba_tran = ddi_get_driver_private(dip);
14337 14341 if (scsi_hba_tran == NULL)
14338 14342 return (NULL);
14339 14343
14340 14344 sata_hba_inst = scsi_hba_tran->tran_hba_private;
14341 14345
14342 14346 if (sata_hba_inst == NULL)
14343 14347 return (NULL);
14344 14348
14345 14349 /* Identify a port-mult by cport_info.cport_dev_type */
14346 14350 if (SATA_CPORT_DEV_TYPE(sata_hba_inst, cport) == SATA_DTYPE_PMULT)
14347 14351 qual = SATA_ADDR_DPMPORT;
14348 14352 else
14349 14353 qual = SATA_ADDR_DCPORT;
14350 14354
14351 14355 target = SATA_TO_SCSI_TARGET(cport, pmport, qual);
14352 14356
14353 14357 /* Retrieve target dip */
14354 14358 ndi_devi_enter(dip, &circ);
14355 14359 for (cdip = ddi_get_child(dip); cdip != NULL; ) {
14356 14360 dev_info_t *next = ddi_get_next_sibling(cdip);
14357 14361
14358 14362 tgt = ddi_prop_get_int(DDI_DEV_T_ANY, cdip,
14359 14363 DDI_PROP_DONTPASS, "target", -1);
14360 14364 if (tgt == -1) {
14361 14365 /*
14362 14366 * This is actually an error condition, but not
14363 14367 * a fatal one. Just continue the search.
14364 14368 */
14365 14369 cdip = next;
14366 14370 continue;
14367 14371 }
14368 14372
14369 14373 if (tgt == target)
14370 14374 break;
14371 14375
14372 14376 cdip = next;
14373 14377 }
14374 14378 ndi_devi_exit(dip, circ);
14375 14379
14376 14380 return (cdip);
14377 14381 }
14378 14382
14379 14383 /*
14380 14384 * Get dev_info_t pointer to the device node pointed to by port argument.
14381 14385 * NOTE: target argument is a value used in ioctls to identify
14382 14386 * the AP - it is not a sata_address.
14383 14387 * It is a combination of cport, pmport and address qualifier, encoded same
14384 14388 * way as a scsi target number.
14385 14389 *
14386 14390 * Returns dev_info_t pointer if target device was found, NULL otherwise.
14387 14391 */
14388 14392
14389 14393 static dev_info_t *
14390 14394 sata_get_scsi_target_dip(dev_info_t *dip, sata_address_t *saddr)
14391 14395 {
14392 14396 dev_info_t *cdip = NULL;
14393 14397 int target, tgt;
14394 14398 int circ;
14395 14399
14396 14400 target = SATA_TO_SCSI_TARGET(saddr->cport, saddr->pmport, saddr->qual);
14397 14401
14398 14402 ndi_devi_enter(dip, &circ);
14399 14403 for (cdip = ddi_get_child(dip); cdip != NULL; ) {
14400 14404 dev_info_t *next = ddi_get_next_sibling(cdip);
14401 14405
14402 14406 tgt = ddi_prop_get_int(DDI_DEV_T_ANY, cdip,
14403 14407 DDI_PROP_DONTPASS, "target", -1);
14404 14408 if (tgt == -1) {
14405 14409 /*
14406 14410 * This is actually an error condition, but not
14407 14411 * a fatal one. Just continue the search.
14408 14412 */
14409 14413 cdip = next;
14410 14414 continue;
14411 14415 }
14412 14416
14413 14417 if (tgt == target)
14414 14418 break;
14415 14419
14416 14420 cdip = next;
14417 14421 }
14418 14422 ndi_devi_exit(dip, circ);
14419 14423
14420 14424 return (cdip);
14421 14425 }
14422 14426
14423 14427 /*
14424 14428 * Process sata port disconnect request.
14425 14429 * Normally, cfgadm sata plugin will try to offline (unconfigure) the device
14426 14430 * before this request. Nevertheless, if a device is still configured,
14427 14431 * we need to attempt to offline and unconfigure device.
14428 14432 * Regardless of the unconfigure operation results the port is marked as
14429 14433 * deactivated and no access to the attached device is possible.
14430 14434 * If the target node remains because unconfigure operation failed, its state
14431 14435 * will be set to DEVICE_REMOVED, preventing it to be used again when a device
14432 14436 * is inserted/re-inserted. The event daemon will repeatedly try to unconfigure
14433 14437 * the device and remove old target node.
14434 14438 *
14435 14439 * This function invokes sata_hba_inst->satahba_tran->
14436 14440 * sata_tran_hotplug_ops->sata_tran_port_deactivate().
14437 14441 * If successful, the device structure (if any) attached to the specified port
14438 14442 * is removed and state of the port marked appropriately.
14439 14443 * Failure of the port_deactivate may keep port in the physically active state,
14440 14444 * or may fail the port.
14441 14445 *
14442 14446 * NOTE: Port multiplier is supported.
14443 14447 */
14444 14448
14445 14449 static int
14446 14450 sata_ioctl_disconnect(sata_hba_inst_t *sata_hba_inst,
14447 14451 sata_device_t *sata_device)
14448 14452 {
14449 14453 sata_drive_info_t *sdinfo = NULL, *subsdinfo = NULL;
14450 14454 sata_cport_info_t *cportinfo = NULL;
14451 14455 sata_pmport_info_t *pmportinfo = NULL;
14452 14456 sata_pmult_info_t *pmultinfo = NULL;
14453 14457 sata_device_t subsdevice;
14454 14458 int cport, pmport, qual;
14455 14459 int rval = SATA_SUCCESS;
14456 14460 int npmport = 0;
14457 14461 int rv = 0;
14458 14462
14459 14463 cport = sata_device->satadev_addr.cport;
14460 14464 pmport = sata_device->satadev_addr.pmport;
14461 14465 qual = sata_device->satadev_addr.qual;
14462 14466
14463 14467 ASSERT(qual == SATA_ADDR_DCPORT || qual == SATA_ADDR_DPMPORT);
14464 14468 if (qual == SATA_ADDR_DCPORT)
14465 14469 qual = SATA_ADDR_CPORT;
14466 14470 else
14467 14471 qual = SATA_ADDR_PMPORT;
14468 14472
14469 14473 /*
14470 14474 * DEVCTL_AP_DISCONNECT invokes sata_hba_inst->satahba_tran->
14471 14475 * sata_tran_hotplug_ops->sata_tran_port_deactivate().
14472 14476 * Do the sanity check.
14473 14477 */
14474 14478 if (SATA_PORT_DEACTIVATE_FUNC(sata_hba_inst) == NULL) {
14475 14479 /* No physical port deactivation supported. */
14476 14480 return (EINVAL);
14477 14481 }
14478 14482
14479 14483 /* Check the current state of the port */
14480 14484 rval = (*SATA_PROBE_PORT_FUNC(sata_hba_inst))
14481 14485 (SATA_DIP(sata_hba_inst), sata_device);
14482 14486
14483 14487 cportinfo = SATA_CPORT_INFO(sata_hba_inst, cport);
14484 14488
14485 14489 /*
14486 14490 * Processing port mulitiplier
14487 14491 */
14488 14492 if (qual == SATA_ADDR_CPORT &&
14489 14493 SATA_CPORT_DEV_TYPE(sata_hba_inst, cport) == SATA_DTYPE_PMULT) {
14490 14494 mutex_enter(&cportinfo->cport_mutex);
14491 14495
14492 14496 /* Check controller port status */
14493 14497 sata_update_port_info(sata_hba_inst, sata_device);
14494 14498 if (rval != SATA_SUCCESS ||
14495 14499 (sata_device->satadev_state & SATA_PSTATE_FAILED) != 0) {
14496 14500 /*
14497 14501 * Device port status is unknown or it is in failed
14498 14502 * state
14499 14503 */
14500 14504 SATA_CPORT_STATE(sata_hba_inst, cport) =
14501 14505 SATA_PSTATE_FAILED;
14502 14506 SATADBG1(SATA_DBG_IOCTL_IF, sata_hba_inst,
14503 14507 "sata_hba_ioctl: connect: failed to deactivate "
14504 14508 "SATA port %d", cport);
14505 14509 mutex_exit(&cportinfo->cport_mutex);
14506 14510 return (EIO);
14507 14511 }
14508 14512
14509 14513 /* Disconnect all sub-devices. */
14510 14514 pmultinfo = SATA_CPORTINFO_PMULT_INFO(cportinfo);
14511 14515 if (pmultinfo != NULL) {
14512 14516
14513 14517 for (npmport = 0; npmport < SATA_NUM_PMPORTS(
14514 14518 sata_hba_inst, cport); npmport ++) {
14515 14519 subsdinfo = SATA_PMPORT_DRV_INFO(
14516 14520 sata_hba_inst, cport, npmport);
14517 14521 if (subsdinfo == NULL)
14518 14522 continue;
14519 14523
14520 14524 subsdevice.satadev_addr = subsdinfo->
14521 14525 satadrv_addr;
14522 14526
14523 14527 mutex_exit(&cportinfo->cport_mutex);
14524 14528 if (sata_ioctl_disconnect(sata_hba_inst,
14525 14529 &subsdevice) == SATA_SUCCESS) {
14526 14530 SATADBG2(SATA_DBG_PMULT, sata_hba_inst,
14527 14531 "[Remove] device at port %d:%d "
14528 14532 "successfully.", cport, npmport);
14529 14533 }
14530 14534 mutex_enter(&cportinfo->cport_mutex);
14531 14535 }
14532 14536 }
14533 14537
14534 14538 /* Disconnect the port multiplier */
14535 14539 cportinfo->cport_state &= ~SATA_STATE_READY;
14536 14540 mutex_exit(&cportinfo->cport_mutex);
14537 14541
14538 14542 sata_device->satadev_addr.qual = qual;
14539 14543 rval = (*SATA_PORT_DEACTIVATE_FUNC(sata_hba_inst))
14540 14544 (SATA_DIP(sata_hba_inst), sata_device);
14541 14545
14542 14546 sata_gen_sysevent(sata_hba_inst, &sata_device->satadev_addr,
14543 14547 SE_NO_HINT);
14544 14548
14545 14549 mutex_enter(&cportinfo->cport_mutex);
14546 14550 sata_update_port_info(sata_hba_inst, sata_device);
14547 14551 if (rval != SATA_SUCCESS &&
14548 14552 sata_device->satadev_state & SATA_PSTATE_FAILED) {
14549 14553 cportinfo->cport_state = SATA_PSTATE_FAILED;
14550 14554 rv = EIO;
14551 14555 } else {
14552 14556 cportinfo->cport_state |= SATA_PSTATE_SHUTDOWN;
14553 14557 }
14554 14558 mutex_exit(&cportinfo->cport_mutex);
14555 14559
14556 14560 return (rv);
14557 14561 }
14558 14562
14559 14563 /*
14560 14564 * Process non-port-multiplier device - it could be a drive connected
14561 14565 * to a port multiplier port or a controller port.
14562 14566 */
14563 14567 if (qual == SATA_ADDR_PMPORT) {
14564 14568 pmportinfo = SATA_PMPORT_INFO(sata_hba_inst, cport, pmport);
14565 14569 mutex_enter(&pmportinfo->pmport_mutex);
14566 14570 sata_update_pmport_info(sata_hba_inst, sata_device);
14567 14571 if (rval != SATA_SUCCESS ||
14568 14572 (sata_device->satadev_state & SATA_PSTATE_FAILED) != 0) {
14569 14573 SATA_PMPORT_STATE(sata_hba_inst, cport, pmport) =
14570 14574 SATA_PSTATE_FAILED;
14571 14575 SATADBG2(SATA_DBG_IOCTL_IF, sata_hba_inst,
14572 14576 "sata_hba_ioctl: connect: failed to deactivate "
14573 14577 "SATA port %d:%d", cport, pmport);
14574 14578 mutex_exit(&pmportinfo->pmport_mutex);
14575 14579 return (EIO);
14576 14580 }
14577 14581
14578 14582 if (pmportinfo->pmport_dev_type != SATA_DTYPE_NONE) {
14579 14583 sdinfo = pmportinfo->pmport_sata_drive;
14580 14584 ASSERT(sdinfo != NULL);
14581 14585 }
14582 14586
14583 14587 /*
14584 14588 * Set port's dev_state to not ready - this will disable
14585 14589 * an access to a potentially attached device.
14586 14590 */
14587 14591 pmportinfo->pmport_state &= ~SATA_STATE_READY;
14588 14592
14589 14593 /* Remove and release sata_drive info structure. */
14590 14594 if (sdinfo != NULL) {
14591 14595 if ((sdinfo->satadrv_type &
14592 14596 SATA_VALID_DEV_TYPE) != 0) {
14593 14597 /*
14594 14598 * If a target node exists, try to offline
14595 14599 * a device and remove target node.
14596 14600 */
14597 14601 mutex_exit(&pmportinfo->pmport_mutex);
14598 14602 (void) sata_offline_device(sata_hba_inst,
14599 14603 sata_device, sdinfo);
14600 14604 mutex_enter(&pmportinfo->pmport_mutex);
14601 14605 }
14602 14606
14603 14607 SATA_PMPORTINFO_DRV_INFO(pmportinfo) = NULL;
14604 14608 pmportinfo->pmport_dev_type = SATA_DTYPE_NONE;
14605 14609 (void) kmem_free((void *)sdinfo,
14606 14610 sizeof (sata_drive_info_t));
14607 14611 }
14608 14612 mutex_exit(&pmportinfo->pmport_mutex);
14609 14613
14610 14614 } else if (qual == SATA_ADDR_CPORT) {
14611 14615 mutex_enter(&cportinfo->cport_mutex);
14612 14616 sata_update_port_info(sata_hba_inst, sata_device);
14613 14617 if (rval != SATA_SUCCESS ||
14614 14618 (sata_device->satadev_state & SATA_PSTATE_FAILED) != 0) {
14615 14619 /*
14616 14620 * Device port status is unknown or it is in failed
14617 14621 * state
14618 14622 */
14619 14623 SATA_CPORT_STATE(sata_hba_inst, cport) =
14620 14624 SATA_PSTATE_FAILED;
14621 14625 SATADBG1(SATA_DBG_IOCTL_IF, sata_hba_inst,
14622 14626 "sata_hba_ioctl: connect: failed to deactivate "
14623 14627 "SATA port %d", cport);
14624 14628 mutex_exit(&cportinfo->cport_mutex);
14625 14629 return (EIO);
14626 14630 }
14627 14631
14628 14632 if (cportinfo->cport_dev_type == SATA_DTYPE_PMULT) {
14629 14633 pmultinfo = SATA_CPORTINFO_PMULT_INFO(cportinfo);
14630 14634 ASSERT(pmultinfo != NULL);
14631 14635 } else if (cportinfo->cport_dev_type != SATA_DTYPE_NONE) {
14632 14636 sdinfo = SATA_CPORTINFO_DRV_INFO(cportinfo);
14633 14637 ASSERT(sdinfo != NULL);
14634 14638 }
14635 14639 cportinfo->cport_state &= ~SATA_STATE_READY;
14636 14640
14637 14641 if (sdinfo != NULL) {
14638 14642 if ((sdinfo->satadrv_type &
14639 14643 SATA_VALID_DEV_TYPE) != 0) {
14640 14644 /*
14641 14645 * If a target node exists, try to offline
14642 14646 * a device and remove target node.
14643 14647 */
14644 14648 mutex_exit(&cportinfo->cport_mutex);
14645 14649 (void) sata_offline_device(sata_hba_inst,
14646 14650 sata_device, sdinfo);
14647 14651 mutex_enter(&cportinfo->cport_mutex);
14648 14652 }
14649 14653
14650 14654 SATA_CPORTINFO_DRV_INFO(cportinfo) = NULL;
14651 14655 cportinfo->cport_dev_type = SATA_DTYPE_NONE;
14652 14656 (void) kmem_free((void *)sdinfo,
14653 14657 sizeof (sata_drive_info_t));
14654 14658 }
14655 14659 mutex_exit(&cportinfo->cport_mutex);
14656 14660 }
14657 14661
14658 14662 /* Just ask HBA driver to deactivate port */
14659 14663 sata_device->satadev_addr.qual = qual;
14660 14664
14661 14665 rval = (*SATA_PORT_DEACTIVATE_FUNC(sata_hba_inst))
14662 14666 (SATA_DIP(sata_hba_inst), sata_device);
14663 14667
14664 14668 /*
14665 14669 * Generate sysevent - EC_DR / ESC_DR_AP_STATE_CHANGE
14666 14670 * without the hint (to force listener to investivate the state).
14667 14671 */
14668 14672 sata_gen_sysevent(sata_hba_inst, &sata_device->satadev_addr,
14669 14673 SE_NO_HINT);
14670 14674
14671 14675 if (qual == SATA_ADDR_PMPORT) {
14672 14676 mutex_enter(&pmportinfo->pmport_mutex);
14673 14677 sata_update_pmport_info(sata_hba_inst, sata_device);
14674 14678
14675 14679 if (rval != SATA_SUCCESS &&
14676 14680 sata_device->satadev_state & SATA_PSTATE_FAILED) {
14677 14681 /*
14678 14682 * Port deactivation failure - do not change port
14679 14683 * state unless the state returned by HBA indicates a
14680 14684 * port failure.
14681 14685 *
14682 14686 * NOTE: device structures were released, so devices
14683 14687 * now are invisible! Port reset is needed to
14684 14688 * re-enumerate devices.
14685 14689 */
14686 14690 pmportinfo->pmport_state = SATA_PSTATE_FAILED;
14687 14691 rv = EIO;
14688 14692 } else {
14689 14693 /*
14690 14694 * Deactivation succeded. From now on the sata framework
14691 14695 * will not care what is happening to the device, until
14692 14696 * the port is activated again.
14693 14697 */
14694 14698 pmportinfo->pmport_state |= SATA_PSTATE_SHUTDOWN;
14695 14699 }
14696 14700 mutex_exit(&pmportinfo->pmport_mutex);
14697 14701 } else if (qual == SATA_ADDR_CPORT) {
14698 14702 mutex_enter(&cportinfo->cport_mutex);
14699 14703 sata_update_port_info(sata_hba_inst, sata_device);
14700 14704
14701 14705 if (rval != SATA_SUCCESS &&
14702 14706 sata_device->satadev_state & SATA_PSTATE_FAILED) {
14703 14707 cportinfo->cport_state = SATA_PSTATE_FAILED;
14704 14708 rv = EIO;
14705 14709 } else {
14706 14710 cportinfo->cport_state |= SATA_PSTATE_SHUTDOWN;
14707 14711 }
14708 14712 mutex_exit(&cportinfo->cport_mutex);
14709 14713 }
14710 14714
14711 14715 return (rv);
14712 14716 }
14713 14717
14714 14718
14715 14719
14716 14720 /*
14717 14721 * Process sata port connect request
14718 14722 * The sata cfgadm pluging will invoke this operation only if port was found
14719 14723 * in the disconnect state (failed state is also treated as the disconnected
14720 14724 * state).
14721 14725 * DEVCTL_AP_CONNECT would invoke sata_hba_inst->satahba_tran->
14722 14726 * sata_tran_hotplug_ops->sata_tran_port_activate().
14723 14727 * If successful and a device is found attached to the port,
14724 14728 * the initialization sequence is executed to attach a device structure to
14725 14729 * a port structure. The state of the port and a device would be set
14726 14730 * appropriately.
14727 14731 * The device is not set in configured state (system-wise) by this operation.
14728 14732 *
14729 14733 * Note, that activating the port may generate link events,
14730 14734 * so it is important that following processing and the
14731 14735 * event processing does not interfere with each other!
14732 14736 *
14733 14737 * This operation may remove port failed state and will
14734 14738 * try to make port active and in good standing.
14735 14739 *
14736 14740 * NOTE: Port multiplier is supported.
14737 14741 */
14738 14742
14739 14743 static int
14740 14744 sata_ioctl_connect(sata_hba_inst_t *sata_hba_inst,
14741 14745 sata_device_t *sata_device)
14742 14746 {
14743 14747 sata_pmport_info_t *pmportinfo = NULL;
14744 14748 uint8_t cport, pmport, qual;
14745 14749 int rv = 0;
14746 14750
14747 14751 cport = sata_device->satadev_addr.cport;
14748 14752 pmport = sata_device->satadev_addr.pmport;
14749 14753 qual = sata_device->satadev_addr.qual;
14750 14754
14751 14755 ASSERT(qual == SATA_ADDR_DCPORT || qual == SATA_ADDR_DPMPORT);
14752 14756 if (qual == SATA_ADDR_DCPORT)
14753 14757 qual = SATA_ADDR_CPORT;
14754 14758 else
14755 14759 qual = SATA_ADDR_PMPORT;
14756 14760
14757 14761 if (qual == SATA_ADDR_PMPORT)
14758 14762 pmportinfo = SATA_PMPORT_INFO(sata_hba_inst, cport, pmport);
14759 14763
14760 14764 /*
14761 14765 * DEVCTL_AP_CONNECT would invoke sata_hba_inst->
14762 14766 * satahba_tran->sata_tran_hotplug_ops->sata_tran_port_activate().
14763 14767 * Perform sanity check now.
14764 14768 */
14765 14769 if (SATA_PORT_ACTIVATE_FUNC(sata_hba_inst) == NULL) {
14766 14770 /* No physical port activation supported. */
14767 14771 return (EINVAL);
14768 14772 }
14769 14773
14770 14774 /* Just ask HBA driver to activate port */
14771 14775 if ((*SATA_PORT_ACTIVATE_FUNC(sata_hba_inst))
14772 14776 (SATA_DIP(sata_hba_inst), sata_device) != SATA_SUCCESS) {
14773 14777 /*
14774 14778 * Port activation failure.
14775 14779 */
14776 14780 if (qual == SATA_ADDR_CPORT) {
14777 14781 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst,
14778 14782 cport)->cport_mutex);
14779 14783 sata_update_port_info(sata_hba_inst, sata_device);
14780 14784 if (sata_device->satadev_state & SATA_PSTATE_FAILED) {
14781 14785 SATA_CPORT_STATE(sata_hba_inst, cport) =
14782 14786 SATA_PSTATE_FAILED;
14783 14787 SATADBG1(SATA_DBG_IOCTL_IF, sata_hba_inst,
14784 14788 "sata_hba_ioctl: connect: failed to "
14785 14789 "activate SATA port %d", cport);
14786 14790 }
14787 14791 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst,
14788 14792 cport)->cport_mutex);
14789 14793 } else { /* port multiplier device port */
14790 14794 mutex_enter(&pmportinfo->pmport_mutex);
14791 14795 sata_update_pmport_info(sata_hba_inst, sata_device);
14792 14796 if (sata_device->satadev_state & SATA_PSTATE_FAILED) {
14793 14797 SATA_PMPORT_STATE(sata_hba_inst, cport,
14794 14798 pmport) = SATA_PSTATE_FAILED;
14795 14799 SATADBG2(SATA_DBG_IOCTL_IF, sata_hba_inst,
14796 14800 "sata_hba_ioctl: connect: failed to "
14797 14801 "activate SATA port %d:%d", cport, pmport);
14798 14802 }
14799 14803 mutex_exit(&pmportinfo->pmport_mutex);
14800 14804 }
14801 14805 return (EIO);
14802 14806 }
14803 14807
14804 14808 /* Virgin port state - will be updated by the port re-probe. */
14805 14809 if (qual == SATA_ADDR_CPORT) {
14806 14810 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst,
14807 14811 cport)->cport_mutex);
14808 14812 SATA_CPORT_STATE(sata_hba_inst, cport) = 0;
14809 14813 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst,
14810 14814 cport)->cport_mutex);
14811 14815 } else { /* port multiplier device port */
14812 14816 mutex_enter(&pmportinfo->pmport_mutex);
14813 14817 SATA_PMPORT_STATE(sata_hba_inst, cport, pmport) = 0;
14814 14818 mutex_exit(&pmportinfo->pmport_mutex);
14815 14819 }
14816 14820
14817 14821 /*
14818 14822 * Probe the port to find its state and attached device.
14819 14823 */
14820 14824 if (sata_reprobe_port(sata_hba_inst, sata_device,
14821 14825 SATA_DEV_IDENTIFY_RETRY) == SATA_FAILURE)
14822 14826 rv = EIO;
14823 14827
14824 14828 /*
14825 14829 * Generate sysevent - EC_DR / ESC_DR_AP_STATE_CHANGE
14826 14830 * without the hint
14827 14831 */
14828 14832 sata_gen_sysevent(sata_hba_inst, &sata_device->satadev_addr,
14829 14833 SE_NO_HINT);
14830 14834
14831 14835 /*
14832 14836 * If there is a device attached to the port, emit
14833 14837 * a message.
14834 14838 */
14835 14839 if (sata_device->satadev_type != SATA_DTYPE_NONE) {
14836 14840
14837 14841 if (qual == SATA_ADDR_CPORT) {
14838 14842 if (sata_device->satadev_type == SATA_DTYPE_PMULT) {
14839 14843 sata_log(sata_hba_inst, CE_WARN,
14840 14844 "SATA port multiplier detected "
14841 14845 "at port %d", cport);
14842 14846 } else {
14843 14847 sata_log(sata_hba_inst, CE_WARN,
14844 14848 "SATA device detected at port %d", cport);
14845 14849 if (sata_device->satadev_type ==
14846 14850 SATA_DTYPE_UNKNOWN) {
14847 14851 /*
14848 14852 * A device was not successfully identified
14849 14853 */
14850 14854 sata_log(sata_hba_inst, CE_WARN,
14851 14855 "Could not identify SATA "
14852 14856 "device at port %d", cport);
14853 14857 }
14854 14858 }
14855 14859 } else { /* port multiplier device port */
14856 14860 sata_log(sata_hba_inst, CE_WARN,
14857 14861 "SATA device detected at port %d:%d",
14858 14862 cport, pmport);
14859 14863 if (sata_device->satadev_type == SATA_DTYPE_UNKNOWN) {
14860 14864 /*
14861 14865 * A device was not successfully identified
14862 14866 */
14863 14867 sata_log(sata_hba_inst, CE_WARN,
14864 14868 "Could not identify SATA "
14865 14869 "device at port %d:%d", cport, pmport);
14866 14870 }
14867 14871 }
14868 14872 }
14869 14873
14870 14874 return (rv);
14871 14875 }
14872 14876
14873 14877
14874 14878 /*
14875 14879 * Process sata device unconfigure request.
14876 14880 * The unconfigure operation uses generic nexus operation to
14877 14881 * offline a device. It leaves a target device node attached.
14878 14882 * and obviously sata_drive_info attached as well, because
14879 14883 * from the hardware point of view nothing has changed.
14880 14884 */
14881 14885 static int
14882 14886 sata_ioctl_unconfigure(sata_hba_inst_t *sata_hba_inst,
14883 14887 sata_device_t *sata_device)
14884 14888 {
14885 14889 int rv = 0;
14886 14890 dev_info_t *tdip;
14887 14891
14888 14892 /* We are addressing attached device, not a port */
14889 14893 if (sata_device->satadev_addr.qual == SATA_ADDR_CPORT)
14890 14894 sata_device->satadev_addr.qual = SATA_ADDR_DCPORT;
14891 14895 else if (sata_device->satadev_addr.qual == SATA_ADDR_PMPORT)
14892 14896 sata_device->satadev_addr.qual = SATA_ADDR_DPMPORT;
14893 14897
14894 14898 if ((tdip = sata_get_scsi_target_dip(SATA_DIP(sata_hba_inst),
14895 14899 &sata_device->satadev_addr)) != NULL) {
14896 14900
14897 14901 if (ndi_devi_offline(tdip, NDI_UNCONFIG) != NDI_SUCCESS) {
14898 14902 SATA_LOG_D((sata_hba_inst, CE_WARN,
14899 14903 "sata_hba_ioctl: unconfigure: "
14900 14904 "failed to unconfigure device at SATA port %d:%d",
14901 14905 sata_device->satadev_addr.cport,
14902 14906 sata_device->satadev_addr.pmport));
14903 14907 rv = EIO;
14904 14908 }
14905 14909 /*
14906 14910 * The target node devi_state should be marked with
14907 14911 * DEVI_DEVICE_OFFLINE by ndi_devi_offline().
14908 14912 * This would be the indication for cfgadm that
14909 14913 * the AP node occupant state is 'unconfigured'.
14910 14914 */
14911 14915
14912 14916 } else {
14913 14917 /*
14914 14918 * This would indicate a failure on the part of cfgadm
14915 14919 * to detect correct state of the node prior to this
14916 14920 * call - one cannot unconfigure non-existing device.
14917 14921 */
14918 14922 SATA_LOG_D((sata_hba_inst, CE_WARN,
14919 14923 "sata_hba_ioctl: unconfigure: "
14920 14924 "attempt to unconfigure non-existing device "
14921 14925 "at SATA port %d:%d",
14922 14926 sata_device->satadev_addr.cport,
14923 14927 sata_device->satadev_addr.pmport));
14924 14928 rv = ENXIO;
14925 14929 }
14926 14930 return (rv);
14927 14931 }
14928 14932
14929 14933 /*
14930 14934 * Process sata device configure request
14931 14935 * If port is in a failed state, operation is aborted - one has to use
14932 14936 * an explicit connect or port activate request to try to get a port into
14933 14937 * non-failed mode. Port reset wil also work in such situation.
14934 14938 * If the port is in disconnected (shutdown) state, the connect operation is
14935 14939 * attempted prior to any other action.
14936 14940 * When port is in the active state, there is a device attached and the target
14937 14941 * node exists, a device was most likely offlined.
14938 14942 * If target node does not exist, a new target node is created. In both cases
14939 14943 * an attempt is made to online (configure) the device.
14940 14944 *
14941 14945 * NOTE: Port multiplier is supported.
14942 14946 */
14943 14947 static int
14944 14948 sata_ioctl_configure(sata_hba_inst_t *sata_hba_inst,
14945 14949 sata_device_t *sata_device)
14946 14950 {
14947 14951 int cport, pmport, qual;
14948 14952 int rval;
14949 14953 boolean_t target = B_TRUE;
14950 14954 sata_cport_info_t *cportinfo;
14951 14955 sata_pmport_info_t *pmportinfo = NULL;
14952 14956 dev_info_t *tdip;
14953 14957 sata_drive_info_t *sdinfo;
14954 14958
14955 14959 cport = sata_device->satadev_addr.cport;
14956 14960 pmport = sata_device->satadev_addr.pmport;
14957 14961 qual = sata_device->satadev_addr.qual;
14958 14962
14959 14963 /* Get current port state */
14960 14964 rval = (*SATA_PROBE_PORT_FUNC(sata_hba_inst))
14961 14965 (SATA_DIP(sata_hba_inst), sata_device);
14962 14966
14963 14967 cportinfo = SATA_CPORT_INFO(sata_hba_inst, cport);
14964 14968 if (qual == SATA_ADDR_DPMPORT) {
14965 14969 pmportinfo = SATA_PMPORT_INFO(sata_hba_inst, cport, pmport);
14966 14970 mutex_enter(&pmportinfo->pmport_mutex);
14967 14971 sata_update_pmport_info(sata_hba_inst, sata_device);
14968 14972 if (rval != SATA_SUCCESS ||
14969 14973 (sata_device->satadev_state & SATA_PSTATE_FAILED) != 0) {
14970 14974 /*
14971 14975 * Obviously, device on a failed port is not visible
14972 14976 */
14973 14977 mutex_exit(&pmportinfo->pmport_mutex);
14974 14978 return (ENXIO);
14975 14979 }
14976 14980 mutex_exit(&pmportinfo->pmport_mutex);
14977 14981 } else {
14978 14982 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst,
14979 14983 cport)->cport_mutex);
14980 14984 sata_update_port_info(sata_hba_inst, sata_device);
14981 14985 if (rval != SATA_SUCCESS ||
14982 14986 (sata_device->satadev_state & SATA_PSTATE_FAILED) != 0) {
14983 14987 /*
14984 14988 * Obviously, device on a failed port is not visible
14985 14989 */
14986 14990 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst,
14987 14991 cport)->cport_mutex);
14988 14992 return (ENXIO);
14989 14993 }
14990 14994 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst,
14991 14995 cport)->cport_mutex);
14992 14996 }
14993 14997
14994 14998 if ((sata_device->satadev_state & SATA_PSTATE_SHUTDOWN) != 0) {
14995 14999 /* need to activate port */
14996 15000 target = B_FALSE;
14997 15001
14998 15002 /* Sanity check */
14999 15003 if (SATA_PORT_ACTIVATE_FUNC(sata_hba_inst) == NULL)
15000 15004 return (ENXIO);
15001 15005
15002 15006 /* Just let HBA driver to activate port */
15003 15007 if ((*SATA_PORT_ACTIVATE_FUNC(sata_hba_inst))
15004 15008 (SATA_DIP(sata_hba_inst), sata_device) != SATA_SUCCESS) {
15005 15009 /*
15006 15010 * Port activation failure - do not change port state
15007 15011 * unless the state returned by HBA indicates a port
15008 15012 * failure.
15009 15013 */
15010 15014 if (qual == SATA_ADDR_DPMPORT) {
15011 15015 mutex_enter(&pmportinfo->pmport_mutex);
15012 15016 sata_update_pmport_info(sata_hba_inst,
15013 15017 sata_device);
15014 15018 if (sata_device->satadev_state &
15015 15019 SATA_PSTATE_FAILED)
15016 15020 pmportinfo->pmport_state =
15017 15021 SATA_PSTATE_FAILED;
15018 15022 mutex_exit(&pmportinfo->pmport_mutex);
15019 15023 } else {
15020 15024 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst,
15021 15025 cport)->cport_mutex);
15022 15026 sata_update_port_info(sata_hba_inst,
15023 15027 sata_device);
15024 15028 if (sata_device->satadev_state &
15025 15029 SATA_PSTATE_FAILED)
15026 15030 cportinfo->cport_state =
15027 15031 SATA_PSTATE_FAILED;
15028 15032 mutex_exit(&SATA_CPORT_INFO(
15029 15033 sata_hba_inst, cport)->cport_mutex);
15030 15034 }
15031 15035 }
15032 15036 SATA_LOG_D((sata_hba_inst, CE_WARN,
15033 15037 "sata_hba_ioctl: configure: "
15034 15038 "failed to activate SATA port %d:%d",
15035 15039 cport, pmport));
15036 15040 return (EIO);
15037 15041 }
15038 15042 /*
15039 15043 * Generate sysevent - EC_DR / ESC_DR_AP_STATE_CHANGE
15040 15044 * without the hint.
15041 15045 */
15042 15046 sata_gen_sysevent(sata_hba_inst,
15043 15047 &sata_device->satadev_addr, SE_NO_HINT);
15044 15048
15045 15049 /* Virgin port state */
15046 15050 if (qual == SATA_ADDR_DPMPORT) {
15047 15051 mutex_enter(&pmportinfo->pmport_mutex);
15048 15052 pmportinfo->pmport_state = 0;
15049 15053 mutex_exit(&pmportinfo->pmport_mutex);
15050 15054 } else {
15051 15055 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst,
15052 15056 cport)-> cport_mutex);
15053 15057 cportinfo->cport_state = 0;
15054 15058 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst,
15055 15059 cport)->cport_mutex);
15056 15060 }
15057 15061 /*
15058 15062 * Always reprobe port, to get current device info.
15059 15063 */
15060 15064 if (sata_reprobe_port(sata_hba_inst, sata_device,
15061 15065 SATA_DEV_IDENTIFY_RETRY) != SATA_SUCCESS)
15062 15066 return (EIO);
15063 15067
15064 15068 if (sata_device->satadev_type != SATA_DTYPE_NONE && target == B_FALSE) {
15065 15069 if (qual == SATA_ADDR_DPMPORT) {
15066 15070 /*
15067 15071 * That's the transition from "inactive" port
15068 15072 * to active one with device attached.
15069 15073 */
15070 15074 sata_log(sata_hba_inst, CE_WARN,
15071 15075 "SATA device detected at port %d:%d",
15072 15076 cport, pmport);
15073 15077 } else {
15074 15078 /*
15075 15079 * When PM is attached to the cport and cport is
15076 15080 * activated, every PM device port needs to be reprobed.
15077 15081 * We need to emit message for all devices detected
15078 15082 * at port multiplier's device ports.
15079 15083 * Add such code here.
15080 15084 * For now, just inform about device attached to
15081 15085 * cport.
15082 15086 */
15083 15087 sata_log(sata_hba_inst, CE_WARN,
15084 15088 "SATA device detected at port %d", cport);
15085 15089 }
15086 15090 }
15087 15091
15088 15092 /*
15089 15093 * This is where real configuration operation starts.
15090 15094 *
15091 15095 * When PM is attached to the cport and cport is activated,
15092 15096 * devices attached PM device ports may have to be configured
15093 15097 * explicitly. This may change when port multiplier is supported.
15094 15098 * For now, configure only disks and other valid target devices.
15095 15099 */
15096 15100 if (!(sata_device->satadev_type & SATA_VALID_DEV_TYPE)) {
15097 15101 if (qual == SATA_ADDR_DCPORT) {
15098 15102 if (sata_device->satadev_type == SATA_DTYPE_UNKNOWN) {
15099 15103 /*
15100 15104 * A device was not successfully identified
15101 15105 */
15102 15106 sata_log(sata_hba_inst, CE_WARN,
15103 15107 "Could not identify SATA "
15104 15108 "device at port %d", cport);
15105 15109 }
15106 15110 } else { /* port multiplier device port */
15107 15111 if (sata_device->satadev_type == SATA_DTYPE_UNKNOWN) {
15108 15112 /*
15109 15113 * A device was not successfully identified
15110 15114 */
15111 15115 sata_log(sata_hba_inst, CE_WARN,
15112 15116 "Could not identify SATA "
15113 15117 "device at port %d:%d", cport, pmport);
15114 15118 }
15115 15119 }
15116 15120 return (ENXIO); /* No device to configure */
15117 15121 }
15118 15122
15119 15123 /*
15120 15124 * Here we may have a device in reset condition,
15121 15125 * but because we are just configuring it, there is
15122 15126 * no need to process the reset other than just
15123 15127 * to clear device reset condition in the HBA driver.
15124 15128 * Setting the flag SATA_EVNT_CLEAR_DEVICE_RESET will
15125 15129 * cause a first command sent the HBA driver with the request
15126 15130 * to clear device reset condition.
15127 15131 */
15128 15132 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, cport)->cport_mutex);
15129 15133 if (qual == SATA_ADDR_DPMPORT)
15130 15134 sata_device->satadev_addr.qual = SATA_ADDR_DPMPORT;
15131 15135 else
15132 15136 sata_device->satadev_addr.qual = SATA_ADDR_DCPORT;
15133 15137 sdinfo = sata_get_device_info(sata_hba_inst, sata_device);
15134 15138 if (sdinfo == NULL) {
15135 15139 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, cport)->cport_mutex);
15136 15140 return (ENXIO);
15137 15141 }
15138 15142 if (sdinfo->satadrv_event_flags &
15139 15143 (SATA_EVNT_DEVICE_RESET | SATA_EVNT_INPROC_DEVICE_RESET)) {
15140 15144 sdinfo->satadrv_event_flags = 0;
15141 15145 }
15142 15146 sdinfo->satadrv_event_flags |= SATA_EVNT_CLEAR_DEVICE_RESET;
15143 15147 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, cport)->cport_mutex);
15144 15148
15145 15149 if ((tdip = sata_get_scsi_target_dip(SATA_DIP(sata_hba_inst),
15146 15150 &sata_device->satadev_addr)) != NULL) {
15147 15151 /*
15148 15152 * Target node exists. Verify, that it belongs
15149 15153 * to existing, attached device and not to
15150 15154 * a removed device.
15151 15155 */
15152 15156 if (sata_check_device_removed(tdip) == B_TRUE) {
15153 15157 if (qual == SATA_ADDR_DPMPORT)
15154 15158 sata_log(sata_hba_inst, CE_WARN,
15155 15159 "SATA device at port %d cannot be "
15156 15160 "configured. "
15157 15161 "Application(s) accessing "
15158 15162 "previously attached device "
15159 15163 "have to release it before newly "
15160 15164 "inserted device can be made accessible.",
15161 15165 cport);
15162 15166 else
15163 15167 sata_log(sata_hba_inst, CE_WARN,
15164 15168 "SATA device at port %d:%d cannot be"
15165 15169 "configured. "
15166 15170 "Application(s) accessing "
15167 15171 "previously attached device "
15168 15172 "have to release it before newly "
15169 15173 "inserted device can be made accessible.",
15170 15174 cport, pmport);
15171 15175 return (EIO);
15172 15176 }
15173 15177 /*
15174 15178 * Device was not removed and re-inserted.
15175 15179 * Try to online it.
15176 15180 */
15177 15181 if (ndi_devi_online(tdip, 0) != NDI_SUCCESS) {
15178 15182 SATA_LOG_D((sata_hba_inst, CE_WARN,
15179 15183 "sata_hba_ioctl: configure: "
15180 15184 "onlining device at SATA port "
15181 15185 "%d:%d failed", cport, pmport));
15182 15186 return (EIO);
15183 15187 }
15184 15188
15185 15189 if (qual == SATA_ADDR_DPMPORT) {
15186 15190 mutex_enter(&pmportinfo->pmport_mutex);
15187 15191 pmportinfo->pmport_tgtnode_clean = B_TRUE;
15188 15192 mutex_exit(&pmportinfo->pmport_mutex);
15189 15193 } else {
15190 15194 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst,
15191 15195 cport)->cport_mutex);
15192 15196 cportinfo-> cport_tgtnode_clean = B_TRUE;
15193 15197 mutex_exit(&SATA_CPORT_INFO(
15194 15198 sata_hba_inst, cport)->cport_mutex);
15195 15199 }
15196 15200 } else {
15197 15201 /*
15198 15202 * No target node - need to create a new target node.
15199 15203 */
15200 15204 if (qual == SATA_ADDR_DPMPORT) {
15201 15205 mutex_enter(&pmportinfo->pmport_mutex);
15202 15206 pmportinfo->pmport_tgtnode_clean = B_TRUE;
15203 15207 mutex_exit(&pmportinfo->pmport_mutex);
15204 15208 } else {
15205 15209 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, cport)->
15206 15210 cport_mutex);
15207 15211 cportinfo-> cport_tgtnode_clean = B_TRUE;
15208 15212 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, cport)->
15209 15213 cport_mutex);
15210 15214 }
15211 15215
15212 15216 tdip = sata_create_target_node(SATA_DIP(sata_hba_inst),
15213 15217 sata_hba_inst, &sata_device->satadev_addr);
15214 15218 if (tdip == NULL) {
15215 15219 /* Configure operation failed */
15216 15220 SATA_LOG_D((sata_hba_inst, CE_WARN,
15217 15221 "sata_hba_ioctl: configure: "
15218 15222 "configuring SATA device at port %d:%d "
15219 15223 "failed", cport, pmport));
15220 15224 return (EIO);
15221 15225 }
15222 15226 }
15223 15227 return (0);
15224 15228 }
15225 15229
15226 15230
15227 15231 /*
15228 15232 * Process ioctl deactivate port request.
15229 15233 * Arbitrarily unconfigure attached device, if any.
15230 15234 * Even if the unconfigure fails, proceed with the
15231 15235 * port deactivation.
15232 15236 *
15233 15237 * NOTE: Port Multiplier is supported now.
15234 15238 */
15235 15239
15236 15240 static int
15237 15241 sata_ioctl_deactivate(sata_hba_inst_t *sata_hba_inst,
15238 15242 sata_device_t *sata_device)
15239 15243 {
15240 15244 int cport, pmport, qual;
15241 15245 int rval, rv = 0;
15242 15246 int npmport;
15243 15247 sata_cport_info_t *cportinfo;
15244 15248 sata_pmport_info_t *pmportinfo;
15245 15249 sata_pmult_info_t *pmultinfo;
15246 15250 dev_info_t *tdip;
15247 15251 sata_drive_info_t *sdinfo = NULL;
15248 15252 sata_device_t subsdevice;
15249 15253
15250 15254 /* Sanity check */
15251 15255 if (SATA_PORT_DEACTIVATE_FUNC(sata_hba_inst) == NULL)
15252 15256 return (ENOTSUP);
15253 15257
15254 15258 cport = sata_device->satadev_addr.cport;
15255 15259 pmport = sata_device->satadev_addr.pmport;
15256 15260 qual = sata_device->satadev_addr.qual;
15257 15261
15258 15262 /* SCSI_TO_SATA_ADDR_QUAL() translate ap_id into a device qualifier */
15259 15263 ASSERT(qual == SATA_ADDR_DCPORT || qual == SATA_ADDR_DPMPORT);
15260 15264 if (qual == SATA_ADDR_DCPORT)
15261 15265 qual = SATA_ADDR_CPORT;
15262 15266 else
15263 15267 qual = SATA_ADDR_PMPORT;
15264 15268
15265 15269 cportinfo = SATA_CPORT_INFO(sata_hba_inst, cport);
15266 15270 if (qual == SATA_ADDR_PMPORT)
15267 15271 pmportinfo = SATA_PMPORT_INFO(sata_hba_inst, cport, pmport);
15268 15272
15269 15273 /*
15270 15274 * Processing port multiplier
15271 15275 */
15272 15276 if (qual == SATA_ADDR_CPORT &&
15273 15277 SATA_CPORT_DEV_TYPE(sata_hba_inst, cport) == SATA_DTYPE_PMULT) {
15274 15278 mutex_enter(&cportinfo->cport_mutex);
15275 15279
15276 15280 /* Deactivate all sub-deices */
15277 15281 pmultinfo = SATA_CPORTINFO_PMULT_INFO(cportinfo);
15278 15282 if (pmultinfo != NULL) {
15279 15283 for (npmport = 0; npmport < SATA_NUM_PMPORTS(
15280 15284 sata_hba_inst, cport); npmport++) {
15281 15285
15282 15286 subsdevice.satadev_addr.cport = cport;
15283 15287 subsdevice.satadev_addr.pmport =
15284 15288 (uint8_t)npmport;
15285 15289 subsdevice.satadev_addr.qual =
15286 15290 SATA_ADDR_DPMPORT;
15287 15291
15288 15292 SATADBG2(SATA_DBG_PMULT, sata_hba_inst,
15289 15293 "sata_hba_ioctl: deactivate: trying to "
15290 15294 "deactivate SATA port %d:%d",
15291 15295 cport, npmport);
15292 15296
15293 15297 mutex_exit(&cportinfo->cport_mutex);
15294 15298 if (sata_ioctl_deactivate(sata_hba_inst,
15295 15299 &subsdevice) == SATA_SUCCESS) {
15296 15300 SATADBG2(SATA_DBG_PMULT, sata_hba_inst,
15297 15301 "[Deactivate] device at port %d:%d "
15298 15302 "successfully.", cport, npmport);
15299 15303 }
15300 15304 mutex_enter(&cportinfo->cport_mutex);
15301 15305 }
15302 15306 }
15303 15307
15304 15308 /* Deactivate the port multiplier now. */
15305 15309 cportinfo->cport_state &= ~SATA_STATE_READY;
15306 15310 mutex_exit(&cportinfo->cport_mutex);
15307 15311
15308 15312 sata_device->satadev_addr.qual = qual;
15309 15313 rval = (*SATA_PORT_DEACTIVATE_FUNC(sata_hba_inst))
15310 15314 (SATA_DIP(sata_hba_inst), sata_device);
15311 15315
15312 15316 sata_gen_sysevent(sata_hba_inst, &sata_device->satadev_addr,
15313 15317 SE_NO_HINT);
15314 15318
15315 15319 mutex_enter(&cportinfo->cport_mutex);
15316 15320 sata_update_port_info(sata_hba_inst, sata_device);
15317 15321 if (rval != SATA_SUCCESS) {
15318 15322 if (sata_device->satadev_state & SATA_PSTATE_FAILED) {
15319 15323 cportinfo->cport_state = SATA_PSTATE_FAILED;
15320 15324 }
15321 15325 rv = EIO;
15322 15326 } else {
15323 15327 cportinfo->cport_state |= SATA_PSTATE_SHUTDOWN;
15324 15328 }
15325 15329 mutex_exit(&cportinfo->cport_mutex);
15326 15330
15327 15331 return (rv);
15328 15332 }
15329 15333
15330 15334 /*
15331 15335 * Process non-port-multiplier device - it could be a drive connected
15332 15336 * to a port multiplier port or a controller port.
15333 15337 */
15334 15338 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, cport)->cport_mutex);
15335 15339 if (qual == SATA_ADDR_CPORT) {
15336 15340 sata_device->satadev_addr.qual = SATA_ADDR_DCPORT;
15337 15341 if (cportinfo->cport_dev_type != SATA_DTYPE_NONE) {
15338 15342 /* deal only with valid devices */
15339 15343 if ((cportinfo->cport_dev_type &
15340 15344 SATA_VALID_DEV_TYPE) != 0)
15341 15345 sdinfo = SATA_CPORTINFO_DRV_INFO(cportinfo);
15342 15346 }
15343 15347 cportinfo->cport_state &= ~SATA_STATE_READY;
15344 15348 } else {
15345 15349 /* Port multiplier device port */
15346 15350 mutex_enter(&pmportinfo->pmport_mutex);
15347 15351 sata_device->satadev_addr.qual = SATA_ADDR_DPMPORT;
15348 15352 if (pmportinfo->pmport_dev_type != SATA_DTYPE_NONE &&
15349 15353 (pmportinfo->pmport_dev_type & SATA_VALID_DEV_TYPE) != 0)
15350 15354 sdinfo = SATA_PMPORTINFO_DRV_INFO(pmportinfo);
15351 15355 pmportinfo->pmport_state &= ~SATA_STATE_READY;
15352 15356 mutex_exit(&pmportinfo->pmport_mutex);
15353 15357 }
15354 15358
15355 15359 if (sdinfo != NULL) {
15356 15360 /*
15357 15361 * If a target node exists, try to offline a device and
15358 15362 * to remove a target node.
15359 15363 */
15360 15364 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, cport)->
15361 15365 cport_mutex);
15362 15366 tdip = sata_get_scsi_target_dip(SATA_DIP(sata_hba_inst),
15363 15367 &sata_device->satadev_addr);
15364 15368 if (tdip != NULL) {
15365 15369 /* target node exist */
15366 15370 SATADBG1(SATA_DBG_IOCTL_IF, sata_hba_inst,
15367 15371 "sata_hba_ioctl: port deactivate: "
15368 15372 "target node exists.", NULL);
15369 15373
15370 15374 if (ndi_devi_offline(tdip, NDI_DEVI_REMOVE) !=
15371 15375 NDI_SUCCESS) {
15372 15376 SATA_LOG_D((sata_hba_inst, CE_WARN,
15373 15377 "sata_hba_ioctl: port deactivate: "
15374 15378 "failed to unconfigure device at port "
15375 15379 "%d:%d before deactivating the port",
15376 15380 cport, pmport));
15377 15381 /*
15378 15382 * Set DEVICE REMOVED state in the target
15379 15383 * node. It will prevent an access to
15380 15384 * the device even when a new device is
15381 15385 * attached, until the old target node is
15382 15386 * released, removed and recreated for a new
15383 15387 * device.
15384 15388 */
15385 15389 sata_set_device_removed(tdip);
15386 15390
15387 15391 /*
15388 15392 * Instruct the event daemon to try the
15389 15393 * target node cleanup later.
15390 15394 */
15391 15395 sata_set_target_node_cleanup(sata_hba_inst,
15392 15396 &sata_device->satadev_addr);
15393 15397 }
15394 15398 }
15395 15399 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, cport)->
15396 15400 cport_mutex);
15397 15401 /*
15398 15402 * In any case, remove and release sata_drive_info
15399 15403 * structure.
15400 15404 */
15401 15405 if (qual == SATA_ADDR_CPORT) {
15402 15406 SATA_CPORTINFO_DRV_INFO(cportinfo) = NULL;
15403 15407 cportinfo->cport_dev_type = SATA_DTYPE_NONE;
15404 15408 } else { /* port multiplier device port */
15405 15409 mutex_enter(&pmportinfo->pmport_mutex);
15406 15410 SATA_PMPORTINFO_DRV_INFO(pmportinfo) = NULL;
15407 15411 pmportinfo->pmport_dev_type = SATA_DTYPE_NONE;
15408 15412 mutex_exit(&pmportinfo->pmport_mutex);
15409 15413 }
15410 15414 (void) kmem_free((void *)sdinfo, sizeof (sata_drive_info_t));
15411 15415 }
15412 15416
15413 15417 if (qual == SATA_ADDR_CPORT) {
15414 15418 cportinfo->cport_state &= ~(SATA_STATE_PROBED |
15415 15419 SATA_STATE_PROBING);
15416 15420 } else if (qual == SATA_ADDR_PMPORT) {
15417 15421 mutex_enter(&pmportinfo->pmport_mutex);
15418 15422 pmportinfo->pmport_state &= ~(SATA_STATE_PROBED |
15419 15423 SATA_STATE_PROBING);
15420 15424 mutex_exit(&pmportinfo->pmport_mutex);
15421 15425 }
15422 15426 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, cport)->cport_mutex);
15423 15427
15424 15428 /* Just let HBA driver to deactivate port */
15425 15429 sata_device->satadev_addr.qual = qual;
15426 15430 rval = (*SATA_PORT_DEACTIVATE_FUNC(sata_hba_inst))
15427 15431 (SATA_DIP(sata_hba_inst), sata_device);
15428 15432
15429 15433 /*
15430 15434 * Generate sysevent - EC_DR / ESC_DR_AP_STATE_CHANGE
15431 15435 * without the hint
15432 15436 */
15433 15437 sata_gen_sysevent(sata_hba_inst, &sata_device->satadev_addr,
15434 15438 SE_NO_HINT);
15435 15439
15436 15440 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, cport)->cport_mutex);
15437 15441 sata_update_port_info(sata_hba_inst, sata_device);
15438 15442 if (qual == SATA_ADDR_CPORT) {
15439 15443 if (rval != SATA_SUCCESS) {
15440 15444 /*
15441 15445 * Port deactivation failure - do not change port state
15442 15446 * unless the state returned by HBA indicates a port
15443 15447 * failure.
15444 15448 */
15445 15449 if (sata_device->satadev_state & SATA_PSTATE_FAILED) {
15446 15450 SATA_CPORT_STATE(sata_hba_inst, cport) =
15447 15451 SATA_PSTATE_FAILED;
15448 15452 }
15449 15453 SATA_LOG_D((sata_hba_inst, CE_WARN,
15450 15454 "sata_hba_ioctl: port deactivate: "
15451 15455 "cannot deactivate SATA port %d", cport));
15452 15456 rv = EIO;
15453 15457 } else {
15454 15458 cportinfo->cport_state |= SATA_PSTATE_SHUTDOWN;
15455 15459 }
15456 15460 } else {
15457 15461 mutex_enter(&pmportinfo->pmport_mutex);
15458 15462 if (rval != SATA_SUCCESS) {
15459 15463 if (sata_device->satadev_state & SATA_PSTATE_FAILED) {
15460 15464 SATA_PMPORT_STATE(sata_hba_inst, cport,
15461 15465 pmport) = SATA_PSTATE_FAILED;
15462 15466 }
15463 15467 SATA_LOG_D((sata_hba_inst, CE_WARN,
15464 15468 "sata_hba_ioctl: port deactivate: "
15465 15469 "cannot deactivate SATA port %d:%d",
15466 15470 cport, pmport));
15467 15471 rv = EIO;
15468 15472 } else {
15469 15473 pmportinfo->pmport_state |= SATA_PSTATE_SHUTDOWN;
15470 15474 }
15471 15475 mutex_exit(&pmportinfo->pmport_mutex);
15472 15476 }
15473 15477
15474 15478 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, cport)->cport_mutex);
15475 15479
15476 15480 return (rv);
15477 15481 }
15478 15482
15479 15483 /*
15480 15484 * Process ioctl port activate request.
15481 15485 *
15482 15486 * NOTE: Port multiplier is supported now.
15483 15487 */
15484 15488 static int
15485 15489 sata_ioctl_activate(sata_hba_inst_t *sata_hba_inst,
15486 15490 sata_device_t *sata_device)
15487 15491 {
15488 15492 int cport, pmport, qual;
15489 15493 sata_cport_info_t *cportinfo;
15490 15494 sata_pmport_info_t *pmportinfo = NULL;
15491 15495 boolean_t dev_existed = B_TRUE;
15492 15496
15493 15497 /* Sanity check */
15494 15498 if (SATA_PORT_ACTIVATE_FUNC(sata_hba_inst) == NULL)
15495 15499 return (ENOTSUP);
15496 15500
15497 15501 cport = sata_device->satadev_addr.cport;
15498 15502 pmport = sata_device->satadev_addr.pmport;
15499 15503 qual = sata_device->satadev_addr.qual;
15500 15504
15501 15505 cportinfo = SATA_CPORT_INFO(sata_hba_inst, cport);
15502 15506
15503 15507 /*
15504 15508 * The qual translate from ap_id (by SCSI_TO_SATA_ADDR_QUAL())
15505 15509 * is a device. But what we are dealing with is port/pmport.
15506 15510 */
15507 15511 ASSERT(qual == SATA_ADDR_DCPORT || qual == SATA_ADDR_DPMPORT);
15508 15512 if (qual == SATA_ADDR_DCPORT)
15509 15513 sata_device->satadev_addr.qual = qual = SATA_ADDR_CPORT;
15510 15514 else
15511 15515 sata_device->satadev_addr.qual = qual = SATA_ADDR_PMPORT;
15512 15516
15513 15517 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, cport)->cport_mutex);
15514 15518 if (qual == SATA_ADDR_PMPORT) {
15515 15519 pmportinfo = SATA_PMPORT_INFO(sata_hba_inst, cport, pmport);
15516 15520 if (pmportinfo->pmport_state & SATA_PSTATE_SHUTDOWN ||
15517 15521 pmportinfo->pmport_dev_type == SATA_DTYPE_NONE)
15518 15522 dev_existed = B_FALSE;
15519 15523 } else { /* cport */
15520 15524 if (cportinfo->cport_state & SATA_PSTATE_SHUTDOWN ||
15521 15525 cportinfo->cport_dev_type == SATA_DTYPE_NONE)
15522 15526 dev_existed = B_FALSE;
15523 15527 }
15524 15528 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, cport)->cport_mutex);
15525 15529
15526 15530 /* Just let HBA driver to activate port, if necessary */
15527 15531 if ((*SATA_PORT_ACTIVATE_FUNC(sata_hba_inst))
15528 15532 (SATA_DIP(sata_hba_inst), sata_device) != SATA_SUCCESS) {
15529 15533 /*
15530 15534 * Port activation failure - do not change port state unless
15531 15535 * the state returned by HBA indicates a port failure.
15532 15536 */
15533 15537 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst,
15534 15538 cport)->cport_mutex);
15535 15539 sata_update_port_info(sata_hba_inst, sata_device);
15536 15540 if (sata_device->satadev_state & SATA_PSTATE_FAILED) {
15537 15541 if (qual == SATA_ADDR_PMPORT) {
15538 15542 mutex_enter(&pmportinfo->pmport_mutex);
15539 15543 pmportinfo->pmport_state = SATA_PSTATE_FAILED;
15540 15544 mutex_exit(&pmportinfo->pmport_mutex);
15541 15545 } else
15542 15546 cportinfo->cport_state = SATA_PSTATE_FAILED;
15543 15547
15544 15548 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst,
15545 15549 cport)->cport_mutex);
15546 15550 SATA_LOG_D((sata_hba_inst, CE_WARN,
15547 15551 "sata_hba_ioctl: port activate: cannot activate "
15548 15552 "SATA port %d:%d", cport, pmport));
15549 15553 return (EIO);
15550 15554 }
15551 15555 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, cport)->cport_mutex);
15552 15556 }
15553 15557 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, cport)->cport_mutex);
15554 15558 if (qual == SATA_ADDR_PMPORT) {
15555 15559 mutex_enter(&pmportinfo->pmport_mutex);
15556 15560 pmportinfo->pmport_state &= ~SATA_PSTATE_SHUTDOWN;
15557 15561 mutex_exit(&pmportinfo->pmport_mutex);
15558 15562 } else
15559 15563 cportinfo->cport_state &= ~SATA_PSTATE_SHUTDOWN;
15560 15564 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, cport)->cport_mutex);
15561 15565
15562 15566 /*
15563 15567 * Re-probe port to find its current state and possibly attached device.
15564 15568 * Port re-probing may change the cportinfo device type if device is
15565 15569 * found attached.
15566 15570 * If port probing failed, the device type would be set to
15567 15571 * SATA_DTYPE_NONE.
15568 15572 */
15569 15573 (void) sata_reprobe_port(sata_hba_inst, sata_device,
15570 15574 SATA_DEV_IDENTIFY_RETRY);
15571 15575
15572 15576 /*
15573 15577 * Generate sysevent - EC_DR / ESC_DR_AP_STATE_CHANGE
15574 15578 * without the hint.
15575 15579 */
15576 15580 sata_gen_sysevent(sata_hba_inst, &sata_device->satadev_addr,
15577 15581 SE_NO_HINT);
15578 15582
15579 15583 if (dev_existed == B_FALSE) {
15580 15584 if (qual == SATA_ADDR_PMPORT &&
15581 15585 pmportinfo->pmport_dev_type != SATA_DTYPE_NONE) {
15582 15586 /*
15583 15587 * That's the transition from the "inactive" port state
15584 15588 * or the active port without a device attached to the
15585 15589 * active port state with a device attached.
15586 15590 */
15587 15591 sata_log(sata_hba_inst, CE_WARN,
15588 15592 "SATA device detected at port %d:%d",
15589 15593 cport, pmport);
15590 15594 } else if (qual == SATA_ADDR_CPORT &&
15591 15595 cportinfo->cport_dev_type != SATA_DTYPE_NONE) {
15592 15596 /*
15593 15597 * That's the transition from the "inactive" port state
15594 15598 * or the active port without a device attached to the
15595 15599 * active port state with a device attached.
15596 15600 */
15597 15601 if (cportinfo->cport_dev_type != SATA_DTYPE_PMULT) {
15598 15602 sata_log(sata_hba_inst, CE_WARN,
15599 15603 "SATA device detected at port %d", cport);
15600 15604 } else {
15601 15605 sata_log(sata_hba_inst, CE_WARN,
15602 15606 "SATA port multiplier detected at port %d",
15603 15607 cport);
15604 15608 }
15605 15609 }
15606 15610 }
15607 15611 return (0);
15608 15612 }
15609 15613
15610 15614
15611 15615
15612 15616 /*
15613 15617 * Process ioctl reset port request.
15614 15618 *
15615 15619 * NOTE: Port-Multiplier is supported.
15616 15620 */
15617 15621 static int
15618 15622 sata_ioctl_reset_port(sata_hba_inst_t *sata_hba_inst,
15619 15623 sata_device_t *sata_device)
15620 15624 {
15621 15625 int cport, pmport, qual;
15622 15626 int rv = 0;
15623 15627
15624 15628 cport = sata_device->satadev_addr.cport;
15625 15629 pmport = sata_device->satadev_addr.pmport;
15626 15630 qual = sata_device->satadev_addr.qual;
15627 15631
15628 15632 /*
15629 15633 * The qual translate from ap_id (by SCSI_TO_SATA_ADDR_QUAL())
15630 15634 * is a device. But what we are dealing with is port/pmport.
15631 15635 */
15632 15636 if (qual == SATA_ADDR_DCPORT)
15633 15637 sata_device->satadev_addr.qual = qual = SATA_ADDR_CPORT;
15634 15638 else
15635 15639 sata_device->satadev_addr.qual = qual = SATA_ADDR_PMPORT;
15636 15640 ASSERT(qual == SATA_ADDR_CPORT || qual == SATA_ADDR_PMPORT);
15637 15641
15638 15642 /* Sanity check */
15639 15643 if (SATA_RESET_DPORT_FUNC(sata_hba_inst) == NULL) {
15640 15644 SATA_LOG_D((sata_hba_inst, CE_WARN,
15641 15645 "sata_hba_ioctl: sata_hba_tran missing required "
15642 15646 "function sata_tran_reset_dport"));
15643 15647 return (ENOTSUP);
15644 15648 }
15645 15649
15646 15650 /* Ask HBA to reset port */
15647 15651 if ((*SATA_RESET_DPORT_FUNC(sata_hba_inst))(SATA_DIP(sata_hba_inst),
15648 15652 sata_device) != SATA_SUCCESS) {
15649 15653 SATA_LOG_D((sata_hba_inst, CE_WARN,
15650 15654 "sata_hba_ioctl: reset port: failed %d:%d",
15651 15655 cport, pmport));
15652 15656 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, cport)->
15653 15657 cport_mutex);
15654 15658 sata_update_port_info(sata_hba_inst, sata_device);
15655 15659 if (qual == SATA_ADDR_CPORT)
15656 15660 SATA_CPORT_STATE(sata_hba_inst, cport) =
15657 15661 SATA_PSTATE_FAILED;
15658 15662 else {
15659 15663 mutex_enter(&SATA_PMPORT_MUTEX(sata_hba_inst, cport,
15660 15664 pmport));
15661 15665 SATA_PMPORT_STATE(sata_hba_inst, cport, pmport) =
15662 15666 SATA_PSTATE_FAILED;
15663 15667 mutex_exit(&SATA_PMPORT_MUTEX(sata_hba_inst, cport,
15664 15668 pmport));
15665 15669 }
15666 15670 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, cport)->
15667 15671 cport_mutex);
15668 15672 rv = EIO;
15669 15673 }
15670 15674
15671 15675 return (rv);
15672 15676 }
15673 15677
15674 15678 /*
15675 15679 * Process ioctl reset device request.
15676 15680 *
15677 15681 * NOTE: Port multiplier is supported.
15678 15682 */
15679 15683 static int
15680 15684 sata_ioctl_reset_device(sata_hba_inst_t *sata_hba_inst,
15681 15685 sata_device_t *sata_device)
15682 15686 {
15683 15687 sata_drive_info_t *sdinfo = NULL;
15684 15688 sata_pmult_info_t *pmultinfo = NULL;
15685 15689 int cport, pmport;
15686 15690 int rv = 0;
15687 15691
15688 15692 /* Sanity check */
15689 15693 if (SATA_RESET_DPORT_FUNC(sata_hba_inst) == NULL) {
15690 15694 SATA_LOG_D((sata_hba_inst, CE_WARN,
15691 15695 "sata_hba_ioctl: sata_hba_tran missing required "
15692 15696 "function sata_tran_reset_dport"));
15693 15697 return (ENOTSUP);
15694 15698 }
15695 15699
15696 15700 cport = sata_device->satadev_addr.cport;
15697 15701 pmport = sata_device->satadev_addr.pmport;
15698 15702
15699 15703 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, cport)->cport_mutex);
15700 15704 if (sata_device->satadev_addr.qual == SATA_ADDR_DCPORT) {
15701 15705 if (SATA_CPORT_DEV_TYPE(sata_hba_inst, cport) ==
15702 15706 SATA_DTYPE_PMULT)
15703 15707 pmultinfo = SATA_CPORT_INFO(sata_hba_inst, cport)->
15704 15708 cport_devp.cport_sata_pmult;
15705 15709 else
15706 15710 sdinfo = SATA_CPORT_DRV_INFO(sata_hba_inst,
15707 15711 sata_device->satadev_addr.cport);
15708 15712 } else { /* port multiplier */
15709 15713 sata_device->satadev_addr.qual = SATA_ADDR_DPMPORT;
15710 15714 sdinfo = SATA_PMPORT_DRV_INFO(sata_hba_inst,
15711 15715 sata_device->satadev_addr.cport,
15712 15716 sata_device->satadev_addr.pmport);
15713 15717 }
15714 15718 if (sdinfo == NULL && pmultinfo == NULL) {
15715 15719 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, cport)->cport_mutex);
15716 15720 return (EINVAL);
15717 15721 }
15718 15722 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, cport)->cport_mutex);
15719 15723
15720 15724 /* Ask HBA to reset device */
15721 15725 if ((*SATA_RESET_DPORT_FUNC(sata_hba_inst))
15722 15726 (SATA_DIP(sata_hba_inst), sata_device) != SATA_SUCCESS) {
15723 15727 SATA_LOG_D((sata_hba_inst, CE_WARN,
15724 15728 "sata_hba_ioctl: reset device: failed at port %d:%d",
15725 15729 cport, pmport));
15726 15730 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, cport)->
15727 15731 cport_mutex);
15728 15732 sata_update_port_info(sata_hba_inst, sata_device);
15729 15733 /*
15730 15734 * Device info structure remains attached. Another device reset
15731 15735 * or port disconnect/connect and re-probing is
15732 15736 * needed to change it's state
15733 15737 */
15734 15738 if (sdinfo != NULL) {
15735 15739 sdinfo->satadrv_state &= ~SATA_STATE_READY;
15736 15740 sdinfo->satadrv_state |= SATA_DSTATE_FAILED;
15737 15741 } else if (pmultinfo != NULL) {
15738 15742 pmultinfo->pmult_state &= ~SATA_STATE_READY;
15739 15743 pmultinfo->pmult_state |= SATA_DSTATE_FAILED;
15740 15744 }
15741 15745
15742 15746 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, cport)->cport_mutex);
15743 15747 rv = EIO;
15744 15748 }
15745 15749 /*
15746 15750 * If attached device was a port multiplier, some extra processing
15747 15751 * may be needed to bring it back. SATA specification requies a
15748 15752 * mandatory software reset on host port to reliably enumerate a port
15749 15753 * multiplier, the HBA driver should handle that after reset
15750 15754 * operation.
15751 15755 */
15752 15756 return (rv);
15753 15757 }
15754 15758
15755 15759
15756 15760 /*
15757 15761 * Process ioctl reset all request.
15758 15762 */
15759 15763 static int
15760 15764 sata_ioctl_reset_all(sata_hba_inst_t *sata_hba_inst)
15761 15765 {
15762 15766 sata_device_t sata_device;
15763 15767 int rv = 0;
15764 15768 int tcport;
15765 15769
15766 15770 sata_device.satadev_rev = SATA_DEVICE_REV;
15767 15771
15768 15772 /*
15769 15773 * There is no protection here for configured devices.
15770 15774 */
15771 15775 /* Sanity check */
15772 15776 if (SATA_RESET_DPORT_FUNC(sata_hba_inst) == NULL) {
15773 15777 SATA_LOG_D((sata_hba_inst, CE_WARN,
15774 15778 "sata_hba_ioctl: sata_hba_tran missing required "
15775 15779 "function sata_tran_reset_dport"));
15776 15780 return (ENOTSUP);
15777 15781 }
15778 15782
15779 15783 /*
15780 15784 * Need to lock all ports, not just one.
15781 15785 * If any port is locked by event processing, fail the whole operation.
15782 15786 * One port is already locked, but for simplicity lock it again.
15783 15787 */
15784 15788 for (tcport = 0; tcport < SATA_NUM_CPORTS(sata_hba_inst); tcport++) {
15785 15789 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, tcport)->
15786 15790 cport_mutex);
15787 15791 if (((SATA_CPORT_INFO(sata_hba_inst, tcport)->
15788 15792 cport_event_flags) & SATA_EVNT_LOCK_PORT_BUSY) != 0) {
15789 15793 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, tcport)->
15790 15794 cport_mutex);
15791 15795 rv = EBUSY;
15792 15796 break;
15793 15797 } else {
15794 15798 /*
15795 15799 * It is enough to lock cport in command-based
15796 15800 * switching mode.
15797 15801 */
15798 15802 SATA_CPORT_INFO(sata_hba_inst, tcport)->
15799 15803 cport_event_flags |= SATA_APCTL_LOCK_PORT_BUSY;
15800 15804 }
15801 15805 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, tcport)->
15802 15806 cport_mutex);
15803 15807 }
15804 15808
15805 15809 if (rv == 0) {
15806 15810 /*
15807 15811 * All cports were successfully locked.
15808 15812 * Reset main SATA controller.
15809 15813 * Set the device address to port 0, to have a valid device
15810 15814 * address.
15811 15815 */
15812 15816 sata_device.satadev_addr.qual = SATA_ADDR_CNTRL;
15813 15817 sata_device.satadev_addr.cport = 0;
15814 15818 sata_device.satadev_addr.pmport = 0;
15815 15819
15816 15820 if ((*SATA_RESET_DPORT_FUNC(sata_hba_inst))
15817 15821 (SATA_DIP(sata_hba_inst), &sata_device) != SATA_SUCCESS) {
15818 15822 SATA_LOG_D((sata_hba_inst, CE_WARN,
15819 15823 "sata_hba_ioctl: reset controller failed"));
15820 15824 return (EIO);
15821 15825 }
15822 15826 }
15823 15827 /*
15824 15828 * Unlock all ports
15825 15829 */
15826 15830 for (tcport = 0; tcport < SATA_NUM_CPORTS(sata_hba_inst); tcport++) {
15827 15831 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, tcport)->
15828 15832 cport_mutex);
15829 15833 SATA_CPORT_INFO(sata_hba_inst, tcport)->
15830 15834 cport_event_flags &= ~SATA_APCTL_LOCK_PORT_BUSY;
15831 15835 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, tcport)->
15832 15836 cport_mutex);
15833 15837 }
15834 15838
15835 15839 /*
15836 15840 * This operation returns EFAULT if either reset
15837 15841 * controller failed or a re-probing of any port failed.
15838 15842 */
15839 15843 return (rv);
15840 15844 }
15841 15845
15842 15846
15843 15847 /*
15844 15848 * Process ioctl port self test request.
15845 15849 *
15846 15850 * NOTE: Port multiplier code is not completed nor tested.
15847 15851 */
15848 15852 static int
15849 15853 sata_ioctl_port_self_test(sata_hba_inst_t *sata_hba_inst,
15850 15854 sata_device_t *sata_device)
15851 15855 {
15852 15856 int cport, pmport, qual;
15853 15857 int rv = 0;
15854 15858
15855 15859 /* Sanity check */
15856 15860 if (SATA_SELFTEST_FUNC(sata_hba_inst) == NULL)
15857 15861 return (ENOTSUP);
15858 15862
15859 15863 cport = sata_device->satadev_addr.cport;
15860 15864 pmport = sata_device->satadev_addr.pmport;
15861 15865 qual = sata_device->satadev_addr.qual;
15862 15866
15863 15867 /*
15864 15868 * There is no protection here for a configured
15865 15869 * device attached to this port.
15866 15870 */
15867 15871
15868 15872 if ((*SATA_SELFTEST_FUNC(sata_hba_inst))
15869 15873 (SATA_DIP(sata_hba_inst), sata_device) != SATA_SUCCESS) {
15870 15874 SATA_LOG_D((sata_hba_inst, CE_WARN,
15871 15875 "sata_hba_ioctl: port selftest: "
15872 15876 "failed port %d:%d", cport, pmport));
15873 15877 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, cport)->
15874 15878 cport_mutex);
15875 15879 sata_update_port_info(sata_hba_inst, sata_device);
15876 15880 if (qual == SATA_ADDR_CPORT)
15877 15881 SATA_CPORT_STATE(sata_hba_inst, cport) =
15878 15882 SATA_PSTATE_FAILED;
15879 15883 else { /* port multiplier device port */
15880 15884 mutex_enter(&SATA_PMPORT_MUTEX(sata_hba_inst,
15881 15885 cport, pmport));
15882 15886 SATA_PMPORT_STATE(sata_hba_inst, cport, pmport) =
15883 15887 SATA_PSTATE_FAILED;
15884 15888 mutex_exit(&SATA_PMPORT_MUTEX(sata_hba_inst,
15885 15889 cport, pmport));
15886 15890 }
15887 15891
15888 15892 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, cport)->
15889 15893 cport_mutex);
15890 15894 return (EIO);
15891 15895 }
15892 15896 /*
15893 15897 * Beacuse the port was reset in the course of testing, it should be
15894 15898 * re-probed and attached device state should be restored. At this
15895 15899 * point the port state is unknown - it's state is HBA-specific.
15896 15900 * Force port re-probing to get it into a known state.
15897 15901 */
15898 15902 if (sata_reprobe_port(sata_hba_inst, sata_device,
15899 15903 SATA_DEV_IDENTIFY_RETRY) != SATA_SUCCESS)
15900 15904 rv = EIO;
15901 15905 return (rv);
15902 15906 }
15903 15907
15904 15908
15905 15909 /*
15906 15910 * sata_cfgadm_state:
15907 15911 * Use the sata port state and state of the target node to figure out
15908 15912 * the cfgadm_state.
15909 15913 *
15910 15914 * The port argument is a value with encoded cport,
15911 15915 * pmport and address qualifier, in the same manner as a scsi target number.
15912 15916 * SCSI_TO_SATA_CPORT macro extracts cport number,
15913 15917 * SCSI_TO_SATA_PMPORT extracts pmport number and
15914 15918 * SCSI_TO_SATA_ADDR_QUAL extracts port mulitplier qualifier flag.
15915 15919 *
15916 15920 * Port multiplier is supported.
15917 15921 */
15918 15922
15919 15923 static void
15920 15924 sata_cfgadm_state(sata_hba_inst_t *sata_hba_inst, int32_t port,
15921 15925 devctl_ap_state_t *ap_state)
15922 15926 {
15923 15927 uint8_t cport, pmport, qual;
15924 15928 uint32_t port_state, pmult_state;
15925 15929 uint32_t dev_type;
15926 15930 sata_drive_info_t *sdinfo;
15927 15931
15928 15932 cport = SCSI_TO_SATA_CPORT(port);
15929 15933 pmport = SCSI_TO_SATA_PMPORT(port);
15930 15934 qual = SCSI_TO_SATA_ADDR_QUAL(port);
15931 15935
15932 15936 /* Check cport state */
15933 15937 port_state = SATA_CPORT_STATE(sata_hba_inst, cport);
15934 15938 if (port_state & SATA_PSTATE_SHUTDOWN ||
15935 15939 port_state & SATA_PSTATE_FAILED) {
15936 15940 ap_state->ap_rstate = AP_RSTATE_DISCONNECTED;
15937 15941 ap_state->ap_ostate = AP_OSTATE_UNCONFIGURED;
15938 15942 if (port_state & SATA_PSTATE_FAILED)
15939 15943 ap_state->ap_condition = AP_COND_FAILED;
15940 15944 else
15941 15945 ap_state->ap_condition = AP_COND_UNKNOWN;
15942 15946
15943 15947 return;
15944 15948 }
15945 15949
15946 15950 /* cport state is okay. Now check pmport state */
15947 15951 if (qual == SATA_ADDR_DPMPORT || qual == SATA_ADDR_PMPORT) {
15948 15952 /* Sanity check */
15949 15953 if (SATA_CPORT_DEV_TYPE(sata_hba_inst, cport) !=
15950 15954 SATA_DTYPE_PMULT || SATA_PMPORT_INFO(sata_hba_inst,
15951 15955 cport, pmport) == NULL)
15952 15956 return;
15953 15957 port_state = SATA_PMPORT_STATE(sata_hba_inst, cport, pmport);
15954 15958 if (port_state & SATA_PSTATE_SHUTDOWN ||
15955 15959 port_state & SATA_PSTATE_FAILED) {
15956 15960 ap_state->ap_rstate = AP_RSTATE_DISCONNECTED;
15957 15961 ap_state->ap_ostate = AP_OSTATE_UNCONFIGURED;
15958 15962 if (port_state & SATA_PSTATE_FAILED)
15959 15963 ap_state->ap_condition = AP_COND_FAILED;
15960 15964 else
15961 15965 ap_state->ap_condition = AP_COND_UNKNOWN;
15962 15966
15963 15967 return;
15964 15968 }
15965 15969 }
15966 15970
15967 15971 /* Port is enabled and ready */
15968 15972 if (qual == SATA_ADDR_DCPORT || qual == SATA_ADDR_CPORT)
15969 15973 dev_type = SATA_CPORT_DEV_TYPE(sata_hba_inst, cport);
15970 15974 else
15971 15975 dev_type = SATA_PMPORT_DEV_TYPE(sata_hba_inst, cport, pmport);
15972 15976
15973 15977 switch (dev_type) {
15974 15978 case SATA_DTYPE_NONE:
15975 15979 {
15976 15980 ap_state->ap_ostate = AP_OSTATE_UNCONFIGURED;
15977 15981 ap_state->ap_condition = AP_COND_OK;
15978 15982 /* No device attached */
15979 15983 ap_state->ap_rstate = AP_RSTATE_EMPTY;
15980 15984 break;
15981 15985 }
15982 15986 case SATA_DTYPE_PMULT:
15983 15987 {
15984 15988 /* Need to check port multiplier state */
15985 15989 ASSERT(qual == SATA_ADDR_DCPORT);
15986 15990 pmult_state = SATA_PMULT_INFO(sata_hba_inst, cport)->
15987 15991 pmult_state;
15988 15992 if (pmult_state & (SATA_PSTATE_SHUTDOWN|SATA_PSTATE_FAILED)) {
15989 15993 ap_state->ap_rstate = AP_RSTATE_DISCONNECTED;
15990 15994 ap_state->ap_ostate = AP_OSTATE_UNCONFIGURED;
15991 15995 if (pmult_state & SATA_PSTATE_FAILED)
15992 15996 ap_state->ap_condition = AP_COND_FAILED;
15993 15997 else
15994 15998 ap_state->ap_condition = AP_COND_UNKNOWN;
15995 15999
15996 16000 return;
15997 16001 }
15998 16002
15999 16003 /* Port multiplier is not configurable */
16000 16004 ap_state->ap_ostate = AP_OSTATE_CONFIGURED;
16001 16005 ap_state->ap_rstate = AP_RSTATE_CONNECTED;
16002 16006 ap_state->ap_condition = AP_COND_OK;
16003 16007 break;
16004 16008 }
16005 16009
16006 16010 case SATA_DTYPE_ATADISK:
16007 16011 case SATA_DTYPE_ATAPICD:
16008 16012 case SATA_DTYPE_ATAPITAPE:
16009 16013 case SATA_DTYPE_ATAPIDISK:
16010 16014 {
16011 16015 dev_info_t *tdip = NULL;
16012 16016 dev_info_t *dip = NULL;
16013 16017 int circ;
16014 16018
16015 16019 dip = SATA_DIP(sata_hba_inst);
16016 16020 tdip = sata_get_target_dip(dip, cport, pmport);
16017 16021 ap_state->ap_rstate = AP_RSTATE_CONNECTED;
16018 16022 if (tdip != NULL) {
16019 16023 ndi_devi_enter(dip, &circ);
16020 16024 mutex_enter(&(DEVI(tdip)->devi_lock));
16021 16025 if (DEVI_IS_DEVICE_REMOVED(tdip)) {
16022 16026 /*
16023 16027 * There could be the case where previously
16024 16028 * configured and opened device was removed
16025 16029 * and unknown device was plugged.
16026 16030 * In such case we want to show a device, and
16027 16031 * its configured or unconfigured state but
16028 16032 * indicate unusable condition untill the
16029 16033 * old target node is released and removed.
16030 16034 */
16031 16035 ap_state->ap_condition = AP_COND_UNUSABLE;
16032 16036 } else {
16033 16037 mutex_enter(&SATA_CPORT_MUTEX(sata_hba_inst,
16034 16038 cport));
16035 16039 sdinfo = SATA_CPORT_DRV_INFO(sata_hba_inst,
16036 16040 cport);
16037 16041 if (sdinfo != NULL) {
16038 16042 if ((sdinfo->satadrv_state &
16039 16043 SATA_DSTATE_FAILED) != 0)
16040 16044 ap_state->ap_condition =
16041 16045 AP_COND_FAILED;
16042 16046 else
16043 16047 ap_state->ap_condition =
16044 16048 AP_COND_OK;
16045 16049 } else {
16046 16050 ap_state->ap_condition =
16047 16051 AP_COND_UNKNOWN;
16048 16052 }
16049 16053 mutex_exit(&SATA_CPORT_MUTEX(sata_hba_inst,
16050 16054 cport));
16051 16055 }
16052 16056 if ((DEVI_IS_DEVICE_OFFLINE(tdip)) ||
16053 16057 (DEVI_IS_DEVICE_DOWN(tdip))) {
16054 16058 ap_state->ap_ostate =
16055 16059 AP_OSTATE_UNCONFIGURED;
16056 16060 } else {
16057 16061 ap_state->ap_ostate =
16058 16062 AP_OSTATE_CONFIGURED;
16059 16063 }
16060 16064 mutex_exit(&(DEVI(tdip)->devi_lock));
16061 16065 ndi_devi_exit(dip, circ);
16062 16066 } else {
16063 16067 ap_state->ap_ostate = AP_OSTATE_UNCONFIGURED;
16064 16068 ap_state->ap_condition = AP_COND_UNKNOWN;
16065 16069 }
16066 16070 break;
16067 16071 }
16068 16072 case SATA_DTYPE_ATAPIPROC:
16069 16073 ap_state->ap_rstate = AP_RSTATE_CONNECTED;
16070 16074 ap_state->ap_ostate = AP_OSTATE_UNCONFIGURED;
16071 16075 ap_state->ap_condition = AP_COND_OK;
16072 16076 break;
16073 16077 default:
16074 16078 ap_state->ap_rstate = AP_RSTATE_CONNECTED;
16075 16079 ap_state->ap_ostate = AP_OSTATE_UNCONFIGURED;
16076 16080 ap_state->ap_condition = AP_COND_UNKNOWN;
16077 16081 /*
16078 16082 * This is actually internal error condition (non fatal),
16079 16083 * because we have already checked all defined device types.
16080 16084 */
16081 16085 SATA_LOG_D((sata_hba_inst, CE_WARN,
16082 16086 "sata_cfgadm_state: Internal error: "
16083 16087 "unknown device type"));
16084 16088 break;
16085 16089 }
16086 16090 }
16087 16091
16088 16092
16089 16093 /*
16090 16094 * Process ioctl get device path request.
16091 16095 *
16092 16096 * NOTE: Port multiplier has no target dip. Devices connected to port
16093 16097 * multiplier have target node attached to the HBA node. The only difference
16094 16098 * between them and the directly-attached device node is a target address.
16095 16099 */
16096 16100 static int
16097 16101 sata_ioctl_get_device_path(sata_hba_inst_t *sata_hba_inst,
16098 16102 sata_device_t *sata_device, sata_ioctl_data_t *ioc, int mode)
16099 16103 {
16100 16104 char path[MAXPATHLEN];
16101 16105 uint32_t size;
16102 16106 dev_info_t *tdip;
16103 16107
16104 16108 (void) strcpy(path, "/devices");
16105 16109 if ((tdip = sata_get_scsi_target_dip(SATA_DIP(sata_hba_inst),
16106 16110 &sata_device->satadev_addr)) == NULL) {
16107 16111 /*
16108 16112 * No such device. If this is a request for a size, do not
16109 16113 * return EINVAL for non-existing target, because cfgadm
16110 16114 * will then indicate a meaningless ioctl failure.
16111 16115 * If this is a request for a path, indicate invalid
16112 16116 * argument.
16113 16117 */
16114 16118 if (ioc->get_size == 0)
16115 16119 return (EINVAL);
16116 16120 } else {
16117 16121 (void) ddi_pathname(tdip, path + strlen(path));
16118 16122 }
16119 16123 size = strlen(path) + 1;
16120 16124
16121 16125 if (ioc->get_size != 0) {
16122 16126 if (ddi_copyout((void *)&size, ioc->buf, ioc->bufsiz,
16123 16127 mode) != 0)
16124 16128 return (EFAULT);
16125 16129 } else {
16126 16130 if (ioc->bufsiz != size)
16127 16131 return (EINVAL);
16128 16132
16129 16133 else if (ddi_copyout((void *)&path, ioc->buf, ioc->bufsiz,
16130 16134 mode) != 0)
16131 16135 return (EFAULT);
16132 16136 }
16133 16137 return (0);
16134 16138 }
16135 16139
16136 16140 /*
16137 16141 * Process ioctl get attachment point type request.
16138 16142 *
16139 16143 * NOTE: Port multiplier is supported.
16140 16144 */
16141 16145 static int
16142 16146 sata_ioctl_get_ap_type(sata_hba_inst_t *sata_hba_inst,
16143 16147 sata_device_t *sata_device, sata_ioctl_data_t *ioc, int mode)
16144 16148 {
16145 16149 uint32_t type_len;
16146 16150 const char *ap_type;
16147 16151 int dev_type;
16148 16152
16149 16153 if (sata_device->satadev_addr.qual == SATA_ADDR_DCPORT)
16150 16154 dev_type = SATA_CPORT_DEV_TYPE(sata_hba_inst,
16151 16155 sata_device->satadev_addr.cport);
16152 16156 else /* pmport */
16153 16157 dev_type = SATA_PMPORT_DEV_TYPE(sata_hba_inst,
16154 16158 sata_device->satadev_addr.cport,
16155 16159 sata_device->satadev_addr.pmport);
16156 16160
16157 16161 switch (dev_type) {
16158 16162 case SATA_DTYPE_NONE:
16159 16163 ap_type = "port";
16160 16164 break;
16161 16165
16162 16166 case SATA_DTYPE_ATADISK:
16163 16167 case SATA_DTYPE_ATAPIDISK:
16164 16168 ap_type = "disk";
16165 16169 break;
16166 16170
16167 16171 case SATA_DTYPE_ATAPICD:
16168 16172 ap_type = "cd/dvd";
16169 16173 break;
16170 16174
16171 16175 case SATA_DTYPE_ATAPITAPE:
16172 16176 ap_type = "tape";
16173 16177 break;
16174 16178
16175 16179 case SATA_DTYPE_ATAPIPROC:
16176 16180 ap_type = "processor";
16177 16181 break;
16178 16182
16179 16183 case SATA_DTYPE_PMULT:
16180 16184 ap_type = "sata-pmult";
16181 16185 break;
16182 16186
16183 16187 case SATA_DTYPE_UNKNOWN:
16184 16188 ap_type = "unknown";
16185 16189 break;
16186 16190
16187 16191 default:
16188 16192 ap_type = "unsupported";
16189 16193 break;
16190 16194
16191 16195 } /* end of dev_type switch */
16192 16196
16193 16197 type_len = strlen(ap_type) + 1;
16194 16198
16195 16199 if (ioc->get_size) {
16196 16200 if (ddi_copyout((void *)&type_len, ioc->buf, ioc->bufsiz,
16197 16201 mode) != 0)
16198 16202 return (EFAULT);
16199 16203 } else {
16200 16204 if (ioc->bufsiz != type_len)
16201 16205 return (EINVAL);
16202 16206
16203 16207 if (ddi_copyout((void *)ap_type, ioc->buf,
16204 16208 ioc->bufsiz, mode) != 0)
16205 16209 return (EFAULT);
16206 16210 }
16207 16211 return (0);
16208 16212
16209 16213 }
16210 16214
16211 16215 /*
16212 16216 * Process ioctl get device model info request.
16213 16217 * This operation should return to cfgadm the device model
16214 16218 * information string
16215 16219 *
16216 16220 * NOTE: Port multiplier is supported.
16217 16221 */
16218 16222 static int
16219 16223 sata_ioctl_get_model_info(sata_hba_inst_t *sata_hba_inst,
16220 16224 sata_device_t *sata_device, sata_ioctl_data_t *ioc, int mode)
16221 16225 {
16222 16226 sata_drive_info_t *sdinfo;
16223 16227 uint32_t info_len;
16224 16228 char ap_info[SATA_ID_MODEL_LEN + 1];
16225 16229
16226 16230 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst,
16227 16231 sata_device->satadev_addr.cport)->cport_mutex);
16228 16232 if (sata_device->satadev_addr.qual == SATA_ADDR_DCPORT)
16229 16233 sdinfo = SATA_CPORT_DRV_INFO(sata_hba_inst,
16230 16234 sata_device->satadev_addr.cport);
16231 16235 else /* port multiplier */
16232 16236 sdinfo = SATA_PMPORT_DRV_INFO(sata_hba_inst,
16233 16237 sata_device->satadev_addr.cport,
16234 16238 sata_device->satadev_addr.pmport);
16235 16239 if (sdinfo == NULL) {
16236 16240 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst,
16237 16241 sata_device->satadev_addr.cport)->cport_mutex);
16238 16242 return (EINVAL);
16239 16243 }
16240 16244
16241 16245 #ifdef _LITTLE_ENDIAN
16242 16246 swab(sdinfo->satadrv_id.ai_model, ap_info, SATA_ID_MODEL_LEN);
16243 16247 #else /* _LITTLE_ENDIAN */
16244 16248 bcopy(sdinfo->satadrv_id.ai_model, ap_info, SATA_ID_MODEL_LEN);
16245 16249 #endif /* _LITTLE_ENDIAN */
16246 16250
16247 16251 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst,
16248 16252 sata_device->satadev_addr.cport)->cport_mutex);
16249 16253
16250 16254 ap_info[SATA_ID_MODEL_LEN] = '\0';
16251 16255
16252 16256 info_len = strlen(ap_info) + 1;
16253 16257
16254 16258 if (ioc->get_size) {
16255 16259 if (ddi_copyout((void *)&info_len, ioc->buf, ioc->bufsiz,
16256 16260 mode) != 0)
16257 16261 return (EFAULT);
16258 16262 } else {
16259 16263 if (ioc->bufsiz < info_len)
16260 16264 return (EINVAL);
16261 16265 if (ddi_copyout((void *)ap_info, ioc->buf, ioc->bufsiz,
16262 16266 mode) != 0)
16263 16267 return (EFAULT);
16264 16268 }
16265 16269 return (0);
16266 16270 }
16267 16271
16268 16272
16269 16273 /*
16270 16274 * Process ioctl get device firmware revision info request.
16271 16275 * This operation should return to cfgadm the device firmware revision
16272 16276 * information string
16273 16277 *
16274 16278 * Port multiplier is supported.
16275 16279 */
16276 16280 static int
16277 16281 sata_ioctl_get_revfirmware_info(sata_hba_inst_t *sata_hba_inst,
16278 16282 sata_device_t *sata_device, sata_ioctl_data_t *ioc, int mode)
16279 16283 {
16280 16284 sata_drive_info_t *sdinfo;
16281 16285 uint32_t info_len;
16282 16286 char ap_info[SATA_ID_FW_LEN + 1];
16283 16287
16284 16288 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst,
16285 16289 sata_device->satadev_addr.cport)->cport_mutex);
16286 16290 if (sata_device->satadev_addr.qual == SATA_ADDR_DCPORT)
16287 16291 sdinfo = SATA_CPORT_DRV_INFO(sata_hba_inst,
16288 16292 sata_device->satadev_addr.cport);
16289 16293 else /* port multiplier */
16290 16294 sdinfo = SATA_PMPORT_DRV_INFO(sata_hba_inst,
16291 16295 sata_device->satadev_addr.cport,
16292 16296 sata_device->satadev_addr.pmport);
16293 16297 if (sdinfo == NULL) {
16294 16298 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst,
16295 16299 sata_device->satadev_addr.cport)->cport_mutex);
16296 16300 return (EINVAL);
16297 16301 }
16298 16302
16299 16303 #ifdef _LITTLE_ENDIAN
16300 16304 swab(sdinfo->satadrv_id.ai_fw, ap_info, SATA_ID_FW_LEN);
16301 16305 #else /* _LITTLE_ENDIAN */
16302 16306 bcopy(sdinfo->satadrv_id.ai_fw, ap_info, SATA_ID_FW_LEN);
16303 16307 #endif /* _LITTLE_ENDIAN */
16304 16308
16305 16309 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst,
16306 16310 sata_device->satadev_addr.cport)->cport_mutex);
16307 16311
16308 16312 ap_info[SATA_ID_FW_LEN] = '\0';
16309 16313
16310 16314 info_len = strlen(ap_info) + 1;
16311 16315
16312 16316 if (ioc->get_size) {
16313 16317 if (ddi_copyout((void *)&info_len, ioc->buf, ioc->bufsiz,
16314 16318 mode) != 0)
16315 16319 return (EFAULT);
16316 16320 } else {
16317 16321 if (ioc->bufsiz < info_len)
16318 16322 return (EINVAL);
16319 16323 if (ddi_copyout((void *)ap_info, ioc->buf, ioc->bufsiz,
16320 16324 mode) != 0)
16321 16325 return (EFAULT);
16322 16326 }
16323 16327 return (0);
16324 16328 }
16325 16329
16326 16330
16327 16331 /*
16328 16332 * Process ioctl get device serial number info request.
16329 16333 * This operation should return to cfgadm the device serial number string.
16330 16334 *
16331 16335 * NOTE: Port multiplier is supported.
16332 16336 */
16333 16337 static int
16334 16338 sata_ioctl_get_serialnumber_info(sata_hba_inst_t *sata_hba_inst,
16335 16339 sata_device_t *sata_device, sata_ioctl_data_t *ioc, int mode)
16336 16340 {
16337 16341 sata_drive_info_t *sdinfo;
16338 16342 uint32_t info_len;
16339 16343 char ap_info[SATA_ID_SERIAL_LEN + 1];
16340 16344
16341 16345 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst,
16342 16346 sata_device->satadev_addr.cport)->cport_mutex);
16343 16347 if (sata_device->satadev_addr.qual == SATA_ADDR_DCPORT)
16344 16348 sdinfo = SATA_CPORT_DRV_INFO(sata_hba_inst,
16345 16349 sata_device->satadev_addr.cport);
16346 16350 else /* port multiplier */
16347 16351 sdinfo = SATA_PMPORT_DRV_INFO(sata_hba_inst,
16348 16352 sata_device->satadev_addr.cport,
16349 16353 sata_device->satadev_addr.pmport);
16350 16354 if (sdinfo == NULL) {
16351 16355 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst,
16352 16356 sata_device->satadev_addr.cport)->cport_mutex);
16353 16357 return (EINVAL);
16354 16358 }
16355 16359
16356 16360 #ifdef _LITTLE_ENDIAN
16357 16361 swab(sdinfo->satadrv_id.ai_drvser, ap_info, SATA_ID_SERIAL_LEN);
16358 16362 #else /* _LITTLE_ENDIAN */
16359 16363 bcopy(sdinfo->satadrv_id.ai_drvser, ap_info, SATA_ID_SERIAL_LEN);
16360 16364 #endif /* _LITTLE_ENDIAN */
16361 16365
16362 16366 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst,
16363 16367 sata_device->satadev_addr.cport)->cport_mutex);
16364 16368
16365 16369 ap_info[SATA_ID_SERIAL_LEN] = '\0';
16366 16370
16367 16371 info_len = strlen(ap_info) + 1;
16368 16372
16369 16373 if (ioc->get_size) {
16370 16374 if (ddi_copyout((void *)&info_len, ioc->buf, ioc->bufsiz,
16371 16375 mode) != 0)
16372 16376 return (EFAULT);
16373 16377 } else {
16374 16378 if (ioc->bufsiz < info_len)
16375 16379 return (EINVAL);
16376 16380 if (ddi_copyout((void *)ap_info, ioc->buf, ioc->bufsiz,
16377 16381 mode) != 0)
16378 16382 return (EFAULT);
16379 16383 }
16380 16384 return (0);
16381 16385 }
16382 16386
16383 16387
16384 16388 /*
16385 16389 * Preset scsi extended sense data (to NO SENSE)
16386 16390 * First 18 bytes of the sense data are preset to current valid sense
16387 16391 * with a key NO SENSE data.
16388 16392 *
16389 16393 * Returns void
16390 16394 */
16391 16395 static void
16392 16396 sata_fixed_sense_data_preset(struct scsi_extended_sense *sense)
16393 16397 {
16394 16398 sense->es_valid = 1; /* Valid sense */
16395 16399 sense->es_class = CLASS_EXTENDED_SENSE; /* 0x70 - current err */
16396 16400 sense->es_key = KEY_NO_SENSE;
16397 16401 sense->es_info_1 = 0;
16398 16402 sense->es_info_2 = 0;
16399 16403 sense->es_info_3 = 0;
16400 16404 sense->es_info_4 = 0;
16401 16405 sense->es_add_len = 10; /* Additional length - replace with a def */
16402 16406 sense->es_cmd_info[0] = 0;
16403 16407 sense->es_cmd_info[1] = 0;
16404 16408 sense->es_cmd_info[2] = 0;
16405 16409 sense->es_cmd_info[3] = 0;
16406 16410 sense->es_add_code = 0;
16407 16411 sense->es_qual_code = 0;
16408 16412 }
16409 16413
16410 16414 /*
16411 16415 * Register a legacy cmdk-style devid for the target (disk) device.
16412 16416 *
16413 16417 * Note: This function is called only when the HBA devinfo node has the
16414 16418 * property "use-cmdk-devid-format" set. This property indicates that
16415 16419 * devid compatible with old cmdk (target) driver is to be generated
16416 16420 * for any target device attached to this controller. This will take
16417 16421 * precedence over the devid generated by sd (target) driver.
16418 16422 * This function is derived from cmdk_devid_setup() function in cmdk.c.
16419 16423 */
16420 16424 static void
16421 16425 sata_target_devid_register(dev_info_t *dip, sata_drive_info_t *sdinfo)
16422 16426 {
16423 16427 char *hwid;
16424 16428 int modlen;
16425 16429 int serlen;
16426 16430 int rval;
16427 16431 ddi_devid_t devid;
16428 16432
16429 16433 /*
16430 16434 * device ID is a concatanation of model number, "=", serial number.
16431 16435 */
16432 16436 hwid = kmem_zalloc(LEGACY_HWID_LEN, KM_SLEEP);
16433 16437 bcopy(&sdinfo->satadrv_id.ai_model, hwid,
16434 16438 sizeof (sdinfo->satadrv_id.ai_model));
16435 16439 swab(hwid, hwid, sizeof (sdinfo->satadrv_id.ai_model));
16436 16440 modlen = sata_check_modser(hwid, sizeof (sdinfo->satadrv_id.ai_model));
16437 16441 if (modlen == 0)
16438 16442 goto err;
16439 16443 hwid[modlen++] = '=';
16440 16444 bcopy(&sdinfo->satadrv_id.ai_drvser, &hwid[modlen],
16441 16445 sizeof (sdinfo->satadrv_id.ai_drvser));
16442 16446 swab(&hwid[modlen], &hwid[modlen],
16443 16447 sizeof (sdinfo->satadrv_id.ai_drvser));
16444 16448 serlen = sata_check_modser(&hwid[modlen],
16445 16449 sizeof (sdinfo->satadrv_id.ai_drvser));
16446 16450 if (serlen == 0)
16447 16451 goto err;
16448 16452 hwid[modlen + serlen] = 0; /* terminate the hwid string */
16449 16453
16450 16454 /* initialize/register devid */
16451 16455 if ((rval = ddi_devid_init(dip, DEVID_ATA_SERIAL,
16452 16456 (ushort_t)(modlen + serlen), hwid, &devid)) == DDI_SUCCESS) {
16453 16457 rval = ddi_devid_register(dip, devid);
16454 16458 /*
16455 16459 * Free up the allocated devid buffer.
16456 16460 * NOTE: This doesn't mean unregistering devid.
16457 16461 */
16458 16462 ddi_devid_free(devid);
16459 16463 }
16460 16464
16461 16465 if (rval != DDI_SUCCESS)
16462 16466 cmn_err(CE_WARN, "sata: failed to create devid for the disk"
16463 16467 " on port %d", sdinfo->satadrv_addr.cport);
16464 16468 err:
16465 16469 kmem_free(hwid, LEGACY_HWID_LEN);
16466 16470 }
16467 16471
16468 16472 /*
16469 16473 * valid model/serial string must contain a non-zero non-space characters.
16470 16474 * trim trailing spaces/NULLs.
16471 16475 */
16472 16476 static int
16473 16477 sata_check_modser(char *buf, int buf_len)
16474 16478 {
16475 16479 boolean_t ret;
16476 16480 char *s;
16477 16481 int i;
16478 16482 int tb;
16479 16483 char ch;
16480 16484
16481 16485 ret = B_FALSE;
16482 16486 s = buf;
16483 16487 for (i = 0; i < buf_len; i++) {
16484 16488 ch = *s++;
16485 16489 if (ch != ' ' && ch != '\0')
16486 16490 tb = i + 1;
16487 16491 if (ch != ' ' && ch != '\0' && ch != '0')
16488 16492 ret = B_TRUE;
16489 16493 }
16490 16494
16491 16495 if (ret == B_FALSE)
16492 16496 return (0); /* invalid string */
16493 16497
16494 16498 return (tb); /* return length */
16495 16499 }
16496 16500
16497 16501 /*
16498 16502 * sata_set_drive_features function compares current device features setting
16499 16503 * with the saved device features settings and, if there is a difference,
16500 16504 * it restores device features setting to the previously saved state.
16501 16505 * It also arbitrarily tries to select the highest supported DMA mode.
16502 16506 * Device Identify or Identify Packet Device data has to be current.
16503 16507 * At the moment read ahead and write cache are considered for all devices.
16504 16508 * For atapi devices, Removable Media Status Notification is set in addition
16505 16509 * to common features.
16506 16510 *
16507 16511 * This function cannot be called in the interrupt context (it may sleep).
16508 16512 *
16509 16513 * The input argument sdinfo should point to the drive info structure
16510 16514 * to be updated after features are set. Note, that only
16511 16515 * device (packet) identify data is updated, not the flags indicating the
16512 16516 * supported features.
16513 16517 *
16514 16518 * Returns SATA_SUCCESS if successful or there was nothing to do.
16515 16519 * Device Identify data in the drive info structure pointed to by the sdinfo
16516 16520 * arguments is updated even when no features were set or changed.
16517 16521 *
16518 16522 * Returns SATA_FAILURE if device features could not be set or DMA mode
16519 16523 * for a disk cannot be set and device identify data cannot be fetched.
16520 16524 *
16521 16525 * Returns SATA_RETRY if device features could not be set (other than disk
16522 16526 * DMA mode) but the device identify data was fetched successfully.
16523 16527 *
16524 16528 * Note: This function may fail the port, making it inaccessible.
16525 16529 * In such case the explicit port disconnect/connect or physical device
16526 16530 * detach/attach is required to re-evaluate port state again.
16527 16531 */
16528 16532
16529 16533 static int
16530 16534 sata_set_drive_features(sata_hba_inst_t *sata_hba_inst,
16531 16535 sata_drive_info_t *sdinfo, int restore)
16532 16536 {
16533 16537 int rval = SATA_SUCCESS;
16534 16538 int rval_set;
16535 16539 sata_drive_info_t new_sdinfo;
16536 16540 char *finfo = "sata_set_drive_features: cannot";
16537 16541 char *finfox;
16538 16542 int cache_op;
16539 16543
16540 16544 bzero(&new_sdinfo, sizeof (sata_drive_info_t));
16541 16545 new_sdinfo.satadrv_addr = sdinfo->satadrv_addr;
16542 16546 new_sdinfo.satadrv_type = sdinfo->satadrv_type;
16543 16547 if (sata_fetch_device_identify_data(sata_hba_inst, &new_sdinfo) != 0) {
16544 16548 /*
16545 16549 * Cannot get device identification - caller may retry later
16546 16550 */
16547 16551 SATADBG1(SATA_DBG_DEV_SETTINGS, sata_hba_inst,
16548 16552 "%s fetch device identify data\n", finfo);
16549 16553 return (SATA_FAILURE);
16550 16554 }
16551 16555 finfox = (restore != 0) ? " restore device features" :
16552 16556 " initialize device features\n";
16553 16557
16554 16558 switch (sdinfo->satadrv_type) {
16555 16559 case SATA_DTYPE_ATADISK:
16556 16560 /* Arbitrarily set UDMA mode */
16557 16561 if (sata_set_dma_mode(sata_hba_inst, &new_sdinfo) !=
16558 16562 SATA_SUCCESS) {
16559 16563 SATA_LOG_D((sata_hba_inst, CE_WARN,
16560 16564 "%s set UDMA mode\n", finfo));
16561 16565 return (SATA_FAILURE);
16562 16566 }
16563 16567 break;
16564 16568 case SATA_DTYPE_ATAPICD:
16565 16569 case SATA_DTYPE_ATAPITAPE:
16566 16570 case SATA_DTYPE_ATAPIDISK:
16567 16571 /* Set Removable Media Status Notification, if necessary */
16568 16572 if (SATA_RM_NOTIFIC_SUPPORTED(new_sdinfo.satadrv_id) &&
16569 16573 restore != 0) {
16570 16574 if (((sdinfo->satadrv_settings & SATA_DEV_RMSN) &&
16571 16575 (!SATA_RM_NOTIFIC_ENABLED(new_sdinfo.satadrv_id)))||
16572 16576 ((!(sdinfo->satadrv_settings & SATA_DEV_RMSN)) &&
16573 16577 SATA_RM_NOTIFIC_ENABLED(new_sdinfo.satadrv_id))) {
16574 16578 /* Current setting does not match saved one */
16575 16579 if (sata_set_rmsn(sata_hba_inst, sdinfo,
16576 16580 sdinfo->satadrv_settings &
16577 16581 SATA_DEV_RMSN) != SATA_SUCCESS)
16578 16582 rval = SATA_FAILURE;
16579 16583 }
16580 16584 }
16581 16585 /*
16582 16586 * We have to set Multiword DMA or UDMA, if it is supported, as
16583 16587 * we want to use DMA transfer mode whenever possible.
16584 16588 * Some devices require explicit setting of the DMA mode.
16585 16589 */
16586 16590 if (new_sdinfo.satadrv_id.ai_cap & SATA_DMA_SUPPORT) {
16587 16591 /* Set highest supported DMA mode */
16588 16592 if (sata_set_dma_mode(sata_hba_inst, &new_sdinfo) !=
16589 16593 SATA_SUCCESS) {
16590 16594 SATA_LOG_D((sata_hba_inst, CE_WARN,
16591 16595 "%s set UDMA mode\n", finfo));
16592 16596 rval = SATA_FAILURE;
16593 16597 }
16594 16598 }
16595 16599 break;
16596 16600 }
16597 16601
16598 16602 if (!SATA_READ_AHEAD_SUPPORTED(new_sdinfo.satadrv_id) &&
16599 16603 !SATA_WRITE_CACHE_SUPPORTED(new_sdinfo.satadrv_id)) {
16600 16604 /*
16601 16605 * neither READ AHEAD nor WRITE CACHE is supported
16602 16606 * - do nothing
16603 16607 */
16604 16608 SATADBG1(SATA_DBG_DEV_SETTINGS, sata_hba_inst,
16605 16609 "settable features not supported\n", NULL);
16606 16610 goto update_sdinfo;
16607 16611 }
16608 16612
16609 16613 if ((SATA_READ_AHEAD_ENABLED(new_sdinfo.satadrv_id) &&
16610 16614 (sdinfo->satadrv_settings & SATA_DEV_READ_AHEAD)) &&
16611 16615 (SATA_WRITE_CACHE_ENABLED(new_sdinfo.satadrv_id) &&
16612 16616 (sdinfo->satadrv_settings & SATA_DEV_WRITE_CACHE))) {
16613 16617 /*
16614 16618 * both READ AHEAD and WRITE CACHE are enabled
16615 16619 * - Nothing to do
16616 16620 */
16617 16621 SATADBG1(SATA_DBG_DEV_SETTINGS, sata_hba_inst,
16618 16622 "no device features to set\n", NULL);
16619 16623 goto update_sdinfo;
16620 16624 }
16621 16625
16622 16626 cache_op = 0;
16623 16627
16624 16628 if (SATA_READ_AHEAD_SUPPORTED(new_sdinfo.satadrv_id)) {
16625 16629 if ((sdinfo->satadrv_settings & SATA_DEV_READ_AHEAD) &&
16626 16630 !SATA_READ_AHEAD_ENABLED(new_sdinfo.satadrv_id)) {
16627 16631 /* Enable read ahead / read cache */
16628 16632 cache_op = SATAC_SF_ENABLE_READ_AHEAD;
16629 16633 SATADBG1(SATA_DBG_DEV_SETTINGS, sata_hba_inst,
16630 16634 "enabling read cache\n", NULL);
16631 16635 } else if (!(sdinfo->satadrv_settings & SATA_DEV_READ_AHEAD) &&
16632 16636 SATA_READ_AHEAD_ENABLED(new_sdinfo.satadrv_id)) {
16633 16637 /* Disable read ahead / read cache */
16634 16638 cache_op = SATAC_SF_DISABLE_READ_AHEAD;
16635 16639 SATADBG1(SATA_DBG_DEV_SETTINGS, sata_hba_inst,
16636 16640 "disabling read cache\n", NULL);
16637 16641 }
16638 16642
16639 16643 if (cache_op != 0) {
16640 16644 /* Try to set read cache mode */
16641 16645 rval_set = sata_set_cache_mode(sata_hba_inst,
16642 16646 &new_sdinfo, cache_op);
16643 16647 if (rval != SATA_FAILURE && rval_set != SATA_SUCCESS)
16644 16648 rval = rval_set;
16645 16649 }
16646 16650 }
16647 16651
16648 16652 cache_op = 0;
16649 16653
16650 16654 if (SATA_WRITE_CACHE_SUPPORTED(new_sdinfo.satadrv_id)) {
16651 16655 if ((sdinfo->satadrv_settings & SATA_DEV_WRITE_CACHE) &&
16652 16656 !SATA_WRITE_CACHE_ENABLED(new_sdinfo.satadrv_id)) {
16653 16657 /* Enable write cache */
16654 16658 cache_op = SATAC_SF_ENABLE_WRITE_CACHE;
16655 16659 SATADBG1(SATA_DBG_DEV_SETTINGS, sata_hba_inst,
16656 16660 "enabling write cache\n", NULL);
16657 16661 } else if (!(sdinfo->satadrv_settings & SATA_DEV_WRITE_CACHE) &&
16658 16662 SATA_WRITE_CACHE_ENABLED(new_sdinfo.satadrv_id)) {
16659 16663 /* Disable write cache */
16660 16664 cache_op = SATAC_SF_DISABLE_WRITE_CACHE;
16661 16665 SATADBG1(SATA_DBG_DEV_SETTINGS, sata_hba_inst,
16662 16666 "disabling write cache\n", NULL);
16663 16667 }
16664 16668
16665 16669 if (cache_op != 0) {
16666 16670 /* Try to set write cache mode */
16667 16671 rval_set = sata_set_cache_mode(sata_hba_inst,
16668 16672 &new_sdinfo, cache_op);
16669 16673 if (rval != SATA_FAILURE && rval_set != SATA_SUCCESS)
16670 16674 rval = rval_set;
16671 16675 }
16672 16676 }
16673 16677 if (rval != SATA_SUCCESS)
16674 16678 SATA_LOG_D((sata_hba_inst, CE_WARN,
16675 16679 "%s %s", finfo, finfox));
16676 16680
16677 16681 update_sdinfo:
16678 16682 /*
16679 16683 * We need to fetch Device Identify data again
16680 16684 */
16681 16685 if (sata_fetch_device_identify_data(sata_hba_inst, &new_sdinfo) != 0) {
16682 16686 /*
16683 16687 * Cannot get device identification - retry later
16684 16688 */
16685 16689 SATA_LOG_D((sata_hba_inst, CE_WARN,
16686 16690 "%s re-fetch device identify data\n", finfo));
16687 16691 rval = SATA_FAILURE;
16688 16692 }
16689 16693 /* Copy device sata info. */
16690 16694 sdinfo->satadrv_id = new_sdinfo.satadrv_id;
16691 16695
16692 16696 return (rval);
16693 16697 }
16694 16698
16695 16699
16696 16700 /*
16697 16701 *
16698 16702 * Returns 1 if threshold exceeded, 0 if threshold not exceeded, -1 if
16699 16703 * unable to determine.
16700 16704 *
16701 16705 * Cannot be called in an interrupt context.
16702 16706 *
16703 16707 * Called by sata_build_lsense_page_2f()
16704 16708 */
16705 16709
16706 16710 static int
16707 16711 sata_fetch_smart_return_status(sata_hba_inst_t *sata_hba_inst,
16708 16712 sata_drive_info_t *sdinfo)
16709 16713 {
16710 16714 sata_pkt_t *spkt;
16711 16715 sata_cmd_t *scmd;
16712 16716 sata_pkt_txlate_t *spx;
16713 16717 int rval;
16714 16718
16715 16719 spx = kmem_zalloc(sizeof (sata_pkt_txlate_t), KM_SLEEP);
16716 16720 spx->txlt_sata_hba_inst = sata_hba_inst;
16717 16721 spx->txlt_scsi_pkt = NULL; /* No scsi pkt involved */
16718 16722 spkt = sata_pkt_alloc(spx, SLEEP_FUNC);
16719 16723 if (spkt == NULL) {
16720 16724 kmem_free(spx, sizeof (sata_pkt_txlate_t));
16721 16725 return (-1);
16722 16726 }
16723 16727 /* address is needed now */
16724 16728 spkt->satapkt_device.satadev_addr = sdinfo->satadrv_addr;
16725 16729
16726 16730
16727 16731 /* Fill sata_pkt */
16728 16732 spkt->satapkt_device.satadev_addr = sdinfo->satadrv_addr;
16729 16733 spkt->satapkt_op_mode = SATA_OPMODE_SYNCH | SATA_OPMODE_INTERRUPTS;
16730 16734 /* Synchronous mode, no callback */
16731 16735 spkt->satapkt_comp = NULL;
16732 16736 /* Timeout 30s */
16733 16737 spkt->satapkt_time = sata_default_pkt_time;
16734 16738
16735 16739 scmd = &spkt->satapkt_cmd;
16736 16740 scmd->satacmd_flags.sata_special_regs = B_TRUE;
16737 16741 scmd->satacmd_flags.sata_data_direction = SATA_DIR_NODATA_XFER;
16738 16742
16739 16743 /* Set up which registers need to be returned */
16740 16744 scmd->satacmd_flags.sata_copy_out_lba_mid_lsb = B_TRUE;
16741 16745 scmd->satacmd_flags.sata_copy_out_lba_high_lsb = B_TRUE;
16742 16746
16743 16747 /* Build SMART_RETURN_STATUS cmd in the sata_pkt */
16744 16748 scmd->satacmd_addr_type = 0; /* N/A */
16745 16749 scmd->satacmd_sec_count_lsb = 0; /* N/A */
16746 16750 scmd->satacmd_lba_low_lsb = 0; /* N/A */
16747 16751 scmd->satacmd_lba_mid_lsb = SMART_MAGIC_VAL_1;
16748 16752 scmd->satacmd_lba_high_lsb = SMART_MAGIC_VAL_2;
16749 16753 scmd->satacmd_features_reg = SATA_SMART_RETURN_STATUS;
16750 16754 scmd->satacmd_device_reg = 0; /* Always device 0 */
16751 16755 scmd->satacmd_cmd_reg = SATAC_SMART;
16752 16756 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
16753 16757 sdinfo->satadrv_addr.cport)));
16754 16758
16755 16759
16756 16760 /* Send pkt to SATA HBA driver */
16757 16761 if ((*SATA_START_FUNC(sata_hba_inst))(SATA_DIP(sata_hba_inst), spkt) !=
16758 16762 SATA_TRAN_ACCEPTED ||
16759 16763 spkt->satapkt_reason != SATA_PKT_COMPLETED) {
16760 16764 mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst,
16761 16765 sdinfo->satadrv_addr.cport)));
16762 16766 /*
16763 16767 * Whoops, no SMART RETURN STATUS
16764 16768 */
16765 16769 rval = -1;
16766 16770 } else {
16767 16771 mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst,
16768 16772 sdinfo->satadrv_addr.cport)));
16769 16773 if (scmd->satacmd_error_reg & SATA_ERROR_ABORT) {
16770 16774 rval = -1;
16771 16775 goto fail;
16772 16776 }
16773 16777 if (scmd->satacmd_status_reg & SATA_STATUS_ERR) {
16774 16778 rval = -1;
16775 16779 goto fail;
16776 16780 }
16777 16781 if ((scmd->satacmd_lba_mid_lsb == SMART_MAGIC_VAL_1) &&
16778 16782 (scmd->satacmd_lba_high_lsb == SMART_MAGIC_VAL_2))
16779 16783 rval = 0;
16780 16784 else if ((scmd->satacmd_lba_mid_lsb == SMART_MAGIC_VAL_3) &&
16781 16785 (scmd->satacmd_lba_high_lsb == SMART_MAGIC_VAL_4))
16782 16786 rval = 1;
16783 16787 else {
16784 16788 rval = -1;
16785 16789 goto fail;
16786 16790 }
16787 16791 }
16788 16792 fail:
16789 16793 /* Free allocated resources */
16790 16794 sata_pkt_free(spx);
16791 16795 kmem_free(spx, sizeof (sata_pkt_txlate_t));
16792 16796
16793 16797 return (rval);
16794 16798 }
16795 16799
16796 16800 /*
16797 16801 *
16798 16802 * Returns 0 if succeeded, -1 otherwise
16799 16803 *
16800 16804 * Cannot be called in an interrupt context.
16801 16805 *
16802 16806 */
16803 16807 static int
16804 16808 sata_fetch_smart_data(
16805 16809 sata_hba_inst_t *sata_hba_inst,
16806 16810 sata_drive_info_t *sdinfo,
16807 16811 struct smart_data *smart_data)
16808 16812 {
16809 16813 sata_pkt_t *spkt;
16810 16814 sata_cmd_t *scmd;
16811 16815 sata_pkt_txlate_t *spx;
16812 16816 int rval;
16813 16817 dev_info_t *dip = SATA_DIP(sata_hba_inst);
16814 16818
16815 16819 #if ! defined(lint)
16816 16820 ASSERT(sizeof (struct smart_data) == 512);
16817 16821 #endif
16818 16822
16819 16823 spx = kmem_zalloc(sizeof (sata_pkt_txlate_t), KM_SLEEP);
16820 16824 spx->txlt_sata_hba_inst = sata_hba_inst;
16821 16825 spx->txlt_scsi_pkt = NULL; /* No scsi pkt involved */
16822 16826 spkt = sata_pkt_alloc(spx, SLEEP_FUNC);
16823 16827 if (spkt == NULL) {
16824 16828 kmem_free(spx, sizeof (sata_pkt_txlate_t));
16825 16829 return (-1);
16826 16830 }
16827 16831 /* address is needed now */
16828 16832 spkt->satapkt_device.satadev_addr = sdinfo->satadrv_addr;
16829 16833
16830 16834
16831 16835 /* Fill sata_pkt */
16832 16836 spkt->satapkt_device.satadev_addr = sdinfo->satadrv_addr;
16833 16837 spkt->satapkt_op_mode = SATA_OPMODE_SYNCH | SATA_OPMODE_INTERRUPTS;
16834 16838 /* Synchronous mode, no callback */
16835 16839 spkt->satapkt_comp = NULL;
16836 16840 /* Timeout 30s */
16837 16841 spkt->satapkt_time = sata_default_pkt_time;
16838 16842
16839 16843 scmd = &spkt->satapkt_cmd;
16840 16844 scmd->satacmd_flags.sata_data_direction = SATA_DIR_READ;
16841 16845
16842 16846 /*
16843 16847 * Allocate buffer for SMART data
16844 16848 */
16845 16849 scmd->satacmd_bp = sata_alloc_local_buffer(spx,
16846 16850 sizeof (struct smart_data));
16847 16851 if (scmd->satacmd_bp == NULL) {
16848 16852 sata_pkt_free(spx);
16849 16853 kmem_free(spx, sizeof (sata_pkt_txlate_t));
16850 16854 SATA_LOG_D((sata_hba_inst, CE_WARN,
16851 16855 "sata_fetch_smart_data: "
16852 16856 "cannot allocate buffer"));
16853 16857 return (-1);
16854 16858 }
16855 16859
16856 16860
16857 16861 /* Build SMART_READ_DATA cmd in the sata_pkt */
16858 16862 scmd->satacmd_addr_type = 0; /* N/A */
16859 16863 scmd->satacmd_sec_count_lsb = 0; /* N/A */
16860 16864 scmd->satacmd_lba_low_lsb = 0; /* N/A */
16861 16865 scmd->satacmd_lba_mid_lsb = SMART_MAGIC_VAL_1;
16862 16866 scmd->satacmd_lba_high_lsb = SMART_MAGIC_VAL_2;
16863 16867 scmd->satacmd_features_reg = SATA_SMART_READ_DATA;
16864 16868 scmd->satacmd_device_reg = 0; /* Always device 0 */
16865 16869 scmd->satacmd_cmd_reg = SATAC_SMART;
16866 16870 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
16867 16871 sdinfo->satadrv_addr.cport)));
16868 16872
16869 16873 /* Send pkt to SATA HBA driver */
16870 16874 if ((*SATA_START_FUNC(sata_hba_inst))(SATA_DIP(sata_hba_inst), spkt) !=
16871 16875 SATA_TRAN_ACCEPTED ||
16872 16876 spkt->satapkt_reason != SATA_PKT_COMPLETED) {
16873 16877 mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst,
16874 16878 sdinfo->satadrv_addr.cport)));
16875 16879 /*
16876 16880 * Whoops, no SMART DATA available
16877 16881 */
16878 16882 rval = -1;
16879 16883 goto fail;
16880 16884 } else {
16881 16885 mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst,
16882 16886 sdinfo->satadrv_addr.cport)));
16883 16887 if (spx->txlt_buf_dma_handle != NULL) {
16884 16888 rval = ddi_dma_sync(spx->txlt_buf_dma_handle, 0, 0,
16885 16889 DDI_DMA_SYNC_FORKERNEL);
16886 16890 ASSERT(rval == DDI_SUCCESS);
16887 16891 if (sata_check_for_dma_error(dip, spx)) {
16888 16892 ddi_fm_service_impact(dip,
16889 16893 DDI_SERVICE_UNAFFECTED);
16890 16894 rval = -1;
16891 16895 goto fail;
16892 16896 }
16893 16897 }
16894 16898 bcopy(scmd->satacmd_bp->b_un.b_addr, (uint8_t *)smart_data,
16895 16899 sizeof (struct smart_data));
16896 16900 }
16897 16901
16898 16902 fail:
16899 16903 /* Free allocated resources */
16900 16904 sata_free_local_buffer(spx);
16901 16905 sata_pkt_free(spx);
16902 16906 kmem_free(spx, sizeof (sata_pkt_txlate_t));
16903 16907
16904 16908 return (rval);
16905 16909 }
16906 16910
16907 16911 /*
16908 16912 * Used by LOG SENSE page 0x10
16909 16913 * Reads (in synchronous mode) the self test log data using Read Log Ext cmd.
16910 16914 * Note: cannot be called in the interrupt context.
16911 16915 *
16912 16916 * return 0 for success, -1 otherwise
16913 16917 *
16914 16918 */
16915 16919 static int
16916 16920 sata_ext_smart_selftest_read_log(
16917 16921 sata_hba_inst_t *sata_hba_inst,
16918 16922 sata_drive_info_t *sdinfo,
16919 16923 struct smart_ext_selftest_log *ext_selftest_log,
16920 16924 uint16_t block_num)
16921 16925 {
16922 16926 sata_pkt_txlate_t *spx;
16923 16927 sata_pkt_t *spkt;
16924 16928 sata_cmd_t *scmd;
16925 16929 int rval;
16926 16930 dev_info_t *dip = SATA_DIP(sata_hba_inst);
16927 16931
16928 16932 #if ! defined(lint)
16929 16933 ASSERT(sizeof (struct smart_ext_selftest_log) == 512);
16930 16934 #endif
16931 16935
16932 16936 spx = kmem_zalloc(sizeof (sata_pkt_txlate_t), KM_SLEEP);
16933 16937 spx->txlt_sata_hba_inst = sata_hba_inst;
16934 16938 spx->txlt_scsi_pkt = NULL; /* No scsi pkt involved */
16935 16939 spkt = sata_pkt_alloc(spx, SLEEP_FUNC);
16936 16940 if (spkt == NULL) {
16937 16941 kmem_free(spx, sizeof (sata_pkt_txlate_t));
16938 16942 return (-1);
16939 16943 }
16940 16944 /* address is needed now */
16941 16945 spkt->satapkt_device.satadev_addr = sdinfo->satadrv_addr;
16942 16946
16943 16947
16944 16948 /* Fill sata_pkt */
16945 16949 spkt->satapkt_device.satadev_addr = sdinfo->satadrv_addr;
16946 16950 spkt->satapkt_op_mode = SATA_OPMODE_SYNCH | SATA_OPMODE_INTERRUPTS;
16947 16951 /* Synchronous mode, no callback */
16948 16952 spkt->satapkt_comp = NULL;
16949 16953 /* Timeout 30s */
16950 16954 spkt->satapkt_time = sata_default_pkt_time;
16951 16955
16952 16956 scmd = &spkt->satapkt_cmd;
16953 16957 scmd->satacmd_flags.sata_data_direction = SATA_DIR_READ;
16954 16958
16955 16959 /*
16956 16960 * Allocate buffer for SMART extended self-test log
16957 16961 */
16958 16962 scmd->satacmd_bp = sata_alloc_local_buffer(spx,
16959 16963 sizeof (struct smart_ext_selftest_log));
16960 16964 if (scmd->satacmd_bp == NULL) {
16961 16965 sata_pkt_free(spx);
16962 16966 kmem_free(spx, sizeof (sata_pkt_txlate_t));
16963 16967 SATA_LOG_D((sata_hba_inst, CE_WARN,
16964 16968 "sata_ext_smart_selftest_log: "
16965 16969 "cannot allocate buffer"));
16966 16970 return (-1);
16967 16971 }
16968 16972
16969 16973 /* Build READ LOG EXT w/ extended self-test log cmd in the sata_pkt */
16970 16974 scmd->satacmd_addr_type = ATA_ADDR_LBA48;
16971 16975 scmd->satacmd_sec_count_lsb = 1; /* One sector of selftest log */
16972 16976 scmd->satacmd_sec_count_msb = 0; /* One sector of selftest log */
16973 16977 scmd->satacmd_lba_low_lsb = EXT_SMART_SELFTEST_LOG_PAGE;
16974 16978 scmd->satacmd_lba_low_msb = 0;
16975 16979 scmd->satacmd_lba_mid_lsb = block_num & 0xff;
16976 16980 scmd->satacmd_lba_mid_msb = block_num >> 8;
16977 16981 scmd->satacmd_device_reg = 0; /* Always device 0 */
16978 16982 scmd->satacmd_cmd_reg = SATAC_READ_LOG_EXT;
16979 16983
16980 16984 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
16981 16985 sdinfo->satadrv_addr.cport)));
16982 16986
16983 16987 /* Send pkt to SATA HBA driver */
16984 16988 if ((*SATA_START_FUNC(sata_hba_inst))(SATA_DIP(sata_hba_inst), spkt) !=
16985 16989 SATA_TRAN_ACCEPTED ||
16986 16990 spkt->satapkt_reason != SATA_PKT_COMPLETED) {
16987 16991 mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst,
16988 16992 sdinfo->satadrv_addr.cport)));
16989 16993
16990 16994 /*
16991 16995 * Whoops, no SMART selftest log info available
16992 16996 */
16993 16997 rval = -1;
16994 16998 goto fail;
16995 16999 } else {
16996 17000 mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst,
16997 17001 sdinfo->satadrv_addr.cport)));
16998 17002
16999 17003 if (spx->txlt_buf_dma_handle != NULL) {
17000 17004 rval = ddi_dma_sync(spx->txlt_buf_dma_handle, 0, 0,
17001 17005 DDI_DMA_SYNC_FORKERNEL);
17002 17006 ASSERT(rval == DDI_SUCCESS);
17003 17007 if (sata_check_for_dma_error(dip, spx)) {
17004 17008 ddi_fm_service_impact(dip,
17005 17009 DDI_SERVICE_UNAFFECTED);
17006 17010 rval = -1;
17007 17011 goto fail;
17008 17012 }
17009 17013 }
17010 17014 bcopy(scmd->satacmd_bp->b_un.b_addr,
17011 17015 (uint8_t *)ext_selftest_log,
17012 17016 sizeof (struct smart_ext_selftest_log));
17013 17017 rval = 0;
17014 17018 }
17015 17019
17016 17020 fail:
17017 17021 /* Free allocated resources */
17018 17022 sata_free_local_buffer(spx);
17019 17023 sata_pkt_free(spx);
17020 17024 kmem_free(spx, sizeof (sata_pkt_txlate_t));
17021 17025
17022 17026 return (rval);
17023 17027 }
17024 17028
17025 17029 /*
17026 17030 * Returns 0 for success, -1 otherwise
17027 17031 *
17028 17032 * SMART self-test log data is returned in buffer pointed to by selftest_log
17029 17033 */
17030 17034 static int
17031 17035 sata_smart_selftest_log(
17032 17036 sata_hba_inst_t *sata_hba_inst,
17033 17037 sata_drive_info_t *sdinfo,
17034 17038 struct smart_selftest_log *selftest_log)
17035 17039 {
17036 17040 sata_pkt_t *spkt;
17037 17041 sata_cmd_t *scmd;
17038 17042 sata_pkt_txlate_t *spx;
17039 17043 int rval;
17040 17044 dev_info_t *dip = SATA_DIP(sata_hba_inst);
17041 17045
17042 17046 #if ! defined(lint)
17043 17047 ASSERT(sizeof (struct smart_selftest_log) == 512);
17044 17048 #endif
17045 17049
17046 17050 spx = kmem_zalloc(sizeof (sata_pkt_txlate_t), KM_SLEEP);
17047 17051 spx->txlt_sata_hba_inst = sata_hba_inst;
17048 17052 spx->txlt_scsi_pkt = NULL; /* No scsi pkt involved */
17049 17053 spkt = sata_pkt_alloc(spx, SLEEP_FUNC);
17050 17054 if (spkt == NULL) {
17051 17055 kmem_free(spx, sizeof (sata_pkt_txlate_t));
17052 17056 return (-1);
17053 17057 }
17054 17058 /* address is needed now */
17055 17059 spkt->satapkt_device.satadev_addr = sdinfo->satadrv_addr;
17056 17060
17057 17061
17058 17062 /* Fill sata_pkt */
17059 17063 spkt->satapkt_device.satadev_addr = sdinfo->satadrv_addr;
17060 17064 spkt->satapkt_op_mode = SATA_OPMODE_SYNCH | SATA_OPMODE_INTERRUPTS;
17061 17065 /* Synchronous mode, no callback */
17062 17066 spkt->satapkt_comp = NULL;
17063 17067 /* Timeout 30s */
17064 17068 spkt->satapkt_time = sata_default_pkt_time;
17065 17069
17066 17070 scmd = &spkt->satapkt_cmd;
17067 17071 scmd->satacmd_flags.sata_data_direction = SATA_DIR_READ;
17068 17072
17069 17073 /*
17070 17074 * Allocate buffer for SMART SELFTEST LOG
17071 17075 */
17072 17076 scmd->satacmd_bp = sata_alloc_local_buffer(spx,
17073 17077 sizeof (struct smart_selftest_log));
17074 17078 if (scmd->satacmd_bp == NULL) {
17075 17079 sata_pkt_free(spx);
17076 17080 kmem_free(spx, sizeof (sata_pkt_txlate_t));
17077 17081 SATA_LOG_D((sata_hba_inst, CE_WARN,
17078 17082 "sata_smart_selftest_log: "
17079 17083 "cannot allocate buffer"));
17080 17084 return (-1);
17081 17085 }
17082 17086
17083 17087 /* Build SMART_READ_LOG cmd in the sata_pkt */
17084 17088 scmd->satacmd_addr_type = 0; /* N/A */
17085 17089 scmd->satacmd_sec_count_lsb = 1; /* One sector of SMART log */
17086 17090 scmd->satacmd_lba_low_lsb = SMART_SELFTEST_LOG_PAGE;
17087 17091 scmd->satacmd_lba_mid_lsb = SMART_MAGIC_VAL_1;
17088 17092 scmd->satacmd_lba_high_lsb = SMART_MAGIC_VAL_2;
17089 17093 scmd->satacmd_features_reg = SATA_SMART_READ_LOG;
17090 17094 scmd->satacmd_device_reg = 0; /* Always device 0 */
17091 17095 scmd->satacmd_cmd_reg = SATAC_SMART;
17092 17096 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
17093 17097 sdinfo->satadrv_addr.cport)));
17094 17098
17095 17099 /* Send pkt to SATA HBA driver */
17096 17100 if ((*SATA_START_FUNC(sata_hba_inst))(SATA_DIP(sata_hba_inst), spkt) !=
17097 17101 SATA_TRAN_ACCEPTED ||
17098 17102 spkt->satapkt_reason != SATA_PKT_COMPLETED) {
17099 17103 mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst,
17100 17104 sdinfo->satadrv_addr.cport)));
17101 17105 /*
17102 17106 * Whoops, no SMART DATA available
17103 17107 */
17104 17108 rval = -1;
17105 17109 goto fail;
17106 17110 } else {
17107 17111 mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst,
17108 17112 sdinfo->satadrv_addr.cport)));
17109 17113 if (spx->txlt_buf_dma_handle != NULL) {
17110 17114 rval = ddi_dma_sync(spx->txlt_buf_dma_handle, 0, 0,
17111 17115 DDI_DMA_SYNC_FORKERNEL);
17112 17116 ASSERT(rval == DDI_SUCCESS);
17113 17117 if (sata_check_for_dma_error(dip, spx)) {
17114 17118 ddi_fm_service_impact(dip,
17115 17119 DDI_SERVICE_UNAFFECTED);
17116 17120 rval = -1;
17117 17121 goto fail;
17118 17122 }
17119 17123 }
17120 17124 bcopy(scmd->satacmd_bp->b_un.b_addr, (uint8_t *)selftest_log,
17121 17125 sizeof (struct smart_selftest_log));
17122 17126 rval = 0;
17123 17127 }
17124 17128
17125 17129 fail:
17126 17130 /* Free allocated resources */
17127 17131 sata_free_local_buffer(spx);
17128 17132 sata_pkt_free(spx);
17129 17133 kmem_free(spx, sizeof (sata_pkt_txlate_t));
17130 17134
17131 17135 return (rval);
17132 17136 }
17133 17137
17134 17138
17135 17139 /*
17136 17140 * Returns 0 for success, -1 otherwise
17137 17141 *
17138 17142 * SMART READ LOG data is returned in buffer pointed to by smart_log
17139 17143 */
17140 17144 static int
17141 17145 sata_smart_read_log(
17142 17146 sata_hba_inst_t *sata_hba_inst,
17143 17147 sata_drive_info_t *sdinfo,
17144 17148 uint8_t *smart_log, /* where the data should be returned */
17145 17149 uint8_t which_log, /* which log should be returned */
17146 17150 uint8_t log_size) /* # of 512 bytes in log */
17147 17151 {
17148 17152 sata_pkt_t *spkt;
17149 17153 sata_cmd_t *scmd;
17150 17154 sata_pkt_txlate_t *spx;
17151 17155 int rval;
17152 17156 dev_info_t *dip = SATA_DIP(sata_hba_inst);
17153 17157
17154 17158 spx = kmem_zalloc(sizeof (sata_pkt_txlate_t), KM_SLEEP);
17155 17159 spx->txlt_sata_hba_inst = sata_hba_inst;
17156 17160 spx->txlt_scsi_pkt = NULL; /* No scsi pkt involved */
17157 17161 spkt = sata_pkt_alloc(spx, SLEEP_FUNC);
17158 17162 if (spkt == NULL) {
17159 17163 kmem_free(spx, sizeof (sata_pkt_txlate_t));
17160 17164 return (-1);
17161 17165 }
17162 17166 /* address is needed now */
17163 17167 spkt->satapkt_device.satadev_addr = sdinfo->satadrv_addr;
17164 17168
17165 17169
17166 17170 /* Fill sata_pkt */
17167 17171 spkt->satapkt_device.satadev_addr = sdinfo->satadrv_addr;
17168 17172 spkt->satapkt_op_mode = SATA_OPMODE_SYNCH | SATA_OPMODE_INTERRUPTS;
17169 17173 /* Synchronous mode, no callback */
17170 17174 spkt->satapkt_comp = NULL;
17171 17175 /* Timeout 30s */
17172 17176 spkt->satapkt_time = sata_default_pkt_time;
17173 17177
17174 17178 scmd = &spkt->satapkt_cmd;
17175 17179 scmd->satacmd_flags.sata_data_direction = SATA_DIR_READ;
17176 17180
17177 17181 /*
17178 17182 * Allocate buffer for SMART READ LOG
17179 17183 */
17180 17184 scmd->satacmd_bp = sata_alloc_local_buffer(spx, log_size * 512);
17181 17185 if (scmd->satacmd_bp == NULL) {
17182 17186 sata_pkt_free(spx);
17183 17187 kmem_free(spx, sizeof (sata_pkt_txlate_t));
17184 17188 SATA_LOG_D((sata_hba_inst, CE_WARN,
17185 17189 "sata_smart_read_log: " "cannot allocate buffer"));
17186 17190 return (-1);
17187 17191 }
17188 17192
17189 17193 /* Build SMART_READ_LOG cmd in the sata_pkt */
17190 17194 scmd->satacmd_addr_type = 0; /* N/A */
17191 17195 scmd->satacmd_sec_count_lsb = log_size; /* what the caller asked for */
17192 17196 scmd->satacmd_lba_low_lsb = which_log; /* which log page */
17193 17197 scmd->satacmd_lba_mid_lsb = SMART_MAGIC_VAL_1;
17194 17198 scmd->satacmd_lba_high_lsb = SMART_MAGIC_VAL_2;
17195 17199 scmd->satacmd_features_reg = SATA_SMART_READ_LOG;
17196 17200 scmd->satacmd_device_reg = 0; /* Always device 0 */
17197 17201 scmd->satacmd_cmd_reg = SATAC_SMART;
17198 17202
17199 17203 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
17200 17204 sdinfo->satadrv_addr.cport)));
17201 17205
17202 17206 /* Send pkt to SATA HBA driver */
17203 17207 if ((*SATA_START_FUNC(sata_hba_inst))(SATA_DIP(sata_hba_inst), spkt) !=
17204 17208 SATA_TRAN_ACCEPTED ||
17205 17209 spkt->satapkt_reason != SATA_PKT_COMPLETED) {
17206 17210 mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst,
17207 17211 sdinfo->satadrv_addr.cport)));
17208 17212
17209 17213 /*
17210 17214 * Whoops, no SMART DATA available
17211 17215 */
17212 17216 rval = -1;
17213 17217 goto fail;
17214 17218 } else {
17215 17219 mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst,
17216 17220 sdinfo->satadrv_addr.cport)));
17217 17221
17218 17222 if (spx->txlt_buf_dma_handle != NULL) {
17219 17223 rval = ddi_dma_sync(spx->txlt_buf_dma_handle, 0, 0,
17220 17224 DDI_DMA_SYNC_FORKERNEL);
17221 17225 ASSERT(rval == DDI_SUCCESS);
17222 17226 if (sata_check_for_dma_error(dip, spx)) {
17223 17227 ddi_fm_service_impact(dip,
17224 17228 DDI_SERVICE_UNAFFECTED);
17225 17229 rval = -1;
17226 17230 goto fail;
17227 17231 }
17228 17232 }
17229 17233 bcopy(scmd->satacmd_bp->b_un.b_addr, smart_log, log_size * 512);
17230 17234 rval = 0;
17231 17235 }
17232 17236
17233 17237 fail:
17234 17238 /* Free allocated resources */
17235 17239 sata_free_local_buffer(spx);
17236 17240 sata_pkt_free(spx);
17237 17241 kmem_free(spx, sizeof (sata_pkt_txlate_t));
17238 17242
17239 17243 return (rval);
17240 17244 }
17241 17245
17242 17246 /*
17243 17247 * Used by LOG SENSE page 0x10
17244 17248 *
17245 17249 * return 0 for success, -1 otherwise
17246 17250 *
17247 17251 */
17248 17252 static int
17249 17253 sata_read_log_ext_directory(
17250 17254 sata_hba_inst_t *sata_hba_inst,
17251 17255 sata_drive_info_t *sdinfo,
17252 17256 struct read_log_ext_directory *logdir)
17253 17257 {
17254 17258 sata_pkt_txlate_t *spx;
17255 17259 sata_pkt_t *spkt;
17256 17260 sata_cmd_t *scmd;
17257 17261 int rval;
17258 17262 dev_info_t *dip = SATA_DIP(sata_hba_inst);
17259 17263
17260 17264 #if ! defined(lint)
17261 17265 ASSERT(sizeof (struct read_log_ext_directory) == 512);
17262 17266 #endif
17263 17267
17264 17268 spx = kmem_zalloc(sizeof (sata_pkt_txlate_t), KM_SLEEP);
17265 17269 spx->txlt_sata_hba_inst = sata_hba_inst;
17266 17270 spx->txlt_scsi_pkt = NULL; /* No scsi pkt involved */
17267 17271 spkt = sata_pkt_alloc(spx, SLEEP_FUNC);
17268 17272 if (spkt == NULL) {
17269 17273 kmem_free(spx, sizeof (sata_pkt_txlate_t));
17270 17274 return (-1);
17271 17275 }
17272 17276
17273 17277 /* Fill sata_pkt */
17274 17278 spkt->satapkt_device.satadev_addr = sdinfo->satadrv_addr;
17275 17279 spkt->satapkt_op_mode = SATA_OPMODE_SYNCH | SATA_OPMODE_INTERRUPTS;
17276 17280 /* Synchronous mode, no callback */
17277 17281 spkt->satapkt_comp = NULL;
17278 17282 /* Timeout 30s */
17279 17283 spkt->satapkt_time = sata_default_pkt_time;
17280 17284
17281 17285 scmd = &spkt->satapkt_cmd;
17282 17286 scmd->satacmd_flags.sata_data_direction = SATA_DIR_READ;
17283 17287
17284 17288 /*
17285 17289 * Allocate buffer for SMART READ LOG EXTENDED command
17286 17290 */
17287 17291 scmd->satacmd_bp = sata_alloc_local_buffer(spx,
17288 17292 sizeof (struct read_log_ext_directory));
17289 17293 if (scmd->satacmd_bp == NULL) {
17290 17294 sata_pkt_free(spx);
17291 17295 kmem_free(spx, sizeof (sata_pkt_txlate_t));
17292 17296 SATA_LOG_D((sata_hba_inst, CE_WARN,
17293 17297 "sata_read_log_ext_directory: "
17294 17298 "cannot allocate buffer"));
17295 17299 return (-1);
17296 17300 }
17297 17301
17298 17302 /* Build READ LOG EXT w/ log directory cmd in the sata_pkt */
17299 17303 scmd->satacmd_addr_type = ATA_ADDR_LBA48;
17300 17304 scmd->satacmd_sec_count_lsb = 1; /* One sector of directory */
17301 17305 scmd->satacmd_sec_count_msb = 0; /* One sector of directory */
17302 17306 scmd->satacmd_lba_low_lsb = READ_LOG_EXT_LOG_DIRECTORY;
17303 17307 scmd->satacmd_lba_low_msb = 0;
17304 17308 scmd->satacmd_lba_mid_lsb = 0;
17305 17309 scmd->satacmd_lba_mid_msb = 0;
17306 17310 scmd->satacmd_device_reg = 0; /* Always device 0 */
17307 17311 scmd->satacmd_cmd_reg = SATAC_READ_LOG_EXT;
17308 17312
17309 17313 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
17310 17314 sdinfo->satadrv_addr.cport)));
17311 17315
17312 17316 /* Send pkt to SATA HBA driver */
17313 17317 if ((*SATA_START_FUNC(sata_hba_inst))(SATA_DIP(sata_hba_inst), spkt) !=
17314 17318 SATA_TRAN_ACCEPTED ||
17315 17319 spkt->satapkt_reason != SATA_PKT_COMPLETED) {
17316 17320 mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst,
17317 17321 sdinfo->satadrv_addr.cport)));
17318 17322 /*
17319 17323 * Whoops, no SMART selftest log info available
17320 17324 */
17321 17325 rval = -1;
17322 17326 goto fail;
17323 17327 } else {
17324 17328 mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst,
17325 17329 sdinfo->satadrv_addr.cport)));
17326 17330 if (spx->txlt_buf_dma_handle != NULL) {
17327 17331 rval = ddi_dma_sync(spx->txlt_buf_dma_handle, 0, 0,
17328 17332 DDI_DMA_SYNC_FORKERNEL);
17329 17333 ASSERT(rval == DDI_SUCCESS);
17330 17334 if (sata_check_for_dma_error(dip, spx)) {
17331 17335 ddi_fm_service_impact(dip,
17332 17336 DDI_SERVICE_UNAFFECTED);
17333 17337 rval = -1;
17334 17338 goto fail;
17335 17339 }
17336 17340 }
17337 17341 bcopy(scmd->satacmd_bp->b_un.b_addr, (uint8_t *)logdir,
17338 17342 sizeof (struct read_log_ext_directory));
17339 17343 rval = 0;
17340 17344 }
17341 17345
17342 17346 fail:
17343 17347 /* Free allocated resources */
17344 17348 sata_free_local_buffer(spx);
17345 17349 sata_pkt_free(spx);
17346 17350 kmem_free(spx, sizeof (sata_pkt_txlate_t));
17347 17351
17348 17352 return (rval);
17349 17353 }
17350 17354
17351 17355 /*
17352 17356 * Set up error retrieval sata command for NCQ command error data
17353 17357 * recovery.
17354 17358 *
17355 17359 * Returns SATA_SUCCESS when data buffer is allocated and packet set-up,
17356 17360 * returns SATA_FAILURE otherwise.
17357 17361 */
17358 17362 static int
17359 17363 sata_ncq_err_ret_cmd_setup(sata_pkt_txlate_t *spx, sata_drive_info_t *sdinfo)
17360 17364 {
17361 17365 #ifndef __lock_lint
17362 17366 _NOTE(ARGUNUSED(sdinfo))
17363 17367 #endif
17364 17368
17365 17369 sata_pkt_t *spkt = spx->txlt_sata_pkt;
17366 17370 sata_cmd_t *scmd;
17367 17371 struct buf *bp;
17368 17372
17369 17373 /* Operation modes are up to the caller */
17370 17374 spkt->satapkt_op_mode = SATA_OPMODE_SYNCH | SATA_OPMODE_INTERRUPTS;
17371 17375
17372 17376 /* Synchronous mode, no callback - may be changed by the caller */
17373 17377 spkt->satapkt_comp = NULL;
17374 17378 spkt->satapkt_time = sata_default_pkt_time;
17375 17379
17376 17380 scmd = &spkt->satapkt_cmd;
17377 17381 bcopy(&sata_rle_cmd, scmd, sizeof (sata_cmd_t));
17378 17382 scmd->satacmd_flags.sata_ignore_dev_reset = B_TRUE;
17379 17383
17380 17384 /*
17381 17385 * Allocate dma_able buffer error data.
17382 17386 * Buffer allocation will take care of buffer alignment and other DMA
17383 17387 * attributes.
17384 17388 */
17385 17389 bp = sata_alloc_local_buffer(spx,
17386 17390 sizeof (struct sata_ncq_error_recovery_page));
17387 17391 if (bp == NULL)
17388 17392 return (SATA_FAILURE);
17389 17393
17390 17394 bp_mapin(bp); /* make data buffer accessible */
17391 17395 scmd->satacmd_bp = bp;
17392 17396
17393 17397 /*
17394 17398 * Set-up pointer to the buffer handle, so HBA can sync buffer
17395 17399 * before accessing it. Handle is in usual place in translate struct.
17396 17400 */
17397 17401 scmd->satacmd_err_ret_buf_handle = &spx->txlt_buf_dma_handle;
17398 17402
17399 17403 ASSERT(scmd->satacmd_num_dma_cookies != 0);
17400 17404 ASSERT(scmd->satacmd_dma_cookie_list != NULL);
17401 17405
17402 17406 return (SATA_SUCCESS);
17403 17407 }
17404 17408
17405 17409 /*
17406 17410 * sata_xlate_errors() is used to translate (S)ATA error
17407 17411 * information to SCSI information returned in the SCSI
17408 17412 * packet.
17409 17413 */
17410 17414 static void
17411 17415 sata_xlate_errors(sata_pkt_txlate_t *spx)
17412 17416 {
17413 17417 struct scsi_pkt *scsipkt = spx->txlt_scsi_pkt;
17414 17418 struct scsi_extended_sense *sense;
17415 17419
17416 17420 scsipkt->pkt_reason = CMD_INCOMPLETE;
17417 17421 *scsipkt->pkt_scbp = STATUS_CHECK;
17418 17422 sense = sata_arq_sense(spx);
17419 17423
17420 17424 switch (spx->txlt_sata_pkt->satapkt_reason) {
17421 17425 case SATA_PKT_PORT_ERROR:
17422 17426 /*
17423 17427 * We have no device data. Assume no data transfered.
17424 17428 */
17425 17429 sense->es_key = KEY_HARDWARE_ERROR;
17426 17430 break;
17427 17431
17428 17432 case SATA_PKT_DEV_ERROR:
17429 17433 if (spx->txlt_sata_pkt->satapkt_cmd.satacmd_status_reg &
17430 17434 SATA_STATUS_ERR) {
17431 17435 /*
17432 17436 * determine dev error reason from error
17433 17437 * reg content
17434 17438 */
17435 17439 sata_decode_device_error(spx, sense);
17436 17440 break;
17437 17441 }
17438 17442 /* No extended sense key - no info available */
17439 17443 break;
17440 17444
17441 17445 case SATA_PKT_TIMEOUT:
17442 17446 scsipkt->pkt_reason = CMD_TIMEOUT;
17443 17447 scsipkt->pkt_statistics |= STAT_TIMEOUT | STAT_DEV_RESET;
17444 17448 /* No extended sense key */
17445 17449 break;
17446 17450
17447 17451 case SATA_PKT_ABORTED:
17448 17452 scsipkt->pkt_reason = CMD_ABORTED;
17449 17453 scsipkt->pkt_statistics |= STAT_ABORTED;
17450 17454 /* No extended sense key */
17451 17455 break;
17452 17456
17453 17457 case SATA_PKT_RESET:
17454 17458 /*
17455 17459 * pkt aborted either by an explicit reset request from
17456 17460 * a host, or due to error recovery
17457 17461 */
17458 17462 scsipkt->pkt_reason = CMD_RESET;
17459 17463 scsipkt->pkt_statistics |= STAT_DEV_RESET;
17460 17464 break;
17461 17465
17462 17466 default:
17463 17467 scsipkt->pkt_reason = CMD_TRAN_ERR;
17464 17468 break;
17465 17469 }
17466 17470 }
17467 17471
17468 17472
17469 17473
17470 17474
17471 17475 /*
17472 17476 * Log sata message
17473 17477 * dev pathname msg line preceeds the logged message.
17474 17478 */
17475 17479
17476 17480 static void
17477 17481 sata_log(sata_hba_inst_t *sata_hba_inst, uint_t level, char *fmt, ...)
17478 17482 {
17479 17483 char pathname[128];
17480 17484 dev_info_t *dip = NULL;
17481 17485 va_list ap;
17482 17486
17483 17487 mutex_enter(&sata_log_mutex);
17484 17488
17485 17489 va_start(ap, fmt);
17486 17490 (void) vsprintf(sata_log_buf, fmt, ap);
17487 17491 va_end(ap);
17488 17492
17489 17493 if (sata_hba_inst != NULL) {
17490 17494 dip = SATA_DIP(sata_hba_inst);
17491 17495 (void) ddi_pathname(dip, pathname);
17492 17496 } else {
17493 17497 pathname[0] = 0;
17494 17498 }
17495 17499 if (level == CE_CONT) {
17496 17500 if (sata_debug_flags == 0)
17497 17501 cmn_err(level, "?%s:\n %s\n", pathname, sata_log_buf);
17498 17502 else
17499 17503 cmn_err(level, "%s:\n %s\n", pathname, sata_log_buf);
17500 17504 } else {
17501 17505 if (level != CE_NOTE) {
17502 17506 cmn_err(level, "%s:\n %s", pathname, sata_log_buf);
17503 17507 } else if (sata_msg) {
17504 17508 cmn_err(level, "%s:\n %s", pathname,
17505 17509 sata_log_buf);
17506 17510 }
17507 17511 }
17508 17512
17509 17513 /* sata trace debug */
17510 17514 sata_trace_debug(dip, sata_log_buf);
17511 17515
17512 17516 mutex_exit(&sata_log_mutex);
17513 17517 }
17514 17518
17515 17519
17516 17520 /* ******** Asynchronous HBA events handling & hotplugging support ******** */
17517 17521
17518 17522 /*
17519 17523 * Start or terminate the thread, depending on flag arg and current state
17520 17524 */
17521 17525 static void
17522 17526 sata_event_thread_control(int startstop)
17523 17527 {
17524 17528 static int sata_event_thread_terminating = 0;
17525 17529 static int sata_event_thread_starting = 0;
17526 17530 int i;
17527 17531
17528 17532 mutex_enter(&sata_event_mutex);
17529 17533
17530 17534 if (startstop == 0 && (sata_event_thread_starting == 1 ||
17531 17535 sata_event_thread_terminating == 1)) {
17532 17536 mutex_exit(&sata_event_mutex);
17533 17537 return;
17534 17538 }
17535 17539 if (startstop == 1 && sata_event_thread_starting == 1) {
17536 17540 mutex_exit(&sata_event_mutex);
17537 17541 return;
17538 17542 }
17539 17543 if (startstop == 1 && sata_event_thread_terminating == 1) {
17540 17544 sata_event_thread_starting = 1;
17541 17545 /* wait til terminate operation completes */
17542 17546 i = SATA_EVNT_DAEMON_TERM_WAIT/SATA_EVNT_DAEMON_TERM_TIMEOUT;
17543 17547 while (sata_event_thread_terminating == 1) {
17544 17548 if (i-- <= 0) {
17545 17549 sata_event_thread_starting = 0;
17546 17550 mutex_exit(&sata_event_mutex);
17547 17551 #ifdef SATA_DEBUG
17548 17552 cmn_err(CE_WARN, "sata_event_thread_control: "
17549 17553 "timeout waiting for thread to terminate");
17550 17554 #endif
17551 17555 return;
17552 17556 }
17553 17557 mutex_exit(&sata_event_mutex);
17554 17558 delay(drv_usectohz(SATA_EVNT_DAEMON_TERM_TIMEOUT));
17555 17559 mutex_enter(&sata_event_mutex);
17556 17560 }
17557 17561 }
17558 17562 if (startstop == 1) {
17559 17563 if (sata_event_thread == NULL) {
17560 17564 sata_event_thread = thread_create(NULL, 0,
17561 17565 (void (*)())sata_event_daemon,
17562 17566 &sata_hba_list, 0, &p0, TS_RUN, minclsyspri);
17563 17567 }
17564 17568 sata_event_thread_starting = 0;
17565 17569 mutex_exit(&sata_event_mutex);
17566 17570 return;
17567 17571 }
17568 17572
17569 17573 /*
17570 17574 * If we got here, thread may need to be terminated
17571 17575 */
17572 17576 if (sata_event_thread != NULL) {
17573 17577 int i;
17574 17578 /* Signal event thread to go away */
17575 17579 sata_event_thread_terminating = 1;
17576 17580 sata_event_thread_terminate = 1;
17577 17581 cv_signal(&sata_event_cv);
17578 17582 /*
17579 17583 * Wait til daemon terminates.
17580 17584 */
17581 17585 i = SATA_EVNT_DAEMON_TERM_WAIT/SATA_EVNT_DAEMON_TERM_TIMEOUT;
17582 17586 while (sata_event_thread_terminate == 1) {
17583 17587 mutex_exit(&sata_event_mutex);
17584 17588 if (i-- <= 0) {
17585 17589 /* Daemon did not go away !!! */
17586 17590 #ifdef SATA_DEBUG
17587 17591 cmn_err(CE_WARN, "sata_event_thread_control: "
17588 17592 "cannot terminate event daemon thread");
17589 17593 #endif
17590 17594 mutex_enter(&sata_event_mutex);
17591 17595 break;
17592 17596 }
17593 17597 delay(drv_usectohz(SATA_EVNT_DAEMON_TERM_TIMEOUT));
17594 17598 mutex_enter(&sata_event_mutex);
17595 17599 }
17596 17600 sata_event_thread_terminating = 0;
17597 17601 }
17598 17602 ASSERT(sata_event_thread_terminating == 0);
17599 17603 ASSERT(sata_event_thread_starting == 0);
17600 17604 mutex_exit(&sata_event_mutex);
17601 17605 }
17602 17606
17603 17607
17604 17608 /*
17605 17609 * SATA HBA event notification function.
17606 17610 * Events reported by SATA HBA drivers per HBA instance relate to a change in
17607 17611 * a port and/or device state or a controller itself.
17608 17612 * Events for different addresses/addr types cannot be combined.
17609 17613 * A warning message is generated for each event type.
17610 17614 * Events are not processed by this function, so only the
17611 17615 * event flag(s)is set for an affected entity and the event thread is
17612 17616 * waken up. Event daemon thread processes all events.
17613 17617 *
17614 17618 * NOTE: Since more than one event may be reported at the same time, one
17615 17619 * cannot determine a sequence of events when opposite event are reported, eg.
17616 17620 * LINK_LOST and LINK_ESTABLISHED. Actual port status during event processing
17617 17621 * is taking precedence over reported events, i.e. may cause ignoring some
17618 17622 * events.
17619 17623 */
17620 17624 #define SATA_EVENT_MAX_MSG_LENGTH 79
17621 17625
17622 17626 void
17623 17627 sata_hba_event_notify(dev_info_t *dip, sata_device_t *sata_device, int event)
17624 17628 {
17625 17629 sata_hba_inst_t *sata_hba_inst = NULL;
17626 17630 sata_address_t *saddr;
17627 17631 sata_pmult_info_t *pmultinfo;
17628 17632 sata_drive_info_t *sdinfo;
17629 17633 sata_port_stats_t *pstats;
17630 17634 sata_cport_info_t *cportinfo;
17631 17635 sata_pmport_info_t *pmportinfo;
17632 17636 int cport, pmport;
17633 17637 char buf1[SATA_EVENT_MAX_MSG_LENGTH + 1];
17634 17638 char buf2[SATA_EVENT_MAX_MSG_LENGTH + 1];
17635 17639 char *lcp;
17636 17640 static char *err_msg_evnt_1 =
17637 17641 "sata_hba_event_notify: invalid port event 0x%x ";
17638 17642 static char *err_msg_evnt_2 =
17639 17643 "sata_hba_event_notify: invalid device event 0x%x ";
17640 17644 int linkevent;
17641 17645
17642 17646 /*
17643 17647 * There is a possibility that an event will be generated on HBA
17644 17648 * that has not completed attachment or is detaching. We still want
17645 17649 * to process events until HBA is detached.
17646 17650 */
17647 17651 mutex_enter(&sata_mutex);
17648 17652 for (sata_hba_inst = sata_hba_list; sata_hba_inst != NULL;
17649 17653 sata_hba_inst = sata_hba_inst->satahba_next) {
17650 17654 if (SATA_DIP(sata_hba_inst) == dip)
17651 17655 if (sata_hba_inst->satahba_attached == 1)
17652 17656 break;
17653 17657 }
17654 17658 mutex_exit(&sata_mutex);
17655 17659 if (sata_hba_inst == NULL)
17656 17660 /* HBA not attached */
17657 17661 return;
17658 17662
17659 17663 ASSERT(sata_device != NULL);
17660 17664
17661 17665 /*
17662 17666 * Validate address before - do not proceed with invalid address.
17663 17667 */
17664 17668 saddr = &sata_device->satadev_addr;
17665 17669 if (saddr->cport >= SATA_NUM_CPORTS(sata_hba_inst))
17666 17670 return;
17667 17671
17668 17672 cport = saddr->cport;
17669 17673 pmport = saddr->pmport;
17670 17674
17671 17675 buf1[0] = buf2[0] = '\0';
17672 17676
17673 17677 /*
17674 17678 * If event relates to port or device, check port state.
17675 17679 * Port has to be initialized, or we cannot accept an event.
17676 17680 */
17677 17681 if ((saddr->qual & (SATA_ADDR_CPORT | SATA_ADDR_PMPORT |
17678 17682 SATA_ADDR_DCPORT | SATA_ADDR_DPMPORT | SATA_ADDR_PMULT)) != 0) {
17679 17683 mutex_enter(&sata_hba_inst->satahba_mutex);
17680 17684 cportinfo = SATA_CPORT_INFO(sata_hba_inst, cport);
17681 17685 mutex_exit(&sata_hba_inst->satahba_mutex);
17682 17686 if (cportinfo == NULL || cportinfo->cport_state == 0)
17683 17687 return;
17684 17688 }
17685 17689
17686 17690 if ((saddr->qual & (SATA_ADDR_PMULT | SATA_ADDR_PMPORT |
17687 17691 SATA_ADDR_DPMPORT)) != 0) {
17688 17692 if (cportinfo->cport_dev_type != SATA_DTYPE_PMULT) {
17689 17693 SATA_LOG_D((sata_hba_inst, CE_WARN,
17690 17694 "sata_hba_event_notify: Non-pmult device (0x%x)"
17691 17695 "is attached to port %d, ignore pmult/pmport "
17692 17696 "event 0x%x", cportinfo->cport_dev_type,
17693 17697 cport, event));
17694 17698 return;
17695 17699 }
17696 17700
17697 17701 mutex_enter(&cportinfo->cport_mutex);
17698 17702 pmultinfo = SATA_PMULT_INFO(sata_hba_inst, cport);
17699 17703 mutex_exit(&cportinfo->cport_mutex);
17700 17704
17701 17705 /*
17702 17706 * The daemon might be processing attachment of port
17703 17707 * multiplier, in that case we should ignore events on its
17704 17708 * sub-devices.
17705 17709 *
17706 17710 * NOTE: Only pmult_state is checked in sata_hba_event_notify.
17707 17711 * The pmport_state is checked by sata daemon.
17708 17712 */
17709 17713 if (pmultinfo == NULL ||
17710 17714 pmultinfo->pmult_state == SATA_STATE_UNKNOWN) {
17711 17715 SATA_LOG_D((sata_hba_inst, CE_WARN,
17712 17716 "sata_hba_event_notify: pmult is not"
17713 17717 "available at port %d:%d, ignore event 0x%x",
17714 17718 cport, pmport, event));
17715 17719 return;
17716 17720 }
17717 17721 }
17718 17722
17719 17723 if ((saddr->qual &
17720 17724 (SATA_ADDR_PMPORT | SATA_ADDR_DPMPORT)) != 0) {
17721 17725
17722 17726 mutex_enter(&cportinfo->cport_mutex);
17723 17727 if (pmport > SATA_NUM_PMPORTS(sata_hba_inst, cport)) {
17724 17728 SATA_LOG_D((sata_hba_inst, CE_WARN,
17725 17729 "sata_hba_event_notify: invalid/"
17726 17730 "un-implemented port %d:%d (%d ports), "
17727 17731 "ignore event 0x%x", cport, pmport,
17728 17732 SATA_NUM_PMPORTS(sata_hba_inst, cport), event));
17729 17733 mutex_exit(&cportinfo->cport_mutex);
17730 17734 return;
17731 17735 }
17732 17736 mutex_exit(&cportinfo->cport_mutex);
17733 17737
17734 17738 mutex_enter(&sata_hba_inst->satahba_mutex);
17735 17739 pmportinfo = SATA_PMPORT_INFO(sata_hba_inst,
17736 17740 cport, pmport);
17737 17741 mutex_exit(&sata_hba_inst->satahba_mutex);
17738 17742
17739 17743 /* pmport is implemented/valid? */
17740 17744 if (pmportinfo == NULL) {
17741 17745 SATA_LOG_D((sata_hba_inst, CE_WARN,
17742 17746 "sata_hba_event_notify: invalid/"
17743 17747 "un-implemented port %d:%d, ignore "
17744 17748 "event 0x%x", cport, pmport, event));
17745 17749 return;
17746 17750 }
17747 17751 }
17748 17752
17749 17753 /*
17750 17754 * Events refer to devices, ports and controllers - each has
17751 17755 * unique address. Events for different addresses cannot be combined.
17752 17756 */
17753 17757 if (saddr->qual & (SATA_ADDR_CPORT | SATA_ADDR_PMPORT)) {
17754 17758
17755 17759 mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst, cport)));
17756 17760
17757 17761 /* qualify this event(s) */
17758 17762 if ((event & SATA_EVNT_PORT_EVENTS) == 0) {
17759 17763 /* Invalid event for the device port */
17760 17764 (void) sprintf(buf2, err_msg_evnt_1,
17761 17765 event & SATA_EVNT_PORT_EVENTS);
17762 17766 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst, cport)));
17763 17767 goto event_info;
17764 17768 }
17765 17769 if (saddr->qual == SATA_ADDR_CPORT) {
17766 17770 /* Controller's device port event */
17767 17771
17768 17772 (SATA_CPORT_INFO(sata_hba_inst, cport))->
17769 17773 cport_event_flags |=
17770 17774 event & SATA_EVNT_PORT_EVENTS;
17771 17775 pstats =
17772 17776 &(SATA_CPORT_INFO(sata_hba_inst, cport))->
17773 17777 cport_stats;
17774 17778 } else {
17775 17779 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst, cport)));
17776 17780 mutex_enter(&pmportinfo->pmport_mutex);
17777 17781 /* Port multiplier's device port event */
17778 17782 (SATA_PMPORT_INFO(sata_hba_inst, cport, pmport))->
17779 17783 pmport_event_flags |=
17780 17784 event & SATA_EVNT_PORT_EVENTS;
17781 17785 pstats =
17782 17786 &(SATA_PMPORT_INFO(sata_hba_inst, cport, pmport))->
17783 17787 pmport_stats;
17784 17788 mutex_exit(&pmportinfo->pmport_mutex);
17785 17789 mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst, cport)));
17786 17790 }
17787 17791
17788 17792 /*
17789 17793 * Add to statistics and log the message. We have to do it
17790 17794 * here rather than in the event daemon, because there may be
17791 17795 * multiple events occuring before they are processed.
17792 17796 */
17793 17797 linkevent = event &
17794 17798 (SATA_EVNT_LINK_LOST | SATA_EVNT_LINK_ESTABLISHED);
17795 17799 if (linkevent) {
17796 17800 if (linkevent == (SATA_EVNT_LINK_LOST |
17797 17801 SATA_EVNT_LINK_ESTABLISHED)) {
17798 17802 /* This is likely event combination */
17799 17803 (void) strlcat(buf1, "link lost/established, ",
17800 17804 SATA_EVENT_MAX_MSG_LENGTH);
17801 17805
17802 17806 if (pstats->link_lost < 0xffffffffffffffffULL)
17803 17807 pstats->link_lost++;
17804 17808 if (pstats->link_established <
17805 17809 0xffffffffffffffffULL)
17806 17810 pstats->link_established++;
17807 17811 linkevent = 0;
17808 17812 } else if (linkevent & SATA_EVNT_LINK_LOST) {
17809 17813 (void) strlcat(buf1, "link lost, ",
17810 17814 SATA_EVENT_MAX_MSG_LENGTH);
17811 17815
17812 17816 if (pstats->link_lost < 0xffffffffffffffffULL)
17813 17817 pstats->link_lost++;
17814 17818 } else {
17815 17819 (void) strlcat(buf1, "link established, ",
17816 17820 SATA_EVENT_MAX_MSG_LENGTH);
17817 17821 if (pstats->link_established <
17818 17822 0xffffffffffffffffULL)
17819 17823 pstats->link_established++;
17820 17824 }
17821 17825 }
17822 17826 if (event & SATA_EVNT_DEVICE_ATTACHED) {
17823 17827 (void) strlcat(buf1, "device attached, ",
17824 17828 SATA_EVENT_MAX_MSG_LENGTH);
17825 17829 if (pstats->device_attached < 0xffffffffffffffffULL)
17826 17830 pstats->device_attached++;
17827 17831 }
17828 17832 if (event & SATA_EVNT_DEVICE_DETACHED) {
17829 17833 (void) strlcat(buf1, "device detached, ",
17830 17834 SATA_EVENT_MAX_MSG_LENGTH);
17831 17835 if (pstats->device_detached < 0xffffffffffffffffULL)
17832 17836 pstats->device_detached++;
17833 17837 }
17834 17838 if (event & SATA_EVNT_PWR_LEVEL_CHANGED) {
17835 17839 SATADBG1(SATA_DBG_EVENTS, sata_hba_inst,
17836 17840 "port %d power level changed", cport);
17837 17841 if (pstats->port_pwr_changed < 0xffffffffffffffffULL)
17838 17842 pstats->port_pwr_changed++;
17839 17843 }
17840 17844
17841 17845 if ((event & ~SATA_EVNT_PORT_EVENTS) != 0) {
17842 17846 /* There should be no other events for this address */
17843 17847 (void) sprintf(buf2, err_msg_evnt_1,
17844 17848 event & ~SATA_EVNT_PORT_EVENTS);
17845 17849 }
17846 17850 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst, cport)));
17847 17851
17848 17852 } else if (saddr->qual & (SATA_ADDR_DCPORT | SATA_ADDR_DPMPORT)) {
17849 17853 mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst, cport)));
17850 17854
17851 17855 /* qualify this event */
17852 17856 if ((event & SATA_EVNT_DEVICE_RESET) == 0) {
17853 17857 /* Invalid event for a device */
17854 17858 (void) sprintf(buf2, err_msg_evnt_2,
17855 17859 event & SATA_EVNT_DEVICE_RESET);
17856 17860 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst, cport)));
17857 17861 goto event_info;
17858 17862 }
17859 17863 /* drive event */
17860 17864 sdinfo = sata_get_device_info(sata_hba_inst, sata_device);
17861 17865 if (sdinfo != NULL) {
17862 17866 if (event & SATA_EVNT_DEVICE_RESET) {
17863 17867 (void) strlcat(buf1, "device reset, ",
17864 17868 SATA_EVENT_MAX_MSG_LENGTH);
17865 17869 if (sdinfo->satadrv_stats.drive_reset <
17866 17870 0xffffffffffffffffULL)
17867 17871 sdinfo->satadrv_stats.drive_reset++;
17868 17872 sdinfo->satadrv_event_flags |=
17869 17873 SATA_EVNT_DEVICE_RESET;
17870 17874 }
17871 17875 }
17872 17876 if ((event & ~SATA_EVNT_DEVICE_RESET) != 0) {
17873 17877 /* Invalid event for a device */
17874 17878 (void) sprintf(buf2, err_msg_evnt_2,
17875 17879 event & ~SATA_EVNT_DRIVE_EVENTS);
17876 17880 }
17877 17881 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst, cport)));
17878 17882 } else if (saddr->qual == SATA_ADDR_PMULT) {
17879 17883 mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst, cport)));
17880 17884
17881 17885 /* qualify this event */
17882 17886 if ((event & (SATA_EVNT_DEVICE_RESET |
17883 17887 SATA_EVNT_PMULT_LINK_CHANGED)) == 0) {
17884 17888 /* Invalid event for a port multiplier */
17885 17889 (void) sprintf(buf2, err_msg_evnt_2,
17886 17890 event & SATA_EVNT_DEVICE_RESET);
17887 17891 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst, cport)));
17888 17892 goto event_info;
17889 17893 }
17890 17894
17891 17895 pmultinfo = SATA_PMULT_INFO(sata_hba_inst, cport);
17892 17896
17893 17897 if (event & SATA_EVNT_DEVICE_RESET) {
17894 17898
17895 17899 SATADBG1(SATA_DBG_PMULT, sata_hba_inst,
17896 17900 "[Reset] port-mult on cport %d", cport);
17897 17901 pmultinfo->pmult_event_flags |=
17898 17902 SATA_EVNT_DEVICE_RESET;
17899 17903 (void) strlcat(buf1, "pmult reset, ",
17900 17904 SATA_EVENT_MAX_MSG_LENGTH);
17901 17905 }
17902 17906
17903 17907 if (event & SATA_EVNT_PMULT_LINK_CHANGED) {
17904 17908
17905 17909 SATADBG1(SATA_DBG_PMULT, sata_hba_inst,
17906 17910 "pmult link changed on cport %d", cport);
17907 17911 pmultinfo->pmult_event_flags |=
17908 17912 SATA_EVNT_PMULT_LINK_CHANGED;
17909 17913 (void) strlcat(buf1, "pmult link changed, ",
17910 17914 SATA_EVENT_MAX_MSG_LENGTH);
17911 17915 }
17912 17916 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst, cport)));
17913 17917
17914 17918 } else {
17915 17919 if (saddr->qual != SATA_ADDR_NULL) {
17916 17920 /* Wrong address qualifier */
17917 17921 SATA_LOG_D((sata_hba_inst, CE_WARN,
17918 17922 "sata_hba_event_notify: invalid address 0x%x",
17919 17923 *(uint32_t *)saddr));
17920 17924 return;
17921 17925 }
17922 17926 if ((event & SATA_EVNT_CONTROLLER_EVENTS) == 0 ||
17923 17927 (event & ~SATA_EVNT_CONTROLLER_EVENTS) != 0) {
17924 17928 /* Invalid event for the controller */
17925 17929 SATA_LOG_D((sata_hba_inst, CE_WARN,
17926 17930 "sata_hba_event_notify: invalid event 0x%x for "
17927 17931 "controller",
17928 17932 event & SATA_EVNT_CONTROLLER_EVENTS));
17929 17933 return;
17930 17934 }
17931 17935 buf1[0] = '\0';
17932 17936 /* This may be a frequent and not interesting event */
17933 17937 SATADBG1(SATA_DBG_EVENTS, sata_hba_inst,
17934 17938 "controller power level changed\n", NULL);
17935 17939
17936 17940 mutex_enter(&sata_hba_inst->satahba_mutex);
17937 17941 if (sata_hba_inst->satahba_stats.ctrl_pwr_change <
17938 17942 0xffffffffffffffffULL)
17939 17943 sata_hba_inst->satahba_stats.ctrl_pwr_change++;
17940 17944
17941 17945 sata_hba_inst->satahba_event_flags |=
17942 17946 SATA_EVNT_PWR_LEVEL_CHANGED;
17943 17947 mutex_exit(&sata_hba_inst->satahba_mutex);
17944 17948 }
17945 17949 /*
17946 17950 * If we got here, there is something to do with this HBA
17947 17951 * instance.
17948 17952 */
17949 17953 mutex_enter(&sata_hba_inst->satahba_mutex);
17950 17954 sata_hba_inst->satahba_event_flags |= SATA_EVNT_MAIN;
17951 17955 mutex_exit(&sata_hba_inst->satahba_mutex);
17952 17956 mutex_enter(&sata_mutex);
17953 17957 sata_event_pending |= SATA_EVNT_MAIN; /* global event indicator */
17954 17958 mutex_exit(&sata_mutex);
17955 17959
17956 17960 /* Tickle event thread */
17957 17961 mutex_enter(&sata_event_mutex);
17958 17962 if (sata_event_thread_active == 0)
17959 17963 cv_signal(&sata_event_cv);
17960 17964 mutex_exit(&sata_event_mutex);
17961 17965
17962 17966 event_info:
17963 17967 if (buf1[0] != '\0') {
17964 17968 lcp = strrchr(buf1, ',');
17965 17969 if (lcp != NULL)
17966 17970 *lcp = '\0';
17967 17971 }
17968 17972 if (saddr->qual == SATA_ADDR_CPORT ||
17969 17973 saddr->qual == SATA_ADDR_DCPORT) {
17970 17974 if (buf1[0] != '\0') {
17971 17975 sata_log(sata_hba_inst, CE_NOTE, "port %d: %s\n",
17972 17976 cport, buf1);
17973 17977 }
17974 17978 if (buf2[0] != '\0') {
17975 17979 sata_log(sata_hba_inst, CE_NOTE, "port %d: %s\n",
17976 17980 cport, buf2);
17977 17981 }
17978 17982 } else if (saddr->qual == SATA_ADDR_PMPORT ||
17979 17983 saddr->qual == SATA_ADDR_DPMPORT) {
17980 17984 if (buf1[0] != '\0') {
17981 17985 sata_log(sata_hba_inst, CE_NOTE,
17982 17986 "port %d pmport %d: %s\n", cport, pmport, buf1);
17983 17987 }
17984 17988 if (buf2[0] != '\0') {
17985 17989 sata_log(sata_hba_inst, CE_NOTE,
17986 17990 "port %d pmport %d: %s\n", cport, pmport, buf2);
17987 17991 }
17988 17992 }
17989 17993 }
17990 17994
17991 17995
17992 17996 /*
17993 17997 * Event processing thread.
17994 17998 * Arg is a pointer to the sata_hba_list pointer.
17995 17999 * It is not really needed, because sata_hba_list is global and static
17996 18000 */
17997 18001 static void
17998 18002 sata_event_daemon(void *arg)
17999 18003 {
18000 18004 #ifndef __lock_lint
18001 18005 _NOTE(ARGUNUSED(arg))
18002 18006 #endif
18003 18007 sata_hba_inst_t *sata_hba_inst;
18004 18008 clock_t delta;
18005 18009
18006 18010 SATADBG1(SATA_DBG_EVENTS_DAEMON, NULL,
18007 18011 "SATA event daemon started\n", NULL);
18008 18012 loop:
18009 18013 /*
18010 18014 * Process events here. Walk through all registered HBAs
18011 18015 */
18012 18016 mutex_enter(&sata_mutex);
18013 18017 for (sata_hba_inst = sata_hba_list; sata_hba_inst != NULL;
18014 18018 sata_hba_inst = sata_hba_inst->satahba_next) {
18015 18019 ASSERT(sata_hba_inst != NULL);
18016 18020 mutex_enter(&sata_hba_inst->satahba_mutex);
18017 18021 if (sata_hba_inst->satahba_attached == 0 ||
18018 18022 (sata_hba_inst->satahba_event_flags &
18019 18023 SATA_EVNT_SKIP) != 0) {
18020 18024 mutex_exit(&sata_hba_inst->satahba_mutex);
18021 18025 continue;
18022 18026 }
18023 18027 if (sata_hba_inst->satahba_event_flags & SATA_EVNT_MAIN) {
18024 18028 sata_hba_inst->satahba_event_flags |= SATA_EVNT_SKIP;
18025 18029 mutex_exit(&sata_hba_inst->satahba_mutex);
18026 18030 mutex_exit(&sata_mutex);
18027 18031 /* Got the controller with pending event */
18028 18032 sata_process_controller_events(sata_hba_inst);
18029 18033 /*
18030 18034 * Since global mutex was released, there is a
18031 18035 * possibility that HBA list has changed, so start
18032 18036 * over from the top. Just processed controller
18033 18037 * will be passed-over because of the SKIP flag.
18034 18038 */
18035 18039 goto loop;
18036 18040 }
18037 18041 mutex_exit(&sata_hba_inst->satahba_mutex);
18038 18042 }
18039 18043 /* Clear SKIP flag in all controllers */
18040 18044 for (sata_hba_inst = sata_hba_list; sata_hba_inst != NULL;
18041 18045 sata_hba_inst = sata_hba_inst->satahba_next) {
18042 18046 mutex_enter(&sata_hba_inst->satahba_mutex);
18043 18047 sata_hba_inst->satahba_event_flags &= ~SATA_EVNT_SKIP;
18044 18048 mutex_exit(&sata_hba_inst->satahba_mutex);
18045 18049 }
18046 18050 mutex_exit(&sata_mutex);
18047 18051
18048 18052 SATADBG1(SATA_DBG_EVENTS_DAEMON, NULL,
18049 18053 "SATA EVENT DAEMON suspending itself", NULL);
18050 18054
18051 18055 #ifdef SATA_DEBUG
18052 18056 if ((sata_func_enable & SATA_ENABLE_PROCESS_EVENTS) == 0) {
18053 18057 sata_log(sata_hba_inst, CE_WARN,
18054 18058 "SATA EVENTS PROCESSING DISABLED\n");
18055 18059 thread_exit(); /* Daemon will not run again */
18056 18060 }
18057 18061 #endif
18058 18062 mutex_enter(&sata_event_mutex);
18059 18063 sata_event_thread_active = 0;
18060 18064 mutex_exit(&sata_event_mutex);
18061 18065 /*
18062 18066 * Go to sleep/suspend itself and wake up either because new event or
18063 18067 * wait timeout. Exit if there is a termination request (driver
18064 18068 * unload).
18065 18069 */
18066 18070 delta = drv_usectohz(SATA_EVNT_DAEMON_SLEEP_TIME);
18067 18071 do {
18068 18072 mutex_enter(&sata_event_mutex);
18069 18073 (void) cv_reltimedwait(&sata_event_cv, &sata_event_mutex,
18070 18074 delta, TR_CLOCK_TICK);
18071 18075
18072 18076 if (sata_event_thread_active != 0) {
18073 18077 mutex_exit(&sata_event_mutex);
18074 18078 continue;
18075 18079 }
18076 18080
18077 18081 /* Check if it is time to go away */
18078 18082 if (sata_event_thread_terminate == 1) {
18079 18083 /*
18080 18084 * It is up to the thread setting above flag to make
18081 18085 * sure that this thread is not killed prematurely.
18082 18086 */
18083 18087 sata_event_thread_terminate = 0;
18084 18088 sata_event_thread = NULL;
18085 18089 mutex_exit(&sata_event_mutex);
18086 18090 SATADBG1(SATA_DBG_EVENTS_DAEMON, NULL,
18087 18091 "SATA_EVENT_DAEMON_TERMINATING", NULL);
18088 18092 thread_exit(); { _NOTE(NOT_REACHED) }
18089 18093 }
18090 18094 mutex_exit(&sata_event_mutex);
18091 18095 } while (!(sata_event_pending & SATA_EVNT_MAIN));
18092 18096
18093 18097 mutex_enter(&sata_event_mutex);
18094 18098 sata_event_thread_active = 1;
18095 18099 mutex_exit(&sata_event_mutex);
18096 18100
18097 18101 mutex_enter(&sata_mutex);
18098 18102 sata_event_pending &= ~SATA_EVNT_MAIN;
18099 18103 mutex_exit(&sata_mutex);
18100 18104
18101 18105 SATADBG1(SATA_DBG_EVENTS_DAEMON, NULL,
18102 18106 "SATA EVENT DAEMON READY TO PROCESS EVENT", NULL);
18103 18107
18104 18108 goto loop;
18105 18109 }
18106 18110
18107 18111 /*
18108 18112 * Specific HBA instance event processing.
18109 18113 *
18110 18114 * NOTE: At the moment, device event processing is limited to hard disks
18111 18115 * only.
18112 18116 * Port multiplier is supported now.
18113 18117 */
18114 18118 static void
18115 18119 sata_process_controller_events(sata_hba_inst_t *sata_hba_inst)
18116 18120 {
18117 18121 int ncport;
18118 18122 uint32_t event_flags;
18119 18123 sata_address_t *saddr;
18120 18124 sata_cport_info_t *cportinfo;
18121 18125 sata_pmult_info_t *pmultinfo;
18122 18126
18123 18127 SATADBG1(SATA_DBG_EVENTS_CNTRL, sata_hba_inst,
18124 18128 "Processing controller %d event(s)",
18125 18129 ddi_get_instance(SATA_DIP(sata_hba_inst)));
18126 18130
18127 18131 mutex_enter(&sata_hba_inst->satahba_mutex);
18128 18132 sata_hba_inst->satahba_event_flags &= ~SATA_EVNT_MAIN;
18129 18133 event_flags = sata_hba_inst->satahba_event_flags;
18130 18134 mutex_exit(&sata_hba_inst->satahba_mutex);
18131 18135 /*
18132 18136 * Process controller power change first
18133 18137 * HERE
18134 18138 */
18135 18139 if (event_flags & SATA_EVNT_PWR_LEVEL_CHANGED)
18136 18140 sata_process_cntrl_pwr_level_change(sata_hba_inst);
18137 18141
18138 18142 /*
18139 18143 * Search through ports/devices to identify affected port/device.
18140 18144 * We may have to process events for more than one port/device.
18141 18145 */
18142 18146 for (ncport = 0; ncport < SATA_NUM_CPORTS(sata_hba_inst); ncport++) {
18143 18147 /*
18144 18148 * Not all ports may be processed in attach by the time we
18145 18149 * get an event. Check if port info is initialized.
18146 18150 */
18147 18151 mutex_enter(&sata_hba_inst->satahba_mutex);
18148 18152 cportinfo = SATA_CPORT_INFO(sata_hba_inst, ncport);
18149 18153 mutex_exit(&sata_hba_inst->satahba_mutex);
18150 18154 if (cportinfo == NULL || cportinfo->cport_state == NULL)
18151 18155 continue;
18152 18156
18153 18157 /* We have initialized controller port info */
18154 18158 mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst, ncport)));
18155 18159 event_flags = (SATA_CPORT_INFO(sata_hba_inst, ncport))->
18156 18160 cport_event_flags;
18157 18161 /* Check if port was locked by IOCTL processing */
18158 18162 if (event_flags & SATA_APCTL_LOCK_PORT_BUSY) {
18159 18163 /*
18160 18164 * We ignore port events because port is busy
18161 18165 * with AP control processing. Set again
18162 18166 * controller and main event flag, so that
18163 18167 * events may be processed by the next daemon
18164 18168 * run.
18165 18169 */
18166 18170 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst, ncport)));
18167 18171 mutex_enter(&sata_hba_inst->satahba_mutex);
18168 18172 sata_hba_inst->satahba_event_flags |= SATA_EVNT_MAIN;
18169 18173 mutex_exit(&sata_hba_inst->satahba_mutex);
18170 18174 mutex_enter(&sata_mutex);
18171 18175 sata_event_pending |= SATA_EVNT_MAIN;
18172 18176 mutex_exit(&sata_mutex);
18173 18177 SATADBG1(SATA_DBG_EVENTS_PROCPST, sata_hba_inst,
18174 18178 "Event processing postponed until "
18175 18179 "AP control processing completes",
18176 18180 NULL);
18177 18181 /* Check other ports */
18178 18182 continue;
18179 18183 } else {
18180 18184 /*
18181 18185 * Set BSY flag so that AP control would not
18182 18186 * interfere with events processing for
18183 18187 * this port.
18184 18188 */
18185 18189 (SATA_CPORT_INFO(sata_hba_inst, ncport))->
18186 18190 cport_event_flags |= SATA_EVNT_LOCK_PORT_BUSY;
18187 18191 }
18188 18192 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst, ncport)));
18189 18193
18190 18194 saddr = &(SATA_CPORT_INFO(sata_hba_inst, ncport))->cport_addr;
18191 18195
18192 18196 if ((event_flags &
18193 18197 (SATA_EVNT_PORT_EVENTS | SATA_EVNT_DRIVE_EVENTS)) != 0) {
18194 18198 /*
18195 18199 * Got port event.
18196 18200 * We need some hierarchy of event processing as they
18197 18201 * are affecting each other:
18198 18202 * 1. port failed
18199 18203 * 2. device detached/attached
18200 18204 * 3. link events - link events may trigger device
18201 18205 * detached or device attached events in some
18202 18206 * circumstances.
18203 18207 * 4. port power level changed
18204 18208 */
18205 18209 if (event_flags & SATA_EVNT_PORT_FAILED) {
18206 18210 sata_process_port_failed_event(sata_hba_inst,
18207 18211 saddr);
18208 18212 }
18209 18213 if (event_flags & SATA_EVNT_DEVICE_DETACHED) {
18210 18214 sata_process_device_detached(sata_hba_inst,
18211 18215 saddr);
18212 18216 }
18213 18217 if (event_flags & SATA_EVNT_DEVICE_ATTACHED) {
18214 18218 sata_process_device_attached(sata_hba_inst,
18215 18219 saddr);
18216 18220 }
18217 18221 if (event_flags &
18218 18222 (SATA_EVNT_LINK_ESTABLISHED |
18219 18223 SATA_EVNT_LINK_LOST)) {
18220 18224 sata_process_port_link_events(sata_hba_inst,
18221 18225 saddr);
18222 18226 }
18223 18227 if (event_flags & SATA_EVNT_PWR_LEVEL_CHANGED) {
18224 18228 sata_process_port_pwr_change(sata_hba_inst,
18225 18229 saddr);
18226 18230 }
18227 18231 if (event_flags & SATA_EVNT_TARGET_NODE_CLEANUP) {
18228 18232 sata_process_target_node_cleanup(
18229 18233 sata_hba_inst, saddr);
18230 18234 }
18231 18235 if (event_flags & SATA_EVNT_AUTOONLINE_DEVICE) {
18232 18236 sata_process_device_autoonline(
18233 18237 sata_hba_inst, saddr);
18234 18238 }
18235 18239 }
18236 18240
18237 18241
18238 18242 /*
18239 18243 * Scan port multiplier and all its sub-ports event flags.
18240 18244 * The events are marked by
18241 18245 * (1) sata_pmult_info.pmult_event_flags
18242 18246 * (2) sata_pmport_info.pmport_event_flags
18243 18247 */
18244 18248 mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst, ncport)));
18245 18249 if (cportinfo->cport_dev_type == SATA_DTYPE_PMULT) {
18246 18250 /*
18247 18251 * There should be another extra check: this
18248 18252 * port multiplier still exists?
18249 18253 */
18250 18254 pmultinfo = SATA_PMULT_INFO(sata_hba_inst,
18251 18255 ncport);
18252 18256
18253 18257 if (pmultinfo != NULL) {
18254 18258 mutex_exit(&(SATA_CPORT_MUTEX(
18255 18259 sata_hba_inst, ncport)));
18256 18260 sata_process_pmult_events(
18257 18261 sata_hba_inst, ncport);
18258 18262 mutex_enter(&(SATA_CPORT_MUTEX(
18259 18263 sata_hba_inst, ncport)));
18260 18264 } else {
18261 18265 SATADBG1(SATA_DBG_PMULT, sata_hba_inst,
18262 18266 "Port-multiplier is gone. "
18263 18267 "Ignore all sub-device events "
18264 18268 "at port %d.", ncport);
18265 18269 }
18266 18270 }
18267 18271
18268 18272 if ((SATA_CPORT_DEV_TYPE(sata_hba_inst, ncport) !=
18269 18273 SATA_DTYPE_NONE) &&
18270 18274 (SATA_CPORT_DRV_INFO(sata_hba_inst, ncport) != NULL)) {
18271 18275 if (SATA_CPORT_DRV_INFO(sata_hba_inst, ncport)->
18272 18276 satadrv_event_flags &
18273 18277 (SATA_EVNT_DEVICE_RESET |
18274 18278 SATA_EVNT_INPROC_DEVICE_RESET)) {
18275 18279 /* Have device event */
18276 18280 sata_process_device_reset(sata_hba_inst,
18277 18281 saddr);
18278 18282 }
18279 18283 }
18280 18284 /* Release PORT_BUSY flag */
18281 18285 (SATA_CPORT_INFO(sata_hba_inst, ncport))->
18282 18286 cport_event_flags &= ~SATA_EVNT_LOCK_PORT_BUSY;
18283 18287 mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst, ncport)));
18284 18288
18285 18289 } /* End of loop through the controller SATA ports */
18286 18290 }
18287 18291
18288 18292 /*
18289 18293 * Specific port multiplier instance event processing. At the moment, device
18290 18294 * event processing is limited to link/attach event only.
18291 18295 *
18292 18296 * NOTE: power management event is not supported yet.
18293 18297 */
18294 18298 static void
18295 18299 sata_process_pmult_events(sata_hba_inst_t *sata_hba_inst, uint8_t cport)
18296 18300 {
18297 18301 sata_cport_info_t *cportinfo = SATA_CPORT_INFO(sata_hba_inst, cport);
18298 18302 sata_pmult_info_t *pmultinfo;
18299 18303 sata_pmport_info_t *pmportinfo;
18300 18304 sata_address_t *saddr;
18301 18305 sata_device_t sata_device;
18302 18306 uint32_t event_flags;
18303 18307 int npmport;
18304 18308 int rval;
18305 18309
18306 18310 SATADBG2(SATA_DBG_EVENTS_CNTRL|SATA_DBG_PMULT, sata_hba_inst,
18307 18311 "Processing pmult event(s) on cport %d of controller %d",
18308 18312 cport, ddi_get_instance(SATA_DIP(sata_hba_inst)));
18309 18313
18310 18314 /* First process events on port multiplier */
18311 18315 mutex_enter(&cportinfo->cport_mutex);
18312 18316 pmultinfo = SATA_PMULT_INFO(sata_hba_inst, cport);
18313 18317 event_flags = pmultinfo->pmult_event_flags;
18314 18318
18315 18319 /*
18316 18320 * Reset event (of port multiplier) has higher priority because the
18317 18321 * port multiplier itself might be failed or removed after reset.
18318 18322 */
18319 18323 if (event_flags & SATA_EVNT_DEVICE_RESET) {
18320 18324 /*
18321 18325 * The status of the sub-links are uncertain,
18322 18326 * so mark all sub-ports as RESET
18323 18327 */
18324 18328 for (npmport = 0; npmport < SATA_NUM_PMPORTS(
18325 18329 sata_hba_inst, cport); npmport ++) {
18326 18330 pmportinfo = SATA_PMPORT_INFO(sata_hba_inst,
18327 18331 cport, npmport);
18328 18332 if (pmportinfo == NULL) {
18329 18333 /* That's weird. */
18330 18334 SATA_LOG_D((sata_hba_inst, CE_WARN,
18331 18335 "sata_hba_event_notify: "
18332 18336 "invalid/un-implemented "
18333 18337 "port %d:%d (%d ports), ",
18334 18338 cport, npmport, SATA_NUM_PMPORTS(
18335 18339 sata_hba_inst, cport)));
18336 18340 continue;
18337 18341 }
18338 18342
18339 18343 mutex_enter(&pmportinfo->pmport_mutex);
18340 18344
18341 18345 /* Mark all pmport to unknow state. */
18342 18346 pmportinfo->pmport_state = SATA_STATE_UNKNOWN;
18343 18347 /* Mark all pmports with link events. */
18344 18348 pmportinfo->pmport_event_flags =
18345 18349 (SATA_EVNT_LINK_ESTABLISHED|SATA_EVNT_LINK_LOST);
18346 18350 mutex_exit(&pmportinfo->pmport_mutex);
18347 18351 }
18348 18352
18349 18353 } else if (event_flags & SATA_EVNT_PMULT_LINK_CHANGED) {
18350 18354 /*
18351 18355 * We need probe the port multiplier to know what has
18352 18356 * happened.
18353 18357 */
18354 18358 bzero(&sata_device, sizeof (sata_device_t));
18355 18359 sata_device.satadev_rev = SATA_DEVICE_REV;
18356 18360 sata_device.satadev_addr.cport = cport;
18357 18361 sata_device.satadev_addr.pmport = SATA_PMULT_HOSTPORT;
18358 18362 sata_device.satadev_addr.qual = SATA_ADDR_PMULT;
18359 18363
18360 18364 mutex_exit(&cportinfo->cport_mutex);
18361 18365 rval = (*SATA_PROBE_PORT_FUNC(sata_hba_inst))
18362 18366 (SATA_DIP(sata_hba_inst), &sata_device);
18363 18367 mutex_enter(&cportinfo->cport_mutex);
18364 18368 if (rval != SATA_SUCCESS) {
18365 18369 /* Something went wrong? Fail the port */
18366 18370 cportinfo->cport_state = SATA_PSTATE_FAILED;
18367 18371 mutex_exit(&cportinfo->cport_mutex);
18368 18372 SATA_LOG_D((sata_hba_inst, CE_WARN,
18369 18373 "SATA port %d probing failed", cport));
18370 18374
18371 18375 /* PMult structure must be released. */
18372 18376 sata_free_pmult(sata_hba_inst, &sata_device);
18373 18377 return;
18374 18378 }
18375 18379
18376 18380 sata_update_port_info(sata_hba_inst, &sata_device);
18377 18381
18378 18382 /*
18379 18383 * Sanity check - Port is active? Is the link active?
18380 18384 * The device is still a port multiplier?
18381 18385 */
18382 18386 if ((cportinfo->cport_state &
18383 18387 (SATA_PSTATE_SHUTDOWN | SATA_PSTATE_FAILED)) ||
18384 18388 ((cportinfo->cport_scr.sstatus &
18385 18389 SATA_PORT_DEVLINK_UP_MASK) != SATA_PORT_DEVLINK_UP) ||
18386 18390 (cportinfo->cport_dev_type != SATA_DTYPE_PMULT)) {
18387 18391 mutex_exit(&cportinfo->cport_mutex);
18388 18392
18389 18393 /* PMult structure must be released. */
18390 18394 sata_free_pmult(sata_hba_inst, &sata_device);
18391 18395 return;
18392 18396 }
18393 18397
18394 18398 /* Probed succeed, set port ready. */
18395 18399 cportinfo->cport_state |=
18396 18400 SATA_STATE_PROBED | SATA_STATE_READY;
18397 18401 }
18398 18402
18399 18403 /* Release port multiplier event flags. */
18400 18404 pmultinfo->pmult_event_flags &=
18401 18405 ~(SATA_EVNT_DEVICE_RESET|SATA_EVNT_PMULT_LINK_CHANGED);
18402 18406 mutex_exit(&cportinfo->cport_mutex);
18403 18407
18404 18408 /*
18405 18409 * Check all sub-links.
18406 18410 */
18407 18411 for (npmport = 0; npmport < SATA_NUM_PMPORTS(sata_hba_inst, cport);
18408 18412 npmport ++) {
18409 18413 pmportinfo = SATA_PMPORT_INFO(sata_hba_inst, cport, npmport);
18410 18414 mutex_enter(&pmportinfo->pmport_mutex);
18411 18415 event_flags = pmportinfo->pmport_event_flags;
18412 18416 mutex_exit(&pmportinfo->pmport_mutex);
18413 18417 saddr = &pmportinfo->pmport_addr;
18414 18418
18415 18419 if ((event_flags &
18416 18420 (SATA_EVNT_PORT_EVENTS | SATA_EVNT_DRIVE_EVENTS)) != 0) {
18417 18421 /*
18418 18422 * Got port multiplier port event.
18419 18423 * We need some hierarchy of event processing as they
18420 18424 * are affecting each other:
18421 18425 * 1. device detached/attached
18422 18426 * 2. link events - link events may trigger device
18423 18427 * detached or device attached events in some
18424 18428 * circumstances.
18425 18429 */
18426 18430 if (event_flags & SATA_EVNT_DEVICE_DETACHED) {
18427 18431 sata_process_pmdevice_detached(sata_hba_inst,
18428 18432 saddr);
18429 18433 }
18430 18434 if (event_flags & SATA_EVNT_DEVICE_ATTACHED) {
18431 18435 sata_process_pmdevice_attached(sata_hba_inst,
18432 18436 saddr);
18433 18437 }
18434 18438 if (event_flags & SATA_EVNT_LINK_ESTABLISHED ||
18435 18439 event_flags & SATA_EVNT_LINK_LOST) {
18436 18440 sata_process_pmport_link_events(sata_hba_inst,
18437 18441 saddr);
18438 18442 }
18439 18443 if (event_flags & SATA_EVNT_TARGET_NODE_CLEANUP) {
18440 18444 sata_process_target_node_cleanup(
18441 18445 sata_hba_inst, saddr);
18442 18446 }
18443 18447 }
18444 18448
18445 18449 /* Checking drive event(s). */
18446 18450 mutex_enter(&pmportinfo->pmport_mutex);
18447 18451 if (pmportinfo->pmport_dev_type != SATA_DTYPE_NONE &&
18448 18452 pmportinfo->pmport_sata_drive != NULL) {
18449 18453 event_flags = pmportinfo->pmport_sata_drive->
18450 18454 satadrv_event_flags;
18451 18455 if (event_flags & (SATA_EVNT_DEVICE_RESET |
18452 18456 SATA_EVNT_INPROC_DEVICE_RESET)) {
18453 18457
18454 18458 /* Have device event */
18455 18459 sata_process_pmdevice_reset(sata_hba_inst,
18456 18460 saddr);
18457 18461 }
18458 18462 }
18459 18463 mutex_exit(&pmportinfo->pmport_mutex);
18460 18464
18461 18465 /* Release PORT_BUSY flag */
18462 18466 mutex_enter(&cportinfo->cport_mutex);
18463 18467 cportinfo->cport_event_flags &= ~SATA_EVNT_LOCK_PORT_BUSY;
18464 18468 mutex_exit(&cportinfo->cport_mutex);
18465 18469 }
18466 18470
18467 18471 SATADBG2(SATA_DBG_EVENTS_CNTRL|SATA_DBG_PMULT, sata_hba_inst,
18468 18472 "[DONE] pmult event(s) on cport %d of controller %d",
18469 18473 cport, ddi_get_instance(SATA_DIP(sata_hba_inst)));
18470 18474 }
18471 18475
18472 18476 /*
18473 18477 * Process HBA power level change reported by HBA driver.
18474 18478 * Not implemented at this time - event is ignored.
18475 18479 */
18476 18480 static void
18477 18481 sata_process_cntrl_pwr_level_change(sata_hba_inst_t *sata_hba_inst)
18478 18482 {
18479 18483 SATADBG1(SATA_DBG_EVENTS_PROC, sata_hba_inst,
18480 18484 "Processing controller power level change", NULL);
18481 18485
18482 18486 /* Ignoring it for now */
18483 18487 mutex_enter(&sata_hba_inst->satahba_mutex);
18484 18488 sata_hba_inst->satahba_event_flags &= ~SATA_EVNT_PWR_LEVEL_CHANGED;
18485 18489 mutex_exit(&sata_hba_inst->satahba_mutex);
18486 18490 }
18487 18491
18488 18492 /*
18489 18493 * Process port power level change reported by HBA driver.
18490 18494 * Not implemented at this time - event is ignored.
18491 18495 */
18492 18496 static void
18493 18497 sata_process_port_pwr_change(sata_hba_inst_t *sata_hba_inst,
18494 18498 sata_address_t *saddr)
18495 18499 {
18496 18500 sata_cport_info_t *cportinfo;
18497 18501
18498 18502 SATADBG1(SATA_DBG_EVENTS_PROC, sata_hba_inst,
18499 18503 "Processing port power level change", NULL);
18500 18504
18501 18505 cportinfo = SATA_CPORT_INFO(sata_hba_inst, saddr->cport);
18502 18506 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->cport_mutex);
18503 18507 /* Reset event flag */
18504 18508 cportinfo->cport_event_flags &= ~SATA_EVNT_PWR_LEVEL_CHANGED;
18505 18509 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->cport_mutex);
18506 18510 }
18507 18511
18508 18512 /*
18509 18513 * Process port failure reported by HBA driver.
18510 18514 * cports support only - no pmports.
18511 18515 */
18512 18516 static void
18513 18517 sata_process_port_failed_event(sata_hba_inst_t *sata_hba_inst,
18514 18518 sata_address_t *saddr)
18515 18519 {
18516 18520 sata_cport_info_t *cportinfo;
18517 18521
18518 18522 cportinfo = SATA_CPORT_INFO(sata_hba_inst, saddr->cport);
18519 18523 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->cport_mutex);
18520 18524 /* Reset event flag first */
18521 18525 cportinfo->cport_event_flags &= ~SATA_EVNT_PORT_FAILED;
18522 18526 /* If the port is in SHUTDOWN or FAILED state, ignore this event. */
18523 18527 if ((cportinfo->cport_state &
18524 18528 (SATA_PSTATE_SHUTDOWN | SATA_PSTATE_FAILED)) == 0) {
18525 18529 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->
18526 18530 cport_mutex);
18527 18531 return;
18528 18532 }
18529 18533 /* Fail the port */
18530 18534 cportinfo->cport_state = SATA_PSTATE_FAILED;
18531 18535 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->cport_mutex);
18532 18536 sata_log(sata_hba_inst, CE_WARN, "SATA port %d failed", saddr->cport);
18533 18537 }
18534 18538
18535 18539 /*
18536 18540 * Device Reset Event processing.
18537 18541 * The sequence is managed by 3 stage flags:
18538 18542 * - reset event reported,
18539 18543 * - reset event being processed,
18540 18544 * - request to clear device reset state.
18541 18545 *
18542 18546 * NOTE: This function has to be entered with cport mutex held. It exits with
18543 18547 * mutex held as well, but can release mutex during the processing.
18544 18548 */
18545 18549 static void
18546 18550 sata_process_device_reset(sata_hba_inst_t *sata_hba_inst,
18547 18551 sata_address_t *saddr)
18548 18552 {
18549 18553 sata_drive_info_t old_sdinfo; /* local copy of the drive info */
18550 18554 sata_drive_info_t *sdinfo;
18551 18555 sata_cport_info_t *cportinfo;
18552 18556 sata_device_t sata_device;
18553 18557 int rval_probe, rval_set;
18554 18558
18555 18559 /* We only care about host sata cport for now */
18556 18560 cportinfo = SATA_CPORT_INFO(sata_hba_inst, saddr->cport);
18557 18561 sdinfo = SATA_CPORT_DRV_INFO(sata_hba_inst, saddr->cport);
18558 18562 /*
18559 18563 * If the port is in SHUTDOWN or FAILED state, or device is in FAILED
18560 18564 * state, ignore reset event.
18561 18565 */
18562 18566 if (((cportinfo->cport_state &
18563 18567 (SATA_PSTATE_SHUTDOWN | SATA_PSTATE_FAILED)) != 0) ||
18564 18568 (sdinfo->satadrv_state & SATA_DSTATE_FAILED) != 0) {
18565 18569 sdinfo->satadrv_event_flags &=
18566 18570 ~(SATA_EVNT_DEVICE_RESET | SATA_EVNT_INPROC_DEVICE_RESET);
18567 18571 return;
18568 18572 }
18569 18573
18570 18574 if ((SATA_CPORT_DEV_TYPE(sata_hba_inst, saddr->cport) ==
18571 18575 SATA_DTYPE_PMULT)) {
18572 18576 /*
18573 18577 * Should not happened: this is already handled in
18574 18578 * sata_hba_event_notify()
18575 18579 */
18576 18580 mutex_exit(&cportinfo->cport_mutex);
18577 18581 goto done;
18578 18582 }
18579 18583
18580 18584 if ((SATA_CPORT_DEV_TYPE(sata_hba_inst, saddr->cport) &
18581 18585 SATA_VALID_DEV_TYPE) == 0) {
18582 18586 /*
18583 18587 * This should not happen - coding error.
18584 18588 * But we can recover, so do not panic, just clean up
18585 18589 * and if in debug mode, log the message.
18586 18590 */
18587 18591 #ifdef SATA_DEBUG
18588 18592 sata_log(sata_hba_inst, CE_WARN,
18589 18593 "sata_process_device_reset: "
18590 18594 "Invalid device type with sdinfo!", NULL);
18591 18595 #endif
18592 18596 sdinfo->satadrv_event_flags = 0;
18593 18597 return;
18594 18598 }
18595 18599
18596 18600 #ifdef SATA_DEBUG
18597 18601 if ((sdinfo->satadrv_event_flags &
18598 18602 (SATA_EVNT_DEVICE_RESET | SATA_EVNT_INPROC_DEVICE_RESET)) == 0) {
18599 18603 /* Nothing to do */
18600 18604 /* Something is weird - why we are processing dev reset? */
18601 18605 SATADBG1(SATA_DBG_EVENTS_PROC, sata_hba_inst,
18602 18606 "No device reset event!!!!", NULL);
18603 18607
18604 18608 return;
18605 18609 }
18606 18610 if ((sdinfo->satadrv_event_flags &
18607 18611 (SATA_EVNT_DEVICE_RESET | SATA_EVNT_INPROC_DEVICE_RESET)) ==
18608 18612 (SATA_EVNT_DEVICE_RESET | SATA_EVNT_INPROC_DEVICE_RESET)) {
18609 18613 /* Something is weird - new device reset event */
18610 18614 SATADBG1(SATA_DBG_EVENTS_PROC, sata_hba_inst,
18611 18615 "Overlapping device reset events!", NULL);
18612 18616 }
18613 18617 #endif
18614 18618 SATADBG1(SATA_DBG_EVENTS_PROC, sata_hba_inst,
18615 18619 "Processing port %d device reset", saddr->cport);
18616 18620
18617 18621 /* Clear event flag */
18618 18622 sdinfo->satadrv_event_flags &= ~SATA_EVNT_DEVICE_RESET;
18619 18623
18620 18624 /* It seems that we always need to check the port state first */
18621 18625 sata_device.satadev_rev = SATA_DEVICE_REV;
18622 18626 sata_device.satadev_addr = *saddr;
18623 18627 /*
18624 18628 * We have to exit mutex, because the HBA probe port function may
18625 18629 * block on its own mutex.
18626 18630 */
18627 18631 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->cport_mutex);
18628 18632 rval_probe = (*SATA_PROBE_PORT_FUNC(sata_hba_inst))
18629 18633 (SATA_DIP(sata_hba_inst), &sata_device);
18630 18634 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->cport_mutex);
18631 18635 sata_update_port_info(sata_hba_inst, &sata_device);
18632 18636 if (rval_probe != SATA_SUCCESS) {
18633 18637 /* Something went wrong? Fail the port */
18634 18638 cportinfo->cport_state = SATA_PSTATE_FAILED;
18635 18639 sdinfo = SATA_CPORT_DRV_INFO(sata_hba_inst, saddr->cport);
18636 18640 if (sdinfo != NULL)
18637 18641 sdinfo->satadrv_event_flags = 0;
18638 18642 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->
18639 18643 cport_mutex);
18640 18644 SATA_LOG_D((sata_hba_inst, CE_WARN,
18641 18645 "SATA port %d probing failed",
18642 18646 saddr->cport));
18643 18647 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst,
18644 18648 saddr->cport)->cport_mutex);
18645 18649 return;
18646 18650 }
18647 18651 if ((sata_device.satadev_scr.sstatus &
18648 18652 SATA_PORT_DEVLINK_UP_MASK) !=
18649 18653 SATA_PORT_DEVLINK_UP ||
18650 18654 sata_device.satadev_type == SATA_DTYPE_NONE) {
18651 18655 /*
18652 18656 * No device to process, anymore. Some other event processing
18653 18657 * would or have already performed port info cleanup.
18654 18658 * To be safe (HBA may need it), request clearing device
18655 18659 * reset condition.
18656 18660 */
18657 18661 sdinfo = SATA_CPORT_DRV_INFO(sata_hba_inst, saddr->cport);
18658 18662 if (sdinfo != NULL) {
18659 18663 sdinfo->satadrv_event_flags &=
18660 18664 ~SATA_EVNT_INPROC_DEVICE_RESET;
18661 18665 sdinfo->satadrv_event_flags |=
18662 18666 SATA_EVNT_CLEAR_DEVICE_RESET;
18663 18667 }
18664 18668 return;
18665 18669 }
18666 18670
18667 18671 sdinfo = SATA_CPORT_DRV_INFO(sata_hba_inst, saddr->cport);
18668 18672 if (sdinfo == NULL) {
18669 18673 return;
18670 18674 }
18671 18675 if ((sdinfo->satadrv_event_flags &
18672 18676 SATA_EVNT_INPROC_DEVICE_RESET) == 0) {
18673 18677 /*
18674 18678 * Start tracking time for device feature restoration and
18675 18679 * identification. Save current time (lbolt value).
18676 18680 */
18677 18681 sdinfo->satadrv_reset_time = ddi_get_lbolt();
18678 18682 }
18679 18683 /* Mark device reset processing as active */
18680 18684 sdinfo->satadrv_event_flags |= SATA_EVNT_INPROC_DEVICE_RESET;
18681 18685
18682 18686 old_sdinfo = *sdinfo; /* local copy of the drive info */
18683 18687 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->cport_mutex);
18684 18688
18685 18689 rval_set = sata_set_drive_features(sata_hba_inst, &old_sdinfo, 1);
18686 18690
18687 18691 if (rval_set != SATA_SUCCESS) {
18688 18692 /*
18689 18693 * Restoring drive setting failed.
18690 18694 * Probe the port first, to check if the port state has changed
18691 18695 */
18692 18696 sata_device.satadev_rev = SATA_DEVICE_REV;
18693 18697 sata_device.satadev_addr = *saddr;
18694 18698 sata_device.satadev_addr.qual = SATA_ADDR_CPORT;
18695 18699 /* probe port */
18696 18700 rval_probe = (*SATA_PROBE_PORT_FUNC(sata_hba_inst))
18697 18701 (SATA_DIP(sata_hba_inst), &sata_device);
18698 18702 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->
18699 18703 cport_mutex);
18700 18704 if (rval_probe == SATA_SUCCESS &&
18701 18705 (sata_device.satadev_state &
18702 18706 (SATA_PSTATE_SHUTDOWN | SATA_PSTATE_FAILED)) == 0 &&
18703 18707 (sata_device.satadev_scr.sstatus &
18704 18708 SATA_PORT_DEVLINK_UP_MASK) == SATA_PORT_DEVLINK_UP &&
18705 18709 sata_device.satadev_type != SATA_DTYPE_NONE) {
18706 18710 /*
18707 18711 * We may retry this a bit later - in-process reset
18708 18712 * condition should be already set.
18709 18713 * Track retry time for device identification.
18710 18714 */
18711 18715 if ((cportinfo->cport_dev_type &
18712 18716 SATA_VALID_DEV_TYPE) != 0 &&
18713 18717 SATA_CPORTINFO_DRV_INFO(cportinfo) != NULL &&
18714 18718 sdinfo->satadrv_reset_time != 0) {
18715 18719 clock_t cur_time = ddi_get_lbolt();
18716 18720 /*
18717 18721 * If the retry time limit was not
18718 18722 * exceeded, retry.
18719 18723 */
18720 18724 if ((cur_time - sdinfo->satadrv_reset_time) <
18721 18725 drv_usectohz(SATA_DEV_REPROBE_TIMEOUT)) {
18722 18726 mutex_enter(
18723 18727 &sata_hba_inst->satahba_mutex);
18724 18728 sata_hba_inst->satahba_event_flags |=
18725 18729 SATA_EVNT_MAIN;
18726 18730 mutex_exit(
18727 18731 &sata_hba_inst->satahba_mutex);
18728 18732 mutex_enter(&sata_mutex);
18729 18733 sata_event_pending |= SATA_EVNT_MAIN;
18730 18734 mutex_exit(&sata_mutex);
18731 18735 return;
18732 18736 }
18733 18737 if (rval_set == SATA_RETRY) {
18734 18738 /*
18735 18739 * Setting drive features failed, but
18736 18740 * the drive is still accessible,
18737 18741 * so emit a warning message before
18738 18742 * return.
18739 18743 */
18740 18744 mutex_exit(&SATA_CPORT_INFO(
18741 18745 sata_hba_inst,
18742 18746 saddr->cport)->cport_mutex);
18743 18747 goto done;
18744 18748 }
18745 18749 }
18746 18750 /* Fail the drive */
18747 18751 sdinfo->satadrv_state = SATA_DSTATE_FAILED;
18748 18752
18749 18753 sata_log(sata_hba_inst, CE_WARN,
18750 18754 "SATA device at port %d - device failed",
18751 18755 saddr->cport);
18752 18756
18753 18757 DTRACE_PROBE(port_failed_f);
18754 18758 }
18755 18759 /*
18756 18760 * No point of retrying - device failed or some other event
18757 18761 * processing or already did or will do port info cleanup.
18758 18762 * To be safe (HBA may need it),
18759 18763 * request clearing device reset condition.
18760 18764 */
18761 18765 sdinfo->satadrv_event_flags |= SATA_EVNT_CLEAR_DEVICE_RESET;
18762 18766 sdinfo->satadrv_event_flags &= ~SATA_EVNT_INPROC_DEVICE_RESET;
18763 18767 sdinfo->satadrv_reset_time = 0;
18764 18768 return;
18765 18769 }
18766 18770 done:
18767 18771 /*
18768 18772 * If setting of drive features failed, but the drive is still
18769 18773 * accessible, emit a warning message.
18770 18774 */
18771 18775 if (rval_set == SATA_RETRY) {
18772 18776 sata_log(sata_hba_inst, CE_WARN,
18773 18777 "SATA device at port %d - desired setting could not be "
18774 18778 "restored after reset. Device may not operate as expected.",
18775 18779 saddr->cport);
18776 18780 }
18777 18781 /*
18778 18782 * Raise the flag indicating that the next sata command could
18779 18783 * be sent with SATA_CLEAR_DEV_RESET_STATE flag, if no new device
18780 18784 * reset is reported.
18781 18785 */
18782 18786 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->cport_mutex);
18783 18787 if (SATA_CPORTINFO_DRV_INFO(cportinfo) != NULL) {
18784 18788 sdinfo->satadrv_reset_time = 0;
18785 18789 if ((cportinfo->cport_dev_type & SATA_VALID_DEV_TYPE) != 0) {
18786 18790 sdinfo = SATA_CPORTINFO_DRV_INFO(cportinfo);
18787 18791 sdinfo->satadrv_event_flags &=
18788 18792 ~SATA_EVNT_INPROC_DEVICE_RESET;
18789 18793 sdinfo->satadrv_event_flags |=
18790 18794 SATA_EVNT_CLEAR_DEVICE_RESET;
18791 18795 }
18792 18796 }
18793 18797 }
18794 18798
18795 18799
18796 18800 /*
18797 18801 * Port Multiplier Port Device Reset Event processing.
18798 18802 *
18799 18803 * NOTE: This function has to be entered with pmport mutex held. It exits with
18800 18804 * mutex held as well, but can release mutex during the processing.
18801 18805 */
18802 18806 static void
18803 18807 sata_process_pmdevice_reset(sata_hba_inst_t *sata_hba_inst,
18804 18808 sata_address_t *saddr)
18805 18809 {
18806 18810 sata_drive_info_t old_sdinfo; /* local copy of the drive info */
18807 18811 sata_drive_info_t *sdinfo = NULL;
18808 18812 sata_cport_info_t *cportinfo = NULL;
18809 18813 sata_pmport_info_t *pmportinfo = NULL;
18810 18814 sata_pmult_info_t *pminfo = NULL;
18811 18815 sata_device_t sata_device;
18812 18816 uint8_t cport = saddr->cport;
18813 18817 uint8_t pmport = saddr->pmport;
18814 18818 int rval;
18815 18819
18816 18820 SATADBG2(SATA_DBG_EVENTS_PROC, sata_hba_inst,
18817 18821 "Processing drive reset at port %d:%d", cport, pmport);
18818 18822
18819 18823 cportinfo = SATA_CPORT_INFO(sata_hba_inst, cport);
18820 18824 pmportinfo = SATA_PMPORT_INFO(sata_hba_inst, cport, pmport);
18821 18825 sdinfo = SATA_PMPORT_DRV_INFO(sata_hba_inst, cport, pmport);
18822 18826
18823 18827 /*
18824 18828 * If the port is in SHUTDOWN or FAILED state, or device is in FAILED
18825 18829 * state, ignore reset event.
18826 18830 */
18827 18831 if (((cportinfo->cport_state &
18828 18832 (SATA_PSTATE_SHUTDOWN | SATA_PSTATE_FAILED)) != 0) ||
18829 18833 (sdinfo->satadrv_state & SATA_DSTATE_FAILED) != 0) {
18830 18834 sdinfo->satadrv_event_flags &=
18831 18835 ~(SATA_EVNT_DEVICE_RESET | SATA_EVNT_INPROC_DEVICE_RESET);
18832 18836 return;
18833 18837 }
18834 18838
18835 18839 if ((pmportinfo->pmport_dev_type & SATA_VALID_DEV_TYPE) == 0) {
18836 18840 /*
18837 18841 * This should not happen - coding error.
18838 18842 * But we can recover, so do not panic, just clean up
18839 18843 * and if in debug mode, log the message.
18840 18844 */
18841 18845 #ifdef SATA_DEBUG
18842 18846 sata_log(sata_hba_inst, CE_WARN,
18843 18847 "sata_process_pmdevice_reset: "
18844 18848 "Invalid device type with sdinfo!", NULL);
18845 18849 #endif
18846 18850 sdinfo->satadrv_event_flags = 0;
18847 18851 return;
18848 18852 }
18849 18853
18850 18854 #ifdef SATA_DEBUG
18851 18855 if ((sdinfo->satadrv_event_flags &
18852 18856 (SATA_EVNT_DEVICE_RESET | SATA_EVNT_INPROC_DEVICE_RESET)) == 0) {
18853 18857 /* Nothing to do */
18854 18858 /* Something is weird - why we are processing dev reset? */
18855 18859 SATADBG1(SATA_DBG_EVENTS_PROC, sata_hba_inst,
18856 18860 "No device reset event!!!!", NULL);
18857 18861
18858 18862 return;
18859 18863 }
18860 18864 if ((sdinfo->satadrv_event_flags &
18861 18865 (SATA_EVNT_DEVICE_RESET | SATA_EVNT_INPROC_DEVICE_RESET)) ==
18862 18866 (SATA_EVNT_DEVICE_RESET | SATA_EVNT_INPROC_DEVICE_RESET)) {
18863 18867 /* Something is weird - new device reset event */
18864 18868 SATADBG1(SATA_DBG_EVENTS_PROC, sata_hba_inst,
18865 18869 "Overlapping device reset events!", NULL);
18866 18870 }
18867 18871 #endif
18868 18872 SATADBG2(SATA_DBG_EVENTS_PROC, sata_hba_inst,
18869 18873 "Processing port %d:%d device reset", cport, pmport);
18870 18874
18871 18875 /* Clear event flag */
18872 18876 sdinfo->satadrv_event_flags &= ~SATA_EVNT_DEVICE_RESET;
18873 18877
18874 18878 /* It seems that we always need to check the port state first */
18875 18879 sata_device.satadev_rev = SATA_DEVICE_REV;
18876 18880 sata_device.satadev_addr = *saddr;
18877 18881 /*
18878 18882 * We have to exit mutex, because the HBA probe port function may
18879 18883 * block on its own mutex.
18880 18884 */
18881 18885 mutex_exit(&pmportinfo->pmport_mutex);
18882 18886 rval = (*SATA_PROBE_PORT_FUNC(sata_hba_inst))
18883 18887 (SATA_DIP(sata_hba_inst), &sata_device);
18884 18888 mutex_enter(&pmportinfo->pmport_mutex);
18885 18889
18886 18890 sata_update_pmport_info(sata_hba_inst, &sata_device);
18887 18891 if (rval != SATA_SUCCESS) {
18888 18892 /* Something went wrong? Fail the port */
18889 18893 pmportinfo->pmport_state = SATA_PSTATE_FAILED;
18890 18894 sdinfo = SATA_PMPORT_DRV_INFO(sata_hba_inst, saddr->cport,
18891 18895 saddr->pmport);
18892 18896 if (sdinfo != NULL)
18893 18897 sdinfo->satadrv_event_flags = 0;
18894 18898 mutex_exit(&pmportinfo->pmport_mutex);
18895 18899 SATA_LOG_D((sata_hba_inst, CE_WARN,
18896 18900 "SATA port %d:%d probing failed",
18897 18901 saddr->cport, saddr->pmport));
18898 18902 mutex_enter(&pmportinfo->pmport_mutex);
18899 18903 return;
18900 18904 }
18901 18905 if ((sata_device.satadev_scr.sstatus &
18902 18906 SATA_PORT_DEVLINK_UP_MASK) !=
18903 18907 SATA_PORT_DEVLINK_UP ||
18904 18908 sata_device.satadev_type == SATA_DTYPE_NONE) {
18905 18909 /*
18906 18910 * No device to process, anymore. Some other event processing
18907 18911 * would or have already performed port info cleanup.
18908 18912 * To be safe (HBA may need it), request clearing device
18909 18913 * reset condition.
18910 18914 */
18911 18915 sdinfo = SATA_PMPORT_DRV_INFO(sata_hba_inst, saddr->cport,
18912 18916 saddr->pmport);
18913 18917 if (sdinfo != NULL) {
18914 18918 sdinfo->satadrv_event_flags &=
18915 18919 ~SATA_EVNT_INPROC_DEVICE_RESET;
18916 18920 /* must clear flags on cport */
18917 18921 pminfo = SATA_PMULT_INFO(sata_hba_inst,
18918 18922 saddr->cport);
18919 18923 pminfo->pmult_event_flags |=
18920 18924 SATA_EVNT_CLEAR_DEVICE_RESET;
18921 18925 }
18922 18926 return;
18923 18927 }
18924 18928
18925 18929 sdinfo = SATA_PMPORT_DRV_INFO(sata_hba_inst, saddr->cport,
18926 18930 saddr->pmport);
18927 18931 if (sdinfo == NULL) {
18928 18932 return;
18929 18933 }
18930 18934 if ((sdinfo->satadrv_event_flags &
18931 18935 SATA_EVNT_INPROC_DEVICE_RESET) == 0) {
18932 18936 /*
18933 18937 * Start tracking time for device feature restoration and
18934 18938 * identification. Save current time (lbolt value).
18935 18939 */
18936 18940 sdinfo->satadrv_reset_time = ddi_get_lbolt();
18937 18941 }
18938 18942 /* Mark device reset processing as active */
18939 18943 sdinfo->satadrv_event_flags |= SATA_EVNT_INPROC_DEVICE_RESET;
18940 18944
18941 18945 old_sdinfo = *sdinfo; /* local copy of the drive info */
18942 18946 mutex_exit(&pmportinfo->pmport_mutex);
18943 18947
18944 18948 if (sata_set_drive_features(sata_hba_inst, &old_sdinfo, 1) ==
18945 18949 SATA_FAILURE) {
18946 18950 /*
18947 18951 * Restoring drive setting failed.
18948 18952 * Probe the port first, to check if the port state has changed
18949 18953 */
18950 18954 sata_device.satadev_rev = SATA_DEVICE_REV;
18951 18955 sata_device.satadev_addr = *saddr;
18952 18956 sata_device.satadev_addr.qual = SATA_ADDR_PMPORT;
18953 18957
18954 18958 /* probe port */
18955 18959 rval = (*SATA_PROBE_PORT_FUNC(sata_hba_inst))
18956 18960 (SATA_DIP(sata_hba_inst), &sata_device);
18957 18961 mutex_enter(&pmportinfo->pmport_mutex);
18958 18962 if (rval == SATA_SUCCESS &&
18959 18963 (sata_device.satadev_state &
18960 18964 (SATA_PSTATE_SHUTDOWN | SATA_PSTATE_FAILED)) == 0 &&
18961 18965 (sata_device.satadev_scr.sstatus &
18962 18966 SATA_PORT_DEVLINK_UP_MASK) == SATA_PORT_DEVLINK_UP &&
18963 18967 sata_device.satadev_type != SATA_DTYPE_NONE) {
18964 18968 /*
18965 18969 * We may retry this a bit later - in-process reset
18966 18970 * condition should be already set.
18967 18971 * Track retry time for device identification.
18968 18972 */
18969 18973 if ((pmportinfo->pmport_dev_type &
18970 18974 SATA_VALID_DEV_TYPE) != 0 &&
18971 18975 SATA_PMPORTINFO_DRV_INFO(pmportinfo) != NULL &&
18972 18976 sdinfo->satadrv_reset_time != 0) {
18973 18977 clock_t cur_time = ddi_get_lbolt();
18974 18978 /*
18975 18979 * If the retry time limit was not
18976 18980 * exceeded, retry.
18977 18981 */
18978 18982 if ((cur_time - sdinfo->satadrv_reset_time) <
18979 18983 drv_usectohz(SATA_DEV_REPROBE_TIMEOUT)) {
18980 18984 mutex_enter(
18981 18985 &sata_hba_inst->satahba_mutex);
18982 18986 sata_hba_inst->satahba_event_flags |=
18983 18987 SATA_EVNT_MAIN;
18984 18988 mutex_exit(
18985 18989 &sata_hba_inst->satahba_mutex);
18986 18990 mutex_enter(&sata_mutex);
18987 18991 sata_event_pending |= SATA_EVNT_MAIN;
18988 18992 mutex_exit(&sata_mutex);
18989 18993 return;
18990 18994 }
18991 18995 }
18992 18996 /* Fail the drive */
18993 18997 sdinfo->satadrv_state = SATA_DSTATE_FAILED;
18994 18998
18995 18999 sata_log(sata_hba_inst, CE_WARN,
18996 19000 "SATA device at port %d:%d - device failed",
18997 19001 saddr->cport, saddr->pmport);
18998 19002 } else {
18999 19003 /*
19000 19004 * No point of retrying - some other event processing
19001 19005 * would or already did port info cleanup.
19002 19006 * To be safe (HBA may need it),
19003 19007 * request clearing device reset condition.
19004 19008 */
19005 19009 sdinfo->satadrv_event_flags |=
19006 19010 SATA_EVNT_CLEAR_DEVICE_RESET;
19007 19011 }
19008 19012 sdinfo->satadrv_event_flags &= ~SATA_EVNT_INPROC_DEVICE_RESET;
19009 19013 sdinfo->satadrv_reset_time = 0;
19010 19014 return;
19011 19015 }
19012 19016 /*
19013 19017 * Raise the flag indicating that the next sata command could
19014 19018 * be sent with SATA_CLEAR_DEV_RESET_STATE flag, if no new device
19015 19019 * reset is reported.
19016 19020 */
19017 19021 mutex_enter(&pmportinfo->pmport_mutex);
19018 19022 if (SATA_PMPORTINFO_DRV_INFO(pmportinfo) != NULL) {
19019 19023 sdinfo->satadrv_reset_time = 0;
19020 19024 if (pmportinfo->pmport_dev_type & SATA_VALID_DEV_TYPE) {
19021 19025 sdinfo = SATA_PMPORTINFO_DRV_INFO(pmportinfo);
19022 19026 sdinfo->satadrv_event_flags &=
19023 19027 ~SATA_EVNT_INPROC_DEVICE_RESET;
19024 19028 /* must clear flags on cport */
19025 19029 pminfo = SATA_PMULT_INFO(sata_hba_inst,
19026 19030 saddr->cport);
19027 19031 pminfo->pmult_event_flags |=
19028 19032 SATA_EVNT_CLEAR_DEVICE_RESET;
19029 19033 }
19030 19034 }
19031 19035 }
19032 19036
19033 19037 /*
19034 19038 * Port Link Events processing.
19035 19039 * Every link established event may involve device reset (due to
19036 19040 * COMRESET signal, equivalent of the hard reset) so arbitrarily
19037 19041 * set device reset event for an attached device (if any).
19038 19042 * If the port is in SHUTDOWN or FAILED state, ignore link events.
19039 19043 *
19040 19044 * The link established event processing varies, depending on the state
19041 19045 * of the target node, HBA hotplugging capabilities, state of the port.
19042 19046 * If the link is not active, the link established event is ignored.
19043 19047 * If HBA cannot detect device attachment and there is no target node,
19044 19048 * the link established event triggers device attach event processing.
19045 19049 * Else, link established event triggers device reset event processing.
19046 19050 *
19047 19051 * The link lost event processing varies, depending on a HBA hotplugging
19048 19052 * capability and the state of the port (link active or not active).
19049 19053 * If the link is active, the lost link event is ignored.
19050 19054 * If HBA cannot detect device removal, the lost link event triggers
19051 19055 * device detached event processing after link lost timeout.
19052 19056 * Else, the event is ignored.
19053 19057 *
19054 19058 * NOTE: Port multiplier ports events are handled by
19055 19059 * sata_process_pmport_link_events();
19056 19060 */
19057 19061 static void
19058 19062 sata_process_port_link_events(sata_hba_inst_t *sata_hba_inst,
19059 19063 sata_address_t *saddr)
19060 19064 {
19061 19065 sata_device_t sata_device;
19062 19066 sata_cport_info_t *cportinfo;
19063 19067 sata_drive_info_t *sdinfo;
19064 19068 uint32_t event_flags;
19065 19069 int rval;
19066 19070
19067 19071 SATADBG1(SATA_DBG_EVENTS_PROC, sata_hba_inst,
19068 19072 "Processing port %d link event(s)", saddr->cport);
19069 19073
19070 19074 cportinfo = SATA_CPORT_INFO(sata_hba_inst, saddr->cport);
19071 19075 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->cport_mutex);
19072 19076 event_flags = cportinfo->cport_event_flags;
19073 19077
19074 19078 /* Reset event flags first */
19075 19079 cportinfo->cport_event_flags &=
19076 19080 ~(SATA_EVNT_LINK_ESTABLISHED | SATA_EVNT_LINK_LOST);
19077 19081
19078 19082 /* If the port is in SHUTDOWN or FAILED state, ignore link events. */
19079 19083 if ((cportinfo->cport_state &
19080 19084 (SATA_PSTATE_SHUTDOWN | SATA_PSTATE_FAILED)) != 0) {
19081 19085 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->
19082 19086 cport_mutex);
19083 19087 return;
19084 19088 }
19085 19089
19086 19090 /*
19087 19091 * For the sanity sake get current port state.
19088 19092 * Set device address only. Other sata_device fields should be
19089 19093 * set by HBA driver.
19090 19094 */
19091 19095 sata_device.satadev_rev = SATA_DEVICE_REV;
19092 19096 sata_device.satadev_addr = *saddr;
19093 19097 /*
19094 19098 * We have to exit mutex, because the HBA probe port function may
19095 19099 * block on its own mutex.
19096 19100 */
19097 19101 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->cport_mutex);
19098 19102 rval = (*SATA_PROBE_PORT_FUNC(sata_hba_inst))
19099 19103 (SATA_DIP(sata_hba_inst), &sata_device);
19100 19104 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->cport_mutex);
19101 19105 sata_update_port_info(sata_hba_inst, &sata_device);
19102 19106 if (rval != SATA_SUCCESS) {
19103 19107 /* Something went wrong? Fail the port */
19104 19108 cportinfo->cport_state = SATA_PSTATE_FAILED;
19105 19109 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->
19106 19110 cport_mutex);
19107 19111 SATA_LOG_D((sata_hba_inst, CE_WARN,
19108 19112 "SATA port %d probing failed",
19109 19113 saddr->cport));
19110 19114 /*
19111 19115 * We may want to release device info structure, but
19112 19116 * it is not necessary.
19113 19117 */
19114 19118 return;
19115 19119 } else {
19116 19120 /* port probed successfully */
19117 19121 cportinfo->cport_state |= SATA_STATE_PROBED | SATA_STATE_READY;
19118 19122 }
19119 19123 if (event_flags & SATA_EVNT_LINK_ESTABLISHED) {
19120 19124
19121 19125 if ((sata_device.satadev_scr.sstatus &
19122 19126 SATA_PORT_DEVLINK_UP_MASK) != SATA_PORT_DEVLINK_UP) {
19123 19127 /* Ignore event */
19124 19128 SATADBG1(SATA_DBG_EVENTS_PROC, sata_hba_inst,
19125 19129 "Ignoring port %d link established event - "
19126 19130 "link down",
19127 19131 saddr->cport);
19128 19132 goto linklost;
19129 19133 }
19130 19134
19131 19135 SATADBG1(SATA_DBG_EVENTS_PROC, sata_hba_inst,
19132 19136 "Processing port %d link established event",
19133 19137 saddr->cport);
19134 19138
19135 19139 /*
19136 19140 * For the sanity sake check if a device is attached - check
19137 19141 * return state of a port probing.
19138 19142 */
19139 19143 if (sata_device.satadev_type != SATA_DTYPE_NONE) {
19140 19144 /*
19141 19145 * HBA port probe indicated that there is a device
19142 19146 * attached. Check if the framework had device info
19143 19147 * structure attached for this device.
19144 19148 */
19145 19149 if (cportinfo->cport_dev_type != SATA_DTYPE_NONE) {
19146 19150 ASSERT(SATA_CPORTINFO_DRV_INFO(cportinfo) !=
19147 19151 NULL);
19148 19152
19149 19153 sdinfo = SATA_CPORTINFO_DRV_INFO(cportinfo);
19150 19154 if ((sdinfo->satadrv_type &
19151 19155 SATA_VALID_DEV_TYPE) != 0) {
19152 19156 /*
19153 19157 * Dev info structure is present.
19154 19158 * If dev_type is set to known type in
19155 19159 * the framework's drive info struct
19156 19160 * then the device existed before and
19157 19161 * the link was probably lost
19158 19162 * momentarily - in such case
19159 19163 * we may want to check device
19160 19164 * identity.
19161 19165 * Identity check is not supported now.
19162 19166 *
19163 19167 * Link established event
19164 19168 * triggers device reset event.
19165 19169 */
19166 19170 (SATA_CPORTINFO_DRV_INFO(cportinfo))->
19167 19171 satadrv_event_flags |=
19168 19172 SATA_EVNT_DEVICE_RESET;
19169 19173 }
19170 19174 } else if (cportinfo->cport_dev_type ==
19171 19175 SATA_DTYPE_NONE) {
19172 19176 /*
19173 19177 * We got new device attached! If HBA does not
19174 19178 * generate device attached events, trigger it
19175 19179 * here.
19176 19180 */
19177 19181 if (!(SATA_FEATURES(sata_hba_inst) &
19178 19182 SATA_CTLF_HOTPLUG)) {
19179 19183 cportinfo->cport_event_flags |=
19180 19184 SATA_EVNT_DEVICE_ATTACHED;
19181 19185 }
19182 19186 }
19183 19187 /* Reset link lost timeout */
19184 19188 cportinfo->cport_link_lost_time = 0;
19185 19189 }
19186 19190 }
19187 19191 linklost:
19188 19192 if (event_flags & SATA_EVNT_LINK_LOST) {
19189 19193 if ((sata_device.satadev_scr.sstatus &
19190 19194 SATA_PORT_DEVLINK_UP_MASK) == SATA_PORT_DEVLINK_UP) {
19191 19195 /* Ignore event */
19192 19196 SATADBG1(SATA_DBG_EVENTS_PROC, sata_hba_inst,
19193 19197 "Ignoring port %d link lost event - link is up",
19194 19198 saddr->cport);
19195 19199 goto done;
19196 19200 }
19197 19201 #ifdef SATA_DEBUG
19198 19202 if (cportinfo->cport_link_lost_time == 0) {
19199 19203 SATADBG1(SATA_DBG_EVENTS_PROC, sata_hba_inst,
19200 19204 "Processing port %d link lost event",
19201 19205 saddr->cport);
19202 19206 }
19203 19207 #endif
19204 19208 /*
19205 19209 * When HBA cannot generate device attached/detached events,
19206 19210 * we need to track link lost time and eventually generate
19207 19211 * device detach event.
19208 19212 */
19209 19213 if (!(SATA_FEATURES(sata_hba_inst) & SATA_CTLF_HOTPLUG)) {
19210 19214 /* We are tracking link lost time */
19211 19215 if (cportinfo->cport_link_lost_time == 0) {
19212 19216 /* save current time (lbolt value) */
19213 19217 cportinfo->cport_link_lost_time =
19214 19218 ddi_get_lbolt();
19215 19219 /* just keep link lost event */
19216 19220 cportinfo->cport_event_flags |=
19217 19221 SATA_EVNT_LINK_LOST;
19218 19222 } else {
19219 19223 clock_t cur_time = ddi_get_lbolt();
19220 19224 if ((cur_time -
19221 19225 cportinfo->cport_link_lost_time) >=
19222 19226 drv_usectohz(
19223 19227 SATA_EVNT_LINK_LOST_TIMEOUT)) {
19224 19228 /* trigger device detach event */
19225 19229 cportinfo->cport_event_flags |=
19226 19230 SATA_EVNT_DEVICE_DETACHED;
19227 19231 cportinfo->cport_link_lost_time = 0;
19228 19232 SATADBG1(SATA_DBG_EVENTS,
19229 19233 sata_hba_inst,
19230 19234 "Triggering port %d "
19231 19235 "device detached event",
19232 19236 saddr->cport);
19233 19237 } else {
19234 19238 /* keep link lost event */
19235 19239 cportinfo->cport_event_flags |=
19236 19240 SATA_EVNT_LINK_LOST;
19237 19241 }
19238 19242 }
19239 19243 }
19240 19244 /*
19241 19245 * We could change port state to disable/delay access to
19242 19246 * the attached device until the link is recovered.
19243 19247 */
19244 19248 }
19245 19249 done:
19246 19250 event_flags = cportinfo->cport_event_flags;
19247 19251 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->cport_mutex);
19248 19252 if (event_flags != 0) {
19249 19253 mutex_enter(&sata_hba_inst->satahba_mutex);
19250 19254 sata_hba_inst->satahba_event_flags |= SATA_EVNT_MAIN;
19251 19255 mutex_exit(&sata_hba_inst->satahba_mutex);
19252 19256 mutex_enter(&sata_mutex);
19253 19257 sata_event_pending |= SATA_EVNT_MAIN;
19254 19258 mutex_exit(&sata_mutex);
19255 19259 }
19256 19260 }
19257 19261
19258 19262 /*
19259 19263 * Port Multiplier Port Link Events processing.
19260 19264 */
19261 19265 static void
19262 19266 sata_process_pmport_link_events(sata_hba_inst_t *sata_hba_inst,
19263 19267 sata_address_t *saddr)
19264 19268 {
19265 19269 sata_device_t sata_device;
19266 19270 sata_pmport_info_t *pmportinfo = NULL;
19267 19271 sata_drive_info_t *sdinfo = NULL;
19268 19272 uint32_t event_flags;
19269 19273 uint8_t cport = saddr->cport;
19270 19274 uint8_t pmport = saddr->pmport;
19271 19275 int rval;
19272 19276
19273 19277 SATADBG2(SATA_DBG_EVENTS_PROC, sata_hba_inst,
19274 19278 "Processing port %d:%d link event(s)",
19275 19279 cport, pmport);
19276 19280
19277 19281 pmportinfo = SATA_PMPORT_INFO(sata_hba_inst, cport, pmport);
19278 19282 mutex_enter(&pmportinfo->pmport_mutex);
19279 19283 event_flags = pmportinfo->pmport_event_flags;
19280 19284
19281 19285 /* Reset event flags first */
19282 19286 pmportinfo->pmport_event_flags &=
19283 19287 ~(SATA_EVNT_LINK_ESTABLISHED | SATA_EVNT_LINK_LOST);
19284 19288
19285 19289 /* If the port is in SHUTDOWN or FAILED state, ignore link events. */
19286 19290 if ((pmportinfo->pmport_state &
19287 19291 (SATA_PSTATE_SHUTDOWN | SATA_PSTATE_FAILED)) != 0) {
19288 19292 mutex_exit(&pmportinfo->pmport_mutex);
19289 19293 return;
19290 19294 }
19291 19295
19292 19296 /*
19293 19297 * For the sanity sake get current port state.
19294 19298 * Set device address only. Other sata_device fields should be
19295 19299 * set by HBA driver.
19296 19300 */
19297 19301 sata_device.satadev_rev = SATA_DEVICE_REV;
19298 19302 sata_device.satadev_addr = *saddr;
19299 19303 /*
19300 19304 * We have to exit mutex, because the HBA probe port function may
19301 19305 * block on its own mutex.
19302 19306 */
19303 19307 mutex_exit(&SATA_PMPORT_MUTEX(sata_hba_inst, saddr->cport,
19304 19308 saddr->pmport));
19305 19309 rval = (*SATA_PROBE_PORT_FUNC(sata_hba_inst))
19306 19310 (SATA_DIP(sata_hba_inst), &sata_device);
19307 19311 mutex_enter(&SATA_PMPORT_MUTEX(sata_hba_inst, saddr->cport,
19308 19312 saddr->pmport));
19309 19313 sata_update_pmport_info(sata_hba_inst, &sata_device);
19310 19314 if (rval != SATA_SUCCESS) {
19311 19315 /* Something went wrong? Fail the port */
19312 19316 pmportinfo->pmport_state = SATA_PSTATE_FAILED;
19313 19317 mutex_exit(&SATA_PMPORT_MUTEX(sata_hba_inst, saddr->cport,
19314 19318 saddr->pmport));
19315 19319 SATA_LOG_D((sata_hba_inst, CE_WARN,
19316 19320 "SATA port %d:%d probing failed",
19317 19321 saddr->cport, saddr->pmport));
19318 19322 /*
19319 19323 * We may want to release device info structure, but
19320 19324 * it is not necessary.
19321 19325 */
19322 19326 return;
19323 19327 } else {
19324 19328 /* port probed successfully */
19325 19329 pmportinfo->pmport_state |=
19326 19330 SATA_STATE_PROBED | SATA_STATE_READY;
19327 19331 }
19328 19332 mutex_exit(&SATA_PMPORT_MUTEX(sata_hba_inst,
19329 19333 saddr->cport, saddr->pmport));
19330 19334 mutex_enter(&SATA_PMPORT_MUTEX(sata_hba_inst,
19331 19335 saddr->cport, saddr->pmport));
19332 19336 if (event_flags & SATA_EVNT_LINK_ESTABLISHED) {
19333 19337
19334 19338 if ((sata_device.satadev_scr.sstatus &
19335 19339 SATA_PORT_DEVLINK_UP_MASK) != SATA_PORT_DEVLINK_UP) {
19336 19340 /* Ignore event */
19337 19341 SATADBG2(SATA_DBG_EVENTS_PROC, sata_hba_inst,
19338 19342 "Ignoring port %d:%d link established event - "
19339 19343 "link down",
19340 19344 saddr->cport, saddr->pmport);
19341 19345 goto linklost;
19342 19346 }
19343 19347
19344 19348 SATADBG2(SATA_DBG_EVENTS_PROC, sata_hba_inst,
19345 19349 "Processing port %d:%d link established event",
19346 19350 cport, pmport);
19347 19351
19348 19352 /*
19349 19353 * For the sanity sake check if a device is attached - check
19350 19354 * return state of a port probing.
19351 19355 */
19352 19356 if (sata_device.satadev_type != SATA_DTYPE_NONE &&
19353 19357 sata_device.satadev_type != SATA_DTYPE_PMULT) {
19354 19358 /*
19355 19359 * HBA port probe indicated that there is a device
19356 19360 * attached. Check if the framework had device info
19357 19361 * structure attached for this device.
19358 19362 */
19359 19363 if (pmportinfo->pmport_dev_type != SATA_DTYPE_NONE) {
19360 19364 ASSERT(SATA_PMPORTINFO_DRV_INFO(pmportinfo) !=
19361 19365 NULL);
19362 19366
19363 19367 sdinfo = SATA_PMPORTINFO_DRV_INFO(pmportinfo);
19364 19368 if ((sdinfo->satadrv_type &
19365 19369 SATA_VALID_DEV_TYPE) != 0) {
19366 19370 /*
19367 19371 * Dev info structure is present.
19368 19372 * If dev_type is set to known type in
19369 19373 * the framework's drive info struct
19370 19374 * then the device existed before and
19371 19375 * the link was probably lost
19372 19376 * momentarily - in such case
19373 19377 * we may want to check device
19374 19378 * identity.
19375 19379 * Identity check is not supported now.
19376 19380 *
19377 19381 * Link established event
19378 19382 * triggers device reset event.
19379 19383 */
19380 19384 (SATA_PMPORTINFO_DRV_INFO(pmportinfo))->
19381 19385 satadrv_event_flags |=
19382 19386 SATA_EVNT_DEVICE_RESET;
19383 19387 }
19384 19388 } else if (pmportinfo->pmport_dev_type ==
19385 19389 SATA_DTYPE_NONE) {
19386 19390 /*
19387 19391 * We got new device attached! If HBA does not
19388 19392 * generate device attached events, trigger it
19389 19393 * here.
19390 19394 */
19391 19395 if (!(SATA_FEATURES(sata_hba_inst) &
19392 19396 SATA_CTLF_HOTPLUG)) {
19393 19397 pmportinfo->pmport_event_flags |=
19394 19398 SATA_EVNT_DEVICE_ATTACHED;
19395 19399 }
19396 19400 }
19397 19401 /* Reset link lost timeout */
19398 19402 pmportinfo->pmport_link_lost_time = 0;
19399 19403 }
19400 19404 }
19401 19405 linklost:
19402 19406 if (event_flags & SATA_EVNT_LINK_LOST) {
19403 19407 #ifdef SATA_DEBUG
19404 19408 if (pmportinfo->pmport_link_lost_time == 0) {
19405 19409 SATADBG2(SATA_DBG_EVENTS_PROC, sata_hba_inst,
19406 19410 "Processing port %d:%d link lost event",
19407 19411 saddr->cport, saddr->pmport);
19408 19412 }
19409 19413 #endif
19410 19414 if ((sata_device.satadev_scr.sstatus &
19411 19415 SATA_PORT_DEVLINK_UP_MASK) == SATA_PORT_DEVLINK_UP) {
19412 19416 /* Ignore event */
19413 19417 SATADBG2(SATA_DBG_EVENTS_PROC, sata_hba_inst,
19414 19418 "Ignoring port %d:%d link lost event - link is up",
19415 19419 saddr->cport, saddr->pmport);
19416 19420 goto done;
19417 19421 }
19418 19422 /*
19419 19423 * When HBA cannot generate device attached/detached events,
19420 19424 * we need to track link lost time and eventually generate
19421 19425 * device detach event.
19422 19426 */
19423 19427 if (!(SATA_FEATURES(sata_hba_inst) & SATA_CTLF_HOTPLUG)) {
19424 19428 /* We are tracking link lost time */
19425 19429 if (pmportinfo->pmport_link_lost_time == 0) {
19426 19430 /* save current time (lbolt value) */
19427 19431 pmportinfo->pmport_link_lost_time =
19428 19432 ddi_get_lbolt();
19429 19433 /* just keep link lost event */
19430 19434 pmportinfo->pmport_event_flags |=
19431 19435 SATA_EVNT_LINK_LOST;
19432 19436 } else {
19433 19437 clock_t cur_time = ddi_get_lbolt();
19434 19438 if ((cur_time -
19435 19439 pmportinfo->pmport_link_lost_time) >=
19436 19440 drv_usectohz(
19437 19441 SATA_EVNT_LINK_LOST_TIMEOUT)) {
19438 19442 /* trigger device detach event */
19439 19443 pmportinfo->pmport_event_flags |=
19440 19444 SATA_EVNT_DEVICE_DETACHED;
19441 19445 pmportinfo->pmport_link_lost_time = 0;
19442 19446 SATADBG2(SATA_DBG_EVENTS,
19443 19447 sata_hba_inst,
19444 19448 "Triggering port %d:%d "
19445 19449 "device detached event",
19446 19450 saddr->cport, saddr->pmport);
19447 19451 } else {
19448 19452 /* keep link lost event */
19449 19453 pmportinfo->pmport_event_flags |=
19450 19454 SATA_EVNT_LINK_LOST;
19451 19455 }
19452 19456 }
19453 19457 }
19454 19458 /*
19455 19459 * We could change port state to disable/delay access to
19456 19460 * the attached device until the link is recovered.
19457 19461 */
19458 19462 }
19459 19463 done:
19460 19464 event_flags = pmportinfo->pmport_event_flags;
19461 19465 mutex_exit(&SATA_PMPORT_MUTEX(sata_hba_inst, saddr->cport,
19462 19466 saddr->pmport));
19463 19467 if (event_flags != 0) {
19464 19468 mutex_enter(&sata_hba_inst->satahba_mutex);
19465 19469 sata_hba_inst->satahba_event_flags |= SATA_EVNT_MAIN;
19466 19470 mutex_exit(&sata_hba_inst->satahba_mutex);
19467 19471 mutex_enter(&sata_mutex);
19468 19472 sata_event_pending |= SATA_EVNT_MAIN;
19469 19473 mutex_exit(&sata_mutex);
19470 19474 }
19471 19475 }
19472 19476
19473 19477 /*
19474 19478 * Device Detached Event processing.
19475 19479 * Port is probed to find if a device is really gone. If so,
19476 19480 * the device info structure is detached from the SATA port info structure
19477 19481 * and released.
19478 19482 * Port status is updated.
19479 19483 *
19480 19484 * NOTE: Port multiplier ports events are handled by
19481 19485 * sata_process_pmdevice_detached()
19482 19486 */
19483 19487 static void
19484 19488 sata_process_device_detached(sata_hba_inst_t *sata_hba_inst,
19485 19489 sata_address_t *saddr)
19486 19490 {
19487 19491 sata_cport_info_t *cportinfo;
19488 19492 sata_pmport_info_t *pmportinfo;
19489 19493 sata_drive_info_t *sdevinfo;
19490 19494 sata_device_t sata_device;
19491 19495 sata_address_t pmport_addr;
19492 19496 char name[16];
19493 19497 uint8_t cport = saddr->cport;
19494 19498 int npmport;
19495 19499 int rval;
19496 19500
19497 19501 SATADBG1(SATA_DBG_EVENTS_PROC, sata_hba_inst,
19498 19502 "Processing port %d device detached", saddr->cport);
19499 19503
19500 19504 cportinfo = SATA_CPORT_INFO(sata_hba_inst, saddr->cport);
19501 19505 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->cport_mutex);
19502 19506 /* Clear event flag */
19503 19507 cportinfo->cport_event_flags &= ~SATA_EVNT_DEVICE_DETACHED;
19504 19508
19505 19509 /* If the port is in SHUTDOWN or FAILED state, ignore detach event. */
19506 19510 if ((cportinfo->cport_state &
19507 19511 (SATA_PSTATE_SHUTDOWN | SATA_PSTATE_FAILED)) != 0) {
19508 19512 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->
19509 19513 cport_mutex);
19510 19514 return;
19511 19515 }
19512 19516 /* For sanity, re-probe the port */
19513 19517 sata_device.satadev_rev = SATA_DEVICE_REV;
19514 19518 sata_device.satadev_addr = *saddr;
19515 19519
19516 19520 /*
19517 19521 * We have to exit mutex, because the HBA probe port function may
19518 19522 * block on its own mutex.
19519 19523 */
19520 19524 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->cport_mutex);
19521 19525 rval = (*SATA_PROBE_PORT_FUNC(sata_hba_inst))
19522 19526 (SATA_DIP(sata_hba_inst), &sata_device);
19523 19527 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->cport_mutex);
19524 19528 sata_update_port_info(sata_hba_inst, &sata_device);
19525 19529 if (rval != SATA_SUCCESS) {
19526 19530 /* Something went wrong? Fail the port */
19527 19531 cportinfo->cport_state = SATA_PSTATE_FAILED;
19528 19532 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->
19529 19533 cport_mutex);
19530 19534 SATA_LOG_D((sata_hba_inst, CE_WARN,
19531 19535 "SATA port %d probing failed",
19532 19536 saddr->cport));
19533 19537 /*
19534 19538 * We may want to release device info structure, but
19535 19539 * it is not necessary.
19536 19540 */
19537 19541 return;
19538 19542 } else {
19539 19543 /* port probed successfully */
19540 19544 cportinfo->cport_state |= SATA_STATE_PROBED | SATA_STATE_READY;
19541 19545 }
19542 19546 /*
19543 19547 * Check if a device is still attached. For sanity, check also
19544 19548 * link status - if no link, there is no device.
19545 19549 */
19546 19550 if ((sata_device.satadev_scr.sstatus & SATA_PORT_DEVLINK_UP_MASK) ==
19547 19551 SATA_PORT_DEVLINK_UP && sata_device.satadev_type !=
19548 19552 SATA_DTYPE_NONE) {
19549 19553 /*
19550 19554 * Device is still attached - ignore detach event.
19551 19555 */
19552 19556 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->
19553 19557 cport_mutex);
19554 19558 SATADBG1(SATA_DBG_EVENTS_PROC, sata_hba_inst,
19555 19559 "Ignoring detach - device still attached to port %d",
19556 19560 sata_device.satadev_addr.cport);
19557 19561 return;
19558 19562 }
19559 19563 /*
19560 19564 * We need to detach and release device info structure here
19561 19565 */
19562 19566 if (cportinfo->cport_dev_type == SATA_DTYPE_PMULT) {
19563 19567 /*
19564 19568 * A port-multiplier is removed.
19565 19569 *
19566 19570 * Calling sata_process_pmdevice_detached() does not work
19567 19571 * here. The port multiplier is gone, so we cannot probe
19568 19572 * sub-port any more and all pmult-related data structure must
19569 19573 * be de-allocated immediately. Following structure of every
19570 19574 * implemented sub-port behind the pmult are required to
19571 19575 * released.
19572 19576 *
19573 19577 * - attachment point
19574 19578 * - target node
19575 19579 * - sata_drive_info
19576 19580 * - sata_pmport_info
19577 19581 */
19578 19582 for (npmport = 0; npmport < SATA_NUM_PMPORTS(sata_hba_inst,
19579 19583 cport); npmport ++) {
19580 19584 SATADBG2(SATA_DBG_PMULT|SATA_DBG_EVENTS_PROC,
19581 19585 sata_hba_inst,
19582 19586 "Detaching target node at port %d:%d",
19583 19587 cport, npmport);
19584 19588
19585 19589 mutex_exit(&SATA_CPORT_MUTEX(sata_hba_inst, cport));
19586 19590
19587 19591 /* Remove attachment point. */
19588 19592 name[0] = '\0';
19589 19593 (void) sprintf(name, "%d.%d", cport, npmport);
19590 19594 ddi_remove_minor_node(SATA_DIP(sata_hba_inst), name);
19591 19595 sata_log(sata_hba_inst, CE_NOTE,
19592 19596 "Remove attachment point of port %d:%d",
19593 19597 cport, npmport);
19594 19598
19595 19599 /* Remove target node */
19596 19600 pmport_addr.cport = cport;
19597 19601 pmport_addr.pmport = (uint8_t)npmport;
19598 19602 pmport_addr.qual = SATA_ADDR_PMPORT;
19599 19603 sata_remove_target_node(sata_hba_inst, &pmport_addr);
19600 19604
19601 19605 mutex_enter(&SATA_CPORT_MUTEX(sata_hba_inst, cport));
19602 19606
19603 19607 /* Release sata_pmport_info & sata_drive_info. */
19604 19608 pmportinfo = SATA_PMPORT_INFO(sata_hba_inst,
19605 19609 cport, npmport);
19606 19610 ASSERT(pmportinfo != NULL);
19607 19611
19608 19612 sdevinfo = SATA_PMPORTINFO_DRV_INFO(pmportinfo);
19609 19613 if (sdevinfo != NULL) {
19610 19614 (void) kmem_free((void *) sdevinfo,
19611 19615 sizeof (sata_drive_info_t));
19612 19616 }
19613 19617
19614 19618 /* Release sata_pmport_info at last */
19615 19619 (void) kmem_free((void *) pmportinfo,
19616 19620 sizeof (sata_pmport_info_t));
19617 19621 }
19618 19622
19619 19623 /* Finally, release sata_pmult_info */
19620 19624 (void) kmem_free((void *)
19621 19625 SATA_CPORTINFO_PMULT_INFO(cportinfo),
19622 19626 sizeof (sata_pmult_info_t));
19623 19627 SATA_CPORTINFO_PMULT_INFO(cportinfo) = NULL;
19624 19628
19625 19629 sata_log(sata_hba_inst, CE_WARN,
19626 19630 "SATA port-multiplier detached at port %d", cport);
19627 19631
19628 19632 cportinfo->cport_dev_type = SATA_DTYPE_NONE;
19629 19633 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst,
19630 19634 saddr->cport)->cport_mutex);
19631 19635 } else {
19632 19636 if (SATA_CPORTINFO_DRV_INFO(cportinfo) != NULL) {
19633 19637 sdevinfo = SATA_CPORTINFO_DRV_INFO(cportinfo);
19634 19638 SATA_CPORTINFO_DRV_INFO(cportinfo) = NULL;
19635 19639 (void) kmem_free((void *)sdevinfo,
19636 19640 sizeof (sata_drive_info_t));
19637 19641 }
19638 19642 sata_log(sata_hba_inst, CE_WARN,
19639 19643 "SATA device detached at port %d", cport);
19640 19644
19641 19645 cportinfo->cport_dev_type = SATA_DTYPE_NONE;
19642 19646 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst,
19643 19647 saddr->cport)->cport_mutex);
19644 19648
19645 19649 /*
19646 19650 * Try to offline a device and remove target node
19647 19651 * if it still exists
19648 19652 */
19649 19653 sata_remove_target_node(sata_hba_inst, saddr);
19650 19654 }
19651 19655
19652 19656
19653 19657 /*
19654 19658 * Generate sysevent - EC_DR / ESC_DR_AP_STATE_CHANGE
19655 19659 * with the hint: SE_HINT_REMOVE
19656 19660 */
19657 19661 sata_gen_sysevent(sata_hba_inst, saddr, SE_HINT_REMOVE);
19658 19662 }
19659 19663
19660 19664 /*
19661 19665 * Port Multiplier Port Device Deattached Event processing.
19662 19666 *
19663 19667 * NOTE: No Mutex should be hold.
19664 19668 */
19665 19669 static void
19666 19670 sata_process_pmdevice_detached(sata_hba_inst_t *sata_hba_inst,
19667 19671 sata_address_t *saddr)
19668 19672 {
19669 19673 sata_pmport_info_t *pmportinfo;
19670 19674 sata_drive_info_t *sdevinfo;
19671 19675 sata_device_t sata_device;
19672 19676 int rval;
19673 19677 uint8_t cport, pmport;
19674 19678
19675 19679 cport = saddr->cport;
19676 19680 pmport = saddr->pmport;
19677 19681
19678 19682 SATADBG2(SATA_DBG_EVENTS_PROC, sata_hba_inst,
19679 19683 "Processing port %d:%d device detached",
19680 19684 cport, pmport);
19681 19685
19682 19686 pmportinfo = SATA_PMPORT_INFO(sata_hba_inst, cport, pmport);
19683 19687 mutex_enter(&SATA_PMPORT_MUTEX(sata_hba_inst, cport, pmport));
19684 19688
19685 19689 /* Clear event flag */
19686 19690 pmportinfo->pmport_event_flags &= ~SATA_EVNT_DEVICE_DETACHED;
19687 19691
19688 19692 /* If the port is in SHUTDOWN or FAILED state, ignore detach event. */
19689 19693 if ((pmportinfo->pmport_state &
19690 19694 (SATA_PSTATE_SHUTDOWN | SATA_PSTATE_FAILED)) != 0) {
19691 19695 mutex_exit(&SATA_PMPORT_MUTEX(sata_hba_inst, cport, pmport));
19692 19696 return;
19693 19697 }
19694 19698 /* For sanity, re-probe the port */
19695 19699 sata_device.satadev_rev = SATA_DEVICE_REV;
19696 19700 sata_device.satadev_addr = *saddr;
19697 19701
19698 19702 /*
19699 19703 * We have to exit mutex, because the HBA probe port function may
19700 19704 * block on its own mutex.
19701 19705 */
19702 19706 mutex_exit(&SATA_PMPORT_MUTEX(sata_hba_inst, cport, pmport));
19703 19707 rval = (*SATA_PROBE_PORT_FUNC(sata_hba_inst))
19704 19708 (SATA_DIP(sata_hba_inst), &sata_device);
19705 19709 mutex_enter(&SATA_PMPORT_MUTEX(sata_hba_inst, cport, pmport));
19706 19710 sata_update_pmport_info(sata_hba_inst, &sata_device);
19707 19711 if (rval != SATA_SUCCESS) {
19708 19712 /* Something went wrong? Fail the port */
19709 19713 pmportinfo->pmport_state = SATA_PSTATE_FAILED;
19710 19714 mutex_exit(&SATA_PMPORT_MUTEX(sata_hba_inst, cport, pmport));
19711 19715 SATA_LOG_D((sata_hba_inst, CE_WARN,
19712 19716 "SATA port %d:%d probing failed",
19713 19717 saddr->pmport));
19714 19718 /*
19715 19719 * We may want to release device info structure, but
19716 19720 * it is not necessary.
19717 19721 */
19718 19722 return;
19719 19723 } else {
19720 19724 /* port probed successfully */
19721 19725 pmportinfo->pmport_state |=
19722 19726 SATA_STATE_PROBED | SATA_STATE_READY;
19723 19727 }
19724 19728 /*
19725 19729 * Check if a device is still attached. For sanity, check also
19726 19730 * link status - if no link, there is no device.
19727 19731 */
19728 19732 if ((sata_device.satadev_scr.sstatus & SATA_PORT_DEVLINK_UP_MASK) ==
19729 19733 SATA_PORT_DEVLINK_UP && sata_device.satadev_type !=
19730 19734 SATA_DTYPE_NONE) {
19731 19735 /*
19732 19736 * Device is still attached - ignore detach event.
19733 19737 */
19734 19738 mutex_exit(&SATA_PMPORT_MUTEX(sata_hba_inst, cport, pmport));
19735 19739 SATADBG1(SATA_DBG_EVENTS_PROC, sata_hba_inst,
19736 19740 "Ignoring detach - device still attached to port %d",
19737 19741 sata_device.satadev_addr.pmport);
19738 19742 return;
19739 19743 }
19740 19744 /*
19741 19745 * We need to detach and release device info structure here
19742 19746 */
19743 19747 if (SATA_PMPORTINFO_DRV_INFO(pmportinfo) != NULL) {
19744 19748 sdevinfo = SATA_PMPORTINFO_DRV_INFO(pmportinfo);
19745 19749 SATA_PMPORTINFO_DRV_INFO(pmportinfo) = NULL;
19746 19750 (void) kmem_free((void *)sdevinfo,
19747 19751 sizeof (sata_drive_info_t));
19748 19752 }
19749 19753 pmportinfo->pmport_dev_type = SATA_DTYPE_NONE;
19750 19754 /*
19751 19755 * Device cannot be reached anymore, even if the target node may be
19752 19756 * still present.
19753 19757 */
19754 19758 mutex_exit(&SATA_PMPORT_MUTEX(sata_hba_inst, cport, pmport));
19755 19759
19756 19760 /*
19757 19761 * Try to offline a device and remove target node if it still exists
19758 19762 */
19759 19763 sata_remove_target_node(sata_hba_inst, saddr);
19760 19764
19761 19765 /*
19762 19766 * Generate sysevent - EC_DR / ESC_DR_AP_STATE_CHANGE
19763 19767 * with the hint: SE_HINT_REMOVE
19764 19768 */
19765 19769 sata_gen_sysevent(sata_hba_inst, saddr, SE_HINT_REMOVE);
19766 19770 }
19767 19771
19768 19772
19769 19773 /*
19770 19774 * Device Attached Event processing.
19771 19775 * Port state is checked to verify that a device is really attached. If so,
19772 19776 * the device info structure is created and attached to the SATA port info
19773 19777 * structure.
19774 19778 *
19775 19779 * If attached device cannot be identified or set-up, the retry for the
19776 19780 * attach processing is set-up. Subsequent daemon run would try again to
19777 19781 * identify the device, until the time limit is reached
19778 19782 * (SATA_DEV_IDENTIFY_TIMEOUT).
19779 19783 *
19780 19784 * This function cannot be called in interrupt context (it may sleep).
19781 19785 *
19782 19786 * NOTE: Port multiplier ports events are handled by
19783 19787 * sata_process_pmdevice_attached()
19784 19788 */
19785 19789 static void
19786 19790 sata_process_device_attached(sata_hba_inst_t *sata_hba_inst,
19787 19791 sata_address_t *saddr)
19788 19792 {
19789 19793 sata_cport_info_t *cportinfo = NULL;
19790 19794 sata_drive_info_t *sdevinfo = NULL;
19791 19795 sata_pmult_info_t *pmultinfo = NULL;
19792 19796 sata_pmport_info_t *pmportinfo = NULL;
19793 19797 sata_device_t sata_device;
19794 19798 dev_info_t *tdip;
19795 19799 uint32_t event_flags = 0, pmult_event_flags = 0;
19796 19800 int rval;
19797 19801 int npmport;
19798 19802
19799 19803 SATADBG1(SATA_DBG_EVENTS_PROC, sata_hba_inst,
19800 19804 "Processing port %d device attached", saddr->cport);
19801 19805
19802 19806 cportinfo = SATA_CPORT_INFO(sata_hba_inst, saddr->cport);
19803 19807 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->cport_mutex);
19804 19808
19805 19809 /* Clear attach event flag first */
19806 19810 cportinfo->cport_event_flags &= ~SATA_EVNT_DEVICE_ATTACHED;
19807 19811
19808 19812 /* If the port is in SHUTDOWN or FAILED state, ignore event. */
19809 19813 if ((cportinfo->cport_state &
19810 19814 (SATA_PSTATE_SHUTDOWN | SATA_PSTATE_FAILED)) != 0) {
19811 19815 cportinfo->cport_dev_attach_time = 0;
19812 19816 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->
19813 19817 cport_mutex);
19814 19818 return;
19815 19819 }
19816 19820
19817 19821 /*
19818 19822 * If the sata_drive_info structure is found attached to the port info,
19819 19823 * despite the fact the device was removed and now it is re-attached,
19820 19824 * the old drive info structure was not removed.
19821 19825 * Arbitrarily release device info structure.
19822 19826 */
19823 19827 if (SATA_CPORTINFO_DRV_INFO(cportinfo) != NULL) {
19824 19828 sdevinfo = SATA_CPORTINFO_DRV_INFO(cportinfo);
19825 19829 SATA_CPORTINFO_DRV_INFO(cportinfo) = NULL;
19826 19830 (void) kmem_free((void *)sdevinfo,
19827 19831 sizeof (sata_drive_info_t));
19828 19832 SATADBG1(SATA_DBG_EVENTS_PROC, sata_hba_inst,
19829 19833 "Arbitrarily detaching old device info.", NULL);
19830 19834 }
19831 19835 cportinfo->cport_dev_type = SATA_DTYPE_NONE;
19832 19836
19833 19837 /* For sanity, re-probe the port */
19834 19838 sata_device.satadev_rev = SATA_DEVICE_REV;
19835 19839 sata_device.satadev_addr = *saddr;
19836 19840
19837 19841 /*
19838 19842 * We have to exit mutex, because the HBA probe port function may
19839 19843 * block on its own mutex.
19840 19844 */
19841 19845 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->cport_mutex);
19842 19846 rval = (*SATA_PROBE_PORT_FUNC(sata_hba_inst))
19843 19847 (SATA_DIP(sata_hba_inst), &sata_device);
19844 19848 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->cport_mutex);
19845 19849 sata_update_port_info(sata_hba_inst, &sata_device);
19846 19850 if (rval != SATA_SUCCESS) {
19847 19851 /* Something went wrong? Fail the port */
19848 19852 cportinfo->cport_state = SATA_PSTATE_FAILED;
19849 19853 cportinfo->cport_dev_attach_time = 0;
19850 19854 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->
19851 19855 cport_mutex);
19852 19856 SATA_LOG_D((sata_hba_inst, CE_WARN,
19853 19857 "SATA port %d probing failed",
19854 19858 saddr->cport));
19855 19859 return;
19856 19860 } else {
19857 19861 /* port probed successfully */
19858 19862 cportinfo->cport_state |= SATA_STATE_PROBED | SATA_STATE_READY;
19859 19863 }
19860 19864 /*
19861 19865 * Check if a device is still attached. For sanity, check also
19862 19866 * link status - if no link, there is no device.
19863 19867 */
19864 19868 if ((sata_device.satadev_scr.sstatus & SATA_PORT_DEVLINK_UP_MASK) !=
19865 19869 SATA_PORT_DEVLINK_UP || sata_device.satadev_type ==
19866 19870 SATA_DTYPE_NONE) {
19867 19871 /*
19868 19872 * No device - ignore attach event.
19869 19873 */
19870 19874 cportinfo->cport_dev_attach_time = 0;
19871 19875 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->
19872 19876 cport_mutex);
19873 19877 SATADBG1(SATA_DBG_EVENTS_PROC, sata_hba_inst,
19874 19878 "Ignoring attach - no device connected to port %d",
19875 19879 sata_device.satadev_addr.cport);
19876 19880 return;
19877 19881 }
19878 19882
19879 19883 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->cport_mutex);
19880 19884 /*
19881 19885 * Generate sysevent - EC_DR / ESC_DR_AP_STATE_CHANGE
19882 19886 * with the hint: SE_HINT_INSERT
19883 19887 */
19884 19888 sata_gen_sysevent(sata_hba_inst, saddr, SE_HINT_INSERT);
19885 19889
19886 19890 /*
19887 19891 * Port reprobing will take care of the creation of the device
19888 19892 * info structure and determination of the device type.
19889 19893 */
19890 19894 sata_device.satadev_addr = *saddr;
19891 19895 (void) sata_reprobe_port(sata_hba_inst, &sata_device,
19892 19896 SATA_DEV_IDENTIFY_NORETRY);
19893 19897
19894 19898 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->
19895 19899 cport_mutex);
19896 19900 if ((cportinfo->cport_state & SATA_STATE_READY) &&
19897 19901 (cportinfo->cport_dev_type != SATA_DTYPE_NONE)) {
19898 19902 /* Some device is attached to the port */
19899 19903 if (cportinfo->cport_dev_type == SATA_DTYPE_UNKNOWN) {
19900 19904 /*
19901 19905 * A device was not successfully attached.
19902 19906 * Track retry time for device identification.
19903 19907 */
19904 19908 if (cportinfo->cport_dev_attach_time != 0) {
19905 19909 clock_t cur_time = ddi_get_lbolt();
19906 19910 /*
19907 19911 * If the retry time limit was not exceeded,
19908 19912 * reinstate attach event.
19909 19913 */
19910 19914 if ((cur_time -
19911 19915 cportinfo->cport_dev_attach_time) <
19912 19916 drv_usectohz(
19913 19917 SATA_DEV_IDENTIFY_TIMEOUT)) {
19914 19918 /* OK, restore attach event */
19915 19919 cportinfo->cport_event_flags |=
19916 19920 SATA_EVNT_DEVICE_ATTACHED;
19917 19921 } else {
19918 19922 /* Timeout - cannot identify device */
19919 19923 cportinfo->cport_dev_attach_time = 0;
19920 19924 sata_log(sata_hba_inst,
19921 19925 CE_WARN,
19922 19926 "Could not identify SATA device "
19923 19927 "at port %d",
19924 19928 saddr->cport);
19925 19929 }
19926 19930 } else {
19927 19931 /*
19928 19932 * Start tracking time for device
19929 19933 * identification.
19930 19934 * Save current time (lbolt value).
19931 19935 */
19932 19936 cportinfo->cport_dev_attach_time =
19933 19937 ddi_get_lbolt();
19934 19938 /* Restore attach event */
19935 19939 cportinfo->cport_event_flags |=
19936 19940 SATA_EVNT_DEVICE_ATTACHED;
19937 19941 }
19938 19942 } else if (cportinfo->cport_dev_type == SATA_DTYPE_PMULT) {
19939 19943 cportinfo->cport_dev_attach_time = 0;
19940 19944 sata_log(sata_hba_inst, CE_NOTE,
19941 19945 "SATA port-multiplier detected at port %d",
19942 19946 saddr->cport);
19943 19947
19944 19948 if (SATA_CPORTINFO_PMULT_INFO(cportinfo) != NULL) {
19945 19949 /* Log the info of new port multiplier */
19946 19950 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst,
19947 19951 saddr->cport)->cport_mutex);
19948 19952 sata_show_pmult_info(sata_hba_inst,
19949 19953 &sata_device);
19950 19954 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst,
19951 19955 saddr->cport)->cport_mutex);
19952 19956 }
19953 19957
19954 19958 ASSERT(SATA_CPORTINFO_PMULT_INFO(cportinfo) != NULL);
19955 19959 pmultinfo = SATA_CPORTINFO_PMULT_INFO(cportinfo);
19956 19960 for (npmport = 0; npmport <
19957 19961 pmultinfo->pmult_num_dev_ports; npmport++) {
19958 19962 pmportinfo = SATA_PMPORT_INFO(sata_hba_inst,
19959 19963 saddr->cport, npmport);
19960 19964 ASSERT(pmportinfo != NULL);
19961 19965
19962 19966 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst,
19963 19967 saddr->cport)->cport_mutex);
19964 19968 mutex_enter(&pmportinfo->pmport_mutex);
19965 19969 /* Marked all pmports with link events. */
19966 19970 pmportinfo->pmport_event_flags =
19967 19971 SATA_EVNT_LINK_ESTABLISHED;
19968 19972 pmult_event_flags |=
19969 19973 pmportinfo->pmport_event_flags;
19970 19974 mutex_exit(&pmportinfo->pmport_mutex);
19971 19975 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst,
19972 19976 saddr->cport)->cport_mutex);
19973 19977 }
19974 19978 /* Auto-online is not available for PMult now. */
19975 19979
19976 19980 } else {
19977 19981 /*
19978 19982 * If device was successfully attached, the subsequent
19979 19983 * action depends on a state of the
19980 19984 * sata_auto_online variable. If it is set to zero.
19981 19985 * an explicit 'configure' command will be needed to
19982 19986 * configure it. If its value is non-zero, we will
19983 19987 * attempt to online (configure) the device.
19984 19988 * First, log the message indicating that a device
19985 19989 * was attached.
19986 19990 */
19987 19991 cportinfo->cport_dev_attach_time = 0;
19988 19992 sata_log(sata_hba_inst, CE_WARN,
19989 19993 "SATA device detected at port %d", saddr->cport);
19990 19994
19991 19995 if (SATA_CPORTINFO_DRV_INFO(cportinfo) != NULL) {
19992 19996 sata_drive_info_t new_sdinfo;
19993 19997
19994 19998 /* Log device info data */
19995 19999 new_sdinfo = *(SATA_CPORTINFO_DRV_INFO(
19996 20000 cportinfo));
19997 20001 sata_show_drive_info(sata_hba_inst,
19998 20002 &new_sdinfo);
19999 20003 }
20000 20004
20001 20005 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst,
20002 20006 saddr->cport)->cport_mutex);
20003 20007
20004 20008 /*
20005 20009 * Make sure that there is no target node for that
20006 20010 * device. If so, release it. It should not happen,
20007 20011 * unless we had problem removing the node when
20008 20012 * device was detached.
20009 20013 */
20010 20014 tdip = sata_get_target_dip(SATA_DIP(sata_hba_inst),
20011 20015 saddr->cport, saddr->pmport);
20012 20016 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst,
20013 20017 saddr->cport)->cport_mutex);
20014 20018 if (tdip != NULL) {
20015 20019
20016 20020 #ifdef SATA_DEBUG
20017 20021 if ((cportinfo->cport_event_flags &
20018 20022 SATA_EVNT_TARGET_NODE_CLEANUP) == 0)
20019 20023 sata_log(sata_hba_inst, CE_WARN,
20020 20024 "sata_process_device_attached: "
20021 20025 "old device target node exists!");
20022 20026 #endif
20023 20027 /*
20024 20028 * target node exists - try to unconfigure
20025 20029 * device and remove the node.
20026 20030 */
20027 20031 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst,
20028 20032 saddr->cport)->cport_mutex);
20029 20033 rval = ndi_devi_offline(tdip,
20030 20034 NDI_DEVI_REMOVE);
20031 20035 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst,
20032 20036 saddr->cport)->cport_mutex);
20033 20037
20034 20038 if (rval == NDI_SUCCESS) {
20035 20039 cportinfo->cport_event_flags &=
20036 20040 ~SATA_EVNT_TARGET_NODE_CLEANUP;
20037 20041 cportinfo->cport_tgtnode_clean = B_TRUE;
20038 20042 } else {
20039 20043 /*
20040 20044 * PROBLEM - the target node remained
20041 20045 * and it belongs to a previously
20042 20046 * attached device.
20043 20047 * This happens when the file was open
20044 20048 * or the node was waiting for
20045 20049 * resources at the time the
20046 20050 * associated device was removed.
20047 20051 * Instruct event daemon to retry the
20048 20052 * cleanup later.
20049 20053 */
20050 20054 sata_log(sata_hba_inst,
20051 20055 CE_WARN,
20052 20056 "Application(s) accessing "
20053 20057 "previously attached SATA "
20054 20058 "device have to release "
20055 20059 "it before newly inserted "
20056 20060 "device can be made accessible.",
20057 20061 saddr->cport);
20058 20062 cportinfo->cport_event_flags |=
20059 20063 SATA_EVNT_TARGET_NODE_CLEANUP;
20060 20064 cportinfo->cport_tgtnode_clean =
20061 20065 B_FALSE;
20062 20066 }
20063 20067 }
20064 20068 if (sata_auto_online != 0) {
20065 20069 cportinfo->cport_event_flags |=
20066 20070 SATA_EVNT_AUTOONLINE_DEVICE;
20067 20071 }
20068 20072
20069 20073 }
20070 20074 } else {
20071 20075 cportinfo->cport_dev_attach_time = 0;
20072 20076 }
20073 20077
20074 20078 event_flags = cportinfo->cport_event_flags;
20075 20079 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->cport_mutex);
20076 20080 if (event_flags != 0 || pmult_event_flags != 0) {
20077 20081 mutex_enter(&sata_hba_inst->satahba_mutex);
20078 20082 sata_hba_inst->satahba_event_flags |= SATA_EVNT_MAIN;
20079 20083 mutex_exit(&sata_hba_inst->satahba_mutex);
20080 20084 mutex_enter(&sata_mutex);
20081 20085 sata_event_pending |= SATA_EVNT_MAIN;
20082 20086 mutex_exit(&sata_mutex);
20083 20087 }
20084 20088 }
20085 20089
20086 20090 /*
20087 20091 * Port Multiplier Port Device Attached Event processing.
20088 20092 *
20089 20093 * NOTE: No Mutex should be hold.
20090 20094 */
20091 20095 static void
20092 20096 sata_process_pmdevice_attached(sata_hba_inst_t *sata_hba_inst,
20093 20097 sata_address_t *saddr)
20094 20098 {
20095 20099 sata_pmport_info_t *pmportinfo;
20096 20100 sata_drive_info_t *sdinfo;
20097 20101 sata_device_t sata_device;
20098 20102 dev_info_t *tdip;
20099 20103 uint32_t event_flags;
20100 20104 uint8_t cport = saddr->cport;
20101 20105 uint8_t pmport = saddr->pmport;
20102 20106 int rval;
20103 20107
20104 20108 SATADBG2(SATA_DBG_EVENTS_PROC, sata_hba_inst,
20105 20109 "Processing port %d:%d device attached", cport, pmport);
20106 20110
20107 20111 pmportinfo = SATA_PMPORT_INFO(sata_hba_inst, cport, pmport);
20108 20112
20109 20113 mutex_enter(&pmportinfo->pmport_mutex);
20110 20114
20111 20115 /* Clear attach event flag first */
20112 20116 pmportinfo->pmport_event_flags &= ~SATA_EVNT_DEVICE_ATTACHED;
20113 20117
20114 20118 /* If the port is in SHUTDOWN or FAILED state, ignore event. */
20115 20119 if ((pmportinfo->pmport_state &
20116 20120 (SATA_PSTATE_SHUTDOWN | SATA_PSTATE_FAILED)) != 0) {
20117 20121 pmportinfo->pmport_dev_attach_time = 0;
20118 20122 mutex_exit(&pmportinfo->pmport_mutex);
20119 20123 return;
20120 20124 }
20121 20125
20122 20126 /*
20123 20127 * If the sata_drive_info structure is found attached to the port info,
20124 20128 * despite the fact the device was removed and now it is re-attached,
20125 20129 * the old drive info structure was not removed.
20126 20130 * Arbitrarily release device info structure.
20127 20131 */
20128 20132 if (SATA_PMPORTINFO_DRV_INFO(pmportinfo) != NULL) {
20129 20133 sdinfo = SATA_PMPORTINFO_DRV_INFO(pmportinfo);
20130 20134 SATA_PMPORTINFO_DRV_INFO(pmportinfo) = NULL;
20131 20135 (void) kmem_free((void *)sdinfo,
20132 20136 sizeof (sata_drive_info_t));
20133 20137 SATADBG1(SATA_DBG_EVENTS_PROC, sata_hba_inst,
20134 20138 "Arbitrarily detaching old device info.", NULL);
20135 20139 }
20136 20140 pmportinfo->pmport_dev_type = SATA_DTYPE_NONE;
20137 20141
20138 20142 /* For sanity, re-probe the port */
20139 20143 sata_device.satadev_rev = SATA_DEVICE_REV;
20140 20144 sata_device.satadev_addr = *saddr;
20141 20145
20142 20146 /*
20143 20147 * We have to exit mutex, because the HBA probe port function may
20144 20148 * block on its own mutex.
20145 20149 */
20146 20150 mutex_exit(&pmportinfo->pmport_mutex);
20147 20151 rval = (*SATA_PROBE_PORT_FUNC(sata_hba_inst))
20148 20152 (SATA_DIP(sata_hba_inst), &sata_device);
20149 20153 mutex_enter(&pmportinfo->pmport_mutex);
20150 20154
20151 20155 sata_update_pmport_info(sata_hba_inst, &sata_device);
20152 20156 if (rval != SATA_SUCCESS) {
20153 20157 /* Something went wrong? Fail the port */
20154 20158 pmportinfo->pmport_state = SATA_PSTATE_FAILED;
20155 20159 pmportinfo->pmport_dev_attach_time = 0;
20156 20160 mutex_exit(&pmportinfo->pmport_mutex);
20157 20161 SATA_LOG_D((sata_hba_inst, CE_WARN,
20158 20162 "SATA port %d:%d probing failed", cport, pmport));
20159 20163 return;
20160 20164 } else {
20161 20165 /* pmport probed successfully */
20162 20166 pmportinfo->pmport_state |=
20163 20167 SATA_STATE_PROBED | SATA_STATE_READY;
20164 20168 }
20165 20169 /*
20166 20170 * Check if a device is still attached. For sanity, check also
20167 20171 * link status - if no link, there is no device.
20168 20172 */
20169 20173 if ((sata_device.satadev_scr.sstatus & SATA_PORT_DEVLINK_UP_MASK) !=
20170 20174 SATA_PORT_DEVLINK_UP || sata_device.satadev_type ==
20171 20175 SATA_DTYPE_NONE) {
20172 20176 /*
20173 20177 * No device - ignore attach event.
20174 20178 */
20175 20179 pmportinfo->pmport_dev_attach_time = 0;
20176 20180 mutex_exit(&pmportinfo->pmport_mutex);
20177 20181 SATADBG2(SATA_DBG_EVENTS_PROC, sata_hba_inst,
20178 20182 "Ignoring attach - no device connected to port %d:%d",
20179 20183 cport, pmport);
20180 20184 return;
20181 20185 }
20182 20186
20183 20187 mutex_exit(&pmportinfo->pmport_mutex);
20184 20188 /*
20185 20189 * Generate sysevent - EC_DR / ESC_DR_AP_STATE_CHANGE
20186 20190 * with the hint: SE_HINT_INSERT
20187 20191 */
20188 20192 sata_gen_sysevent(sata_hba_inst, saddr, SE_HINT_INSERT);
20189 20193
20190 20194 /*
20191 20195 * Port reprobing will take care of the creation of the device
20192 20196 * info structure and determination of the device type.
20193 20197 */
20194 20198 sata_device.satadev_addr = *saddr;
20195 20199 (void) sata_reprobe_port(sata_hba_inst, &sata_device,
20196 20200 SATA_DEV_IDENTIFY_NORETRY);
20197 20201
20198 20202 mutex_enter(&pmportinfo->pmport_mutex);
20199 20203 if ((pmportinfo->pmport_state & SATA_STATE_READY) &&
20200 20204 (pmportinfo->pmport_dev_type != SATA_DTYPE_NONE)) {
20201 20205 /* Some device is attached to the port */
20202 20206 if (pmportinfo->pmport_dev_type == SATA_DTYPE_UNKNOWN) {
20203 20207 /*
20204 20208 * A device was not successfully attached.
20205 20209 * Track retry time for device identification.
20206 20210 */
20207 20211 if (pmportinfo->pmport_dev_attach_time != 0) {
20208 20212 clock_t cur_time = ddi_get_lbolt();
20209 20213 /*
20210 20214 * If the retry time limit was not exceeded,
20211 20215 * reinstate attach event.
20212 20216 */
20213 20217 if ((cur_time -
20214 20218 pmportinfo->pmport_dev_attach_time) <
20215 20219 drv_usectohz(
20216 20220 SATA_DEV_IDENTIFY_TIMEOUT)) {
20217 20221 /* OK, restore attach event */
20218 20222 pmportinfo->pmport_event_flags |=
20219 20223 SATA_EVNT_DEVICE_ATTACHED;
20220 20224 } else {
20221 20225 /* Timeout - cannot identify device */
20222 20226 pmportinfo->pmport_dev_attach_time = 0;
20223 20227 sata_log(sata_hba_inst, CE_WARN,
20224 20228 "Could not identify SATA device "
20225 20229 "at port %d:%d",
20226 20230 cport, pmport);
20227 20231 }
20228 20232 } else {
20229 20233 /*
20230 20234 * Start tracking time for device
20231 20235 * identification.
20232 20236 * Save current time (lbolt value).
20233 20237 */
20234 20238 pmportinfo->pmport_dev_attach_time =
20235 20239 ddi_get_lbolt();
20236 20240 /* Restore attach event */
20237 20241 pmportinfo->pmport_event_flags |=
20238 20242 SATA_EVNT_DEVICE_ATTACHED;
20239 20243 }
20240 20244 } else {
20241 20245 /*
20242 20246 * If device was successfully attached, the subsequent
20243 20247 * action depends on a state of the
20244 20248 * sata_auto_online variable. If it is set to zero.
20245 20249 * an explicit 'configure' command will be needed to
20246 20250 * configure it. If its value is non-zero, we will
20247 20251 * attempt to online (configure) the device.
20248 20252 * First, log the message indicating that a device
20249 20253 * was attached.
20250 20254 */
20251 20255 pmportinfo->pmport_dev_attach_time = 0;
20252 20256 sata_log(sata_hba_inst, CE_WARN,
20253 20257 "SATA device detected at port %d:%d",
20254 20258 cport, pmport);
20255 20259
20256 20260 if (SATA_PMPORTINFO_DRV_INFO(pmportinfo) != NULL) {
20257 20261 sata_drive_info_t new_sdinfo;
20258 20262
20259 20263 /* Log device info data */
20260 20264 new_sdinfo = *(SATA_PMPORTINFO_DRV_INFO(
20261 20265 pmportinfo));
20262 20266 sata_show_drive_info(sata_hba_inst,
20263 20267 &new_sdinfo);
20264 20268 }
20265 20269
20266 20270 mutex_exit(&pmportinfo->pmport_mutex);
20267 20271
20268 20272 /*
20269 20273 * Make sure that there is no target node for that
20270 20274 * device. If so, release it. It should not happen,
20271 20275 * unless we had problem removing the node when
20272 20276 * device was detached.
20273 20277 */
20274 20278 tdip = sata_get_target_dip(SATA_DIP(sata_hba_inst),
20275 20279 saddr->cport, saddr->pmport);
20276 20280 mutex_enter(&pmportinfo->pmport_mutex);
20277 20281 if (tdip != NULL) {
20278 20282
20279 20283 #ifdef SATA_DEBUG
20280 20284 if ((pmportinfo->pmport_event_flags &
20281 20285 SATA_EVNT_TARGET_NODE_CLEANUP) == 0)
20282 20286 sata_log(sata_hba_inst, CE_WARN,
20283 20287 "sata_process_device_attached: "
20284 20288 "old device target node exists!");
20285 20289 #endif
20286 20290 /*
20287 20291 * target node exists - try to unconfigure
20288 20292 * device and remove the node.
20289 20293 */
20290 20294 mutex_exit(&pmportinfo->pmport_mutex);
20291 20295 rval = ndi_devi_offline(tdip,
20292 20296 NDI_DEVI_REMOVE);
20293 20297 mutex_enter(&pmportinfo->pmport_mutex);
20294 20298
20295 20299 if (rval == NDI_SUCCESS) {
20296 20300 pmportinfo->pmport_event_flags &=
20297 20301 ~SATA_EVNT_TARGET_NODE_CLEANUP;
20298 20302 pmportinfo->pmport_tgtnode_clean =
20299 20303 B_TRUE;
20300 20304 } else {
20301 20305 /*
20302 20306 * PROBLEM - the target node remained
20303 20307 * and it belongs to a previously
20304 20308 * attached device.
20305 20309 * This happens when the file was open
20306 20310 * or the node was waiting for
20307 20311 * resources at the time the
20308 20312 * associated device was removed.
20309 20313 * Instruct event daemon to retry the
20310 20314 * cleanup later.
20311 20315 */
20312 20316 sata_log(sata_hba_inst,
20313 20317 CE_WARN,
20314 20318 "Application(s) accessing "
20315 20319 "previously attached SATA "
20316 20320 "device have to release "
20317 20321 "it before newly inserted "
20318 20322 "device can be made accessible."
20319 20323 "at port %d:%d",
20320 20324 cport, pmport);
20321 20325 pmportinfo->pmport_event_flags |=
20322 20326 SATA_EVNT_TARGET_NODE_CLEANUP;
20323 20327 pmportinfo->pmport_tgtnode_clean =
20324 20328 B_FALSE;
20325 20329 }
20326 20330 }
20327 20331 if (sata_auto_online != 0) {
20328 20332 pmportinfo->pmport_event_flags |=
20329 20333 SATA_EVNT_AUTOONLINE_DEVICE;
20330 20334 }
20331 20335
20332 20336 }
20333 20337 } else {
20334 20338 pmportinfo->pmport_dev_attach_time = 0;
20335 20339 }
20336 20340
20337 20341 event_flags = pmportinfo->pmport_event_flags;
20338 20342 mutex_exit(&pmportinfo->pmport_mutex);
20339 20343 if (event_flags != 0) {
20340 20344 mutex_enter(&sata_hba_inst->satahba_mutex);
20341 20345 sata_hba_inst->satahba_event_flags |= SATA_EVNT_MAIN;
20342 20346 mutex_exit(&sata_hba_inst->satahba_mutex);
20343 20347 mutex_enter(&sata_mutex);
20344 20348 sata_event_pending |= SATA_EVNT_MAIN;
20345 20349 mutex_exit(&sata_mutex);
20346 20350 }
20347 20351
20348 20352 /* clear the reset_in_progress events */
20349 20353 if (SATA_PMPORTINFO_DRV_INFO(pmportinfo) != NULL) {
20350 20354 if (pmportinfo->pmport_dev_type & SATA_VALID_DEV_TYPE) {
20351 20355 /* must clear flags on cport */
20352 20356 sata_pmult_info_t *pminfo =
20353 20357 SATA_PMULT_INFO(sata_hba_inst,
20354 20358 saddr->cport);
20355 20359 pminfo->pmult_event_flags |=
20356 20360 SATA_EVNT_CLEAR_DEVICE_RESET;
20357 20361 }
20358 20362 }
20359 20363 }
20360 20364
20361 20365 /*
20362 20366 * Device Target Node Cleanup Event processing.
20363 20367 * If the target node associated with a sata port device is in
20364 20368 * DEVI_DEVICE_REMOVED state, an attempt is made to remove it.
20365 20369 * If the target node cannot be removed, the event flag is left intact,
20366 20370 * so that event daemon may re-run this function later.
20367 20371 *
20368 20372 * This function cannot be called in interrupt context (it may sleep).
20369 20373 *
20370 20374 * NOTE: Processes cport events only, not port multiplier ports.
20371 20375 */
20372 20376 static void
20373 20377 sata_process_target_node_cleanup(sata_hba_inst_t *sata_hba_inst,
20374 20378 sata_address_t *saddr)
20375 20379 {
20376 20380 sata_cport_info_t *cportinfo;
20377 20381 dev_info_t *tdip;
20378 20382
20379 20383 SATADBG1(SATA_DBG_EVENTS_PROC, sata_hba_inst,
20380 20384 "Processing port %d device target node cleanup", saddr->cport);
20381 20385
20382 20386 cportinfo = SATA_CPORT_INFO(sata_hba_inst, saddr->cport);
20383 20387
20384 20388 /*
20385 20389 * Check if there is target node for that device and it is in the
20386 20390 * DEVI_DEVICE_REMOVED state. If so, release it.
20387 20391 */
20388 20392 tdip = sata_get_target_dip(SATA_DIP(sata_hba_inst), saddr->cport,
20389 20393 saddr->pmport);
20390 20394 if (tdip != NULL) {
20391 20395 /*
20392 20396 * target node exists - check if it is target node of
20393 20397 * a removed device.
20394 20398 */
20395 20399 if (sata_check_device_removed(tdip) == B_TRUE) {
20396 20400 SATADBG1(SATA_DBG_EVENTS_PROC, sata_hba_inst,
20397 20401 "sata_process_target_node_cleanup: "
20398 20402 "old device target node exists!", NULL);
20399 20403 /*
20400 20404 * Unconfigure and remove the target node
20401 20405 */
20402 20406 if (ndi_devi_offline(tdip, NDI_DEVI_REMOVE) ==
20403 20407 NDI_SUCCESS) {
20404 20408 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst,
20405 20409 saddr->cport)->cport_mutex);
20406 20410 cportinfo->cport_event_flags &=
20407 20411 ~SATA_EVNT_TARGET_NODE_CLEANUP;
20408 20412 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst,
20409 20413 saddr->cport)->cport_mutex);
20410 20414 return;
20411 20415 }
20412 20416 /*
20413 20417 * Event daemon will retry the cleanup later.
20414 20418 */
20415 20419 mutex_enter(&sata_hba_inst->satahba_mutex);
20416 20420 sata_hba_inst->satahba_event_flags |= SATA_EVNT_MAIN;
20417 20421 mutex_exit(&sata_hba_inst->satahba_mutex);
20418 20422 mutex_enter(&sata_mutex);
20419 20423 sata_event_pending |= SATA_EVNT_MAIN;
20420 20424 mutex_exit(&sata_mutex);
20421 20425 }
20422 20426 } else {
20423 20427 if (saddr->qual == SATA_ADDR_CPORT ||
20424 20428 saddr->qual == SATA_ADDR_DCPORT) {
20425 20429 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst,
20426 20430 saddr->cport)->cport_mutex);
20427 20431 cportinfo->cport_event_flags &=
20428 20432 ~SATA_EVNT_TARGET_NODE_CLEANUP;
20429 20433 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst,
20430 20434 saddr->cport)->cport_mutex);
20431 20435 } else {
20432 20436 /* sanity check */
20433 20437 if (SATA_CPORT_DEV_TYPE(sata_hba_inst, saddr->cport) !=
20434 20438 SATA_DTYPE_PMULT || SATA_PMULT_INFO(sata_hba_inst,
20435 20439 saddr->cport) == NULL)
20436 20440 return;
20437 20441 if (SATA_PMPORT_INFO(sata_hba_inst, saddr->cport,
20438 20442 saddr->pmport) == NULL)
20439 20443 return;
20440 20444
20441 20445 mutex_enter(&SATA_PMPORT_INFO(sata_hba_inst,
20442 20446 saddr->cport, saddr->pmport)->pmport_mutex);
20443 20447 SATA_PMPORT_INFO(sata_hba_inst, saddr->cport,
20444 20448 saddr->pmport)->pmport_event_flags &=
20445 20449 ~SATA_EVNT_TARGET_NODE_CLEANUP;
20446 20450 mutex_exit(&SATA_PMPORT_INFO(sata_hba_inst,
20447 20451 saddr->cport, saddr->pmport)->pmport_mutex);
20448 20452 }
20449 20453 }
20450 20454 }
20451 20455
20452 20456 /*
20453 20457 * Device AutoOnline Event processing.
20454 20458 * If attached device is to be onlined, an attempt is made to online this
20455 20459 * device, but only if there is no lingering (old) target node present.
20456 20460 * If the device cannot be onlined, the event flag is left intact,
20457 20461 * so that event daemon may re-run this function later.
20458 20462 *
20459 20463 * This function cannot be called in interrupt context (it may sleep).
20460 20464 *
20461 20465 * NOTE: Processes cport events only, not port multiplier ports.
20462 20466 */
20463 20467 static void
20464 20468 sata_process_device_autoonline(sata_hba_inst_t *sata_hba_inst,
20465 20469 sata_address_t *saddr)
20466 20470 {
20467 20471 sata_cport_info_t *cportinfo;
20468 20472 sata_drive_info_t *sdinfo;
20469 20473 sata_device_t sata_device;
20470 20474 dev_info_t *tdip;
20471 20475
20472 20476 SATADBG1(SATA_DBG_EVENTS_PROC, sata_hba_inst,
20473 20477 "Processing port %d attached device auto-onlining", saddr->cport);
20474 20478
20475 20479 cportinfo = SATA_CPORT_INFO(sata_hba_inst, saddr->cport);
20476 20480
20477 20481 /*
20478 20482 * Check if device is present and recognized. If not, reset event.
20479 20483 */
20480 20484 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->cport_mutex);
20481 20485 if ((cportinfo->cport_dev_type & SATA_VALID_DEV_TYPE) == 0) {
20482 20486 /* Nothing to online */
20483 20487 cportinfo->cport_event_flags &= ~SATA_EVNT_AUTOONLINE_DEVICE;
20484 20488 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst,
20485 20489 saddr->cport)->cport_mutex);
20486 20490 return;
20487 20491 }
20488 20492 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->cport_mutex);
20489 20493
20490 20494 /*
20491 20495 * Check if there is target node for this device and if it is in the
20492 20496 * DEVI_DEVICE_REMOVED state. If so, abort onlining but keep
20493 20497 * the event for later processing.
20494 20498 */
20495 20499 tdip = sata_get_target_dip(SATA_DIP(sata_hba_inst), saddr->cport,
20496 20500 saddr->pmport);
20497 20501 if (tdip != NULL) {
20498 20502 /*
20499 20503 * target node exists - check if it is target node of
20500 20504 * a removed device.
20501 20505 */
20502 20506 if (sata_check_device_removed(tdip) == B_TRUE) {
20503 20507 SATADBG1(SATA_DBG_EVENTS_PROC, sata_hba_inst,
20504 20508 "sata_process_device_autoonline: "
20505 20509 "old device target node exists!", NULL);
20506 20510 /*
20507 20511 * Event daemon will retry device onlining later.
20508 20512 */
20509 20513 mutex_enter(&sata_hba_inst->satahba_mutex);
20510 20514 sata_hba_inst->satahba_event_flags |= SATA_EVNT_MAIN;
20511 20515 mutex_exit(&sata_hba_inst->satahba_mutex);
20512 20516 mutex_enter(&sata_mutex);
20513 20517 sata_event_pending |= SATA_EVNT_MAIN;
20514 20518 mutex_exit(&sata_mutex);
20515 20519 return;
20516 20520 }
20517 20521 /*
20518 20522 * If the target node is not in the 'removed" state, assume
20519 20523 * that it belongs to this device. There is nothing more to do,
20520 20524 * but reset the event.
20521 20525 */
20522 20526 } else {
20523 20527
20524 20528 /*
20525 20529 * Try to online the device
20526 20530 * If there is any reset-related event, remove it. We are
20527 20531 * configuring the device and no state restoring is needed.
20528 20532 */
20529 20533 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst,
20530 20534 saddr->cport)->cport_mutex);
20531 20535 sata_device.satadev_addr = *saddr;
20532 20536 if (saddr->qual == SATA_ADDR_CPORT)
20533 20537 sata_device.satadev_addr.qual = SATA_ADDR_DCPORT;
20534 20538 else
20535 20539 sata_device.satadev_addr.qual = SATA_ADDR_DPMPORT;
20536 20540 sdinfo = sata_get_device_info(sata_hba_inst, &sata_device);
20537 20541 if (sdinfo != NULL) {
20538 20542 if (sdinfo->satadrv_event_flags &
20539 20543 (SATA_EVNT_DEVICE_RESET |
20540 20544 SATA_EVNT_INPROC_DEVICE_RESET))
20541 20545 sdinfo->satadrv_event_flags = 0;
20542 20546 sdinfo->satadrv_event_flags |=
20543 20547 SATA_EVNT_CLEAR_DEVICE_RESET;
20544 20548
20545 20549 /* Need to create a new target node. */
20546 20550 cportinfo->cport_tgtnode_clean = B_TRUE;
20547 20551 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst,
20548 20552 saddr->cport)->cport_mutex);
20549 20553 tdip = sata_create_target_node(SATA_DIP(sata_hba_inst),
20550 20554 sata_hba_inst, &sata_device.satadev_addr);
20551 20555 if (tdip == NULL) {
20552 20556 /*
20553 20557 * Configure (onlining) failed.
20554 20558 * We will NOT retry
20555 20559 */
20556 20560 SATA_LOG_D((sata_hba_inst, CE_WARN,
20557 20561 "sata_process_device_autoonline: "
20558 20562 "configuring SATA device at port %d failed",
20559 20563 saddr->cport));
20560 20564 }
20561 20565 } else {
20562 20566 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst,
20563 20567 saddr->cport)->cport_mutex);
20564 20568 }
20565 20569
20566 20570 }
20567 20571 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->cport_mutex);
20568 20572 cportinfo->cport_event_flags &= ~SATA_EVNT_AUTOONLINE_DEVICE;
20569 20573 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst,
20570 20574 saddr->cport)->cport_mutex);
20571 20575 }
20572 20576
20573 20577
20574 20578 static void
20575 20579 sata_gen_sysevent(sata_hba_inst_t *sata_hba_inst, sata_address_t *saddr,
20576 20580 int hint)
20577 20581 {
20578 20582 char ap[MAXPATHLEN];
20579 20583 nvlist_t *ev_attr_list = NULL;
20580 20584 int err;
20581 20585
20582 20586 /* Allocate and build sysevent attribute list */
20583 20587 err = nvlist_alloc(&ev_attr_list, NV_UNIQUE_NAME_TYPE, DDI_NOSLEEP);
20584 20588 if (err != 0) {
20585 20589 SATA_LOG_D((sata_hba_inst, CE_WARN,
20586 20590 "sata_gen_sysevent: "
20587 20591 "cannot allocate memory for sysevent attributes\n"));
20588 20592 return;
20589 20593 }
20590 20594 /* Add hint attribute */
20591 20595 err = nvlist_add_string(ev_attr_list, DR_HINT, SE_HINT2STR(hint));
20592 20596 if (err != 0) {
20593 20597 SATA_LOG_D((sata_hba_inst, CE_WARN,
20594 20598 "sata_gen_sysevent: "
20595 20599 "failed to add DR_HINT attr for sysevent"));
20596 20600 nvlist_free(ev_attr_list);
20597 20601 return;
20598 20602 }
20599 20603 /*
20600 20604 * Add AP attribute.
20601 20605 * Get controller pathname and convert it into AP pathname by adding
20602 20606 * a target number.
20603 20607 */
20604 20608 (void) snprintf(ap, MAXPATHLEN, "/devices");
20605 20609 (void) ddi_pathname(SATA_DIP(sata_hba_inst), ap + strlen(ap));
20606 20610 (void) snprintf(ap + strlen(ap), MAXPATHLEN - strlen(ap), ":%d",
20607 20611 SATA_MAKE_AP_NUMBER(saddr->cport, saddr->pmport, saddr->qual));
20608 20612
20609 20613 err = nvlist_add_string(ev_attr_list, DR_AP_ID, ap);
20610 20614 if (err != 0) {
20611 20615 SATA_LOG_D((sata_hba_inst, CE_WARN,
20612 20616 "sata_gen_sysevent: "
20613 20617 "failed to add DR_AP_ID attr for sysevent"));
20614 20618 nvlist_free(ev_attr_list);
20615 20619 return;
20616 20620 }
20617 20621
20618 20622 /* Generate/log sysevent */
20619 20623 err = ddi_log_sysevent(SATA_DIP(sata_hba_inst), DDI_VENDOR_SUNW, EC_DR,
20620 20624 ESC_DR_AP_STATE_CHANGE, ev_attr_list, NULL, DDI_NOSLEEP);
20621 20625 if (err != DDI_SUCCESS) {
20622 20626 SATA_LOG_D((sata_hba_inst, CE_WARN,
20623 20627 "sata_gen_sysevent: "
20624 20628 "cannot log sysevent, err code %x\n", err));
20625 20629 }
20626 20630
20627 20631 nvlist_free(ev_attr_list);
20628 20632 }
20629 20633
20630 20634
20631 20635
20632 20636
20633 20637 /*
20634 20638 * Set DEVI_DEVICE_REMOVED state in the SATA device target node.
20635 20639 */
20636 20640 static void
20637 20641 sata_set_device_removed(dev_info_t *tdip)
20638 20642 {
20639 20643 int circ;
20640 20644
20641 20645 ASSERT(tdip != NULL);
20642 20646
20643 20647 ndi_devi_enter(tdip, &circ);
20644 20648 mutex_enter(&DEVI(tdip)->devi_lock);
20645 20649 DEVI_SET_DEVICE_REMOVED(tdip);
20646 20650 mutex_exit(&DEVI(tdip)->devi_lock);
20647 20651 ndi_devi_exit(tdip, circ);
20648 20652 }
20649 20653
20650 20654
20651 20655 /*
20652 20656 * Set internal event instructing event daemon to try
20653 20657 * to perform the target node cleanup.
20654 20658 */
20655 20659 static void
20656 20660 sata_set_target_node_cleanup(sata_hba_inst_t *sata_hba_inst,
20657 20661 sata_address_t *saddr)
20658 20662 {
20659 20663 if (saddr->qual == SATA_ADDR_CPORT ||
20660 20664 saddr->qual == SATA_ADDR_DCPORT) {
20661 20665 mutex_enter(&SATA_CPORT_INFO(sata_hba_inst,
20662 20666 saddr->cport)->cport_mutex);
20663 20667 SATA_CPORT_EVENT_FLAGS(sata_hba_inst, saddr->cport) |=
20664 20668 SATA_EVNT_TARGET_NODE_CLEANUP;
20665 20669 SATA_CPORT_INFO(sata_hba_inst, saddr->cport)->
20666 20670 cport_tgtnode_clean = B_FALSE;
20667 20671 mutex_exit(&SATA_CPORT_INFO(sata_hba_inst,
20668 20672 saddr->cport)->cport_mutex);
20669 20673 } else {
20670 20674 mutex_enter(&SATA_PMPORT_INFO(sata_hba_inst,
20671 20675 saddr->cport, saddr->pmport)->pmport_mutex);
20672 20676 SATA_PMPORT_EVENT_FLAGS(sata_hba_inst, saddr->cport,
20673 20677 saddr->pmport) |= SATA_EVNT_TARGET_NODE_CLEANUP;
20674 20678 SATA_PMPORT_INFO(sata_hba_inst, saddr->cport, saddr->pmport)->
20675 20679 pmport_tgtnode_clean = B_FALSE;
20676 20680 mutex_exit(&SATA_PMPORT_INFO(sata_hba_inst,
20677 20681 saddr->cport, saddr->pmport)->pmport_mutex);
20678 20682 }
20679 20683 mutex_enter(&sata_hba_inst->satahba_mutex);
20680 20684 sata_hba_inst->satahba_event_flags |= SATA_EVNT_MAIN;
20681 20685 mutex_exit(&sata_hba_inst->satahba_mutex);
20682 20686 mutex_enter(&sata_mutex);
20683 20687 sata_event_pending |= SATA_EVNT_MAIN;
20684 20688 mutex_exit(&sata_mutex);
20685 20689 }
20686 20690
20687 20691
20688 20692 /*
20689 20693 * Check if the SATA device target node is in DEVI_DEVICE_REMOVED state,
20690 20694 * i.e. check if the target node state indicates that it belongs to a removed
20691 20695 * device.
20692 20696 *
20693 20697 * Returns B_TRUE if the target node is in DEVI_DEVICE_REMOVED state,
20694 20698 * B_FALSE otherwise.
20695 20699 */
20696 20700 static boolean_t
20697 20701 sata_check_device_removed(dev_info_t *tdip)
20698 20702 {
20699 20703 ASSERT(tdip != NULL);
20700 20704
20701 20705 if (DEVI_IS_DEVICE_REMOVED(tdip))
20702 20706 return (B_TRUE);
20703 20707 else
20704 20708 return (B_FALSE);
20705 20709 }
20706 20710
20707 20711
20708 20712 /*
20709 20713 * Check for DMA error. Return B_TRUE if error, B_FALSE otherwise.
20710 20714 */
20711 20715 static boolean_t
20712 20716 sata_check_for_dma_error(dev_info_t *dip, sata_pkt_txlate_t *spx)
20713 20717 {
20714 20718 int fm_capability = ddi_fm_capable(dip);
20715 20719 ddi_fm_error_t de;
20716 20720
20717 20721 if (fm_capability & DDI_FM_DMACHK_CAPABLE) {
20718 20722 if (spx->txlt_buf_dma_handle != NULL) {
20719 20723 ddi_fm_dma_err_get(spx->txlt_buf_dma_handle, &de,
20720 20724 DDI_FME_VERSION);
20721 20725 if (de.fme_status != DDI_SUCCESS)
20722 20726 return (B_TRUE);
20723 20727 }
20724 20728 }
20725 20729 return (B_FALSE);
20726 20730 }
20727 20731
20728 20732
20729 20733 /* ************************ FAULT INJECTTION **************************** */
20730 20734
20731 20735 #ifdef SATA_INJECT_FAULTS
20732 20736
20733 20737 static uint32_t sata_fault_count = 0;
20734 20738 static uint32_t sata_fault_suspend_count = 0;
20735 20739
20736 20740 /*
20737 20741 * Inject sata pkt fault
20738 20742 * It modifies returned values of the sata packet.
20739 20743 * It returns immediately if:
20740 20744 * pkt fault injection is not enabled (via sata_inject_fault,
20741 20745 * sata_inject_fault_count), or invalid fault is specified (sata_fault_type),
20742 20746 * or pkt does not contain command to be faulted (set in sata_fault_cmd), or
20743 20747 * pkt is not directed to specified fault controller/device
20744 20748 * (sata_fault_ctrl_dev and sata_fault_device).
20745 20749 * If fault controller is not specified, fault injection applies to all
20746 20750 * controllers and devices.
20747 20751 *
20748 20752 * First argument is the pointer to the executed sata packet.
20749 20753 * Second argument is a pointer to a value returned by the HBA tran_start
20750 20754 * function.
20751 20755 * Third argument specifies injected error. Injected sata packet faults
20752 20756 * are the satapkt_reason values.
20753 20757 * SATA_PKT_BUSY -1 Not completed, busy
20754 20758 * SATA_PKT_DEV_ERROR 1 Device reported error
20755 20759 * SATA_PKT_QUEUE_FULL 2 Not accepted, queue full
20756 20760 * SATA_PKT_PORT_ERROR 3 Not completed, port error
20757 20761 * SATA_PKT_CMD_UNSUPPORTED 4 Cmd unsupported
20758 20762 * SATA_PKT_ABORTED 5 Aborted by request
20759 20763 * SATA_PKT_TIMEOUT 6 Operation timeut
20760 20764 * SATA_PKT_RESET 7 Aborted by reset request
20761 20765 *
20762 20766 * Additional global variables affecting the execution:
20763 20767 *
20764 20768 * sata_inject_fault_count variable specifies number of times in row the
20765 20769 * error is injected. Value of -1 specifies permanent fault, ie. every time
20766 20770 * the fault injection point is reached, the fault is injected and a pause
20767 20771 * between fault injection specified by sata_inject_fault_pause_count is
20768 20772 * ignored). Fault injection routine decrements sata_inject_fault_count
20769 20773 * (if greater than zero) until it reaches 0. No fault is injected when
20770 20774 * sata_inject_fault_count is 0 (zero).
20771 20775 *
20772 20776 * sata_inject_fault_pause_count variable specifies number of times a fault
20773 20777 * injection is bypassed (pause between fault injections).
20774 20778 * If set to 0, a fault is injected only a number of times specified by
20775 20779 * sata_inject_fault_count.
20776 20780 *
20777 20781 * The fault counts are static, so for periodic errors they have to be manually
20778 20782 * reset to start repetition sequence from scratch.
20779 20783 * If the original value returned by the HBA tran_start function is not
20780 20784 * SATA_TRAN_ACCEPTED and pkt reason is not SATA_PKT_COMPLETED, no error
20781 20785 * is injected (to avoid masking real problems);
20782 20786 *
20783 20787 * NOTE: In its current incarnation, this function should be invoked only for
20784 20788 * commands executed in SYNCHRONOUS mode.
20785 20789 */
20786 20790
20787 20791
20788 20792 static void
20789 20793 sata_inject_pkt_fault(sata_pkt_t *spkt, int *rval, int fault)
20790 20794 {
20791 20795
20792 20796 if (sata_inject_fault != SATA_INJECT_PKT_FAULT)
20793 20797 return;
20794 20798
20795 20799 if (sata_inject_fault_count == 0)
20796 20800 return;
20797 20801
20798 20802 if (fault == 0)
20799 20803 return;
20800 20804
20801 20805 if (sata_fault_cmd != spkt->satapkt_cmd.satacmd_cmd_reg)
20802 20806 return;
20803 20807
20804 20808 if (sata_fault_ctrl != NULL) {
20805 20809 sata_pkt_txlate_t *spx =
20806 20810 (sata_pkt_txlate_t *)spkt->satapkt_framework_private;
20807 20811
20808 20812 if (sata_fault_ctrl != NULL && sata_fault_ctrl !=
20809 20813 spx->txlt_sata_hba_inst->satahba_dip)
20810 20814 return;
20811 20815
20812 20816 if (sata_fault_device.satadev_addr.cport !=
20813 20817 spkt->satapkt_device.satadev_addr.cport ||
20814 20818 sata_fault_device.satadev_addr.pmport !=
20815 20819 spkt->satapkt_device.satadev_addr.pmport ||
20816 20820 sata_fault_device.satadev_addr.qual !=
20817 20821 spkt->satapkt_device.satadev_addr.qual)
20818 20822 return;
20819 20823 }
20820 20824
20821 20825 /* Modify pkt return parameters */
20822 20826 if (*rval != SATA_TRAN_ACCEPTED ||
20823 20827 spkt->satapkt_reason != SATA_PKT_COMPLETED) {
20824 20828 sata_fault_count = 0;
20825 20829 sata_fault_suspend_count = 0;
20826 20830 return;
20827 20831 }
20828 20832 if (sata_fault_count == 0 && sata_fault_suspend_count != 0) {
20829 20833 /* Pause in the injection */
20830 20834 sata_fault_suspend_count -= 1;
20831 20835 return;
20832 20836 }
20833 20837
20834 20838 if (sata_fault_count == 0 && sata_fault_suspend_count == 0) {
20835 20839 /*
20836 20840 * Init inject fault cycle. If fault count is set to -1,
20837 20841 * it is a permanent fault.
20838 20842 */
20839 20843 if (sata_inject_fault_count != -1) {
20840 20844 sata_fault_count = sata_inject_fault_count;
20841 20845 sata_fault_suspend_count =
20842 20846 sata_inject_fault_pause_count;
20843 20847 if (sata_fault_suspend_count == 0)
20844 20848 sata_inject_fault_count = 0;
20845 20849 }
20846 20850 }
20847 20851
20848 20852 if (sata_fault_count != 0)
20849 20853 sata_fault_count -= 1;
20850 20854
20851 20855 switch (fault) {
20852 20856 case SATA_PKT_BUSY:
20853 20857 *rval = SATA_TRAN_BUSY;
20854 20858 spkt->satapkt_reason = SATA_PKT_BUSY;
20855 20859 break;
20856 20860
20857 20861 case SATA_PKT_QUEUE_FULL:
20858 20862 *rval = SATA_TRAN_QUEUE_FULL;
20859 20863 spkt->satapkt_reason = SATA_PKT_QUEUE_FULL;
20860 20864 break;
20861 20865
20862 20866 case SATA_PKT_CMD_UNSUPPORTED:
20863 20867 *rval = SATA_TRAN_CMD_UNSUPPORTED;
20864 20868 spkt->satapkt_reason = SATA_PKT_CMD_UNSUPPORTED;
20865 20869 break;
20866 20870
20867 20871 case SATA_PKT_PORT_ERROR:
20868 20872 /* This is "rejected" command */
20869 20873 *rval = SATA_TRAN_PORT_ERROR;
20870 20874 spkt->satapkt_reason = SATA_PKT_PORT_ERROR;
20871 20875 /* Additional error setup could be done here - port state */
20872 20876 break;
20873 20877
20874 20878 case SATA_PKT_DEV_ERROR:
20875 20879 spkt->satapkt_reason = SATA_PKT_DEV_ERROR;
20876 20880 /*
20877 20881 * Additional error setup could be done here
20878 20882 */
20879 20883 break;
20880 20884
20881 20885 case SATA_PKT_ABORTED:
20882 20886 spkt->satapkt_reason = SATA_PKT_ABORTED;
20883 20887 break;
20884 20888
20885 20889 case SATA_PKT_TIMEOUT:
20886 20890 spkt->satapkt_reason = SATA_PKT_TIMEOUT;
20887 20891 /* Additional error setup could be done here */
20888 20892 break;
20889 20893
20890 20894 case SATA_PKT_RESET:
20891 20895 spkt->satapkt_reason = SATA_PKT_RESET;
20892 20896 /*
20893 20897 * Additional error setup could be done here - device reset
20894 20898 */
20895 20899 break;
20896 20900
20897 20901 default:
20898 20902 break;
20899 20903 }
20900 20904 }
20901 20905
20902 20906 #endif
20903 20907
20904 20908 /*
20905 20909 * SATA Trace Ring Buffer
20906 20910 * ----------------------
20907 20911 *
20908 20912 * Overview
20909 20913 *
20910 20914 * The SATA trace ring buffer is a ring buffer created and managed by
20911 20915 * the SATA framework module that can be used by any module or driver
20912 20916 * within the SATA framework to store debug messages.
20913 20917 *
20914 20918 * Ring Buffer Interfaces:
20915 20919 *
20916 20920 * sata_vtrace_debug() <-- Adds debug message to ring buffer
20917 20921 * sata_trace_debug() <-- Wraps varargs into sata_vtrace_debug()
20918 20922 *
20919 20923 * Note that the sata_trace_debug() interface was created to give
20920 20924 * consumers the flexibilty of sending debug messages to ring buffer
20921 20925 * as variable arguments. Consumers can send type va_list debug
20922 20926 * messages directly to sata_vtrace_debug(). The sata_trace_debug()
20923 20927 * and sata_vtrace_debug() relationship is similar to that of
20924 20928 * cmn_err(9F) and vcmn_err(9F).
20925 20929 *
20926 20930 * Below is a diagram of the SATA trace ring buffer interfaces and
20927 20931 * sample consumers:
20928 20932 *
20929 20933 * +---------------------------------+
20930 20934 * | o o SATA Framework Module |
20931 20935 * | o SATA o +------------------+ +------------------+
20932 20936 * |o Trace o <--|sata_vtrace_debug/|<-----|SATA HBA Driver #1|
20933 20937 * |o R-Buf o |sata_trace_debug |<--+ +------------------+
20934 20938 * | o o +------------------+ | +------------------+
20935 20939 * | o o ^ | +--|SATA HBA Driver #2|
20936 20940 * | | | +------------------+
20937 20941 * | +------------------+ |
20938 20942 * | |SATA Debug Message| |
20939 20943 * | +------------------+ |
20940 20944 * +---------------------------------+
20941 20945 *
20942 20946 * Supporting Routines:
20943 20947 *
20944 20948 * sata_trace_rbuf_alloc() <-- Initializes ring buffer
20945 20949 * sata_trace_rbuf_free() <-- Destroys ring buffer
20946 20950 * sata_trace_dmsg_alloc() <-- Creates or reuses buffer in ring buffer
20947 20951 * sata_trace_dmsg_free() <-- Destroys content of ring buffer
20948 20952 *
20949 20953 * The default SATA trace ring buffer size is defined by DMSG_RING_SIZE.
20950 20954 * The ring buffer size can be adjusted by setting dmsg_ring_size in
20951 20955 * /etc/system to desired size in unit of bytes.
20952 20956 *
20953 20957 * The individual debug message size in the ring buffer is restricted
20954 20958 * to DMSG_BUF_SIZE.
20955 20959 */
20956 20960 void
20957 20961 sata_vtrace_debug(dev_info_t *dip, const char *fmt, va_list ap)
20958 20962 {
20959 20963 sata_trace_dmsg_t *dmsg;
20960 20964
20961 20965 if (sata_debug_rbuf == NULL) {
20962 20966 return;
20963 20967 }
20964 20968
20965 20969 /*
20966 20970 * If max size of ring buffer is smaller than size
20967 20971 * required for one debug message then just return
20968 20972 * since we have no room for the debug message.
20969 20973 */
20970 20974 if (sata_debug_rbuf->maxsize < (sizeof (sata_trace_dmsg_t))) {
20971 20975 return;
20972 20976 }
20973 20977
20974 20978 mutex_enter(&sata_debug_rbuf->lock);
20975 20979
20976 20980 /* alloc or reuse on ring buffer */
20977 20981 dmsg = sata_trace_dmsg_alloc();
20978 20982
20979 20983 if (dmsg == NULL) {
20980 20984 /* resource allocation failed */
20981 20985 mutex_exit(&sata_debug_rbuf->lock);
20982 20986 return;
20983 20987 }
20984 20988
20985 20989 dmsg->dip = dip;
20986 20990 gethrestime(&dmsg->timestamp);
20987 20991
20988 20992 (void) vsnprintf(dmsg->buf, sizeof (dmsg->buf), fmt, ap);
20989 20993
20990 20994 mutex_exit(&sata_debug_rbuf->lock);
20991 20995 }
20992 20996
20993 20997 void
20994 20998 sata_trace_debug(dev_info_t *dip, const char *fmt, ...)
20995 20999 {
20996 21000 va_list ap;
20997 21001
20998 21002 va_start(ap, fmt);
20999 21003 sata_vtrace_debug(dip, fmt, ap);
21000 21004 va_end(ap);
21001 21005 }
21002 21006
21003 21007 /*
21004 21008 * This routine is used to manage debug messages
21005 21009 * on ring buffer.
21006 21010 */
21007 21011 static sata_trace_dmsg_t *
21008 21012 sata_trace_dmsg_alloc(void)
21009 21013 {
21010 21014 sata_trace_dmsg_t *dmsg_alloc, *dmsg = sata_debug_rbuf->dmsgp;
21011 21015
21012 21016 if (sata_debug_rbuf->looped == TRUE) {
21013 21017 sata_debug_rbuf->dmsgp = dmsg->next;
21014 21018 return (sata_debug_rbuf->dmsgp);
21015 21019 }
21016 21020
21017 21021 /*
21018 21022 * If we're looping for the first time,
21019 21023 * connect the ring.
21020 21024 */
21021 21025 if (((sata_debug_rbuf->size + (sizeof (sata_trace_dmsg_t))) >
21022 21026 sata_debug_rbuf->maxsize) && (sata_debug_rbuf->dmsgh != NULL)) {
21023 21027 dmsg->next = sata_debug_rbuf->dmsgh;
21024 21028 sata_debug_rbuf->dmsgp = sata_debug_rbuf->dmsgh;
21025 21029 sata_debug_rbuf->looped = TRUE;
21026 21030 return (sata_debug_rbuf->dmsgp);
21027 21031 }
21028 21032
21029 21033 /* If we've gotten this far then memory allocation is needed */
21030 21034 dmsg_alloc = kmem_zalloc(sizeof (sata_trace_dmsg_t), KM_NOSLEEP);
21031 21035 if (dmsg_alloc == NULL) {
21032 21036 sata_debug_rbuf->allocfailed++;
21033 21037 return (dmsg_alloc);
21034 21038 } else {
21035 21039 sata_debug_rbuf->size += sizeof (sata_trace_dmsg_t);
21036 21040 }
21037 21041
21038 21042 if (sata_debug_rbuf->dmsgp != NULL) {
21039 21043 dmsg->next = dmsg_alloc;
21040 21044 sata_debug_rbuf->dmsgp = dmsg->next;
21041 21045 return (sata_debug_rbuf->dmsgp);
21042 21046 } else {
21043 21047 /*
21044 21048 * We should only be here if we're initializing
21045 21049 * the ring buffer.
21046 21050 */
21047 21051 if (sata_debug_rbuf->dmsgh == NULL) {
21048 21052 sata_debug_rbuf->dmsgh = dmsg_alloc;
21049 21053 } else {
21050 21054 /* Something is wrong */
21051 21055 kmem_free(dmsg_alloc, sizeof (sata_trace_dmsg_t));
21052 21056 return (NULL);
21053 21057 }
21054 21058
21055 21059 sata_debug_rbuf->dmsgp = dmsg_alloc;
21056 21060 return (sata_debug_rbuf->dmsgp);
21057 21061 }
21058 21062 }
21059 21063
21060 21064
21061 21065 /*
21062 21066 * Free all messages on debug ring buffer.
21063 21067 */
21064 21068 static void
21065 21069 sata_trace_dmsg_free(void)
21066 21070 {
21067 21071 sata_trace_dmsg_t *dmsg_next, *dmsg = sata_debug_rbuf->dmsgh;
21068 21072
21069 21073 while (dmsg != NULL) {
21070 21074 dmsg_next = dmsg->next;
21071 21075 kmem_free(dmsg, sizeof (sata_trace_dmsg_t));
21072 21076
21073 21077 /*
21074 21078 * If we've looped around the ring than we're done.
21075 21079 */
21076 21080 if (dmsg_next == sata_debug_rbuf->dmsgh) {
21077 21081 break;
21078 21082 } else {
21079 21083 dmsg = dmsg_next;
21080 21084 }
21081 21085 }
21082 21086 }
21083 21087
21084 21088
21085 21089 /*
21086 21090 * This function can block
21087 21091 */
21088 21092 static void
21089 21093 sata_trace_rbuf_alloc(void)
21090 21094 {
21091 21095 sata_debug_rbuf = kmem_zalloc(sizeof (sata_trace_rbuf_t), KM_SLEEP);
21092 21096
21093 21097 mutex_init(&sata_debug_rbuf->lock, NULL, MUTEX_DRIVER, NULL);
21094 21098
21095 21099 if (dmsg_ring_size > 0) {
21096 21100 sata_debug_rbuf->maxsize = (size_t)dmsg_ring_size;
21097 21101 }
21098 21102 }
21099 21103
21100 21104
21101 21105 static void
21102 21106 sata_trace_rbuf_free(void)
21103 21107 {
21104 21108 sata_trace_dmsg_free();
21105 21109 mutex_destroy(&sata_debug_rbuf->lock);
21106 21110 kmem_free(sata_debug_rbuf, sizeof (sata_trace_rbuf_t));
21107 21111 }
21108 21112
21109 21113 /*
21110 21114 * If SATA_DEBUG is not defined then this routine is called instead
21111 21115 * of sata_log() via the SATA_LOG_D macro.
21112 21116 */
21113 21117 static void
21114 21118 sata_trace_log(sata_hba_inst_t *sata_hba_inst, uint_t level,
21115 21119 const char *fmt, ...)
21116 21120 {
21117 21121 #ifndef __lock_lint
21118 21122 _NOTE(ARGUNUSED(level))
21119 21123 #endif
21120 21124
21121 21125 dev_info_t *dip = NULL;
21122 21126 va_list ap;
21123 21127
21124 21128 if (sata_hba_inst != NULL) {
21125 21129 dip = SATA_DIP(sata_hba_inst);
21126 21130 }
21127 21131
21128 21132 va_start(ap, fmt);
21129 21133 sata_vtrace_debug(dip, fmt, ap);
21130 21134 va_end(ap);
21131 21135 }
|
↓ open down ↓ |
8848 lines elided |
↑ open up ↑ |
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX