|
@@ -358,31 +358,6 @@ void ide_end_drive_cmd (ide_drive_t *drive, u8 stat, u8 err)
|
|
|
|
|
|
EXPORT_SYMBOL(ide_end_drive_cmd);
|
|
|
|
|
|
-/**
|
|
|
- * try_to_flush_leftover_data - flush junk
|
|
|
- * @drive: drive to flush
|
|
|
- *
|
|
|
- * try_to_flush_leftover_data() is invoked in response to a drive
|
|
|
- * unexpectedly having its DRQ_STAT bit set. As an alternative to
|
|
|
- * resetting the drive, this routine tries to clear the condition
|
|
|
- * by read a sector's worth of data from the drive. Of course,
|
|
|
- * this may not help if the drive is *waiting* for data from *us*.
|
|
|
- */
|
|
|
-static void try_to_flush_leftover_data (ide_drive_t *drive)
|
|
|
-{
|
|
|
- int i = (drive->mult_count ? drive->mult_count : 1) * SECTOR_WORDS;
|
|
|
-
|
|
|
- if (drive->media != ide_disk)
|
|
|
- return;
|
|
|
- while (i > 0) {
|
|
|
- u32 buffer[16];
|
|
|
- u32 wcount = (i > 16) ? 16 : i;
|
|
|
-
|
|
|
- i -= wcount;
|
|
|
- drive->hwif->input_data(drive, NULL, buffer, wcount * 4);
|
|
|
- }
|
|
|
-}
|
|
|
-
|
|
|
static void ide_kill_rq(ide_drive_t *drive, struct request *rq)
|
|
|
{
|
|
|
if (rq->rq_disk) {
|
|
@@ -422,8 +397,11 @@ static ide_startstop_t ide_ata_error(ide_drive_t *drive, struct request *rq, u8
|
|
|
}
|
|
|
|
|
|
if ((stat & DRQ_STAT) && rq_data_dir(rq) == READ &&
|
|
|
- (hwif->host_flags & IDE_HFLAG_ERROR_STOPS_FIFO) == 0)
|
|
|
- try_to_flush_leftover_data(drive);
|
|
|
+ (hwif->host_flags & IDE_HFLAG_ERROR_STOPS_FIFO) == 0) {
|
|
|
+ int nsect = drive->mult_count ? drive->mult_count : 1;
|
|
|
+
|
|
|
+ ide_pad_transfer(drive, READ, nsect * SECTOR_SIZE);
|
|
|
+ }
|
|
|
|
|
|
if (rq->errors >= ERROR_MAX || blk_noretry_request(rq)) {
|
|
|
ide_kill_rq(drive, rq);
|