aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/block/xd.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/block/xd.c')
-rw-r--r--drivers/block/xd.c15
1 files changed, 8 insertions, 7 deletions
diff --git a/drivers/block/xd.c b/drivers/block/xd.c
index 64b496fce98b..6f6ad82ec0c0 100644
--- a/drivers/block/xd.c
+++ b/drivers/block/xd.c
@@ -314,21 +314,22 @@ static void do_xd_request (struct request_queue * q)
314 int retry; 314 int retry;
315 315
316 if (!blk_fs_request(req)) { 316 if (!blk_fs_request(req)) {
317 end_request(req, 0); 317 __blk_end_request_cur(req, -EIO);
318 continue; 318 continue;
319 } 319 }
320 if (block + count > get_capacity(req->rq_disk)) { 320 if (block + count > get_capacity(req->rq_disk)) {
321 end_request(req, 0); 321 __blk_end_request_cur(req, -EIO);
322 continue; 322 continue;
323 } 323 }
324 if (rw != READ && rw != WRITE) { 324 if (rw != READ && rw != WRITE) {
325 printk("do_xd_request: unknown request\n"); 325 printk("do_xd_request: unknown request\n");
326 end_request(req, 0); 326 __blk_end_request_cur(req, -EIO);
327 continue; 327 continue;
328 } 328 }
329 for (retry = 0; (retry < XD_RETRIES) && !res; retry++) 329 for (retry = 0; (retry < XD_RETRIES) && !res; retry++)
330 res = xd_readwrite(rw, disk, req->buffer, block, count); 330 res = xd_readwrite(rw, disk, req->buffer, block, count);
331 end_request(req, res); /* wrap up, 0 = fail, 1 = success */ 331 /* wrap up, 0 = success, -errno = fail */
332 __blk_end_request_cur(req, res);
332 } 333 }
333} 334}
334 335
@@ -418,7 +419,7 @@ static int xd_readwrite (u_char operation,XD_INFO *p,char *buffer,u_int block,u_
418 printk("xd%c: %s timeout, recalibrating drive\n",'a'+drive,(operation == READ ? "read" : "write")); 419 printk("xd%c: %s timeout, recalibrating drive\n",'a'+drive,(operation == READ ? "read" : "write"));
419 xd_recalibrate(drive); 420 xd_recalibrate(drive);
420 spin_lock_irq(&xd_lock); 421 spin_lock_irq(&xd_lock);
421 return (0); 422 return -EIO;
422 case 2: 423 case 2:
423 if (sense[0] & 0x30) { 424 if (sense[0] & 0x30) {
424 printk("xd%c: %s - ",'a'+drive,(operation == READ ? "reading" : "writing")); 425 printk("xd%c: %s - ",'a'+drive,(operation == READ ? "reading" : "writing"));
@@ -439,7 +440,7 @@ static int xd_readwrite (u_char operation,XD_INFO *p,char *buffer,u_int block,u_
439 else 440 else
440 printk(" - no valid disk address\n"); 441 printk(" - no valid disk address\n");
441 spin_lock_irq(&xd_lock); 442 spin_lock_irq(&xd_lock);
442 return (0); 443 return -EIO;
443 } 444 }
444 if (xd_dma_buffer) 445 if (xd_dma_buffer)
445 for (i=0; i < (temp * 0x200); i++) 446 for (i=0; i < (temp * 0x200); i++)
@@ -448,7 +449,7 @@ static int xd_readwrite (u_char operation,XD_INFO *p,char *buffer,u_int block,u_
448 count -= temp, buffer += temp * 0x200, block += temp; 449 count -= temp, buffer += temp * 0x200, block += temp;
449 } 450 }
450 spin_lock_irq(&xd_lock); 451 spin_lock_irq(&xd_lock);
451 return (1); 452 return 0;
452} 453}
453 454
454/* xd_recalibrate: recalibrate a given drive and reset controller if necessary */ 455/* xd_recalibrate: recalibrate a given drive and reset controller if necessary */