aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/ide/ide-cd.c
diff options
context:
space:
mode:
authorBartlomiej Zolnierkiewicz <bzolnier@gmail.com>2008-02-01 17:09:17 -0500
committerBartlomiej Zolnierkiewicz <bzolnier@gmail.com>2008-02-01 17:09:17 -0500
commit5a5222d9fa4aa7ae3b1d5c126cb9c83124d75af5 (patch)
treea1ac9463990483fc323d99bf04877b215f5b338b /drivers/ide/ide-cd.c
parent68661c53a2a847b9a0d6d232a85b2e063573307a (diff)
ide-cd: add ide_cd_pad_transfer() helper
Add ide_cd_pad_transfer() helper and use it in cdrom_[new]pc_intr() and cdrom_{read,write}_check_ireason(). There should be no functionality changes caused by this patch. Signed-off-by: Bartlomiej Zolnierkiewicz <bzolnier@gmail.com>
Diffstat (limited to 'drivers/ide/ide-cd.c')
-rw-r--r--drivers/ide/ide-cd.c51
1 files changed, 25 insertions, 26 deletions
diff --git a/drivers/ide/ide-cd.c b/drivers/ide/ide-cd.c
index f2b951dd1421..75539fd0829c 100644
--- a/drivers/ide/ide-cd.c
+++ b/drivers/ide/ide-cd.c
@@ -1007,6 +1007,15 @@ static ide_startstop_t cdrom_transfer_packet_command (ide_drive_t *drive,
1007 1007
1008typedef void (xfer_func_t)(ide_drive_t *, void *, u32); 1008typedef void (xfer_func_t)(ide_drive_t *, void *, u32);
1009 1009
1010static void ide_cd_pad_transfer(ide_drive_t *drive, xfer_func_t *xf, int len)
1011{
1012 while (len > 0) {
1013 int dum = 0;
1014 xf(drive, &dum, sizeof(dum));
1015 len -= sizeof(dum);
1016 }
1017}
1018
1010/* 1019/*
1011 * Buffer up to SECTORS_TO_TRANSFER sectors from the drive in our sector 1020 * Buffer up to SECTORS_TO_TRANSFER sectors from the drive in our sector
1012 * buffer. Once the first sector is added, any subsequent sectors are 1021 * buffer. Once the first sector is added, any subsequent sectors are
@@ -1063,17 +1072,15 @@ int cdrom_read_check_ireason (ide_drive_t *drive, int len, int ireason)
1063 if (ireason == 2) 1072 if (ireason == 2)
1064 return 0; 1073 return 0;
1065 else if (ireason == 0) { 1074 else if (ireason == 0) {
1075 ide_hwif_t *hwif = drive->hwif;
1076
1066 /* Whoops... The drive is expecting to receive data from us! */ 1077 /* Whoops... The drive is expecting to receive data from us! */
1067 printk(KERN_ERR "%s: %s: wrong transfer direction!\n", 1078 printk(KERN_ERR "%s: %s: wrong transfer direction!\n",
1068 drive->name, __FUNCTION__); 1079 drive->name, __FUNCTION__);
1069 1080
1070 /* Throw some data at the drive so it doesn't hang 1081 /* Throw some data at the drive so it doesn't hang
1071 and quit this request. */ 1082 and quit this request. */
1072 while (len > 0) { 1083 ide_cd_pad_transfer(drive, hwif->atapi_output_bytes, len);
1073 int dum = 0;
1074 HWIF(drive)->atapi_output_bytes(drive, &dum, sizeof (dum));
1075 len -= sizeof (dum);
1076 }
1077 } else if (ireason == 1) { 1084 } else if (ireason == 1) {
1078 /* Some drives (ASUS) seem to tell us that status 1085 /* Some drives (ASUS) seem to tell us that status
1079 * info is available. just get it and ignore. 1086 * info is available. just get it and ignore.
@@ -1500,15 +1507,8 @@ static ide_startstop_t cdrom_pc_intr (ide_drive_t *drive)
1500 /* Transfer the data. */ 1507 /* Transfer the data. */
1501 xferfunc(drive, rq->data, thislen); 1508 xferfunc(drive, rq->data, thislen);
1502 1509
1503 /* If we haven't moved enough data to satisfy the drive,
1504 add some padding. */
1505 while (len > thislen) {
1506 int dum = 0;
1507 xferfunc(drive, &dum, sizeof(dum));
1508 len -= sizeof(dum);
1509 }
1510
1511 /* Keep count of how much data we've moved. */ 1510 /* Keep count of how much data we've moved. */
1511 len -= thislen;
1512 rq->data += thislen; 1512 rq->data += thislen;
1513 rq->data_len -= thislen; 1513 rq->data_len -= thislen;
1514 1514
@@ -1525,6 +1525,13 @@ confused:
1525 return ide_stopped; 1525 return ide_stopped;
1526 } 1526 }
1527 1527
1528 /*
1529 * If we haven't moved enough data to satisfy the drive,
1530 * add some padding.
1531 */
1532 if (len > 0)
1533 ide_cd_pad_transfer(drive, xferfunc, len);
1534
1528 /* Now we wait for another interrupt. */ 1535 /* Now we wait for another interrupt. */
1529 ide_set_handler(drive, &cdrom_pc_intr, ATAPI_WAIT_PC, cdrom_timer_expiry); 1536 ide_set_handler(drive, &cdrom_pc_intr, ATAPI_WAIT_PC, cdrom_timer_expiry);
1530 return ide_started; 1537 return ide_started;
@@ -1617,15 +1624,13 @@ static int cdrom_write_check_ireason(ide_drive_t *drive, int len, int ireason)
1617 if (ireason == 0) 1624 if (ireason == 0)
1618 return 0; 1625 return 0;
1619 else if (ireason == 2) { 1626 else if (ireason == 2) {
1627 ide_hwif_t *hwif = drive->hwif;
1628
1620 /* Whoops... The drive wants to send data. */ 1629 /* Whoops... The drive wants to send data. */
1621 printk(KERN_ERR "%s: %s: wrong transfer direction!\n", 1630 printk(KERN_ERR "%s: %s: wrong transfer direction!\n",
1622 drive->name, __FUNCTION__); 1631 drive->name, __FUNCTION__);
1623 1632
1624 while (len > 0) { 1633 ide_cd_pad_transfer(drive, hwif->atapi_input_bytes, len);
1625 int dum = 0;
1626 HWIF(drive)->atapi_input_bytes(drive, &dum, sizeof(dum));
1627 len -= sizeof(dum);
1628 }
1629 } else { 1634 } else {
1630 /* Drive wants a command packet, or invalid ireason... */ 1635 /* Drive wants a command packet, or invalid ireason... */
1631 printk(KERN_ERR "%s: %s: bad interrupt reason 0x%02x\n", 1636 printk(KERN_ERR "%s: %s: bad interrupt reason 0x%02x\n",
@@ -1783,14 +1788,8 @@ static ide_startstop_t cdrom_newpc_intr(ide_drive_t *drive)
1783 /* 1788 /*
1784 * pad, if necessary 1789 * pad, if necessary
1785 */ 1790 */
1786 if (len > 0) { 1791 if (len > 0)
1787 while (len > 0) { 1792 ide_cd_pad_transfer(drive, xferfunc, len);
1788 int pad = 0;
1789
1790 xferfunc(drive, &pad, sizeof(pad));
1791 len -= sizeof(pad);
1792 }
1793 }
1794 1793
1795 BUG_ON(HWGROUP(drive)->handler != NULL); 1794 BUG_ON(HWGROUP(drive)->handler != NULL);
1796 1795