summaryrefslogtreecommitdiff
path: root/sys/dev/ata
diff options
context:
space:
mode:
authorSøren Schmidt <sos@FreeBSD.org>2002-01-05 17:49:36 +0000
committerSøren Schmidt <sos@FreeBSD.org>2002-01-05 17:49:36 +0000
commitfe0591a3f862745327524e6e197d66aa90b53ab9 (patch)
tree8371fbd44e4dbd383e3e3294abc0c791d7bc453b /sys/dev/ata
parentbee7916dbde7206b65927e273a87127abdeb684c (diff)
Notes
Diffstat (limited to 'sys/dev/ata')
-rw-r--r--sys/dev/ata/ata-all.c152
-rw-r--r--sys/dev/ata/ata-all.h293
-rw-r--r--sys/dev/ata/ata-disk.c107
-rw-r--r--sys/dev/ata/ata-disk.h4
-rw-r--r--sys/dev/ata/ata-dma.c128
-rw-r--r--sys/dev/ata/ata-raid.c12
-rw-r--r--sys/dev/ata/atapi-all.c26
7 files changed, 386 insertions, 336 deletions
diff --git a/sys/dev/ata/ata-all.c b/sys/dev/ata/ata-all.c
index 941a740fa447..263f6d09f0d8 100644
--- a/sys/dev/ata/ata-all.c
+++ b/sys/dev/ata/ata-all.c
@@ -87,7 +87,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);
@@ -1070,7 +1069,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, "identify failed\n");
return -1;
}
@@ -1553,24 +1552,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",
- scp->ioaddr, command, cylinder, head, sector,
- count, feature, flags);
+ "lba=%lld, count=%d, feature=%d, flags=%02x\n",
+ scp->ioaddr, command, lba, count, feature, flags);
#endif
+ /* select device */
+ outb(scp->ioaddr + ATA_DRIVE, ATA_D_IBM | device);
+
/* disable interrupt from device */
if (scp->flags & ATA_QUEUED)
outb(scp->altioaddr, ATA_A_IDS | ATA_A_4BIT);
- /* select device */
- outb(scp->ioaddr + ATA_DRIVE, ATA_D_IBM | device);
-
/* ready to issue command ? */
if (ata_wait(scp, device, 0) < 0) {
ata_printf(scp, device,
@@ -1579,14 +1576,68 @@ ata_command(struct ata_softc *scp, int device, u_int8_t command,
return -1;
}
- outb(scp->ioaddr + ATA_FEATURE, feature);
- outb(scp->ioaddr + ATA_COUNT, count);
- outb(scp->ioaddr + ATA_SECTOR, sector);
- outb(scp->ioaddr + ATA_CYL_MSB, cylinder >> 8);
- outb(scp->ioaddr + ATA_CYL_LSB, cylinder);
- outb(scp->ioaddr + ATA_DRIVE, ATA_D_IBM | device | head);
+ /* only use 48bit addressing if needed because of the overhead */
+ if (lba > 268435455 && scp->dev_param[ATA_DEV(device)]->support.address48) {
+ outb(scp->ioaddr + ATA_FEATURE, (feature>>8) & 0xff);
+ outb(scp->ioaddr + ATA_FEATURE, feature);
+ outb(scp->ioaddr + ATA_COUNT, (count>>8) & 0xff);
+ outb(scp->ioaddr + ATA_COUNT, count & 0xff);
+ outb(scp->ioaddr + ATA_SECTOR, (lba>>24) & 0xff);
+ outb(scp->ioaddr + ATA_SECTOR, lba & 0xff);
+ outb(scp->ioaddr + ATA_CYL_LSB, (lba<<32) & 0xff);
+ outb(scp->ioaddr + ATA_CYL_LSB, (lba>>8) & 0xff);
+ outb(scp->ioaddr + ATA_CYL_MSB, (lba>>40) & 0xff);
+ outb(scp->ioaddr + ATA_CYL_MSB, (lba>>16) & 0xff);
+ outb(scp->ioaddr + 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 {
+ outb(scp->ioaddr + ATA_FEATURE, feature);
+ outb(scp->ioaddr + ATA_COUNT, count);
+ outb(scp->ioaddr + ATA_SECTOR, lba & 0xff);
+ outb(scp->ioaddr + ATA_CYL_LSB, (lba>>8) & 0xff);
+ outb(scp->ioaddr + ATA_CYL_MSB, (lba>>16) & 0xff);
+ if (flags & ATA_USE_CHS)
+ outb(scp->ioaddr + ATA_DRIVE,
+ ATA_D_IBM | device | ((lba>>24) & 0xf));
+ else
+ outb(scp->ioaddr + ATA_DRIVE,
+ ATA_D_IBM | ATA_D_LBA | device | ((lba>>24) & 0xf));
+ }
+
+ switch (flags & ATA_WAIT_MASK) {
+ case ATA_IMMEDIATE:
+ outb(scp->ioaddr + ATA_CMD, command);
+
+ /* enable interrupt */
+ if (scp->flags & ATA_QUEUED)
+ outb(scp->altioaddr, ATA_A_4BIT);
+ break;
- switch (flags) {
case ATA_WAIT_INTR:
scp->active = ATA_WAIT_INTR;
asleep((caddr_t)scp, PRIBIO, "atacmd", 10 * hz);
@@ -1616,18 +1667,7 @@ ata_command(struct ata_softc *scp, int device, u_int8_t command,
if (scp->active != ATA_REINITING)
scp->active = ATA_IDLE;
break;
-
- case ATA_IMMEDIATE:
- outb(scp->ioaddr + ATA_CMD, command);
- break;
-
- default:
- ata_printf(scp, device, "DANGER: illegal interrupt flag=%s\n",
- active2str(flags));
}
- /* enable interrupt */
- if (scp->flags & ATA_QUEUED)
- outb(scp->altioaddr, ATA_A_4BIT);
return error;
}
@@ -1677,25 +1717,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) {
@@ -1704,11 +1732,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;
}
@@ -1716,11 +1744,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;
}
@@ -1729,6 +1757,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)
@@ -1745,34 +1775,6 @@ ata_umode(struct ata_params *ap)
return -1;
}
-static char *
-active2str(int active)
-{
- static char buf[8];
-
- switch (active) {
- case ATA_IDLE:
- return("ATA_IDLE");
- case ATA_IMMEDIATE:
- return("ATA_IMMEDIATE");
- case ATA_WAIT_INTR:
- return("ATA_WAIT_INTR");
- case ATA_WAIT_READY:
- return("ATA_WAIT_READY");
- case ATA_ACTIVE:
- return("ATA_ACTIVE");
- case ATA_ACTIVE_ATA:
- return("ATA_ACTIVE_ATA");
- case ATA_ACTIVE_ATAPI:
- return("ATA_ACTIVE_ATAPI");
- case ATA_REINITING:
- return("ATA_REINITING");
- default:
- sprintf(buf, "0x%02x", active);
- 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 af4aeec7e769..7bbfa045400d 100644
--- a/sys/dev/ata/ata-all.h
+++ b/sys/dev/ata/ata-all.h
@@ -155,133 +155,174 @@ struct ata_dmaentry {
/* ATA/ATAPI device parameter information */
struct ata_params {
- u_int8_t cmdsize :2; /* packet command size */
-#define ATAPI_PSIZE_12 0 /* 12 bytes */
-#define ATAPI_PSIZE_16 1 /* 16 bytes */
+/*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 */
-#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_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 */
-#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_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 :2;
+ u_int16_t cmd_protocol :1; /* command protocol */
+#define ATA_PROTO_ATA 0
+#define ATA_PROTO_ATAPI 1
- 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 */
+/*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;
- 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? */
+/*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 */
- 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 */
+/*050*/ u_int16_t device_stdby_min:1;
+ u_int16_t :13;
+ u_int16_t capability_one:1;
+ u_int16_t capability_zero:1;
- 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 */
+/*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 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 obsolete54[5];
+/*059*/ u_int16_t multi_count:8;
+ u_int16_t multi_valid:1;
+ u_int16_t :7;
- 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;
+/*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 */
- u_int16_t sdmamodes; /* singleword DMA modes */
- u_int16_t wdmamodes; /* multiword DMA modes */
- 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;
- 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 */
+/*075*/ u_int16_t queuelen:5;
+ u_int16_t :11;
- 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 reserved161[84];
- u_int16_t integrity;
+ 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;
};
/* structure describing an ATA device */
@@ -332,14 +373,17 @@ struct ata_softc {
u_int8_t status; /* last controller status */
u_int8_t error; /* last controller error */
int active; /* active processing request */
-#define ATA_IDLE 0x0
-#define ATA_IMMEDIATE 0x1
-#define ATA_WAIT_INTR 0x2
-#define ATA_WAIT_READY 0x3
-#define ATA_ACTIVE 0x4
-#define ATA_ACTIVE_ATA 0x5
-#define ATA_ACTIVE_ATAPI 0x6
-#define ATA_REINITING 0x7
+#define ATA_IDLE 0x0000
+#define ATA_IMMEDIATE 0x0001
+#define ATA_WAIT_INTR 0x0002
+#define ATA_WAIT_READY 0x0004
+#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_REINITING 0x0080
+
TAILQ_HEAD(, ad_request) ata_queue; /* head of ATA queue */
TAILQ_HEAD(, atapi_request) atapi_queue; /* head of ATAPI queue */
@@ -354,12 +398,11 @@ void ata_start(struct ata_softc *);
void ata_reset(struct ata_softc *, int *);
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);
int ata_get_lun(u_int32_t *);
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 f884968a9b8a..a866262da012 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))) {
@@ -129,37 +128,44 @@ 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/write 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))
printf("ad%d: enabling readahead cache failed\n", adp->lun);
/* 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");
}
@@ -176,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))
printf("ad%d: disabling release interrupt failed\n", adp->lun);
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))
printf("ad%d: disabling service interrupt failed\n", adp->lun);
}
@@ -198,13 +204,14 @@ ad_attach(struct ata_softc *scp, int device)
if (bootverbose) {
printf("ad%d: <%.40s/%.8s> ATA-%d disk at ata%d-%s\n",
adp->lun, AD_PARAM->model, AD_PARAM->revision,
- ad_version(AD_PARAM->versmajor), device_get_unit(scp->dev),
+ ad_version(AD_PARAM->version_major), device_get_unit(scp->dev),
(adp->unit == ATA_MASTER) ? "master" : "slave");
- printf("ad%d: %luMB (%u sectors), %u cyls, %u heads, %u S/T, %u B/S\n",
- adp->lun, adp->total_secs / ((1024L * 1024L)/DEV_BSIZE),
- adp->total_secs,
- adp->total_secs / (adp->heads * adp->sectors),
+ printf("ad%d: %lluMB (%llu sectors), %llu cyls, %u heads, %u S/T, %u B/S\n",
+ adp->lun,
+ (unsigned long long)adp->total_secs / ((1024L*1024L)/DEV_BSIZE),
+ (unsigned long long)adp->total_secs,
+ (unsigned long long)adp->total_secs / (adp->heads*adp->sectors),
adp->heads, adp->sectors, DEV_BSIZE);
printf("ad%d: %d secs/int, %d depth queue, %s%s\n",
@@ -214,15 +221,17 @@ ad_attach(struct ata_softc *scp, int device)
printf("ad%d: piomode=%d dmamode=%d udmamode=%d cblid=%d\n",
adp->lun, ata_pmode(AD_PARAM), ata_wmode(AD_PARAM),
- ata_umode(AD_PARAM), AD_PARAM->cblid);
+ ata_umode(AD_PARAM), AD_PARAM->hwres_cblid);
}
/* if this disk belongs to an ATA RAID dont print the probe */
if (ar_probe(adp))
- printf("ad%d: %luMB <%.40s> [%d/%d/%d] at ata%d-%s %s%s\n",
- adp->lun, adp->total_secs / ((1024L * 1024L) / DEV_BSIZE),
- AD_PARAM->model, adp->total_secs / (adp->heads * adp->sectors),
+ printf("ad%d: %lluMB <%.40s> [%lld/%d/%d] at ata%d-%s %s%s\n",
+ adp->lun,
+ (unsigned long long)adp->total_secs / ((1024L*1024L)/DEV_BSIZE),
+ AD_PARAM->model,
+ (unsigned long long)adp->total_secs / (adp->heads*adp->sectors),
adp->heads, adp->sectors, device_get_unit(scp->dev),
(adp->unit == ATA_MASTER) ? "master" : "slave",
(adp->flags & AD_F_TAG_ENABLED) ? "tagged " : "",
@@ -404,14 +413,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_int16_t 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) {
@@ -422,7 +433,7 @@ 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;
@@ -430,16 +441,13 @@ ad_transfer(struct ad_request *request)
adp->lun, 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 */
@@ -460,9 +468,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)) {
printf("ad%d: error executing command", adp->lun);
goto transfer_failed;
}
@@ -474,16 +481,15 @@ ad_transfer(struct ad_request *request)
/* if ATA bus RELEASE check for SERVICE */
if (adp->flags & AD_F_TAG_ENABLED &&
- inb(adp->controller->ioaddr + ATA_IREASON) & ATA_I_RELEASE){
+ inb(adp->controller->ioaddr + 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)) {
printf("ad%d: error executing command", adp->lun);
goto transfer_failed;
}
@@ -518,8 +524,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)){
printf("ad%d: error executing command", adp->lun);
goto transfer_failed;
}
@@ -687,7 +692,7 @@ ad_interrupt(struct ad_request *request)
if (request->bp->b_flags & B_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))
printf("ad%d: flushing cache failed\n", adp->lun);
else
return ATA_OP_CONTINUES;
@@ -751,7 +756,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)) {
printf("ad%d: problem executing SERVICE cmd\n", adp->lun);
ad_invalidatequeue(adp, NULL);
return ATA_OP_FINISHED;
@@ -820,7 +825,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))
printf("ad%d: flushing queue failed\n", adp->lun);
adp->outstanding = 0;
}
@@ -842,7 +847,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;
@@ -904,7 +909,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_READY);
if (adp->controller->mode[ATA_DEV(adp->unit)] >= ATA_DMA)
ata_dmainit(adp->controller, adp->unit, ata_pmode(AD_PARAM),
diff --git a/sys/dev/ata/ata-disk.h b/sys/dev/ata/ata-disk.h
index 6fd8f194822c..bcd7051e1b9b 100644
--- a/sys/dev/ata/ata-disk.h
+++ b/sys/dev/ata/ata-disk.h
@@ -58,14 +58,14 @@ 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 */
int num_tags; /* number of tags supported */
int flags; /* drive flags */
#define AD_F_LABELLING 0x0001
-#define AD_F_LBA_ENABLED 0x0002
+#define AD_F_CHS_USED 0x0002
#define AD_F_32B_ENABLED 0x0004
#define AD_F_TAG_ENABLED 0x0008
diff --git a/sys/dev/ata/ata-dma.c b/sys/dev/ata/ata-dma.c
index 88d5a07bc8d0..47de465473e8 100644
--- a/sys/dev/ata/ata-dma.c
+++ b/sys/dev/ata/ata-dma.c
@@ -104,7 +104,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;
@@ -122,7 +122,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,
@@ -153,7 +153,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,
@@ -183,7 +183,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",
@@ -223,7 +223,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",
@@ -272,7 +272,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,
@@ -294,7 +294,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,
@@ -315,7 +315,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,
@@ -336,7 +336,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,
@@ -361,7 +361,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,
@@ -382,7 +382,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,
@@ -398,7 +398,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,
@@ -417,7 +417,7 @@ ata_dmainit(struct ata_softc *scp, int device,
ata_find_dev(parent, 0x82311106, 0) ||
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,
@@ -430,7 +430,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,
@@ -443,7 +443,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,
@@ -459,7 +459,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,
@@ -472,7 +472,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,
@@ -489,7 +489,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",
@@ -504,7 +504,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",
@@ -537,7 +537,7 @@ via_82c586:
int16_t val = pci_read_config(parent, reg, 2) & 0x0fff;
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, "%s setting UDMA5 on SiS chip\n",
@@ -549,7 +549,7 @@ via_82c586:
}
}
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, "%s setting UDMA4 on SiS chip\n",
@@ -561,7 +561,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 UDMA2 on SiS chip\n",
@@ -580,7 +580,7 @@ via_82c586:
int16_t val = pci_read_config(parent, reg, 2) & 0x0fff;
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, "%s setting UDMA4 on SiS chip\n",
@@ -592,7 +592,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 UDMA2 on SiS chip\n",
@@ -604,7 +604,7 @@ via_82c586:
}
}
} else 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, "%s setting UDMA2 on SiS chip\n",
@@ -616,7 +616,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 SiS chip\n",
@@ -634,7 +634,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",
@@ -654,7 +654,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",
@@ -671,7 +671,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",
@@ -693,7 +693,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",
@@ -711,7 +711,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,
@@ -729,7 +729,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",
@@ -741,7 +741,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",
@@ -752,22 +752,22 @@ 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) {
u_int16_t reg56;
- 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,
@@ -786,7 +786,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,
@@ -814,7 +814,7 @@ via_82c586:
case 0x4d69105a: /* Promise ATA133 controllers */
outb(rman_get_start(scp->r_bmio) + 0x01, 0x0b);
if (udmamode >= 4 && !(inb(rman_get_start(scp->r_bmio) + 0x03) & 0x04)){
- error = ata_command(scp, device, ATA_C_SETFEATURES, 0, 0, 0,
+ error = ata_command(scp, device, ATA_C_SETFEATURES, 0,
ATA_UDMA + udmamode, ATA_C_F_SETXFER,
ATA_WAIT_READY);
if (bootverbose)
@@ -827,7 +827,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",
@@ -838,7 +838,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",
@@ -854,7 +854,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, "%s setting UDMA5 on Promise chip\n",
@@ -870,7 +870,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, "%s setting UDMA4 on Promise chip\n",
@@ -885,7 +885,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, "%s setting UDMA2 on Promise chip\n",
@@ -897,7 +897,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, "%s setting WDMA2 on Promise chip\n",
@@ -908,22 +908,22 @@ 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/372 controllers */
if (!ATAPI_DEVICE(scp, device) &&
udmamode >= 6 && pci_get_revid(parent) >= 0x05 &&
!(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_UDMA6, ATA_C_F_SETXFER, ATA_WAIT_READY);
if (bootverbose)
ata_printf(scp, device, "%s setting UDMA5 on HighPoint chip\n",
@@ -937,7 +937,7 @@ via_82c586:
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, "%s setting UDMA5 on HighPoint chip\n",
@@ -950,7 +950,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, "%s setting UDMA4 on HighPoint chip\n",
@@ -962,7 +962,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, "%s setting UDMA2 on HighPoint chip\n",
@@ -974,7 +974,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, "%s setting WDMA2 on HighPoint chip\n",
@@ -985,15 +985,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 */
@@ -1014,7 +1014,7 @@ via_82c586:
/* well, we have no support for this, but try anyways */
if ((wdmamode >= 2 && apiomode >= 4) && scp->bmaddr) {
- 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,
@@ -1026,13 +1026,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 ccd11c04860d..8f9ed35cd831 100644
--- a/sys/dev/ata/ata-raid.c
+++ b/sys/dev/ata/ata-raid.c
@@ -80,10 +80,11 @@ MALLOC_DEFINE(M_AR, "AR driver", "ATA RAID driver");
/* defines */
#define PRINT_AD(adp) \
- printf(" ad%d: %luMB <%.40s> [%d/%d/%d] at ata%d-%s %s%s\n", \
- adp->lun, adp->total_secs / ((1024L * 1024L) / DEV_BSIZE), \
+ printf(" ad%d: %lluMB <%.40s> [%lld/%d/%d] at ata%d-%s %s%s\n", \
+ adp->lun, \
+ (unsigned long long)adp->total_secs / ((1024L*1024L)/DEV_BSIZE),\
adp->controller->dev_param[ATA_DEV(adp->unit)]->model, \
- adp->total_secs / (adp->heads * adp->sectors), \
+ (unsigned long long)adp->total_secs / (adp->heads*adp->sectors),\
adp->heads, adp->sectors, device_get_unit(adp->controller->dev),\
(adp->unit == ATA_MASTER) ? "master" : "slave", \
(adp->flags & AD_F_TAG_ENABLED) ? "tagged " : "", \
@@ -534,9 +535,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 22a9be72950a..868c1ca7c108 100644
--- a/sys/dev/ata/atapi-all.c
+++ b/sys/dev/ata/atapi-all.c
@@ -81,14 +81,14 @@ 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
@@ -96,7 +96,7 @@ atapi_attach(struct ata_softc *scp, int device)
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) {
#if NATAPICD > 0
case ATAPI_TYPE_CDROM:
if (acdattach(atp))
@@ -119,7 +119,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;
}
@@ -130,7 +130,7 @@ notfound:
void
atapi_detach(struct atapi_softc *atp)
{
- switch (ATP_PARAM->device_type) {
+ switch (ATP_PARAM->type) {
#if NATAPICD > 0
case ATAPI_TYPE_CDROM:
acddetach(atp);
@@ -169,7 +169,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;
@@ -221,7 +221,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) {
#if NATAPICD > 0
case ATAPI_TYPE_CDROM:
acd_start(atp);
@@ -297,7 +297,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 << 8), 0,
(request->flags & ATPR_F_DMA_USED) ? ATA_F_DMA : 0,
ATA_IMMEDIATE))
printf("%s: failure to send ATAPI packet command\n", atp->devname);
@@ -307,7 +307,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;
/* ready to write ATAPI command */
@@ -500,9 +500,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,