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