diff options
Diffstat (limited to 'drivers/usb')
-rw-r--r-- | drivers/usb/Makefile | 3 | ||||
-rw-r--r-- | drivers/usb/atm/cxacru.c | 10 | ||||
-rw-r--r-- | drivers/usb/class/cdc-acm.c | 3 | ||||
-rw-r--r-- | drivers/usb/gadget/atmel_usba_udc.c | 5 | ||||
-rw-r--r-- | drivers/usb/gadget/usbstring.c | 6 | ||||
-rw-r--r-- | drivers/usb/host/isp1760-hcd.c | 24 | ||||
-rw-r--r-- | drivers/usb/serial/ftdi_sio.c | 27 | ||||
-rw-r--r-- | drivers/usb/serial/ftdi_sio.h | 6 | ||||
-rw-r--r-- | drivers/usb/serial/usb-serial.c | 1 | ||||
-rw-r--r-- | drivers/usb/storage/unusual_devs.h | 5 |
10 files changed, 67 insertions, 23 deletions
diff --git a/drivers/usb/Makefile b/drivers/usb/Makefile index 89299a5ce16..0a3dc5ece63 100644 --- a/drivers/usb/Makefile +++ b/drivers/usb/Makefile | |||
@@ -11,7 +11,6 @@ obj-$(CONFIG_USB_MON) += mon/ | |||
11 | obj-$(CONFIG_PCI) += host/ | 11 | obj-$(CONFIG_PCI) += host/ |
12 | obj-$(CONFIG_USB_EHCI_HCD) += host/ | 12 | obj-$(CONFIG_USB_EHCI_HCD) += host/ |
13 | obj-$(CONFIG_USB_ISP116X_HCD) += host/ | 13 | obj-$(CONFIG_USB_ISP116X_HCD) += host/ |
14 | obj-$(CONFIG_USB_ISP1760_HCD) += host/ | ||
15 | obj-$(CONFIG_USB_OHCI_HCD) += host/ | 14 | obj-$(CONFIG_USB_OHCI_HCD) += host/ |
16 | obj-$(CONFIG_USB_UHCI_HCD) += host/ | 15 | obj-$(CONFIG_USB_UHCI_HCD) += host/ |
17 | obj-$(CONFIG_USB_FHCI_HCD) += host/ | 16 | obj-$(CONFIG_USB_FHCI_HCD) += host/ |
@@ -27,6 +26,8 @@ obj-$(CONFIG_USB_WUSB) += wusbcore/ | |||
27 | 26 | ||
28 | obj-$(CONFIG_USB_ACM) += class/ | 27 | obj-$(CONFIG_USB_ACM) += class/ |
29 | obj-$(CONFIG_USB_PRINTER) += class/ | 28 | obj-$(CONFIG_USB_PRINTER) += class/ |
29 | obj-$(CONFIG_USB_WDM) += class/ | ||
30 | obj-$(CONFIG_USB_TMC) += class/ | ||
30 | 31 | ||
31 | obj-$(CONFIG_USB_STORAGE) += storage/ | 32 | obj-$(CONFIG_USB_STORAGE) += storage/ |
32 | obj-$(CONFIG_USB) += storage/ | 33 | obj-$(CONFIG_USB) += storage/ |
diff --git a/drivers/usb/atm/cxacru.c b/drivers/usb/atm/cxacru.c index 6789089e246..56802d2e994 100644 --- a/drivers/usb/atm/cxacru.c +++ b/drivers/usb/atm/cxacru.c | |||
@@ -227,8 +227,14 @@ static ssize_t cxacru_sysfs_showattr_s8(s8 value, char *buf) | |||
227 | 227 | ||
228 | static ssize_t cxacru_sysfs_showattr_dB(s16 value, char *buf) | 228 | static ssize_t cxacru_sysfs_showattr_dB(s16 value, char *buf) |
229 | { | 229 | { |
230 | return snprintf(buf, PAGE_SIZE, "%d.%02u\n", | 230 | if (likely(value >= 0)) { |
231 | value / 100, abs(value) % 100); | 231 | return snprintf(buf, PAGE_SIZE, "%u.%02u\n", |
232 | value / 100, value % 100); | ||
233 | } else { | ||
234 | value = -value; | ||
235 | return snprintf(buf, PAGE_SIZE, "-%u.%02u\n", | ||
236 | value / 100, value % 100); | ||
237 | } | ||
232 | } | 238 | } |
233 | 239 | ||
234 | static ssize_t cxacru_sysfs_showattr_bool(u32 value, char *buf) | 240 | static ssize_t cxacru_sysfs_showattr_bool(u32 value, char *buf) |
diff --git a/drivers/usb/class/cdc-acm.c b/drivers/usb/class/cdc-acm.c index 0a69c0977e3..7a1164dd1d3 100644 --- a/drivers/usb/class/cdc-acm.c +++ b/drivers/usb/class/cdc-acm.c | |||
@@ -1375,6 +1375,9 @@ static struct usb_device_id acm_ids[] = { | |||
1375 | { USB_DEVICE(0x0572, 0x1324), /* Conexant USB MODEM RD02-D400 */ | 1375 | { USB_DEVICE(0x0572, 0x1324), /* Conexant USB MODEM RD02-D400 */ |
1376 | .driver_info = NO_UNION_NORMAL, /* has no union descriptor */ | 1376 | .driver_info = NO_UNION_NORMAL, /* has no union descriptor */ |
1377 | }, | 1377 | }, |
1378 | { USB_DEVICE(0x0572, 0x1328), /* Shiro / Aztech USB MODEM UM-3100 */ | ||
1379 | .driver_info = NO_UNION_NORMAL, /* has no union descriptor */ | ||
1380 | }, | ||
1378 | { USB_DEVICE(0x22b8, 0x6425), /* Motorola MOTOMAGX phones */ | 1381 | { USB_DEVICE(0x22b8, 0x6425), /* Motorola MOTOMAGX phones */ |
1379 | }, | 1382 | }, |
1380 | { USB_DEVICE(0x0572, 0x1329), /* Hummingbird huc56s (Conexant) */ | 1383 | { USB_DEVICE(0x0572, 0x1329), /* Hummingbird huc56s (Conexant) */ |
diff --git a/drivers/usb/gadget/atmel_usba_udc.c b/drivers/usb/gadget/atmel_usba_udc.c index 563d5727544..05c913cc365 100644 --- a/drivers/usb/gadget/atmel_usba_udc.c +++ b/drivers/usb/gadget/atmel_usba_udc.c | |||
@@ -794,7 +794,8 @@ usba_ep_queue(struct usb_ep *_ep, struct usb_request *_req, gfp_t gfp_flags) | |||
794 | if (ep->desc) { | 794 | if (ep->desc) { |
795 | list_add_tail(&req->queue, &ep->queue); | 795 | list_add_tail(&req->queue, &ep->queue); |
796 | 796 | ||
797 | if (ep->is_in || (ep_is_control(ep) | 797 | if ((!ep_is_control(ep) && ep->is_in) || |
798 | (ep_is_control(ep) | ||
798 | && (ep->state == DATA_STAGE_IN | 799 | && (ep->state == DATA_STAGE_IN |
799 | || ep->state == STATUS_STAGE_IN))) | 800 | || ep->state == STATUS_STAGE_IN))) |
800 | usba_ep_writel(ep, CTL_ENB, USBA_TX_PK_RDY); | 801 | usba_ep_writel(ep, CTL_ENB, USBA_TX_PK_RDY); |
@@ -1940,7 +1941,7 @@ static int __init usba_udc_probe(struct platform_device *pdev) | |||
1940 | usba_writel(udc, CTRL, USBA_DISABLE_MASK); | 1941 | usba_writel(udc, CTRL, USBA_DISABLE_MASK); |
1941 | clk_disable(pclk); | 1942 | clk_disable(pclk); |
1942 | 1943 | ||
1943 | usba_ep = kmalloc(sizeof(struct usba_ep) * pdata->num_ep, | 1944 | usba_ep = kzalloc(sizeof(struct usba_ep) * pdata->num_ep, |
1944 | GFP_KERNEL); | 1945 | GFP_KERNEL); |
1945 | if (!usba_ep) | 1946 | if (!usba_ep) |
1946 | goto err_alloc_ep; | 1947 | goto err_alloc_ep; |
diff --git a/drivers/usb/gadget/usbstring.c b/drivers/usb/gadget/usbstring.c index 4154be375c7..58c4d37d312 100644 --- a/drivers/usb/gadget/usbstring.c +++ b/drivers/usb/gadget/usbstring.c | |||
@@ -38,7 +38,7 @@ static int utf8_to_utf16le(const char *s, __le16 *cp, unsigned len) | |||
38 | uchar = (c & 0x1f) << 6; | 38 | uchar = (c & 0x1f) << 6; |
39 | 39 | ||
40 | c = (u8) *s++; | 40 | c = (u8) *s++; |
41 | if ((c & 0xc0) != 0xc0) | 41 | if ((c & 0xc0) != 0x80) |
42 | goto fail; | 42 | goto fail; |
43 | c &= 0x3f; | 43 | c &= 0x3f; |
44 | uchar |= c; | 44 | uchar |= c; |
@@ -49,13 +49,13 @@ static int utf8_to_utf16le(const char *s, __le16 *cp, unsigned len) | |||
49 | uchar = (c & 0x0f) << 12; | 49 | uchar = (c & 0x0f) << 12; |
50 | 50 | ||
51 | c = (u8) *s++; | 51 | c = (u8) *s++; |
52 | if ((c & 0xc0) != 0xc0) | 52 | if ((c & 0xc0) != 0x80) |
53 | goto fail; | 53 | goto fail; |
54 | c &= 0x3f; | 54 | c &= 0x3f; |
55 | uchar |= c << 6; | 55 | uchar |= c << 6; |
56 | 56 | ||
57 | c = (u8) *s++; | 57 | c = (u8) *s++; |
58 | if ((c & 0xc0) != 0xc0) | 58 | if ((c & 0xc0) != 0x80) |
59 | goto fail; | 59 | goto fail; |
60 | c &= 0x3f; | 60 | c &= 0x3f; |
61 | uchar |= c; | 61 | uchar |= c; |
diff --git a/drivers/usb/host/isp1760-hcd.c b/drivers/usb/host/isp1760-hcd.c index cd07ea3f0c6..15438469f21 100644 --- a/drivers/usb/host/isp1760-hcd.c +++ b/drivers/usb/host/isp1760-hcd.c | |||
@@ -1658,6 +1658,7 @@ static int isp1760_urb_dequeue(struct usb_hcd *hcd, struct urb *urb, | |||
1658 | u32 reg_base, or_reg, skip_reg; | 1658 | u32 reg_base, or_reg, skip_reg; |
1659 | unsigned long flags; | 1659 | unsigned long flags; |
1660 | struct ptd ptd; | 1660 | struct ptd ptd; |
1661 | packet_enqueue *pe; | ||
1661 | 1662 | ||
1662 | switch (usb_pipetype(urb->pipe)) { | 1663 | switch (usb_pipetype(urb->pipe)) { |
1663 | case PIPE_ISOCHRONOUS: | 1664 | case PIPE_ISOCHRONOUS: |
@@ -1669,6 +1670,7 @@ static int isp1760_urb_dequeue(struct usb_hcd *hcd, struct urb *urb, | |||
1669 | reg_base = INT_REGS_OFFSET; | 1670 | reg_base = INT_REGS_OFFSET; |
1670 | or_reg = HC_INT_IRQ_MASK_OR_REG; | 1671 | or_reg = HC_INT_IRQ_MASK_OR_REG; |
1671 | skip_reg = HC_INT_PTD_SKIPMAP_REG; | 1672 | skip_reg = HC_INT_PTD_SKIPMAP_REG; |
1673 | pe = enqueue_an_INT_packet; | ||
1672 | break; | 1674 | break; |
1673 | 1675 | ||
1674 | default: | 1676 | default: |
@@ -1676,6 +1678,7 @@ static int isp1760_urb_dequeue(struct usb_hcd *hcd, struct urb *urb, | |||
1676 | reg_base = ATL_REGS_OFFSET; | 1678 | reg_base = ATL_REGS_OFFSET; |
1677 | or_reg = HC_ATL_IRQ_MASK_OR_REG; | 1679 | or_reg = HC_ATL_IRQ_MASK_OR_REG; |
1678 | skip_reg = HC_ATL_PTD_SKIPMAP_REG; | 1680 | skip_reg = HC_ATL_PTD_SKIPMAP_REG; |
1681 | pe = enqueue_an_ATL_packet; | ||
1679 | break; | 1682 | break; |
1680 | } | 1683 | } |
1681 | 1684 | ||
@@ -1687,6 +1690,7 @@ static int isp1760_urb_dequeue(struct usb_hcd *hcd, struct urb *urb, | |||
1687 | u32 skip_map; | 1690 | u32 skip_map; |
1688 | u32 or_map; | 1691 | u32 or_map; |
1689 | struct isp1760_qtd *qtd; | 1692 | struct isp1760_qtd *qtd; |
1693 | struct isp1760_qh *qh = ints->qh; | ||
1690 | 1694 | ||
1691 | skip_map = isp1760_readl(hcd->regs + skip_reg); | 1695 | skip_map = isp1760_readl(hcd->regs + skip_reg); |
1692 | skip_map |= 1 << i; | 1696 | skip_map |= 1 << i; |
@@ -1699,8 +1703,7 @@ static int isp1760_urb_dequeue(struct usb_hcd *hcd, struct urb *urb, | |||
1699 | priv_write_copy(priv, (u32 *)&ptd, hcd->regs + reg_base | 1703 | priv_write_copy(priv, (u32 *)&ptd, hcd->regs + reg_base |
1700 | + i * sizeof(ptd), sizeof(ptd)); | 1704 | + i * sizeof(ptd), sizeof(ptd)); |
1701 | qtd = ints->qtd; | 1705 | qtd = ints->qtd; |
1702 | 1706 | qtd = clean_up_qtdlist(qtd); | |
1703 | clean_up_qtdlist(qtd); | ||
1704 | 1707 | ||
1705 | free_mem(priv, ints->payload); | 1708 | free_mem(priv, ints->payload); |
1706 | 1709 | ||
@@ -1711,7 +1714,24 @@ static int isp1760_urb_dequeue(struct usb_hcd *hcd, struct urb *urb, | |||
1711 | ints->payload = 0; | 1714 | ints->payload = 0; |
1712 | 1715 | ||
1713 | isp1760_urb_done(priv, urb, status); | 1716 | isp1760_urb_done(priv, urb, status); |
1717 | if (qtd) | ||
1718 | pe(hcd, qh, qtd); | ||
1714 | break; | 1719 | break; |
1720 | |||
1721 | } else if (ints->qtd) { | ||
1722 | struct isp1760_qtd *qtd, *prev_qtd = ints->qtd; | ||
1723 | |||
1724 | for (qtd = ints->qtd->hw_next; qtd; qtd = qtd->hw_next) { | ||
1725 | if (qtd->urb == urb) { | ||
1726 | prev_qtd->hw_next = clean_up_qtdlist(qtd); | ||
1727 | isp1760_urb_done(priv, urb, status); | ||
1728 | break; | ||
1729 | } | ||
1730 | prev_qtd = qtd; | ||
1731 | } | ||
1732 | /* we found the urb before the end of the list */ | ||
1733 | if (qtd) | ||
1734 | break; | ||
1715 | } | 1735 | } |
1716 | ints++; | 1736 | ints++; |
1717 | } | 1737 | } |
diff --git a/drivers/usb/serial/ftdi_sio.c b/drivers/usb/serial/ftdi_sio.c index 8100f1d2590..d9fcdaedf38 100644 --- a/drivers/usb/serial/ftdi_sio.c +++ b/drivers/usb/serial/ftdi_sio.c | |||
@@ -56,6 +56,7 @@ static __u16 vendor = FTDI_VID; | |||
56 | static __u16 product; | 56 | static __u16 product; |
57 | 57 | ||
58 | struct ftdi_private { | 58 | struct ftdi_private { |
59 | struct kref kref; | ||
59 | ftdi_chip_type_t chip_type; | 60 | ftdi_chip_type_t chip_type; |
60 | /* type of device, either SIO or FT8U232AM */ | 61 | /* type of device, either SIO or FT8U232AM */ |
61 | int baud_base; /* baud base clock for divisor setting */ | 62 | int baud_base; /* baud base clock for divisor setting */ |
@@ -669,6 +670,8 @@ static struct usb_device_id id_table_combined [] = { | |||
669 | { USB_DEVICE(ADI_VID, ADI_GNICE_PID), | 670 | { USB_DEVICE(ADI_VID, ADI_GNICE_PID), |
670 | .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk }, | 671 | .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk }, |
671 | { USB_DEVICE(JETI_VID, JETI_SPC1201_PID) }, | 672 | { USB_DEVICE(JETI_VID, JETI_SPC1201_PID) }, |
673 | { USB_DEVICE(MARVELL_VID, MARVELL_SHEEVAPLUG_PID), | ||
674 | .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk }, | ||
672 | { }, /* Optional parameter entry */ | 675 | { }, /* Optional parameter entry */ |
673 | { } /* Terminating entry */ | 676 | { } /* Terminating entry */ |
674 | }; | 677 | }; |
@@ -1352,6 +1355,7 @@ static int ftdi_sio_port_probe(struct usb_serial_port *port) | |||
1352 | return -ENOMEM; | 1355 | return -ENOMEM; |
1353 | } | 1356 | } |
1354 | 1357 | ||
1358 | kref_init(&priv->kref); | ||
1355 | spin_lock_init(&priv->rx_lock); | 1359 | spin_lock_init(&priv->rx_lock); |
1356 | spin_lock_init(&priv->tx_lock); | 1360 | spin_lock_init(&priv->tx_lock); |
1357 | init_waitqueue_head(&priv->delta_msr_wait); | 1361 | init_waitqueue_head(&priv->delta_msr_wait); |
@@ -1468,6 +1472,13 @@ static void ftdi_shutdown(struct usb_serial *serial) | |||
1468 | dbg("%s", __func__); | 1472 | dbg("%s", __func__); |
1469 | } | 1473 | } |
1470 | 1474 | ||
1475 | static void ftdi_sio_priv_release(struct kref *k) | ||
1476 | { | ||
1477 | struct ftdi_private *priv = container_of(k, struct ftdi_private, kref); | ||
1478 | |||
1479 | kfree(priv); | ||
1480 | } | ||
1481 | |||
1471 | static int ftdi_sio_port_remove(struct usb_serial_port *port) | 1482 | static int ftdi_sio_port_remove(struct usb_serial_port *port) |
1472 | { | 1483 | { |
1473 | struct ftdi_private *priv = usb_get_serial_port_data(port); | 1484 | struct ftdi_private *priv = usb_get_serial_port_data(port); |
@@ -1476,14 +1487,7 @@ static int ftdi_sio_port_remove(struct usb_serial_port *port) | |||
1476 | 1487 | ||
1477 | remove_sysfs_attrs(port); | 1488 | remove_sysfs_attrs(port); |
1478 | 1489 | ||
1479 | /* all open ports are closed at this point | 1490 | kref_put(&priv->kref, ftdi_sio_priv_release); |
1480 | * (by usbserial.c:__serial_close, which calls ftdi_close) | ||
1481 | */ | ||
1482 | |||
1483 | if (priv) { | ||
1484 | usb_set_serial_port_data(port, NULL); | ||
1485 | kfree(priv); | ||
1486 | } | ||
1487 | 1491 | ||
1488 | return 0; | 1492 | return 0; |
1489 | } | 1493 | } |
@@ -1547,7 +1551,8 @@ static int ftdi_open(struct tty_struct *tty, | |||
1547 | dev_err(&port->dev, | 1551 | dev_err(&port->dev, |
1548 | "%s - failed submitting read urb, error %d\n", | 1552 | "%s - failed submitting read urb, error %d\n", |
1549 | __func__, result); | 1553 | __func__, result); |
1550 | 1554 | else | |
1555 | kref_get(&priv->kref); | ||
1551 | 1556 | ||
1552 | return result; | 1557 | return result; |
1553 | } /* ftdi_open */ | 1558 | } /* ftdi_open */ |
@@ -1589,11 +1594,11 @@ static void ftdi_close(struct tty_struct *tty, | |||
1589 | mutex_unlock(&port->serial->disc_mutex); | 1594 | mutex_unlock(&port->serial->disc_mutex); |
1590 | 1595 | ||
1591 | /* cancel any scheduled reading */ | 1596 | /* cancel any scheduled reading */ |
1592 | cancel_delayed_work(&priv->rx_work); | 1597 | cancel_delayed_work_sync(&priv->rx_work); |
1593 | flush_scheduled_work(); | ||
1594 | 1598 | ||
1595 | /* shutdown our bulk read */ | 1599 | /* shutdown our bulk read */ |
1596 | usb_kill_urb(port->read_urb); | 1600 | usb_kill_urb(port->read_urb); |
1601 | kref_put(&priv->kref, ftdi_sio_priv_release); | ||
1597 | } /* ftdi_close */ | 1602 | } /* ftdi_close */ |
1598 | 1603 | ||
1599 | 1604 | ||
diff --git a/drivers/usb/serial/ftdi_sio.h b/drivers/usb/serial/ftdi_sio.h index c09f658a448..12330fa1c09 100644 --- a/drivers/usb/serial/ftdi_sio.h +++ b/drivers/usb/serial/ftdi_sio.h | |||
@@ -920,6 +920,12 @@ | |||
920 | #define JETI_SPC1201_PID 0x04b2 | 920 | #define JETI_SPC1201_PID 0x04b2 |
921 | 921 | ||
922 | /* | 922 | /* |
923 | * Marvell SheevaPlug | ||
924 | */ | ||
925 | #define MARVELL_VID 0x9e88 | ||
926 | #define MARVELL_SHEEVAPLUG_PID 0x9e8f | ||
927 | |||
928 | /* | ||
923 | * BmRequestType: 1100 0000b | 929 | * BmRequestType: 1100 0000b |
924 | * bRequest: FTDI_E2_READ | 930 | * bRequest: FTDI_E2_READ |
925 | * wValue: 0 | 931 | * wValue: 0 |
diff --git a/drivers/usb/serial/usb-serial.c b/drivers/usb/serial/usb-serial.c index 0a566eea49c..f331e2bde88 100644 --- a/drivers/usb/serial/usb-serial.c +++ b/drivers/usb/serial/usb-serial.c | |||
@@ -974,6 +974,7 @@ int usb_serial_probe(struct usb_interface *interface, | |||
974 | if (retval > 0) { | 974 | if (retval > 0) { |
975 | /* quietly accept this device, but don't bind to a | 975 | /* quietly accept this device, but don't bind to a |
976 | serial port as it's about to disappear */ | 976 | serial port as it's about to disappear */ |
977 | serial->num_ports = 0; | ||
977 | goto exit; | 978 | goto exit; |
978 | } | 979 | } |
979 | } | 980 | } |
diff --git a/drivers/usb/storage/unusual_devs.h b/drivers/usb/storage/unusual_devs.h index fa65a3b0860..4b8b69045fe 100644 --- a/drivers/usb/storage/unusual_devs.h +++ b/drivers/usb/storage/unusual_devs.h | |||
@@ -160,8 +160,9 @@ UNUSUAL_DEV( 0x0420, 0x0001, 0x0100, 0x0100, | |||
160 | US_SC_DEVICE, US_PR_DEVICE, NULL, | 160 | US_SC_DEVICE, US_PR_DEVICE, NULL, |
161 | US_FL_IGNORE_RESIDUE ), | 161 | US_FL_IGNORE_RESIDUE ), |
162 | 162 | ||
163 | /* Reported by Andrew Nayenko <relan@bk.ru> */ | 163 | /* Reported by Andrew Nayenko <relan@bk.ru> |
164 | UNUSUAL_DEV( 0x0421, 0x0019, 0x0592, 0x0592, | 164 | * Updated for new firmware by Phillip Potter <phillipinda@hotmail.com> */ |
165 | UNUSUAL_DEV( 0x0421, 0x0019, 0x0592, 0x0610, | ||
165 | "Nokia", | 166 | "Nokia", |
166 | "Nokia 6288", | 167 | "Nokia 6288", |
167 | US_SC_DEVICE, US_PR_DEVICE, NULL, | 168 | US_SC_DEVICE, US_PR_DEVICE, NULL, |