diff options
Diffstat (limited to 'sys')
-rw-r--r-- | sys/dev/ata/ata-all.c | 179 | ||||
-rw-r--r-- | sys/dev/ata/ata-all.h | 55 | ||||
-rw-r--r-- | sys/dev/ata/ata-disk.c | 118 | ||||
-rw-r--r-- | sys/dev/ata/ata-disk.h | 4 | ||||
-rw-r--r-- | sys/dev/ata/ata-dma.c | 116 | ||||
-rw-r--r-- | sys/dev/ata/ata-raid.c | 5 | ||||
-rw-r--r-- | sys/dev/ata/atapi-all.c | 26 | ||||
-rw-r--r-- | sys/sys/ata.h | 265 |
8 files changed, 403 insertions, 365 deletions
diff --git a/sys/dev/ata/ata-all.c b/sys/dev/ata/ata-all.c index da275d4..0bff4d7 100644 --- a/sys/dev/ata/ata-all.c +++ b/sys/dev/ata/ata-all.c @@ -76,7 +76,6 @@ static void ata_boot_attach(void); static void ata_intr(void *); static int ata_getparam(struct ata_softc *, int, u_int8_t); static int ata_service(struct ata_softc *); -static char *active2str(int); static void bswap(int8_t *, int); static void btrim(int8_t *, int); static void bpack(int8_t *, int8_t *, int); @@ -459,7 +458,7 @@ ata_getparam(struct ata_softc *scp, int device, u_int8_t command) /* apparently some devices needs this repeated */ do { - if (ata_command(scp, device, command, 0, 0, 0, 0, 0, ATA_WAIT_INTR)) { + if (ata_command(scp, device, command, 0, 0, 0, ATA_WAIT_INTR)) { ata_printf(scp, device, "%s identify failed\n", command == ATA_C_ATAPI_IDENTIFY ? "ATAPI" : "ATA"); return -1; @@ -619,8 +618,9 @@ ata_intr(void *data) static int intr_count = 0; if (intr_count++ < 10) - ata_printf(scp, -1, "unwanted interrupt %d %sstatus = %02x\n", - intr_count, active2str(scp->active), scp->status); + ata_printf(scp, -1, + "unwanted interrupt #%d active=0x%x status=0x%02x\n", + intr_count, scp->active, scp->status); } #endif } @@ -960,46 +960,22 @@ ata_wait(struct ata_softc *scp, int device, u_int8_t mask) int ata_command(struct ata_softc *scp, int device, u_int8_t command, - u_int16_t cylinder, u_int8_t head, u_int8_t sector, - u_int8_t count, u_int8_t feature, int flags) + u_int64_t lba, u_int16_t count, u_int8_t feature, int flags) { int error = 0; #ifdef ATA_DEBUG - ata_printf(scp, device, "ata_command: addr=%04x, cmd=%02x, " - "c=%d, h=%d, s=%d, count=%d, feature=%d, flags=%02x\n", - rman_get_start(scp->r_io), command, cylinder, head, sector, - count, feature, flags); - - /* sanity checks */ - switch(scp->active) { - case ATA_IDLE: - break; - - case ATA_CONTROL: - if (flags == ATA_WAIT_INTR || flags == ATA_WAIT_READY) - break; - goto out; - - case ATA_ACTIVE_ATA: - case ATA_ACTIVE_ATAPI: - if (flags == ATA_IMMEDIATE) - break; - - default: -out: - printf("ata_command called %s flags=%s cmd=%02x\n", - active2str(scp->active), active2str(flags), command); - break; - } + ata_printf(scp, device, "ata_command: addr=%04lx, cmd=%02x, " + "lba=%lld, count=%d, feature=%d, flags=%02x\n", + rman_get_start(scp->r_io), command, lba, count, feature, flags); #endif + /* select device */ + ATA_OUTB(scp->r_io, ATA_DRIVE, ATA_D_IBM | device); + /* disable interrupt from device */ if (scp->flags & ATA_QUEUED) ATA_OUTB(scp->r_altio, ATA_ALTSTAT, ATA_A_IDS | ATA_A_4BIT); - /* select device */ - ATA_OUTB(scp->r_io, ATA_DRIVE, ATA_D_IBM | device); - /* ready to issue command ? */ if (ata_wait(scp, device, 0) < 0) { ata_printf(scp, device, @@ -1008,14 +984,69 @@ out: return -1; } - ATA_OUTB(scp->r_io, ATA_FEATURE, feature); - ATA_OUTB(scp->r_io, ATA_COUNT, count); - ATA_OUTB(scp->r_io, ATA_SECTOR, sector); - ATA_OUTB(scp->r_io, ATA_CYL_MSB, cylinder >> 8); - ATA_OUTB(scp->r_io, ATA_CYL_LSB, cylinder); - ATA_OUTB(scp->r_io, ATA_DRIVE, ATA_D_IBM | device | head); + /* only use 48bit addressing if needed because of the overhead */ + if ((lba > 268435455 || count > 256) && + scp->dev_param[ATA_DEV(device)]->support.address48) { + ATA_OUTB(scp->r_io, ATA_FEATURE, (feature>>8) & 0xff); + ATA_OUTB(scp->r_io, ATA_FEATURE, feature); + ATA_OUTB(scp->r_io, ATA_COUNT, (count>>8) & 0xff); + ATA_OUTB(scp->r_io, ATA_COUNT, count & 0xff); + ATA_OUTB(scp->r_io, ATA_SECTOR, (lba>>24) & 0xff); + ATA_OUTB(scp->r_io, ATA_SECTOR, lba & 0xff); + ATA_OUTB(scp->r_io, ATA_CYL_LSB, (lba<<32) & 0xff); + ATA_OUTB(scp->r_io, ATA_CYL_LSB, (lba>>8) & 0xff); + ATA_OUTB(scp->r_io, ATA_CYL_MSB, (lba>>40) & 0xff); + ATA_OUTB(scp->r_io, ATA_CYL_MSB, (lba>>16) & 0xff); + ATA_OUTB(scp->r_io, ATA_DRIVE, ATA_D_LBA | device); + + /* translate command into 48bit version */ + switch (command) { + case ATA_C_READ: + command = ATA_C_READ48; break; + case ATA_C_READ_MUL: + command = ATA_C_READ_MUL48; break; + case ATA_C_READ_DMA: + command = ATA_C_READ_DMA48; break; + case ATA_C_READ_DMA_QUEUED: + command = ATA_C_READ_DMA_QUEUED48; break; + case ATA_C_WRITE: + command = ATA_C_WRITE48; break; + case ATA_C_WRITE_MUL: + command = ATA_C_WRITE_MUL48; break; + case ATA_C_WRITE_DMA: + command = ATA_C_WRITE_DMA48; break; + case ATA_C_WRITE_DMA_QUEUED: + command = ATA_C_WRITE_DMA_QUEUED48; break; + case ATA_C_FLUSHCACHE: + command = ATA_C_FLUSHCACHE48; break; + default: + ata_printf(scp, device, "can't translate cmd to 48bit version\n"); + return -1; + } + } + else { + ATA_OUTB(scp->r_io, ATA_FEATURE, feature); + ATA_OUTB(scp->r_io, ATA_COUNT, count); + ATA_OUTB(scp->r_io, ATA_SECTOR, lba & 0xff); + ATA_OUTB(scp->r_io, ATA_CYL_LSB, (lba>>8) & 0xff); + ATA_OUTB(scp->r_io, ATA_CYL_MSB, (lba>>16) & 0xff); + if (flags & ATA_USE_CHS) + ATA_OUTB(scp->r_io, ATA_DRIVE, + ATA_D_IBM | device | ((lba>>24) & 0xf)); + else + ATA_OUTB(scp->r_io, ATA_DRIVE, + ATA_D_IBM | ATA_D_LBA | device | ((lba>>24) & 0xf)); + } + + switch (flags & ATA_WAIT_MASK) { + case ATA_IMMEDIATE: + ATA_OUTB(scp->r_io, ATA_CMD, command); + + /* enable interrupt */ + if (scp->flags & ATA_QUEUED) + ATA_OUTB(scp->r_altio, ATA_ALTSTAT, ATA_A_4BIT); + break; - switch (flags) { case ATA_WAIT_INTR: scp->active |= ATA_WAIT_INTR; ATA_OUTB(scp->r_io, ATA_CMD, command); @@ -1042,18 +1073,7 @@ out: } scp->active &= ~ATA_WAIT_READY; break; - - case ATA_IMMEDIATE: - ATA_OUTB(scp->r_io, ATA_CMD, command); - break; - - default: - ata_printf(scp, device, "DANGER: illegal interrupt flag=%s\n", - active2str(flags)); } - /* enable interrupt */ - if (scp->flags & ATA_QUEUED) - ATA_OUTB(scp->r_altio, ATA_ALTSTAT, ATA_A_4BIT); return error; } @@ -1129,25 +1149,13 @@ ata_mode2str(int mode) case ATA_UDMA2: return "UDMA33"; case ATA_UDMA4: return "UDMA66"; case ATA_UDMA5: return "UDMA100"; + case ATA_UDMA6: return "UDMA133"; case ATA_DMA: return "BIOSDMA"; default: return "???"; } } int -ata_pio2mode(int pio) -{ - switch (pio) { - default: - case 0: return ATA_PIO0; - case 1: return ATA_PIO1; - case 2: return ATA_PIO2; - case 3: return ATA_PIO3; - case 4: return ATA_PIO4; - } -} - -int ata_pmode(struct ata_params *ap) { if (ap->atavalid & ATA_FLAG_64_70) { @@ -1156,11 +1164,11 @@ ata_pmode(struct ata_params *ap) if (ap->apiomodes & 1) return 3; } - if (ap->opiomode == 2) + if (ap->retired_piomode == 2) return 2; - if (ap->opiomode == 1) + if (ap->retired_piomode == 1) return 1; - if (ap->opiomode == 0) + if (ap->retired_piomode == 0) return 0; return -1; } @@ -1168,11 +1176,11 @@ ata_pmode(struct ata_params *ap) int ata_wmode(struct ata_params *ap) { - if (ap->wdmamodes & 4) + if (ap->mwdmamodes & 0x04) return 2; - if (ap->wdmamodes & 2) + if (ap->mwdmamodes & 0x02) return 1; - if (ap->wdmamodes & 1) + if (ap->mwdmamodes & 0x01) return 0; return -1; } @@ -1181,6 +1189,8 @@ int ata_umode(struct ata_params *ap) { if (ap->atavalid & ATA_FLAG_88) { + if (ap->udmamodes & 0x40) + return 6; if (ap->udmamodes & 0x20) return 5; if (ap->udmamodes & 0x10) @@ -1197,31 +1207,6 @@ ata_umode(struct ata_params *ap) return -1; } -static char * -active2str(int active) -{ - static char buf[64]; - - bzero(buf, sizeof(buf)); - if (active & ATA_IDLE) - strcat(buf, "ATA_IDLE "); - if (active & ATA_IMMEDIATE) - strcat(buf, "ATA_IMMEDIATE "); - if (active & ATA_WAIT_INTR) - strcat(buf, "ATA_WAIT_INTR "); - if (active & ATA_WAIT_READY) - strcat(buf, "ATA_WAIT_READY "); - if (active & ATA_ACTIVE) - strcat(buf, "ATA_ACTIVE "); - if (active & ATA_ACTIVE_ATA) - strcat(buf, "ATA_ACTIVE_ATA "); - if (active & ATA_ACTIVE_ATAPI) - strcat(buf, "ATA_ACTIVE_ATAPI "); - if (active & ATA_CONTROL) - strcat(buf, "ATA_CONTROL "); - return buf; -} - static void bswap(int8_t *buf, int len) { diff --git a/sys/dev/ata/ata-all.h b/sys/dev/ata/ata-all.h index 69dc52e..4b04f96 100644 --- a/sys/dev/ata/ata-all.h +++ b/sys/dev/ata/ata-all.h @@ -63,7 +63,15 @@ #define ATA_C_F_AUTOPOLL 0x01 /* start autopoll function */ #define ATA_C_ATAPI_RESET 0x08 /* reset ATAPI device */ #define ATA_C_READ 0x20 /* read command */ +#define ATA_C_READ48 0x24 /* read command */ +#define ATA_C_READ_DMA48 0x25 /* read w/DMA command */ +#define ATA_C_READ_DMA_QUEUED48 0x26 /* read w/DMA QUEUED command */ +#define ATA_C_READ_MUL48 0x29 /* read multi command */ #define ATA_C_WRITE 0x30 /* write command */ +#define ATA_C_WRITE48 0x34 /* write command */ +#define ATA_C_WRITE_DMA48 0x35 /* write w/DMA command */ +#define ATA_C_WRITE_DMA_QUEUED48 0x36 /* write w/DMA QUEUED command */ +#define ATA_C_WRITE_MUL48 0x39 /* write multi command */ #define ATA_C_PACKET_CMD 0xa0 /* packet command */ #define ATA_C_ATAPI_IDENTIFY 0xa1 /* get ATAPI params*/ #define ATA_C_SERVICE 0xa2 /* service command */ @@ -76,6 +84,7 @@ #define ATA_C_WRITE_DMA_QUEUED 0xcc /* write w/DMA QUEUED command */ #define ATA_C_SLEEP 0xe6 /* sleep command */ #define ATA_C_FLUSHCACHE 0xe7 /* flush cache to disk */ +#define ATA_C_FLUSHCACHE48 0xea /* flush cache to disk */ #define ATA_C_ATA_IDENTIFY 0xec /* get ATA params */ #define ATA_C_SETFEATURES 0xef /* features command */ #define ATA_C_F_SETXFER 0x03 /* set transfer mode */ @@ -130,28 +139,27 @@ #define ATA_DMA_EOT 0x80000000 #define ATA_BMCMD_PORT 0x00 -#define ATA_BMCMD_START_STOP 0x01 -#define ATA_BMCMD_WRITE_READ 0x08 +#define ATA_BMCMD_START_STOP 0x01 +#define ATA_BMCMD_WRITE_READ 0x08 #define ATA_BMDEVSPEC_0 0x01 #define ATA_BMSTAT_PORT 0x02 -#define ATA_BMSTAT_ACTIVE 0x01 -#define ATA_BMSTAT_ERROR 0x02 -#define ATA_BMSTAT_INTERRUPT 0x04 -#define ATA_BMSTAT_MASK 0x07 -#define ATA_BMSTAT_DMA_MASTER 0x20 -#define ATA_BMSTAT_DMA_SLAVE 0x40 -#define ATA_BMSTAT_DMA_SIMPLEX 0x80 +#define ATA_BMSTAT_ACTIVE 0x01 +#define ATA_BMSTAT_ERROR 0x02 +#define ATA_BMSTAT_INTERRUPT 0x04 +#define ATA_BMSTAT_MASK 0x07 +#define ATA_BMSTAT_DMA_MASTER 0x20 +#define ATA_BMSTAT_DMA_SLAVE 0x40 +#define ATA_BMSTAT_DMA_SIMPLEX 0x80 #define ATA_BMDEVSPEC_1 0x03 - #define ATA_BMDTP_PORT 0x04 /* structure for holding DMA address data */ struct ata_dmaentry { - u_int32_t base; - u_int32_t count; + u_int32_t base; + u_int32_t count; }; /* structure describing an ATA device */ @@ -171,11 +179,11 @@ struct ata_softc { void *dev_softc[2]; /* ptr to devices softc's */ int mode[2]; /* transfer mode for devices */ int flags; /* controller flags */ -#define ATA_DMA_ACTIVE 0x01 -#define ATA_ATAPI_DMA_RO 0x02 -#define ATA_USE_16BIT 0x04 -#define ATA_NO_SLAVE 0x08 -#define ATA_QUEUED 0x10 +#define ATA_NO_SLAVE 0x01 +#define ATA_USE_16BIT 0x02 +#define ATA_ATAPI_DMA_RO 0x04 +#define ATA_QUEUED 0x08 +#define ATA_DMA_ACTIVE 0x10 int devices; /* what is present */ #define ATA_ATA_MASTER 0x01 @@ -190,10 +198,12 @@ struct ata_softc { #define ATA_IMMEDIATE 0x0001 #define ATA_WAIT_INTR 0x0002 #define ATA_WAIT_READY 0x0004 -#define ATA_ACTIVE 0x0008 -#define ATA_ACTIVE_ATA 0x0010 -#define ATA_ACTIVE_ATAPI 0x0020 -#define ATA_CONTROL 0x0040 +#define ATA_WAIT_MASK 0x0007 +#define ATA_USE_CHS 0x0008 +#define ATA_ACTIVE 0x0010 +#define ATA_ACTIVE_ATA 0x0020 +#define ATA_ACTIVE_ATAPI 0x0040 +#define ATA_CONTROL 0x0080 TAILQ_HEAD(, ad_request) ata_queue; /* head of ATA queue */ TAILQ_HEAD(, atapi_request) atapi_queue; /* head of ATAPI queue */ @@ -213,7 +223,7 @@ void ata_start(struct ata_softc *); void ata_reset(struct ata_softc *); int ata_reinit(struct ata_softc *); int ata_wait(struct ata_softc *, int, u_int8_t); -int ata_command(struct ata_softc *, int, u_int8_t, u_int16_t, u_int8_t, u_int8_t, u_int8_t, u_int8_t, int); +int ata_command(struct ata_softc *, int, u_int8_t, u_int64_t, u_int16_t, u_int8_t, int); int ata_printf(struct ata_softc *, int, const char *, ...) __printflike(3, 4); void ata_set_name(struct ata_softc *, int, char *, int); void ata_free_name(struct ata_softc *, int); @@ -221,7 +231,6 @@ int ata_get_lun(u_int32_t *); int ata_test_lun(u_int32_t *, int); void ata_free_lun(u_int32_t *, int); char *ata_mode2str(int); -int ata_pio2mode(int); int ata_pmode(struct ata_params *); int ata_wmode(struct ata_params *); int ata_umode(struct ata_params *); diff --git a/sys/dev/ata/ata-disk.c b/sys/dev/ata/ata-disk.c index 679faa5..55a9b17 100644 --- a/sys/dev/ata/ata-disk.c +++ b/sys/dev/ata/ata-disk.c @@ -111,7 +111,6 @@ ad_attach(struct ata_softc *scp, int device) { struct ad_softc *adp; dev_t dev; - int secsperint; if (!(adp = malloc(sizeof(struct ad_softc), M_AD, M_NOWAIT | M_ZERO))) { ata_printf(scp, device, "failed to allocate driver storage\n"); @@ -128,37 +127,45 @@ ad_attach(struct ata_softc *scp, int device) adp->heads = AD_PARAM->heads; adp->sectors = AD_PARAM->sectors; adp->total_secs = AD_PARAM->cylinders * adp->heads * adp->sectors; - if (AD_PARAM->cylinders == 16383 && adp->total_secs < AD_PARAM->lbasize) - adp->total_secs = AD_PARAM->lbasize; - - if (ad_version(AD_PARAM->versmajor) && - AD_PARAM->atavalid & ATA_FLAG_54_58 && AD_PARAM->lbasize) - adp->flags |= AD_F_LBA_ENABLED; + /* does this device need oldstyle CHS addressing */ + if (!ad_version(AD_PARAM->version_major) || + !(AD_PARAM->atavalid & ATA_FLAG_54_58) || !AD_PARAM->lba_size) + adp->flags |= AD_F_CHS_USED; + + /* use the 28bit LBA size if valid */ + if (AD_PARAM->cylinders == 16383 && adp->total_secs < AD_PARAM->lba_size) + adp->total_secs = AD_PARAM->lba_size; + + /* use the 48bit LBA size if valid */ + if (AD_PARAM->support.address48) + adp->total_secs = AD_PARAM->lba_size48; + /* use multiple sectors/interrupt if device supports it */ adp->transfersize = DEV_BSIZE; - if (ad_version(AD_PARAM->versmajor)) { - secsperint = max(1, min(AD_PARAM->nsecperint, 16)); + if (ad_version(AD_PARAM->version_major)) { + int secsperint = max(1, min(AD_PARAM->sectors_intr, 16)); + if (!ata_command(adp->controller, adp->unit, ATA_C_SET_MULTI, - 0, 0, 0, secsperint, 0, ATA_WAIT_INTR) && + 0, secsperint, 0, ATA_WAIT_INTR) && !ata_wait(adp->controller, adp->unit, 0)) adp->transfersize *= secsperint; } /* enable read cacheing if not default on device */ if (ata_command(adp->controller, adp->unit, ATA_C_SETFEATURES, - 0, 0, 0, 0, ATA_C_F_ENAB_RCACHE, ATA_WAIT_INTR)) + 0, 0, ATA_C_F_ENAB_RCACHE, ATA_WAIT_INTR)) ata_printf(scp, device, "enabling readahead cache failed\n"); /* 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)) + 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)) + 0, 0, ATA_C_F_DIS_WCACHE, ATA_WAIT_INTR)) ata_printf(scp, device, "disabling write cache failed\n"); } @@ -175,10 +182,10 @@ ad_attach(struct ata_softc *scp, int device) adp->flags |= AD_F_TAG_ENABLED; adp->controller->flags |= ATA_QUEUED; if (ata_command(adp->controller, adp->unit, ATA_C_SETFEATURES, - 0, 0, 0, 0, ATA_C_F_DIS_RELIRQ, ATA_WAIT_INTR)) + 0, 0, ATA_C_F_DIS_RELIRQ, ATA_WAIT_INTR)) ata_printf(scp, device, "disabling release interrupt failed\n"); if (ata_command(adp->controller, adp->unit, ATA_C_SETFEATURES, - 0, 0, 0, 0, ATA_C_F_DIS_SRVIRQ, ATA_WAIT_INTR)) + 0, 0, ATA_C_F_DIS_SRVIRQ, ATA_WAIT_INTR)) ata_printf(scp, device, "disabling service interrupt failed\n"); } @@ -240,7 +247,7 @@ ad_detach(struct ad_softc *adp, int flush) devstat_remove_entry(&adp->stats); if (flush) { if (ata_command(adp->controller, adp->unit, ATA_C_FLUSHCACHE, - 0, 0, 0, 0, 0, ATA_WAIT_READY)) + 0, 0, 0, ATA_WAIT_READY)) ata_printf(adp->controller, adp->unit, "flushing cache on detach failed\n"); } @@ -265,7 +272,7 @@ adclose(dev_t dev, int flags, int fmt, struct thread *td) struct ad_softc *adp = dev->si_drv1; if (ata_command(adp->controller, adp->unit, ATA_C_FLUSHCACHE, - 0, 0, 0, 0, 0, ATA_WAIT_READY)) + 0, 0, 0, ATA_WAIT_READY)) ata_printf(adp->controller, adp->unit, "flushing cache on close failed\n"); return 0; @@ -417,14 +424,16 @@ int ad_transfer(struct ad_request *request) { struct ad_softc *adp; - u_int32_t blkno, secsprcyl; - u_int32_t cylinder, head, sector, count, cmd; + u_int64_t lba; + u_int32_t count, max_count; + u_int8_t cmd; + int flags = ATA_IMMEDIATE; /* get request params */ adp = request->device; /* calculate transfer details */ - blkno = request->blockaddr + (request->donecount / DEV_BSIZE); + lba = request->blockaddr + (request->donecount / DEV_BSIZE); if (request->donecount == 0) { @@ -435,24 +444,22 @@ ad_transfer(struct ad_request *request) request->timeout_handle = timeout((timeout_t*)ad_timeout, request, 10 * hz); - /* setup transfer parameters */ + /* setup transfer parameters !! 65536 for 48bit SOS XXX */ count = howmany(request->bytecount, DEV_BSIZE); - if (count > 256) { - count = 256; + max_count = AD_PARAM->support.address48 ? 65536 : 256; + if (count > max_count) { ata_printf(adp->controller, adp->unit, "count %d size transfers not supported\n", count); + count = max_count; } - if (adp->flags & AD_F_LBA_ENABLED) { - sector = (blkno >> 0) & 0xff; - cylinder = (blkno >> 8) & 0xffff; - head = ((blkno >> 24) & 0xf) | ATA_D_LBA; - } - else { - secsprcyl = adp->sectors * adp->heads; - cylinder = blkno / secsprcyl; - head = (blkno % secsprcyl) / adp->sectors; - sector = (blkno % adp->sectors) + 1; + if (adp->flags & AD_F_CHS_USED) { + int sector = (lba % adp->sectors) + 1; + int cylinder = lba / (adp->sectors * adp->heads); + int head = (lba % (adp->sectors * adp->heads)) / adp->sectors; + + lba = (sector&0xff) | ((cylinder&0xffff)<<8) | ((head&0xf)<<24); + flags |= ATA_USE_CHS; } /* setup first transfer length */ @@ -473,9 +480,8 @@ ad_transfer(struct ad_request *request) cmd = (request->flags & ADR_F_READ) ? ATA_C_READ_DMA_QUEUED : ATA_C_WRITE_DMA_QUEUED; - if (ata_command(adp->controller, adp->unit, cmd, - cylinder, head, sector, request->tag << 3, - count, ATA_IMMEDIATE)) { + if (ata_command(adp->controller, adp->unit, cmd, lba, + request->tag << 3, count, flags)) { ata_printf(adp->controller, adp->unit, "error executing command"); goto transfer_failed; @@ -489,16 +495,15 @@ ad_transfer(struct ad_request *request) /* if ATA bus RELEASE check for SERVICE */ if (adp->flags & AD_F_TAG_ENABLED && - ATA_INB(adp->controller->r_io, ATA_IREASON) & ATA_I_RELEASE) { + ATA_INB(adp->controller->r_io, ATA_IREASON) & ATA_I_RELEASE) return ad_service(adp, 1); - } } else { cmd = (request->flags & ADR_F_READ) ? ATA_C_READ_DMA : ATA_C_WRITE_DMA; - if (ata_command(adp->controller, adp->unit, cmd, cylinder, - head, sector, count, 0, ATA_IMMEDIATE)) { + if (ata_command(adp->controller, adp->unit, + cmd, lba, count, 0, flags)) { ata_printf(adp->controller, adp->unit, "error executing command"); goto transfer_failed; @@ -512,8 +517,8 @@ ad_transfer(struct ad_request *request) * thats probably why tags doesn't work on the promise * as this is needed there... */ - if (ata_wait(adp->controller, adp->unit, - ATA_S_READY | ATA_S_DRQ)) { + if (ata_wait(adp->controller, adp->unit, + ATA_S_READY | ATA_S_DRQ)) { ata_printf(adp->controller, adp->unit, "timeout waiting for data phase\n"); goto transfer_failed; @@ -535,8 +540,7 @@ ad_transfer(struct ad_request *request) else cmd = request->flags&ADR_F_READ ? ATA_C_READ : ATA_C_WRITE; - if (ata_command(adp->controller, adp->unit, cmd, - cylinder, head, sector, count, 0, ATA_IMMEDIATE)) { + if (ata_command(adp->controller, adp->unit, cmd, lba, count, 0, flags)){ ata_printf(adp->controller, adp->unit, "error executing command"); goto transfer_failed; } @@ -559,12 +563,12 @@ ad_transfer(struct ad_request *request) /* output the data */ if (adp->controller->flags & ATA_USE_16BIT) ATA_OUTSW(adp->controller->r_io, ATA_DATA, - (void *)((uintptr_t)request->data + request->donecount), - request->currentsize / sizeof(int16_t)); + (void *)((uintptr_t)request->data + request->donecount), + request->currentsize / sizeof(int16_t)); else ATA_OUTSL(adp->controller->r_io, ATA_DATA, - (void *)((uintptr_t)request->data + request->donecount), - request->currentsize / sizeof(int32_t)); + (void *)((uintptr_t)request->data + request->donecount), + request->currentsize / sizeof(int32_t)); return ATA_OP_CONTINUES; transfer_failed: @@ -707,7 +711,7 @@ ad_interrupt(struct ad_request *request) if (request->bp->bio_flags & BIO_ORDERED) { request->flags |= ADR_F_FLUSHCACHE; if (ata_command(adp->controller, adp->unit, ATA_C_FLUSHCACHE, - 0, 0, 0, 0, 0, ATA_IMMEDIATE)) + 0, 0, 0, ATA_IMMEDIATE)) ata_printf(adp->controller, adp->unit, "flushing cache failed\n"); else return ATA_OP_CONTINUES; @@ -771,7 +775,7 @@ ad_service(struct ad_softc *adp, int change) /* issue SERVICE cmd */ if (ata_command(adp->controller, adp->unit, ATA_C_SERVICE, - 0, 0, 0, 0, 0, ATA_IMMEDIATE)) { + 0, 0, 0, ATA_IMMEDIATE)) { ata_printf(adp->controller, adp->unit, "problem executing SERVICE cmd\n"); ad_invalidatequeue(adp, NULL); @@ -844,7 +848,7 @@ ad_invalidatequeue(struct ad_softc *adp, struct ad_request *request) TAILQ_INSERT_HEAD(&adp->controller->ata_queue, tmpreq, chain); } if (ata_command(adp->controller, adp->unit, ATA_C_NOP, - 0, 0, 0, 0, ATA_C_F_FLUSHQUEUE, ATA_WAIT_READY)) + 0, 0, ATA_C_F_FLUSHQUEUE, ATA_WAIT_READY)) ata_printf(adp->controller, adp->unit, "flush queue failed\n"); adp->outstanding = 0; } @@ -866,7 +870,7 @@ ad_tagsupported(struct ad_softc *adp) /* check that drive does DMA, has tags enabled, and is one we know works */ if (adp->controller->mode[ATA_DEV(adp->unit)] >= ATA_DMA && - AD_PARAM->supqueued && AD_PARAM->enabqueued) { + AD_PARAM->support.queued && AD_PARAM->enabled.queued) { while (drives[i] != NULL) { if (!strncmp(AD_PARAM->model, drives[i], strlen(drives[i]))) return 1; @@ -929,7 +933,7 @@ ad_reinit(struct ad_softc *adp) { /* reinit disk parameters */ ad_invalidatequeue(adp, NULL); - ata_command(adp->controller, adp->unit, ATA_C_SET_MULTI, 0, 0, 0, + ata_command(adp->controller, adp->unit, ATA_C_SET_MULTI, 0, adp->transfersize / DEV_BSIZE, 0, ATA_WAIT_INTR); if (adp->controller->mode[ATA_DEV(adp->unit)] >= ATA_DMA) ata_dmainit(adp->controller, adp->unit, ata_pmode(AD_PARAM), @@ -946,13 +950,13 @@ ad_print(struct ad_softc *adp, char *prepend) ata_printf(adp->controller, adp->unit, "<%.40s/%.8s> ATA-%d disk at ata%d-%s\n", AD_PARAM->model, AD_PARAM->revision, - ad_version(AD_PARAM->versmajor), + ad_version(AD_PARAM->version_major), device_get_unit(adp->controller->dev), (adp->unit == ATA_MASTER) ? "master" : "slave"); if (prepend) printf("%s", prepend); ata_printf(adp->controller, adp->unit, - "%luMB (%u sectors), %u C, %u H, %u S, %u B\n", + "%lluMB (%llu sectors), %llu C, %u H, %u S, %u B\n", adp->total_secs / ((1024L*1024L)/DEV_BSIZE), adp->total_secs, adp->total_secs / (adp->heads * adp->sectors), adp->heads, adp->sectors, DEV_BSIZE); @@ -968,12 +972,12 @@ ad_print(struct ad_softc *adp, char *prepend) ata_printf(adp->controller, adp->unit, "piomode=%d dmamode=%d udmamode=%d cblid=%d\n", ata_pmode(AD_PARAM), ata_wmode(AD_PARAM), - ata_umode(AD_PARAM), AD_PARAM->cblid); + ata_umode(AD_PARAM), AD_PARAM->hwres_cblid); } else ata_printf(adp->controller, adp->unit, - "%luMB <%.40s> [%d/%d/%d] at ata%d-%s %s%s\n", + "%lluMB <%.40s> [%lld/%d/%d] at ata%d-%s %s%s\n", adp->total_secs / ((1024L * 1024L) / DEV_BSIZE), AD_PARAM->model, adp->total_secs / (adp->heads*adp->sectors), adp->heads, adp->sectors, diff --git a/sys/dev/ata/ata-disk.h b/sys/dev/ata/ata-disk.h index 5c214a5..217063f 100644 --- a/sys/dev/ata/ata-disk.h +++ b/sys/dev/ata/ata-disk.h @@ -58,7 +58,7 @@ struct ad_softc { struct ata_softc *controller; /* ptr to parent ctrl */ int unit; /* ATA_MASTER or ATA_SLAVE */ int lun; /* logical unit number */ - u_int32_t total_secs; /* total # of sectors (LBA) */ + u_int64_t total_secs; /* total # of sectors (LBA) */ u_int8_t heads; u_int8_t sectors; u_int32_t transfersize; /* size of each transfer */ @@ -66,7 +66,7 @@ struct ad_softc { int flags; /* drive flags */ #define AD_F_LABELLING 0x0001 #define AD_F_DETACHING 0x0002 -#define AD_F_LBA_ENABLED 0x0004 +#define AD_F_CHS_USED 0x0004 #define AD_F_32B_ENABLED 0x0008 #define AD_F_TAG_ENABLED 0x0010 #define AD_F_RAID_SUBDISK 0x0020 diff --git a/sys/dev/ata/ata-dma.c b/sys/dev/ata/ata-dma.c index a578ea9..12a2e2a 100644 --- a/sys/dev/ata/ata-dma.c +++ b/sys/dev/ata/ata-dma.c @@ -103,7 +103,7 @@ ata_dmainit(struct ata_softc *scp, int device, /* DMA engine address alignment is usually 1 word (2 bytes) */ scp->alignment = 0x1; - if (udmamode > 2 && !ATA_PARAM(scp, device)->cblid) { + if (udmamode > 2 && !ATA_PARAM(scp, device)->hwres_cblid) { ata_printf(scp, device, "DMA limited to UDMA33, non-ATA66 compliant cable\n"); udmamode = 2; @@ -119,7 +119,7 @@ ata_dmainit(struct ata_softc *scp, int device, word54 = pci_read_config(parent, 0x54, 2); if (word54 & (0x10 << devno)) { - error = ata_command(scp, device, ATA_C_SETFEATURES, 0, 0, 0, + error = ata_command(scp, device, ATA_C_SETFEATURES, 0, ATA_UDMA5, ATA_C_F_SETXFER,ATA_WAIT_READY); if (bootverbose) ata_printf(scp, device, @@ -149,7 +149,7 @@ ata_dmainit(struct ata_softc *scp, int device, word54 = pci_read_config(parent, 0x54, 2); if (word54 & (0x10 << devno)) { - error = ata_command(scp, device, ATA_C_SETFEATURES, 0, 0, 0, + error = ata_command(scp, device, ATA_C_SETFEATURES, 0, ATA_UDMA4, ATA_C_F_SETXFER,ATA_WAIT_READY); if (bootverbose) ata_printf(scp, device, @@ -178,7 +178,7 @@ ata_dmainit(struct ata_softc *scp, int device, if (udmamode >= 2) { int32_t mask48, new48; - error = ata_command(scp, device, ATA_C_SETFEATURES, 0, 0, 0, + error = ata_command(scp, device, ATA_C_SETFEATURES, 0, ATA_UDMA2, ATA_C_F_SETXFER, ATA_WAIT_READY); if (bootverbose) ata_printf(scp, device, "%s setting UDMA2 on Intel chip\n", @@ -218,7 +218,7 @@ ata_dmainit(struct ata_softc *scp, int device, pci_write_config(parent, 0x40, new40, 4); pci_write_config(parent, 0x44, new44, 4); } - error = ata_command(scp, device, ATA_C_SETFEATURES, 0, 0, 0, + error = ata_command(scp, device, ATA_C_SETFEATURES, 0, ATA_WDMA2, ATA_C_F_SETXFER, ATA_WAIT_READY); if (bootverbose) ata_printf(scp, device, "%s setting WDMA2 on Intel chip\n", @@ -267,7 +267,7 @@ ata_dmainit(struct ata_softc *scp, int device, ((word40 >> (device == ATA_MASTER ? 0 : 4)) & 1) == 1)) break; - error = ata_command(scp, device, ATA_C_SETFEATURES, 0, 0, 0, + error = ata_command(scp, device, ATA_C_SETFEATURES, 0, ATA_WDMA2, ATA_C_F_SETXFER, ATA_WAIT_READY); if (bootverbose) ata_printf(scp, device, @@ -289,7 +289,7 @@ ata_dmainit(struct ata_softc *scp, int device, break; } if (udmamode >= 5 && pci_get_revid(parent) >= 0xC4) { - error = ata_command(scp, device, ATA_C_SETFEATURES, 0, 0, 0, + error = ata_command(scp, device, ATA_C_SETFEATURES, 0, ATA_UDMA5, ATA_C_F_SETXFER, ATA_WAIT_READY); if (bootverbose) ata_printf(scp, device, @@ -310,7 +310,7 @@ ata_dmainit(struct ata_softc *scp, int device, } } if (udmamode >= 4 && pci_get_revid(parent) >= 0xC2) { - error = ata_command(scp, device, ATA_C_SETFEATURES, 0, 0, 0, + error = ata_command(scp, device, ATA_C_SETFEATURES, 0, ATA_UDMA4, ATA_C_F_SETXFER, ATA_WAIT_READY); if (bootverbose) ata_printf(scp, device, @@ -331,7 +331,7 @@ ata_dmainit(struct ata_softc *scp, int device, } } if (udmamode >= 2 && pci_get_revid(parent) >= 0x20) { - error = ata_command(scp, device, ATA_C_SETFEATURES, 0, 0, 0, + error = ata_command(scp, device, ATA_C_SETFEATURES, 0, ATA_UDMA2, ATA_C_F_SETXFER, ATA_WAIT_READY); if (bootverbose) ata_printf(scp, device, @@ -356,7 +356,7 @@ ata_dmainit(struct ata_softc *scp, int device, ~(0x0008 << (devno << 2)), 2); if (wdmamode >= 2 && apiomode >= 4) { - error = ata_command(scp, device, ATA_C_SETFEATURES, 0, 0, 0, + error = ata_command(scp, device, ATA_C_SETFEATURES, 0, ATA_WDMA2, ATA_C_F_SETXFER, ATA_WAIT_READY); if (bootverbose) ata_printf(scp, device, @@ -377,7 +377,7 @@ ata_dmainit(struct ata_softc *scp, int device, case 0x74111022: /* AMD 766 */ if (udmamode >= 5) { - error = ata_command(scp, device, ATA_C_SETFEATURES, 0, 0, 0, + error = ata_command(scp, device, ATA_C_SETFEATURES, 0, ATA_UDMA5, ATA_C_F_SETXFER, ATA_WAIT_READY); if (bootverbose) ata_printf(scp, device, @@ -393,7 +393,7 @@ ata_dmainit(struct ata_softc *scp, int device, case 0x74091022: /* AMD 756 */ if (udmamode >= 4) { - error = ata_command(scp, device, ATA_C_SETFEATURES, 0, 0, 0, + error = ata_command(scp, device, ATA_C_SETFEATURES, 0, ATA_UDMA4, ATA_C_F_SETXFER, ATA_WAIT_READY); if (bootverbose) ata_printf(scp, device, @@ -411,7 +411,7 @@ ata_dmainit(struct ata_softc *scp, int device, if (ata_find_dev(parent, 0x06861106, 0x40) || ata_find_dev(parent, 0x30741106, 0)) { /* 82C686b */ if (udmamode >= 5) { - error = ata_command(scp, device, ATA_C_SETFEATURES, 0, 0, 0, + error = ata_command(scp, device, ATA_C_SETFEATURES, 0, ATA_UDMA5, ATA_C_F_SETXFER, ATA_WAIT_READY); if (bootverbose) ata_printf(scp, device, @@ -424,7 +424,7 @@ ata_dmainit(struct ata_softc *scp, int device, } } if (udmamode >= 4) { - error = ata_command(scp, device, ATA_C_SETFEATURES, 0, 0, 0, + error = ata_command(scp, device, ATA_C_SETFEATURES, 0, ATA_UDMA4, ATA_C_F_SETXFER, ATA_WAIT_READY); if (bootverbose) ata_printf(scp, device, @@ -437,7 +437,7 @@ ata_dmainit(struct ata_softc *scp, int device, } } if (udmamode >= 2) { - error = ata_command(scp, device, ATA_C_SETFEATURES, 0, 0, 0, + error = ata_command(scp, device, ATA_C_SETFEATURES, 0, ATA_UDMA2, ATA_C_F_SETXFER, ATA_WAIT_READY); if (bootverbose) ata_printf(scp, device, @@ -453,7 +453,7 @@ ata_dmainit(struct ata_softc *scp, int device, else if (ata_find_dev(parent, 0x06861106, 0) || /* 82C686a */ ata_find_dev(parent, 0x05961106, 0x12)) { /* 82C596b */ if (udmamode >= 4) { - error = ata_command(scp, device, ATA_C_SETFEATURES, 0, 0, 0, + error = ata_command(scp, device, ATA_C_SETFEATURES, 0, ATA_UDMA4, ATA_C_F_SETXFER, ATA_WAIT_READY); if (bootverbose) ata_printf(scp, device, @@ -466,7 +466,7 @@ ata_dmainit(struct ata_softc *scp, int device, } } if (udmamode >= 2) { - error = ata_command(scp, device, ATA_C_SETFEATURES, 0, 0, 0, + error = ata_command(scp, device, ATA_C_SETFEATURES, 0, ATA_UDMA2, ATA_C_F_SETXFER, ATA_WAIT_READY); if (bootverbose) ata_printf(scp, device, @@ -483,7 +483,7 @@ ata_dmainit(struct ata_softc *scp, int device, ata_find_dev(parent, 0x05861106, 0x03)) { /* 82C586b */ via_82c586: if (udmamode >= 2) { - error = ata_command(scp, device, ATA_C_SETFEATURES, 0, 0, 0, + error = ata_command(scp, device, ATA_C_SETFEATURES, 0, ATA_UDMA2, ATA_C_F_SETXFER, ATA_WAIT_READY); if (bootverbose) ata_printf(scp, device, "%s setting UDMA2 on %s chip\n", @@ -498,7 +498,7 @@ via_82c586: } } if (wdmamode >= 2 && apiomode >= 4) { - error = ata_command(scp, device, ATA_C_SETFEATURES, 0, 0, 0, + error = ata_command(scp, device, ATA_C_SETFEATURES, 0, ATA_WDMA2, ATA_C_F_SETXFER, ATA_WAIT_READY); if (bootverbose) ata_printf(scp, device, "%s setting WDMA2 on %s chip\n", @@ -516,7 +516,7 @@ via_82c586: case 0x55131039: /* SiS 5591 */ if (udmamode >= 2 && pci_get_revid(parent) > 0xc1) { - error = ata_command(scp, device, ATA_C_SETFEATURES, 0, 0, 0, + error = ata_command(scp, device, ATA_C_SETFEATURES, 0, ATA_UDMA2, ATA_C_F_SETXFER, ATA_WAIT_READY); if (bootverbose) ata_printf(scp, device, @@ -529,7 +529,7 @@ via_82c586: } } if (wdmamode >=2 && apiomode >= 4) { - error = ata_command(scp, device, ATA_C_SETFEATURES, 0, 0, 0, + error = ata_command(scp, device, ATA_C_SETFEATURES, 0, ATA_WDMA2, ATA_C_F_SETXFER, ATA_WAIT_READY); if (bootverbose) ata_printf(scp, device, @@ -548,7 +548,7 @@ via_82c586: if (udmamode >= 5) { u_int8_t umode; - error = ata_command(scp, device, ATA_C_SETFEATURES, 0, 0, 0, + error = ata_command(scp, device, ATA_C_SETFEATURES, 0, ATA_UDMA5, ATA_C_F_SETXFER, ATA_WAIT_READY); if (bootverbose) ata_printf(scp, device, "%s setting UDMA5 on CMD chip\n", @@ -568,7 +568,7 @@ via_82c586: if (udmamode >= 4) { u_int8_t umode; - error = ata_command(scp, device, ATA_C_SETFEATURES, 0, 0, 0, + error = ata_command(scp, device, ATA_C_SETFEATURES, 0, ATA_UDMA4, ATA_C_F_SETXFER, ATA_WAIT_READY); if (bootverbose) ata_printf(scp, device, "%s setting UDMA4 on CMD chip\n", @@ -585,7 +585,7 @@ via_82c586: if (udmamode >= 2) { u_int8_t umode; - error = ata_command(scp, device, ATA_C_SETFEATURES, 0, 0, 0, + error = ata_command(scp, device, ATA_C_SETFEATURES, 0, ATA_UDMA2, ATA_C_F_SETXFER, ATA_WAIT_READY); if (bootverbose) ata_printf(scp, device, "%s setting UDMA2 on CMD chip\n", @@ -607,7 +607,7 @@ via_82c586: case 0x06461095: /* CMD 646 ATA controller */ if (wdmamode >= 2 && apiomode >= 4) { - error = ata_command(scp, device, ATA_C_SETFEATURES, 0, 0, 0, + error = ata_command(scp, device, ATA_C_SETFEATURES, 0, ATA_WDMA2, ATA_C_F_SETXFER, ATA_WAIT_READY); if (bootverbose) ata_printf(scp, device, "%s setting WDMA2 on CMD chip\n", @@ -625,7 +625,7 @@ via_82c586: case 0xc6931080: /* Cypress 82c693 ATA controller */ if (wdmamode >= 2 && apiomode >= 4) { - error = ata_command(scp, device, ATA_C_SETFEATURES, 0, 0, 0, + error = ata_command(scp, device, ATA_C_SETFEATURES, 0, ATA_WDMA2, ATA_C_F_SETXFER, ATA_WAIT_READY); if (bootverbose) ata_printf(scp, device, @@ -643,7 +643,7 @@ via_82c586: case 0x01021078: /* Cyrix 5530 ATA33 controller */ scp->alignment = 0xf; /* DMA engine requires 16 byte alignment */ if (udmamode >= 2) { - error = ata_command(scp, device, ATA_C_SETFEATURES, 0, 0, 0, + error = ata_command(scp, device, ATA_C_SETFEATURES, 0, ATA_UDMA2, ATA_C_F_SETXFER, ATA_WAIT_READY); if (bootverbose) ata_printf(scp, device, "%s setting UDMA2 on Cyrix chip\n", @@ -655,7 +655,7 @@ via_82c586: } } if (wdmamode >= 2 && apiomode >= 4) { - error = ata_command(scp, device, ATA_C_SETFEATURES, 0, 0, 0, + error = ata_command(scp, device, ATA_C_SETFEATURES, 0, ATA_WDMA2, ATA_C_F_SETXFER, ATA_WAIT_READY); if (bootverbose) ata_printf(scp, device, "%s setting WDMA2 on Cyrix chip\n", @@ -666,20 +666,20 @@ via_82c586: return; } } - error = ata_command(scp, device, ATA_C_SETFEATURES, 0, 0, 0, - ata_pio2mode(apiomode), ATA_C_F_SETXFER, + error = ata_command(scp, device, ATA_C_SETFEATURES, 0, + ATA_PIO0 + apiomode, ATA_C_F_SETXFER, ATA_WAIT_READY); if (bootverbose) ata_printf(scp, device, "%s setting %s on Cyrix chip\n", (error) ? "failed" : "success", - ata_mode2str(ata_pio2mode(apiomode))); - cyrix_timing(scp, devno, ata_pio2mode(apiomode)); - scp->mode[ATA_DEV(device)] = ata_pio2mode(apiomode); + ata_mode2str(ATA_PIO0 + apiomode)); + cyrix_timing(scp, devno, ATA_PIO0 + apiomode); + scp->mode[ATA_DEV(device)] = ATA_PIO0 + apiomode; return; case 0x02111166: /* ServerWorks ROSB4 ATA33 controller */ if (udmamode >= 2) { - error = ata_command(scp, device, ATA_C_SETFEATURES, 0, 0, 0, + error = ata_command(scp, device, ATA_C_SETFEATURES, 0, ATA_UDMA2, ATA_C_F_SETXFER, ATA_WAIT_READY); if (bootverbose) ata_printf(scp, device, @@ -700,7 +700,7 @@ via_82c586: } } if (wdmamode >= 2 && apiomode >= 4) { - error = ata_command(scp, device, ATA_C_SETFEATURES, 0, 0, 0, + error = ata_command(scp, device, ATA_C_SETFEATURES, 0, ATA_WDMA2, ATA_C_F_SETXFER, ATA_WAIT_READY); if (bootverbose) ata_printf(scp, device, @@ -727,7 +727,7 @@ via_82c586: case 0x6268105a: /* Promise TX2v2 ATA100 controllers */ ATA_OUTB(scp->r_bmio, ATA_BMDEVSPEC_0, 0x0b); if (udmamode >= 4 && !(ATA_INB(scp->r_bmio, ATA_BMDEVSPEC_1) & 0x04)) { - error = ata_command(scp, device, ATA_C_SETFEATURES, 0, 0, 0, + error = ata_command(scp, device, ATA_C_SETFEATURES, 0, ATA_UDMA + max(udmamode, 5), ATA_C_F_SETXFER, ATA_WAIT_READY); if (bootverbose) @@ -740,7 +740,7 @@ via_82c586: } } if (udmamode >= 2) { - error = ata_command(scp, device, ATA_C_SETFEATURES, 0, 0, 0, + error = ata_command(scp, device, ATA_C_SETFEATURES, 0, ATA_UDMA2, ATA_C_F_SETXFER, ATA_WAIT_READY); if (bootverbose) ata_printf(scp, device, "%s setting %s on Promise chip\n", @@ -751,7 +751,7 @@ via_82c586: } } if (wdmamode >= 2 && apiomode >= 4) { - error = ata_command(scp, device, ATA_C_SETFEATURES, 0, 0, 0, + error = ata_command(scp, device, ATA_C_SETFEATURES, 0, ATA_WDMA2, ATA_C_F_SETXFER, ATA_WAIT_READY); if (bootverbose) ata_printf(scp, device, "%s setting %s on Promise chip\n", @@ -767,7 +767,7 @@ via_82c586: case 0x0d30105a: /* Promise OEM ATA100 controllers */ if (!ATAPI_DEVICE(scp, device) && udmamode >= 5 && !(pci_read_config(parent, 0x50, 2)&(scp->channel ? 1<<11 : 1<<10))){ - error = ata_command(scp, device, ATA_C_SETFEATURES, 0, 0, 0, + error = ata_command(scp, device, ATA_C_SETFEATURES, 0, ATA_UDMA5, ATA_C_F_SETXFER, ATA_WAIT_READY); if (bootverbose) ata_printf(scp, device, @@ -784,7 +784,7 @@ via_82c586: case 0x4d38105a: /* Promise Ultra/FastTrak 66 controllers */ if (!ATAPI_DEVICE(scp, device) && udmamode >= 4 && !(pci_read_config(parent, 0x50, 2)&(scp->channel ? 1<<11 : 1<<10))){ - error = ata_command(scp, device, ATA_C_SETFEATURES, 0, 0, 0, + error = ata_command(scp, device, ATA_C_SETFEATURES, 0, ATA_UDMA4, ATA_C_F_SETXFER, ATA_WAIT_READY); if (bootverbose) ata_printf(scp, device, @@ -800,7 +800,7 @@ via_82c586: case 0x4d33105a: /* Promise Ultra/FastTrak 33 controllers */ if (!ATAPI_DEVICE(scp, device) && udmamode >= 2) { - error = ata_command(scp, device, ATA_C_SETFEATURES, 0, 0, 0, + error = ata_command(scp, device, ATA_C_SETFEATURES, 0, ATA_UDMA2, ATA_C_F_SETXFER, ATA_WAIT_READY); if (bootverbose) ata_printf(scp, device, @@ -813,7 +813,7 @@ via_82c586: } } if (!ATAPI_DEVICE(scp, device) && wdmamode >= 2 && apiomode >= 4) { - error = ata_command(scp, device, ATA_C_SETFEATURES, 0, 0, 0, + error = ata_command(scp, device, ATA_C_SETFEATURES, 0, ATA_WDMA2, ATA_C_F_SETXFER, ATA_WAIT_READY); if (bootverbose) ata_printf(scp, device, @@ -825,23 +825,23 @@ via_82c586: return; } } - error = ata_command(scp, device, ATA_C_SETFEATURES, 0, 0, 0, - ata_pio2mode(apiomode), + error = ata_command(scp, device, ATA_C_SETFEATURES, 0, + ATA_PIO0 + apiomode, ATA_C_F_SETXFER, ATA_WAIT_READY); if (bootverbose) ata_printf(scp, device, "%s setting PIO%d on Promise chip\n", (error) ? "failed" : "success", (apiomode >= 0) ? apiomode : 0); - promise_timing(scp, devno, ata_pio2mode(apiomode)); - scp->mode[ATA_DEV(device)] = ata_pio2mode(apiomode); + promise_timing(scp, devno, ATA_PIO0 + apiomode); + scp->mode[ATA_DEV(device)] = ATA_PIO0 + apiomode; return; case 0x00041103: /* HighPoint HPT366/368/370 controllers */ if (!ATAPI_DEVICE(scp, device) && udmamode >=5 && pci_get_revid(parent) >= 0x03 && !(pci_read_config(parent, 0x5a, 1) & (scp->channel ? 0x01:0x02))) { - error = ata_command(scp, device, ATA_C_SETFEATURES, 0, 0, 0, + error = ata_command(scp, device, ATA_C_SETFEATURES, 0, ATA_UDMA5, ATA_C_F_SETXFER, ATA_WAIT_READY); if (bootverbose) ata_printf(scp, device, @@ -855,7 +855,7 @@ via_82c586: } if (!ATAPI_DEVICE(scp, device) && udmamode >=4 && !(pci_read_config(parent, 0x5a, 1) & (scp->channel ? 0x01:0x02))) { - error = ata_command(scp, device, ATA_C_SETFEATURES, 0, 0, 0, + error = ata_command(scp, device, ATA_C_SETFEATURES, 0, ATA_UDMA4, ATA_C_F_SETXFER, ATA_WAIT_READY); if (bootverbose) ata_printf(scp, device, @@ -868,7 +868,7 @@ via_82c586: } } if (!ATAPI_DEVICE(scp, device) && udmamode >= 2) { - error = ata_command(scp, device, ATA_C_SETFEATURES, 0, 0, 0, + error = ata_command(scp, device, ATA_C_SETFEATURES, 0, ATA_UDMA2, ATA_C_F_SETXFER, ATA_WAIT_READY); if (bootverbose) ata_printf(scp, device, @@ -881,7 +881,7 @@ via_82c586: } } if (!ATAPI_DEVICE(scp, device) && wdmamode >= 2 && apiomode >= 4) { - error = ata_command(scp, device, ATA_C_SETFEATURES, 0, 0, 0, + error = ata_command(scp, device, ATA_C_SETFEATURES, 0, ATA_WDMA2, ATA_C_F_SETXFER, ATA_WAIT_READY); if (bootverbose) ata_printf(scp, device, @@ -893,15 +893,15 @@ via_82c586: return; } } - error = ata_command(scp, device, ATA_C_SETFEATURES, 0, 0, 0, - ata_pio2mode(apiomode), + error = ata_command(scp, device, ATA_C_SETFEATURES, 0, + ATA_PIO0 + apiomode, ATA_C_F_SETXFER, ATA_WAIT_READY); if (bootverbose) ata_printf(scp, device, "%s setting PIO%d on HighPoint chip\n", (error) ? "failed" : "success", (apiomode >= 0) ? apiomode : 0); - hpt_timing(scp, devno, ata_pio2mode(apiomode)); - scp->mode[ATA_DEV(device)] = ata_pio2mode(apiomode); + hpt_timing(scp, devno, ATA_PIO0 + apiomode); + scp->mode[ATA_DEV(device)] = ATA_PIO0 + apiomode; return; default: /* unknown controller chip */ @@ -922,7 +922,7 @@ via_82c586: /* well, we have no support for this, but try anyways */ if ((wdmamode >= 2 && apiomode >= 4) && scp->r_bmio) { - error = ata_command(scp, device, ATA_C_SETFEATURES, 0, 0, 0, + error = ata_command(scp, device, ATA_C_SETFEATURES, 0, ATA_WDMA2, ATA_C_F_SETXFER, ATA_WAIT_READY); if (bootverbose) ata_printf(scp, device, @@ -934,13 +934,13 @@ via_82c586: } } } - error = ata_command(scp, device, ATA_C_SETFEATURES, 0, 0, 0, - ata_pio2mode(apiomode), ATA_C_F_SETXFER,ATA_WAIT_READY); + error = ata_command(scp, device, ATA_C_SETFEATURES, 0, ATA_PIO0 + apiomode, + ATA_C_F_SETXFER,ATA_WAIT_READY); if (bootverbose) ata_printf(scp, device, "%s setting PIO%d on generic chip\n", (error) ? "failed" : "success", apiomode < 0 ? 0 : apiomode); if (!error) - scp->mode[ATA_DEV(device)] = ata_pio2mode(apiomode); + scp->mode[ATA_DEV(device)] = ATA_PIO0 + apiomode; else { if (bootverbose) ata_printf(scp, device, "using PIO mode set by BIOS\n"); diff --git a/sys/dev/ata/ata-raid.c b/sys/dev/ata/ata-raid.c index 7b9cfc3..480b5ac 100644 --- a/sys/dev/ata/ata-raid.c +++ b/sys/dev/ata/ata-raid.c @@ -549,9 +549,8 @@ int ar_read(struct ad_softc *adp, u_int32_t lba, int count, char *data) { if (ata_command(adp->controller, adp->unit | ATA_D_LBA, - (count > DEV_BSIZE) ? ATA_C_READ_MUL : ATA_C_READ, - (lba >> 8) & 0xffff, (lba >> 24) & 0xff, lba & 0xff, - count / DEV_BSIZE, 0, ATA_WAIT_INTR)) { + (count > DEV_BSIZE) ? ATA_C_READ_MUL : ATA_C_READ, + lba, count / DEV_BSIZE, 0, ATA_WAIT_INTR)) { ata_printf(adp->controller, adp->unit, "RAID read config failed\n"); return 1; } diff --git a/sys/dev/ata/atapi-all.c b/sys/dev/ata/atapi-all.c index a63504e..ea921d6 100644 --- a/sys/dev/ata/atapi-all.c +++ b/sys/dev/ata/atapi-all.c @@ -81,21 +81,21 @@ atapi_attach(struct ata_softc *scp, int device) ata_printf(scp, device, "piomode=%d dmamode=%d udmamode=%d dmaflag=%d\n", ata_pmode(ATP_PARAM), ata_wmode(ATP_PARAM), - ata_umode(ATP_PARAM), ATP_PARAM->dmaflag); + ata_umode(ATP_PARAM), ATP_PARAM->support_dma); - if (atapi_dma && !(ATP_PARAM->drqtype == ATAPI_DRQT_INTR)){ + if (atapi_dma && !(ATP_PARAM->drq_type == ATAPI_DRQT_INTR)) { ata_dmainit(atp->controller, atp->unit, (ata_pmode(ATP_PARAM) < 0) ? - (ATP_PARAM->dmaflag ? 4 : 0) : ata_pmode(ATP_PARAM), + (ATP_PARAM->support_dma ? 4 : 0) : ata_pmode(ATP_PARAM), (ata_wmode(ATP_PARAM) < 0) ? - (ATP_PARAM->dmaflag ? 2 : 0) : ata_wmode(ATP_PARAM), + (ATP_PARAM->support_dma ? 2 : 0) : ata_wmode(ATP_PARAM), ata_umode(ATP_PARAM)); } else ata_dmainit(atp->controller, atp->unit, ata_pmode(ATP_PARAM) < 0 ? 0 : ata_pmode(ATP_PARAM), -1,-1); - switch (ATP_PARAM->device_type) { + switch (ATP_PARAM->type) { #ifdef DEV_ATAPICD case ATAPI_TYPE_CDROM: if (acdattach(atp)) @@ -118,7 +118,7 @@ notfound: default: ata_printf(scp, device, "<%.40s/%.8s> %s device - NO DRIVER!\n", ATP_PARAM->model, ATP_PARAM->revision, - atapi_type(ATP_PARAM->device_type)); + atapi_type(ATP_PARAM->type)); free(atp, M_ATAPI); atp = NULL; } @@ -134,7 +134,7 @@ atapi_detach(struct atapi_softc *atp) atp->flags |= ATAPI_F_DETACHING; ata_printf(atp->controller, atp->unit, "removed from configuration\n"); - switch (ATP_PARAM->device_type) { + switch (ATP_PARAM->type) { #ifdef DEV_ATAPICD case ATAPI_TYPE_CDROM: acddetach(atp); @@ -186,7 +186,7 @@ atapi_queue_cmd(struct atapi_softc *atp, int8_t *ccb, caddr_t data, request->bytecount = count; request->flags = flags; request->timeout = timeout * hz; - request->ccbsize = (ATP_PARAM->cmdsize) ? 16 : 12; + request->ccbsize = (ATP_PARAM->packet_size) ? 16 : 12; bcopy(ccb, request->ccb, request->ccbsize); if (callback) { request->callback = callback; @@ -232,7 +232,7 @@ atapi_queue_cmd(struct atapi_softc *atp, int8_t *ccb, caddr_t data, void atapi_start(struct atapi_softc *atp) { - switch (ATP_PARAM->device_type) { + switch (ATP_PARAM->type) { #ifdef DEV_ATAPICD case ATAPI_TYPE_CDROM: acd_start(atp); @@ -299,7 +299,7 @@ atapi_transfer(struct atapi_request *request) /* start ATAPI operation */ if (ata_command(atp->controller, atp->unit, ATA_C_PACKET_CMD, - request->bytecount, 0, 0, 0, + request->bytecount, 0, (request->flags & ATPR_F_DMA_USED) ? ATA_F_DMA : 0, ATA_IMMEDIATE)) ata_printf(atp->controller, atp->unit, @@ -310,7 +310,7 @@ atapi_transfer(struct atapi_request *request) request->dmatab, request->flags & ATPR_F_READ); /* command interrupt device ? just return */ - if (ATP_PARAM->drqtype == ATAPI_DRQT_INTR) + if (ATP_PARAM->drq_type == ATAPI_DRQT_INTR) return ATA_OP_CONTINUES; /* ready to write ATAPI command */ @@ -496,9 +496,9 @@ atapi_reinit(struct atapi_softc *atp) if (atp->controller->mode[ATA_DEV(atp->unit)] >= ATA_DMA) ata_dmainit(atp->controller, atp->unit, (ata_pmode(ATP_PARAM) < 0) ? - (ATP_PARAM->dmaflag ? 4 : 0) : ata_pmode(ATP_PARAM), + (ATP_PARAM->support_dma ? 4 : 0) : ata_pmode(ATP_PARAM), (ata_wmode(ATP_PARAM) < 0) ? - (ATP_PARAM->dmaflag ? 2 : 0) : ata_wmode(ATP_PARAM), + (ATP_PARAM->support_dma ? 2 : 0) : ata_wmode(ATP_PARAM), ata_umode(ATP_PARAM)); else ata_dmainit(atp->controller, atp->unit, diff --git a/sys/sys/ata.h b/sys/sys/ata.h index 42ad1d4..dd62dcd 100644 --- a/sys/sys/ata.h +++ b/sys/sys/ata.h @@ -35,134 +35,174 @@ /* ATA/ATAPI device parameter information */ struct ata_params { - u_int8_t cmdsize :2; /* packet command size */ +/*000*/ u_int16_t packet_size :2; /* packet command size */ #define ATAPI_PSIZE_12 0 /* 12 bytes */ #define ATAPI_PSIZE_16 1 /* 16 bytes */ - u_int8_t :3; - u_int8_t drqtype :2; /* DRQ type */ + u_int16_t incomplete :1; + u_int16_t :2; + u_int16_t drq_type :2; /* DRQ type */ #define ATAPI_DRQT_MPROC 0 /* cpu 3 ms delay */ #define ATAPI_DRQT_INTR 1 /* intr 10 ms delay */ #define ATAPI_DRQT_ACCEL 2 /* accel 50 us delay */ - u_int8_t removable :1; /* device is removable */ - u_int8_t device_type :5; /* device type */ + u_int16_t removable :1; /* device is removable */ + u_int16_t type :5; /* device type */ #define ATAPI_TYPE_DIRECT 0 /* disk/floppy */ #define ATAPI_TYPE_TAPE 1 /* streaming tape */ #define ATAPI_TYPE_CDROM 5 /* CD-ROM device */ #define ATAPI_TYPE_OPTICAL 7 /* optical disk */ - u_int8_t :1; - u_int8_t proto :2; /* command protocol */ -#define ATAPI_PROTO_ATAPI 2 - - u_int16_t cylinders; /* number of cylinders */ - u_int16_t reserved2; - u_int16_t heads; /* # heads */ - u_int16_t unfbytespertrk; /* # unformatted bytes/track */ - u_int16_t unfbytes; /* # unformatted bytes/sector */ - u_int16_t sectors; /* # sectors/track */ - u_int16_t vendorunique0[3]; - u_int8_t serial[20]; /* serial number */ - u_int16_t buffertype; /* buffer type */ -#define ATA_BT_SINGLEPORTSECTOR 1 /* 1 port, 1 sector buffer */ -#define ATA_BT_DUALPORTMULTI 2 /* 2 port, mult sector buffer */ -#define ATA_BT_DUALPORTMULTICACHE 3 /* above plus track cache */ - - u_int16_t buffersize; /* buf size, 512-byte units */ - u_int16_t necc; /* ecc bytes appended */ - u_int8_t revision[8]; /* firmware revision */ - u_int8_t model[40]; /* model name */ - u_int8_t nsecperint; /* sectors per interrupt */ - u_int8_t vendorunique1; - u_int16_t usedmovsd; /* double word read/write? */ - - u_int8_t vendorcap; /* vendor capabilities */ - u_int8_t dmaflag :1; /* DMA supported - always 1 */ - u_int8_t lbaflag :1; /* LBA supported - always 1 */ - u_int8_t iordydis :1; /* IORDY may be disabled */ - u_int8_t iordyflag :1; /* IORDY supported */ - u_int8_t softreset :1; /* needs softreset when busy */ - u_int8_t stdby_ovlap :1; /* standby/overlap supported */ - u_int8_t queueing :1; /* supports queuing overlap */ - u_int8_t idmaflag :1; /* interleaved DMA supported */ - u_int16_t capvalidate; /* validation for above */ - - u_int8_t vendorunique3; - u_int8_t opiomode; /* PIO modes 0-2 */ - u_int8_t vendorunique4; - u_int8_t odmamode; /* old DMA modes, not ATA-3 */ - - u_int16_t atavalid; /* fields valid */ + u_int16_t :2; + u_int16_t cmd_protocol :1; /* command protocol */ +#define ATA_PROTO_ATA 0 +#define ATA_PROTO_ATAPI 1 + +/*001*/ u_int16_t cylinders; /* # of cylinders */ + u_int16_t reserved2; +/*003*/ u_int16_t heads; /* # heads */ + u_int16_t obsolete4; + u_int16_t obsolete5; +/*006*/ u_int16_t sectors; /* # sectors/track */ +/*007*/ u_int16_t vendor7[3]; +/*010*/ u_int8_t serial[20]; /* serial number */ + u_int16_t retired20; + u_int16_t retired21; + u_int16_t obsolete22; +/*023*/ u_int8_t revision[8]; /* firmware revision */ +/*027*/ u_int8_t model[40]; /* model name */ +/*047*/ u_int16_t sectors_intr:8; /* sectors per interrupt */ + u_int16_t :8; + +/*048*/ u_int16_t usedmovsd; /* double word read/write? */ +/*049*/ u_int16_t retired49:8; + u_int16_t support_dma :1; /* DMA supported */ + u_int16_t support_lba :1; /* LBA supported */ + u_int16_t disable_iordy :1; /* IORDY may be disabled */ + u_int16_t support_iordy :1; /* IORDY supported */ + u_int16_t softreset :1; /* needs softreset when busy */ + u_int16_t stdby_ovlap :1; /* standby/overlap supported */ + u_int16_t support_queueing:1; /* supports queuing overlap */ + u_int16_t support_idma :1; /* interleaved DMA supported */ + +/*050*/ u_int16_t device_stdby_min:1; + u_int16_t :13; + u_int16_t capability_one:1; + u_int16_t capability_zero:1; + +/*051*/ u_int16_t vendor51:8; + u_int16_t retired_piomode:8; /* PIO modes 0-2 */ +/*052*/ u_int16_t vendor52:8; + u_int16_t retired_dmamode:8; /* DMA modes, not ATA-3 */ +/*053*/ u_int16_t atavalid; /* fields valid */ #define ATA_FLAG_54_58 1 /* words 54-58 valid */ #define ATA_FLAG_64_70 2 /* words 64-70 valid */ #define ATA_FLAG_88 4 /* word 88 valid */ - u_int16_t currcyls; - u_int16_t currheads; - u_int16_t currsectors; - u_int16_t currsize0; - u_int16_t currsize1; - u_int8_t currmultsect; - u_int8_t multsectvalid; - u_int32_t lbasize; - - u_int16_t sdmamodes; /* singleword DMA modes */ - u_int16_t wdmamodes; /* multiword DMA modes */ - u_int16_t apiomodes; /* advanced PIO modes */ - - u_int16_t mwdmamin; /* min. M/W DMA time/word ns */ - u_int16_t mwdmarec; /* rec. M/W DMA time ns */ - u_int16_t pioblind; /* min. PIO cycle w/o flow */ - u_int16_t pioiordy; /* min. PIO cycle IORDY flow */ - - u_int16_t reserved69; - u_int16_t reserved70; - u_int16_t rlsovlap; /* rel time (us) for overlap */ - u_int16_t rlsservice; /* rel time (us) for service */ - u_int16_t reserved73; - u_int16_t reserved74; - u_int16_t queuelen:5; - u_int16_t :11; - u_int16_t reserved76; - u_int16_t reserved77; - u_int16_t reserved78; - u_int16_t reserved79; - u_int16_t versmajor; - u_int16_t versminor; - u_int16_t featsupp1; /* 82 */ - u_int16_t supmicrocode:1; - u_int16_t supqueued:1; - u_int16_t supcfa:1; - u_int16_t supapm:1; - u_int16_t suprmsn:1; - u_int16_t :11; - u_int16_t featsupp3; /* 84 */ - u_int16_t featenab1; /* 85 */ - u_int16_t enabmicrocode:1; - u_int16_t enabqueued:1; - u_int16_t enabcfa:1; - u_int16_t enabapm:1; - u_int16_t enabrmsn:1; - u_int16_t :11; - u_int16_t featenab3; /* 87 */ - u_int16_t udmamodes; /* UltraDMA modes */ - u_int16_t erasetime; - u_int16_t enherasetime; - u_int16_t apmlevel; - u_int16_t masterpasswdrev; - u_int16_t masterhwres :8; - u_int16_t slavehwres :5; - u_int16_t cblid :1; - u_int16_t reserved93_1415 :2; - u_int16_t reserved94[32]; - u_int16_t rmvstat; - u_int16_t securstat; - u_int16_t reserved129[30]; - u_int16_t cfapwrmode; - u_int16_t reserved160[85]; - u_int16_t integrity; - u_int16_t reserved246[10]; + u_int16_t obsolete54[5]; +/*059*/ u_int16_t multi_count:8; + u_int16_t multi_valid:1; + u_int16_t :7; + +/*060*/ u_int32_t lba_size; + u_int16_t obsolete62; +/*063*/ u_int16_t mwdmamodes; /* multiword DMA modes */ +/*064*/ u_int16_t apiomodes; /* advanced PIO modes */ + +/*065*/ u_int16_t mwdmamin; /* min. M/W DMA time/word ns */ +/*066*/ u_int16_t mwdmarec; /* rec. M/W DMA time ns */ +/*067*/ u_int16_t pioblind; /* min. PIO cycle w/o flow */ +/*068*/ u_int16_t pioiordy; /* min. PIO cycle IORDY flow */ + u_int16_t reserved69; + u_int16_t reserved70; +/*071*/ u_int16_t rlsovlap; /* rel time (us) for overlap */ +/*072*/ u_int16_t rlsservice; /* rel time (us) for service */ + u_int16_t reserved73; + u_int16_t reserved74; + +/*075*/ u_int16_t queuelen:5; + u_int16_t :11; + + u_int16_t reserved76; + u_int16_t reserved77; + u_int16_t reserved78; + u_int16_t reserved79; +/*080*/ u_int16_t version_major; +/*081*/ u_int16_t version_minor; + struct { +/*082/085*/ u_int16_t smart:1; + u_int16_t security:1; + u_int16_t removable:1; + u_int16_t power_mngt:1; + u_int16_t packet:1; + u_int16_t write_cache:1; + u_int16_t look_ahead:1; + u_int16_t release_irq:1; + u_int16_t service_irq:1; + u_int16_t reset:1; + u_int16_t protected:1; + u_int16_t :1; + u_int16_t write_buffer:1; + u_int16_t read_buffer:1; + u_int16_t nop:1; + u_int16_t :1; + +/*083/086*/ u_int16_t microcode:1; + u_int16_t queued:1; + u_int16_t cfa:1; + u_int16_t apm:1; + u_int16_t notify:1; + u_int16_t standby:1; + u_int16_t spinup:1; + u_int16_t :1; + u_int16_t max_security:1; + u_int16_t auto_acoustic:1; + u_int16_t address48:1; + u_int16_t config_overlay:1; + u_int16_t flush_cache:1; + u_int16_t flush_cache48:1; + u_int16_t support_one:1; + u_int16_t support_zero:1; + +/*084/087*/ u_int16_t smart_error_log:1; + u_int16_t smart_self_test:1; + u_int16_t media_serial_no:1; + u_int16_t media_card_pass:1; + u_int16_t streaming:1; + u_int16_t logging:1; + u_int16_t :8; + u_int16_t extended_one:1; + u_int16_t extended_zero:1; + } support, enabled; + +/*088*/ u_int16_t udmamodes; /* UltraDMA modes */ +/*089*/ u_int16_t erase_time; +/*090*/ u_int16_t enhanced_erase_time; +/*091*/ u_int16_t apm_value; +/*092*/ u_int16_t master_passwd_revision; + +/*093*/ u_int16_t hwres_master :8; + u_int16_t hwres_slave :5; + u_int16_t hwres_cblid :1; + u_int16_t hwres_valid:2; + +/*094*/ u_int16_t current_acoustic:8; + u_int16_t vendor_acoustic:8; + +/*095*/ u_int16_t stream_min_req_size; +/*096*/ u_int16_t stream_transfer_time; +/*097*/ u_int16_t stream_access_latency; +/*098*/ u_int32_t stream_granularity; +/*100*/ u_int64_t lba_size48; + u_int16_t reserved104[23]; +/*127*/ u_int16_t removable_status; +/*128*/ u_int16_t security_status; + u_int16_t reserved129[31]; +/*160*/ u_int16_t cfa_powermode1; + u_int16_t reserved161[14]; +/*176*/ u_int16_t media_serial[30]; + u_int16_t reserved206[49]; +/*255*/ u_int16_t integrity; }; #define ATA_MODE_MASK 0x0f @@ -180,6 +220,7 @@ struct ata_params { #define ATA_UDMA2 0x42 #define ATA_UDMA4 0x44 #define ATA_UDMA5 0x45 +#define ATA_UDMA6 0x46 struct ata_cmd { int channel; |