diff options
author | Bartlomiej Zolnierkiewicz <bzolnier@gmail.com> | 2008-07-15 15:21:51 -0400 |
---|---|---|
committer | Bartlomiej Zolnierkiewicz <bzolnier@gmail.com> | 2008-07-15 15:21:51 -0400 |
commit | b3d96afccf8b5c67b66a61efb88c53ff029c6611 (patch) | |
tree | 879275e500e2f0ac597252996a71a19d73cd6b90 /drivers/scsi/ide-scsi.c | |
parent | 63f5abb0959337db0d5bece9cefba03cdcadec51 (diff) |
ide-scsi: fix race in idescsi_transfer_pc()
Start DMA engine before sending content of packet command (otherwise
it is possible that IRQ will happen before DMA engine is started).
Cc: Borislav Petkov <petkovbb@gmail.com>
Signed-off-by: Bartlomiej Zolnierkiewicz <bzolnier@gmail.com>
Diffstat (limited to 'drivers/scsi/ide-scsi.c')
-rw-r--r-- | drivers/scsi/ide-scsi.c | 7 |
1 files changed, 4 insertions, 3 deletions
diff --git a/drivers/scsi/ide-scsi.c b/drivers/scsi/ide-scsi.c index 569ffde6d047..2553ef4d5a91 100644 --- a/drivers/scsi/ide-scsi.c +++ b/drivers/scsi/ide-scsi.c | |||
@@ -494,13 +494,14 @@ static ide_startstop_t idescsi_transfer_pc(ide_drive_t *drive) | |||
494 | /* Set the interrupt routine */ | 494 | /* Set the interrupt routine */ |
495 | ide_set_handler(drive, &idescsi_pc_intr, get_timeout(pc), idescsi_expiry); | 495 | ide_set_handler(drive, &idescsi_pc_intr, get_timeout(pc), idescsi_expiry); |
496 | 496 | ||
497 | /* Send the actual packet */ | ||
498 | hwif->output_data(drive, NULL, scsi->pc->c, 12); | ||
499 | |||
500 | if (pc->flags & PC_FLAG_DMA_OK) { | 497 | if (pc->flags & PC_FLAG_DMA_OK) { |
501 | pc->flags |= PC_FLAG_DMA_IN_PROGRESS; | 498 | pc->flags |= PC_FLAG_DMA_IN_PROGRESS; |
502 | hwif->dma_ops->dma_start(drive); | 499 | hwif->dma_ops->dma_start(drive); |
503 | } | 500 | } |
501 | |||
502 | /* Send the actual packet */ | ||
503 | hwif->output_data(drive, NULL, scsi->pc->c, 12); | ||
504 | |||
504 | return ide_started; | 505 | return ide_started; |
505 | } | 506 | } |
506 | 507 | ||