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