diff options
| author | Søren Schmidt <sos@FreeBSD.org> | 2002-01-05 17:49:36 +0000 |
|---|---|---|
| committer | Søren Schmidt <sos@FreeBSD.org> | 2002-01-05 17:49:36 +0000 |
| commit | fe0591a3f862745327524e6e197d66aa90b53ab9 (patch) | |
| tree | 8371fbd44e4dbd383e3e3294abc0c791d7bc453b /sys/dev/ata | |
| parent | bee7916dbde7206b65927e273a87127abdeb684c (diff) | |
Notes
Diffstat (limited to 'sys/dev/ata')
| -rw-r--r-- | sys/dev/ata/ata-all.c | 152 | ||||
| -rw-r--r-- | sys/dev/ata/ata-all.h | 293 | ||||
| -rw-r--r-- | sys/dev/ata/ata-disk.c | 107 | ||||
| -rw-r--r-- | sys/dev/ata/ata-disk.h | 4 | ||||
| -rw-r--r-- | sys/dev/ata/ata-dma.c | 128 | ||||
| -rw-r--r-- | sys/dev/ata/ata-raid.c | 12 | ||||
| -rw-r--r-- | sys/dev/ata/atapi-all.c | 26 |
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, |
