2004-06-22 12:17:55

by Jens Axboe

[permalink] [raw]
Subject: [PATCH] idle ide disk on resume

Hi,

I need this patch to survive suspend on my powerbook, if the drive is
sleeping when suspend is entered. Otherwise it freezes on resume when it
tries to read from the drive.

===== drivers/ide/ide-disk.c 1.86 vs edited =====
--- 1.86/drivers/ide/ide-disk.c 2004-06-05 22:15:29 +02:00
+++ edited/drivers/ide/ide-disk.c 2004-06-22 14:15:08 +02:00
@@ -1334,7 +1334,8 @@
idedisk_pm_flush_cache = ide_pm_state_start_suspend,
idedisk_pm_standby,

- idedisk_pm_restore_dma = ide_pm_state_start_resume,
+ idedisk_pm_idle = ide_pm_state_start_resume,
+ idedisk_pm_restore_dma,
};

static void idedisk_complete_power_step (ide_drive_t *drive, struct request *rq, u8 stat, u8 error)
@@ -1349,6 +1350,9 @@
case idedisk_pm_standby: /* Suspend step 2 (standby) complete */
rq->pm->pm_step = ide_pm_state_completed;
break;
+ case idedisk_pm_idle: /* resume step 1, idle drive */
+ rq->pm->pm_step = idedisk_pm_restore_dma;
+ break;
}
}

@@ -1376,6 +1380,12 @@
args->tfRegister[IDE_COMMAND_OFFSET] = WIN_STANDBYNOW1;
args->command_type = IDE_DRIVE_TASK_NO_DATA;
args->handler = &task_no_data_intr;
+ return do_rw_taskfile(drive, args);
+
+ case idedisk_pm_idle:
+ args->tfRegister[IDE_COMMAND_OFFSET] = WIN_IDLEIMMEDIATE;
+ args->command_type = IDE_DRIVE_TASK_NO_DATA;
+ args->handler = task_no_data_intr;
return do_rw_taskfile(drive, args);

case idedisk_pm_restore_dma: /* Resume step 1 (restore DMA) */

--
Jens Axboe


2004-06-22 13:47:17

by Benjamin Herrenschmidt

[permalink] [raw]
Subject: Re: [PATCH] idle ide disk on resume

On Tue, 2004-06-22 at 07:17, Jens Axboe wrote:
> Hi,
>
> I need this patch to survive suspend on my powerbook, if the drive is
> sleeping when suspend is entered. Otherwise it freezes on resume when it
> tries to read from the drive.

Interesting, I didn't experience that, I suppose I never suspended the
machine with the disk sleeping ;)

Looks good though, Bart, can you submit to Linus / Andrew please ?

Ben.

> ===== drivers/ide/ide-disk.c 1.86 vs edited =====
> --- 1.86/drivers/ide/ide-disk.c 2004-06-05 22:15:29 +02:00
> +++ edited/drivers/ide/ide-disk.c 2004-06-22 14:15:08 +02:00
> @@ -1334,7 +1334,8 @@
> idedisk_pm_flush_cache = ide_pm_state_start_suspend,
> idedisk_pm_standby,
>
> - idedisk_pm_restore_dma = ide_pm_state_start_resume,
> + idedisk_pm_idle = ide_pm_state_start_resume,
> + idedisk_pm_restore_dma,
> };
>
> static void idedisk_complete_power_step (ide_drive_t *drive, struct request *rq, u8 stat, u8 error)
> @@ -1349,6 +1350,9 @@
> case idedisk_pm_standby: /* Suspend step 2 (standby) complete */
> rq->pm->pm_step = ide_pm_state_completed;
> break;
> + case idedisk_pm_idle: /* resume step 1, idle drive */
> + rq->pm->pm_step = idedisk_pm_restore_dma;
> + break;
> }
> }
>
> @@ -1376,6 +1380,12 @@
> args->tfRegister[IDE_COMMAND_OFFSET] = WIN_STANDBYNOW1;
> args->command_type = IDE_DRIVE_TASK_NO_DATA;
> args->handler = &task_no_data_intr;
> + return do_rw_taskfile(drive, args);
> +
> + case idedisk_pm_idle:
> + args->tfRegister[IDE_COMMAND_OFFSET] = WIN_IDLEIMMEDIATE;
> + args->command_type = IDE_DRIVE_TASK_NO_DATA;
> + args->handler = task_no_data_intr;
> return do_rw_taskfile(drive, args);
>
> case idedisk_pm_restore_dma: /* Resume step 1 (restore DMA) */
--
Benjamin Herrenschmidt <[email protected]>