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