ide: factor out processing of special commands from ide_special_rq()
Factor out processing of special commands from ide_special_rq() to ide_do_devset() and ide_do_park_unpark(). There should be no functional changes caused by this patch. Signed-off-by: Bartlomiej Zolnierkiewicz <bzolnier@gmail.com>
This commit is contained in:
parent
1866082339
commit
1bc6daae4a
1 changed files with 41 additions and 34 deletions
|
@ -514,46 +514,53 @@ int ide_devset_execute(ide_drive_t *drive, const struct ide_devset *setting,
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static ide_startstop_t ide_do_devset(ide_drive_t *drive, struct request *rq)
|
||||||
|
{
|
||||||
|
int err, (*setfunc)(ide_drive_t *, int) = rq->special;
|
||||||
|
|
||||||
|
err = setfunc(drive, *(int *)&rq->cmd[1]);
|
||||||
|
if (err)
|
||||||
|
rq->errors = err;
|
||||||
|
else
|
||||||
|
err = 1;
|
||||||
|
ide_end_request(drive, err, 0);
|
||||||
|
return ide_stopped;
|
||||||
|
}
|
||||||
|
|
||||||
|
static ide_startstop_t ide_do_park_unpark(ide_drive_t *drive, struct request *rq)
|
||||||
|
{
|
||||||
|
ide_task_t task;
|
||||||
|
struct ide_taskfile *tf = &task.tf;
|
||||||
|
|
||||||
|
memset(&task, 0, sizeof(task));
|
||||||
|
if (rq->cmd[0] == REQ_PARK_HEADS) {
|
||||||
|
drive->sleep = *(unsigned long *)rq->special;
|
||||||
|
drive->dev_flags |= IDE_DFLAG_SLEEPING;
|
||||||
|
tf->command = ATA_CMD_IDLEIMMEDIATE;
|
||||||
|
tf->feature = 0x44;
|
||||||
|
tf->lbal = 0x4c;
|
||||||
|
tf->lbam = 0x4e;
|
||||||
|
tf->lbah = 0x55;
|
||||||
|
task.tf_flags |= IDE_TFLAG_CUSTOM_HANDLER;
|
||||||
|
} else /* cmd == REQ_UNPARK_HEADS */
|
||||||
|
tf->command = ATA_CMD_CHK_POWER;
|
||||||
|
|
||||||
|
task.tf_flags |= IDE_TFLAG_TF | IDE_TFLAG_DEVICE;
|
||||||
|
task.rq = rq;
|
||||||
|
drive->hwif->data_phase = task.data_phase = TASKFILE_NO_DATA;
|
||||||
|
return do_rw_taskfile(drive, &task);
|
||||||
|
}
|
||||||
|
|
||||||
static ide_startstop_t ide_special_rq(ide_drive_t *drive, struct request *rq)
|
static ide_startstop_t ide_special_rq(ide_drive_t *drive, struct request *rq)
|
||||||
{
|
{
|
||||||
u8 cmd = rq->cmd[0];
|
u8 cmd = rq->cmd[0];
|
||||||
|
|
||||||
if (cmd == REQ_PARK_HEADS || cmd == REQ_UNPARK_HEADS) {
|
|
||||||
ide_task_t task;
|
|
||||||
struct ide_taskfile *tf = &task.tf;
|
|
||||||
|
|
||||||
memset(&task, 0, sizeof(task));
|
|
||||||
if (cmd == REQ_PARK_HEADS) {
|
|
||||||
drive->sleep = *(unsigned long *)rq->special;
|
|
||||||
drive->dev_flags |= IDE_DFLAG_SLEEPING;
|
|
||||||
tf->command = ATA_CMD_IDLEIMMEDIATE;
|
|
||||||
tf->feature = 0x44;
|
|
||||||
tf->lbal = 0x4c;
|
|
||||||
tf->lbam = 0x4e;
|
|
||||||
tf->lbah = 0x55;
|
|
||||||
task.tf_flags |= IDE_TFLAG_CUSTOM_HANDLER;
|
|
||||||
} else /* cmd == REQ_UNPARK_HEADS */
|
|
||||||
tf->command = ATA_CMD_CHK_POWER;
|
|
||||||
|
|
||||||
task.tf_flags |= IDE_TFLAG_TF | IDE_TFLAG_DEVICE;
|
|
||||||
task.rq = rq;
|
|
||||||
drive->hwif->data_phase = task.data_phase = TASKFILE_NO_DATA;
|
|
||||||
return do_rw_taskfile(drive, &task);
|
|
||||||
}
|
|
||||||
|
|
||||||
switch (cmd) {
|
switch (cmd) {
|
||||||
|
case REQ_PARK_HEADS:
|
||||||
|
case REQ_UNPARK_HEADS:
|
||||||
|
return ide_do_park_unpark(drive, rq);
|
||||||
case REQ_DEVSET_EXEC:
|
case REQ_DEVSET_EXEC:
|
||||||
{
|
return ide_do_devset(drive, rq);
|
||||||
int err, (*setfunc)(ide_drive_t *, int) = rq->special;
|
|
||||||
|
|
||||||
err = setfunc(drive, *(int *)&rq->cmd[1]);
|
|
||||||
if (err)
|
|
||||||
rq->errors = err;
|
|
||||||
else
|
|
||||||
err = 1;
|
|
||||||
ide_end_request(drive, err, 0);
|
|
||||||
return ide_stopped;
|
|
||||||
}
|
|
||||||
case REQ_DRIVE_RESET:
|
case REQ_DRIVE_RESET:
|
||||||
return ide_do_reset(drive);
|
return ide_do_reset(drive);
|
||||||
default:
|
default:
|
||||||
|
|
Loading…
Add table
Reference in a new issue