diff options
Diffstat (limited to 'drivers/usb/core/devio.c')
-rw-r--r-- | drivers/usb/core/devio.c | 38 |
1 files changed, 21 insertions, 17 deletions
diff --git a/drivers/usb/core/devio.c b/drivers/usb/core/devio.c index 545da37afca7..3f8e06279c92 100644 --- a/drivers/usb/core/devio.c +++ b/drivers/usb/core/devio.c | |||
@@ -515,19 +515,19 @@ static int check_ctrlrecip(struct dev_state *ps, unsigned int requesttype, unsig | |||
515 | 515 | ||
516 | static struct usb_device *usbdev_lookup_minor(int minor) | 516 | static struct usb_device *usbdev_lookup_minor(int minor) |
517 | { | 517 | { |
518 | struct class_device *class_dev; | 518 | struct device *device; |
519 | struct usb_device *dev = NULL; | 519 | struct usb_device *udev = NULL; |
520 | 520 | ||
521 | down(&usb_device_class->sem); | 521 | down(&usb_device_class->sem); |
522 | list_for_each_entry(class_dev, &usb_device_class->children, node) { | 522 | list_for_each_entry(device, &usb_device_class->devices, node) { |
523 | if (class_dev->devt == MKDEV(USB_DEVICE_MAJOR, minor)) { | 523 | if (device->devt == MKDEV(USB_DEVICE_MAJOR, minor)) { |
524 | dev = class_dev->class_data; | 524 | udev = device->platform_data; |
525 | break; | 525 | break; |
526 | } | 526 | } |
527 | } | 527 | } |
528 | up(&usb_device_class->sem); | 528 | up(&usb_device_class->sem); |
529 | 529 | ||
530 | return dev; | 530 | return udev; |
531 | }; | 531 | }; |
532 | 532 | ||
533 | /* | 533 | /* |
@@ -823,8 +823,7 @@ static int proc_connectinfo(struct dev_state *ps, void __user *arg) | |||
823 | 823 | ||
824 | static int proc_resetdevice(struct dev_state *ps) | 824 | static int proc_resetdevice(struct dev_state *ps) |
825 | { | 825 | { |
826 | return usb_reset_device(ps->dev); | 826 | return usb_reset_composite_device(ps->dev, NULL); |
827 | |||
828 | } | 827 | } |
829 | 828 | ||
830 | static int proc_setintf(struct dev_state *ps, void __user *arg) | 829 | static int proc_setintf(struct dev_state *ps, void __user *arg) |
@@ -923,8 +922,8 @@ static int proc_do_submiturb(struct dev_state *ps, struct usbdevfs_urb *uurb, | |||
923 | if ((ep->desc.bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) | 922 | if ((ep->desc.bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) |
924 | != USB_ENDPOINT_XFER_CONTROL) | 923 | != USB_ENDPOINT_XFER_CONTROL) |
925 | return -EINVAL; | 924 | return -EINVAL; |
926 | /* min 8 byte setup packet, max arbitrary */ | 925 | /* min 8 byte setup packet, max 8 byte setup plus an arbitrary data stage */ |
927 | if (uurb->buffer_length < 8 || uurb->buffer_length > PAGE_SIZE) | 926 | if (uurb->buffer_length < 8 || uurb->buffer_length > (8 + MAX_USBFS_BUFFER_SIZE)) |
928 | return -EINVAL; | 927 | return -EINVAL; |
929 | if (!(dr = kmalloc(sizeof(struct usb_ctrlrequest), GFP_KERNEL))) | 928 | if (!(dr = kmalloc(sizeof(struct usb_ctrlrequest), GFP_KERNEL))) |
930 | return -ENOMEM; | 929 | return -ENOMEM; |
@@ -982,7 +981,8 @@ static int proc_do_submiturb(struct dev_state *ps, struct usbdevfs_urb *uurb, | |||
982 | return -EFAULT; | 981 | return -EFAULT; |
983 | } | 982 | } |
984 | for (totlen = u = 0; u < uurb->number_of_packets; u++) { | 983 | for (totlen = u = 0; u < uurb->number_of_packets; u++) { |
985 | if (isopkt[u].length > 1023) { | 984 | /* arbitrary limit, sufficient for USB 2.0 high-bandwidth iso */ |
985 | if (isopkt[u].length > 8192) { | ||
986 | kfree(isopkt); | 986 | kfree(isopkt); |
987 | return -EINVAL; | 987 | return -EINVAL; |
988 | } | 988 | } |
@@ -1078,7 +1078,9 @@ static int proc_submiturb(struct dev_state *ps, void __user *arg) | |||
1078 | if (copy_from_user(&uurb, arg, sizeof(uurb))) | 1078 | if (copy_from_user(&uurb, arg, sizeof(uurb))) |
1079 | return -EFAULT; | 1079 | return -EFAULT; |
1080 | 1080 | ||
1081 | return proc_do_submiturb(ps, &uurb, (((struct usbdevfs_urb __user *)arg)->iso_frame_desc), arg); | 1081 | return proc_do_submiturb(ps, &uurb, |
1082 | (struct usbdevfs_iso_packet_desc __user *)uurb.iso_frame_desc, | ||
1083 | arg); | ||
1082 | } | 1084 | } |
1083 | 1085 | ||
1084 | static int proc_unlinkurb(struct dev_state *ps, void __user *arg) | 1086 | static int proc_unlinkurb(struct dev_state *ps, void __user *arg) |
@@ -1203,7 +1205,9 @@ static int proc_submiturb_compat(struct dev_state *ps, void __user *arg) | |||
1203 | if (get_urb32(&uurb,(struct usbdevfs_urb32 *)arg)) | 1205 | if (get_urb32(&uurb,(struct usbdevfs_urb32 *)arg)) |
1204 | return -EFAULT; | 1206 | return -EFAULT; |
1205 | 1207 | ||
1206 | return proc_do_submiturb(ps, &uurb, ((struct usbdevfs_urb32 __user *)arg)->iso_frame_desc, arg); | 1208 | return proc_do_submiturb(ps, &uurb, |
1209 | (struct usbdevfs_iso_packet_desc __user *)uurb.iso_frame_desc, | ||
1210 | arg); | ||
1207 | } | 1211 | } |
1208 | 1212 | ||
1209 | static int processcompl_compat(struct async *as, void __user * __user *arg) | 1213 | static int processcompl_compat(struct async *as, void __user * __user *arg) |
@@ -1576,16 +1580,16 @@ static void usbdev_add(struct usb_device *dev) | |||
1576 | { | 1580 | { |
1577 | int minor = ((dev->bus->busnum-1) * 128) + (dev->devnum-1); | 1581 | int minor = ((dev->bus->busnum-1) * 128) + (dev->devnum-1); |
1578 | 1582 | ||
1579 | dev->class_dev = class_device_create(usb_device_class, NULL, | 1583 | dev->usbfs_dev = device_create(usb_device_class, &dev->dev, |
1580 | MKDEV(USB_DEVICE_MAJOR, minor), &dev->dev, | 1584 | MKDEV(USB_DEVICE_MAJOR, minor), |
1581 | "usbdev%d.%d", dev->bus->busnum, dev->devnum); | 1585 | "usbdev%d.%d", dev->bus->busnum, dev->devnum); |
1582 | 1586 | ||
1583 | dev->class_dev->class_data = dev; | 1587 | dev->usbfs_dev->platform_data = dev; |
1584 | } | 1588 | } |
1585 | 1589 | ||
1586 | static void usbdev_remove(struct usb_device *dev) | 1590 | static void usbdev_remove(struct usb_device *dev) |
1587 | { | 1591 | { |
1588 | class_device_unregister(dev->class_dev); | 1592 | device_unregister(dev->usbfs_dev); |
1589 | } | 1593 | } |
1590 | 1594 | ||
1591 | static int usbdev_notify(struct notifier_block *self, unsigned long action, | 1595 | static int usbdev_notify(struct notifier_block *self, unsigned long action, |