struct usb_device *usbdev;
        struct ufx_data *dev;
        struct fb_info *info;
-       int retval;
+       int retval = -ENOMEM;
        u32 id_rev, fpga_rev;
 
        /* usb initialization */
 
        if (!ufx_alloc_urb_list(dev, WRITES_IN_FLIGHT, MAX_TRANSFER)) {
                dev_err(dev->gdev, "ufx_alloc_urb_list failed\n");
-               goto e_nomem;
+               goto put_ref;
        }
 
        /* We don't register a new USB class. Our client interface is fbdev */
 
        /* allocates framebuffer driver structure, not framebuffer memory */
        info = framebuffer_alloc(0, &usbdev->dev);
-       if (!info)
-               goto e_nomem;
+       if (!info) {
+               dev_err(dev->gdev, "framebuffer_alloc failed\n");
+               goto free_urb_list;
+       }
 
        dev->info = info;
        info->par = dev;
        check_warn_goto_error(retval, "unable to find common mode for display and adapter");
 
        retval = ufx_reg_set_bits(dev, 0x4000, 0x00000001);
-       check_warn_goto_error(retval, "error %d enabling graphics engine", retval);
+       if (retval < 0) {
+               dev_err(dev->gdev, "error %d enabling graphics engine", retval);
+               goto setup_modes;
+       }
 
        /* ready to begin using device */
        atomic_set(&dev->usb_active, 1);
 
        dev_dbg(dev->gdev, "checking var");
        retval = ufx_ops_check_var(&info->var, info);
-       check_warn_goto_error(retval, "error %d ufx_ops_check_var", retval);
+       if (retval < 0) {
+               dev_err(dev->gdev, "error %d ufx_ops_check_var", retval);
+               goto reset_active;
+       }
 
        dev_dbg(dev->gdev, "setting par");
        retval = ufx_ops_set_par(info);
-       check_warn_goto_error(retval, "error %d ufx_ops_set_par", retval);
+       if (retval < 0) {
+               dev_err(dev->gdev, "error %d ufx_ops_set_par", retval);
+               goto reset_active;
+       }
 
        dev_dbg(dev->gdev, "registering framebuffer");
        retval = register_framebuffer(info);
-       check_warn_goto_error(retval, "error %d register_framebuffer", retval);
+       if (retval < 0) {
+               dev_err(dev->gdev, "error %d register_framebuffer", retval);
+               goto reset_active;
+       }
 
        dev_info(dev->gdev, "SMSC UDX USB device /dev/fb%d attached. %dx%d resolution."
                " Using %dK framebuffer memory\n", info->node,
 
        return 0;
 
-error:
-       fb_dealloc_cmap(&info->cmap);
-destroy_modedb:
+reset_active:
+       atomic_set(&dev->usb_active, 0);
+setup_modes:
        fb_destroy_modedb(info->monspecs.modedb);
        vfree(info->screen_base);
        fb_destroy_modelist(&info->modelist);
+error:
+       fb_dealloc_cmap(&info->cmap);
+destroy_modedb:
        framebuffer_release(info);
+free_urb_list:
+       if (dev->urbs.count > 0)
+               ufx_free_urb_list(dev);
 put_ref:
        kref_put(&dev->kref, ufx_free); /* ref for framebuffer */
        kref_put(&dev->kref, ufx_free); /* last ref from kref_init */
        return retval;
-
-e_nomem:
-       retval = -ENOMEM;
-       goto put_ref;
 }
 
 static void ufx_usb_disconnect(struct usb_interface *interface)