Staging: w35und: more simplify hal_init_hardware() error handling
authorPekka Enberg <penberg@cs.helsinki.fi>
Wed, 8 Apr 2009 08:14:00 +0000 (11:14 +0300)
committerGreg Kroah-Hartman <gregkh@suse.de>
Fri, 19 Jun 2009 18:00:37 +0000 (11:00 -0700)
Impact: fix, cleanup

If initialization in hal_init_hardware() fails, we call hal_halt() to
clean up and release resource. However, hal_halt() will attempt to
call del_timer_sync() on ->LEDTimer on "stage 3" although it's not
initialized at that point. Fix that up by simplifying error handling
logic in hal_init_hardware() with gotos.

Acked-by: Pavel Machek <pavel@ucw.cz>
Signed-off-by: Pekka Enberg <penberg@cs.helsinki.fi>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
drivers/staging/winbond/wbusb.c

index 4ce2e5af95912887909d25aee4ff68dccb523798..fc2566afbd2167e0d9e731ebe03f4dcb0156f7a8 100644 (file)
@@ -488,15 +488,15 @@ static int hal_init_hardware(struct ieee80211_hw *hw)
 
        pHwData->InitialResource = 1;
        if (!Wb35Reg_initial(pHwData))
-               goto error;
+               goto error_reg_destroy;
 
        pHwData->InitialResource = 2;
        if (!Wb35Tx_initial(pHwData))
-               goto error;
+               goto error_tx_destroy;
 
        pHwData->InitialResource = 3;
        if (!Wb35Rx_initial(pHwData))
-               goto error;
+               goto error_rx_destroy;
 
        pHwData->InitialResource = 4;
        init_timer(&pHwData->LEDTimer);
@@ -522,7 +522,13 @@ static int hal_init_hardware(struct ieee80211_hw *hw)
 
        return 0;
 
-error:
+error_rx_destroy:
+       Wb35Rx_destroy(pHwData);
+error_tx_destroy:
+       Wb35Tx_destroy(pHwData);
+error_reg_destroy:
+       Wb35Reg_destroy(pHwData);
+
        pHwData->SurpriseRemove = 1;
        return -EINVAL;
 }
@@ -617,11 +623,8 @@ static int wb35_hw_init(struct ieee80211_hw *hw)
        hal_driver_init_OK(pHwData) = 1; // Notify hal that the driver is ready now.
        //set a tx power for reference.....
 //     sme_set_tx_power_level(priv, 12);       FIXME?
-       return 0;
 
 error:
-       hal_halt(pHwData, NULL);
-
        return err;
 }