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