aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/ide/ide-atapi.c
diff options
context:
space:
mode:
authorBartlomiej Zolnierkiewicz <bzolnier@gmail.com>2008-07-15 15:22:00 -0400
committerBartlomiej Zolnierkiewicz <bzolnier@gmail.com>2008-07-15 15:22:00 -0400
commit6bf1641ca1c7554f0da54aaf89788731b541bacc (patch)
treece7c371971e68b650d87e67935e460c948f4cb20 /drivers/ide/ide-atapi.c
parent28c7214bd8c2bbd4873b8f1e7f58d86d3731124f (diff)
ide: add ide_issue_pc() helper
Add generic ide_issue_pc() helper to ide-atapi.c and then convert ide-{floppy,tape,scsi} device drivers to use it. There should be no functional changes caused by this patch. Cc: Borislav Petkov <petkovbb@gmail.com> Signed-off-by: Bartlomiej Zolnierkiewicz <bzolnier@gmail.com>
Diffstat (limited to 'drivers/ide/ide-atapi.c')
-rw-r--r--drivers/ide/ide-atapi.c49
1 files changed, 49 insertions, 0 deletions
diff --git a/drivers/ide/ide-atapi.c b/drivers/ide/ide-atapi.c
index 25939bc60402..932a83abaf06 100644
--- a/drivers/ide/ide-atapi.c
+++ b/drivers/ide/ide-atapi.c
@@ -68,3 +68,52 @@ ide_startstop_t ide_transfer_pc(ide_drive_t *drive, struct ide_atapi_pc *pc,
68 return ide_started; 68 return ide_started;
69} 69}
70EXPORT_SYMBOL_GPL(ide_transfer_pc); 70EXPORT_SYMBOL_GPL(ide_transfer_pc);
71
72ide_startstop_t ide_issue_pc(ide_drive_t *drive, struct ide_atapi_pc *pc,
73 ide_handler_t *handler, unsigned int timeout,
74 ide_expiry_t *expiry)
75{
76 ide_hwif_t *hwif = drive->hwif;
77 u16 bcount;
78 u8 dma = 0;
79
80 /* We haven't transferred any data yet */
81 pc->xferred = 0;
82 pc->cur_pos = pc->buf;
83
84 /* Request to transfer the entire buffer at once */
85 if (drive->media == ide_tape && !drive->scsi)
86 bcount = pc->req_xfer;
87 else
88 bcount = min(pc->req_xfer, 63 * 1024);
89
90 if (pc->flags & PC_FLAG_DMA_ERROR) {
91 pc->flags &= ~PC_FLAG_DMA_ERROR;
92 ide_dma_off(drive);
93 }
94
95 if ((pc->flags & PC_FLAG_DMA_OK) && drive->using_dma) {
96 if (drive->scsi)
97 hwif->sg_mapped = 1;
98 dma = !hwif->dma_ops->dma_setup(drive);
99 if (drive->scsi)
100 hwif->sg_mapped = 0;
101 }
102
103 if (!dma)
104 pc->flags &= ~PC_FLAG_DMA_OK;
105
106 ide_pktcmd_tf_load(drive, drive->scsi ? 0 : IDE_TFLAG_OUT_DEVICE,
107 bcount, dma);
108
109 /* Issue the packet command */
110 if (pc->flags & PC_FLAG_DRQ_INTERRUPT) {
111 ide_execute_command(drive, WIN_PACKETCMD, handler,
112 timeout, NULL);
113 return ide_started;
114 } else {
115 ide_execute_pkt_cmd(drive);
116 return (*handler)(drive);
117 }
118}
119EXPORT_SYMBOL_GPL(ide_issue_pc);