diff options
-rw-r--r-- | drivers/ide/ide-disk.c | 3 | ||||
-rw-r--r-- | drivers/ide/ide-io.c | 5 | ||||
-rw-r--r-- | drivers/ide/ide-park.c | 2 | ||||
-rw-r--r-- | drivers/ide/ide-taskfile.c | 18 | ||||
-rw-r--r-- | include/linux/ide.h | 3 |
5 files changed, 10 insertions, 21 deletions
diff --git a/drivers/ide/ide-disk.c b/drivers/ide/ide-disk.c index 806760d24cef..0f196e5fcff3 100644 --- a/drivers/ide/ide-disk.c +++ b/drivers/ide/ide-disk.c | |||
@@ -160,8 +160,6 @@ static ide_startstop_t __ide_do_rw_disk(ide_drive_t *drive, struct request *rq, | |||
160 | task.tf_flags |= IDE_TFLAG_WRITE; | 160 | task.tf_flags |= IDE_TFLAG_WRITE; |
161 | 161 | ||
162 | ide_tf_set_cmd(drive, &task, dma); | 162 | ide_tf_set_cmd(drive, &task, dma); |
163 | if (!dma) | ||
164 | hwif->data_phase = task.data_phase; | ||
165 | task.rq = rq; | 163 | task.rq = rq; |
166 | 164 | ||
167 | rc = do_rw_taskfile(drive, &task); | 165 | rc = do_rw_taskfile(drive, &task); |
@@ -170,7 +168,6 @@ static ide_startstop_t __ide_do_rw_disk(ide_drive_t *drive, struct request *rq, | |||
170 | /* fallback to PIO */ | 168 | /* fallback to PIO */ |
171 | task.tf_flags |= IDE_TFLAG_DMA_PIO_FALLBACK; | 169 | task.tf_flags |= IDE_TFLAG_DMA_PIO_FALLBACK; |
172 | ide_tf_set_cmd(drive, &task, 0); | 170 | ide_tf_set_cmd(drive, &task, 0); |
173 | hwif->data_phase = task.data_phase; | ||
174 | ide_init_sg_cmd(drive, rq); | 171 | ide_init_sg_cmd(drive, rq); |
175 | rc = do_rw_taskfile(drive, &task); | 172 | rc = do_rw_taskfile(drive, &task); |
176 | } | 173 | } |
diff --git a/drivers/ide/ide-io.c b/drivers/ide/ide-io.c index 45fc18ff73cb..38076169b893 100644 --- a/drivers/ide/ide-io.c +++ b/drivers/ide/ide-io.c | |||
@@ -310,13 +310,10 @@ EXPORT_SYMBOL_GPL(ide_init_sg_cmd); | |||
310 | static ide_startstop_t execute_drive_cmd (ide_drive_t *drive, | 310 | static ide_startstop_t execute_drive_cmd (ide_drive_t *drive, |
311 | struct request *rq) | 311 | struct request *rq) |
312 | { | 312 | { |
313 | ide_hwif_t *hwif = drive->hwif; | ||
314 | ide_task_t *task = rq->special; | 313 | ide_task_t *task = rq->special; |
315 | 314 | ||
316 | if (task) { | 315 | if (task) { |
317 | hwif->data_phase = task->data_phase; | 316 | switch (task->data_phase) { |
318 | |||
319 | switch (hwif->data_phase) { | ||
320 | case TASKFILE_MULTI_OUT: | 317 | case TASKFILE_MULTI_OUT: |
321 | case TASKFILE_OUT: | 318 | case TASKFILE_OUT: |
322 | case TASKFILE_MULTI_IN: | 319 | case TASKFILE_MULTI_IN: |
diff --git a/drivers/ide/ide-park.c b/drivers/ide/ide-park.c index f30e52152fcb..cddc7c778760 100644 --- a/drivers/ide/ide-park.c +++ b/drivers/ide/ide-park.c | |||
@@ -81,7 +81,7 @@ ide_startstop_t ide_do_park_unpark(ide_drive_t *drive, struct request *rq) | |||
81 | 81 | ||
82 | task.tf_flags |= IDE_TFLAG_TF | IDE_TFLAG_DEVICE; | 82 | task.tf_flags |= IDE_TFLAG_TF | IDE_TFLAG_DEVICE; |
83 | task.rq = rq; | 83 | task.rq = rq; |
84 | drive->hwif->data_phase = task.data_phase = TASKFILE_NO_DATA; | 84 | task.data_phase = TASKFILE_NO_DATA; |
85 | return do_rw_taskfile(drive, &task); | 85 | return do_rw_taskfile(drive, &task); |
86 | } | 86 | } |
87 | 87 | ||
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 | } |
diff --git a/include/linux/ide.h b/include/linux/ide.h index 83bed2f4378a..146b07a9b649 100644 --- a/include/linux/ide.h +++ b/include/linux/ide.h | |||
@@ -768,9 +768,6 @@ typedef struct hwif_s { | |||
768 | int orig_sg_nents; | 768 | int orig_sg_nents; |
769 | int sg_dma_direction; /* dma transfer direction */ | 769 | int sg_dma_direction; /* dma transfer direction */ |
770 | 770 | ||
771 | /* data phase of the active command (currently only valid for PIO/DMA) */ | ||
772 | int data_phase; | ||
773 | |||
774 | struct ide_task_s task; /* current command */ | 771 | struct ide_task_s task; /* current command */ |
775 | 772 | ||
776 | unsigned int nsect; | 773 | unsigned int nsect; |