Returns error code from 'vnt_int_start_interrupt()' so the device's private buffers will be correctly freed and 'struct ieee80211_hw' start function will return an error code.
Signed-off-by: Quentin Deslandes <quentin.deslan...@itdev.co.uk> --- v2: instead of removing status variable, returns its value to caller and handle error in caller. drivers/staging/vt6656/int.c | 4 +++- drivers/staging/vt6656/int.h | 2 +- drivers/staging/vt6656/main_usb.c | 12 +++++++++--- 3 files changed, 13 insertions(+), 5 deletions(-) diff --git a/drivers/staging/vt6656/int.c b/drivers/staging/vt6656/int.c index 504424b19fcf..f3ee2198e1b3 100644 --- a/drivers/staging/vt6656/int.c +++ b/drivers/staging/vt6656/int.c @@ -39,7 +39,7 @@ static const u8 fallback_rate1[5][5] = { {RATE_54M, RATE_54M, RATE_36M, RATE_18M, RATE_18M} }; -void vnt_int_start_interrupt(struct vnt_private *priv) +int vnt_int_start_interrupt(struct vnt_private *priv) { unsigned long flags; int status; @@ -51,6 +51,8 @@ void vnt_int_start_interrupt(struct vnt_private *priv) status = vnt_start_interrupt_urb(priv); spin_unlock_irqrestore(&priv->lock, flags); + + return status; } static int vnt_int_report_rate(struct vnt_private *priv, u8 pkt_no, u8 tsr) diff --git a/drivers/staging/vt6656/int.h b/drivers/staging/vt6656/int.h index 987c454e99e9..8a6d60569ceb 100644 --- a/drivers/staging/vt6656/int.h +++ b/drivers/staging/vt6656/int.h @@ -41,7 +41,7 @@ struct vnt_interrupt_data { u8 sw[2]; } __packed; -void vnt_int_start_interrupt(struct vnt_private *priv); +int vnt_int_start_interrupt(struct vnt_private *priv); void vnt_int_process_data(struct vnt_private *priv); #endif /* __INT_H__ */ diff --git a/drivers/staging/vt6656/main_usb.c b/drivers/staging/vt6656/main_usb.c index ccafcc2c87ac..71e10b9ae253 100644 --- a/drivers/staging/vt6656/main_usb.c +++ b/drivers/staging/vt6656/main_usb.c @@ -483,6 +483,7 @@ static void vnt_tx_80211(struct ieee80211_hw *hw, static int vnt_start(struct ieee80211_hw *hw) { + int err = 0; struct vnt_private *priv = hw->priv; priv->rx_buf_sz = MAX_TOTAL_SIZE_WITH_ALL_HEADERS; @@ -496,15 +497,20 @@ static int vnt_start(struct ieee80211_hw *hw) if (vnt_init_registers(priv) == false) { dev_dbg(&priv->usb->dev, " init register fail\n"); + err = -ENOMEM; goto free_all; } - if (vnt_key_init_table(priv)) + if (vnt_key_init_table(priv)) { + err = -ENOMEM; goto free_all; + } priv->int_interval = 1; /* bInterval is set to 1 */ - vnt_int_start_interrupt(priv); + err = vnt_int_start_interrupt(priv); + if (err) + goto free_all; ieee80211_wake_queues(hw); @@ -518,7 +524,7 @@ static int vnt_start(struct ieee80211_hw *hw) usb_kill_urb(priv->interrupt_urb); usb_free_urb(priv->interrupt_urb); - return -ENOMEM; + return err; } static void vnt_stop(struct ieee80211_hw *hw) -- 2.17.1