2012-05-02 20:10:20

by joseph daniel

[permalink] [raw]
Subject: staging/rtl8712: unhandled default case in SwLedOn function.

Hi kernel developers,

In the function SwLedOn in rtl8712_led.c, we put the bLedOn = true,
even if its a default case. may be we need to return? or BUG()?.

the code listing is:

if ((padapter->bSurpriseRemoved == true) ||
(padapter->bDriverStopped == true))
return;
LedCfg = r8712_read8(padapter, LEDCFG);
switch (pLed->LedPin) {
case LED_PIN_GPIO0:
break;
case LED_PIN_LED0:
/* SW control led0 on.*/
r8712_write8(padapter, LEDCFG, LedCfg&0xf0);
break;
case LED_PIN_LED1:
/* SW control led1 on.*/
r8712_write8(padapter, LEDCFG, LedCfg&0x0f);
break;
default:
break;
}
pLed->bLedOn = true;

Thanks,
Dev.


2012-05-02 20:12:42

by joseph daniel

[permalink] [raw]
Subject: Re: staging/rtl8712: unhandled default case in SwLedOn function.

On Thu, May 3, 2012 at 2:10 AM, joseph daniel
<[email protected]> wrote:
> Hi kernel developers,
>
> In the function SwLedOn in rtl8712_led.c, we put the bLedOn = true,
> even if its a default case. may be we need to return? or BUG()?.
>
> the code listing is:
>
> if ((padapter->bSurpriseRemoved == true) ||
> ? ? ? ?(padapter->bDriverStopped == true))
> ? ? ? ?return;
> ? ?LedCfg = r8712_read8(padapter, LEDCFG);
> ? ?switch (pLed->LedPin) {
> ? ?case LED_PIN_GPIO0:
> ? ? ? ?break;
> ? ?case LED_PIN_LED0:
> ? ? ? ?/* SW control led0 on.*/
> ? ? ? ?r8712_write8(padapter, LEDCFG, LedCfg&0xf0);
> ? ? ? ?break;
> ? ?case LED_PIN_LED1:
> ? ? ? ?/* SW control led1 on.*/
> ? ? ? ?r8712_write8(padapter, LEDCFG, LedCfg&0x0f);
> ? ? ? ?break;
> ? ?default:
/* at this point of the code */
> ? ? ? /*?break; */
return; /* or */
/* BUG(); */ /*since we may not be getting into here */
> ? ?}
> ? ?pLed->bLedOn = true;
>
Thanks.

2012-05-02 20:20:37

by Greg Kroah-Hartman

[permalink] [raw]
Subject: Re: staging/rtl8712: unhandled default case in SwLedOn function.

On Thu, May 03, 2012 at 02:12:39AM +0600, joseph daniel wrote:
> On Thu, May 3, 2012 at 2:10 AM, joseph daniel
> <[email protected]> wrote:
> > Hi kernel developers,
> >
> > In the function SwLedOn in rtl8712_led.c, we put the bLedOn = true,
> > even if its a default case. may be we need to return? or BUG()?.
> >
> > the code listing is:
> >
> > if ((padapter->bSurpriseRemoved == true) ||
> > ? ? ? ?(padapter->bDriverStopped == true))
> > ? ? ? ?return;
> > ? ?LedCfg = r8712_read8(padapter, LEDCFG);
> > ? ?switch (pLed->LedPin) {
> > ? ?case LED_PIN_GPIO0:
> > ? ? ? ?break;
> > ? ?case LED_PIN_LED0:
> > ? ? ? ?/* SW control led0 on.*/
> > ? ? ? ?r8712_write8(padapter, LEDCFG, LedCfg&0xf0);
> > ? ? ? ?break;
> > ? ?case LED_PIN_LED1:
> > ? ? ? ?/* SW control led1 on.*/
> > ? ? ? ?r8712_write8(padapter, LEDCFG, LedCfg&0x0f);
> > ? ? ? ?break;
> > ? ?default:
> /* at this point of the code */
> > ? ? ? /*?break; */
> return; /* or */
> /* BUG(); */ /*since we may not be getting into here */

Never crash the kernel in a driver, that's just rude. Error out
properly if something unexpected happens.

thanks,

greg k-h

2012-05-02 20:37:06

by Larry Finger

[permalink] [raw]
Subject: Re: staging/rtl8712: unhandled default case in SwLedOn function.

On 05/02/2012 03:12 PM, joseph daniel wrote:
> On Thu, May 3, 2012 at 2:10 AM, joseph daniel
> <[email protected]> wrote:
>> Hi kernel developers,
>>
>> In the function SwLedOn in rtl8712_led.c, we put the bLedOn = true,
>> even if its a default case. may be we need to return? or BUG()?.
>>
>> the code listing is:
>>
>> if ((padapter->bSurpriseRemoved == true) ||
>> (padapter->bDriverStopped == true))
>> return;
>> LedCfg = r8712_read8(padapter, LEDCFG);
>> switch (pLed->LedPin) {
>> case LED_PIN_GPIO0:
>> break;
>> case LED_PIN_LED0:
>> /* SW control led0 on.*/
>> r8712_write8(padapter, LEDCFG, LedCfg&0xf0);
>> break;
>> case LED_PIN_LED1:
>> /* SW control led1 on.*/
>> r8712_write8(padapter, LEDCFG, LedCfg&0x0f);
>> break;
>> default:
> /* at this point of the code */
>> /* break; */
> return; /* or */
> /* BUG(); */ /*since we may not be getting into here */
>> }
>> pLed->bLedOn = true;
>>

This should do:

Index: staging/drivers/staging/rtl8712/rtl8712_led.c
===================================================================
--- staging.orig/drivers/staging/rtl8712/rtl8712_led.c
+++ staging/drivers/staging/rtl8712/rtl8712_led.c
@@ -137,7 +137,8 @@ static void SwLedOn(struct _adapter *pad
r8712_write8(padapter, LEDCFG, LedCfg&0x0f);
break;
default:
- break;
+ WARN_ONCE(1, "Default branch taken in %s\n", __func__);
+ return;
}
pLed->bLedOn = true;
}

