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