AHCI bug fixes & enhancements. port_init, port_stop, port_start, etc.
[dragonfly.git] / sys / dev / disk / ahci / ahci_cam.c
1 /*
2  * Copyright (c) 2009 The DragonFly Project.  All rights reserved.
3  *
4  * This code is derived from software contributed to The DragonFly Project
5  * by Matthew Dillon <dillon@backplane.com>
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  *
11  * 1. Redistributions of source code must retain the above copyright
12  *    notice, this list of conditions and the following disclaimer.
13  * 2. Redistributions in binary form must reproduce the above copyright
14  *    notice, this list of conditions and the following disclaimer in
15  *    the documentation and/or other materials provided with the
16  *    distribution.
17  * 3. Neither the name of The DragonFly Project nor the names of its
18  *    contributors may be used to endorse or promote products derived
19  *    from this software without specific, prior written permission.
20  *
21  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
22  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
23  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
24  * FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE
25  * COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
26  * INCIDENTAL, SPECIAL, EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING,
27  * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
28  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
29  * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
30  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
31  * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
32  * SUCH DAMAGE.
33  *
34  *
35  * Copyright (c) 2007 David Gwynne <dlg@openbsd.org>
36  *
37  * Permission to use, copy, modify, and distribute this software for any
38  * purpose with or without fee is hereby granted, provided that the above
39  * copyright notice and this permission notice appear in all copies.
40  *
41  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
42  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
43  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
44  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
45  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
46  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
47  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
48  *
49  * $OpenBSD: atascsi.c,v 1.64 2009/02/16 21:19:06 miod Exp $
50  * $DragonFly$
51  */
52 /*
53  * Implement each SATA port as its own SCSI bus on CAM.  This way we can
54  * implement future port multiplier features as individual devices on the
55  * bus.
56  *
57  * Much of the cdb<->xa conversion code was taken from OpenBSD, the rest
58  * was written natively for DragonFly.
59  */
60
61 #include "ahci.h"
62
63 const char *ScsiTypeArray[32] = {
64         "DIRECT",
65         "SEQUENTIAL",
66         "PRINTER",
67         "PROCESSOR",
68         "WORM",
69         "CDROM",
70         "SCANNER",
71         "OPTICAL",
72         "CHANGER",
73         "COMM",
74         "ASC0",
75         "ASC1",
76         "STORARRAY",
77         "ENCLOSURE",
78         "RBC",
79         "OCRW",
80         "0x10",
81         "OSD",
82         "ADC",
83         "0x13",
84         "0x14",
85         "0x15",
86         "0x16",
87         "0x17",
88         "0x18",
89         "0x19",
90         "0x1A",
91         "0x1B",
92         "0x1C",
93         "0x1D",
94         "0x1E",
95         "NODEVICE"
96 };
97
98 static void ahci_xpt_action(struct cam_sim *sim, union ccb *ccb);
99 static void ahci_xpt_poll(struct cam_sim *sim);
100 static void ahci_xpt_scsi_disk_io(struct cam_sim *sim, union ccb *ccb);
101 static void ahci_xpt_scsi_atapi_io(struct cam_sim *sim, union ccb *ccb);
102
103 static void ahci_ata_complete_disk_rw(struct ata_xfer *xa);
104 static void ahci_ata_complete_disk_synchronize_cache(struct ata_xfer *xa);
105 static void ahci_atapi_complete_cmd(struct ata_xfer *xa);
106 static void ahci_ata_dummy_sense(struct scsi_sense_data *sense_data);
107 static void ahci_ata_atapi_sense(struct ata_fis_d2h *rfis,
108                      struct scsi_sense_data *sense_data);
109
110 static int ahci_cam_probe(struct ahci_port *ap);
111 static int ahci_cam_probe_disk(struct ahci_port *ap);
112 static int ahci_cam_probe_atapi(struct ahci_port *ap);
113 static void ahci_ata_dummy_done(struct ata_xfer *xa);
114 static void ata_fix_identify(struct ata_identify *id);
115 static void ahci_cam_rescan(struct ahci_port *ap);
116
117 int
118 ahci_cam_attach(struct ahci_port *ap)
119 {
120         struct cam_devq *devq;
121         struct cam_sim *sim;
122         int error;
123         int unit;
124
125         /*
126          * We want at least one ccb to be available for error processing
127          * so don't let CAM use more then ncmds - 1.
128          */
129         unit = device_get_unit(ap->ap_sc->sc_dev);
130         if (ap->ap_sc->sc_ncmds > 1)
131                 devq = cam_simq_alloc(ap->ap_sc->sc_ncmds - 1);
132         else
133                 devq = cam_simq_alloc(ap->ap_sc->sc_ncmds);
134         if (devq == NULL) {
135                 return (ENOMEM);
136         }
137         sim = cam_sim_alloc(ahci_xpt_action, ahci_xpt_poll, "ahci",
138                            (void *)ap, unit, &sim_mplock, 1, 1, devq);
139         cam_simq_release(devq);
140         if (sim == NULL) {
141                 return (ENOMEM);
142         }
143         ap->ap_sim = sim;
144         error = xpt_bus_register(ap->ap_sim, ap->ap_num);
145         if (error != CAM_SUCCESS) {
146                 ahci_cam_detach(ap);
147                 return (EINVAL);
148         }
149         ap->ap_flags |= AP_F_BUS_REGISTERED;
150         error = xpt_create_path(&ap->ap_path, NULL, cam_sim_path(sim),
151                                 CAM_TARGET_WILDCARD, CAM_LUN_WILDCARD);
152         if (error != CAM_REQ_CMP) {
153                 ahci_cam_detach(ap);
154                 return (ENOMEM);
155         }
156
157         error = ahci_cam_probe(ap);
158         if (error) {
159                 ahci_cam_detach(ap);
160                 return (EIO);
161         }
162         ap->ap_flags |= AP_F_CAM_ATTACHED;
163
164         ahci_cam_rescan(ap);
165
166         return(0);
167 }
168
169 void
170 ahci_cam_changed(struct ahci_port *ap, int found)
171 {
172         struct cam_path *tmppath;
173
174         if (ap->ap_sim == NULL)
175                 return;
176         if (xpt_create_path(&tmppath, NULL, cam_sim_path(ap->ap_sim),
177                             0, CAM_LUN_WILDCARD) != CAM_REQ_CMP) {
178                 return;
179         }
180         if (found) {
181                 ahci_cam_probe(ap);
182                 /*
183                  * XXX calling AC_FOUND_DEVICE with inquiry data is
184                  *     basically a NOP.  For now just tell CAM to
185                  *     rescan the bus.
186                  */
187                 xpt_async(AC_FOUND_DEVICE, tmppath, NULL);
188                 ahci_cam_rescan(ap);
189         } else {
190                 xpt_async(AC_LOST_DEVICE, tmppath, NULL);
191         }
192         xpt_free_path(tmppath);
193 }
194
195 void
196 ahci_cam_detach(struct ahci_port *ap)
197 {
198         int error;
199
200         if ((ap->ap_flags & AP_F_CAM_ATTACHED) == 0)
201                 return;
202         get_mplock();
203         if (ap->ap_sim) {
204                 xpt_freeze_simq(ap->ap_sim, 1);
205         }
206         if (ap->ap_path) {
207                 xpt_free_path(ap->ap_path);
208                 ap->ap_path = NULL;
209         }
210         if (ap->ap_flags & AP_F_BUS_REGISTERED) {
211                 error = xpt_bus_deregister(cam_sim_path(ap->ap_sim));
212                 KKASSERT(error == CAM_REQ_CMP);
213                 ap->ap_flags &= ~AP_F_BUS_REGISTERED;
214         }
215         if (ap->ap_sim) {
216                 cam_sim_free(ap->ap_sim);
217                 ap->ap_sim = NULL;
218         }
219         rel_mplock();
220         ap->ap_flags &= ~AP_F_CAM_ATTACHED;
221 }
222
223 /*
224  * Once the AHCI port has been attched we need to probe for a device or
225  * devices on the port and setup various options.
226  */
227 static int
228 ahci_cam_probe(struct ahci_port *ap)
229 {
230         struct ata_xfer *xa;
231         u_int64_t       capacity;
232         u_int64_t       capacity_bytes;
233         int             model_len;
234         int             status;
235         int             error;
236         int             devncqdepth;
237         int             i;
238         const char      *wcstr;
239         const char      *rastr;
240         const char      *scstr;
241         const char      *type;
242
243         if (ap->ap_ata.ap_type == ATA_PORT_T_NONE)
244                 return (EIO);
245
246         /*
247          * Issue identify, saving the result
248          */
249         xa = ahci_ata_get_xfer(ap);
250         xa->complete = ahci_ata_dummy_done;
251         xa->data = &ap->ap_ata.ap_identify;
252         xa->datalen = sizeof(ap->ap_ata.ap_identify);
253         xa->fis->flags = ATA_H2D_FLAGS_CMD;
254         if (ap->ap_ata.ap_type == ATA_PORT_T_ATAPI) {
255                 xa->fis->command = ATA_C_ATAPI_IDENTIFY;
256                 type = "ATAPI";
257         } else {
258                 xa->fis->command = ATA_C_IDENTIFY;
259                 type = "DISK";
260         }
261         xa->fis->features = 0;
262         xa->fis->device = 0;
263         xa->flags = ATA_F_READ | ATA_F_PIO | ATA_F_POLL;
264         xa->timeout = hz;
265
266         status = ahci_ata_cmd(xa);
267         if (status != ATA_COMPLETE) {
268                 kprintf("%s: Detected %s device but unable to IDENTIFY\n",
269                         PORTNAME(ap), type);
270                 ahci_ata_put_xfer(xa);
271                 return(EIO);
272         }
273         if (xa->state != ATA_S_COMPLETE) {
274                 kprintf("%s: Detected %s device but unable to IDENTIFY "
275                         " xa->state=%d\n",
276                         PORTNAME(ap), type, xa->state);
277                 ahci_ata_put_xfer(xa);
278                 return(EIO);
279         }
280         ahci_ata_put_xfer(xa);
281
282         ata_fix_identify(&ap->ap_ata.ap_identify);
283
284         /*
285          * Read capacity using SATA probe info.
286          */
287         if (le16toh(ap->ap_ata.ap_identify.cmdset83) & 0x0400) {
288                 /* LBA48 feature set supported */
289                 capacity = 0;
290                 for (i = 3; i >= 0; --i) {
291                         capacity <<= 16;
292                         capacity +=
293                             le16toh(ap->ap_ata.ap_identify.addrsecxt[i]);
294                 }
295         } else {
296                 capacity = le16toh(ap->ap_ata.ap_identify.addrsec[1]);
297                 capacity <<= 16;
298                 capacity += le16toh(ap->ap_ata.ap_identify.addrsec[0]);
299         }
300         ap->ap_ata.ap_capacity = capacity;
301         ap->ap_ata.ap_features |= ATA_PORT_F_PROBED;
302
303         capacity_bytes = capacity * 512;
304
305         /*
306          * Negotiate NCQ, throw away any ata_xfer's beyond the negotiated
307          * number of slots and limit the number of CAM ccb's to one less
308          * so we always have a slot available for recovery.
309          *
310          * NCQ is not used if ap_ncqdepth is 1 or the host controller does
311          * not support it, and in that case the driver can handle extra
312          * ccb's.
313          *
314          * Remember at least one extra CCB needs to be reserved for the
315          * error ccb.
316          */
317         if ((ap->ap_sc->sc_cap & AHCI_REG_CAP_SNCQ) &&
318             (le16toh(ap->ap_ata.ap_identify.satacap) & (1 << 8))) {
319                 ap->ap_ata.ap_ncqdepth = (le16toh(ap->ap_ata.ap_identify.qdepth) & 0x1F) + 1;
320                 devncqdepth = ap->ap_ata.ap_ncqdepth;
321                 if (ap->ap_ata.ap_ncqdepth > ap->ap_sc->sc_ncmds)
322                         ap->ap_ata.ap_ncqdepth = ap->ap_sc->sc_ncmds;
323                 if (ap->ap_ata.ap_ncqdepth > 1) {
324                         for (i = 0; i < ap->ap_sc->sc_ncmds; ++i) {
325                                 xa = ahci_ata_get_xfer(ap);
326                                 if (xa->tag < ap->ap_ata.ap_ncqdepth) {
327                                         xa->state = ATA_S_COMPLETE;
328                                         ahci_ata_put_xfer(xa);
329                                 }
330                         }
331                         if (ap->ap_ata.ap_ncqdepth >= ap->ap_sc->sc_ncmds) {
332                                 cam_devq_resize(ap->ap_sim->devq,
333                                                 ap->ap_ata.ap_ncqdepth - 1);
334                         }
335                 }
336         } else {
337                 devncqdepth = 0;
338         }
339
340         /*
341          * Make the model string a bit more presentable
342          */
343         for (model_len = 40; model_len; --model_len) {
344                 if (ap->ap_ata.ap_identify.model[model_len-1] == ' ')
345                         continue;
346                 if (ap->ap_ata.ap_identify.model[model_len-1] == 0)
347                         continue;
348                 break;
349         }
350
351         /*
352          * Generate informatiive strings.
353          *
354          * NOTE: We do not automatically set write caching, lookahead,
355          *       or the security state for ATAPI devices.
356          */
357         if (ap->ap_ata.ap_identify.cmdset82 & ATA_IDENTIFY_WRITECACHE) {
358                 if (ap->ap_ata.ap_identify.features85 & ATA_IDENTIFY_WRITECACHE)
359                         wcstr = "enabled";
360                 else if (ap->ap_ata.ap_type == ATA_PORT_T_ATAPI)
361                         wcstr = "disabled";
362                 else
363                         wcstr = "enabling";
364         } else {
365                     wcstr = "notsupp";
366         }
367
368         if (ap->ap_ata.ap_identify.cmdset82 & ATA_IDENTIFY_LOOKAHEAD) {
369                 if (ap->ap_ata.ap_identify.features85 & ATA_IDENTIFY_LOOKAHEAD)
370                         rastr = "enabled";
371                 else if (ap->ap_ata.ap_type == ATA_PORT_T_ATAPI)
372                         rastr = "disabled";
373                 else
374                         rastr = "enabling";
375         } else {
376                     rastr = "notsupp";
377         }
378
379         if (ap->ap_ata.ap_identify.cmdset82 & ATA_IDENTIFY_SECURITY) {
380                 if (ap->ap_ata.ap_identify.securestatus & ATA_SECURE_FROZEN)
381                         scstr = "frozen";
382                 else if (ap->ap_ata.ap_type == ATA_PORT_T_ATAPI)
383                         scstr = "unfrozen";
384                 else
385                         scstr = "freezing";
386         } else {
387                     scstr = "notsupp";
388         }
389
390         kprintf("%s: Found %s \"%*.*s %8.8s\" serial=\"%20.20s\"\n"
391                 "%s: tags=%d/%d satacaps=%04x satafeat=%04x "
392                 "capacity=%lld.%02dMB\n"
393                 "%s: f85=%04x f86=%04x f87=%04x WC=%s RA=%s SEC=%s\n",
394                 PORTNAME(ap),
395                 type,
396                 model_len, model_len,
397                 ap->ap_ata.ap_identify.model,
398                 ap->ap_ata.ap_identify.firmware,
399                 ap->ap_ata.ap_identify.serial,
400
401                 PORTNAME(ap),
402                 devncqdepth, ap->ap_sc->sc_ncmds,
403                 ap->ap_ata.ap_identify.satacap,
404                 ap->ap_ata.ap_identify.satafsup,
405                 (long long)capacity_bytes / (1024 * 1024),
406                 (int)(capacity_bytes % (1024 * 1024)) * 100 / (1024 * 1024),
407
408                 PORTNAME(ap),
409                 ap->ap_ata.ap_identify.features85,
410                 ap->ap_ata.ap_identify.features86,
411                 ap->ap_ata.ap_identify.features87,
412                 wcstr,
413                 rastr,
414                 scstr
415         );
416
417         /*
418          * Additional type-specific probing
419          */
420         switch(ap->ap_ata.ap_type) {
421         case ATA_PORT_T_DISK:
422                 error = ahci_cam_probe_disk(ap);
423                 break;
424         default:
425                 error = ahci_cam_probe_atapi(ap);
426                 break;
427         }
428         return (0);
429 }
430
431 /*
432  * DISK-specific probe after initial ident
433  */
434 static int
435 ahci_cam_probe_disk(struct ahci_port *ap)
436 {
437         struct ata_xfer *xa;
438         int status;
439
440         /*
441          * Enable write cache if supported
442          *
443          * NOTE: "WD My Book" external disk devices have a very poor
444          *       daughter board between the the ESATA and the HD.  Sending
445          *       any ATA_C_SET_FEATURES commands will break the hardware port
446          *       with a fatal protocol error.  However, this device also
447          *       indicates that WRITECACHE is already on and READAHEAD is
448          *       not supported so we avoid the issue.
449          */
450         if ((ap->ap_ata.ap_identify.cmdset82 & ATA_IDENTIFY_WRITECACHE) &&
451             (ap->ap_ata.ap_identify.features85 & ATA_IDENTIFY_WRITECACHE) == 0) {
452                 xa = ahci_ata_get_xfer(ap);
453                 xa->complete = ahci_ata_dummy_done;
454                 xa->fis->command = ATA_C_SET_FEATURES;
455                 /*xa->fis->features = ATA_SF_WRITECACHE_EN;*/
456                 xa->fis->features = ATA_SF_LOOKAHEAD_EN;
457                 xa->fis->flags = ATA_H2D_FLAGS_CMD;
458                 xa->fis->device = 0;
459                 xa->flags = ATA_F_READ | ATA_F_PIO | ATA_F_POLL;
460                 xa->timeout = hz;
461                 xa->datalen = 0;
462                 status = ahci_ata_cmd(xa);
463                 if (status == ATA_COMPLETE)
464                         ap->ap_ata.ap_features |= ATA_PORT_F_WCACHE;
465                 ahci_ata_put_xfer(xa);
466         }
467
468         /*
469          * Enable readahead if supported
470          */
471         if ((ap->ap_ata.ap_identify.cmdset82 & ATA_IDENTIFY_LOOKAHEAD) &&
472             (ap->ap_ata.ap_identify.features85 & ATA_IDENTIFY_LOOKAHEAD) == 0) {
473                 xa = ahci_ata_get_xfer(ap);
474                 xa->complete = ahci_ata_dummy_done;
475                 xa->fis->command = ATA_C_SET_FEATURES;
476                 xa->fis->features = ATA_SF_LOOKAHEAD_EN;
477                 xa->fis->flags = ATA_H2D_FLAGS_CMD;
478                 xa->fis->device = 0;
479                 xa->flags = ATA_F_READ | ATA_F_PIO | ATA_F_POLL;
480                 xa->timeout = hz;
481                 xa->datalen = 0;
482                 status = ahci_ata_cmd(xa);
483                 if (status == ATA_COMPLETE)
484                         ap->ap_ata.ap_features |= ATA_PORT_F_RAHEAD;
485                 ahci_ata_put_xfer(xa);
486         }
487
488         /*
489          * FREEZE LOCK the device so malicious users can't lock it on us.
490          * As there is no harm in issuing this to devices that don't
491          * support the security feature set we just send it, and don't bother
492          * checking if the device sends a command abort to tell us it doesn't
493          * support it
494          */
495         if ((ap->ap_ata.ap_identify.cmdset82 & ATA_IDENTIFY_SECURITY) &&
496             (ap->ap_ata.ap_identify.securestatus & ATA_SECURE_FROZEN) == 0) {
497                 xa = ahci_ata_get_xfer(ap);
498                 xa->complete = ahci_ata_dummy_done;
499                 xa->fis->command = ATA_C_SEC_FREEZE_LOCK;
500                 xa->fis->flags = ATA_H2D_FLAGS_CMD;
501                 xa->flags = ATA_F_READ | ATA_F_PIO | ATA_F_POLL;
502                 xa->timeout = hz;
503                 xa->datalen = 0;
504                 status = ahci_ata_cmd(xa);
505                 if (status == ATA_COMPLETE)
506                         ap->ap_ata.ap_features |= ATA_PORT_F_FRZLCK;
507                 ahci_ata_put_xfer(xa);
508         }
509
510         return (0);
511 }
512
513 /*
514  * ATAPI-specific probe after initial ident
515  */
516 static int
517 ahci_cam_probe_atapi(struct ahci_port *ap)
518 {
519         return(0);
520 }
521
522 #if 0
523         /*
524          * Keep this old code around for a little bit, it is another way
525          * to probe an ATAPI device by using a ATAPI (SCSI) INQUIRY
526          */
527         struct ata_xfer *xa;
528         int             status;
529         int             devncqdepth;
530         struct scsi_inquiry_data *inq_data;
531         struct scsi_inquiry *inq_cmd;
532
533         inq_data = kmalloc(sizeof(*inq_data), M_TEMP, M_WAITOK | M_ZERO);
534
535         /*
536          * Issue identify, saving the result
537          */
538         xa = ahci_ata_get_xfer(ap);
539         xa->complete = ahci_ata_dummy_done;
540         xa->data = inq_data;
541         xa->datalen = sizeof(*inq_data);
542         xa->flags = ATA_F_READ | ATA_F_PACKET | ATA_F_PIO | ATA_F_POLL;
543         xa->timeout = hz;
544
545         xa->fis->flags = ATA_H2D_FLAGS_CMD;
546         xa->fis->command = ATA_C_PACKET;
547         xa->fis->device = 0;
548         xa->fis->sector_count = xa->tag << 3;
549         xa->fis->features = ATA_H2D_FEATURES_DMA |
550                     ((xa->flags & ATA_F_WRITE) ?
551                     ATA_H2D_FEATURES_DIR_WRITE : ATA_H2D_FEATURES_DIR_READ);
552         xa->fis->lba_mid = 0x00;
553         xa->fis->lba_high = 0x20;
554
555         inq_cmd = (void *)xa->packetcmd;
556         inq_cmd->opcode = INQUIRY;
557         inq_cmd->length = SHORT_INQUIRY_LENGTH;
558
559         status = ahci_ata_cmd(xa);
560         if (status != ATA_COMPLETE) {
561                 kprintf("%s: Detected ATAPI device but unable to INQUIRY\n",
562                         PORTNAME(ap));
563                 ahci_ata_put_xfer(xa);
564                 kfree(inq_data, M_TEMP);
565                 return(EIO);
566         }
567         if (xa->state != ATA_S_COMPLETE) {
568                 kprintf("%s: Detected ATAPI device but unable to INQUIRY "
569                         " xa->state=%d\n",
570                         PORTNAME(ap), xa->state);
571                 ahci_ata_put_xfer(xa);
572                 kfree(inq_data, M_TEMP);
573                 return(EIO);
574         }
575         ahci_ata_put_xfer(xa);
576
577         ap->ap_ata.ap_features |= ATA_PORT_F_PROBED;
578
579         /*
580          * XXX Negotiate NCQ with ATAPI?  How do we do this?
581          */
582
583         devncqdepth = 0;
584
585         kprintf("%s: Found ATAPI %s \"%8.8s %16.16s\" rev=\"%4.4s\"\n"
586                 "%s: tags=%d/%d\n",
587                 PORTNAME(ap),
588                 ScsiTypeArray[SID_TYPE(inq_data)],
589                 inq_data->vendor,
590                 inq_data->product,
591                 inq_data->revision,
592
593                 PORTNAME(ap),
594                 devncqdepth, ap->ap_sc->sc_ncmds
595         );
596         kfree(inq_data, M_TEMP);
597 #endif
598
599 /*
600  * Fix byte ordering so buffers can be accessed as
601  * strings.
602  */
603 static void
604 ata_fix_identify(struct ata_identify *id)
605 {
606         u_int16_t       *swap;
607         int             i;
608
609         swap = (u_int16_t *)id->serial;
610         for (i = 0; i < sizeof(id->serial) / sizeof(u_int16_t); i++)
611                 swap[i] = bswap16(swap[i]);
612
613         swap = (u_int16_t *)id->firmware;
614         for (i = 0; i < sizeof(id->firmware) / sizeof(u_int16_t); i++)
615                 swap[i] = bswap16(swap[i]);
616
617         swap = (u_int16_t *)id->model;
618         for (i = 0; i < sizeof(id->model) / sizeof(u_int16_t); i++)
619                 swap[i] = bswap16(swap[i]);
620 }
621
622 /*
623  * Dummy done callback for xa.
624  */
625 static void
626 ahci_ata_dummy_done(struct ata_xfer *xa)
627 {
628 }
629
630 /*
631  * Initiate a bus scan.
632  *
633  * An asynchronous bus scan is used to avoid reentrancy issues
634  */
635 static void
636 ahci_cam_rescan_callback(struct cam_periph *periph, union ccb *ccb)
637 {
638         kfree(ccb, M_TEMP);
639 }
640
641 static void
642 ahci_cam_rescan(struct ahci_port *ap)
643 {
644         struct cam_path *path;
645         union ccb *ccb;
646         int status;
647
648         ccb = kmalloc(sizeof(*ccb), M_TEMP, M_WAITOK | M_ZERO);
649         status = xpt_create_path(&path, xpt_periph, cam_sim_path(ap->ap_sim),
650                                  CAM_TARGET_WILDCARD, CAM_LUN_WILDCARD);
651         if (status != CAM_REQ_CMP)
652                 return;
653
654         xpt_setup_ccb(&ccb->ccb_h, path, 5);    /* 5 = low priority */
655         ccb->ccb_h.func_code = XPT_SCAN_BUS | XPT_FC_QUEUED;
656         ccb->ccb_h.cbfcnp = ahci_cam_rescan_callback;
657         ccb->crcn.flags = CAM_FLAG_NONE;
658         xpt_action(ccb);
659
660         /* scan is now underway */
661 }
662
663 /*
664  * Action function - dispatch command
665  */
666 static
667 void
668 ahci_xpt_action(struct cam_sim *sim, union ccb *ccb)
669 {
670         struct ahci_port *ap;
671         struct ccb_hdr *ccbh;
672         int unit;
673
674         /* XXX lock */
675         ap = cam_sim_softc(sim);
676         KKASSERT(ap != NULL);
677         ccbh = &ccb->ccb_h;
678         unit = cam_sim_unit(sim);
679
680         /*
681          * Non-zero target and lun ids will be used for future
682          * port multiplication(?).  A target wildcard indicates only
683          * the general bus is being probed.
684          *
685          * XXX What do we do with a LUN wildcard?
686          */
687         if (ccbh->target_id != CAM_TARGET_WILDCARD) {
688                 if (ap->ap_ata.ap_type == ATA_PORT_T_NONE) {
689                         ccbh->status = CAM_REQ_INVALID;
690                         xpt_done(ccb);
691                         return;
692                 }
693                 if (ccbh->target_id) {
694                         ccbh->status = CAM_DEV_NOT_THERE;
695                         xpt_done(ccb);
696                         return;
697                 }
698                 if (ccbh->target_lun != CAM_LUN_WILDCARD && ccbh->target_lun) {
699                         ccbh->status = CAM_DEV_NOT_THERE;
700                         xpt_done(ccb);
701                         return;
702                 }
703         }
704
705         /*
706          * Switch on the meta XPT command
707          */
708         switch(ccbh->func_code) {
709         case XPT_PATH_INQ:
710                 ccb->cpi.version_num = 1;
711                 ccb->cpi.hba_inquiry = 0;
712                 ccb->cpi.target_sprt = 0;
713                 ccb->cpi.hba_misc = 0;
714                 ccb->cpi.hba_eng_cnt = 0;
715                 bzero(ccb->cpi.vuhba_flags, sizeof(ccb->cpi.vuhba_flags));
716                 ccb->cpi.max_target = 7;
717                 ccb->cpi.max_lun = 0;
718                 ccb->cpi.async_flags = 0;
719                 ccb->cpi.hpath_id = 0;
720                 ccb->cpi.initiator_id = 7;
721                 ccb->cpi.unit_number = cam_sim_unit(sim);
722                 ccb->cpi.bus_id = cam_sim_bus(sim);
723                 ccb->cpi.base_transfer_speed = 150000;
724                 ccb->cpi.transport = XPORT_AHCI;
725                 ccb->cpi.transport_version = 1;
726                 ccb->cpi.protocol = PROTO_SCSI;
727                 ccb->cpi.protocol_version = SCSI_REV_2;
728
729                 /*
730                  * Non-zero target and lun ids will be used for future
731                  * port multiplication(?).  A target wildcard indicates only
732                  * the general bus is being probed.
733                  *
734                  * XXX What do we do with a LUN wildcard?
735                  */
736                 if (ccbh->target_id != CAM_TARGET_WILDCARD) {
737                         switch(ahci_pread(ap, AHCI_PREG_SSTS) &
738                                AHCI_PREG_SSTS_SPD) {
739                         case AHCI_PREG_SSTS_SPD_GEN1:
740                                 ccb->cpi.base_transfer_speed = 150000;
741                                 break;
742                         case AHCI_PREG_SSTS_SPD_GEN2:
743                                 ccb->cpi.base_transfer_speed = 300000;
744                                 break;
745                         default:
746                                 /* unknown */
747                                 ccb->cpi.base_transfer_speed = 1000;
748                                 break;
749                         }
750                         /* XXX check attached, set base xfer speed */
751                 }
752                 ccbh->status = CAM_REQ_CMP;
753                 xpt_done(ccb);
754                 break;
755         case XPT_RESET_DEV:
756                 lwkt_serialize_enter(&ap->ap_sc->sc_serializer);
757                 ahci_port_reset(ap, 0);
758                 lwkt_serialize_exit(&ap->ap_sc->sc_serializer);
759
760                 ccbh->status = CAM_REQ_CMP;
761                 xpt_done(ccb);
762                 break;
763         case XPT_RESET_BUS:
764                 lwkt_serialize_enter(&ap->ap_sc->sc_serializer);
765                 ahci_port_reset(ap, 1);
766                 lwkt_serialize_exit(&ap->ap_sc->sc_serializer);
767
768                 xpt_async(AC_BUS_RESET, ap->ap_path, NULL);
769
770                 ccbh->status = CAM_REQ_CMP;
771                 xpt_done(ccb);
772                 break;
773         case XPT_SET_TRAN_SETTINGS:
774                 ccbh->status = CAM_FUNC_NOTAVAIL;
775                 xpt_done(ccb);
776                 break;
777         case XPT_GET_TRAN_SETTINGS:
778                 ccb->cts.protocol = PROTO_SCSI;
779                 ccb->cts.protocol_version = SCSI_REV_2;
780                 ccb->cts.transport = XPORT_AHCI;
781                 ccb->cts.transport_version = XPORT_VERSION_UNSPECIFIED;
782                 ccb->cts.proto_specific.valid = 0;
783                 ccb->cts.xport_specific.valid = 0;
784                 ccbh->status = CAM_REQ_CMP;
785                 xpt_done(ccb);
786                 break;
787         case XPT_CALC_GEOMETRY:
788                 cam_calc_geometry(&ccb->ccg, 1);
789                 xpt_done(ccb);
790                 break;
791         case XPT_SCSI_IO:
792                 switch(ap->ap_ata.ap_type) {
793                 case ATA_PORT_T_DISK:
794                         ahci_xpt_scsi_disk_io(sim, ccb);
795                         break;
796                 case ATA_PORT_T_ATAPI:
797                         ahci_xpt_scsi_atapi_io(sim, ccb);
798                         break;
799                 default:
800                         ccbh->status = CAM_REQ_INVALID;
801                         xpt_done(ccb);
802                         break;
803                 }
804                 break;
805         default:
806                 ccbh->status = CAM_REQ_INVALID;
807                 xpt_done(ccb);
808                 break;
809         }
810 }
811
812 /*
813  * Poll function.
814  *
815  * Generally this function gets called heavily when interrupts might be
816  * non-operational, during a halt/reboot or panic.
817  */
818 static
819 void
820 ahci_xpt_poll(struct cam_sim *sim)
821 {
822         struct ahci_port *ap;
823
824         ap = cam_sim_softc(sim);
825         crit_enter();
826         lwkt_serialize_enter(&ap->ap_sc->sc_serializer);
827         ahci_port_intr(ap, AHCI_PREG_CI_ALL_SLOTS);
828         lwkt_serialize_exit(&ap->ap_sc->sc_serializer);
829         crit_exit();
830 }
831
832 /*
833  * Convert the SCSI command in ccb to an ata_xfer command in xa
834  * for ATA_PORT_T_DISK operations.  Set the completion function
835  * to convert the response back, then dispatch to the OpenBSD AHCI
836  * layer.
837  *
838  * AHCI DISK commands only support a limited command set, and we
839  * fake additional commands to make it play nice with the CAM subsystem.
840  */
841 static
842 void
843 ahci_xpt_scsi_disk_io(struct cam_sim *sim, union ccb *ccb)
844 {
845         struct ahci_port *ap;
846         struct ccb_hdr *ccbh;
847         struct ccb_scsiio *csio;
848         struct ata_xfer *xa;
849         struct ata_fis_h2d *fis;
850         scsi_cdb_t cdb;
851         union scsi_data *rdata;
852         int rdata_len;
853         u_int64_t capacity;
854         u_int64_t lba;
855         u_int32_t count;
856
857         ap = cam_sim_softc(sim);
858         ccbh = &ccb->csio.ccb_h;
859         csio = &ccb->csio;
860         xa = ahci_ata_get_xfer(ap);
861         rdata = (void *)csio->data_ptr;
862         rdata_len = csio->dxfer_len;
863
864         /*
865          * Build the FIS or process the csio to completion.
866          */
867         cdb = (void *)((ccbh->flags & CAM_CDB_POINTER) ?
868                         csio->cdb_io.cdb_ptr : csio->cdb_io.cdb_bytes);
869
870         switch(cdb->generic.opcode) {
871         case REQUEST_SENSE:
872                 /*
873                  * Auto-sense everything, so explicit sense requests
874                  * return no-sense.
875                  */
876                 ccbh->status = CAM_SCSI_STATUS_ERROR;
877                 break;
878         case INQUIRY:
879                 /*
880                  * Inquiry supported features
881                  *
882                  * [opcode, byte2, page_code, length, control]
883                  */
884                 if (cdb->inquiry.byte2 & SI_EVPD) {
885                         switch(cdb->inquiry.page_code) {
886                         case SVPD_SUPPORTED_PAGE_LIST:
887                                 /* XXX atascsi_disk_vpd_supported */
888                         case SVPD_UNIT_SERIAL_NUMBER:
889                                 /* XXX atascsi_disk_vpd_serial */
890                         case SVPD_UNIT_DEVID:
891                                 /* XXX atascsi_disk_vpd_ident */
892                         default:
893                                 ccbh->status = CAM_FUNC_NOTAVAIL;
894                                 break;
895                         }
896                 } else {
897                         bzero(rdata, rdata_len);
898                         if (rdata_len < SHORT_INQUIRY_LENGTH) {
899                                 ccbh->status = CAM_CCB_LEN_ERR;
900                                 break;
901                         }
902                         if (rdata_len > sizeof(rdata->inquiry_data))
903                                 rdata_len = sizeof(rdata->inquiry_data);
904                         rdata->inquiry_data.device = T_DIRECT;
905                         rdata->inquiry_data.version = SCSI_REV_SPC2;
906                         rdata->inquiry_data.response_format = 2;
907                         rdata->inquiry_data.additional_length = 32;
908                         bcopy("SATA    ", rdata->inquiry_data.vendor, 8);
909                         bcopy(ap->ap_ata.ap_identify.model,
910                               rdata->inquiry_data.product,
911                               sizeof(rdata->inquiry_data.product));
912                         bcopy(ap->ap_ata.ap_identify.firmware,
913                               rdata->inquiry_data.revision,
914                               sizeof(rdata->inquiry_data.revision));
915                         ccbh->status = CAM_REQ_CMP;
916                 }
917                 break;
918         case READ_CAPACITY_16:
919                 if (cdb->read_capacity_16.service_action != SRC16_SERVICE_ACTION) {
920                         ccbh->status = CAM_REQ_INVALID;
921                         break;
922                 }
923                 if (rdata_len < sizeof(rdata->read_capacity_data_16)) {
924                         ccbh->status = CAM_CCB_LEN_ERR;
925                         break;
926                 }
927                 /* fall through */
928         case READ_CAPACITY:
929                 if (rdata_len < sizeof(rdata->read_capacity_data)) {
930                         ccbh->status = CAM_CCB_LEN_ERR;
931                         break;
932                 }
933
934                 capacity = ap->ap_ata.ap_capacity;
935
936                 bzero(rdata, rdata_len);
937                 if (cdb->generic.opcode == READ_CAPACITY) {
938                         rdata_len = sizeof(rdata->read_capacity_data);
939                         if (capacity > 0xFFFFFFFFU)
940                                 capacity = 0xFFFFFFFFU;
941                         bzero(&rdata->read_capacity_data, rdata_len);
942                         scsi_ulto4b((u_int32_t)capacity - 1,
943                                     rdata->read_capacity_data.addr);
944                         scsi_ulto4b(512, rdata->read_capacity_data.length);
945                 } else {
946                         rdata_len = sizeof(rdata->read_capacity_data_16);
947                         bzero(&rdata->read_capacity_data_16, rdata_len);
948                         scsi_u64to8b(capacity - 1,
949                                      rdata->read_capacity_data_16.addr);
950                         scsi_ulto4b(512, rdata->read_capacity_data_16.length);
951                 }
952                 ccbh->status = CAM_REQ_CMP;
953                 break;
954         case SYNCHRONIZE_CACHE:
955                 /*
956                  * Synchronize cache.  Specification says this can take
957                  * greater then 30 seconds so give it at least 45.
958                  */
959                 fis = xa->fis;
960                 xa->datalen = 0;
961                 xa->flags = ATA_F_READ;
962                 xa->complete = ahci_ata_complete_disk_synchronize_cache;
963                 if (xa->timeout < 45 * hz)
964                         xa->timeout = 45 * hz;
965                 fis->flags = ATA_H2D_FLAGS_CMD;
966                 fis->command = ATA_C_FLUSH_CACHE;
967                 fis->device = 0;
968                 break;
969         case TEST_UNIT_READY:
970         case START_STOP_UNIT:
971         case PREVENT_ALLOW:
972                 /*
973                  * Just silently return success
974                  */
975                 ccbh->status = CAM_REQ_CMP;
976                 rdata_len = 0;
977                 break;
978         case ATA_PASS_12:
979         case ATA_PASS_16:
980                 /*
981                  * XXX implement pass-through
982                  */
983                 ccbh->status = CAM_FUNC_NOTAVAIL;
984                 break;
985         default:
986                 switch(cdb->generic.opcode) {
987                 case READ_6:
988                         lba = scsi_3btoul(cdb->rw_6.addr) & 0x1FFFFF;
989                         count = cdb->rw_6.length ? cdb->rw_6.length : 0x100;
990                         xa->flags = ATA_F_READ;
991                         break;
992                 case READ_10:
993                         lba = scsi_4btoul(cdb->rw_10.addr);
994                         count = scsi_2btoul(cdb->rw_10.length);
995                         xa->flags = ATA_F_READ;
996                         break;
997                 case READ_12:
998                         lba = scsi_4btoul(cdb->rw_12.addr);
999                         count = scsi_4btoul(cdb->rw_12.length);
1000                         xa->flags = ATA_F_READ;
1001                         break;
1002                 case READ_16:
1003                         lba = scsi_8btou64(cdb->rw_16.addr);
1004                         count = scsi_4btoul(cdb->rw_16.length);
1005                         xa->flags = ATA_F_READ;
1006                         break;
1007                 case WRITE_6:
1008                         lba = scsi_3btoul(cdb->rw_6.addr) & 0x1FFFFF;
1009                         count = cdb->rw_6.length ? cdb->rw_6.length : 0x100;
1010                         xa->flags = ATA_F_WRITE;
1011                         break;
1012                 case WRITE_10:
1013                         lba = scsi_4btoul(cdb->rw_10.addr);
1014                         count = scsi_2btoul(cdb->rw_10.length);
1015                         xa->flags = ATA_F_WRITE;
1016                         break;
1017                 case WRITE_12:
1018                         lba = scsi_4btoul(cdb->rw_12.addr);
1019                         count = scsi_4btoul(cdb->rw_12.length);
1020                         xa->flags = ATA_F_WRITE;
1021                         break;
1022                 case WRITE_16:
1023                         lba = scsi_8btou64(cdb->rw_16.addr);
1024                         count = scsi_4btoul(cdb->rw_16.length);
1025                         xa->flags = ATA_F_WRITE;
1026                         break;
1027                 default:
1028                         ccbh->status = CAM_REQ_INVALID;
1029                         break;
1030                 }
1031                 if (ccbh->status != CAM_REQ_INPROG)
1032                         break;
1033
1034                 fis = xa->fis;
1035                 fis->flags = ATA_H2D_FLAGS_CMD;
1036                 fis->lba_low = (u_int8_t)lba;
1037                 fis->lba_mid = (u_int8_t)(lba >> 8);
1038                 fis->lba_high = (u_int8_t)(lba >> 16);
1039                 fis->device = ATA_H2D_DEVICE_LBA;
1040
1041                 if (ap->ap_ata.ap_ncqdepth > 1 &&
1042                     (ap->ap_sc->sc_cap & AHCI_REG_CAP_SNCQ) &&
1043                     (ccbh->flags & CAM_POLLED) == 0) {
1044                         /*
1045                          * Use NCQ - always uses 48 bit addressing
1046                          */
1047                         xa->flags |= ATA_F_NCQ;
1048                         fis->command = (xa->flags & ATA_F_WRITE) ?
1049                                         ATA_C_WRITE_FPDMA : ATA_C_READ_FPDMA;
1050                         fis->lba_low_exp = (u_int8_t)(lba >> 24);
1051                         fis->lba_mid_exp = (u_int8_t)(lba >> 32);
1052                         fis->lba_high_exp = (u_int8_t)(lba >> 40);
1053                         fis->sector_count = xa->tag << 3;
1054                         fis->features = (u_int8_t)count;
1055                         fis->features_exp = (u_int8_t)(count >> 8);
1056                 } else if (count > 0x100 || lba > 0xFFFFFFFFU) {
1057                         /*
1058                          * Use LBA48
1059                          */
1060                         fis->command = (xa->flags & ATA_F_WRITE) ?
1061                                         ATA_C_WRITEDMA_EXT : ATA_C_READDMA_EXT;
1062                         fis->lba_low_exp = (u_int8_t)(lba >> 24);
1063                         fis->lba_mid_exp = (u_int8_t)(lba >> 32);
1064                         fis->lba_high_exp = (u_int8_t)(lba >> 40);
1065                         fis->sector_count = (u_int8_t)count;
1066                         fis->sector_count_exp = (u_int8_t)(count >> 8);
1067                 } else {
1068                         /*
1069                          * Use LBA
1070                          *
1071                          * NOTE: 256 sectors is supported, stored as 0.
1072                          */
1073                         fis->command = (xa->flags & ATA_F_WRITE) ?
1074                                         ATA_C_WRITEDMA : ATA_C_READDMA;
1075                         fis->device |= (u_int8_t)(lba >> 24) & 0x0F;
1076                         fis->sector_count = (u_int8_t)count;
1077                 }
1078
1079                 xa->data = csio->data_ptr;
1080                 xa->datalen = csio->dxfer_len;
1081                 xa->complete = ahci_ata_complete_disk_rw;
1082                 xa->timeout = ccbh->timeout * hz / 1000;
1083                 if (ccbh->flags & CAM_POLLED)
1084                         xa->flags |= ATA_F_POLL;
1085                 break;
1086         }
1087
1088         /*
1089          * If the request is still in progress the xa and FIS have
1090          * been set up and must be dispatched.  Otherwise the request
1091          * is complete.
1092          */
1093         if (ccbh->status == CAM_REQ_INPROG) {
1094                 KKASSERT(xa->complete != NULL);
1095                 xa->atascsi_private = ccb;
1096                 ccb->ccb_h.sim_priv.entries[0].ptr = ap;
1097                 lwkt_serialize_enter(&ap->ap_sc->sc_serializer);
1098                 ahci_ata_cmd(xa);
1099                 lwkt_serialize_exit(&ap->ap_sc->sc_serializer);
1100         } else {
1101                 ahci_ata_put_xfer(xa);
1102                 xpt_done(ccb);
1103         }
1104 }
1105
1106 /*
1107  * Convert the SCSI command in ccb to an ata_xfer command in xa
1108  * for ATA_PORT_T_ATAPI operations.  Set the completion function
1109  * to convert the response back, then dispatch to the OpenBSD AHCI
1110  * layer.
1111  */
1112 static
1113 void
1114 ahci_xpt_scsi_atapi_io(struct cam_sim *sim, union ccb *ccb)
1115 {
1116         struct ahci_port *ap;
1117         struct ccb_hdr *ccbh;
1118         struct ccb_scsiio *csio;
1119         struct ata_xfer *xa;
1120         struct ata_fis_h2d *fis;
1121         scsi_cdb_t cdbs;
1122         scsi_cdb_t cdbd;
1123         int flags;
1124
1125         ap = cam_sim_softc(sim);
1126         ccbh = &ccb->csio.ccb_h;
1127         csio = &ccb->csio;
1128
1129         switch (ccbh->flags & CAM_DIR_MASK) {
1130         case CAM_DIR_IN:
1131                 flags = ATA_F_PACKET | ATA_F_READ;
1132                 break;
1133         case CAM_DIR_OUT:
1134                 flags = ATA_F_PACKET | ATA_F_WRITE;
1135                 break;
1136         case CAM_DIR_NONE:
1137                 flags = ATA_F_PACKET;
1138                 break;
1139         default:
1140                 ccbh->status = CAM_REQ_INVALID;
1141                 xpt_done(ccb);
1142                 return;
1143                 /* NOT REACHED */
1144         }
1145
1146         /*
1147          * The command has to fit in the packet command buffer.
1148          */
1149         if (csio->cdb_len < 6 || csio->cdb_len > 16) {
1150                 ccbh->status = CAM_CCB_LEN_ERR;
1151                 xpt_done(ccb);
1152                 return;
1153         }
1154
1155         /*
1156          * Initialize the XA and FIS.
1157          */
1158         xa = ahci_ata_get_xfer(ap);
1159         fis = xa->fis;
1160
1161         xa->flags = flags;
1162         xa->data = csio->data_ptr;
1163         xa->datalen = csio->dxfer_len;
1164         xa->timeout = ccbh->timeout * hz / 1000;
1165         if (ccbh->flags & CAM_POLLED)
1166                 xa->flags |= ATA_F_POLL;
1167
1168         fis->flags = ATA_H2D_FLAGS_CMD;
1169         fis->command = ATA_C_PACKET;
1170         fis->device = 0;
1171         fis->sector_count = xa->tag << 3;
1172         fis->features = ATA_H2D_FEATURES_DMA |
1173                     ((xa->flags & ATA_F_WRITE) ?
1174                     ATA_H2D_FEATURES_DIR_WRITE : ATA_H2D_FEATURES_DIR_READ);
1175         fis->lba_mid = 0x00;
1176         fis->lba_high = 0x20;
1177
1178         /*
1179          * Copy the cdb to the packetcmd buffer in the FIS using a
1180          * convenient pointer in the xa.
1181          */
1182         cdbs = (void *)((ccbh->flags & CAM_CDB_POINTER) ?
1183                         csio->cdb_io.cdb_ptr : csio->cdb_io.cdb_bytes);
1184         bcopy(cdbs, xa->packetcmd, csio->cdb_len);
1185
1186 #if 0
1187         kprintf("opcode %d cdb_len %d dxfer_len %d\n",
1188                 cdbs->generic.opcode,
1189                 csio->cdb_len, csio->dxfer_len);
1190 #endif
1191
1192         /*
1193          * Some ATAPI commands do not actually follow the SCSI standard.
1194          */
1195         cdbd = (void *)xa->packetcmd;
1196
1197         switch(cdbd->generic.opcode) {
1198         case INQUIRY:
1199                 /*
1200                  * Some ATAPI devices can't handle SI_EVPD being set
1201                  * for a basic inquiry (page_code == 0).
1202                  *
1203                  * Some ATAPI devices can't handle long inquiry lengths,
1204                  * don't ask me why.  Truncate the inquiry length.
1205                  */
1206                 if ((cdbd->inquiry.byte2 & SI_EVPD) &&
1207                     cdbd->inquiry.page_code == 0) {
1208                         cdbd->inquiry.byte2 &= ~SI_EVPD;
1209                 }
1210                 if (cdbd->inquiry.page_code == 0 &&
1211                     cdbd->inquiry.length > SHORT_INQUIRY_LENGTH) {
1212                         cdbd->inquiry.length = SHORT_INQUIRY_LENGTH;
1213                 }
1214                 break;
1215         case READ_6:
1216         case WRITE_6:
1217                 /*
1218                  * Convert *_6 to *_10 commands.  Most ATAPI devices
1219                  * cannot handle the SCSI READ_6 and WRITE_6 commands.
1220                  */
1221                 cdbd->rw_10.opcode |= 0x20;
1222                 cdbd->rw_10.byte2 = 0;
1223                 cdbd->rw_10.addr[0] = cdbs->rw_6.addr[0] & 0x1F;
1224                 cdbd->rw_10.addr[1] = cdbs->rw_6.addr[1];
1225                 cdbd->rw_10.addr[2] = cdbs->rw_6.addr[2];
1226                 cdbd->rw_10.addr[3] = 0;
1227                 cdbd->rw_10.reserved = 0;
1228                 cdbd->rw_10.length[0] = 0;
1229                 cdbd->rw_10.length[1] = cdbs->rw_6.length;
1230                 cdbd->rw_10.control = cdbs->rw_6.control;
1231                 break;
1232         default:
1233                 break;
1234         }
1235
1236         /*
1237          * And dispatch
1238          */
1239         xa->complete = ahci_atapi_complete_cmd;
1240         xa->atascsi_private = ccb;
1241         ccb->ccb_h.sim_priv.entries[0].ptr = ap;
1242         ahci_ata_cmd(xa);
1243 }
1244
1245 /*
1246  * Completion function for ATA_PORT_T_DISK cache synchronization.
1247  */
1248 static
1249 void
1250 ahci_ata_complete_disk_synchronize_cache(struct ata_xfer *xa)
1251 {
1252         union ccb *ccb = xa->atascsi_private;
1253         struct ccb_hdr *ccbh = &ccb->ccb_h;
1254         struct ahci_port *ap = ccb->ccb_h.sim_priv.entries[0].ptr;
1255
1256         switch(xa->state) {
1257         case ATA_S_COMPLETE:
1258                 ccbh->status = CAM_REQ_CMP;
1259                 ccb->csio.scsi_status = SCSI_STATUS_OK;
1260                 break;
1261         case ATA_S_ERROR:
1262                 kprintf("%s: synchronize_cache: error\n", PORTNAME(ap));
1263                 ccbh->status = CAM_SCSI_STATUS_ERROR | CAM_AUTOSNS_VALID;
1264                 ccb->csio.scsi_status = SCSI_STATUS_CHECK_COND;
1265                 ahci_ata_dummy_sense(&ccb->csio.sense_data);
1266                 break;
1267         case ATA_S_TIMEOUT:
1268                 kprintf("%s: synchronize_cache: timeout\n", PORTNAME(ap));
1269                 ccbh->status = CAM_CMD_TIMEOUT;
1270                 break;
1271         default:
1272                 kprintf("%s: synchronize_cache: unknown state %d\n",
1273                         PORTNAME(ap), xa->state);
1274                 ccbh->status = CAM_REQ_CMP_ERR;
1275                 break;
1276         }
1277         ahci_ata_put_xfer(xa);
1278         lwkt_serialize_exit(&ap->ap_sc->sc_serializer);
1279         xpt_done(ccb);
1280         lwkt_serialize_enter(&ap->ap_sc->sc_serializer);
1281 }
1282
1283 /*
1284  * Completion function for ATA_PORT_T_DISK I/O
1285  */
1286 static
1287 void
1288 ahci_ata_complete_disk_rw(struct ata_xfer *xa)
1289 {
1290         union ccb *ccb = xa->atascsi_private;
1291         struct ccb_hdr *ccbh = &ccb->ccb_h;
1292         struct ahci_port *ap = ccb->ccb_h.sim_priv.entries[0].ptr;
1293
1294         switch(xa->state) {
1295         case ATA_S_COMPLETE:
1296                 ccbh->status = CAM_REQ_CMP;
1297                 ccb->csio.scsi_status = SCSI_STATUS_OK;
1298                 break;
1299         case ATA_S_ERROR:
1300                 kprintf("%s: disk_rw: error\n", PORTNAME(ap));
1301                 ccbh->status = CAM_SCSI_STATUS_ERROR | CAM_AUTOSNS_VALID;
1302                 ccb->csio.scsi_status = SCSI_STATUS_CHECK_COND;
1303                 ahci_ata_dummy_sense(&ccb->csio.sense_data);
1304                 break;
1305         case ATA_S_TIMEOUT:
1306                 kprintf("%s: disk_rw: timeout\n", PORTNAME(ap));
1307                 ccbh->status = CAM_CMD_TIMEOUT;
1308                 break;
1309         default:
1310                 kprintf("%s: disk_rw: unknown state %d\n",
1311                         PORTNAME(ap), xa->state);
1312                 ccbh->status = CAM_REQ_CMP_ERR;
1313                 break;
1314         }
1315         ccb->csio.resid = xa->resid;
1316         ahci_ata_put_xfer(xa);
1317         lwkt_serialize_exit(&ap->ap_sc->sc_serializer);
1318         xpt_done(ccb);
1319         lwkt_serialize_enter(&ap->ap_sc->sc_serializer);
1320 }
1321
1322 /*
1323  * Completion function for ATA_PORT_T_ATAPI I/O
1324  *
1325  * Sense data is returned in the rfis.
1326  */
1327 static
1328 void
1329 ahci_atapi_complete_cmd(struct ata_xfer *xa)
1330 {
1331         union ccb *ccb = xa->atascsi_private;
1332         struct ccb_hdr *ccbh = &ccb->ccb_h;
1333         struct ahci_port *ap = ccb->ccb_h.sim_priv.entries[0].ptr;
1334         scsi_cdb_t cdb;
1335
1336         cdb = (void *)((ccb->ccb_h.flags & CAM_CDB_POINTER) ?
1337                         ccb->csio.cdb_io.cdb_ptr : ccb->csio.cdb_io.cdb_bytes);
1338
1339         switch(xa->state) {
1340         case ATA_S_COMPLETE:
1341                 ccbh->status = CAM_REQ_CMP;
1342                 ccb->csio.scsi_status = SCSI_STATUS_OK;
1343                 break;
1344         case ATA_S_ERROR:
1345                 kprintf("%s: cmd %d: error\n",
1346                         PORTNAME(ap), cdb->generic.opcode);
1347                 ccbh->status = CAM_SCSI_STATUS_ERROR;
1348                 ccb->csio.scsi_status = SCSI_STATUS_CHECK_COND;
1349                 ahci_ata_atapi_sense(&xa->rfis, &ccb->csio.sense_data);
1350                 break;
1351         case ATA_S_TIMEOUT:
1352                 kprintf("%s: cmd %d: timeout\n",
1353                         PORTNAME(ap), cdb->generic.opcode);
1354                 ccbh->status = CAM_CMD_TIMEOUT;
1355                 break;
1356         default:
1357                 kprintf("%s: cmd %d: unknown state %d\n",
1358                         PORTNAME(ap), cdb->generic.opcode, xa->state);
1359                 ccbh->status = CAM_REQ_CMP_ERR;
1360                 break;
1361         }
1362         ccb->csio.resid = xa->resid;
1363         ahci_ata_put_xfer(xa);
1364         lwkt_serialize_exit(&ap->ap_sc->sc_serializer);
1365         xpt_done(ccb);
1366         lwkt_serialize_enter(&ap->ap_sc->sc_serializer);
1367 }
1368
1369 /*
1370  * Construct dummy sense data for errors on DISKs
1371  */
1372 static
1373 void
1374 ahci_ata_dummy_sense(struct scsi_sense_data *sense_data)
1375 {
1376         sense_data->error_code = SSD_ERRCODE_VALID | SSD_CURRENT_ERROR;
1377         sense_data->segment = 0;
1378         sense_data->flags = SSD_KEY_MEDIUM_ERROR;
1379         sense_data->info[0] = 0;
1380         sense_data->info[1] = 0;
1381         sense_data->info[2] = 0;
1382         sense_data->info[3] = 0;
1383         sense_data->extra_len = 0;
1384 }
1385
1386 /*
1387  * Construct atapi sense data for errors on ATAPI
1388  *
1389  * The ATAPI sense data is stored in the passed rfis and must be converted
1390  * to SCSI sense data.
1391  */
1392 static
1393 void
1394 ahci_ata_atapi_sense(struct ata_fis_d2h *rfis,
1395                      struct scsi_sense_data *sense_data)
1396 {
1397         sense_data->error_code = SSD_ERRCODE_VALID | SSD_CURRENT_ERROR;
1398         sense_data->segment = 0;
1399         sense_data->flags = (rfis->error & 0xF0) >> 4;
1400         if (rfis->error & 0x04)
1401                 sense_data->flags |= SSD_KEY_ILLEGAL_REQUEST;
1402         if (rfis->error & 0x02)
1403                 sense_data->flags |= SSD_EOM;
1404         if (rfis->error & 0x01)
1405                 sense_data->flags |= SSD_ILI;
1406         sense_data->info[0] = 0;
1407         sense_data->info[1] = 0;
1408         sense_data->info[2] = 0;
1409         sense_data->info[3] = 0;
1410         sense_data->extra_len = 0;
1411 }