aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/ide/ide-taskfile.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/ide/ide-taskfile.c')
-rw-r--r--drivers/ide/ide-taskfile.c18
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,
265static void ide_pio_datablock(ide_drive_t *drive, struct request *rq, 265static 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
432static ide_startstop_t pre_task_out_intr(ide_drive_t *drive, struct request *rq) 430static 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 }