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