History

Merge tag 'usb-3.9-rc3' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/usb

Pull USB fixes from Greg Kroah-Hartman: "Here are a number of USB fixes that resolve issues that have been reported against 3.9-rc3." * tag 'usb-3.9-rc3' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/usb: (37 commits) USB: ti_usb_3410_5052: fix use-after-free in TIOCMIWAIT USB: ssu100: fix use-after-free in TIOCMIWAIT USB: spcp8x5: fix use-after-free in TIOCMIWAIT USB: quatech2: fix use-after-free in TIOCMIWAIT USB: pl2303: fix use-after-free in TIOCMIWAIT USB: oti6858: fix use-after-free in TIOCMIWAIT USB: mos7840: fix use-after-free in TIOCMIWAIT USB: mos7840: fix broken TIOCMIWAIT USB: mct_u232: fix use-after-free in TIOCMIWAIT USB: io_ti: fix use-after-free in TIOCMIWAIT USB: io_edgeport: fix use-after-free in TIOCMIWAIT USB: ftdi_sio: fix use-after-free in TIOCMIWAIT USB: f81232: fix use-after-free in TIOCMIWAIT USB: cypress_m8: fix use-after-free in TIOCMIWAIT USB: ch341: fix use-after-free in TIOCMIWAIT USB: ark3116: fix use-after-free in TIOCMIWAIT USB: serial: add modem-status-change wait queue USB: serial: fix interface refcounting USB: io_ti: fix get_icount for two port adapters USB: garmin_gps: fix memory leak on disconnect ...

Linus Torvalds committed 13 years ago

Commit 8f46c502 parents 70dc52f fc98ab836 files · +202 −115Browse files

Unified · Split

36 files
  1. drivers/usb/class/cdc-acm.c +19 −3
  2. drivers/usb/core/hcd-pci.c +14 −9
  3. drivers/usb/gadget/f_rndis.c +1 −2
  4. drivers/usb/gadget/g_ffs.c +2 −2
  5. drivers/usb/gadget/net2272.c +8 −1
  6. drivers/usb/gadget/net2280.c +7 −1
  7. drivers/usb/gadget/u_serial.c +1 −1
  8. drivers/usb/gadget/udc-core.c +1 −1
  9. drivers/usb/host/ehci-hcd.c +1 −0
  10. drivers/usb/host/ehci-hub.c +1 −1
  11. drivers/usb/host/ehci-q.c +13 −0
  12. drivers/usb/host/ehci-timer.c +1 −1
  13. drivers/usb/host/xhci.c +2 −1
  14. drivers/usb/host/xhci.h +2 −2
  15. drivers/usb/musb/da8xx.c +1 −1
  16. drivers/usb/musb/musb_gadget.c +7 −2
  17. drivers/usb/serial/ark3116.c +6 −4
  18. drivers/usb/serial/ch341.c +6 −5
  19. drivers/usb/serial/cypress_m8.c +8 −6
  20. drivers/usb/serial/f81232.c +5 −4
  21. drivers/usb/serial/ftdi_sio.c +8 −11
  22. drivers/usb/serial/garmin_gps.c +1 −6
  23. drivers/usb/serial/io_edgeport.c +7 −5
  24. drivers/usb/serial/io_ti.c +7 −6
  25. drivers/usb/serial/mct_u232.c +7 −6
  26. drivers/usb/serial/mos7840.c +10 −6
  27. drivers/usb/serial/oti6858.c +6 −4
  28. drivers/usb/serial/pl2303.c +6 −5
  29. drivers/usb/serial/quatech2.c +7 −5
  30. drivers/usb/serial/spcp8x5.c +5 −4
  31. drivers/usb/serial/ssu100.c +7 −5
  32. drivers/usb/serial/ti_usb_3410_5052.c +6 −4
  33. drivers/usb/serial/usb-serial.c +2 −1
  34. drivers/usb/storage/unusual_devs.h +7 −0
  35. include/linux/usb/serial.h +2 −0
  36. include/linux/usb/ulpi.h +8 −0
