[PATCH] use msleep() for RTAS delays
Benjamin Herrenschmidt
benh at kernel.crashing.org
Thu Jun 1 15:31:06 EST 2006
On Wed, 2006-05-31 at 14:32 -0500, John Rose wrote:
> The current use of udelay() for RTAS extended delay conditions can
> result in CPU soft lockups. The use of msleep() won't tie up the CPU.
What about putting this whole thing in a helper ? There is a few more
things I've seen floating around implementing the exact same logic (for
example Jake's MSI patches).
We could either do something like
for (;;) {
rc = rtas_call(...);
if (!rtas_check_busy(rc))
break;
}
Or something inside rtas_call
rtas_call_waitbusy(...);
Ben.
> Signed-off-by: John Rose <johnrose at austin.ibm.com>
>
> ---
>
> Thanks-
> John
>
> diff -puN arch/powerpc/kernel/rtas.c~msleep_rtas arch/powerpc/kernel/rtas.c
> --- 2_6_linus/arch/powerpc/kernel/rtas.c~msleep_rtas 2006-05-31 14:07:51.000000000 -0500
> +++ 2_6_linus-johnrose/arch/powerpc/kernel/rtas.c 2006-05-31 14:10:09.000000000 -0500
> @@ -447,10 +447,10 @@ int rtas_set_power_level(int powerdomain
> while (1) {
> rc = rtas_call(token, 2, 2, setlevel, powerdomain, level);
> if (rc == RTAS_BUSY)
> - udelay(1);
> + msleep(1);
> else if (rtas_is_extended_busy(rc)) {
> wait_time = rtas_extended_busy_delay_time(rc);
> - udelay(wait_time * 1000);
> + msleep(wait_time);
> } else
> break;
> }
> @@ -472,10 +472,10 @@ int rtas_get_sensor(int sensor, int inde
> while (1) {
> rc = rtas_call(token, 2, 2, state, sensor, index);
> if (rc == RTAS_BUSY)
> - udelay(1);
> + msleep(1);
> else if (rtas_is_extended_busy(rc)) {
> wait_time = rtas_extended_busy_delay_time(rc);
> - udelay(wait_time * 1000);
> + msleep(wait_time);
> } else
> break;
> }
> @@ -497,12 +497,11 @@ int rtas_set_indicator(int indicator, in
> while (1) {
> rc = rtas_call(token, 3, 1, NULL, indicator, index, new_value);
> if (rc == RTAS_BUSY)
> - udelay(1);
> + msleep(1);
> else if (rtas_is_extended_busy(rc)) {
> wait_time = rtas_extended_busy_delay_time(rc);
> - udelay(wait_time * 1000);
> - }
> - else
> + msleep(wait_time);
> + } else
> break;
> }
>
> diff -puN arch/powerpc/kernel/rtas_flash.c~msleep_rtas arch/powerpc/kernel/rtas_flash.c
> --- 2_6_linus/arch/powerpc/kernel/rtas_flash.c~msleep_rtas 2006-05-31 14:10:47.000000000 -0500
> +++ 2_6_linus-johnrose/arch/powerpc/kernel/rtas_flash.c 2006-05-31 14:19:30.000000000 -0500
> @@ -16,7 +16,7 @@
> #include <linux/module.h>
> #include <linux/init.h>
> #include <linux/proc_fs.h>
> -#include <asm/delay.h>
> +#include <linux/delay.h>
> #include <asm/uaccess.h>
> #include <asm/rtas.h>
> #include <asm/abs_addr.h>
> @@ -372,10 +372,10 @@ static void manage_flash(struct rtas_man
> rc = rtas_call(rtas_token("ibm,manage-flash-image"), 1,
> 1, NULL, args_buf->op);
> if (rc == RTAS_RC_BUSY)
> - udelay(1);
> + msleep(1);
> else if (rtas_is_extended_busy(rc)) {
> wait_time = rtas_extended_busy_delay_time(rc);
> - udelay(wait_time * 1000);
> + msleep(wait_time);
> } else
> break;
> }
> @@ -465,10 +465,10 @@ static void validate_flash(struct rtas_v
> spin_unlock(&rtas_data_buf_lock);
>
> if (rc == RTAS_RC_BUSY)
> - udelay(1);
> + msleep(1);
> else if (rtas_is_extended_busy(rc)) {
> wait_time = rtas_extended_busy_delay_time(rc);
> - udelay(wait_time * 1000);
> + msleep(wait_time);
> } else
> break;
> }
>
> _
>
> _______________________________________________
> Linuxppc-dev mailing list
> Linuxppc-dev at ozlabs.org
> https://ozlabs.org/mailman/listinfo/linuxppc-dev
More information about the Linuxppc-dev
mailing list