diff options
Diffstat (limited to 'drivers/ide/ide-taskfile.c')
-rw-r--r-- | drivers/ide/ide-taskfile.c | 18 |
1 files changed, 8 insertions, 10 deletions
diff --git a/drivers/ide/ide-taskfile.c b/drivers/ide/ide-taskfile.c index 297cf6f4c723..7237e1547b1f 100644 --- a/drivers/ide/ide-taskfile.c +++ b/drivers/ide/ide-taskfile.c | |||
@@ -265,21 +265,18 @@ static void ide_pio_multi(ide_drive_t *drive, struct request *rq, | |||
265 | static void ide_pio_datablock(ide_drive_t *drive, struct request *rq, | 265 | static void ide_pio_datablock(ide_drive_t *drive, struct request *rq, |
266 | unsigned int write) | 266 | unsigned int write) |
267 | { | 267 | { |
268 | ide_task_t *task = &drive->hwif->task; | ||
268 | u8 saved_io_32bit = drive->io_32bit; | 269 | u8 saved_io_32bit = drive->io_32bit; |
269 | 270 | ||
270 | if (rq->bio) /* fs request */ | 271 | if (rq->bio) /* fs request */ |
271 | rq->errors = 0; | 272 | rq->errors = 0; |
272 | 273 | ||
273 | if (rq->cmd_type == REQ_TYPE_ATA_TASKFILE) { | 274 | if (task->tf_flags & IDE_TFLAG_IO_16BIT) |
274 | ide_task_t *task = rq->special; | 275 | drive->io_32bit = 0; |
275 | |||
276 | if (task->tf_flags & IDE_TFLAG_IO_16BIT) | ||
277 | drive->io_32bit = 0; | ||
278 | } | ||
279 | 276 | ||
280 | touch_softlockup_watchdog(); | 277 | touch_softlockup_watchdog(); |
281 | 278 | ||
282 | switch (drive->hwif->data_phase) { | 279 | switch (task->data_phase) { |
283 | case TASKFILE_MULTI_IN: | 280 | case TASKFILE_MULTI_IN: |
284 | case TASKFILE_MULTI_OUT: | 281 | case TASKFILE_MULTI_OUT: |
285 | ide_pio_multi(drive, rq, write); | 282 | ide_pio_multi(drive, rq, write); |
@@ -297,9 +294,10 @@ static ide_startstop_t task_error(ide_drive_t *drive, struct request *rq, | |||
297 | { | 294 | { |
298 | if (rq->bio) { | 295 | if (rq->bio) { |
299 | ide_hwif_t *hwif = drive->hwif; | 296 | ide_hwif_t *hwif = drive->hwif; |
297 | ide_task_t *task = &hwif->task; | ||
300 | int sectors = hwif->nsect - hwif->nleft; | 298 | int sectors = hwif->nsect - hwif->nleft; |
301 | 299 | ||
302 | switch (hwif->data_phase) { | 300 | switch (task->data_phase) { |
303 | case TASKFILE_IN: | 301 | case TASKFILE_IN: |
304 | if (hwif->nleft) | 302 | if (hwif->nleft) |
305 | break; | 303 | break; |
@@ -431,14 +429,14 @@ static ide_startstop_t task_out_intr (ide_drive_t *drive) | |||
431 | 429 | ||
432 | static ide_startstop_t pre_task_out_intr(ide_drive_t *drive, struct request *rq) | 430 | static ide_startstop_t pre_task_out_intr(ide_drive_t *drive, struct request *rq) |
433 | { | 431 | { |
434 | ide_hwif_t *hwif = drive->hwif; | 432 | ide_task_t *task = &drive->hwif->task; |
435 | ide_startstop_t startstop; | 433 | ide_startstop_t startstop; |
436 | 434 | ||
437 | if (ide_wait_stat(&startstop, drive, ATA_DRQ, | 435 | if (ide_wait_stat(&startstop, drive, ATA_DRQ, |
438 | drive->bad_wstat, WAIT_DRQ)) { | 436 | drive->bad_wstat, WAIT_DRQ)) { |
439 | printk(KERN_ERR "%s: no DRQ after issuing %sWRITE%s\n", | 437 | printk(KERN_ERR "%s: no DRQ after issuing %sWRITE%s\n", |
440 | drive->name, | 438 | drive->name, |
441 | hwif->data_phase == TASKFILE_MULTI_OUT ? "MULT" : "", | 439 | task->data_phase == TASKFILE_MULTI_OUT ? "MULT" : "", |
442 | (drive->dev_flags & IDE_DFLAG_LBA48) ? "_EXT" : ""); | 440 | (drive->dev_flags & IDE_DFLAG_LBA48) ? "_EXT" : ""); |
443 | return startstop; | 441 | return startstop; |
444 | } | 442 | } |