|
|
@@ -401,6 +401,7 @@ static int smsusb_init_device(struct usb_interface *intf, int board_id)
|
|
|
struct smsusb_device_t *dev;
|
|
|
void *mdev;
|
|
|
int i, rc;
|
|
|
+ int in_maxp;
|
|
|
|
|
|
/* create device object */
|
|
|
dev = kzalloc(sizeof(struct smsusb_device_t), GFP_KERNEL);
|
|
|
@@ -412,6 +413,24 @@ static int smsusb_init_device(struct usb_interface *intf, int board_id)
|
|
|
dev->udev = interface_to_usbdev(intf);
|
|
|
dev->state = SMSUSB_DISCONNECTED;
|
|
|
|
|
|
+ for (i = 0; i < intf->cur_altsetting->desc.bNumEndpoints; i++) {
|
|
|
+ struct usb_endpoint_descriptor *desc =
|
|
|
+ &intf->cur_altsetting->endpoint[i].desc;
|
|
|
+
|
|
|
+ if (desc->bEndpointAddress & USB_DIR_IN) {
|
|
|
+ dev->in_ep = desc->bEndpointAddress;
|
|
|
+ in_maxp = usb_endpoint_maxp(desc);
|
|
|
+ } else {
|
|
|
+ dev->out_ep = desc->bEndpointAddress;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ pr_debug("in_ep = %02x, out_ep = %02x\n", dev->in_ep, dev->out_ep);
|
|
|
+ if (!dev->in_ep || !dev->out_ep) { /* Missing endpoints? */
|
|
|
+ smsusb_term_device(intf);
|
|
|
+ return -ENODEV;
|
|
|
+ }
|
|
|
+
|
|
|
params.device_type = sms_get_board(board_id)->type;
|
|
|
|
|
|
switch (params.device_type) {
|
|
|
@@ -426,24 +445,12 @@ static int smsusb_init_device(struct usb_interface *intf, int board_id)
|
|
|
/* fall-thru */
|
|
|
default:
|
|
|
dev->buffer_size = USB2_BUFFER_SIZE;
|
|
|
- dev->response_alignment =
|
|
|
- le16_to_cpu(dev->udev->ep_in[1]->desc.wMaxPacketSize) -
|
|
|
- sizeof(struct sms_msg_hdr);
|
|
|
+ dev->response_alignment = in_maxp - sizeof(struct sms_msg_hdr);
|
|
|
|
|
|
params.flags |= SMS_DEVICE_FAMILY2;
|
|
|
break;
|
|
|
}
|
|
|
|
|
|
- for (i = 0; i < intf->cur_altsetting->desc.bNumEndpoints; i++) {
|
|
|
- if (intf->cur_altsetting->endpoint[i].desc. bEndpointAddress & USB_DIR_IN)
|
|
|
- dev->in_ep = intf->cur_altsetting->endpoint[i].desc.bEndpointAddress;
|
|
|
- else
|
|
|
- dev->out_ep = intf->cur_altsetting->endpoint[i].desc.bEndpointAddress;
|
|
|
- }
|
|
|
-
|
|
|
- pr_debug("in_ep = %02x, out_ep = %02x\n",
|
|
|
- dev->in_ep, dev->out_ep);
|
|
|
-
|
|
|
params.device = &dev->udev->dev;
|
|
|
params.usb_device = dev->udev;
|
|
|
params.buffer_size = dev->buffer_size;
|