diff options
author | Bartlomiej Zolnierkiewicz <bzolnier@gmail.com> | 2008-02-01 23:09:27 +0100 |
---|---|---|
committer | Bartlomiej Zolnierkiewicz <bzolnier@gmail.com> | 2008-02-01 23:09:27 +0100 |
commit | a11e77db4982d44bf610dc7257b0fca3f7202403 (patch) | |
tree | cd1289f1a2802113ee2cfb6e0be3216b7dbcb954 /drivers/ide/ide-cd.c | |
parent | ide-cd: unify moving to the next buffer in cdrom_rw_intr() (diff) | |
download | linux-a11e77db4982d44bf610dc7257b0fca3f7202403.tar.xz linux-a11e77db4982d44bf610dc7257b0fca3f7202403.zip |
ide-cd: prepare cdrom_rw_intr() and cdrom_newpc_intr() to be merged
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>
Diffstat (limited to 'drivers/ide/ide-cd.c')
-rw-r--r-- | drivers/ide/ide-cd.c | 47 |
1 files changed, 26 insertions, 21 deletions
diff --git a/drivers/ide/ide-cd.c b/drivers/ide/ide-cd.c index 0f17117c5aa0..2a520bd27a37 100644 --- a/drivers/ide/ide-cd.c +++ b/drivers/ide/ide-cd.c @@ -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 |