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