]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - sys/dev/mps/mps_sas.c
vx(4) was removed in r347921. Remove stray reference.
[FreeBSD/FreeBSD.git] / sys / dev / mps / mps_sas.c
1 /*-
2  * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
3  *
4  * Copyright (c) 2009 Yahoo! Inc.
5  * Copyright (c) 2011-2015 LSI Corp.
6  * Copyright (c) 2013-2015 Avago Technologies
7  * All rights reserved.
8  *
9  * Redistribution and use in source and binary forms, with or without
10  * modification, are permitted provided that the following conditions
11  * are met:
12  * 1. Redistributions of source code must retain the above copyright
13  *    notice, this list of conditions and the following disclaimer.
14  * 2. Redistributions in binary form must reproduce the above copyright
15  *    notice, this list of conditions and the following disclaimer in the
16  *    documentation and/or other materials provided with the distribution.
17  *
18  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
19  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
20  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
21  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
22  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
23  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
24  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
25  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
26  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
27  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
28  * SUCH DAMAGE.
29  *
30  * Avago Technologies (LSI) MPT-Fusion Host Adapter FreeBSD
31  *
32  * $FreeBSD$
33  */
34
35 #include <sys/cdefs.h>
36 __FBSDID("$FreeBSD$");
37
38 /* Communications core for Avago Technologies (LSI) MPT2 */
39
40 /* TODO Move headers to mpsvar */
41 #include <sys/types.h>
42 #include <sys/param.h>
43 #include <sys/systm.h>
44 #include <sys/kernel.h>
45 #include <sys/selinfo.h>
46 #include <sys/module.h>
47 #include <sys/bus.h>
48 #include <sys/conf.h>
49 #include <sys/bio.h>
50 #include <sys/malloc.h>
51 #include <sys/uio.h>
52 #include <sys/sysctl.h>
53 #include <sys/endian.h>
54 #include <sys/queue.h>
55 #include <sys/kthread.h>
56 #include <sys/taskqueue.h>
57 #include <sys/sbuf.h>
58
59 #include <machine/bus.h>
60 #include <machine/resource.h>
61 #include <sys/rman.h>
62
63 #include <machine/stdarg.h>
64
65 #include <cam/cam.h>
66 #include <cam/cam_ccb.h>
67 #include <cam/cam_xpt.h>
68 #include <cam/cam_debug.h>
69 #include <cam/cam_sim.h>
70 #include <cam/cam_xpt_sim.h>
71 #include <cam/cam_xpt_periph.h>
72 #include <cam/cam_periph.h>
73 #include <cam/scsi/scsi_all.h>
74 #include <cam/scsi/scsi_message.h>
75 #if __FreeBSD_version >= 900026
76 #include <cam/scsi/smp_all.h>
77 #endif
78
79 #include <dev/mps/mpi/mpi2_type.h>
80 #include <dev/mps/mpi/mpi2.h>
81 #include <dev/mps/mpi/mpi2_ioc.h>
82 #include <dev/mps/mpi/mpi2_sas.h>
83 #include <dev/mps/mpi/mpi2_cnfg.h>
84 #include <dev/mps/mpi/mpi2_init.h>
85 #include <dev/mps/mpi/mpi2_tool.h>
86 #include <dev/mps/mps_ioctl.h>
87 #include <dev/mps/mpsvar.h>
88 #include <dev/mps/mps_table.h>
89 #include <dev/mps/mps_sas.h>
90
91 #define MPSSAS_DISCOVERY_TIMEOUT        20
92 #define MPSSAS_MAX_DISCOVERY_TIMEOUTS   10 /* 200 seconds */
93
94 /*
95  * static array to check SCSI OpCode for EEDP protection bits
96  */
97 #define PRO_R MPI2_SCSIIO_EEDPFLAGS_CHECK_REMOVE_OP
98 #define PRO_W MPI2_SCSIIO_EEDPFLAGS_INSERT_OP
99 #define PRO_V MPI2_SCSIIO_EEDPFLAGS_INSERT_OP
100 static uint8_t op_code_prot[256] = {
101         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
102         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
103         0, 0, 0, 0, 0, 0, 0, 0, PRO_R, 0, PRO_W, 0, 0, 0, PRO_W, PRO_V,
104         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
105         0, PRO_W, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
106         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
107         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
108         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
109         0, 0, 0, 0, 0, 0, 0, 0, PRO_R, 0, PRO_W, 0, 0, 0, PRO_W, PRO_V,
110         0, 0, 0, PRO_W, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
111         0, 0, 0, 0, 0, 0, 0, 0, PRO_R, 0, PRO_W, 0, 0, 0, PRO_W, PRO_V,
112         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
113         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
114         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
115         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
116         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
117 };
118
119 MALLOC_DEFINE(M_MPSSAS, "MPSSAS", "MPS SAS memory");
120
121 static void mpssas_remove_device(struct mps_softc *, struct mps_command *);
122 static void mpssas_remove_complete(struct mps_softc *, struct mps_command *);
123 static void mpssas_action(struct cam_sim *sim, union ccb *ccb);
124 static void mpssas_poll(struct cam_sim *sim);
125 static int mpssas_send_abort(struct mps_softc *sc, struct mps_command *tm,
126     struct mps_command *cm);
127 static void mpssas_scsiio_timeout(void *data);
128 static void mpssas_abort_complete(struct mps_softc *sc, struct mps_command *cm);
129 static void mpssas_direct_drive_io(struct mpssas_softc *sassc,
130     struct mps_command *cm, union ccb *ccb);
131 static void mpssas_action_scsiio(struct mpssas_softc *, union ccb *);
132 static void mpssas_scsiio_complete(struct mps_softc *, struct mps_command *);
133 static void mpssas_action_resetdev(struct mpssas_softc *, union ccb *);
134 #if __FreeBSD_version >= 900026
135 static void mpssas_smpio_complete(struct mps_softc *sc, struct mps_command *cm);
136 static void mpssas_send_smpcmd(struct mpssas_softc *sassc, union ccb *ccb,
137                                uint64_t sasaddr);
138 static void mpssas_action_smpio(struct mpssas_softc *sassc, union ccb *ccb);
139 #endif //FreeBSD_version >= 900026
140 static void mpssas_resetdev_complete(struct mps_softc *, struct mps_command *);
141 static void mpssas_async(void *callback_arg, uint32_t code,
142                          struct cam_path *path, void *arg);
143 #if (__FreeBSD_version < 901503) || \
144     ((__FreeBSD_version >= 1000000) && (__FreeBSD_version < 1000006))
145 static void mpssas_check_eedp(struct mps_softc *sc, struct cam_path *path,
146                               struct ccb_getdev *cgd);
147 static void mpssas_read_cap_done(struct cam_periph *periph, union ccb *done_ccb);
148 #endif
149 static int mpssas_send_portenable(struct mps_softc *sc);
150 static void mpssas_portenable_complete(struct mps_softc *sc,
151     struct mps_command *cm);
152
153 struct mpssas_target *
154 mpssas_find_target_by_handle(struct mpssas_softc *sassc, int start, uint16_t handle)
155 {
156         struct mpssas_target *target;
157         int i;
158
159         for (i = start; i < sassc->maxtargets; i++) {
160                 target = &sassc->targets[i];
161                 if (target->handle == handle)
162                         return (target);
163         }
164
165         return (NULL);
166 }
167
168 /* we need to freeze the simq during attach and diag reset, to avoid failing
169  * commands before device handles have been found by discovery.  Since
170  * discovery involves reading config pages and possibly sending commands,
171  * discovery actions may continue even after we receive the end of discovery
172  * event, so refcount discovery actions instead of assuming we can unfreeze
173  * the simq when we get the event.
174  */
175 void
176 mpssas_startup_increment(struct mpssas_softc *sassc)
177 {
178         MPS_FUNCTRACE(sassc->sc);
179
180         if ((sassc->flags & MPSSAS_IN_STARTUP) != 0) {
181                 if (sassc->startup_refcount++ == 0) {
182                         /* just starting, freeze the simq */
183                         mps_dprint(sassc->sc, MPS_INIT,
184                             "%s freezing simq\n", __func__);
185 #if __FreeBSD_version >= 1000039
186                         xpt_hold_boot();
187 #endif
188                         xpt_freeze_simq(sassc->sim, 1);
189                 }
190                 mps_dprint(sassc->sc, MPS_INIT, "%s refcount %u\n", __func__,
191                     sassc->startup_refcount);
192         }
193 }
194
195 void
196 mpssas_release_simq_reinit(struct mpssas_softc *sassc)
197 {
198         if (sassc->flags & MPSSAS_QUEUE_FROZEN) {
199                 sassc->flags &= ~MPSSAS_QUEUE_FROZEN;
200                 xpt_release_simq(sassc->sim, 1);
201                 mps_dprint(sassc->sc, MPS_INFO, "Unfreezing SIM queue\n");
202         }
203 }
204
205 void
206 mpssas_startup_decrement(struct mpssas_softc *sassc)
207 {
208         MPS_FUNCTRACE(sassc->sc);
209
210         if ((sassc->flags & MPSSAS_IN_STARTUP) != 0) {
211                 if (--sassc->startup_refcount == 0) {
212                         /* finished all discovery-related actions, release
213                          * the simq and rescan for the latest topology.
214                          */
215                         mps_dprint(sassc->sc, MPS_INIT,
216                             "%s releasing simq\n", __func__);
217                         sassc->flags &= ~MPSSAS_IN_STARTUP;
218                         xpt_release_simq(sassc->sim, 1);
219 #if __FreeBSD_version >= 1000039
220                         xpt_release_boot();
221 #else
222                         mpssas_rescan_target(sassc->sc, NULL);
223 #endif
224                 }
225                 mps_dprint(sassc->sc, MPS_INIT, "%s refcount %u\n", __func__,
226                     sassc->startup_refcount);
227         }
228 }
229
230 /*
231  * The firmware requires us to stop sending commands when we're doing task
232  * management.
233  * XXX The logic for serializing the device has been made lazy and moved to
234  * mpssas_prepare_for_tm().
235  */
236 struct mps_command *
237 mpssas_alloc_tm(struct mps_softc *sc)
238 {
239         MPI2_SCSI_TASK_MANAGE_REQUEST *req;
240         struct mps_command *tm;
241
242         tm = mps_alloc_high_priority_command(sc);
243         if (tm == NULL)
244                 return (NULL);
245
246         req = (MPI2_SCSI_TASK_MANAGE_REQUEST *)tm->cm_req;
247         req->Function = MPI2_FUNCTION_SCSI_TASK_MGMT;
248         return tm;
249 }
250
251 void
252 mpssas_free_tm(struct mps_softc *sc, struct mps_command *tm)
253 {
254         int target_id = 0xFFFFFFFF;
255  
256         if (tm == NULL)
257                 return;
258
259         /*
260          * For TM's the devq is frozen for the device.  Unfreeze it here and
261          * free the resources used for freezing the devq.  Must clear the
262          * INRESET flag as well or scsi I/O will not work.
263          */
264         if (tm->cm_targ != NULL) {
265                 tm->cm_targ->flags &= ~MPSSAS_TARGET_INRESET;
266                 target_id = tm->cm_targ->tid;
267         }
268         if (tm->cm_ccb) {
269                 mps_dprint(sc, MPS_INFO, "Unfreezing devq for target ID %d\n",
270                     target_id);
271                 xpt_release_devq(tm->cm_ccb->ccb_h.path, 1, TRUE);
272                 xpt_free_path(tm->cm_ccb->ccb_h.path);
273                 xpt_free_ccb(tm->cm_ccb);
274         }
275
276         mps_free_high_priority_command(sc, tm);
277 }
278
279 void
280 mpssas_rescan_target(struct mps_softc *sc, struct mpssas_target *targ)
281 {
282         struct mpssas_softc *sassc = sc->sassc;
283         path_id_t pathid;
284         target_id_t targetid;
285         union ccb *ccb;
286
287         MPS_FUNCTRACE(sc);
288         pathid = cam_sim_path(sassc->sim);
289         if (targ == NULL)
290                 targetid = CAM_TARGET_WILDCARD;
291         else
292                 targetid = targ - sassc->targets;
293
294         /*
295          * Allocate a CCB and schedule a rescan.
296          */
297         ccb = xpt_alloc_ccb_nowait();
298         if (ccb == NULL) {
299                 mps_dprint(sc, MPS_ERROR, "unable to alloc CCB for rescan\n");
300                 return;
301         }
302
303         if (xpt_create_path(&ccb->ccb_h.path, NULL, pathid,
304             targetid, CAM_LUN_WILDCARD) != CAM_REQ_CMP) {
305                 mps_dprint(sc, MPS_ERROR, "unable to create path for rescan\n");
306                 xpt_free_ccb(ccb);
307                 return;
308         }
309
310         if (targetid == CAM_TARGET_WILDCARD)
311                 ccb->ccb_h.func_code = XPT_SCAN_BUS;
312         else
313                 ccb->ccb_h.func_code = XPT_SCAN_TGT;     
314
315         mps_dprint(sc, MPS_TRACE, "%s targetid %u\n", __func__, targetid);
316         xpt_rescan(ccb);
317 }
318
319 static void
320 mpssas_log_command(struct mps_command *cm, u_int level, const char *fmt, ...)
321 {
322         struct sbuf sb;
323         va_list ap;
324         char str[192];
325         char path_str[64];
326
327         if (cm == NULL)
328                 return;
329
330         /* No need to be in here if debugging isn't enabled */
331         if ((cm->cm_sc->mps_debug & level) == 0)
332                 return;
333
334         sbuf_new(&sb, str, sizeof(str), 0);
335
336         va_start(ap, fmt);
337
338         if (cm->cm_ccb != NULL) {
339                 xpt_path_string(cm->cm_ccb->csio.ccb_h.path, path_str,
340                                 sizeof(path_str));
341                 sbuf_cat(&sb, path_str);
342                 if (cm->cm_ccb->ccb_h.func_code == XPT_SCSI_IO) {
343                         scsi_command_string(&cm->cm_ccb->csio, &sb);
344                         sbuf_printf(&sb, "length %d ",
345                                     cm->cm_ccb->csio.dxfer_len);
346                 }
347         }
348         else {
349                 sbuf_printf(&sb, "(noperiph:%s%d:%u:%u:%u): ",
350                     cam_sim_name(cm->cm_sc->sassc->sim),
351                     cam_sim_unit(cm->cm_sc->sassc->sim),
352                     cam_sim_bus(cm->cm_sc->sassc->sim),
353                     cm->cm_targ ? cm->cm_targ->tid : 0xFFFFFFFF,
354                     cm->cm_lun);
355         }
356
357         sbuf_printf(&sb, "SMID %u ", cm->cm_desc.Default.SMID);
358         sbuf_vprintf(&sb, fmt, ap);
359         sbuf_finish(&sb);
360         mps_print_field(cm->cm_sc, "%s", sbuf_data(&sb));
361
362         va_end(ap);
363 }
364
365
366 static void
367 mpssas_remove_volume(struct mps_softc *sc, struct mps_command *tm)
368 {
369         MPI2_SCSI_TASK_MANAGE_REPLY *reply;
370         struct mpssas_target *targ;
371         uint16_t handle;
372
373         MPS_FUNCTRACE(sc);
374
375         reply = (MPI2_SCSI_TASK_MANAGE_REPLY *)tm->cm_reply;
376         handle = (uint16_t)(uintptr_t)tm->cm_complete_data;
377         targ = tm->cm_targ;
378
379         if (reply == NULL) {
380                 /* XXX retry the remove after the diag reset completes? */
381                 mps_dprint(sc, MPS_FAULT,
382                     "%s NULL reply resetting device 0x%04x\n", __func__,
383                     handle);
384                 mpssas_free_tm(sc, tm);
385                 return;
386         }
387
388         if ((le16toh(reply->IOCStatus) & MPI2_IOCSTATUS_MASK) !=
389             MPI2_IOCSTATUS_SUCCESS) {
390                 mps_dprint(sc, MPS_ERROR,
391                    "IOCStatus = 0x%x while resetting device 0x%x\n",
392                    le16toh(reply->IOCStatus), handle);
393         }
394
395         mps_dprint(sc, MPS_XINFO,
396             "Reset aborted %u commands\n", reply->TerminationCount);
397         mps_free_reply(sc, tm->cm_reply_data);
398         tm->cm_reply = NULL;    /* Ensures the reply won't get re-freed */
399
400         mps_dprint(sc, MPS_XINFO,
401             "clearing target %u handle 0x%04x\n", targ->tid, handle);
402         
403         /*
404          * Don't clear target if remove fails because things will get confusing.
405          * Leave the devname and sasaddr intact so that we know to avoid reusing
406          * this target id if possible, and so we can assign the same target id
407          * to this device if it comes back in the future.
408          */
409         if ((le16toh(reply->IOCStatus) & MPI2_IOCSTATUS_MASK) ==
410             MPI2_IOCSTATUS_SUCCESS) {
411                 targ = tm->cm_targ;
412                 targ->handle = 0x0;
413                 targ->encl_handle = 0x0;
414                 targ->encl_slot = 0x0;
415                 targ->exp_dev_handle = 0x0;
416                 targ->phy_num = 0x0;
417                 targ->linkrate = 0x0;
418                 targ->devinfo = 0x0;
419                 targ->flags = 0x0;
420         }
421
422         mpssas_free_tm(sc, tm);
423 }
424
425
426 /*
427  * No Need to call "MPI2_SAS_OP_REMOVE_DEVICE" For Volume removal.
428  * Otherwise Volume Delete is same as Bare Drive Removal.
429  */
430 void
431 mpssas_prepare_volume_remove(struct mpssas_softc *sassc, uint16_t handle)
432 {
433         MPI2_SCSI_TASK_MANAGE_REQUEST *req;
434         struct mps_softc *sc;
435         struct mps_command *tm;
436         struct mpssas_target *targ = NULL;
437
438         MPS_FUNCTRACE(sassc->sc);
439         sc = sassc->sc;
440
441 #ifdef WD_SUPPORT
442         /*
443          * If this is a WD controller, determine if the disk should be exposed
444          * to the OS or not.  If disk should be exposed, return from this
445          * function without doing anything.
446          */
447         if (sc->WD_available && (sc->WD_hide_expose ==
448             MPS_WD_EXPOSE_ALWAYS)) {
449                 return;
450         }
451 #endif //WD_SUPPORT
452
453         targ = mpssas_find_target_by_handle(sassc, 0, handle);
454         if (targ == NULL) {
455                 /* FIXME: what is the action? */
456                 /* We don't know about this device? */
457                 mps_dprint(sc, MPS_ERROR,
458                    "%s %d : invalid handle 0x%x \n", __func__,__LINE__, handle);
459                 return;
460         }
461
462         targ->flags |= MPSSAS_TARGET_INREMOVAL;
463
464         tm = mpssas_alloc_tm(sc);
465         if (tm == NULL) {
466                 mps_dprint(sc, MPS_ERROR,
467                     "%s: command alloc failure\n", __func__);
468                 return;
469         }
470
471         mpssas_rescan_target(sc, targ);
472
473         req = (MPI2_SCSI_TASK_MANAGE_REQUEST *)tm->cm_req;
474         req->DevHandle = targ->handle;
475         req->TaskType = MPI2_SCSITASKMGMT_TASKTYPE_TARGET_RESET;
476
477         /* SAS Hard Link Reset / SATA Link Reset */
478         req->MsgFlags = MPI2_SCSITASKMGMT_MSGFLAGS_LINK_RESET;
479
480         tm->cm_targ = targ;
481         tm->cm_data = NULL;
482         tm->cm_complete = mpssas_remove_volume;
483         tm->cm_complete_data = (void *)(uintptr_t)handle;
484
485         mps_dprint(sc, MPS_INFO, "%s: Sending reset for target ID %d\n",
486             __func__, targ->tid);
487         mpssas_prepare_for_tm(sc, tm, targ, CAM_LUN_WILDCARD);
488
489         mps_map_command(sc, tm);
490 }
491
492 /*
493  * The MPT2 firmware performs debounce on the link to avoid transient link
494  * errors and false removals.  When it does decide that link has been lost
495  * and a device need to go away, it expects that the host will perform a
496  * target reset and then an op remove.  The reset has the side-effect of
497  * aborting any outstanding requests for the device, which is required for
498  * the op-remove to succeed.  It's not clear if the host should check for
499  * the device coming back alive after the reset.
500  */
501 void
502 mpssas_prepare_remove(struct mpssas_softc *sassc, uint16_t handle)
503 {
504         MPI2_SCSI_TASK_MANAGE_REQUEST *req;
505         struct mps_softc *sc;
506         struct mps_command *cm;
507         struct mpssas_target *targ = NULL;
508
509         MPS_FUNCTRACE(sassc->sc);
510
511         sc = sassc->sc;
512
513         targ = mpssas_find_target_by_handle(sassc, 0, handle);
514         if (targ == NULL) {
515                 /* FIXME: what is the action? */
516                 /* We don't know about this device? */
517                 mps_dprint(sc, MPS_ERROR,
518                     "%s : invalid handle 0x%x \n", __func__, handle);
519                 return;
520         }
521
522         targ->flags |= MPSSAS_TARGET_INREMOVAL;
523
524         cm = mpssas_alloc_tm(sc);
525         if (cm == NULL) {
526                 mps_dprint(sc, MPS_ERROR,
527                     "%s: command alloc failure\n", __func__);
528                 return;
529         }
530
531         mpssas_rescan_target(sc, targ);
532
533         req = (MPI2_SCSI_TASK_MANAGE_REQUEST *)cm->cm_req;
534         memset(req, 0, sizeof(*req));
535         req->DevHandle = htole16(targ->handle);
536         req->TaskType = MPI2_SCSITASKMGMT_TASKTYPE_TARGET_RESET;
537
538         /* SAS Hard Link Reset / SATA Link Reset */
539         req->MsgFlags = MPI2_SCSITASKMGMT_MSGFLAGS_LINK_RESET;
540
541         cm->cm_targ = targ;
542         cm->cm_data = NULL;
543         cm->cm_complete = mpssas_remove_device;
544         cm->cm_complete_data = (void *)(uintptr_t)handle;
545
546         mps_dprint(sc, MPS_INFO, "%s: Sending reset for target ID %d\n",
547             __func__, targ->tid);
548         mpssas_prepare_for_tm(sc, cm, targ, CAM_LUN_WILDCARD);
549
550         mps_map_command(sc, cm);
551 }
552
553 static void
554 mpssas_remove_device(struct mps_softc *sc, struct mps_command *tm)
555 {
556         MPI2_SCSI_TASK_MANAGE_REPLY *reply;
557         MPI2_SAS_IOUNIT_CONTROL_REQUEST *req;
558         struct mpssas_target *targ;
559         struct mps_command *next_cm;
560         uint16_t handle;
561
562         MPS_FUNCTRACE(sc);
563
564         reply = (MPI2_SCSI_TASK_MANAGE_REPLY *)tm->cm_reply;
565         handle = (uint16_t)(uintptr_t)tm->cm_complete_data;
566         targ = tm->cm_targ;
567
568         /*
569          * Currently there should be no way we can hit this case.  It only
570          * happens when we have a failure to allocate chain frames, and
571          * task management commands don't have S/G lists.
572          */
573         if ((tm->cm_flags & MPS_CM_FLAGS_ERROR_MASK) != 0) {
574                 mps_dprint(sc, MPS_ERROR,
575                     "%s: cm_flags = %#x for remove of handle %#04x! "
576                     "This should not happen!\n", __func__, tm->cm_flags,
577                     handle);
578         }
579
580         if (reply == NULL) {
581                 /* XXX retry the remove after the diag reset completes? */
582                 mps_dprint(sc, MPS_FAULT,
583                     "%s NULL reply resetting device 0x%04x\n", __func__,
584                     handle);
585                 mpssas_free_tm(sc, tm);
586                 return;
587         }
588
589         if ((le16toh(reply->IOCStatus) & MPI2_IOCSTATUS_MASK) !=
590             MPI2_IOCSTATUS_SUCCESS) {
591                 mps_dprint(sc, MPS_ERROR,
592                    "IOCStatus = 0x%x while resetting device 0x%x\n",
593                    le16toh(reply->IOCStatus), handle);
594         }
595
596         mps_dprint(sc, MPS_XINFO, "Reset aborted %u commands\n",
597             le32toh(reply->TerminationCount));
598         mps_free_reply(sc, tm->cm_reply_data);
599         tm->cm_reply = NULL;    /* Ensures the reply won't get re-freed */
600
601         /* Reuse the existing command */
602         req = (MPI2_SAS_IOUNIT_CONTROL_REQUEST *)tm->cm_req;
603         memset(req, 0, sizeof(*req));
604         req->Function = MPI2_FUNCTION_SAS_IO_UNIT_CONTROL;
605         req->Operation = MPI2_SAS_OP_REMOVE_DEVICE;
606         req->DevHandle = htole16(handle);
607         tm->cm_data = NULL;
608         tm->cm_desc.Default.RequestFlags = MPI2_REQ_DESCRIPT_FLAGS_DEFAULT_TYPE;
609         tm->cm_complete = mpssas_remove_complete;
610         tm->cm_complete_data = (void *)(uintptr_t)handle;
611
612         mps_map_command(sc, tm);
613
614         mps_dprint(sc, MPS_XINFO, "clearing target %u handle 0x%04x\n",
615                    targ->tid, handle);
616         TAILQ_FOREACH_SAFE(tm, &targ->commands, cm_link, next_cm) {
617                 union ccb *ccb;
618
619                 mps_dprint(sc, MPS_XINFO, "Completing missed command %p\n", tm);
620                 ccb = tm->cm_complete_data;
621                 mpssas_set_ccbstatus(ccb, CAM_DEV_NOT_THERE);
622                 mpssas_scsiio_complete(sc, tm);
623         }
624 }
625
626 static void
627 mpssas_remove_complete(struct mps_softc *sc, struct mps_command *tm)
628 {
629         MPI2_SAS_IOUNIT_CONTROL_REPLY *reply;
630         uint16_t handle;
631         struct mpssas_target *targ;
632         struct mpssas_lun *lun;
633
634         MPS_FUNCTRACE(sc);
635
636         reply = (MPI2_SAS_IOUNIT_CONTROL_REPLY *)tm->cm_reply;
637         handle = (uint16_t)(uintptr_t)tm->cm_complete_data;
638
639         /*
640          * Currently there should be no way we can hit this case.  It only
641          * happens when we have a failure to allocate chain frames, and
642          * task management commands don't have S/G lists.
643          */
644         if ((tm->cm_flags & MPS_CM_FLAGS_ERROR_MASK) != 0) {
645                 mps_dprint(sc, MPS_XINFO,
646                            "%s: cm_flags = %#x for remove of handle %#04x! "
647                            "This should not happen!\n", __func__, tm->cm_flags,
648                            handle);
649                 mpssas_free_tm(sc, tm);
650                 return;
651         }
652
653         if (reply == NULL) {
654                 /* most likely a chip reset */
655                 mps_dprint(sc, MPS_FAULT,
656                     "%s NULL reply removing device 0x%04x\n", __func__, handle);
657                 mpssas_free_tm(sc, tm);
658                 return;
659         }
660
661         mps_dprint(sc, MPS_XINFO,
662             "%s on handle 0x%04x, IOCStatus= 0x%x\n", __func__, 
663             handle, le16toh(reply->IOCStatus));
664
665         /*
666          * Don't clear target if remove fails because things will get confusing.
667          * Leave the devname and sasaddr intact so that we know to avoid reusing
668          * this target id if possible, and so we can assign the same target id
669          * to this device if it comes back in the future.
670          */
671         if ((le16toh(reply->IOCStatus) & MPI2_IOCSTATUS_MASK) ==
672             MPI2_IOCSTATUS_SUCCESS) {
673                 targ = tm->cm_targ;
674                 targ->handle = 0x0;
675                 targ->encl_handle = 0x0;
676                 targ->encl_slot = 0x0;
677                 targ->exp_dev_handle = 0x0;
678                 targ->phy_num = 0x0;
679                 targ->linkrate = 0x0;
680                 targ->devinfo = 0x0;
681                 targ->flags = 0x0;
682                 
683                 while(!SLIST_EMPTY(&targ->luns)) {
684                         lun = SLIST_FIRST(&targ->luns);
685                         SLIST_REMOVE_HEAD(&targ->luns, lun_link);
686                         free(lun, M_MPT2);
687                 }
688         }
689         
690
691         mpssas_free_tm(sc, tm);
692 }
693
694 static int
695 mpssas_register_events(struct mps_softc *sc)
696 {
697         u32 events[MPI2_EVENT_NOTIFY_EVENTMASK_WORDS];
698
699         bzero(events, 16);
700         setbit(events, MPI2_EVENT_SAS_DEVICE_STATUS_CHANGE);
701         setbit(events, MPI2_EVENT_SAS_DISCOVERY);
702         setbit(events, MPI2_EVENT_SAS_BROADCAST_PRIMITIVE);
703         setbit(events, MPI2_EVENT_SAS_INIT_DEVICE_STATUS_CHANGE);
704         setbit(events, MPI2_EVENT_SAS_INIT_TABLE_OVERFLOW);
705         setbit(events, MPI2_EVENT_SAS_TOPOLOGY_CHANGE_LIST);
706         setbit(events, MPI2_EVENT_SAS_ENCL_DEVICE_STATUS_CHANGE);
707         setbit(events, MPI2_EVENT_IR_CONFIGURATION_CHANGE_LIST);
708         setbit(events, MPI2_EVENT_IR_VOLUME);
709         setbit(events, MPI2_EVENT_IR_PHYSICAL_DISK);
710         setbit(events, MPI2_EVENT_IR_OPERATION_STATUS);
711         setbit(events, MPI2_EVENT_LOG_ENTRY_ADDED);
712
713         mps_register_events(sc, events, mpssas_evt_handler, NULL,
714             &sc->sassc->mpssas_eh);
715
716         return (0);
717 }
718
719 int
720 mps_attach_sas(struct mps_softc *sc)
721 {
722         struct mpssas_softc *sassc;
723         cam_status status;
724         int unit, error = 0, reqs;
725
726         MPS_FUNCTRACE(sc);
727         mps_dprint(sc, MPS_INIT, "%s entered\n", __func__);
728
729         sassc = malloc(sizeof(struct mpssas_softc), M_MPT2, M_WAITOK|M_ZERO);
730         if(!sassc) {
731                 mps_dprint(sc, MPS_INIT|MPS_ERROR,
732                     "Cannot allocate SAS controller memory\n");
733                 return (ENOMEM);
734         }
735
736         /*
737          * XXX MaxTargets could change during a reinit.  Since we don't
738          * resize the targets[] array during such an event, cache the value
739          * of MaxTargets here so that we don't get into trouble later.  This
740          * should move into the reinit logic.
741          */
742         sassc->maxtargets = sc->facts->MaxTargets + sc->facts->MaxVolumes;
743         sassc->targets = malloc(sizeof(struct mpssas_target) *
744             sassc->maxtargets, M_MPT2, M_WAITOK|M_ZERO);
745         if(!sassc->targets) {
746                 mps_dprint(sc, MPS_INIT|MPS_ERROR,
747                     "Cannot allocate SAS target memory\n");
748                 free(sassc, M_MPT2);
749                 return (ENOMEM);
750         }
751         sc->sassc = sassc;
752         sassc->sc = sc;
753
754         reqs = sc->num_reqs - sc->num_prireqs - 1;
755         if ((sassc->devq = cam_simq_alloc(reqs)) == NULL) {
756                 mps_dprint(sc, MPS_ERROR, "Cannot allocate SIMQ\n");
757                 error = ENOMEM;
758                 goto out;
759         }
760
761         unit = device_get_unit(sc->mps_dev);
762         sassc->sim = cam_sim_alloc(mpssas_action, mpssas_poll, "mps", sassc,
763             unit, &sc->mps_mtx, reqs, reqs, sassc->devq);
764         if (sassc->sim == NULL) {
765                 mps_dprint(sc, MPS_INIT|MPS_ERROR, "Cannot allocate SIM\n");
766                 error = EINVAL;
767                 goto out;
768         }
769
770         TAILQ_INIT(&sassc->ev_queue);
771
772         /* Initialize taskqueue for Event Handling */
773         TASK_INIT(&sassc->ev_task, 0, mpssas_firmware_event_work, sc);
774         sassc->ev_tq = taskqueue_create("mps_taskq", M_NOWAIT | M_ZERO,
775             taskqueue_thread_enqueue, &sassc->ev_tq);
776         taskqueue_start_threads(&sassc->ev_tq, 1, PRIBIO, "%s taskq", 
777             device_get_nameunit(sc->mps_dev));
778
779         mps_lock(sc);
780
781         /*
782          * XXX There should be a bus for every port on the adapter, but since
783          * we're just going to fake the topology for now, we'll pretend that
784          * everything is just a target on a single bus.
785          */
786         if ((error = xpt_bus_register(sassc->sim, sc->mps_dev, 0)) != 0) {
787                 mps_dprint(sc, MPS_INIT|MPS_ERROR,
788                     "Error %d registering SCSI bus\n", error);
789                 mps_unlock(sc);
790                 goto out;
791         }
792
793         /*
794          * Assume that discovery events will start right away.
795          *
796          * Hold off boot until discovery is complete.
797          */
798         sassc->flags |= MPSSAS_IN_STARTUP | MPSSAS_IN_DISCOVERY;
799         sc->sassc->startup_refcount = 0;
800         mpssas_startup_increment(sassc);
801
802         callout_init(&sassc->discovery_callout, 1 /*mpsafe*/);
803
804         /*
805          * Register for async events so we can determine the EEDP
806          * capabilities of devices.
807          */
808         status = xpt_create_path(&sassc->path, /*periph*/NULL,
809             cam_sim_path(sc->sassc->sim), CAM_TARGET_WILDCARD,
810             CAM_LUN_WILDCARD);
811         if (status != CAM_REQ_CMP) {
812                 mps_dprint(sc, MPS_ERROR|MPS_INIT,
813                     "Error %#x creating sim path\n", status);
814                 sassc->path = NULL;
815         } else {
816                 int event;
817
818 #if (__FreeBSD_version >= 1000006) || \
819     ((__FreeBSD_version >= 901503) && (__FreeBSD_version < 1000000))
820                 event = AC_ADVINFO_CHANGED;
821 #else
822                 event = AC_FOUND_DEVICE;
823 #endif
824                 status = xpt_register_async(event, mpssas_async, sc,
825                                             sassc->path);
826                 if (status != CAM_REQ_CMP) {
827                         mps_dprint(sc, MPS_ERROR,
828                             "Error %#x registering async handler for "
829                             "AC_ADVINFO_CHANGED events\n", status);
830                         xpt_free_path(sassc->path);
831                         sassc->path = NULL;
832                 }
833         }
834         if (status != CAM_REQ_CMP) {
835                 /*
836                  * EEDP use is the exception, not the rule.
837                  * Warn the user, but do not fail to attach.
838                  */
839                 mps_printf(sc, "EEDP capabilities disabled.\n");
840         }
841
842         mps_unlock(sc);
843
844         mpssas_register_events(sc);
845 out:
846         if (error)
847                 mps_detach_sas(sc);
848
849         mps_dprint(sc, MPS_INIT, "%s exit error= %d\n", __func__, error);
850         return (error);
851 }
852
853 int
854 mps_detach_sas(struct mps_softc *sc)
855 {
856         struct mpssas_softc *sassc;
857         struct mpssas_lun *lun, *lun_tmp;
858         struct mpssas_target *targ;
859         int i;
860
861         MPS_FUNCTRACE(sc);
862
863         if (sc->sassc == NULL)
864                 return (0);
865
866         sassc = sc->sassc;
867         mps_deregister_events(sc, sassc->mpssas_eh);
868
869         /*
870          * Drain and free the event handling taskqueue with the lock
871          * unheld so that any parallel processing tasks drain properly
872          * without deadlocking.
873          */
874         if (sassc->ev_tq != NULL)
875                 taskqueue_free(sassc->ev_tq);
876
877         /* Make sure CAM doesn't wedge if we had to bail out early. */
878         mps_lock(sc);
879
880         while (sassc->startup_refcount != 0)
881                 mpssas_startup_decrement(sassc);
882
883         /* Deregister our async handler */
884         if (sassc->path != NULL) {
885                 xpt_register_async(0, mpssas_async, sc, sassc->path);
886                 xpt_free_path(sassc->path);
887                 sassc->path = NULL;
888         }
889
890         if (sassc->flags & MPSSAS_IN_STARTUP)
891                 xpt_release_simq(sassc->sim, 1);
892
893         if (sassc->sim != NULL) {
894                 xpt_bus_deregister(cam_sim_path(sassc->sim));
895                 cam_sim_free(sassc->sim, FALSE);
896         }
897
898         mps_unlock(sc);
899
900         if (sassc->devq != NULL)
901                 cam_simq_free(sassc->devq);
902
903         for(i=0; i< sassc->maxtargets ;i++) {
904                 targ = &sassc->targets[i];
905                 SLIST_FOREACH_SAFE(lun, &targ->luns, lun_link, lun_tmp) {
906                         free(lun, M_MPT2);
907                 }
908         }
909         free(sassc->targets, M_MPT2);
910         free(sassc, M_MPT2);
911         sc->sassc = NULL;
912
913         return (0);
914 }
915
916 void
917 mpssas_discovery_end(struct mpssas_softc *sassc)
918 {
919         struct mps_softc *sc = sassc->sc;
920
921         MPS_FUNCTRACE(sc);
922
923         if (sassc->flags & MPSSAS_DISCOVERY_TIMEOUT_PENDING)
924                 callout_stop(&sassc->discovery_callout);
925
926         /*
927          * After discovery has completed, check the mapping table for any
928          * missing devices and update their missing counts. Only do this once
929          * whenever the driver is initialized so that missing counts aren't
930          * updated unnecessarily. Note that just because discovery has
931          * completed doesn't mean that events have been processed yet. The
932          * check_devices function is a callout timer that checks if ALL devices
933          * are missing. If so, it will wait a little longer for events to
934          * complete and keep resetting itself until some device in the mapping
935          * table is not missing, meaning that event processing has started.
936          */
937         if (sc->track_mapping_events) {
938                 mps_dprint(sc, MPS_XINFO | MPS_MAPPING, "Discovery has "
939                     "completed. Check for missing devices in the mapping "
940                     "table.\n");
941                 callout_reset(&sc->device_check_callout,
942                     MPS_MISSING_CHECK_DELAY * hz, mps_mapping_check_devices,
943                     sc);
944         }
945 }
946
947 static void
948 mpssas_action(struct cam_sim *sim, union ccb *ccb)
949 {
950         struct mpssas_softc *sassc;
951
952         sassc = cam_sim_softc(sim);
953
954         MPS_FUNCTRACE(sassc->sc);
955         mps_dprint(sassc->sc, MPS_TRACE, "ccb func_code 0x%x\n",
956             ccb->ccb_h.func_code);
957         mtx_assert(&sassc->sc->mps_mtx, MA_OWNED);
958
959         switch (ccb->ccb_h.func_code) {
960         case XPT_PATH_INQ:
961         {
962                 struct ccb_pathinq *cpi = &ccb->cpi;
963                 struct mps_softc *sc = sassc->sc;
964
965                 cpi->version_num = 1;
966                 cpi->hba_inquiry = PI_SDTR_ABLE|PI_TAG_ABLE|PI_WIDE_16;
967                 cpi->target_sprt = 0;
968 #if __FreeBSD_version >= 1000039
969                 cpi->hba_misc = PIM_NOBUSRESET | PIM_UNMAPPED | PIM_NOSCAN;
970 #else
971                 cpi->hba_misc = PIM_NOBUSRESET | PIM_UNMAPPED;
972 #endif
973                 cpi->hba_eng_cnt = 0;
974                 cpi->max_target = sassc->maxtargets - 1;
975                 cpi->max_lun = 255;
976
977                 /*
978                  * initiator_id is set here to an ID outside the set of valid
979                  * target IDs (including volumes).
980                  */
981                 cpi->initiator_id = sassc->maxtargets;
982                 strlcpy(cpi->sim_vid, "FreeBSD", SIM_IDLEN);
983                 strlcpy(cpi->hba_vid, "Avago Tech", HBA_IDLEN);
984                 strlcpy(cpi->dev_name, cam_sim_name(sim), DEV_IDLEN);
985                 cpi->unit_number = cam_sim_unit(sim);
986                 cpi->bus_id = cam_sim_bus(sim);
987                 cpi->base_transfer_speed = 150000;
988                 cpi->transport = XPORT_SAS;
989                 cpi->transport_version = 0;
990                 cpi->protocol = PROTO_SCSI;
991                 cpi->protocol_version = SCSI_REV_SPC;
992                 cpi->maxio = sc->maxio;
993                 mpssas_set_ccbstatus(ccb, CAM_REQ_CMP);
994                 break;
995         }
996         case XPT_GET_TRAN_SETTINGS:
997         {
998                 struct ccb_trans_settings       *cts;
999                 struct ccb_trans_settings_sas   *sas;
1000                 struct ccb_trans_settings_scsi  *scsi;
1001                 struct mpssas_target *targ;
1002
1003                 cts = &ccb->cts;
1004                 sas = &cts->xport_specific.sas;
1005                 scsi = &cts->proto_specific.scsi;
1006
1007                 KASSERT(cts->ccb_h.target_id < sassc->maxtargets,
1008                     ("Target %d out of bounds in XPT_GET_TRANS_SETTINGS\n",
1009                     cts->ccb_h.target_id));
1010                 targ = &sassc->targets[cts->ccb_h.target_id];
1011                 if (targ->handle == 0x0) {
1012                         mpssas_set_ccbstatus(ccb, CAM_DEV_NOT_THERE);
1013                         break;
1014                 }
1015
1016                 cts->protocol_version = SCSI_REV_SPC2;
1017                 cts->transport = XPORT_SAS;
1018                 cts->transport_version = 0;
1019
1020                 sas->valid = CTS_SAS_VALID_SPEED;
1021                 switch (targ->linkrate) {
1022                 case 0x08:
1023                         sas->bitrate = 150000;
1024                         break;
1025                 case 0x09:
1026                         sas->bitrate = 300000;
1027                         break;
1028                 case 0x0a:
1029                         sas->bitrate = 600000;
1030                         break;
1031                 default:
1032                         sas->valid = 0;
1033                 }
1034
1035                 cts->protocol = PROTO_SCSI;
1036                 scsi->valid = CTS_SCSI_VALID_TQ;
1037                 scsi->flags = CTS_SCSI_FLAGS_TAG_ENB;
1038
1039                 mpssas_set_ccbstatus(ccb, CAM_REQ_CMP);
1040                 break;
1041         }
1042         case XPT_CALC_GEOMETRY:
1043                 cam_calc_geometry(&ccb->ccg, /*extended*/1);
1044                 mpssas_set_ccbstatus(ccb, CAM_REQ_CMP);
1045                 break;
1046         case XPT_RESET_DEV:
1047                 mps_dprint(sassc->sc, MPS_XINFO, "mpssas_action XPT_RESET_DEV\n");
1048                 mpssas_action_resetdev(sassc, ccb);
1049                 return;
1050         case XPT_RESET_BUS:
1051         case XPT_ABORT:
1052         case XPT_TERM_IO:
1053                 mps_dprint(sassc->sc, MPS_XINFO,
1054                     "mpssas_action faking success for abort or reset\n");
1055                 mpssas_set_ccbstatus(ccb, CAM_REQ_CMP);
1056                 break;
1057         case XPT_SCSI_IO:
1058                 mpssas_action_scsiio(sassc, ccb);
1059                 return;
1060 #if __FreeBSD_version >= 900026
1061         case XPT_SMP_IO:
1062                 mpssas_action_smpio(sassc, ccb);
1063                 return;
1064 #endif
1065         default:
1066                 mpssas_set_ccbstatus(ccb, CAM_FUNC_NOTAVAIL);
1067                 break;
1068         }
1069         xpt_done(ccb);
1070
1071 }
1072
1073 static void
1074 mpssas_announce_reset(struct mps_softc *sc, uint32_t ac_code,
1075     target_id_t target_id, lun_id_t lun_id)
1076 {
1077         path_id_t path_id = cam_sim_path(sc->sassc->sim);
1078         struct cam_path *path;
1079
1080         mps_dprint(sc, MPS_XINFO, "%s code %x target %d lun %jx\n", __func__,
1081             ac_code, target_id, (uintmax_t)lun_id);
1082
1083         if (xpt_create_path(&path, NULL, 
1084                 path_id, target_id, lun_id) != CAM_REQ_CMP) {
1085                 mps_dprint(sc, MPS_ERROR, "unable to create path for reset "
1086                            "notification\n");
1087                 return;
1088         }
1089
1090         xpt_async(ac_code, path, NULL);
1091         xpt_free_path(path);
1092 }
1093
1094 static void 
1095 mpssas_complete_all_commands(struct mps_softc *sc)
1096 {
1097         struct mps_command *cm;
1098         int i;
1099         int completed;
1100
1101         MPS_FUNCTRACE(sc);
1102         mtx_assert(&sc->mps_mtx, MA_OWNED);
1103
1104         /* complete all commands with a NULL reply */
1105         for (i = 1; i < sc->num_reqs; i++) {
1106                 cm = &sc->commands[i];
1107                 if (cm->cm_state == MPS_CM_STATE_FREE)
1108                         continue;
1109
1110                 cm->cm_state = MPS_CM_STATE_BUSY;
1111                 cm->cm_reply = NULL;
1112                 completed = 0;
1113
1114                 if (cm->cm_flags & MPS_CM_FLAGS_SATA_ID_TIMEOUT) {
1115                         MPASS(cm->cm_data);
1116                         free(cm->cm_data, M_MPT2);
1117                         cm->cm_data = NULL;
1118                 }
1119
1120                 if (cm->cm_flags & MPS_CM_FLAGS_POLLED)
1121                         cm->cm_flags |= MPS_CM_FLAGS_COMPLETE;
1122
1123                 if (cm->cm_complete != NULL) {
1124                         mpssas_log_command(cm, MPS_RECOVERY,
1125                             "completing cm %p state %x ccb %p for diag reset\n",
1126                             cm, cm->cm_state, cm->cm_ccb);
1127
1128                         cm->cm_complete(sc, cm);
1129                         completed = 1;
1130                 } else if (cm->cm_flags & MPS_CM_FLAGS_WAKEUP) {
1131                         mpssas_log_command(cm, MPS_RECOVERY,
1132                             "waking up cm %p state %x ccb %p for diag reset\n", 
1133                             cm, cm->cm_state, cm->cm_ccb);
1134                         wakeup(cm);
1135                         completed = 1;
1136                 }
1137
1138                 if ((completed == 0) && (cm->cm_state != MPS_CM_STATE_FREE)) {
1139                         /* this should never happen, but if it does, log */
1140                         mpssas_log_command(cm, MPS_RECOVERY,
1141                             "cm %p state %x flags 0x%x ccb %p during diag "
1142                             "reset\n", cm, cm->cm_state, cm->cm_flags,
1143                             cm->cm_ccb);
1144                 }
1145         }
1146
1147         sc->io_cmds_active = 0;
1148 }
1149
1150 void
1151 mpssas_handle_reinit(struct mps_softc *sc)
1152 {
1153         int i;
1154
1155         /* Go back into startup mode and freeze the simq, so that CAM
1156          * doesn't send any commands until after we've rediscovered all
1157          * targets and found the proper device handles for them.
1158          *
1159          * After the reset, portenable will trigger discovery, and after all
1160          * discovery-related activities have finished, the simq will be
1161          * released.
1162          */
1163         mps_dprint(sc, MPS_INIT, "%s startup\n", __func__);
1164         sc->sassc->flags |= MPSSAS_IN_STARTUP;
1165         sc->sassc->flags |= MPSSAS_IN_DISCOVERY;
1166         mpssas_startup_increment(sc->sassc);
1167
1168         /* notify CAM of a bus reset */
1169         mpssas_announce_reset(sc, AC_BUS_RESET, CAM_TARGET_WILDCARD, 
1170             CAM_LUN_WILDCARD);
1171
1172         /* complete and cleanup after all outstanding commands */
1173         mpssas_complete_all_commands(sc);
1174
1175         mps_dprint(sc, MPS_INIT,
1176             "%s startup %u after command completion\n", __func__,
1177             sc->sassc->startup_refcount);
1178
1179         /* zero all the target handles, since they may change after the
1180          * reset, and we have to rediscover all the targets and use the new
1181          * handles.  
1182          */
1183         for (i = 0; i < sc->sassc->maxtargets; i++) {
1184                 if (sc->sassc->targets[i].outstanding != 0)
1185                         mps_dprint(sc, MPS_INIT, "target %u outstanding %u\n", 
1186                             i, sc->sassc->targets[i].outstanding);
1187                 sc->sassc->targets[i].handle = 0x0;
1188                 sc->sassc->targets[i].exp_dev_handle = 0x0;
1189                 sc->sassc->targets[i].outstanding = 0;
1190                 sc->sassc->targets[i].flags = MPSSAS_TARGET_INDIAGRESET;
1191         }
1192 }
1193
1194 static void
1195 mpssas_tm_timeout(void *data)
1196 {
1197         struct mps_command *tm = data;
1198         struct mps_softc *sc = tm->cm_sc;
1199
1200         mtx_assert(&sc->mps_mtx, MA_OWNED);
1201
1202         mpssas_log_command(tm, MPS_INFO|MPS_RECOVERY,
1203             "task mgmt %p timed out\n", tm);
1204
1205         KASSERT(tm->cm_state == MPS_CM_STATE_INQUEUE,
1206             ("command not inqueue\n"));
1207
1208         tm->cm_state = MPS_CM_STATE_BUSY;
1209         mps_reinit(sc);
1210 }
1211
1212 static void
1213 mpssas_logical_unit_reset_complete(struct mps_softc *sc, struct mps_command *tm)
1214 {
1215         MPI2_SCSI_TASK_MANAGE_REPLY *reply;
1216         MPI2_SCSI_TASK_MANAGE_REQUEST *req;
1217         unsigned int cm_count = 0;
1218         struct mps_command *cm;
1219         struct mpssas_target *targ;
1220
1221         callout_stop(&tm->cm_callout);
1222
1223         req = (MPI2_SCSI_TASK_MANAGE_REQUEST *)tm->cm_req;
1224         reply = (MPI2_SCSI_TASK_MANAGE_REPLY *)tm->cm_reply;
1225         targ = tm->cm_targ;
1226
1227         /*
1228          * Currently there should be no way we can hit this case.  It only
1229          * happens when we have a failure to allocate chain frames, and
1230          * task management commands don't have S/G lists.
1231          * XXXSL So should it be an assertion?
1232          */
1233         if ((tm->cm_flags & MPS_CM_FLAGS_ERROR_MASK) != 0) {
1234                 mps_dprint(sc, MPS_RECOVERY|MPS_ERROR,
1235                     "%s: cm_flags = %#x for LUN reset! "
1236                    "This should not happen!\n", __func__, tm->cm_flags);
1237                 mpssas_free_tm(sc, tm);
1238                 return;
1239         }
1240
1241         if (reply == NULL) {
1242                 mps_dprint(sc, MPS_RECOVERY, "NULL reset reply for tm %p\n",
1243                     tm);
1244                 if ((sc->mps_flags & MPS_FLAGS_DIAGRESET) != 0) {
1245                         /* this completion was due to a reset, just cleanup */
1246                         mps_dprint(sc, MPS_RECOVERY, "Hardware undergoing "
1247                             "reset, ignoring NULL LUN reset reply\n");
1248                         targ->tm = NULL;
1249                         mpssas_free_tm(sc, tm);
1250                 }
1251                 else {
1252                         /* we should have gotten a reply. */
1253                         mps_dprint(sc, MPS_INFO|MPS_RECOVERY, "NULL reply on "
1254                             "LUN reset attempt, resetting controller\n");
1255                         mps_reinit(sc);
1256                 }
1257                 return;
1258         }
1259
1260         mps_dprint(sc, MPS_RECOVERY,
1261             "logical unit reset status 0x%x code 0x%x count %u\n",
1262             le16toh(reply->IOCStatus), le32toh(reply->ResponseCode),
1263             le32toh(reply->TerminationCount));
1264                 
1265         /*
1266          * See if there are any outstanding commands for this LUN.
1267          * This could be made more efficient by using a per-LU data
1268          * structure of some sort.
1269          */
1270         TAILQ_FOREACH(cm, &targ->commands, cm_link) {
1271                 if (cm->cm_lun == tm->cm_lun)
1272                         cm_count++;
1273         }
1274
1275         if (cm_count == 0) {
1276                 mps_dprint(sc, MPS_RECOVERY|MPS_INFO,
1277                     "Finished recovery after LUN reset for target %u\n",
1278                     targ->tid);
1279
1280                 mpssas_announce_reset(sc, AC_SENT_BDR, targ->tid, tm->cm_lun);
1281
1282                 /*
1283                  * We've finished recovery for this logical unit.  check and
1284                  * see if some other logical unit has a timedout command
1285                  * that needs to be processed.
1286                  */
1287                 cm = TAILQ_FIRST(&targ->timedout_commands);
1288                 if (cm) {
1289                         mps_dprint(sc, MPS_INFO|MPS_RECOVERY,
1290                             "More commands to abort for target %u\n",
1291                             targ->tid);
1292                         mpssas_send_abort(sc, tm, cm);
1293                 } else {
1294                         targ->tm = NULL;
1295                         mpssas_free_tm(sc, tm);
1296                 }
1297         } else {
1298                 /*
1299                  * If we still have commands for this LUN, the reset
1300                  * effectively failed, regardless of the status reported.
1301                  * Escalate to a target reset.
1302                  */
1303                 mps_dprint(sc, MPS_INFO|MPS_RECOVERY,
1304                     "logical unit reset complete for target %u, but still "
1305                     "have %u command(s), sending target reset\n", targ->tid,
1306                     cm_count);
1307                 mpssas_send_reset(sc, tm,
1308                     MPI2_SCSITASKMGMT_TASKTYPE_TARGET_RESET);
1309         }
1310 }
1311
1312 static void
1313 mpssas_target_reset_complete(struct mps_softc *sc, struct mps_command *tm)
1314 {
1315         MPI2_SCSI_TASK_MANAGE_REPLY *reply;
1316         MPI2_SCSI_TASK_MANAGE_REQUEST *req;
1317         struct mpssas_target *targ;
1318
1319         callout_stop(&tm->cm_callout);
1320
1321         req = (MPI2_SCSI_TASK_MANAGE_REQUEST *)tm->cm_req;
1322         reply = (MPI2_SCSI_TASK_MANAGE_REPLY *)tm->cm_reply;
1323         targ = tm->cm_targ;
1324
1325         /*
1326          * Currently there should be no way we can hit this case.  It only
1327          * happens when we have a failure to allocate chain frames, and
1328          * task management commands don't have S/G lists.
1329          */
1330         if ((tm->cm_flags & MPS_CM_FLAGS_ERROR_MASK) != 0) {
1331                 mps_dprint(sc, MPS_ERROR,"%s: cm_flags = %#x for target reset! "
1332                            "This should not happen!\n", __func__, tm->cm_flags);
1333                 mpssas_free_tm(sc, tm);
1334                 return;
1335         }
1336
1337         if (reply == NULL) {
1338                 mps_dprint(sc, MPS_RECOVERY,
1339                     "NULL target reset reply for tm %pi TaskMID %u\n",
1340                     tm, le16toh(req->TaskMID));
1341                 if ((sc->mps_flags & MPS_FLAGS_DIAGRESET) != 0) {
1342                         /* this completion was due to a reset, just cleanup */
1343                         mps_dprint(sc, MPS_RECOVERY, "Hardware undergoing "
1344                             "reset, ignoring NULL target reset reply\n");
1345                         targ->tm = NULL;
1346                         mpssas_free_tm(sc, tm);
1347                 } else {
1348                         /* we should have gotten a reply. */
1349                         mps_dprint(sc, MPS_INFO|MPS_RECOVERY, "NULL reply on "
1350                             "target reset attempt, resetting controller\n");
1351                         mps_reinit(sc);
1352                 }
1353                 return;
1354         }
1355
1356         mps_dprint(sc, MPS_RECOVERY,
1357             "target reset status 0x%x code 0x%x count %u\n",
1358             le16toh(reply->IOCStatus), le32toh(reply->ResponseCode),
1359             le32toh(reply->TerminationCount));
1360
1361         if (targ->outstanding == 0) {
1362                 /* we've finished recovery for this target and all
1363                  * of its logical units.
1364                  */
1365                 mps_dprint(sc, MPS_RECOVERY|MPS_INFO,
1366                     "Finished reset recovery for target %u\n", targ->tid);
1367
1368                 mpssas_announce_reset(sc, AC_SENT_BDR, tm->cm_targ->tid,
1369                     CAM_LUN_WILDCARD);
1370
1371                 targ->tm = NULL;
1372                 mpssas_free_tm(sc, tm);
1373         } else {
1374                 /*
1375                  * After a target reset, if this target still has
1376                  * outstanding commands, the reset effectively failed,
1377                  * regardless of the status reported.  escalate.
1378                  */
1379                 mps_dprint(sc, MPS_INFO|MPS_RECOVERY,
1380                     "Target reset complete for target %u, but still have %u "
1381                     "command(s), resetting controller\n", targ->tid,
1382                     targ->outstanding);
1383                 mps_reinit(sc);
1384         }
1385 }
1386
1387 #define MPS_RESET_TIMEOUT 30
1388
1389 int
1390 mpssas_send_reset(struct mps_softc *sc, struct mps_command *tm, uint8_t type)
1391 {
1392         MPI2_SCSI_TASK_MANAGE_REQUEST *req;
1393         struct mpssas_target *target;
1394         int err;
1395
1396         target = tm->cm_targ;
1397         if (target->handle == 0) {
1398                 mps_dprint(sc, MPS_ERROR,"%s null devhandle for target_id %d\n",
1399                     __func__, target->tid);
1400                 return -1;
1401         }
1402
1403         req = (MPI2_SCSI_TASK_MANAGE_REQUEST *)tm->cm_req;
1404         req->DevHandle = htole16(target->handle);
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_complete_data = (void *)tm;
1434
1435         callout_reset(&tm->cm_callout, MPS_RESET_TIMEOUT * hz,
1436             mpssas_tm_timeout, tm);
1437
1438         err = mps_map_command(sc, tm);
1439         if (err)
1440                 mps_dprint(sc, MPS_ERROR|MPS_RECOVERY,
1441                     "error %d sending reset type %u\n",
1442                     err, type);
1443
1444         return err;
1445 }
1446
1447
1448 static void
1449 mpssas_abort_complete(struct mps_softc *sc, struct mps_command *tm)
1450 {
1451         struct mps_command *cm;
1452         MPI2_SCSI_TASK_MANAGE_REPLY *reply;
1453         MPI2_SCSI_TASK_MANAGE_REQUEST *req;
1454         struct mpssas_target *targ;
1455
1456         callout_stop(&tm->cm_callout);
1457
1458         req = (MPI2_SCSI_TASK_MANAGE_REQUEST *)tm->cm_req;
1459         reply = (MPI2_SCSI_TASK_MANAGE_REPLY *)tm->cm_reply;
1460         targ = tm->cm_targ;
1461
1462         /*
1463          * Currently there should be no way we can hit this case.  It only
1464          * happens when we have a failure to allocate chain frames, and
1465          * task management commands don't have S/G lists.
1466          */
1467         if ((tm->cm_flags & MPS_CM_FLAGS_ERROR_MASK) != 0) {
1468                 mps_dprint(sc, MPS_RECOVERY,
1469                     "cm_flags = %#x for abort %p TaskMID %u!\n", 
1470                     tm->cm_flags, tm, le16toh(req->TaskMID));
1471                 mpssas_free_tm(sc, tm);
1472                 return;
1473         }
1474
1475         if (reply == NULL) {
1476                 mps_dprint(sc, MPS_RECOVERY,
1477                     "NULL abort reply for tm %p TaskMID %u\n", 
1478                     tm, le16toh(req->TaskMID));
1479                 if ((sc->mps_flags & MPS_FLAGS_DIAGRESET) != 0) {
1480                         /* this completion was due to a reset, just cleanup */
1481                         mps_dprint(sc, MPS_RECOVERY, "Hardware undergoing "
1482                             "reset, ignoring NULL abort reply\n");
1483                         targ->tm = NULL;
1484                         mpssas_free_tm(sc, tm);
1485                 } else {
1486                         /* we should have gotten a reply. */
1487                         mps_dprint(sc, MPS_INFO|MPS_RECOVERY, "NULL reply on "
1488                             "abort attempt, resetting controller\n");
1489                         mps_reinit(sc);
1490                 }
1491                 return;
1492         }
1493
1494         mps_dprint(sc, MPS_RECOVERY,
1495             "abort TaskMID %u status 0x%x code 0x%x count %u\n",
1496             le16toh(req->TaskMID),
1497             le16toh(reply->IOCStatus), le32toh(reply->ResponseCode),
1498             le32toh(reply->TerminationCount));
1499
1500         cm = TAILQ_FIRST(&tm->cm_targ->timedout_commands);
1501         if (cm == NULL) {
1502                 /*
1503                  * If there are no more timedout commands, we're done with
1504                  * error recovery for this target.
1505                  */
1506                 mps_dprint(sc, MPS_INFO|MPS_RECOVERY,
1507                     "Finished abort recovery for target %u\n", targ->tid);
1508
1509                 targ->tm = NULL;
1510                 mpssas_free_tm(sc, tm);
1511         } else if (le16toh(req->TaskMID) != cm->cm_desc.Default.SMID) {
1512                 /* abort success, but we have more timedout commands to abort */
1513                 mps_dprint(sc, MPS_INFO|MPS_RECOVERY,
1514                     "Continuing abort recovery for target %u\n", targ->tid);
1515                 
1516                 mpssas_send_abort(sc, tm, cm);
1517         } else {
1518                 /* we didn't get a command completion, so the abort
1519                  * failed as far as we're concerned.  escalate.
1520                  */
1521                 mps_dprint(sc, MPS_RECOVERY,
1522                     "Abort failed for target %u, sending logical unit reset\n",
1523                     targ->tid);
1524
1525                 mpssas_send_reset(sc, tm, 
1526                     MPI2_SCSITASKMGMT_TASKTYPE_LOGICAL_UNIT_RESET);
1527         }
1528 }
1529
1530 #define MPS_ABORT_TIMEOUT 5
1531
1532 static int
1533 mpssas_send_abort(struct mps_softc *sc, struct mps_command *tm, struct mps_command *cm)
1534 {
1535         MPI2_SCSI_TASK_MANAGE_REQUEST *req;
1536         struct mpssas_target *targ;
1537         int err;
1538
1539         targ = cm->cm_targ;
1540         if (targ->handle == 0) {
1541                 mps_dprint(sc, MPS_ERROR|MPS_RECOVERY,
1542                     "%s null devhandle for target_id %d\n",
1543                     __func__, cm->cm_ccb->ccb_h.target_id);
1544                 return -1;
1545         }
1546
1547         mpssas_log_command(cm, MPS_RECOVERY|MPS_INFO,
1548             "Aborting command %p\n", cm);
1549
1550         req = (MPI2_SCSI_TASK_MANAGE_REQUEST *)tm->cm_req;
1551         req->DevHandle = htole16(targ->handle);
1552         req->TaskType = MPI2_SCSITASKMGMT_TASKTYPE_ABORT_TASK;
1553
1554         /* XXX Need to handle invalid LUNs */
1555         MPS_SET_LUN(req->LUN, cm->cm_ccb->ccb_h.target_lun);
1556
1557         req->TaskMID = htole16(cm->cm_desc.Default.SMID);
1558
1559         tm->cm_data = NULL;
1560         tm->cm_complete = mpssas_abort_complete;
1561         tm->cm_complete_data = (void *)tm;
1562         tm->cm_targ = cm->cm_targ;
1563         tm->cm_lun = cm->cm_lun;
1564
1565         callout_reset(&tm->cm_callout, MPS_ABORT_TIMEOUT * hz,
1566             mpssas_tm_timeout, tm);
1567
1568         targ->aborts++;
1569
1570         mpssas_prepare_for_tm(sc, tm, targ, tm->cm_lun);
1571
1572         err = mps_map_command(sc, tm);
1573         if (err)
1574                 mps_dprint(sc, MPS_ERROR|MPS_RECOVERY,
1575                     "error %d sending abort for cm %p SMID %u\n",
1576                     err, cm, req->TaskMID);
1577         return err;
1578 }
1579
1580 static void
1581 mpssas_scsiio_timeout(void *data)
1582 {
1583         sbintime_t elapsed, now;
1584         union ccb *ccb;
1585         struct mps_softc *sc;
1586         struct mps_command *cm;
1587         struct mpssas_target *targ;
1588
1589         cm = (struct mps_command *)data;
1590         sc = cm->cm_sc;
1591         ccb = cm->cm_ccb;
1592         now = sbinuptime();
1593
1594         MPS_FUNCTRACE(sc);
1595         mtx_assert(&sc->mps_mtx, MA_OWNED);
1596
1597         mps_dprint(sc, MPS_XINFO|MPS_RECOVERY, "Timeout checking cm %p\n", sc);
1598
1599         /*
1600          * Run the interrupt handler to make sure it's not pending.  This
1601          * isn't perfect because the command could have already completed
1602          * and been re-used, though this is unlikely.
1603          */
1604         mps_intr_locked(sc);
1605         if (cm->cm_flags & MPS_CM_FLAGS_ON_RECOVERY) {
1606                 mpssas_log_command(cm, MPS_XINFO,
1607                     "SCSI command %p almost timed out\n", cm);
1608                 return;
1609         }
1610
1611         if (cm->cm_ccb == NULL) {
1612                 mps_dprint(sc, MPS_ERROR, "command timeout with NULL ccb\n");
1613                 return;
1614         }
1615
1616         targ = cm->cm_targ;
1617         targ->timeouts++;
1618
1619         elapsed = now - ccb->ccb_h.qos.sim_data;
1620         mpssas_log_command(cm, MPS_INFO|MPS_RECOVERY,
1621             "Command timeout on target %u(0x%04x) %d set, %d.%d elapsed\n",
1622             targ->tid, targ->handle, ccb->ccb_h.timeout,
1623             sbintime_getsec(elapsed), elapsed & 0xffffffff);
1624
1625         /* XXX first, check the firmware state, to see if it's still
1626          * operational.  if not, do a diag reset.
1627          */
1628         mpssas_set_ccbstatus(cm->cm_ccb, CAM_CMD_TIMEOUT);
1629         cm->cm_flags |= MPS_CM_FLAGS_ON_RECOVERY | MPS_CM_FLAGS_TIMEDOUT;
1630         TAILQ_INSERT_TAIL(&targ->timedout_commands, cm, cm_recovery);
1631
1632         if (targ->tm != NULL) {
1633                 /* target already in recovery, just queue up another
1634                  * timedout command to be processed later.
1635                  */
1636                 mps_dprint(sc, MPS_RECOVERY,
1637                     "queued timedout cm %p for processing by tm %p\n",
1638                     cm, targ->tm);
1639         } else if ((targ->tm = mpssas_alloc_tm(sc)) != NULL) {
1640                 mps_dprint(sc, MPS_RECOVERY|MPS_INFO,
1641                     "Sending abort to target %u for SMID %d\n", targ->tid,
1642                     cm->cm_desc.Default.SMID);
1643                 mps_dprint(sc, MPS_RECOVERY, "timedout cm %p allocated tm %p\n",
1644                     cm, targ->tm);
1645
1646                 /* start recovery by aborting the first timedout command */
1647                 mpssas_send_abort(sc, targ->tm, cm);
1648         } else {
1649                 /* XXX queue this target up for recovery once a TM becomes
1650                  * available.  The firmware only has a limited number of
1651                  * HighPriority credits for the high priority requests used
1652                  * for task management, and we ran out.
1653                  * 
1654                  * Isilon: don't worry about this for now, since we have
1655                  * more credits than disks in an enclosure, and limit
1656                  * ourselves to one TM per target for recovery.
1657                  */
1658                 mps_dprint(sc, MPS_ERROR|MPS_RECOVERY,
1659                     "timedout cm %p failed to allocate a tm\n", cm);
1660         }
1661
1662 }
1663
1664 static void
1665 mpssas_action_scsiio(struct mpssas_softc *sassc, union ccb *ccb)
1666 {
1667         MPI2_SCSI_IO_REQUEST *req;
1668         struct ccb_scsiio *csio;
1669         struct mps_softc *sc;
1670         struct mpssas_target *targ;
1671         struct mpssas_lun *lun;
1672         struct mps_command *cm;
1673         uint8_t i, lba_byte, *ref_tag_addr;
1674         uint16_t eedp_flags;
1675         uint32_t mpi_control;
1676
1677         sc = sassc->sc;
1678         MPS_FUNCTRACE(sc);
1679         mtx_assert(&sc->mps_mtx, MA_OWNED);
1680
1681         csio = &ccb->csio;
1682         KASSERT(csio->ccb_h.target_id < sassc->maxtargets,
1683             ("Target %d out of bounds in XPT_SCSI_IO\n",
1684              csio->ccb_h.target_id));
1685         targ = &sassc->targets[csio->ccb_h.target_id];
1686         mps_dprint(sc, MPS_TRACE, "ccb %p target flag %x\n", ccb, targ->flags);
1687         if (targ->handle == 0x0) {
1688                 mps_dprint(sc, MPS_ERROR, "%s NULL handle for target %u\n", 
1689                     __func__, csio->ccb_h.target_id);
1690                 mpssas_set_ccbstatus(ccb, CAM_DEV_NOT_THERE);
1691                 xpt_done(ccb);
1692                 return;
1693         }
1694         if (targ->flags & MPS_TARGET_FLAGS_RAID_COMPONENT) {
1695                 mps_dprint(sc, MPS_ERROR, "%s Raid component no SCSI IO "
1696                     "supported %u\n", __func__, csio->ccb_h.target_id);
1697                 mpssas_set_ccbstatus(ccb, CAM_DEV_NOT_THERE);
1698                 xpt_done(ccb);
1699                 return;
1700         }
1701         /*
1702          * Sometimes, it is possible to get a command that is not "In
1703          * Progress" and was actually aborted by the upper layer.  Check for
1704          * this here and complete the command without error.
1705          */
1706         if (mpssas_get_ccbstatus(ccb) != CAM_REQ_INPROG) {
1707                 mps_dprint(sc, MPS_TRACE, "%s Command is not in progress for "
1708                     "target %u\n", __func__, csio->ccb_h.target_id);
1709                 xpt_done(ccb);
1710                 return;
1711         }
1712         /*
1713          * If devinfo is 0 this will be a volume.  In that case don't tell CAM
1714          * that the volume has timed out.  We want volumes to be enumerated
1715          * until they are deleted/removed, not just failed.
1716          */
1717         if (targ->flags & MPSSAS_TARGET_INREMOVAL) {
1718                 if (targ->devinfo == 0)
1719                         mpssas_set_ccbstatus(ccb, CAM_REQ_CMP);
1720                 else
1721                         mpssas_set_ccbstatus(ccb, CAM_SEL_TIMEOUT);
1722                 xpt_done(ccb);
1723                 return;
1724         }
1725
1726         if ((sc->mps_flags & MPS_FLAGS_SHUTDOWN) != 0) {
1727                 mps_dprint(sc, MPS_INFO, "%s shutting down\n", __func__);
1728                 mpssas_set_ccbstatus(ccb, CAM_DEV_NOT_THERE);
1729                 xpt_done(ccb);
1730                 return;
1731         }
1732
1733         /*
1734          * If target has a reset in progress, freeze the devq and return.  The
1735          * devq will be released when the TM reset is finished.
1736          */
1737         if (targ->flags & MPSSAS_TARGET_INRESET) {
1738                 ccb->ccb_h.status = CAM_BUSY | CAM_DEV_QFRZN;
1739                 mps_dprint(sc, MPS_INFO, "%s: Freezing devq for target ID %d\n",
1740                     __func__, targ->tid);
1741                 xpt_freeze_devq(ccb->ccb_h.path, 1);
1742                 xpt_done(ccb);
1743                 return;
1744         }
1745
1746         cm = mps_alloc_command(sc);
1747         if (cm == NULL || (sc->mps_flags & MPS_FLAGS_DIAGRESET)) {
1748                 if (cm != NULL) {
1749                         mps_free_command(sc, cm);
1750                 }
1751                 if ((sassc->flags & MPSSAS_QUEUE_FROZEN) == 0) {
1752                         xpt_freeze_simq(sassc->sim, 1);
1753                         sassc->flags |= MPSSAS_QUEUE_FROZEN;
1754                 }
1755                 ccb->ccb_h.status &= ~CAM_SIM_QUEUED;
1756                 ccb->ccb_h.status |= CAM_REQUEUE_REQ;
1757                 xpt_done(ccb);
1758                 return;
1759         }
1760
1761         req = (MPI2_SCSI_IO_REQUEST *)cm->cm_req;
1762         bzero(req, sizeof(*req));
1763         req->DevHandle = htole16(targ->handle);
1764         req->Function = MPI2_FUNCTION_SCSI_IO_REQUEST;
1765         req->MsgFlags = 0;
1766         req->SenseBufferLowAddress = htole32(cm->cm_sense_busaddr);
1767         req->SenseBufferLength = MPS_SENSE_LEN;
1768         req->SGLFlags = 0;
1769         req->ChainOffset = 0;
1770         req->SGLOffset0 = 24;   /* 32bit word offset to the SGL */
1771         req->SGLOffset1= 0;
1772         req->SGLOffset2= 0;
1773         req->SGLOffset3= 0;
1774         req->SkipCount = 0;
1775         req->DataLength = htole32(csio->dxfer_len);
1776         req->BidirectionalDataLength = 0;
1777         req->IoFlags = htole16(csio->cdb_len);
1778         req->EEDPFlags = 0;
1779
1780         /* Note: BiDirectional transfers are not supported */
1781         switch (csio->ccb_h.flags & CAM_DIR_MASK) {
1782         case CAM_DIR_IN:
1783                 mpi_control = MPI2_SCSIIO_CONTROL_READ;
1784                 cm->cm_flags |= MPS_CM_FLAGS_DATAIN;
1785                 break;
1786         case CAM_DIR_OUT:
1787                 mpi_control = MPI2_SCSIIO_CONTROL_WRITE;
1788                 cm->cm_flags |= MPS_CM_FLAGS_DATAOUT;
1789                 break;
1790         case CAM_DIR_NONE:
1791         default:
1792                 mpi_control = MPI2_SCSIIO_CONTROL_NODATATRANSFER;
1793                 break;
1794         }
1795  
1796         if (csio->cdb_len == 32)
1797                 mpi_control |= 4 << MPI2_SCSIIO_CONTROL_ADDCDBLEN_SHIFT;
1798         /*
1799          * It looks like the hardware doesn't require an explicit tag
1800          * number for each transaction.  SAM Task Management not supported
1801          * at the moment.
1802          */
1803         switch (csio->tag_action) {
1804         case MSG_HEAD_OF_Q_TAG:
1805                 mpi_control |= MPI2_SCSIIO_CONTROL_HEADOFQ;
1806                 break;
1807         case MSG_ORDERED_Q_TAG:
1808                 mpi_control |= MPI2_SCSIIO_CONTROL_ORDEREDQ;
1809                 break;
1810         case MSG_ACA_TASK:
1811                 mpi_control |= MPI2_SCSIIO_CONTROL_ACAQ;
1812                 break;
1813         case CAM_TAG_ACTION_NONE:
1814         case MSG_SIMPLE_Q_TAG:
1815         default:
1816                 mpi_control |= MPI2_SCSIIO_CONTROL_SIMPLEQ;
1817                 break;
1818         }
1819         mpi_control |= sc->mapping_table[csio->ccb_h.target_id].TLR_bits;
1820         req->Control = htole32(mpi_control);
1821         if (MPS_SET_LUN(req->LUN, csio->ccb_h.target_lun) != 0) {
1822                 mps_free_command(sc, cm);
1823                 mpssas_set_ccbstatus(ccb, CAM_LUN_INVALID);
1824                 xpt_done(ccb);
1825                 return;
1826         }
1827
1828         if (csio->ccb_h.flags & CAM_CDB_POINTER)
1829                 bcopy(csio->cdb_io.cdb_ptr, &req->CDB.CDB32[0], csio->cdb_len);
1830         else
1831                 bcopy(csio->cdb_io.cdb_bytes, &req->CDB.CDB32[0],csio->cdb_len);
1832         req->IoFlags = htole16(csio->cdb_len);
1833
1834         /*
1835          * Check if EEDP is supported and enabled.  If it is then check if the
1836          * SCSI opcode could be using EEDP.  If so, make sure the LUN exists and
1837          * is formatted for EEDP support.  If all of this is true, set CDB up
1838          * for EEDP transfer.
1839          */
1840         eedp_flags = op_code_prot[req->CDB.CDB32[0]];
1841         if (sc->eedp_enabled && eedp_flags) {
1842                 SLIST_FOREACH(lun, &targ->luns, lun_link) {
1843                         if (lun->lun_id == csio->ccb_h.target_lun) {
1844                                 break;
1845                         }
1846                 }
1847
1848                 if ((lun != NULL) && (lun->eedp_formatted)) {
1849                         req->EEDPBlockSize = htole16(lun->eedp_block_size);
1850                         eedp_flags |= (MPI2_SCSIIO_EEDPFLAGS_INC_PRI_REFTAG |
1851                             MPI2_SCSIIO_EEDPFLAGS_CHECK_REFTAG |
1852                             MPI2_SCSIIO_EEDPFLAGS_CHECK_GUARD);
1853                         req->EEDPFlags = htole16(eedp_flags);
1854
1855                         /*
1856                          * If CDB less than 32, fill in Primary Ref Tag with
1857                          * low 4 bytes of LBA.  If CDB is 32, tag stuff is
1858                          * already there.  Also, set protection bit.  FreeBSD
1859                          * currently does not support CDBs bigger than 16, but
1860                          * the code doesn't hurt, and will be here for the
1861                          * future.
1862                          */
1863                         if (csio->cdb_len != 32) {
1864                                 lba_byte = (csio->cdb_len == 16) ? 6 : 2;
1865                                 ref_tag_addr = (uint8_t *)&req->CDB.EEDP32.
1866                                     PrimaryReferenceTag;
1867                                 for (i = 0; i < 4; i++) {
1868                                         *ref_tag_addr =
1869                                             req->CDB.CDB32[lba_byte + i];
1870                                         ref_tag_addr++;
1871                                 }
1872                                 req->CDB.EEDP32.PrimaryReferenceTag = 
1873                                         htole32(req->CDB.EEDP32.PrimaryReferenceTag);
1874                                 req->CDB.EEDP32.PrimaryApplicationTagMask =
1875                                     0xFFFF;
1876                                 req->CDB.CDB32[1] = (req->CDB.CDB32[1] & 0x1F) |
1877                                     0x20;
1878                         } else {
1879                                 eedp_flags |=
1880                                     MPI2_SCSIIO_EEDPFLAGS_INC_PRI_APPTAG;
1881                                 req->EEDPFlags = htole16(eedp_flags);
1882                                 req->CDB.CDB32[10] = (req->CDB.CDB32[10] &
1883                                     0x1F) | 0x20;
1884                         }
1885                 }
1886         }
1887
1888         cm->cm_length = csio->dxfer_len;
1889         if (cm->cm_length != 0) {
1890                 cm->cm_data = ccb;
1891                 cm->cm_flags |= MPS_CM_FLAGS_USE_CCB;
1892         } else {
1893                 cm->cm_data = NULL;
1894         }
1895         cm->cm_sge = &req->SGL;
1896         cm->cm_sglsize = (32 - 24) * 4;
1897         cm->cm_desc.SCSIIO.RequestFlags = MPI2_REQ_DESCRIPT_FLAGS_SCSI_IO;
1898         cm->cm_desc.SCSIIO.DevHandle = htole16(targ->handle);
1899         cm->cm_complete = mpssas_scsiio_complete;
1900         cm->cm_complete_data = ccb;
1901         cm->cm_targ = targ;
1902         cm->cm_lun = csio->ccb_h.target_lun;
1903         cm->cm_ccb = ccb;
1904
1905         /*
1906          * If HBA is a WD and the command is not for a retry, try to build a
1907          * direct I/O message. If failed, or the command is for a retry, send
1908          * the I/O to the IR volume itself.
1909          */
1910         if (sc->WD_valid_config) {
1911                 if (ccb->ccb_h.sim_priv.entries[0].field == MPS_WD_RETRY) {
1912                         mpssas_direct_drive_io(sassc, cm, ccb);
1913                 } else {
1914                         mpssas_set_ccbstatus(ccb, CAM_REQ_INPROG);
1915                 }
1916         }
1917
1918 #if defined(BUF_TRACKING) || defined(FULL_BUF_TRACKING)
1919         if (csio->bio != NULL)
1920                 biotrack(csio->bio, __func__);
1921 #endif
1922         csio->ccb_h.qos.sim_data = sbinuptime();
1923         callout_reset_sbt(&cm->cm_callout, SBT_1MS * ccb->ccb_h.timeout, 0,
1924             mpssas_scsiio_timeout, cm, 0);
1925
1926         targ->issued++;
1927         targ->outstanding++;
1928         TAILQ_INSERT_TAIL(&targ->commands, cm, cm_link);
1929         ccb->ccb_h.status |= CAM_SIM_QUEUED;
1930
1931         mpssas_log_command(cm, MPS_XINFO, "%s cm %p ccb %p outstanding %u\n",
1932             __func__, cm, ccb, targ->outstanding);
1933
1934         mps_map_command(sc, cm);
1935         return;
1936 }
1937
1938 /**
1939  * mps_sc_failed_io_info - translated non-succesfull SCSI_IO request
1940  */
1941 static void
1942 mps_sc_failed_io_info(struct mps_softc *sc, struct ccb_scsiio *csio,
1943     Mpi2SCSIIOReply_t *mpi_reply)
1944 {
1945         u32 response_info;
1946         u8 *response_bytes;
1947         u16 ioc_status = le16toh(mpi_reply->IOCStatus) &
1948             MPI2_IOCSTATUS_MASK;
1949         u8 scsi_state = mpi_reply->SCSIState;
1950         u8 scsi_status = mpi_reply->SCSIStatus;
1951         u32 log_info = le32toh(mpi_reply->IOCLogInfo);
1952         const char *desc_ioc_state, *desc_scsi_status;
1953         
1954         if (log_info == 0x31170000)
1955                 return;
1956
1957         desc_ioc_state = mps_describe_table(mps_iocstatus_string,
1958             ioc_status);
1959         desc_scsi_status = mps_describe_table(mps_scsi_status_string,
1960             scsi_status);
1961
1962         mps_dprint(sc, MPS_XINFO, "\thandle(0x%04x), ioc_status(%s)(0x%04x)\n",
1963             le16toh(mpi_reply->DevHandle), desc_ioc_state, ioc_status);
1964
1965         /*
1966          *We can add more detail about underflow data here
1967          * TO-DO
1968          */
1969         mps_dprint(sc, MPS_XINFO, "\tscsi_status(%s)(0x%02x), "
1970             "scsi_state %b\n", desc_scsi_status, scsi_status,
1971             scsi_state, "\20" "\1AutosenseValid" "\2AutosenseFailed"
1972             "\3NoScsiStatus" "\4Terminated" "\5Response InfoValid");
1973
1974         if (sc->mps_debug & MPS_XINFO &&
1975                 scsi_state & MPI2_SCSI_STATE_AUTOSENSE_VALID) {
1976                 mps_dprint(sc, MPS_XINFO, "-> Sense Buffer Data : Start :\n");
1977                 scsi_sense_print(csio);
1978                 mps_dprint(sc, MPS_XINFO, "-> Sense Buffer Data : End :\n");
1979         }
1980
1981         if (scsi_state & MPI2_SCSI_STATE_RESPONSE_INFO_VALID) {
1982                 response_info = le32toh(mpi_reply->ResponseInfo);
1983                 response_bytes = (u8 *)&response_info;
1984                 mps_dprint(sc, MPS_XINFO, "response code(0x%1x): %s\n",
1985                     response_bytes[0],
1986                     mps_describe_table(mps_scsi_taskmgmt_string,
1987                     response_bytes[0]));
1988         }
1989 }
1990
1991 static void
1992 mpssas_scsiio_complete(struct mps_softc *sc, struct mps_command *cm)
1993 {
1994         MPI2_SCSI_IO_REPLY *rep;
1995         union ccb *ccb;
1996         struct ccb_scsiio *csio;
1997         struct mpssas_softc *sassc;
1998         struct scsi_vpd_supported_page_list *vpd_list = NULL;
1999         u8 *TLR_bits, TLR_on;
2000         int dir = 0, i;
2001         u16 alloc_len;
2002         struct mpssas_target *target;
2003         target_id_t target_id;
2004
2005         MPS_FUNCTRACE(sc);
2006         mps_dprint(sc, MPS_TRACE,
2007             "cm %p SMID %u ccb %p reply %p outstanding %u\n", cm,
2008             cm->cm_desc.Default.SMID, cm->cm_ccb, cm->cm_reply,
2009             cm->cm_targ->outstanding);
2010
2011         callout_stop(&cm->cm_callout);
2012         mtx_assert(&sc->mps_mtx, MA_OWNED);
2013
2014         sassc = sc->sassc;
2015         ccb = cm->cm_complete_data;
2016         csio = &ccb->csio;
2017         target_id = csio->ccb_h.target_id;
2018         rep = (MPI2_SCSI_IO_REPLY *)cm->cm_reply;
2019         /*
2020          * XXX KDM if the chain allocation fails, does it matter if we do
2021          * the sync and unload here?  It is simpler to do it in every case,
2022          * assuming it doesn't cause problems.
2023          */
2024         if (cm->cm_data != NULL) {
2025                 if (cm->cm_flags & MPS_CM_FLAGS_DATAIN)
2026                         dir = BUS_DMASYNC_POSTREAD;
2027                 else if (cm->cm_flags & MPS_CM_FLAGS_DATAOUT)
2028                         dir = BUS_DMASYNC_POSTWRITE;
2029                 bus_dmamap_sync(sc->buffer_dmat, cm->cm_dmamap, dir);
2030                 bus_dmamap_unload(sc->buffer_dmat, cm->cm_dmamap);
2031         }
2032
2033         cm->cm_targ->completed++;
2034         cm->cm_targ->outstanding--;
2035         TAILQ_REMOVE(&cm->cm_targ->commands, cm, cm_link);
2036         ccb->ccb_h.status &= ~(CAM_STATUS_MASK | CAM_SIM_QUEUED);
2037
2038 #if defined(BUF_TRACKING) || defined(FULL_BUF_TRACKING)
2039         if (ccb->csio.bio != NULL)
2040                 biotrack(ccb->csio.bio, __func__);
2041 #endif
2042
2043         if (cm->cm_flags & MPS_CM_FLAGS_ON_RECOVERY) {
2044                 TAILQ_REMOVE(&cm->cm_targ->timedout_commands, cm, cm_recovery);
2045                 KASSERT(cm->cm_state == MPS_CM_STATE_BUSY,
2046                     ("Not busy for CM_FLAGS_TIMEDOUT: %d\n", cm->cm_state));
2047                 cm->cm_flags &= ~MPS_CM_FLAGS_ON_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, le16toh(rep->IOCStatus),
2053                             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, le16toh(rep->IOCStatus),
2065                             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_flags & MPS_CM_FLAGS_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 = mpssas_alloc_tm(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->TaskType = MPI2_SCSITASKMGMT_TASKTYPE_TARGET_RESET;
3077
3078         /* SAS Hard Link Reset / SATA Link Reset */
3079         req->MsgFlags = MPI2_SCSITASKMGMT_MSGFLAGS_LINK_RESET;
3080
3081         tm->cm_data = NULL;
3082         tm->cm_complete = mpssas_resetdev_complete;
3083         tm->cm_complete_data = ccb;
3084         tm->cm_targ = targ;
3085
3086         mpssas_prepare_for_tm(sc, tm, targ, CAM_LUN_WILDCARD);
3087         mps_map_command(sc, tm);
3088 }
3089
3090 static void
3091 mpssas_resetdev_complete(struct mps_softc *sc, struct mps_command *tm)
3092 {
3093         MPI2_SCSI_TASK_MANAGE_REPLY *resp;
3094         union ccb *ccb;
3095
3096         MPS_FUNCTRACE(sc);
3097         mtx_assert(&sc->mps_mtx, MA_OWNED);
3098
3099         resp = (MPI2_SCSI_TASK_MANAGE_REPLY *)tm->cm_reply;
3100         ccb = tm->cm_complete_data;
3101
3102         /*
3103          * Currently there should be no way we can hit this case.  It only
3104          * happens when we have a failure to allocate chain frames, and
3105          * task management commands don't have S/G lists.
3106          */
3107         if ((tm->cm_flags & MPS_CM_FLAGS_ERROR_MASK) != 0) {
3108                 MPI2_SCSI_TASK_MANAGE_REQUEST *req;
3109
3110                 req = (MPI2_SCSI_TASK_MANAGE_REQUEST *)tm->cm_req;
3111
3112                 mps_dprint(sc, MPS_ERROR,
3113                            "%s: cm_flags = %#x for reset of handle %#04x! "
3114                            "This should not happen!\n", __func__, tm->cm_flags,
3115                            req->DevHandle);
3116                 mpssas_set_ccbstatus(ccb, CAM_REQ_CMP_ERR);
3117                 goto bailout;
3118         }
3119
3120         mps_dprint(sc, MPS_XINFO,
3121             "%s: IOCStatus = 0x%x ResponseCode = 0x%x\n", __func__,
3122             le16toh(resp->IOCStatus), le32toh(resp->ResponseCode));
3123
3124         if (le32toh(resp->ResponseCode) == MPI2_SCSITASKMGMT_RSP_TM_COMPLETE) {
3125                 mpssas_set_ccbstatus(ccb, CAM_REQ_CMP);
3126                 mpssas_announce_reset(sc, AC_SENT_BDR, tm->cm_targ->tid,
3127                     CAM_LUN_WILDCARD);
3128         }
3129         else
3130                 mpssas_set_ccbstatus(ccb, CAM_REQ_CMP_ERR);
3131
3132 bailout:
3133
3134         mpssas_free_tm(sc, tm);
3135         xpt_done(ccb);
3136 }
3137
3138 static void
3139 mpssas_poll(struct cam_sim *sim)
3140 {
3141         struct mpssas_softc *sassc;
3142
3143         sassc = cam_sim_softc(sim);
3144
3145         if (sassc->sc->mps_debug & MPS_TRACE) {
3146                 /* frequent debug messages during a panic just slow
3147                  * everything down too much.
3148                  */
3149                 mps_printf(sassc->sc, "%s clearing MPS_TRACE\n", __func__);
3150                 sassc->sc->mps_debug &= ~MPS_TRACE;
3151         }
3152
3153         mps_intr_locked(sassc->sc);
3154 }
3155
3156 static void
3157 mpssas_async(void *callback_arg, uint32_t code, struct cam_path *path,
3158              void *arg)
3159 {
3160         struct mps_softc *sc;
3161
3162         sc = (struct mps_softc *)callback_arg;
3163
3164         switch (code) {
3165 #if (__FreeBSD_version >= 1000006) || \
3166     ((__FreeBSD_version >= 901503) && (__FreeBSD_version < 1000000))
3167         case AC_ADVINFO_CHANGED: {
3168                 struct mpssas_target *target;
3169                 struct mpssas_softc *sassc;
3170                 struct scsi_read_capacity_data_long rcap_buf;
3171                 struct ccb_dev_advinfo cdai;
3172                 struct mpssas_lun *lun;
3173                 lun_id_t lunid;
3174                 int found_lun;
3175                 uintptr_t buftype;
3176
3177                 buftype = (uintptr_t)arg;
3178
3179                 found_lun = 0;
3180                 sassc = sc->sassc;
3181
3182                 /*
3183                  * We're only interested in read capacity data changes.
3184                  */
3185                 if (buftype != CDAI_TYPE_RCAPLONG)
3186                         break;
3187
3188                 /*
3189                  * We should have a handle for this, but check to make sure.
3190                  */
3191                 KASSERT(xpt_path_target_id(path) < sassc->maxtargets,
3192                     ("Target %d out of bounds in mpssas_async\n",
3193                     xpt_path_target_id(path)));
3194                 target = &sassc->targets[xpt_path_target_id(path)];
3195                 if (target->handle == 0)
3196                         break;
3197
3198                 lunid = xpt_path_lun_id(path);
3199
3200                 SLIST_FOREACH(lun, &target->luns, lun_link) {
3201                         if (lun->lun_id == lunid) {
3202                                 found_lun = 1;
3203                                 break;
3204                         }
3205                 }
3206
3207                 if (found_lun == 0) {
3208                         lun = malloc(sizeof(struct mpssas_lun), M_MPT2,
3209                                      M_NOWAIT | M_ZERO);
3210                         if (lun == NULL) {
3211                                 mps_dprint(sc, MPS_ERROR, "Unable to alloc "
3212                                            "LUN for EEDP support.\n");
3213                                 break;
3214                         }
3215                         lun->lun_id = lunid;
3216                         SLIST_INSERT_HEAD(&target->luns, lun, lun_link);
3217                 }
3218
3219                 bzero(&rcap_buf, sizeof(rcap_buf));
3220                 xpt_setup_ccb(&cdai.ccb_h, path, CAM_PRIORITY_NORMAL);
3221                 cdai.ccb_h.func_code = XPT_DEV_ADVINFO;
3222                 cdai.ccb_h.flags = CAM_DIR_IN;
3223                 cdai.buftype = CDAI_TYPE_RCAPLONG;
3224 #if (__FreeBSD_version >= 1100061) || \
3225     ((__FreeBSD_version >= 1001510) && (__FreeBSD_version < 1100000))
3226                 cdai.flags = CDAI_FLAG_NONE;
3227 #else
3228                 cdai.flags = 0;
3229 #endif
3230                 cdai.bufsiz = sizeof(rcap_buf);
3231                 cdai.buf = (uint8_t *)&rcap_buf;
3232                 xpt_action((union ccb *)&cdai);
3233                 if ((cdai.ccb_h.status & CAM_DEV_QFRZN) != 0)
3234                         cam_release_devq(cdai.ccb_h.path,
3235                                          0, 0, 0, FALSE);
3236
3237                 if ((mpssas_get_ccbstatus((union ccb *)&cdai) == CAM_REQ_CMP)
3238                  && (rcap_buf.prot & SRC16_PROT_EN)) {
3239                         switch (rcap_buf.prot & SRC16_P_TYPE) {
3240                         case SRC16_PTYPE_1:
3241                         case SRC16_PTYPE_3:
3242                                 lun->eedp_formatted = TRUE;
3243                                 lun->eedp_block_size =
3244                                     scsi_4btoul(rcap_buf.length);
3245                                 break;
3246                         case SRC16_PTYPE_2:
3247                         default:
3248                                 lun->eedp_formatted = FALSE;
3249                                 lun->eedp_block_size = 0;
3250                                 break;
3251                         }
3252                 } else {
3253                         lun->eedp_formatted = FALSE;
3254                         lun->eedp_block_size = 0;
3255                 }
3256                 break;
3257         }
3258 #else
3259         case AC_FOUND_DEVICE: {
3260                 struct ccb_getdev *cgd;
3261
3262                 cgd = arg;
3263                 mpssas_check_eedp(sc, path, cgd);
3264                 break;
3265         }
3266 #endif
3267         default:
3268                 break;
3269         }
3270 }
3271
3272 #if (__FreeBSD_version < 901503) || \
3273     ((__FreeBSD_version >= 1000000) && (__FreeBSD_version < 1000006))
3274 static void
3275 mpssas_check_eedp(struct mps_softc *sc, struct cam_path *path,
3276                   struct ccb_getdev *cgd)
3277 {
3278         struct mpssas_softc *sassc = sc->sassc;
3279         struct ccb_scsiio *csio;
3280         struct scsi_read_capacity_16 *scsi_cmd;
3281         struct scsi_read_capacity_eedp *rcap_buf;
3282         path_id_t pathid;
3283         target_id_t targetid;
3284         lun_id_t lunid;
3285         union ccb *ccb;
3286         struct cam_path *local_path;
3287         struct mpssas_target *target;
3288         struct mpssas_lun *lun;
3289         uint8_t found_lun;
3290         char path_str[64];
3291
3292         sassc = sc->sassc;
3293         pathid = cam_sim_path(sassc->sim);
3294         targetid = xpt_path_target_id(path);
3295         lunid = xpt_path_lun_id(path);
3296
3297         KASSERT(targetid < sassc->maxtargets,
3298             ("Target %d out of bounds in mpssas_check_eedp\n",
3299              targetid));
3300         target = &sassc->targets[targetid];
3301         if (target->handle == 0x0)
3302                 return;
3303
3304         /*
3305          * Determine if the device is EEDP capable.
3306          *
3307          * If this flag is set in the inquiry data, 
3308          * the device supports protection information,
3309          * and must support the 16 byte read
3310          * capacity command, otherwise continue without
3311          * sending read cap 16
3312          */
3313         if ((cgd->inq_data.spc3_flags & SPC3_SID_PROTECT) == 0)
3314                 return;
3315
3316         /*
3317          * Issue a READ CAPACITY 16 command.  This info
3318          * is used to determine if the LUN is formatted
3319          * for EEDP support.
3320          */
3321         ccb = xpt_alloc_ccb_nowait();
3322         if (ccb == NULL) {
3323                 mps_dprint(sc, MPS_ERROR, "Unable to alloc CCB "
3324                     "for EEDP support.\n");
3325                 return;
3326         }
3327
3328         if (xpt_create_path(&local_path, xpt_periph,
3329             pathid, targetid, lunid) != CAM_REQ_CMP) {
3330                 mps_dprint(sc, MPS_ERROR, "Unable to create "
3331                     "path for EEDP support\n");
3332                 xpt_free_ccb(ccb);
3333                 return;
3334         }
3335
3336         /*
3337          * If LUN is already in list, don't create a new
3338          * one.
3339          */
3340         found_lun = FALSE;
3341         SLIST_FOREACH(lun, &target->luns, lun_link) {
3342                 if (lun->lun_id == lunid) {
3343                         found_lun = TRUE;
3344                         break;
3345                 }
3346         }
3347         if (!found_lun) {
3348                 lun = malloc(sizeof(struct mpssas_lun), M_MPT2,
3349                     M_NOWAIT | M_ZERO);
3350                 if (lun == NULL) {
3351                         mps_dprint(sc, MPS_ERROR,
3352                             "Unable to alloc LUN for EEDP support.\n");
3353                         xpt_free_path(local_path);
3354                         xpt_free_ccb(ccb);
3355                         return;
3356                 }
3357                 lun->lun_id = lunid;
3358                 SLIST_INSERT_HEAD(&target->luns, lun,
3359                     lun_link);
3360         }
3361
3362         xpt_path_string(local_path, path_str, sizeof(path_str));
3363
3364         mps_dprint(sc, MPS_INFO, "Sending read cap: path %s handle %d\n",
3365             path_str, target->handle);
3366
3367         /*
3368          * Issue a READ CAPACITY 16 command for the LUN.
3369          * The mpssas_read_cap_done function will load
3370          * the read cap info into the LUN struct.
3371          */
3372         rcap_buf = malloc(sizeof(struct scsi_read_capacity_eedp),
3373             M_MPT2, M_NOWAIT | M_ZERO);
3374         if (rcap_buf == NULL) {
3375                 mps_dprint(sc, MPS_FAULT,
3376                     "Unable to alloc read capacity buffer for EEDP support.\n");
3377                 xpt_free_path(ccb->ccb_h.path);
3378                 xpt_free_ccb(ccb);
3379                 return;
3380         }
3381         xpt_setup_ccb(&ccb->ccb_h, local_path, CAM_PRIORITY_XPT);
3382         csio = &ccb->csio;
3383         csio->ccb_h.func_code = XPT_SCSI_IO;
3384         csio->ccb_h.flags = CAM_DIR_IN;
3385         csio->ccb_h.retry_count = 4;    
3386         csio->ccb_h.cbfcnp = mpssas_read_cap_done;
3387         csio->ccb_h.timeout = 60000;
3388         csio->data_ptr = (uint8_t *)rcap_buf;
3389         csio->dxfer_len = sizeof(struct scsi_read_capacity_eedp);
3390         csio->sense_len = MPS_SENSE_LEN;
3391         csio->cdb_len = sizeof(*scsi_cmd);
3392         csio->tag_action = MSG_SIMPLE_Q_TAG;
3393
3394         scsi_cmd = (struct scsi_read_capacity_16 *)&csio->cdb_io.cdb_bytes;
3395         bzero(scsi_cmd, sizeof(*scsi_cmd));
3396         scsi_cmd->opcode = 0x9E;
3397         scsi_cmd->service_action = SRC16_SERVICE_ACTION;
3398         ((uint8_t *)scsi_cmd)[13] = sizeof(struct scsi_read_capacity_eedp);
3399
3400         ccb->ccb_h.ppriv_ptr1 = sassc;
3401         xpt_action(ccb);
3402 }
3403
3404 static void
3405 mpssas_read_cap_done(struct cam_periph *periph, union ccb *done_ccb)
3406 {
3407         struct mpssas_softc *sassc;
3408         struct mpssas_target *target;
3409         struct mpssas_lun *lun;
3410         struct scsi_read_capacity_eedp *rcap_buf;
3411
3412         if (done_ccb == NULL)
3413                 return;
3414         
3415         /* Driver need to release devq, it Scsi command is
3416          * generated by driver internally.
3417          * Currently there is a single place where driver
3418          * calls scsi command internally. In future if driver
3419          * calls more scsi command internally, it needs to release
3420          * devq internally, since those command will not go back to
3421          * cam_periph.
3422          */
3423         if ((done_ccb->ccb_h.status & CAM_DEV_QFRZN) ) {
3424                 done_ccb->ccb_h.status &= ~CAM_DEV_QFRZN;
3425                 xpt_release_devq(done_ccb->ccb_h.path,
3426                                 /*count*/ 1, /*run_queue*/TRUE);
3427         }
3428
3429         rcap_buf = (struct scsi_read_capacity_eedp *)done_ccb->csio.data_ptr;
3430
3431         /*
3432          * Get the LUN ID for the path and look it up in the LUN list for the
3433          * target.
3434          */
3435         sassc = (struct mpssas_softc *)done_ccb->ccb_h.ppriv_ptr1;
3436         KASSERT(done_ccb->ccb_h.target_id < sassc->maxtargets,
3437             ("Target %d out of bounds in mpssas_read_cap_done\n",
3438              done_ccb->ccb_h.target_id));
3439         target = &sassc->targets[done_ccb->ccb_h.target_id];
3440         SLIST_FOREACH(lun, &target->luns, lun_link) {
3441                 if (lun->lun_id != done_ccb->ccb_h.target_lun)
3442                         continue;
3443
3444                 /*
3445                  * Got the LUN in the target's LUN list.  Fill it in
3446                  * with EEDP info.  If the READ CAP 16 command had some
3447                  * SCSI error (common if command is not supported), mark
3448                  * the lun as not supporting EEDP and set the block size
3449                  * to 0.
3450                  */
3451                 if ((mpssas_get_ccbstatus(done_ccb) != CAM_REQ_CMP)
3452                  || (done_ccb->csio.scsi_status != SCSI_STATUS_OK)) {
3453                         lun->eedp_formatted = FALSE;
3454                         lun->eedp_block_size = 0;
3455                         break;
3456                 }
3457
3458                 if (rcap_buf->protect & 0x01) {
3459                         mps_dprint(sassc->sc, MPS_INFO, "LUN %d for "
3460                             "target ID %d is formatted for EEDP "
3461                             "support.\n", done_ccb->ccb_h.target_lun,
3462                             done_ccb->ccb_h.target_id);
3463                         lun->eedp_formatted = TRUE;
3464                         lun->eedp_block_size = scsi_4btoul(rcap_buf->length);
3465                 }
3466                 break;
3467         }
3468
3469         // Finished with this CCB and path.
3470         free(rcap_buf, M_MPT2);
3471         xpt_free_path(done_ccb->ccb_h.path);
3472         xpt_free_ccb(done_ccb);
3473 }
3474 #endif /* (__FreeBSD_version < 901503) || \
3475           ((__FreeBSD_version >= 1000000) && (__FreeBSD_version < 1000006)) */
3476
3477 /*
3478  * Set the INRESET flag for this target so that no I/O will be sent to
3479  * the target until the reset has completed.  If an I/O request does
3480  * happen, the devq will be frozen.  The CCB holds the path which is
3481  * used to release the devq.  The devq is released and the CCB is freed
3482  * when the TM completes.
3483  */
3484 void
3485 mpssas_prepare_for_tm(struct mps_softc *sc, struct mps_command *tm,
3486     struct mpssas_target *target, lun_id_t lun_id)
3487 {
3488         union ccb *ccb;
3489         path_id_t path_id;
3490
3491         ccb = xpt_alloc_ccb_nowait();
3492         if (ccb) {
3493                 path_id = cam_sim_path(sc->sassc->sim);
3494                 if (xpt_create_path(&ccb->ccb_h.path, xpt_periph, path_id,
3495                     target->tid, lun_id) != CAM_REQ_CMP) {
3496                         xpt_free_ccb(ccb);
3497                 } else {
3498                         tm->cm_ccb = ccb;
3499                         tm->cm_targ = target;
3500                         target->flags |= MPSSAS_TARGET_INRESET;
3501                 }
3502         }
3503 }
3504
3505 int
3506 mpssas_startup(struct mps_softc *sc)
3507 {
3508
3509         /*
3510          * Send the port enable message and set the wait_for_port_enable flag.
3511          * This flag helps to keep the simq frozen until all discovery events
3512          * are processed.
3513          */
3514         sc->wait_for_port_enable = 1;
3515         mpssas_send_portenable(sc);
3516         return (0);
3517 }
3518
3519 static int
3520 mpssas_send_portenable(struct mps_softc *sc)
3521 {
3522         MPI2_PORT_ENABLE_REQUEST *request;
3523         struct mps_command *cm;
3524
3525         MPS_FUNCTRACE(sc);
3526
3527         if ((cm = mps_alloc_command(sc)) == NULL)
3528                 return (EBUSY);
3529         request = (MPI2_PORT_ENABLE_REQUEST *)cm->cm_req;
3530         request->Function = MPI2_FUNCTION_PORT_ENABLE;
3531         request->MsgFlags = 0;
3532         request->VP_ID = 0;
3533         cm->cm_desc.Default.RequestFlags = MPI2_REQ_DESCRIPT_FLAGS_DEFAULT_TYPE;
3534         cm->cm_complete = mpssas_portenable_complete;
3535         cm->cm_data = NULL;
3536         cm->cm_sge = NULL;
3537
3538         mps_map_command(sc, cm);
3539         mps_dprint(sc, MPS_XINFO, 
3540             "mps_send_portenable finished cm %p req %p complete %p\n",
3541             cm, cm->cm_req, cm->cm_complete);
3542         return (0);
3543 }
3544
3545 static void
3546 mpssas_portenable_complete(struct mps_softc *sc, struct mps_command *cm)
3547 {
3548         MPI2_PORT_ENABLE_REPLY *reply;
3549         struct mpssas_softc *sassc;
3550
3551         MPS_FUNCTRACE(sc);
3552         sassc = sc->sassc;
3553
3554         /*
3555          * Currently there should be no way we can hit this case.  It only
3556          * happens when we have a failure to allocate chain frames, and
3557          * port enable commands don't have S/G lists.
3558          */
3559         if ((cm->cm_flags & MPS_CM_FLAGS_ERROR_MASK) != 0) {
3560                 mps_dprint(sc, MPS_ERROR, "%s: cm_flags = %#x for port enable! "
3561                            "This should not happen!\n", __func__, cm->cm_flags);
3562         }
3563
3564         reply = (MPI2_PORT_ENABLE_REPLY *)cm->cm_reply;
3565         if (reply == NULL)
3566                 mps_dprint(sc, MPS_FAULT, "Portenable NULL reply\n");
3567         else if (le16toh(reply->IOCStatus & MPI2_IOCSTATUS_MASK) !=
3568             MPI2_IOCSTATUS_SUCCESS)
3569                 mps_dprint(sc, MPS_FAULT, "Portenable failed\n");
3570
3571         mps_free_command(sc, cm);
3572
3573         /*
3574          * Get WarpDrive info after discovery is complete but before the scan
3575          * starts.  At this point, all devices are ready to be exposed to the
3576          * OS.  If devices should be hidden instead, take them out of the
3577          * 'targets' array before the scan.  The devinfo for a disk will have
3578          * some info and a volume's will be 0.  Use that to remove disks.
3579          */
3580         mps_wd_config_pages(sc);
3581
3582         /*
3583          * Done waiting for port enable to complete.  Decrement the refcount.
3584          * If refcount is 0, discovery is complete and a rescan of the bus can
3585          * take place.  Since the simq was explicitly frozen before port
3586          * enable, it must be explicitly released here to keep the
3587          * freeze/release count in sync.
3588          */
3589         sc->wait_for_port_enable = 0;
3590         sc->port_enable_complete = 1;
3591         wakeup(&sc->port_enable_complete);
3592         mpssas_startup_decrement(sassc);
3593 }
3594
3595 int
3596 mpssas_check_id(struct mpssas_softc *sassc, int id)
3597 {
3598         struct mps_softc *sc = sassc->sc;
3599         char *ids;
3600         char *name;
3601
3602         ids = &sc->exclude_ids[0];
3603         while((name = strsep(&ids, ",")) != NULL) {
3604                 if (name[0] == '\0')
3605                         continue;
3606                 if (strtol(name, NULL, 0) == (long)id)
3607                         return (1);
3608         }
3609
3610         return (0);
3611 }
3612
3613 void
3614 mpssas_realloc_targets(struct mps_softc *sc, int maxtargets)
3615 {
3616         struct mpssas_softc *sassc;
3617         struct mpssas_lun *lun, *lun_tmp;
3618         struct mpssas_target *targ;
3619         int i;
3620
3621         sassc = sc->sassc;
3622         /*
3623          * The number of targets is based on IOC Facts, so free all of
3624          * the allocated LUNs for each target and then the target buffer
3625          * itself.
3626          */
3627         for (i=0; i< maxtargets; i++) {
3628                 targ = &sassc->targets[i];
3629                 SLIST_FOREACH_SAFE(lun, &targ->luns, lun_link, lun_tmp) {
3630                         free(lun, M_MPT2);
3631                 }
3632         }
3633         free(sassc->targets, M_MPT2);
3634
3635         sassc->targets = malloc(sizeof(struct mpssas_target) * maxtargets,
3636             M_MPT2, M_WAITOK|M_ZERO);
3637         if (!sassc->targets) {
3638                 panic("%s failed to alloc targets with error %d\n",
3639                     __func__, ENOMEM);
3640         }
3641 }