diff options
Diffstat (limited to 'drivers/block/amiflop.c')
-rw-r--r-- | drivers/block/amiflop.c | 54 |
1 files changed, 23 insertions, 31 deletions
diff --git a/drivers/block/amiflop.c b/drivers/block/amiflop.c index 8df436ff7068..9c6e5b0fe894 100644 --- a/drivers/block/amiflop.c +++ b/drivers/block/amiflop.c | |||
@@ -112,8 +112,6 @@ module_param(fd_def_df0, ulong, 0); | |||
112 | MODULE_LICENSE("GPL"); | 112 | MODULE_LICENSE("GPL"); |
113 | 113 | ||
114 | static struct request_queue *floppy_queue; | 114 | static struct request_queue *floppy_queue; |
115 | #define QUEUE (floppy_queue) | ||
116 | #define CURRENT elv_next_request(floppy_queue) | ||
117 | 115 | ||
118 | /* | 116 | /* |
119 | * Macros | 117 | * Macros |
@@ -1335,64 +1333,60 @@ static int get_track(int drive, int track) | |||
1335 | 1333 | ||
1336 | static void redo_fd_request(void) | 1334 | static void redo_fd_request(void) |
1337 | { | 1335 | { |
1336 | struct request *rq; | ||
1338 | unsigned int cnt, block, track, sector; | 1337 | unsigned int cnt, block, track, sector; |
1339 | int drive; | 1338 | int drive; |
1340 | struct amiga_floppy_struct *floppy; | 1339 | struct amiga_floppy_struct *floppy; |
1341 | char *data; | 1340 | char *data; |
1342 | unsigned long flags; | 1341 | unsigned long flags; |
1342 | int err; | ||
1343 | 1343 | ||
1344 | repeat: | 1344 | next_req: |
1345 | if (!CURRENT) { | 1345 | rq = blk_fetch_request(floppy_queue); |
1346 | if (!rq) { | ||
1346 | /* Nothing left to do */ | 1347 | /* Nothing left to do */ |
1347 | return; | 1348 | return; |
1348 | } | 1349 | } |
1349 | 1350 | ||
1350 | floppy = CURRENT->rq_disk->private_data; | 1351 | floppy = rq->rq_disk->private_data; |
1351 | drive = floppy - unit; | 1352 | drive = floppy - unit; |
1352 | 1353 | ||
1354 | next_segment: | ||
1353 | /* Here someone could investigate to be more efficient */ | 1355 | /* Here someone could investigate to be more efficient */ |
1354 | for (cnt = 0; cnt < CURRENT->current_nr_sectors; cnt++) { | 1356 | for (cnt = 0, err = 0; cnt < blk_rq_cur_sectors(rq); cnt++) { |
1355 | #ifdef DEBUG | 1357 | #ifdef DEBUG |
1356 | printk("fd: sector %ld + %d requested for %s\n", | 1358 | printk("fd: sector %ld + %d requested for %s\n", |
1357 | CURRENT->sector,cnt, | 1359 | blk_rq_pos(rq), cnt, |
1358 | (rq_data_dir(CURRENT) == READ) ? "read" : "write"); | 1360 | (rq_data_dir(rq) == READ) ? "read" : "write"); |
1359 | #endif | 1361 | #endif |
1360 | block = CURRENT->sector + cnt; | 1362 | block = blk_rq_pos(rq) + cnt; |
1361 | if ((int)block > floppy->blocks) { | 1363 | if ((int)block > floppy->blocks) { |
1362 | end_request(CURRENT, 0); | 1364 | err = -EIO; |
1363 | goto repeat; | 1365 | break; |
1364 | } | 1366 | } |
1365 | 1367 | ||
1366 | track = block / (floppy->dtype->sects * floppy->type->sect_mult); | 1368 | track = block / (floppy->dtype->sects * floppy->type->sect_mult); |
1367 | sector = block % (floppy->dtype->sects * floppy->type->sect_mult); | 1369 | sector = block % (floppy->dtype->sects * floppy->type->sect_mult); |
1368 | data = CURRENT->buffer + 512 * cnt; | 1370 | data = rq->buffer + 512 * cnt; |
1369 | #ifdef DEBUG | 1371 | #ifdef DEBUG |
1370 | printk("access to track %d, sector %d, with buffer at " | 1372 | printk("access to track %d, sector %d, with buffer at " |
1371 | "0x%08lx\n", track, sector, data); | 1373 | "0x%08lx\n", track, sector, data); |
1372 | #endif | 1374 | #endif |
1373 | 1375 | ||
1374 | if ((rq_data_dir(CURRENT) != READ) && (rq_data_dir(CURRENT) != WRITE)) { | ||
1375 | printk(KERN_WARNING "do_fd_request: unknown command\n"); | ||
1376 | end_request(CURRENT, 0); | ||
1377 | goto repeat; | ||
1378 | } | ||
1379 | if (get_track(drive, track) == -1) { | 1376 | if (get_track(drive, track) == -1) { |
1380 | end_request(CURRENT, 0); | 1377 | err = -EIO; |
1381 | goto repeat; | 1378 | break; |
1382 | } | 1379 | } |
1383 | 1380 | ||
1384 | switch (rq_data_dir(CURRENT)) { | 1381 | if (rq_data_dir(rq) == READ) { |
1385 | case READ: | ||
1386 | memcpy(data, floppy->trackbuf + sector * 512, 512); | 1382 | memcpy(data, floppy->trackbuf + sector * 512, 512); |
1387 | break; | 1383 | } else { |
1388 | |||
1389 | case WRITE: | ||
1390 | memcpy(floppy->trackbuf + sector * 512, data, 512); | 1384 | memcpy(floppy->trackbuf + sector * 512, data, 512); |
1391 | 1385 | ||
1392 | /* keep the drive spinning while writes are scheduled */ | 1386 | /* keep the drive spinning while writes are scheduled */ |
1393 | if (!fd_motor_on(drive)) { | 1387 | if (!fd_motor_on(drive)) { |
1394 | end_request(CURRENT, 0); | 1388 | err = -EIO; |
1395 | goto repeat; | 1389 | break; |
1396 | } | 1390 | } |
1397 | /* | 1391 | /* |
1398 | * setup a callback to write the track buffer | 1392 | * setup a callback to write the track buffer |
@@ -1404,14 +1398,12 @@ static void redo_fd_request(void) | |||
1404 | /* reset the timer */ | 1398 | /* reset the timer */ |
1405 | mod_timer (flush_track_timer + drive, jiffies + 1); | 1399 | mod_timer (flush_track_timer + drive, jiffies + 1); |
1406 | local_irq_restore(flags); | 1400 | local_irq_restore(flags); |
1407 | break; | ||
1408 | } | 1401 | } |
1409 | } | 1402 | } |
1410 | CURRENT->nr_sectors -= CURRENT->current_nr_sectors; | ||
1411 | CURRENT->sector += CURRENT->current_nr_sectors; | ||
1412 | 1403 | ||
1413 | end_request(CURRENT, 1); | 1404 | if (__blk_end_request_cur(rq, err)) |
1414 | goto repeat; | 1405 | goto next_segment; |
1406 | goto next_req; | ||
1415 | } | 1407 | } |
1416 | 1408 | ||
1417 | static void do_fd_request(struct request_queue * q) | 1409 | static void do_fd_request(struct request_queue * q) |