summaryrefslogtreecommitdiffstats
path: root/sys/dev/ata/atapi-cam.c
diff options
context:
space:
mode:
authorthomas <thomas@FreeBSD.org>2003-09-24 18:40:10 +0000
committerthomas <thomas@FreeBSD.org>2003-09-24 18:40:10 +0000
commit8bdc92f0f2c7ed1eff80819810eab20a28f57331 (patch)
tree9bdfdf9d97826b78379e630196ffc086a6563846 /sys/dev/ata/atapi-cam.c
parentb47200d05c88f9509ba5f87c97d9328101b4a66f (diff)
downloadFreeBSD-src-8bdc92f0f2c7ed1eff80819810eab20a28f57331.zip
FreeBSD-src-8bdc92f0f2c7ed1eff80819810eab20a28f57331.tar.gz
Enable DMA for ATAPI/CAM input/output operations.
Reviewed by: scottl
Diffstat (limited to 'sys/dev/ata/atapi-cam.c')
-rw-r--r--sys/dev/ata/atapi-cam.c13
1 files changed, 10 insertions, 3 deletions
diff --git a/sys/dev/ata/atapi-cam.c b/sys/dev/ata/atapi-cam.c
index 3a2e864..9d495ae 100644
--- a/sys/dev/ata/atapi-cam.c
+++ b/sys/dev/ata/atapi-cam.c
@@ -227,6 +227,11 @@ setup_dev(struct atapi_xpt_softc *scp, struct ata_device *atp)
2 * device_get_unit(atp->channel->dev) +
(atp->unit == ATA_MASTER) ? 0 : 1);
atp->softc = (void *)scp;
+ if (atapi_dma && atp->channel->dma &&
+ (atp->param->config & ATA_DRQ_MASK) != ATA_DRQ_INTR)
+ atp->setmode(atp, ATA_DMA_MAX);
+ else
+ atp->setmode(atp, ATA_PIO_MAX);
}
}
@@ -403,10 +408,10 @@ atapi_action(struct cam_sim *sim, union ccb *ccb)
switch (ccb_h->flags & CAM_DIR_MASK) {
case CAM_DIR_IN:
- request_flags |= ATA_R_READ;
+ request_flags |= ATA_R_READ|ATA_R_DMA;
break;
case CAM_DIR_OUT:
- request_flags |= ATA_R_WRITE;
+ request_flags |= ATA_R_WRITE|ATA_R_DMA;
break;
case CAM_DIR_NONE:
request_flags |= ATA_R_CONTROL;
@@ -414,7 +419,9 @@ atapi_action(struct cam_sim *sim, union ccb *ccb)
default:
ata_prtdev(dev, "unknown IO operation\n");
goto action_invalid;
- }
+ }
+ if (dev->mode < ATA_DMA)
+ request_flags &= ~ATA_R_DMA;
if ((hcb = allocate_hcb(softc, unit, bus, ccb)) == NULL) {
printf("cannot allocate ATAPI/CAM hcb\n");
OpenPOWER on IntegriCloud