Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 101240
b: refs/heads/master
c: 0b2eea4
h: refs/heads/master
v: v3
  • Loading branch information
Bartlomiej Zolnierkiewicz committed Jul 15, 2008
1 parent 76de020 commit 6f90263
Show file tree
Hide file tree
Showing 2 changed files with 18 additions and 49 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 170ee569bbe1005baebf2e9e4c3f4622d14ec851
refs/heads/master: 0b2eea4c5594ceaf13c57eaff7ff226263f1c36f
65 changes: 17 additions & 48 deletions trunk/drivers/ide/ide-floppy.c
Original file line number Diff line number Diff line change
Expand Up @@ -521,40 +521,6 @@ static ide_startstop_t idefloppy_pc_intr(ide_drive_t *drive)
return ide_started;
}

/*
* This is the original routine that did the packet transfer.
* It fails at high speeds on the Iomega ZIP drive, so there's a slower version
* for that drive below. The algorithm is chosen based on drive type
*/
static ide_startstop_t idefloppy_transfer_pc(ide_drive_t *drive)
{
ide_hwif_t *hwif = drive->hwif;
ide_startstop_t startstop;
idefloppy_floppy_t *floppy = drive->driver_data;
u8 ireason;

if (ide_wait_stat(&startstop, drive, DRQ_STAT, BUSY_STAT, WAIT_READY)) {
printk(KERN_ERR "ide-floppy: Strange, packet command "
"initiated yet DRQ isn't asserted\n");
return startstop;
}
ireason = hwif->INB(hwif->io_ports.nsect_addr);
if ((ireason & CD) == 0 || (ireason & IO)) {
printk(KERN_ERR "ide-floppy: (IO,CoD) != (0,1) while "
"issuing a packet command\n");
return ide_do_reset(drive);
}

/* Set the interrupt routine */
ide_set_handler(drive, &idefloppy_pc_intr, IDEFLOPPY_WAIT_CMD, NULL);

/* Send the actual packet */
hwif->output_data(drive, NULL, floppy->pc->c, 12);

return ide_started;
}


/*
* What we have here is a classic case of a top half / bottom half interrupt
* service routine. In interrupt mode, the device sends an interrupt to signal
Expand All @@ -580,6 +546,8 @@ static ide_startstop_t idefloppy_transfer_pc1(ide_drive_t *drive)
{
ide_hwif_t *hwif = drive->hwif;
idefloppy_floppy_t *floppy = drive->driver_data;
ide_expiry_t *expiry;
unsigned int timeout;
ide_startstop_t startstop;
u8 ireason;

Expand All @@ -602,9 +570,20 @@ static ide_startstop_t idefloppy_transfer_pc1(ide_drive_t *drive)
* 40 and 50msec work well. idefloppy_pc_intr will not be actually
* used until after the packet is moved in about 50 msec.
*/
if (floppy->flags & IDEFLOPPY_FLAG_ZIP_DRIVE) {
timeout = floppy->ticks;
expiry = &idefloppy_transfer_pc2;
} else {
timeout = IDEFLOPPY_WAIT_CMD;
expiry = NULL;
}

ide_set_handler(drive, &idefloppy_pc_intr, timeout, expiry);

if ((floppy->flags & IDEFLOPPY_FLAG_ZIP_DRIVE) == 0)
/* Send the actual packet */
hwif->output_data(drive, NULL, floppy->pc->c, 12);

ide_set_handler(drive, &idefloppy_pc_intr, floppy->ticks,
&idefloppy_transfer_pc2);
return ide_started;
}

Expand All @@ -629,7 +608,6 @@ static ide_startstop_t idefloppy_issue_pc(ide_drive_t *drive,
{
idefloppy_floppy_t *floppy = drive->driver_data;
ide_hwif_t *hwif = drive->hwif;
ide_handler_t *pkt_xfer_routine;
u16 bcount;
u8 dma;

Expand Down Expand Up @@ -675,26 +653,17 @@ static ide_startstop_t idefloppy_issue_pc(ide_drive_t *drive,
hwif->dma_ops->dma_start(drive);
}

/* Can we transfer the packet when we get the interrupt or wait? */
if (floppy->flags & IDEFLOPPY_FLAG_ZIP_DRIVE) {
/* wait */
pkt_xfer_routine = &idefloppy_transfer_pc1;
} else {
/* immediate */
pkt_xfer_routine = &idefloppy_transfer_pc;
}

if (floppy->flags & IDEFLOPPY_FLAG_DRQ_INTERRUPT) {
/* Issue the packet command */
ide_execute_command(drive, WIN_PACKETCMD,
pkt_xfer_routine,
&idefloppy_transfer_pc1,
IDEFLOPPY_WAIT_CMD,
NULL);
return ide_started;
} else {
/* Issue the packet command */
ide_execute_pkt_cmd(drive);
return (*pkt_xfer_routine) (drive);
return idefloppy_transfer_pc1(drive);
}
}

Expand Down

0 comments on commit 6f90263

Please sign in to comment.