drivers/usb/class/cdc-acm.c+19−3
@@ -593,7 +593,6 @@ static void acm_port_destruct(struct tty_port *port) · 592 unmodified lines
593593
594594 dev_dbg(&acm->control->dev, "%s\n", __func__);
595595
596− tty_unregister_device(acm_tty_driver, acm->minor);
597596 acm_release_minor(acm);
598597 usb_put_intf(acm->control);
599598 kfree(acm->country_codes);
@@ -977,6 +976,8 @@ static int acm_probe(struct usb_interface *intf, · 377 unmodified lines
977976 int num_rx_buf;
978977 int i;
979978 int combined_interfaces = 0;
979+ struct device *tty_dev;
980+ int rv = -ENOMEM;
980981
981982 /* normal quirks */
982983 quirks = (unsigned long)id->driver_info;
@@ -1339,11 +1340,24 @@ skip_countries: · 356 unmodified lines
13391340 usb_set_intfdata(data_interface, acm);
13401341
13411342 usb_get_intf(control_interface);
1342− tty_port_register_device(&acm->port, acm_tty_driver, minor,
1343+ tty_dev = tty_port_register_device(&acm->port, acm_tty_driver, minor,
13431344 &control_interface->dev);
1345+ if (IS_ERR(tty_dev)) {
1346+ rv = PTR_ERR(tty_dev);
1347+ goto alloc_fail8;
1348+ }
13441349
13451350 return 0;
1351+alloc_fail8:
1352+ if (acm->country_codes) {
1353+ device_remove_file(&acm->control->dev,
1354+ &dev_attr_wCountryCodes);
1355+ device_remove_file(&acm->control->dev,
1356+ &dev_attr_iCountryCodeRelDate);
1357+ }
1358+ device_remove_file(&acm->control->dev, &dev_attr_bmCapabilities);
13461359 alloc_fail7:
1360+ usb_set_intfdata(intf, NULL);
13471361 for (i = 0; i < ACM_NW; i++)
13481362 usb_free_urb(acm->wb[i].urb);
13491363 alloc_fail6:
@@ -1359,7 +1373,7 @@ alloc_fail2: · 9 unmodified lines
13591373 acm_release_minor(acm);
13601374 kfree(acm);
13611375 alloc_fail:
1362− return -ENOMEM;
1376+ return rv;
13631377 }
13641378
13651379 static void stop_data_traffic(struct acm *acm)
@@ -1411,6 +1425,8 @@ static void acm_disconnect(struct usb_interface *intf) · 45 unmodified lines
14111425
14121426 stop_data_traffic(acm);
14131427
1428+ tty_unregister_device(acm_tty_driver, acm->minor);
1429+
14141430 usb_free_urb(acm->ctrlurb);
14151431 for (i = 0; i < ACM_NW; i++)
14161432 usb_free_urb(acm->wb[i].urb);
drivers/usb/core/hcd-pci.c+14−9
@@ -173,6 +173,7 @@ int usb_hcd_pci_probe(struct pci_dev *dev, const struct pci_device_id *id) · 172 unmodified lines
173173 struct hc_driver *driver;
174174 struct usb_hcd *hcd;
175175 int retval;
176+ int hcd_irq = 0;
176177
177178 if (usb_disabled())
178179 return -ENODEV;
@@ -187,15 +188,19 @@ int usb_hcd_pci_probe(struct pci_dev *dev, const struct pci_device_id *id) · 8 unmodified lines
187188 return -ENODEV;
188189 dev->current_state = PCI_D0;
189190
190− /* The xHCI driver supports MSI and MSI-X,
191− * so don't fail if the BIOS doesn't provide a legacy IRQ.
191+ /*
192+ * The xHCI driver has its own irq management
193+ * make sure irq setup is not touched for xhci in generic hcd code
192194 */
193− if (!dev->irq && (driver->flags & HCD_MASK) != HCD_USB3) {
194− dev_err(&dev->dev,
195− "Found HC with no IRQ. Check BIOS/PCI %s setup!\n",
196− pci_name(dev));
197− retval = -ENODEV;
198− goto disable_pci;
195+ if ((driver->flags & HCD_MASK) != HCD_USB3) {
196+ if (!dev->irq) {
197+ dev_err(&dev->dev,
198+ "Found HC with no IRQ. Check BIOS/PCI %s setup!\n",
199+ pci_name(dev));
200+ retval = -ENODEV;
201+ goto disable_pci;
202+ }
203+ hcd_irq = dev->irq;
199204 }
200205
201206 hcd = usb_create_hcd(driver, &dev->dev, pci_name(dev));
@@ -245,7 +250,7 @@ int usb_hcd_pci_probe(struct pci_dev *dev, const struct pci_device_id *id) · 43 unmodified lines
245250
246251 pci_set_master(dev);
247252
248− retval = usb_add_hcd(hcd, dev->irq, IRQF_SHARED);
253+ retval = usb_add_hcd(hcd, hcd_irq, IRQF_SHARED);
249254 if (retval != 0)
250255 goto unmap_registers;
251256 set_hs_companion(dev, hcd);
drivers/usb/gadget/f_rndis.c+1−2
@@ -447,14 +447,13 @@ static void rndis_response_complete(struct usb_ep *ep, struct usb_request *req) · 446 unmodified lines
447447 static void rndis_command_complete(struct usb_ep *ep, struct usb_request *req)
448448 {
449449 struct f_rndis *rndis = req->context;
450− struct usb_composite_dev *cdev = rndis->port.func.config->cdev;
451450 int status;
452451
453452 /* received RNDIS command from USB_CDC_SEND_ENCAPSULATED_COMMAND */
454453 // spin_lock(&dev->lock);
455454 status = rndis_msg_parser(rndis->config, (u8 *) req->buf);
456455 if (status < 0)
457− ERROR(cdev, "RNDIS command error %d, %d/%d\n",
456+ pr_err("RNDIS command error %d, %d/%d\n",
458457 status, req->actual, req->length);
459458 // spin_unlock(&dev->lock);
460459 }
drivers/usb/gadget/g_ffs.c+2−2
@@ -357,7 +357,7 @@ static int gfs_bind(struct usb_composite_dev *cdev) · 356 unmodified lines
357357 goto error;
358358 gfs_dev_desc.iProduct = gfs_strings[USB_GADGET_PRODUCT_IDX].id;
359359
360− for (i = func_num; --i; ) {
360+ for (i = func_num; i--; ) {
361361 ret = functionfs_bind(ffs_tab[i].ffs_data, cdev);
362362 if (unlikely(ret < 0)) {
363363 while (++i < func_num)
@@ -413,7 +413,7 @@ static int gfs_unbind(struct usb_composite_dev *cdev) · 49 unmodified lines
413413 gether_cleanup();
414414 gfs_ether_setup = false;
415415
416− for (i = func_num; --i; )
416+ for (i = func_num; i--; )
417417 if (ffs_tab[i].ffs_data)
418418 functionfs_unbind(ffs_tab[i].ffs_data);
419419
drivers/usb/gadget/net2272.c+8−1
@@ -59,7 +59,7 @@ static const char * const ep_name[] = { · 58 unmodified lines
5959 };
6060
6161 #define DMA_ADDR_INVALID (~(dma_addr_t)0)
62−#ifdef CONFIG_USB_GADGET_NET2272_DMA
62+#ifdef CONFIG_USB_NET2272_DMA
6363 /*
6464 * use_dma: the NET2272 can use an external DMA controller.
6565 * Note that since there is no generic DMA api, some functions,
@@ -1495,6 +1495,13 @@ stop_activity(struct net2272 *dev, struct usb_gadget_driver *driver) · 1429 unmodified lines
14951495 for (i = 0; i < 4; ++i)
14961496 net2272_dequeue_all(&dev->ep[i]);
14971497
1498+ /* report disconnect; the driver is already quiesced */
1499+ if (driver) {
1500+ spin_unlock(&dev->lock);
1501+ driver->disconnect(&dev->gadget);
1502+ spin_lock(&dev->lock);
1503+ }
1504+
14981505 net2272_usb_reinit(dev);
14991506 }
15001507
drivers/usb/gadget/net2280.c+7−1
@@ -1924,7 +1924,6 @@ static int net2280_start(struct usb_gadget *_gadget, · 1923 unmodified lines
19241924 err_func:
19251925 device_remove_file (&dev->pdev->dev, &dev_attr_function);
19261926 err_unbind:
1927− driver->unbind (&dev->gadget);
19281927 dev->gadget.dev.driver = NULL;
19291928 dev->driver = NULL;
19301929 return retval;
@@ -1946,6 +1945,13 @@ stop_activity (struct net2280 *dev, struct usb_gadget_driver *driver) · 15 unmodified lines
19461945 for (i = 0; i < 7; i++)
19471946 nuke (&dev->ep [i]);
19481947
1948+ /* report disconnect; the driver is already quiesced */
1949+ if (driver) {
1950+ spin_unlock(&dev->lock);
1951+ driver->disconnect(&dev->gadget);
1952+ spin_lock(&dev->lock);
1953+ }
1954+
19491955 usb_reinit (dev);
19501956 }
19511957
drivers/usb/gadget/u_serial.c+1−1
@@ -136,7 +136,7 @@ static struct portmaster { · 135 unmodified lines
136136 pr_debug(fmt, ##arg)
137137 #endif /* pr_vdebug */
138138 #else
139−#ifndef pr_vdebig
139+#ifndef pr_vdebug
140140 #define pr_vdebug(fmt, arg...) \
141141 ({ if (0) pr_debug(fmt, ##arg); })
142142 #endif /* pr_vdebug */
drivers/usb/gadget/udc-core.c+1−1
@@ -216,7 +216,7 @@ static void usb_gadget_remove_driver(struct usb_udc *udc) · 215 unmodified lines
216216 usb_gadget_disconnect(udc->gadget);
217217 udc->driver->disconnect(udc->gadget);
218218 udc->driver->unbind(udc->gadget);
219− usb_gadget_udc_stop(udc->gadget, udc->driver);
219+ usb_gadget_udc_stop(udc->gadget, NULL);
220220
221221 udc->driver = NULL;
222222 udc->dev.driver = NULL;
drivers/usb/host/ehci-hcd.c+1−0
@@ -302,6 +302,7 @@ static void ehci_quiesce (struct ehci_hcd *ehci) · 301 unmodified lines
302302
303303 static void end_unlink_async(struct ehci_hcd *ehci);
304304 static void unlink_empty_async(struct ehci_hcd *ehci);
305+static void unlink_empty_async_suspended(struct ehci_hcd *ehci);
305306 static void ehci_work(struct ehci_hcd *ehci);
306307 static void start_unlink_intr(struct ehci_hcd *ehci, struct ehci_qh *qh);
307308 static void end_unlink_intr(struct ehci_hcd *ehci, struct ehci_qh *qh);
drivers/usb/host/ehci-hub.c+1−1
@@ -328,7 +328,7 @@ static int ehci_bus_suspend (struct usb_hcd *hcd) · 327 unmodified lines
328328 ehci->rh_state = EHCI_RH_SUSPENDED;
329329
330330 end_unlink_async(ehci);
331− unlink_empty_async(ehci);
331+ unlink_empty_async_suspended(ehci);
332332 ehci_handle_intr_unlinks(ehci);
333333 end_free_itds(ehci);
334334
drivers/usb/host/ehci-q.c+13−0
@@ -1316,6 +1316,19 @@ static void unlink_empty_async(struct ehci_hcd *ehci) · 1315 unmodified lines
13161316 }
13171317 }
13181318
1319+/* The root hub is suspended; unlink all the async QHs */
1320+static void unlink_empty_async_suspended(struct ehci_hcd *ehci)
1321+{
1322+ struct ehci_qh *qh;
1323+
1324+ while (ehci->async->qh_next.qh) {
1325+ qh = ehci->async->qh_next.qh;
1326+ WARN_ON(!list_empty(&qh->qtd_list));
1327+ single_unlink_async(ehci, qh);
1328+ }
1329+ start_iaa_cycle(ehci, false);
1330+}
1331+
13191332 /* makes sure the async qh will become idle */
13201333 /* caller must own ehci->lock */
13211334
drivers/usb/host/ehci-timer.c+1−1
@@ -304,7 +304,7 @@ static void ehci_iaa_watchdog(struct ehci_hcd *ehci) · 303 unmodified lines
304304 * (a) SMP races against real IAA firing and retriggering, and
305305 * (b) clean HC shutdown, when IAA watchdog was pending.
306306 */
307− if (ehci->async_iaa) {
307+ if (1) {
308308 u32 cmd, status;
309309
310310 /* If we get here, IAA is *REALLY* late. It's barely
drivers/usb/host/xhci.c+2−1
@@ -350,7 +350,7 @@ static int xhci_try_enable_msi(struct usb_hcd *hcd) · 349 unmodified lines
350350 * generate interrupts. Don't even try to enable MSI.
351351 */
352352 if (xhci->quirks & XHCI_BROKEN_MSI)
353− return 0;
353+ goto legacy_irq;
354354
355355 /* unregister the legacy interrupt */
356356 if (hcd->irq)
@@ -371,6 +371,7 @@ static int xhci_try_enable_msi(struct usb_hcd *hcd) · 14 unmodified lines
371371 return -EINVAL;
372372 }
373373
374+ legacy_irq:
374375 /* fall back to legacy interrupt*/
375376 ret = request_irq(pdev->irq, &usb_hcd_irq, IRQF_SHARED,
376377 hcd->irq_descr, hcd);
drivers/usb/host/xhci.h+2−2
@@ -206,8 +206,8 @@ struct xhci_op_regs { · 205 unmodified lines
206206 /* bits 12:31 are reserved (and should be preserved on writes). */
207207
208208 /* IMAN - Interrupt Management Register */
209−#define IMAN_IP (1 << 1)
210−#define IMAN_IE (1 << 0)
209+#define IMAN_IE (1 << 1)
210+#define IMAN_IP (1 << 0)
211211
212212 /* USBSTS - USB status - status bitmasks */
213213 /* HC not running - set to 1 when run/stop bit is cleared. */
drivers/usb/musb/da8xx.c+1−1
@@ -327,7 +327,7 @@ static irqreturn_t da8xx_musb_interrupt(int irq, void *hci) · 326 unmodified lines
327327 u8 devctl = musb_readb(mregs, MUSB_DEVCTL);
328328 int err;
329329
330− err = musb->int_usb & USB_INTR_VBUSERROR;
330+ err = musb->int_usb & MUSB_INTR_VBUSERROR;
331331 if (err) {
332332 /*
333333 * The Mentor core doesn't debounce VBUS as needed
drivers/usb/musb/musb_gadget.c+7−2
@@ -141,7 +141,9 @@ static inline void map_dma_buffer(struct musb_request *request, · 140 unmodified lines
141141 static inline void unmap_dma_buffer(struct musb_request *request,
142142 struct musb *musb)
143143 {
144− if (!is_buffer_mapped(request))
144+ struct musb_ep *musb_ep = request->ep;
145+
146+ if (!is_buffer_mapped(request) || !musb_ep->dma)
145147 return;
146148
147149 if (request->request.dma == DMA_ADDR_INVALID) {
@@ -195,7 +197,10 @@ __acquires(ep->musb->lock) · 47 unmodified lines
195197
196198 ep->busy = 1;
197199 spin_unlock(&musb->lock);
198− unmap_dma_buffer(req, musb);
200+
201+ if (!dma_mapping_error(&musb->g.dev, request->dma))
202+ unmap_dma_buffer(req, musb);
203+
199204 if (request->status == 0)
200205 dev_dbg(musb->controller, "%s done request %p, %d/%d\n",
201206 ep->end_point.name, request,
drivers/usb/serial/ark3116.c+6−4
@@ -62,7 +62,6 @@ static int is_irda(struct usb_serial *serial) · 61 unmodified lines
6262 }
6363
6464 struct ark3116_private {
65− wait_queue_head_t delta_msr_wait;
6665 struct async_icount icount;
6766 int irda; /* 1 for irda device */
6867
@@ -146,7 +145,6 @@ static int ark3116_port_probe(struct usb_serial_port *port) · 77 unmodified lines
146145 if (!priv)
147146 return -ENOMEM;
148147
149− init_waitqueue_head(&priv->delta_msr_wait);
150148 mutex_init(&priv->hw_lock);
151149 spin_lock_init(&priv->status_lock);
152150
@@ -456,10 +454,14 @@ static int ark3116_ioctl(struct tty_struct *tty, · 303 unmodified lines
456454 case TIOCMIWAIT:
457455 for (;;) {
458456 struct async_icount prev = priv->icount;
459− interruptible_sleep_on(&priv->delta_msr_wait);
457+ interruptible_sleep_on(&port->delta_msr_wait);
460458 /* see if a signal did it */
461459 if (signal_pending(current))
462460 return -ERESTARTSYS;
461+
462+ if (port->serial->disconnected)
463+ return -EIO;
464+
463465 if ((prev.rng == priv->icount.rng) &&
464466 (prev.dsr == priv->icount.dsr) &&
465467 (prev.dcd == priv->icount.dcd) &&
@@ -580,7 +582,7 @@ static void ark3116_update_msr(struct usb_serial_port *port, __u8 msr) · 114 unmodified lines
580582 priv->icount.dcd++;
581583 if (msr & UART_MSR_TERI)
582584 priv->icount.rng++;
583− wake_up_interruptible(&priv->delta_msr_wait);
585+ wake_up_interruptible(&port->delta_msr_wait);
584586 }
585587 }
586588
drivers/usb/serial/ch341.c+6−5
@@ -80,7 +80,6 @@ MODULE_DEVICE_TABLE(usb, id_table); · 79 unmodified lines
8080
8181 struct ch341_private {
8282 spinlock_t lock; /* access lock */
83− wait_queue_head_t delta_msr_wait; /* wait queue for modem status */
8483 unsigned baud_rate; /* set baud rate */
8584 u8 line_control; /* set line control value RTS/DTR */
8685 u8 line_status; /* active status of modem control inputs */
@@ -252,7 +251,6 @@ static int ch341_port_probe(struct usb_serial_port *port) · 165 unmodified lines
252251 return -ENOMEM;
253252
254253 spin_lock_init(&priv->lock);
255− init_waitqueue_head(&priv->delta_msr_wait);
256254 priv->baud_rate = DEFAULT_BAUD_RATE;
257255 priv->line_control = CH341_BIT_RTS | CH341_BIT_DTR;
258256
@@ -298,7 +296,7 @@ static void ch341_dtr_rts(struct usb_serial_port *port, int on) · 39 unmodified lines
298296 priv->line_control &= ~(CH341_BIT_RTS | CH341_BIT_DTR);
299297 spin_unlock_irqrestore(&priv->lock, flags);
300298 ch341_set_handshake(port->serial->dev, priv->line_control);
301− wake_up_interruptible(&priv->delta_msr_wait);
299+ wake_up_interruptible(&port->delta_msr_wait);
302300 }
303301
304302 static void ch341_close(struct usb_serial_port *port)
@@ -491,7 +489,7 @@ static void ch341_read_int_callback(struct urb *urb) · 186 unmodified lines
491489 tty_kref_put(tty);
492490 }
493491
494− wake_up_interruptible(&priv->delta_msr_wait);
492+ wake_up_interruptible(&port->delta_msr_wait);
495493 }
496494
497495 exit:
@@ -517,11 +515,14 @@ static int wait_modem_info(struct usb_serial_port *port, unsigned int arg) · 19 unmodified lines
517515 spin_unlock_irqrestore(&priv->lock, flags);
518516
519517 while (!multi_change) {
520− interruptible_sleep_on(&priv->delta_msr_wait);
518+ interruptible_sleep_on(&port->delta_msr_wait);
521519 /* see if a signal did it */
522520 if (signal_pending(current))
523521 return -ERESTARTSYS;
524522
523+ if (port->serial->disconnected)
524+ return -EIO;
525+
525526 spin_lock_irqsave(&priv->lock, flags);
526527 status = priv->line_status;
527528 multi_change = priv->multi_status_change;
drivers/usb/serial/cypress_m8.c+8−6
@@ -111,7 +111,6 @@ struct cypress_private { · 110 unmodified lines
111111 int baud_rate; /* stores current baud rate in
112112 integer form */
113113 int isthrottled; /* if throttled, discard reads */
114− wait_queue_head_t delta_msr_wait; /* used for TIOCMIWAIT */
115114 char prev_status, diff_status; /* used for TIOCMIWAIT */
116115 /* we pass a pointer to this as the argument sent to
117116 cypress_set_termios old_termios */
@@ -449,7 +448,6 @@ static int cypress_generic_port_probe(struct usb_serial_port *port) · 331 unmodified lines
449448 kfree(priv);
450449 return -ENOMEM;
451450 }
452− init_waitqueue_head(&priv->delta_msr_wait);
453451
454452 usb_reset_configuration(serial->dev);
455453
@@ -868,12 +866,16 @@ static int cypress_ioctl(struct tty_struct *tty, · 412 unmodified lines
868866 switch (cmd) {
869867 /* This code comes from drivers/char/serial.c and ftdi_sio.c */
870868 case TIOCMIWAIT:
871− while (priv != NULL) {
872− interruptible_sleep_on(&priv->delta_msr_wait);
869+ for (;;) {
870+ interruptible_sleep_on(&port->delta_msr_wait);
873871 /* see if a signal did it */
874872 if (signal_pending(current))
875873 return -ERESTARTSYS;
876− else {
874+
875+ if (port->serial->disconnected)
876+ return -EIO;
877+
878+ {
877879 char diff = priv->diff_status;
878880 if (diff == 0)
879881 return -EIO; /* no change => error */
@@ -1187,7 +1189,7 @@ static void cypress_read_int_callback(struct urb *urb) · 307 unmodified lines
11871189 if (priv->current_status != priv->prev_status) {
11881190 priv->diff_status |= priv->current_status ^
11891191 priv->prev_status;
1190− wake_up_interruptible(&priv->delta_msr_wait);
1192+ wake_up_interruptible(&port->delta_msr_wait);
11911193 priv->prev_status = priv->current_status;
11921194 }
11931195 spin_unlock_irqrestore(&priv->lock, flags);
drivers/usb/serial/f81232.c+5−4
@@ -47,7 +47,6 @@ MODULE_DEVICE_TABLE(usb, id_table); · 46 unmodified lines
4747
4848 struct f81232_private {
4949 spinlock_t lock;
50− wait_queue_head_t delta_msr_wait;
5150 u8 line_control;
5251 u8 line_status;
5352 };
@@ -111,7 +110,7 @@ static void f81232_process_read_urb(struct urb *urb) · 57 unmodified lines
111110 line_status = priv->line_status;
112111 priv->line_status &= ~UART_STATE_TRANSIENT_MASK;
113112 spin_unlock_irqrestore(&priv->lock, flags);
114− wake_up_interruptible(&priv->delta_msr_wait);
113+ wake_up_interruptible(&port->delta_msr_wait);
115114
116115 if (!urb->actual_length)
117116 return;
@@ -256,11 +255,14 @@ static int wait_modem_info(struct usb_serial_port *port, unsigned int arg) · 138 unmodified lines
256255 spin_unlock_irqrestore(&priv->lock, flags);
257256
258257 while (1) {
259− interruptible_sleep_on(&priv->delta_msr_wait);
258+ interruptible_sleep_on(&port->delta_msr_wait);
260259 /* see if a signal did it */
261260 if (signal_pending(current))
262261 return -ERESTARTSYS;
263262
263+ if (port->serial->disconnected)
264+ return -EIO;
265+
264266 spin_lock_irqsave(&priv->lock, flags);
265267 status = priv->line_status;
266268 spin_unlock_irqrestore(&priv->lock, flags);
@@ -322,7 +324,6 @@ static int f81232_port_probe(struct usb_serial_port *port) · 55 unmodified lines
322324 return -ENOMEM;
323325
324326 spin_lock_init(&priv->lock);
325− init_waitqueue_head(&priv->delta_msr_wait);
326327
327328 usb_set_serial_port_data(port, priv);
328329
drivers/usb/serial/ftdi_sio.c+8−11
@@ -69,9 +69,7 @@ struct ftdi_private { · 68 unmodified lines
6969 int flags; /* some ASYNC_xxxx flags are supported */
7070 unsigned long last_dtr_rts; /* saved modem control outputs */
7171 struct async_icount icount;
72− wait_queue_head_t delta_msr_wait; /* Used for TIOCMIWAIT */
7372 char prev_status; /* Used for TIOCMIWAIT */
74− bool dev_gone; /* Used to abort TIOCMIWAIT */
7573 char transmit_empty; /* If transmitter is empty or not */
7674 __u16 interface; /* FT2232C, FT2232H or FT4232H port interface
7775 (0 for FT232/245) */
@@ -1691,10 +1689,8 @@ static int ftdi_sio_port_probe(struct usb_serial_port *port) · 1613 unmodified lines
16911689
16921690 kref_init(&priv->kref);
16931691 mutex_init(&priv->cfg_lock);
1694− init_waitqueue_head(&priv->delta_msr_wait);
16951692
16961693 priv->flags = ASYNC_LOW_LATENCY;
1697− priv->dev_gone = false;
16981694
16991695 if (quirk && quirk->port_probe)
17001696 quirk->port_probe(priv);
@@ -1840,8 +1836,7 @@ static int ftdi_sio_port_remove(struct usb_serial_port *port) · 139 unmodified lines
18401836 {
18411837 struct ftdi_private *priv = usb_get_serial_port_data(port);
18421838
1843− priv->dev_gone = true;
1844− wake_up_interruptible_all(&priv->delta_msr_wait);
1839+ wake_up_interruptible(&port->delta_msr_wait);
18451840
18461841 remove_sysfs_attrs(port);
18471842
@@ -1989,7 +1984,7 @@ static int ftdi_process_packet(struct usb_serial_port *port, · 141 unmodified lines
19891984 if (diff_status & FTDI_RS0_RLSD)
19901985 priv->icount.dcd++;
19911986
1992− wake_up_interruptible_all(&priv->delta_msr_wait);
1987+ wake_up_interruptible(&port->delta_msr_wait);
19931988 priv->prev_status = status;
19941989 }
19951990
@@ -2440,11 +2435,15 @@ static int ftdi_ioctl(struct tty_struct *tty, · 444 unmodified lines
24402435 */
24412436 case TIOCMIWAIT:
24422437 cprev = priv->icount;
2443− while (!priv->dev_gone) {
2444− interruptible_sleep_on(&priv->delta_msr_wait);
2438+ for (;;) {
2439+ interruptible_sleep_on(&port->delta_msr_wait);
24452440 /* see if a signal did it */
24462441 if (signal_pending(current))
24472442 return -ERESTARTSYS;
2443+
2444+ if (port->serial->disconnected)
2445+ return -EIO;
2446+
24482447 cnow = priv->icount;
24492448 if (((arg & TIOCM_RNG) && (cnow.rng != cprev.rng)) ||
24502449 ((arg & TIOCM_DSR) && (cnow.dsr != cprev.dsr)) ||
@@ -2454,8 +2453,6 @@ static int ftdi_ioctl(struct tty_struct *tty, · 3 unmodified lines
24542453 }
24552454 cprev = cnow;
24562455 }
2457− return -EIO;
2458− break;
24592456 case TIOCSERGETLSR:
24602457 return get_lsr_info(port, (struct serial_struct __user *)arg);
24612458 break;
drivers/usb/serial/garmin_gps.c+1−6
@@ -956,10 +956,7 @@ static void garmin_close(struct usb_serial_port *port) · 955 unmodified lines
956956 if (!serial)
957957 return;
958958
959− mutex_lock(&port->serial->disc_mutex);
960−
961− if (!port->serial->disconnected)
962− garmin_clear(garmin_data_p);
959+ garmin_clear(garmin_data_p);
963960
964961 /* shutdown our urbs */
965962 usb_kill_urb(port->read_urb);
@@ -968,8 +965,6 @@ static void garmin_close(struct usb_serial_port *port) · 2 unmodified lines
968965 /* keep reset state so we know that we must start a new session */
969966 if (garmin_data_p->state != STATE_RESET)
970967 garmin_data_p->state = STATE_DISCONNECTED;
971−
972− mutex_unlock(&port->serial->disc_mutex);
973968 }
974969
975970
drivers/usb/serial/io_edgeport.c+7−5
@@ -110,7 +110,6 @@ struct edgeport_port { · 109 unmodified lines
110110 wait_queue_head_t wait_chase; /* for handling sleeping while waiting for chase to finish */
111111 wait_queue_head_t wait_open; /* for handling sleeping while waiting for open to finish */
112112 wait_queue_head_t wait_command; /* for handling sleeping while waiting for command to finish */
113− wait_queue_head_t delta_msr_wait; /* for handling sleeping while waiting for msr change to happen */
114113
115114 struct async_icount icount;
116115 struct usb_serial_port *port; /* loop back to the owner of this object */
@@ -884,7 +883,6 @@ static int edge_open(struct tty_struct *tty, struct usb_serial_port *port) · 767 unmodified lines
884883 /* initialize our wait queues */
885884 init_waitqueue_head(&edge_port->wait_open);
886885 init_waitqueue_head(&edge_port->wait_chase);
887− init_waitqueue_head(&edge_port->delta_msr_wait);
888886 init_waitqueue_head(&edge_port->wait_command);
889887
890888 /* initialize our icount structure */
@@ -1669,13 +1667,17 @@ static int edge_ioctl(struct tty_struct *tty, · 778 unmodified lines
16691667 dev_dbg(&port->dev, "%s (%d) TIOCMIWAIT\n", __func__, port->number);
16701668 cprev = edge_port->icount;
16711669 while (1) {
1672− prepare_to_wait(&edge_port->delta_msr_wait,
1670+ prepare_to_wait(&port->delta_msr_wait,
16731671 &wait, TASK_INTERRUPTIBLE);
16741672 schedule();
1675− finish_wait(&edge_port->delta_msr_wait, &wait);
1673+ finish_wait(&port->delta_msr_wait, &wait);
16761674 /* see if a signal did it */
16771675 if (signal_pending(current))
16781676 return -ERESTARTSYS;
1677+
1678+ if (port->serial->disconnected)
1679+ return -EIO;
1680+
16791681 cnow = edge_port->icount;
16801682 if (cnow.rng == cprev.rng && cnow.dsr == cprev.dsr &&
16811683 cnow.dcd == cprev.dcd && cnow.cts == cprev.cts)
@@ -2051,7 +2053,7 @@ static void handle_new_msr(struct edgeport_port *edge_port, __u8 newMsr) · 369 unmodified lines
20512053 icount->dcd++;
20522054 if (newMsr & EDGEPORT_MSR_DELTA_RI)
20532055 icount->rng++;
2054− wake_up_interruptible(&edge_port->delta_msr_wait);
2056+ wake_up_interruptible(&edge_port->port->delta_msr_wait);
20552057 }
20562058
20572059 /* Save the new modem status */
drivers/usb/serial/io_ti.c+7−6
@@ -87,9 +87,6 @@ struct edgeport_port { · 86 unmodified lines
8787 int close_pending;
8888 int lsr_event;
8989 struct async_icount icount;
90− wait_queue_head_t delta_msr_wait; /* for handling sleeping while
91− waiting for msr change to
92− happen */
9390 struct edgeport_serial *edge_serial;
9491 struct usb_serial_port *port;
9592 __u8 bUartMode; /* Port type, 0: RS232, etc. */
@@ -1459,7 +1456,7 @@ static void handle_new_msr(struct edgeport_port *edge_port, __u8 msr) · 1363 unmodified lines
14591456 icount->dcd++;
14601457 if (msr & EDGEPORT_MSR_DELTA_RI)
14611458 icount->rng++;
1462− wake_up_interruptible(&edge_port->delta_msr_wait);
1459+ wake_up_interruptible(&edge_port->port->delta_msr_wait);
14631460 }
14641461
14651462 /* Save the new modem status */
@@ -1754,7 +1751,6 @@ static int edge_open(struct tty_struct *tty, struct usb_serial_port *port) · 288 unmodified lines
17541751 dev = port->serial->dev;
17551752
17561753 memset(&(edge_port->icount), 0x00, sizeof(edge_port->icount));
1757− init_waitqueue_head(&edge_port->delta_msr_wait);
17581754
17591755 /* turn off loopback */
17601756 status = ti_do_config(edge_port, UMPC_SET_CLR_LOOPBACK, 0);
@@ -2434,10 +2430,14 @@ static int edge_ioctl(struct tty_struct *tty, · 673 unmodified lines
24342430 dev_dbg(&port->dev, "%s - TIOCMIWAIT\n", __func__);
24352431 cprev = edge_port->icount;
24362432 while (1) {
2437− interruptible_sleep_on(&edge_port->delta_msr_wait);
2433+ interruptible_sleep_on(&port->delta_msr_wait);
24382434 /* see if a signal did it */
24392435 if (signal_pending(current))
24402436 return -ERESTARTSYS;
2437+
2438+ if (port->serial->disconnected)
2439+ return -EIO;
2440+
24412441 cnow = edge_port->icount;
24422442 if (cnow.rng == cprev.rng && cnow.dsr == cprev.dsr &&
24432443 cnow.dcd == cprev.dcd && cnow.cts == cprev.cts)
@@ -2649,6 +2649,7 @@ static struct usb_serial_driver edgeport_2port_device = { · 205 unmodified lines
26492649 .set_termios = edge_set_termios,
26502650 .tiocmget = edge_tiocmget,
26512651 .tiocmset = edge_tiocmset,
2652+ .get_icount = edge_get_icount,
26522653 .write = edge_write,
26532654 .write_room = edge_write_room,
26542655 .chars_in_buffer = edge_chars_in_buffer,
drivers/usb/serial/mct_u232.c+7−6
@@ -114,8 +114,6 @@ struct mct_u232_private { · 113 unmodified lines
114114 unsigned char last_msr; /* Modem Status Register */
115115 unsigned int rx_flags; /* Throttling flags */
116116 struct async_icount icount;
117− wait_queue_head_t msr_wait; /* for handling sleeping while waiting
118− for msr change to happen */
119117 };
120118
121119 #define THROTTLED 0x01
@@ -409,7 +407,6 @@ static int mct_u232_port_probe(struct usb_serial_port *port) · 287 unmodified lines
409407 return -ENOMEM;
410408
411409 spin_lock_init(&priv->lock);
412− init_waitqueue_head(&priv->msr_wait);
413410
414411 usb_set_serial_port_data(port, priv);
415412
@@ -601,7 +598,7 @@ static void mct_u232_read_int_callback(struct urb *urb) · 185 unmodified lines
601598 tty_kref_put(tty);
602599 }
603600 #endif
604− wake_up_interruptible(&priv->msr_wait);
601+ wake_up_interruptible(&port->delta_msr_wait);
605602 spin_unlock_irqrestore(&priv->lock, flags);
606603 exit:
607604 retval = usb_submit_urb(urb, GFP_ATOMIC);
@@ -810,13 +807,17 @@ static int mct_u232_ioctl(struct tty_struct *tty, · 202 unmodified lines
810807 cprev = mct_u232_port->icount;
811808 spin_unlock_irqrestore(&mct_u232_port->lock, flags);
812809 for ( ; ; ) {
813− prepare_to_wait(&mct_u232_port->msr_wait,
810+ prepare_to_wait(&port->delta_msr_wait,
814811 &wait, TASK_INTERRUPTIBLE);
815812 schedule();
816− finish_wait(&mct_u232_port->msr_wait, &wait);
813+ finish_wait(&port->delta_msr_wait, &wait);
817814 /* see if a signal did it */
818815 if (signal_pending(current))
819816 return -ERESTARTSYS;
817+
818+ if (port->serial->disconnected)
819+ return -EIO;
820+
820821 spin_lock_irqsave(&mct_u232_port->lock, flags);
821822 cnow = mct_u232_port->icount;
822823 spin_unlock_irqrestore(&mct_u232_port->lock, flags);
drivers/usb/serial/mos7840.c+10−6
@@ -219,7 +219,6 @@ struct moschip_port { · 218 unmodified lines
219219 char open;
220220 char open_ports;
221221 wait_queue_head_t wait_chase; /* for handling sleeping while waiting for chase to finish */
222− wait_queue_head_t delta_msr_wait; /* for handling sleeping while waiting for msr change to happen */
223222 int delta_msr_cond;
224223 struct async_icount icount;
225224 struct usb_serial_port *port; /* loop back to the owner of this object */
@@ -423,6 +422,9 @@ static void mos7840_handle_new_msr(struct moschip_port *port, __u8 new_msr) · 197 unmodified lines
423422 icount->rng++;
424423 smp_wmb();
425424 }
425+
426+ mos7840_port->delta_msr_cond = 1;
427+ wake_up_interruptible(&port->port->delta_msr_wait);
426428 }
427429 }
428430
@@ -1127,7 +1129,6 @@ static int mos7840_open(struct tty_struct *tty, struct usb_serial_port *port) · 698 unmodified lines
11271129
11281130 /* initialize our wait queues */
11291131 init_waitqueue_head(&mos7840_port->wait_chase);
1130− init_waitqueue_head(&mos7840_port->delta_msr_wait);
11311132
11321133 /* initialize our icount structure */
11331134 memset(&(mos7840_port->icount), 0x00, sizeof(mos7840_port->icount));
@@ -2017,8 +2018,6 @@ static void mos7840_change_port_settings(struct tty_struct *tty, · 883 unmodified lines
20172018 mos7840_port->read_urb_busy = false;
20182019 }
20192020 }
2020− wake_up(&mos7840_port->delta_msr_wait);
2021− mos7840_port->delta_msr_cond = 1;
20222021 dev_dbg(&port->dev, "%s - mos7840_port->shadowLCR is End %x\n", __func__,
20232022 mos7840_port->shadowLCR);
20242023 }
@@ -2219,13 +2218,18 @@ static int mos7840_ioctl(struct tty_struct *tty, · 194 unmodified lines
22192218 while (1) {
22202219 /* interruptible_sleep_on(&mos7840_port->delta_msr_wait); */
22212220 mos7840_port->delta_msr_cond = 0;
2222− wait_event_interruptible(mos7840_port->delta_msr_wait,
2223− (mos7840_port->
2221+ wait_event_interruptible(port->delta_msr_wait,
2222+ (port->serial->disconnected ||
2223+ mos7840_port->
22242224 delta_msr_cond == 1));
22252225
22262226 /* see if a signal did it */
22272227 if (signal_pending(current))
22282228 return -ERESTARTSYS;
2229+
2230+ if (port->serial->disconnected)
2231+ return -EIO;
2232+
22292233 cnow = mos7840_port->icount;
22302234 smp_rmb();
22312235 if (cnow.rng == cprev.rng && cnow.dsr == cprev.dsr &&
drivers/usb/serial/oti6858.c+6−4
@@ -188,7 +188,6 @@ struct oti6858_private { · 187 unmodified lines
188188 u8 setup_done;
189189 struct delayed_work delayed_setup_work;
190190
191− wait_queue_head_t intr_wait;
192191 struct usb_serial_port *port; /* USB port with which associated */
193192 };
194193
@@ -339,7 +338,6 @@ static int oti6858_port_probe(struct usb_serial_port *port) · 144 unmodified lines
339338 return -ENOMEM;
340339
341340 spin_lock_init(&priv->lock);
342− init_waitqueue_head(&priv->intr_wait);
343341 priv->port = port;
344342 INIT_DELAYED_WORK(&priv->delayed_setup_work, setup_line);
345343 INIT_DELAYED_WORK(&priv->delayed_write_work, send_data);
@@ -664,11 +662,15 @@ static int wait_modem_info(struct usb_serial_port *port, unsigned int arg) · 318 unmodified lines
664662 spin_unlock_irqrestore(&priv->lock, flags);
665663
666664 while (1) {
667− wait_event_interruptible(priv->intr_wait,
665+ wait_event_interruptible(port->delta_msr_wait,
666+ port->serial->disconnected ||
668667 priv->status.pin_state != prev);
669668 if (signal_pending(current))
670669 return -ERESTARTSYS;
671670
671+ if (port->serial->disconnected)
672+ return -EIO;
673+
672674 spin_lock_irqsave(&priv->lock, flags);
673675 status = priv->status.pin_state & PIN_MASK;
674676 spin_unlock_irqrestore(&priv->lock, flags);
@@ -763,7 +765,7 @@ static void oti6858_read_int_callback(struct urb *urb) · 88 unmodified lines
763765
764766 if (!priv->transient) {
765767 if (xs->pin_state != priv->status.pin_state)
766− wake_up_interruptible(&priv->intr_wait);
768+ wake_up_interruptible(&port->delta_msr_wait);
767769 memcpy(&priv->status, xs, OTI6858_CTRL_PKT_SIZE);
768770 }
769771
drivers/usb/serial/pl2303.c+6−5
@@ -139,7 +139,6 @@ struct pl2303_serial_private { · 138 unmodified lines
139139
140140 struct pl2303_private {
141141 spinlock_t lock;
142− wait_queue_head_t delta_msr_wait;
143142 u8 line_control;
144143 u8 line_status;
145144 };
@@ -233,7 +232,6 @@ static int pl2303_port_probe(struct usb_serial_port *port) · 87 unmodified lines
233232 return -ENOMEM;
234233
235234 spin_lock_init(&priv->lock);
236− init_waitqueue_head(&priv->delta_msr_wait);
237235
238236 usb_set_serial_port_data(port, priv);
239237
@@ -607,11 +605,14 @@ static int wait_modem_info(struct usb_serial_port *port, unsigned int arg) · 367 unmodified lines
607605 spin_unlock_irqrestore(&priv->lock, flags);
608606
609607 while (1) {
610− interruptible_sleep_on(&priv->delta_msr_wait);
608+ interruptible_sleep_on(&port->delta_msr_wait);
611609 /* see if a signal did it */
612610 if (signal_pending(current))
613611 return -ERESTARTSYS;
614612
613+ if (port->serial->disconnected)
614+ return -EIO;
615+
615616 spin_lock_irqsave(&priv->lock, flags);
616617 status = priv->line_status;
617618 spin_unlock_irqrestore(&priv->lock, flags);
@@ -719,7 +720,7 @@ static void pl2303_update_line_status(struct usb_serial_port *port, · 101 unmodified lines
719720 spin_unlock_irqrestore(&priv->lock, flags);
720721 if (priv->line_status & UART_BREAK_ERROR)
721722 usb_serial_handle_break(port);
722− wake_up_interruptible(&priv->delta_msr_wait);
723+ wake_up_interruptible(&port->delta_msr_wait);
723724
724725 tty = tty_port_tty_get(&port->port);
725726 if (!tty)
@@ -783,7 +784,7 @@ static void pl2303_process_read_urb(struct urb *urb) · 57 unmodified lines
783784 line_status = priv->line_status;
784785 priv->line_status &= ~UART_STATE_TRANSIENT_MASK;
785786 spin_unlock_irqrestore(&priv->lock, flags);
786− wake_up_interruptible(&priv->delta_msr_wait);
787+ wake_up_interruptible(&port->delta_msr_wait);
787788
788789 if (!urb->actual_length)
789790 return;
drivers/usb/serial/quatech2.c+7−5
@@ -128,7 +128,6 @@ struct qt2_port_private { · 127 unmodified lines
128128 u8 shadowLSR;
129129 u8 shadowMSR;
130130
131− wait_queue_head_t delta_msr_wait; /* Used for TIOCMIWAIT */
132131 struct async_icount icount;
133132
134133 struct usb_serial_port *port;
@@ -506,8 +505,9 @@ static int wait_modem_info(struct usb_serial_port *port, unsigned int arg) · 371 unmodified lines
506505 spin_unlock_irqrestore(&priv->lock, flags);
507506
508507 while (1) {
509− wait_event_interruptible(priv->delta_msr_wait,
510− ((priv->icount.rng != prev.rng) ||
508+ wait_event_interruptible(port->delta_msr_wait,
509+ (port->serial->disconnected ||
510+ (priv->icount.rng != prev.rng) ||
511511 (priv->icount.dsr != prev.dsr) ||
512512 (priv->icount.dcd != prev.dcd) ||
513513 (priv->icount.cts != prev.cts)));
@@ -515,6 +515,9 @@ static int wait_modem_info(struct usb_serial_port *port, unsigned int arg) · 1 unmodified line
515515 if (signal_pending(current))
516516 return -ERESTARTSYS;
517517
518+ if (port->serial->disconnected)
519+ return -EIO;
520+
518521 spin_lock_irqsave(&priv->lock, flags);
519522 cur = priv->icount;
520523 spin_unlock_irqrestore(&priv->lock, flags);
@@ -827,7 +830,6 @@ static int qt2_port_probe(struct usb_serial_port *port) · 306 unmodified lines
827830
828831 spin_lock_init(&port_priv->lock);
829832 spin_lock_init(&port_priv->urb_lock);
830− init_waitqueue_head(&port_priv->delta_msr_wait);
831833 port_priv->port = port;
832834
833835 port_priv->write_urb = usb_alloc_urb(0, GFP_KERNEL);
@@ -970,7 +972,7 @@ static void qt2_update_msr(struct usb_serial_port *port, unsigned char *ch) · 136 unmodified lines
970972 if (newMSR & UART_MSR_TERI)
971973 port_priv->icount.rng++;
972974
973− wake_up_interruptible(&port_priv->delta_msr_wait);
975+ wake_up_interruptible(&port->delta_msr_wait);
974976 }
975977 }
976978
drivers/usb/serial/spcp8x5.c+5−4
@@ -149,7 +149,6 @@ enum spcp8x5_type { · 148 unmodified lines
149149 struct spcp8x5_private {
150150 spinlock_t lock;
151151 enum spcp8x5_type type;
152− wait_queue_head_t delta_msr_wait;
153152 u8 line_control;
154153 u8 line_status;
155154 };
@@ -179,7 +178,6 @@ static int spcp8x5_port_probe(struct usb_serial_port *port) · 23 unmodified lines
179178 return -ENOMEM;
180179
181180 spin_lock_init(&priv->lock);
182− init_waitqueue_head(&priv->delta_msr_wait);
183181 priv->type = type;
184182
185183 usb_set_serial_port_data(port , priv);
@@ -475,7 +473,7 @@ static void spcp8x5_process_read_urb(struct urb *urb) · 289 unmodified lines
475473 priv->line_status &= ~UART_STATE_TRANSIENT_MASK;
476474 spin_unlock_irqrestore(&priv->lock, flags);
477475 /* wake up the wait for termios */
478− wake_up_interruptible(&priv->delta_msr_wait);
476+ wake_up_interruptible(&port->delta_msr_wait);
479477
480478 if (!urb->actual_length)
481479 return;
@@ -526,12 +524,15 @@ static int spcp8x5_wait_modem_info(struct usb_serial_port *port, · 44 unmodified lines
526524
527525 while (1) {
528526 /* wake up in bulk read */
529− interruptible_sleep_on(&priv->delta_msr_wait);
527+ interruptible_sleep_on(&port->delta_msr_wait);
530528
531529 /* see if a signal did it */
532530 if (signal_pending(current))
533531 return -ERESTARTSYS;
534532
533+ if (port->serial->disconnected)
534+ return -EIO;
535+
535536 spin_lock_irqsave(&priv->lock, flags);
536537 status = priv->line_status;
537538 spin_unlock_irqrestore(&priv->lock, flags);
drivers/usb/serial/ssu100.c+7−5
@@ -61,7 +61,6 @@ struct ssu100_port_private { · 60 unmodified lines
6161 spinlock_t status_lock;
6262 u8 shadowLSR;
6363 u8 shadowMSR;
64− wait_queue_head_t delta_msr_wait; /* Used for TIOCMIWAIT */
6564 struct async_icount icount;
6665 };
6766
@@ -355,8 +354,9 @@ static int wait_modem_info(struct usb_serial_port *port, unsigned int arg) · 287 unmodified lines
355354 spin_unlock_irqrestore(&priv->status_lock, flags);
356355
357356 while (1) {
358− wait_event_interruptible(priv->delta_msr_wait,
359− ((priv->icount.rng != prev.rng) ||
357+ wait_event_interruptible(port->delta_msr_wait,
358+ (port->serial->disconnected ||
359+ (priv->icount.rng != prev.rng) ||
360360 (priv->icount.dsr != prev.dsr) ||
361361 (priv->icount.dcd != prev.dcd) ||
362362 (priv->icount.cts != prev.cts)));
@@ -364,6 +364,9 @@ static int wait_modem_info(struct usb_serial_port *port, unsigned int arg) · 1 unmodified line
364364 if (signal_pending(current))
365365 return -ERESTARTSYS;
366366
367+ if (port->serial->disconnected)
368+ return -EIO;
369+
367370 spin_lock_irqsave(&priv->status_lock, flags);
368371 cur = priv->icount;
369372 spin_unlock_irqrestore(&priv->status_lock, flags);
@@ -445,7 +448,6 @@ static int ssu100_port_probe(struct usb_serial_port *port) · 75 unmodified lines
445448 return -ENOMEM;
446449
447450 spin_lock_init(&priv->status_lock);
448− init_waitqueue_head(&priv->delta_msr_wait);
449451
450452 usb_set_serial_port_data(port, priv);
451453
@@ -537,7 +539,7 @@ static void ssu100_update_msr(struct usb_serial_port *port, u8 msr) · 85 unmodified lines
537539 priv->icount.dcd++;
538540 if (msr & UART_MSR_TERI)
539541 priv->icount.rng++;
540− wake_up_interruptible(&priv->delta_msr_wait);
542+ wake_up_interruptible(&port->delta_msr_wait);
541543 }
542544 }
543545
drivers/usb/serial/ti_usb_3410_5052.c+6−4
@@ -74,7 +74,6 @@ struct ti_port { · 73 unmodified lines
7474 int tp_flags;
7575 int tp_closing_wait;/* in .01 secs */
7676 struct async_icount tp_icount;
77− wait_queue_head_t tp_msr_wait; /* wait for msr change */
7877 wait_queue_head_t tp_write_wait;
7978 struct ti_device *tp_tdev;
8079 struct usb_serial_port *tp_port;
@@ -432,7 +431,6 @@ static int ti_port_probe(struct usb_serial_port *port) · 351 unmodified lines
432431 else
433432 tport->tp_uart_base_addr = TI_UART2_BASE_ADDR;
434433 tport->tp_closing_wait = closing_wait;
435− init_waitqueue_head(&tport->tp_msr_wait);
436434 init_waitqueue_head(&tport->tp_write_wait);
437435 if (kfifo_alloc(&tport->write_fifo, TI_WRITE_BUF_SIZE, GFP_KERNEL)) {
438436 kfree(tport);
@@ -784,9 +782,13 @@ static int ti_ioctl(struct tty_struct *tty, · 345 unmodified lines
784782 dev_dbg(&port->dev, "%s - TIOCMIWAIT\n", __func__);
785783 cprev = tport->tp_icount;
786784 while (1) {
787− interruptible_sleep_on(&tport->tp_msr_wait);
785+ interruptible_sleep_on(&port->delta_msr_wait);
788786 if (signal_pending(current))
789787 return -ERESTARTSYS;
788+
789+ if (port->serial->disconnected)
790+ return -EIO;
791+
790792 cnow = tport->tp_icount;
791793 if (cnow.rng == cprev.rng && cnow.dsr == cprev.dsr &&
792794 cnow.dcd == cprev.dcd && cnow.cts == cprev.cts)
@@ -1392,7 +1394,7 @@ static void ti_handle_new_msr(struct ti_port *tport, __u8 msr) · 599 unmodified lines
13921394 icount->dcd++;
13931395 if (msr & TI_MSR_DELTA_RI)
13941396 icount->rng++;
1395− wake_up_interruptible(&tport->tp_msr_wait);
1397+ wake_up_interruptible(&tport->tp_port->delta_msr_wait);
13961398 spin_unlock_irqrestore(&tport->tp_lock, flags);
13971399 }
13981400
drivers/usb/serial/usb-serial.c+2−1
@@ -151,6 +151,7 @@ static void destroy_serial(struct kref *kref) · 150 unmodified lines
151151 }
152152 }
153153
154+ usb_put_intf(serial->interface);
154155 usb_put_dev(serial->dev);
155156 kfree(serial);
156157 }
@@ -620,7 +621,7 @@ static struct usb_serial *create_serial(struct usb_device *dev, · 463 unmodified lines
620621 }
621622 serial->dev = usb_get_dev(dev);
622623 serial->type = driver;
623− serial->interface = interface;
624+ serial->interface = usb_get_intf(interface);
624625 kref_init(&serial->kref);
625626 mutex_init(&serial->disc_mutex);
626627 serial->minor = SERIAL_TTY_NO_MINOR;
drivers/usb/storage/unusual_devs.h+7−0
@@ -496,6 +496,13 @@ UNUSUAL_DEV( 0x04e8, 0x5122, 0x0000, 0x9999, · 495 unmodified lines
496496 USB_SC_DEVICE, USB_PR_DEVICE, NULL,
497497 US_FL_MAX_SECTORS_64 | US_FL_BULK_IGNORE_TAG),
498498
499+/* Added by Dmitry Artamonow <mad_soft@inbox.ru> */
500+UNUSUAL_DEV( 0x04e8, 0x5136, 0x0000, 0x9999,
501+ "Samsung",
502+ "YP-Z3",
503+ USB_SC_DEVICE, USB_PR_DEVICE, NULL,
504+ US_FL_MAX_SECTORS_64),
505+
499506 /* Entry and supporting patch by Theodore Kilgore <kilgota@auburn.edu>.
500507 * Device uses standards-violating 32-byte Bulk Command Block Wrappers and
501508 * reports itself as "Proprietary SCSI Bulk." Cf. device entry 0x084d:0x0011.
include/linux/usb/serial.h+2−0
@@ -66,6 +66,7 @@ · 65 unmodified lines
6666 * port.
6767 * @flags: usb serial port flags
6868 * @write_wait: a wait_queue_head_t used by the port.
69+ * @delta_msr_wait: modem-status-change wait queue
6970 * @work: work queue entry for the line discipline waking up.
7071 * @throttled: nonzero if the read urb is inactive to throttle the device
7172 * @throttle_req: nonzero if the tty wants to throttle us
@@ -112,6 +113,7 @@ struct usb_serial_port { · 40 unmodified lines
112113
113114 unsigned long flags;
114115 wait_queue_head_t write_wait;
116+ wait_queue_head_t delta_msr_wait;
115117 struct work_struct work;
116118 char throttled;
117119 char throttle_req;
include/linux/usb/ulpi.h+8−0
@@ -181,8 +181,16 @@ · 180 unmodified lines
181181
182182 /*-------------------------------------------------------------------------*/
183183
184+#if IS_ENABLED(CONFIG_USB_ULPI)
184185 struct usb_phy *otg_ulpi_create(struct usb_phy_io_ops *ops,
185186 unsigned int flags);
187+#else
188+static inline struct usb_phy *otg_ulpi_create(struct usb_phy_io_ops *ops,
189+ unsigned int flags)
190+{
191+ return NULL;
192+}
193+#endif
186194
187195 #ifdef CONFIG_USB_ULPI_VIEWPORT
188196 /* access ops for controllers with a viewport register */