If you agree, then I will push the patch to Greg.

Larry

2012-05-03 03:35:35

by joseph daniel

[permalink] [raw]
Subject: Re: staging/rtl8712: unhandled default case in SwLedOn function.

On Thu, May 3, 2012 at 2:36 AM, Larry Finger <[email protected]> wrote:
> On 05/02/2012 03:12 PM, joseph daniel wrote:
>>
>> On Thu, May 3, 2012 at 2:10 AM, joseph daniel
>> <[email protected]> ?wrote:
>>>
>>> Hi kernel developers,
>>>
>>> In the function SwLedOn in rtl8712_led.c, we put the bLedOn = true,
>>> even if its a default case. may be we need to return? or BUG()?.
>>>
>>> the code listing is:
>>>
>>> if ((padapter->bSurpriseRemoved == true) ||
>>> ? ? ? ?(padapter->bDriverStopped == true))
>>> ? ? ? ?return;
>>> ? ?LedCfg = r8712_read8(padapter, LEDCFG);
>>> ? ?switch (pLed->LedPin) {
>>> ? ?case LED_PIN_GPIO0:
>>> ? ? ? ?break;
>>> ? ?case LED_PIN_LED0:
>>> ? ? ? ?/* SW control led0 on.*/
>>> ? ? ? ?r8712_write8(padapter, LEDCFG, LedCfg&0xf0);
>>> ? ? ? ?break;
>>> ? ?case LED_PIN_LED1:
>>> ? ? ? ?/* SW control led1 on.*/
>>> ? ? ? ?r8712_write8(padapter, LEDCFG, LedCfg&0x0f);
>>> ? ? ? ?break;
>>> ? ?default:
>>
>> /* at this point of the code */
>>>
>>> ? ? ? /* break; */
>>
>> ? ? ? ? ?return; /* or */
>> ? ? ? ? ?/* BUG(); */ /*since we may not be getting into here */
>>>
>>> ? ?}
>>> ? ?pLed->bLedOn = true;
>>>
>
> This should do:
>
> Index: staging/drivers/staging/rtl8712/rtl8712_led.c
> ===================================================================
> --- staging.orig/drivers/staging/rtl8712/rtl8712_led.c
> +++ staging/drivers/staging/rtl8712/rtl8712_led.c
> @@ -137,7 +137,8 @@ static void SwLedOn(struct _adapter *pad
>
> ? ? ? ? ? ? ? ?r8712_write8(padapter, LEDCFG, LedCfg&0x0f);
> ? ? ? ? ? ? ? ?break;
> ? ? ? ?default:
> - ? ? ? ? ? ? ? break;
> + ? ? ? ? ? ? ? WARN_ONCE(1, "Default branch taken in %s\n", __func__);
> + ? ? ? ? ? ? ? return;
> ? ? ? ?}
> ? ? ? ?pLed->bLedOn = true;
> ?}
>
> If you agree, then I will push the patch to Greg.
>
Agreed. Thanks Greg and Larry.
Acked-by: [email protected]

> Larry


Thanks,

2012-05-03 07:23:48

by Dan Carpenter

[permalink] [raw]
Subject: Re: staging/rtl8712: unhandled default case in SwLedOn function.

> This should do:
>
> Index: staging/drivers/staging/rtl8712/rtl8712_led.c
> ===================================================================
> --- staging.orig/drivers/staging/rtl8712/rtl8712_led.c
> +++ staging/drivers/staging/rtl8712/rtl8712_led.c
> @@ -137,7 +137,8 @@ static void SwLedOn(struct _adapter *pad
> r8712_write8(padapter, LEDCFG, LedCfg&0x0f);
> break;
> default:
> - break;
> + WARN_ONCE(1, "Default branch taken in %s\n", __func__);
> + return;
> }
> pLed->bLedOn = true;
> }
>

Don't just reflexively add extra debug code.

In this case pLed->LedPin is either LED_PIN_LED0 or LED_PIN_LED1.
The LED_PIN_GPIO0 and default cases are never used. Even if it were
I think we would want to set pLed->bLedOn = true in the default
case.

The code is ugly as pants, but it works fine as is.

regards,
dan carpenter