diff options
Diffstat (limited to 'drivers/usb/gadget/printer.c')
-rw-r--r-- | drivers/usb/gadget/printer.c | 47 |
1 files changed, 28 insertions, 19 deletions
diff --git a/drivers/usb/gadget/printer.c b/drivers/usb/gadget/printer.c index 271ef94668e..0c06d8000ef 100644 --- a/drivers/usb/gadget/printer.c +++ b/drivers/usb/gadget/printer.c | |||
@@ -89,8 +89,7 @@ struct printer_dev { | |||
89 | u8 config; | 89 | u8 config; |
90 | s8 interface; | 90 | s8 interface; |
91 | struct usb_ep *in_ep, *out_ep; | 91 | struct usb_ep *in_ep, *out_ep; |
92 | const struct usb_endpoint_descriptor | 92 | |
93 | *in, *out; | ||
94 | struct list_head rx_reqs; /* List of free RX structs */ | 93 | struct list_head rx_reqs; /* List of free RX structs */ |
95 | struct list_head rx_reqs_active; /* List of Active RX xfers */ | 94 | struct list_head rx_reqs_active; /* List of Active RX xfers */ |
96 | struct list_head rx_buffers; /* List of completed xfers */ | 95 | struct list_head rx_buffers; /* List of completed xfers */ |
@@ -795,12 +794,14 @@ printer_write(struct file *fd, const char __user *buf, size_t len, loff_t *ptr) | |||
795 | } | 794 | } |
796 | 795 | ||
797 | static int | 796 | static int |
798 | printer_fsync(struct file *fd, int datasync) | 797 | printer_fsync(struct file *fd, loff_t start, loff_t end, int datasync) |
799 | { | 798 | { |
800 | struct printer_dev *dev = fd->private_data; | 799 | struct printer_dev *dev = fd->private_data; |
800 | struct inode *inode = fd->f_path.dentry->d_inode; | ||
801 | unsigned long flags; | 801 | unsigned long flags; |
802 | int tx_list_empty; | 802 | int tx_list_empty; |
803 | 803 | ||
804 | mutex_lock(&inode->i_mutex); | ||
804 | spin_lock_irqsave(&dev->lock, flags); | 805 | spin_lock_irqsave(&dev->lock, flags); |
805 | tx_list_empty = (likely(list_empty(&dev->tx_reqs))); | 806 | tx_list_empty = (likely(list_empty(&dev->tx_reqs))); |
806 | spin_unlock_irqrestore(&dev->lock, flags); | 807 | spin_unlock_irqrestore(&dev->lock, flags); |
@@ -810,6 +811,7 @@ printer_fsync(struct file *fd, int datasync) | |||
810 | wait_event_interruptible(dev->tx_flush_wait, | 811 | wait_event_interruptible(dev->tx_flush_wait, |
811 | (likely(list_empty(&dev->tx_reqs_active)))); | 812 | (likely(list_empty(&dev->tx_reqs_active)))); |
812 | } | 813 | } |
814 | mutex_unlock(&inode->i_mutex); | ||
813 | 815 | ||
814 | return 0; | 816 | return 0; |
815 | } | 817 | } |
@@ -895,19 +897,20 @@ set_printer_interface(struct printer_dev *dev) | |||
895 | { | 897 | { |
896 | int result = 0; | 898 | int result = 0; |
897 | 899 | ||
898 | dev->in = ep_desc(dev->gadget, &hs_ep_in_desc, &fs_ep_in_desc); | 900 | dev->in_ep->desc = ep_desc(dev->gadget, &hs_ep_in_desc, &fs_ep_in_desc); |
899 | dev->in_ep->driver_data = dev; | 901 | dev->in_ep->driver_data = dev; |
900 | 902 | ||
901 | dev->out = ep_desc(dev->gadget, &hs_ep_out_desc, &fs_ep_out_desc); | 903 | dev->out_ep->desc = ep_desc(dev->gadget, &hs_ep_out_desc, |
904 | &fs_ep_out_desc); | ||
902 | dev->out_ep->driver_data = dev; | 905 | dev->out_ep->driver_data = dev; |
903 | 906 | ||
904 | result = usb_ep_enable(dev->in_ep, dev->in); | 907 | result = usb_ep_enable(dev->in_ep); |
905 | if (result != 0) { | 908 | if (result != 0) { |
906 | DBG(dev, "enable %s --> %d\n", dev->in_ep->name, result); | 909 | DBG(dev, "enable %s --> %d\n", dev->in_ep->name, result); |
907 | goto done; | 910 | goto done; |
908 | } | 911 | } |
909 | 912 | ||
910 | result = usb_ep_enable(dev->out_ep, dev->out); | 913 | result = usb_ep_enable(dev->out_ep); |
911 | if (result != 0) { | 914 | if (result != 0) { |
912 | DBG(dev, "enable %s --> %d\n", dev->in_ep->name, result); | 915 | DBG(dev, "enable %s --> %d\n", dev->in_ep->name, result); |
913 | goto done; | 916 | goto done; |
@@ -918,8 +921,8 @@ done: | |||
918 | if (result != 0) { | 921 | if (result != 0) { |
919 | (void) usb_ep_disable(dev->in_ep); | 922 | (void) usb_ep_disable(dev->in_ep); |
920 | (void) usb_ep_disable(dev->out_ep); | 923 | (void) usb_ep_disable(dev->out_ep); |
921 | dev->in = NULL; | 924 | dev->in_ep->desc = NULL; |
922 | dev->out = NULL; | 925 | dev->out_ep->desc = NULL; |
923 | } | 926 | } |
924 | 927 | ||
925 | /* caller is responsible for cleanup on error */ | 928 | /* caller is responsible for cleanup on error */ |
@@ -933,12 +936,14 @@ static void printer_reset_interface(struct printer_dev *dev) | |||
933 | 936 | ||
934 | DBG(dev, "%s\n", __func__); | 937 | DBG(dev, "%s\n", __func__); |
935 | 938 | ||
936 | if (dev->in) | 939 | if (dev->in_ep->desc) |
937 | usb_ep_disable(dev->in_ep); | 940 | usb_ep_disable(dev->in_ep); |
938 | 941 | ||
939 | if (dev->out) | 942 | if (dev->out_ep->desc) |
940 | usb_ep_disable(dev->out_ep); | 943 | usb_ep_disable(dev->out_ep); |
941 | 944 | ||
945 | dev->in_ep->desc = NULL; | ||
946 | dev->out_ep->desc = NULL; | ||
942 | dev->interface = -1; | 947 | dev->interface = -1; |
943 | } | 948 | } |
944 | 949 | ||
@@ -1104,9 +1109,9 @@ static void printer_soft_reset(struct printer_dev *dev) | |||
1104 | list_add(&req->list, &dev->tx_reqs); | 1109 | list_add(&req->list, &dev->tx_reqs); |
1105 | } | 1110 | } |
1106 | 1111 | ||
1107 | if (usb_ep_enable(dev->in_ep, dev->in)) | 1112 | if (usb_ep_enable(dev->in_ep)) |
1108 | DBG(dev, "Failed to enable USB in_ep\n"); | 1113 | DBG(dev, "Failed to enable USB in_ep\n"); |
1109 | if (usb_ep_enable(dev->out_ep, dev->out)) | 1114 | if (usb_ep_enable(dev->out_ep)) |
1110 | DBG(dev, "Failed to enable USB out_ep\n"); | 1115 | DBG(dev, "Failed to enable USB out_ep\n"); |
1111 | 1116 | ||
1112 | wake_up_interruptible(&dev->rx_wait); | 1117 | wake_up_interruptible(&dev->rx_wait); |
@@ -1146,6 +1151,8 @@ printer_setup(struct usb_gadget *gadget, const struct usb_ctrlrequest *ctrl) | |||
1146 | switch (wValue >> 8) { | 1151 | switch (wValue >> 8) { |
1147 | 1152 | ||
1148 | case USB_DT_DEVICE: | 1153 | case USB_DT_DEVICE: |
1154 | device_desc.bMaxPacketSize0 = | ||
1155 | gadget->ep0->maxpacket; | ||
1149 | value = min(wLength, (u16) sizeof device_desc); | 1156 | value = min(wLength, (u16) sizeof device_desc); |
1150 | memcpy(req->buf, &device_desc, value); | 1157 | memcpy(req->buf, &device_desc, value); |
1151 | break; | 1158 | break; |
@@ -1153,6 +1160,12 @@ printer_setup(struct usb_gadget *gadget, const struct usb_ctrlrequest *ctrl) | |||
1153 | case USB_DT_DEVICE_QUALIFIER: | 1160 | case USB_DT_DEVICE_QUALIFIER: |
1154 | if (!gadget->is_dualspeed) | 1161 | if (!gadget->is_dualspeed) |
1155 | break; | 1162 | break; |
1163 | /* | ||
1164 | * assumes ep0 uses the same value for both | ||
1165 | * speeds | ||
1166 | */ | ||
1167 | dev_qualifier.bMaxPacketSize0 = | ||
1168 | gadget->ep0->maxpacket; | ||
1156 | value = min(wLength, | 1169 | value = min(wLength, |
1157 | (u16) sizeof dev_qualifier); | 1170 | (u16) sizeof dev_qualifier); |
1158 | memcpy(req->buf, &dev_qualifier, value); | 1171 | memcpy(req->buf, &dev_qualifier, value); |
@@ -1448,15 +1461,11 @@ autoconf_fail: | |||
1448 | out_ep->driver_data = out_ep; /* claim */ | 1461 | out_ep->driver_data = out_ep; /* claim */ |
1449 | 1462 | ||
1450 | #ifdef CONFIG_USB_GADGET_DUALSPEED | 1463 | #ifdef CONFIG_USB_GADGET_DUALSPEED |
1451 | /* assumes ep0 uses the same value for both speeds ... */ | 1464 | /* assumes that all endpoints are dual-speed */ |
1452 | dev_qualifier.bMaxPacketSize0 = device_desc.bMaxPacketSize0; | ||
1453 | |||
1454 | /* and that all endpoints are dual-speed */ | ||
1455 | hs_ep_in_desc.bEndpointAddress = fs_ep_in_desc.bEndpointAddress; | 1465 | hs_ep_in_desc.bEndpointAddress = fs_ep_in_desc.bEndpointAddress; |
1456 | hs_ep_out_desc.bEndpointAddress = fs_ep_out_desc.bEndpointAddress; | 1466 | hs_ep_out_desc.bEndpointAddress = fs_ep_out_desc.bEndpointAddress; |
1457 | #endif /* DUALSPEED */ | 1467 | #endif /* DUALSPEED */ |
1458 | 1468 | ||
1459 | device_desc.bMaxPacketSize0 = gadget->ep0->maxpacket; | ||
1460 | usb_gadget_set_selfpowered(gadget); | 1469 | usb_gadget_set_selfpowered(gadget); |
1461 | 1470 | ||
1462 | if (gadget->is_otg) { | 1471 | if (gadget->is_otg) { |
@@ -1602,7 +1611,7 @@ cleanup(void) | |||
1602 | if (status) | 1611 | if (status) |
1603 | ERROR(dev, "usb_gadget_unregister_driver %x\n", status); | 1612 | ERROR(dev, "usb_gadget_unregister_driver %x\n", status); |
1604 | 1613 | ||
1605 | unregister_chrdev_region(g_printer_devno, 2); | 1614 | unregister_chrdev_region(g_printer_devno, 1); |
1606 | class_destroy(usb_gadget_class); | 1615 | class_destroy(usb_gadget_class); |
1607 | mutex_unlock(&usb_printer_gadget.lock_printer_io); | 1616 | mutex_unlock(&usb_printer_gadget.lock_printer_io); |
1608 | } | 1617 | } |