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