ide-cd: prepare cdrom_rw_intr() and cdrom_newpc_intr() to be merged
authorBartlomiej Zolnierkiewicz <bzolnier@gmail.com>
Fri, 1 Feb 2008 22:09:27 +0000 (23:09 +0100)
committerBartlomiej Zolnierkiewicz <bzolnier@gmail.com>
Fri, 1 Feb 2008 22:09:27 +0000 (23:09 +0100)
In cdrom_newpc_intr():
* cleanup variables in the 'transfer data' loop

In cdrom_rw_intr():
* rename 'sectors_to_transfer' to 'thislen'
* rename 'this_transfer' to 'blen'
* keep number of bytes (instead of sectors) in 'thislen' and 'blen'
* call 'xferfunc' only once for 'blen'
* cache 'rq->buffer' in 'ptr' variable
* check for 'rq->bio' before setting 'ptr' and 'blen'
* check for 'ptr' instead of 'rq->current_nr_sectors'

There should be no functionality changes caused by this patch.

Signed-off-by: Bartlomiej Zolnierkiewicz <bzolnier@gmail.com>
drivers/ide/ide-cd.c

index 0f17117..2a520bd 100644 (file)
@@ -1123,8 +1123,8 @@ static ide_startstop_t cdrom_newpc_intr(ide_drive_t *drive)
         * transfer data
         */
        while (thislen > 0) {
-               int blen = blen = rq->data_len;
-               char *ptr = rq->data;
+               u8 *ptr = rq->data;
+               int blen = rq->data_len;
 
                /*
                 * bio backed?
@@ -1207,7 +1207,7 @@ static ide_startstop_t cdrom_rw_intr(ide_drive_t *drive)
        struct cdrom_info *info = drive->driver_data;
        struct request *rq = HWGROUP(drive)->rq;
        xfer_func_t *xferfunc;
-       int stat, ireason, len, sectors_to_transfer, uptodate, nskip;
+       int stat, ireason, len, thislen, uptodate, nskip;
        int dma_error = 0, dma = info->dma, write = rq_data_dir(rq) == WRITE;
        u8 lowcyl = 0, highcyl = 0;
 
@@ -1262,7 +1262,7 @@ static ide_startstop_t cdrom_rw_intr(ide_drive_t *drive)
                return ide_stopped;
        }
 
-       sectors_to_transfer = len / SECTOR_SIZE;
+       thislen = len;
 
        /* Check that the drive is expecting to do the same thing we are. */
        if (write) {
@@ -1285,12 +1285,12 @@ static ide_startstop_t cdrom_rw_intr(ide_drive_t *drive)
                 */
                nskip = min_t(int, rq->current_nr_sectors
                                   - bio_cur_sectors(rq->bio),
-                                  sectors_to_transfer);
+                                  thislen >> 9);
 
                if (nskip > 0) {
                        ide_cd_drain_data(drive, nskip);
                        rq->current_nr_sectors -= nskip;
-                       sectors_to_transfer -= nskip;
+                       thislen -= (nskip << 9);
                }
 
                xferfunc = HWIF(drive)->atapi_input_bytes;
@@ -1299,17 +1299,23 @@ static ide_startstop_t cdrom_rw_intr(ide_drive_t *drive)
        /*
         * now loop and read/write the data
         */
-       while (sectors_to_transfer > 0) {
-               int this_transfer;
+       while (thislen > 0) {
+               u8 *ptr = NULL;
+               int blen;
+
+               if (rq->bio) {
+                       ptr = rq->buffer;
+                       blen = rq->current_nr_sectors << 9;
+               }
 
-               if (!rq->current_nr_sectors) {
+               if (!ptr) {
                        if (!write)
                                /*
                                 * If the buffers are full, cache the rest
                                 * of the data in our internal buffer.
                                 */
                                cdrom_buffer_sectors(drive, rq->sector,
-                                                    sectors_to_transfer);
+                                                    thislen >> 9);
                        else
                                printk(KERN_ERR "%s: %s: confused, missing "
                                                "data\n",
@@ -1320,17 +1326,16 @@ static ide_startstop_t cdrom_rw_intr(ide_drive_t *drive)
                /*
                 * Figure out how many sectors we can transfer
                 */
-               this_transfer = min_t(int, sectors_to_transfer, rq->current_nr_sectors);
-
-               while (this_transfer > 0) {
-                       xferfunc(drive, rq->buffer, SECTOR_SIZE);
-                       rq->buffer += SECTOR_SIZE;
-                       --rq->nr_sectors;
-                       --rq->current_nr_sectors;
-                       ++rq->sector;
-                       --this_transfer;
-                       --sectors_to_transfer;
-               }
+               if (blen > thislen)
+                       blen = thislen;
+
+               xferfunc(drive, ptr, blen);
+
+               thislen -= blen;
+               rq->buffer += blen;
+               rq->nr_sectors -= (blen >> 9);
+               rq->current_nr_sectors -= (blen >> 9);
+               rq->sector += (blen >> 9);
 
                /*
                 * current buffer complete, move on