aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/usb/gadget/printer.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/usb/gadget/printer.c')
-rw-r--r--drivers/usb/gadget/printer.c47
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
797static int 796static int
798printer_fsync(struct file *fd, int datasync) 797printer_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}