Patchwork [v2] Fix RTAS watchdog driver temperature read functionality

login
register
mail settings
Submitter Adrian Reber
Date March 26, 2009, 12:05 p.m.
Message ID <20090326120542.GD24889@lisas.de>
Download mbox | patch
Permalink /patch/25144/
State Accepted, archived
Commit 5ba762c9bb3ce2cc11e9e111cb3c476e84b91668
Headers show

Comments

Adrian Reber - March 26, 2009, 12:05 p.m.
Using the RTAS watchdog driver to read out the temperature crashes
on a PXCAB:

Unable to handle kernel paging request for data at address 0xfe347b50
Faulting instruction address: 0xc00000000001af64
Oops: Kernel access of bad area, sig: 11 [#1]

The wrong usage of "(void *)__pa(&temperature)" in rtas_call() is
removed by using the function rtas_get_sensor() which does the
right thing.

Signed-off-by: Adrian Reber <adrian@lisas.de>
---
v2: use rtas_get_sensor(); typo fixed
---
 drivers/watchdog/wdrtas.c |    8 +++-----
 1 files changed, 3 insertions(+), 5 deletions(-)
Adrian Reber - June 11, 2009, 10:52 a.m.
I forgot about this patch. Can this still be merged?


On Thu, Mar 26, 2009 at 01:05:42PM +0100, Adrian Reber wrote:
> Using the RTAS watchdog driver to read out the temperature crashes
> on a PXCAB:
> 
> Unable to handle kernel paging request for data at address 0xfe347b50
> Faulting instruction address: 0xc00000000001af64
> Oops: Kernel access of bad area, sig: 11 [#1]
> 
> The wrong usage of "(void *)__pa(&temperature)" in rtas_call() is
> removed by using the function rtas_get_sensor() which does the
> right thing.
> 
> Signed-off-by: Adrian Reber <adrian@lisas.de>
> ---
> v2: use rtas_get_sensor(); typo fixed
> ---
>  drivers/watchdog/wdrtas.c |    8 +++-----
>  1 files changed, 3 insertions(+), 5 deletions(-)
> 
> diff --git a/drivers/watchdog/wdrtas.c b/drivers/watchdog/wdrtas.c
> index 5d3b1a8..a9f00dc 100644
> --- a/drivers/watchdog/wdrtas.c
> +++ b/drivers/watchdog/wdrtas.c
> @@ -214,16 +214,14 @@ static void wdrtas_timer_keepalive(void)
>   */
>  static int wdrtas_get_temperature(void)
>  {
> -	long result;
> +	int result;
>  	int temperature = 0;
>  
> -	result = rtas_call(wdrtas_token_get_sensor_state, 2, 2,
> -			   (void *)__pa(&temperature),
> -			   WDRTAS_THERMAL_SENSOR, 0);
> +	result = rtas_get_sensor(WDRTAS_THERMAL_SENSOR, 0, &temperature);
>  
>  	if (result < 0)
>  		printk(KERN_WARNING "wdrtas: reading the thermal sensor "
> -		       "faild: %li\n", result);
> +		       "failed: %i\n", result);
>  	else
>  		temperature = ((temperature * 9) / 5) + 32; /* fahrenheit */
>  
> -- 
> 1.5.6.6
Utz Bacher - June 25, 2009, 11:22 a.m.
Adrian Reber wrote on 11.06.2009 12:52:17:
> 
> I forgot about this patch. Can this still be merged?
> 
> 
> On Thu, Mar 26, 2009 at 01:05:42PM +0100, Adrian Reber wrote:
> > Using the RTAS watchdog driver to read out the temperature crashes
> > on a PXCAB:
> > 
> > Unable to handle kernel paging request for data at address 0xfe347b50
> > Faulting instruction address: 0xc00000000001af64
> > Oops: Kernel access of bad area, sig: 11 [#1]
> > 
> > The wrong usage of "(void *)__pa(&temperature)" in rtas_call() is
> > removed by using the function rtas_get_sensor() which does the
> > right thing.
> > 
> > Signed-off-by: Adrian Reber <adrian@lisas.de>
> > ---
> > v2: use rtas_get_sensor(); typo fixed
> > ---
> >  drivers/watchdog/wdrtas.c |    8 +++-----
> >  1 files changed, 3 insertions(+), 5 deletions(-)
> > 
> > diff --git a/drivers/watchdog/wdrtas.c b/drivers/watchdog/wdrtas.c
> > index 5d3b1a8..a9f00dc 100644
> > --- a/drivers/watchdog/wdrtas.c
> > +++ b/drivers/watchdog/wdrtas.c
> > @@ -214,16 +214,14 @@ static void wdrtas_timer_keepalive(void)
> >   */
> >  static int wdrtas_get_temperature(void)
> >  {
> > -   long result;
> > +   int result;
> >     int temperature = 0;
> > 
> > -   result = rtas_call(wdrtas_token_get_sensor_state, 2, 2,
> > -            (void *)__pa(&temperature),
> > -            WDRTAS_THERMAL_SENSOR, 0);
> > +   result = rtas_get_sensor(WDRTAS_THERMAL_SENSOR, 0, &temperature);
> > 
> >     if (result < 0)
> >        printk(KERN_WARNING "wdrtas: reading the thermal sensor "
> > -             "faild: %li\n", result);
> > +             "failed: %i\n", result);
> >     else
> >        temperature = ((temperature * 9) / 5) + 32; /* fahrenheit */
> > 
> > -- 
> > 1.5.6.6

makes sense. Second version also looks good to me -- thanks!

Acked-by: Utz Bacher <utz.bacher@de.ibm.com>

Utz

:wq

Patch

diff --git a/drivers/watchdog/wdrtas.c b/drivers/watchdog/wdrtas.c
index 5d3b1a8..a9f00dc 100644
--- a/drivers/watchdog/wdrtas.c
+++ b/drivers/watchdog/wdrtas.c
@@ -214,16 +214,14 @@  static void wdrtas_timer_keepalive(void)
  */
 static int wdrtas_get_temperature(void)
 {
-	long result;
+	int result;
 	int temperature = 0;
 
-	result = rtas_call(wdrtas_token_get_sensor_state, 2, 2,
-			   (void *)__pa(&temperature),
-			   WDRTAS_THERMAL_SENSOR, 0);
+	result = rtas_get_sensor(WDRTAS_THERMAL_SENSOR, 0, &temperature);
 
 	if (result < 0)
 		printk(KERN_WARNING "wdrtas: reading the thermal sensor "
-		       "faild: %li\n", result);
+		       "failed: %i\n", result);
 	else
 		temperature = ((temperature * 9) / 5) + 32; /* fahrenheit */