upekts: release interface on error condition and normal exit

This commit is contained in:
Daniel Drake 2007-10-25 15:35:10 +01:00
parent 0ac74ef649
commit 0aac3706d7

View file

@ -32,6 +32,7 @@
#include <string.h> #include <string.h>
#include <glib.h> #include <glib.h>
#include <usb.h>
#include <fp_internal.h> #include <fp_internal.h>
@ -422,7 +423,7 @@ static const unsigned char init28_0b[] = {
static int dev_init(struct fp_dev *dev, unsigned long driver_data) static int dev_init(struct fp_dev *dev, unsigned long driver_data)
{ {
struct upekts_dev *upekdev; struct upekts_dev *upekdev = NULL;
unsigned char dummy = 0x10; unsigned char dummy = 0x10;
enum read_msg_status msgstat; enum read_msg_status msgstat;
uint8_t seq; uint8_t seq;
@ -434,8 +435,10 @@ static int dev_init(struct fp_dev *dev, unsigned long driver_data)
r = usb_control_msg(dev->udev, USB_TYPE_VENDOR | USB_RECIP_DEVICE, r = usb_control_msg(dev->udev, USB_TYPE_VENDOR | USB_RECIP_DEVICE,
0x0c, 0x100, 0x400, &dummy, sizeof(dummy), TIMEOUT); 0x0c, 0x100, 0x400, &dummy, sizeof(dummy), TIMEOUT);
if (r < 0) if (r < 0) {
return r; fp_dbg("control write failed\n");
goto err;
}
upekdev = g_malloc(sizeof(*upekdev)); upekdev = g_malloc(sizeof(*upekdev));
upekdev->seq = 0xf0; /* incremented to 0x00 before first cmd */ upekdev->seq = 0xf0; /* incremented to 0x00 before first cmd */
@ -504,7 +507,9 @@ static int dev_init(struct fp_dev *dev, unsigned long driver_data)
return 0; return 0;
err: err:
usb_release_interface(dev->udev, 0);
g_free(upekdev); g_free(upekdev);
return -EPROTO; return -EPROTO;
} }
@ -518,6 +523,7 @@ static void dev_exit(struct fp_dev *dev)
// FIXME should read msg A=01 // FIXME should read msg A=01
usb_release_interface(dev->udev, 0);
g_free(dev->priv); g_free(dev->priv);
} }