Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 125155
b: refs/heads/master
c: 4cad085
h: refs/heads/master
i:
  125153: b4d9055
  125151: 00be6a8
v: v3
  • Loading branch information
Borislav Petkov authored and Bartlomiej Zolnierkiewicz committed Jan 2, 2009
1 parent 17894d7 commit 2d3a113
Show file tree
Hide file tree
Showing 7 changed files with 47 additions and 46 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: 5f25843fa79b7c35097b0ffe8b2c5cc2428d6495
refs/heads/master: 4cad085efbce8dcc5006b0d1034089758b4fc7ba
41 changes: 38 additions & 3 deletions trunk/drivers/ide/ide-atapi.c
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
*/

#include <linux/kernel.h>
#include <linux/cdrom.h>
#include <linux/delay.h>
#include <linux/ide.h>
#include <scsi/scsi.h>
Expand Down Expand Up @@ -252,6 +253,38 @@ int ide_scsi_expiry(ide_drive_t *drive)
}
EXPORT_SYMBOL_GPL(ide_scsi_expiry);

int ide_cd_expiry(ide_drive_t *drive)
{
struct request *rq = HWGROUP(drive)->rq;
unsigned long wait = 0;

debug_log("%s: rq->cmd[0]: 0x%x\n", __func__, rq->cmd[0]);

/*
* Some commands are *slow* and normally take a long time to complete.
* Usually we can use the ATAPI "disconnect" to bypass this, but not all
* commands/drives support that. Let ide_timer_expiry keep polling us
* for these.
*/
switch (rq->cmd[0]) {
case GPCMD_BLANK:
case GPCMD_FORMAT_UNIT:
case GPCMD_RESERVE_RZONE_TRACK:
case GPCMD_CLOSE_TRACK:
case GPCMD_FLUSH_CACHE:
wait = ATAPI_WAIT_PC;
break;
default:
if (!(rq->cmd_flags & REQ_QUIET))
printk(KERN_INFO "cmd 0x%x timed out\n",
rq->cmd[0]);
wait = 0;
break;
}
return wait;
}
EXPORT_SYMBOL_GPL(ide_cd_expiry);

int ide_cd_get_xferlen(struct request *rq)
{
if (blk_fs_request(rq))
Expand Down Expand Up @@ -562,11 +595,11 @@ static ide_startstop_t ide_transfer_pc(ide_drive_t *drive)
return ide_started;
}

