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