diff options
35 files changed, 316 insertions, 412 deletions
diff --git a/drivers/usb/class/usbtmc.c b/drivers/usb/class/usbtmc.c index 864f0ba6a344..2473cf0c6b1d 100644 --- a/drivers/usb/class/usbtmc.c +++ b/drivers/usb/class/usbtmc.c | |||
| @@ -39,7 +39,7 @@ | |||
| 39 | #define USBTMC_SIZE_IOBUFFER 2048 | 39 | #define USBTMC_SIZE_IOBUFFER 2048 |
| 40 | 40 | ||
| 41 | /* Default USB timeout (in milliseconds) */ | 41 | /* Default USB timeout (in milliseconds) */ |
| 42 | #define USBTMC_TIMEOUT 10 | 42 | #define USBTMC_TIMEOUT 5000 |
| 43 | 43 | ||
| 44 | /* | 44 | /* |
| 45 | * Maximum number of read cycles to empty bulk in endpoint during CLEAR and | 45 | * Maximum number of read cycles to empty bulk in endpoint during CLEAR and |
diff --git a/drivers/usb/gadget/imx_udc.c b/drivers/usb/gadget/imx_udc.c index c52a681f376c..01ee0b9bc957 100644 --- a/drivers/usb/gadget/imx_udc.c +++ b/drivers/usb/gadget/imx_udc.c | |||
| @@ -1402,7 +1402,8 @@ static int __init imx_udc_probe(struct platform_device *pdev) | |||
| 1402 | struct clk *clk; | 1402 | struct clk *clk; |
| 1403 | void __iomem *base; | 1403 | void __iomem *base; |
| 1404 | int ret = 0; | 1404 | int ret = 0; |
| 1405 | int i, res_size; | 1405 | int i; |
| 1406 | resource_size_t res_size; | ||
| 1406 | 1407 | ||
| 1407 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); | 1408 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); |
| 1408 | if (!res) { | 1409 | if (!res) { |
| @@ -1416,7 +1417,7 @@ static int __init imx_udc_probe(struct platform_device *pdev) | |||
| 1416 | return -ENODEV; | 1417 | return -ENODEV; |
| 1417 | } | 1418 | } |
| 1418 | 1419 | ||
| 1419 | res_size = res->end - res->start + 1; | 1420 | res_size = resource_size(res); |
| 1420 | if (!request_mem_region(res->start, res_size, res->name)) { | 1421 | if (!request_mem_region(res->start, res_size, res->name)) { |
| 1421 | dev_err(&pdev->dev, "can't allocate %d bytes at %d address\n", | 1422 | dev_err(&pdev->dev, "can't allocate %d bytes at %d address\n", |
| 1422 | res_size, res->start); | 1423 | res_size, res->start); |
| @@ -1527,8 +1528,7 @@ static int __exit imx_udc_remove(struct platform_device *pdev) | |||
| 1527 | clk_disable(imx_usb->clk); | 1528 | clk_disable(imx_usb->clk); |
| 1528 | iounmap(imx_usb->base); | 1529 | iounmap(imx_usb->base); |
| 1529 | 1530 | ||
| 1530 | release_mem_region(imx_usb->res->start, | 1531 | release_mem_region(imx_usb->res->start, resource_size(imx_usb->res)); |
| 1531 | imx_usb->res->end - imx_usb->res->start + 1); | ||
| 1532 | 1532 | ||
| 1533 | if (pdata->exit) | 1533 | if (pdata->exit) |
| 1534 | pdata->exit(&pdev->dev); | 1534 | pdata->exit(&pdev->dev); |
diff --git a/drivers/usb/host/ehci-sched.c b/drivers/usb/host/ehci-sched.c index 3ea05936851f..3efa59b18044 100644 --- a/drivers/usb/host/ehci-sched.c +++ b/drivers/usb/host/ehci-sched.c | |||
| @@ -1425,6 +1425,7 @@ iso_stream_schedule ( | |||
| 1425 | status = -EFBIG; | 1425 | status = -EFBIG; |
| 1426 | goto fail; | 1426 | goto fail; |
| 1427 | } | 1427 | } |
| 1428 | stream->next_uframe = start; | ||
| 1428 | goto ready; | 1429 | goto ready; |
| 1429 | } | 1430 | } |
| 1430 | 1431 | ||
diff --git a/drivers/usb/host/isp1362-hcd.c b/drivers/usb/host/isp1362-hcd.c index e35d82808bab..5c774ab98252 100644 --- a/drivers/usb/host/isp1362-hcd.c +++ b/drivers/usb/host/isp1362-hcd.c | |||
| @@ -2284,10 +2284,10 @@ static int isp1362_mem_config(struct usb_hcd *hcd) | |||
| 2284 | dev_info(hcd->self.controller, "ISP1362 Memory usage:\n"); | 2284 | dev_info(hcd->self.controller, "ISP1362 Memory usage:\n"); |
| 2285 | dev_info(hcd->self.controller, " ISTL: 2 * %4d: %4d @ $%04x:$%04x\n", | 2285 | dev_info(hcd->self.controller, " ISTL: 2 * %4d: %4d @ $%04x:$%04x\n", |
| 2286 | istl_size / 2, istl_size, 0, istl_size / 2); | 2286 | istl_size / 2, istl_size, 0, istl_size / 2); |
| 2287 | dev_info(hcd->self.controller, " INTL: %4d * (%3u+8): %4d @ $%04x\n", | 2287 | dev_info(hcd->self.controller, " INTL: %4d * (%3lu+8): %4d @ $%04x\n", |
| 2288 | ISP1362_INTL_BUFFERS, intl_blksize - PTD_HEADER_SIZE, | 2288 | ISP1362_INTL_BUFFERS, intl_blksize - PTD_HEADER_SIZE, |
| 2289 | intl_size, istl_size); | 2289 | intl_size, istl_size); |
| 2290 | dev_info(hcd->self.controller, " ATL : %4d * (%3u+8): %4d @ $%04x\n", | 2290 | dev_info(hcd->self.controller, " ATL : %4d * (%3lu+8): %4d @ $%04x\n", |
| 2291 | atl_buffers, atl_blksize - PTD_HEADER_SIZE, | 2291 | atl_buffers, atl_blksize - PTD_HEADER_SIZE, |
| 2292 | atl_size, istl_size + intl_size); | 2292 | atl_size, istl_size + intl_size); |
| 2293 | dev_info(hcd->self.controller, " USED/FREE: %4d %4d\n", total, | 2293 | dev_info(hcd->self.controller, " USED/FREE: %4d %4d\n", total, |
| @@ -2677,12 +2677,12 @@ static int __devexit isp1362_remove(struct platform_device *pdev) | |||
| 2677 | DBG(0, "%s: Removing HCD\n", __func__); | 2677 | DBG(0, "%s: Removing HCD\n", __func__); |
| 2678 | usb_remove_hcd(hcd); | 2678 | usb_remove_hcd(hcd); |
| 2679 | 2679 | ||
| 2680 | DBG(0, "%s: Unmapping data_reg @ %08x\n", __func__, | 2680 | DBG(0, "%s: Unmapping data_reg @ %p\n", __func__, |
| 2681 | (u32)isp1362_hcd->data_reg); | 2681 | isp1362_hcd->data_reg); |
| 2682 | iounmap(isp1362_hcd->data_reg); | 2682 | iounmap(isp1362_hcd->data_reg); |
| 2683 | 2683 | ||
| 2684 | DBG(0, "%s: Unmapping addr_reg @ %08x\n", __func__, | 2684 | DBG(0, "%s: Unmapping addr_reg @ %p\n", __func__, |
| 2685 | (u32)isp1362_hcd->addr_reg); | 2685 | isp1362_hcd->addr_reg); |
| 2686 | iounmap(isp1362_hcd->addr_reg); | 2686 | iounmap(isp1362_hcd->addr_reg); |
| 2687 | 2687 | ||
| 2688 | res = platform_get_resource(pdev, IORESOURCE_MEM, 1); | 2688 | res = platform_get_resource(pdev, IORESOURCE_MEM, 1); |
| @@ -2810,16 +2810,16 @@ static int __init isp1362_probe(struct platform_device *pdev) | |||
| 2810 | return 0; | 2810 | return 0; |
| 2811 | 2811 | ||
| 2812 | err6: | 2812 | err6: |
| 2813 | DBG(0, "%s: Freeing dev %08x\n", __func__, (u32)isp1362_hcd); | 2813 | DBG(0, "%s: Freeing dev %p\n", __func__, isp1362_hcd); |
| 2814 | usb_put_hcd(hcd); | 2814 | usb_put_hcd(hcd); |
| 2815 | err5: | 2815 | err5: |
| 2816 | DBG(0, "%s: Unmapping data_reg @ %08x\n", __func__, (u32)data_reg); | 2816 | DBG(0, "%s: Unmapping data_reg @ %p\n", __func__, data_reg); |
| 2817 | iounmap(data_reg); | 2817 | iounmap(data_reg); |
| 2818 | err4: | 2818 | err4: |
| 2819 | DBG(0, "%s: Releasing mem region %08lx\n", __func__, (long unsigned int)data->start); | 2819 | DBG(0, "%s: Releasing mem region %08lx\n", __func__, (long unsigned int)data->start); |
| 2820 | release_mem_region(data->start, resource_len(data)); | 2820 | release_mem_region(data->start, resource_len(data)); |
| 2821 | err3: | 2821 | err3: |
| 2822 | DBG(0, "%s: Unmapping addr_reg @ %08x\n", __func__, (u32)addr_reg); | 2822 | DBG(0, "%s: Unmapping addr_reg @ %p\n", __func__, addr_reg); |
| 2823 | iounmap(addr_reg); | 2823 | iounmap(addr_reg); |
| 2824 | err2: | 2824 | err2: |
| 2825 | DBG(0, "%s: Releasing mem region %08lx\n", __func__, (long unsigned int)addr->start); | 2825 | DBG(0, "%s: Releasing mem region %08lx\n", __func__, (long unsigned int)addr->start); |
diff --git a/drivers/usb/host/isp1362.h b/drivers/usb/host/isp1362.h index fe60f62a32f3..1a253ebf7e50 100644 --- a/drivers/usb/host/isp1362.h +++ b/drivers/usb/host/isp1362.h | |||
| @@ -580,7 +580,7 @@ static inline const char *ISP1362_INT_NAME(int n) | |||
| 580 | 580 | ||
| 581 | static inline void ALIGNSTAT(struct isp1362_hcd *isp1362_hcd, void *ptr) | 581 | static inline void ALIGNSTAT(struct isp1362_hcd *isp1362_hcd, void *ptr) |
| 582 | { | 582 | { |
| 583 | unsigned p = (unsigned)ptr; | 583 | unsigned long p = (unsigned long)ptr; |
| 584 | if (!(p & 0xf)) | 584 | if (!(p & 0xf)) |
| 585 | isp1362_hcd->stat16++; | 585 | isp1362_hcd->stat16++; |
| 586 | else if (!(p & 0x7)) | 586 | else if (!(p & 0x7)) |
| @@ -770,7 +770,7 @@ static void isp1362_write_fifo(struct isp1362_hcd *isp1362_hcd, void *buf, u16 l | |||
| 770 | if (!len) | 770 | if (!len) |
| 771 | return; | 771 | return; |
| 772 | 772 | ||
| 773 | if ((unsigned)dp & 0x1) { | 773 | if ((unsigned long)dp & 0x1) { |
| 774 | /* not aligned */ | 774 | /* not aligned */ |
| 775 | for (; len > 1; len -= 2) { | 775 | for (; len > 1; len -= 2) { |
| 776 | data = *dp++; | 776 | data = *dp++; |
| @@ -962,8 +962,8 @@ static void isp1362_read_buffer(struct isp1362_hcd *isp1362_hcd, void *buf, u16 | |||
| 962 | 962 | ||
| 963 | isp1362_write_diraddr(isp1362_hcd, offset, len); | 963 | isp1362_write_diraddr(isp1362_hcd, offset, len); |
| 964 | 964 | ||
| 965 | DBG(3, "%s: Reading %d byte from buffer @%04x to memory @ %08x\n", __func__, | 965 | DBG(3, "%s: Reading %d byte from buffer @%04x to memory @ %p\n", |
| 966 | len, offset, (u32)buf); | 966 | __func__, len, offset, buf); |
| 967 | 967 | ||
| 968 | isp1362_write_reg16(isp1362_hcd, HCuPINT, HCuPINT_EOT); | 968 | isp1362_write_reg16(isp1362_hcd, HCuPINT, HCuPINT_EOT); |
| 969 | _WARN_ON((isp1362_read_reg16(isp1362_hcd, HCuPINT) & HCuPINT_EOT)); | 969 | _WARN_ON((isp1362_read_reg16(isp1362_hcd, HCuPINT) & HCuPINT_EOT)); |
| @@ -982,8 +982,8 @@ static void isp1362_write_buffer(struct isp1362_hcd *isp1362_hcd, void *buf, u16 | |||
| 982 | 982 | ||
| 983 | isp1362_write_diraddr(isp1362_hcd, offset, len); | 983 | isp1362_write_diraddr(isp1362_hcd, offset, len); |
| 984 | 984 | ||
| 985 | DBG(3, "%s: Writing %d byte to buffer @%04x from memory @ %08x\n", __func__, | 985 | DBG(3, "%s: Writing %d byte to buffer @%04x from memory @ %p\n", |
| 986 | len, offset, (u32)buf); | 986 | __func__, len, offset, buf); |
| 987 | 987 | ||
| 988 | isp1362_write_reg16(isp1362_hcd, HCuPINT, HCuPINT_EOT); | 988 | isp1362_write_reg16(isp1362_hcd, HCuPINT, HCuPINT_EOT); |
| 989 | _WARN_ON((isp1362_read_reg16(isp1362_hcd, HCuPINT) & HCuPINT_EOT)); | 989 | _WARN_ON((isp1362_read_reg16(isp1362_hcd, HCuPINT) & HCuPINT_EOT)); |
diff --git a/drivers/usb/host/xhci-hcd.c b/drivers/usb/host/xhci-hcd.c index 99911e727e0b..932f99938481 100644 --- a/drivers/usb/host/xhci-hcd.c +++ b/drivers/usb/host/xhci-hcd.c | |||
| @@ -335,6 +335,12 @@ void xhci_event_ring_work(unsigned long arg) | |||
| 335 | spin_lock_irqsave(&xhci->lock, flags); | 335 | spin_lock_irqsave(&xhci->lock, flags); |
| 336 | temp = xhci_readl(xhci, &xhci->op_regs->status); | 336 | temp = xhci_readl(xhci, &xhci->op_regs->status); |
| 337 | xhci_dbg(xhci, "op reg status = 0x%x\n", temp); | 337 | xhci_dbg(xhci, "op reg status = 0x%x\n", temp); |
| 338 | if (temp == 0xffffffff) { | ||
| 339 | xhci_dbg(xhci, "HW died, polling stopped.\n"); | ||
| 340 | spin_unlock_irqrestore(&xhci->lock, flags); | ||
| 341 | return; | ||
| 342 | } | ||
| 343 | |||
| 338 | temp = xhci_readl(xhci, &xhci->ir_set->irq_pending); | 344 | temp = xhci_readl(xhci, &xhci->ir_set->irq_pending); |
| 339 | xhci_dbg(xhci, "ir_set 0 pending = 0x%x\n", temp); | 345 | xhci_dbg(xhci, "ir_set 0 pending = 0x%x\n", temp); |
| 340 | xhci_dbg(xhci, "No-op commands handled = %d\n", xhci->noops_handled); | 346 | xhci_dbg(xhci, "No-op commands handled = %d\n", xhci->noops_handled); |
| @@ -776,6 +782,7 @@ int xhci_urb_dequeue(struct usb_hcd *hcd, struct urb *urb, int status) | |||
| 776 | { | 782 | { |
| 777 | unsigned long flags; | 783 | unsigned long flags; |
| 778 | int ret; | 784 | int ret; |
| 785 | u32 temp; | ||
| 779 | struct xhci_hcd *xhci; | 786 | struct xhci_hcd *xhci; |
| 780 | struct xhci_td *td; | 787 | struct xhci_td *td; |
| 781 | unsigned int ep_index; | 788 | unsigned int ep_index; |
| @@ -788,6 +795,17 @@ int xhci_urb_dequeue(struct usb_hcd *hcd, struct urb *urb, int status) | |||
| 788 | ret = usb_hcd_check_unlink_urb(hcd, urb, status); | 795 | ret = usb_hcd_check_unlink_urb(hcd, urb, status); |
| 789 | if (ret || !urb->hcpriv) | 796 | if (ret || !urb->hcpriv) |
| 790 | goto done; | 797 | goto done; |
| 798 | temp = xhci_readl(xhci, &xhci->op_regs->status); | ||
| 799 | if (temp == 0xffffffff) { | ||
| 800 | xhci_dbg(xhci, "HW died, freeing TD.\n"); | ||
| 801 | td = (struct xhci_td *) urb->hcpriv; | ||
| 802 | |||
| 803 | usb_hcd_unlink_urb_from_ep(hcd, urb); | ||
| 804 | spin_unlock_irqrestore(&xhci->lock, flags); | ||
| 805 | usb_hcd_giveback_urb(xhci_to_hcd(xhci), urb, -ESHUTDOWN); | ||
| 806 | kfree(td); | ||
| 807 | return ret; | ||
| 808 | } | ||
| 791 | 809 | ||
| 792 | xhci_dbg(xhci, "Cancel URB %p\n", urb); | 810 | xhci_dbg(xhci, "Cancel URB %p\n", urb); |
| 793 | xhci_dbg(xhci, "Event ring:\n"); | 811 | xhci_dbg(xhci, "Event ring:\n"); |
| @@ -877,7 +895,7 @@ int xhci_drop_endpoint(struct usb_hcd *hcd, struct usb_device *udev, | |||
| 877 | ctrl_ctx->drop_flags |= drop_flag; | 895 | ctrl_ctx->drop_flags |= drop_flag; |
| 878 | new_drop_flags = ctrl_ctx->drop_flags; | 896 | new_drop_flags = ctrl_ctx->drop_flags; |
| 879 | 897 | ||
| 880 | ctrl_ctx->add_flags = ~drop_flag; | 898 | ctrl_ctx->add_flags &= ~drop_flag; |
| 881 | new_add_flags = ctrl_ctx->add_flags; | 899 | new_add_flags = ctrl_ctx->add_flags; |
| 882 | 900 | ||
| 883 | last_ctx = xhci_last_valid_endpoint(ctrl_ctx->add_flags); | 901 | last_ctx = xhci_last_valid_endpoint(ctrl_ctx->add_flags); |
| @@ -1410,11 +1428,20 @@ void xhci_free_dev(struct usb_hcd *hcd, struct usb_device *udev) | |||
| 1410 | { | 1428 | { |
| 1411 | struct xhci_hcd *xhci = hcd_to_xhci(hcd); | 1429 | struct xhci_hcd *xhci = hcd_to_xhci(hcd); |
| 1412 | unsigned long flags; | 1430 | unsigned long flags; |
| 1431 | u32 state; | ||
| 1413 | 1432 | ||
| 1414 | if (udev->slot_id == 0) | 1433 | if (udev->slot_id == 0) |
| 1415 | return; | 1434 | return; |
| 1416 | 1435 | ||
| 1417 | spin_lock_irqsave(&xhci->lock, flags); | 1436 | spin_lock_irqsave(&xhci->lock, flags); |
| 1437 | /* Don't disable the slot if the host controller is dead. */ | ||
| 1438 | state = xhci_readl(xhci, &xhci->op_regs->status); | ||
| 1439 | if (state == 0xffffffff) { | ||
| 1440 | xhci_free_virt_device(xhci, udev->slot_id); | ||
| 1441 | spin_unlock_irqrestore(&xhci->lock, flags); | ||
| 1442 | return; | ||
| 1443 | } | ||
| 1444 | |||
| 1418 | if (xhci_queue_slot_control(xhci, TRB_DISABLE_SLOT, udev->slot_id)) { | 1445 | if (xhci_queue_slot_control(xhci, TRB_DISABLE_SLOT, udev->slot_id)) { |
| 1419 | spin_unlock_irqrestore(&xhci->lock, flags); | 1446 | spin_unlock_irqrestore(&xhci->lock, flags); |
| 1420 | xhci_dbg(xhci, "FIXME: allocate a command ring segment\n"); | 1447 | xhci_dbg(xhci, "FIXME: allocate a command ring segment\n"); |
diff --git a/drivers/usb/misc/usblcd.c b/drivers/usb/misc/usblcd.c index 29092b8e59ce..4fb120357c55 100644 --- a/drivers/usb/misc/usblcd.c +++ b/drivers/usb/misc/usblcd.c | |||
| @@ -313,7 +313,8 @@ static int lcd_probe(struct usb_interface *interface, const struct usb_device_id | |||
| 313 | 313 | ||
| 314 | if (le16_to_cpu(dev->udev->descriptor.idProduct) != 0x0001) { | 314 | if (le16_to_cpu(dev->udev->descriptor.idProduct) != 0x0001) { |
| 315 | dev_warn(&interface->dev, "USBLCD model not supported.\n"); | 315 | dev_warn(&interface->dev, "USBLCD model not supported.\n"); |
| 316 | return -ENODEV; | 316 | retval = -ENODEV; |
| 317 | goto error; | ||
| 317 | } | 318 | } |
| 318 | 319 | ||
| 319 | /* set up the endpoint information */ | 320 | /* set up the endpoint information */ |
diff --git a/drivers/usb/musb/Kconfig b/drivers/usb/musb/Kconfig index 803adcb5ac1d..760e7271d17b 100644 --- a/drivers/usb/musb/Kconfig +++ b/drivers/usb/musb/Kconfig | |||
| @@ -8,7 +8,7 @@ comment "Enable Host or Gadget support to see Inventra options" | |||
| 8 | 8 | ||
| 9 | # (M)HDRC = (Multipoint) Highspeed Dual-Role Controller | 9 | # (M)HDRC = (Multipoint) Highspeed Dual-Role Controller |
| 10 | config USB_MUSB_HDRC | 10 | config USB_MUSB_HDRC |
| 11 | depends on (USB || USB_GADGET) && HAVE_CLK | 11 | depends on (USB || USB_GADGET) |
| 12 | depends on !SUPERH | 12 | depends on !SUPERH |
| 13 | select NOP_USB_XCEIV if ARCH_DAVINCI | 13 | select NOP_USB_XCEIV if ARCH_DAVINCI |
| 14 | select TWL4030_USB if MACH_OMAP_3430SDP | 14 | select TWL4030_USB if MACH_OMAP_3430SDP |
diff --git a/drivers/usb/musb/blackfin.c b/drivers/usb/musb/blackfin.c index f2f66ebc7362..fcec87ea709e 100644 --- a/drivers/usb/musb/blackfin.c +++ b/drivers/usb/musb/blackfin.c | |||
| @@ -14,7 +14,6 @@ | |||
| 14 | #include <linux/slab.h> | 14 | #include <linux/slab.h> |
| 15 | #include <linux/init.h> | 15 | #include <linux/init.h> |
| 16 | #include <linux/list.h> | 16 | #include <linux/list.h> |
| 17 | #include <linux/clk.h> | ||
| 18 | #include <linux/gpio.h> | 17 | #include <linux/gpio.h> |
| 19 | #include <linux/io.h> | 18 | #include <linux/io.h> |
| 20 | 19 | ||
diff --git a/drivers/usb/musb/musb_core.h b/drivers/usb/musb/musb_core.h index 381d648a36b8..6aa5f22e5274 100644 --- a/drivers/usb/musb/musb_core.h +++ b/drivers/usb/musb/musb_core.h | |||
| @@ -95,6 +95,13 @@ struct musb_ep; | |||
| 95 | #endif | 95 | #endif |
| 96 | #endif /* need MUSB gadget selection */ | 96 | #endif /* need MUSB gadget selection */ |
| 97 | 97 | ||
| 98 | #ifndef CONFIG_HAVE_CLK | ||
| 99 | /* Dummy stub for clk framework */ | ||
| 100 | #define clk_get(dev, id) NULL | ||
| 101 | #define clk_put(clock) do {} while (0) | ||
| 102 | #define clk_enable(clock) do {} while (0) | ||
| 103 | #define clk_disable(clock) do {} while (0) | ||
| 104 | #endif | ||
| 98 | 105 | ||
| 99 | #ifdef CONFIG_PROC_FS | 106 | #ifdef CONFIG_PROC_FS |
| 100 | #include <linux/fs.h> | 107 | #include <linux/fs.h> |
diff --git a/drivers/usb/musb/musb_regs.h b/drivers/usb/musb/musb_regs.h index fbfd3fd9ce1f..cc1d71b57d3c 100644 --- a/drivers/usb/musb/musb_regs.h +++ b/drivers/usb/musb/musb_regs.h | |||
| @@ -439,15 +439,6 @@ static inline void musb_write_txhubport(void __iomem *mbase, u8 epnum, | |||
| 439 | /* Not implemented - HW has seperate Tx/Rx FIFO */ | 439 | /* Not implemented - HW has seperate Tx/Rx FIFO */ |
| 440 | #define MUSB_TXCSR_MODE 0x0000 | 440 | #define MUSB_TXCSR_MODE 0x0000 |
| 441 | 441 | ||
| 442 | /* | ||
| 443 | * Dummy stub for clk framework, it will be removed | ||
| 444 | * until Blackfin supports clk framework | ||
| 445 | */ | ||
| 446 | #define clk_get(dev, id) NULL | ||
| 447 | #define clk_put(clock) do {} while (0) | ||
| 448 | #define clk_enable(clock) do {} while (0) | ||
| 449 | #define clk_disable(clock) do {} while (0) | ||
| 450 | |||
| 451 | static inline void musb_write_txfifosz(void __iomem *mbase, u8 c_size) | 442 | static inline void musb_write_txfifosz(void __iomem *mbase, u8 c_size) |
| 452 | { | 443 | { |
| 453 | } | 444 | } |
diff --git a/drivers/usb/serial/aircable.c b/drivers/usb/serial/aircable.c index 2cbfab3716e5..b10ac8409411 100644 --- a/drivers/usb/serial/aircable.c +++ b/drivers/usb/serial/aircable.c | |||
| @@ -554,13 +554,12 @@ static void aircable_throttle(struct tty_struct *tty) | |||
| 554 | { | 554 | { |
| 555 | struct usb_serial_port *port = tty->driver_data; | 555 | struct usb_serial_port *port = tty->driver_data; |
| 556 | struct aircable_private *priv = usb_get_serial_port_data(port); | 556 | struct aircable_private *priv = usb_get_serial_port_data(port); |
| 557 | unsigned long flags; | ||
| 558 | 557 | ||
| 559 | dbg("%s - port %d", __func__, port->number); | 558 | dbg("%s - port %d", __func__, port->number); |
| 560 | 559 | ||
| 561 | spin_lock_irqsave(&priv->rx_lock, flags); | 560 | spin_lock_irq(&priv->rx_lock); |
| 562 | priv->rx_flags |= THROTTLED; | 561 | priv->rx_flags |= THROTTLED; |
| 563 | spin_unlock_irqrestore(&priv->rx_lock, flags); | 562 | spin_unlock_irq(&priv->rx_lock); |
| 564 | } | 563 | } |
| 565 | 564 | ||
| 566 | /* Based on ftdi_sio.c unthrottle */ | 565 | /* Based on ftdi_sio.c unthrottle */ |
| @@ -569,14 +568,13 @@ static void aircable_unthrottle(struct tty_struct *tty) | |||
| 569 | struct usb_serial_port *port = tty->driver_data; | 568 | struct usb_serial_port *port = tty->driver_data; |
| 570 | struct aircable_private *priv = usb_get_serial_port_data(port); | 569 | struct aircable_private *priv = usb_get_serial_port_data(port); |
| 571 | int actually_throttled; | 570 | int actually_throttled; |
| 572 | unsigned long flags; | ||
| 573 | 571 | ||
| 574 | dbg("%s - port %d", __func__, port->number); | 572 | dbg("%s - port %d", __func__, port->number); |
| 575 | 573 | ||
| 576 | spin_lock_irqsave(&priv->rx_lock, flags); | 574 | spin_lock_irq(&priv->rx_lock); |
| 577 | actually_throttled = priv->rx_flags & ACTUALLY_THROTTLED; | 575 | actually_throttled = priv->rx_flags & ACTUALLY_THROTTLED; |
| 578 | priv->rx_flags &= ~(THROTTLED | ACTUALLY_THROTTLED); | 576 | priv->rx_flags &= ~(THROTTLED | ACTUALLY_THROTTLED); |
| 579 | spin_unlock_irqrestore(&priv->rx_lock, flags); | 577 | spin_unlock_irq(&priv->rx_lock); |
| 580 | 578 | ||
| 581 | if (actually_throttled) | 579 | if (actually_throttled) |
| 582 | schedule_work(&priv->rx_work); | 580 | schedule_work(&priv->rx_work); |
diff --git a/drivers/usb/serial/cp210x.c b/drivers/usb/serial/cp210x.c index 4a208fe85bc9..698252a4dc5d 100644 --- a/drivers/usb/serial/cp210x.c +++ b/drivers/usb/serial/cp210x.c | |||
| @@ -113,6 +113,7 @@ static struct usb_device_id id_table [] = { | |||
| 113 | { USB_DEVICE(0x166A, 0x0303) }, /* Clipsal 5500PCU C-Bus USB interface */ | 113 | { USB_DEVICE(0x166A, 0x0303) }, /* Clipsal 5500PCU C-Bus USB interface */ |
| 114 | { USB_DEVICE(0x16D6, 0x0001) }, /* Jablotron serial interface */ | 114 | { USB_DEVICE(0x16D6, 0x0001) }, /* Jablotron serial interface */ |
| 115 | { USB_DEVICE(0x18EF, 0xE00F) }, /* ELV USB-I2C-Interface */ | 115 | { USB_DEVICE(0x18EF, 0xE00F) }, /* ELV USB-I2C-Interface */ |
| 116 | { USB_DEVICE(0x413C, 0x9500) }, /* DW700 GPS USB interface */ | ||
| 116 | { } /* Terminating Entry */ | 117 | { } /* Terminating Entry */ |
| 117 | }; | 118 | }; |
| 118 | 119 | ||
diff --git a/drivers/usb/serial/cypress_m8.c b/drivers/usb/serial/cypress_m8.c index e0a8b715f2f2..a591ebec0f89 100644 --- a/drivers/usb/serial/cypress_m8.c +++ b/drivers/usb/serial/cypress_m8.c | |||
| @@ -1155,13 +1155,12 @@ static void cypress_throttle(struct tty_struct *tty) | |||
| 1155 | { | 1155 | { |
| 1156 | struct usb_serial_port *port = tty->driver_data; | 1156 | struct usb_serial_port *port = tty->driver_data; |
| 1157 | struct cypress_private *priv = usb_get_serial_port_data(port); | 1157 | struct cypress_private *priv = usb_get_serial_port_data(port); |
| 1158 | unsigned long flags; | ||
| 1159 | 1158 | ||
| 1160 | dbg("%s - port %d", __func__, port->number); | 1159 | dbg("%s - port %d", __func__, port->number); |
| 1161 | 1160 | ||
| 1162 | spin_lock_irqsave(&priv->lock, flags); | 1161 | spin_lock_irq(&priv->lock); |
| 1163 | priv->rx_flags = THROTTLED; | 1162 | priv->rx_flags = THROTTLED; |
| 1164 | spin_unlock_irqrestore(&priv->lock, flags); | 1163 | spin_unlock_irq(&priv->lock); |
| 1165 | } | 1164 | } |
| 1166 | 1165 | ||
| 1167 | 1166 | ||
| @@ -1170,14 +1169,13 @@ static void cypress_unthrottle(struct tty_struct *tty) | |||
| 1170 | struct usb_serial_port *port = tty->driver_data; | 1169 | struct usb_serial_port *port = tty->driver_data; |
| 1171 | struct cypress_private *priv = usb_get_serial_port_data(port); | 1170 | struct cypress_private *priv = usb_get_serial_port_data(port); |
| 1172 | int actually_throttled, result; | 1171 | int actually_throttled, result; |
| 1173 | unsigned long flags; | ||
| 1174 | 1172 | ||
| 1175 | dbg("%s - port %d", __func__, port->number); | 1173 | dbg("%s - port %d", __func__, port->number); |
| 1176 | 1174 | ||
| 1177 | spin_lock_irqsave(&priv->lock, flags); | 1175 | spin_lock_irq(&priv->lock); |
| 1178 | actually_throttled = priv->rx_flags & ACTUALLY_THROTTLED; | 1176 | actually_throttled = priv->rx_flags & ACTUALLY_THROTTLED; |
| 1179 | priv->rx_flags = 0; | 1177 | priv->rx_flags = 0; |
| 1180 | spin_unlock_irqrestore(&priv->lock, flags); | 1178 | spin_unlock_irq(&priv->lock); |
| 1181 | 1179 | ||
| 1182 | if (!priv->comm_is_ok) | 1180 | if (!priv->comm_is_ok) |
| 1183 | return; | 1181 | return; |
| @@ -1185,7 +1183,7 @@ static void cypress_unthrottle(struct tty_struct *tty) | |||
| 1185 | if (actually_throttled) { | 1183 | if (actually_throttled) { |
| 1186 | port->interrupt_in_urb->dev = port->serial->dev; | 1184 | port->interrupt_in_urb->dev = port->serial->dev; |
| 1187 | 1185 | ||
| 1188 | result = usb_submit_urb(port->interrupt_in_urb, GFP_ATOMIC); | 1186 | result = usb_submit_urb(port->interrupt_in_urb, GFP_KERNEL); |
| 1189 | if (result) { | 1187 | if (result) { |
| 1190 | dev_err(&port->dev, "%s - failed submitting read urb, " | 1188 | dev_err(&port->dev, "%s - failed submitting read urb, " |
| 1191 | "error %d\n", __func__, result); | 1189 | "error %d\n", __func__, result); |
diff --git a/drivers/usb/serial/digi_acceleport.c b/drivers/usb/serial/digi_acceleport.c index ab3dd991586b..68e80be6b9e1 100644 --- a/drivers/usb/serial/digi_acceleport.c +++ b/drivers/usb/serial/digi_acceleport.c | |||
| @@ -898,16 +898,16 @@ static void digi_rx_unthrottle(struct tty_struct *tty) | |||
| 898 | 898 | ||
| 899 | spin_lock_irqsave(&priv->dp_port_lock, flags); | 899 | spin_lock_irqsave(&priv->dp_port_lock, flags); |
| 900 | 900 | ||
| 901 | /* turn throttle off */ | ||
| 902 | priv->dp_throttled = 0; | ||
| 903 | priv->dp_throttle_restart = 0; | ||
| 904 | |||
| 905 | /* restart read chain */ | 901 | /* restart read chain */ |
| 906 | if (priv->dp_throttle_restart) { | 902 | if (priv->dp_throttle_restart) { |
| 907 | port->read_urb->dev = port->serial->dev; | 903 | port->read_urb->dev = port->serial->dev; |
| 908 | ret = usb_submit_urb(port->read_urb, GFP_ATOMIC); | 904 | ret = usb_submit_urb(port->read_urb, GFP_ATOMIC); |
| 909 | } | 905 | } |
| 910 | 906 | ||
| 907 | /* turn throttle off */ | ||
| 908 | priv->dp_throttled = 0; | ||
| 909 | priv->dp_throttle_restart = 0; | ||
| 910 | |||
| 911 | spin_unlock_irqrestore(&priv->dp_port_lock, flags); | 911 | spin_unlock_irqrestore(&priv->dp_port_lock, flags); |
| 912 | 912 | ||
| 913 | if (ret) | 913 | if (ret) |
diff --git a/drivers/usb/serial/empeg.c b/drivers/usb/serial/empeg.c index 33c9e9cf9eb2..7dd0e3eadbe6 100644 --- a/drivers/usb/serial/empeg.c +++ b/drivers/usb/serial/empeg.c | |||
| @@ -391,7 +391,7 @@ static void empeg_unthrottle(struct tty_struct *tty) | |||
| 391 | dbg("%s - port %d", __func__, port->number); | 391 | dbg("%s - port %d", __func__, port->number); |
| 392 | 392 | ||
| 393 | port->read_urb->dev = port->serial->dev; | 393 | port->read_urb->dev = port->serial->dev; |
| 394 | result = usb_submit_urb(port->read_urb, GFP_ATOMIC); | 394 | result = usb_submit_urb(port->read_urb, GFP_KERNEL); |
| 395 | if (result) | 395 | if (result) |
| 396 | dev_err(&port->dev, | 396 | dev_err(&port->dev, |
| 397 | "%s - failed submitting read urb, error %d\n", | 397 | "%s - failed submitting read urb, error %d\n", |
diff --git a/drivers/usb/serial/ftdi_sio.c b/drivers/usb/serial/ftdi_sio.c index 4f883b1773d0..9c60d6d4908a 100644 --- a/drivers/usb/serial/ftdi_sio.c +++ b/drivers/usb/serial/ftdi_sio.c | |||
| @@ -76,13 +76,7 @@ struct ftdi_private { | |||
| 76 | unsigned long last_dtr_rts; /* saved modem control outputs */ | 76 | unsigned long last_dtr_rts; /* saved modem control outputs */ |
| 77 | wait_queue_head_t delta_msr_wait; /* Used for TIOCMIWAIT */ | 77 | wait_queue_head_t delta_msr_wait; /* Used for TIOCMIWAIT */ |
| 78 | char prev_status, diff_status; /* Used for TIOCMIWAIT */ | 78 | char prev_status, diff_status; /* Used for TIOCMIWAIT */ |
| 79 | __u8 rx_flags; /* receive state flags (throttling) */ | ||
| 80 | spinlock_t rx_lock; /* spinlock for receive state */ | ||
| 81 | struct delayed_work rx_work; | ||
| 82 | struct usb_serial_port *port; | 79 | struct usb_serial_port *port; |
| 83 | int rx_processed; | ||
| 84 | unsigned long rx_bytes; | ||
| 85 | |||
| 86 | __u16 interface; /* FT2232C, FT2232H or FT4232H port interface | 80 | __u16 interface; /* FT2232C, FT2232H or FT4232H port interface |
| 87 | (0 for FT232/245) */ | 81 | (0 for FT232/245) */ |
| 88 | 82 | ||
| @@ -737,10 +731,6 @@ static const char *ftdi_chip_name[] = { | |||
| 737 | /* Constants for read urb and write urb */ | 731 | /* Constants for read urb and write urb */ |
| 738 | #define BUFSZ 512 | 732 | #define BUFSZ 512 |
| 739 | 733 | ||
| 740 | /* rx_flags */ | ||
| 741 | #define THROTTLED 0x01 | ||
| 742 | #define ACTUALLY_THROTTLED 0x02 | ||
| 743 | |||
| 744 | /* Used for TIOCMIWAIT */ | 734 | /* Used for TIOCMIWAIT */ |
| 745 | #define FTDI_STATUS_B0_MASK (FTDI_RS0_CTS | FTDI_RS0_DSR | FTDI_RS0_RI | FTDI_RS0_RLSD) | 735 | #define FTDI_STATUS_B0_MASK (FTDI_RS0_CTS | FTDI_RS0_DSR | FTDI_RS0_RI | FTDI_RS0_RLSD) |
| 746 | #define FTDI_STATUS_B1_MASK (FTDI_RS_BI) | 736 | #define FTDI_STATUS_B1_MASK (FTDI_RS_BI) |
| @@ -763,7 +753,7 @@ static int ftdi_write_room(struct tty_struct *tty); | |||
| 763 | static int ftdi_chars_in_buffer(struct tty_struct *tty); | 753 | static int ftdi_chars_in_buffer(struct tty_struct *tty); |
| 764 | static void ftdi_write_bulk_callback(struct urb *urb); | 754 | static void ftdi_write_bulk_callback(struct urb *urb); |
| 765 | static void ftdi_read_bulk_callback(struct urb *urb); | 755 | static void ftdi_read_bulk_callback(struct urb *urb); |
| 766 | static void ftdi_process_read(struct work_struct *work); | 756 | static void ftdi_process_read(struct usb_serial_port *port); |
| 767 | static void ftdi_set_termios(struct tty_struct *tty, | 757 | static void ftdi_set_termios(struct tty_struct *tty, |
| 768 | struct usb_serial_port *port, struct ktermios *old); | 758 | struct usb_serial_port *port, struct ktermios *old); |
| 769 | static int ftdi_tiocmget(struct tty_struct *tty, struct file *file); | 759 | static int ftdi_tiocmget(struct tty_struct *tty, struct file *file); |
| @@ -1234,7 +1224,6 @@ static int set_serial_info(struct tty_struct *tty, | |||
| 1234 | (new_serial.flags & ASYNC_FLAGS)); | 1224 | (new_serial.flags & ASYNC_FLAGS)); |
| 1235 | priv->custom_divisor = new_serial.custom_divisor; | 1225 | priv->custom_divisor = new_serial.custom_divisor; |
| 1236 | 1226 | ||
| 1237 | tty->low_latency = (priv->flags & ASYNC_LOW_LATENCY) ? 1 : 0; | ||
| 1238 | write_latency_timer(port); | 1227 | write_latency_timer(port); |
| 1239 | 1228 | ||
| 1240 | check_and_exit: | 1229 | check_and_exit: |
| @@ -1527,7 +1516,6 @@ static int ftdi_sio_port_probe(struct usb_serial_port *port) | |||
| 1527 | } | 1516 | } |
| 1528 | 1517 | ||
| 1529 | kref_init(&priv->kref); | 1518 | kref_init(&priv->kref); |
| 1530 | spin_lock_init(&priv->rx_lock); | ||
| 1531 | spin_lock_init(&priv->tx_lock); | 1519 | spin_lock_init(&priv->tx_lock); |
| 1532 | init_waitqueue_head(&priv->delta_msr_wait); | 1520 | init_waitqueue_head(&priv->delta_msr_wait); |
| 1533 | /* This will push the characters through immediately rather | 1521 | /* This will push the characters through immediately rather |
| @@ -1549,7 +1537,6 @@ static int ftdi_sio_port_probe(struct usb_serial_port *port) | |||
| 1549 | port->read_urb->transfer_buffer_length = BUFSZ; | 1537 | port->read_urb->transfer_buffer_length = BUFSZ; |
| 1550 | } | 1538 | } |
| 1551 | 1539 | ||
| 1552 | INIT_DELAYED_WORK(&priv->rx_work, ftdi_process_read); | ||
| 1553 | priv->port = port; | 1540 | priv->port = port; |
| 1554 | 1541 | ||
| 1555 | /* Free port's existing write urb and transfer buffer. */ | 1542 | /* Free port's existing write urb and transfer buffer. */ |
| @@ -1686,6 +1673,26 @@ static int ftdi_sio_port_remove(struct usb_serial_port *port) | |||
| 1686 | return 0; | 1673 | return 0; |
| 1687 | } | 1674 | } |
| 1688 | 1675 | ||
| 1676 | static int ftdi_submit_read_urb(struct usb_serial_port *port, gfp_t mem_flags) | ||
| 1677 | { | ||
| 1678 | struct urb *urb = port->read_urb; | ||
| 1679 | struct usb_serial *serial = port->serial; | ||
| 1680 | int result; | ||
| 1681 | |||
| 1682 | usb_fill_bulk_urb(urb, serial->dev, | ||
| 1683 | usb_rcvbulkpipe(serial->dev, | ||
| 1684 | port->bulk_in_endpointAddress), | ||
| 1685 | urb->transfer_buffer, | ||
| 1686 | urb->transfer_buffer_length, | ||
| 1687 | ftdi_read_bulk_callback, port); | ||
| 1688 | result = usb_submit_urb(urb, mem_flags); | ||
| 1689 | if (result) | ||
| 1690 | dev_err(&port->dev, | ||
| 1691 | "%s - failed submitting read urb, error %d\n", | ||
| 1692 | __func__, result); | ||
| 1693 | return result; | ||
| 1694 | } | ||
| 1695 | |||
| 1689 | static int ftdi_open(struct tty_struct *tty, struct usb_serial_port *port) | 1696 | static int ftdi_open(struct tty_struct *tty, struct usb_serial_port *port) |
| 1690 | { /* ftdi_open */ | 1697 | { /* ftdi_open */ |
| 1691 | struct usb_device *dev = port->serial->dev; | 1698 | struct usb_device *dev = port->serial->dev; |
| @@ -1700,12 +1707,6 @@ static int ftdi_open(struct tty_struct *tty, struct usb_serial_port *port) | |||
| 1700 | spin_lock_irqsave(&priv->tx_lock, flags); | 1707 | spin_lock_irqsave(&priv->tx_lock, flags); |
| 1701 | priv->tx_bytes = 0; | 1708 | priv->tx_bytes = 0; |
| 1702 | spin_unlock_irqrestore(&priv->tx_lock, flags); | 1709 | spin_unlock_irqrestore(&priv->tx_lock, flags); |
| 1703 | spin_lock_irqsave(&priv->rx_lock, flags); | ||
| 1704 | priv->rx_bytes = 0; | ||
| 1705 | spin_unlock_irqrestore(&priv->rx_lock, flags); | ||
| 1706 | |||
| 1707 | if (tty) | ||
| 1708 | tty->low_latency = (priv->flags & ASYNC_LOW_LATENCY) ? 1 : 0; | ||
| 1709 | 1710 | ||
| 1710 | write_latency_timer(port); | 1711 | write_latency_timer(port); |
| 1711 | 1712 | ||
| @@ -1725,23 +1726,14 @@ static int ftdi_open(struct tty_struct *tty, struct usb_serial_port *port) | |||
| 1725 | ftdi_set_termios(tty, port, tty->termios); | 1726 | ftdi_set_termios(tty, port, tty->termios); |
| 1726 | 1727 | ||
| 1727 | /* Not throttled */ | 1728 | /* Not throttled */ |
| 1728 | spin_lock_irqsave(&priv->rx_lock, flags); | 1729 | spin_lock_irqsave(&port->lock, flags); |
| 1729 | priv->rx_flags &= ~(THROTTLED | ACTUALLY_THROTTLED); | 1730 | port->throttled = 0; |
| 1730 | spin_unlock_irqrestore(&priv->rx_lock, flags); | 1731 | port->throttle_req = 0; |
| 1732 | spin_unlock_irqrestore(&port->lock, flags); | ||
| 1731 | 1733 | ||
| 1732 | /* Start reading from the device */ | 1734 | /* Start reading from the device */ |
| 1733 | priv->rx_processed = 0; | 1735 | result = ftdi_submit_read_urb(port, GFP_KERNEL); |
| 1734 | usb_fill_bulk_urb(port->read_urb, dev, | 1736 | if (!result) |
| 1735 | usb_rcvbulkpipe(dev, port->bulk_in_endpointAddress), | ||
| 1736 | port->read_urb->transfer_buffer, | ||
| 1737 | port->read_urb->transfer_buffer_length, | ||
| 1738 | ftdi_read_bulk_callback, port); | ||
| 1739 | result = usb_submit_urb(port->read_urb, GFP_KERNEL); | ||
| 1740 | if (result) | ||
| 1741 | dev_err(&port->dev, | ||
| 1742 | "%s - failed submitting read urb, error %d\n", | ||
| 1743 | __func__, result); | ||
| 1744 | else | ||
| 1745 | kref_get(&priv->kref); | 1737 | kref_get(&priv->kref); |
| 1746 | 1738 | ||
| 1747 | return result; | 1739 | return result; |
| @@ -1787,10 +1779,6 @@ static void ftdi_close(struct usb_serial_port *port) | |||
| 1787 | 1779 | ||
| 1788 | dbg("%s", __func__); | 1780 | dbg("%s", __func__); |
| 1789 | 1781 | ||
| 1790 | |||
| 1791 | /* cancel any scheduled reading */ | ||
| 1792 | cancel_delayed_work_sync(&priv->rx_work); | ||
| 1793 | |||
| 1794 | /* shutdown our bulk read */ | 1782 | /* shutdown our bulk read */ |
| 1795 | usb_kill_urb(port->read_urb); | 1783 | usb_kill_urb(port->read_urb); |
| 1796 | kref_put(&priv->kref, ftdi_sio_priv_release); | 1784 | kref_put(&priv->kref, ftdi_sio_priv_release); |
| @@ -2013,271 +2001,121 @@ static int ftdi_chars_in_buffer(struct tty_struct *tty) | |||
| 2013 | return buffered; | 2001 | return buffered; |
| 2014 | } | 2002 | } |
| 2015 | 2003 | ||
| 2016 | static void ftdi_read_bulk_callback(struct urb *urb) | 2004 | static int ftdi_process_packet(struct tty_struct *tty, |
| 2005 | struct usb_serial_port *port, struct ftdi_private *priv, | ||
| 2006 | char *packet, int len) | ||
| 2017 | { | 2007 | { |
| 2018 | struct usb_serial_port *port = urb->context; | 2008 | int i; |
| 2019 | struct tty_struct *tty; | 2009 | char status; |
| 2020 | struct ftdi_private *priv; | 2010 | char flag; |
| 2021 | unsigned long countread; | 2011 | char *ch; |
| 2022 | unsigned long flags; | ||
| 2023 | int status = urb->status; | ||
| 2024 | |||
| 2025 | if (urb->number_of_packets > 0) { | ||
| 2026 | dev_err(&port->dev, "%s transfer_buffer_length %d " | ||
| 2027 | "actual_length %d number of packets %d\n", __func__, | ||
| 2028 | urb->transfer_buffer_length, | ||
| 2029 | urb->actual_length, urb->number_of_packets); | ||
| 2030 | dev_err(&port->dev, "%s transfer_flags %x\n", __func__, | ||
| 2031 | urb->transfer_flags); | ||
| 2032 | } | ||
| 2033 | 2012 | ||
| 2034 | dbg("%s - port %d", __func__, port->number); | 2013 | dbg("%s - port %d", __func__, port->number); |
| 2035 | 2014 | ||
| 2036 | if (port->port.count <= 0) | 2015 | if (len < 2) { |
| 2037 | return; | 2016 | dbg("malformed packet"); |
| 2038 | 2017 | return 0; | |
| 2039 | tty = tty_port_tty_get(&port->port); | ||
| 2040 | if (!tty) { | ||
| 2041 | dbg("%s - bad tty pointer - exiting", __func__); | ||
| 2042 | return; | ||
| 2043 | } | 2018 | } |
| 2044 | 2019 | ||
| 2045 | priv = usb_get_serial_port_data(port); | 2020 | /* Compare new line status to the old one, signal if different/ |
| 2046 | if (!priv) { | 2021 | N.B. packet may be processed more than once, but differences |
| 2047 | dbg("%s - bad port private data pointer - exiting", __func__); | 2022 | are only processed once. */ |
| 2048 | goto out; | 2023 | status = packet[0] & FTDI_STATUS_B0_MASK; |
| 2024 | if (status != priv->prev_status) { | ||
| 2025 | priv->diff_status |= status ^ priv->prev_status; | ||
| 2026 | wake_up_interruptible(&priv->delta_msr_wait); | ||
| 2027 | priv->prev_status = status; | ||
| 2049 | } | 2028 | } |
| 2050 | 2029 | ||
| 2051 | if (urb != port->read_urb) | 2030 | /* |
| 2052 | dev_err(&port->dev, "%s - Not my urb!\n", __func__); | 2031 | * Although the device uses a bitmask and hence can have multiple |
| 2053 | 2032 | * errors on a packet - the order here sets the priority the error is | |
| 2054 | if (status) { | 2033 | * returned to the tty layer. |
| 2055 | /* This will happen at close every time so it is a dbg not an | 2034 | */ |
| 2056 | err */ | 2035 | flag = TTY_NORMAL; |
| 2057 | dbg("(this is ok on close) nonzero read bulk status received: %d", status); | 2036 | if (packet[1] & FTDI_RS_OE) { |
| 2058 | goto out; | 2037 | flag = TTY_OVERRUN; |
| 2038 | dbg("OVERRRUN error"); | ||
| 2039 | } | ||
| 2040 | if (packet[1] & FTDI_RS_BI) { | ||
| 2041 | flag = TTY_BREAK; | ||
| 2042 | dbg("BREAK received"); | ||
| 2043 | usb_serial_handle_break(port); | ||
| 2044 | } | ||
| 2045 | if (packet[1] & FTDI_RS_PE) { | ||
| 2046 | flag = TTY_PARITY; | ||
| 2047 | dbg("PARITY error"); | ||
| 2048 | } | ||
| 2049 | if (packet[1] & FTDI_RS_FE) { | ||
| 2050 | flag = TTY_FRAME; | ||
| 2051 | dbg("FRAMING error"); | ||
| 2059 | } | 2052 | } |
| 2060 | 2053 | ||
| 2061 | /* count data bytes, but not status bytes */ | 2054 | len -= 2; |
| 2062 | countread = urb->actual_length; | 2055 | if (!len) |
| 2063 | countread -= 2 * DIV_ROUND_UP(countread, priv->max_packet_size); | 2056 | return 0; /* status only */ |
| 2064 | spin_lock_irqsave(&priv->rx_lock, flags); | 2057 | ch = packet + 2; |
| 2065 | priv->rx_bytes += countread; | 2058 | |
| 2066 | spin_unlock_irqrestore(&priv->rx_lock, flags); | 2059 | if (!(port->console && port->sysrq) && flag == TTY_NORMAL) |
| 2067 | 2060 | tty_insert_flip_string(tty, ch, len); | |
| 2068 | ftdi_process_read(&priv->rx_work.work); | 2061 | else { |
| 2069 | out: | 2062 | for (i = 0; i < len; i++, ch++) { |
| 2070 | tty_kref_put(tty); | 2063 | if (!usb_serial_handle_sysrq_char(tty, port, *ch)) |
| 2071 | } /* ftdi_read_bulk_callback */ | 2064 | tty_insert_flip_char(tty, *ch, flag); |
| 2072 | 2065 | } | |
| 2066 | } | ||
| 2067 | return len; | ||
| 2068 | } | ||
| 2073 | 2069 | ||
| 2074 | static void ftdi_process_read(struct work_struct *work) | 2070 | static void ftdi_process_read(struct usb_serial_port *port) |
| 2075 | { /* ftdi_process_read */ | 2071 | { |
| 2076 | struct ftdi_private *priv = | 2072 | struct urb *urb = port->read_urb; |
| 2077 | container_of(work, struct ftdi_private, rx_work.work); | ||
| 2078 | struct usb_serial_port *port = priv->port; | ||
| 2079 | struct urb *urb; | ||
| 2080 | struct tty_struct *tty; | 2073 | struct tty_struct *tty; |
| 2081 | char error_flag; | 2074 | struct ftdi_private *priv = usb_get_serial_port_data(port); |
| 2082 | unsigned char *data; | 2075 | char *data = (char *)urb->transfer_buffer; |
| 2083 | |||
| 2084 | int i; | 2076 | int i; |
| 2085 | int result; | 2077 | int len; |
| 2086 | int need_flip; | 2078 | int count = 0; |
| 2087 | int packet_offset; | ||
| 2088 | unsigned long flags; | ||
| 2089 | |||
| 2090 | dbg("%s - port %d", __func__, port->number); | ||
| 2091 | |||
| 2092 | if (port->port.count <= 0) | ||
| 2093 | return; | ||
| 2094 | 2079 | ||
| 2095 | tty = tty_port_tty_get(&port->port); | 2080 | tty = tty_port_tty_get(&port->port); |
| 2096 | if (!tty) { | 2081 | if (!tty) |
| 2097 | dbg("%s - bad tty pointer - exiting", __func__); | ||
| 2098 | return; | 2082 | return; |
| 2099 | } | ||
| 2100 | |||
| 2101 | priv = usb_get_serial_port_data(port); | ||
| 2102 | if (!priv) { | ||
| 2103 | dbg("%s - bad port private data pointer - exiting", __func__); | ||
| 2104 | goto out; | ||
| 2105 | } | ||
| 2106 | |||
| 2107 | urb = port->read_urb; | ||
| 2108 | if (!urb) { | ||
| 2109 | dbg("%s - bad read_urb pointer - exiting", __func__); | ||
| 2110 | goto out; | ||
| 2111 | } | ||
| 2112 | |||
| 2113 | data = urb->transfer_buffer; | ||
| 2114 | 2083 | ||
| 2115 | if (priv->rx_processed) { | 2084 | for (i = 0; i < urb->actual_length; i += priv->max_packet_size) { |
| 2116 | dbg("%s - already processed: %d bytes, %d remain", __func__, | 2085 | len = min_t(int, urb->actual_length - i, priv->max_packet_size); |
| 2117 | priv->rx_processed, | 2086 | count += ftdi_process_packet(tty, port, priv, &data[i], len); |
| 2118 | urb->actual_length - priv->rx_processed); | ||
| 2119 | } else { | ||
| 2120 | /* The first two bytes of every read packet are status */ | ||
| 2121 | if (urb->actual_length > 2) | ||
| 2122 | usb_serial_debug_data(debug, &port->dev, __func__, | ||
| 2123 | urb->actual_length, data); | ||
| 2124 | else | ||
| 2125 | dbg("Status only: %03oo %03oo", data[0], data[1]); | ||
| 2126 | } | 2087 | } |
| 2127 | 2088 | ||
| 2128 | 2089 | if (count) | |
| 2129 | /* TO DO -- check for hung up line and handle appropriately: */ | ||
| 2130 | /* send hangup */ | ||
| 2131 | /* See acm.c - you do a tty_hangup - eg tty_hangup(tty) */ | ||
| 2132 | /* if CD is dropped and the line is not CLOCAL then we should hangup */ | ||
| 2133 | |||
| 2134 | need_flip = 0; | ||
| 2135 | for (packet_offset = priv->rx_processed; | ||
| 2136 | packet_offset < urb->actual_length; packet_offset += priv->max_packet_size) { | ||
| 2137 | int length; | ||
| 2138 | |||
| 2139 | /* Compare new line status to the old one, signal if different/ | ||
| 2140 | N.B. packet may be processed more than once, but differences | ||
| 2141 | are only processed once. */ | ||
| 2142 | char new_status = data[packet_offset + 0] & | ||
| 2143 | FTDI_STATUS_B0_MASK; | ||
| 2144 | if (new_status != priv->prev_status) { | ||
| 2145 | priv->diff_status |= | ||
| 2146 | new_status ^ priv->prev_status; | ||
| 2147 | wake_up_interruptible(&priv->delta_msr_wait); | ||
| 2148 | priv->prev_status = new_status; | ||
| 2149 | } | ||
| 2150 | |||
| 2151 | length = min_t(u32, priv->max_packet_size, urb->actual_length-packet_offset)-2; | ||
| 2152 | if (length < 0) { | ||
| 2153 | dev_err(&port->dev, "%s - bad packet length: %d\n", | ||
| 2154 | __func__, length+2); | ||
| 2155 | length = 0; | ||
| 2156 | } | ||
| 2157 | |||
| 2158 | if (priv->rx_flags & THROTTLED) { | ||
| 2159 | dbg("%s - throttled", __func__); | ||
| 2160 | break; | ||
| 2161 | } | ||
| 2162 | if (tty_buffer_request_room(tty, length) < length) { | ||
| 2163 | /* break out & wait for throttling/unthrottling to | ||
| 2164 | happen */ | ||
| 2165 | dbg("%s - receive room low", __func__); | ||
| 2166 | break; | ||
| 2167 | } | ||
| 2168 | |||
| 2169 | /* Handle errors and break */ | ||
| 2170 | error_flag = TTY_NORMAL; | ||
| 2171 | /* Although the device uses a bitmask and hence can have | ||
| 2172 | multiple errors on a packet - the order here sets the | ||
| 2173 | priority the error is returned to the tty layer */ | ||
| 2174 | |||
| 2175 | if (data[packet_offset+1] & FTDI_RS_OE) { | ||
| 2176 | error_flag = TTY_OVERRUN; | ||
| 2177 | dbg("OVERRRUN error"); | ||
| 2178 | } | ||
| 2179 | if (data[packet_offset+1] & FTDI_RS_BI) { | ||
| 2180 | error_flag = TTY_BREAK; | ||
| 2181 | dbg("BREAK received"); | ||
| 2182 | usb_serial_handle_break(port); | ||
| 2183 | } | ||
| 2184 | if (data[packet_offset+1] & FTDI_RS_PE) { | ||
| 2185 | error_flag = TTY_PARITY; | ||
| 2186 | dbg("PARITY error"); | ||
| 2187 | } | ||
| 2188 | if (data[packet_offset+1] & FTDI_RS_FE) { | ||
| 2189 | error_flag = TTY_FRAME; | ||
| 2190 | dbg("FRAMING error"); | ||
| 2191 | } | ||
| 2192 | if (length > 0) { | ||
| 2193 | for (i = 2; i < length+2; i++) { | ||
| 2194 | /* Note that the error flag is duplicated for | ||
| 2195 | every character received since we don't know | ||
| 2196 | which character it applied to */ | ||
| 2197 | if (!usb_serial_handle_sysrq_char(tty, port, | ||
| 2198 | data[packet_offset + i])) | ||
| 2199 | tty_insert_flip_char(tty, | ||
| 2200 | data[packet_offset + i], | ||
| 2201 | error_flag); | ||
| 2202 | } | ||
| 2203 | need_flip = 1; | ||
| 2204 | } | ||
| 2205 | |||
| 2206 | #ifdef NOT_CORRECT_BUT_KEEPING_IT_FOR_NOW | ||
| 2207 | /* if a parity error is detected you get status packets forever | ||
| 2208 | until a character is sent without a parity error. | ||
| 2209 | This doesn't work well since the application receives a | ||
| 2210 | never ending stream of bad data - even though new data | ||
| 2211 | hasn't been sent. Therefore I (bill) have taken this out. | ||
| 2212 | However - this might make sense for framing errors and so on | ||
| 2213 | so I am leaving the code in for now. | ||
| 2214 | */ | ||
| 2215 | else { | ||
| 2216 | if (error_flag != TTY_NORMAL) { | ||
| 2217 | dbg("error_flag is not normal"); | ||
| 2218 | /* In this case it is just status - if that is | ||
| 2219 | an error send a bad character */ | ||
| 2220 | if (tty->flip.count >= TTY_FLIPBUF_SIZE) | ||
| 2221 | tty_flip_buffer_push(tty); | ||
| 2222 | tty_insert_flip_char(tty, 0xff, error_flag); | ||
| 2223 | need_flip = 1; | ||
| 2224 | } | ||
| 2225 | } | ||
| 2226 | #endif | ||
| 2227 | } /* "for(packet_offset=0..." */ | ||
| 2228 | |||
| 2229 | /* Low latency */ | ||
| 2230 | if (need_flip) | ||
| 2231 | tty_flip_buffer_push(tty); | 2090 | tty_flip_buffer_push(tty); |
| 2091 | tty_kref_put(tty); | ||
| 2092 | } | ||
| 2232 | 2093 | ||
| 2233 | if (packet_offset < urb->actual_length) { | 2094 | static void ftdi_read_bulk_callback(struct urb *urb) |
| 2234 | /* not completely processed - record progress */ | 2095 | { |
| 2235 | priv->rx_processed = packet_offset; | 2096 | struct usb_serial_port *port = urb->context; |
| 2236 | dbg("%s - incomplete, %d bytes processed, %d remain", | 2097 | unsigned long flags; |
| 2237 | __func__, packet_offset, | ||
| 2238 | urb->actual_length - packet_offset); | ||
| 2239 | /* check if we were throttled while processing */ | ||
| 2240 | spin_lock_irqsave(&priv->rx_lock, flags); | ||
| 2241 | if (priv->rx_flags & THROTTLED) { | ||
| 2242 | priv->rx_flags |= ACTUALLY_THROTTLED; | ||
| 2243 | spin_unlock_irqrestore(&priv->rx_lock, flags); | ||
| 2244 | dbg("%s - deferring remainder until unthrottled", | ||
| 2245 | __func__); | ||
| 2246 | goto out; | ||
| 2247 | } | ||
| 2248 | spin_unlock_irqrestore(&priv->rx_lock, flags); | ||
| 2249 | /* if the port is closed stop trying to read */ | ||
| 2250 | if (port->port.count > 0) | ||
| 2251 | /* delay processing of remainder */ | ||
| 2252 | schedule_delayed_work(&priv->rx_work, 1); | ||
| 2253 | else | ||
| 2254 | dbg("%s - port is closed", __func__); | ||
| 2255 | goto out; | ||
| 2256 | } | ||
| 2257 | |||
| 2258 | /* urb is completely processed */ | ||
| 2259 | priv->rx_processed = 0; | ||
| 2260 | 2098 | ||
| 2261 | /* if the port is closed stop trying to read */ | 2099 | dbg("%s - port %d", __func__, port->number); |
| 2262 | if (port->port.count > 0) { | ||
| 2263 | /* Continue trying to always read */ | ||
| 2264 | usb_fill_bulk_urb(port->read_urb, port->serial->dev, | ||
| 2265 | usb_rcvbulkpipe(port->serial->dev, | ||
| 2266 | port->bulk_in_endpointAddress), | ||
| 2267 | port->read_urb->transfer_buffer, | ||
| 2268 | port->read_urb->transfer_buffer_length, | ||
| 2269 | ftdi_read_bulk_callback, port); | ||
| 2270 | 2100 | ||
| 2271 | result = usb_submit_urb(port->read_urb, GFP_ATOMIC); | 2101 | if (urb->status) { |
| 2272 | if (result) | 2102 | dbg("%s - nonzero read bulk status received: %d", |
| 2273 | dev_err(&port->dev, | 2103 | __func__, urb->status); |
| 2274 | "%s - failed resubmitting read urb, error %d\n", | 2104 | return; |
| 2275 | __func__, result); | ||
| 2276 | } | 2105 | } |
| 2277 | out: | ||
| 2278 | tty_kref_put(tty); | ||
| 2279 | } /* ftdi_process_read */ | ||
| 2280 | 2106 | ||
| 2107 | usb_serial_debug_data(debug, &port->dev, __func__, | ||
| 2108 | urb->actual_length, urb->transfer_buffer); | ||
| 2109 | ftdi_process_read(port); | ||
| 2110 | |||
| 2111 | spin_lock_irqsave(&port->lock, flags); | ||
| 2112 | port->throttled = port->throttle_req; | ||
| 2113 | if (!port->throttled) { | ||
| 2114 | spin_unlock_irqrestore(&port->lock, flags); | ||
| 2115 | ftdi_submit_read_urb(port, GFP_ATOMIC); | ||
| 2116 | } else | ||
| 2117 | spin_unlock_irqrestore(&port->lock, flags); | ||
| 2118 | } | ||
| 2281 | 2119 | ||
| 2282 | static void ftdi_break_ctl(struct tty_struct *tty, int break_state) | 2120 | static void ftdi_break_ctl(struct tty_struct *tty, int break_state) |
| 2283 | { | 2121 | { |
| @@ -2609,33 +2447,31 @@ static int ftdi_ioctl(struct tty_struct *tty, struct file *file, | |||
| 2609 | static void ftdi_throttle(struct tty_struct *tty) | 2447 | static void ftdi_throttle(struct tty_struct *tty) |
| 2610 | { | 2448 | { |
| 2611 | struct usb_serial_port *port = tty->driver_data; | 2449 | struct usb_serial_port *port = tty->driver_data; |
| 2612 | struct ftdi_private *priv = usb_get_serial_port_data(port); | ||
| 2613 | unsigned long flags; | 2450 | unsigned long flags; |
| 2614 | 2451 | ||
| 2615 | dbg("%s - port %d", __func__, port->number); | 2452 | dbg("%s - port %d", __func__, port->number); |
| 2616 | 2453 | ||
| 2617 | spin_lock_irqsave(&priv->rx_lock, flags); | 2454 | spin_lock_irqsave(&port->lock, flags); |
| 2618 | priv->rx_flags |= THROTTLED; | 2455 | port->throttle_req = 1; |
| 2619 | spin_unlock_irqrestore(&priv->rx_lock, flags); | 2456 | spin_unlock_irqrestore(&port->lock, flags); |
| 2620 | } | 2457 | } |
| 2621 | 2458 | ||
| 2622 | 2459 | void ftdi_unthrottle(struct tty_struct *tty) | |
| 2623 | static void ftdi_unthrottle(struct tty_struct *tty) | ||
| 2624 | { | 2460 | { |
| 2625 | struct usb_serial_port *port = tty->driver_data; | 2461 | struct usb_serial_port *port = tty->driver_data; |
| 2626 | struct ftdi_private *priv = usb_get_serial_port_data(port); | 2462 | int was_throttled; |
| 2627 | int actually_throttled; | ||
| 2628 | unsigned long flags; | 2463 | unsigned long flags; |
| 2629 | 2464 | ||
| 2630 | dbg("%s - port %d", __func__, port->number); | 2465 | dbg("%s - port %d", __func__, port->number); |
| 2631 | 2466 | ||
| 2632 | spin_lock_irqsave(&priv->rx_lock, flags); | 2467 | spin_lock_irqsave(&port->lock, flags); |
| 2633 | actually_throttled = priv->rx_flags & ACTUALLY_THROTTLED; | 2468 | was_throttled = port->throttled; |
| 2634 | priv->rx_flags &= ~(THROTTLED | ACTUALLY_THROTTLED); | 2469 | port->throttled = port->throttle_req = 0; |
| 2635 | spin_unlock_irqrestore(&priv->rx_lock, flags); | 2470 | spin_unlock_irqrestore(&port->lock, flags); |
| 2636 | 2471 | ||
| 2637 | if (actually_throttled) | 2472 | /* Resubmit urb if throttled and open. */ |
| 2638 | schedule_delayed_work(&priv->rx_work, 0); | 2473 | if (was_throttled && test_bit(ASYNCB_INITIALIZED, &port->port.flags)) |
| 2474 | ftdi_submit_read_urb(port, GFP_KERNEL); | ||
| 2639 | } | 2475 | } |
| 2640 | 2476 | ||
| 2641 | static int __init ftdi_init(void) | 2477 | static int __init ftdi_init(void) |
diff --git a/drivers/usb/serial/garmin_gps.c b/drivers/usb/serial/garmin_gps.c index 20432d345529..5ac900e5a50e 100644 --- a/drivers/usb/serial/garmin_gps.c +++ b/drivers/usb/serial/garmin_gps.c | |||
| @@ -1390,14 +1390,13 @@ static void garmin_throttle(struct tty_struct *tty) | |||
| 1390 | { | 1390 | { |
| 1391 | struct usb_serial_port *port = tty->driver_data; | 1391 | struct usb_serial_port *port = tty->driver_data; |
| 1392 | struct garmin_data *garmin_data_p = usb_get_serial_port_data(port); | 1392 | struct garmin_data *garmin_data_p = usb_get_serial_port_data(port); |
| 1393 | unsigned long flags; | ||
| 1394 | 1393 | ||
| 1395 | dbg("%s - port %d", __func__, port->number); | 1394 | dbg("%s - port %d", __func__, port->number); |
| 1396 | /* set flag, data received will be put into a queue | 1395 | /* set flag, data received will be put into a queue |
| 1397 | for later processing */ | 1396 | for later processing */ |
| 1398 | spin_lock_irqsave(&garmin_data_p->lock, flags); | 1397 | spin_lock_irq(&garmin_data_p->lock); |
| 1399 | garmin_data_p->flags |= FLAGS_QUEUING|FLAGS_THROTTLED; | 1398 | garmin_data_p->flags |= FLAGS_QUEUING|FLAGS_THROTTLED; |
| 1400 | spin_unlock_irqrestore(&garmin_data_p->lock, flags); | 1399 | spin_unlock_irq(&garmin_data_p->lock); |
| 1401 | } | 1400 | } |
| 1402 | 1401 | ||
| 1403 | 1402 | ||
| @@ -1405,13 +1404,12 @@ static void garmin_unthrottle(struct tty_struct *tty) | |||
| 1405 | { | 1404 | { |
| 1406 | struct usb_serial_port *port = tty->driver_data; | 1405 | struct usb_serial_port *port = tty->driver_data; |
| 1407 | struct garmin_data *garmin_data_p = usb_get_serial_port_data(port); | 1406 | struct garmin_data *garmin_data_p = usb_get_serial_port_data(port); |
| 1408 | unsigned long flags; | ||
| 1409 | int status; | 1407 | int status; |
| 1410 | 1408 | ||
| 1411 | dbg("%s - port %d", __func__, port->number); | 1409 | dbg("%s - port %d", __func__, port->number); |
| 1412 | spin_lock_irqsave(&garmin_data_p->lock, flags); | 1410 | spin_lock_irq(&garmin_data_p->lock); |
| 1413 | garmin_data_p->flags &= ~FLAGS_THROTTLED; | 1411 | garmin_data_p->flags &= ~FLAGS_THROTTLED; |
| 1414 | spin_unlock_irqrestore(&garmin_data_p->lock, flags); | 1412 | spin_unlock_irq(&garmin_data_p->lock); |
| 1415 | 1413 | ||
| 1416 | /* in native mode send queued data to tty, in | 1414 | /* in native mode send queued data to tty, in |
| 1417 | serial mode nothing needs to be done here */ | 1415 | serial mode nothing needs to be done here */ |
| @@ -1419,7 +1417,7 @@ static void garmin_unthrottle(struct tty_struct *tty) | |||
| 1419 | garmin_flush_queue(garmin_data_p); | 1417 | garmin_flush_queue(garmin_data_p); |
| 1420 | 1418 | ||
| 1421 | if (0 != (garmin_data_p->flags & FLAGS_BULK_IN_ACTIVE)) { | 1419 | if (0 != (garmin_data_p->flags & FLAGS_BULK_IN_ACTIVE)) { |
| 1422 | status = usb_submit_urb(port->read_urb, GFP_ATOMIC); | 1420 | status = usb_submit_urb(port->read_urb, GFP_KERNEL); |
| 1423 | if (status) | 1421 | if (status) |
| 1424 | dev_err(&port->dev, | 1422 | dev_err(&port->dev, |
| 1425 | "%s - failed resubmitting read urb, error %d\n", | 1423 | "%s - failed resubmitting read urb, error %d\n", |
diff --git a/drivers/usb/serial/generic.c b/drivers/usb/serial/generic.c index deba08c7a015..bbe005cefcfb 100644 --- a/drivers/usb/serial/generic.c +++ b/drivers/usb/serial/generic.c | |||
| @@ -546,7 +546,7 @@ void usb_serial_generic_unthrottle(struct tty_struct *tty) | |||
| 546 | 546 | ||
| 547 | if (was_throttled) { | 547 | if (was_throttled) { |
| 548 | /* Resume reading from device */ | 548 | /* Resume reading from device */ |
| 549 | usb_serial_generic_resubmit_read_urb(port, GFP_KERNEL); | 549 | flush_and_resubmit_read_urb(port); |
| 550 | } | 550 | } |
| 551 | } | 551 | } |
| 552 | 552 | ||
diff --git a/drivers/usb/serial/ipaq.c b/drivers/usb/serial/ipaq.c index 24fcc64b837d..d6231c38813e 100644 --- a/drivers/usb/serial/ipaq.c +++ b/drivers/usb/serial/ipaq.c | |||
| @@ -966,6 +966,15 @@ static int ipaq_calc_num_ports(struct usb_serial *serial) | |||
| 966 | static int ipaq_startup(struct usb_serial *serial) | 966 | static int ipaq_startup(struct usb_serial *serial) |
| 967 | { | 967 | { |
| 968 | dbg("%s", __func__); | 968 | dbg("%s", __func__); |
| 969 | |||
| 970 | /* Some of the devices in ipaq_id_table[] are composite, and we | ||
| 971 | * shouldn't bind to all the interfaces. This test will rule out | ||
| 972 | * some obviously invalid possibilities. | ||
| 973 | */ | ||
| 974 | if (serial->num_bulk_in < serial->num_ports || | ||
| 975 | serial->num_bulk_out < serial->num_ports) | ||
| 976 | return -ENODEV; | ||
| 977 | |||
| 969 | if (serial->dev->actconfig->desc.bConfigurationValue != 1) { | 978 | if (serial->dev->actconfig->desc.bConfigurationValue != 1) { |
| 970 | /* | 979 | /* |
| 971 | * FIXME: HP iPaq rx3715, possibly others, have 1 config that | 980 | * FIXME: HP iPaq rx3715, possibly others, have 1 config that |
diff --git a/drivers/usb/serial/keyspan_pda.c b/drivers/usb/serial/keyspan_pda.c index 257c16cc6b2a..1296a097f5c3 100644 --- a/drivers/usb/serial/keyspan_pda.c +++ b/drivers/usb/serial/keyspan_pda.c | |||
| @@ -290,7 +290,7 @@ static void keyspan_pda_rx_unthrottle(struct tty_struct *tty) | |||
| 290 | /* just restart the receive interrupt URB */ | 290 | /* just restart the receive interrupt URB */ |
| 291 | dbg("keyspan_pda_rx_unthrottle port %d", port->number); | 291 | dbg("keyspan_pda_rx_unthrottle port %d", port->number); |
| 292 | port->interrupt_in_urb->dev = port->serial->dev; | 292 | port->interrupt_in_urb->dev = port->serial->dev; |
| 293 | if (usb_submit_urb(port->interrupt_in_urb, GFP_ATOMIC)) | 293 | if (usb_submit_urb(port->interrupt_in_urb, GFP_KERNEL)) |
| 294 | dbg(" usb_submit_urb(read urb) failed"); | 294 | dbg(" usb_submit_urb(read urb) failed"); |
| 295 | return; | 295 | return; |
| 296 | } | 296 | } |
diff --git a/drivers/usb/serial/kl5kusb105.c b/drivers/usb/serial/kl5kusb105.c index f7373371b137..3a7873806f46 100644 --- a/drivers/usb/serial/kl5kusb105.c +++ b/drivers/usb/serial/kl5kusb105.c | |||
| @@ -951,7 +951,7 @@ static void klsi_105_unthrottle(struct tty_struct *tty) | |||
| 951 | dbg("%s - port %d", __func__, port->number); | 951 | dbg("%s - port %d", __func__, port->number); |
| 952 | 952 | ||
| 953 | port->read_urb->dev = port->serial->dev; | 953 | port->read_urb->dev = port->serial->dev; |
| 954 | result = usb_submit_urb(port->read_urb, GFP_ATOMIC); | 954 | result = usb_submit_urb(port->read_urb, GFP_KERNEL); |
| 955 | if (result) | 955 | if (result) |
| 956 | dev_err(&port->dev, | 956 | dev_err(&port->dev, |
| 957 | "%s - failed submitting read urb, error %d\n", | 957 | "%s - failed submitting read urb, error %d\n", |
diff --git a/drivers/usb/serial/mct_u232.c b/drivers/usb/serial/mct_u232.c index ad4998bbf16f..cd009cb280a5 100644 --- a/drivers/usb/serial/mct_u232.c +++ b/drivers/usb/serial/mct_u232.c | |||
| @@ -777,20 +777,19 @@ static void mct_u232_throttle(struct tty_struct *tty) | |||
| 777 | { | 777 | { |
| 778 | struct usb_serial_port *port = tty->driver_data; | 778 | struct usb_serial_port *port = tty->driver_data; |
| 779 | struct mct_u232_private *priv = usb_get_serial_port_data(port); | 779 | struct mct_u232_private *priv = usb_get_serial_port_data(port); |
| 780 | unsigned long flags; | ||
| 781 | unsigned int control_state; | 780 | unsigned int control_state; |
| 782 | 781 | ||
| 783 | dbg("%s - port %d", __func__, port->number); | 782 | dbg("%s - port %d", __func__, port->number); |
| 784 | 783 | ||
| 785 | spin_lock_irqsave(&priv->lock, flags); | 784 | spin_lock_irq(&priv->lock); |
| 786 | priv->rx_flags |= THROTTLED; | 785 | priv->rx_flags |= THROTTLED; |
| 787 | if (C_CRTSCTS(tty)) { | 786 | if (C_CRTSCTS(tty)) { |
| 788 | priv->control_state &= ~TIOCM_RTS; | 787 | priv->control_state &= ~TIOCM_RTS; |
| 789 | control_state = priv->control_state; | 788 | control_state = priv->control_state; |
| 790 | spin_unlock_irqrestore(&priv->lock, flags); | 789 | spin_unlock_irq(&priv->lock); |
| 791 | (void) mct_u232_set_modem_ctrl(port->serial, control_state); | 790 | (void) mct_u232_set_modem_ctrl(port->serial, control_state); |
| 792 | } else { | 791 | } else { |
| 793 | spin_unlock_irqrestore(&priv->lock, flags); | 792 | spin_unlock_irq(&priv->lock); |
| 794 | } | 793 | } |
| 795 | } | 794 | } |
| 796 | 795 | ||
| @@ -799,20 +798,19 @@ static void mct_u232_unthrottle(struct tty_struct *tty) | |||
| 799 | { | 798 | { |
| 800 | struct usb_serial_port *port = tty->driver_data; | 799 | struct usb_serial_port *port = tty->driver_data; |
| 801 | struct mct_u232_private *priv = usb_get_serial_port_data(port); | 800 | struct mct_u232_private *priv = usb_get_serial_port_data(port); |
| 802 | unsigned long flags; | ||
| 803 | unsigned int control_state; | 801 | unsigned int control_state; |
| 804 | 802 | ||
| 805 | dbg("%s - port %d", __func__, port->number); | 803 | dbg("%s - port %d", __func__, port->number); |
| 806 | 804 | ||
| 807 | spin_lock_irqsave(&priv->lock, flags); | 805 | spin_lock_irq(&priv->lock); |
| 808 | if ((priv->rx_flags & THROTTLED) && C_CRTSCTS(tty)) { | 806 | if ((priv->rx_flags & THROTTLED) && C_CRTSCTS(tty)) { |
| 809 | priv->rx_flags &= ~THROTTLED; | 807 | priv->rx_flags &= ~THROTTLED; |
| 810 | priv->control_state |= TIOCM_RTS; | 808 | priv->control_state |= TIOCM_RTS; |
| 811 | control_state = priv->control_state; | 809 | control_state = priv->control_state; |
| 812 | spin_unlock_irqrestore(&priv->lock, flags); | 810 | spin_unlock_irq(&priv->lock); |
| 813 | (void) mct_u232_set_modem_ctrl(port->serial, control_state); | 811 | (void) mct_u232_set_modem_ctrl(port->serial, control_state); |
| 814 | } else { | 812 | } else { |
| 815 | spin_unlock_irqrestore(&priv->lock, flags); | 813 | spin_unlock_irq(&priv->lock); |
| 816 | } | 814 | } |
| 817 | } | 815 | } |
| 818 | 816 | ||
diff --git a/drivers/usb/serial/opticon.c b/drivers/usb/serial/opticon.c index 1085a577c5c1..80f59b6350cb 100644 --- a/drivers/usb/serial/opticon.c +++ b/drivers/usb/serial/opticon.c | |||
| @@ -314,21 +314,24 @@ static void opticon_unthrottle(struct tty_struct *tty) | |||
| 314 | struct usb_serial_port *port = tty->driver_data; | 314 | struct usb_serial_port *port = tty->driver_data; |
| 315 | struct opticon_private *priv = usb_get_serial_data(port->serial); | 315 | struct opticon_private *priv = usb_get_serial_data(port->serial); |
| 316 | unsigned long flags; | 316 | unsigned long flags; |
| 317 | int result; | 317 | int result, was_throttled; |
| 318 | 318 | ||
| 319 | dbg("%s - port %d", __func__, port->number); | 319 | dbg("%s - port %d", __func__, port->number); |
| 320 | 320 | ||
| 321 | spin_lock_irqsave(&priv->lock, flags); | 321 | spin_lock_irqsave(&priv->lock, flags); |
| 322 | priv->throttled = false; | 322 | priv->throttled = false; |
| 323 | was_throttled = priv->actually_throttled; | ||
| 323 | priv->actually_throttled = false; | 324 | priv->actually_throttled = false; |
| 324 | spin_unlock_irqrestore(&priv->lock, flags); | 325 | spin_unlock_irqrestore(&priv->lock, flags); |
| 325 | 326 | ||
| 326 | priv->bulk_read_urb->dev = port->serial->dev; | 327 | priv->bulk_read_urb->dev = port->serial->dev; |
| 327 | result = usb_submit_urb(priv->bulk_read_urb, GFP_ATOMIC); | 328 | if (was_throttled) { |
| 328 | if (result) | 329 | result = usb_submit_urb(priv->bulk_read_urb, GFP_ATOMIC); |
| 329 | dev_err(&port->dev, | 330 | if (result) |
| 330 | "%s - failed submitting read urb, error %d\n", | 331 | dev_err(&port->dev, |
| 332 | "%s - failed submitting read urb, error %d\n", | ||
| 331 | __func__, result); | 333 | __func__, result); |
| 334 | } | ||
| 332 | } | 335 | } |
| 333 | 336 | ||
| 334 | static int opticon_tiocmget(struct tty_struct *tty, struct file *file) | 337 | static int opticon_tiocmget(struct tty_struct *tty, struct file *file) |
diff --git a/drivers/usb/serial/option.c b/drivers/usb/serial/option.c index f66e39883218..43c227027560 100644 --- a/drivers/usb/serial/option.c +++ b/drivers/usb/serial/option.c | |||
| @@ -165,6 +165,7 @@ static int option_resume(struct usb_serial *serial); | |||
| 165 | #define HUAWEI_PRODUCT_E143D 0x143D | 165 | #define HUAWEI_PRODUCT_E143D 0x143D |
| 166 | #define HUAWEI_PRODUCT_E143E 0x143E | 166 | #define HUAWEI_PRODUCT_E143E 0x143E |
| 167 | #define HUAWEI_PRODUCT_E143F 0x143F | 167 | #define HUAWEI_PRODUCT_E143F 0x143F |
| 168 | #define HUAWEI_PRODUCT_E14AC 0x14AC | ||
| 168 | 169 | ||
| 169 | #define QUANTA_VENDOR_ID 0x0408 | 170 | #define QUANTA_VENDOR_ID 0x0408 |
| 170 | #define QUANTA_PRODUCT_Q101 0xEA02 | 171 | #define QUANTA_PRODUCT_Q101 0xEA02 |
| @@ -318,6 +319,7 @@ static int option_resume(struct usb_serial *serial); | |||
| 318 | /* TOSHIBA PRODUCTS */ | 319 | /* TOSHIBA PRODUCTS */ |
| 319 | #define TOSHIBA_VENDOR_ID 0x0930 | 320 | #define TOSHIBA_VENDOR_ID 0x0930 |
| 320 | #define TOSHIBA_PRODUCT_HSDPA_MINICARD 0x1302 | 321 | #define TOSHIBA_PRODUCT_HSDPA_MINICARD 0x1302 |
| 322 | #define TOSHIBA_PRODUCT_G450 0x0d45 | ||
| 321 | 323 | ||
| 322 | #define ALINK_VENDOR_ID 0x1e0e | 324 | #define ALINK_VENDOR_ID 0x1e0e |
| 323 | #define ALINK_PRODUCT_3GU 0x9200 | 325 | #define ALINK_PRODUCT_3GU 0x9200 |
| @@ -424,6 +426,7 @@ static struct usb_device_id option_ids[] = { | |||
| 424 | { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E143D, 0xff, 0xff, 0xff) }, | 426 | { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E143D, 0xff, 0xff, 0xff) }, |
| 425 | { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E143E, 0xff, 0xff, 0xff) }, | 427 | { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E143E, 0xff, 0xff, 0xff) }, |
| 426 | { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E143F, 0xff, 0xff, 0xff) }, | 428 | { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E143F, 0xff, 0xff, 0xff) }, |
| 429 | { USB_DEVICE(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E14AC) }, | ||
| 427 | { USB_DEVICE(AMOI_VENDOR_ID, AMOI_PRODUCT_9508) }, | 430 | { USB_DEVICE(AMOI_VENDOR_ID, AMOI_PRODUCT_9508) }, |
| 428 | { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_V640) }, /* Novatel Merlin V640/XV620 */ | 431 | { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_V640) }, /* Novatel Merlin V640/XV620 */ |
| 429 | { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_V620) }, /* Novatel Merlin V620/S620 */ | 432 | { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_V620) }, /* Novatel Merlin V620/S620 */ |
| @@ -581,6 +584,7 @@ static struct usb_device_id option_ids[] = { | |||
| 581 | { USB_DEVICE(QISDA_VENDOR_ID, QISDA_PRODUCT_H21_4523) }, | 584 | { USB_DEVICE(QISDA_VENDOR_ID, QISDA_PRODUCT_H21_4523) }, |
| 582 | { USB_DEVICE(QISDA_VENDOR_ID, QISDA_PRODUCT_H20_4515) }, | 585 | { USB_DEVICE(QISDA_VENDOR_ID, QISDA_PRODUCT_H20_4515) }, |
| 583 | { USB_DEVICE(QISDA_VENDOR_ID, QISDA_PRODUCT_H20_4519) }, | 586 | { USB_DEVICE(QISDA_VENDOR_ID, QISDA_PRODUCT_H20_4519) }, |
| 587 | { USB_DEVICE(TOSHIBA_VENDOR_ID, TOSHIBA_PRODUCT_G450) }, | ||
| 584 | { USB_DEVICE(TOSHIBA_VENDOR_ID, TOSHIBA_PRODUCT_HSDPA_MINICARD ) }, /* Toshiba 3G HSDPA == Novatel Expedite EU870D MiniCard */ | 588 | { USB_DEVICE(TOSHIBA_VENDOR_ID, TOSHIBA_PRODUCT_HSDPA_MINICARD ) }, /* Toshiba 3G HSDPA == Novatel Expedite EU870D MiniCard */ |
| 585 | { USB_DEVICE(ALINK_VENDOR_ID, 0x9000) }, | 589 | { USB_DEVICE(ALINK_VENDOR_ID, 0x9000) }, |
| 586 | { USB_DEVICE_AND_INTERFACE_INFO(ALINK_VENDOR_ID, ALINK_PRODUCT_3GU, 0xff, 0xff, 0xff) }, | 590 | { USB_DEVICE_AND_INTERFACE_INFO(ALINK_VENDOR_ID, ALINK_PRODUCT_3GU, 0xff, 0xff, 0xff) }, |
diff --git a/drivers/usb/serial/oti6858.c b/drivers/usb/serial/oti6858.c index 0f4a70ce3823..c644e26394b4 100644 --- a/drivers/usb/serial/oti6858.c +++ b/drivers/usb/serial/oti6858.c | |||
| @@ -288,7 +288,7 @@ static void setup_line(struct work_struct *work) | |||
| 288 | 288 | ||
| 289 | dbg("%s(): submitting interrupt urb", __func__); | 289 | dbg("%s(): submitting interrupt urb", __func__); |
| 290 | port->interrupt_in_urb->dev = port->serial->dev; | 290 | port->interrupt_in_urb->dev = port->serial->dev; |
| 291 | result = usb_submit_urb(port->interrupt_in_urb, GFP_ATOMIC); | 291 | result = usb_submit_urb(port->interrupt_in_urb, GFP_KERNEL); |
| 292 | if (result != 0) { | 292 | if (result != 0) { |
| 293 | dev_err(&port->dev, "%s(): usb_submit_urb() failed" | 293 | dev_err(&port->dev, "%s(): usb_submit_urb() failed" |
| 294 | " with error %d\n", __func__, result); | 294 | " with error %d\n", __func__, result); |
| @@ -335,7 +335,7 @@ void send_data(struct work_struct *work) | |||
| 335 | 335 | ||
| 336 | dbg("%s(): submitting interrupt urb", __func__); | 336 | dbg("%s(): submitting interrupt urb", __func__); |
| 337 | port->interrupt_in_urb->dev = port->serial->dev; | 337 | port->interrupt_in_urb->dev = port->serial->dev; |
| 338 | result = usb_submit_urb(port->interrupt_in_urb, GFP_ATOMIC); | 338 | result = usb_submit_urb(port->interrupt_in_urb, GFP_NOIO); |
| 339 | if (result != 0) { | 339 | if (result != 0) { |
| 340 | dev_err(&port->dev, "%s(): usb_submit_urb() failed" | 340 | dev_err(&port->dev, "%s(): usb_submit_urb() failed" |
| 341 | " with error %d\n", __func__, result); | 341 | " with error %d\n", __func__, result); |
| @@ -349,7 +349,7 @@ void send_data(struct work_struct *work) | |||
| 349 | 349 | ||
| 350 | port->write_urb->transfer_buffer_length = count; | 350 | port->write_urb->transfer_buffer_length = count; |
| 351 | port->write_urb->dev = port->serial->dev; | 351 | port->write_urb->dev = port->serial->dev; |
| 352 | result = usb_submit_urb(port->write_urb, GFP_ATOMIC); | 352 | result = usb_submit_urb(port->write_urb, GFP_NOIO); |
| 353 | if (result != 0) { | 353 | if (result != 0) { |
| 354 | dev_err(&port->dev, "%s(): usb_submit_urb() failed" | 354 | dev_err(&port->dev, "%s(): usb_submit_urb() failed" |
| 355 | " with error %d\n", __func__, result); | 355 | " with error %d\n", __func__, result); |
diff --git a/drivers/usb/serial/pl2303.c b/drivers/usb/serial/pl2303.c index 1128e01525b1..9ec1a49e2362 100644 --- a/drivers/usb/serial/pl2303.c +++ b/drivers/usb/serial/pl2303.c | |||
| @@ -1046,13 +1046,15 @@ static void pl2303_push_data(struct tty_struct *tty, | |||
| 1046 | /* overrun is special, not associated with a char */ | 1046 | /* overrun is special, not associated with a char */ |
| 1047 | if (line_status & UART_OVERRUN_ERROR) | 1047 | if (line_status & UART_OVERRUN_ERROR) |
| 1048 | tty_insert_flip_char(tty, 0, TTY_OVERRUN); | 1048 | tty_insert_flip_char(tty, 0, TTY_OVERRUN); |
| 1049 | if (port->console && port->sysrq) { | 1049 | |
| 1050 | if (tty_flag == TTY_NORMAL && !(port->console && port->sysrq)) | ||
| 1051 | tty_insert_flip_string(tty, data, urb->actual_length); | ||
| 1052 | else { | ||
| 1050 | int i; | 1053 | int i; |
| 1051 | for (i = 0; i < urb->actual_length; ++i) | 1054 | for (i = 0; i < urb->actual_length; ++i) |
| 1052 | if (!usb_serial_handle_sysrq_char(tty, port, data[i])) | 1055 | if (!usb_serial_handle_sysrq_char(tty, port, data[i])) |
| 1053 | tty_insert_flip_char(tty, data[i], tty_flag); | 1056 | tty_insert_flip_char(tty, data[i], tty_flag); |
| 1054 | } else | 1057 | } |
| 1055 | tty_insert_flip_string(tty, data, urb->actual_length); | ||
| 1056 | tty_flip_buffer_push(tty); | 1058 | tty_flip_buffer_push(tty); |
| 1057 | } | 1059 | } |
| 1058 | 1060 | ||
diff --git a/drivers/usb/serial/sierra.c b/drivers/usb/serial/sierra.c index 8c075b2416bb..45883988a005 100644 --- a/drivers/usb/serial/sierra.c +++ b/drivers/usb/serial/sierra.c | |||
| @@ -17,7 +17,7 @@ | |||
| 17 | Whom based his on the Keyspan driver by Hugh Blemings <hugh@blemings.org> | 17 | Whom based his on the Keyspan driver by Hugh Blemings <hugh@blemings.org> |
| 18 | */ | 18 | */ |
| 19 | 19 | ||
| 20 | #define DRIVER_VERSION "v.1.3.7" | 20 | #define DRIVER_VERSION "v.1.3.8" |
| 21 | #define DRIVER_AUTHOR "Kevin Lloyd, Elina Pasheva, Matthew Safar, Rory Filer" | 21 | #define DRIVER_AUTHOR "Kevin Lloyd, Elina Pasheva, Matthew Safar, Rory Filer" |
| 22 | #define DRIVER_DESC "USB Driver for Sierra Wireless USB modems" | 22 | #define DRIVER_DESC "USB Driver for Sierra Wireless USB modems" |
| 23 | 23 | ||
diff --git a/drivers/usb/serial/symbolserial.c b/drivers/usb/serial/symbolserial.c index cb7e95f9fcbf..b282c0f2d8e5 100644 --- a/drivers/usb/serial/symbolserial.c +++ b/drivers/usb/serial/symbolserial.c | |||
| @@ -165,34 +165,36 @@ static void symbol_throttle(struct tty_struct *tty) | |||
| 165 | { | 165 | { |
| 166 | struct usb_serial_port *port = tty->driver_data; | 166 | struct usb_serial_port *port = tty->driver_data; |
| 167 | struct symbol_private *priv = usb_get_serial_data(port->serial); | 167 | struct symbol_private *priv = usb_get_serial_data(port->serial); |
| 168 | unsigned long flags; | ||
| 169 | 168 | ||
| 170 | dbg("%s - port %d", __func__, port->number); | 169 | dbg("%s - port %d", __func__, port->number); |
| 171 | spin_lock_irqsave(&priv->lock, flags); | 170 | spin_lock_irq(&priv->lock); |
| 172 | priv->throttled = true; | 171 | priv->throttled = true; |
| 173 | spin_unlock_irqrestore(&priv->lock, flags); | 172 | spin_unlock_irq(&priv->lock); |
| 174 | } | 173 | } |
| 175 | 174 | ||
| 176 | static void symbol_unthrottle(struct tty_struct *tty) | 175 | static void symbol_unthrottle(struct tty_struct *tty) |
| 177 | { | 176 | { |
| 178 | struct usb_serial_port *port = tty->driver_data; | 177 | struct usb_serial_port *port = tty->driver_data; |
| 179 | struct symbol_private *priv = usb_get_serial_data(port->serial); | 178 | struct symbol_private *priv = usb_get_serial_data(port->serial); |
| 180 | unsigned long flags; | ||
| 181 | int result; | 179 | int result; |
| 180 | bool was_throttled; | ||
| 182 | 181 | ||
| 183 | dbg("%s - port %d", __func__, port->number); | 182 | dbg("%s - port %d", __func__, port->number); |
| 184 | 183 | ||
| 185 | spin_lock_irqsave(&priv->lock, flags); | 184 | spin_lock_irq(&priv->lock); |
| 186 | priv->throttled = false; | 185 | priv->throttled = false; |
| 186 | was_throttled = priv->actually_throttled; | ||
| 187 | priv->actually_throttled = false; | 187 | priv->actually_throttled = false; |
| 188 | spin_unlock_irqrestore(&priv->lock, flags); | 188 | spin_unlock_irq(&priv->lock); |
| 189 | 189 | ||
| 190 | priv->int_urb->dev = port->serial->dev; | 190 | priv->int_urb->dev = port->serial->dev; |
| 191 | result = usb_submit_urb(priv->int_urb, GFP_ATOMIC); | 191 | if (was_throttled) { |
| 192 | if (result) | 192 | result = usb_submit_urb(priv->int_urb, GFP_KERNEL); |
| 193 | dev_err(&port->dev, | 193 | if (result) |
| 194 | "%s - failed submitting read urb, error %d\n", | 194 | dev_err(&port->dev, |
| 195 | "%s - failed submitting read urb, error %d\n", | ||
| 195 | __func__, result); | 196 | __func__, result); |
| 197 | } | ||
| 196 | } | 198 | } |
| 197 | 199 | ||
| 198 | static int symbol_startup(struct usb_serial *serial) | 200 | static int symbol_startup(struct usb_serial *serial) |
diff --git a/drivers/usb/serial/usb-serial.c b/drivers/usb/serial/usb-serial.c index aa6b2ae951ae..bd3fa7ff15b1 100644 --- a/drivers/usb/serial/usb-serial.c +++ b/drivers/usb/serial/usb-serial.c | |||
| @@ -156,7 +156,8 @@ static void destroy_serial(struct kref *kref) | |||
| 156 | if (serial->minor != SERIAL_TTY_NO_MINOR) | 156 | if (serial->minor != SERIAL_TTY_NO_MINOR) |
| 157 | return_serial(serial); | 157 | return_serial(serial); |
| 158 | 158 | ||
| 159 | serial->type->release(serial); | 159 | if (serial->attached) |
| 160 | serial->type->release(serial); | ||
| 160 | 161 | ||
| 161 | /* Now that nothing is using the ports, they can be freed */ | 162 | /* Now that nothing is using the ports, they can be freed */ |
| 162 | for (i = 0; i < serial->num_port_pointers; ++i) { | 163 | for (i = 0; i < serial->num_port_pointers; ++i) { |
| @@ -1059,12 +1060,15 @@ int usb_serial_probe(struct usb_interface *interface, | |||
| 1059 | module_put(type->driver.owner); | 1060 | module_put(type->driver.owner); |
| 1060 | if (retval < 0) | 1061 | if (retval < 0) |
| 1061 | goto probe_error; | 1062 | goto probe_error; |
| 1063 | serial->attached = 1; | ||
| 1062 | if (retval > 0) { | 1064 | if (retval > 0) { |
| 1063 | /* quietly accept this device, but don't bind to a | 1065 | /* quietly accept this device, but don't bind to a |
| 1064 | serial port as it's about to disappear */ | 1066 | serial port as it's about to disappear */ |
| 1065 | serial->num_ports = 0; | 1067 | serial->num_ports = 0; |
| 1066 | goto exit; | 1068 | goto exit; |
| 1067 | } | 1069 | } |
| 1070 | } else { | ||
| 1071 | serial->attached = 1; | ||
| 1068 | } | 1072 | } |
| 1069 | 1073 | ||
| 1070 | if (get_free_serial(serial, num_ports, &minor) == NULL) { | 1074 | if (get_free_serial(serial, num_ports, &minor) == NULL) { |
| @@ -1164,8 +1168,10 @@ int usb_serial_suspend(struct usb_interface *intf, pm_message_t message) | |||
| 1164 | 1168 | ||
| 1165 | if (serial->type->suspend) { | 1169 | if (serial->type->suspend) { |
| 1166 | r = serial->type->suspend(serial, message); | 1170 | r = serial->type->suspend(serial, message); |
| 1167 | if (r < 0) | 1171 | if (r < 0) { |
| 1172 | serial->suspending = 0; | ||
| 1168 | goto err_out; | 1173 | goto err_out; |
| 1174 | } | ||
| 1169 | } | 1175 | } |
| 1170 | 1176 | ||
| 1171 | for (i = 0; i < serial->num_ports; ++i) { | 1177 | for (i = 0; i < serial->num_ports; ++i) { |
diff --git a/drivers/usb/serial/visor.c b/drivers/usb/serial/visor.c index 1aa5d20a5d99..ad1f9232292d 100644 --- a/drivers/usb/serial/visor.c +++ b/drivers/usb/serial/visor.c | |||
| @@ -513,7 +513,8 @@ static void visor_read_bulk_callback(struct urb *urb) | |||
| 513 | tty_kref_put(tty); | 513 | tty_kref_put(tty); |
| 514 | } | 514 | } |
| 515 | spin_lock(&priv->lock); | 515 | spin_lock(&priv->lock); |
| 516 | priv->bytes_in += available_room; | 516 | if (tty) |
| 517 | priv->bytes_in += available_room; | ||
| 517 | 518 | ||
| 518 | } else { | 519 | } else { |
| 519 | spin_lock(&priv->lock); | 520 | spin_lock(&priv->lock); |
| @@ -582,12 +583,11 @@ static void visor_throttle(struct tty_struct *tty) | |||
| 582 | { | 583 | { |
| 583 | struct usb_serial_port *port = tty->driver_data; | 584 | struct usb_serial_port *port = tty->driver_data; |
| 584 | struct visor_private *priv = usb_get_serial_port_data(port); | 585 | struct visor_private *priv = usb_get_serial_port_data(port); |
| 585 | unsigned long flags; | ||
| 586 | 586 | ||
| 587 | dbg("%s - port %d", __func__, port->number); | 587 | dbg("%s - port %d", __func__, port->number); |
| 588 | spin_lock_irqsave(&priv->lock, flags); | 588 | spin_lock_irq(&priv->lock); |
| 589 | priv->throttled = 1; | 589 | priv->throttled = 1; |
| 590 | spin_unlock_irqrestore(&priv->lock, flags); | 590 | spin_unlock_irq(&priv->lock); |
| 591 | } | 591 | } |
| 592 | 592 | ||
| 593 | 593 | ||
| @@ -595,21 +595,23 @@ static void visor_unthrottle(struct tty_struct *tty) | |||
| 595 | { | 595 | { |
| 596 | struct usb_serial_port *port = tty->driver_data; | 596 | struct usb_serial_port *port = tty->driver_data; |
| 597 | struct visor_private *priv = usb_get_serial_port_data(port); | 597 | struct visor_private *priv = usb_get_serial_port_data(port); |
| 598 | unsigned long flags; | 598 | int result, was_throttled; |
| 599 | int result; | ||
| 600 | 599 | ||
| 601 | dbg("%s - port %d", __func__, port->number); | 600 | dbg("%s - port %d", __func__, port->number); |
| 602 | spin_lock_irqsave(&priv->lock, flags); | 601 | spin_lock_irq(&priv->lock); |
| 603 | priv->throttled = 0; | 602 | priv->throttled = 0; |
| 603 | was_throttled = priv->actually_throttled; | ||
| 604 | priv->actually_throttled = 0; | 604 | priv->actually_throttled = 0; |
| 605 | spin_unlock_irqrestore(&priv->lock, flags); | 605 | spin_unlock_irq(&priv->lock); |
| 606 | 606 | ||
| 607 | port->read_urb->dev = port->serial->dev; | 607 | if (was_throttled) { |
| 608 | result = usb_submit_urb(port->read_urb, GFP_ATOMIC); | 608 | port->read_urb->dev = port->serial->dev; |
| 609 | if (result) | 609 | result = usb_submit_urb(port->read_urb, GFP_KERNEL); |
| 610 | dev_err(&port->dev, | 610 | if (result) |
| 611 | "%s - failed submitting read urb, error %d\n", | 611 | dev_err(&port->dev, |
| 612 | "%s - failed submitting read urb, error %d\n", | ||
| 612 | __func__, result); | 613 | __func__, result); |
| 614 | } | ||
| 613 | } | 615 | } |
| 614 | 616 | ||
| 615 | static int palm_os_3_probe(struct usb_serial *serial, | 617 | static int palm_os_3_probe(struct usb_serial *serial, |
diff --git a/drivers/usb/serial/whiteheat.c b/drivers/usb/serial/whiteheat.c index 62424eec33ec..1093d2eb046a 100644 --- a/drivers/usb/serial/whiteheat.c +++ b/drivers/usb/serial/whiteheat.c | |||
| @@ -949,13 +949,12 @@ static void whiteheat_throttle(struct tty_struct *tty) | |||
| 949 | { | 949 | { |
| 950 | struct usb_serial_port *port = tty->driver_data; | 950 | struct usb_serial_port *port = tty->driver_data; |
| 951 | struct whiteheat_private *info = usb_get_serial_port_data(port); | 951 | struct whiteheat_private *info = usb_get_serial_port_data(port); |
| 952 | unsigned long flags; | ||
| 953 | 952 | ||
| 954 | dbg("%s - port %d", __func__, port->number); | 953 | dbg("%s - port %d", __func__, port->number); |
| 955 | 954 | ||
| 956 | spin_lock_irqsave(&info->lock, flags); | 955 | spin_lock_irq(&info->lock); |
| 957 | info->flags |= THROTTLED; | 956 | info->flags |= THROTTLED; |
| 958 | spin_unlock_irqrestore(&info->lock, flags); | 957 | spin_unlock_irq(&info->lock); |
| 959 | 958 | ||
| 960 | return; | 959 | return; |
| 961 | } | 960 | } |
| @@ -966,14 +965,13 @@ static void whiteheat_unthrottle(struct tty_struct *tty) | |||
| 966 | struct usb_serial_port *port = tty->driver_data; | 965 | struct usb_serial_port *port = tty->driver_data; |
| 967 | struct whiteheat_private *info = usb_get_serial_port_data(port); | 966 | struct whiteheat_private *info = usb_get_serial_port_data(port); |
| 968 | int actually_throttled; | 967 | int actually_throttled; |
| 969 | unsigned long flags; | ||
| 970 | 968 | ||
| 971 | dbg("%s - port %d", __func__, port->number); | 969 | dbg("%s - port %d", __func__, port->number); |
| 972 | 970 | ||
| 973 | spin_lock_irqsave(&info->lock, flags); | 971 | spin_lock_irq(&info->lock); |
| 974 | actually_throttled = info->flags & ACTUALLY_THROTTLED; | 972 | actually_throttled = info->flags & ACTUALLY_THROTTLED; |
| 975 | info->flags &= ~(THROTTLED | ACTUALLY_THROTTLED); | 973 | info->flags &= ~(THROTTLED | ACTUALLY_THROTTLED); |
| 976 | spin_unlock_irqrestore(&info->lock, flags); | 974 | spin_unlock_irq(&info->lock); |
| 977 | 975 | ||
| 978 | if (actually_throttled) | 976 | if (actually_throttled) |
| 979 | rx_data_softint(&info->rx_work); | 977 | rx_data_softint(&info->rx_work); |
diff --git a/drivers/usb/storage/transport.c b/drivers/usb/storage/transport.c index e20dc525d177..3a4fb023af72 100644 --- a/drivers/usb/storage/transport.c +++ b/drivers/usb/storage/transport.c | |||
| @@ -768,17 +768,32 @@ void usb_stor_invoke_transport(struct scsi_cmnd *srb, struct us_data *us) | |||
| 768 | /* set the result so the higher layers expect this data */ | 768 | /* set the result so the higher layers expect this data */ |
| 769 | srb->result = SAM_STAT_CHECK_CONDITION; | 769 | srb->result = SAM_STAT_CHECK_CONDITION; |
| 770 | 770 | ||
| 771 | /* If things are really okay, then let's show that. Zero | 771 | /* We often get empty sense data. This could indicate that |
| 772 | * out the sense buffer so the higher layers won't realize | 772 | * everything worked or that there was an unspecified |
| 773 | * we did an unsolicited auto-sense. */ | 773 | * problem. We have to decide which. |
| 774 | if (result == USB_STOR_TRANSPORT_GOOD && | 774 | */ |
| 775 | /* Filemark 0, ignore EOM, ILI 0, no sense */ | 775 | if ( /* Filemark 0, ignore EOM, ILI 0, no sense */ |
| 776 | (srb->sense_buffer[2] & 0xaf) == 0 && | 776 | (srb->sense_buffer[2] & 0xaf) == 0 && |
| 777 | /* No ASC or ASCQ */ | 777 | /* No ASC or ASCQ */ |
| 778 | srb->sense_buffer[12] == 0 && | 778 | srb->sense_buffer[12] == 0 && |
| 779 | srb->sense_buffer[13] == 0) { | 779 | srb->sense_buffer[13] == 0) { |
| 780 | srb->result = SAM_STAT_GOOD; | 780 | |
| 781 | srb->sense_buffer[0] = 0x0; | 781 | /* If things are really okay, then let's show that. |
| 782 | * Zero out the sense buffer so the higher layers | ||
| 783 | * won't realize we did an unsolicited auto-sense. | ||
| 784 | */ | ||
| 785 | if (result == USB_STOR_TRANSPORT_GOOD) { | ||
| 786 | srb->result = SAM_STAT_GOOD; | ||
| 787 | srb->sense_buffer[0] = 0x0; | ||
| 788 | |||
| 789 | /* If there was a problem, report an unspecified | ||
| 790 | * hardware error to prevent the higher layers from | ||
| 791 | * entering an infinite retry loop. | ||
| 792 | */ | ||
| 793 | } else { | ||
| 794 | srb->result = DID_ERROR << 16; | ||
| 795 | srb->sense_buffer[2] = HARDWARE_ERROR; | ||
| 796 | } | ||
| 782 | } | 797 | } |
| 783 | } | 798 | } |
| 784 | 799 | ||
diff --git a/drivers/usb/storage/unusual_devs.h b/drivers/usb/storage/unusual_devs.h index 079ae0f7bec1..d4f034ebaa8a 100644 --- a/drivers/usb/storage/unusual_devs.h +++ b/drivers/usb/storage/unusual_devs.h | |||
| @@ -1823,6 +1823,13 @@ UNUSUAL_DEV( 0x4102, 0x1020, 0x0100, 0x0100, | |||
| 1823 | US_SC_DEVICE, US_PR_DEVICE, NULL, | 1823 | US_SC_DEVICE, US_PR_DEVICE, NULL, |
| 1824 | US_FL_IGNORE_RESIDUE ), | 1824 | US_FL_IGNORE_RESIDUE ), |
| 1825 | 1825 | ||
| 1826 | /* Reported by Sergey Pinaev <dfo@antex.ru> */ | ||
| 1827 | UNUSUAL_DEV( 0x4102, 0x1059, 0x0000, 0x0000, | ||
| 1828 | "iRiver", | ||
| 1829 | "P7K", | ||
| 1830 | US_SC_DEVICE, US_PR_DEVICE, NULL, | ||
| 1831 | US_FL_MAX_SECTORS_64 ), | ||
| 1832 | |||
| 1826 | /* | 1833 | /* |
| 1827 | * David Härdeman <david@2gen.com> | 1834 | * David Härdeman <david@2gen.com> |
| 1828 | * The key makes the SCSI stack print confusing (but harmless) messages | 1835 | * The key makes the SCSI stack print confusing (but harmless) messages |
diff --git a/include/linux/usb/serial.h b/include/linux/usb/serial.h index c17eb64d7213..ce911ebf91e8 100644 --- a/include/linux/usb/serial.h +++ b/include/linux/usb/serial.h | |||
| @@ -150,6 +150,7 @@ struct usb_serial { | |||
| 150 | struct usb_interface *interface; | 150 | struct usb_interface *interface; |
| 151 | unsigned char disconnected:1; | 151 | unsigned char disconnected:1; |
| 152 | unsigned char suspending:1; | 152 | unsigned char suspending:1; |
| 153 | unsigned char attached:1; | ||
| 153 | unsigned char minor; | 154 | unsigned char minor; |
| 154 | unsigned char num_ports; | 155 | unsigned char num_ports; |
| 155 | unsigned char num_port_pointers; | 156 | unsigned char num_port_pointers; |
