diff --git a/libfprint/core.c b/libfprint/core.c index 24a9adc..5b2a3c7 100644 --- a/libfprint/core.c +++ b/libfprint/core.c @@ -95,7 +95,8 @@ static void register_drivers(void) } } -static struct fp_driver *find_supporting_driver(struct usb_device *udev) +static struct fp_driver *find_supporting_driver(struct usb_device *udev, + unsigned long *driver_data) { GList *elem = registered_drivers; @@ -108,6 +109,7 @@ static struct fp_driver *find_supporting_driver(struct usb_device *udev) udev->descriptor.idProduct == id->product) { fp_dbg("driver %s supports USB device %04x:%04x", drv->name, id->vendor, id->product); + *driver_data = id->driver_data; return drv; } } while (elem = g_list_next(elem)); @@ -135,13 +137,15 @@ API_EXPORTED struct fp_dscv_dev **fp_discover_devs(void) * sets of drivers against small sets of USB devices */ for (bus = usb_get_busses(); bus; bus = bus->next) for (udev = bus->devices; udev; udev = udev->next) { - struct fp_driver *drv = find_supporting_driver(udev); + unsigned long driver_data; + struct fp_driver *drv = find_supporting_driver(udev, &driver_data); struct fp_dscv_dev *ddev; if (!drv) continue; ddev = g_malloc0(sizeof(*ddev)); ddev->drv = drv; ddev->udev = udev; + ddev->driver_data = driver_data; tmplist = g_list_prepend(tmplist, (gpointer) ddev); dscv_count++; } @@ -196,7 +200,7 @@ API_EXPORTED struct fp_dev *fp_dev_open(struct fp_dscv_dev *ddev) dev->__enroll_stage = -1; if (drv->init) { - r = drv->init(dev); + r = drv->init(dev, ddev->driver_data); if (r) { fp_err("device initialisation failed, driver=%s", drv->name); usb_close(udevh); diff --git a/libfprint/drivers/upekts.c b/libfprint/drivers/upekts.c index fe9042c..b0bb09d 100644 --- a/libfprint/drivers/upekts.c +++ b/libfprint/drivers/upekts.c @@ -420,7 +420,7 @@ static const unsigned char init28_0b[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00 }; -static int dev_init(struct fp_dev *dev) +static int dev_init(struct fp_dev *dev, unsigned long driver_data) { struct upekts_dev *upekdev; unsigned char dummy = 0x10; diff --git a/libfprint/fp_internal.h b/libfprint/fp_internal.h index 686d707..c017f13 100644 --- a/libfprint/fp_internal.h +++ b/libfprint/fp_internal.h @@ -102,7 +102,7 @@ struct fp_driver { void *priv; /* Device operations */ - int (*init)(struct fp_dev *dev); + int (*init)(struct fp_dev *dev, unsigned long driver_data); void (*exit)(struct fp_dev *dev); int (*enroll)(struct fp_dev *dev, gboolean initial, int stage, struct fp_print_data **print_data); @@ -123,6 +123,7 @@ void fpi_img_driver_setup(struct fp_img_driver *idriver); struct fp_dscv_dev { struct usb_device *udev; struct fp_driver *drv; + unsigned long driver_data; }; struct fp_print_data {