Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

ide: add ide_pad_transfer() helper

* Add ide_pad_transfer() helper (which uses ->{in,out}put_data methods
internally so the transfer is also padded to drive+host requirements)
and use it instead of ide_atapi_{write_zeros,discard_data}().

* Remove no longer needed ide_atapi_{write_zeros,discard_data}().

Cc: Borislav Petkov <petkovbb@gmail.com>
Acked-by: Sergei Shtylyov <sshtylyov@ru.mvista.com>
Signed-off-by: Bartlomiej Zolnierkiewicz <bzolnier@gmail.com>

+24 -33
+2 -5
drivers/ide/ide-floppy.c
··· 262 262 if (bcount) { 263 263 printk(KERN_ERR "%s: leftover data in %s, bcount == %d\n", 264 264 drive->name, __func__, bcount); 265 - if (direction) 266 - ide_atapi_write_zeros(drive, bcount); 267 - else 268 - ide_atapi_discard_data(drive, bcount); 265 + ide_pad_transfer(drive, direction, bcount); 269 266 } 270 267 } 271 268 ··· 488 491 printk(KERN_ERR "ide-floppy: The floppy wants " 489 492 "to send us more data than expected " 490 493 "- discarding data\n"); 491 - ide_atapi_discard_data(drive, bcount); 494 + ide_pad_transfer(drive, 0, bcount); 492 495 493 496 ide_set_handler(drive, 494 497 &idefloppy_pc_intr,
+15
drivers/ide/ide-io.c
··· 1642 1642 } 1643 1643 1644 1644 EXPORT_SYMBOL_GPL(ide_pktcmd_tf_load); 1645 + 1646 + void 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 + } 1659 + EXPORT_SYMBOL_GPL(ide_pad_transfer);
+2 -2
drivers/ide/ide-tape.c
··· 395 395 if (bh == NULL) { 396 396 printk(KERN_ERR "ide-tape: bh == NULL in " 397 397 "idetape_input_buffers\n"); 398 - ide_atapi_discard_data(drive, bcount); 398 + ide_pad_transfer(drive, 0, bcount); 399 399 return; 400 400 } 401 401 count = min( ··· 871 871 printk(KERN_ERR "ide-tape: The tape wants to " 872 872 "send us more data than expected " 873 873 "- discarding data\n"); 874 - ide_atapi_discard_data(drive, bcount); 874 + ide_pad_transfer(drive, 0, bcount); 875 875 ide_set_handler(drive, &idetape_pc_intr, 876 876 IDETAPE_WAIT_CMD, NULL); 877 877 return ide_started;
+3 -3
drivers/scsi/ide-scsi.c
··· 164 164 165 165 if (bcount) { 166 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 201 202 202 if (bcount) { 203 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 438 } 439 439 pc->xferred += temp; 440 440 pc->cur_pos += temp; 441 - ide_atapi_discard_data(drive, bcount - temp); 441 + ide_pad_transfer(drive, 0, bcount - temp); 442 442 ide_set_handler(drive, &idescsi_pc_intr, get_timeout(pc), idescsi_expiry); 443 443 return ide_started; 444 444 }
+2 -23
include/linux/ide.h
··· 827 827 828 828 void ide_execute_pkt_cmd(ide_drive_t *); 829 829 830 + void ide_pad_transfer(ide_drive_t *, int, int); 831 + 830 832 ide_startstop_t __ide_error(ide_drive_t *, struct request *, u8, u8); 831 833 832 834 ide_startstop_t ide_error (ide_drive_t *drive, const char *msg, byte stat); ··· 1361 1359 1362 1360 return hwif->INB(hwif->io_ports.error_addr); 1363 1361 } 1364 - 1365 - /* 1366 - * Too bad. The drive wants to send us data which we are not ready to accept. 1367 - * Just throw it away. 1368 - */ 1369 - static inline void ide_atapi_discard_data(ide_drive_t *drive, unsigned bcount) 1370 - { 1371 - ide_hwif_t *hwif = drive->hwif; 1372 - 1373 - /* FIXME: use ->input_data */ 1374 - while (bcount--) 1375 - (void)hwif->INB(hwif->io_ports.data_addr); 1376 - } 1377 - 1378 - static inline void ide_atapi_write_zeros(ide_drive_t *drive, unsigned bcount) 1379 - { 1380 - ide_hwif_t *hwif = drive->hwif; 1381 - 1382 - /* FIXME: use ->output_data */ 1383 - while (bcount--) 1384 - hwif->OUTB(0, hwif->io_ports.data_addr); 1385 - } 1386 - 1387 1362 #endif /* _IDE_H */