Index: sys/dev/ata/ata-disk.c =================================================================== RCS file: /home/ncvs/src/sys/dev/ata/ata-disk.c,v retrieving revision 1.60.2.11 diff -u -r1.60.2.11 ata-disk.c --- sys/dev/ata/ata-disk.c 2001/02/25 21:35:20 1.60.2.11 +++ sys/dev/ata/ata-disk.c 2001/03/30 18:23:15 @@ -99,6 +99,10 @@ /* internal vars */ static u_int32_t adp_lun_map = 0; static MALLOC_DEFINE(M_AD, "AD driver", "ATA disk driver"); +static int ata_dma, ata_wc, ata_tags; +TUNABLE_INT_DECL("hw.ata.ata_dma", 1, ata_dma); +TUNABLE_INT_DECL("hw.ata.wc", 0, ata_wc); +TUNABLE_INT_DECL("hw.ata.tags", 0, ata_tags); /* defines */ #define AD_MAX_RETRIES 3 @@ -152,21 +156,27 @@ 0, 0, 0, 0, ATA_C_F_ENAB_RCACHE, ATA_WAIT_INTR)) printf("ad%d: enabling readahead cache failed\n", adp->lun); -#if defined(ATA_ENABLE_WC) || defined(ATA_ENABLE_TAGS) - if (ata_command(adp->controller, adp->unit, ATA_C_SETFEATURES, - 0, 0, 0, 0, ATA_C_F_ENAB_WCACHE, ATA_WAIT_INTR)) - printf("ad%d: enabling write cache failed\n", adp->lun); -#else - if (ata_command(adp->controller, adp->unit, ATA_C_SETFEATURES, - 0, 0, 0, 0, ATA_C_F_DIS_WCACHE, ATA_WAIT_INTR)) - printf("ad%d: disabling write cache failed\n", adp->lun); -#endif - /* use DMA if drive & controller supports it */ - ata_dmainit(adp->controller, adp->unit, - ata_pmode(AD_PARAM), ata_wmode(AD_PARAM), ata_umode(AD_PARAM)); + /* enable write cacheing if allowed and not default on device */ + if (ata_wc || ata_tags) { + if (ata_command(adp->controller, adp->unit, ATA_C_SETFEATURES, + 0, 0, 0, 0, ATA_C_F_ENAB_WCACHE, ATA_WAIT_INTR)) + ata_printf(scp, device, "enabling write cache failed\n"); + } + else { + if (ata_command(adp->controller, adp->unit, ATA_C_SETFEATURES, + 0, 0, 0, 0, ATA_C_F_DIS_WCACHE, ATA_WAIT_INTR)) + ata_printf(scp, device, "disabling write cache failed\n"); + } - /* use tagged queueing if supported */ - if (ad_tagsupported(adp)) { + /* use DMA if allowed and if drive/controller supports it */ + if (ata_dma) + ata_dmainit(adp->controller, adp->unit, ata_pmode(AD_PARAM), + ata_wmode(AD_PARAM), ata_umode(AD_PARAM)); + else + ata_dmainit(adp->controller, adp->unit, ata_pmode(AD_PARAM), -1, -1); + + /* use tagged queueing if allowed and supported */ + if (ata_tags && ad_tagsupported(adp)) { adp->num_tags = AD_PARAM->queuelen; adp->flags |= AD_F_TAG_ENABLED; adp->controller->flags |= ATA_QUEUED;