aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/ide
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/ide')
-rw-r--r--drivers/ide/ide-cd.c47
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)
1123 * transfer data 1123 * transfer data
1124 */ 1124 */
1125 while (thislen > 0) { 1125 while (thislen > 0) {
1126 int blen = blen = rq->data_len; 1126 u8 *ptr = rq->data;
1127 char *ptr = rq->data; 1127 int blen = rq->data_len;
1128 1128
1129 /* 1129 /*
1130 * bio backed? 1130 * bio backed?
@@ -1207,7 +1207,7 @@ static ide_startstop_t cdrom_rw_intr(ide_drive_t *drive)
1207 struct cdrom_info *info = drive->driver_data; 1207 struct cdrom_info *info = drive->driver_data;
1208 struct request *rq = HWGROUP(drive)->rq; 1208 struct request *rq = HWGROUP(drive)->rq;
1209 xfer_func_t *xferfunc; 1209 xfer_func_t *xferfunc;
1210 int stat, ireason, len, sectors_to_transfer, uptodate, nskip; 1210 int stat, ireason, len, thislen, uptodate, nskip;
1211 int dma_error = 0, dma = info->dma, write = rq_data_dir(rq) == WRITE; 1211 int dma_error = 0, dma = info->dma, write = rq_data_dir(rq) == WRITE;
1212 u8 lowcyl = 0, highcyl = 0; 1212 u8 lowcyl = 0, highcyl = 0;
1213 1213
@@ -1262,7 +1262,7 @@ static ide_startstop_t cdrom_rw_intr(ide_drive_t *drive)
1262 return ide_stopped; 1262 return ide_stopped;
1263 } 1263 }
1264 1264
1265 sectors_to_transfer = len / SECTOR_SIZE; 1265 thislen = len;
1266 1266
1267 /* Check that the drive is expecting to do the same thing we are. */ 1267 /* Check that the drive is expecting to do the same thing we are. */
1268 if (write) { 1268 if (write) {
@@ -1285,12 +1285,12 @@ static ide_startstop_t cdrom_rw_intr(ide_drive_t *drive)
1285 */ 1285 */
1286 nskip = min_t(int, rq->current_nr_sectors 1286 nskip = min_t(int, rq->current_nr_sectors
1287 - bio_cur_sectors(rq->bio), 1287 - bio_cur_sectors(rq->bio),
1288 sectors_to_transfer); 1288 thislen >> 9);
1289 1289
1290 if (nskip > 0) { 1290 if (nskip > 0) {
1291 ide_cd_drain_data(drive, nskip); 1291 ide_cd_drain_data(drive, nskip);
1292 rq->current_nr_sectors -= nskip; 1292 rq->current_nr_sectors -= nskip;
1293 sectors_to_transfer -= nskip; 1293 thislen -= (nskip << 9);
1294 } 1294 }
1295 1295
1296 xferfunc = HWIF(drive)->atapi_input_bytes; 1296 xferfunc = HWIF(drive)->atapi_input_bytes;
@@ -1299,17 +1299,23 @@ static ide_startstop_t cdrom_rw_intr(ide_drive_t *drive)
1299 /* 1299 /*
1300 * now loop and read/write the data 1300 * now loop and read/write the data
1301 */ 1301 */
1302 while (sectors_to_transfer > 0) { 1302 while (thislen > 0) {
1303 int this_transfer; 1303 u8 *ptr = NULL;
1304 int blen;
1305
1306 if (rq->bio) {
1307 ptr = rq->buffer;
1308 blen = rq->current_nr_sectors << 9;
1309 }
1304 1310
1305 if (!rq->current_nr_sectors) { 1311 if (!ptr) {
1306 if (!write) 1312 if (!write)
1307 /* 1313 /*
1308 * If the buffers are full, cache the rest 1314 * If the buffers are full, cache the rest
1309 * of the data in our internal buffer. 1315 * of the data in our internal buffer.
1310 */ 1316 */
1311 cdrom_buffer_sectors(drive, rq->sector, 1317 cdrom_buffer_sectors(drive, rq->sector,
1312 sectors_to_transfer); 1318 thislen >> 9);
1313 else 1319 else
1314 printk(KERN_ERR "%s: %s: confused, missing " 1320 printk(KERN_ERR "%s: %s: confused, missing "
1315 "data\n", 1321 "data\n",
@@ -1320,17 +1326,16 @@ static ide_startstop_t cdrom_rw_intr(ide_drive_t *drive)
1320 /* 1326 /*
1321 * Figure out how many sectors we can transfer 1327 * Figure out how many sectors we can transfer
1322 */ 1328 */
1323 this_transfer = min_t(int, sectors_to_transfer, rq->current_nr_sectors); 1329 if (blen > thislen)
1324 1330 blen = thislen;
1325 while (this_transfer > 0) { 1331
1326 xferfunc(drive, rq->buffer, SECTOR_SIZE); 1332 xferfunc(drive, ptr, blen);
1327 rq->buffer += SECTOR_SIZE; 1333
1328 --rq->nr_sectors; 1334 thislen -= blen;
1329 --rq->current_nr_sectors; 1335 rq->buffer += blen;
1330 ++rq->sector; 1336 rq->nr_sectors -= (blen >> 9);
1331 --this_transfer; 1337 rq->current_nr_sectors -= (blen >> 9);
1332 --sectors_to_transfer; 1338 rq->sector += (blen >> 9);
1333 }
1334 1339
1335 /* 1340 /*
1336 * current buffer complete, move on 1341 * current buffer complete, move on