]> CyberLeo.Net >> Repos - FreeBSD/releng/7.2.git/blob - sys/dev/ata/ata-usb.c
Create releng/7.2 from stable/7 in preparation for 7.2-RELEASE.
[FreeBSD/releng/7.2.git] / sys / dev / ata / ata-usb.c
1 /*-
2  * Copyright (c) 2006 - 2007 Søren Schmidt <sos@FreeBSD.org>
3  * All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  * 1. Redistributions of source code must retain the above copyright
9  *    notice, this list of conditions and the following disclaimer,
10  *    without modification, immediately at the beginning of the file.
11  * 2. Redistributions in binary form must reproduce the above copyright
12  *    notice, this list of conditions and the following disclaimer in the
13  *    documentation and/or other materials provided with the distribution.
14  *
15  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
16  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
17  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
18  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
19  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
20  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
21  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
22  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
23  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
24  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25  */
26
27 #include <sys/cdefs.h>
28 __FBSDID("$FreeBSD$");
29
30 #include "opt_ata.h"
31 #include <sys/param.h>
32 #include <sys/conf.h>
33 #include <sys/systm.h>
34 #include <sys/kernel.h>
35 #include <sys/mutex.h>
36 #include <sys/ata.h>
37 #include <sys/bus.h>
38 #include <sys/endian.h>
39 #include <sys/sysctl.h>
40 #include <sys/malloc.h>
41 #include <sys/module.h>
42 #include <sys/sema.h>
43 #include <sys/taskqueue.h>
44 #include <vm/uma.h>
45 #include <machine/resource.h>
46 #include <machine/bus.h>
47 #include <sys/rman.h>
48 #include <dev/usb/usb_port.h>
49 #include <dev/usb/usb.h>
50 #include <dev/usb/usbdi.h>
51 #include <dev/usb/usbdi_util.h>
52 #include <dev/usb/usbdivar.h>
53 #include <dev/ata/ata-all.h>
54 #include <ata_if.h>
55
56 /* Command Block Wrapper */
57 struct bbb_cbw {
58     u_int8_t    signature[4];
59 #define         CBWSIGNATURE            0x43425355
60
61     u_int8_t    tag[4];
62     u_int8_t    transfer_length[4];
63     u_int8_t    flags;
64 #define         CBWFLAGS_OUT            0x00
65 #define         CBWFLAGS_IN             0x80
66
67     u_int8_t    lun;
68     u_int8_t    length;
69 #define         CBWCDBLENGTH            16
70
71     u_int8_t    cdb[CBWCDBLENGTH];
72 };
73
74 /* Command Status Wrapper */
75 struct bbb_csw {
76     u_int8_t    signature[4];
77 #define         CSWSIGNATURE            0x53425355
78
79     u_int8_t    tag[4];
80     u_int8_t    residue[4];
81     u_int8_t    status;
82 #define         CSWSTATUS_GOOD          0x0
83 #define         CSWSTATUS_FAILED        0x1
84 #define         CSWSTATUS_PHASE         0x2
85 };
86
87 /* USB-ATA 'controller' softc */
88 struct atausb_softc {
89     device_t            dev;            /* base device */
90     usbd_interface_handle iface;        /* interface */
91     int                 ifaceno;        /* interface number */
92     u_int8_t            bulkin;         /* endpoint address's */
93     u_int8_t            bulkout;        
94     u_int8_t            bulkirq;        
95     usbd_pipe_handle    bulkin_pipe;    /* pipe handle's */
96     usbd_pipe_handle    bulkout_pipe;
97     usbd_pipe_handle    bulkirq_pipe;
98     int                 maxlun;
99     int                 timeout;
100     struct ata_request  *ata_request;
101     usb_device_request_t usb_request;
102     struct bbb_cbw      cbw;
103     struct bbb_csw      csw;
104
105 #define ATAUSB_T_BBB_CBW                0
106 #define ATAUSB_T_BBB_DATA               1
107 #define ATAUSB_T_BBB_DCLEAR             2
108 #define ATAUSB_T_BBB_CSW1               3
109 #define ATAUSB_T_BBB_CSW2               4
110 #define ATAUSB_T_BBB_SCLEAR             5
111 #define ATAUSB_T_BBB_RESET1             6
112 #define ATAUSB_T_BBB_RESET2             7
113 #define ATAUSB_T_BBB_RESET3             8
114 #define ATAUSB_T_MAX                    9
115     usbd_xfer_handle    transfer[ATAUSB_T_MAX];
116
117     int                 state;
118 #define ATAUSB_S_ATTACH                 0
119 #define ATAUSB_S_IDLE                   1
120 #define ATAUSB_S_BBB_COMMAND            2
121 #define ATAUSB_S_BBB_DATA               3
122 #define ATAUSB_S_BBB_DCLEAR             4
123 #define ATAUSB_S_BBB_STATUS1            5
124 #define ATAUSB_S_BBB_SCLEAR             6
125 #define ATAUSB_S_BBB_STATUS2            7
126 #define ATAUSB_S_BBB_RESET1             8
127 #define ATAUSB_S_BBB_RESET2             9
128 #define ATAUSB_S_BBB_RESET3             10
129 #define ATAUSB_S_DETACH                 11
130
131     struct mtx          locked_mtx;
132     struct ata_channel  *locked_ch;
133     struct ata_channel  *restart_ch;
134 };
135
136 static int atausbdebug = 0;
137
138 /* prototypes*/
139 static usbd_status atausb_start(struct atausb_softc *sc, usbd_pipe_handle pipe, void *buffer, int buflen, int flags, usbd_xfer_handle xfer);
140 static usbd_status atausb_ctl_start(struct atausb_softc *sc, usbd_device_handle udev, usb_device_request_t *req, void *buffer, int buflen, int flags, usbd_xfer_handle xfer);
141 static void atausb_clear_stall(struct atausb_softc *sc, u_int8_t endpt, usbd_pipe_handle pipe, int state, usbd_xfer_handle xfer);
142 static void atausb_bbb_reset(struct atausb_softc *sc);
143 static int atausb_bbb_start(struct ata_request *request);
144 static void atausb_bbb_finish(usbd_xfer_handle xfer, usbd_private_handle priv, usbd_status err);
145 int ata_usbchannel_begin_transaction(struct ata_request *request);
146 int ata_usbchannel_end_transaction(struct ata_request *request);
147
148
149 /*
150  * USB frontend part
151  */
152 USB_DECLARE_DRIVER(atausb);
153 DRIVER_MODULE(atausb, uhub, atausb_driver, atausb_devclass, 0, 0);
154 MODULE_VERSION(atausb, 1);
155
156 static int
157 atausb_match(device_t dev)
158 {
159     struct usb_attach_arg *uaa = device_get_ivars(dev);
160     usb_interface_descriptor_t *id;
161
162     if (uaa->iface == NULL)
163         return UMATCH_NONE;
164
165     id = usbd_get_interface_descriptor(uaa->iface);
166     if (!id || id->bInterfaceClass != UICLASS_MASS)
167         return UMATCH_NONE;
168
169     switch (id->bInterfaceSubClass) {
170     case UISUBCLASS_QIC157:
171     case UISUBCLASS_RBC:
172     case UISUBCLASS_SCSI:
173     case UISUBCLASS_SFF8020I:
174     case UISUBCLASS_SFF8070I:
175     case UISUBCLASS_UFI:
176         switch (id->bInterfaceProtocol) {
177         case UIPROTO_MASS_CBI:
178         case UIPROTO_MASS_CBI_I:
179         case UIPROTO_MASS_BBB:
180         case UIPROTO_MASS_BBB_OLD:
181             return UMATCH_IFACECLASS_IFACESUBCLASS_IFACEPROTO;
182         default:
183             return UMATCH_IFACECLASS_IFACESUBCLASS;
184         }
185         break;
186     default:
187         return UMATCH_IFACECLASS;
188     }
189 }
190
191 static int
192 atausb_attach(device_t dev)
193 {
194     struct atausb_softc *sc = device_get_softc(dev);
195     struct usb_attach_arg *uaa = device_get_ivars(dev);
196     usb_interface_descriptor_t *id;
197     usb_endpoint_descriptor_t *ed;
198     usbd_device_handle udev;
199     usb_device_request_t request;
200     char devinfo[1024], *proto, *subclass;
201     u_int8_t maxlun;
202     int err, i;
203
204     sc->dev = dev;
205     usbd_devinfo(uaa->device, 0, devinfo);
206     device_set_desc_copy(dev, devinfo);
207     sc->bulkin = sc->bulkout = sc->bulkirq = -1;
208     sc->bulkin_pipe = sc->bulkout_pipe= sc->bulkirq_pipe = NULL;
209     sc->iface = uaa->iface;
210     sc->ifaceno = uaa->ifaceno;
211     sc->maxlun = 0;
212     sc->timeout = 5000;
213     sc->locked_ch = NULL;
214     sc->restart_ch = NULL;
215     mtx_init(&sc->locked_mtx, "ATAUSB lock", NULL, MTX_DEF); 
216
217     id = usbd_get_interface_descriptor(sc->iface);
218     switch (id->bInterfaceProtocol) {
219     case UIPROTO_MASS_BBB:
220     case UIPROTO_MASS_BBB_OLD:
221             proto = "Bulk-Only";
222             break;
223     case UIPROTO_MASS_CBI:
224             proto = "CBI";
225             break;
226     case UIPROTO_MASS_CBI_I:
227             proto = "CBI with CCI";
228             break;
229     default:
230             proto = "Unknown";
231     }
232     switch (id->bInterfaceSubClass) {
233     case UISUBCLASS_RBC:
234             subclass = "RBC";
235             break;
236     case UISUBCLASS_QIC157:
237     case UISUBCLASS_SFF8020I:
238     case UISUBCLASS_SFF8070I:
239             subclass = "ATAPI";
240             break;
241     case UISUBCLASS_SCSI:
242             subclass = "SCSI";
243             break;
244     case UISUBCLASS_UFI:
245             subclass = "UFI";
246             break;
247     default:
248             subclass = "Unknown";
249     }
250     device_printf(dev, "using %s over %s\n", subclass, proto);
251     if (strcmp(proto, "Bulk-Only") ||
252         (strcmp(subclass, "ATAPI") && strcmp(subclass, "SCSI")))
253         return ENXIO;
254
255     for (i = 0 ; i < id->bNumEndpoints ; i++) {
256         if (!(ed = usbd_interface2endpoint_descriptor(sc->iface, i))) {
257             device_printf(sc->dev, "could not read endpoint descriptor\n");
258             return ENXIO;
259         }
260         if (UE_GET_DIR(ed->bEndpointAddress) == UE_DIR_IN &&
261             (ed->bmAttributes & UE_XFERTYPE) == UE_BULK) {
262             sc->bulkin = ed->bEndpointAddress;
263         }
264         if (UE_GET_DIR(ed->bEndpointAddress) == UE_DIR_OUT &&
265                    (ed->bmAttributes & UE_XFERTYPE) == UE_BULK) {
266             sc->bulkout = ed->bEndpointAddress;
267         }
268         if (id->bInterfaceProtocol == UIPROTO_MASS_CBI_I &&
269                    UE_GET_DIR(ed->bEndpointAddress) == UE_DIR_IN &&
270                    (ed->bmAttributes & UE_XFERTYPE) == UE_INTERRUPT) {
271             sc->bulkirq = ed->bEndpointAddress;
272         }
273     }
274
275     /* check whether we found at least the endpoints we need */
276     if (!sc->bulkin || !sc->bulkout) {
277         device_printf(sc->dev, "needed endpoints not found (%d,%d)\n",
278                       sc->bulkin, sc->bulkout);
279         atausb_detach(dev);
280         return ENXIO;
281     }
282
283     /* open the pipes */
284     if (usbd_open_pipe(sc->iface, sc->bulkout,
285                        USBD_EXCLUSIVE_USE, &sc->bulkout_pipe)) {
286         device_printf(sc->dev, "cannot open bulkout pipe (%d)\n", sc->bulkout);
287         atausb_detach(dev);
288         return ENXIO;
289     }
290     if (usbd_open_pipe(sc->iface, sc->bulkin,
291                        USBD_EXCLUSIVE_USE, &sc->bulkin_pipe)) {
292         device_printf(sc->dev, "cannot open bulkin pipe (%d)\n", sc->bulkin);
293         atausb_detach(dev);
294         return ENXIO;
295     }
296     if (id->bInterfaceProtocol == UIPROTO_MASS_CBI_I) {
297         if (usbd_open_pipe(sc->iface, sc->bulkirq,
298                            USBD_EXCLUSIVE_USE, &sc->bulkirq_pipe)) {
299             device_printf(sc->dev, "cannot open bulkirq pipe (%d)\n",
300                           sc->bulkirq);
301             atausb_detach(dev);
302             return ENXIO;
303         }
304     }
305     sc->state = ATAUSB_S_ATTACH;
306
307     /* alloc needed number of transfer handles */
308     for (i = 0; i < ATAUSB_T_MAX; i++) {
309         sc->transfer[i] = usbd_alloc_xfer(uaa->device);
310         if (!sc->transfer[i]) {
311             device_printf(sc->dev, "out of memory\n");
312             atausb_detach(dev);
313             return ENXIO;
314         }
315     }
316
317     /* driver is ready to process requests here */
318     sc->state = ATAUSB_S_IDLE;
319
320     /* get number of devices so we can add matching channels */
321     usbd_interface2device_handle(sc->iface, &udev);
322     request.bmRequestType = UT_READ_CLASS_INTERFACE;
323     request.bRequest = 0xfe; //GET_MAX_LUN;
324     USETW(request.wValue, 0);
325     USETW(request.wIndex, sc->ifaceno);
326     USETW(request.wLength, sizeof(maxlun));
327     switch ((err = usbd_do_request(udev, &request, &maxlun))) {
328     case USBD_NORMAL_COMPLETION:
329         if (bootverbose)
330             device_printf(sc->dev, "maxlun=%d\n", maxlun);
331         sc->maxlun = maxlun;
332         break;
333     default:
334         if (bootverbose)
335             device_printf(sc->dev, "get maxlun not supported %s\n",
336         usbd_errstr(err));
337     }
338
339     /* ata channels are children to this USB control device */
340     for (i = 0; i <= sc->maxlun; i++) {
341         if (!device_add_child(sc->dev, "ata",
342                               devclass_find_free_unit(ata_devclass, 2))) {
343             device_printf(sc->dev, "failed to attach ata child device\n");
344             atausb_detach(dev);
345             return ENXIO;
346         }
347     }
348     bus_generic_attach(sc->dev);
349     return 0;
350 }
351
352 static int
353 atausb_detach(device_t dev)
354 {
355     struct atausb_softc *sc = device_get_softc(dev);
356     usbd_device_handle udev;
357     device_t *children;
358     int nchildren, i;
359
360     /* signal that device is going away */
361     sc->state = ATAUSB_S_DETACH;
362
363     /* abort all the pipes in case there are active transfers */
364     usbd_interface2device_handle(sc->iface, &udev);
365     usbd_abort_default_pipe(udev);
366     if (sc->bulkout_pipe)
367         usbd_abort_pipe(sc->bulkout_pipe);
368     if (sc->bulkin_pipe)
369         usbd_abort_pipe(sc->bulkin_pipe);
370     if (sc->bulkirq_pipe)
371         usbd_abort_pipe(sc->bulkirq_pipe);
372
373     /* detach & delete all children */
374     if (!device_get_children(dev, &children, &nchildren)) {
375         for (i = 0; i < nchildren; i++)
376             device_delete_child(dev, children[i]);
377         free(children, M_TEMP);
378     }
379
380     /* free the transfers */
381     for (i = 0; i < ATAUSB_T_MAX; i++)
382         if (sc->transfer[i])
383             usbd_free_xfer(sc->transfer[i]);
384
385     /* remove all the pipes */
386     if (sc->bulkout_pipe)
387         usbd_close_pipe(sc->bulkout_pipe);
388     if (sc->bulkin_pipe)
389         usbd_close_pipe(sc->bulkin_pipe);
390     if (sc->bulkirq_pipe)
391         usbd_close_pipe(sc->bulkirq_pipe);
392
393     mtx_destroy(&sc->locked_mtx);
394     return 0;
395 }
396
397
398 /*
399  * Generic USB transfer routines 
400  */
401 static usbd_status
402 atausb_start(struct atausb_softc *sc, usbd_pipe_handle pipe,
403              void *buffer, int buflen, int flags, usbd_xfer_handle xfer)
404 {
405     usbd_status err;
406
407     if (sc->state == ATAUSB_S_DETACH)
408         return USBD_NOT_STARTED;
409
410     usbd_setup_xfer(xfer, pipe, (void *)sc, buffer, buflen, flags,
411                     sc->timeout, atausb_bbb_finish);
412     err = usbd_transfer(xfer);
413     if (err && (err != USBD_IN_PROGRESS)) {
414         if (atausbdebug)
415             device_printf(sc->dev, "failed to setup transfer, %s\n",
416                           usbd_errstr(err));
417         return err;
418     }
419     return USBD_NORMAL_COMPLETION;
420 }
421
422 static usbd_status
423 atausb_ctl_start(struct atausb_softc *sc, usbd_device_handle udev,
424                  usb_device_request_t *req, void *buffer, int buflen, int flags,
425                  usbd_xfer_handle xfer)
426 {
427     usbd_status err;
428
429     if (sc->state == ATAUSB_S_DETACH)
430         return USBD_NOT_STARTED;
431
432     usbd_setup_default_xfer(xfer, udev, (void *)sc, sc->timeout, req,
433                             buffer, buflen, flags, atausb_bbb_finish);
434     err = usbd_transfer(xfer);
435     if (err && (err != USBD_IN_PROGRESS)) {
436         if (atausbdebug)
437             device_printf(sc->dev, "failed to setup ctl transfer, %s\n",
438                           usbd_errstr(err));
439         return err;
440     }
441     return USBD_NORMAL_COMPLETION;
442 }
443
444 static void
445 atausb_clear_stall(struct atausb_softc *sc, u_int8_t endpt,
446                    usbd_pipe_handle pipe, int state, usbd_xfer_handle xfer)
447 {
448     usbd_device_handle udev;
449
450     if (atausbdebug)
451         device_printf(sc->dev, "clear endpoint 0x%02x stall\n", endpt);
452     usbd_interface2device_handle(sc->iface, &udev);
453     sc->state = state;
454     usbd_clear_endpoint_toggle(pipe);
455     sc->usb_request.bmRequestType = UT_WRITE_ENDPOINT;
456     sc->usb_request.bRequest = UR_CLEAR_FEATURE;
457     USETW(sc->usb_request.wValue, UF_ENDPOINT_HALT);
458     USETW(sc->usb_request.wIndex, endpt);
459     USETW(sc->usb_request.wLength, 0);
460     atausb_ctl_start(sc, udev, &sc->usb_request, NULL, 0, 0, xfer);
461 }
462
463
464 /*
465  * Bulk-Only transport part
466  */
467 static void
468 atausb_bbb_reset(struct atausb_softc *sc)
469 {
470     usbd_device_handle udev;
471
472     if (atausbdebug)
473         device_printf(sc->dev, "Bulk Reset\n");
474     sc->timeout = 5000;
475     sc->state = ATAUSB_S_BBB_RESET1;
476     usbd_interface2device_handle(sc->iface, &udev);
477     sc->usb_request.bmRequestType = UT_WRITE_CLASS_INTERFACE;
478     sc->usb_request.bRequest = 0xff; /* bulk-only reset */
479     USETW(sc->usb_request.wValue, 0);
480     USETW(sc->usb_request.wIndex, sc->ifaceno);
481     USETW(sc->usb_request.wLength, 0);
482     atausb_ctl_start(sc, udev, &sc->usb_request, NULL,
483                      0, 0, sc->transfer[ATAUSB_T_BBB_RESET1]);
484 }
485
486 static int
487 atausb_bbb_start(struct ata_request *request)
488 {
489     struct atausb_softc *sc = 
490         device_get_softc(device_get_parent(request->parent));
491     struct ata_channel *ch = device_get_softc(request->parent);
492
493     sc->timeout = (request->timeout * 1000) + 5000;
494     USETDW(sc->cbw.signature, CBWSIGNATURE);
495     USETDW(sc->cbw.tag, UGETDW(sc->cbw.tag) + 1);
496     USETDW(sc->cbw.transfer_length, request->bytecount);
497     sc->cbw.flags = (request->flags & ATA_R_READ) ? CBWFLAGS_IN : CBWFLAGS_OUT;
498     sc->cbw.lun = ch->unit;
499     sc->cbw.length = 16;
500     bzero(sc->cbw.cdb, 16);
501     bcopy(request->u.atapi.ccb, sc->cbw.cdb, 12); /* XXX SOS */
502     sc->state = ATAUSB_S_BBB_COMMAND;
503     if (atausb_start(sc, sc->bulkout_pipe, &sc->cbw, sizeof(struct bbb_cbw),
504                      0, sc->transfer[ATAUSB_T_BBB_CBW])) {
505         request->result = EIO;
506         if (atausbdebug)
507             device_printf(request->dev, "cannot setup USB transfer\n");
508         atausb_bbb_reset(sc);
509         return ATA_OP_FINISHED;
510     }
511     return ATA_OP_CONTINUES;
512 }
513
514 static void
515 atausb_bbb_finish(usbd_xfer_handle xfer, usbd_private_handle priv,
516                  usbd_status err)
517 {
518     struct atausb_softc *sc = (struct atausb_softc *)priv;
519     struct ata_request *request = sc->ata_request;
520     usbd_xfer_handle next_xfer;
521
522     //device_printf(sc->dev, "BBB state %d: %s\n", sc->state, usbd_errstr(err));
523
524     if (sc->state == ATAUSB_S_DETACH) {
525         device_printf(sc->dev, "WARNING - device has been removed\n");
526         return;
527     }
528
529     switch (sc->state) {
530     case ATAUSB_S_BBB_COMMAND:  /* command transport phase */
531         if (err) {
532             if (atausbdebug)
533                 device_printf(sc->dev, "failed to send CBW\n");
534             request->result = EIO;
535             atausb_bbb_reset(sc);
536             return;
537         }
538
539         /* next is data transport phase, setup transfer */
540         sc->state = ATAUSB_S_BBB_DATA;
541         if (request->flags & ATA_R_READ) {
542             if (atausb_start(sc, sc->bulkin_pipe,
543                              request->data, request->bytecount,
544                              USBD_SHORT_XFER_OK,
545                              sc->transfer[ATAUSB_T_BBB_DATA])) {
546                 request->result = EIO;
547                 atausb_bbb_reset(sc);
548             }
549             return;
550         }
551         if (request->flags & ATA_R_WRITE) {
552             if (atausb_start(sc, sc->bulkout_pipe,
553                              request->data, request->bytecount,
554                              0, sc->transfer[ATAUSB_T_BBB_DATA])) {
555                 request->result = EIO;
556                 atausb_bbb_reset(sc);
557             }
558             return;
559         }
560         /* FALLTHROUGH */
561
562     case ATAUSB_S_BBB_DATA:     /* data transport phase */
563         if (request->flags & (ATA_R_READ | ATA_R_WRITE)) {
564             usbd_get_xfer_status(xfer, NULL, NULL, &request->donecount, NULL);
565             if (err) {
566                 if (atausbdebug)
567                     device_printf(sc->dev, "data %s count %d failed: %s\n",
568                                   (request->flags & ATA_R_READ?"read":"write"),
569                                   request->bytecount, usbd_errstr(err));
570                 if (err == USBD_STALLED) {
571                     atausb_clear_stall(sc,
572                                        (request->flags & ATA_R_READ ?
573                                         sc->bulkin : sc->bulkout),
574                                        (request->flags & ATA_R_READ ?
575                                         sc->bulkin_pipe : sc->bulkout_pipe),
576                                        ATAUSB_S_BBB_DCLEAR,
577                                        sc->transfer[ATAUSB_T_BBB_DCLEAR]);
578                 }
579                 else {
580                     request->result = EIO;
581                     atausb_bbb_reset(sc);
582                 }
583                 return;
584             }
585         }
586         /* FALLTHROUGH */
587
588     case ATAUSB_S_BBB_DCLEAR:   /* stall clear after data phase */
589     case ATAUSB_S_BBB_SCLEAR:   /* stall clear after status phase */
590         if (err) {
591             if (atausbdebug)
592                 device_printf(sc->dev, "bulk%s stall clear failed %s\n",
593                               (request->flags & ATA_R_READ ? "in" : "out"),
594                               usbd_errstr(err));
595             request->result = EIO;
596             atausb_bbb_reset(sc);
597             return;
598         }
599
600         if (sc->state == ATAUSB_S_BBB_COMMAND ||
601             sc->state == ATAUSB_S_BBB_DATA ||
602             sc->state == ATAUSB_S_BBB_DCLEAR) {
603             /* first attempt on status transport phase setup transfer */
604             sc->state = ATAUSB_S_BBB_STATUS1;
605             next_xfer = sc->transfer[ATAUSB_T_BBB_CSW1];
606         }
607         else {
608             /* second attempt of fetching status */
609             sc->state = ATAUSB_S_BBB_STATUS2;
610             next_xfer = sc->transfer[ATAUSB_T_BBB_CSW2];
611         }
612         if (atausb_start(sc, sc->bulkin_pipe, &sc->csw, sizeof(struct bbb_csw),
613                          USBD_SHORT_XFER_OK, next_xfer)) {
614             request->result = EIO;
615             atausb_bbb_reset(sc);
616         }
617         return;
618
619     case ATAUSB_S_BBB_STATUS1:  /* status transfer first attempt */
620     case ATAUSB_S_BBB_STATUS2:  /* status transfer second attempt */
621         if (err) {
622             if (atausbdebug)
623                 device_printf(sc->dev, "cannot get CSW, %s%s\n",
624                               usbd_errstr(err),
625                               sc->state == ATAUSB_S_BBB_STATUS1 ? ", retry":"");
626             if (sc->state == ATAUSB_S_BBB_STATUS1) {
627                 atausb_clear_stall(sc, sc->bulkin, sc->bulkin_pipe,
628                                    ATAUSB_S_BBB_SCLEAR,
629                                    sc->transfer[ATAUSB_T_BBB_SCLEAR]);
630             }
631             else {
632                 request->result = EIO;
633                 atausb_bbb_reset(sc);
634             }
635             return;
636         }
637
638         int residue = UGETDW(sc->csw.residue);
639
640         if (!residue &&
641             (request->bytecount - request->donecount))
642             residue = request->bytecount - request->donecount;
643
644         /* check CSW and handle eventual error */
645         if (UGETDW(sc->csw.signature) != CSWSIGNATURE) {
646             if (atausbdebug)
647                 device_printf(sc->dev, "bad CSW signature 0x%08x != 0x%08x\n",
648                               UGETDW(sc->csw.signature), CSWSIGNATURE);
649             request->result = EIO;
650             atausb_bbb_reset(sc);
651             return;
652         }
653         else if (UGETDW(sc->csw.tag) != UGETDW(sc->cbw.tag)) {
654             if (atausbdebug)
655                 device_printf(sc->dev, "bad CSW tag %d != %d\n",
656                               UGETDW(sc->csw.tag), UGETDW(sc->cbw.tag));
657             request->result = EIO;
658             atausb_bbb_reset(sc);
659             return;
660         }
661         else if (sc->csw.status > CSWSTATUS_PHASE) {
662             if (atausbdebug)
663                 device_printf(sc->dev, "bad CSW status %d > %d\n",
664                               sc->csw.status, CSWSTATUS_PHASE);
665             request->result = EIO;
666             atausb_bbb_reset(sc);
667             return;
668         }
669         else if (sc->csw.status == CSWSTATUS_PHASE) {
670             if (atausbdebug)
671                 device_printf(sc->dev, "phase error residue = %d\n", residue);
672             request->result = EIO;
673             atausb_bbb_reset(sc);
674             return;
675         }
676         else if (request->donecount > request->bytecount) {
677             if (atausbdebug)
678                 device_printf(sc->dev, "buffer overrun %d > %d",
679                              request->donecount, request->bytecount);
680             request->result = EIO;
681             atausb_bbb_reset(sc);
682             return;
683         }
684         else if (sc->csw.status == CSWSTATUS_FAILED) {
685             if (atausbdebug)
686                 device_printf(sc->dev, "CSWSTATUS_FAILED\n");
687             request->error = ATA_E_ATAPI_SENSE_MASK ;
688             sc->state = ATAUSB_S_IDLE;
689             ata_interrupt(device_get_softc(request->parent));
690             return;
691         }
692         else {
693             sc->state = ATAUSB_S_IDLE;
694             ata_interrupt(device_get_softc(request->parent));
695             return;
696         }
697         /* NOT REACHED */
698
699     case ATAUSB_S_BBB_RESET1:
700         if (err)
701             if (atausbdebug)
702                 device_printf(sc->dev,
703                               "BBB reset failure: %s\n", usbd_errstr(err));
704         atausb_clear_stall(sc, sc->bulkin, sc->bulkin_pipe,
705                            ATAUSB_S_BBB_RESET2,
706                            sc->transfer[ATAUSB_T_BBB_RESET2]);
707         return;
708
709     case ATAUSB_S_BBB_RESET2:
710         if (err)
711             if (atausbdebug)
712                 device_printf(sc->dev, "BBB bulkin clear stall failure: %s\n",
713                               usbd_errstr(err));
714         atausb_clear_stall(sc, sc->bulkout, sc->bulkout_pipe,
715                            ATAUSB_S_BBB_RESET3,
716                            sc->transfer[ATAUSB_T_BBB_RESET3]);
717         return;
718
719     case ATAUSB_S_BBB_RESET3:
720         if (err)
721             if (atausbdebug)
722                 device_printf(sc->dev, "BBB bulk-out clear stall failure: %s\n",
723                               usbd_errstr(err));
724         sc->state = ATAUSB_S_IDLE;
725         if (request) {
726             if (err)
727                 request->result = ENXIO;
728             else
729                 request->result = EIO;
730             ata_interrupt(device_get_softc(request->parent));
731         }
732         return;
733
734     default:
735         if (atausbdebug)
736             device_printf(sc->dev, "unknown state %d", sc->state);
737     }
738 }
739
740
741 /*
742  * ATA backend part
743  */
744 struct atapi_inquiry {
745     u_int8_t    device_type;
746     u_int8_t    device_modifier;
747     u_int8_t    version;
748     u_int8_t    response_format;
749     u_int8_t    length;
750     u_int8_t    reserved[2];
751     u_int8_t    flags;
752     u_int8_t    vendor[8];
753     u_int8_t    product[16];
754     u_int8_t    revision[4];
755     //u_int8_t    crap[60];
756 };
757
758 int
759 ata_usbchannel_begin_transaction(struct ata_request *request)
760 {
761     struct atausb_softc *sc = 
762         device_get_softc(device_get_parent(request->parent));
763
764     if (atausbdebug > 1)
765         device_printf(request->dev, "begin_transaction %s\n",
766                       ata_cmd2str(request));
767
768     /* sanity just in case */
769     if (sc->state != ATAUSB_S_IDLE) {
770         printf("begin is busy (%d)\n", sc->state);
771         request->result = EBUSY;
772         return ATA_OP_FINISHED;
773     }
774
775     /* XXX SOS convert the request into the format used, only BBB for now*/
776     sc->ata_request = request;
777
778     /* ATA/ATAPI IDENTIFY needs special treatment */
779     if (!(request->flags & ATA_R_ATAPI)) {
780         if (request->u.ata.command != ATA_ATAPI_IDENTIFY) {
781             device_printf(request->dev,"%s unsupported\n",ata_cmd2str(request));
782             request->result = EIO;
783             return ATA_OP_FINISHED;
784         }
785         request->flags |= ATA_R_ATAPI;
786         bzero(request->u.atapi.ccb, 16);
787         request->u.atapi.ccb[0] = ATAPI_INQUIRY;
788         request->u.atapi.ccb[4] =  255; //sizeof(struct atapi_inquiry);
789         request->data += 256;   /* arbitrary offset into ata_param */
790         request->bytecount = 255; //sizeof(struct atapi_inquiry);
791     }
792     return atausb_bbb_start(request);
793 }
794
795 int
796 ata_usbchannel_end_transaction(struct ata_request *request)
797 {
798     if (atausbdebug > 1)
799         device_printf(request->dev, "end_transaction %s\n",
800                       ata_cmd2str(request));
801     
802     /* XXX SOS convert the request from the format used, only BBB for now*/
803
804     /* ATA/ATAPI IDENTIFY needs special treatment */
805     if ((request->flags & ATA_R_ATAPI) &&
806         (request->u.atapi.ccb[0] == ATAPI_INQUIRY)) {
807         struct ata_device *atadev = device_get_softc(request->dev);
808         struct atapi_inquiry *inquiry = (struct atapi_inquiry *)request->data;
809         u_int16_t *ptr;
810
811         /* convert inquiry data into simple ata_param like format */
812         atadev->param.config = ATA_PROTO_ATAPI | ATA_PROTO_ATAPI_12;
813         atadev->param.config |= (inquiry->device_type & 0x1f) << 8;
814         bzero(atadev->param.model, sizeof(atadev->param.model));
815         strncpy(atadev->param.model, inquiry->vendor, 8);
816         strcpy(atadev->param.model, "  ");
817         strncpy(atadev->param.model, inquiry->product, 16);
818         ptr = (u_int16_t*)(atadev->param.model + sizeof(atadev->param.model));
819         while (--ptr >= (u_int16_t*)atadev->param.model)
820             *ptr = ntohs(*ptr);
821         strncpy(atadev->param.revision, inquiry->revision, 4);
822         ptr=(u_int16_t*)(atadev->param.revision+sizeof(atadev->param.revision));
823         while (--ptr >= (u_int16_t*)atadev->param.revision)
824             *ptr = ntohs(*ptr);
825         request->result = 0;
826     }
827     return ATA_OP_FINISHED;
828 }
829
830 static int
831 ata_usbchannel_probe(device_t dev)
832 {
833     struct ata_channel *ch = device_get_softc(dev);
834     device_t *children;
835     int count, i;
836     char buffer[32];
837
838     /* take care of green memory */
839     bzero(ch, sizeof(struct ata_channel));
840
841     /* find channel number on this controller */
842     device_get_children(device_get_parent(dev), &children, &count);
843     for (i = 0; i < count; i++) {
844         if (children[i] == dev)
845             ch->unit = i;
846     }
847     free(children, M_TEMP);
848
849     sprintf(buffer, "USB lun %d", ch->unit);
850     device_set_desc_copy(dev, buffer);
851
852     return 0;
853 }
854
855 static int
856 ata_usbchannel_attach(device_t dev)
857 {
858     struct ata_channel *ch = device_get_softc(dev);
859
860     /* initialize the softc basics */
861     ch->dev = dev;
862     ch->state = ATA_IDLE;
863     ch->hw.begin_transaction = ata_usbchannel_begin_transaction;
864     ch->hw.end_transaction = ata_usbchannel_end_transaction;
865     ch->hw.status = NULL;
866     ch->hw.command = NULL;
867     bzero(&ch->state_mtx, sizeof(struct mtx));
868     mtx_init(&ch->state_mtx, "ATA state lock", NULL, MTX_DEF);
869     bzero(&ch->queue_mtx, sizeof(struct mtx));
870     mtx_init(&ch->queue_mtx, "ATA queue lock", NULL, MTX_DEF);
871     TAILQ_INIT(&ch->ata_queue);
872
873     /* XXX SOS reset the controller HW, the channel and device(s) */
874     //ATA_RESET(dev);
875
876     /* probe and attach device on this channel */
877     ch->devices = ATA_ATAPI_MASTER;
878     if (!ata_delayed_attach)
879         ata_identify(dev);
880     return 0;
881 }
882
883 static int
884 ata_usbchannel_detach(device_t dev)
885 {
886     struct ata_channel *ch = device_get_softc(dev);
887     device_t *children;
888     int nchildren, i;
889
890     /* detach & delete all children */
891     if (!device_get_children(dev, &children, &nchildren)) {
892         for (i = 0; i < nchildren; i++)
893             if (children[i])
894                 device_delete_child(dev, children[i]);
895         free(children, M_TEMP);
896     }
897     mtx_destroy(&ch->state_mtx);
898     mtx_destroy(&ch->queue_mtx);
899     return 0;
900 }
901
902 static void
903 ata_usbchannel_setmode(device_t parent, device_t dev)
904 {
905     struct atausb_softc *sc = device_get_softc(GRANDPARENT(dev));
906     struct ata_device *atadev = device_get_softc(dev);
907     usbd_device_handle udev;
908
909     usbd_interface2device_handle(sc->iface, &udev);
910     if (usbd_get_speed(udev) == USB_SPEED_HIGH)
911         atadev->mode = ATA_USB2;
912     else
913         atadev->mode = ATA_USB1;
914 }
915
916 static int
917 ata_usbchannel_locking(device_t dev, int flags)
918 {
919     struct atausb_softc *sc = device_get_softc(device_get_parent(dev));
920     struct ata_channel *ch = device_get_softc(dev);
921     int res = -1;
922
923
924     mtx_lock(&sc->locked_mtx);
925     switch (flags) {
926     case ATA_LF_LOCK:
927         if (sc->locked_ch == NULL)
928             sc->locked_ch = ch;
929         if (sc->locked_ch != ch)
930             sc->restart_ch = ch;
931         break;
932
933     case ATA_LF_UNLOCK:
934         if (sc->locked_ch == ch) {
935             sc->locked_ch = NULL;
936             if (sc->restart_ch) {
937                 ch = sc->restart_ch;
938                 sc->restart_ch = NULL;
939                 mtx_unlock(&sc->locked_mtx);
940                 ata_start(ch->dev);
941                 return res;
942             }
943         }
944         break;
945
946     case ATA_LF_WHICH:
947         break;
948     }
949     if (sc->locked_ch)
950         res = sc->locked_ch->unit;
951     mtx_unlock(&sc->locked_mtx);
952     return res;
953 }
954
955 static device_method_t ata_usbchannel_methods[] = {
956     /* device interface */
957     DEVMETHOD(device_probe,         ata_usbchannel_probe),
958     DEVMETHOD(device_attach,        ata_usbchannel_attach),
959     DEVMETHOD(device_detach,        ata_usbchannel_detach),
960
961     /* ATA methods */
962     DEVMETHOD(ata_setmode,        ata_usbchannel_setmode),
963     DEVMETHOD(ata_locking,        ata_usbchannel_locking),
964     //DEVMETHOD(ata_reset,        ata_usbchannel_reset),
965
966     { 0, 0 }
967 };
968
969 static driver_t ata_usbchannel_driver = {
970     "ata",
971     ata_usbchannel_methods,
972     sizeof(struct ata_channel),
973 };
974
975 DRIVER_MODULE(ata, atausb, ata_usbchannel_driver, ata_devclass, 0, 0);
976 MODULE_DEPEND(atausb, ata, 1, 1, 1);