ide: add struct ide_taskfile (take 2)

* Don't set write-only ide_task_t.hobRegister[6] and ide_task_t.hobRegister[7]
  in idedisk_set_max_address_ext().

* Add struct ide_taskfile and use it in ide_task_t instead of tfRegister[]
  and hobRegister[].

* Remove no longer needed IDE_CONTROL_OFFSET_HOB define.

* Add #ifndef/#endif __KERNEL__ around definitions of {task,hob}_struct_t.

While at it:

* Use ATA_LBA define for LBA bit (0x40) as suggested by Tejun Heo.

v2:
* Add missing newlines. (Noticed by Sergei)

* Use ~ATA_LBA instead of 0xBF. (Noticed by Sergei)

* Use unnamed unions for error/feature and status/command.
  (Suggested by Sergei).

There should be no functionality changes caused by this patch.
Acked-by: default avatarSergei Shtylyov <sshtylyov@ru.mvista.com>
Cc: Tejun Heo <htejun@gmail.com>
Signed-off-by: default avatarBartlomiej Zolnierkiewicz <bzolnier@gmail.com>
parent cd2a2d96
...@@ -388,13 +388,7 @@ static int taskfile_load_raw(ide_drive_t *drive, ...@@ -388,13 +388,7 @@ static int taskfile_load_raw(ide_drive_t *drive,
args.handler = &task_no_data_intr; args.handler = &task_no_data_intr;
/* convert gtf to IDE Taskfile */ /* convert gtf to IDE Taskfile */
args.tfRegister[1] = gtf->tfa[0]; /* 0x1f1 */ memcpy(&args.tf_array[7], &gtf->tfa, 7);
args.tfRegister[2] = gtf->tfa[1]; /* 0x1f2 */
args.tfRegister[3] = gtf->tfa[2]; /* 0x1f3 */
args.tfRegister[4] = gtf->tfa[3]; /* 0x1f4 */
args.tfRegister[5] = gtf->tfa[4]; /* 0x1f5 */
args.tfRegister[6] = gtf->tfa[5]; /* 0x1f6 */
args.tfRegister[7] = gtf->tfa[6]; /* 0x1f7 */
if (ide_noacpitfs) { if (ide_noacpitfs) {
DEBPRINT("_GTF execution disabled\n"); DEBPRINT("_GTF execution disabled\n");
......
...@@ -310,23 +310,22 @@ static ide_startstop_t ide_do_rw_disk (ide_drive_t *drive, struct request *rq, s ...@@ -310,23 +310,22 @@ static ide_startstop_t ide_do_rw_disk (ide_drive_t *drive, struct request *rq, s
static unsigned long idedisk_read_native_max_address(ide_drive_t *drive) static unsigned long idedisk_read_native_max_address(ide_drive_t *drive)
{ {
ide_task_t args; ide_task_t args;
struct ide_taskfile *tf = &args.tf;
unsigned long addr = 0; unsigned long addr = 0;
/* Create IDE/ATA command request structure */ /* Create IDE/ATA command request structure */
memset(&args, 0, sizeof(ide_task_t)); memset(&args, 0, sizeof(ide_task_t));
args.tfRegister[IDE_SELECT_OFFSET] = 0x40; tf->device = ATA_LBA;
args.tfRegister[IDE_COMMAND_OFFSET] = WIN_READ_NATIVE_MAX; tf->command = WIN_READ_NATIVE_MAX;
args.command_type = IDE_DRIVE_TASK_NO_DATA; args.command_type = IDE_DRIVE_TASK_NO_DATA;
args.handler = &task_no_data_intr; args.handler = &task_no_data_intr;
/* submit command request */ /* submit command request */
ide_raw_taskfile(drive, &args, NULL); ide_raw_taskfile(drive, &args, NULL);
/* if OK, compute maximum address value */ /* if OK, compute maximum address value */
if ((args.tfRegister[IDE_STATUS_OFFSET] & 0x01) == 0) { if ((tf->status & 0x01) == 0) {
addr = ((args.tfRegister[IDE_SELECT_OFFSET] & 0x0f) << 24) addr = ((tf->device & 0xf) << 24) |
| ((args.tfRegister[ IDE_HCYL_OFFSET] ) << 16) (tf->lbah << 16) | (tf->lbam << 8) | tf->lbal;
| ((args.tfRegister[ IDE_LCYL_OFFSET] ) << 8)
| ((args.tfRegister[IDE_SECTOR_OFFSET] ));
addr++; /* since the return value is (maxlba - 1), we add 1 */ addr++; /* since the return value is (maxlba - 1), we add 1 */
} }
return addr; return addr;
...@@ -335,26 +334,24 @@ static unsigned long idedisk_read_native_max_address(ide_drive_t *drive) ...@@ -335,26 +334,24 @@ static unsigned long idedisk_read_native_max_address(ide_drive_t *drive)
static unsigned long long idedisk_read_native_max_address_ext(ide_drive_t *drive) static unsigned long long idedisk_read_native_max_address_ext(ide_drive_t *drive)
{ {
ide_task_t args; ide_task_t args;
struct ide_taskfile *tf = &args.tf;
unsigned long long addr = 0; unsigned long long addr = 0;
/* Create IDE/ATA command request structure */ /* Create IDE/ATA command request structure */
memset(&args, 0, sizeof(ide_task_t)); memset(&args, 0, sizeof(ide_task_t));
tf->device = ATA_LBA;
args.tfRegister[IDE_SELECT_OFFSET] = 0x40; tf->command = WIN_READ_NATIVE_MAX_EXT;
args.tfRegister[IDE_COMMAND_OFFSET] = WIN_READ_NATIVE_MAX_EXT;
args.command_type = IDE_DRIVE_TASK_NO_DATA; args.command_type = IDE_DRIVE_TASK_NO_DATA;
args.handler = &task_no_data_intr; args.handler = &task_no_data_intr;
/* submit command request */ /* submit command request */
ide_raw_taskfile(drive, &args, NULL); ide_raw_taskfile(drive, &args, NULL);
/* if OK, compute maximum address value */ /* if OK, compute maximum address value */
if ((args.tfRegister[IDE_STATUS_OFFSET] & 0x01) == 0) { if ((tf->status & 0x01) == 0) {
u32 high = (args.hobRegister[IDE_HCYL_OFFSET] << 16) | u32 high, low;
(args.hobRegister[IDE_LCYL_OFFSET] << 8) |
args.hobRegister[IDE_SECTOR_OFFSET]; high = (tf->hob_lbah << 16) | (tf->hob_lbam << 8) | tf->hob_lbal;
u32 low = ((args.tfRegister[IDE_HCYL_OFFSET])<<16) | low = (tf->lbah << 16) | (tf->lbam << 8) | tf->lbal;
((args.tfRegister[IDE_LCYL_OFFSET])<<8) |
(args.tfRegister[IDE_SECTOR_OFFSET]);
addr = ((__u64)high << 24) | low; addr = ((__u64)high << 24) | low;
addr++; /* since the return value is (maxlba - 1), we add 1 */ addr++; /* since the return value is (maxlba - 1), we add 1 */
} }
...@@ -368,26 +365,25 @@ static unsigned long long idedisk_read_native_max_address_ext(ide_drive_t *drive ...@@ -368,26 +365,25 @@ static unsigned long long idedisk_read_native_max_address_ext(ide_drive_t *drive
static unsigned long idedisk_set_max_address(ide_drive_t *drive, unsigned long addr_req) static unsigned long idedisk_set_max_address(ide_drive_t *drive, unsigned long addr_req)
{ {
ide_task_t args; ide_task_t args;
struct ide_taskfile *tf = &args.tf;
unsigned long addr_set = 0; unsigned long addr_set = 0;
addr_req--; addr_req--;
/* Create IDE/ATA command request structure */ /* Create IDE/ATA command request structure */
memset(&args, 0, sizeof(ide_task_t)); memset(&args, 0, sizeof(ide_task_t));
args.tfRegister[IDE_SECTOR_OFFSET] = ((addr_req >> 0) & 0xff); tf->lbal = (addr_req >> 0) & 0xff;
args.tfRegister[IDE_LCYL_OFFSET] = ((addr_req >> 8) & 0xff); tf->lbam = (addr_req >> 8) & 0xff;
args.tfRegister[IDE_HCYL_OFFSET] = ((addr_req >> 16) & 0xff); tf->lbah = (addr_req >> 16) & 0xff;
args.tfRegister[IDE_SELECT_OFFSET] = ((addr_req >> 24) & 0x0f) | 0x40; tf->device = ((addr_req >> 24) & 0x0f) | ATA_LBA;
args.tfRegister[IDE_COMMAND_OFFSET] = WIN_SET_MAX; tf->command = WIN_SET_MAX;
args.command_type = IDE_DRIVE_TASK_NO_DATA; args.command_type = IDE_DRIVE_TASK_NO_DATA;
args.handler = &task_no_data_intr; args.handler = &task_no_data_intr;
/* submit command request */ /* submit command request */
ide_raw_taskfile(drive, &args, NULL); ide_raw_taskfile(drive, &args, NULL);
/* if OK, read new maximum address value */ /* if OK, read new maximum address value */
if ((args.tfRegister[IDE_STATUS_OFFSET] & 0x01) == 0) { if ((tf->status & 0x01) == 0) {
addr_set = ((args.tfRegister[IDE_SELECT_OFFSET] & 0x0f) << 24) addr_set = ((tf->device & 0xf) << 24) |
| ((args.tfRegister[ IDE_HCYL_OFFSET] ) << 16) (tf->lbah << 16) | (tf->lbam << 8) | tf->lbal;
| ((args.tfRegister[ IDE_LCYL_OFFSET] ) << 8)
| ((args.tfRegister[IDE_SECTOR_OFFSET] ));
addr_set++; addr_set++;
} }
return addr_set; return addr_set;
...@@ -396,33 +392,30 @@ static unsigned long idedisk_set_max_address(ide_drive_t *drive, unsigned long a ...@@ -396,33 +392,30 @@ static unsigned long idedisk_set_max_address(ide_drive_t *drive, unsigned long a
static unsigned long long idedisk_set_max_address_ext(ide_drive_t *drive, unsigned long long addr_req) static unsigned long long idedisk_set_max_address_ext(ide_drive_t *drive, unsigned long long addr_req)
{ {
ide_task_t args; ide_task_t args;
struct ide_taskfile *tf = &args.tf;
unsigned long long addr_set = 0; unsigned long long addr_set = 0;
addr_req--; addr_req--;
/* Create IDE/ATA command request structure */ /* Create IDE/ATA command request structure */
memset(&args, 0, sizeof(ide_task_t)); memset(&args, 0, sizeof(ide_task_t));
args.tfRegister[IDE_SECTOR_OFFSET] = ((addr_req >> 0) & 0xff); tf->lbal = (addr_req >> 0) & 0xff;
args.tfRegister[IDE_LCYL_OFFSET] = ((addr_req >>= 8) & 0xff); tf->lbam = (addr_req >>= 8) & 0xff;
args.tfRegister[IDE_HCYL_OFFSET] = ((addr_req >>= 8) & 0xff); tf->lbah = (addr_req >>= 8) & 0xff;
args.tfRegister[IDE_SELECT_OFFSET] = 0x40; tf->device = ATA_LBA;
args.tfRegister[IDE_COMMAND_OFFSET] = WIN_SET_MAX_EXT; tf->command = WIN_SET_MAX_EXT;
args.hobRegister[IDE_SECTOR_OFFSET] = (addr_req >>= 8) & 0xff; tf->hob_lbal = (addr_req >>= 8) & 0xff;
args.hobRegister[IDE_LCYL_OFFSET] = (addr_req >>= 8) & 0xff; tf->hob_lbam = (addr_req >>= 8) & 0xff;
args.hobRegister[IDE_HCYL_OFFSET] = (addr_req >>= 8) & 0xff; tf->hob_lbah = (addr_req >>= 8) & 0xff;
args.hobRegister[IDE_SELECT_OFFSET] = 0x40;
args.hobRegister[IDE_CONTROL_OFFSET_HOB]= (drive->ctl|0x80);
args.command_type = IDE_DRIVE_TASK_NO_DATA; args.command_type = IDE_DRIVE_TASK_NO_DATA;
args.handler = &task_no_data_intr; args.handler = &task_no_data_intr;
/* submit command request */ /* submit command request */
ide_raw_taskfile(drive, &args, NULL); ide_raw_taskfile(drive, &args, NULL);
/* if OK, compute maximum address value */ /* if OK, compute maximum address value */
if ((args.tfRegister[IDE_STATUS_OFFSET] & 0x01) == 0) { if ((tf->status & 0x01) == 0) {
u32 high = (args.hobRegister[IDE_HCYL_OFFSET] << 16) | u32 high, low;
(args.hobRegister[IDE_LCYL_OFFSET] << 8) |
args.hobRegister[IDE_SECTOR_OFFSET]; high = (tf->hob_lbah << 16) | (tf->hob_lbam << 8) | tf->hob_lbal;
u32 low = ((args.tfRegister[IDE_HCYL_OFFSET])<<16) | low = (tf->lbah << 16) | (tf->lbam << 8) | tf->lbal;
((args.tfRegister[IDE_LCYL_OFFSET])<<8) |
(args.tfRegister[IDE_SECTOR_OFFSET]);
addr_set = ((__u64)high << 24) | low; addr_set = ((__u64)high << 24) | low;
addr_set++; addr_set++;
} }
...@@ -556,12 +549,13 @@ static sector_t idedisk_capacity (ide_drive_t *drive) ...@@ -556,12 +549,13 @@ static sector_t idedisk_capacity (ide_drive_t *drive)
static int smart_enable(ide_drive_t *drive) static int smart_enable(ide_drive_t *drive)
{ {
ide_task_t args; ide_task_t args;
struct ide_taskfile *tf = &args.tf;
memset(&args, 0, sizeof(ide_task_t)); memset(&args, 0, sizeof(ide_task_t));
args.tfRegister[IDE_FEATURE_OFFSET] = SMART_ENABLE; tf->feature = SMART_ENABLE;
args.tfRegister[IDE_LCYL_OFFSET] = SMART_LCYL_PASS; tf->lbam = SMART_LCYL_PASS;
args.tfRegister[IDE_HCYL_OFFSET] = SMART_HCYL_PASS; tf->lbah = SMART_HCYL_PASS;
args.tfRegister[IDE_COMMAND_OFFSET] = WIN_SMART; tf->command = WIN_SMART;
args.command_type = IDE_DRIVE_TASK_NO_DATA; args.command_type = IDE_DRIVE_TASK_NO_DATA;
args.handler = &task_no_data_intr; args.handler = &task_no_data_intr;
return ide_raw_taskfile(drive, &args, NULL); return ide_raw_taskfile(drive, &args, NULL);
...@@ -570,13 +564,14 @@ static int smart_enable(ide_drive_t *drive) ...@@ -570,13 +564,14 @@ static int smart_enable(ide_drive_t *drive)
static int get_smart_data(ide_drive_t *drive, u8 *buf, u8 sub_cmd) static int get_smart_data(ide_drive_t *drive, u8 *buf, u8 sub_cmd)
{ {
ide_task_t args; ide_task_t args;
struct ide_taskfile *tf = &args.tf;
memset(&args, 0, sizeof(ide_task_t)); memset(&args, 0, sizeof(ide_task_t));
args.tfRegister[IDE_FEATURE_OFFSET] = sub_cmd; tf->feature = sub_cmd;
args.tfRegister[IDE_NSECTOR_OFFSET] = 0x01; tf->nsect = 0x01;
args.tfRegister[IDE_LCYL_OFFSET] = SMART_LCYL_PASS; tf->lbam = SMART_LCYL_PASS;
args.tfRegister[IDE_HCYL_OFFSET] = SMART_HCYL_PASS; tf->lbah = SMART_HCYL_PASS;
args.tfRegister[IDE_COMMAND_OFFSET] = WIN_SMART; tf->command = WIN_SMART;
args.command_type = IDE_DRIVE_TASK_IN; args.command_type = IDE_DRIVE_TASK_IN;
args.data_phase = TASKFILE_IN; args.data_phase = TASKFILE_IN;
args.handler = &task_in_intr; args.handler = &task_in_intr;
...@@ -753,9 +748,9 @@ static int write_cache(ide_drive_t *drive, int arg) ...@@ -753,9 +748,9 @@ static int write_cache(ide_drive_t *drive, int arg)
if (ide_id_has_flush_cache(drive->id)) { if (ide_id_has_flush_cache(drive->id)) {
memset(&args, 0, sizeof(ide_task_t)); memset(&args, 0, sizeof(ide_task_t));
args.tfRegister[IDE_FEATURE_OFFSET] = (arg) ? args.tf.feature = arg ?
SETFEATURES_EN_WCACHE : SETFEATURES_DIS_WCACHE; SETFEATURES_EN_WCACHE : SETFEATURES_DIS_WCACHE;
args.tfRegister[IDE_COMMAND_OFFSET] = WIN_SETFEATURES; args.tf.command = WIN_SETFEATURES;
args.command_type = IDE_DRIVE_TASK_NO_DATA; args.command_type = IDE_DRIVE_TASK_NO_DATA;
args.handler = &task_no_data_intr; args.handler = &task_no_data_intr;
err = ide_raw_taskfile(drive, &args, NULL); err = ide_raw_taskfile(drive, &args, NULL);
...@@ -774,9 +769,9 @@ static int do_idedisk_flushcache (ide_drive_t *drive) ...@@ -774,9 +769,9 @@ static int do_idedisk_flushcache (ide_drive_t *drive)
memset(&args, 0, sizeof(ide_task_t)); memset(&args, 0, sizeof(ide_task_t));
if (ide_id_has_flush_cache_ext(drive->id)) if (ide_id_has_flush_cache_ext(drive->id))
args.tfRegister[IDE_COMMAND_OFFSET] = WIN_FLUSH_CACHE_EXT; args.tf.command = WIN_FLUSH_CACHE_EXT;
else else
args.tfRegister[IDE_COMMAND_OFFSET] = WIN_FLUSH_CACHE; args.tf.command = WIN_FLUSH_CACHE;
args.command_type = IDE_DRIVE_TASK_NO_DATA; args.command_type = IDE_DRIVE_TASK_NO_DATA;
args.handler = &task_no_data_intr; args.handler = &task_no_data_intr;
return ide_raw_taskfile(drive, &args, NULL); return ide_raw_taskfile(drive, &args, NULL);
...@@ -790,10 +785,9 @@ static int set_acoustic (ide_drive_t *drive, int arg) ...@@ -790,10 +785,9 @@ static int set_acoustic (ide_drive_t *drive, int arg)
return -EINVAL; return -EINVAL;
memset(&args, 0, sizeof(ide_task_t)); memset(&args, 0, sizeof(ide_task_t));
args.tfRegister[IDE_FEATURE_OFFSET] = (arg) ? SETFEATURES_EN_AAM : args.tf.feature = arg ? SETFEATURES_EN_AAM : SETFEATURES_DIS_AAM;
SETFEATURES_DIS_AAM; args.tf.nsect = arg;
args.tfRegister[IDE_NSECTOR_OFFSET] = arg; args.tf.command = WIN_SETFEATURES;
args.tfRegister[IDE_COMMAND_OFFSET] = WIN_SETFEATURES;
args.command_type = IDE_DRIVE_TASK_NO_DATA; args.command_type = IDE_DRIVE_TASK_NO_DATA;
args.handler = &task_no_data_intr; args.handler = &task_no_data_intr;
ide_raw_taskfile(drive, &args, NULL); ide_raw_taskfile(drive, &args, NULL);
...@@ -1057,7 +1051,7 @@ static int idedisk_open(struct inode *inode, struct file *filp) ...@@ -1057,7 +1051,7 @@ static int idedisk_open(struct inode *inode, struct file *filp)
if (drive->removable && idkp->openers == 1) { if (drive->removable && idkp->openers == 1) {
ide_task_t args; ide_task_t args;
memset(&args, 0, sizeof(ide_task_t)); memset(&args, 0, sizeof(ide_task_t));
args.tfRegister[IDE_COMMAND_OFFSET] = WIN_DOORLOCK; args.tf.command = WIN_DOORLOCK;
args.command_type = IDE_DRIVE_TASK_NO_DATA; args.command_type = IDE_DRIVE_TASK_NO_DATA;
args.handler = &task_no_data_intr; args.handler = &task_no_data_intr;
check_disk_change(inode->i_bdev); check_disk_change(inode->i_bdev);
...@@ -1084,7 +1078,7 @@ static int idedisk_release(struct inode *inode, struct file *filp) ...@@ -1084,7 +1078,7 @@ static int idedisk_release(struct inode *inode, struct file *filp)
if (drive->removable && idkp->openers == 1) { if (drive->removable && idkp->openers == 1) {
ide_task_t args; ide_task_t args;
memset(&args, 0, sizeof(ide_task_t)); memset(&args, 0, sizeof(ide_task_t));
args.tfRegister[IDE_COMMAND_OFFSET] = WIN_DOORUNLOCK; args.tf.command = WIN_DOORUNLOCK;
args.command_type = IDE_DRIVE_TASK_NO_DATA; args.command_type = IDE_DRIVE_TASK_NO_DATA;
args.handler = &task_no_data_intr; args.handler = &task_no_data_intr;
if (drive->doorlocking && ide_raw_taskfile(drive, &args, NULL)) if (drive->doorlocking && ide_raw_taskfile(drive, &args, NULL))
......
...@@ -189,15 +189,15 @@ static ide_startstop_t ide_start_power_step(ide_drive_t *drive, struct request * ...@@ -189,15 +189,15 @@ static ide_startstop_t ide_start_power_step(ide_drive_t *drive, struct request *
return ide_stopped; return ide_stopped;
} }
if (ide_id_has_flush_cache_ext(drive->id)) if (ide_id_has_flush_cache_ext(drive->id))
args->tfRegister[IDE_COMMAND_OFFSET] = WIN_FLUSH_CACHE_EXT; args->tf.command = WIN_FLUSH_CACHE_EXT;
else else
args->tfRegister[IDE_COMMAND_OFFSET] = WIN_FLUSH_CACHE; args->tf.command = WIN_FLUSH_CACHE;
args->command_type = IDE_DRIVE_TASK_NO_DATA; args->command_type = IDE_DRIVE_TASK_NO_DATA;
args->handler = &task_no_data_intr; args->handler = &task_no_data_intr;
return do_rw_taskfile(drive, args); return do_rw_taskfile(drive, args);
case idedisk_pm_standby: /* Suspend step 2 (standby) */ case idedisk_pm_standby: /* Suspend step 2 (standby) */
args->tfRegister[IDE_COMMAND_OFFSET] = WIN_STANDBYNOW1; args->tf.command = WIN_STANDBYNOW1;
args->command_type = IDE_DRIVE_TASK_NO_DATA; args->command_type = IDE_DRIVE_TASK_NO_DATA;
args->handler = &task_no_data_intr; args->handler = &task_no_data_intr;
return do_rw_taskfile(drive, args); return do_rw_taskfile(drive, args);
...@@ -214,7 +214,7 @@ static ide_startstop_t ide_start_power_step(ide_drive_t *drive, struct request * ...@@ -214,7 +214,7 @@ static ide_startstop_t ide_start_power_step(ide_drive_t *drive, struct request *
return ide_stopped; return ide_stopped;
case idedisk_pm_idle: /* Resume step 2 (idle) */ case idedisk_pm_idle: /* Resume step 2 (idle) */
args->tfRegister[IDE_COMMAND_OFFSET] = WIN_IDLEIMMEDIATE; args->tf.command = WIN_IDLEIMMEDIATE;
args->command_type = IDE_DRIVE_TASK_NO_DATA; args->command_type = IDE_DRIVE_TASK_NO_DATA;
args->handler = task_no_data_intr; args->handler = task_no_data_intr;
return do_rw_taskfile(drive, args); return do_rw_taskfile(drive, args);
...@@ -354,28 +354,31 @@ void ide_end_drive_cmd (ide_drive_t *drive, u8 stat, u8 err) ...@@ -354,28 +354,31 @@ void ide_end_drive_cmd (ide_drive_t *drive, u8 stat, u8 err)
rq->errors = !OK_STAT(stat,READY_STAT,BAD_STAT); rq->errors = !OK_STAT(stat,READY_STAT,BAD_STAT);
if (args) { if (args) {
struct ide_taskfile *tf = &args->tf;
if (args->tf_in_flags.b.data) { if (args->tf_in_flags.b.data) {
u16 data = hwif->INW(IDE_DATA_REG); u16 data = hwif->INW(IDE_DATA_REG);
args->tfRegister[IDE_DATA_OFFSET] = (data) & 0xFF;
args->hobRegister[IDE_DATA_OFFSET] = (data >> 8) & 0xFF; tf->data = data & 0xff;
tf->hob_data = (data >> 8) & 0xff;
} }
args->tfRegister[IDE_ERROR_OFFSET] = err; tf->error = err;
/* be sure we're looking at the low order bits */ /* be sure we're looking at the low order bits */
hwif->OUTB(drive->ctl & ~0x80, IDE_CONTROL_REG); hwif->OUTB(drive->ctl & ~0x80, IDE_CONTROL_REG);
args->tfRegister[IDE_NSECTOR_OFFSET] = hwif->INB(IDE_NSECTOR_REG); tf->nsect = hwif->INB(IDE_NSECTOR_REG);
args->tfRegister[IDE_SECTOR_OFFSET] = hwif->INB(IDE_SECTOR_REG); tf->lbal = hwif->INB(IDE_SECTOR_REG);
args->tfRegister[IDE_LCYL_OFFSET] = hwif->INB(IDE_LCYL_REG); tf->lbam = hwif->INB(IDE_LCYL_REG);
args->tfRegister[IDE_HCYL_OFFSET] = hwif->INB(IDE_HCYL_REG); tf->lbah = hwif->INB(IDE_HCYL_REG);
args->tfRegister[IDE_SELECT_OFFSET] = hwif->INB(IDE_SELECT_REG); tf->device = hwif->INB(IDE_SELECT_REG);
args->tfRegister[IDE_STATUS_OFFSET] = stat; tf->status = stat;
if (drive->addressing == 1) { if (drive->addressing == 1) {
hwif->OUTB(drive->ctl|0x80, IDE_CONTROL_REG); hwif->OUTB(drive->ctl|0x80, IDE_CONTROL_REG);
args->hobRegister[IDE_FEATURE_OFFSET] = hwif->INB(IDE_FEATURE_REG); tf->hob_feature = hwif->INB(IDE_FEATURE_REG);
args->hobRegister[IDE_NSECTOR_OFFSET] = hwif->INB(IDE_NSECTOR_REG); tf->hob_nsect = hwif->INB(IDE_NSECTOR_REG);
args->hobRegister[IDE_SECTOR_OFFSET] = hwif->INB(IDE_SECTOR_REG); tf->hob_lbal = hwif->INB(IDE_SECTOR_REG);
args->hobRegister[IDE_LCYL_OFFSET] = hwif->INB(IDE_LCYL_REG); tf->hob_lbam = hwif->INB(IDE_LCYL_REG);
args->hobRegister[IDE_HCYL_OFFSET] = hwif->INB(IDE_HCYL_REG); tf->hob_lbah = hwif->INB(IDE_HCYL_REG);
} }
} }
} else if (blk_pm_request(rq)) { } else if (blk_pm_request(rq)) {
...@@ -675,28 +678,28 @@ static ide_startstop_t drive_cmd_intr (ide_drive_t *drive) ...@@ -675,28 +678,28 @@ static ide_startstop_t drive_cmd_intr (ide_drive_t *drive)
static void ide_init_specify_cmd(ide_drive_t *drive, ide_task_t *task) static void ide_init_specify_cmd(ide_drive_t *drive, ide_task_t *task)
{ {
task->tfRegister[IDE_NSECTOR_OFFSET] = drive->sect; task->tf.nsect = drive->sect;
task->tfRegister[IDE_SECTOR_OFFSET] = drive->sect; task->tf.lbal = drive->sect;
task->tfRegister[IDE_LCYL_OFFSET] = drive->cyl; task->tf.lbam = drive->cyl;
task->tfRegister[IDE_HCYL_OFFSET] = drive->cyl>>8; task->tf.lbah = drive->cyl >> 8;
task->tfRegister[IDE_SELECT_OFFSET] = ((drive->head-1)|drive->select.all)&0xBF; task->tf.device = ((drive->head - 1) | drive->select.all) & ~ATA_LBA;
task->tfRegister[IDE_COMMAND_OFFSET] = WIN_SPECIFY; task->tf.command = WIN_SPECIFY;
task->handler = &set_geometry_intr; task->handler = &set_geometry_intr;
} }
static void ide_init_restore_cmd(ide_drive_t *drive, ide_task_t *task) static void ide_init_restore_cmd(ide_drive_t *drive, ide_task_t *task)
{ {
task->tfRegister[IDE_NSECTOR_OFFSET] = drive->sect; task->tf.nsect = drive->sect;
task->tfRegister[IDE_COMMAND_OFFSET] = WIN_RESTORE; task->tf.command = WIN_RESTORE;
task->handler = &recal_intr; task->handler = &recal_intr;
} }
static void ide_init_setmult_cmd(ide_drive_t *drive, ide_task_t *task) static void ide_init_setmult_cmd(ide_drive_t *drive, ide_task_t *task)
{ {
task->tfRegister[IDE_NSECTOR_OFFSET] = drive->mult_req; task->tf.nsect = drive->mult_req;
task->tfRegister[IDE_COMMAND_OFFSET] = WIN_SETMULT; task->tf.command = WIN_SETMULT;
task->handler = &set_multmode_intr; task->handler = &set_multmode_intr;
} }
......
...@@ -642,9 +642,9 @@ no_80w: ...@@ -642,9 +642,9 @@ no_80w:
int ide_ata66_check (ide_drive_t *drive, ide_task_t *args) int ide_ata66_check (ide_drive_t *drive, ide_task_t *args)
{ {
if ((args->tfRegister[IDE_COMMAND_OFFSET] == WIN_SETFEATURES) && if (args->tf.command == WIN_SETFEATURES &&
(args->tfRegister[IDE_SECTOR_OFFSET] > XFER_UDMA_2) && args->tf.lbal > XFER_UDMA_2 &&
(args->tfRegister[IDE_FEATURE_OFFSET] == SETFEATURES_XFER)) { args->tf.feature == SETFEATURES_XFER) {
if (eighty_ninty_three(drive) == 0) { if (eighty_ninty_three(drive) == 0) {
printk(KERN_WARNING "%s: UDMA speeds >UDMA33 cannot " printk(KERN_WARNING "%s: UDMA speeds >UDMA33 cannot "
"be set\n", drive->name); "be set\n", drive->name);
...@@ -662,9 +662,9 @@ int ide_ata66_check (ide_drive_t *drive, ide_task_t *args) ...@@ -662,9 +662,9 @@ int ide_ata66_check (ide_drive_t *drive, ide_task_t *args)
*/ */
int set_transfer (ide_drive_t *drive, ide_task_t *args) int set_transfer (ide_drive_t *drive, ide_task_t *args)
{ {
if ((args->tfRegister[IDE_COMMAND_OFFSET] == WIN_SETFEATURES) && if (args->tf.command == WIN_SETFEATURES &&
(args->tfRegister[IDE_SECTOR_OFFSET] >= XFER_SW_DMA_0) && args->tf.lbal >= XFER_SW_DMA_0 &&
(args->tfRegister[IDE_FEATURE_OFFSET] == SETFEATURES_XFER) && args->tf.feature == SETFEATURES_XFER &&
(drive->id->dma_ultra || (drive->id->dma_ultra ||
drive->id->dma_mword || drive->id->dma_mword ||
drive->id->dma_1word)) drive->id->dma_1word))
......
...@@ -468,8 +468,7 @@ static void ide_dump_opcode(ide_drive_t *drive) ...@@ -468,8 +468,7 @@ static void ide_dump_opcode(ide_drive_t *drive)
} else if (rq->cmd_type == REQ_TYPE_ATA_TASKFILE) { } else if (rq->cmd_type == REQ_TYPE_ATA_TASKFILE) {
ide_task_t *args = rq->special; ide_task_t *args = rq->special;
if (args) { if (args) {
task_struct_t *tf = (task_struct_t *) args->tfRegister; opcode = args->tf.command;
opcode = tf->command;
found = 1; found = 1;
} }
} }
......
...@@ -66,12 +66,13 @@ static void taskfile_output_data(ide_drive_t *drive, void *buffer, u32 wcount) ...@@ -66,12 +66,13 @@ static void taskfile_output_data(ide_drive_t *drive, void *buffer, u32 wcount)
int taskfile_lib_get_identify (ide_drive_t *drive, u8 *buf) int taskfile_lib_get_identify (ide_drive_t *drive, u8 *buf)
{ {
ide_task_t args; ide_task_t args;
memset(&args, 0, sizeof(ide_task_t)); memset(&args, 0, sizeof(ide_task_t));
args.tfRegister[IDE_NSECTOR_OFFSET] = 0x01; args.tf.nsect = 0x01;
if (drive->media == ide_disk) if (drive->media == ide_disk)
args.tfRegister[IDE_COMMAND_OFFSET] = WIN_IDENTIFY; args.tf.command = WIN_IDENTIFY;
else else
args.tfRegister[IDE_COMMAND_OFFSET] = WIN_PIDENTIFY; args.tf.command = WIN_PIDENTIFY;
args.command_type = IDE_DRIVE_TASK_IN; args.command_type = IDE_DRIVE_TASK_IN;
args.data_phase = TASKFILE_IN; args.data_phase = TASKFILE_IN;
args.handler = &task_in_intr; args.handler = &task_in_intr;
...@@ -81,8 +82,7 @@ int taskfile_lib_get_identify (ide_drive_t *drive, u8 *buf) ...@@ -81,8 +82,7 @@ int taskfile_lib_get_identify (ide_drive_t *drive, u8 *buf)
ide_startstop_t do_rw_taskfile (ide_drive_t *drive, ide_task_t *task) ide_startstop_t do_rw_taskfile (ide_drive_t *drive, ide_task_t *task)
{ {
ide_hwif_t *hwif = HWIF(drive); ide_hwif_t *hwif = HWIF(drive);
task_struct_t *taskfile = (task_struct_t *) task->tfRegister; struct ide_taskfile *tf = &task->tf;
hob_struct_t *hobfile = (hob_struct_t *) task->hobRegister;
u8 HIHI = (drive->addressing == 1) ? 0xE0 : 0xEF; u8 HIHI = (drive->addressing == 1) ? 0xE0 : 0xEF;
/* ALL Command Block Executions SHALL clear nIEN, unless otherwise */ /* ALL Command Block Executions SHALL clear nIEN, unless otherwise */
...@@ -93,35 +93,35 @@ ide_startstop_t do_rw_taskfile (ide_drive_t *drive, ide_task_t *task) ...@@ -93,35 +93,35 @@ ide_startstop_t do_rw_taskfile (ide_drive_t *drive, ide_task_t *task)
SELECT_MASK(drive, 0); SELECT_MASK(drive, 0);
if (drive->addressing == 1) {