/* --------------------------------------------------------------------- */ static int dabusb_probe (struct usb_interface *intf, const struct usb_device_id *id) { struct usb_device *usbdev = interface_to_usbdev(intf); int retval; pdabusb_t s; dbg("dabusb: probe: vendor id 0x%x, device id 0x%x ifnum:%d", usbdev->descriptor.idVendor, usbdev->descriptor.idProduct, intf->altsetting->desc.bInterfaceNumber); /* We don't handle multiple configurations */ if (usbdev->descriptor.bNumConfigurations != 1) return -ENODEV; if (intf->altsetting->desc.bInterfaceNumber != _DABUSB_IF && usbdev->descriptor.idProduct == 0x9999) return -ENODEV; s = &dabusb[intf->minor]; down (&s->mutex); s->remove_pending = 0; s->usbdev = usbdev; s->devnum = intf->minor; if (usb_reset_configuration (usbdev) < 0) { err("reset_configuration failed"); goto reject; } if (usbdev->descriptor.idProduct == 0x2131) { dabusb_loadmem (s, NULL); goto reject; } else { dabusb_fpga_download (s, NULL); if (usb_set_interface (s->usbdev, _DABUSB_IF, 0) < 0) { err("set_interface failed"); goto reject; } } dbg("bound to interface: %d", intf->altsetting->desc.bInterfaceNumber); usb_set_intfdata (intf, s); up (&s->mutex); retval = usb_register_dev(intf, &dabusb_class); if (retval) { usb_set_intfdata (intf, NULL); return -ENOMEM; } return 0; reject: up (&s->mutex); s->usbdev = NULL; return -ENODEV; }
/* --------------------------------------------------------------------- */ static void *dabusb_probe (struct usb_device *usbdev, unsigned int ifnum) { int devnum; pdabusb_t s; dbg("dabusb: probe: vendor id 0x%x, device id 0x%x ifnum:%d", usbdev->descriptor.idVendor, usbdev->descriptor.idProduct, ifnum); /* the 1234:5678 is just a self assigned test ID */ if ((usbdev->descriptor.idVendor != 0x0547 || usbdev->descriptor.idProduct != 0x2131) && (usbdev->descriptor.idVendor != 0x0547 || usbdev->descriptor.idProduct != 0x9999)) return NULL; /* We don't handle multiple configurations */ if (usbdev->descriptor.bNumConfigurations != 1) return NULL; if (ifnum != _DABUSB_IF && usbdev->descriptor.idProduct == 0x9999) return NULL; devnum = dabusb_find_struct (); if (devnum == -1) return NULL; s = &dabusb[devnum]; down (&s->mutex); s->remove_pending = 0; s->usbdev = usbdev; if (usb_set_configuration (usbdev, usbdev->config[0].bConfigurationValue) < 0) { err("set_configuration failed"); goto reject; } if (usbdev->descriptor.idProduct == 0x2131) { dabusb_loadmem (s, NULL); goto reject; } else { dabusb_fpga_download (s, NULL); if (usb_set_interface (s->usbdev, _DABUSB_IF, 0) < 0) { err("set_interface failed"); goto reject; } } dbg("bound to interface: %d", ifnum); up (&s->mutex); MOD_INC_USE_COUNT; return s; reject: up (&s->mutex); s->usbdev = NULL; return NULL; }