]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - sys/cam/ata/ata_xpt.c
ndis(4): expand deprecation to the whole driver
[FreeBSD/FreeBSD.git] / sys / cam / ata / ata_xpt.c
1 /*-
2  * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
3  *
4  * Copyright (c) 2009 Alexander Motin <mav@FreeBSD.org>
5  * All rights reserved.
6  *
7  * Redistribution and use in source and binary forms, with or without
8  * modification, are permitted provided that the following conditions
9  * are met:
10  * 1. Redistributions of source code must retain the above copyright
11  *    notice, this list of conditions and the following disclaimer,
12  *    without modification, immediately at the beginning of the file.
13  * 2. Redistributions in binary form must reproduce the above copyright
14  *    notice, this list of conditions and the following disclaimer in the
15  *    documentation and/or other materials provided with the distribution.
16  *
17  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
18  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
19  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
20  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
21  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
22  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27  */
28
29 #include <sys/cdefs.h>
30 __FBSDID("$FreeBSD$");
31
32 #include <sys/param.h>
33 #include <sys/bus.h>
34 #include <sys/endian.h>
35 #include <sys/systm.h>
36 #include <sys/types.h>
37 #include <sys/malloc.h>
38 #include <sys/kernel.h>
39 #include <sys/time.h>
40 #include <sys/conf.h>
41 #include <sys/fcntl.h>
42 #include <sys/sbuf.h>
43
44 #include <sys/eventhandler.h>
45 #include <sys/lock.h>
46 #include <sys/mutex.h>
47 #include <sys/sysctl.h>
48
49 #include <cam/cam.h>
50 #include <cam/cam_ccb.h>
51 #include <cam/cam_queue.h>
52 #include <cam/cam_periph.h>
53 #include <cam/cam_sim.h>
54 #include <cam/cam_xpt.h>
55 #include <cam/cam_xpt_sim.h>
56 #include <cam/cam_xpt_periph.h>
57 #include <cam/cam_xpt_internal.h>
58 #include <cam/cam_debug.h>
59
60 #include <cam/scsi/scsi_all.h>
61 #include <cam/scsi/scsi_message.h>
62 #include <cam/ata/ata_all.h>
63 #include <machine/stdarg.h>     /* for xpt_print below */
64 #include "opt_cam.h"
65
66 struct ata_quirk_entry {
67         struct scsi_inquiry_pattern inq_pat;
68         u_int8_t quirks;
69 #define CAM_QUIRK_MAXTAGS       0x01
70         u_int mintags;
71         u_int maxtags;
72 };
73
74 static periph_init_t aprobe_periph_init;
75
76 static struct periph_driver aprobe_driver =
77 {
78         aprobe_periph_init, "aprobe",
79         TAILQ_HEAD_INITIALIZER(aprobe_driver.units), /* generation */ 0,
80         CAM_PERIPH_DRV_EARLY
81 };
82
83 PERIPHDRIVER_DECLARE(aprobe, aprobe_driver);
84
85 typedef enum {
86         PROBE_RESET,
87         PROBE_IDENTIFY,
88         PROBE_SPINUP,
89         PROBE_SETMODE,
90         PROBE_SETPM,
91         PROBE_SETAPST,
92         PROBE_SETDMAAA,
93         PROBE_SETAN,
94         PROBE_SET_MULTI,
95         PROBE_INQUIRY,
96         PROBE_FULL_INQUIRY,
97         PROBE_PM_PID,
98         PROBE_PM_PRV,
99         PROBE_IDENTIFY_SES,
100         PROBE_IDENTIFY_SAFTE,
101         PROBE_DONE,
102         PROBE_INVALID
103 } aprobe_action;
104
105 static char *probe_action_text[] = {
106         "PROBE_RESET",
107         "PROBE_IDENTIFY",
108         "PROBE_SPINUP",
109         "PROBE_SETMODE",
110         "PROBE_SETPM",
111         "PROBE_SETAPST",
112         "PROBE_SETDMAAA",
113         "PROBE_SETAN",
114         "PROBE_SET_MULTI",
115         "PROBE_INQUIRY",
116         "PROBE_FULL_INQUIRY",
117         "PROBE_PM_PID",
118         "PROBE_PM_PRV",
119         "PROBE_IDENTIFY_SES",
120         "PROBE_IDENTIFY_SAFTE",
121         "PROBE_DONE",
122         "PROBE_INVALID"
123 };
124
125 #define PROBE_SET_ACTION(softc, newaction)      \
126 do {                                                                    \
127         char **text;                                                    \
128         text = probe_action_text;                                       \
129         CAM_DEBUG((softc)->periph->path, CAM_DEBUG_PROBE,               \
130             ("Probe %s to %s\n", text[(softc)->action],                 \
131             text[(newaction)]));                                        \
132         (softc)->action = (newaction);                                  \
133 } while(0)
134
135 typedef enum {
136         PROBE_NO_ANNOUNCE       = 0x04
137 } aprobe_flags;
138
139 typedef struct {
140         TAILQ_HEAD(, ccb_hdr) request_ccbs;
141         struct ata_params       ident_data;
142         aprobe_action   action;
143         aprobe_flags    flags;
144         uint32_t        pm_pid;
145         uint32_t        pm_prv;
146         int             restart;
147         int             spinup;
148         int             faults;
149         u_int           caps;
150         struct cam_periph *periph;
151 } probe_softc;
152
153 static struct ata_quirk_entry ata_quirk_table[] =
154 {
155         {
156                 /* Default tagged queuing parameters for all devices */
157                 {
158                   T_ANY, SIP_MEDIA_REMOVABLE|SIP_MEDIA_FIXED,
159                   /*vendor*/"*", /*product*/"*", /*revision*/"*"
160                 },
161                 /*quirks*/0, /*mintags*/0, /*maxtags*/0
162         },
163 };
164
165 static cam_status       aproberegister(struct cam_periph *periph, void *arg);
166 static void      aprobeschedule(struct cam_periph *probe_periph);
167 static void      aprobestart(struct cam_periph *periph, union ccb *start_ccb);
168 static void      aproberequestdefaultnegotiation(struct cam_periph *periph);
169 static void      aprobedone(struct cam_periph *periph, union ccb *done_ccb);
170 static void      aprobecleanup(struct cam_periph *periph);
171 static void      ata_find_quirk(struct cam_ed *device);
172 static void      ata_scan_bus(struct cam_periph *periph, union ccb *ccb);
173 static void      ata_scan_lun(struct cam_periph *periph,
174                                struct cam_path *path, cam_flags flags,
175                                union ccb *ccb);
176 static void      axptscandone(struct cam_periph *periph, union ccb *done_ccb);
177 static struct cam_ed *
178                  ata_alloc_device(struct cam_eb *bus, struct cam_et *target,
179                                    lun_id_t lun_id);
180 static void      ata_device_transport(struct cam_path *path);
181 static void      ata_get_transfer_settings(struct ccb_trans_settings *cts);
182 static void      ata_set_transfer_settings(struct ccb_trans_settings *cts,
183                                             struct cam_path *path,
184                                             int async_update);
185 static void      ata_dev_async(u_int32_t async_code,
186                                 struct cam_eb *bus,
187                                 struct cam_et *target,
188                                 struct cam_ed *device,
189                                 void *async_arg);
190 static void      ata_action(union ccb *start_ccb);
191 static void      ata_announce_periph(struct cam_periph *periph);
192 static void      ata_announce_periph_sbuf(struct cam_periph *periph, struct sbuf *sb);
193 static void      ata_proto_announce(struct cam_ed *device);
194 static void      ata_proto_announce_sbuf(struct cam_ed *device, struct sbuf *sb);
195 static void      ata_proto_denounce(struct cam_ed *device);
196 static void      ata_proto_denounce_sbuf(struct cam_ed *device, struct sbuf *sb);
197 static void      ata_proto_debug_out(union ccb *ccb);
198 static void      semb_proto_announce(struct cam_ed *device);
199 static void      semb_proto_announce_sbuf(struct cam_ed *device, struct sbuf *sb);
200 static void      semb_proto_denounce(struct cam_ed *device);
201 static void      semb_proto_denounce_sbuf(struct cam_ed *device, struct sbuf *sb);
202
203 static int ata_dma = 1;
204 static int atapi_dma = 1;
205
206 TUNABLE_INT("hw.ata.ata_dma", &ata_dma);
207 TUNABLE_INT("hw.ata.atapi_dma", &atapi_dma);
208
209 static struct xpt_xport_ops ata_xport_ops = {
210         .alloc_device = ata_alloc_device,
211         .action = ata_action,
212         .async = ata_dev_async,
213         .announce = ata_announce_periph,
214         .announce_sbuf = ata_announce_periph_sbuf,
215 };
216 #define ATA_XPT_XPORT(x, X)                     \
217 static struct xpt_xport ata_xport_ ## x = {     \
218         .xport = XPORT_ ## X,                   \
219         .name = #x,                             \
220         .ops = &ata_xport_ops,                  \
221 };                                              \
222 CAM_XPT_XPORT(ata_xport_ ## x);
223
224 ATA_XPT_XPORT(ata, ATA);
225 ATA_XPT_XPORT(sata, SATA);
226
227 #undef ATA_XPORT_XPORT
228
229 static struct xpt_proto_ops ata_proto_ops_ata = {
230         .announce = ata_proto_announce,
231         .announce_sbuf = ata_proto_announce_sbuf,
232         .denounce = ata_proto_denounce,
233         .denounce_sbuf = ata_proto_denounce_sbuf,
234         .debug_out = ata_proto_debug_out,
235 };
236 static struct xpt_proto ata_proto_ata = {
237         .proto = PROTO_ATA,
238         .name = "ata",
239         .ops = &ata_proto_ops_ata,
240 };
241
242 static struct xpt_proto_ops ata_proto_ops_satapm = {
243         .announce = ata_proto_announce,
244         .announce_sbuf = ata_proto_announce_sbuf,
245         .denounce = ata_proto_denounce,
246         .denounce_sbuf = ata_proto_denounce_sbuf,
247         .debug_out = ata_proto_debug_out,
248 };
249 static struct xpt_proto ata_proto_satapm = {
250         .proto = PROTO_SATAPM,
251         .name = "satapm",
252         .ops = &ata_proto_ops_satapm,
253 };
254
255 static struct xpt_proto_ops ata_proto_ops_semb = {
256         .announce = semb_proto_announce,
257         .announce_sbuf = semb_proto_announce_sbuf,
258         .denounce = semb_proto_denounce,
259         .denounce_sbuf = semb_proto_denounce_sbuf,
260         .debug_out = ata_proto_debug_out,
261 };
262 static struct xpt_proto ata_proto_semb = {
263         .proto = PROTO_SEMB,
264         .name = "semb",
265         .ops = &ata_proto_ops_semb,
266 };
267
268 CAM_XPT_PROTO(ata_proto_ata);
269 CAM_XPT_PROTO(ata_proto_satapm);
270 CAM_XPT_PROTO(ata_proto_semb);
271
272 static void
273 aprobe_periph_init(void)
274 {
275 }
276
277 static cam_status
278 aproberegister(struct cam_periph *periph, void *arg)
279 {
280         union ccb *request_ccb; /* CCB representing the probe request */
281         probe_softc *softc;
282
283         request_ccb = (union ccb *)arg;
284         if (request_ccb == NULL) {
285                 printf("proberegister: no probe CCB, "
286                        "can't register device\n");
287                 return(CAM_REQ_CMP_ERR);
288         }
289
290         softc = (probe_softc *)malloc(sizeof(*softc), M_CAMXPT, M_ZERO | M_NOWAIT);
291
292         if (softc == NULL) {
293                 printf("proberegister: Unable to probe new device. "
294                        "Unable to allocate softc\n");
295                 return(CAM_REQ_CMP_ERR);
296         }
297         TAILQ_INIT(&softc->request_ccbs);
298         TAILQ_INSERT_TAIL(&softc->request_ccbs, &request_ccb->ccb_h,
299                           periph_links.tqe);
300         softc->flags = 0;
301         periph->softc = softc;
302         softc->periph = periph;
303         softc->action = PROBE_INVALID;
304         if (cam_periph_acquire(periph) != 0)
305                 return (CAM_REQ_CMP_ERR);
306
307         CAM_DEBUG(periph->path, CAM_DEBUG_PROBE, ("Probe started\n"));
308         ata_device_transport(periph->path);
309         aprobeschedule(periph);
310         return(CAM_REQ_CMP);
311 }
312
313 static void
314 aprobeschedule(struct cam_periph *periph)
315 {
316         union ccb *ccb;
317         probe_softc *softc;
318
319         softc = (probe_softc *)periph->softc;
320         ccb = (union ccb *)TAILQ_FIRST(&softc->request_ccbs);
321
322         if ((periph->path->device->flags & CAM_DEV_UNCONFIGURED) ||
323             periph->path->device->protocol == PROTO_SATAPM ||
324             periph->path->device->protocol == PROTO_SEMB)
325                 PROBE_SET_ACTION(softc, PROBE_RESET);
326         else
327                 PROBE_SET_ACTION(softc, PROBE_IDENTIFY);
328
329         if (ccb->crcn.flags & CAM_EXPECT_INQ_CHANGE)
330                 softc->flags |= PROBE_NO_ANNOUNCE;
331         else
332                 softc->flags &= ~PROBE_NO_ANNOUNCE;
333
334         xpt_schedule(periph, CAM_PRIORITY_XPT);
335 }
336
337 static void
338 aprobestart(struct cam_periph *periph, union ccb *start_ccb)
339 {
340         struct ccb_trans_settings cts;
341         struct ccb_ataio *ataio;
342         struct ccb_scsiio *csio;
343         probe_softc *softc;
344         struct cam_path *path;
345         struct ata_params *ident_buf;
346         u_int oif;
347
348         CAM_DEBUG(start_ccb->ccb_h.path, CAM_DEBUG_TRACE, ("aprobestart\n"));
349
350         softc = (probe_softc *)periph->softc;
351         path = start_ccb->ccb_h.path;
352         ataio = &start_ccb->ataio;
353         csio = &start_ccb->csio;
354         ident_buf = &periph->path->device->ident_data;
355
356         if (softc->restart) {
357                 softc->restart = 0;
358                 if ((path->device->flags & CAM_DEV_UNCONFIGURED) ||
359                     path->device->protocol == PROTO_SATAPM ||
360                     path->device->protocol == PROTO_SEMB)
361                         softc->action = PROBE_RESET;
362                 else
363                         softc->action = PROBE_IDENTIFY;
364         }
365         switch (softc->action) {
366         case PROBE_RESET:
367                 cam_fill_ataio(ataio,
368                       0,
369                       aprobedone,
370                       /*flags*/CAM_DIR_NONE,
371                       0,
372                       /*data_ptr*/NULL,
373                       /*dxfer_len*/0,
374                       15 * 1000);
375                 ata_reset_cmd(ataio);
376                 break;
377         case PROBE_IDENTIFY:
378                 cam_fill_ataio(ataio,
379                       1,
380                       aprobedone,
381                       /*flags*/CAM_DIR_IN,
382                       0,
383                       /*data_ptr*/(u_int8_t *)&softc->ident_data,
384                       /*dxfer_len*/sizeof(softc->ident_data),
385                       30 * 1000);
386                 if (path->device->protocol == PROTO_ATA)
387                         ata_28bit_cmd(ataio, ATA_ATA_IDENTIFY, 0, 0, 0);
388                 else
389                         ata_28bit_cmd(ataio, ATA_ATAPI_IDENTIFY, 0, 0, 0);
390                 break;
391         case PROBE_SPINUP:
392                 if (bootverbose)
393                         xpt_print(path, "Spinning up device\n");
394                 cam_fill_ataio(ataio,
395                       1,
396                       aprobedone,
397                       /*flags*/CAM_DIR_NONE | CAM_HIGH_POWER,
398                       0,
399                       /*data_ptr*/NULL,
400                       /*dxfer_len*/0,
401                       30 * 1000);
402                 ata_28bit_cmd(ataio, ATA_SETFEATURES, ATA_SF_PUIS_SPINUP, 0, 0);
403                 break;
404         case PROBE_SETMODE:
405         {
406                 int mode, wantmode;
407
408                 mode = 0;
409                 /* Fetch user modes from SIM. */
410                 bzero(&cts, sizeof(cts));
411                 xpt_setup_ccb(&cts.ccb_h, path, CAM_PRIORITY_NONE);
412                 cts.ccb_h.func_code = XPT_GET_TRAN_SETTINGS;
413                 cts.type = CTS_TYPE_USER_SETTINGS;
414                 xpt_action((union ccb *)&cts);
415                 if (path->device->transport == XPORT_ATA) {
416                         if (cts.xport_specific.ata.valid & CTS_ATA_VALID_MODE)
417                                 mode = cts.xport_specific.ata.mode;
418                 } else {
419                         if (cts.xport_specific.sata.valid & CTS_SATA_VALID_MODE)
420                                 mode = cts.xport_specific.sata.mode;
421                 }
422                 if (path->device->protocol == PROTO_ATA) {
423                         if (ata_dma == 0 && (mode == 0 || mode > ATA_PIO_MAX))
424                                 mode = ATA_PIO_MAX;
425                 } else {
426                         if (atapi_dma == 0 && (mode == 0 || mode > ATA_PIO_MAX))
427                                 mode = ATA_PIO_MAX;
428                 }
429 negotiate:
430                 /* Honor device capabilities. */
431                 wantmode = mode = ata_max_mode(ident_buf, mode);
432                 /* Report modes to SIM. */
433                 bzero(&cts, sizeof(cts));
434                 xpt_setup_ccb(&cts.ccb_h, path, CAM_PRIORITY_NONE);
435                 cts.ccb_h.func_code = XPT_SET_TRAN_SETTINGS;
436                 cts.type = CTS_TYPE_CURRENT_SETTINGS;
437                 if (path->device->transport == XPORT_ATA) {
438                         cts.xport_specific.ata.mode = mode;
439                         cts.xport_specific.ata.valid = CTS_ATA_VALID_MODE;
440                 } else {
441                         cts.xport_specific.sata.mode = mode;
442                         cts.xport_specific.sata.valid = CTS_SATA_VALID_MODE;
443                 }
444                 xpt_action((union ccb *)&cts);
445                 /* Fetch current modes from SIM. */
446                 bzero(&cts, sizeof(cts));
447                 xpt_setup_ccb(&cts.ccb_h, path, CAM_PRIORITY_NONE);
448                 cts.ccb_h.func_code = XPT_GET_TRAN_SETTINGS;
449                 cts.type = CTS_TYPE_CURRENT_SETTINGS;
450                 xpt_action((union ccb *)&cts);
451                 if (path->device->transport == XPORT_ATA) {
452                         if (cts.xport_specific.ata.valid & CTS_ATA_VALID_MODE)
453                                 mode = cts.xport_specific.ata.mode;
454                 } else {
455                         if (cts.xport_specific.sata.valid & CTS_SATA_VALID_MODE)
456                                 mode = cts.xport_specific.sata.mode;
457                 }
458                 /* If SIM disagree - renegotiate. */
459                 if (mode != wantmode)
460                         goto negotiate;
461                 /* Remember what transport thinks about DMA. */
462                 oif = path->device->inq_flags;
463                 if (mode < ATA_DMA)
464                         path->device->inq_flags &= ~SID_DMA;
465                 else
466                         path->device->inq_flags |= SID_DMA;
467                 if (path->device->inq_flags != oif)
468                         xpt_async(AC_GETDEV_CHANGED, path, NULL);
469                 cam_fill_ataio(ataio,
470                       1,
471                       aprobedone,
472                       /*flags*/CAM_DIR_NONE,
473                       0,
474                       /*data_ptr*/NULL,
475                       /*dxfer_len*/0,
476                       30 * 1000);
477                 ata_28bit_cmd(ataio, ATA_SETFEATURES, ATA_SF_SETXFER, 0, mode);
478                 break;
479         }
480         case PROBE_SETPM:
481                 cam_fill_ataio(ataio,
482                     1,
483                     aprobedone,
484                     CAM_DIR_NONE,
485                     0,
486                     NULL,
487                     0,
488                     30*1000);
489                 ata_28bit_cmd(ataio, ATA_SETFEATURES,
490                     (softc->caps & CTS_SATA_CAPS_H_PMREQ) ? 0x10 : 0x90,
491                     0, 0x03);
492                 break;
493         case PROBE_SETAPST:
494                 cam_fill_ataio(ataio,
495                     1,
496                     aprobedone,
497                     CAM_DIR_NONE,
498                     0,
499                     NULL,
500                     0,
501                     30*1000);
502                 ata_28bit_cmd(ataio, ATA_SETFEATURES,
503                     (softc->caps & CTS_SATA_CAPS_H_APST) ? 0x10 : 0x90,
504                     0, 0x07);
505                 break;
506         case PROBE_SETDMAAA:
507                 cam_fill_ataio(ataio,
508                     1,
509                     aprobedone,
510                     CAM_DIR_NONE,
511                     0,
512                     NULL,
513                     0,
514                     30*1000);
515                 ata_28bit_cmd(ataio, ATA_SETFEATURES,
516                     (softc->caps & CTS_SATA_CAPS_H_DMAAA) ? 0x10 : 0x90,
517                     0, 0x02);
518                 break;
519         case PROBE_SETAN:
520                 /* Remember what transport thinks about AEN. */
521                 oif = path->device->inq_flags;
522                 if (softc->caps & CTS_SATA_CAPS_H_AN)
523                         path->device->inq_flags |= SID_AEN;
524                 else
525                         path->device->inq_flags &= ~SID_AEN;
526                 if (path->device->inq_flags != oif)
527                         xpt_async(AC_GETDEV_CHANGED, path, NULL);
528                 cam_fill_ataio(ataio,
529                     1,
530                     aprobedone,
531                     CAM_DIR_NONE,
532                     0,
533                     NULL,
534                     0,
535                     30*1000);
536                 ata_28bit_cmd(ataio, ATA_SETFEATURES,
537                     (softc->caps & CTS_SATA_CAPS_H_AN) ? 0x10 : 0x90,
538                     0, 0x05);
539                 break;
540         case PROBE_SET_MULTI:
541         {
542                 u_int sectors, bytecount;
543
544                 bytecount = 8192;       /* SATA maximum */
545                 /* Fetch user bytecount from SIM. */
546                 bzero(&cts, sizeof(cts));
547                 xpt_setup_ccb(&cts.ccb_h, path, CAM_PRIORITY_NONE);
548                 cts.ccb_h.func_code = XPT_GET_TRAN_SETTINGS;
549                 cts.type = CTS_TYPE_USER_SETTINGS;
550                 xpt_action((union ccb *)&cts);
551                 if (path->device->transport == XPORT_ATA) {
552                         if (cts.xport_specific.ata.valid & CTS_ATA_VALID_BYTECOUNT)
553                                 bytecount = cts.xport_specific.ata.bytecount;
554                 } else {
555                         if (cts.xport_specific.sata.valid & CTS_SATA_VALID_BYTECOUNT)
556                                 bytecount = cts.xport_specific.sata.bytecount;
557                 }
558                 /* Honor device capabilities. */
559                 sectors = max(1, min(ident_buf->sectors_intr & 0xff,
560                     bytecount / ata_logical_sector_size(ident_buf)));
561                 /* Report bytecount to SIM. */
562                 bzero(&cts, sizeof(cts));
563                 xpt_setup_ccb(&cts.ccb_h, path, CAM_PRIORITY_NONE);
564                 cts.ccb_h.func_code = XPT_SET_TRAN_SETTINGS;
565                 cts.type = CTS_TYPE_CURRENT_SETTINGS;
566                 if (path->device->transport == XPORT_ATA) {
567                         cts.xport_specific.ata.bytecount = sectors *
568                             ata_logical_sector_size(ident_buf);
569                         cts.xport_specific.ata.valid = CTS_ATA_VALID_BYTECOUNT;
570                 } else {
571                         cts.xport_specific.sata.bytecount = sectors *
572                             ata_logical_sector_size(ident_buf);
573                         cts.xport_specific.sata.valid = CTS_SATA_VALID_BYTECOUNT;
574                 }
575                 xpt_action((union ccb *)&cts);
576                 /* Fetch current bytecount from SIM. */
577                 bzero(&cts, sizeof(cts));
578                 xpt_setup_ccb(&cts.ccb_h, path, CAM_PRIORITY_NONE);
579                 cts.ccb_h.func_code = XPT_GET_TRAN_SETTINGS;
580                 cts.type = CTS_TYPE_CURRENT_SETTINGS;
581                 xpt_action((union ccb *)&cts);
582                 if (path->device->transport == XPORT_ATA) {
583                         if (cts.xport_specific.ata.valid & CTS_ATA_VALID_BYTECOUNT)
584                                 bytecount = cts.xport_specific.ata.bytecount;
585                 } else {
586                         if (cts.xport_specific.sata.valid & CTS_SATA_VALID_BYTECOUNT)
587                                 bytecount = cts.xport_specific.sata.bytecount;
588                 }
589                 sectors = bytecount / ata_logical_sector_size(ident_buf);
590
591                 cam_fill_ataio(ataio,
592                     1,
593                     aprobedone,
594                     CAM_DIR_NONE,
595                     0,
596                     NULL,
597                     0,
598                     30*1000);
599                 ata_28bit_cmd(ataio, ATA_SET_MULTI, 0, 0, sectors);
600                 break;
601         }
602         case PROBE_INQUIRY:
603         {
604                 u_int bytecount;
605
606                 bytecount = 8192;       /* SATA maximum */
607                 /* Fetch user bytecount from SIM. */
608                 bzero(&cts, sizeof(cts));
609                 xpt_setup_ccb(&cts.ccb_h, path, CAM_PRIORITY_NONE);
610                 cts.ccb_h.func_code = XPT_GET_TRAN_SETTINGS;
611                 cts.type = CTS_TYPE_USER_SETTINGS;
612                 xpt_action((union ccb *)&cts);
613                 if (path->device->transport == XPORT_ATA) {
614                         if (cts.xport_specific.ata.valid & CTS_ATA_VALID_BYTECOUNT)
615                                 bytecount = cts.xport_specific.ata.bytecount;
616                 } else {
617                         if (cts.xport_specific.sata.valid & CTS_SATA_VALID_BYTECOUNT)
618                                 bytecount = cts.xport_specific.sata.bytecount;
619                 }
620                 /* Honor device capabilities. */
621                 bytecount &= ~1;
622                 bytecount = max(2, min(65534, bytecount));
623                 if (ident_buf->satacapabilities != 0x0000 &&
624                     ident_buf->satacapabilities != 0xffff) {
625                         bytecount = min(8192, bytecount);
626                 }
627                 /* Report bytecount to SIM. */
628                 bzero(&cts, sizeof(cts));
629                 xpt_setup_ccb(&cts.ccb_h, path, CAM_PRIORITY_NONE);
630                 cts.ccb_h.func_code = XPT_SET_TRAN_SETTINGS;
631                 cts.type = CTS_TYPE_CURRENT_SETTINGS;
632                 if (path->device->transport == XPORT_ATA) {
633                         cts.xport_specific.ata.bytecount = bytecount;
634                         cts.xport_specific.ata.valid = CTS_ATA_VALID_BYTECOUNT;
635                 } else {
636                         cts.xport_specific.sata.bytecount = bytecount;
637                         cts.xport_specific.sata.valid = CTS_SATA_VALID_BYTECOUNT;
638                 }
639                 xpt_action((union ccb *)&cts);
640                 /* FALLTHROUGH */
641         }
642         case PROBE_FULL_INQUIRY:
643         {
644                 u_int inquiry_len;
645                 struct scsi_inquiry_data *inq_buf =
646                     &path->device->inq_data;
647
648                 if (softc->action == PROBE_INQUIRY)
649                         inquiry_len = SHORT_INQUIRY_LENGTH;
650                 else
651                         inquiry_len = SID_ADDITIONAL_LENGTH(inq_buf);
652                 /*
653                  * Some parallel SCSI devices fail to send an
654                  * ignore wide residue message when dealing with
655                  * odd length inquiry requests.  Round up to be
656                  * safe.
657                  */
658                 inquiry_len = roundup2(inquiry_len, 2);
659                 scsi_inquiry(csio,
660                              /*retries*/1,
661                              aprobedone,
662                              MSG_SIMPLE_Q_TAG,
663                              (u_int8_t *)inq_buf,
664                              inquiry_len,
665                              /*evpd*/FALSE,
666                              /*page_code*/0,
667                              SSD_MIN_SIZE,
668                              /*timeout*/60 * 1000);
669                 break;
670         }
671         case PROBE_PM_PID:
672                 cam_fill_ataio(ataio,
673                       1,
674                       aprobedone,
675                       /*flags*/CAM_DIR_NONE,
676                       0,
677                       /*data_ptr*/NULL,
678                       /*dxfer_len*/0,
679                       10 * 1000);
680                 ata_pm_read_cmd(ataio, 0, 15);
681                 break;
682         case PROBE_PM_PRV:
683                 cam_fill_ataio(ataio,
684                       1,
685                       aprobedone,
686                       /*flags*/CAM_DIR_NONE,
687                       0,
688                       /*data_ptr*/NULL,
689                       /*dxfer_len*/0,
690                       10 * 1000);
691                 ata_pm_read_cmd(ataio, 1, 15);
692                 break;
693         case PROBE_IDENTIFY_SES:
694                 cam_fill_ataio(ataio,
695                       1,
696                       aprobedone,
697                       /*flags*/CAM_DIR_IN,
698                       0,
699                       /*data_ptr*/(u_int8_t *)&softc->ident_data,
700                       /*dxfer_len*/sizeof(softc->ident_data),
701                       30 * 1000);
702                 ata_28bit_cmd(ataio, ATA_SEP_ATTN, 0xEC, 0x02,
703                     sizeof(softc->ident_data) / 4);
704                 break;
705         case PROBE_IDENTIFY_SAFTE:
706                 cam_fill_ataio(ataio,
707                       1,
708                       aprobedone,
709                       /*flags*/CAM_DIR_IN,
710                       0,
711                       /*data_ptr*/(u_int8_t *)&softc->ident_data,
712                       /*dxfer_len*/sizeof(softc->ident_data),
713                       30 * 1000);
714                 ata_28bit_cmd(ataio, ATA_SEP_ATTN, 0xEC, 0x00,
715                     sizeof(softc->ident_data) / 4);
716                 break;
717         default:
718                 panic("aprobestart: invalid action state 0x%x\n", softc->action);
719         }
720         start_ccb->ccb_h.flags |= CAM_DEV_QFREEZE;
721         xpt_action(start_ccb);
722 }
723
724 static void
725 aproberequestdefaultnegotiation(struct cam_periph *periph)
726 {
727         struct ccb_trans_settings cts;
728
729         xpt_setup_ccb(&cts.ccb_h, periph->path, CAM_PRIORITY_NONE);
730         cts.ccb_h.func_code = XPT_GET_TRAN_SETTINGS;
731         cts.type = CTS_TYPE_USER_SETTINGS;
732         xpt_action((union ccb *)&cts);
733         if ((cts.ccb_h.status & CAM_STATUS_MASK) != CAM_REQ_CMP)
734                 return;
735         cts.xport_specific.valid = 0;
736         cts.ccb_h.func_code = XPT_SET_TRAN_SETTINGS;
737         cts.type = CTS_TYPE_CURRENT_SETTINGS;
738         xpt_action((union ccb *)&cts);
739 }
740
741 static void
742 aprobedone(struct cam_periph *periph, union ccb *done_ccb)
743 {
744         struct ccb_trans_settings cts;
745         struct ata_params *ident_buf;
746         struct scsi_inquiry_data *inq_buf;
747         probe_softc *softc;
748         struct cam_path *path;
749         cam_status status;
750         u_int32_t  priority;
751         u_int caps, oif;
752         int changed, found = 1;
753         static const uint8_t fake_device_id_hdr[8] =
754             {0, SVPD_DEVICE_ID, 0, 12,
755              SVPD_ID_CODESET_BINARY, SVPD_ID_TYPE_NAA, 0, 8};
756
757         CAM_DEBUG(done_ccb->ccb_h.path, CAM_DEBUG_TRACE, ("aprobedone\n"));
758
759         softc = (probe_softc *)periph->softc;
760         path = done_ccb->ccb_h.path;
761         priority = done_ccb->ccb_h.pinfo.priority;
762         ident_buf = &path->device->ident_data;
763         inq_buf = &path->device->inq_data;
764
765         if ((done_ccb->ccb_h.status & CAM_STATUS_MASK) != CAM_REQ_CMP) {
766                 if (cam_periph_error(done_ccb,
767                         0, softc->restart ? (SF_NO_RECOVERY | SF_NO_RETRY) : 0
768                     ) == ERESTART) {
769 out:
770                         /* Drop freeze taken due to CAM_DEV_QFREEZE flag set. */
771                         cam_release_devq(path, 0, 0, 0, FALSE);
772                         return;
773                 }
774                 if ((done_ccb->ccb_h.status & CAM_DEV_QFRZN) != 0) {
775                         /* Don't wedge the queue */
776                         xpt_release_devq(path, /*count*/1, /*run_queue*/TRUE);
777                 }
778                 status = done_ccb->ccb_h.status & CAM_STATUS_MASK;
779                 if (softc->restart) {
780                         softc->faults++;
781                         if ((done_ccb->ccb_h.status & CAM_STATUS_MASK) ==
782                             CAM_CMD_TIMEOUT)
783                                 softc->faults += 4;
784                         if (softc->faults < 10)
785                                 goto done;
786                         else
787                                 softc->restart = 0;
788
789                 /* Old PIO2 devices may not support mode setting. */
790                 } else if (softc->action == PROBE_SETMODE &&
791                     status == CAM_ATA_STATUS_ERROR &&
792                     ata_max_pmode(ident_buf) <= ATA_PIO2 &&
793                     (ident_buf->capabilities1 & ATA_SUPPORT_IORDY) == 0) {
794                         goto noerror;
795
796                 /*
797                  * Some old WD SATA disks report supported and enabled
798                  * device-initiated interface power management, but return
799                  * ABORT on attempt to disable it.
800                  */
801                 } else if (softc->action == PROBE_SETPM &&
802                     status == CAM_ATA_STATUS_ERROR) {
803                         goto noerror;
804
805                 /*
806                  * Some old WD SATA disks have broken SPINUP handling.
807                  * If we really fail to spin up the disk, then there will be
808                  * some media access errors later on, but at least we will
809                  * have a device to interact with for recovery attempts.
810                  */
811                 } else if (softc->action == PROBE_SPINUP &&
812                     status == CAM_ATA_STATUS_ERROR) {
813                         goto noerror;
814
815                 /*
816                  * Some HP SATA disks report supported DMA Auto-Activation,
817                  * but return ABORT on attempt to enable it.
818                  */
819                 } else if (softc->action == PROBE_SETDMAAA &&
820                     status == CAM_ATA_STATUS_ERROR) {
821                         goto noerror;
822
823                 /*
824                  * SES and SAF-TE SEPs have different IDENTIFY commands,
825                  * but SATA specification doesn't tell how to identify them.
826                  * Until better way found, just try another if first fail.
827                  */
828                 } else if (softc->action == PROBE_IDENTIFY_SES &&
829                     status == CAM_ATA_STATUS_ERROR) {
830                         PROBE_SET_ACTION(softc, PROBE_IDENTIFY_SAFTE);
831                         xpt_release_ccb(done_ccb);
832                         xpt_schedule(periph, priority);
833                         goto out;
834                 }
835
836                 /*
837                  * If we get to this point, we got an error status back
838                  * from the inquiry and the error status doesn't require
839                  * automatically retrying the command.  Therefore, the
840                  * inquiry failed.  If we had inquiry information before
841                  * for this device, but this latest inquiry command failed,
842                  * the device has probably gone away.  If this device isn't
843                  * already marked unconfigured, notify the peripheral
844                  * drivers that this device is no more.
845                  */
846 device_fail:    if ((path->device->flags & CAM_DEV_UNCONFIGURED) == 0)
847                         xpt_async(AC_LOST_DEVICE, path, NULL);
848                 PROBE_SET_ACTION(softc, PROBE_INVALID);
849                 found = 0;
850                 goto done;
851         }
852 noerror:
853         if (softc->restart)
854                 goto done;
855         switch (softc->action) {
856         case PROBE_RESET:
857         {
858                 int sign = (done_ccb->ataio.res.lba_high << 8) +
859                     done_ccb->ataio.res.lba_mid;
860                 CAM_DEBUG(path, CAM_DEBUG_PROBE,
861                     ("SIGNATURE: %04x\n", sign));
862                 if (sign == 0x0000 &&
863                     done_ccb->ccb_h.target_id != 15) {
864                         path->device->protocol = PROTO_ATA;
865                         PROBE_SET_ACTION(softc, PROBE_IDENTIFY);
866                 } else if (sign == 0x9669 &&
867                     done_ccb->ccb_h.target_id == 15) {
868                         /* Report SIM that PM is present. */
869                         bzero(&cts, sizeof(cts));
870                         xpt_setup_ccb(&cts.ccb_h, path, CAM_PRIORITY_NONE);
871                         cts.ccb_h.func_code = XPT_SET_TRAN_SETTINGS;
872                         cts.type = CTS_TYPE_CURRENT_SETTINGS;
873                         cts.xport_specific.sata.pm_present = 1;
874                         cts.xport_specific.sata.valid = CTS_SATA_VALID_PM;
875                         xpt_action((union ccb *)&cts);
876                         path->device->protocol = PROTO_SATAPM;
877                         PROBE_SET_ACTION(softc, PROBE_PM_PID);
878                 } else if (sign == 0xc33c &&
879                     done_ccb->ccb_h.target_id != 15) {
880                         path->device->protocol = PROTO_SEMB;
881                         PROBE_SET_ACTION(softc, PROBE_IDENTIFY_SES);
882                 } else if (sign == 0xeb14 &&
883                     done_ccb->ccb_h.target_id != 15) {
884                         path->device->protocol = PROTO_SCSI;
885                         PROBE_SET_ACTION(softc, PROBE_IDENTIFY);
886                 } else {
887                         if (done_ccb->ccb_h.target_id != 15) {
888                                 xpt_print(path,
889                                     "Unexpected signature 0x%04x\n", sign);
890                         }
891                         goto device_fail;
892                 }
893                 xpt_release_ccb(done_ccb);
894                 xpt_schedule(periph, priority);
895                 goto out;
896         }
897         case PROBE_IDENTIFY:
898         {
899                 struct ccb_pathinq cpi;
900                 int veto = 0;
901
902                 /*
903                  * Convert to host byte order, and fix the strings.
904                  */
905                 ident_buf = &softc->ident_data;
906                 ata_param_fixup(ident_buf);
907
908                 /*
909                  * Allow others to veto this ATA disk attachment.  This
910                  * is mainly used by VMs, whose disk controllers may
911                  * share the disks with the simulated ATA controllers.
912                  */
913                 EVENTHANDLER_INVOKE(ada_probe_veto, path, ident_buf, &veto);
914                 if (veto) {
915                         goto device_fail;
916                 }
917
918                 /* Device may need spin-up before IDENTIFY become valid. */
919                 if ((ident_buf->specconf == 0x37c8 ||
920                      ident_buf->specconf == 0x738c) &&
921                     ((ident_buf->config & ATA_RESP_INCOMPLETE) ||
922                      softc->spinup == 0)) {
923                         PROBE_SET_ACTION(softc, PROBE_SPINUP);
924                         xpt_release_ccb(done_ccb);
925                         xpt_schedule(periph, priority);
926                         goto out;
927                 }
928                 ident_buf = &path->device->ident_data;
929
930                 /* Check that it is the same device as we know. */
931                 if ((periph->path->device->flags & CAM_DEV_UNCONFIGURED) == 0) {
932                         if (bcmp(softc->ident_data.model, ident_buf->model,
933                              sizeof(ident_buf->model)) ||
934                             bcmp(softc->ident_data.serial, ident_buf->serial,
935                              sizeof(ident_buf->serial))) {
936                                 /* The device was replaced. */
937                                 changed = 2;
938                                 xpt_async(AC_LOST_DEVICE, path, NULL);
939                         } else if (bcmp(&softc->ident_data, ident_buf,
940                              sizeof(*ident_buf))) {
941                                 /* The device is the same, but has changed. */
942                                 changed = 1;
943                         } else {
944                                 /* Nothing has changed. */
945                                 changed = 0;
946                         }
947                 } else {
948                         /* This is a new device. */
949                         changed = 2;
950                 }
951
952                 if (changed != 0)
953                         bcopy(&softc->ident_data, ident_buf, sizeof(struct ata_params));
954                 if (changed == 2) {
955                         /* Clean up from previous instance of this device */
956                         if (path->device->serial_num != NULL) {
957                                 free(path->device->serial_num, M_CAMXPT);
958                                 path->device->serial_num = NULL;
959                                 path->device->serial_num_len = 0;
960                         }
961                         if (path->device->device_id != NULL) {
962                                 free(path->device->device_id, M_CAMXPT);
963                                 path->device->device_id = NULL;
964                                 path->device->device_id_len = 0;
965                         }
966                         path->device->serial_num =
967                                 (u_int8_t *)malloc((sizeof(ident_buf->serial) + 1),
968                                            M_CAMXPT, M_NOWAIT);
969                         if (path->device->serial_num != NULL) {
970                                 bcopy(ident_buf->serial,
971                                       path->device->serial_num,
972                                       sizeof(ident_buf->serial));
973                                 path->device->serial_num[sizeof(ident_buf->serial)]
974                                     = '\0';
975                                 path->device->serial_num_len =
976                                     strlen(path->device->serial_num);
977                         }
978                         if (ident_buf->enabled.extension &
979                             ATA_SUPPORT_64BITWWN) {
980                                 path->device->device_id =
981                                     malloc(16, M_CAMXPT, M_NOWAIT);
982                                 if (path->device->device_id != NULL) {
983                                         path->device->device_id_len = 16;
984                                         bcopy(&fake_device_id_hdr,
985                                             path->device->device_id, 8);
986                                         bcopy(ident_buf->wwn,
987                                             path->device->device_id + 8, 8);
988                                         ata_bswap(path->device->device_id + 8, 8);
989                                 }
990                         }
991                         path->device->flags |= CAM_DEV_IDENTIFY_DATA_VALID;
992                 }
993                 if (changed == 1)
994                         xpt_async(AC_GETDEV_CHANGED, path, NULL);
995                 if (ident_buf->satacapabilities & ATA_SUPPORT_NCQ) {
996                         path->device->mintags = 2;
997                         path->device->maxtags =
998                             ATA_QUEUE_LEN(ident_buf->queue) + 1;
999                 }
1000                 ata_find_quirk(path->device);
1001                 if (path->device->mintags != 0 &&
1002                     path->bus->sim->max_tagged_dev_openings != 0) {
1003                         /* Check if the SIM does not want queued commands. */
1004                         xpt_path_inq(&cpi, path);
1005                         if (cpi.ccb_h.status == CAM_REQ_CMP &&
1006                             (cpi.hba_inquiry & PI_TAG_ABLE)) {
1007                                 /* Report SIM which tags are allowed. */
1008                                 bzero(&cts, sizeof(cts));
1009                                 xpt_setup_ccb(&cts.ccb_h, path, CAM_PRIORITY_NONE);
1010                                 cts.ccb_h.func_code = XPT_SET_TRAN_SETTINGS;
1011                                 cts.type = CTS_TYPE_CURRENT_SETTINGS;
1012                                 cts.xport_specific.sata.tags = path->device->maxtags;
1013                                 cts.xport_specific.sata.valid = CTS_SATA_VALID_TAGS;
1014                                 xpt_action((union ccb *)&cts);
1015                         }
1016                 }
1017                 ata_device_transport(path);
1018                 if (changed == 2)
1019                         aproberequestdefaultnegotiation(periph);
1020                 PROBE_SET_ACTION(softc, PROBE_SETMODE);
1021                 xpt_release_ccb(done_ccb);
1022                 xpt_schedule(periph, priority);
1023                 goto out;
1024         }
1025         case PROBE_SPINUP:
1026                 if (bootverbose)
1027                         xpt_print(path, "Spin-up done\n");
1028                 softc->spinup = 1;
1029                 PROBE_SET_ACTION(softc, PROBE_IDENTIFY);
1030                 xpt_release_ccb(done_ccb);
1031                 xpt_schedule(periph, priority);
1032                 goto out;
1033         case PROBE_SETMODE:
1034                 /* Set supported bits. */
1035                 bzero(&cts, sizeof(cts));
1036                 xpt_setup_ccb(&cts.ccb_h, path, CAM_PRIORITY_NONE);
1037                 cts.ccb_h.func_code = XPT_GET_TRAN_SETTINGS;
1038                 cts.type = CTS_TYPE_CURRENT_SETTINGS;
1039                 xpt_action((union ccb *)&cts);
1040                 if (path->device->transport == XPORT_SATA &&
1041                     cts.xport_specific.sata.valid & CTS_SATA_VALID_CAPS)
1042                         caps = cts.xport_specific.sata.caps & CTS_SATA_CAPS_H;
1043                 else if (path->device->transport == XPORT_ATA &&
1044                     cts.xport_specific.ata.valid & CTS_ATA_VALID_CAPS)
1045                         caps = cts.xport_specific.ata.caps & CTS_ATA_CAPS_H;
1046                 else
1047                         caps = 0;
1048                 if (path->device->transport == XPORT_SATA &&
1049                     ident_buf->satacapabilities != 0xffff) {
1050                         if (ident_buf->satacapabilities & ATA_SUPPORT_IFPWRMNGTRCV)
1051                                 caps |= CTS_SATA_CAPS_D_PMREQ;
1052                         if (ident_buf->satacapabilities & ATA_SUPPORT_HAPST)
1053                                 caps |= CTS_SATA_CAPS_D_APST;
1054                 }
1055                 /* Mask unwanted bits. */
1056                 bzero(&cts, sizeof(cts));
1057                 xpt_setup_ccb(&cts.ccb_h, path, CAM_PRIORITY_NONE);
1058                 cts.ccb_h.func_code = XPT_GET_TRAN_SETTINGS;
1059                 cts.type = CTS_TYPE_USER_SETTINGS;
1060                 xpt_action((union ccb *)&cts);
1061                 if (path->device->transport == XPORT_SATA &&
1062                     cts.xport_specific.sata.valid & CTS_SATA_VALID_CAPS)
1063                         caps &= cts.xport_specific.sata.caps;
1064                 else if (path->device->transport == XPORT_ATA &&
1065                     cts.xport_specific.ata.valid & CTS_ATA_VALID_CAPS)
1066                         caps &= cts.xport_specific.ata.caps;
1067                 else
1068                         caps = 0;
1069                 /*
1070                  * Remember what transport thinks about 48-bit DMA.  If
1071                  * capability information is not provided or transport is
1072                  * SATA, we take support for granted.
1073                  */
1074                 oif = path->device->inq_flags;
1075                 if (!(path->device->inq_flags & SID_DMA) ||
1076                     (path->device->transport == XPORT_ATA &&
1077                     (cts.xport_specific.ata.valid & CTS_ATA_VALID_CAPS) &&
1078                     !(caps & CTS_ATA_CAPS_H_DMA48)))
1079                         path->device->inq_flags &= ~SID_DMA48;
1080                 else
1081                         path->device->inq_flags |= SID_DMA48;
1082                 if (path->device->inq_flags != oif)
1083                         xpt_async(AC_GETDEV_CHANGED, path, NULL);
1084                 /* Store result to SIM. */
1085                 bzero(&cts, sizeof(cts));
1086                 xpt_setup_ccb(&cts.ccb_h, path, CAM_PRIORITY_NONE);
1087                 cts.ccb_h.func_code = XPT_SET_TRAN_SETTINGS;
1088                 cts.type = CTS_TYPE_CURRENT_SETTINGS;
1089                 if (path->device->transport == XPORT_SATA) {
1090                         cts.xport_specific.sata.caps = caps;
1091                         cts.xport_specific.sata.valid = CTS_SATA_VALID_CAPS;
1092                 } else {
1093                         cts.xport_specific.ata.caps = caps;
1094                         cts.xport_specific.ata.valid = CTS_ATA_VALID_CAPS;
1095                 }
1096                 xpt_action((union ccb *)&cts);
1097                 softc->caps = caps;
1098                 if (path->device->transport != XPORT_SATA)
1099                         goto notsata;
1100                 if ((ident_buf->satasupport & ATA_SUPPORT_IFPWRMNGT) &&
1101                     (!(softc->caps & CTS_SATA_CAPS_H_PMREQ)) !=
1102                     (!(ident_buf->sataenabled & ATA_SUPPORT_IFPWRMNGT))) {
1103                         PROBE_SET_ACTION(softc, PROBE_SETPM);
1104                         xpt_release_ccb(done_ccb);
1105                         xpt_schedule(periph, priority);
1106                         goto out;
1107                 }
1108                 /* FALLTHROUGH */
1109         case PROBE_SETPM:
1110                 if (ident_buf->satacapabilities != 0xffff &&
1111                     (ident_buf->satacapabilities & ATA_SUPPORT_DAPST) &&
1112                     (!(softc->caps & CTS_SATA_CAPS_H_APST)) !=
1113                     (!(ident_buf->sataenabled & ATA_ENABLED_DAPST))) {
1114                         PROBE_SET_ACTION(softc, PROBE_SETAPST);
1115                         xpt_release_ccb(done_ccb);
1116                         xpt_schedule(periph, priority);
1117                         goto out;
1118                 }
1119                 /* FALLTHROUGH */
1120         case PROBE_SETAPST:
1121                 if ((ident_buf->satasupport & ATA_SUPPORT_AUTOACTIVATE) &&
1122                     (!(softc->caps & CTS_SATA_CAPS_H_DMAAA)) !=
1123                     (!(ident_buf->sataenabled & ATA_SUPPORT_AUTOACTIVATE))) {
1124                         PROBE_SET_ACTION(softc, PROBE_SETDMAAA);
1125                         xpt_release_ccb(done_ccb);
1126                         xpt_schedule(periph, priority);
1127                         goto out;
1128                 }
1129                 /* FALLTHROUGH */
1130         case PROBE_SETDMAAA:
1131                 if (path->device->protocol != PROTO_ATA &&
1132                     (ident_buf->satasupport & ATA_SUPPORT_ASYNCNOTIF) &&
1133                     (!(softc->caps & CTS_SATA_CAPS_H_AN)) !=
1134                     (!(ident_buf->sataenabled & ATA_SUPPORT_ASYNCNOTIF))) {
1135                         PROBE_SET_ACTION(softc, PROBE_SETAN);
1136                         xpt_release_ccb(done_ccb);
1137                         xpt_schedule(periph, priority);
1138                         goto out;
1139                 }
1140                 /* FALLTHROUGH */
1141         case PROBE_SETAN:
1142 notsata:
1143                 if (path->device->protocol == PROTO_ATA) {
1144                         PROBE_SET_ACTION(softc, PROBE_SET_MULTI);
1145                 } else {
1146                         PROBE_SET_ACTION(softc, PROBE_INQUIRY);
1147                 }
1148                 xpt_release_ccb(done_ccb);
1149                 xpt_schedule(periph, priority);
1150                 goto out;
1151         case PROBE_SET_MULTI:
1152                 if (periph->path->device->flags & CAM_DEV_UNCONFIGURED) {
1153                         path->device->flags &= ~CAM_DEV_UNCONFIGURED;
1154                         xpt_acquire_device(path->device);
1155                         done_ccb->ccb_h.func_code = XPT_GDEV_TYPE;
1156                         xpt_action(done_ccb);
1157                         xpt_async(AC_FOUND_DEVICE, path, done_ccb);
1158                 }
1159                 PROBE_SET_ACTION(softc, PROBE_DONE);
1160                 break;
1161         case PROBE_INQUIRY:
1162         case PROBE_FULL_INQUIRY:
1163         {
1164                 u_int8_t periph_qual, len;
1165
1166                 path->device->flags |= CAM_DEV_INQUIRY_DATA_VALID;
1167
1168                 periph_qual = SID_QUAL(inq_buf);
1169
1170                 if (periph_qual != SID_QUAL_LU_CONNECTED &&
1171                     periph_qual != SID_QUAL_LU_OFFLINE)
1172                         break;
1173
1174                 /*
1175                  * We conservatively request only
1176                  * SHORT_INQUIRY_LEN bytes of inquiry
1177                  * information during our first try
1178                  * at sending an INQUIRY. If the device
1179                  * has more information to give,
1180                  * perform a second request specifying
1181                  * the amount of information the device
1182                  * is willing to give.
1183                  */
1184                 len = inq_buf->additional_length
1185                     + offsetof(struct scsi_inquiry_data, additional_length) + 1;
1186                 if (softc->action == PROBE_INQUIRY
1187                     && len > SHORT_INQUIRY_LENGTH) {
1188                         PROBE_SET_ACTION(softc, PROBE_FULL_INQUIRY);
1189                         xpt_release_ccb(done_ccb);
1190                         xpt_schedule(periph, priority);
1191                         goto out;
1192                 }
1193
1194                 ata_device_transport(path);
1195                 if (periph->path->device->flags & CAM_DEV_UNCONFIGURED) {
1196                         path->device->flags &= ~CAM_DEV_UNCONFIGURED;
1197                         xpt_acquire_device(path->device);
1198                         done_ccb->ccb_h.func_code = XPT_GDEV_TYPE;
1199                         xpt_action(done_ccb);
1200                         xpt_async(AC_FOUND_DEVICE, path, done_ccb);
1201                 }
1202                 PROBE_SET_ACTION(softc, PROBE_DONE);
1203                 break;
1204         }
1205         case PROBE_PM_PID:
1206                 if ((path->device->flags & CAM_DEV_IDENTIFY_DATA_VALID) == 0)
1207                         bzero(ident_buf, sizeof(*ident_buf));
1208                 softc->pm_pid = (done_ccb->ataio.res.lba_high << 24) +
1209                     (done_ccb->ataio.res.lba_mid << 16) +
1210                     (done_ccb->ataio.res.lba_low << 8) +
1211                     done_ccb->ataio.res.sector_count;
1212                 ((uint32_t *)ident_buf)[0] = softc->pm_pid;
1213                 snprintf(ident_buf->model, sizeof(ident_buf->model),
1214                     "Port Multiplier %08x", softc->pm_pid);
1215                 PROBE_SET_ACTION(softc, PROBE_PM_PRV);
1216                 xpt_release_ccb(done_ccb);
1217                 xpt_schedule(periph, priority);
1218                 goto out;
1219         case PROBE_PM_PRV:
1220                 softc->pm_prv = (done_ccb->ataio.res.lba_high << 24) +
1221                     (done_ccb->ataio.res.lba_mid << 16) +
1222                     (done_ccb->ataio.res.lba_low << 8) +
1223                     done_ccb->ataio.res.sector_count;
1224                 ((uint32_t *)ident_buf)[1] = softc->pm_prv;
1225                 snprintf(ident_buf->revision, sizeof(ident_buf->revision),
1226                     "%04x", softc->pm_prv);
1227                 path->device->flags |= CAM_DEV_IDENTIFY_DATA_VALID;
1228                 ata_device_transport(path);
1229                 if (periph->path->device->flags & CAM_DEV_UNCONFIGURED)
1230                         aproberequestdefaultnegotiation(periph);
1231                 /* Set supported bits. */
1232                 bzero(&cts, sizeof(cts));
1233                 xpt_setup_ccb(&cts.ccb_h, path, CAM_PRIORITY_NONE);
1234                 cts.ccb_h.func_code = XPT_GET_TRAN_SETTINGS;
1235                 cts.type = CTS_TYPE_CURRENT_SETTINGS;
1236                 xpt_action((union ccb *)&cts);
1237                 if (cts.xport_specific.sata.valid & CTS_SATA_VALID_CAPS)
1238                         caps = cts.xport_specific.sata.caps & CTS_SATA_CAPS_H;
1239                 else
1240                         caps = 0;
1241                 /* All PMPs must support PM requests. */
1242                 caps |= CTS_SATA_CAPS_D_PMREQ;
1243                 /* Mask unwanted bits. */
1244                 bzero(&cts, sizeof(cts));
1245                 xpt_setup_ccb(&cts.ccb_h, path, CAM_PRIORITY_NONE);
1246                 cts.ccb_h.func_code = XPT_GET_TRAN_SETTINGS;
1247                 cts.type = CTS_TYPE_USER_SETTINGS;
1248                 xpt_action((union ccb *)&cts);
1249                 if (cts.xport_specific.sata.valid & CTS_SATA_VALID_CAPS)
1250                         caps &= cts.xport_specific.sata.caps;
1251                 else
1252                         caps = 0;
1253                 /* Remember what transport thinks about AEN. */
1254                 oif = path->device->inq_flags;
1255                 if ((caps & CTS_SATA_CAPS_H_AN) && path->device->protocol != PROTO_ATA)
1256                         path->device->inq_flags |= SID_AEN;
1257                 else
1258                         path->device->inq_flags &= ~SID_AEN;
1259                 /* Store result to SIM. */
1260                 bzero(&cts, sizeof(cts));
1261                 xpt_setup_ccb(&cts.ccb_h, path, CAM_PRIORITY_NONE);
1262                 cts.ccb_h.func_code = XPT_SET_TRAN_SETTINGS;
1263                 cts.type = CTS_TYPE_CURRENT_SETTINGS;
1264                 cts.xport_specific.sata.caps = caps;
1265                 cts.xport_specific.sata.valid = CTS_SATA_VALID_CAPS;
1266                 xpt_action((union ccb *)&cts);
1267                 softc->caps = caps;
1268                 if (periph->path->device->flags & CAM_DEV_UNCONFIGURED) {
1269                         path->device->flags &= ~CAM_DEV_UNCONFIGURED;
1270                         xpt_acquire_device(path->device);
1271                         done_ccb->ccb_h.func_code = XPT_GDEV_TYPE;
1272                         xpt_action(done_ccb);
1273                         xpt_async(AC_FOUND_DEVICE, path, done_ccb);
1274                 } else {
1275                         if (path->device->inq_flags != oif)
1276                                 xpt_async(AC_GETDEV_CHANGED, path, NULL);
1277                         done_ccb->ccb_h.func_code = XPT_GDEV_TYPE;
1278                         xpt_action(done_ccb);
1279                         xpt_async(AC_SCSI_AEN, path, done_ccb);
1280                 }
1281                 PROBE_SET_ACTION(softc, PROBE_DONE);
1282                 break;
1283         case PROBE_IDENTIFY_SES:
1284         case PROBE_IDENTIFY_SAFTE:
1285                 if ((periph->path->device->flags & CAM_DEV_UNCONFIGURED) == 0) {
1286                         /* Check that it is the same device. */
1287                         if (bcmp(&softc->ident_data, ident_buf, 53)) {
1288                                 /* Device changed. */
1289                                 changed = 2;
1290                                 xpt_async(AC_LOST_DEVICE, path, NULL);
1291                         } else {
1292                                 bcopy(&softc->ident_data, ident_buf, sizeof(struct ata_params));
1293                                 changed = 0;
1294                         }
1295                 } else
1296                         changed = 2;
1297                 if (changed) {
1298                         bcopy(&softc->ident_data, ident_buf, sizeof(struct ata_params));
1299                         /* Clean up from previous instance of this device */
1300                         if (path->device->device_id != NULL) {
1301                                 free(path->device->device_id, M_CAMXPT);
1302                                 path->device->device_id = NULL;
1303                                 path->device->device_id_len = 0;
1304                         }
1305                         path->device->device_id =
1306                             malloc(16, M_CAMXPT, M_NOWAIT);
1307                         if (path->device->device_id != NULL) {
1308                                 path->device->device_id_len = 16;
1309                                 bcopy(&fake_device_id_hdr,
1310                                     path->device->device_id, 8);
1311                                 bcopy(((uint8_t*)ident_buf) + 2,
1312                                     path->device->device_id + 8, 8);
1313                         }
1314
1315                         path->device->flags |= CAM_DEV_IDENTIFY_DATA_VALID;
1316                 }
1317                 ata_device_transport(path);
1318                 if (changed)
1319                         aproberequestdefaultnegotiation(periph);
1320
1321                 if (periph->path->device->flags & CAM_DEV_UNCONFIGURED) {
1322                         path->device->flags &= ~CAM_DEV_UNCONFIGURED;
1323                         xpt_acquire_device(path->device);
1324                         done_ccb->ccb_h.func_code = XPT_GDEV_TYPE;
1325                         xpt_action(done_ccb);
1326                         xpt_async(AC_FOUND_DEVICE, path, done_ccb);
1327                 }
1328                 PROBE_SET_ACTION(softc, PROBE_DONE);
1329                 break;
1330         default:
1331                 panic("aprobedone: invalid action state 0x%x\n", softc->action);
1332         }
1333 done:
1334         if (softc->restart) {
1335                 softc->restart = 0;
1336                 xpt_release_ccb(done_ccb);
1337                 aprobeschedule(periph);
1338                 goto out;
1339         }
1340         xpt_release_ccb(done_ccb);
1341         CAM_DEBUG(periph->path, CAM_DEBUG_PROBE, ("Probe completed\n"));
1342         while ((done_ccb = (union ccb *)TAILQ_FIRST(&softc->request_ccbs))) {
1343                 TAILQ_REMOVE(&softc->request_ccbs,
1344                     &done_ccb->ccb_h, periph_links.tqe);
1345                 done_ccb->ccb_h.status = found ? CAM_REQ_CMP : CAM_REQ_CMP_ERR;
1346                 xpt_done(done_ccb);
1347         }
1348         /* Drop freeze taken due to CAM_DEV_QFREEZE flag set. */
1349         cam_release_devq(path, 0, 0, 0, FALSE);
1350         cam_periph_invalidate(periph);
1351         cam_periph_release_locked(periph);
1352 }
1353
1354 static void
1355 aprobecleanup(struct cam_periph *periph)
1356 {
1357         free(periph->softc, M_CAMXPT);
1358 }
1359
1360 static void
1361 ata_find_quirk(struct cam_ed *device)
1362 {
1363         struct ata_quirk_entry *quirk;
1364         caddr_t match;
1365
1366         match = cam_quirkmatch((caddr_t)&device->ident_data,
1367                                (caddr_t)ata_quirk_table,
1368                                nitems(ata_quirk_table),
1369                                sizeof(*ata_quirk_table), ata_identify_match);
1370
1371         if (match == NULL)
1372                 panic("xpt_find_quirk: device didn't match wildcard entry!!");
1373
1374         quirk = (struct ata_quirk_entry *)match;
1375         device->quirk = quirk;
1376         if (quirk->quirks & CAM_QUIRK_MAXTAGS) {
1377                 device->mintags = quirk->mintags;
1378                 device->maxtags = quirk->maxtags;
1379         }
1380 }
1381
1382 typedef struct {
1383         union   ccb *request_ccb;
1384         struct  ccb_pathinq *cpi;
1385         int     counter;
1386 } ata_scan_bus_info;
1387
1388 /*
1389  * To start a scan, request_ccb is an XPT_SCAN_BUS ccb.
1390  * As the scan progresses, xpt_scan_bus is used as the
1391  * callback on completion function.
1392  */
1393 static void
1394 ata_scan_bus(struct cam_periph *periph, union ccb *request_ccb)
1395 {
1396         struct  cam_path *path;
1397         ata_scan_bus_info *scan_info;
1398         union   ccb *work_ccb, *reset_ccb;
1399         struct mtx *mtx;
1400         cam_status status;
1401
1402         CAM_DEBUG(request_ccb->ccb_h.path, CAM_DEBUG_TRACE,
1403                   ("xpt_scan_bus\n"));
1404         switch (request_ccb->ccb_h.func_code) {
1405         case XPT_SCAN_BUS:
1406         case XPT_SCAN_TGT:
1407                 /* Find out the characteristics of the bus */
1408                 work_ccb = xpt_alloc_ccb_nowait();
1409                 if (work_ccb == NULL) {
1410                         request_ccb->ccb_h.status = CAM_RESRC_UNAVAIL;
1411                         xpt_done(request_ccb);
1412                         return;
1413                 }
1414                 xpt_path_inq(&work_ccb->cpi, request_ccb->ccb_h.path);
1415                 if (work_ccb->ccb_h.status != CAM_REQ_CMP) {
1416                         request_ccb->ccb_h.status = work_ccb->ccb_h.status;
1417                         xpt_free_ccb(work_ccb);
1418                         xpt_done(request_ccb);
1419                         return;
1420                 }
1421
1422                 /* We may need to reset bus first, if we haven't done it yet. */
1423                 if ((work_ccb->cpi.hba_inquiry &
1424                     (PI_WIDE_32|PI_WIDE_16|PI_SDTR_ABLE)) &&
1425                     !(work_ccb->cpi.hba_misc & PIM_NOBUSRESET) &&
1426                     !timevalisset(&request_ccb->ccb_h.path->bus->last_reset)) {
1427                         reset_ccb = xpt_alloc_ccb_nowait();
1428                         if (reset_ccb == NULL) {
1429                                 request_ccb->ccb_h.status = CAM_RESRC_UNAVAIL;
1430                                 xpt_free_ccb(work_ccb);
1431                                 xpt_done(request_ccb);
1432                                 return;
1433                         }
1434                         xpt_setup_ccb(&reset_ccb->ccb_h, request_ccb->ccb_h.path,
1435                               CAM_PRIORITY_NONE);
1436                         reset_ccb->ccb_h.func_code = XPT_RESET_BUS;
1437                         xpt_action(reset_ccb);
1438                         if (reset_ccb->ccb_h.status != CAM_REQ_CMP) {
1439                                 request_ccb->ccb_h.status = reset_ccb->ccb_h.status;
1440                                 xpt_free_ccb(reset_ccb);
1441                                 xpt_free_ccb(work_ccb);
1442                                 xpt_done(request_ccb);
1443                                 return;
1444                         }
1445                         xpt_free_ccb(reset_ccb);
1446                 }
1447
1448                 /* Save some state for use while we probe for devices */
1449                 scan_info = (ata_scan_bus_info *)
1450                     malloc(sizeof(ata_scan_bus_info), M_CAMXPT, M_NOWAIT);
1451                 if (scan_info == NULL) {
1452                         request_ccb->ccb_h.status = CAM_RESRC_UNAVAIL;
1453                         xpt_free_ccb(work_ccb);
1454                         xpt_done(request_ccb);
1455                         return;
1456                 }
1457                 scan_info->request_ccb = request_ccb;
1458                 scan_info->cpi = &work_ccb->cpi;
1459                 /* If PM supported, probe it first. */
1460                 if (scan_info->cpi->hba_inquiry & PI_SATAPM)
1461                         scan_info->counter = scan_info->cpi->max_target;
1462                 else
1463                         scan_info->counter = 0;
1464
1465                 work_ccb = xpt_alloc_ccb_nowait();
1466                 if (work_ccb == NULL) {
1467                         free(scan_info, M_CAMXPT);
1468                         request_ccb->ccb_h.status = CAM_RESRC_UNAVAIL;
1469                         xpt_done(request_ccb);
1470                         break;
1471                 }
1472                 mtx = xpt_path_mtx(scan_info->request_ccb->ccb_h.path);
1473                 goto scan_next;
1474         case XPT_SCAN_LUN:
1475                 work_ccb = request_ccb;
1476                 /* Reuse the same CCB to query if a device was really found */
1477                 scan_info = (ata_scan_bus_info *)work_ccb->ccb_h.ppriv_ptr0;
1478                 mtx = xpt_path_mtx(scan_info->request_ccb->ccb_h.path);
1479                 mtx_lock(mtx);
1480                 /* If there is PMP... */
1481                 if ((scan_info->cpi->hba_inquiry & PI_SATAPM) &&
1482                     (scan_info->counter == scan_info->cpi->max_target)) {
1483                         if (work_ccb->ccb_h.status == CAM_REQ_CMP) {
1484                                 /* everything else will be probed by it */
1485                                 /* Free the current request path- we're done with it. */
1486                                 xpt_free_path(work_ccb->ccb_h.path);
1487                                 goto done;
1488                         } else {
1489                                 struct ccb_trans_settings cts;
1490
1491                                 /* Report SIM that PM is absent. */
1492                                 bzero(&cts, sizeof(cts));
1493                                 xpt_setup_ccb(&cts.ccb_h,
1494                                     work_ccb->ccb_h.path, CAM_PRIORITY_NONE);
1495                                 cts.ccb_h.func_code = XPT_SET_TRAN_SETTINGS;
1496                                 cts.type = CTS_TYPE_CURRENT_SETTINGS;
1497                                 cts.xport_specific.sata.pm_present = 0;
1498                                 cts.xport_specific.sata.valid = CTS_SATA_VALID_PM;
1499                                 xpt_action((union ccb *)&cts);
1500                         }
1501                 }
1502                 /* Free the current request path- we're done with it. */
1503                 xpt_free_path(work_ccb->ccb_h.path);
1504                 if (scan_info->counter ==
1505                     ((scan_info->cpi->hba_inquiry & PI_SATAPM) ?
1506                     0 : scan_info->cpi->max_target)) {
1507 done:
1508                         mtx_unlock(mtx);
1509                         xpt_free_ccb(work_ccb);
1510                         xpt_free_ccb((union ccb *)scan_info->cpi);
1511                         request_ccb = scan_info->request_ccb;
1512                         free(scan_info, M_CAMXPT);
1513                         request_ccb->ccb_h.status = CAM_REQ_CMP;
1514                         xpt_done(request_ccb);
1515                         break;
1516                 }
1517                 /* Take next device. Wrap from max (PMP) to 0. */
1518                 scan_info->counter = (scan_info->counter + 1 ) %
1519                     (scan_info->cpi->max_target + 1);
1520 scan_next:
1521                 status = xpt_create_path(&path, NULL,
1522                     scan_info->request_ccb->ccb_h.path_id,
1523                     scan_info->counter, 0);
1524                 if (status != CAM_REQ_CMP) {
1525                         if (request_ccb->ccb_h.func_code == XPT_SCAN_LUN)
1526                                 mtx_unlock(mtx);
1527                         printf("xpt_scan_bus: xpt_create_path failed"
1528                             " with status %#x, bus scan halted\n",
1529                             status);
1530                         xpt_free_ccb(work_ccb);
1531                         xpt_free_ccb((union ccb *)scan_info->cpi);
1532                         request_ccb = scan_info->request_ccb;
1533                         free(scan_info, M_CAMXPT);
1534                         request_ccb->ccb_h.status = status;
1535                         xpt_done(request_ccb);
1536                         break;
1537                 }
1538                 xpt_setup_ccb(&work_ccb->ccb_h, path,
1539                     scan_info->request_ccb->ccb_h.pinfo.priority);
1540                 work_ccb->ccb_h.func_code = XPT_SCAN_LUN;
1541                 work_ccb->ccb_h.cbfcnp = ata_scan_bus;
1542                 work_ccb->ccb_h.flags |= CAM_UNLOCKED;
1543                 work_ccb->ccb_h.ppriv_ptr0 = scan_info;
1544                 work_ccb->crcn.flags = scan_info->request_ccb->crcn.flags;
1545                 mtx_unlock(mtx);
1546                 if (request_ccb->ccb_h.func_code == XPT_SCAN_LUN)
1547                         mtx = NULL;
1548                 xpt_action(work_ccb);
1549                 if (mtx != NULL)
1550                         mtx_lock(mtx);
1551                 break;
1552         default:
1553                 break;
1554         }
1555 }
1556
1557 static void
1558 ata_scan_lun(struct cam_periph *periph, struct cam_path *path,
1559              cam_flags flags, union ccb *request_ccb)
1560 {
1561         struct ccb_pathinq cpi;
1562         cam_status status;
1563         struct cam_path *new_path;
1564         struct cam_periph *old_periph;
1565         int lock;
1566
1567         CAM_DEBUG(path, CAM_DEBUG_TRACE, ("xpt_scan_lun\n"));
1568
1569         xpt_path_inq(&cpi, path);
1570         if (cpi.ccb_h.status != CAM_REQ_CMP) {
1571                 if (request_ccb != NULL) {
1572                         request_ccb->ccb_h.status = cpi.ccb_h.status;
1573                         xpt_done(request_ccb);
1574                 }
1575                 return;
1576         }
1577
1578         if (request_ccb == NULL) {
1579                 request_ccb = xpt_alloc_ccb_nowait();
1580                 if (request_ccb == NULL) {
1581                         xpt_print(path, "xpt_scan_lun: can't allocate CCB, "
1582                             "can't continue\n");
1583                         return;
1584                 }
1585                 status = xpt_create_path(&new_path, NULL,
1586                                           path->bus->path_id,
1587                                           path->target->target_id,
1588                                           path->device->lun_id);
1589                 if (status != CAM_REQ_CMP) {
1590                         xpt_print(path, "xpt_scan_lun: can't create path, "
1591                             "can't continue\n");
1592                         xpt_free_ccb(request_ccb);
1593                         return;
1594                 }
1595                 xpt_setup_ccb(&request_ccb->ccb_h, new_path, CAM_PRIORITY_XPT);
1596                 request_ccb->ccb_h.cbfcnp = axptscandone;
1597                 request_ccb->ccb_h.flags |= CAM_UNLOCKED;
1598                 request_ccb->ccb_h.func_code = XPT_SCAN_LUN;
1599                 request_ccb->crcn.flags = flags;
1600         }
1601
1602         lock = (xpt_path_owned(path) == 0);
1603         if (lock)
1604                 xpt_path_lock(path);
1605         if ((old_periph = cam_periph_find(path, "aprobe")) != NULL) {
1606                 if ((old_periph->flags & CAM_PERIPH_INVALID) == 0) {
1607                         probe_softc *softc;
1608
1609                         softc = (probe_softc *)old_periph->softc;
1610                         TAILQ_INSERT_TAIL(&softc->request_ccbs,
1611                                 &request_ccb->ccb_h, periph_links.tqe);
1612                         softc->restart = 1;
1613                 } else {
1614                         request_ccb->ccb_h.status = CAM_REQ_CMP_ERR;
1615                         xpt_done(request_ccb);
1616                 }
1617         } else {
1618                 status = cam_periph_alloc(aproberegister, NULL, aprobecleanup,
1619                                           aprobestart, "aprobe",
1620                                           CAM_PERIPH_BIO,
1621                                           request_ccb->ccb_h.path, NULL, 0,
1622                                           request_ccb);
1623
1624                 if (status != CAM_REQ_CMP) {
1625                         xpt_print(path, "xpt_scan_lun: cam_alloc_periph "
1626                             "returned an error, can't continue probe\n");
1627                         request_ccb->ccb_h.status = status;
1628                         xpt_done(request_ccb);
1629                 }
1630         }
1631         if (lock)
1632                 xpt_path_unlock(path);
1633 }
1634
1635 static void
1636 axptscandone(struct cam_periph *periph, union ccb *done_ccb)
1637 {
1638
1639         xpt_free_path(done_ccb->ccb_h.path);
1640         xpt_free_ccb(done_ccb);
1641 }
1642
1643 static struct cam_ed *
1644 ata_alloc_device(struct cam_eb *bus, struct cam_et *target, lun_id_t lun_id)
1645 {
1646         struct ata_quirk_entry *quirk;
1647         struct cam_ed *device;
1648
1649         device = xpt_alloc_device(bus, target, lun_id);
1650         if (device == NULL)
1651                 return (NULL);
1652
1653         /*
1654          * Take the default quirk entry until we have inquiry
1655          * data and can determine a better quirk to use.
1656          */
1657         quirk = &ata_quirk_table[nitems(ata_quirk_table) - 1];
1658         device->quirk = (void *)quirk;
1659         device->mintags = 0;
1660         device->maxtags = 0;
1661         bzero(&device->inq_data, sizeof(device->inq_data));
1662         device->inq_flags = 0;
1663         device->queue_flags = 0;
1664         device->serial_num = NULL;
1665         device->serial_num_len = 0;
1666         return (device);
1667 }
1668
1669 static void
1670 ata_device_transport(struct cam_path *path)
1671 {
1672         struct ccb_pathinq cpi;
1673         struct ccb_trans_settings cts;
1674         struct scsi_inquiry_data *inq_buf = NULL;
1675         struct ata_params *ident_buf = NULL;
1676
1677         /* Get transport information from the SIM */
1678         xpt_path_inq(&cpi, path);
1679
1680         path->device->transport = cpi.transport;
1681         if ((path->device->flags & CAM_DEV_INQUIRY_DATA_VALID) != 0)
1682                 inq_buf = &path->device->inq_data;
1683         if ((path->device->flags & CAM_DEV_IDENTIFY_DATA_VALID) != 0)
1684                 ident_buf = &path->device->ident_data;
1685         if (path->device->protocol == PROTO_ATA) {
1686                 path->device->protocol_version = ident_buf ?
1687                     ata_version(ident_buf->version_major) : cpi.protocol_version;
1688         } else if (path->device->protocol == PROTO_SCSI) {
1689                 path->device->protocol_version = inq_buf ?
1690                     SID_ANSI_REV(inq_buf) : cpi.protocol_version;
1691         }
1692         path->device->transport_version = ident_buf ?
1693             ata_version(ident_buf->version_major) : cpi.transport_version;
1694
1695         /* Tell the controller what we think */
1696         xpt_setup_ccb(&cts.ccb_h, path, CAM_PRIORITY_NONE);
1697         cts.ccb_h.func_code = XPT_SET_TRAN_SETTINGS;
1698         cts.type = CTS_TYPE_CURRENT_SETTINGS;
1699         cts.transport = path->device->transport;
1700         cts.transport_version = path->device->transport_version;
1701         cts.protocol = path->device->protocol;
1702         cts.protocol_version = path->device->protocol_version;
1703         cts.proto_specific.valid = 0;
1704         if (ident_buf) {
1705                 if (path->device->transport == XPORT_ATA) {
1706                         cts.xport_specific.ata.atapi =
1707                             (ident_buf->config == ATA_PROTO_CFA) ? 0 :
1708                             ((ident_buf->config & ATA_PROTO_MASK) == ATA_PROTO_ATAPI_16) ? 16 :
1709                             ((ident_buf->config & ATA_PROTO_MASK) == ATA_PROTO_ATAPI_12) ? 12 : 0;
1710                         cts.xport_specific.ata.valid = CTS_ATA_VALID_ATAPI;
1711                 } else {
1712                         cts.xport_specific.sata.atapi =
1713                             (ident_buf->config == ATA_PROTO_CFA) ? 0 :
1714                             ((ident_buf->config & ATA_PROTO_MASK) == ATA_PROTO_ATAPI_16) ? 16 :
1715                             ((ident_buf->config & ATA_PROTO_MASK) == ATA_PROTO_ATAPI_12) ? 12 : 0;
1716                         cts.xport_specific.sata.valid = CTS_SATA_VALID_ATAPI;
1717                 }
1718         } else
1719                 cts.xport_specific.valid = 0;
1720         xpt_action((union ccb *)&cts);
1721 }
1722
1723 static void
1724 ata_dev_advinfo(union ccb *start_ccb)
1725 {
1726         struct cam_ed *device;
1727         struct ccb_dev_advinfo *cdai;
1728         off_t amt;
1729
1730         xpt_path_assert(start_ccb->ccb_h.path, MA_OWNED);
1731         start_ccb->ccb_h.status = CAM_REQ_INVALID;
1732         device = start_ccb->ccb_h.path->device;
1733         cdai = &start_ccb->cdai;
1734         switch(cdai->buftype) {
1735         case CDAI_TYPE_SCSI_DEVID:
1736                 if (cdai->flags & CDAI_FLAG_STORE)
1737                         return;
1738                 cdai->provsiz = device->device_id_len;
1739                 if (device->device_id_len == 0)
1740                         break;
1741                 amt = device->device_id_len;
1742                 if (cdai->provsiz > cdai->bufsiz)
1743                         amt = cdai->bufsiz;
1744                 memcpy(cdai->buf, device->device_id, amt);
1745                 break;
1746         case CDAI_TYPE_SERIAL_NUM:
1747                 if (cdai->flags & CDAI_FLAG_STORE)
1748                         return;
1749                 cdai->provsiz = device->serial_num_len;
1750                 if (device->serial_num_len == 0)
1751                         break;
1752                 amt = device->serial_num_len;
1753                 if (cdai->provsiz > cdai->bufsiz)
1754                         amt = cdai->bufsiz;
1755                 memcpy(cdai->buf, device->serial_num, amt);
1756                 break;
1757         case CDAI_TYPE_PHYS_PATH:
1758                 if (cdai->flags & CDAI_FLAG_STORE) {
1759                         if (device->physpath != NULL)
1760                                 free(device->physpath, M_CAMXPT);
1761                         device->physpath_len = cdai->bufsiz;
1762                         /* Clear existing buffer if zero length */
1763                         if (cdai->bufsiz == 0)
1764                                 break;
1765                         device->physpath = malloc(cdai->bufsiz, M_CAMXPT, M_NOWAIT);
1766                         if (device->physpath == NULL) {
1767                                 start_ccb->ccb_h.status = CAM_REQ_ABORTED;
1768                                 return;
1769                         }
1770                         memcpy(device->physpath, cdai->buf, cdai->bufsiz);
1771                 } else {
1772                         cdai->provsiz = device->physpath_len;
1773                         if (device->physpath_len == 0)
1774                                 break;
1775                         amt = device->physpath_len;
1776                         if (cdai->provsiz > cdai->bufsiz)
1777                                 amt = cdai->bufsiz;
1778                         memcpy(cdai->buf, device->physpath, amt);
1779                 }
1780                 break;
1781         default:
1782                 return;
1783         }
1784         start_ccb->ccb_h.status = CAM_REQ_CMP;
1785
1786         if (cdai->flags & CDAI_FLAG_STORE) {
1787                 xpt_async(AC_ADVINFO_CHANGED, start_ccb->ccb_h.path,
1788                           (void *)(uintptr_t)cdai->buftype);
1789         }
1790 }
1791
1792 static void
1793 ata_action(union ccb *start_ccb)
1794 {
1795
1796         switch (start_ccb->ccb_h.func_code) {
1797         case XPT_SET_TRAN_SETTINGS:
1798         {
1799                 ata_set_transfer_settings(&start_ccb->cts,
1800                                            start_ccb->ccb_h.path,
1801                                            /*async_update*/FALSE);
1802                 break;
1803         }
1804         case XPT_SCAN_BUS:
1805         case XPT_SCAN_TGT:
1806                 ata_scan_bus(start_ccb->ccb_h.path->periph, start_ccb);
1807                 break;
1808         case XPT_SCAN_LUN:
1809                 ata_scan_lun(start_ccb->ccb_h.path->periph,
1810                               start_ccb->ccb_h.path, start_ccb->crcn.flags,
1811                               start_ccb);
1812                 break;
1813         case XPT_GET_TRAN_SETTINGS:
1814         {
1815                 ata_get_transfer_settings(&start_ccb->cts);
1816                 break;
1817         }
1818         case XPT_SCSI_IO:
1819         {
1820                 struct cam_ed *device;
1821                 u_int   maxlen = 0;
1822
1823                 device = start_ccb->ccb_h.path->device;
1824                 if (device->protocol == PROTO_SCSI &&
1825                     (device->flags & CAM_DEV_IDENTIFY_DATA_VALID)) {
1826                         uint16_t p =
1827                             device->ident_data.config & ATA_PROTO_MASK;
1828
1829                         maxlen =
1830                             (device->ident_data.config == ATA_PROTO_CFA) ? 0 :
1831                             (p == ATA_PROTO_ATAPI_16) ? 16 :
1832                             (p == ATA_PROTO_ATAPI_12) ? 12 : 0;
1833                 }
1834                 if (start_ccb->csio.cdb_len > maxlen) {
1835                         start_ccb->ccb_h.status = CAM_REQ_INVALID;
1836                         xpt_done(start_ccb);
1837                         break;
1838                 }
1839                 xpt_action_default(start_ccb);
1840                 break;
1841         }
1842         case XPT_DEV_ADVINFO:
1843         {
1844                 ata_dev_advinfo(start_ccb);
1845                 break;
1846         }
1847         default:
1848                 xpt_action_default(start_ccb);
1849                 break;
1850         }
1851 }
1852
1853 static void
1854 ata_get_transfer_settings(struct ccb_trans_settings *cts)
1855 {
1856         struct  ccb_trans_settings_ata *ata;
1857         struct  ccb_trans_settings_scsi *scsi;
1858         struct  cam_ed *device;
1859
1860         device = cts->ccb_h.path->device;
1861         xpt_action_default((union ccb *)cts);
1862
1863         if (cts->protocol == PROTO_UNKNOWN ||
1864             cts->protocol == PROTO_UNSPECIFIED) {
1865                 cts->protocol = device->protocol;
1866                 cts->protocol_version = device->protocol_version;
1867         }
1868
1869         if (cts->protocol == PROTO_ATA) {
1870                 ata = &cts->proto_specific.ata;
1871                 if ((ata->valid & CTS_ATA_VALID_TQ) == 0) {
1872                         ata->valid |= CTS_ATA_VALID_TQ;
1873                         if (cts->type == CTS_TYPE_USER_SETTINGS ||
1874                             (device->flags & CAM_DEV_TAG_AFTER_COUNT) != 0 ||
1875                             (device->inq_flags & SID_CmdQue) != 0)
1876                                 ata->flags |= CTS_ATA_FLAGS_TAG_ENB;
1877                 }
1878         }
1879         if (cts->protocol == PROTO_SCSI) {
1880                 scsi = &cts->proto_specific.scsi;
1881                 if ((scsi->valid & CTS_SCSI_VALID_TQ) == 0) {
1882                         scsi->valid |= CTS_SCSI_VALID_TQ;
1883                         if (cts->type == CTS_TYPE_USER_SETTINGS ||
1884                             (device->flags & CAM_DEV_TAG_AFTER_COUNT) != 0 ||
1885                             (device->inq_flags & SID_CmdQue) != 0)
1886                                 scsi->flags |= CTS_SCSI_FLAGS_TAG_ENB;
1887                 }
1888         }
1889
1890         if (cts->transport == XPORT_UNKNOWN ||
1891             cts->transport == XPORT_UNSPECIFIED) {
1892                 cts->transport = device->transport;
1893                 cts->transport_version = device->transport_version;
1894         }
1895 }
1896
1897 static void
1898 ata_set_transfer_settings(struct ccb_trans_settings *cts, struct cam_path *path,
1899                            int async_update)
1900 {
1901         struct  ccb_pathinq cpi;
1902         struct  ccb_trans_settings_ata *ata;
1903         struct  ccb_trans_settings_scsi *scsi;
1904         struct  ata_params *ident_data;
1905         struct  scsi_inquiry_data *inq_data;
1906         struct  cam_ed *device;
1907
1908         if (path == NULL || (device = path->device) == NULL) {
1909                 cts->ccb_h.status = CAM_PATH_INVALID;
1910                 xpt_done((union ccb *)cts);
1911                 return;
1912         }
1913
1914         if (cts->protocol == PROTO_UNKNOWN
1915          || cts->protocol == PROTO_UNSPECIFIED) {
1916                 cts->protocol = device->protocol;
1917                 cts->protocol_version = device->protocol_version;
1918         }
1919
1920         if (cts->protocol_version == PROTO_VERSION_UNKNOWN
1921          || cts->protocol_version == PROTO_VERSION_UNSPECIFIED)
1922                 cts->protocol_version = device->protocol_version;
1923
1924         if (cts->protocol != device->protocol) {
1925                 xpt_print(path, "Uninitialized Protocol %x:%x?\n",
1926                        cts->protocol, device->protocol);
1927                 cts->protocol = device->protocol;
1928         }
1929
1930         if (cts->protocol_version > device->protocol_version) {
1931                 if (bootverbose) {
1932                         xpt_print(path, "Down reving Protocol "
1933                             "Version from %d to %d?\n", cts->protocol_version,
1934                             device->protocol_version);
1935                 }
1936                 cts->protocol_version = device->protocol_version;
1937         }
1938
1939         if (cts->transport == XPORT_UNKNOWN
1940          || cts->transport == XPORT_UNSPECIFIED) {
1941                 cts->transport = device->transport;
1942                 cts->transport_version = device->transport_version;
1943         }
1944
1945         if (cts->transport_version == XPORT_VERSION_UNKNOWN
1946          || cts->transport_version == XPORT_VERSION_UNSPECIFIED)
1947                 cts->transport_version = device->transport_version;
1948
1949         if (cts->transport != device->transport) {
1950                 xpt_print(path, "Uninitialized Transport %x:%x?\n",
1951                     cts->transport, device->transport);
1952                 cts->transport = device->transport;
1953         }
1954
1955         if (cts->transport_version > device->transport_version) {
1956                 if (bootverbose) {
1957                         xpt_print(path, "Down reving Transport "
1958                             "Version from %d to %d?\n", cts->transport_version,
1959                             device->transport_version);
1960                 }
1961                 cts->transport_version = device->transport_version;
1962         }
1963
1964         ident_data = &device->ident_data;
1965         inq_data = &device->inq_data;
1966         if (cts->protocol == PROTO_ATA)
1967                 ata = &cts->proto_specific.ata;
1968         else
1969                 ata = NULL;
1970         if (cts->protocol == PROTO_SCSI)
1971                 scsi = &cts->proto_specific.scsi;
1972         else
1973                 scsi = NULL;
1974         xpt_path_inq(&cpi, path);
1975
1976         /* Sanity checking */
1977         if ((cpi.hba_inquiry & PI_TAG_ABLE) == 0
1978          || (ata && (ident_data->satacapabilities & ATA_SUPPORT_NCQ) == 0)
1979          || (scsi && (INQ_DATA_TQ_ENABLED(inq_data)) == 0)
1980          || (device->queue_flags & SCP_QUEUE_DQUE) != 0
1981          || (device->mintags == 0)) {
1982                 /*
1983                  * Can't tag on hardware that doesn't support tags,
1984                  * doesn't have it enabled, or has broken tag support.
1985                  */
1986                 if (ata)
1987                         ata->flags &= ~CTS_ATA_FLAGS_TAG_ENB;
1988                 if (scsi)
1989                         scsi->flags &= ~CTS_SCSI_FLAGS_TAG_ENB;
1990         }
1991
1992         /* Start/stop tags use. */
1993         if (cts->type == CTS_TYPE_CURRENT_SETTINGS &&
1994             ((ata && (ata->valid & CTS_ATA_VALID_TQ) != 0) ||
1995              (scsi && (scsi->valid & CTS_SCSI_VALID_TQ) != 0))) {
1996                 int nowt, newt = 0;
1997
1998                 nowt = ((device->flags & CAM_DEV_TAG_AFTER_COUNT) != 0 ||
1999                         (device->inq_flags & SID_CmdQue) != 0);
2000                 if (ata)
2001                         newt = (ata->flags & CTS_ATA_FLAGS_TAG_ENB) != 0;
2002                 if (scsi)
2003                         newt = (scsi->flags & CTS_SCSI_FLAGS_TAG_ENB) != 0;
2004
2005                 if (newt && !nowt) {
2006                         /*
2007                          * Delay change to use tags until after a
2008                          * few commands have gone to this device so
2009                          * the controller has time to perform transfer
2010                          * negotiations without tagged messages getting
2011                          * in the way.
2012                          */
2013                         device->tag_delay_count = CAM_TAG_DELAY_COUNT;
2014                         device->flags |= CAM_DEV_TAG_AFTER_COUNT;
2015                 } else if (nowt && !newt)
2016                         xpt_stop_tags(path);
2017         }
2018
2019         if (async_update == FALSE)
2020                 xpt_action_default((union ccb *)cts);
2021 }
2022
2023 /*
2024  * Handle any per-device event notifications that require action by the XPT.
2025  */
2026 static void
2027 ata_dev_async(u_int32_t async_code, struct cam_eb *bus, struct cam_et *target,
2028               struct cam_ed *device, void *async_arg)
2029 {
2030         cam_status status;
2031         struct cam_path newpath;
2032
2033         /*
2034          * We only need to handle events for real devices.
2035          */
2036         if (target->target_id == CAM_TARGET_WILDCARD
2037          || device->lun_id == CAM_LUN_WILDCARD)
2038                 return;
2039
2040         /*
2041          * We need our own path with wildcards expanded to
2042          * handle certain types of events.
2043          */
2044         if ((async_code == AC_SENT_BDR)
2045          || (async_code == AC_BUS_RESET)
2046          || (async_code == AC_INQ_CHANGED))
2047                 status = xpt_compile_path(&newpath, NULL,
2048                                           bus->path_id,
2049                                           target->target_id,
2050                                           device->lun_id);
2051         else
2052                 status = CAM_REQ_CMP_ERR;
2053
2054         if (status == CAM_REQ_CMP) {
2055                 if (async_code == AC_INQ_CHANGED) {
2056                         /*
2057                          * We've sent a start unit command, or
2058                          * something similar to a device that
2059                          * may have caused its inquiry data to
2060                          * change. So we re-scan the device to
2061                          * refresh the inquiry data for it.
2062                          */
2063                         ata_scan_lun(newpath.periph, &newpath,
2064                                      CAM_EXPECT_INQ_CHANGE, NULL);
2065                 } else {
2066                         /* We need to reinitialize device after reset. */
2067                         ata_scan_lun(newpath.periph, &newpath,
2068                                      0, NULL);
2069                 }
2070                 xpt_release_path(&newpath);
2071         } else if (async_code == AC_LOST_DEVICE &&
2072             (device->flags & CAM_DEV_UNCONFIGURED) == 0) {
2073                 device->flags |= CAM_DEV_UNCONFIGURED;
2074                 xpt_release_device(device);
2075         } else if (async_code == AC_TRANSFER_NEG) {
2076                 struct ccb_trans_settings *settings;
2077                 struct cam_path path;
2078
2079                 settings = (struct ccb_trans_settings *)async_arg;
2080                 xpt_compile_path(&path, NULL, bus->path_id, target->target_id,
2081                                  device->lun_id);
2082                 ata_set_transfer_settings(settings, &path,
2083                                           /*async_update*/TRUE);
2084                 xpt_release_path(&path);
2085         }
2086 }
2087
2088 static void
2089 _ata_announce_periph(struct cam_periph *periph, struct ccb_trans_settings *cts, u_int *speed)
2090 {
2091         struct  ccb_pathinq cpi;
2092         struct  cam_path *path = periph->path;
2093
2094         cam_periph_assert(periph, MA_OWNED);
2095
2096         xpt_setup_ccb(&cts->ccb_h, path, CAM_PRIORITY_NORMAL);
2097         cts->ccb_h.func_code = XPT_GET_TRAN_SETTINGS;
2098         cts->type = CTS_TYPE_CURRENT_SETTINGS;
2099         xpt_action((union ccb*)cts);
2100         if ((cts->ccb_h.status & CAM_STATUS_MASK) != CAM_REQ_CMP)
2101                 return;
2102         /* Ask the SIM for its base transfer speed */
2103         xpt_path_inq(&cpi, path);
2104         /* Report connection speed */
2105         *speed = cpi.base_transfer_speed;
2106         if (cts->transport == XPORT_ATA) {
2107                 struct  ccb_trans_settings_pata *pata =
2108                     &cts->xport_specific.ata;
2109
2110                 if (pata->valid & CTS_ATA_VALID_MODE)
2111                         *speed = ata_mode2speed(pata->mode);
2112         }
2113         if (cts->transport == XPORT_SATA) {
2114                 struct  ccb_trans_settings_sata *sata =
2115                     &cts->xport_specific.sata;
2116
2117                 if (sata->valid & CTS_SATA_VALID_REVISION)
2118                         *speed = ata_revision2speed(sata->revision);
2119         }
2120 }
2121
2122 static void
2123 ata_announce_periph(struct cam_periph *periph)
2124 {
2125         struct ccb_trans_settings cts;
2126         u_int speed, mb;
2127
2128         _ata_announce_periph(periph, &cts, &speed);
2129         if ((cts.ccb_h.status & CAM_STATUS_MASK) != CAM_REQ_CMP)
2130                 return;
2131
2132         mb = speed / 1000;
2133         if (mb > 0)
2134                 printf("%s%d: %d.%03dMB/s transfers",
2135                        periph->periph_name, periph->unit_number,
2136                        mb, speed % 1000);
2137         else
2138                 printf("%s%d: %dKB/s transfers", periph->periph_name,
2139                        periph->unit_number, speed);
2140         /* Report additional information about connection */
2141         if (cts.transport == XPORT_ATA) {
2142                 struct ccb_trans_settings_pata *pata =
2143                     &cts.xport_specific.ata;
2144
2145                 printf(" (");
2146                 if (pata->valid & CTS_ATA_VALID_MODE)
2147                         printf("%s, ", ata_mode2string(pata->mode));
2148                 if ((pata->valid & CTS_ATA_VALID_ATAPI) && pata->atapi != 0)
2149                         printf("ATAPI %dbytes, ", pata->atapi);
2150                 if (pata->valid & CTS_ATA_VALID_BYTECOUNT)
2151                         printf("PIO %dbytes", pata->bytecount);
2152                 printf(")");
2153         }
2154         if (cts.transport == XPORT_SATA) {
2155                 struct ccb_trans_settings_sata *sata =
2156                     &cts.xport_specific.sata;
2157
2158                 printf(" (");
2159                 if (sata->valid & CTS_SATA_VALID_REVISION)
2160                         printf("SATA %d.x, ", sata->revision);
2161                 else
2162                         printf("SATA, ");
2163                 if (sata->valid & CTS_SATA_VALID_MODE)
2164                         printf("%s, ", ata_mode2string(sata->mode));
2165                 if ((sata->valid & CTS_ATA_VALID_ATAPI) && sata->atapi != 0)
2166                         printf("ATAPI %dbytes, ", sata->atapi);
2167                 if (sata->valid & CTS_SATA_VALID_BYTECOUNT)
2168                         printf("PIO %dbytes", sata->bytecount);
2169                 printf(")");
2170         }
2171         printf("\n");
2172 }
2173
2174 static void
2175 ata_announce_periph_sbuf(struct cam_periph *periph, struct sbuf *sb)
2176 {
2177         struct ccb_trans_settings cts;
2178         u_int speed, mb;
2179
2180         _ata_announce_periph(periph, &cts, &speed);
2181         if ((cts.ccb_h.status & CAM_STATUS_MASK) != CAM_REQ_CMP)
2182                 return;
2183
2184         mb = speed / 1000;
2185         if (mb > 0)
2186                 sbuf_printf(sb, "%s%d: %d.%03dMB/s transfers",
2187                        periph->periph_name, periph->unit_number,
2188                        mb, speed % 1000);
2189         else
2190                 sbuf_printf(sb, "%s%d: %dKB/s transfers", periph->periph_name,
2191                        periph->unit_number, speed);
2192         /* Report additional information about connection */
2193         if (cts.transport == XPORT_ATA) {
2194                 struct ccb_trans_settings_pata *pata =
2195                     &cts.xport_specific.ata;
2196
2197                 sbuf_printf(sb, " (");
2198                 if (pata->valid & CTS_ATA_VALID_MODE)
2199                         sbuf_printf(sb, "%s, ", ata_mode2string(pata->mode));
2200                 if ((pata->valid & CTS_ATA_VALID_ATAPI) && pata->atapi != 0)
2201                         sbuf_printf(sb, "ATAPI %dbytes, ", pata->atapi);
2202                 if (pata->valid & CTS_ATA_VALID_BYTECOUNT)
2203                         sbuf_printf(sb, "PIO %dbytes", pata->bytecount);
2204                 sbuf_printf(sb, ")");
2205         }
2206         if (cts.transport == XPORT_SATA) {
2207                 struct ccb_trans_settings_sata *sata =
2208                     &cts.xport_specific.sata;
2209
2210                 sbuf_printf(sb, " (");
2211                 if (sata->valid & CTS_SATA_VALID_REVISION)
2212                         sbuf_printf(sb, "SATA %d.x, ", sata->revision);
2213                 else
2214                         sbuf_printf(sb, "SATA, ");
2215                 if (sata->valid & CTS_SATA_VALID_MODE)
2216                         sbuf_printf(sb, "%s, ", ata_mode2string(sata->mode));
2217                 if ((sata->valid & CTS_ATA_VALID_ATAPI) && sata->atapi != 0)
2218                         sbuf_printf(sb, "ATAPI %dbytes, ", sata->atapi);
2219                 if (sata->valid & CTS_SATA_VALID_BYTECOUNT)
2220                         sbuf_printf(sb, "PIO %dbytes", sata->bytecount);
2221                 sbuf_printf(sb, ")");
2222         }
2223         sbuf_printf(sb, "\n");
2224 }
2225
2226 static void
2227 ata_proto_announce_sbuf(struct cam_ed *device, struct sbuf *sb)
2228 {
2229         ata_print_ident_sbuf(&device->ident_data, sb);
2230 }
2231
2232 static void
2233 ata_proto_announce(struct cam_ed *device)
2234 {
2235         ata_print_ident(&device->ident_data);
2236 }
2237
2238 static void
2239 ata_proto_denounce(struct cam_ed *device)
2240 {
2241         ata_print_ident_short(&device->ident_data);
2242 }
2243
2244 static void
2245 ata_proto_denounce_sbuf(struct cam_ed *device, struct sbuf *sb)
2246 {
2247         ata_print_ident_short_sbuf(&device->ident_data, sb);
2248 }
2249
2250 static void
2251 semb_proto_announce_sbuf(struct cam_ed *device, struct sbuf *sb)
2252 {
2253         semb_print_ident_sbuf((struct sep_identify_data *)&device->ident_data, sb);
2254 }
2255
2256 static void
2257 semb_proto_announce(struct cam_ed *device)
2258 {
2259         semb_print_ident((struct sep_identify_data *)&device->ident_data);
2260 }
2261
2262 static void
2263 semb_proto_denounce(struct cam_ed *device)
2264 {
2265         semb_print_ident_short((struct sep_identify_data *)&device->ident_data);
2266 }
2267
2268 static void
2269 semb_proto_denounce_sbuf(struct cam_ed *device, struct sbuf *sb)
2270 {
2271         semb_print_ident_short_sbuf((struct sep_identify_data *)&device->ident_data, sb);
2272 }
2273
2274 static void
2275 ata_proto_debug_out(union ccb *ccb)
2276 {
2277         char cdb_str[(sizeof(struct ata_cmd) * 3) + 1];
2278
2279         if (ccb->ccb_h.func_code != XPT_ATA_IO)
2280                 return;
2281
2282         CAM_DEBUG(ccb->ccb_h.path,
2283             CAM_DEBUG_CDB,("%s. ACB: %s\n", ata_op_string(&ccb->ataio.cmd),
2284                 ata_cmd_string(&ccb->ataio.cmd, cdb_str, sizeof(cdb_str))));
2285 }