diff options
author | Bartlomiej Zolnierkiewicz <bzolnier@gmail.com> | 2008-07-15 15:21:56 -0400 |
---|---|---|
committer | Bartlomiej Zolnierkiewicz <bzolnier@gmail.com> | 2008-07-15 15:21:56 -0400 |
commit | 6ffb66410dd9f5f383d9265d51ab667333a8296c (patch) | |
tree | 8974bd5ed612fde885e26b42ca738f3dbfce3047 /drivers/ide | |
parent | 5e3310958204912f3f00be2592c945fbc37db6ae (diff) |
ide-floppy: start DMA engine in idefloppy_transfer_pc1()
Start DMA engine and set PC_FLAG_DMA_IN_PROGRESS flag in
idefloppy_transfer_pc1() instead of idefloppy_issue_pc()
so the Status Register and the Interrupt Reason Register
are checked first.
Cc: Borislav Petkov <petkovbb@gmail.com>
Signed-off-by: Bartlomiej Zolnierkiewicz <bzolnier@gmail.com>
Diffstat (limited to 'drivers/ide')
-rw-r--r-- | drivers/ide/ide-floppy.c | 16 |
1 files changed, 10 insertions, 6 deletions
diff --git a/drivers/ide/ide-floppy.c b/drivers/ide/ide-floppy.c index dbefe35c1396..1df6a3143596 100644 --- a/drivers/ide/ide-floppy.c +++ b/drivers/ide/ide-floppy.c | |||
@@ -534,6 +534,7 @@ static ide_startstop_t idefloppy_transfer_pc1(ide_drive_t *drive) | |||
534 | { | 534 | { |
535 | ide_hwif_t *hwif = drive->hwif; | 535 | ide_hwif_t *hwif = drive->hwif; |
536 | idefloppy_floppy_t *floppy = drive->driver_data; | 536 | idefloppy_floppy_t *floppy = drive->driver_data; |
537 | struct ide_atapi_pc *pc = floppy->pc; | ||
537 | ide_expiry_t *expiry; | 538 | ide_expiry_t *expiry; |
538 | unsigned int timeout; | 539 | unsigned int timeout; |
539 | ide_startstop_t startstop; | 540 | ide_startstop_t startstop; |
@@ -568,6 +569,12 @@ static ide_startstop_t idefloppy_transfer_pc1(ide_drive_t *drive) | |||
568 | 569 | ||
569 | ide_set_handler(drive, &idefloppy_pc_intr, timeout, expiry); | 570 | ide_set_handler(drive, &idefloppy_pc_intr, timeout, expiry); |
570 | 571 | ||
572 | /* Begin DMA, if necessary */ | ||
573 | if (pc->flags & PC_FLAG_DMA_OK) { | ||
574 | pc->flags |= PC_FLAG_DMA_IN_PROGRESS; | ||
575 | hwif->dma_ops->dma_start(drive); | ||
576 | } | ||
577 | |||
571 | if ((floppy->flags & IDEFLOPPY_FLAG_ZIP_DRIVE) == 0) | 578 | if ((floppy->flags & IDEFLOPPY_FLAG_ZIP_DRIVE) == 0) |
572 | /* Send the actual packet */ | 579 | /* Send the actual packet */ |
573 | hwif->output_data(drive, NULL, floppy->pc->c, 12); | 580 | hwif->output_data(drive, NULL, floppy->pc->c, 12); |
@@ -633,13 +640,10 @@ static ide_startstop_t idefloppy_issue_pc(ide_drive_t *drive, | |||
633 | if ((pc->flags & PC_FLAG_DMA_OK) && drive->using_dma) | 640 | if ((pc->flags & PC_FLAG_DMA_OK) && drive->using_dma) |
634 | dma = !hwif->dma_ops->dma_setup(drive); | 641 | dma = !hwif->dma_ops->dma_setup(drive); |
635 | 642 | ||
636 | ide_pktcmd_tf_load(drive, IDE_TFLAG_OUT_DEVICE, bcount, dma); | 643 | if (!dma) |
644 | pc->flags &= ~PC_FLAG_DMA_OK; | ||
637 | 645 | ||
638 | if (dma) { | 646 | ide_pktcmd_tf_load(drive, IDE_TFLAG_OUT_DEVICE, bcount, dma); |
639 | /* Begin DMA, if necessary */ | ||
640 | pc->flags |= PC_FLAG_DMA_IN_PROGRESS; | ||
641 | hwif->dma_ops->dma_start(drive); | ||
642 | } | ||
643 | 647 | ||
644 | if (floppy->flags & IDEFLOPPY_FLAG_DRQ_INTERRUPT) { | 648 | if (floppy->flags & IDEFLOPPY_FLAG_DRQ_INTERRUPT) { |
645 | /* Issue the packet command */ | 649 | /* Issue the packet command */ |