aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/ide/ide-floppy.c7
-rw-r--r--drivers/ide/ide-io.c15
-rw-r--r--drivers/ide/ide-tape.c4
-rw-r--r--drivers/scsi/ide-scsi.c6
-rw-r--r--include/linux/ide.h25
5 files changed, 24 insertions, 33 deletions
diff --git a/drivers/ide/ide-floppy.c b/drivers/ide/ide-floppy.c
index 0039789b0eb9..f05fbc2bd7a8 100644
--- a/drivers/ide/ide-floppy.c
+++ b/drivers/ide/ide-floppy.c
@@ -262,10 +262,7 @@ static void ide_floppy_io_buffers(ide_drive_t *drive, struct ide_atapi_pc *pc,
262 if (bcount) { 262 if (bcount) {
263 printk(KERN_ERR "%s: leftover data in %s, bcount == %d\n", 263 printk(KERN_ERR "%s: leftover data in %s, bcount == %d\n",
264 drive->name, __func__, bcount); 264 drive->name, __func__, bcount);
265 if (direction) 265 ide_pad_transfer(drive, direction, bcount);
266 ide_atapi_write_zeros(drive, bcount);
267 else
268 ide_atapi_discard_data(drive, bcount);
269 } 266 }
270} 267}
271 268
@@ -491,7 +488,7 @@ static ide_startstop_t idefloppy_pc_intr(ide_drive_t *drive)
491 printk(KERN_ERR "ide-floppy: The floppy wants " 488 printk(KERN_ERR "ide-floppy: The floppy wants "
492 "to send us more data than expected " 489 "to send us more data than expected "
493 "- discarding data\n"); 490 "- discarding data\n");
494 ide_atapi_discard_data(drive, bcount); 491 ide_pad_transfer(drive, 0, bcount);
495 492
496 ide_set_handler(drive, 493 ide_set_handler(drive,
497 &idefloppy_pc_intr, 494 &idefloppy_pc_intr,
diff --git a/drivers/ide/ide-io.c b/drivers/ide/ide-io.c
index 8d7c1a09e1e7..788783da9025 100644
--- a/drivers/ide/ide-io.c
+++ b/drivers/ide/ide-io.c
@@ -1642,3 +1642,18 @@ void ide_pktcmd_tf_load(ide_drive_t *drive, u32 tf_flags, u16 bcount, u8 dma)
1642} 1642}
1643 1643
1644EXPORT_SYMBOL_GPL(ide_pktcmd_tf_load); 1644EXPORT_SYMBOL_GPL(ide_pktcmd_tf_load);
1645
1646void ide_pad_transfer(ide_drive_t *drive, int write, int len)
1647{
1648 ide_hwif_t *hwif = drive->hwif;
1649 u8 buf[4] = { 0 };
1650
1651 while (len > 0) {
1652 if (write)
1653 hwif->output_data(drive, NULL, buf, min(4, len));
1654 else
1655 hwif->input_data(drive, NULL, buf, min(4, len));
1656 len -= 4;
1657 }
1658}
1659EXPORT_SYMBOL_GPL(ide_pad_transfer);
diff --git a/drivers/ide/ide-tape.c b/drivers/ide/ide-tape.c
index 71d07d740add..54a43b044608 100644
--- a/drivers/ide/ide-tape.c
+++ b/drivers/ide/ide-tape.c
@@ -395,7 +395,7 @@ static void idetape_input_buffers(ide_drive_t *drive, struct ide_atapi_pc *pc,
395 if (bh == NULL) { 395 if (bh == NULL) {
396 printk(KERN_ERR "ide-tape: bh == NULL in " 396 printk(KERN_ERR "ide-tape: bh == NULL in "
397 "idetape_input_buffers\n"); 397 "idetape_input_buffers\n");
398 ide_atapi_discard_data(drive, bcount); 398 ide_pad_transfer(drive, 0, bcount);
399 return; 399 return;
400 } 400 }
401 count = min( 401 count = min(
@@ -871,7 +871,7 @@ static ide_startstop_t idetape_pc_intr(ide_drive_t *drive)
871 printk(KERN_ERR "ide-tape: The tape wants to " 871 printk(KERN_ERR "ide-tape: The tape wants to "
872 "send us more data than expected " 872 "send us more data than expected "
873 "- discarding data\n"); 873 "- discarding data\n");
874 ide_atapi_discard_data(drive, bcount); 874 ide_pad_transfer(drive, 0, bcount);
875 ide_set_handler(drive, &idetape_pc_intr, 875 ide_set_handler(drive, &idetape_pc_intr,
876 IDETAPE_WAIT_CMD, NULL); 876 IDETAPE_WAIT_CMD, NULL);
877 return ide_started; 877 return ide_started;
diff --git a/drivers/scsi/ide-scsi.c b/drivers/scsi/ide-scsi.c
index 7964cc146152..44d8d5163a1a 100644
--- a/drivers/scsi/ide-scsi.c
+++ b/drivers/scsi/ide-scsi.c
@@ -164,7 +164,7 @@ static void idescsi_input_buffers(ide_drive_t *drive, struct ide_atapi_pc *pc,
164 164
165 if (bcount) { 165 if (bcount) {
166 printk (KERN_ERR "ide-scsi: scatter gather table too small, discarding data\n"); 166 printk (KERN_ERR "ide-scsi: scatter gather table too small, discarding data\n");
167 ide_atapi_discard_data(drive, bcount); 167 ide_pad_transfer(drive, 0, bcount);
168 } 168 }
169} 169}
170 170
@@ -201,7 +201,7 @@ static void idescsi_output_buffers(ide_drive_t *drive, struct ide_atapi_pc *pc,
201 201
202 if (bcount) { 202 if (bcount) {
203 printk (KERN_ERR "ide-scsi: scatter gather table too small, padding with zeros\n"); 203 printk (KERN_ERR "ide-scsi: scatter gather table too small, padding with zeros\n");
204 ide_atapi_write_zeros(drive, bcount); 204 ide_pad_transfer(drive, 1, bcount);
205 } 205 }
206} 206}
207 207
@@ -438,7 +438,7 @@ static ide_startstop_t idescsi_pc_intr (ide_drive_t *drive)
438 } 438 }
439 pc->xferred += temp; 439 pc->xferred += temp;
440 pc->cur_pos += temp; 440 pc->cur_pos += temp;
441 ide_atapi_discard_data(drive, bcount - temp); 441 ide_pad_transfer(drive, 0, bcount - temp);
442 ide_set_handler(drive, &idescsi_pc_intr, get_timeout(pc), idescsi_expiry); 442 ide_set_handler(drive, &idescsi_pc_intr, get_timeout(pc), idescsi_expiry);
443 return ide_started; 443 return ide_started;
444 } 444 }
diff --git a/include/linux/ide.h b/include/linux/ide.h
index 2053d7d86b1d..7a5da394b98f 100644
--- a/include/linux/ide.h
+++ b/include/linux/ide.h
@@ -827,6 +827,8 @@ void ide_execute_command(ide_drive_t *, u8, ide_handler_t *, unsigned int,
827 827
828void ide_execute_pkt_cmd(ide_drive_t *); 828void ide_execute_pkt_cmd(ide_drive_t *);
829 829
830void ide_pad_transfer(ide_drive_t *, int, int);
831
830ide_startstop_t __ide_error(ide_drive_t *, struct request *, u8, u8); 832ide_startstop_t __ide_error(ide_drive_t *, struct request *, u8, u8);
831 833
832ide_startstop_t ide_error (ide_drive_t *drive, const char *msg, byte stat); 834ide_startstop_t ide_error (ide_drive_t *drive, const char *msg, byte stat);
@@ -1359,27 +1361,4 @@ static inline u8 ide_read_error(ide_drive_t *drive)
1359 1361
1360 return hwif->INB(hwif->io_ports.error_addr); 1362 return hwif->INB(hwif->io_ports.error_addr);
1361} 1363}
1362
1363/*
1364 * Too bad. The drive wants to send us data which we are not ready to accept.
1365 * Just throw it away.
1366 */
1367static inline void ide_atapi_discard_data(ide_drive_t *drive, unsigned bcount)
1368{
1369 ide_hwif_t *hwif = drive->hwif;
1370
1371 /* FIXME: use ->input_data */
1372 while (bcount--)
1373 (void)hwif->INB(hwif->io_ports.data_addr);
1374}
1375
1376static inline void ide_atapi_write_zeros(ide_drive_t *drive, unsigned bcount)
1377{
1378 ide_hwif_t *hwif = drive->hwif;
1379
1380 /* FIXME: use ->output_data */
1381 while (bcount--)
1382 hwif->OUTB(0, hwif->io_ports.data_addr);
1383}
1384
1385#endif /* _IDE_H */ 1364#endif /* _IDE_H */