diff --git a/drivers/net/wireless/zydas/zd1211rw/zd_usb.c b/drivers/net/wireless/zydas/zd1211rw/zd_usb.c index 1965cd0fafc4..f77d2f11cc03 100644 --- a/drivers/net/wireless/zydas/zd1211rw/zd_usb.c +++ b/drivers/net/wireless/zydas/zd1211rw/zd_usb.c @@ -1367,20 +1367,20 @@ static int probe(struct usb_interface *intf, const struct usb_device_id *id) default: dev_dbg_f(&intf->dev, "Unknown USB speed\n"); r = -ENODEV; - goto error; + return r; } r = usb_reset_device(udev); if (r) { dev_err(&intf->dev, "couldn't reset usb device. Error number %d\n", r); - goto error; + return r; } hw = zd_mac_alloc_hw(intf); if (hw == NULL) { r = -ENOMEM; - goto error; + goto error_alloc_hw; } usb = &zd_hw_mac(hw)->chip.usb; @@ -1390,25 +1390,32 @@ static int probe(struct usb_interface *intf, const struct usb_device_id *id) if (r) { dev_dbg_f(&intf->dev, "couldn't initialize mac. Error number %d\n", r); - goto error; + goto error_preinit; } r = ieee80211_register_hw(hw); if (r) { dev_dbg_f(&intf->dev, "couldn't register device. Error number %d\n", r); - goto error; + goto error_register; } dev_dbg_f(&intf->dev, "successful\n"); dev_info(&intf->dev, "%s\n", wiphy_name(hw->wiphy)); return 0; -error: - usb_reset_device(interface_to_usbdev(intf)); - if (hw) { + +error_register: + if(hw){ zd_mac_clear(zd_hw_mac(hw)); + } +error_preinit: + if(hw){ ieee80211_free_hw(hw); } + +error_alloc_hw: + usb_reset_device(interface_to_usbdev(intf)); + return r; }