diff options
author | Pekka Enberg <penberg@cs.helsinki.fi> | 2009-04-08 04:14:00 -0400 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@suse.de> | 2009-06-19 14:00:37 -0400 |
commit | a39ee671746b6483c6a259fef755a4a3e475e3e4 (patch) | |
tree | 94a2be12816f509ff25ded741cbf36647651eb39 /drivers/staging/winbond | |
parent | 00e2e05dd08bc15b09514f5ce35f0b9a3534e9ba (diff) |
Staging: w35und: more simplify hal_init_hardware() error handling
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>
Diffstat (limited to 'drivers/staging/winbond')
-rw-r--r-- | drivers/staging/winbond/wbusb.c | 17 |
1 files changed, 10 insertions, 7 deletions
diff --git a/drivers/staging/winbond/wbusb.c b/drivers/staging/winbond/wbusb.c index 4ce2e5af959..fc2566afbd2 100644 --- a/drivers/staging/winbond/wbusb.c +++ b/drivers/staging/winbond/wbusb.c | |||
@@ -488,15 +488,15 @@ static int hal_init_hardware(struct ieee80211_hw *hw) | |||
488 | 488 | ||
489 | pHwData->InitialResource = 1; | 489 | pHwData->InitialResource = 1; |
490 | if (!Wb35Reg_initial(pHwData)) | 490 | if (!Wb35Reg_initial(pHwData)) |
491 | goto error; | 491 | goto error_reg_destroy; |
492 | 492 | ||
493 | pHwData->InitialResource = 2; | 493 | pHwData->InitialResource = 2; |
494 | if (!Wb35Tx_initial(pHwData)) | 494 | if (!Wb35Tx_initial(pHwData)) |
495 | goto error; | 495 | goto error_tx_destroy; |
496 | 496 | ||
497 | pHwData->InitialResource = 3; | 497 | pHwData->InitialResource = 3; |
498 | if (!Wb35Rx_initial(pHwData)) | 498 | if (!Wb35Rx_initial(pHwData)) |
499 | goto error; | 499 | goto error_rx_destroy; |
500 | 500 | ||
501 | pHwData->InitialResource = 4; | 501 | pHwData->InitialResource = 4; |
502 | init_timer(&pHwData->LEDTimer); | 502 | init_timer(&pHwData->LEDTimer); |
@@ -522,7 +522,13 @@ static int hal_init_hardware(struct ieee80211_hw *hw) | |||
522 | 522 | ||
523 | return 0; | 523 | return 0; |
524 | 524 | ||
525 | error: | 525 | error_rx_destroy: |
526 | Wb35Rx_destroy(pHwData); | ||
527 | error_tx_destroy: | ||
528 | Wb35Tx_destroy(pHwData); | ||
529 | error_reg_destroy: | ||
530 | Wb35Reg_destroy(pHwData); | ||
531 | |||
526 | pHwData->SurpriseRemove = 1; | 532 | pHwData->SurpriseRemove = 1; |
527 | return -EINVAL; | 533 | return -EINVAL; |
528 | } | 534 | } |
@@ -617,11 +623,8 @@ static int wb35_hw_init(struct ieee80211_hw *hw) | |||
617 | hal_driver_init_OK(pHwData) = 1; // Notify hal that the driver is ready now. | 623 | hal_driver_init_OK(pHwData) = 1; // Notify hal that the driver is ready now. |
618 | //set a tx power for reference..... | 624 | //set a tx power for reference..... |
619 | // sme_set_tx_power_level(priv, 12); FIXME? | 625 | // sme_set_tx_power_level(priv, 12); FIXME? |
620 | return 0; | ||
621 | 626 | ||
622 | error: | 627 | error: |
623 | hal_halt(pHwData, NULL); | ||
624 | |||
625 | return err; | 628 | return err; |
626 | } | 629 | } |
627 | 630 | ||