1 /*-
2 * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
3 *
4 * Copyright (c) 2009 Yahoo! Inc.
5 * Copyright (c) 2011-2015 LSI Corp.
6 * Copyright (c) 2013-2015 Avago Technologies
7 * All rights reserved.
8 *
9 * Redistribution and use in source and binary forms, with or without
10 * modification, are permitted provided that the following conditions
11 * are met:
12 * 1. Redistributions of source code must retain the above copyright
13 * notice, this list of conditions and the following disclaimer.
14 * 2. Redistributions in binary form must reproduce the above copyright
15 * notice, this list of conditions and the following disclaimer in the
16 * documentation and/or other materials provided with the distribution.
17 *
18 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
19 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
20 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
21 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
22 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
23 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
24 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
25 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
26 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
27 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
28 * SUCH DAMAGE.
29 *
30 * Avago Technologies (LSI) MPT-Fusion Host Adapter FreeBSD
31 *
32 * $FreeBSD$
33 */
34
35 #include <sys/cdefs.h>
36 __FBSDID("$FreeBSD$");
37
38 /* Communications core for Avago Technologies (LSI) MPT2 */
39
40 /* TODO Move headers to mpsvar */
41 #include <sys/types.h>
42 #include <sys/param.h>
43 #include <sys/systm.h>
44 #include <sys/kernel.h>
45 #include <sys/selinfo.h>
46 #include <sys/module.h>
47 #include <sys/bus.h>
48 #include <sys/conf.h>
49 #include <sys/bio.h>
50 #include <sys/malloc.h>
51 #include <sys/uio.h>
52 #include <sys/sysctl.h>
53 #include <sys/endian.h>
54 #include <sys/queue.h>
55 #include <sys/kthread.h>
56 #include <sys/taskqueue.h>
57 #include <sys/sbuf.h>
58
59 #include <machine/bus.h>
60 #include <machine/resource.h>
61 #include <sys/rman.h>
62
63 #include <machine/stdarg.h>
64
65 #include <cam/cam.h>
66 #include <cam/cam_ccb.h>
67 #include <cam/cam_xpt.h>
68 #include <cam/cam_debug.h>
69 #include <cam/cam_sim.h>
70 #include <cam/cam_xpt_sim.h>
71 #include <cam/cam_xpt_periph.h>
72 #include <cam/cam_periph.h>
73 #include <cam/scsi/scsi_all.h>
74 #include <cam/scsi/scsi_message.h>
75 #if __FreeBSD_version >= 900026
76 #include <cam/scsi/smp_all.h>
77 #endif
78
79 #include <dev/mps/mpi/mpi2_type.h>
80 #include <dev/mps/mpi/mpi2.h>
81 #include <dev/mps/mpi/mpi2_ioc.h>
82 #include <dev/mps/mpi/mpi2_sas.h>
83 #include <dev/mps/mpi/mpi2_cnfg.h>
84 #include <dev/mps/mpi/mpi2_init.h>
85 #include <dev/mps/mpi/mpi2_tool.h>
86 #include <dev/mps/mps_ioctl.h>
87 #include <dev/mps/mpsvar.h>
88 #include <dev/mps/mps_table.h>
89 #include <dev/mps/mps_sas.h>
90
91 #define MPSSAS_DISCOVERY_TIMEOUT 20
92 #define MPSSAS_MAX_DISCOVERY_TIMEOUTS 10 /* 200 seconds */
93
94 /*
95 * static array to check SCSI OpCode for EEDP protection bits
96 */
97 #define PRO_R MPI2_SCSIIO_EEDPFLAGS_CHECK_REMOVE_OP
98 #define PRO_W MPI2_SCSIIO_EEDPFLAGS_INSERT_OP
99 #define PRO_V MPI2_SCSIIO_EEDPFLAGS_INSERT_OP
100 static uint8_t op_code_prot[256] = {
101 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
102 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
103 0, 0, 0, 0, 0, 0, 0, 0, PRO_R, 0, PRO_W, 0, 0, 0, PRO_W, PRO_V,
104 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
105 0, PRO_W, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
106 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
107 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
108 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
109 0, 0, 0, 0, 0, 0, 0, 0, PRO_R, 0, PRO_W, 0, 0, 0, PRO_W, PRO_V,
110 0, 0, 0, PRO_W, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
111 0, 0, 0, 0, 0, 0, 0, 0, PRO_R, 0, PRO_W, 0, 0, 0, PRO_W, PRO_V,
112 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
113 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
114 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
115 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
116 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
117 };
118
119 MALLOC_DEFINE(M_MPSSAS, "MPSSAS", "MPS SAS memory");
120
121 static void mpssas_remove_device(struct mps_softc *, struct mps_command *);
122 static void mpssas_remove_complete(struct mps_softc *, struct mps_command *);
123 static void mpssas_action(struct cam_sim *sim, union ccb *ccb);
124 static void mpssas_poll(struct cam_sim *sim);
125 static int mpssas_send_abort(struct mps_softc *sc, struct mps_command *tm,
126 struct mps_command *cm);
127 static void mpssas_scsiio_timeout(void *data);
128 static void mpssas_abort_complete(struct mps_softc *sc, struct mps_command *cm);
129 static void mpssas_direct_drive_io(struct mpssas_softc *sassc,
130 struct mps_command *cm, union ccb *ccb);
131 static void mpssas_action_scsiio(struct mpssas_softc *, union ccb *);
132 static void mpssas_scsiio_complete(struct mps_softc *, struct mps_command *);
133 static void mpssas_action_resetdev(struct mpssas_softc *, union ccb *);
134 #if __FreeBSD_version >= 900026
135 static void mpssas_smpio_complete(struct mps_softc *sc, struct mps_command *cm);
136 static void mpssas_send_smpcmd(struct mpssas_softc *sassc, union ccb *ccb,
137 uint64_t sasaddr);
138 static void mpssas_action_smpio(struct mpssas_softc *sassc, union ccb *ccb);
139 #endif //FreeBSD_version >= 900026
140 static void mpssas_resetdev_complete(struct mps_softc *, struct mps_command *);
141 static void mpssas_async(void *callback_arg, uint32_t code,
142 struct cam_path *path, void *arg);
143 #if (__FreeBSD_version < 901503) || \
144 ((__FreeBSD_version >= 1000000) && (__FreeBSD_version < 1000006))
145 static void mpssas_check_eedp(struct mps_softc *sc, struct cam_path *path,
146 struct ccb_getdev *cgd);
147 static void mpssas_read_cap_done(struct cam_periph *periph, union ccb *done_ccb);
148 #endif
149 static int mpssas_send_portenable(struct mps_softc *sc);
150 static void mpssas_portenable_complete(struct mps_softc *sc,
151 struct mps_command *cm);
152
153 struct mpssas_target *
mpssas_find_target_by_handle(struct mpssas_softc * sassc,int start,uint16_t handle)154 mpssas_find_target_by_handle(struct mpssas_softc *sassc, int start, uint16_t handle)
155 {
156 struct mpssas_target *target;
157 int i;
158
159 for (i = start; i < sassc->maxtargets; i++) {
160 target = &sassc->targets[i];
161 if (target->handle == handle)
162 return (target);
163 }
164
165 return (NULL);
166 }
167
168 /* we need to freeze the simq during attach and diag reset, to avoid failing
169 * commands before device handles have been found by discovery. Since
170 * discovery involves reading config pages and possibly sending commands,
171 * discovery actions may continue even after we receive the end of discovery
172 * event, so refcount discovery actions instead of assuming we can unfreeze
173 * the simq when we get the event.
174 */
175 void
mpssas_startup_increment(struct mpssas_softc * sassc)176 mpssas_startup_increment(struct mpssas_softc *sassc)
177 {
178 MPS_FUNCTRACE(sassc->sc);
179
180 if ((sassc->flags & MPSSAS_IN_STARTUP) != 0) {
181 if (sassc->startup_refcount++ == 0) {
182 /* just starting, freeze the simq */
183 mps_dprint(sassc->sc, MPS_INIT,
184 "%s freezing simq\n", __func__);
185 #if __FreeBSD_version >= 1000039
186 xpt_hold_boot();
187 #endif
188 xpt_freeze_simq(sassc->sim, 1);
189 }
190 mps_dprint(sassc->sc, MPS_INIT, "%s refcount %u\n", __func__,
191 sassc->startup_refcount);
192 }
193 }
194
195 void
mpssas_release_simq_reinit(struct mpssas_softc * sassc)196 mpssas_release_simq_reinit(struct mpssas_softc *sassc)
197 {
198 if (sassc->flags & MPSSAS_QUEUE_FROZEN) {
199 sassc->flags &= ~MPSSAS_QUEUE_FROZEN;
200 xpt_release_simq(sassc->sim, 1);
201 mps_dprint(sassc->sc, MPS_INFO, "Unfreezing SIM queue\n");
202 }
203 }
204
205 void
mpssas_startup_decrement(struct mpssas_softc * sassc)206 mpssas_startup_decrement(struct mpssas_softc *sassc)
207 {
208 MPS_FUNCTRACE(sassc->sc);
209
210 if ((sassc->flags & MPSSAS_IN_STARTUP) != 0) {
211 if (--sassc->startup_refcount == 0) {
212 /* finished all discovery-related actions, release
213 * the simq and rescan for the latest topology.
214 */
215 mps_dprint(sassc->sc, MPS_INIT,
216 "%s releasing simq\n", __func__);
217 sassc->flags &= ~MPSSAS_IN_STARTUP;
218 xpt_release_simq(sassc->sim, 1);
219 #if __FreeBSD_version >= 1000039
220 xpt_release_boot();
221 #else
222 mpssas_rescan_target(sassc->sc, NULL);
223 #endif
224 }
225 mps_dprint(sassc->sc, MPS_INIT, "%s refcount %u\n", __func__,
226 sassc->startup_refcount);
227 }
228 }
229
230 /*
231 * The firmware requires us to stop sending commands when we're doing task
232 * management.
233 * XXX The logic for serializing the device has been made lazy and moved to
234 * mpssas_prepare_for_tm().
235 */
236 struct mps_command *
mpssas_alloc_tm(struct mps_softc * sc)237 mpssas_alloc_tm(struct mps_softc *sc)
238 {
239 MPI2_SCSI_TASK_MANAGE_REQUEST *req;
240 struct mps_command *tm;
241
242 tm = mps_alloc_high_priority_command(sc);
243 if (tm == NULL)
244 return (NULL);
245
246 req = (MPI2_SCSI_TASK_MANAGE_REQUEST *)tm->cm_req;
247 req->Function = MPI2_FUNCTION_SCSI_TASK_MGMT;
248 return tm;
249 }
250
251 void
mpssas_free_tm(struct mps_softc * sc,struct mps_command * tm)252 mpssas_free_tm(struct mps_softc *sc, struct mps_command *tm)
253 {
254 int target_id = 0xFFFFFFFF;
255
256 if (tm == NULL)
257 return;
258
259 /*
260 * For TM's the devq is frozen for the device. Unfreeze it here and
261 * free the resources used for freezing the devq. Must clear the
262 * INRESET flag as well or scsi I/O will not work.
263 */
264 if (tm->cm_targ != NULL) {
265 tm->cm_targ->flags &= ~MPSSAS_TARGET_INRESET;
266 target_id = tm->cm_targ->tid;
267 }
268 if (tm->cm_ccb) {
269 mps_dprint(sc, MPS_INFO, "Unfreezing devq for target ID %d\n",
270 target_id);
271 xpt_release_devq(tm->cm_ccb->ccb_h.path, 1, TRUE);
272 xpt_free_path(tm->cm_ccb->ccb_h.path);
273 xpt_free_ccb(tm->cm_ccb);
274 }
275
276 mps_free_high_priority_command(sc, tm);
277 }
278
279 void
mpssas_rescan_target(struct mps_softc * sc,struct mpssas_target * targ)280 mpssas_rescan_target(struct mps_softc *sc, struct mpssas_target *targ)
281 {
282 struct mpssas_softc *sassc = sc->sassc;
283 path_id_t pathid;
284 target_id_t targetid;
285 union ccb *ccb;
286
287 MPS_FUNCTRACE(sc);
288 pathid = cam_sim_path(sassc->sim);
289 if (targ == NULL)
290 targetid = CAM_TARGET_WILDCARD;
291 else
292 targetid = targ - sassc->targets;
293
294 /*
295 * Allocate a CCB and schedule a rescan.
296 */
297 ccb = xpt_alloc_ccb_nowait();
298 if (ccb == NULL) {
299 mps_dprint(sc, MPS_ERROR, "unable to alloc CCB for rescan\n");
300 return;
301 }
302
303 if (xpt_create_path(&ccb->ccb_h.path, NULL, pathid,
304 targetid, CAM_LUN_WILDCARD) != CAM_REQ_CMP) {
305 mps_dprint(sc, MPS_ERROR, "unable to create path for rescan\n");
306 xpt_free_ccb(ccb);
307 return;
308 }
309
310 if (targetid == CAM_TARGET_WILDCARD)
311 ccb->ccb_h.func_code = XPT_SCAN_BUS;
312 else
313 ccb->ccb_h.func_code = XPT_SCAN_TGT;
314
315 mps_dprint(sc, MPS_TRACE, "%s targetid %u\n", __func__, targetid);
316 xpt_rescan(ccb);
317 }
318
319 static void
mpssas_log_command(struct mps_command * cm,u_int level,const char * fmt,...)320 mpssas_log_command(struct mps_command *cm, u_int level, const char *fmt, ...)
321 {
322 struct sbuf sb;
323 va_list ap;
324 char str[192];
325 char path_str[64];
326
327 if (cm == NULL)
328 return;
329
330 /* No need to be in here if debugging isn't enabled */
331 if ((cm->cm_sc->mps_debug & level) == 0)
332 return;
333
334 sbuf_new(&sb, str, sizeof(str), 0);
335
336 va_start(ap, fmt);
337
338 if (cm->cm_ccb != NULL) {
339 xpt_path_string(cm->cm_ccb->csio.ccb_h.path, path_str,
340 sizeof(path_str));
341 sbuf_cat(&sb, path_str);
342 if (cm->cm_ccb->ccb_h.func_code == XPT_SCSI_IO) {
343 scsi_command_string(&cm->cm_ccb->csio, &sb);
344 sbuf_printf(&sb, "length %d ",
345 cm->cm_ccb->csio.dxfer_len);
346 }
347 }
348 else {
349 sbuf_printf(&sb, "(noperiph:%s%d:%u:%u:%u): ",
350 cam_sim_name(cm->cm_sc->sassc->sim),
351 cam_sim_unit(cm->cm_sc->sassc->sim),
352 cam_sim_bus(cm->cm_sc->sassc->sim),
353 cm->cm_targ ? cm->cm_targ->tid : 0xFFFFFFFF,
354 cm->cm_lun);
355 }
356
357 sbuf_printf(&sb, "SMID %u ", cm->cm_desc.Default.SMID);
358 sbuf_vprintf(&sb, fmt, ap);
359 sbuf_finish(&sb);
360 mps_print_field(cm->cm_sc, "%s", sbuf_data(&sb));
361
362 va_end(ap);
363 }
364
365
366 static void
mpssas_remove_volume(struct mps_softc * sc,struct mps_command * tm)367 mpssas_remove_volume(struct mps_softc *sc, struct mps_command *tm)
368 {
369 MPI2_SCSI_TASK_MANAGE_REPLY *reply;
370 struct mpssas_target *targ;
371 uint16_t handle;
372
373 MPS_FUNCTRACE(sc);
374
375 reply = (MPI2_SCSI_TASK_MANAGE_REPLY *)tm->cm_reply;
376 handle = (uint16_t)(uintptr_t)tm->cm_complete_data;
377 targ = tm->cm_targ;
378
379 if (reply == NULL) {
380 /* XXX retry the remove after the diag reset completes? */
381 mps_dprint(sc, MPS_FAULT,
382 "%s NULL reply resetting device 0x%04x\n", __func__,
383 handle);
384 mpssas_free_tm(sc, tm);
385 return;
386 }
387
388 if ((le16toh(reply->IOCStatus) & MPI2_IOCSTATUS_MASK) !=
389 MPI2_IOCSTATUS_SUCCESS) {
390 mps_dprint(sc, MPS_ERROR,
391 "IOCStatus = 0x%x while resetting device 0x%x\n",
392 le16toh(reply->IOCStatus), handle);
393 }
394
395 mps_dprint(sc, MPS_XINFO,
396 "Reset aborted %u commands\n", reply->TerminationCount);
397 mps_free_reply(sc, tm->cm_reply_data);
398 tm->cm_reply = NULL; /* Ensures the reply won't get re-freed */
399
400 mps_dprint(sc, MPS_XINFO,
401 "clearing target %u handle 0x%04x\n", targ->tid, handle);
402
403 /*
404 * Don't clear target if remove fails because things will get confusing.
405 * Leave the devname and sasaddr intact so that we know to avoid reusing
406 * this target id if possible, and so we can assign the same target id
407 * to this device if it comes back in the future.
408 */
409 if ((le16toh(reply->IOCStatus) & MPI2_IOCSTATUS_MASK) ==
410 MPI2_IOCSTATUS_SUCCESS) {
411 targ = tm->cm_targ;
412 targ->handle = 0x0;
413 targ->encl_handle = 0x0;
414 targ->encl_slot = 0x0;
415 targ->exp_dev_handle = 0x0;
416 targ->phy_num = 0x0;
417 targ->linkrate = 0x0;
418 targ->devinfo = 0x0;
419 targ->flags = 0x0;
420 }
421
422 mpssas_free_tm(sc, tm);
423 }
424
425
426 /*
427 * No Need to call "MPI2_SAS_OP_REMOVE_DEVICE" For Volume removal.
428 * Otherwise Volume Delete is same as Bare Drive Removal.
429 */
430 void
mpssas_prepare_volume_remove(struct mpssas_softc * sassc,uint16_t handle)431 mpssas_prepare_volume_remove(struct mpssas_softc *sassc, uint16_t handle)
432 {
433 MPI2_SCSI_TASK_MANAGE_REQUEST *req;
434 struct mps_softc *sc;
435 struct mps_command *tm;
436 struct mpssas_target *targ = NULL;
437
438 MPS_FUNCTRACE(sassc->sc);
439 sc = sassc->sc;
440
441 #ifdef WD_SUPPORT
442 /*
443 * If this is a WD controller, determine if the disk should be exposed
444 * to the OS or not. If disk should be exposed, return from this
445 * function without doing anything.
446 */
447 if (sc->WD_available && (sc->WD_hide_expose ==
448 MPS_WD_EXPOSE_ALWAYS)) {
449 return;
450 }
451 #endif //WD_SUPPORT
452
453 targ = mpssas_find_target_by_handle(sassc, 0, handle);
454 if (targ == NULL) {
455 /* FIXME: what is the action? */
456 /* We don't know about this device? */
457 mps_dprint(sc, MPS_ERROR,
458 "%s %d : invalid handle 0x%x \n", __func__,__LINE__, handle);
459 return;
460 }
461
462 targ->flags |= MPSSAS_TARGET_INREMOVAL;
463
464 tm = mpssas_alloc_tm(sc);
465 if (tm == NULL) {
466 mps_dprint(sc, MPS_ERROR,
467 "%s: command alloc failure\n", __func__);
468 return;
469 }
470
471 mpssas_rescan_target(sc, targ);
472
473 req = (MPI2_SCSI_TASK_MANAGE_REQUEST *)tm->cm_req;
474 req->DevHandle = targ->handle;
475 req->TaskType = MPI2_SCSITASKMGMT_TASKTYPE_TARGET_RESET;
476
477 /* SAS Hard Link Reset / SATA Link Reset */
478 req->MsgFlags = MPI2_SCSITASKMGMT_MSGFLAGS_LINK_RESET;
479
480 tm->cm_targ = targ;
481 tm->cm_data = NULL;
482 tm->cm_complete = mpssas_remove_volume;
483 tm->cm_complete_data = (void *)(uintptr_t)handle;
484
485 mps_dprint(sc, MPS_INFO, "%s: Sending reset for target ID %d\n",
486 __func__, targ->tid);
487 mpssas_prepare_for_tm(sc, tm, targ, CAM_LUN_WILDCARD);
488
489 mps_map_command(sc, tm);
490 }
491
492 /*
493 * The MPT2 firmware performs debounce on the link to avoid transient link
494 * errors and false removals. When it does decide that link has been lost
495 * and a device need to go away, it expects that the host will perform a
496 * target reset and then an op remove. The reset has the side-effect of
497 * aborting any outstanding requests for the device, which is required for
498 * the op-remove to succeed. It's not clear if the host should check for
499 * the device coming back alive after the reset.
500 */
501 void
mpssas_prepare_remove(struct mpssas_softc * sassc,uint16_t handle)502 mpssas_prepare_remove(struct mpssas_softc *sassc, uint16_t handle)
503 {
504 MPI2_SCSI_TASK_MANAGE_REQUEST *req;
505 struct mps_softc *sc;
506 struct mps_command *cm;
507 struct mpssas_target *targ = NULL;
508
509 MPS_FUNCTRACE(sassc->sc);
510
511 sc = sassc->sc;
512
513 targ = mpssas_find_target_by_handle(sassc, 0, handle);
514 if (targ == NULL) {
515 /* FIXME: what is the action? */
516 /* We don't know about this device? */
517 mps_dprint(sc, MPS_ERROR,
518 "%s : invalid handle 0x%x \n", __func__, handle);
519 return;
520 }
521
522 targ->flags |= MPSSAS_TARGET_INREMOVAL;
523
524 cm = mpssas_alloc_tm(sc);
525 if (cm == NULL) {
526 mps_dprint(sc, MPS_ERROR,
527 "%s: command alloc failure\n", __func__);
528 return;
529 }
530
531 mpssas_rescan_target(sc, targ);
532
533 req = (MPI2_SCSI_TASK_MANAGE_REQUEST *)cm->cm_req;
534 memset(req, 0, sizeof(*req));
535 req->DevHandle = htole16(targ->handle);
536 req->TaskType = MPI2_SCSITASKMGMT_TASKTYPE_TARGET_RESET;
537
538 /* SAS Hard Link Reset / SATA Link Reset */
539 req->MsgFlags = MPI2_SCSITASKMGMT_MSGFLAGS_LINK_RESET;
540
541 cm->cm_targ = targ;
542 cm->cm_data = NULL;
543 cm->cm_complete = mpssas_remove_device;
544 cm->cm_complete_data = (void *)(uintptr_t)handle;
545
546 mps_dprint(sc, MPS_INFO, "%s: Sending reset for target ID %d\n",
547 __func__, targ->tid);
548 mpssas_prepare_for_tm(sc, cm, targ, CAM_LUN_WILDCARD);
549
550 mps_map_command(sc, cm);
551 }
552
553 static void
mpssas_remove_device(struct mps_softc * sc,struct mps_command * tm)554 mpssas_remove_device(struct mps_softc *sc, struct mps_command *tm)
555 {
556 MPI2_SCSI_TASK_MANAGE_REPLY *reply;
557 MPI2_SAS_IOUNIT_CONTROL_REQUEST *req;
558 struct mpssas_target *targ;
559 struct mps_command *next_cm;
560 uint16_t handle;
561
562 MPS_FUNCTRACE(sc);
563
564 reply = (MPI2_SCSI_TASK_MANAGE_REPLY *)tm->cm_reply;
565 handle = (uint16_t)(uintptr_t)tm->cm_complete_data;
566 targ = tm->cm_targ;
567
568 /*
569 * Currently there should be no way we can hit this case. It only
570 * happens when we have a failure to allocate chain frames, and
571 * task management commands don't have S/G lists.
572 */
573 if ((tm->cm_flags & MPS_CM_FLAGS_ERROR_MASK) != 0) {
574 mps_dprint(sc, MPS_ERROR,
575 "%s: cm_flags = %#x for remove of handle %#04x! "
576 "This should not happen!\n", __func__, tm->cm_flags,
577 handle);
578 }
579
580 if (reply == NULL) {
581 /* XXX retry the remove after the diag reset completes? */
582 mps_dprint(sc, MPS_FAULT,
583 "%s NULL reply resetting device 0x%04x\n", __func__,
584 handle);
585 mpssas_free_tm(sc, tm);
586 return;
587 }
588
589 if ((le16toh(reply->IOCStatus) & MPI2_IOCSTATUS_MASK) !=
590 MPI2_IOCSTATUS_SUCCESS) {
591 mps_dprint(sc, MPS_ERROR,
592 "IOCStatus = 0x%x while resetting device 0x%x\n",
593 le16toh(reply->IOCStatus), handle);
594 }
595
596 mps_dprint(sc, MPS_XINFO, "Reset aborted %u commands\n",
597 le32toh(reply->TerminationCount));
598 mps_free_reply(sc, tm->cm_reply_data);
599 tm->cm_reply = NULL; /* Ensures the reply won't get re-freed */
600
601 /* Reuse the existing command */
602 req = (MPI2_SAS_IOUNIT_CONTROL_REQUEST *)tm->cm_req;
603 memset(req, 0, sizeof(*req));
604 req->Function = MPI2_FUNCTION_SAS_IO_UNIT_CONTROL;
605 req->Operation = MPI2_SAS_OP_REMOVE_DEVICE;
606 req->DevHandle = htole16(handle);
607 tm->cm_data = NULL;
608 tm->cm_desc.Default.RequestFlags = MPI2_REQ_DESCRIPT_FLAGS_DEFAULT_TYPE;
609 tm->cm_complete = mpssas_remove_complete;
610 tm->cm_complete_data = (void *)(uintptr_t)handle;
611
612 mps_map_command(sc, tm);
613
614 mps_dprint(sc, MPS_XINFO, "clearing target %u handle 0x%04x\n",
615 targ->tid, handle);
616 TAILQ_FOREACH_SAFE(tm, &targ->commands, cm_link, next_cm) {
617 union ccb *ccb;
618
619 mps_dprint(sc, MPS_XINFO, "Completing missed command %p\n", tm);
620 ccb = tm->cm_complete_data;
621 mpssas_set_ccbstatus(ccb, CAM_DEV_NOT_THERE);
622 mpssas_scsiio_complete(sc, tm);
623 }
624 }
625
626 static void
mpssas_remove_complete(struct mps_softc * sc,struct mps_command * tm)627 mpssas_remove_complete(struct mps_softc *sc, struct mps_command *tm)
628 {
629 MPI2_SAS_IOUNIT_CONTROL_REPLY *reply;
630 uint16_t handle;
631 struct mpssas_target *targ;
632 struct mpssas_lun *lun;
633
634 MPS_FUNCTRACE(sc);
635
636 reply = (MPI2_SAS_IOUNIT_CONTROL_REPLY *)tm->cm_reply;
637 handle = (uint16_t)(uintptr_t)tm->cm_complete_data;
638
639 /*
640 * Currently there should be no way we can hit this case. It only
641 * happens when we have a failure to allocate chain frames, and
642 * task management commands don't have S/G lists.
643 */
644 if ((tm->cm_flags & MPS_CM_FLAGS_ERROR_MASK) != 0) {
645 mps_dprint(sc, MPS_XINFO,
646 "%s: cm_flags = %#x for remove of handle %#04x! "
647 "This should not happen!\n", __func__, tm->cm_flags,
648 handle);
649 mpssas_free_tm(sc, tm);
650 return;
651 }
652
653 if (reply == NULL) {
654 /* most likely a chip reset */
655 mps_dprint(sc, MPS_FAULT,
656 "%s NULL reply removing device 0x%04x\n", __func__, handle);
657 mpssas_free_tm(sc, tm);
658 return;
659 }
660
661 mps_dprint(sc, MPS_XINFO,
662 "%s on handle 0x%04x, IOCStatus= 0x%x\n", __func__,
663 handle, le16toh(reply->IOCStatus));
664
665 /*
666 * Don't clear target if remove fails because things will get confusing.
667 * Leave the devname and sasaddr intact so that we know to avoid reusing
668 * this target id if possible, and so we can assign the same target id
669 * to this device if it comes back in the future.
670 */
671 if ((le16toh(reply->IOCStatus) & MPI2_IOCSTATUS_MASK) ==
672 MPI2_IOCSTATUS_SUCCESS) {
673 targ = tm->cm_targ;
674 targ->handle = 0x0;
675 targ->encl_handle = 0x0;
676 targ->encl_slot = 0x0;
677 targ->exp_dev_handle = 0x0;
678 targ->phy_num = 0x0;
679 targ->linkrate = 0x0;
680 targ->devinfo = 0x0;
681 targ->flags = 0x0;
682
683 while(!SLIST_EMPTY(&targ->luns)) {
684 lun = SLIST_FIRST(&targ->luns);
685 SLIST_REMOVE_HEAD(&targ->luns, lun_link);
686 free(lun, M_MPT2);
687 }
688 }
689
690
691 mpssas_free_tm(sc, tm);
692 }
693
694 static int
mpssas_register_events(struct mps_softc * sc)695 mpssas_register_events(struct mps_softc *sc)
696 {
697 u32 events[MPI2_EVENT_NOTIFY_EVENTMASK_WORDS];
698
699 bzero(events, 16);
700 setbit(events, MPI2_EVENT_SAS_DEVICE_STATUS_CHANGE);
701 setbit(events, MPI2_EVENT_SAS_DISCOVERY);
702 setbit(events, MPI2_EVENT_SAS_BROADCAST_PRIMITIVE);
703 setbit(events, MPI2_EVENT_SAS_INIT_DEVICE_STATUS_CHANGE);
704 setbit(events, MPI2_EVENT_SAS_INIT_TABLE_OVERFLOW);
705 setbit(events, MPI2_EVENT_SAS_TOPOLOGY_CHANGE_LIST);
706 setbit(events, MPI2_EVENT_SAS_ENCL_DEVICE_STATUS_CHANGE);
707 setbit(events, MPI2_EVENT_IR_CONFIGURATION_CHANGE_LIST);
708 setbit(events, MPI2_EVENT_IR_VOLUME);
709 setbit(events, MPI2_EVENT_IR_PHYSICAL_DISK);
710 setbit(events, MPI2_EVENT_IR_OPERATION_STATUS);
711 setbit(events, MPI2_EVENT_LOG_ENTRY_ADDED);
712
713 mps_register_events(sc, events, mpssas_evt_handler, NULL,
714 &sc->sassc->mpssas_eh);
715
716 return (0);
717 }
718
719 int
mps_attach_sas(struct mps_softc * sc)720 mps_attach_sas(struct mps_softc *sc)
721 {
722 struct mpssas_softc *sassc;
723 cam_status status;
724 int unit, error = 0, reqs;
725
726 MPS_FUNCTRACE(sc);
727 mps_dprint(sc, MPS_INIT, "%s entered\n", __func__);
728
729 sassc = malloc(sizeof(struct mpssas_softc), M_MPT2, M_WAITOK|M_ZERO);
730 if(!sassc) {
731 mps_dprint(sc, MPS_INIT|MPS_ERROR,
732 "Cannot allocate SAS controller memory\n");
733 return (ENOMEM);
734 }
735
736 /*
737 * XXX MaxTargets could change during a reinit. Since we don't
738 * resize the targets[] array during such an event, cache the value
739 * of MaxTargets here so that we don't get into trouble later. This
740 * should move into the reinit logic.
741 */
742 sassc->maxtargets = sc->facts->MaxTargets + sc->facts->MaxVolumes;
743 sassc->targets = malloc(sizeof(struct mpssas_target) *
744 sassc->maxtargets, M_MPT2, M_WAITOK|M_ZERO);
745 if(!sassc->targets) {
746 mps_dprint(sc, MPS_INIT|MPS_ERROR,
747 "Cannot allocate SAS target memory\n");
748 free(sassc, M_MPT2);
749 return (ENOMEM);
750 }
751 sc->sassc = sassc;
752 sassc->sc = sc;
753
754 reqs = sc->num_reqs - sc->num_prireqs - 1;
755 if ((sassc->devq = cam_simq_alloc(reqs)) == NULL) {
756 mps_dprint(sc, MPS_ERROR, "Cannot allocate SIMQ\n");
757 error = ENOMEM;
758 goto out;
759 }
760
761 unit = device_get_unit(sc->mps_dev);
762 sassc->sim = cam_sim_alloc(mpssas_action, mpssas_poll, "mps", sassc,
763 unit, &sc->mps_mtx, reqs, reqs, sassc->devq);
764 if (sassc->sim == NULL) {
765 mps_dprint(sc, MPS_INIT|MPS_ERROR, "Cannot allocate SIM\n");
766 error = EINVAL;
767 goto out;
768 }
769
770 TAILQ_INIT(&sassc->ev_queue);
771
772 /* Initialize taskqueue for Event Handling */
773 TASK_INIT(&sassc->ev_task, 0, mpssas_firmware_event_work, sc);
774 sassc->ev_tq = taskqueue_create("mps_taskq", M_NOWAIT | M_ZERO,
775 taskqueue_thread_enqueue, &sassc->ev_tq);
776 taskqueue_start_threads(&sassc->ev_tq, 1, PRIBIO, "%s taskq",
777 device_get_nameunit(sc->mps_dev));
778
779 mps_lock(sc);
780
781 /*
782 * XXX There should be a bus for every port on the adapter, but since
783 * we're just going to fake the topology for now, we'll pretend that
784 * everything is just a target on a single bus.
785 */
786 if ((error = xpt_bus_register(sassc->sim, sc->mps_dev, 0)) != 0) {
787 mps_dprint(sc, MPS_INIT|MPS_ERROR,
788 "Error %d registering SCSI bus\n", error);
789 mps_unlock(sc);
790 goto out;
791 }
792
793 /*
794 * Assume that discovery events will start right away.
795 *
796 * Hold off boot until discovery is complete.
797 */
798 sassc->flags |= MPSSAS_IN_STARTUP | MPSSAS_IN_DISCOVERY;
799 sc->sassc->startup_refcount = 0;
800 mpssas_startup_increment(sassc);
801
802 callout_init(&sassc->discovery_callout, 1 /*mpsafe*/);
803
804 /*
805 * Register for async events so we can determine the EEDP
806 * capabilities of devices.
807 */
808 status = xpt_create_path(&sassc->path, /*periph*/NULL,
809 cam_sim_path(sc->sassc->sim), CAM_TARGET_WILDCARD,
810 CAM_LUN_WILDCARD);
811 if (status != CAM_REQ_CMP) {
812 mps_dprint(sc, MPS_ERROR|MPS_INIT,
813 "Error %#x creating sim path\n", status);
814 sassc->path = NULL;
815 } else {
816 int event;
817
818 #if (__FreeBSD_version >= 1000006) || \
819 ((__FreeBSD_version >= 901503) && (__FreeBSD_version < 1000000))
820 event = AC_ADVINFO_CHANGED;
821 #else
822 event = AC_FOUND_DEVICE;
823 #endif
824 status = xpt_register_async(event, mpssas_async, sc,
825 sassc->path);
826 if (status != CAM_REQ_CMP) {
827 mps_dprint(sc, MPS_ERROR,
828 "Error %#x registering async handler for "
829 "AC_ADVINFO_CHANGED events\n", status);
830 xpt_free_path(sassc->path);
831 sassc->path = NULL;
832 }
833 }
834 if (status != CAM_REQ_CMP) {
835 /*
836 * EEDP use is the exception, not the rule.
837 * Warn the user, but do not fail to attach.
838 */
839 mps_printf(sc, "EEDP capabilities disabled.\n");
840 }
841
842 mps_unlock(sc);
843
844 mpssas_register_events(sc);
845 out:
846 if (error)
847 mps_detach_sas(sc);
848
849 mps_dprint(sc, MPS_INIT, "%s exit error= %d\n", __func__, error);
850 return (error);
851 }
852
853 int
mps_detach_sas(struct mps_softc * sc)854 mps_detach_sas(struct mps_softc *sc)
855 {
856 struct mpssas_softc *sassc;
857 struct mpssas_lun *lun, *lun_tmp;
858 struct mpssas_target *targ;
859 int i;
860
861 MPS_FUNCTRACE(sc);
862
863 if (sc->sassc == NULL)
864 return (0);
865
866 sassc = sc->sassc;
867 mps_deregister_events(sc, sassc->mpssas_eh);
868
869 /*
870 * Drain and free the event handling taskqueue with the lock
871 * unheld so that any parallel processing tasks drain properly
872 * without deadlocking.
873 */
874 if (sassc->ev_tq != NULL)
875 taskqueue_free(sassc->ev_tq);
876
877 /* Make sure CAM doesn't wedge if we had to bail out early. */
878 mps_lock(sc);
879
880 while (sassc->startup_refcount != 0)
881 mpssas_startup_decrement(sassc);
882
883 /* Deregister our async handler */
884 if (sassc->path != NULL) {
885 xpt_register_async(0, mpssas_async, sc, sassc->path);
886 xpt_free_path(sassc->path);
887 sassc->path = NULL;
888 }
889
890 if (sassc->flags & MPSSAS_IN_STARTUP)
891 xpt_release_simq(sassc->sim, 1);
892
893 if (sassc->sim != NULL) {
894 xpt_bus_deregister(cam_sim_path(sassc->sim));
895 cam_sim_free(sassc->sim, FALSE);
896 }
897
898 mps_unlock(sc);
899
900 if (sassc->devq != NULL)
901 cam_simq_free(sassc->devq);
902
903 for(i=0; i< sassc->maxtargets ;i++) {
904 targ = &sassc->targets[i];
905 SLIST_FOREACH_SAFE(lun, &targ->luns, lun_link, lun_tmp) {
906 free(lun, M_MPT2);
907 }
908 }
909 free(sassc->targets, M_MPT2);
910 free(sassc, M_MPT2);
911 sc->sassc = NULL;
912
913 return (0);
914 }
915
916 void
mpssas_discovery_end(struct mpssas_softc * sassc)917 mpssas_discovery_end(struct mpssas_softc *sassc)
918 {
919 struct mps_softc *sc = sassc->sc;
920
921 MPS_FUNCTRACE(sc);
922
923 if (sassc->flags & MPSSAS_DISCOVERY_TIMEOUT_PENDING)
924 callout_stop(&sassc->discovery_callout);
925
926 /*
927 * After discovery has completed, check the mapping table for any
928 * missing devices and update their missing counts. Only do this once
929 * whenever the driver is initialized so that missing counts aren't
930 * updated unnecessarily. Note that just because discovery has
931 * completed doesn't mean that events have been processed yet. The
932 * check_devices function is a callout timer that checks if ALL devices
933 * are missing. If so, it will wait a little longer for events to
934 * complete and keep resetting itself until some device in the mapping
935 * table is not missing, meaning that event processing has started.
936 */
937 if (sc->track_mapping_events) {
938 mps_dprint(sc, MPS_XINFO | MPS_MAPPING, "Discovery has "
939 "completed. Check for missing devices in the mapping "
940 "table.\n");
941 callout_reset(&sc->device_check_callout,
942 MPS_MISSING_CHECK_DELAY * hz, mps_mapping_check_devices,
943 sc);
944 }
945 }
946
947 static void
mpssas_action(struct cam_sim * sim,union ccb * ccb)948 mpssas_action(struct cam_sim *sim, union ccb *ccb)
949 {
950 struct mpssas_softc *sassc;
951
952 sassc = cam_sim_softc(sim);
953
954 MPS_FUNCTRACE(sassc->sc);
955 mps_dprint(sassc->sc, MPS_TRACE, "ccb func_code 0x%x\n",
956 ccb->ccb_h.func_code);
957 mtx_assert(&sassc->sc->mps_mtx, MA_OWNED);
958
959 switch (ccb->ccb_h.func_code) {
960 case XPT_PATH_INQ:
961 {
962 struct ccb_pathinq *cpi = &ccb->cpi;
963 struct mps_softc *sc = sassc->sc;
964
965 cpi->version_num = 1;
966 cpi->hba_inquiry = PI_SDTR_ABLE|PI_TAG_ABLE|PI_WIDE_16;
967 cpi->target_sprt = 0;
968 #if __FreeBSD_version >= 1000039
969 cpi->hba_misc = PIM_NOBUSRESET | PIM_UNMAPPED | PIM_NOSCAN;
970 #else
971 cpi->hba_misc = PIM_NOBUSRESET | PIM_UNMAPPED;
972 #endif
973 cpi->hba_eng_cnt = 0;
974 cpi->max_target = sassc->maxtargets - 1;
975 cpi->max_lun = 255;
976
977 /*
978 * initiator_id is set here to an ID outside the set of valid
979 * target IDs (including volumes).
980 */
981 cpi->initiator_id = sassc->maxtargets;
982 strlcpy(cpi->sim_vid, "FreeBSD", SIM_IDLEN);
983 strlcpy(cpi->hba_vid, "Avago Tech", HBA_IDLEN);
984 strlcpy(cpi->dev_name, cam_sim_name(sim), DEV_IDLEN);
985 cpi->unit_number = cam_sim_unit(sim);
986 cpi->bus_id = cam_sim_bus(sim);
987 cpi->base_transfer_speed = 150000;
988 cpi->transport = XPORT_SAS;
989 cpi->transport_version = 0;
990 cpi->protocol = PROTO_SCSI;
991 cpi->protocol_version = SCSI_REV_SPC;
992 cpi->maxio = sc->maxio;
993 mpssas_set_ccbstatus(ccb, CAM_REQ_CMP);
994 break;
995 }
996 case XPT_GET_TRAN_SETTINGS:
997 {
998 struct ccb_trans_settings *cts;
999 struct ccb_trans_settings_sas *sas;
1000 struct ccb_trans_settings_scsi *scsi;
1001 struct mpssas_target *targ;
1002
1003 cts = &ccb->cts;
1004 sas = &cts->xport_specific.sas;
1005 scsi = &cts->proto_specific.scsi;
1006
1007 KASSERT(cts->ccb_h.target_id < sassc->maxtargets,
1008 ("Target %d out of bounds in XPT_GET_TRANS_SETTINGS\n",
1009 cts->ccb_h.target_id));
1010 targ = &sassc->targets[cts->ccb_h.target_id];
1011 if (targ->handle == 0x0) {
1012 mpssas_set_ccbstatus(ccb, CAM_DEV_NOT_THERE);
1013 break;
1014 }
1015
1016 cts->protocol_version = SCSI_REV_SPC2;
1017 cts->transport = XPORT_SAS;
1018 cts->transport_version = 0;
1019
1020 sas->valid = CTS_SAS_VALID_SPEED;
1021 switch (targ->linkrate) {
1022 case 0x08:
1023 sas->bitrate = 150000;
1024 break;
1025 case 0x09:
1026 sas->bitrate = 300000;
1027 break;
1028 case 0x0a:
1029 sas->bitrate = 600000;
1030 break;
1031 default:
1032 sas->valid = 0;
1033 }
1034
1035 cts->protocol = PROTO_SCSI;
1036 scsi->valid = CTS_SCSI_VALID_TQ;
1037 scsi->flags = CTS_SCSI_FLAGS_TAG_ENB;
1038
1039 mpssas_set_ccbstatus(ccb, CAM_REQ_CMP);
1040 break;
1041 }
1042 case XPT_CALC_GEOMETRY:
1043 cam_calc_geometry(&ccb->ccg, /*extended*/1);
1044 mpssas_set_ccbstatus(ccb, CAM_REQ_CMP);
1045 break;
1046 case XPT_RESET_DEV:
1047 mps_dprint(sassc->sc, MPS_XINFO, "mpssas_action XPT_RESET_DEV\n");
1048 mpssas_action_resetdev(sassc, ccb);
1049 return;
1050 case XPT_RESET_BUS:
1051 case XPT_ABORT:
1052 case XPT_TERM_IO:
1053 mps_dprint(sassc->sc, MPS_XINFO,
1054 "mpssas_action faking success for abort or reset\n");
1055 mpssas_set_ccbstatus(ccb, CAM_REQ_CMP);
1056 break;
1057 case XPT_SCSI_IO:
1058 mpssas_action_scsiio(sassc, ccb);
1059 return;
1060 #if __FreeBSD_version >= 900026
1061 case XPT_SMP_IO:
1062 mpssas_action_smpio(sassc, ccb);
1063 return;
1064 #endif
1065 default:
1066 mpssas_set_ccbstatus(ccb, CAM_FUNC_NOTAVAIL);
1067 break;
1068 }
1069 xpt_done(ccb);
1070
1071 }
1072
1073 static void
mpssas_announce_reset(struct mps_softc * sc,uint32_t ac_code,target_id_t target_id,lun_id_t lun_id)1074 mpssas_announce_reset(struct mps_softc *sc, uint32_t ac_code,
1075 target_id_t target_id, lun_id_t lun_id)
1076 {
1077 path_id_t path_id = cam_sim_path(sc->sassc->sim);
1078 struct cam_path *path;
1079
1080 mps_dprint(sc, MPS_XINFO, "%s code %x target %d lun %jx\n", __func__,
1081 ac_code, target_id, (uintmax_t)lun_id);
1082
1083 if (xpt_create_path(&path, NULL,
1084 path_id, target_id, lun_id) != CAM_REQ_CMP) {
1085 mps_dprint(sc, MPS_ERROR, "unable to create path for reset "
1086 "notification\n");
1087 return;
1088 }
1089
1090 xpt_async(ac_code, path, NULL);
1091 xpt_free_path(path);
1092 }
1093
1094 static void
mpssas_complete_all_commands(struct mps_softc * sc)1095 mpssas_complete_all_commands(struct mps_softc *sc)
1096 {
1097 struct mps_command *cm;
1098 int i;
1099 int completed;
1100
1101 MPS_FUNCTRACE(sc);
1102 mtx_assert(&sc->mps_mtx, MA_OWNED);
1103
1104 /* complete all commands with a NULL reply */
1105 for (i = 1; i < sc->num_reqs; i++) {
1106 cm = &sc->commands[i];
1107 if (cm->cm_state == MPS_CM_STATE_FREE)
1108 continue;
1109
1110 cm->cm_state = MPS_CM_STATE_BUSY;
1111 cm->cm_reply = NULL;
1112 completed = 0;
1113
1114 if (cm->cm_flags & MPS_CM_FLAGS_SATA_ID_TIMEOUT) {
1115 MPASS(cm->cm_data);
1116 free(cm->cm_data, M_MPT2);
1117 cm->cm_data = NULL;
1118 }
1119
1120 if (cm->cm_flags & MPS_CM_FLAGS_POLLED)
1121 cm->cm_flags |= MPS_CM_FLAGS_COMPLETE;
1122
1123 if (cm->cm_complete != NULL) {
1124 mpssas_log_command(cm, MPS_RECOVERY,
1125 "completing cm %p state %x ccb %p for diag reset\n",
1126 cm, cm->cm_state, cm->cm_ccb);
1127
1128 cm->cm_complete(sc, cm);
1129 completed = 1;
1130 } else if (cm->cm_flags & MPS_CM_FLAGS_WAKEUP) {
1131 mpssas_log_command(cm, MPS_RECOVERY,
1132 "waking up cm %p state %x ccb %p for diag reset\n",
1133 cm, cm->cm_state, cm->cm_ccb);
1134 wakeup(cm);
1135 completed = 1;
1136 }
1137
1138 if ((completed == 0) && (cm->cm_state != MPS_CM_STATE_FREE)) {
1139 /* this should never happen, but if it does, log */
1140 mpssas_log_command(cm, MPS_RECOVERY,
1141 "cm %p state %x flags 0x%x ccb %p during diag "
1142 "reset\n", cm, cm->cm_state, cm->cm_flags,
1143 cm->cm_ccb);
1144 }
1145 }
1146
1147 sc->io_cmds_active = 0;
1148 }
1149
1150 void
mpssas_handle_reinit(struct mps_softc * sc)1151 mpssas_handle_reinit(struct mps_softc *sc)
1152 {
1153 int i;
1154
1155 /* Go back into startup mode and freeze the simq, so that CAM
1156 * doesn't send any commands until after we've rediscovered all
1157 * targets and found the proper device handles for them.
1158 *
1159 * After the reset, portenable will trigger discovery, and after all
1160 * discovery-related activities have finished, the simq will be
1161 * released.
1162 */
1163 mps_dprint(sc, MPS_INIT, "%s startup\n", __func__);
1164 sc->sassc->flags |= MPSSAS_IN_STARTUP;
1165 sc->sassc->flags |= MPSSAS_IN_DISCOVERY;
1166 mpssas_startup_increment(sc->sassc);
1167
1168 /* notify CAM of a bus reset */
1169 mpssas_announce_reset(sc, AC_BUS_RESET, CAM_TARGET_WILDCARD,
1170 CAM_LUN_WILDCARD);
1171
1172 /* complete and cleanup after all outstanding commands */
1173 mpssas_complete_all_commands(sc);
1174
1175 mps_dprint(sc, MPS_INIT,
1176 "%s startup %u after command completion\n", __func__,
1177 sc->sassc->startup_refcount);
1178
1179 /* zero all the target handles, since they may change after the
1180 * reset, and we have to rediscover all the targets and use the new
1181 * handles.
1182 */
1183 for (i = 0; i < sc->sassc->maxtargets; i++) {
1184 if (sc->sassc->targets[i].outstanding != 0)
1185 mps_dprint(sc, MPS_INIT, "target %u outstanding %u\n",
1186 i, sc->sassc->targets[i].outstanding);
1187 sc->sassc->targets[i].handle = 0x0;
1188 sc->sassc->targets[i].exp_dev_handle = 0x0;
1189 sc->sassc->targets[i].outstanding = 0;
1190 sc->sassc->targets[i].flags = MPSSAS_TARGET_INDIAGRESET;
1191 }
1192 }
1193
1194 static void
mpssas_tm_timeout(void * data)1195 mpssas_tm_timeout(void *data)
1196 {
1197 struct mps_command *tm = data;
1198 struct mps_softc *sc = tm->cm_sc;
1199
1200 mtx_assert(&sc->mps_mtx, MA_OWNED);
1201
1202 mpssas_log_command(tm, MPS_INFO|MPS_RECOVERY,
1203 "task mgmt %p timed out\n", tm);
1204
1205 KASSERT(tm->cm_state == MPS_CM_STATE_INQUEUE,
1206 ("command not inqueue\n"));
1207
1208 tm->cm_state = MPS_CM_STATE_BUSY;
1209 mps_reinit(sc);
1210 }
1211
1212 static void
mpssas_logical_unit_reset_complete(struct mps_softc * sc,struct mps_command * tm)1213 mpssas_logical_unit_reset_complete(struct mps_softc *sc, struct mps_command *tm)
1214 {
1215 MPI2_SCSI_TASK_MANAGE_REPLY *reply;
1216 MPI2_SCSI_TASK_MANAGE_REQUEST *req;
1217 unsigned int cm_count = 0;
1218 struct mps_command *cm;
1219 struct mpssas_target *targ;
1220
1221 callout_stop(&tm->cm_callout);
1222
1223 req = (MPI2_SCSI_TASK_MANAGE_REQUEST *)tm->cm_req;
1224 reply = (MPI2_SCSI_TASK_MANAGE_REPLY *)tm->cm_reply;
1225 targ = tm->cm_targ;
1226
1227 /*
1228 * Currently there should be no way we can hit this case. It only
1229 * happens when we have a failure to allocate chain frames, and
1230 * task management commands don't have S/G lists.
1231 * XXXSL So should it be an assertion?
1232 */
1233 if ((tm->cm_flags & MPS_CM_FLAGS_ERROR_MASK) != 0) {
1234 mps_dprint(sc, MPS_RECOVERY|MPS_ERROR,
1235 "%s: cm_flags = %#x for LUN reset! "
1236 "This should not happen!\n", __func__, tm->cm_flags);
1237 mpssas_free_tm(sc, tm);
1238 return;
1239 }
1240
1241 if (reply == NULL) {
1242 mps_dprint(sc, MPS_RECOVERY, "NULL reset reply for tm %p\n",
1243 tm);
1244 if ((sc->mps_flags & MPS_FLAGS_DIAGRESET) != 0) {
1245 /* this completion was due to a reset, just cleanup */
1246 mps_dprint(sc, MPS_RECOVERY, "Hardware undergoing "
1247 "reset, ignoring NULL LUN reset reply\n");
1248 targ->tm = NULL;
1249 mpssas_free_tm(sc, tm);
1250 }
1251 else {
1252 /* we should have gotten a reply. */
1253 mps_dprint(sc, MPS_INFO|MPS_RECOVERY, "NULL reply on "
1254 "LUN reset attempt, resetting controller\n");
1255 mps_reinit(sc);
1256 }
1257 return;
1258 }
1259
1260 mps_dprint(sc, MPS_RECOVERY,
1261 "logical unit reset status 0x%x code 0x%x count %u\n",
1262 le16toh(reply->IOCStatus), le32toh(reply->ResponseCode),
1263 le32toh(reply->TerminationCount));
1264
1265 /*
1266 * See if there are any outstanding commands for this LUN.
1267 * This could be made more efficient by using a per-LU data
1268 * structure of some sort.
1269 */
1270 TAILQ_FOREACH(cm, &targ->commands, cm_link) {
1271 if (cm->cm_lun == tm->cm_lun)
1272 cm_count++;
1273 }
1274
1275 if (cm_count == 0) {
1276 mps_dprint(sc, MPS_RECOVERY|MPS_INFO,
1277 "Finished recovery after LUN reset for target %u\n",
1278 targ->tid);
1279
1280 mpssas_announce_reset(sc, AC_SENT_BDR, targ->tid, tm->cm_lun);
1281
1282 /*
1283 * We've finished recovery for this logical unit. check and
1284 * see if some other logical unit has a timedout command
1285 * that needs to be processed.
1286 */
1287 cm = TAILQ_FIRST(&targ->timedout_commands);
1288 if (cm) {
1289 mps_dprint(sc, MPS_INFO|MPS_RECOVERY,
1290 "More commands to abort for target %u\n",
1291 targ->tid);
1292 mpssas_send_abort(sc, tm, cm);
1293 } else {
1294 targ->tm = NULL;
1295 mpssas_free_tm(sc, tm);
1296 }
1297 } else {
1298 /*
1299 * If we still have commands for this LUN, the reset
1300 * effectively failed, regardless of the status reported.
1301 * Escalate to a target reset.
1302 */
1303 mps_dprint(sc, MPS_INFO|MPS_RECOVERY,
1304 "logical unit reset complete for target %u, but still "
1305 "have %u command(s), sending target reset\n", targ->tid,
1306 cm_count);
1307 mpssas_send_reset(sc, tm,
1308 MPI2_SCSITASKMGMT_TASKTYPE_TARGET_RESET);
1309 }
1310 }
1311
1312 static void
mpssas_target_reset_complete(struct mps_softc * sc,struct mps_command * tm)1313 mpssas_target_reset_complete(struct mps_softc *sc, struct mps_command *tm)
1314 {
1315 MPI2_SCSI_TASK_MANAGE_REPLY *reply;
1316 MPI2_SCSI_TASK_MANAGE_REQUEST *req;
1317 struct mpssas_target *targ;
1318
1319 callout_stop(&tm->cm_callout);
1320
1321 req = (MPI2_SCSI_TASK_MANAGE_REQUEST *)tm->cm_req;
1322 reply = (MPI2_SCSI_TASK_MANAGE_REPLY *)tm->cm_reply;
1323 targ = tm->cm_targ;
1324
1325 /*
1326 * Currently there should be no way we can hit this case. It only
1327 * happens when we have a failure to allocate chain frames, and
1328 * task management commands don't have S/G lists.
1329 */
1330 if ((tm->cm_flags & MPS_CM_FLAGS_ERROR_MASK) != 0) {
1331 mps_dprint(sc, MPS_ERROR,"%s: cm_flags = %#x for target reset! "
1332 "This should not happen!\n", __func__, tm->cm_flags);
1333 mpssas_free_tm(sc, tm);
1334 return;
1335 }
1336
1337 if (reply == NULL) {
1338 mps_dprint(sc, MPS_RECOVERY,
1339 "NULL target reset reply for tm %pi TaskMID %u\n",
1340 tm, le16toh(req->TaskMID));
1341 if ((sc->mps_flags & MPS_FLAGS_DIAGRESET) != 0) {
1342 /* this completion was due to a reset, just cleanup */
1343 mps_dprint(sc, MPS_RECOVERY, "Hardware undergoing "
1344 "reset, ignoring NULL target reset reply\n");
1345 targ->tm = NULL;
1346 mpssas_free_tm(sc, tm);
1347 } else {
1348 /* we should have gotten a reply. */
1349 mps_dprint(sc, MPS_INFO|MPS_RECOVERY, "NULL reply on "
1350 "target reset attempt, resetting controller\n");
1351 mps_reinit(sc);
1352 }
1353 return;
1354 }
1355
1356 mps_dprint(sc, MPS_RECOVERY,
1357 "target reset status 0x%x code 0x%x count %u\n",
1358 le16toh(reply->IOCStatus), le32toh(reply->ResponseCode),
1359 le32toh(reply->TerminationCount));
1360
1361 if (targ->outstanding == 0) {
1362 /* we've finished recovery for this target and all
1363 * of its logical units.
1364 */
1365 mps_dprint(sc, MPS_RECOVERY|MPS_INFO,
1366 "Finished reset recovery for target %u\n", targ->tid);
1367
1368 mpssas_announce_reset(sc, AC_SENT_BDR, tm->cm_targ->tid,
1369 CAM_LUN_WILDCARD);
1370
1371 targ->tm = NULL;
1372 mpssas_free_tm(sc, tm);
1373 } else {
1374 /*
1375 * After a target reset, if this target still has
1376 * outstanding commands, the reset effectively failed,
1377 * regardless of the status reported. escalate.
1378 */
1379 mps_dprint(sc, MPS_INFO|MPS_RECOVERY,
1380 "Target reset complete for target %u, but still have %u "
1381 "command(s), resetting controller\n", targ->tid,
1382 targ->outstanding);
1383 mps_reinit(sc);
1384 }
1385 }
1386
1387 #define MPS_RESET_TIMEOUT 30
1388
1389 int
mpssas_send_reset(struct mps_softc * sc,struct mps_command * tm,uint8_t type)1390 mpssas_send_reset(struct mps_softc *sc, struct mps_command *tm, uint8_t type)
1391 {
1392 MPI2_SCSI_TASK_MANAGE_REQUEST *req;
1393 struct mpssas_target *target;
1394 int err;
1395
1396 target = tm->cm_targ;
1397 if (target->handle == 0) {
1398 mps_dprint(sc, MPS_ERROR,"%s null devhandle for target_id %d\n",
1399 __func__, target->tid);
1400 return -1;
1401 }
1402
1403 req = (MPI2_SCSI_TASK_MANAGE_REQUEST *)tm->cm_req;
1404 req->DevHandle = htole16(target->handle);
1405 req->TaskType = type;
1406
1407 if (type == MPI2_SCSITASKMGMT_TASKTYPE_LOGICAL_UNIT_RESET) {
1408 /* XXX Need to handle invalid LUNs */
1409 MPS_SET_LUN(req->LUN, tm->cm_lun);
1410 tm->cm_targ->logical_unit_resets++;
1411 mps_dprint(sc, MPS_RECOVERY|MPS_INFO,
1412 "Sending logical unit reset to target %u lun %d\n",
1413 target->tid, tm->cm_lun);
1414 tm->cm_complete = mpssas_logical_unit_reset_complete;
1415 mpssas_prepare_for_tm(sc, tm, target, tm->cm_lun);
1416 } else if (type == MPI2_SCSITASKMGMT_TASKTYPE_TARGET_RESET) {
1417 /*
1418 * Target reset method =
1419 * SAS Hard Link Reset / SATA Link Reset
1420 */
1421 req->MsgFlags = MPI2_SCSITASKMGMT_MSGFLAGS_LINK_RESET;
1422 tm->cm_targ->target_resets++;
1423 mps_dprint(sc, MPS_RECOVERY|MPS_INFO,
1424 "Sending target reset to target %u\n", target->tid);
1425 tm->cm_complete = mpssas_target_reset_complete;
1426 mpssas_prepare_for_tm(sc, tm, target, CAM_LUN_WILDCARD);
1427 } else {
1428 mps_dprint(sc, MPS_ERROR, "unexpected reset type 0x%x\n", type);
1429 return -1;
1430 }
1431
1432 tm->cm_data = NULL;
1433 tm->cm_complete_data = (void *)tm;
1434
1435 callout_reset(&tm->cm_callout, MPS_RESET_TIMEOUT * hz,
1436 mpssas_tm_timeout, tm);
1437
1438 err = mps_map_command(sc, tm);
1439 if (err)
1440 mps_dprint(sc, MPS_ERROR|MPS_RECOVERY,
1441 "error %d sending reset type %u\n",
1442 err, type);
1443
1444 return err;
1445 }
1446
1447
1448 static void
mpssas_abort_complete(struct mps_softc * sc,struct mps_command * tm)1449 mpssas_abort_complete(struct mps_softc *sc, struct mps_command *tm)
1450 {
1451 struct mps_command *cm;
1452 MPI2_SCSI_TASK_MANAGE_REPLY *reply;
1453 MPI2_SCSI_TASK_MANAGE_REQUEST *req;
1454 struct mpssas_target *targ;
1455
1456 callout_stop(&tm->cm_callout);
1457
1458 req = (MPI2_SCSI_TASK_MANAGE_REQUEST *)tm->cm_req;
1459 reply = (MPI2_SCSI_TASK_MANAGE_REPLY *)tm->cm_reply;
1460 targ = tm->cm_targ;
1461
1462 /*
1463 * Currently there should be no way we can hit this case. It only
1464 * happens when we have a failure to allocate chain frames, and
1465 * task management commands don't have S/G lists.
1466 */
1467 if ((tm->cm_flags & MPS_CM_FLAGS_ERROR_MASK) != 0) {
1468 mps_dprint(sc, MPS_RECOVERY,
1469 "cm_flags = %#x for abort %p TaskMID %u!\n",
1470 tm->cm_flags, tm, le16toh(req->TaskMID));
1471 mpssas_free_tm(sc, tm);
1472 return;
1473 }
1474
1475 if (reply == NULL) {
1476 mps_dprint(sc, MPS_RECOVERY,
1477 "NULL abort reply for tm %p TaskMID %u\n",
1478 tm, le16toh(req->TaskMID));
1479 if ((sc->mps_flags & MPS_FLAGS_DIAGRESET) != 0) {
1480 /* this completion was due to a reset, just cleanup */
1481 mps_dprint(sc, MPS_RECOVERY, "Hardware undergoing "
1482 "reset, ignoring NULL abort reply\n");
1483 targ->tm = NULL;
1484 mpssas_free_tm(sc, tm);
1485 } else {
1486 /* we should have gotten a reply. */
1487 mps_dprint(sc, MPS_INFO|MPS_RECOVERY, "NULL reply on "
1488 "abort attempt, resetting controller\n");
1489 mps_reinit(sc);
1490 }
1491 return;
1492 }
1493
1494 mps_dprint(sc, MPS_RECOVERY,
1495 "abort TaskMID %u status 0x%x code 0x%x count %u\n",
1496 le16toh(req->TaskMID),
1497 le16toh(reply->IOCStatus), le32toh(reply->ResponseCode),
1498 le32toh(reply->TerminationCount));
1499
1500 cm = TAILQ_FIRST(&tm->cm_targ->timedout_commands);
1501 if (cm == NULL) {
1502 /*
1503 * If there are no more timedout commands, we're done with
1504 * error recovery for this target.
1505 */
1506 mps_dprint(sc, MPS_INFO|MPS_RECOVERY,
1507 "Finished abort recovery for target %u\n", targ->tid);
1508
1509 targ->tm = NULL;
1510 mpssas_free_tm(sc, tm);
1511 } else if (le16toh(req->TaskMID) != cm->cm_desc.Default.SMID) {
1512 /* abort success, but we have more timedout commands to abort */
1513 mps_dprint(sc, MPS_INFO|MPS_RECOVERY,
1514 "Continuing abort recovery for target %u\n", targ->tid);
1515
1516 mpssas_send_abort(sc, tm, cm);
1517 } else {
1518 /* we didn't get a command completion, so the abort
1519 * failed as far as we're concerned. escalate.
1520 */
1521 mps_dprint(sc, MPS_RECOVERY,
1522 "Abort failed for target %u, sending logical unit reset\n",
1523 targ->tid);
1524
1525 mpssas_send_reset(sc, tm,
1526 MPI2_SCSITASKMGMT_TASKTYPE_LOGICAL_UNIT_RESET);
1527 }
1528 }
1529
1530 #define MPS_ABORT_TIMEOUT 5
1531
1532 static int
mpssas_send_abort(struct mps_softc * sc,struct mps_command * tm,struct mps_command * cm)1533 mpssas_send_abort(struct mps_softc *sc, struct mps_command *tm, struct mps_command *cm)
1534 {
1535 MPI2_SCSI_TASK_MANAGE_REQUEST *req;
1536 struct mpssas_target *targ;
1537 int err;
1538
1539 targ = cm->cm_targ;
1540 if (targ->handle == 0) {
1541 mps_dprint(sc, MPS_ERROR|MPS_RECOVERY,
1542 "%s null devhandle for target_id %d\n",
1543 __func__, cm->cm_ccb->ccb_h.target_id);
1544 return -1;
1545 }
1546
1547 mpssas_log_command(cm, MPS_RECOVERY|MPS_INFO,
1548 "Aborting command %p\n", cm);
1549
1550 req = (MPI2_SCSI_TASK_MANAGE_REQUEST *)tm->cm_req;
1551 req->DevHandle = htole16(targ->handle);
1552 req->TaskType = MPI2_SCSITASKMGMT_TASKTYPE_ABORT_TASK;
1553
1554 /* XXX Need to handle invalid LUNs */
1555 MPS_SET_LUN(req->LUN, cm->cm_ccb->ccb_h.target_lun);
1556
1557 req->TaskMID = htole16(cm->cm_desc.Default.SMID);
1558
1559 tm->cm_data = NULL;
1560 tm->cm_complete = mpssas_abort_complete;
1561 tm->cm_complete_data = (void *)tm;
1562 tm->cm_targ = cm->cm_targ;
1563 tm->cm_lun = cm->cm_lun;
1564
1565 callout_reset(&tm->cm_callout, MPS_ABORT_TIMEOUT * hz,
1566 mpssas_tm_timeout, tm);
1567
1568 targ->aborts++;
1569
1570 mpssas_prepare_for_tm(sc, tm, targ, tm->cm_lun);
1571
1572 err = mps_map_command(sc, tm);
1573 if (err)
1574 mps_dprint(sc, MPS_ERROR|MPS_RECOVERY,
1575 "error %d sending abort for cm %p SMID %u\n",
1576 err, cm, req->TaskMID);
1577 return err;
1578 }
1579
1580 static void
mpssas_scsiio_timeout(void * data)1581 mpssas_scsiio_timeout(void *data)
1582 {
1583 sbintime_t elapsed, now;
1584 union ccb *ccb;
1585 struct mps_softc *sc;
1586 struct mps_command *cm;
1587 struct mpssas_target *targ;
1588
1589 cm = (struct mps_command *)data;
1590 sc = cm->cm_sc;
1591 ccb = cm->cm_ccb;
1592 now = sbinuptime();
1593
1594 MPS_FUNCTRACE(sc);
1595 mtx_assert(&sc->mps_mtx, MA_OWNED);
1596
1597 mps_dprint(sc, MPS_XINFO|MPS_RECOVERY, "Timeout checking cm %p\n", sc);
1598
1599 /*
1600 * Run the interrupt handler to make sure it's not pending. This
1601 * isn't perfect because the command could have already completed
1602 * and been re-used, though this is unlikely.
1603 */
1604 mps_intr_locked(sc);
1605 if (cm->cm_flags & MPS_CM_FLAGS_ON_RECOVERY) {
1606 mpssas_log_command(cm, MPS_XINFO,
1607 "SCSI command %p almost timed out\n", cm);
1608 return;
1609 }
1610
1611 if (cm->cm_ccb == NULL) {
1612 mps_dprint(sc, MPS_ERROR, "command timeout with NULL ccb\n");
1613 return;
1614 }
1615
1616 targ = cm->cm_targ;
1617 targ->timeouts++;
1618
1619 elapsed = now - ccb->ccb_h.qos.sim_data;
1620 mpssas_log_command(cm, MPS_INFO|MPS_RECOVERY,
1621 "Command timeout on target %u(0x%04x) %d set, %d.%d elapsed\n",
1622 targ->tid, targ->handle, ccb->ccb_h.timeout,
1623 sbintime_getsec(elapsed), elapsed & 0xffffffff);
1624
1625 /* XXX first, check the firmware state, to see if it's still
1626 * operational. if not, do a diag reset.
1627 */
1628 mpssas_set_ccbstatus(cm->cm_ccb, CAM_CMD_TIMEOUT);
1629 cm->cm_flags |= MPS_CM_FLAGS_ON_RECOVERY | MPS_CM_FLAGS_TIMEDOUT;
1630 TAILQ_INSERT_TAIL(&targ->timedout_commands, cm, cm_recovery);
1631
1632 if (targ->tm != NULL) {
1633 /* target already in recovery, just queue up another
1634 * timedout command to be processed later.
1635 */
1636 mps_dprint(sc, MPS_RECOVERY,
1637 "queued timedout cm %p for processing by tm %p\n",
1638 cm, targ->tm);
1639 } else if ((targ->tm = mpssas_alloc_tm(sc)) != NULL) {
1640 mps_dprint(sc, MPS_RECOVERY|MPS_INFO,
1641 "Sending abort to target %u for SMID %d\n", targ->tid,
1642 cm->cm_desc.Default.SMID);
1643 mps_dprint(sc, MPS_RECOVERY, "timedout cm %p allocated tm %p\n",
1644 cm, targ->tm);
1645
1646 /* start recovery by aborting the first timedout command */
1647 mpssas_send_abort(sc, targ->tm, cm);
1648 } else {
1649 /* XXX queue this target up for recovery once a TM becomes
1650 * available. The firmware only has a limited number of
1651 * HighPriority credits for the high priority requests used
1652 * for task management, and we ran out.
1653 *
1654 * Isilon: don't worry about this for now, since we have
1655 * more credits than disks in an enclosure, and limit
1656 * ourselves to one TM per target for recovery.
1657 */
1658 mps_dprint(sc, MPS_ERROR|MPS_RECOVERY,
1659 "timedout cm %p failed to allocate a tm\n", cm);
1660 }
1661
1662 }
1663
1664 static void
mpssas_action_scsiio(struct mpssas_softc * sassc,union ccb * ccb)1665 mpssas_action_scsiio(struct mpssas_softc *sassc, union ccb *ccb)
1666 {
1667 MPI2_SCSI_IO_REQUEST *req;
1668 struct ccb_scsiio *csio;
1669 struct mps_softc *sc;
1670 struct mpssas_target *targ;
1671 struct mpssas_lun *lun;
1672 struct mps_command *cm;
1673 uint8_t i, lba_byte, *ref_tag_addr;
1674 uint16_t eedp_flags;
1675 uint32_t mpi_control;
1676
1677 sc = sassc->sc;
1678 MPS_FUNCTRACE(sc);
1679 mtx_assert(&sc->mps_mtx, MA_OWNED);
1680
1681 csio = &ccb->csio;
1682 KASSERT(csio->ccb_h.target_id < sassc->maxtargets,
1683 ("Target %d out of bounds in XPT_SCSI_IO\n",
1684 csio->ccb_h.target_id));
1685 targ = &sassc->targets[csio->ccb_h.target_id];
1686 mps_dprint(sc, MPS_TRACE, "ccb %p target flag %x\n", ccb, targ->flags);
1687 if (targ->handle == 0x0) {
1688 mps_dprint(sc, MPS_ERROR, "%s NULL handle for target %u\n",
1689 __func__, csio->ccb_h.target_id);
1690 mpssas_set_ccbstatus(ccb, CAM_DEV_NOT_THERE);
1691 xpt_done(ccb);
1692 return;
1693 }
1694 if (targ->flags & MPS_TARGET_FLAGS_RAID_COMPONENT) {
1695 mps_dprint(sc, MPS_ERROR, "%s Raid component no SCSI IO "
1696 "supported %u\n", __func__, csio->ccb_h.target_id);
1697 mpssas_set_ccbstatus(ccb, CAM_DEV_NOT_THERE);
1698 xpt_done(ccb);
1699 return;
1700 }
1701 /*
1702 * Sometimes, it is possible to get a command that is not "In
1703 * Progress" and was actually aborted by the upper layer. Check for
1704 * this here and complete the command without error.
1705 */
1706 if (mpssas_get_ccbstatus(ccb) != CAM_REQ_INPROG) {
1707 mps_dprint(sc, MPS_TRACE, "%s Command is not in progress for "
1708 "target %u\n", __func__, csio->ccb_h.target_id);
1709 xpt_done(ccb);
1710 return;
1711 }
1712 /*
1713 * If devinfo is 0 this will be a volume. In that case don't tell CAM
1714 * that the volume has timed out. We want volumes to be enumerated
1715 * until they are deleted/removed, not just failed.
1716 */
1717 if (targ->flags & MPSSAS_TARGET_INREMOVAL) {
1718 if (targ->devinfo == 0)
1719 mpssas_set_ccbstatus(ccb, CAM_REQ_CMP);
1720 else
1721 mpssas_set_ccbstatus(ccb, CAM_SEL_TIMEOUT);
1722 xpt_done(ccb);
1723 return;
1724 }
1725
1726 if ((sc->mps_flags & MPS_FLAGS_SHUTDOWN) != 0) {
1727 mps_dprint(sc, MPS_INFO, "%s shutting down\n", __func__);
1728 mpssas_set_ccbstatus(ccb, CAM_DEV_NOT_THERE);
1729 xpt_done(ccb);
1730 return;
1731 }
1732
1733 /*
1734 * If target has a reset in progress, freeze the devq and return. The
1735 * devq will be released when the TM reset is finished.
1736 */
1737 if (targ->flags & MPSSAS_TARGET_INRESET) {
1738 ccb->ccb_h.status = CAM_BUSY | CAM_DEV_QFRZN;
1739 mps_dprint(sc, MPS_INFO, "%s: Freezing devq for target ID %d\n",
1740 __func__, targ->tid);
1741 xpt_freeze_devq(ccb->ccb_h.path, 1);
1742 xpt_done(ccb);
1743 return;
1744 }
1745
1746 cm = mps_alloc_command(sc);
1747 if (cm == NULL || (sc->mps_flags & MPS_FLAGS_DIAGRESET)) {
1748 if (cm != NULL) {
1749 mps_free_command(sc, cm);
1750 }
1751 if ((sassc->flags & MPSSAS_QUEUE_FROZEN) == 0) {
1752 xpt_freeze_simq(sassc->sim, 1);
1753 sassc->flags |= MPSSAS_QUEUE_FROZEN;
1754 }
1755 ccb->ccb_h.status &= ~CAM_SIM_QUEUED;
1756 ccb->ccb_h.status |= CAM_REQUEUE_REQ;
1757 xpt_done(ccb);
1758 return;
1759 }
1760
1761 req = (MPI2_SCSI_IO_REQUEST *)cm->cm_req;
1762 bzero(req, sizeof(*req));
1763 req->DevHandle = htole16(targ->handle);
1764 req->Function = MPI2_FUNCTION_SCSI_IO_REQUEST;
1765 req->MsgFlags = 0;
1766 req->SenseBufferLowAddress = htole32(cm->cm_sense_busaddr);
1767 req->SenseBufferLength = MPS_SENSE_LEN;
1768 req->SGLFlags = 0;
1769 req->ChainOffset = 0;
1770 req->SGLOffset0 = 24; /* 32bit word offset to the SGL */
1771 req->SGLOffset1= 0;
1772 req->SGLOffset2= 0;
1773 req->SGLOffset3= 0;
1774 req->SkipCount = 0;
1775 req->DataLength = htole32(csio->dxfer_len);
1776 req->BidirectionalDataLength = 0;
1777 req->IoFlags = htole16(csio->cdb_len);
1778 req->EEDPFlags = 0;
1779
1780 /* Note: BiDirectional transfers are not supported */
1781 switch (csio->ccb_h.flags & CAM_DIR_MASK) {
1782 case CAM_DIR_IN:
1783 mpi_control = MPI2_SCSIIO_CONTROL_READ;
1784 cm->cm_flags |= MPS_CM_FLAGS_DATAIN;
1785 break;
1786 case CAM_DIR_OUT:
1787 mpi_control = MPI2_SCSIIO_CONTROL_WRITE;
1788 cm->cm_flags |= MPS_CM_FLAGS_DATAOUT;
1789 break;
1790 case CAM_DIR_NONE:
1791 default:
1792 mpi_control = MPI2_SCSIIO_CONTROL_NODATATRANSFER;
1793 break;
1794 }
1795
1796 if (csio->cdb_len == 32)
1797 mpi_control |= 4 << MPI2_SCSIIO_CONTROL_ADDCDBLEN_SHIFT;
1798 /*
1799 * It looks like the hardware doesn't require an explicit tag
1800 * number for each transaction. SAM Task Management not supported
1801 * at the moment.
1802 */
1803 switch (csio->tag_action) {
1804 case MSG_HEAD_OF_Q_TAG:
1805 mpi_control |= MPI2_SCSIIO_CONTROL_HEADOFQ;
1806 break;
1807 case MSG_ORDERED_Q_TAG:
1808 mpi_control |= MPI2_SCSIIO_CONTROL_ORDEREDQ;
1809 break;
1810 case MSG_ACA_TASK:
1811 mpi_control |= MPI2_SCSIIO_CONTROL_ACAQ;
1812 break;
1813 case CAM_TAG_ACTION_NONE:
1814 case MSG_SIMPLE_Q_TAG:
1815 default:
1816 mpi_control |= MPI2_SCSIIO_CONTROL_SIMPLEQ;
1817 break;
1818 }
1819 mpi_control |= sc->mapping_table[csio->ccb_h.target_id].TLR_bits;
1820 req->Control = htole32(mpi_control);
1821 if (MPS_SET_LUN(req->LUN, csio->ccb_h.target_lun) != 0) {
1822 mps_free_command(sc, cm);
1823 mpssas_set_ccbstatus(ccb, CAM_LUN_INVALID);
1824 xpt_done(ccb);
1825 return;
1826 }
1827
1828 if (csio->ccb_h.flags & CAM_CDB_POINTER)
1829 bcopy(csio->cdb_io.cdb_ptr, &req->CDB.CDB32[0], csio->cdb_len);
1830 else
1831 bcopy(csio->cdb_io.cdb_bytes, &req->CDB.CDB32[0],csio->cdb_len);
1832 req->IoFlags = htole16(csio->cdb_len);
1833
1834 /*
1835 * Check if EEDP is supported and enabled. If it is then check if the
1836 * SCSI opcode could be using EEDP. If so, make sure the LUN exists and
1837 * is formatted for EEDP support. If all of this is true, set CDB up
1838 * for EEDP transfer.
1839 */
1840 eedp_flags = op_code_prot[req->CDB.CDB32[0]];
1841 if (sc->eedp_enabled && eedp_flags) {
1842 SLIST_FOREACH(lun, &targ->luns, lun_link) {
1843 if (lun->lun_id == csio->ccb_h.target_lun) {
1844 break;
1845 }
1846 }
1847
1848 if ((lun != NULL) && (lun->eedp_formatted)) {
1849 req->EEDPBlockSize = htole16(lun->eedp_block_size);
1850 eedp_flags |= (MPI2_SCSIIO_EEDPFLAGS_INC_PRI_REFTAG |
1851 MPI2_SCSIIO_EEDPFLAGS_CHECK_REFTAG |
1852 MPI2_SCSIIO_EEDPFLAGS_CHECK_GUARD);
1853 req->EEDPFlags = htole16(eedp_flags);
1854
1855 /*
1856 * If CDB less than 32, fill in Primary Ref Tag with
1857 * low 4 bytes of LBA. If CDB is 32, tag stuff is
1858 * already there. Also, set protection bit. FreeBSD
1859 * currently does not support CDBs bigger than 16, but
1860 * the code doesn't hurt, and will be here for the
1861 * future.
1862 */
1863 if (csio->cdb_len != 32) {
1864 lba_byte = (csio->cdb_len == 16) ? 6 : 2;
1865 ref_tag_addr = (uint8_t *)&req->CDB.EEDP32.
1866 PrimaryReferenceTag;
1867 for (i = 0; i < 4; i++) {
1868 *ref_tag_addr =
1869 req->CDB.CDB32[lba_byte + i];
1870 ref_tag_addr++;
1871 }
1872 req->CDB.EEDP32.PrimaryReferenceTag =
1873 htole32(req->CDB.EEDP32.PrimaryReferenceTag);
1874 req->CDB.EEDP32.PrimaryApplicationTagMask =
1875 0xFFFF;
1876 req->CDB.CDB32[1] = (req->CDB.CDB32[1] & 0x1F) |
1877 0x20;
1878 } else {
1879 eedp_flags |=
1880 MPI2_SCSIIO_EEDPFLAGS_INC_PRI_APPTAG;
1881 req->EEDPFlags = htole16(eedp_flags);
1882 req->CDB.CDB32[10] = (req->CDB.CDB32[10] &
1883 0x1F) | 0x20;
1884 }
1885 }
1886 }
1887
1888 cm->cm_length = csio->dxfer_len;
1889 if (cm->cm_length != 0) {
1890 cm->cm_data = ccb;
1891 cm->cm_flags |= MPS_CM_FLAGS_USE_CCB;
1892 } else {
1893 cm->cm_data = NULL;
1894 }
1895 cm->cm_sge = &req->SGL;
1896 cm->cm_sglsize = (32 - 24) * 4;
1897 cm->cm_desc.SCSIIO.RequestFlags = MPI2_REQ_DESCRIPT_FLAGS_SCSI_IO;
1898 cm->cm_desc.SCSIIO.DevHandle = htole16(targ->handle);
1899 cm->cm_complete = mpssas_scsiio_complete;
1900 cm->cm_complete_data = ccb;
1901 cm->cm_targ = targ;
1902 cm->cm_lun = csio->ccb_h.target_lun;
1903 cm->cm_ccb = ccb;
1904
1905 /*
1906 * If HBA is a WD and the command is not for a retry, try to build a
1907 * direct I/O message. If failed, or the command is for a retry, send
1908 * the I/O to the IR volume itself.
1909 */
1910 if (sc->WD_valid_config) {
1911 if (ccb->ccb_h.sim_priv.entries[0].field == MPS_WD_RETRY) {
1912 mpssas_direct_drive_io(sassc, cm, ccb);
1913 } else {
1914 mpssas_set_ccbstatus(ccb, CAM_REQ_INPROG);
1915 }
1916 }
1917
1918 #if defined(BUF_TRACKING) || defined(FULL_BUF_TRACKING)
1919 if (csio->bio != NULL)
1920 biotrack(csio->bio, __func__);
1921 #endif
1922 csio->ccb_h.qos.sim_data = sbinuptime();
1923 callout_reset_sbt(&cm->cm_callout, SBT_1MS * ccb->ccb_h.timeout, 0,
1924 mpssas_scsiio_timeout, cm, 0);
1925
1926 targ->issued++;
1927 targ->outstanding++;
1928 TAILQ_INSERT_TAIL(&targ->commands, cm, cm_link);
1929 ccb->ccb_h.status |= CAM_SIM_QUEUED;
1930
1931 mpssas_log_command(cm, MPS_XINFO, "%s cm %p ccb %p outstanding %u\n",
1932 __func__, cm, ccb, targ->outstanding);
1933
1934 mps_map_command(sc, cm);
1935 return;
1936 }
1937
1938 /**
1939 * mps_sc_failed_io_info - translated non-succesfull SCSI_IO request
1940 */
1941 static void
mps_sc_failed_io_info(struct mps_softc * sc,struct ccb_scsiio * csio,Mpi2SCSIIOReply_t * mpi_reply)1942 mps_sc_failed_io_info(struct mps_softc *sc, struct ccb_scsiio *csio,
1943 Mpi2SCSIIOReply_t *mpi_reply)
1944 {
1945 u32 response_info;
1946 u8 *response_bytes;
1947 u16 ioc_status = le16toh(mpi_reply->IOCStatus) &
1948 MPI2_IOCSTATUS_MASK;
1949 u8 scsi_state = mpi_reply->SCSIState;
1950 u8 scsi_status = mpi_reply->SCSIStatus;
1951 u32 log_info = le32toh(mpi_reply->IOCLogInfo);
1952 const char *desc_ioc_state, *desc_scsi_status;
1953
1954 if (log_info == 0x31170000)
1955 return;
1956
1957 desc_ioc_state = mps_describe_table(mps_iocstatus_string,
1958 ioc_status);
1959 desc_scsi_status = mps_describe_table(mps_scsi_status_string,
1960 scsi_status);
1961
1962 mps_dprint(sc, MPS_XINFO, "\thandle(0x%04x), ioc_status(%s)(0x%04x)\n",
1963 le16toh(mpi_reply->DevHandle), desc_ioc_state, ioc_status);
1964
1965 /*
1966 *We can add more detail about underflow data here
1967 * TO-DO
1968 */
1969 mps_dprint(sc, MPS_XINFO, "\tscsi_status(%s)(0x%02x), "
1970 "scsi_state %b\n", desc_scsi_status, scsi_status,
1971 scsi_state, "\20" "\1AutosenseValid" "\2AutosenseFailed"
1972 "\3NoScsiStatus" "\4Terminated" "\5Response InfoValid");
1973
1974 if (sc->mps_debug & MPS_XINFO &&
1975 scsi_state & MPI2_SCSI_STATE_AUTOSENSE_VALID) {
1976 mps_dprint(sc, MPS_XINFO, "-> Sense Buffer Data : Start :\n");
1977 scsi_sense_print(csio);
1978 mps_dprint(sc, MPS_XINFO, "-> Sense Buffer Data : End :\n");
1979 }
1980
1981 if (scsi_state & MPI2_SCSI_STATE_RESPONSE_INFO_VALID) {
1982 response_info = le32toh(mpi_reply->ResponseInfo);
1983 response_bytes = (u8 *)&response_info;
1984 mps_dprint(sc, MPS_XINFO, "response code(0x%1x): %s\n",
1985 response_bytes[0],
1986 mps_describe_table(mps_scsi_taskmgmt_string,
1987 response_bytes[0]));
1988 }
1989 }
1990
1991 static void
mpssas_scsiio_complete(struct mps_softc * sc,struct mps_command * cm)1992 mpssas_scsiio_complete(struct mps_softc *sc, struct mps_command *cm)
1993 {
1994 MPI2_SCSI_IO_REPLY *rep;
1995 union ccb *ccb;
1996 struct ccb_scsiio *csio;
1997 struct mpssas_softc *sassc;
1998 struct scsi_vpd_supported_page_list *vpd_list = NULL;
1999 u8 *TLR_bits, TLR_on;
2000 int dir = 0, i;
2001 u16 alloc_len;
2002 struct mpssas_target *target;
2003 target_id_t target_id;
2004
2005 MPS_FUNCTRACE(sc);
2006 mps_dprint(sc, MPS_TRACE,
2007 "cm %p SMID %u ccb %p reply %p outstanding %u\n", cm,
2008 cm->cm_desc.Default.SMID, cm->cm_ccb, cm->cm_reply,
2009 cm->cm_targ->outstanding);
2010
2011 callout_stop(&cm->cm_callout);
2012 mtx_assert(&sc->mps_mtx, MA_OWNED);
2013
2014 sassc = sc->sassc;
2015 ccb = cm->cm_complete_data;
2016 csio = &ccb->csio;
2017 target_id = csio->ccb_h.target_id;
2018 rep = (MPI2_SCSI_IO_REPLY *)cm->cm_reply;
2019 /*
2020 * XXX KDM if the chain allocation fails, does it matter if we do
2021 * the sync and unload here? It is simpler to do it in every case,
2022 * assuming it doesn't cause problems.
2023 */
2024 if (cm->cm_data != NULL) {
2025 if (cm->cm_flags & MPS_CM_FLAGS_DATAIN)
2026 dir = BUS_DMASYNC_POSTREAD;
2027 else if (cm->cm_flags & MPS_CM_FLAGS_DATAOUT)
2028 dir = BUS_DMASYNC_POSTWRITE;
2029 bus_dmamap_sync(sc->buffer_dmat, cm->cm_dmamap, dir);
2030 bus_dmamap_unload(sc->buffer_dmat, cm->cm_dmamap);
2031 }
2032
2033 cm->cm_targ->completed++;
2034 cm->cm_targ->outstanding--;
2035 TAILQ_REMOVE(&cm->cm_targ->commands, cm, cm_link);
2036 ccb->ccb_h.status &= ~(CAM_STATUS_MASK | CAM_SIM_QUEUED);
2037
2038 #if defined(BUF_TRACKING) || defined(FULL_BUF_TRACKING)
2039 if (ccb->csio.bio != NULL)
2040 biotrack(ccb->csio.bio, __func__);
2041 #endif
2042
2043 if (cm->cm_flags & MPS_CM_FLAGS_ON_RECOVERY) {
2044 TAILQ_REMOVE(&cm->cm_targ->timedout_commands, cm, cm_recovery);
2045 KASSERT(cm->cm_state == MPS_CM_STATE_BUSY,
2046 ("Not busy for CM_FLAGS_TIMEDOUT: %d\n", cm->cm_state));
2047 cm->cm_flags &= ~MPS_CM_FLAGS_ON_RECOVERY;
2048 if (cm->cm_reply != NULL)
2049 mpssas_log_command(cm, MPS_RECOVERY,
2050 "completed timedout cm %p ccb %p during recovery "
2051 "ioc %x scsi %x state %x xfer %u\n",
2052 cm, cm->cm_ccb, le16toh(rep->IOCStatus),
2053 rep->SCSIStatus, rep->SCSIState,
2054 le32toh(rep->TransferCount));
2055 else
2056 mpssas_log_command(cm, MPS_RECOVERY,
2057 "completed timedout cm %p ccb %p during recovery\n",
2058 cm, cm->cm_ccb);
2059 } else if (cm->cm_targ->tm != NULL) {
2060 if (cm->cm_reply != NULL)
2061 mpssas_log_command(cm, MPS_RECOVERY,
2062 "completed cm %p ccb %p during recovery "
2063 "ioc %x scsi %x state %x xfer %u\n",
2064 cm, cm->cm_ccb, le16toh(rep->IOCStatus),
2065 rep->SCSIStatus, rep->SCSIState,
2066 le32toh(rep->TransferCount));
2067 else
2068 mpssas_log_command(cm, MPS_RECOVERY,
2069 "completed cm %p ccb %p during recovery\n",
2070 cm, cm->cm_ccb);
2071 } else if ((sc->mps_flags & MPS_FLAGS_DIAGRESET) != 0) {
2072 mpssas_log_command(cm, MPS_RECOVERY,
2073 "reset completed cm %p ccb %p\n",
2074 cm, cm->cm_ccb);
2075 }
2076
2077 if ((cm->cm_flags & MPS_CM_FLAGS_ERROR_MASK) != 0) {
2078 /*
2079 * We ran into an error after we tried to map the command,
2080 * so we're getting a callback without queueing the command
2081 * to the hardware. So we set the status here, and it will
2082 * be retained below. We'll go through the "fast path",
2083 * because there can be no reply when we haven't actually
2084 * gone out to the hardware.
2085 */
2086 mpssas_set_ccbstatus(ccb, CAM_REQUEUE_REQ);
2087
2088 /*
2089 * Currently the only error included in the mask is
2090 * MPS_CM_FLAGS_CHAIN_FAILED, which means we're out of
2091 * chain frames. We need to freeze the queue until we get
2092 * a command that completed without this error, which will
2093 * hopefully have some chain frames attached that we can
2094 * use. If we wanted to get smarter about it, we would
2095 * only unfreeze the queue in this condition when we're
2096 * sure that we're getting some chain frames back. That's
2097 * probably unnecessary.
2098 */
2099 if ((sassc->flags & MPSSAS_QUEUE_FROZEN) == 0) {
2100 xpt_freeze_simq(sassc->sim, 1);
2101 sassc->flags |= MPSSAS_QUEUE_FROZEN;
2102 mps_dprint(sc, MPS_XINFO, "Error sending command, "
2103 "freezing SIM queue\n");
2104 }
2105 }
2106
2107 /*
2108 * If this is a Start Stop Unit command and it was issued by the driver
2109 * during shutdown, decrement the refcount to account for all of the
2110 * commands that were sent. All SSU commands should be completed before
2111 * shutdown completes, meaning SSU_refcount will be 0 after SSU_started
2112 * is TRUE.
2113 */
2114 if (sc->SSU_started && (csio->cdb_io.cdb_bytes[0] == START_STOP_UNIT)) {
2115 mps_dprint(sc, MPS_INFO, "Decrementing SSU count.\n");
2116 sc->SSU_refcount--;
2117 }
2118
2119 /* Take the fast path to completion */
2120 if (cm->cm_reply == NULL) {
2121 if (mpssas_get_ccbstatus(ccb) == CAM_REQ_INPROG) {
2122 if ((sc->mps_flags & MPS_FLAGS_DIAGRESET) != 0)
2123 mpssas_set_ccbstatus(ccb, CAM_SCSI_BUS_RESET);
2124 else {
2125 mpssas_set_ccbstatus(ccb, CAM_REQ_CMP);
2126 ccb->csio.scsi_status = SCSI_STATUS_OK;
2127 }
2128 if (sassc->flags & MPSSAS_QUEUE_FROZEN) {
2129 ccb->ccb_h.status |= CAM_RELEASE_SIMQ;
2130 sassc->flags &= ~MPSSAS_QUEUE_FROZEN;
2131 mps_dprint(sc, MPS_XINFO,
2132 "Unfreezing SIM queue\n");
2133 }
2134 }
2135
2136 /*
2137 * There are two scenarios where the status won't be
2138 * CAM_REQ_CMP. The first is if MPS_CM_FLAGS_ERROR_MASK is
2139 * set, the second is in the MPS_FLAGS_DIAGRESET above.
2140 */
2141 if (mpssas_get_ccbstatus(ccb) != CAM_REQ_CMP) {
2142 /*
2143 * Freeze the dev queue so that commands are
2144 * executed in the correct order after error
2145 * recovery.
2146 */
2147 ccb->ccb_h.status |= CAM_DEV_QFRZN;
2148 xpt_freeze_devq(ccb->ccb_h.path, /*count*/ 1);
2149 }
2150 mps_free_command(sc, cm);
2151 xpt_done(ccb);
2152 return;
2153 }
2154
2155 mpssas_log_command(cm, MPS_XINFO,
2156 "ioc %x scsi %x state %x xfer %u\n",
2157 le16toh(rep->IOCStatus), rep->SCSIStatus, rep->SCSIState,
2158 le32toh(rep->TransferCount));
2159
2160 /*
2161 * If this is a Direct Drive I/O, reissue the I/O to the original IR
2162 * Volume if an error occurred (normal I/O retry). Use the original
2163 * CCB, but set a flag that this will be a retry so that it's sent to
2164 * the original volume. Free the command but reuse the CCB.
2165 */
2166 if (cm->cm_flags & MPS_CM_FLAGS_DD_IO) {
2167 mps_free_command(sc, cm);
2168 ccb->ccb_h.sim_priv.entries[0].field = MPS_WD_RETRY;
2169 mpssas_action_scsiio(sassc, ccb);
2170 return;
2171 } else
2172 ccb->ccb_h.sim_priv.entries[0].field = 0;
2173
2174 switch (le16toh(rep->IOCStatus) & MPI2_IOCSTATUS_MASK) {
2175 case MPI2_IOCSTATUS_SCSI_DATA_UNDERRUN:
2176 csio->resid = cm->cm_length - le32toh(rep->TransferCount);
2177 /* FALLTHROUGH */
2178 case MPI2_IOCSTATUS_SUCCESS:
2179 case MPI2_IOCSTATUS_SCSI_RECOVERED_ERROR:
2180
2181 if ((le16toh(rep->IOCStatus) & MPI2_IOCSTATUS_MASK) ==
2182 MPI2_IOCSTATUS_SCSI_RECOVERED_ERROR)
2183 mpssas_log_command(cm, MPS_XINFO, "recovered error\n");
2184
2185 /* Completion failed at the transport level. */
2186 if (rep->SCSIState & (MPI2_SCSI_STATE_NO_SCSI_STATUS |
2187 MPI2_SCSI_STATE_TERMINATED)) {
2188 mpssas_set_ccbstatus(ccb, CAM_REQ_CMP_ERR);
2189 break;
2190 }
2191
2192 /* In a modern packetized environment, an autosense failure
2193 * implies that there's not much else that can be done to
2194 * recover the command.
2195 */
2196 if (rep->SCSIState & MPI2_SCSI_STATE_AUTOSENSE_FAILED) {
2197 mpssas_set_ccbstatus(ccb, CAM_AUTOSENSE_FAIL);
2198 break;
2199 }
2200
2201 /*
2202 * CAM doesn't care about SAS Response Info data, but if this is
2203 * the state check if TLR should be done. If not, clear the
2204 * TLR_bits for the target.
2205 */
2206 if ((rep->SCSIState & MPI2_SCSI_STATE_RESPONSE_INFO_VALID) &&
2207 ((le32toh(rep->ResponseInfo) &
2208 MPI2_SCSI_RI_MASK_REASONCODE) ==
2209 MPS_SCSI_RI_INVALID_FRAME)) {
2210 sc->mapping_table[target_id].TLR_bits =
2211 (u8)MPI2_SCSIIO_CONTROL_NO_TLR;
2212 }
2213
2214 /*
2215 * Intentionally override the normal SCSI status reporting
2216 * for these two cases. These are likely to happen in a
2217 * multi-initiator environment, and we want to make sure that
2218 * CAM retries these commands rather than fail them.
2219 */
2220 if ((rep->SCSIStatus == MPI2_SCSI_STATUS_COMMAND_TERMINATED) ||
2221 (rep->SCSIStatus == MPI2_SCSI_STATUS_TASK_ABORTED)) {
2222 mpssas_set_ccbstatus(ccb, CAM_REQ_ABORTED);
2223 break;
2224 }
2225
2226 /* Handle normal status and sense */
2227 csio->scsi_status = rep->SCSIStatus;
2228 if (rep->SCSIStatus == MPI2_SCSI_STATUS_GOOD)
2229 mpssas_set_ccbstatus(ccb, CAM_REQ_CMP);
2230 else
2231 mpssas_set_ccbstatus(ccb, CAM_SCSI_STATUS_ERROR);
2232
2233 if (rep->SCSIState & MPI2_SCSI_STATE_AUTOSENSE_VALID) {
2234 int sense_len, returned_sense_len;
2235
2236 returned_sense_len = min(le32toh(rep->SenseCount),
2237 sizeof(struct scsi_sense_data));
2238 if (returned_sense_len < ccb->csio.sense_len)
2239 ccb->csio.sense_resid = ccb->csio.sense_len -
2240 returned_sense_len;
2241 else
2242 ccb->csio.sense_resid = 0;
2243
2244 sense_len = min(returned_sense_len,
2245 ccb->csio.sense_len - ccb->csio.sense_resid);
2246 bzero(&ccb->csio.sense_data,
2247 sizeof(ccb->csio.sense_data));
2248 bcopy(cm->cm_sense, &ccb->csio.sense_data, sense_len);
2249 ccb->ccb_h.status |= CAM_AUTOSNS_VALID;
2250 }
2251
2252 /*
2253 * Check if this is an INQUIRY command. If it's a VPD inquiry,
2254 * and it's page code 0 (Supported Page List), and there is
2255 * inquiry data, and this is for a sequential access device, and
2256 * the device is an SSP target, and TLR is supported by the
2257 * controller, turn the TLR_bits value ON if page 0x90 is
2258 * supported.
2259 */
2260 if ((csio->cdb_io.cdb_bytes[0] == INQUIRY) &&
2261 (csio->cdb_io.cdb_bytes[1] & SI_EVPD) &&
2262 (csio->cdb_io.cdb_bytes[2] == SVPD_SUPPORTED_PAGE_LIST) &&
2263 ((csio->ccb_h.flags & CAM_DATA_MASK) == CAM_DATA_VADDR) &&
2264 (csio->data_ptr != NULL) &&
2265 ((csio->data_ptr[0] & 0x1f) == T_SEQUENTIAL) &&
2266 (sc->control_TLR) &&
2267 (sc->mapping_table[target_id].device_info &
2268 MPI2_SAS_DEVICE_INFO_SSP_TARGET)) {
2269 vpd_list = (struct scsi_vpd_supported_page_list *)
2270 csio->data_ptr;
2271 TLR_bits = &sc->mapping_table[target_id].TLR_bits;
2272 *TLR_bits = (u8)MPI2_SCSIIO_CONTROL_NO_TLR;
2273 TLR_on = (u8)MPI2_SCSIIO_CONTROL_TLR_ON;
2274 alloc_len = ((u16)csio->cdb_io.cdb_bytes[3] << 8) +
2275 csio->cdb_io.cdb_bytes[4];
2276 alloc_len -= csio->resid;
2277 for (i = 0; i < MIN(vpd_list->length, alloc_len); i++) {
2278 if (vpd_list->list[i] == 0x90) {
2279 *TLR_bits = TLR_on;
2280 break;
2281 }
2282 }
2283 }
2284
2285 /*
2286 * If this is a SATA direct-access end device, mark it so that
2287 * a SCSI StartStopUnit command will be sent to it when the
2288 * driver is being shutdown.
2289 */
2290 if ((csio->cdb_io.cdb_bytes[0] == INQUIRY) &&
2291 ((csio->data_ptr[0] & 0x1f) == T_DIRECT) &&
2292 (sc->mapping_table[target_id].device_info &
2293 MPI2_SAS_DEVICE_INFO_SATA_DEVICE) &&
2294 ((sc->mapping_table[target_id].device_info &
2295 MPI2_SAS_DEVICE_INFO_MASK_DEVICE_TYPE) ==
2296 MPI2_SAS_DEVICE_INFO_END_DEVICE)) {
2297 target = &sassc->targets[target_id];
2298 target->supports_SSU = TRUE;
2299 mps_dprint(sc, MPS_XINFO, "Target %d supports SSU\n",
2300 target_id);
2301 }
2302 break;
2303 case MPI2_IOCSTATUS_SCSI_INVALID_DEVHANDLE:
2304 case MPI2_IOCSTATUS_SCSI_DEVICE_NOT_THERE:
2305 /*
2306 * If devinfo is 0 this will be a volume. In that case don't
2307 * tell CAM that the volume is not there. We want volumes to
2308 * be enumerated until they are deleted/removed, not just
2309 * failed.
2310 */
2311 if (cm->cm_targ->devinfo == 0)
2312 mpssas_set_ccbstatus(ccb, CAM_REQ_CMP);
2313 else
2314 mpssas_set_ccbstatus(ccb, CAM_DEV_NOT_THERE);
2315 break;
2316 case MPI2_IOCSTATUS_INVALID_SGL:
2317 mps_print_scsiio_cmd(sc, cm);
2318 mpssas_set_ccbstatus(ccb, CAM_UNREC_HBA_ERROR);
2319 break;
2320 case MPI2_IOCSTATUS_SCSI_TASK_TERMINATED:
2321 /*
2322 * This is one of the responses that comes back when an I/O
2323 * has been aborted. If it is because of a timeout that we
2324 * initiated, just set the status to CAM_CMD_TIMEOUT.
2325 * Otherwise set it to CAM_REQ_ABORTED. The effect on the
2326 * command is the same (it gets retried, subject to the
2327 * retry counter), the only difference is what gets printed
2328 * on the console.
2329 */
2330 if (cm->cm_flags & MPS_CM_FLAGS_TIMEDOUT)
2331 mpssas_set_ccbstatus(ccb, CAM_CMD_TIMEOUT);
2332 else
2333 mpssas_set_ccbstatus(ccb, CAM_REQ_ABORTED);
2334 break;
2335 case MPI2_IOCSTATUS_SCSI_DATA_OVERRUN:
2336 /* resid is ignored for this condition */
2337 csio->resid = 0;
2338 mpssas_set_ccbstatus(ccb, CAM_DATA_RUN_ERR);
2339 break;
2340 case MPI2_IOCSTATUS_SCSI_IOC_TERMINATED:
2341 case MPI2_IOCSTATUS_SCSI_EXT_TERMINATED:
2342 /*
2343 * These can sometimes be transient transport-related
2344 * errors, and sometimes persistent drive-related errors.
2345 * We used to retry these without decrementing the retry
2346 * count by returning CAM_REQUEUE_REQ. Unfortunately, if
2347 * we hit a persistent drive problem that returns one of
2348 * these error codes, we would retry indefinitely. So,
2349 * return CAM_REQ_CMP_ERROR so that we decrement the retry
2350 * count and avoid infinite retries. We're taking the
2351 * potential risk of flagging false failures in the event
2352 * of a topology-related error (e.g. a SAS expander problem
2353 * causes a command addressed to a drive to fail), but
2354 * avoiding getting into an infinite retry loop.
2355 */
2356 mpssas_set_ccbstatus(ccb, CAM_REQ_CMP_ERR);
2357 mps_dprint(sc, MPS_INFO,
2358 "Controller reported %s tgt %u SMID %u loginfo %x\n",
2359 mps_describe_table(mps_iocstatus_string,
2360 le16toh(rep->IOCStatus) & MPI2_IOCSTATUS_MASK),
2361 target_id, cm->cm_desc.Default.SMID,
2362 le32toh(rep->IOCLogInfo));
2363 mps_dprint(sc, MPS_XINFO,
2364 "SCSIStatus %x SCSIState %x xfercount %u\n",
2365 rep->SCSIStatus, rep->SCSIState,
2366 le32toh(rep->TransferCount));
2367 break;
2368 case MPI2_IOCSTATUS_INVALID_FUNCTION:
2369 case MPI2_IOCSTATUS_INTERNAL_ERROR:
2370 case MPI2_IOCSTATUS_INVALID_VPID:
2371 case MPI2_IOCSTATUS_INVALID_FIELD:
2372 case MPI2_IOCSTATUS_INVALID_STATE:
2373 case MPI2_IOCSTATUS_OP_STATE_NOT_SUPPORTED:
2374 case MPI2_IOCSTATUS_SCSI_IO_DATA_ERROR:
2375 case MPI2_IOCSTATUS_SCSI_PROTOCOL_ERROR:
2376 case MPI2_IOCSTATUS_SCSI_RESIDUAL_MISMATCH:
2377 case MPI2_IOCSTATUS_SCSI_TASK_MGMT_FAILED:
2378 default:
2379 mpssas_log_command(cm, MPS_XINFO,
2380 "completed ioc %x loginfo %x scsi %x state %x xfer %u\n",
2381 le16toh(rep->IOCStatus), le32toh(rep->IOCLogInfo),
2382 rep->SCSIStatus, rep->SCSIState,
2383 le32toh(rep->TransferCount));
2384 csio->resid = cm->cm_length;
2385 mpssas_set_ccbstatus(ccb, CAM_REQ_CMP_ERR);
2386 break;
2387 }
2388
2389 mps_sc_failed_io_info(sc,csio,rep);
2390
2391 if (sassc->flags & MPSSAS_QUEUE_FROZEN) {
2392 ccb->ccb_h.status |= CAM_RELEASE_SIMQ;
2393 sassc->flags &= ~MPSSAS_QUEUE_FROZEN;
2394 mps_dprint(sc, MPS_XINFO, "Command completed, "
2395 "unfreezing SIM queue\n");
2396 }
2397
2398 if (mpssas_get_ccbstatus(ccb) != CAM_REQ_CMP) {
2399 ccb->ccb_h.status |= CAM_DEV_QFRZN;
2400 xpt_freeze_devq(ccb->ccb_h.path, /*count*/ 1);
2401 }
2402
2403 mps_free_command(sc, cm);
2404 xpt_done(ccb);
2405 }
2406
2407 /* All Request reached here are Endian safe */
2408 static void
mpssas_direct_drive_io(struct mpssas_softc * sassc,struct mps_command * cm,union ccb * ccb)2409 mpssas_direct_drive_io(struct mpssas_softc *sassc, struct mps_command *cm,
2410 union ccb *ccb) {
2411 pMpi2SCSIIORequest_t pIO_req;
2412 struct mps_softc *sc = sassc->sc;
2413 uint64_t virtLBA;
2414 uint32_t physLBA, stripe_offset, stripe_unit;
2415 uint32_t io_size, column;
2416 uint8_t *ptrLBA, lba_idx, physLBA_byte, *CDB;
2417
2418 /*
2419 * If this is a valid SCSI command (Read6, Read10, Read16, Write6,
2420 * Write10, or Write16), build a direct I/O message. Otherwise, the I/O
2421 * will be sent to the IR volume itself. Since Read6 and Write6 are a
2422 * bit different than the 10/16 CDBs, handle them separately.
2423 */
2424 pIO_req = (pMpi2SCSIIORequest_t)cm->cm_req;
2425 CDB = pIO_req->CDB.CDB32;
2426
2427 /*
2428 * Handle 6 byte CDBs.
2429 */
2430 if ((pIO_req->DevHandle == sc->DD_dev_handle) && ((CDB[0] == READ_6) ||
2431 (CDB[0] == WRITE_6))) {
2432 /*
2433 * Get the transfer size in blocks.
2434 */
2435 io_size = (cm->cm_length >> sc->DD_block_exponent);
2436
2437 /*
2438 * Get virtual LBA given in the CDB.
2439 */
2440 virtLBA = ((uint64_t)(CDB[1] & 0x1F) << 16) |
2441 ((uint64_t)CDB[2] << 8) | (uint64_t)CDB[3];
2442
2443 /*
2444 * Check that LBA range for I/O does not exceed volume's
2445 * MaxLBA.
2446 */
2447 if ((virtLBA + (uint64_t)io_size - 1) <=
2448 sc->DD_max_lba) {
2449 /*
2450 * Check if the I/O crosses a stripe boundary. If not,
2451 * translate the virtual LBA to a physical LBA and set
2452 * the DevHandle for the PhysDisk to be used. If it
2453 * does cross a boundary, do normal I/O. To get the
2454 * right DevHandle to use, get the map number for the
2455 * column, then use that map number to look up the
2456 * DevHandle of the PhysDisk.
2457 */
2458 stripe_offset = (uint32_t)virtLBA &
2459 (sc->DD_stripe_size - 1);
2460 if ((stripe_offset + io_size) <= sc->DD_stripe_size) {
2461 physLBA = (uint32_t)virtLBA >>
2462 sc->DD_stripe_exponent;
2463 stripe_unit = physLBA / sc->DD_num_phys_disks;
2464 column = physLBA % sc->DD_num_phys_disks;
2465 pIO_req->DevHandle =
2466 htole16(sc->DD_column_map[column].dev_handle);
2467 /* ???? Is this endian safe*/
2468 cm->cm_desc.SCSIIO.DevHandle =
2469 pIO_req->DevHandle;
2470
2471 physLBA = (stripe_unit <<
2472 sc->DD_stripe_exponent) + stripe_offset;
2473 ptrLBA = &pIO_req->CDB.CDB32[1];
2474 physLBA_byte = (uint8_t)(physLBA >> 16);
2475 *ptrLBA = physLBA_byte;
2476 ptrLBA = &pIO_req->CDB.CDB32[2];
2477 physLBA_byte = (uint8_t)(physLBA >> 8);
2478 *ptrLBA = physLBA_byte;
2479 ptrLBA = &pIO_req->CDB.CDB32[3];
2480 physLBA_byte = (uint8_t)physLBA;
2481 *ptrLBA = physLBA_byte;
2482
2483 /*
2484 * Set flag that Direct Drive I/O is
2485 * being done.
2486 */
2487 cm->cm_flags |= MPS_CM_FLAGS_DD_IO;
2488 }
2489 }
2490 return;
2491 }
2492
2493 /*
2494 * Handle 10, 12 or 16 byte CDBs.
2495 */
2496 if ((pIO_req->DevHandle == sc->DD_dev_handle) && ((CDB[0] == READ_10) ||
2497 (CDB[0] == WRITE_10) || (CDB[0] == READ_16) ||
2498 (CDB[0] == WRITE_16) || (CDB[0] == READ_12) ||
2499 (CDB[0] == WRITE_12))) {
2500 /*
2501 * For 16-byte CDB's, verify that the upper 4 bytes of the CDB
2502 * are 0. If not, this is accessing beyond 2TB so handle it in
2503 * the else section. 10-byte and 12-byte CDB's are OK.
2504 * FreeBSD sends very rare 12 byte READ/WRITE, but driver is
2505 * ready to accept 12byte CDB for Direct IOs.
2506 */
2507 if ((CDB[0] == READ_10 || CDB[0] == WRITE_10) ||
2508 (CDB[0] == READ_12 || CDB[0] == WRITE_12) ||
2509 !(CDB[2] | CDB[3] | CDB[4] | CDB[5])) {
2510 /*
2511 * Get the transfer size in blocks.
2512 */
2513 io_size = (cm->cm_length >> sc->DD_block_exponent);
2514
2515 /*
2516 * Get virtual LBA. Point to correct lower 4 bytes of
2517 * LBA in the CDB depending on command.
2518 */
2519 lba_idx = ((CDB[0] == READ_12) ||
2520 (CDB[0] == WRITE_12) ||
2521 (CDB[0] == READ_10) ||
2522 (CDB[0] == WRITE_10))? 2 : 6;
2523 virtLBA = ((uint64_t)CDB[lba_idx] << 24) |
2524 ((uint64_t)CDB[lba_idx + 1] << 16) |
2525 ((uint64_t)CDB[lba_idx + 2] << 8) |
2526 (uint64_t)CDB[lba_idx + 3];
2527
2528 /*
2529 * Check that LBA range for I/O does not exceed volume's
2530 * MaxLBA.
2531 */
2532 if ((virtLBA + (uint64_t)io_size - 1) <=
2533 sc->DD_max_lba) {
2534 /*
2535 * Check if the I/O crosses a stripe boundary.
2536 * If not, translate the virtual LBA to a
2537 * physical LBA and set the DevHandle for the
2538 * PhysDisk to be used. If it does cross a
2539 * boundary, do normal I/O. To get the right
2540 * DevHandle to use, get the map number for the
2541 * column, then use that map number to look up
2542 * the DevHandle of the PhysDisk.
2543 */
2544 stripe_offset = (uint32_t)virtLBA &
2545 (sc->DD_stripe_size - 1);
2546 if ((stripe_offset + io_size) <=
2547 sc->DD_stripe_size) {
2548 physLBA = (uint32_t)virtLBA >>
2549 sc->DD_stripe_exponent;
2550 stripe_unit = physLBA /
2551 sc->DD_num_phys_disks;
2552 column = physLBA %
2553 sc->DD_num_phys_disks;
2554 pIO_req->DevHandle =
2555 htole16(sc->DD_column_map[column].
2556 dev_handle);
2557 cm->cm_desc.SCSIIO.DevHandle =
2558 pIO_req->DevHandle;
2559
2560 physLBA = (stripe_unit <<
2561 sc->DD_stripe_exponent) +
2562 stripe_offset;
2563 ptrLBA =
2564 &pIO_req->CDB.CDB32[lba_idx];
2565 physLBA_byte = (uint8_t)(physLBA >> 24);
2566 *ptrLBA = physLBA_byte;
2567 ptrLBA =
2568 &pIO_req->CDB.CDB32[lba_idx + 1];
2569 physLBA_byte = (uint8_t)(physLBA >> 16);
2570 *ptrLBA = physLBA_byte;
2571 ptrLBA =
2572 &pIO_req->CDB.CDB32[lba_idx + 2];
2573 physLBA_byte = (uint8_t)(physLBA >> 8);
2574 *ptrLBA = physLBA_byte;
2575 ptrLBA =
2576 &pIO_req->CDB.CDB32[lba_idx + 3];
2577 physLBA_byte = (uint8_t)physLBA;
2578 *ptrLBA = physLBA_byte;
2579
2580 /*
2581 * Set flag that Direct Drive I/O is
2582 * being done.
2583 */
2584 cm->cm_flags |= MPS_CM_FLAGS_DD_IO;
2585 }
2586 }
2587 } else {
2588 /*
2589 * 16-byte CDB and the upper 4 bytes of the CDB are not
2590 * 0. Get the transfer size in blocks.
2591 */
2592 io_size = (cm->cm_length >> sc->DD_block_exponent);
2593
2594 /*
2595 * Get virtual LBA.
2596 */
2597 virtLBA = ((uint64_t)CDB[2] << 54) |
2598 ((uint64_t)CDB[3] << 48) |
2599 ((uint64_t)CDB[4] << 40) |
2600 ((uint64_t)CDB[5] << 32) |
2601 ((uint64_t)CDB[6] << 24) |
2602 ((uint64_t)CDB[7] << 16) |
2603 ((uint64_t)CDB[8] << 8) |
2604 (uint64_t)CDB[9];
2605
2606 /*
2607 * Check that LBA range for I/O does not exceed volume's
2608 * MaxLBA.
2609 */
2610 if ((virtLBA + (uint64_t)io_size - 1) <=
2611 sc->DD_max_lba) {
2612 /*
2613 * Check if the I/O crosses a stripe boundary.
2614 * If not, translate the virtual LBA to a
2615 * physical LBA and set the DevHandle for the
2616 * PhysDisk to be used. If it does cross a
2617 * boundary, do normal I/O. To get the right
2618 * DevHandle to use, get the map number for the
2619 * column, then use that map number to look up
2620 * the DevHandle of the PhysDisk.
2621 */
2622 stripe_offset = (uint32_t)virtLBA &
2623 (sc->DD_stripe_size - 1);
2624 if ((stripe_offset + io_size) <=
2625 sc->DD_stripe_size) {
2626 physLBA = (uint32_t)(virtLBA >>
2627 sc->DD_stripe_exponent);
2628 stripe_unit = physLBA /
2629 sc->DD_num_phys_disks;
2630 column = physLBA %
2631 sc->DD_num_phys_disks;
2632 pIO_req->DevHandle =
2633 htole16(sc->DD_column_map[column].
2634 dev_handle);
2635 cm->cm_desc.SCSIIO.DevHandle =
2636 pIO_req->DevHandle;
2637
2638 physLBA = (stripe_unit <<
2639 sc->DD_stripe_exponent) +
2640 stripe_offset;
2641
2642 /*
2643 * Set upper 4 bytes of LBA to 0. We
2644 * assume that the phys disks are less
2645 * than 2 TB's in size. Then, set the
2646 * lower 4 bytes.
2647 */
2648 pIO_req->CDB.CDB32[2] = 0;
2649 pIO_req->CDB.CDB32[3] = 0;
2650 pIO_req->CDB.CDB32[4] = 0;
2651 pIO_req->CDB.CDB32[5] = 0;
2652 ptrLBA = &pIO_req->CDB.CDB32[6];
2653 physLBA_byte = (uint8_t)(physLBA >> 24);
2654 *ptrLBA = physLBA_byte;
2655 ptrLBA = &pIO_req->CDB.CDB32[7];
2656 physLBA_byte = (uint8_t)(physLBA >> 16);
2657 *ptrLBA = physLBA_byte;
2658 ptrLBA = &pIO_req->CDB.CDB32[8];
2659 physLBA_byte = (uint8_t)(physLBA >> 8);
2660 *ptrLBA = physLBA_byte;
2661 ptrLBA = &pIO_req->CDB.CDB32[9];
2662 physLBA_byte = (uint8_t)physLBA;
2663 *ptrLBA = physLBA_byte;
2664
2665 /*
2666 * Set flag that Direct Drive I/O is
2667 * being done.
2668 */
2669 cm->cm_flags |= MPS_CM_FLAGS_DD_IO;
2670 }
2671 }
2672 }
2673 }
2674 }
2675
2676 #if __FreeBSD_version >= 900026
2677 static void
mpssas_smpio_complete(struct mps_softc * sc,struct mps_command * cm)2678 mpssas_smpio_complete(struct mps_softc *sc, struct mps_command *cm)
2679 {
2680 MPI2_SMP_PASSTHROUGH_REPLY *rpl;
2681 MPI2_SMP_PASSTHROUGH_REQUEST *req;
2682 uint64_t sasaddr;
2683 union ccb *ccb;
2684
2685 ccb = cm->cm_complete_data;
2686
2687 /*
2688 * Currently there should be no way we can hit this case. It only
2689 * happens when we have a failure to allocate chain frames, and SMP
2690 * commands require two S/G elements only. That should be handled
2691 * in the standard request size.
2692 */
2693 if ((cm->cm_flags & MPS_CM_FLAGS_ERROR_MASK) != 0) {
2694 mps_dprint(sc, MPS_ERROR,"%s: cm_flags = %#x on SMP request!\n",
2695 __func__, cm->cm_flags);
2696 mpssas_set_ccbstatus(ccb, CAM_REQ_CMP_ERR);
2697 goto bailout;
2698 }
2699
2700 rpl = (MPI2_SMP_PASSTHROUGH_REPLY *)cm->cm_reply;
2701 if (rpl == NULL) {
2702 mps_dprint(sc, MPS_ERROR, "%s: NULL cm_reply!\n", __func__);
2703 mpssas_set_ccbstatus(ccb, CAM_REQ_CMP_ERR);
2704 goto bailout;
2705 }
2706
2707 req = (MPI2_SMP_PASSTHROUGH_REQUEST *)cm->cm_req;
2708 sasaddr = le32toh(req->SASAddress.Low);
2709 sasaddr |= ((uint64_t)(le32toh(req->SASAddress.High))) << 32;
2710
2711 if ((le16toh(rpl->IOCStatus) & MPI2_IOCSTATUS_MASK) !=
2712 MPI2_IOCSTATUS_SUCCESS ||
2713 rpl->SASStatus != MPI2_SASSTATUS_SUCCESS) {
2714 mps_dprint(sc, MPS_XINFO, "%s: IOCStatus %04x SASStatus %02x\n",
2715 __func__, le16toh(rpl->IOCStatus), rpl->SASStatus);
2716 mpssas_set_ccbstatus(ccb, CAM_REQ_CMP_ERR);
2717 goto bailout;
2718 }
2719
2720 mps_dprint(sc, MPS_XINFO, "%s: SMP request to SAS address "
2721 "%#jx completed successfully\n", __func__,
2722 (uintmax_t)sasaddr);
2723
2724 if (ccb->smpio.smp_response[2] == SMP_FR_ACCEPTED)
2725 mpssas_set_ccbstatus(ccb, CAM_REQ_CMP);
2726 else
2727 mpssas_set_ccbstatus(ccb, CAM_SMP_STATUS_ERROR);
2728
2729 bailout:
2730 /*
2731 * We sync in both directions because we had DMAs in the S/G list
2732 * in both directions.
2733 */
2734 bus_dmamap_sync(sc->buffer_dmat, cm->cm_dmamap,
2735 BUS_DMASYNC_POSTREAD | BUS_DMASYNC_POSTWRITE);
2736 bus_dmamap_unload(sc->buffer_dmat, cm->cm_dmamap);
2737 mps_free_command(sc, cm);
2738 xpt_done(ccb);
2739 }
2740
2741 static void
mpssas_send_smpcmd(struct mpssas_softc * sassc,union ccb * ccb,uint64_t sasaddr)2742 mpssas_send_smpcmd(struct mpssas_softc *sassc, union ccb *ccb, uint64_t sasaddr)
2743 {
2744 struct mps_command *cm;
2745 uint8_t *request, *response;
2746 MPI2_SMP_PASSTHROUGH_REQUEST *req;
2747 struct mps_softc *sc;
2748 int error;
2749
2750 sc = sassc->sc;
2751 error = 0;
2752
2753 /*
2754 * XXX We don't yet support physical addresses here.
2755 */
2756 switch ((ccb->ccb_h.flags & CAM_DATA_MASK)) {
2757 case CAM_DATA_PADDR:
2758 case CAM_DATA_SG_PADDR:
2759 mps_dprint(sc, MPS_ERROR,
2760 "%s: physical addresses not supported\n", __func__);
2761 mpssas_set_ccbstatus(ccb, CAM_REQ_INVALID);
2762 xpt_done(ccb);
2763 return;
2764 case CAM_DATA_SG:
2765 /*
2766 * The chip does not support more than one buffer for the
2767 * request or response.
2768 */
2769 if ((ccb->smpio.smp_request_sglist_cnt > 1)
2770 || (ccb->smpio.smp_response_sglist_cnt > 1)) {
2771 mps_dprint(sc, MPS_ERROR,
2772 "%s: multiple request or response "
2773 "buffer segments not supported for SMP\n",
2774 __func__);
2775 mpssas_set_ccbstatus(ccb, CAM_REQ_INVALID);
2776 xpt_done(ccb);
2777 return;
2778 }
2779
2780 /*
2781 * The CAM_SCATTER_VALID flag was originally implemented
2782 * for the XPT_SCSI_IO CCB, which only has one data pointer.
2783 * We have two. So, just take that flag to mean that we
2784 * might have S/G lists, and look at the S/G segment count
2785 * to figure out whether that is the case for each individual
2786 * buffer.
2787 */
2788 if (ccb->smpio.smp_request_sglist_cnt != 0) {
2789 bus_dma_segment_t *req_sg;
2790
2791 req_sg = (bus_dma_segment_t *)ccb->smpio.smp_request;
2792 request = (uint8_t *)(uintptr_t)req_sg[0].ds_addr;
2793 } else
2794 request = ccb->smpio.smp_request;
2795
2796 if (ccb->smpio.smp_response_sglist_cnt != 0) {
2797 bus_dma_segment_t *rsp_sg;
2798
2799 rsp_sg = (bus_dma_segment_t *)ccb->smpio.smp_response;
2800 response = (uint8_t *)(uintptr_t)rsp_sg[0].ds_addr;
2801 } else
2802 response = ccb->smpio.smp_response;
2803 break;
2804 case CAM_DATA_VADDR:
2805 request = ccb->smpio.smp_request;
2806 response = ccb->smpio.smp_response;
2807 break;
2808 default:
2809 mpssas_set_ccbstatus(ccb, CAM_REQ_INVALID);
2810 xpt_done(ccb);
2811 return;
2812 }
2813
2814 cm = mps_alloc_command(sc);
2815 if (cm == NULL) {
2816 mps_dprint(sc, MPS_ERROR,
2817 "%s: cannot allocate command\n", __func__);
2818 mpssas_set_ccbstatus(ccb, CAM_RESRC_UNAVAIL);
2819 xpt_done(ccb);
2820 return;
2821 }
2822
2823 req = (MPI2_SMP_PASSTHROUGH_REQUEST *)cm->cm_req;
2824 bzero(req, sizeof(*req));
2825 req->Function = MPI2_FUNCTION_SMP_PASSTHROUGH;
2826
2827 /* Allow the chip to use any route to this SAS address. */
2828 req->PhysicalPort = 0xff;
2829
2830 req->RequestDataLength = htole16(ccb->smpio.smp_request_len);
2831 req->SGLFlags =
2832 MPI2_SGLFLAGS_SYSTEM_ADDRESS_SPACE | MPI2_SGLFLAGS_SGL_TYPE_MPI;
2833
2834 mps_dprint(sc, MPS_XINFO, "%s: sending SMP request to SAS "
2835 "address %#jx\n", __func__, (uintmax_t)sasaddr);
2836
2837 mpi_init_sge(cm, req, &req->SGL);
2838
2839 /*
2840 * Set up a uio to pass into mps_map_command(). This allows us to
2841 * do one map command, and one busdma call in there.
2842 */
2843 cm->cm_uio.uio_iov = cm->cm_iovec;
2844 cm->cm_uio.uio_iovcnt = 2;
2845 cm->cm_uio.uio_segflg = UIO_SYSSPACE;
2846
2847 /*
2848 * The read/write flag isn't used by busdma, but set it just in
2849 * case. This isn't exactly accurate, either, since we're going in
2850 * both directions.
2851 */
2852 cm->cm_uio.uio_rw = UIO_WRITE;
2853
2854 cm->cm_iovec[0].iov_base = request;
2855 cm->cm_iovec[0].iov_len = le16toh(req->RequestDataLength);
2856 cm->cm_iovec[1].iov_base = response;
2857 cm->cm_iovec[1].iov_len = ccb->smpio.smp_response_len;
2858
2859 cm->cm_uio.uio_resid = cm->cm_iovec[0].iov_len +
2860 cm->cm_iovec[1].iov_len;
2861
2862 /*
2863 * Trigger a warning message in mps_data_cb() for the user if we
2864 * wind up exceeding two S/G segments. The chip expects one
2865 * segment for the request and another for the response.
2866 */
2867 cm->cm_max_segs = 2;
2868
2869 cm->cm_desc.Default.RequestFlags = MPI2_REQ_DESCRIPT_FLAGS_DEFAULT_TYPE;
2870 cm->cm_complete = mpssas_smpio_complete;
2871 cm->cm_complete_data = ccb;
2872
2873 /*
2874 * Tell the mapping code that we're using a uio, and that this is
2875 * an SMP passthrough request. There is a little special-case
2876 * logic there (in mps_data_cb()) to handle the bidirectional
2877 * transfer.
2878 */
2879 cm->cm_flags |= MPS_CM_FLAGS_USE_UIO | MPS_CM_FLAGS_SMP_PASS |
2880 MPS_CM_FLAGS_DATAIN | MPS_CM_FLAGS_DATAOUT;
2881
2882 /* The chip data format is little endian. */
2883 req->SASAddress.High = htole32(sasaddr >> 32);
2884 req->SASAddress.Low = htole32(sasaddr);
2885
2886 /*
2887 * XXX Note that we don't have a timeout/abort mechanism here.
2888 * From the manual, it looks like task management requests only
2889 * work for SCSI IO and SATA passthrough requests. We may need to
2890 * have a mechanism to retry requests in the event of a chip reset
2891 * at least. Hopefully the chip will insure that any errors short
2892 * of that are relayed back to the driver.
2893 */
2894 error = mps_map_command(sc, cm);
2895 if ((error != 0) && (error != EINPROGRESS)) {
2896 mps_dprint(sc, MPS_ERROR,
2897 "%s: error %d returned from mps_map_command()\n",
2898 __func__, error);
2899 goto bailout_error;
2900 }
2901
2902 return;
2903
2904 bailout_error:
2905 mps_free_command(sc, cm);
2906 mpssas_set_ccbstatus(ccb, CAM_RESRC_UNAVAIL);
2907 xpt_done(ccb);
2908 return;
2909
2910 }
2911
2912 static void
mpssas_action_smpio(struct mpssas_softc * sassc,union ccb * ccb)2913 mpssas_action_smpio(struct mpssas_softc *sassc, union ccb *ccb)
2914 {
2915 struct mps_softc *sc;
2916 struct mpssas_target *targ;
2917 uint64_t sasaddr = 0;
2918
2919 sc = sassc->sc;
2920
2921 /*
2922 * Make sure the target exists.
2923 */
2924 KASSERT(ccb->ccb_h.target_id < sassc->maxtargets,
2925 ("Target %d out of bounds in XPT_SMP_IO\n", ccb->ccb_h.target_id));
2926 targ = &sassc->targets[ccb->ccb_h.target_id];
2927 if (targ->handle == 0x0) {
2928 mps_dprint(sc, MPS_ERROR,
2929 "%s: target %d does not exist!\n", __func__,
2930 ccb->ccb_h.target_id);
2931 mpssas_set_ccbstatus(ccb, CAM_SEL_TIMEOUT);
2932 xpt_done(ccb);
2933 return;
2934 }
2935
2936 /*
2937 * If this device has an embedded SMP target, we'll talk to it
2938 * directly.
2939 * figure out what the expander's address is.
2940 */
2941 if ((targ->devinfo & MPI2_SAS_DEVICE_INFO_SMP_TARGET) != 0)
2942 sasaddr = targ->sasaddr;
2943
2944 /*
2945 * If we don't have a SAS address for the expander yet, try
2946 * grabbing it from the page 0x83 information cached in the
2947 * transport layer for this target. LSI expanders report the
2948 * expander SAS address as the port-associated SAS address in
2949 * Inquiry VPD page 0x83. Maxim expanders don't report it in page
2950 * 0x83.
2951 *
2952 * XXX KDM disable this for now, but leave it commented out so that
2953 * it is obvious that this is another possible way to get the SAS
2954 * address.
2955 *
2956 * The parent handle method below is a little more reliable, and
2957 * the other benefit is that it works for devices other than SES
2958 * devices. So you can send a SMP request to a da(4) device and it
2959 * will get routed to the expander that device is attached to.
2960 * (Assuming the da(4) device doesn't contain an SMP target...)
2961 */
2962 #if 0
2963 if (sasaddr == 0)
2964 sasaddr = xpt_path_sas_addr(ccb->ccb_h.path);
2965 #endif
2966
2967 /*
2968 * If we still don't have a SAS address for the expander, look for
2969 * the parent device of this device, which is probably the expander.
2970 */
2971 if (sasaddr == 0) {
2972 #ifdef OLD_MPS_PROBE
2973 struct mpssas_target *parent_target;
2974 #endif
2975
2976 if (targ->parent_handle == 0x0) {
2977 mps_dprint(sc, MPS_ERROR,
2978 "%s: handle %d does not have a valid "
2979 "parent handle!\n", __func__, targ->handle);
2980 mpssas_set_ccbstatus(ccb, CAM_DEV_NOT_THERE);
2981 goto bailout;
2982 }
2983 #ifdef OLD_MPS_PROBE
2984 parent_target = mpssas_find_target_by_handle(sassc, 0,
2985 targ->parent_handle);
2986
2987 if (parent_target == NULL) {
2988 mps_dprint(sc, MPS_ERROR,
2989 "%s: handle %d does not have a valid "
2990 "parent target!\n", __func__, targ->handle);
2991 mpssas_set_ccbstatus(ccb, CAM_DEV_NOT_THERE);
2992 goto bailout;
2993 }
2994
2995 if ((parent_target->devinfo &
2996 MPI2_SAS_DEVICE_INFO_SMP_TARGET) == 0) {
2997 mps_dprint(sc, MPS_ERROR,
2998 "%s: handle %d parent %d does not "
2999 "have an SMP target!\n", __func__,
3000 targ->handle, parent_target->handle);
3001 mpssas_set_ccbstatus(ccb, CAM_DEV_NOT_THERE);
3002 goto bailout;
3003
3004 }
3005
3006 sasaddr = parent_target->sasaddr;
3007 #else /* OLD_MPS_PROBE */
3008 if ((targ->parent_devinfo &
3009 MPI2_SAS_DEVICE_INFO_SMP_TARGET) == 0) {
3010 mps_dprint(sc, MPS_ERROR,
3011 "%s: handle %d parent %d does not "
3012 "have an SMP target!\n", __func__,
3013 targ->handle, targ->parent_handle);
3014 mpssas_set_ccbstatus(ccb, CAM_DEV_NOT_THERE);
3015 goto bailout;
3016
3017 }
3018 if (targ->parent_sasaddr == 0x0) {
3019 mps_dprint(sc, MPS_ERROR,
3020 "%s: handle %d parent handle %d does "
3021 "not have a valid SAS address!\n",
3022 __func__, targ->handle, targ->parent_handle);
3023 mpssas_set_ccbstatus(ccb, CAM_DEV_NOT_THERE);
3024 goto bailout;
3025 }
3026
3027 sasaddr = targ->parent_sasaddr;
3028 #endif /* OLD_MPS_PROBE */
3029
3030 }
3031
3032 if (sasaddr == 0) {
3033 mps_dprint(sc, MPS_INFO,
3034 "%s: unable to find SAS address for handle %d\n",
3035 __func__, targ->handle);
3036 mpssas_set_ccbstatus(ccb, CAM_DEV_NOT_THERE);
3037 goto bailout;
3038 }
3039 mpssas_send_smpcmd(sassc, ccb, sasaddr);
3040
3041 return;
3042
3043 bailout:
3044 xpt_done(ccb);
3045
3046 }
3047 #endif //__FreeBSD_version >= 900026
3048
3049 static void
mpssas_action_resetdev(struct mpssas_softc * sassc,union ccb * ccb)3050 mpssas_action_resetdev(struct mpssas_softc *sassc, union ccb *ccb)
3051 {
3052 MPI2_SCSI_TASK_MANAGE_REQUEST *req;
3053 struct mps_softc *sc;
3054 struct mps_command *tm;
3055 struct mpssas_target *targ;
3056
3057 MPS_FUNCTRACE(sassc->sc);
3058 mtx_assert(&sassc->sc->mps_mtx, MA_OWNED);
3059
3060 KASSERT(ccb->ccb_h.target_id < sassc->maxtargets,
3061 ("Target %d out of bounds in XPT_RESET_DEV\n",
3062 ccb->ccb_h.target_id));
3063 sc = sassc->sc;
3064 tm = mpssas_alloc_tm(sc);
3065 if (tm == NULL) {
3066 mps_dprint(sc, MPS_ERROR,
3067 "command alloc failure in mpssas_action_resetdev\n");
3068 mpssas_set_ccbstatus(ccb, CAM_RESRC_UNAVAIL);
3069 xpt_done(ccb);
3070 return;
3071 }
3072
3073 targ = &sassc->targets[ccb->ccb_h.target_id];
3074 req = (MPI2_SCSI_TASK_MANAGE_REQUEST *)tm->cm_req;
3075 req->DevHandle = htole16(targ->handle);
3076 req->TaskType = MPI2_SCSITASKMGMT_TASKTYPE_TARGET_RESET;
3077
3078 /* SAS Hard Link Reset / SATA Link Reset */
3079 req->MsgFlags = MPI2_SCSITASKMGMT_MSGFLAGS_LINK_RESET;
3080
3081 tm->cm_data = NULL;
3082 tm->cm_complete = mpssas_resetdev_complete;
3083 tm->cm_complete_data = ccb;
3084 tm->cm_targ = targ;
3085
3086 mpssas_prepare_for_tm(sc, tm, targ, CAM_LUN_WILDCARD);
3087 mps_map_command(sc, tm);
3088 }
3089
3090 static void
mpssas_resetdev_complete(struct mps_softc * sc,struct mps_command * tm)3091 mpssas_resetdev_complete(struct mps_softc *sc, struct mps_command *tm)
3092 {
3093 MPI2_SCSI_TASK_MANAGE_REPLY *resp;
3094 union ccb *ccb;
3095
3096 MPS_FUNCTRACE(sc);
3097 mtx_assert(&sc->mps_mtx, MA_OWNED);
3098
3099 resp = (MPI2_SCSI_TASK_MANAGE_REPLY *)tm->cm_reply;
3100 ccb = tm->cm_complete_data;
3101
3102 /*
3103 * Currently there should be no way we can hit this case. It only
3104 * happens when we have a failure to allocate chain frames, and
3105 * task management commands don't have S/G lists.
3106 */
3107 if ((tm->cm_flags & MPS_CM_FLAGS_ERROR_MASK) != 0) {
3108 MPI2_SCSI_TASK_MANAGE_REQUEST *req;
3109
3110 req = (MPI2_SCSI_TASK_MANAGE_REQUEST *)tm->cm_req;
3111
3112 mps_dprint(sc, MPS_ERROR,
3113 "%s: cm_flags = %#x for reset of handle %#04x! "
3114 "This should not happen!\n", __func__, tm->cm_flags,
3115 req->DevHandle);
3116 mpssas_set_ccbstatus(ccb, CAM_REQ_CMP_ERR);
3117 goto bailout;
3118 }
3119
3120 mps_dprint(sc, MPS_XINFO,
3121 "%s: IOCStatus = 0x%x ResponseCode = 0x%x\n", __func__,
3122 le16toh(resp->IOCStatus), le32toh(resp->ResponseCode));
3123
3124 if (le32toh(resp->ResponseCode) == MPI2_SCSITASKMGMT_RSP_TM_COMPLETE) {
3125 mpssas_set_ccbstatus(ccb, CAM_REQ_CMP);
3126 mpssas_announce_reset(sc, AC_SENT_BDR, tm->cm_targ->tid,
3127 CAM_LUN_WILDCARD);
3128 }
3129 else
3130 mpssas_set_ccbstatus(ccb, CAM_REQ_CMP_ERR);
3131
3132 bailout:
3133
3134 mpssas_free_tm(sc, tm);
3135 xpt_done(ccb);
3136 }
3137
3138 static void
mpssas_poll(struct cam_sim * sim)3139 mpssas_poll(struct cam_sim *sim)
3140 {
3141 struct mpssas_softc *sassc;
3142
3143 sassc = cam_sim_softc(sim);
3144
3145 if (sassc->sc->mps_debug & MPS_TRACE) {
3146 /* frequent debug messages during a panic just slow
3147 * everything down too much.
3148 */
3149 mps_printf(sassc->sc, "%s clearing MPS_TRACE\n", __func__);
3150 sassc->sc->mps_debug &= ~MPS_TRACE;
3151 }
3152
3153 mps_intr_locked(sassc->sc);
3154 }
3155
3156 static void
mpssas_async(void * callback_arg,uint32_t code,struct cam_path * path,void * arg)3157 mpssas_async(void *callback_arg, uint32_t code, struct cam_path *path,
3158 void *arg)
3159 {
3160 struct mps_softc *sc;
3161
3162 sc = (struct mps_softc *)callback_arg;
3163
3164 switch (code) {
3165 #if (__FreeBSD_version >= 1000006) || \
3166 ((__FreeBSD_version >= 901503) && (__FreeBSD_version < 1000000))
3167 case AC_ADVINFO_CHANGED: {
3168 struct mpssas_target *target;
3169 struct mpssas_softc *sassc;
3170 struct scsi_read_capacity_data_long rcap_buf;
3171 struct ccb_dev_advinfo cdai;
3172 struct mpssas_lun *lun;
3173 lun_id_t lunid;
3174 int found_lun;
3175 uintptr_t buftype;
3176
3177 buftype = (uintptr_t)arg;
3178
3179 found_lun = 0;
3180 sassc = sc->sassc;
3181
3182 /*
3183 * We're only interested in read capacity data changes.
3184 */
3185 if (buftype != CDAI_TYPE_RCAPLONG)
3186 break;
3187
3188 /*
3189 * We should have a handle for this, but check to make sure.
3190 */
3191 KASSERT(xpt_path_target_id(path) < sassc->maxtargets,
3192 ("Target %d out of bounds in mpssas_async\n",
3193 xpt_path_target_id(path)));
3194 target = &sassc->targets[xpt_path_target_id(path)];
3195 if (target->handle == 0)
3196 break;
3197
3198 lunid = xpt_path_lun_id(path);
3199
3200 SLIST_FOREACH(lun, &target->luns, lun_link) {
3201 if (lun->lun_id == lunid) {
3202 found_lun = 1;
3203 break;
3204 }
3205 }
3206
3207 if (found_lun == 0) {
3208 lun = malloc(sizeof(struct mpssas_lun), M_MPT2,
3209 M_NOWAIT | M_ZERO);
3210 if (lun == NULL) {
3211 mps_dprint(sc, MPS_ERROR, "Unable to alloc "
3212 "LUN for EEDP support.\n");
3213 break;
3214 }
3215 lun->lun_id = lunid;
3216 SLIST_INSERT_HEAD(&target->luns, lun, lun_link);
3217 }
3218
3219 bzero(&rcap_buf, sizeof(rcap_buf));
3220 xpt_setup_ccb(&cdai.ccb_h, path, CAM_PRIORITY_NORMAL);
3221 cdai.ccb_h.func_code = XPT_DEV_ADVINFO;
3222 cdai.ccb_h.flags = CAM_DIR_IN;
3223 cdai.buftype = CDAI_TYPE_RCAPLONG;
3224 #if (__FreeBSD_version >= 1100061) || \
3225 ((__FreeBSD_version >= 1001510) && (__FreeBSD_version < 1100000))
3226 cdai.flags = CDAI_FLAG_NONE;
3227 #else
3228 cdai.flags = 0;
3229 #endif
3230 cdai.bufsiz = sizeof(rcap_buf);
3231 cdai.buf = (uint8_t *)&rcap_buf;
3232 xpt_action((union ccb *)&cdai);
3233 if ((cdai.ccb_h.status & CAM_DEV_QFRZN) != 0)
3234 cam_release_devq(cdai.ccb_h.path,
3235 0, 0, 0, FALSE);
3236
3237 if ((mpssas_get_ccbstatus((union ccb *)&cdai) == CAM_REQ_CMP)
3238 && (rcap_buf.prot & SRC16_PROT_EN)) {
3239 switch (rcap_buf.prot & SRC16_P_TYPE) {
3240 case SRC16_PTYPE_1:
3241 case SRC16_PTYPE_3:
3242 lun->eedp_formatted = TRUE;
3243 lun->eedp_block_size =
3244 scsi_4btoul(rcap_buf.length);
3245 break;
3246 case SRC16_PTYPE_2:
3247 default:
3248 lun->eedp_formatted = FALSE;
3249 lun->eedp_block_size = 0;
3250 break;
3251 }
3252 } else {
3253 lun->eedp_formatted = FALSE;
3254 lun->eedp_block_size = 0;
3255 }
3256 break;
3257 }
3258 #else
3259 case AC_FOUND_DEVICE: {
3260 struct ccb_getdev *cgd;
3261
3262 cgd = arg;
3263 mpssas_check_eedp(sc, path, cgd);
3264 break;
3265 }
3266 #endif
3267 default:
3268 break;
3269 }
3270 }
3271
3272 #if (__FreeBSD_version < 901503) || \
3273 ((__FreeBSD_version >= 1000000) && (__FreeBSD_version < 1000006))
3274 static void
mpssas_check_eedp(struct mps_softc * sc,struct cam_path * path,struct ccb_getdev * cgd)3275 mpssas_check_eedp(struct mps_softc *sc, struct cam_path *path,
3276 struct ccb_getdev *cgd)
3277 {
3278 struct mpssas_softc *sassc = sc->sassc;
3279 struct ccb_scsiio *csio;
3280 struct scsi_read_capacity_16 *scsi_cmd;
3281 struct scsi_read_capacity_eedp *rcap_buf;
3282 path_id_t pathid;
3283 target_id_t targetid;
3284 lun_id_t lunid;
3285 union ccb *ccb;
3286 struct cam_path *local_path;
3287 struct mpssas_target *target;
3288 struct mpssas_lun *lun;
3289 uint8_t found_lun;
3290 char path_str[64];
3291
3292 sassc = sc->sassc;
3293 pathid = cam_sim_path(sassc->sim);
3294 targetid = xpt_path_target_id(path);
3295 lunid = xpt_path_lun_id(path);
3296
3297 KASSERT(targetid < sassc->maxtargets,
3298 ("Target %d out of bounds in mpssas_check_eedp\n",
3299 targetid));
3300 target = &sassc->targets[targetid];
3301 if (target->handle == 0x0)
3302 return;
3303
3304 /*
3305 * Determine if the device is EEDP capable.
3306 *
3307 * If this flag is set in the inquiry data,
3308 * the device supports protection information,
3309 * and must support the 16 byte read
3310 * capacity command, otherwise continue without
3311 * sending read cap 16
3312 */
3313 if ((cgd->inq_data.spc3_flags & SPC3_SID_PROTECT) == 0)
3314 return;
3315
3316 /*
3317 * Issue a READ CAPACITY 16 command. This info
3318 * is used to determine if the LUN is formatted
3319 * for EEDP support.
3320 */
3321 ccb = xpt_alloc_ccb_nowait();
3322 if (ccb == NULL) {
3323 mps_dprint(sc, MPS_ERROR, "Unable to alloc CCB "
3324 "for EEDP support.\n");
3325 return;
3326 }
3327
3328 if (xpt_create_path(&local_path, xpt_periph,
3329 pathid, targetid, lunid) != CAM_REQ_CMP) {
3330 mps_dprint(sc, MPS_ERROR, "Unable to create "
3331 "path for EEDP support\n");
3332 xpt_free_ccb(ccb);
3333 return;
3334 }
3335
3336 /*
3337 * If LUN is already in list, don't create a new
3338 * one.
3339 */
3340 found_lun = FALSE;
3341 SLIST_FOREACH(lun, &target->luns, lun_link) {
3342 if (lun->lun_id == lunid) {
3343 found_lun = TRUE;
3344 break;
3345 }
3346 }
3347 if (!found_lun) {
3348 lun = malloc(sizeof(struct mpssas_lun), M_MPT2,
3349 M_NOWAIT | M_ZERO);
3350 if (lun == NULL) {
3351 mps_dprint(sc, MPS_ERROR,
3352 "Unable to alloc LUN for EEDP support.\n");
3353 xpt_free_path(local_path);
3354 xpt_free_ccb(ccb);
3355 return;
3356 }
3357 lun->lun_id = lunid;
3358 SLIST_INSERT_HEAD(&target->luns, lun,
3359 lun_link);
3360 }
3361
3362 xpt_path_string(local_path, path_str, sizeof(path_str));
3363
3364 mps_dprint(sc, MPS_INFO, "Sending read cap: path %s handle %d\n",
3365 path_str, target->handle);
3366
3367 /*
3368 * Issue a READ CAPACITY 16 command for the LUN.
3369 * The mpssas_read_cap_done function will load
3370 * the read cap info into the LUN struct.
3371 */
3372 rcap_buf = malloc(sizeof(struct scsi_read_capacity_eedp),
3373 M_MPT2, M_NOWAIT | M_ZERO);
3374 if (rcap_buf == NULL) {
3375 mps_dprint(sc, MPS_FAULT,
3376 "Unable to alloc read capacity buffer for EEDP support.\n");
3377 xpt_free_path(ccb->ccb_h.path);
3378 xpt_free_ccb(ccb);
3379 return;
3380 }
3381 xpt_setup_ccb(&ccb->ccb_h, local_path, CAM_PRIORITY_XPT);
3382 csio = &ccb->csio;
3383 csio->ccb_h.func_code = XPT_SCSI_IO;
3384 csio->ccb_h.flags = CAM_DIR_IN;
3385 csio->ccb_h.retry_count = 4;
3386 csio->ccb_h.cbfcnp = mpssas_read_cap_done;
3387 csio->ccb_h.timeout = 60000;
3388 csio->data_ptr = (uint8_t *)rcap_buf;
3389 csio->dxfer_len = sizeof(struct scsi_read_capacity_eedp);
3390 csio->sense_len = MPS_SENSE_LEN;
3391 csio->cdb_len = sizeof(*scsi_cmd);
3392 csio->tag_action = MSG_SIMPLE_Q_TAG;
3393
3394 scsi_cmd = (struct scsi_read_capacity_16 *)&csio->cdb_io.cdb_bytes;
3395 bzero(scsi_cmd, sizeof(*scsi_cmd));
3396 scsi_cmd->opcode = 0x9E;
3397 scsi_cmd->service_action = SRC16_SERVICE_ACTION;
3398 ((uint8_t *)scsi_cmd)[13] = sizeof(struct scsi_read_capacity_eedp);
3399
3400 ccb->ccb_h.ppriv_ptr1 = sassc;
3401 xpt_action(ccb);
3402 }
3403
3404 static void
mpssas_read_cap_done(struct cam_periph * periph,union ccb * done_ccb)3405 mpssas_read_cap_done(struct cam_periph *periph, union ccb *done_ccb)
3406 {
3407 struct mpssas_softc *sassc;
3408 struct mpssas_target *target;
3409 struct mpssas_lun *lun;
3410 struct scsi_read_capacity_eedp *rcap_buf;
3411
3412 if (done_ccb == NULL)
3413 return;
3414
3415 /* Driver need to release devq, it Scsi command is
3416 * generated by driver internally.
3417 * Currently there is a single place where driver
3418 * calls scsi command internally. In future if driver
3419 * calls more scsi command internally, it needs to release
3420 * devq internally, since those command will not go back to
3421 * cam_periph.
3422 */
3423 if ((done_ccb->ccb_h.status & CAM_DEV_QFRZN) ) {
3424 done_ccb->ccb_h.status &= ~CAM_DEV_QFRZN;
3425 xpt_release_devq(done_ccb->ccb_h.path,
3426 /*count*/ 1, /*run_queue*/TRUE);
3427 }
3428
3429 rcap_buf = (struct scsi_read_capacity_eedp *)done_ccb->csio.data_ptr;
3430
3431 /*
3432 * Get the LUN ID for the path and look it up in the LUN list for the
3433 * target.
3434 */
3435 sassc = (struct mpssas_softc *)done_ccb->ccb_h.ppriv_ptr1;
3436 KASSERT(done_ccb->ccb_h.target_id < sassc->maxtargets,
3437 ("Target %d out of bounds in mpssas_read_cap_done\n",
3438 done_ccb->ccb_h.target_id));
3439 target = &sassc->targets[done_ccb->ccb_h.target_id];
3440 SLIST_FOREACH(lun, &target->luns, lun_link) {
3441 if (lun->lun_id != done_ccb->ccb_h.target_lun)
3442 continue;
3443
3444 /*
3445 * Got the LUN in the target's LUN list. Fill it in
3446 * with EEDP info. If the READ CAP 16 command had some
3447 * SCSI error (common if command is not supported), mark
3448 * the lun as not supporting EEDP and set the block size
3449 * to 0.
3450 */
3451 if ((mpssas_get_ccbstatus(done_ccb) != CAM_REQ_CMP)
3452 || (done_ccb->csio.scsi_status != SCSI_STATUS_OK)) {
3453 lun->eedp_formatted = FALSE;
3454 lun->eedp_block_size = 0;
3455 break;
3456 }
3457
3458 if (rcap_buf->protect & 0x01) {
3459 mps_dprint(sassc->sc, MPS_INFO, "LUN %d for "
3460 "target ID %d is formatted for EEDP "
3461 "support.\n", done_ccb->ccb_h.target_lun,
3462 done_ccb->ccb_h.target_id);
3463 lun->eedp_formatted = TRUE;
3464 lun->eedp_block_size = scsi_4btoul(rcap_buf->length);
3465 }
3466 break;
3467 }
3468
3469 // Finished with this CCB and path.
3470 free(rcap_buf, M_MPT2);
3471 xpt_free_path(done_ccb->ccb_h.path);
3472 xpt_free_ccb(done_ccb);
3473 }
3474 #endif /* (__FreeBSD_version < 901503) || \
3475 ((__FreeBSD_version >= 1000000) && (__FreeBSD_version < 1000006)) */
3476
3477 /*
3478 * Set the INRESET flag for this target so that no I/O will be sent to
3479 * the target until the reset has completed. If an I/O request does
3480 * happen, the devq will be frozen. The CCB holds the path which is
3481 * used to release the devq. The devq is released and the CCB is freed
3482 * when the TM completes.
3483 */
3484 void
mpssas_prepare_for_tm(struct mps_softc * sc,struct mps_command * tm,struct mpssas_target * target,lun_id_t lun_id)3485 mpssas_prepare_for_tm(struct mps_softc *sc, struct mps_command *tm,
3486 struct mpssas_target *target, lun_id_t lun_id)
3487 {
3488 union ccb *ccb;
3489 path_id_t path_id;
3490
3491 ccb = xpt_alloc_ccb_nowait();
3492 if (ccb) {
3493 path_id = cam_sim_path(sc->sassc->sim);
3494 if (xpt_create_path(&ccb->ccb_h.path, xpt_periph, path_id,
3495 target->tid, lun_id) != CAM_REQ_CMP) {
3496 xpt_free_ccb(ccb);
3497 } else {
3498 tm->cm_ccb = ccb;
3499 tm->cm_targ = target;
3500 target->flags |= MPSSAS_TARGET_INRESET;
3501 }
3502 }
3503 }
3504
3505 int
mpssas_startup(struct mps_softc * sc)3506 mpssas_startup(struct mps_softc *sc)
3507 {
3508
3509 /*
3510 * Send the port enable message and set the wait_for_port_enable flag.
3511 * This flag helps to keep the simq frozen until all discovery events
3512 * are processed.
3513 */
3514 sc->wait_for_port_enable = 1;
3515 mpssas_send_portenable(sc);
3516 return (0);
3517 }
3518
3519 static int
mpssas_send_portenable(struct mps_softc * sc)3520 mpssas_send_portenable(struct mps_softc *sc)
3521 {
3522 MPI2_PORT_ENABLE_REQUEST *request;
3523 struct mps_command *cm;
3524
3525 MPS_FUNCTRACE(sc);
3526
3527 if ((cm = mps_alloc_command(sc)) == NULL)
3528 return (EBUSY);
3529 request = (MPI2_PORT_ENABLE_REQUEST *)cm->cm_req;
3530 request->Function = MPI2_FUNCTION_PORT_ENABLE;
3531 request->MsgFlags = 0;
3532 request->VP_ID = 0;
3533 cm->cm_desc.Default.RequestFlags = MPI2_REQ_DESCRIPT_FLAGS_DEFAULT_TYPE;
3534 cm->cm_complete = mpssas_portenable_complete;
3535 cm->cm_data = NULL;
3536 cm->cm_sge = NULL;
3537
3538 mps_map_command(sc, cm);
3539 mps_dprint(sc, MPS_XINFO,
3540 "mps_send_portenable finished cm %p req %p complete %p\n",
3541 cm, cm->cm_req, cm->cm_complete);
3542 return (0);
3543 }
3544
3545 static void
mpssas_portenable_complete(struct mps_softc * sc,struct mps_command * cm)3546 mpssas_portenable_complete(struct mps_softc *sc, struct mps_command *cm)
3547 {
3548 MPI2_PORT_ENABLE_REPLY *reply;
3549 struct mpssas_softc *sassc;
3550
3551 MPS_FUNCTRACE(sc);
3552 sassc = sc->sassc;
3553
3554 /*
3555 * Currently there should be no way we can hit this case. It only
3556 * happens when we have a failure to allocate chain frames, and
3557 * port enable commands don't have S/G lists.
3558 */
3559 if ((cm->cm_flags & MPS_CM_FLAGS_ERROR_MASK) != 0) {
3560 mps_dprint(sc, MPS_ERROR, "%s: cm_flags = %#x for port enable! "
3561 "This should not happen!\n", __func__, cm->cm_flags);
3562 }
3563
3564 reply = (MPI2_PORT_ENABLE_REPLY *)cm->cm_reply;
3565 if (reply == NULL)
3566 mps_dprint(sc, MPS_FAULT, "Portenable NULL reply\n");
3567 else if (le16toh(reply->IOCStatus & MPI2_IOCSTATUS_MASK) !=
3568 MPI2_IOCSTATUS_SUCCESS)
3569 mps_dprint(sc, MPS_FAULT, "Portenable failed\n");
3570
3571 mps_free_command(sc, cm);
3572
3573 /*
3574 * Get WarpDrive info after discovery is complete but before the scan
3575 * starts. At this point, all devices are ready to be exposed to the
3576 * OS. If devices should be hidden instead, take them out of the
3577 * 'targets' array before the scan. The devinfo for a disk will have
3578 * some info and a volume's will be 0. Use that to remove disks.
3579 */
3580 mps_wd_config_pages(sc);
3581
3582 /*
3583 * Done waiting for port enable to complete. Decrement the refcount.
3584 * If refcount is 0, discovery is complete and a rescan of the bus can
3585 * take place. Since the simq was explicitly frozen before port
3586 * enable, it must be explicitly released here to keep the
3587 * freeze/release count in sync.
3588 */
3589 sc->wait_for_port_enable = 0;
3590 sc->port_enable_complete = 1;
3591 wakeup(&sc->port_enable_complete);
3592 mpssas_startup_decrement(sassc);
3593 }
3594
3595 int
mpssas_check_id(struct mpssas_softc * sassc,int id)3596 mpssas_check_id(struct mpssas_softc *sassc, int id)
3597 {
3598 struct mps_softc *sc = sassc->sc;
3599 char *ids;
3600 char *name;
3601
3602 ids = &sc->exclude_ids[0];
3603 while((name = strsep(&ids, ",")) != NULL) {
3604 if (name[0] == '\0')
3605 continue;
3606 if (strtol(name, NULL, 0) == (long)id)
3607 return (1);
3608 }
3609
3610 return (0);
3611 }
3612
3613 void
mpssas_realloc_targets(struct mps_softc * sc,int maxtargets)3614 mpssas_realloc_targets(struct mps_softc *sc, int maxtargets)
3615 {
3616 struct mpssas_softc *sassc;
3617 struct mpssas_lun *lun, *lun_tmp;
3618 struct mpssas_target *targ;
3619 int i;
3620
3621 sassc = sc->sassc;
3622 /*
3623 * The number of targets is based on IOC Facts, so free all of
3624 * the allocated LUNs for each target and then the target buffer
3625 * itself.
3626 */
3627 for (i=0; i< maxtargets; i++) {
3628 targ = &sassc->targets[i];
3629 SLIST_FOREACH_SAFE(lun, &targ->luns, lun_link, lun_tmp) {
3630 free(lun, M_MPT2);
3631 }
3632 }
3633 free(sassc->targets, M_MPT2);
3634
3635 sassc->targets = malloc(sizeof(struct mpssas_target) * maxtargets,
3636 M_MPT2, M_WAITOK|M_ZERO);
3637 if (!sassc->targets) {
3638 panic("%s failed to alloc targets with error %d\n",
3639 __func__, ENOMEM);
3640 }
3641 }
3642