atapi-cam.c revision 203449
1/*-
2 * Copyright (c) 2001-2007 Thomas Quinot <thomas@cuivre.fr.eu.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 * 3. The name of the author may not be used to endorse or promote products
15 *    derived from this software without specific prior written permission.
16 *
17 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
18 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
19 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
20 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
21 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
22 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 */
28
29#include <sys/cdefs.h>
30__FBSDID("$FreeBSD: head/sys/dev/ata/atapi-cam.c 203449 2010-02-03 21:45:09Z mav $");
31
32#include <sys/param.h>
33#include <sys/systm.h>
34#include <sys/bus.h>
35#include <sys/kernel.h>
36#include <sys/malloc.h>
37#include <sys/ata.h>
38#include <sys/taskqueue.h>
39#include <sys/lock.h>
40#include <sys/mutex.h>
41#include <sys/sema.h>
42#include <vm/uma.h>
43#include <machine/resource.h>
44#include <machine/bus.h>
45
46#include <cam/cam.h>
47#include <cam/cam_ccb.h>
48#include <cam/cam_periph.h>
49#include <cam/cam_sim.h>
50#include <cam/cam_xpt_sim.h>
51#include <cam/cam_debug.h>
52#include <cam/scsi/scsi_all.h>
53
54#include <dev/ata/ata-all.h>
55#include <ata_if.h>
56
57/* private data associated with an ATA bus */
58struct atapi_xpt_softc {
59    struct ata_device   atapi_cam_dev;  /* must be first */
60    device_t            dev;
61    device_t            parent;
62    struct ata_channel  *ata_ch;
63    struct cam_path     *path;
64    struct cam_sim      *sim;
65    int                 flags;
66#define BUS_REGISTERED          0x01
67#define RESOURCE_SHORTAGE       0x02
68#define DETACHING               0x04
69
70    TAILQ_HEAD(,atapi_hcb) pending_hcbs;
71    struct ata_device   *atadev[2];
72    struct mtx          state_lock;
73};
74
75/* hardware command descriptor block */
76struct atapi_hcb {
77    struct atapi_xpt_softc *softc;
78    int                 unit;
79    int                 bus;
80    int                 target;
81    int                 lun;
82    union ccb           *ccb;
83    int                 flags;
84#define QUEUED          0x0001
85#define AUTOSENSE       0x0002
86    char                *dxfer_alloc;
87    TAILQ_ENTRY(atapi_hcb) chain;
88};
89
90enum reinit_reason { BOOT_ATTACH, ATTACH, RESET };
91
92/* Device methods */
93static void atapi_cam_identify(driver_t *dev, device_t parent);
94static int atapi_cam_probe(device_t dev);
95static int atapi_cam_attach(device_t dev);
96static int atapi_cam_detach(device_t dev);
97static int atapi_cam_reinit(device_t dev);
98
99/* CAM XPT methods */
100static void atapi_action(struct cam_sim *, union ccb *);
101static void atapi_poll(struct cam_sim *);
102static void atapi_async(void *, u_int32_t, struct cam_path *, void *);
103static void atapi_cb(struct ata_request *);
104
105/* Module methods */
106static int atapi_cam_event_handler(module_t mod, int what, void *arg);
107
108/* internal functions */
109static void reinit_bus(struct atapi_xpt_softc *scp, enum reinit_reason reason);
110static void setup_async_cb(struct atapi_xpt_softc *, uint32_t);
111static void cam_rescan(struct cam_sim *);
112static void free_hcb_and_ccb_done(struct atapi_hcb *, u_int32_t);
113static struct atapi_hcb *allocate_hcb(struct atapi_xpt_softc *, int, int, union ccb *);
114static void free_hcb(struct atapi_hcb *hcb);
115static void free_softc(struct atapi_xpt_softc *scp);
116
117static MALLOC_DEFINE(M_ATACAM, "ata_cam", "ATA driver CAM-XPT layer");
118
119static device_method_t atapi_cam_methods[] = {
120	DEVMETHOD(device_identify,      atapi_cam_identify),
121	DEVMETHOD(device_probe,         atapi_cam_probe),
122	DEVMETHOD(device_attach,        atapi_cam_attach),
123	DEVMETHOD(device_detach,        atapi_cam_detach),
124	DEVMETHOD(ata_reinit,           atapi_cam_reinit),
125	{0, 0}
126};
127
128static driver_t atapi_cam_driver = {
129	"atapicam",
130	atapi_cam_methods,
131	sizeof(struct atapi_xpt_softc)
132};
133
134static devclass_t       atapi_cam_devclass;
135DRIVER_MODULE(atapicam, ata,
136	atapi_cam_driver,
137	atapi_cam_devclass,
138	atapi_cam_event_handler,
139	/*arg*/NULL);
140MODULE_VERSION(atapicam, 1);
141MODULE_DEPEND(atapicam, ata, 1, 1, 1);
142MODULE_DEPEND(atapicam, cam, 1, 1, 1);
143
144static void
145atapi_cam_identify(driver_t *driver, device_t parent)
146{
147	struct atapi_xpt_softc *scp =
148	    malloc (sizeof (struct atapi_xpt_softc), M_ATACAM, M_NOWAIT|M_ZERO);
149	device_t child;
150
151	if (scp == NULL) {
152		printf ("atapi_cam_identify: out of memory");
153		return;
154	}
155
156	/* Assume one atapicam instance per parent channel instance. */
157	child = device_add_child(parent, "atapicam", -1);
158	if (child == NULL) {
159		printf ("atapi_cam_identify: out of memory, can't add child");
160		free (scp, M_ATACAM);
161		return;
162	}
163	scp->atapi_cam_dev.unit = -1;
164	scp->atapi_cam_dev.dev  = child;
165	device_quiet(child);
166	device_set_softc(child, scp);
167}
168
169static int
170atapi_cam_probe(device_t dev)
171{
172	struct ata_device *atadev = device_get_softc (dev);
173
174	KASSERT(atadev != NULL, ("expect valid struct ata_device"));
175	if (atadev->unit < 0) {
176		device_set_desc(dev, "ATAPI CAM Attachment");
177		return (0);
178	} else {
179		return ENXIO;
180	}
181}
182
183static int
184atapi_cam_attach(device_t dev)
185{
186    struct atapi_xpt_softc *scp = NULL;
187    struct cam_devq *devq = NULL;
188    struct cam_sim *sim = NULL;
189    struct cam_path *path = NULL;
190    int unit, error;
191
192    scp = (struct atapi_xpt_softc *)device_get_softc(dev);
193    if (scp == NULL) {
194	device_printf(dev, "Cannot get softc\n");
195	return (ENOMEM);
196    }
197
198    mtx_init(&scp->state_lock, "ATAPICAM lock", NULL, MTX_DEF);
199
200    scp->dev = dev;
201    scp->parent = device_get_parent(dev);
202    scp->ata_ch = device_get_softc(scp->parent);
203    TAILQ_INIT(&scp->pending_hcbs);
204    unit = device_get_unit(device_get_parent(dev));
205
206    if ((devq = cam_simq_alloc(16)) == NULL) {
207	error = ENOMEM;
208	goto out;
209    }
210
211    if ((sim = cam_sim_alloc(atapi_action, atapi_poll, "ata",
212		 (void *)scp, unit, &scp->state_lock, 1, 1, devq)) == NULL) {
213	error = ENOMEM;
214	goto out;
215    }
216    scp->sim = sim;
217
218    mtx_lock(&scp->state_lock);
219    if (xpt_bus_register(sim, dev, 0) != CAM_SUCCESS) {
220	error = EINVAL;
221	mtx_unlock(&scp->state_lock);
222	goto out;
223    }
224    scp->flags |= BUS_REGISTERED;
225
226    if (xpt_create_path(&path, /*periph*/ NULL,
227		cam_sim_path(sim), CAM_TARGET_WILDCARD,
228		CAM_LUN_WILDCARD) != CAM_REQ_CMP) {
229	error = ENOMEM;
230	mtx_unlock(&scp->state_lock);
231	goto out;
232    }
233    scp->path = path;
234
235    CAM_DEBUG(path, CAM_DEBUG_TRACE, ("Registered SIM for ata%d\n", unit));
236
237    setup_async_cb(scp, AC_LOST_DEVICE);
238    reinit_bus(scp, cold ? BOOT_ATTACH : ATTACH);
239    error = 0;
240    mtx_unlock(&scp->state_lock);
241
242out:
243    if (error != 0)
244	free_softc(scp);
245
246    return (error);
247}
248
249static int
250atapi_cam_detach(device_t dev)
251{
252    struct atapi_xpt_softc *scp = device_get_softc(dev);
253
254    mtx_lock(&scp->state_lock);
255    if (xpt_sim_opened(scp->sim)) {
256	    mtx_unlock(&scp->state_lock);
257	    return (EBUSY);
258    }
259    xpt_freeze_simq(scp->sim, 1 /*count*/);
260    scp->flags |= DETACHING;
261    mtx_unlock(&scp->state_lock);
262    free_softc(scp);
263    return (0);
264}
265
266static int
267atapi_cam_reinit(device_t dev) {
268    struct atapi_xpt_softc *scp = device_get_softc(dev);
269
270    /*
271     * scp might be null if the bus is being reinitialised during
272     * the boot-up sequence, before the ATAPI bus is registered.
273     */
274
275    if (scp != NULL) {
276	mtx_lock(&scp->state_lock);
277	reinit_bus(scp, RESET);
278	mtx_unlock(&scp->state_lock);
279    }
280    return (0);
281}
282
283static void
284reinit_bus(struct atapi_xpt_softc *scp, enum reinit_reason reason) {
285    struct ata_device *old_atadev[2], *atadev;
286    device_t *children;
287    int nchildren, i, dev_changed;
288
289    if (device_get_children(scp->parent, &children, &nchildren) != 0) {
290	return;
291    }
292
293    old_atadev[0] = scp->atadev[0];
294    old_atadev[1] = scp->atadev[1];
295    scp->atadev[0] = NULL;
296    scp->atadev[1] = NULL;
297
298    for (i = 0; i < nchildren; i++) {
299	/* XXX Does the child need to actually be attached yet? */
300	if (children[i] != NULL) {
301	    atadev = device_get_softc(children[i]);
302	    if ((atadev->unit == ATA_MASTER) &&
303		(scp->ata_ch->devices & ATA_ATAPI_MASTER) != 0)
304		scp->atadev[0] = atadev;
305	    if ((atadev->unit == ATA_SLAVE) &&
306		(scp->ata_ch->devices & ATA_ATAPI_SLAVE) != 0)
307		scp->atadev[1] = atadev;
308	}
309    }
310    dev_changed = (old_atadev[0] != scp->atadev[0])
311	       || (old_atadev[1] != scp->atadev[1]);
312    free(children, M_TEMP);
313
314    switch (reason) {
315	case BOOT_ATTACH:
316	case ATTACH:
317	    break;
318	case RESET:
319	    xpt_async(AC_BUS_RESET, scp->path, NULL);
320
321	    if (!dev_changed)
322		break;
323
324	    cam_rescan(scp->sim);
325	    break;
326    }
327}
328
329static void
330setup_async_cb(struct atapi_xpt_softc *scp, uint32_t events)
331{
332    struct ccb_setasync csa;
333
334    xpt_setup_ccb(&csa.ccb_h, scp->path, /*priority*/ 5);
335    csa.ccb_h.func_code = XPT_SASYNC_CB;
336    csa.event_enable = events;
337    csa.callback = &atapi_async;
338    csa.callback_arg = scp->sim;
339    xpt_action((union ccb *) &csa);
340}
341
342static void
343atapi_action(struct cam_sim *sim, union ccb *ccb)
344{
345    struct atapi_xpt_softc *softc = (struct atapi_xpt_softc*)cam_sim_softc(sim);
346    struct ccb_hdr *ccb_h = &ccb->ccb_h;
347    struct atapi_hcb *hcb = NULL;
348    struct ata_request *request = NULL;
349    int unit = cam_sim_unit(sim);
350    int bus = cam_sim_bus(sim);
351    int len;
352    char *buf;
353
354    switch (ccb_h->func_code) {
355    case XPT_PATH_INQ: {
356	struct ccb_pathinq *cpi = &ccb->cpi;
357	int tid = ccb_h->target_id;
358
359	cpi->version_num = 1;
360	cpi->hba_inquiry = 0;
361	cpi->target_sprt = 0;
362	cpi->hba_misc = PIM_NO_6_BYTE;
363	cpi->hba_eng_cnt = 0;
364	bzero(cpi->vuhba_flags, sizeof(cpi->vuhba_flags));
365	cpi->max_target = 1;
366	cpi->max_lun = 0;
367	cpi->async_flags = 0;
368	cpi->hpath_id = 0;
369	cpi->initiator_id = 7;
370	strncpy(cpi->sim_vid, "FreeBSD", sizeof(cpi->sim_vid));
371	strncpy(cpi->hba_vid, "ATAPI", sizeof(cpi->hba_vid));
372	strncpy(cpi->dev_name, cam_sim_name(sim), sizeof cpi->dev_name);
373	cpi->unit_number = cam_sim_unit(sim);
374	cpi->bus_id = cam_sim_bus(sim);
375	cpi->base_transfer_speed = 3300;
376	cpi->transport = XPORT_SPI;
377	cpi->transport_version = 2;
378	cpi->protocol = PROTO_SCSI;
379	cpi->protocol_version = SCSI_REV_2;
380
381	if (softc->ata_ch && tid != CAM_TARGET_WILDCARD) {
382	    if (softc->atadev[tid] == NULL) {
383		ccb->ccb_h.status = CAM_DEV_NOT_THERE;
384		xpt_done(ccb);
385		return;
386	    }
387	    switch (softc->atadev[ccb_h->target_id]->mode) {
388	    case ATA_PIO1:
389		cpi->base_transfer_speed = 5200;
390		break;
391	    case ATA_PIO2:
392		cpi->base_transfer_speed = 7000;
393		break;
394	    case ATA_PIO3:
395		cpi->base_transfer_speed = 11000;
396		break;
397	    case ATA_PIO4:
398	    case ATA_DMA:
399	    case ATA_WDMA2:
400		cpi->base_transfer_speed = 16000;
401		break;
402	    case ATA_UDMA2:
403		cpi->base_transfer_speed = 33000;
404		break;
405	    case ATA_UDMA4:
406		cpi->base_transfer_speed = 66000;
407		break;
408	    case ATA_UDMA5:
409		cpi->base_transfer_speed = 100000;
410		break;
411	    case ATA_UDMA6:
412		cpi->base_transfer_speed = 133000;
413		break;
414	    case ATA_SA150:
415		cpi->base_transfer_speed = 150000;
416		break;
417	    case ATA_SA300:
418		cpi->base_transfer_speed = 300000;
419		break;
420	    default:
421		break;
422	    }
423	}
424	cpi->maxio = softc->ata_ch->dma.max_iosize ?
425	    softc->ata_ch->dma.max_iosize : DFLTPHYS;
426	ccb->ccb_h.status = CAM_REQ_CMP;
427	xpt_done(ccb);
428	return;
429    }
430
431    case XPT_RESET_DEV: {
432	int tid = ccb_h->target_id;
433
434	CAM_DEBUG(ccb->ccb_h.path, CAM_DEBUG_SUBTRACE, ("dev reset\n"));
435	mtx_unlock(&softc->state_lock);
436	ata_controlcmd(softc->atadev[tid]->dev, ATA_DEVICE_RESET, 0, 0, 0);
437	mtx_lock(&softc->state_lock);
438	ccb->ccb_h.status = CAM_REQ_CMP;
439	xpt_done(ccb);
440	return;
441    }
442
443    case XPT_RESET_BUS:
444	CAM_DEBUG(ccb->ccb_h.path, CAM_DEBUG_SUBTRACE, ("bus reset\n"));
445	mtx_unlock(&softc->state_lock);
446	ata_reinit(softc->parent);
447	mtx_lock(&softc->state_lock);
448	ccb->ccb_h.status = CAM_REQ_CMP;
449	xpt_done(ccb);
450	return;
451
452    case XPT_SET_TRAN_SETTINGS:
453	/* ignore these, we're not doing SCSI here */
454	CAM_DEBUG(ccb->ccb_h.path, CAM_DEBUG_SUBTRACE,
455		  ("SET_TRAN_SETTINGS not supported\n"));
456	ccb->ccb_h.status = CAM_FUNC_NOTAVAIL;
457	xpt_done(ccb);
458	return;
459
460    case XPT_GET_TRAN_SETTINGS: {
461	struct ccb_trans_settings *cts = &ccb->cts;
462	cts->protocol = PROTO_SCSI;
463	cts->protocol_version = SCSI_REV_2;
464	cts->transport = XPORT_SPI;
465	cts->transport_version = XPORT_VERSION_UNSPECIFIED;
466    	cts->proto_specific.valid = 0;
467    	cts->xport_specific.valid = 0;
468	/* nothing more to do */
469	ccb->ccb_h.status = CAM_REQ_CMP;
470	CAM_DEBUG(ccb->ccb_h.path, CAM_DEBUG_SUBTRACE, ("GET_TRAN_SETTINGS\n"));
471	xpt_done(ccb);
472	return;
473    }
474
475    case XPT_CALC_GEOMETRY: {
476	CAM_DEBUG(ccb->ccb_h.path, CAM_DEBUG_SUBTRACE, ("CALC_GEOMETRY\n"));
477	cam_calc_geometry(&ccb->ccg, /*extended*/1);
478	xpt_done(ccb);
479	return;
480    }
481
482    case XPT_SCSI_IO: {
483	struct ccb_scsiio *csio = &ccb->csio;
484	int tid = ccb_h->target_id, lid = ccb_h->target_lun;
485	int request_flags = ATA_R_ATAPI;
486
487	CAM_DEBUG(ccb_h->path, CAM_DEBUG_SUBTRACE, ("XPT_SCSI_IO\n"));
488
489	if (softc->flags & DETACHING) {
490	    ccb->ccb_h.status = CAM_REQ_ABORTED;
491	    xpt_done(ccb);
492	    return;
493	}
494
495	if (softc->atadev[tid] == NULL) {
496	    ccb->ccb_h.status = CAM_DEV_NOT_THERE;
497	    xpt_done(ccb);
498	    return;
499	}
500
501	/* check that this request was not aborted already */
502	if ((ccb_h->status & CAM_STATUS_MASK) != CAM_REQ_INPROG) {
503	    printf("XPT_SCSI_IO received but already in progress?\n");
504	    xpt_done(ccb);
505	    return;
506	}
507	if (lid > 0) {
508	    CAM_DEBUG(ccb_h->path, CAM_DEBUG_SUBTRACE,
509		      ("SCSI IO received for invalid lun %d\n", lid));
510	    goto action_invalid;
511	}
512	if (csio->cdb_len > sizeof request->u.atapi.ccb) {
513	    CAM_DEBUG(ccb_h->path, CAM_DEBUG_SUBTRACE,
514		("CAM CCB too long for ATAPI"));
515	    goto action_invalid;
516	}
517	if ((ccb_h->flags & CAM_SCATTER_VALID)) {
518	    /* scatter-gather not supported */
519	    xpt_print_path(ccb_h->path);
520	    printf("ATAPI/CAM does not support scatter-gather yet!\n");
521	    goto action_invalid;
522	}
523
524	switch (ccb_h->flags & CAM_DIR_MASK) {
525	case CAM_DIR_IN:
526	     request_flags |= ATA_R_READ;
527	     break;
528	case CAM_DIR_OUT:
529	     request_flags |= ATA_R_WRITE;
530	     break;
531	case CAM_DIR_NONE:
532	     /* No flags need to be set */
533	     break;
534	default:
535	     device_printf(softc->dev, "unknown IO operation\n");
536	     goto action_invalid;
537	}
538
539	if ((hcb = allocate_hcb(softc, unit, bus, ccb)) == NULL) {
540	    printf("cannot allocate ATAPI/CAM hcb\n");
541	    goto action_oom;
542	}
543	if ((request = ata_alloc_request()) == NULL) {
544	    printf("cannot allocate ATAPI/CAM request\n");
545	    goto action_oom;
546	}
547
548	bcopy((ccb_h->flags & CAM_CDB_POINTER) ?
549	      csio->cdb_io.cdb_ptr : csio->cdb_io.cdb_bytes,
550	      request->u.atapi.ccb, csio->cdb_len);
551#ifdef CAMDEBUG
552	if (CAM_DEBUGGED(ccb_h->path, CAM_DEBUG_CDB)) {
553		char cdb_str[(SCSI_MAX_CDBLEN * 3) + 1];
554
555		printf("atapi_action: hcb@%p: %s\n", hcb,
556		       scsi_cdb_string(request->u.atapi.ccb, cdb_str, sizeof(cdb_str)));
557	}
558	if (CAM_DEBUGGED(ccb_h->path, CAM_DEBUG_SUBTRACE)) {
559		request_flags |= ATA_R_DEBUG;
560	}
561#endif
562
563	len = csio->dxfer_len;
564	buf = csio->data_ptr;
565
566	/* some SCSI commands require special processing */
567	switch (request->u.atapi.ccb[0]) {
568	case INQUIRY: {
569	    /*
570	     * many ATAPI devices seem to report more than
571	     * SHORT_INQUIRY_LENGTH bytes of available INQUIRY
572	     * information, but respond with some incorrect condition
573	     * when actually asked for it, so we are going to pretend
574	     * that only SHORT_INQUIRY_LENGTH are expected, anyway.
575	     */
576	    struct scsi_inquiry *inq = (struct scsi_inquiry *) &request->u.atapi.ccb[0];
577
578	    if (inq->byte2 == 0 && inq->page_code == 0 &&
579		inq->length > SHORT_INQUIRY_LENGTH) {
580		bzero(buf, len);
581		len = inq->length = SHORT_INQUIRY_LENGTH;
582	    }
583	    break;
584	}
585	case READ_6:
586	    /* FALLTHROUGH */
587
588	case WRITE_6:
589	    CAM_DEBUG(ccb_h->path, CAM_DEBUG_SUBTRACE,
590		      ("Translating %s into _10 equivalent\n",
591		      (request->u.atapi.ccb[0] == READ_6) ? "READ_6" : "WRITE_6"));
592	    request->u.atapi.ccb[0] |= 0x20;
593	    request->u.atapi.ccb[9] = request->u.atapi.ccb[5];
594	    request->u.atapi.ccb[8] = request->u.atapi.ccb[4];
595	    request->u.atapi.ccb[7] = 0;
596	    request->u.atapi.ccb[6] = 0;
597	    request->u.atapi.ccb[5] = request->u.atapi.ccb[3];
598	    request->u.atapi.ccb[4] = request->u.atapi.ccb[2];
599	    request->u.atapi.ccb[3] = request->u.atapi.ccb[1] & 0x1f;
600	    request->u.atapi.ccb[2] = 0;
601	    request->u.atapi.ccb[1] = 0;
602	    /* FALLTHROUGH */
603
604	case READ_10:
605	    /* FALLTHROUGH */
606	case WRITE_10:
607	    /* FALLTHROUGH */
608	case READ_12:
609	    /* FALLTHROUGH */
610	case WRITE_12:
611	    /*
612	     * Enable DMA (if target supports it) for READ and WRITE commands
613	     * only, as some combinations of drive, controller and chipset do
614	     * not behave correctly when DMA is enabled for other commands.
615	     */
616	    if (softc->atadev[tid]->mode >= ATA_DMA)
617		request_flags |= ATA_R_DMA;
618	    break;
619
620	}
621
622	if ((ccb_h->flags & CAM_DIR_MASK) == CAM_DIR_IN && (len & 1)) {
623	    /* ATA always transfers an even number of bytes */
624	    if ((buf = hcb->dxfer_alloc
625		 = malloc(++len, M_ATACAM, M_NOWAIT | M_ZERO)) == NULL) {
626		printf("cannot allocate ATAPI/CAM buffer\n");
627		goto action_oom;
628	    }
629	}
630	request->dev = softc->atadev[tid]->dev;
631	request->driver = hcb;
632	request->data = buf;
633	request->bytecount = len;
634	request->transfersize = min(request->bytecount, 65534);
635	request->timeout = (ccb_h->timeout + 999) / 1000;
636	request->callback = &atapi_cb;
637	request->flags = request_flags;
638
639	/*
640	 * no retries are to be performed at the ATA level; any retries
641	 * will be done by CAM.
642	 */
643	request->retries = 0;
644
645	TAILQ_INSERT_TAIL(&softc->pending_hcbs, hcb, chain);
646	hcb->flags |= QUEUED;
647	ccb_h->status |= CAM_SIM_QUEUED;
648	mtx_unlock(&softc->state_lock);
649
650	ata_queue_request(request);
651	mtx_lock(&softc->state_lock);
652	return;
653    }
654
655    default:
656	CAM_DEBUG(ccb_h->path, CAM_DEBUG_SUBTRACE,
657		  ("unsupported function code 0x%02x\n", ccb_h->func_code));
658	goto action_invalid;
659    }
660
661    /* NOTREACHED */
662
663action_oom:
664    if (request != NULL)
665	ata_free_request(request);
666    if (hcb != NULL)
667	free_hcb(hcb);
668    xpt_print_path(ccb_h->path);
669    printf("out of memory, freezing queue.\n");
670    softc->flags |= RESOURCE_SHORTAGE;
671    xpt_freeze_simq(sim, /*count*/ 1);
672    ccb_h->status = CAM_REQUEUE_REQ;
673    xpt_done(ccb);
674    return;
675
676action_invalid:
677    ccb_h->status = CAM_REQ_INVALID;
678    xpt_done(ccb);
679    return;
680}
681
682static void
683atapi_poll(struct cam_sim *sim)
684{
685	struct atapi_xpt_softc *softc =
686	    (struct atapi_xpt_softc*)cam_sim_softc(sim);
687
688	mtx_unlock(&softc->state_lock);
689	ata_interrupt(softc->ata_ch);
690	mtx_lock(&softc->state_lock);
691}
692
693static void
694atapi_cb(struct ata_request *request)
695{
696    struct atapi_xpt_softc *scp;
697    struct atapi_hcb *hcb;
698    struct ccb_scsiio *csio;
699    u_int32_t rc;
700
701    hcb = (struct atapi_hcb *)request->driver;
702    scp = hcb->softc;
703    csio = &hcb->ccb->csio;
704
705#ifdef CAMDEBUG
706# define err (request->u.atapi.sense.key)
707    if (CAM_DEBUGGED(csio->ccb_h.path, CAM_DEBUG_CDB)) {
708	printf("atapi_cb: hcb@%p sense = %02x: sk = %01x%s%s%s\n",
709	       hcb, err, err & 0x0f,
710	       (err & 0x80) ? ", Filemark" : "",
711	       (err & 0x40) ? ", EOM" : "",
712	       (err & 0x20) ? ", ILI" : "");
713	device_printf(request->dev,
714            "cmd %s status %02x result %02x error %02x\n",
715	    ata_cmd2str(request),
716	    request->status, request->result, request->error);
717    }
718#endif
719
720    if ((hcb->flags & AUTOSENSE) != 0) {
721	rc = CAM_SCSI_STATUS_ERROR;
722	if (request->result == 0) {
723	    csio->ccb_h.status |= CAM_AUTOSNS_VALID;
724	}
725    } else if (request->result != 0) {
726	if ((request->flags & ATA_R_TIMEOUT) != 0) {
727	    rc = CAM_CMD_TIMEOUT;
728	} else {
729	    rc = CAM_SCSI_STATUS_ERROR;
730	    csio->scsi_status = SCSI_STATUS_CHECK_COND;
731
732	    if ((csio->ccb_h.flags & CAM_DIS_AUTOSENSE) == 0) {
733#if 0
734		static const int8_t ccb[16] = { ATAPI_REQUEST_SENSE, 0, 0, 0,
735		    sizeof(struct atapi_sense), 0, 0, 0, 0, 0, 0,
736		    0, 0, 0, 0, 0 };
737
738		bcopy (ccb, request->u.atapi.ccb, sizeof ccb);
739		request->data = (caddr_t)&csio->sense_data;
740		request->bytecount = sizeof(struct atapi_sense);
741		request->transfersize = min(request->bytecount, 65534);
742		request->timeout = (csio->ccb_h.timeout + 999) / 1000;
743		request->retries = 2;
744		request->flags = ATA_R_QUIET|ATA_R_ATAPI|ATA_R_IMMEDIATE;
745		hcb->flags |= AUTOSENSE;
746
747		ata_queue_request(request);
748		return;
749#else
750		/*
751		 * Use auto-sense data from the ATA layer, if it has
752		 * issued a REQUEST SENSE automatically and that operation
753		 * returned without error.
754		 */
755		if (request->u.atapi.sense.key != 0 && request->error == 0) {
756		    bcopy (&request->u.atapi.sense, &csio->sense_data, sizeof(struct atapi_sense));
757		    csio->ccb_h.status |= CAM_AUTOSNS_VALID;
758		}
759	    }
760#endif
761	}
762    } else {
763	rc = CAM_REQ_CMP;
764	csio->scsi_status = SCSI_STATUS_OK;
765	if (((csio->ccb_h.flags & CAM_DIR_MASK) == CAM_DIR_IN) &&
766	    hcb->dxfer_alloc != NULL)
767	{
768	    bcopy(hcb->dxfer_alloc, csio->data_ptr, csio->dxfer_len);
769	}
770    }
771
772    mtx_lock(&scp->state_lock);
773    free_hcb_and_ccb_done(hcb, rc);
774    mtx_unlock(&scp->state_lock);
775
776    ata_free_request(request);
777}
778
779static void
780free_hcb_and_ccb_done(struct atapi_hcb *hcb, u_int32_t status)
781{
782    struct atapi_xpt_softc *softc;
783    union ccb *ccb;
784
785    if (hcb == NULL)
786	return;
787
788    softc = hcb->softc;
789    ccb = hcb->ccb;
790
791    /* we're about to free a hcb, so the shortage has ended */
792    if (softc->flags & RESOURCE_SHORTAGE) {
793	softc->flags &= ~RESOURCE_SHORTAGE;
794	status |= CAM_RELEASE_SIMQ;
795    }
796    free_hcb(hcb);
797    ccb->ccb_h.status =
798	status | (ccb->ccb_h.status & ~(CAM_STATUS_MASK | CAM_SIM_QUEUED));
799    xpt_done(ccb);
800}
801
802static void
803atapi_async(void *callback_arg, u_int32_t code,
804	     struct cam_path* path, void *arg)
805{
806    int targ;
807
808    GIANT_REQUIRED;
809
810    switch (code) {
811    case AC_LOST_DEVICE:
812	targ = xpt_path_target_id(path);
813	xpt_print_path(path);
814	if (targ == -1)
815		printf("Lost host adapter\n");
816	else
817		printf("Lost target %d???\n", targ);
818	break;
819
820    default:
821	break;
822    }
823}
824
825static void
826cam_rescan(struct cam_sim *sim)
827{
828    union ccb *ccb;
829
830    ccb = xpt_alloc_ccb_nowait();
831    if (ccb == NULL)
832	return;
833    if (xpt_create_path(&ccb->ccb_h.path, xpt_periph, cam_sim_path(sim),
834			CAM_TARGET_WILDCARD, CAM_LUN_WILDCARD) != CAM_REQ_CMP) {
835	xpt_free_ccb(ccb);
836	return;
837    }
838    CAM_DEBUG(ccb->ccb_h.path, CAM_DEBUG_TRACE, ("Rescanning ATAPI bus.\n"));
839    xpt_rescan(ccb);
840    /* scan is in progress now */
841}
842
843static struct atapi_hcb *
844allocate_hcb(struct atapi_xpt_softc *softc, int unit, int bus, union ccb *ccb)
845{
846    struct atapi_hcb *hcb = (struct atapi_hcb *)
847    malloc(sizeof(struct atapi_hcb), M_ATACAM, M_NOWAIT | M_ZERO);
848
849    if (hcb != NULL) {
850	hcb->softc = softc;
851	hcb->unit = unit;
852	hcb->bus = bus;
853	hcb->ccb = ccb;
854    }
855    return hcb;
856}
857
858static void
859free_hcb(struct atapi_hcb *hcb)
860{
861    if ((hcb->flags & QUEUED) != 0)
862	TAILQ_REMOVE(&hcb->softc->pending_hcbs, hcb, chain);
863    if (hcb->dxfer_alloc != NULL)
864	free(hcb->dxfer_alloc, M_ATACAM);
865    free(hcb, M_ATACAM);
866}
867
868static void
869free_softc(struct atapi_xpt_softc *scp)
870{
871    struct atapi_hcb *hcb;
872
873    if (scp != NULL) {
874	mtx_lock(&scp->state_lock);
875	TAILQ_FOREACH(hcb, &scp->pending_hcbs, chain) {
876	    free_hcb_and_ccb_done(hcb, CAM_UNREC_HBA_ERROR);
877	}
878	if (scp->path != NULL) {
879	    setup_async_cb(scp, 0);
880	    xpt_free_path(scp->path);
881	}
882	if ((scp->flags & BUS_REGISTERED) != 0) {
883	    if (xpt_bus_deregister(cam_sim_path(scp->sim)) == CAM_REQ_CMP)
884		scp->flags &= ~BUS_REGISTERED;
885	}
886	if (scp->sim != NULL) {
887	    if ((scp->flags & BUS_REGISTERED) == 0)
888		cam_sim_free(scp->sim, /*free_devq*/TRUE);
889	    else
890		printf("Can't free %s SIM (still registered)\n",
891		       cam_sim_name(scp->sim));
892	}
893	mtx_destroy(&scp->state_lock);
894    }
895}
896
897static int
898atapi_cam_event_handler(module_t mod, int what, void *arg) {
899    device_t *devlist;
900    int devcount;
901
902    switch (what) {
903	case MOD_UNLOAD:
904	    if (devclass_get_devices(atapi_cam_devclass, &devlist, &devcount)
905		  != 0)
906		return ENXIO;
907	    if (devlist != NULL) {
908		while (devlist != NULL && devcount > 0) {
909		    device_t child = devlist[--devcount];
910		    struct atapi_xpt_softc *scp = device_get_softc(child);
911
912		    device_delete_child(device_get_parent(child),child);
913		    if (scp != NULL)
914			free(scp, M_ATACAM);
915		}
916		free(devlist, M_TEMP);
917	    }
918	    break;
919
920	default:
921	    break;
922    }
923    return 0;
924}
925