ide_startstop_t ide_issue_pc(ide_drive_t *drive, unsigned int timeout,
ide_expiry_t *expiry)
ide_startstop_t ide_issue_pc(ide_drive_t *drive, unsigned int timeout)
{
struct ide_atapi_pc *pc = drive->pc;
ide_hwif_t *hwif = drive->hwif;
ide_expiry_t *expiry = NULL;
u32 tf_flags;
u16 bcount;
u8 scsi = !!(drive->dev_flags & IDE_DFLAG_SCSI);
Expand All @@ -578,9 +611,11 @@ ide_startstop_t ide_issue_pc(ide_drive_t *drive, unsigned int timeout,
if (dev_is_idecd(drive)) {
tf_flags = IDE_TFLAG_OUT_NSECT | IDE_TFLAG_OUT_LBAL;
bcount = ide_cd_get_xferlen(hwif->hwgroup->rq);
expiry = ide_cd_expiry;
} else if (scsi) {
tf_flags = 0;
bcount = min(pc->req_xfer, 63 * 1024);
expiry = ide_scsi_expiry;
} else {
tf_flags = IDE_TFLAG_OUT_DEVICE;
bcount = ((drive->media == ide_tape) ?
Expand Down Expand Up @@ -613,7 +648,7 @@ ide_startstop_t ide_issue_pc(ide_drive_t *drive, unsigned int timeout,
if (drive->dma)
drive->waiting_for_dma = 0;
ide_execute_command(drive, ATA_CMD_PACKET, ide_transfer_pc,
timeout, NULL);
timeout, expiry);
return ide_started;
} else {
ide_execute_pkt_cmd(drive);
Expand Down
38 changes: 3 additions & 35 deletions trunk/drivers/ide/ide-cd.c
Original file line number Diff line number Diff line change
Expand Up @@ -511,38 +511,6 @@ static int cdrom_decode_status(ide_drive_t *drive, int good_stat, int *stat_ret)
return 1;
}

static int cdrom_timer_expiry(ide_drive_t *drive)
{
struct request *rq = HWGROUP(drive)->rq;
unsigned long wait = 0;

ide_debug_log(IDE_DBG_RQ, "Call %s: rq->cmd[0]: 0x%x\n", __func__,
rq->cmd[0]);

/*
* Some commands are *slow* and normally take a long time to complete.
* Usually we can use the ATAPI "disconnect" to bypass this, but not all
* commands/drives support that. Let ide_timer_expiry keep polling us
* for these.
*/
switch (rq->cmd[0]) {
case GPCMD_BLANK:
case GPCMD_FORMAT_UNIT:
case GPCMD_RESERVE_RZONE_TRACK:
case GPCMD_CLOSE_TRACK:
case GPCMD_FLUSH_CACHE:
wait = ATAPI_WAIT_PC;
break;
default:
if (!(rq->cmd_flags & REQ_QUIET))
printk(KERN_INFO PFX "cmd 0x%x timed out\n",
rq->cmd[0]);
wait = 0;
break;
}
return wait;
}

/*
* Set up the device registers for transferring a packet command on DEV,
* expecting to later transfer XFERLEN bytes. HANDLER is the routine
Expand Down Expand Up @@ -574,7 +542,7 @@ static ide_startstop_t cdrom_start_packet_command(ide_drive_t *drive,

/* packet command */
ide_execute_command(drive, ATA_CMD_PACKET, handler,
ATAPI_WAIT_PC, cdrom_timer_expiry);
ATAPI_WAIT_PC, ide_cd_expiry);
return ide_started;
} else {
ide_execute_pkt_cmd(drive);
Expand Down Expand Up @@ -621,7 +589,7 @@ static ide_startstop_t cdrom_transfer_packet_command(ide_drive_t *drive,
}

/* arm the interrupt handler */
ide_set_handler(drive, handler, rq->timeout, cdrom_timer_expiry);
ide_set_handler(drive, handler, rq->timeout, ide_cd_expiry);

/* ATAPI commands get padded out to 12 bytes minimum */
cmd_len = COMMAND_SIZE(rq->cmd[0]);
Expand Down Expand Up @@ -1088,7 +1056,7 @@ static ide_startstop_t cdrom_newpc_intr(ide_drive_t *drive)
} else {
timeout = ATAPI_WAIT_PC;
if (!blk_fs_request(rq))
expiry = cdrom_timer_expiry;
expiry = ide_cd_expiry;
}

ide_set_handler(drive, cdrom_newpc_intr, timeout, expiry);
Expand Down
4 changes: 0 additions & 4 deletions trunk/drivers/ide/ide-cd.h
Original file line number Diff line number Diff line change
Expand Up @@ -16,10 +16,6 @@
#define ide_debug_log(lvl, fmt, args...) do {} while (0)
#endif

/*
* typical timeout for packet command
*/
#define ATAPI_WAIT_PC (60 * HZ)
#define ATAPI_WAIT_WRITE_BUSY (10 * HZ)

/************************************************************************/
Expand Down
2 changes: 1 addition & 1 deletion trunk/drivers/ide/ide-floppy.c
Original file line number Diff line number Diff line change
Expand Up @@ -197,7 +197,7 @@ static ide_startstop_t idefloppy_issue_pc(ide_drive_t *drive,

pc->retries++;

return ide_issue_pc(drive, WAIT_FLOPPY_CMD, NULL);
return ide_issue_pc(drive, WAIT_FLOPPY_CMD);
}

void ide_floppy_create_read_capacity_cmd(struct ide_atapi_pc *pc)
Expand Down
2 changes: 1 addition & 1 deletion trunk/drivers/ide/ide-tape.c
Original file line number Diff line number Diff line change
Expand Up @@ -694,7 +694,7 @@ static ide_startstop_t idetape_issue_pc(ide_drive_t *drive,

pc->retries++;

return ide_issue_pc(drive, WAIT_TAPE_CMD, NULL);
return ide_issue_pc(drive, WAIT_TAPE_CMD);
}

/* A mode sense command is used to "sense" tape parameters. */
Expand Down
4 changes: 3 additions & 1 deletion trunk/include/linux/ide.h
Original file line number Diff line number Diff line change
Expand Up @@ -396,6 +396,7 @@ enum {
* This is used for several packet commands (not for READ/WRITE commands).
*/
#define IDE_PC_BUFFER_SIZE 256
#define ATAPI_WAIT_PC (60 * HZ)

struct ide_atapi_pc {
/* actual packet bytes */
Expand Down Expand Up @@ -1253,10 +1254,11 @@ static inline unsigned long ide_scsi_get_timeout(struct ide_atapi_pc *pc)
}

int ide_scsi_expiry(ide_drive_t *);
int ide_cd_expiry(ide_drive_t *);

int ide_cd_get_xferlen(struct request *);

ide_startstop_t ide_issue_pc(ide_drive_t *, unsigned int, ide_expiry_t *);
ide_startstop_t ide_issue_pc(ide_drive_t *, unsigned int);

ide_startstop_t do_rw_taskfile(ide_drive_t *, ide_task_t *);

Expand Down

0 comments on commit 2d3a113

Please sign in to comment.