aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/block/swim3.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/block/swim3.c')
-rw-r--r--drivers/block/swim3.c31
1 files changed, 5 insertions, 26 deletions
diff --git a/drivers/block/swim3.c b/drivers/block/swim3.c
index 5904f7b73c6e..424855945b9b 100644
--- a/drivers/block/swim3.c
+++ b/drivers/block/swim3.c
@@ -319,14 +319,10 @@ static void start_request(struct floppy_state *fs)
319 req->errors, req->current_nr_sectors); 319 req->errors, req->current_nr_sectors);
320#endif 320#endif
321 321
322 if (req->sector < 0 || req->sector >= fs->total_secs) { 322 if (req->sector >= fs->total_secs) {
323 __blk_end_request_cur(req, -EIO); 323 __blk_end_request_cur(req, -EIO);
324 continue; 324 continue;
325 } 325 }
326 if (req->current_nr_sectors == 0) {
327 __blk_end_request_cur(req, 0);
328 continue;
329 }
330 if (fs->ejected) { 326 if (fs->ejected) {
331 __blk_end_request_cur(req, -EIO); 327 __blk_end_request_cur(req, -EIO);
332 continue; 328 continue;
@@ -593,8 +589,6 @@ static void xfer_timeout(unsigned long data)
593 struct floppy_state *fs = (struct floppy_state *) data; 589 struct floppy_state *fs = (struct floppy_state *) data;
594 struct swim3 __iomem *sw = fs->swim3; 590 struct swim3 __iomem *sw = fs->swim3;
595 struct dbdma_regs __iomem *dr = fs->dma; 591 struct dbdma_regs __iomem *dr = fs->dma;
596 struct dbdma_cmd *cp = fs->dma_cmd;
597 unsigned long s;
598 int n; 592 int n;
599 593
600 fs->timeout_pending = 0; 594 fs->timeout_pending = 0;
@@ -605,14 +599,6 @@ static void xfer_timeout(unsigned long data)
605 out_8(&sw->intr_enable, 0); 599 out_8(&sw->intr_enable, 0);
606 out_8(&sw->control_bic, WRITE_SECTORS | DO_ACTION); 600 out_8(&sw->control_bic, WRITE_SECTORS | DO_ACTION);
607 out_8(&sw->select, RELAX); 601 out_8(&sw->select, RELAX);
608 if (rq_data_dir(fd_req) == WRITE)
609 ++cp;
610 if (ld_le16(&cp->xfer_status) != 0)
611 s = fs->scount - ((ld_le16(&cp->res_count) + 511) >> 9);
612 else
613 s = 0;
614 fd_req->sector += s;
615 fd_req->current_nr_sectors -= s;
616 printk(KERN_ERR "swim3: timeout %sing sector %ld\n", 602 printk(KERN_ERR "swim3: timeout %sing sector %ld\n",
617 (rq_data_dir(fd_req)==WRITE? "writ": "read"), (long)fd_req->sector); 603 (rq_data_dir(fd_req)==WRITE? "writ": "read"), (long)fd_req->sector);
618 __blk_end_request_cur(fd_req, -EIO); 604 __blk_end_request_cur(fd_req, -EIO);
@@ -719,9 +705,7 @@ static irqreturn_t swim3_interrupt(int irq, void *dev_id)
719 if (intr & ERROR_INTR) { 705 if (intr & ERROR_INTR) {
720 n = fs->scount - 1 - resid / 512; 706 n = fs->scount - 1 - resid / 512;
721 if (n > 0) { 707 if (n > 0) {
722 fd_req->sector += n; 708 blk_update_request(fd_req, 0, n << 9);
723 fd_req->current_nr_sectors -= n;
724 fd_req->buffer += n * 512;
725 fs->req_sector += n; 709 fs->req_sector += n;
726 } 710 }
727 if (fs->retries < 5) { 711 if (fs->retries < 5) {
@@ -745,13 +729,7 @@ static irqreturn_t swim3_interrupt(int irq, void *dev_id)
745 start_request(fs); 729 start_request(fs);
746 break; 730 break;
747 } 731 }
748 fd_req->sector += fs->scount; 732 if (__blk_end_request(fd_req, 0, fs->scount << 9)) {
749 fd_req->current_nr_sectors -= fs->scount;
750 fd_req->buffer += fs->scount * 512;
751 if (fd_req->current_nr_sectors <= 0) {
752 __blk_end_request_cur(fd_req, 0);
753 fs->state = idle;
754 } else {
755 fs->req_sector += fs->scount; 733 fs->req_sector += fs->scount;
756 if (fs->req_sector > fs->secpertrack) { 734 if (fs->req_sector > fs->secpertrack) {
757 fs->req_sector -= fs->secpertrack; 735 fs->req_sector -= fs->secpertrack;
@@ -761,7 +739,8 @@ static irqreturn_t swim3_interrupt(int irq, void *dev_id)
761 } 739 }
762 } 740 }
763 act(fs); 741 act(fs);
764 } 742 } else
743 fs->state = idle;
765 } 744 }
766 if (fs->state == idle) 745 if (fs->state == idle)
767 start_request(fs); 746 start_request(fs);