diff options
51 files changed, 2333 insertions, 2221 deletions
diff --git a/MAINTAINERS b/MAINTAINERS index 8f18ba081ed3..027ec2bfa135 100644 --- a/MAINTAINERS +++ b/MAINTAINERS | |||
| @@ -7746,6 +7746,13 @@ W: http://www.ideasonboard.org/uvc/ | |||
| 7746 | S: Maintained | 7746 | S: Maintained |
| 7747 | F: drivers/media/usb/uvc/ | 7747 | F: drivers/media/usb/uvc/ |
| 7748 | 7748 | ||
| 7749 | USB WEBCAM GADGET | ||
| 7750 | M: Laurent Pinchart <laurent.pinchart@ideasonboard.com> | ||
| 7751 | L: linux-usb@vger.kernel.org | ||
| 7752 | S: Maintained | ||
| 7753 | F: drivers/usb/gadget/*uvc*.c | ||
| 7754 | F: drivers/usb/gadget/webcam.c | ||
| 7755 | |||
| 7749 | USB WIRELESS RNDIS DRIVER (rndis_wlan) | 7756 | USB WIRELESS RNDIS DRIVER (rndis_wlan) |
| 7750 | M: Jussi Kivilinna <jussi.kivilinna@mbnet.fi> | 7757 | M: Jussi Kivilinna <jussi.kivilinna@mbnet.fi> |
| 7751 | L: linux-wireless@vger.kernel.org | 7758 | L: linux-wireless@vger.kernel.org |
diff --git a/drivers/usb/class/cdc-acm.c b/drivers/usb/class/cdc-acm.c index 981f2132d128..6e49ec6f3adc 100644 --- a/drivers/usb/class/cdc-acm.c +++ b/drivers/usb/class/cdc-acm.c | |||
| @@ -817,10 +817,6 @@ static const __u32 acm_tty_speed[] = { | |||
| 817 | 2500000, 3000000, 3500000, 4000000 | 817 | 2500000, 3000000, 3500000, 4000000 |
| 818 | }; | 818 | }; |
| 819 | 819 | ||
| 820 | static const __u8 acm_tty_size[] = { | ||
| 821 | 5, 6, 7, 8 | ||
| 822 | }; | ||
| 823 | |||
| 824 | static void acm_tty_set_termios(struct tty_struct *tty, | 820 | static void acm_tty_set_termios(struct tty_struct *tty, |
| 825 | struct ktermios *termios_old) | 821 | struct ktermios *termios_old) |
| 826 | { | 822 | { |
| @@ -834,7 +830,21 @@ static void acm_tty_set_termios(struct tty_struct *tty, | |||
| 834 | newline.bParityType = termios->c_cflag & PARENB ? | 830 | newline.bParityType = termios->c_cflag & PARENB ? |
| 835 | (termios->c_cflag & PARODD ? 1 : 2) + | 831 | (termios->c_cflag & PARODD ? 1 : 2) + |
| 836 | (termios->c_cflag & CMSPAR ? 2 : 0) : 0; | 832 | (termios->c_cflag & CMSPAR ? 2 : 0) : 0; |
| 837 | newline.bDataBits = acm_tty_size[(termios->c_cflag & CSIZE) >> 4]; | 833 | switch (termios->c_cflag & CSIZE) { |
| 834 | case CS5: | ||
| 835 | newline.bDataBits = 5; | ||
| 836 | break; | ||
| 837 | case CS6: | ||
| 838 | newline.bDataBits = 6; | ||
| 839 | break; | ||
| 840 | case CS7: | ||
| 841 | newline.bDataBits = 7; | ||
| 842 | break; | ||
| 843 | case CS8: | ||
| 844 | default: | ||
| 845 | newline.bDataBits = 8; | ||
| 846 | break; | ||
| 847 | } | ||
| 838 | /* FIXME: Needs to clear unsupported bits in the termios */ | 848 | /* FIXME: Needs to clear unsupported bits in the termios */ |
| 839 | acm->clocal = ((termios->c_cflag & CLOCAL) != 0); | 849 | acm->clocal = ((termios->c_cflag & CLOCAL) != 0); |
| 840 | 850 | ||
| @@ -1233,7 +1243,7 @@ made_compressed_probe: | |||
| 1233 | 1243 | ||
| 1234 | if (usb_endpoint_xfer_int(epwrite)) | 1244 | if (usb_endpoint_xfer_int(epwrite)) |
| 1235 | usb_fill_int_urb(snd->urb, usb_dev, | 1245 | usb_fill_int_urb(snd->urb, usb_dev, |
| 1236 | usb_sndbulkpipe(usb_dev, epwrite->bEndpointAddress), | 1246 | usb_sndintpipe(usb_dev, epwrite->bEndpointAddress), |
| 1237 | NULL, acm->writesize, acm_write_bulk, snd, epwrite->bInterval); | 1247 | NULL, acm->writesize, acm_write_bulk, snd, epwrite->bInterval); |
| 1238 | else | 1248 | else |
| 1239 | usb_fill_bulk_urb(snd->urb, usb_dev, | 1249 | usb_fill_bulk_urb(snd->urb, usb_dev, |
diff --git a/drivers/usb/core/devio.c b/drivers/usb/core/devio.c index e0356cb859b5..b78fbe222b72 100644 --- a/drivers/usb/core/devio.c +++ b/drivers/usb/core/devio.c | |||
| @@ -1348,6 +1348,7 @@ static int proc_do_submiturb(struct dev_state *ps, struct usbdevfs_urb *uurb, | |||
| 1348 | ret = -EFAULT; | 1348 | ret = -EFAULT; |
| 1349 | goto error; | 1349 | goto error; |
| 1350 | } | 1350 | } |
| 1351 | uurb->buffer += u; | ||
| 1351 | } | 1352 | } |
| 1352 | totlen -= u; | 1353 | totlen -= u; |
| 1353 | } | 1354 | } |
diff --git a/drivers/usb/core/driver.c b/drivers/usb/core/driver.c index ddd820d25288..6056db7af410 100644 --- a/drivers/usb/core/driver.c +++ b/drivers/usb/core/driver.c | |||
| @@ -367,6 +367,10 @@ static int usb_probe_interface(struct device *dev) | |||
| 367 | intf->condition = USB_INTERFACE_UNBOUND; | 367 | intf->condition = USB_INTERFACE_UNBOUND; |
| 368 | usb_cancel_queued_reset(intf); | 368 | usb_cancel_queued_reset(intf); |
| 369 | 369 | ||
| 370 | /* If the LPM disable succeeded, balance the ref counts. */ | ||
| 371 | if (!lpm_disable_error) | ||
| 372 | usb_unlocked_enable_lpm(udev); | ||
| 373 | |||
| 370 | /* Unbound interfaces are always runtime-PM-disabled and -suspended */ | 374 | /* Unbound interfaces are always runtime-PM-disabled and -suspended */ |
| 371 | if (driver->supports_autosuspend) | 375 | if (driver->supports_autosuspend) |
| 372 | pm_runtime_disable(dev); | 376 | pm_runtime_disable(dev); |
diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c index 673ee4696262..64854d76f529 100644 --- a/drivers/usb/core/hub.c +++ b/drivers/usb/core/hub.c | |||
| @@ -3241,8 +3241,7 @@ static int usb_req_set_sel(struct usb_device *udev, enum usb3_link_state state) | |||
| 3241 | (state == USB3_LPM_U2 && | 3241 | (state == USB3_LPM_U2 && |
| 3242 | (u2_sel > USB3_LPM_MAX_U2_SEL_PEL || | 3242 | (u2_sel > USB3_LPM_MAX_U2_SEL_PEL || |
| 3243 | u2_pel > USB3_LPM_MAX_U2_SEL_PEL))) { | 3243 | u2_pel > USB3_LPM_MAX_U2_SEL_PEL))) { |
| 3244 | dev_dbg(&udev->dev, "Device-initiated %s disabled due " | 3244 | dev_dbg(&udev->dev, "Device-initiated %s disabled due to long SEL %llu us or PEL %llu us\n", |
| 3245 | "to long SEL %llu ms or PEL %llu ms\n", | ||
| 3246 | usb3_lpm_names[state], u1_sel, u1_pel); | 3245 | usb3_lpm_names[state], u1_sel, u1_pel); |
| 3247 | return -EINVAL; | 3246 | return -EINVAL; |
| 3248 | } | 3247 | } |
| @@ -3320,16 +3319,6 @@ static int usb_set_device_initiated_lpm(struct usb_device *udev, | |||
| 3320 | 3319 | ||
| 3321 | if (enable) { | 3320 | if (enable) { |
| 3322 | /* | 3321 | /* |
| 3323 | * First, let the device know about the exit latencies | ||
| 3324 | * associated with the link state we're about to enable. | ||
| 3325 | */ | ||
| 3326 | ret = usb_req_set_sel(udev, state); | ||
| 3327 | if (ret < 0) { | ||
| 3328 | dev_warn(&udev->dev, "Set SEL for device-initiated " | ||
| 3329 | "%s failed.\n", usb3_lpm_names[state]); | ||
| 3330 | return -EBUSY; | ||
| 3331 | } | ||
| 3332 | /* | ||
| 3333 | * Now send the control transfer to enable device-initiated LPM | 3322 | * Now send the control transfer to enable device-initiated LPM |
| 3334 | * for either U1 or U2. | 3323 | * for either U1 or U2. |
| 3335 | */ | 3324 | */ |
| @@ -3414,7 +3403,28 @@ static int usb_set_lpm_timeout(struct usb_device *udev, | |||
| 3414 | static void usb_enable_link_state(struct usb_hcd *hcd, struct usb_device *udev, | 3403 | static void usb_enable_link_state(struct usb_hcd *hcd, struct usb_device *udev, |
| 3415 | enum usb3_link_state state) | 3404 | enum usb3_link_state state) |
| 3416 | { | 3405 | { |
| 3417 | int timeout; | 3406 | int timeout, ret; |
| 3407 | __u8 u1_mel = udev->bos->ss_cap->bU1devExitLat; | ||
| 3408 | __le16 u2_mel = udev->bos->ss_cap->bU2DevExitLat; | ||
| 3409 | |||
| 3410 | /* If the device says it doesn't have *any* exit latency to come out of | ||
| 3411 | * U1 or U2, it's probably lying. Assume it doesn't implement that link | ||
| 3412 | * state. | ||
| 3413 | */ | ||
| 3414 | if ((state == USB3_LPM_U1 && u1_mel == 0) || | ||
| 3415 | (state == USB3_LPM_U2 && u2_mel == 0)) | ||
| 3416 | return; | ||
| 3417 | |||
| 3418 | /* | ||
| 3419 | * First, let the device know about the exit latencies | ||
| 3420 | * associated with the link state we're about to enable. | ||
| 3421 | */ | ||
| 3422 | ret = usb_req_set_sel(udev, state); | ||
| 3423 | if (ret < 0) { | ||
| 3424 | dev_warn(&udev->dev, "Set SEL for device-initiated %s failed.\n", | ||
| 3425 | usb3_lpm_names[state]); | ||
| 3426 | return; | ||
| 3427 | } | ||
| 3418 | 3428 | ||
| 3419 | /* We allow the host controller to set the U1/U2 timeout internally | 3429 | /* We allow the host controller to set the U1/U2 timeout internally |
| 3420 | * first, so that it can change its schedule to account for the | 3430 | * first, so that it can change its schedule to account for the |
diff --git a/drivers/usb/dwc3/core.c b/drivers/usb/dwc3/core.c index b415c0c859d3..c14ebc975ba4 100644 --- a/drivers/usb/dwc3/core.c +++ b/drivers/usb/dwc3/core.c | |||
| @@ -409,6 +409,10 @@ static void dwc3_core_exit(struct dwc3 *dwc) | |||
| 409 | { | 409 | { |
| 410 | dwc3_event_buffers_cleanup(dwc); | 410 | dwc3_event_buffers_cleanup(dwc); |
| 411 | dwc3_free_event_buffers(dwc); | 411 | dwc3_free_event_buffers(dwc); |
| 412 | |||
| 413 | usb_phy_shutdown(dwc->usb2_phy); | ||
| 414 | usb_phy_shutdown(dwc->usb3_phy); | ||
| 415 | |||
| 412 | } | 416 | } |
| 413 | 417 | ||
| 414 | #define DWC3_ALIGN_MASK (16 - 1) | 418 | #define DWC3_ALIGN_MASK (16 - 1) |
diff --git a/drivers/usb/dwc3/gadget.c b/drivers/usb/dwc3/gadget.c index c9e729a4bf65..7b7deddf6a52 100644 --- a/drivers/usb/dwc3/gadget.c +++ b/drivers/usb/dwc3/gadget.c | |||
| @@ -1904,7 +1904,7 @@ static void dwc3_stop_active_transfer(struct dwc3 *dwc, u32 epnum) | |||
| 1904 | ret = dwc3_send_gadget_ep_cmd(dwc, dep->number, cmd, ¶ms); | 1904 | ret = dwc3_send_gadget_ep_cmd(dwc, dep->number, cmd, ¶ms); |
| 1905 | WARN_ON_ONCE(ret); | 1905 | WARN_ON_ONCE(ret); |
| 1906 | dep->resource_index = 0; | 1906 | dep->resource_index = 0; |
| 1907 | 1907 | dep->flags &= ~DWC3_EP_BUSY; | |
| 1908 | udelay(100); | 1908 | udelay(100); |
| 1909 | } | 1909 | } |
| 1910 | 1910 | ||
diff --git a/drivers/usb/gadget/Kconfig b/drivers/usb/gadget/Kconfig index dfb51a45496c..e0ff51b89529 100644 --- a/drivers/usb/gadget/Kconfig +++ b/drivers/usb/gadget/Kconfig | |||
| @@ -952,6 +952,7 @@ endif | |||
| 952 | config USB_G_WEBCAM | 952 | config USB_G_WEBCAM |
| 953 | tristate "USB Webcam Gadget" | 953 | tristate "USB Webcam Gadget" |
| 954 | depends on VIDEO_DEV | 954 | depends on VIDEO_DEV |
| 955 | select USB_LIBCOMPOSITE | ||
| 955 | help | 956 | help |
| 956 | The Webcam Gadget acts as a composite USB Audio and Video Class | 957 | The Webcam Gadget acts as a composite USB Audio and Video Class |
| 957 | device. It provides a userspace API to process UVC control requests | 958 | device. It provides a userspace API to process UVC control requests |
diff --git a/drivers/usb/gadget/lpc32xx_udc.c b/drivers/usb/gadget/lpc32xx_udc.c index f696fb9b136d..21a9861dabf0 100644 --- a/drivers/usb/gadget/lpc32xx_udc.c +++ b/drivers/usb/gadget/lpc32xx_udc.c | |||
| @@ -2930,10 +2930,10 @@ static void vbus_work(struct work_struct *work) | |||
| 2930 | 2930 | ||
| 2931 | /* Get the VBUS status from the transceiver */ | 2931 | /* Get the VBUS status from the transceiver */ |
| 2932 | value = i2c_smbus_read_byte_data(udc->isp1301_i2c_client, | 2932 | value = i2c_smbus_read_byte_data(udc->isp1301_i2c_client, |
| 2933 | ISP1301_I2C_OTG_CONTROL_2); | 2933 | ISP1301_I2C_INTERRUPT_SOURCE); |
| 2934 | 2934 | ||
| 2935 | /* VBUS on or off? */ | 2935 | /* VBUS on or off? */ |
| 2936 | if (value & OTG_B_SESS_VLD) | 2936 | if (value & INT_SESS_VLD) |
| 2937 | udc->vbus = 1; | 2937 | udc->vbus = 1; |
| 2938 | else | 2938 | else |
| 2939 | udc->vbus = 0; | 2939 | udc->vbus = 0; |
diff --git a/drivers/usb/host/ehci-vt8500.c b/drivers/usb/host/ehci-vt8500.c index 96722bfebc84..d3c9a3e397b9 100644 --- a/drivers/usb/host/ehci-vt8500.c +++ b/drivers/usb/host/ehci-vt8500.c | |||
| @@ -85,6 +85,8 @@ static const struct hc_driver vt8500_ehci_hc_driver = { | |||
| 85 | .clear_tt_buffer_complete = ehci_clear_tt_buffer_complete, | 85 | .clear_tt_buffer_complete = ehci_clear_tt_buffer_complete, |
| 86 | }; | 86 | }; |
| 87 | 87 | ||
| 88 | static u64 vt8500_ehci_dma_mask = DMA_BIT_MASK(32); | ||
| 89 | |||
| 88 | static int vt8500_ehci_drv_probe(struct platform_device *pdev) | 90 | static int vt8500_ehci_drv_probe(struct platform_device *pdev) |
| 89 | { | 91 | { |
| 90 | struct usb_hcd *hcd; | 92 | struct usb_hcd *hcd; |
| @@ -95,6 +97,14 @@ static int vt8500_ehci_drv_probe(struct platform_device *pdev) | |||
| 95 | if (usb_disabled()) | 97 | if (usb_disabled()) |
| 96 | return -ENODEV; | 98 | return -ENODEV; |
| 97 | 99 | ||
| 100 | /* | ||
| 101 | * Right now device-tree probed devices don't get dma_mask set. | ||
| 102 | * Since shared usb code relies on it, set it here for now. | ||
| 103 | * Once we have dma capability bindings this can go away. | ||
| 104 | */ | ||
| 105 | if (!pdev->dev.dma_mask) | ||
| 106 | pdev->dev.dma_mask = &vt8500_ehci_dma_mask; | ||
| 107 | |||
| 98 | if (pdev->resource[1].flags != IORESOURCE_IRQ) { | 108 | if (pdev->resource[1].flags != IORESOURCE_IRQ) { |
| 99 | pr_debug("resource[1] is not IORESOURCE_IRQ"); | 109 | pr_debug("resource[1] is not IORESOURCE_IRQ"); |
| 100 | return -ENOMEM; | 110 | return -ENOMEM; |
diff --git a/drivers/usb/host/uhci-platform.c b/drivers/usb/host/uhci-platform.c index e4780491df4a..68ebf20e1519 100644 --- a/drivers/usb/host/uhci-platform.c +++ b/drivers/usb/host/uhci-platform.c | |||
| @@ -60,6 +60,7 @@ static const struct hc_driver uhci_platform_hc_driver = { | |||
| 60 | .hub_control = uhci_hub_control, | 60 | .hub_control = uhci_hub_control, |
| 61 | }; | 61 | }; |
| 62 | 62 | ||
| 63 | static u64 platform_uhci_dma_mask = DMA_BIT_MASK(32); | ||
| 63 | 64 | ||
| 64 | static int __devinit uhci_hcd_platform_probe(struct platform_device *pdev) | 65 | static int __devinit uhci_hcd_platform_probe(struct platform_device *pdev) |
| 65 | { | 66 | { |
| @@ -71,6 +72,14 @@ static int __devinit uhci_hcd_platform_probe(struct platform_device *pdev) | |||
| 71 | if (usb_disabled()) | 72 | if (usb_disabled()) |
| 72 | return -ENODEV; | 73 | return -ENODEV; |
| 73 | 74 | ||
| 75 | /* | ||
| 76 | * Right now device-tree probed devices don't get dma_mask set. | ||
| 77 | * Since shared usb code relies on it, set it here for now. | ||
| 78 | * Once we have dma capability bindings this can go away. | ||
| 79 | */ | ||
| 80 | if (!pdev->dev.dma_mask) | ||
| 81 | pdev->dev.dma_mask = &platform_uhci_dma_mask; | ||
| 82 | |||
| 74 | hcd = usb_create_hcd(&uhci_platform_hc_driver, &pdev->dev, | 83 | hcd = usb_create_hcd(&uhci_platform_hc_driver, &pdev->dev, |
| 75 | pdev->name); | 84 | pdev->name); |
| 76 | if (!hcd) | 85 | if (!hcd) |
diff --git a/drivers/usb/host/xhci.c b/drivers/usb/host/xhci.c index 8d7fcbbe6ade..7d462bf20092 100644 --- a/drivers/usb/host/xhci.c +++ b/drivers/usb/host/xhci.c | |||
| @@ -479,7 +479,8 @@ static bool compliance_mode_recovery_timer_quirk_check(void) | |||
| 479 | 479 | ||
| 480 | if (strstr(dmi_product_name, "Z420") || | 480 | if (strstr(dmi_product_name, "Z420") || |
| 481 | strstr(dmi_product_name, "Z620") || | 481 | strstr(dmi_product_name, "Z620") || |
| 482 | strstr(dmi_product_name, "Z820")) | 482 | strstr(dmi_product_name, "Z820") || |
| 483 | strstr(dmi_product_name, "Z1")) | ||
| 483 | return true; | 484 | return true; |
| 484 | 485 | ||
| 485 | return false; | 486 | return false; |
diff --git a/drivers/usb/musb/am35x.c b/drivers/usb/musb/am35x.c index 457f25e62c51..c964d6af178b 100644 --- a/drivers/usb/musb/am35x.c +++ b/drivers/usb/musb/am35x.c | |||
| @@ -305,6 +305,12 @@ static irqreturn_t am35x_musb_interrupt(int irq, void *hci) | |||
| 305 | ret = IRQ_HANDLED; | 305 | ret = IRQ_HANDLED; |
| 306 | } | 306 | } |
| 307 | 307 | ||
| 308 | /* Drop spurious RX and TX if device is disconnected */ | ||
| 309 | if (musb->int_usb & MUSB_INTR_DISCONNECT) { | ||
| 310 | musb->int_tx = 0; | ||
| 311 | musb->int_rx = 0; | ||
| 312 | } | ||
| 313 | |||
| 308 | if (musb->int_tx || musb->int_rx || musb->int_usb) | 314 | if (musb->int_tx || musb->int_rx || musb->int_usb) |
| 309 | ret |= musb_interrupt(musb); | 315 | ret |= musb_interrupt(musb); |
| 310 | 316 | ||
diff --git a/drivers/usb/renesas_usbhs/mod.c b/drivers/usb/renesas_usbhs/mod.c index 35c5208f3249..61933a90e5bf 100644 --- a/drivers/usb/renesas_usbhs/mod.c +++ b/drivers/usb/renesas_usbhs/mod.c | |||
| @@ -273,9 +273,9 @@ static irqreturn_t usbhs_interrupt(int irq, void *data) | |||
| 273 | usbhs_write(priv, INTSTS0, ~irq_state.intsts0 & INTSTS0_MAGIC); | 273 | usbhs_write(priv, INTSTS0, ~irq_state.intsts0 & INTSTS0_MAGIC); |
| 274 | usbhs_write(priv, INTSTS1, ~irq_state.intsts1 & INTSTS1_MAGIC); | 274 | usbhs_write(priv, INTSTS1, ~irq_state.intsts1 & INTSTS1_MAGIC); |
| 275 | 275 | ||
| 276 | usbhs_write(priv, BRDYSTS, 0); | 276 | usbhs_write(priv, BRDYSTS, ~irq_state.brdysts); |
| 277 | usbhs_write(priv, NRDYSTS, 0); | 277 | usbhs_write(priv, NRDYSTS, ~irq_state.nrdysts); |
| 278 | usbhs_write(priv, BEMPSTS, 0); | 278 | usbhs_write(priv, BEMPSTS, ~irq_state.bempsts); |
| 279 | 279 | ||
| 280 | /* | 280 | /* |
| 281 | * call irq callback functions | 281 | * call irq callback functions |
diff --git a/drivers/usb/renesas_usbhs/pipe.h b/drivers/usb/renesas_usbhs/pipe.h index 08786c06dcf1..3d80c7b1fd1b 100644 --- a/drivers/usb/renesas_usbhs/pipe.h +++ b/drivers/usb/renesas_usbhs/pipe.h | |||
| @@ -54,7 +54,7 @@ struct usbhs_pipe_info { | |||
| 54 | * pipe list | 54 | * pipe list |
| 55 | */ | 55 | */ |
| 56 | #define __usbhs_for_each_pipe(start, pos, info, i) \ | 56 | #define __usbhs_for_each_pipe(start, pos, info, i) \ |
| 57 | for (i = start, pos = (info)->pipe; \ | 57 | for (i = start, pos = (info)->pipe + i; \ |
| 58 | i < (info)->size; \ | 58 | i < (info)->size; \ |
| 59 | i++, pos = (info)->pipe + i) | 59 | i++, pos = (info)->pipe + i) |
| 60 | 60 | ||
diff --git a/drivers/usb/serial/ark3116.c b/drivers/usb/serial/ark3116.c index cf2522c397d3..bd50a8a41a0f 100644 --- a/drivers/usb/serial/ark3116.c +++ b/drivers/usb/serial/ark3116.c | |||
| @@ -125,9 +125,6 @@ static inline int calc_divisor(int bps) | |||
| 125 | 125 | ||
| 126 | static int ark3116_attach(struct usb_serial *serial) | 126 | static int ark3116_attach(struct usb_serial *serial) |
| 127 | { | 127 | { |
| 128 | struct usb_serial_port *port = serial->port[0]; | ||
| 129 | struct ark3116_private *priv; | ||
| 130 | |||
| 131 | /* make sure we have our end-points */ | 128 | /* make sure we have our end-points */ |
| 132 | if ((serial->num_bulk_in == 0) || | 129 | if ((serial->num_bulk_in == 0) || |
| 133 | (serial->num_bulk_out == 0) || | 130 | (serial->num_bulk_out == 0) || |
| @@ -142,8 +139,15 @@ static int ark3116_attach(struct usb_serial *serial) | |||
| 142 | return -EINVAL; | 139 | return -EINVAL; |
| 143 | } | 140 | } |
| 144 | 141 | ||
| 145 | priv = kzalloc(sizeof(struct ark3116_private), | 142 | return 0; |
| 146 | GFP_KERNEL); | 143 | } |
| 144 | |||
| 145 | static int ark3116_port_probe(struct usb_serial_port *port) | ||
| 146 | { | ||
| 147 | struct usb_serial *serial = port->serial; | ||
| 148 | struct ark3116_private *priv; | ||
| 149 | |||
| 150 | priv = kzalloc(sizeof(*priv), GFP_KERNEL); | ||
| 147 | if (!priv) | 151 | if (!priv) |
| 148 | return -ENOMEM; | 152 | return -ENOMEM; |
| 149 | 153 | ||
| @@ -198,18 +202,15 @@ static int ark3116_attach(struct usb_serial *serial) | |||
| 198 | return 0; | 202 | return 0; |
| 199 | } | 203 | } |
| 200 | 204 | ||
| 201 | static void ark3116_release(struct usb_serial *serial) | 205 | static int ark3116_port_remove(struct usb_serial_port *port) |
| 202 | { | 206 | { |
| 203 | struct usb_serial_port *port = serial->port[0]; | ||
| 204 | struct ark3116_private *priv = usb_get_serial_port_data(port); | 207 | struct ark3116_private *priv = usb_get_serial_port_data(port); |
| 205 | 208 | ||
| 206 | /* device is closed, so URBs and DMA should be down */ | 209 | /* device is closed, so URBs and DMA should be down */ |
| 207 | |||
| 208 | usb_set_serial_port_data(port, NULL); | ||
| 209 | |||
| 210 | mutex_destroy(&priv->hw_lock); | 210 | mutex_destroy(&priv->hw_lock); |
| 211 | |||
| 212 | kfree(priv); | 211 | kfree(priv); |
| 212 | |||
| 213 | return 0; | ||
| 213 | } | 214 | } |
| 214 | 215 | ||
| 215 | static void ark3116_init_termios(struct tty_struct *tty) | 216 | static void ark3116_init_termios(struct tty_struct *tty) |
| @@ -723,7 +724,8 @@ static struct usb_serial_driver ark3116_device = { | |||
| 723 | .id_table = id_table, | 724 | .id_table = id_table, |
| 724 | .num_ports = 1, | 725 | .num_ports = 1, |
| 725 | .attach = ark3116_attach, | 726 | .attach = ark3116_attach, |
| 726 | .release = ark3116_release, | 727 | .port_probe = ark3116_port_probe, |
| 728 | .port_remove = ark3116_port_remove, | ||
| 727 | .set_termios = ark3116_set_termios, | 729 | .set_termios = ark3116_set_termios, |
| 728 | .init_termios = ark3116_init_termios, | 730 | .init_termios = ark3116_init_termios, |
| 729 | .ioctl = ark3116_ioctl, | 731 | .ioctl = ark3116_ioctl, |
diff --git a/drivers/usb/serial/belkin_sa.c b/drivers/usb/serial/belkin_sa.c index 99449424193f..ea29556f0d72 100644 --- a/drivers/usb/serial/belkin_sa.c +++ b/drivers/usb/serial/belkin_sa.c | |||
| @@ -45,8 +45,8 @@ | |||
| 45 | #define DRIVER_DESC "USB Belkin Serial converter driver" | 45 | #define DRIVER_DESC "USB Belkin Serial converter driver" |
| 46 | 46 | ||
| 47 | /* function prototypes for a Belkin USB Serial Adapter F5U103 */ | 47 | /* function prototypes for a Belkin USB Serial Adapter F5U103 */ |
| 48 | static int belkin_sa_startup(struct usb_serial *serial); | 48 | static int belkin_sa_port_probe(struct usb_serial_port *port); |
| 49 | static void belkin_sa_release(struct usb_serial *serial); | 49 | static int belkin_sa_port_remove(struct usb_serial_port *port); |
| 50 | static int belkin_sa_open(struct tty_struct *tty, | 50 | static int belkin_sa_open(struct tty_struct *tty, |
| 51 | struct usb_serial_port *port); | 51 | struct usb_serial_port *port); |
| 52 | static void belkin_sa_close(struct usb_serial_port *port); | 52 | static void belkin_sa_close(struct usb_serial_port *port); |
| @@ -88,8 +88,8 @@ static struct usb_serial_driver belkin_device = { | |||
| 88 | .break_ctl = belkin_sa_break_ctl, | 88 | .break_ctl = belkin_sa_break_ctl, |
| 89 | .tiocmget = belkin_sa_tiocmget, | 89 | .tiocmget = belkin_sa_tiocmget, |
| 90 | .tiocmset = belkin_sa_tiocmset, | 90 | .tiocmset = belkin_sa_tiocmset, |
| 91 | .attach = belkin_sa_startup, | 91 | .port_probe = belkin_sa_port_probe, |
| 92 | .release = belkin_sa_release, | 92 | .port_remove = belkin_sa_port_remove, |
| 93 | }; | 93 | }; |
| 94 | 94 | ||
| 95 | static struct usb_serial_driver * const serial_drivers[] = { | 95 | static struct usb_serial_driver * const serial_drivers[] = { |
| @@ -118,17 +118,15 @@ struct belkin_sa_private { | |||
| 118 | (c), BELKIN_SA_SET_REQUEST_TYPE, \ | 118 | (c), BELKIN_SA_SET_REQUEST_TYPE, \ |
| 119 | (v), 0, NULL, 0, WDR_TIMEOUT) | 119 | (v), 0, NULL, 0, WDR_TIMEOUT) |
| 120 | 120 | ||
| 121 | /* do some startup allocations not currently performed by usb_serial_probe() */ | 121 | static int belkin_sa_port_probe(struct usb_serial_port *port) |
| 122 | static int belkin_sa_startup(struct usb_serial *serial) | ||
| 123 | { | 122 | { |
| 124 | struct usb_device *dev = serial->dev; | 123 | struct usb_device *dev = port->serial->dev; |
| 125 | struct belkin_sa_private *priv; | 124 | struct belkin_sa_private *priv; |
| 126 | 125 | ||
| 127 | /* allocate the private data structure */ | ||
| 128 | priv = kmalloc(sizeof(struct belkin_sa_private), GFP_KERNEL); | 126 | priv = kmalloc(sizeof(struct belkin_sa_private), GFP_KERNEL); |
| 129 | if (!priv) | 127 | if (!priv) |
| 130 | return -1; /* error */ | 128 | return -ENOMEM; |
| 131 | /* set initial values for control structures */ | 129 | |
| 132 | spin_lock_init(&priv->lock); | 130 | spin_lock_init(&priv->lock); |
| 133 | priv->control_state = 0; | 131 | priv->control_state = 0; |
| 134 | priv->last_lsr = 0; | 132 | priv->last_lsr = 0; |
| @@ -140,18 +138,19 @@ static int belkin_sa_startup(struct usb_serial *serial) | |||
| 140 | le16_to_cpu(dev->descriptor.bcdDevice), | 138 | le16_to_cpu(dev->descriptor.bcdDevice), |
| 141 | priv->bad_flow_control); | 139 | priv->bad_flow_control); |
| 142 | 140 | ||
| 143 | init_waitqueue_head(&serial->port[0]->write_wait); | 141 | usb_set_serial_port_data(port, priv); |
| 144 | usb_set_serial_port_data(serial->port[0], priv); | ||
| 145 | 142 | ||
| 146 | return 0; | 143 | return 0; |
| 147 | } | 144 | } |
| 148 | 145 | ||
| 149 | static void belkin_sa_release(struct usb_serial *serial) | 146 | static int belkin_sa_port_remove(struct usb_serial_port *port) |
| 150 | { | 147 | { |
| 151 | int i; | 148 | struct belkin_sa_private *priv; |
| 152 | 149 | ||
| 153 | for (i = 0; i < serial->num_ports; ++i) | 150 | priv = usb_get_serial_port_data(port); |
| 154 | kfree(usb_get_serial_port_data(serial->port[i])); | 151 | kfree(priv); |
| 152 | |||
| 153 | return 0; | ||
| 155 | } | 154 | } |
| 156 | 155 | ||
| 157 | static int belkin_sa_open(struct tty_struct *tty, | 156 | static int belkin_sa_open(struct tty_struct *tty, |
diff --git a/drivers/usb/serial/cp210x.c b/drivers/usb/serial/cp210x.c index 28af5acc3360..eb033fc92a15 100644 --- a/drivers/usb/serial/cp210x.c +++ b/drivers/usb/serial/cp210x.c | |||
| @@ -162,7 +162,7 @@ static const struct usb_device_id id_table[] = { | |||
| 162 | 162 | ||
| 163 | MODULE_DEVICE_TABLE(usb, id_table); | 163 | MODULE_DEVICE_TABLE(usb, id_table); |
| 164 | 164 | ||
| 165 | struct cp210x_port_private { | 165 | struct cp210x_serial_private { |
| 166 | __u8 bInterfaceNumber; | 166 | __u8 bInterfaceNumber; |
| 167 | }; | 167 | }; |
| 168 | 168 | ||
| @@ -276,7 +276,7 @@ static int cp210x_get_config(struct usb_serial_port *port, u8 request, | |||
| 276 | unsigned int *data, int size) | 276 | unsigned int *data, int size) |
| 277 | { | 277 | { |
| 278 | struct usb_serial *serial = port->serial; | 278 | struct usb_serial *serial = port->serial; |
| 279 | struct cp210x_port_private *port_priv = usb_get_serial_port_data(port); | 279 | struct cp210x_serial_private *spriv = usb_get_serial_data(serial); |
| 280 | __le32 *buf; | 280 | __le32 *buf; |
| 281 | int result, i, length; | 281 | int result, i, length; |
| 282 | 282 | ||
| @@ -292,7 +292,7 @@ static int cp210x_get_config(struct usb_serial_port *port, u8 request, | |||
| 292 | /* Issue the request, attempting to read 'size' bytes */ | 292 | /* Issue the request, attempting to read 'size' bytes */ |
| 293 | result = usb_control_msg(serial->dev, usb_rcvctrlpipe(serial->dev, 0), | 293 | result = usb_control_msg(serial->dev, usb_rcvctrlpipe(serial->dev, 0), |
| 294 | request, REQTYPE_INTERFACE_TO_HOST, 0x0000, | 294 | request, REQTYPE_INTERFACE_TO_HOST, 0x0000, |
| 295 | port_priv->bInterfaceNumber, buf, size, | 295 | spriv->bInterfaceNumber, buf, size, |
| 296 | USB_CTRL_GET_TIMEOUT); | 296 | USB_CTRL_GET_TIMEOUT); |
| 297 | 297 | ||
| 298 | /* Convert data into an array of integers */ | 298 | /* Convert data into an array of integers */ |
| @@ -323,7 +323,7 @@ static int cp210x_set_config(struct usb_serial_port *port, u8 request, | |||
| 323 | unsigned int *data, int size) | 323 | unsigned int *data, int size) |
| 324 | { | 324 | { |
| 325 | struct usb_serial *serial = port->serial; | 325 | struct usb_serial *serial = port->serial; |
| 326 | struct cp210x_port_private *port_priv = usb_get_serial_port_data(port); | 326 | struct cp210x_serial_private *spriv = usb_get_serial_data(serial); |
| 327 | __le32 *buf; | 327 | __le32 *buf; |
| 328 | int result, i, length; | 328 | int result, i, length; |
| 329 | 329 | ||
| @@ -345,13 +345,13 @@ static int cp210x_set_config(struct usb_serial_port *port, u8 request, | |||
| 345 | result = usb_control_msg(serial->dev, | 345 | result = usb_control_msg(serial->dev, |
| 346 | usb_sndctrlpipe(serial->dev, 0), | 346 | usb_sndctrlpipe(serial->dev, 0), |
| 347 | request, REQTYPE_HOST_TO_INTERFACE, 0x0000, | 347 | request, REQTYPE_HOST_TO_INTERFACE, 0x0000, |
| 348 | port_priv->bInterfaceNumber, buf, size, | 348 | spriv->bInterfaceNumber, buf, size, |
| 349 | USB_CTRL_SET_TIMEOUT); | 349 | USB_CTRL_SET_TIMEOUT); |
| 350 | } else { | 350 | } else { |
| 351 | result = usb_control_msg(serial->dev, | 351 | result = usb_control_msg(serial->dev, |
| 352 | usb_sndctrlpipe(serial->dev, 0), | 352 | usb_sndctrlpipe(serial->dev, 0), |
| 353 | request, REQTYPE_HOST_TO_INTERFACE, data[0], | 353 | request, REQTYPE_HOST_TO_INTERFACE, data[0], |
| 354 | port_priv->bInterfaceNumber, NULL, 0, | 354 | spriv->bInterfaceNumber, NULL, 0, |
| 355 | USB_CTRL_SET_TIMEOUT); | 355 | USB_CTRL_SET_TIMEOUT); |
| 356 | } | 356 | } |
| 357 | 357 | ||
| @@ -845,36 +845,30 @@ static void cp210x_break_ctl (struct tty_struct *tty, int break_state) | |||
| 845 | 845 | ||
| 846 | static int cp210x_startup(struct usb_serial *serial) | 846 | static int cp210x_startup(struct usb_serial *serial) |
| 847 | { | 847 | { |
| 848 | struct cp210x_port_private *port_priv; | 848 | struct usb_host_interface *cur_altsetting; |
| 849 | int i; | 849 | struct cp210x_serial_private *spriv; |
| 850 | 850 | ||
| 851 | /* cp210x buffers behave strangely unless device is reset */ | 851 | /* cp210x buffers behave strangely unless device is reset */ |
| 852 | usb_reset_device(serial->dev); | 852 | usb_reset_device(serial->dev); |
| 853 | 853 | ||
| 854 | for (i = 0; i < serial->num_ports; i++) { | 854 | spriv = kzalloc(sizeof(*spriv), GFP_KERNEL); |
| 855 | port_priv = kzalloc(sizeof(*port_priv), GFP_KERNEL); | 855 | if (!spriv) |
| 856 | if (!port_priv) | 856 | return -ENOMEM; |
| 857 | return -ENOMEM; | ||
| 858 | 857 | ||
| 859 | port_priv->bInterfaceNumber = | 858 | cur_altsetting = serial->interface->cur_altsetting; |
| 860 | serial->interface->cur_altsetting->desc.bInterfaceNumber; | 859 | spriv->bInterfaceNumber = cur_altsetting->desc.bInterfaceNumber; |
| 861 | 860 | ||
| 862 | usb_set_serial_port_data(serial->port[i], port_priv); | 861 | usb_set_serial_data(serial, spriv); |
| 863 | } | ||
| 864 | 862 | ||
| 865 | return 0; | 863 | return 0; |
| 866 | } | 864 | } |
| 867 | 865 | ||
| 868 | static void cp210x_release(struct usb_serial *serial) | 866 | static void cp210x_release(struct usb_serial *serial) |
| 869 | { | 867 | { |
| 870 | struct cp210x_port_private *port_priv; | 868 | struct cp210x_serial_private *spriv; |
| 871 | int i; | ||
| 872 | 869 | ||
| 873 | for (i = 0; i < serial->num_ports; i++) { | 870 | spriv = usb_get_serial_data(serial); |
| 874 | port_priv = usb_get_serial_port_data(serial->port[i]); | 871 | kfree(spriv); |
| 875 | kfree(port_priv); | ||
| 876 | usb_set_serial_port_data(serial->port[i], NULL); | ||
| 877 | } | ||
| 878 | } | 872 | } |
| 879 | 873 | ||
| 880 | module_usb_serial_driver(serial_drivers, id_table); | 874 | module_usb_serial_driver(serial_drivers, id_table); |
diff --git a/drivers/usb/serial/cyberjack.c b/drivers/usb/serial/cyberjack.c index 2a7aecc72237..4ee77dcbe690 100644 --- a/drivers/usb/serial/cyberjack.c +++ b/drivers/usb/serial/cyberjack.c | |||
| @@ -55,9 +55,9 @@ | |||
| 55 | #define CYBERJACK_PRODUCT_ID 0x0100 | 55 | #define CYBERJACK_PRODUCT_ID 0x0100 |
| 56 | 56 | ||
| 57 | /* Function prototypes */ | 57 | /* Function prototypes */ |
| 58 | static int cyberjack_startup(struct usb_serial *serial); | ||
| 59 | static void cyberjack_disconnect(struct usb_serial *serial); | 58 | static void cyberjack_disconnect(struct usb_serial *serial); |
| 60 | static void cyberjack_release(struct usb_serial *serial); | 59 | static int cyberjack_port_probe(struct usb_serial_port *port); |
| 60 | static int cyberjack_port_remove(struct usb_serial_port *port); | ||
| 61 | static int cyberjack_open(struct tty_struct *tty, | 61 | static int cyberjack_open(struct tty_struct *tty, |
| 62 | struct usb_serial_port *port); | 62 | struct usb_serial_port *port); |
| 63 | static void cyberjack_close(struct usb_serial_port *port); | 63 | static void cyberjack_close(struct usb_serial_port *port); |
| @@ -83,9 +83,9 @@ static struct usb_serial_driver cyberjack_device = { | |||
| 83 | .description = "Reiner SCT Cyberjack USB card reader", | 83 | .description = "Reiner SCT Cyberjack USB card reader", |
| 84 | .id_table = id_table, | 84 | .id_table = id_table, |
| 85 | .num_ports = 1, | 85 | .num_ports = 1, |
| 86 | .attach = cyberjack_startup, | ||
| 87 | .disconnect = cyberjack_disconnect, | 86 | .disconnect = cyberjack_disconnect, |
| 88 | .release = cyberjack_release, | 87 | .port_probe = cyberjack_port_probe, |
| 88 | .port_remove = cyberjack_port_remove, | ||
| 89 | .open = cyberjack_open, | 89 | .open = cyberjack_open, |
| 90 | .close = cyberjack_close, | 90 | .close = cyberjack_close, |
| 91 | .write = cyberjack_write, | 91 | .write = cyberjack_write, |
| @@ -107,56 +107,45 @@ struct cyberjack_private { | |||
| 107 | short wrsent; /* Data already sent */ | 107 | short wrsent; /* Data already sent */ |
| 108 | }; | 108 | }; |
| 109 | 109 | ||
| 110 | /* do some startup allocations not currently performed by usb_serial_probe() */ | 110 | static int cyberjack_port_probe(struct usb_serial_port *port) |
| 111 | static int cyberjack_startup(struct usb_serial *serial) | ||
| 112 | { | 111 | { |
| 113 | struct cyberjack_private *priv; | 112 | struct cyberjack_private *priv; |
| 114 | int i; | 113 | int result; |
| 115 | 114 | ||
| 116 | /* allocate the private data structure */ | ||
| 117 | priv = kmalloc(sizeof(struct cyberjack_private), GFP_KERNEL); | 115 | priv = kmalloc(sizeof(struct cyberjack_private), GFP_KERNEL); |
| 118 | if (!priv) | 116 | if (!priv) |
| 119 | return -ENOMEM; | 117 | return -ENOMEM; |
| 120 | 118 | ||
| 121 | /* set initial values */ | ||
| 122 | spin_lock_init(&priv->lock); | 119 | spin_lock_init(&priv->lock); |
| 123 | priv->rdtodo = 0; | 120 | priv->rdtodo = 0; |
| 124 | priv->wrfilled = 0; | 121 | priv->wrfilled = 0; |
| 125 | priv->wrsent = 0; | 122 | priv->wrsent = 0; |
| 126 | usb_set_serial_port_data(serial->port[0], priv); | ||
| 127 | 123 | ||
| 128 | init_waitqueue_head(&serial->port[0]->write_wait); | 124 | usb_set_serial_port_data(port, priv); |
| 129 | 125 | ||
| 130 | for (i = 0; i < serial->num_ports; ++i) { | 126 | result = usb_submit_urb(port->interrupt_in_urb, GFP_KERNEL); |
| 131 | int result; | 127 | if (result) |
| 132 | result = usb_submit_urb(serial->port[i]->interrupt_in_urb, | 128 | dev_err(&port->dev, "usb_submit_urb(read int) failed\n"); |
| 133 | GFP_KERNEL); | ||
| 134 | if (result) | ||
| 135 | dev_err(&serial->dev->dev, | ||
| 136 | "usb_submit_urb(read int) failed\n"); | ||
| 137 | dev_dbg(&serial->dev->dev, "%s - usb_submit_urb(int urb)\n", | ||
| 138 | __func__); | ||
| 139 | } | ||
| 140 | 129 | ||
| 141 | return 0; | 130 | return 0; |
| 142 | } | 131 | } |
| 143 | 132 | ||
| 144 | static void cyberjack_disconnect(struct usb_serial *serial) | 133 | static int cyberjack_port_remove(struct usb_serial_port *port) |
| 145 | { | 134 | { |
| 146 | int i; | 135 | struct cyberjack_private *priv; |
| 147 | 136 | ||
| 148 | for (i = 0; i < serial->num_ports; ++i) | 137 | priv = usb_get_serial_port_data(port); |
| 149 | usb_kill_urb(serial->port[i]->interrupt_in_urb); | 138 | kfree(priv); |
| 139 | |||
| 140 | return 0; | ||
| 150 | } | 141 | } |
| 151 | 142 | ||
| 152 | static void cyberjack_release(struct usb_serial *serial) | 143 | static void cyberjack_disconnect(struct usb_serial *serial) |
| 153 | { | 144 | { |
| 154 | int i; | 145 | int i; |
| 155 | 146 | ||
| 156 | for (i = 0; i < serial->num_ports; ++i) { | 147 | for (i = 0; i < serial->num_ports; ++i) |
| 157 | /* My special items, the standard routines free my urbs */ | 148 | usb_kill_urb(serial->port[i]->interrupt_in_urb); |
| 158 | kfree(usb_get_serial_port_data(serial->port[i])); | ||
| 159 | } | ||
| 160 | } | 149 | } |
| 161 | 150 | ||
| 162 | static int cyberjack_open(struct tty_struct *tty, | 151 | static int cyberjack_open(struct tty_struct *tty, |
diff --git a/drivers/usb/serial/cypress_m8.c b/drivers/usb/serial/cypress_m8.c index 1befce21e173..f0da1279c114 100644 --- a/drivers/usb/serial/cypress_m8.c +++ b/drivers/usb/serial/cypress_m8.c | |||
| @@ -123,10 +123,10 @@ struct cypress_private { | |||
| 123 | }; | 123 | }; |
| 124 | 124 | ||
| 125 | /* function prototypes for the Cypress USB to serial device */ | 125 | /* function prototypes for the Cypress USB to serial device */ |
| 126 | static int cypress_earthmate_startup(struct usb_serial *serial); | 126 | static int cypress_earthmate_port_probe(struct usb_serial_port *port); |
| 127 | static int cypress_hidcom_startup(struct usb_serial *serial); | 127 | static int cypress_hidcom_port_probe(struct usb_serial_port *port); |
| 128 | static int cypress_ca42v2_startup(struct usb_serial *serial); | 128 | static int cypress_ca42v2_port_probe(struct usb_serial_port *port); |
| 129 | static void cypress_release(struct usb_serial *serial); | 129 | static int cypress_port_remove(struct usb_serial_port *port); |
| 130 | static int cypress_open(struct tty_struct *tty, struct usb_serial_port *port); | 130 | static int cypress_open(struct tty_struct *tty, struct usb_serial_port *port); |
| 131 | static void cypress_close(struct usb_serial_port *port); | 131 | static void cypress_close(struct usb_serial_port *port); |
| 132 | static void cypress_dtr_rts(struct usb_serial_port *port, int on); | 132 | static void cypress_dtr_rts(struct usb_serial_port *port, int on); |
| @@ -156,8 +156,8 @@ static struct usb_serial_driver cypress_earthmate_device = { | |||
| 156 | .description = "DeLorme Earthmate USB", | 156 | .description = "DeLorme Earthmate USB", |
| 157 | .id_table = id_table_earthmate, | 157 | .id_table = id_table_earthmate, |
| 158 | .num_ports = 1, | 158 | .num_ports = 1, |
| 159 | .attach = cypress_earthmate_startup, | 159 | .port_probe = cypress_earthmate_port_probe, |
| 160 | .release = cypress_release, | 160 | .port_remove = cypress_port_remove, |
| 161 | .open = cypress_open, | 161 | .open = cypress_open, |
| 162 | .close = cypress_close, | 162 | .close = cypress_close, |
| 163 | .dtr_rts = cypress_dtr_rts, | 163 | .dtr_rts = cypress_dtr_rts, |
| @@ -182,8 +182,8 @@ static struct usb_serial_driver cypress_hidcom_device = { | |||
| 182 | .description = "HID->COM RS232 Adapter", | 182 | .description = "HID->COM RS232 Adapter", |
| 183 | .id_table = id_table_cyphidcomrs232, | 183 | .id_table = id_table_cyphidcomrs232, |
| 184 | .num_ports = 1, | 184 | .num_ports = 1, |
| 185 | .attach = cypress_hidcom_startup, | 185 | .port_probe = cypress_hidcom_port_probe, |
| 186 | .release = cypress_release, | 186 | .port_remove = cypress_port_remove, |
| 187 | .open = cypress_open, | 187 | .open = cypress_open, |
| 188 | .close = cypress_close, | 188 | .close = cypress_close, |
| 189 | .dtr_rts = cypress_dtr_rts, | 189 | .dtr_rts = cypress_dtr_rts, |
| @@ -208,8 +208,8 @@ static struct usb_serial_driver cypress_ca42v2_device = { | |||
| 208 | .description = "Nokia CA-42 V2 Adapter", | 208 | .description = "Nokia CA-42 V2 Adapter", |
| 209 | .id_table = id_table_nokiaca42v2, | 209 | .id_table = id_table_nokiaca42v2, |
| 210 | .num_ports = 1, | 210 | .num_ports = 1, |
| 211 | .attach = cypress_ca42v2_startup, | 211 | .port_probe = cypress_ca42v2_port_probe, |
| 212 | .release = cypress_release, | 212 | .port_remove = cypress_port_remove, |
| 213 | .open = cypress_open, | 213 | .open = cypress_open, |
| 214 | .close = cypress_close, | 214 | .close = cypress_close, |
| 215 | .dtr_rts = cypress_dtr_rts, | 215 | .dtr_rts = cypress_dtr_rts, |
| @@ -438,10 +438,10 @@ static void cypress_set_dead(struct usb_serial_port *port) | |||
| 438 | *****************************************************************************/ | 438 | *****************************************************************************/ |
| 439 | 439 | ||
| 440 | 440 | ||
| 441 | static int generic_startup(struct usb_serial *serial) | 441 | static int cypress_generic_port_probe(struct usb_serial_port *port) |
| 442 | { | 442 | { |
| 443 | struct usb_serial *serial = port->serial; | ||
| 443 | struct cypress_private *priv; | 444 | struct cypress_private *priv; |
| 444 | struct usb_serial_port *port = serial->port[0]; | ||
| 445 | 445 | ||
| 446 | priv = kzalloc(sizeof(struct cypress_private), GFP_KERNEL); | 446 | priv = kzalloc(sizeof(struct cypress_private), GFP_KERNEL); |
| 447 | if (!priv) | 447 | if (!priv) |
| @@ -490,14 +490,16 @@ static int generic_startup(struct usb_serial *serial) | |||
| 490 | } | 490 | } |
| 491 | 491 | ||
| 492 | 492 | ||
| 493 | static int cypress_earthmate_startup(struct usb_serial *serial) | 493 | static int cypress_earthmate_port_probe(struct usb_serial_port *port) |
| 494 | { | 494 | { |
| 495 | struct usb_serial *serial = port->serial; | ||
| 495 | struct cypress_private *priv; | 496 | struct cypress_private *priv; |
| 496 | struct usb_serial_port *port = serial->port[0]; | 497 | int ret; |
| 497 | 498 | ||
| 498 | if (generic_startup(serial)) { | 499 | ret = cypress_generic_port_probe(port); |
| 500 | if (ret) { | ||
| 499 | dev_dbg(&port->dev, "%s - Failed setting up port\n", __func__); | 501 | dev_dbg(&port->dev, "%s - Failed setting up port\n", __func__); |
| 500 | return 1; | 502 | return ret; |
| 501 | } | 503 | } |
| 502 | 504 | ||
| 503 | priv = usb_get_serial_port_data(port); | 505 | priv = usb_get_serial_port_data(port); |
| @@ -518,56 +520,53 @@ static int cypress_earthmate_startup(struct usb_serial *serial) | |||
| 518 | } | 520 | } |
| 519 | 521 | ||
| 520 | return 0; | 522 | return 0; |
| 521 | } /* cypress_earthmate_startup */ | 523 | } |
| 522 | |||
| 523 | 524 | ||
| 524 | static int cypress_hidcom_startup(struct usb_serial *serial) | 525 | static int cypress_hidcom_port_probe(struct usb_serial_port *port) |
| 525 | { | 526 | { |
| 526 | struct cypress_private *priv; | 527 | struct cypress_private *priv; |
| 527 | struct usb_serial_port *port = serial->port[0]; | 528 | int ret; |
| 528 | 529 | ||
| 529 | if (generic_startup(serial)) { | 530 | ret = cypress_generic_port_probe(port); |
| 531 | if (ret) { | ||
| 530 | dev_dbg(&port->dev, "%s - Failed setting up port\n", __func__); | 532 | dev_dbg(&port->dev, "%s - Failed setting up port\n", __func__); |
| 531 | return 1; | 533 | return ret; |
| 532 | } | 534 | } |
| 533 | 535 | ||
| 534 | priv = usb_get_serial_port_data(port); | 536 | priv = usb_get_serial_port_data(port); |
| 535 | priv->chiptype = CT_CYPHIDCOM; | 537 | priv->chiptype = CT_CYPHIDCOM; |
| 536 | 538 | ||
| 537 | return 0; | 539 | return 0; |
| 538 | } /* cypress_hidcom_startup */ | 540 | } |
| 539 | |||
| 540 | 541 | ||
| 541 | static int cypress_ca42v2_startup(struct usb_serial *serial) | 542 | static int cypress_ca42v2_port_probe(struct usb_serial_port *port) |
| 542 | { | 543 | { |
| 543 | struct cypress_private *priv; | 544 | struct cypress_private *priv; |
| 544 | struct usb_serial_port *port = serial->port[0]; | 545 | int ret; |
| 545 | 546 | ||
| 546 | if (generic_startup(serial)) { | 547 | ret = cypress_generic_port_probe(port); |
| 548 | if (ret) { | ||
| 547 | dev_dbg(&port->dev, "%s - Failed setting up port\n", __func__); | 549 | dev_dbg(&port->dev, "%s - Failed setting up port\n", __func__); |
| 548 | return 1; | 550 | return ret; |
| 549 | } | 551 | } |
| 550 | 552 | ||
| 551 | priv = usb_get_serial_port_data(port); | 553 | priv = usb_get_serial_port_data(port); |
| 552 | priv->chiptype = CT_CA42V2; | 554 | priv->chiptype = CT_CA42V2; |
| 553 | 555 | ||
| 554 | return 0; | 556 | return 0; |
| 555 | } /* cypress_ca42v2_startup */ | 557 | } |
| 556 | |||
| 557 | 558 | ||
| 558 | static void cypress_release(struct usb_serial *serial) | 559 | static int cypress_port_remove(struct usb_serial_port *port) |
| 559 | { | 560 | { |
| 560 | struct cypress_private *priv; | 561 | struct cypress_private *priv; |
| 561 | 562 | ||
| 562 | /* all open ports are closed at this point */ | 563 | priv = usb_get_serial_port_data(port); |
| 563 | priv = usb_get_serial_port_data(serial->port[0]); | ||
| 564 | 564 | ||
| 565 | if (priv) { | 565 | kfifo_free(&priv->write_fifo); |
| 566 | kfifo_free(&priv->write_fifo); | 566 | kfree(priv); |
| 567 | kfree(priv); | ||
| 568 | } | ||
| 569 | } | ||
| 570 | 567 | ||
| 568 | return 0; | ||
| 569 | } | ||
| 571 | 570 | ||
| 572 | static int cypress_open(struct tty_struct *tty, struct usb_serial_port *port) | 571 | static int cypress_open(struct tty_struct *tty, struct usb_serial_port *port) |
| 573 | { | 572 | { |
diff --git a/drivers/usb/serial/f81232.c b/drivers/usb/serial/f81232.c index 244477107e2f..6e4eb57d0177 100644 --- a/drivers/usb/serial/f81232.c +++ b/drivers/usb/serial/f81232.c | |||
| @@ -318,39 +318,30 @@ static int f81232_ioctl(struct tty_struct *tty, | |||
| 318 | return -ENOIOCTLCMD; | 318 | return -ENOIOCTLCMD; |
| 319 | } | 319 | } |
| 320 | 320 | ||
| 321 | static int f81232_startup(struct usb_serial *serial) | 321 | static int f81232_port_probe(struct usb_serial_port *port) |
| 322 | { | 322 | { |
| 323 | struct f81232_private *priv; | 323 | struct f81232_private *priv; |
| 324 | int i; | ||
| 325 | 324 | ||
| 326 | for (i = 0; i < serial->num_ports; ++i) { | 325 | priv = kzalloc(sizeof(*priv), GFP_KERNEL); |
| 327 | priv = kzalloc(sizeof(struct f81232_private), GFP_KERNEL); | 326 | if (!priv) |
| 328 | if (!priv) | 327 | return -ENOMEM; |
| 329 | goto cleanup; | ||
| 330 | spin_lock_init(&priv->lock); | ||
| 331 | init_waitqueue_head(&priv->delta_msr_wait); | ||
| 332 | usb_set_serial_port_data(serial->port[i], priv); | ||
| 333 | } | ||
| 334 | return 0; | ||
| 335 | 328 | ||
| 336 | cleanup: | 329 | spin_lock_init(&priv->lock); |
| 337 | for (--i; i >= 0; --i) { | 330 | init_waitqueue_head(&priv->delta_msr_wait); |
| 338 | priv = usb_get_serial_port_data(serial->port[i]); | 331 | |
| 339 | kfree(priv); | 332 | usb_set_serial_port_data(port, priv); |
| 340 | usb_set_serial_port_data(serial->port[i], NULL); | 333 | |
| 341 | } | 334 | return 0; |
| 342 | return -ENOMEM; | ||
| 343 | } | 335 | } |
| 344 | 336 | ||
| 345 | static void f81232_release(struct usb_serial *serial) | 337 | static int f81232_port_remove(struct usb_serial_port *port) |
| 346 | { | 338 | { |
| 347 | int i; | ||
| 348 | struct f81232_private *priv; | 339 | struct f81232_private *priv; |
| 349 | 340 | ||
| 350 | for (i = 0; i < serial->num_ports; ++i) { | 341 | priv = usb_get_serial_port_data(port); |
| 351 | priv = usb_get_serial_port_data(serial->port[i]); | 342 | kfree(priv); |
| 352 | kfree(priv); | 343 | |
| 353 | } | 344 | return 0; |
| 354 | } | 345 | } |
| 355 | 346 | ||
| 356 | static struct usb_serial_driver f81232_device = { | 347 | static struct usb_serial_driver f81232_device = { |
| @@ -373,8 +364,8 @@ static struct usb_serial_driver f81232_device = { | |||
| 373 | .tiocmset = f81232_tiocmset, | 364 | .tiocmset = f81232_tiocmset, |
| 374 | .process_read_urb = f81232_process_read_urb, | 365 | .process_read_urb = f81232_process_read_urb, |
| 375 | .read_int_callback = f81232_read_int_callback, | 366 | .read_int_callback = f81232_read_int_callback, |
| 376 | .attach = f81232_startup, | 367 | .port_probe = f81232_port_probe, |
| 377 | .release = f81232_release, | 368 | .port_remove = f81232_port_remove, |
| 378 | }; | 369 | }; |
| 379 | 370 | ||
| 380 | static struct usb_serial_driver * const serial_drivers[] = { | 371 | static struct usb_serial_driver * const serial_drivers[] = { |
diff --git a/drivers/usb/serial/garmin_gps.c b/drivers/usb/serial/garmin_gps.c index 3ee92648c02d..203358d7e7bc 100644 --- a/drivers/usb/serial/garmin_gps.c +++ b/drivers/usb/serial/garmin_gps.c | |||
| @@ -1405,11 +1405,10 @@ static void timeout_handler(unsigned long data) | |||
| 1405 | 1405 | ||
| 1406 | 1406 | ||
| 1407 | 1407 | ||
| 1408 | static int garmin_attach(struct usb_serial *serial) | 1408 | static int garmin_port_probe(struct usb_serial_port *port) |
| 1409 | { | 1409 | { |
| 1410 | int status = 0; | 1410 | int status; |
| 1411 | struct usb_serial_port *port = serial->port[0]; | 1411 | struct garmin_data *garmin_data_p; |
| 1412 | struct garmin_data *garmin_data_p = NULL; | ||
| 1413 | 1412 | ||
| 1414 | garmin_data_p = kzalloc(sizeof(struct garmin_data), GFP_KERNEL); | 1413 | garmin_data_p = kzalloc(sizeof(struct garmin_data), GFP_KERNEL); |
| 1415 | if (garmin_data_p == NULL) { | 1414 | if (garmin_data_p == NULL) { |
| @@ -1434,22 +1433,14 @@ static int garmin_attach(struct usb_serial *serial) | |||
| 1434 | } | 1433 | } |
| 1435 | 1434 | ||
| 1436 | 1435 | ||
| 1437 | static void garmin_disconnect(struct usb_serial *serial) | 1436 | static int garmin_port_remove(struct usb_serial_port *port) |
| 1438 | { | 1437 | { |
| 1439 | struct usb_serial_port *port = serial->port[0]; | ||
| 1440 | struct garmin_data *garmin_data_p = usb_get_serial_port_data(port); | 1438 | struct garmin_data *garmin_data_p = usb_get_serial_port_data(port); |
| 1441 | 1439 | ||
| 1442 | usb_kill_urb(port->interrupt_in_urb); | 1440 | usb_kill_urb(port->interrupt_in_urb); |
| 1443 | del_timer_sync(&garmin_data_p->timer); | 1441 | del_timer_sync(&garmin_data_p->timer); |
| 1444 | } | ||
| 1445 | |||
| 1446 | |||
| 1447 | static void garmin_release(struct usb_serial *serial) | ||
| 1448 | { | ||
| 1449 | struct usb_serial_port *port = serial->port[0]; | ||
| 1450 | struct garmin_data *garmin_data_p = usb_get_serial_port_data(port); | ||
| 1451 | |||
| 1452 | kfree(garmin_data_p); | 1442 | kfree(garmin_data_p); |
| 1443 | return 0; | ||
| 1453 | } | 1444 | } |
| 1454 | 1445 | ||
| 1455 | 1446 | ||
| @@ -1466,9 +1457,8 @@ static struct usb_serial_driver garmin_device = { | |||
| 1466 | .close = garmin_close, | 1457 | .close = garmin_close, |
| 1467 | .throttle = garmin_throttle, | 1458 | .throttle = garmin_throttle, |
| 1468 | .unthrottle = garmin_unthrottle, | 1459 | .unthrottle = garmin_unthrottle, |
| 1469 | .attach = garmin_attach, | 1460 | .port_probe = garmin_port_probe, |
| 1470 | .disconnect = garmin_disconnect, | 1461 | .port_remove = garmin_port_remove, |
| 1471 | .release = garmin_release, | ||
| 1472 | .write = garmin_write, | 1462 | .write = garmin_write, |
| 1473 | .write_room = garmin_write_room, | 1463 | .write_room = garmin_write_room, |
| 1474 | .write_bulk_callback = garmin_write_bulk_callback, | 1464 | .write_bulk_callback = garmin_write_bulk_callback, |
diff --git a/drivers/usb/serial/io_edgeport.c b/drivers/usb/serial/io_edgeport.c index 8e6faaf3580c..5acc0d13864a 100644 --- a/drivers/usb/serial/io_edgeport.c +++ b/drivers/usb/serial/io_edgeport.c | |||
| @@ -225,6 +225,8 @@ static int edge_get_icount(struct tty_struct *tty, | |||
| 225 | static int edge_startup(struct usb_serial *serial); | 225 | static int edge_startup(struct usb_serial *serial); |
| 226 | static void edge_disconnect(struct usb_serial *serial); | 226 | static void edge_disconnect(struct usb_serial *serial); |
| 227 | static void edge_release(struct usb_serial *serial); | 227 | static void edge_release(struct usb_serial *serial); |
| 228 | static int edge_port_probe(struct usb_serial_port *port); | ||
| 229 | static int edge_port_remove(struct usb_serial_port *port); | ||
| 228 | 230 | ||
| 229 | #include "io_tables.h" /* all of the devices that this driver supports */ | 231 | #include "io_tables.h" /* all of the devices that this driver supports */ |
| 230 | 232 | ||
| @@ -2875,10 +2877,9 @@ static void load_application_firmware(struct edgeport_serial *edge_serial) | |||
| 2875 | static int edge_startup(struct usb_serial *serial) | 2877 | static int edge_startup(struct usb_serial *serial) |
| 2876 | { | 2878 | { |
| 2877 | struct edgeport_serial *edge_serial; | 2879 | struct edgeport_serial *edge_serial; |
| 2878 | struct edgeport_port *edge_port; | ||
| 2879 | struct usb_device *dev; | 2880 | struct usb_device *dev; |
| 2880 | struct device *ddev = &serial->dev->dev; | 2881 | struct device *ddev = &serial->dev->dev; |
| 2881 | int i, j; | 2882 | int i; |
| 2882 | int response; | 2883 | int response; |
| 2883 | bool interrupt_in_found; | 2884 | bool interrupt_in_found; |
| 2884 | bool bulk_in_found; | 2885 | bool bulk_in_found; |
| @@ -2961,25 +2962,6 @@ static int edge_startup(struct usb_serial *serial) | |||
| 2961 | /* we set up the pointers to the endpoints in the edge_open function, | 2962 | /* we set up the pointers to the endpoints in the edge_open function, |
| 2962 | * as the structures aren't created yet. */ | 2963 | * as the structures aren't created yet. */ |
| 2963 | 2964 | ||
| 2964 | /* set up our port private structures */ | ||
| 2965 | for (i = 0; i < serial->num_ports; ++i) { | ||
| 2966 | edge_port = kzalloc(sizeof(struct edgeport_port), GFP_KERNEL); | ||
| 2967 | if (edge_port == NULL) { | ||
| 2968 | dev_err(ddev, "%s - Out of memory\n", __func__); | ||
| 2969 | for (j = 0; j < i; ++j) { | ||
| 2970 | kfree(usb_get_serial_port_data(serial->port[j])); | ||
| 2971 | usb_set_serial_port_data(serial->port[j], | ||
| 2972 | NULL); | ||
| 2973 | } | ||
| 2974 | usb_set_serial_data(serial, NULL); | ||
| 2975 | kfree(edge_serial); | ||
| 2976 | return -ENOMEM; | ||
| 2977 | } | ||
| 2978 | spin_lock_init(&edge_port->ep_lock); | ||
| 2979 | edge_port->port = serial->port[i]; | ||
| 2980 | usb_set_serial_port_data(serial->port[i], edge_port); | ||
| 2981 | } | ||
| 2982 | |||
| 2983 | response = 0; | 2965 | response = 0; |
| 2984 | 2966 | ||
| 2985 | if (edge_serial->is_epic) { | 2967 | if (edge_serial->is_epic) { |
| @@ -3120,14 +3102,36 @@ static void edge_disconnect(struct usb_serial *serial) | |||
| 3120 | static void edge_release(struct usb_serial *serial) | 3102 | static void edge_release(struct usb_serial *serial) |
| 3121 | { | 3103 | { |
| 3122 | struct edgeport_serial *edge_serial = usb_get_serial_data(serial); | 3104 | struct edgeport_serial *edge_serial = usb_get_serial_data(serial); |
| 3123 | int i; | ||
| 3124 | |||
| 3125 | for (i = 0; i < serial->num_ports; ++i) | ||
| 3126 | kfree(usb_get_serial_port_data(serial->port[i])); | ||
| 3127 | 3105 | ||
| 3128 | kfree(edge_serial); | 3106 | kfree(edge_serial); |
| 3129 | } | 3107 | } |
| 3130 | 3108 | ||
| 3109 | static int edge_port_probe(struct usb_serial_port *port) | ||
| 3110 | { | ||
| 3111 | struct edgeport_port *edge_port; | ||
| 3112 | |||
| 3113 | edge_port = kzalloc(sizeof(*edge_port), GFP_KERNEL); | ||
| 3114 | if (!edge_port) | ||
| 3115 | return -ENOMEM; | ||
| 3116 | |||
| 3117 | spin_lock_init(&edge_port->ep_lock); | ||
| 3118 | edge_port->port = port; | ||
| 3119 | |||
| 3120 | usb_set_serial_port_data(port, edge_port); | ||
| 3121 | |||
| 3122 | return 0; | ||
| 3123 | } | ||
| 3124 | |||
| 3125 | static int edge_port_remove(struct usb_serial_port *port) | ||
| 3126 | { | ||
| 3127 | struct edgeport_port *edge_port; | ||
| 3128 | |||
| 3129 | edge_port = usb_get_serial_port_data(port); | ||
| 3130 | kfree(edge_port); | ||
| 3131 | |||
| 3132 | return 0; | ||
| 3133 | } | ||
| 3134 | |||
| 3131 | module_usb_serial_driver(serial_drivers, id_table_combined); | 3135 | module_usb_serial_driver(serial_drivers, id_table_combined); |
| 3132 | 3136 | ||
| 3133 | MODULE_AUTHOR(DRIVER_AUTHOR); | 3137 | MODULE_AUTHOR(DRIVER_AUTHOR); |
diff --git a/drivers/usb/serial/io_tables.h b/drivers/usb/serial/io_tables.h index 350afddb55ba..1511dd0ad324 100644 --- a/drivers/usb/serial/io_tables.h +++ b/drivers/usb/serial/io_tables.h | |||
| @@ -110,6 +110,8 @@ static struct usb_serial_driver edgeport_2port_device = { | |||
| 110 | .attach = edge_startup, | 110 | .attach = edge_startup, |
| 111 | .disconnect = edge_disconnect, | 111 | .disconnect = edge_disconnect, |
| 112 | .release = edge_release, | 112 | .release = edge_release, |
| 113 | .port_probe = edge_port_probe, | ||
| 114 | .port_remove = edge_port_remove, | ||
| 113 | .ioctl = edge_ioctl, | 115 | .ioctl = edge_ioctl, |
| 114 | .set_termios = edge_set_termios, | 116 | .set_termios = edge_set_termios, |
| 115 | .tiocmget = edge_tiocmget, | 117 | .tiocmget = edge_tiocmget, |
| @@ -139,6 +141,8 @@ static struct usb_serial_driver edgeport_4port_device = { | |||
| 139 | .attach = edge_startup, | 141 | .attach = edge_startup, |
| 140 | .disconnect = edge_disconnect, | 142 | .disconnect = edge_disconnect, |
| 141 | .release = edge_release, | 143 | .release = edge_release, |
| 144 | .port_probe = edge_port_probe, | ||
| 145 | .port_remove = edge_port_remove, | ||
| 142 | .ioctl = edge_ioctl, | 146 | .ioctl = edge_ioctl, |
| 143 | .set_termios = edge_set_termios, | 147 | .set_termios = edge_set_termios, |
| 144 | .tiocmget = edge_tiocmget, | 148 | .tiocmget = edge_tiocmget, |
| @@ -168,6 +172,8 @@ static struct usb_serial_driver edgeport_8port_device = { | |||
| 168 | .attach = edge_startup, | 172 | .attach = edge_startup, |
| 169 | .disconnect = edge_disconnect, | 173 | .disconnect = edge_disconnect, |
| 170 | .release = edge_release, | 174 | .release = edge_release, |
| 175 | .port_probe = edge_port_probe, | ||
| 176 | .port_remove = edge_port_remove, | ||
| 171 | .ioctl = edge_ioctl, | 177 | .ioctl = edge_ioctl, |
| 172 | .set_termios = edge_set_termios, | 178 | .set_termios = edge_set_termios, |
| 173 | .tiocmget = edge_tiocmget, | 179 | .tiocmget = edge_tiocmget, |
| @@ -197,6 +203,8 @@ static struct usb_serial_driver epic_device = { | |||
| 197 | .attach = edge_startup, | 203 | .attach = edge_startup, |
| 198 | .disconnect = edge_disconnect, | 204 | .disconnect = edge_disconnect, |
| 199 | .release = edge_release, | 205 | .release = edge_release, |
| 206 | .port_probe = edge_port_probe, | ||
| 207 | .port_remove = edge_port_remove, | ||
| 200 | .ioctl = edge_ioctl, | 208 | .ioctl = edge_ioctl, |
| 201 | .set_termios = edge_set_termios, | 209 | .set_termios = edge_set_termios, |
| 202 | .tiocmget = edge_tiocmget, | 210 | .tiocmget = edge_tiocmget, |
diff --git a/drivers/usb/serial/io_ti.c b/drivers/usb/serial/io_ti.c index a2209cd45093..60023c2d2a31 100644 --- a/drivers/usb/serial/io_ti.c +++ b/drivers/usb/serial/io_ti.c | |||
| @@ -2532,12 +2532,7 @@ static void edge_break(struct tty_struct *tty, int break_state) | |||
| 2532 | static int edge_startup(struct usb_serial *serial) | 2532 | static int edge_startup(struct usb_serial *serial) |
| 2533 | { | 2533 | { |
| 2534 | struct edgeport_serial *edge_serial; | 2534 | struct edgeport_serial *edge_serial; |
| 2535 | struct edgeport_port *edge_port; | ||
| 2536 | struct usb_device *dev; | ||
| 2537 | int status; | 2535 | int status; |
| 2538 | int i; | ||
| 2539 | |||
| 2540 | dev = serial->dev; | ||
| 2541 | 2536 | ||
| 2542 | /* create our private serial structure */ | 2537 | /* create our private serial structure */ |
| 2543 | edge_serial = kzalloc(sizeof(struct edgeport_serial), GFP_KERNEL); | 2538 | edge_serial = kzalloc(sizeof(struct edgeport_serial), GFP_KERNEL); |
| @@ -2555,40 +2550,7 @@ static int edge_startup(struct usb_serial *serial) | |||
| 2555 | return status; | 2550 | return status; |
| 2556 | } | 2551 | } |
| 2557 | 2552 | ||
| 2558 | /* set up our port private structures */ | ||
| 2559 | for (i = 0; i < serial->num_ports; ++i) { | ||
| 2560 | edge_port = kzalloc(sizeof(struct edgeport_port), GFP_KERNEL); | ||
| 2561 | if (edge_port == NULL) { | ||
| 2562 | dev_err(&serial->dev->dev, "%s - Out of memory\n", | ||
| 2563 | __func__); | ||
| 2564 | goto cleanup; | ||
| 2565 | } | ||
| 2566 | spin_lock_init(&edge_port->ep_lock); | ||
| 2567 | if (kfifo_alloc(&edge_port->write_fifo, EDGE_OUT_BUF_SIZE, | ||
| 2568 | GFP_KERNEL)) { | ||
| 2569 | dev_err(&serial->dev->dev, "%s - Out of memory\n", | ||
| 2570 | __func__); | ||
| 2571 | kfree(edge_port); | ||
| 2572 | goto cleanup; | ||
| 2573 | } | ||
| 2574 | edge_port->port = serial->port[i]; | ||
| 2575 | edge_port->edge_serial = edge_serial; | ||
| 2576 | usb_set_serial_port_data(serial->port[i], edge_port); | ||
| 2577 | edge_port->bUartMode = default_uart_mode; | ||
| 2578 | } | ||
| 2579 | |||
| 2580 | return 0; | 2553 | return 0; |
| 2581 | |||
| 2582 | cleanup: | ||
| 2583 | for (--i; i >= 0; --i) { | ||
| 2584 | edge_port = usb_get_serial_port_data(serial->port[i]); | ||
| 2585 | kfifo_free(&edge_port->write_fifo); | ||
| 2586 | kfree(edge_port); | ||
| 2587 | usb_set_serial_port_data(serial->port[i], NULL); | ||
| 2588 | } | ||
| 2589 | kfree(edge_serial); | ||
| 2590 | usb_set_serial_data(serial, NULL); | ||
| 2591 | return -ENOMEM; | ||
| 2592 | } | 2554 | } |
| 2593 | 2555 | ||
| 2594 | static void edge_disconnect(struct usb_serial *serial) | 2556 | static void edge_disconnect(struct usb_serial *serial) |
| @@ -2597,17 +2559,54 @@ static void edge_disconnect(struct usb_serial *serial) | |||
| 2597 | 2559 | ||
| 2598 | static void edge_release(struct usb_serial *serial) | 2560 | static void edge_release(struct usb_serial *serial) |
| 2599 | { | 2561 | { |
| 2600 | int i; | 2562 | kfree(usb_get_serial_data(serial)); |
| 2563 | } | ||
| 2564 | |||
| 2565 | static int edge_port_probe(struct usb_serial_port *port) | ||
| 2566 | { | ||
| 2601 | struct edgeport_port *edge_port; | 2567 | struct edgeport_port *edge_port; |
| 2568 | int ret; | ||
| 2602 | 2569 | ||
| 2603 | for (i = 0; i < serial->num_ports; ++i) { | 2570 | edge_port = kzalloc(sizeof(*edge_port), GFP_KERNEL); |
| 2604 | edge_port = usb_get_serial_port_data(serial->port[i]); | 2571 | if (!edge_port) |
| 2572 | return -ENOMEM; | ||
| 2573 | |||
| 2574 | ret = kfifo_alloc(&edge_port->write_fifo, EDGE_OUT_BUF_SIZE, | ||
| 2575 | GFP_KERNEL); | ||
| 2576 | if (ret) { | ||
| 2577 | kfree(edge_port); | ||
| 2578 | return -ENOMEM; | ||
| 2579 | } | ||
| 2580 | |||
| 2581 | spin_lock_init(&edge_port->ep_lock); | ||
| 2582 | edge_port->port = port; | ||
| 2583 | edge_port->edge_serial = usb_get_serial_data(port->serial); | ||
| 2584 | edge_port->bUartMode = default_uart_mode; | ||
| 2585 | |||
| 2586 | usb_set_serial_port_data(port, edge_port); | ||
| 2587 | |||
| 2588 | ret = edge_create_sysfs_attrs(port); | ||
| 2589 | if (ret) { | ||
| 2605 | kfifo_free(&edge_port->write_fifo); | 2590 | kfifo_free(&edge_port->write_fifo); |
| 2606 | kfree(edge_port); | 2591 | kfree(edge_port); |
| 2592 | return ret; | ||
| 2607 | } | 2593 | } |
| 2608 | kfree(usb_get_serial_data(serial)); | 2594 | |
| 2595 | return 0; | ||
| 2609 | } | 2596 | } |
| 2610 | 2597 | ||
| 2598 | static int edge_port_remove(struct usb_serial_port *port) | ||
| 2599 | { | ||
| 2600 | struct edgeport_port *edge_port; | ||
| 2601 | |||
| 2602 | edge_port = usb_get_serial_port_data(port); | ||
| 2603 | |||
| 2604 | edge_remove_sysfs_attrs(port); | ||
| 2605 | kfifo_free(&edge_port->write_fifo); | ||
| 2606 | kfree(edge_port); | ||
| 2607 | |||
| 2608 | return 0; | ||
| 2609 | } | ||
| 2611 | 2610 | ||
| 2612 | /* Sysfs Attributes */ | 2611 | /* Sysfs Attributes */ |
| 2613 | 2612 | ||
| @@ -2667,8 +2666,8 @@ static struct usb_serial_driver edgeport_1port_device = { | |||
| 2667 | .attach = edge_startup, | 2666 | .attach = edge_startup, |
| 2668 | .disconnect = edge_disconnect, | 2667 | .disconnect = edge_disconnect, |
| 2669 | .release = edge_release, | 2668 | .release = edge_release, |
| 2670 | .port_probe = edge_create_sysfs_attrs, | 2669 | .port_probe = edge_port_probe, |
| 2671 | .port_remove = edge_remove_sysfs_attrs, | 2670 | .port_remove = edge_port_remove, |
| 2672 | .ioctl = edge_ioctl, | 2671 | .ioctl = edge_ioctl, |
| 2673 | .set_termios = edge_set_termios, | 2672 | .set_termios = edge_set_termios, |
| 2674 | .tiocmget = edge_tiocmget, | 2673 | .tiocmget = edge_tiocmget, |
| @@ -2698,8 +2697,8 @@ static struct usb_serial_driver edgeport_2port_device = { | |||
| 2698 | .attach = edge_startup, | 2697 | .attach = edge_startup, |
| 2699 | .disconnect = edge_disconnect, | 2698 | .disconnect = edge_disconnect, |
| 2700 | .release = edge_release, | 2699 | .release = edge_release, |
| 2701 | .port_probe = edge_create_sysfs_attrs, | 2700 | .port_probe = edge_port_probe, |
| 2702 | .port_remove = edge_remove_sysfs_attrs, | 2701 | .port_remove = edge_port_remove, |
| 2703 | .ioctl = edge_ioctl, | 2702 | .ioctl = edge_ioctl, |
| 2704 | .set_termios = edge_set_termios, | 2703 | .set_termios = edge_set_termios, |
| 2705 | .tiocmget = edge_tiocmget, | 2704 | .tiocmget = edge_tiocmget, |
diff --git a/drivers/usb/serial/iuu_phoenix.c b/drivers/usb/serial/iuu_phoenix.c index 01da3ea36e89..cd5533e81de7 100644 --- a/drivers/usb/serial/iuu_phoenix.c +++ b/drivers/usb/serial/iuu_phoenix.c | |||
| @@ -53,6 +53,8 @@ static int iuu_cardout; | |||
| 53 | static bool xmas; | 53 | static bool xmas; |
| 54 | static int vcc_default = 5; | 54 | static int vcc_default = 5; |
| 55 | 55 | ||
| 56 | static int iuu_create_sysfs_attrs(struct usb_serial_port *port); | ||
| 57 | static int iuu_remove_sysfs_attrs(struct usb_serial_port *port); | ||
| 56 | static void read_rxcmd_callback(struct urb *urb); | 58 | static void read_rxcmd_callback(struct urb *urb); |
| 57 | 59 | ||
| 58 | struct iuu_private { | 60 | struct iuu_private { |
| @@ -72,63 +74,55 @@ struct iuu_private { | |||
| 72 | u32 clk; | 74 | u32 clk; |
| 73 | }; | 75 | }; |
| 74 | 76 | ||
| 75 | 77 | static int iuu_port_probe(struct usb_serial_port *port) | |
| 76 | static void iuu_free_buf(struct iuu_private *priv) | ||
| 77 | { | ||
| 78 | kfree(priv->buf); | ||
| 79 | kfree(priv->writebuf); | ||
| 80 | } | ||
| 81 | |||
| 82 | static int iuu_alloc_buf(struct usb_serial *serial, struct iuu_private *priv) | ||
| 83 | { | ||
| 84 | priv->buf = kzalloc(256, GFP_KERNEL); | ||
| 85 | priv->writebuf = kzalloc(256, GFP_KERNEL); | ||
| 86 | if (!priv->buf || !priv->writebuf) { | ||
| 87 | iuu_free_buf(priv); | ||
| 88 | dev_dbg(&serial->dev->dev, "%s problem allocation buffer\n", __func__); | ||
| 89 | return -ENOMEM; | ||
| 90 | } | ||
| 91 | dev_dbg(&serial->dev->dev, "%s - Privates buffers allocation success\n", __func__); | ||
| 92 | return 0; | ||
| 93 | } | ||
| 94 | |||
| 95 | static int iuu_startup(struct usb_serial *serial) | ||
| 96 | { | 78 | { |
| 97 | struct iuu_private *priv; | 79 | struct iuu_private *priv; |
| 80 | int ret; | ||
| 98 | 81 | ||
| 99 | priv = kzalloc(sizeof(struct iuu_private), GFP_KERNEL); | 82 | priv = kzalloc(sizeof(struct iuu_private), GFP_KERNEL); |
| 100 | dev_dbg(&serial->dev->dev, "%s- priv allocation success\n", __func__); | ||
| 101 | if (!priv) | 83 | if (!priv) |
| 102 | return -ENOMEM; | 84 | return -ENOMEM; |
| 103 | if (iuu_alloc_buf(serial, priv)) { | 85 | |
| 86 | priv->buf = kzalloc(256, GFP_KERNEL); | ||
| 87 | if (!priv->buf) { | ||
| 88 | kfree(priv); | ||
| 89 | return -ENOMEM; | ||
| 90 | } | ||
| 91 | |||
| 92 | priv->writebuf = kzalloc(256, GFP_KERNEL); | ||
| 93 | if (!priv->writebuf) { | ||
| 94 | kfree(priv->buf); | ||
| 104 | kfree(priv); | 95 | kfree(priv); |
| 105 | return -ENOMEM; | 96 | return -ENOMEM; |
| 106 | } | 97 | } |
| 98 | |||
| 107 | priv->vcc = vcc_default; | 99 | priv->vcc = vcc_default; |
| 108 | spin_lock_init(&priv->lock); | 100 | spin_lock_init(&priv->lock); |
| 109 | init_waitqueue_head(&priv->delta_msr_wait); | 101 | init_waitqueue_head(&priv->delta_msr_wait); |
| 110 | usb_set_serial_port_data(serial->port[0], priv); | 102 | |
| 103 | usb_set_serial_port_data(port, priv); | ||
| 104 | |||
| 105 | ret = iuu_create_sysfs_attrs(port); | ||
| 106 | if (ret) { | ||
| 107 | kfree(priv->writebuf); | ||
| 108 | kfree(priv->buf); | ||
| 109 | kfree(priv); | ||
| 110 | return ret; | ||
| 111 | } | ||
| 112 | |||
| 111 | return 0; | 113 | return 0; |
| 112 | } | 114 | } |
| 113 | 115 | ||
| 114 | /* Release function */ | 116 | static int iuu_port_remove(struct usb_serial_port *port) |
| 115 | static void iuu_release(struct usb_serial *serial) | ||
| 116 | { | 117 | { |
| 117 | struct usb_serial_port *port = serial->port[0]; | ||
| 118 | struct iuu_private *priv = usb_get_serial_port_data(port); | 118 | struct iuu_private *priv = usb_get_serial_port_data(port); |
| 119 | if (!port) | ||
| 120 | return; | ||
| 121 | 119 | ||
| 122 | if (priv) { | 120 | iuu_remove_sysfs_attrs(port); |
| 123 | iuu_free_buf(priv); | 121 | kfree(priv->writebuf); |
| 124 | dev_dbg(&port->dev, "%s - I will free all\n", __func__); | 122 | kfree(priv->buf); |
| 125 | usb_set_serial_port_data(port, NULL); | 123 | kfree(priv); |
| 126 | |||
| 127 | dev_dbg(&port->dev, "%s - priv is not anymore in port structure\n", __func__); | ||
| 128 | kfree(priv); | ||
| 129 | 124 | ||
| 130 | dev_dbg(&port->dev, "%s priv is now kfree\n", __func__); | 125 | return 0; |
| 131 | } | ||
| 132 | } | 126 | } |
| 133 | 127 | ||
| 134 | static int iuu_tiocmset(struct tty_struct *tty, | 128 | static int iuu_tiocmset(struct tty_struct *tty, |
| @@ -1215,8 +1209,6 @@ static struct usb_serial_driver iuu_device = { | |||
| 1215 | .num_ports = 1, | 1209 | .num_ports = 1, |
| 1216 | .bulk_in_size = 512, | 1210 | .bulk_in_size = 512, |
| 1217 | .bulk_out_size = 512, | 1211 | .bulk_out_size = 512, |
| 1218 | .port_probe = iuu_create_sysfs_attrs, | ||
| 1219 | .port_remove = iuu_remove_sysfs_attrs, | ||
| 1220 | .open = iuu_open, | 1212 | .open = iuu_open, |
| 1221 | .close = iuu_close, | 1213 | .close = iuu_close, |
| 1222 | .write = iuu_uart_write, | 1214 | .write = iuu_uart_write, |
| @@ -1225,8 +1217,8 @@ static struct usb_serial_driver iuu_device = { | |||
| 1225 | .tiocmset = iuu_tiocmset, | 1217 | .tiocmset = iuu_tiocmset, |
| 1226 | .set_termios = iuu_set_termios, | 1218 | .set_termios = iuu_set_termios, |
| 1227 | .init_termios = iuu_init_termios, | 1219 | .init_termios = iuu_init_termios, |
| 1228 | .attach = iuu_startup, | 1220 | .port_probe = iuu_port_probe, |
| 1229 | .release = iuu_release, | 1221 | .port_remove = iuu_port_remove, |
| 1230 | }; | 1222 | }; |
| 1231 | 1223 | ||
| 1232 | static struct usb_serial_driver * const serial_drivers[] = { | 1224 | static struct usb_serial_driver * const serial_drivers[] = { |
diff --git a/drivers/usb/serial/keyspan_pda.c b/drivers/usb/serial/keyspan_pda.c index ca43ecb4a2bd..bb87e29c4ac2 100644 --- a/drivers/usb/serial/keyspan_pda.c +++ b/drivers/usb/serial/keyspan_pda.c | |||
| @@ -713,29 +713,33 @@ MODULE_FIRMWARE("keyspan_pda/keyspan_pda.fw"); | |||
| 713 | MODULE_FIRMWARE("keyspan_pda/xircom_pgs.fw"); | 713 | MODULE_FIRMWARE("keyspan_pda/xircom_pgs.fw"); |
| 714 | #endif | 714 | #endif |
| 715 | 715 | ||
| 716 | static int keyspan_pda_startup(struct usb_serial *serial) | 716 | static int keyspan_pda_port_probe(struct usb_serial_port *port) |
| 717 | { | 717 | { |
| 718 | 718 | ||
| 719 | struct keyspan_pda_private *priv; | 719 | struct keyspan_pda_private *priv; |
| 720 | 720 | ||
| 721 | /* allocate the private data structures for all ports. Well, for all | ||
| 722 | one ports. */ | ||
| 723 | |||
| 724 | priv = kmalloc(sizeof(struct keyspan_pda_private), GFP_KERNEL); | 721 | priv = kmalloc(sizeof(struct keyspan_pda_private), GFP_KERNEL); |
| 725 | if (!priv) | 722 | if (!priv) |
| 726 | return 1; /* error */ | 723 | return -ENOMEM; |
| 727 | usb_set_serial_port_data(serial->port[0], priv); | 724 | |
| 728 | init_waitqueue_head(&serial->port[0]->write_wait); | ||
| 729 | INIT_WORK(&priv->wakeup_work, keyspan_pda_wakeup_write); | 725 | INIT_WORK(&priv->wakeup_work, keyspan_pda_wakeup_write); |
| 730 | INIT_WORK(&priv->unthrottle_work, keyspan_pda_request_unthrottle); | 726 | INIT_WORK(&priv->unthrottle_work, keyspan_pda_request_unthrottle); |
| 731 | priv->serial = serial; | 727 | priv->serial = port->serial; |
| 732 | priv->port = serial->port[0]; | 728 | priv->port = port; |
| 729 | |||
| 730 | usb_set_serial_port_data(port, priv); | ||
| 731 | |||
| 733 | return 0; | 732 | return 0; |
| 734 | } | 733 | } |
| 735 | 734 | ||
| 736 | static void keyspan_pda_release(struct usb_serial *serial) | 735 | static int keyspan_pda_port_remove(struct usb_serial_port *port) |
| 737 | { | 736 | { |
| 738 | kfree(usb_get_serial_port_data(serial->port[0])); | 737 | struct keyspan_pda_private *priv; |
| 738 | |||
| 739 | priv = usb_get_serial_port_data(port); | ||
| 740 | kfree(priv); | ||
| 741 | |||
| 742 | return 0; | ||
| 739 | } | 743 | } |
| 740 | 744 | ||
| 741 | #ifdef KEYSPAN | 745 | #ifdef KEYSPAN |
| @@ -786,8 +790,8 @@ static struct usb_serial_driver keyspan_pda_device = { | |||
| 786 | .break_ctl = keyspan_pda_break_ctl, | 790 | .break_ctl = keyspan_pda_break_ctl, |
| 787 | .tiocmget = keyspan_pda_tiocmget, | 791 | .tiocmget = keyspan_pda_tiocmget, |
| 788 | .tiocmset = keyspan_pda_tiocmset, | 792 | .tiocmset = keyspan_pda_tiocmset, |
| 789 | .attach = keyspan_pda_startup, | 793 | .port_probe = keyspan_pda_port_probe, |
| 790 | .release = keyspan_pda_release, | 794 | .port_remove = keyspan_pda_port_remove, |
| 791 | }; | 795 | }; |
| 792 | 796 | ||
| 793 | static struct usb_serial_driver * const serial_drivers[] = { | 797 | static struct usb_serial_driver * const serial_drivers[] = { |
diff --git a/drivers/usb/serial/kl5kusb105.c b/drivers/usb/serial/kl5kusb105.c index 3f6d7376c02d..1f4517864cd2 100644 --- a/drivers/usb/serial/kl5kusb105.c +++ b/drivers/usb/serial/kl5kusb105.c | |||
| @@ -60,8 +60,8 @@ | |||
| 60 | /* | 60 | /* |
| 61 | * Function prototypes | 61 | * Function prototypes |
| 62 | */ | 62 | */ |
| 63 | static int klsi_105_startup(struct usb_serial *serial); | 63 | static int klsi_105_port_probe(struct usb_serial_port *port); |
| 64 | static void klsi_105_release(struct usb_serial *serial); | 64 | static int klsi_105_port_remove(struct usb_serial_port *port); |
| 65 | static int klsi_105_open(struct tty_struct *tty, struct usb_serial_port *port); | 65 | static int klsi_105_open(struct tty_struct *tty, struct usb_serial_port *port); |
| 66 | static void klsi_105_close(struct usb_serial_port *port); | 66 | static void klsi_105_close(struct usb_serial_port *port); |
| 67 | static void klsi_105_set_termios(struct tty_struct *tty, | 67 | static void klsi_105_set_termios(struct tty_struct *tty, |
| @@ -99,8 +99,8 @@ static struct usb_serial_driver kl5kusb105d_device = { | |||
| 99 | /*.break_ctl = klsi_105_break_ctl,*/ | 99 | /*.break_ctl = klsi_105_break_ctl,*/ |
| 100 | .tiocmget = klsi_105_tiocmget, | 100 | .tiocmget = klsi_105_tiocmget, |
| 101 | .tiocmset = klsi_105_tiocmset, | 101 | .tiocmset = klsi_105_tiocmset, |
| 102 | .attach = klsi_105_startup, | 102 | .port_probe = klsi_105_port_probe, |
| 103 | .release = klsi_105_release, | 103 | .port_remove = klsi_105_port_remove, |
| 104 | .throttle = usb_serial_generic_throttle, | 104 | .throttle = usb_serial_generic_throttle, |
| 105 | .unthrottle = usb_serial_generic_unthrottle, | 105 | .unthrottle = usb_serial_generic_unthrottle, |
| 106 | .process_read_urb = klsi_105_process_read_urb, | 106 | .process_read_urb = klsi_105_process_read_urb, |
| @@ -223,60 +223,40 @@ static int klsi_105_get_line_state(struct usb_serial_port *port, | |||
| 223 | * Driver's tty interface functions | 223 | * Driver's tty interface functions |
| 224 | */ | 224 | */ |
| 225 | 225 | ||
| 226 | static int klsi_105_startup(struct usb_serial *serial) | 226 | static int klsi_105_port_probe(struct usb_serial_port *port) |
| 227 | { | 227 | { |
| 228 | struct klsi_105_private *priv; | 228 | struct klsi_105_private *priv; |
| 229 | int i; | ||
| 230 | 229 | ||
| 231 | /* check if we support the product id (see keyspan.c) | 230 | priv = kmalloc(sizeof(*priv), GFP_KERNEL); |
| 232 | * FIXME | 231 | if (!priv) |
| 233 | */ | 232 | return -ENOMEM; |
| 234 | 233 | ||
| 235 | /* allocate the private data structure */ | 234 | /* set initial values for control structures */ |
| 236 | for (i = 0; i < serial->num_ports; i++) { | 235 | priv->cfg.pktlen = 5; |
| 237 | priv = kmalloc(sizeof(struct klsi_105_private), | 236 | priv->cfg.baudrate = kl5kusb105a_sio_b9600; |
| 238 | GFP_KERNEL); | 237 | priv->cfg.databits = kl5kusb105a_dtb_8; |
| 239 | if (!priv) { | 238 | priv->cfg.unknown1 = 0; |
| 240 | dev_dbg(&serial->interface->dev, | 239 | priv->cfg.unknown2 = 1; |
| 241 | "%s - kmalloc for klsi_105_private failed.\n", | ||
| 242 | __func__); | ||
| 243 | i--; | ||
| 244 | goto err_cleanup; | ||
| 245 | } | ||
| 246 | /* set initial values for control structures */ | ||
| 247 | priv->cfg.pktlen = 5; | ||
| 248 | priv->cfg.baudrate = kl5kusb105a_sio_b9600; | ||
| 249 | priv->cfg.databits = kl5kusb105a_dtb_8; | ||
| 250 | priv->cfg.unknown1 = 0; | ||
| 251 | priv->cfg.unknown2 = 1; | ||
| 252 | 240 | ||
| 253 | priv->line_state = 0; | 241 | priv->line_state = 0; |
| 254 | 242 | ||
| 255 | usb_set_serial_port_data(serial->port[i], priv); | 243 | spin_lock_init(&priv->lock); |
| 256 | 244 | ||
| 257 | spin_lock_init(&priv->lock); | 245 | /* priv->termios is left uninitialized until port opening */ |
| 258 | 246 | ||
| 259 | /* priv->termios is left uninitialized until port opening */ | 247 | usb_set_serial_port_data(port, priv); |
| 260 | init_waitqueue_head(&serial->port[i]->write_wait); | ||
| 261 | } | ||
| 262 | 248 | ||
| 263 | return 0; | 249 | return 0; |
| 264 | |||
| 265 | err_cleanup: | ||
| 266 | for (; i >= 0; i--) { | ||
| 267 | priv = usb_get_serial_port_data(serial->port[i]); | ||
| 268 | kfree(priv); | ||
| 269 | usb_set_serial_port_data(serial->port[i], NULL); | ||
| 270 | } | ||
| 271 | return -ENOMEM; | ||
| 272 | } | 250 | } |
| 273 | 251 | ||
| 274 | static void klsi_105_release(struct usb_serial *serial) | 252 | static int klsi_105_port_remove(struct usb_serial_port *port) |
| 275 | { | 253 | { |
| 276 | int i; | 254 | struct klsi_105_private *priv; |
| 255 | |||
| 256 | priv = usb_get_serial_port_data(port); | ||
| 257 | kfree(priv); | ||
| 277 | 258 | ||
| 278 | for (i = 0; i < serial->num_ports; ++i) | 259 | return 0; |
| 279 | kfree(usb_get_serial_port_data(serial->port[i])); | ||
| 280 | } | 260 | } |
| 281 | 261 | ||
| 282 | static int klsi_105_open(struct tty_struct *tty, struct usb_serial_port *port) | 262 | static int klsi_105_open(struct tty_struct *tty, struct usb_serial_port *port) |
diff --git a/drivers/usb/serial/kobil_sct.c b/drivers/usb/serial/kobil_sct.c index 5c4d2fbd4e11..c9ca7a5b12e0 100644 --- a/drivers/usb/serial/kobil_sct.c +++ b/drivers/usb/serial/kobil_sct.c | |||
| @@ -54,8 +54,8 @@ | |||
| 54 | 54 | ||
| 55 | 55 | ||
| 56 | /* Function prototypes */ | 56 | /* Function prototypes */ |
| 57 | static int kobil_startup(struct usb_serial *serial); | 57 | static int kobil_port_probe(struct usb_serial_port *probe); |
| 58 | static void kobil_release(struct usb_serial *serial); | 58 | static int kobil_port_remove(struct usb_serial_port *probe); |
| 59 | static int kobil_open(struct tty_struct *tty, struct usb_serial_port *port); | 59 | static int kobil_open(struct tty_struct *tty, struct usb_serial_port *port); |
| 60 | static void kobil_close(struct usb_serial_port *port); | 60 | static void kobil_close(struct usb_serial_port *port); |
| 61 | static int kobil_write(struct tty_struct *tty, struct usb_serial_port *port, | 61 | static int kobil_write(struct tty_struct *tty, struct usb_serial_port *port, |
| @@ -89,8 +89,8 @@ static struct usb_serial_driver kobil_device = { | |||
| 89 | .description = "KOBIL USB smart card terminal", | 89 | .description = "KOBIL USB smart card terminal", |
| 90 | .id_table = id_table, | 90 | .id_table = id_table, |
| 91 | .num_ports = 1, | 91 | .num_ports = 1, |
| 92 | .attach = kobil_startup, | 92 | .port_probe = kobil_port_probe, |
| 93 | .release = kobil_release, | 93 | .port_remove = kobil_port_remove, |
| 94 | .ioctl = kobil_ioctl, | 94 | .ioctl = kobil_ioctl, |
| 95 | .set_termios = kobil_set_termios, | 95 | .set_termios = kobil_set_termios, |
| 96 | .init_termios = kobil_init_termios, | 96 | .init_termios = kobil_init_termios, |
| @@ -117,9 +117,10 @@ struct kobil_private { | |||
| 117 | }; | 117 | }; |
| 118 | 118 | ||
| 119 | 119 | ||
| 120 | static int kobil_startup(struct usb_serial *serial) | 120 | static int kobil_port_probe(struct usb_serial_port *port) |
| 121 | { | 121 | { |
| 122 | int i; | 122 | int i; |
| 123 | struct usb_serial *serial = port->serial; | ||
| 123 | struct kobil_private *priv; | 124 | struct kobil_private *priv; |
| 124 | struct usb_device *pdev; | 125 | struct usb_device *pdev; |
| 125 | struct usb_host_config *actconfig; | 126 | struct usb_host_config *actconfig; |
| @@ -149,7 +150,7 @@ static int kobil_startup(struct usb_serial *serial) | |||
| 149 | dev_dbg(&serial->dev->dev, "KOBIL KAAN SIM detected\n"); | 150 | dev_dbg(&serial->dev->dev, "KOBIL KAAN SIM detected\n"); |
| 150 | break; | 151 | break; |
| 151 | } | 152 | } |
| 152 | usb_set_serial_port_data(serial->port[0], priv); | 153 | usb_set_serial_port_data(port, priv); |
| 153 | 154 | ||
| 154 | /* search for the necessary endpoints */ | 155 | /* search for the necessary endpoints */ |
| 155 | pdev = serial->dev; | 156 | pdev = serial->dev; |
| @@ -179,12 +180,14 @@ static int kobil_startup(struct usb_serial *serial) | |||
| 179 | } | 180 | } |
| 180 | 181 | ||
| 181 | 182 | ||
| 182 | static void kobil_release(struct usb_serial *serial) | 183 | static int kobil_port_remove(struct usb_serial_port *port) |
| 183 | { | 184 | { |
| 184 | int i; | 185 | struct kobil_private *priv; |
| 185 | 186 | ||
| 186 | for (i = 0; i < serial->num_ports; ++i) | 187 | priv = usb_get_serial_port_data(port); |
| 187 | kfree(usb_get_serial_port_data(serial->port[i])); | 188 | kfree(priv); |
| 189 | |||
| 190 | return 0; | ||
| 188 | } | 191 | } |
| 189 | 192 | ||
| 190 | static void kobil_init_termios(struct tty_struct *tty) | 193 | static void kobil_init_termios(struct tty_struct *tty) |
diff --git a/drivers/usb/serial/option.c b/drivers/usb/serial/option.c index 30cff03e9f01..54d4148d01d1 100644 --- a/drivers/usb/serial/option.c +++ b/drivers/usb/serial/option.c | |||
| @@ -503,11 +503,19 @@ static const struct option_blacklist_info net_intf5_blacklist = { | |||
| 503 | .reserved = BIT(5), | 503 | .reserved = BIT(5), |
| 504 | }; | 504 | }; |
| 505 | 505 | ||
| 506 | static const struct option_blacklist_info net_intf6_blacklist = { | ||
| 507 | .reserved = BIT(6), | ||
| 508 | }; | ||
| 509 | |||
| 506 | static const struct option_blacklist_info zte_mf626_blacklist = { | 510 | static const struct option_blacklist_info zte_mf626_blacklist = { |
| 507 | .sendsetup = BIT(0) | BIT(1), | 511 | .sendsetup = BIT(0) | BIT(1), |
| 508 | .reserved = BIT(4), | 512 | .reserved = BIT(4), |
| 509 | }; | 513 | }; |
| 510 | 514 | ||
| 515 | static const struct option_blacklist_info zte_1255_blacklist = { | ||
| 516 | .reserved = BIT(3) | BIT(4), | ||
| 517 | }; | ||
| 518 | |||
| 511 | static const struct usb_device_id option_ids[] = { | 519 | static const struct usb_device_id option_ids[] = { |
| 512 | { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_COLT) }, | 520 | { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_COLT) }, |
| 513 | { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_RICOLA) }, | 521 | { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_RICOLA) }, |
| @@ -853,13 +861,19 @@ static const struct usb_device_id option_ids[] = { | |||
| 853 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0113, 0xff, 0xff, 0xff), | 861 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0113, 0xff, 0xff, 0xff), |
| 854 | .driver_info = (kernel_ulong_t)&net_intf5_blacklist }, | 862 | .driver_info = (kernel_ulong_t)&net_intf5_blacklist }, |
| 855 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0117, 0xff, 0xff, 0xff) }, | 863 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0117, 0xff, 0xff, 0xff) }, |
| 856 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0118, 0xff, 0xff, 0xff) }, | 864 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0118, 0xff, 0xff, 0xff), |
| 857 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0121, 0xff, 0xff, 0xff) }, | 865 | .driver_info = (kernel_ulong_t)&net_intf5_blacklist }, |
| 866 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0121, 0xff, 0xff, 0xff), | ||
| 867 | .driver_info = (kernel_ulong_t)&net_intf5_blacklist }, | ||
| 858 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0122, 0xff, 0xff, 0xff) }, | 868 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0122, 0xff, 0xff, 0xff) }, |
| 859 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0123, 0xff, 0xff, 0xff) }, | 869 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0123, 0xff, 0xff, 0xff), |
| 860 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0124, 0xff, 0xff, 0xff) }, | 870 | .driver_info = (kernel_ulong_t)&net_intf4_blacklist }, |
| 861 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0125, 0xff, 0xff, 0xff) }, | 871 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0124, 0xff, 0xff, 0xff), |
| 862 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0126, 0xff, 0xff, 0xff) }, | 872 | .driver_info = (kernel_ulong_t)&net_intf5_blacklist }, |
| 873 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0125, 0xff, 0xff, 0xff), | ||
| 874 | .driver_info = (kernel_ulong_t)&net_intf6_blacklist }, | ||
| 875 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0126, 0xff, 0xff, 0xff), | ||
| 876 | .driver_info = (kernel_ulong_t)&net_intf5_blacklist }, | ||
| 863 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0128, 0xff, 0xff, 0xff) }, | 877 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0128, 0xff, 0xff, 0xff) }, |
| 864 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0142, 0xff, 0xff, 0xff) }, | 878 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0142, 0xff, 0xff, 0xff) }, |
| 865 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0143, 0xff, 0xff, 0xff) }, | 879 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0143, 0xff, 0xff, 0xff) }, |
| @@ -872,7 +886,8 @@ static const struct usb_device_id option_ids[] = { | |||
| 872 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0156, 0xff, 0xff, 0xff) }, | 886 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0156, 0xff, 0xff, 0xff) }, |
| 873 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0157, 0xff, 0xff, 0xff), | 887 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0157, 0xff, 0xff, 0xff), |
| 874 | .driver_info = (kernel_ulong_t)&net_intf5_blacklist }, | 888 | .driver_info = (kernel_ulong_t)&net_intf5_blacklist }, |
| 875 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0158, 0xff, 0xff, 0xff) }, | 889 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0158, 0xff, 0xff, 0xff), |
| 890 | .driver_info = (kernel_ulong_t)&net_intf3_blacklist }, | ||
| 876 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0159, 0xff, 0xff, 0xff) }, | 891 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0159, 0xff, 0xff, 0xff) }, |
| 877 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0161, 0xff, 0xff, 0xff) }, | 892 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0161, 0xff, 0xff, 0xff) }, |
| 878 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0162, 0xff, 0xff, 0xff) }, | 893 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0162, 0xff, 0xff, 0xff) }, |
| @@ -880,13 +895,22 @@ static const struct usb_device_id option_ids[] = { | |||
| 880 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0165, 0xff, 0xff, 0xff) }, | 895 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0165, 0xff, 0xff, 0xff) }, |
| 881 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0167, 0xff, 0xff, 0xff), | 896 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0167, 0xff, 0xff, 0xff), |
| 882 | .driver_info = (kernel_ulong_t)&net_intf4_blacklist }, | 897 | .driver_info = (kernel_ulong_t)&net_intf4_blacklist }, |
| 898 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0191, 0xff, 0xff, 0xff), /* ZTE EuFi890 */ | ||
| 899 | .driver_info = (kernel_ulong_t)&net_intf4_blacklist }, | ||
| 900 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0199, 0xff, 0xff, 0xff), /* ZTE MF820S */ | ||
| 901 | .driver_info = (kernel_ulong_t)&net_intf1_blacklist }, | ||
| 902 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0257, 0xff, 0xff, 0xff), /* ZTE MF821 */ | ||
| 903 | .driver_info = (kernel_ulong_t)&net_intf3_blacklist }, | ||
| 883 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0326, 0xff, 0xff, 0xff), | 904 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0326, 0xff, 0xff, 0xff), |
| 884 | .driver_info = (kernel_ulong_t)&net_intf4_blacklist }, | 905 | .driver_info = (kernel_ulong_t)&net_intf4_blacklist }, |
| 885 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1008, 0xff, 0xff, 0xff), | 906 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1008, 0xff, 0xff, 0xff), |
| 886 | .driver_info = (kernel_ulong_t)&net_intf4_blacklist }, | 907 | .driver_info = (kernel_ulong_t)&net_intf4_blacklist }, |
| 887 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1010, 0xff, 0xff, 0xff), | 908 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1010, 0xff, 0xff, 0xff), |
| 888 | .driver_info = (kernel_ulong_t)&net_intf4_blacklist }, | 909 | .driver_info = (kernel_ulong_t)&net_intf4_blacklist }, |
| 889 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1012, 0xff, 0xff, 0xff) }, | 910 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1012, 0xff, 0xff, 0xff), |
| 911 | .driver_info = (kernel_ulong_t)&net_intf4_blacklist }, | ||
| 912 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1021, 0xff, 0xff, 0xff), | ||
| 913 | .driver_info = (kernel_ulong_t)&net_intf2_blacklist }, | ||
| 890 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1057, 0xff, 0xff, 0xff) }, | 914 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1057, 0xff, 0xff, 0xff) }, |
| 891 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1058, 0xff, 0xff, 0xff) }, | 915 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1058, 0xff, 0xff, 0xff) }, |
| 892 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1059, 0xff, 0xff, 0xff) }, | 916 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1059, 0xff, 0xff, 0xff) }, |
| @@ -1002,18 +1026,24 @@ static const struct usb_device_id option_ids[] = { | |||
| 1002 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1169, 0xff, 0xff, 0xff) }, | 1026 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1169, 0xff, 0xff, 0xff) }, |
| 1003 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1170, 0xff, 0xff, 0xff) }, | 1027 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1170, 0xff, 0xff, 0xff) }, |
| 1004 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1244, 0xff, 0xff, 0xff) }, | 1028 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1244, 0xff, 0xff, 0xff) }, |
| 1005 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1245, 0xff, 0xff, 0xff) }, | 1029 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1245, 0xff, 0xff, 0xff), |
| 1030 | .driver_info = (kernel_ulong_t)&net_intf4_blacklist }, | ||
| 1006 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1246, 0xff, 0xff, 0xff) }, | 1031 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1246, 0xff, 0xff, 0xff) }, |
| 1007 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1247, 0xff, 0xff, 0xff) }, | 1032 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1247, 0xff, 0xff, 0xff), |
| 1033 | .driver_info = (kernel_ulong_t)&net_intf4_blacklist }, | ||
| 1008 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1248, 0xff, 0xff, 0xff) }, | 1034 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1248, 0xff, 0xff, 0xff) }, |
| 1009 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1249, 0xff, 0xff, 0xff) }, | 1035 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1249, 0xff, 0xff, 0xff) }, |
| 1010 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1250, 0xff, 0xff, 0xff) }, | 1036 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1250, 0xff, 0xff, 0xff) }, |
| 1011 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1251, 0xff, 0xff, 0xff) }, | 1037 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1251, 0xff, 0xff, 0xff) }, |
| 1012 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1252, 0xff, 0xff, 0xff) }, | 1038 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1252, 0xff, 0xff, 0xff), |
| 1039 | .driver_info = (kernel_ulong_t)&net_intf4_blacklist }, | ||
| 1013 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1253, 0xff, 0xff, 0xff) }, | 1040 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1253, 0xff, 0xff, 0xff) }, |
| 1014 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1254, 0xff, 0xff, 0xff) }, | 1041 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1254, 0xff, 0xff, 0xff), |
| 1015 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1255, 0xff, 0xff, 0xff) }, | 1042 | .driver_info = (kernel_ulong_t)&net_intf4_blacklist }, |
| 1016 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1256, 0xff, 0xff, 0xff) }, | 1043 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1255, 0xff, 0xff, 0xff), |
| 1044 | .driver_info = (kernel_ulong_t)&zte_1255_blacklist }, | ||
| 1045 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1256, 0xff, 0xff, 0xff), | ||
| 1046 | .driver_info = (kernel_ulong_t)&net_intf4_blacklist }, | ||
| 1017 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1257, 0xff, 0xff, 0xff) }, | 1047 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1257, 0xff, 0xff, 0xff) }, |
| 1018 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1258, 0xff, 0xff, 0xff) }, | 1048 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1258, 0xff, 0xff, 0xff) }, |
| 1019 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1259, 0xff, 0xff, 0xff) }, | 1049 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1259, 0xff, 0xff, 0xff) }, |
| @@ -1058,8 +1088,16 @@ static const struct usb_device_id option_ids[] = { | |||
| 1058 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1298, 0xff, 0xff, 0xff) }, | 1088 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1298, 0xff, 0xff, 0xff) }, |
| 1059 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1299, 0xff, 0xff, 0xff) }, | 1089 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1299, 0xff, 0xff, 0xff) }, |
| 1060 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1300, 0xff, 0xff, 0xff) }, | 1090 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1300, 0xff, 0xff, 0xff) }, |
| 1091 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1401, 0xff, 0xff, 0xff), | ||
| 1092 | .driver_info = (kernel_ulong_t)&net_intf2_blacklist }, | ||
| 1061 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1402, 0xff, 0xff, 0xff), | 1093 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1402, 0xff, 0xff, 0xff), |
| 1062 | .driver_info = (kernel_ulong_t)&net_intf2_blacklist }, | 1094 | .driver_info = (kernel_ulong_t)&net_intf2_blacklist }, |
| 1095 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1424, 0xff, 0xff, 0xff), | ||
| 1096 | .driver_info = (kernel_ulong_t)&net_intf2_blacklist }, | ||
| 1097 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1425, 0xff, 0xff, 0xff), | ||
| 1098 | .driver_info = (kernel_ulong_t)&net_intf2_blacklist }, | ||
| 1099 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1426, 0xff, 0xff, 0xff), /* ZTE MF91 */ | ||
| 1100 | .driver_info = (kernel_ulong_t)&net_intf2_blacklist }, | ||
| 1063 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x2002, 0xff, | 1101 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x2002, 0xff, |
| 1064 | 0xff, 0xff), .driver_info = (kernel_ulong_t)&zte_k3765_z_blacklist }, | 1102 | 0xff, 0xff), .driver_info = (kernel_ulong_t)&zte_k3765_z_blacklist }, |
| 1065 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x2003, 0xff, 0xff, 0xff) }, | 1103 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x2003, 0xff, 0xff, 0xff) }, |
| @@ -1071,15 +1109,21 @@ static const struct usb_device_id option_ids[] = { | |||
| 1071 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0070, 0xff, 0xff, 0xff) }, | 1109 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0070, 0xff, 0xff, 0xff) }, |
| 1072 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0073, 0xff, 0xff, 0xff) }, | 1110 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0073, 0xff, 0xff, 0xff) }, |
| 1073 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0094, 0xff, 0xff, 0xff) }, | 1111 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0094, 0xff, 0xff, 0xff) }, |
| 1074 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0130, 0xff, 0xff, 0xff) }, | 1112 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0130, 0xff, 0xff, 0xff), |
| 1075 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0133, 0xff, 0xff, 0xff) }, | 1113 | .driver_info = (kernel_ulong_t)&net_intf1_blacklist }, |
| 1076 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0141, 0xff, 0xff, 0xff) }, | 1114 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0133, 0xff, 0xff, 0xff), |
| 1115 | .driver_info = (kernel_ulong_t)&net_intf3_blacklist }, | ||
| 1116 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0141, 0xff, 0xff, 0xff), | ||
| 1117 | .driver_info = (kernel_ulong_t)&net_intf5_blacklist }, | ||
| 1077 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0147, 0xff, 0xff, 0xff) }, | 1118 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0147, 0xff, 0xff, 0xff) }, |
| 1078 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0152, 0xff, 0xff, 0xff) }, | 1119 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0152, 0xff, 0xff, 0xff) }, |
| 1079 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0168, 0xff, 0xff, 0xff) }, | 1120 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0168, 0xff, 0xff, 0xff), |
| 1121 | .driver_info = (kernel_ulong_t)&net_intf4_blacklist }, | ||
| 1080 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0170, 0xff, 0xff, 0xff) }, | 1122 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0170, 0xff, 0xff, 0xff) }, |
| 1081 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0176, 0xff, 0xff, 0xff) }, | 1123 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0176, 0xff, 0xff, 0xff), |
| 1082 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0178, 0xff, 0xff, 0xff) }, | 1124 | .driver_info = (kernel_ulong_t)&net_intf3_blacklist }, |
| 1125 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0178, 0xff, 0xff, 0xff), | ||
| 1126 | .driver_info = (kernel_ulong_t)&net_intf3_blacklist }, | ||
| 1083 | 1127 | ||
| 1084 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, ZTE_PRODUCT_CDMA_TECH, 0xff, 0xff, 0xff) }, | 1128 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, ZTE_PRODUCT_CDMA_TECH, 0xff, 0xff, 0xff) }, |
| 1085 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, ZTE_PRODUCT_AC8710, 0xff, 0xff, 0xff) }, | 1129 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, ZTE_PRODUCT_AC8710, 0xff, 0xff, 0xff) }, |
diff --git a/drivers/usb/serial/oti6858.c b/drivers/usb/serial/oti6858.c index 933241f03fd8..cee9a52ca891 100644 --- a/drivers/usb/serial/oti6858.c +++ b/drivers/usb/serial/oti6858.c | |||
| @@ -137,8 +137,8 @@ static int oti6858_chars_in_buffer(struct tty_struct *tty); | |||
| 137 | static int oti6858_tiocmget(struct tty_struct *tty); | 137 | static int oti6858_tiocmget(struct tty_struct *tty); |
| 138 | static int oti6858_tiocmset(struct tty_struct *tty, | 138 | static int oti6858_tiocmset(struct tty_struct *tty, |
| 139 | unsigned int set, unsigned int clear); | 139 | unsigned int set, unsigned int clear); |
| 140 | static int oti6858_startup(struct usb_serial *serial); | 140 | static int oti6858_port_probe(struct usb_serial_port *port); |
| 141 | static void oti6858_release(struct usb_serial *serial); | 141 | static int oti6858_port_remove(struct usb_serial_port *port); |
| 142 | 142 | ||
| 143 | /* device info */ | 143 | /* device info */ |
| 144 | static struct usb_serial_driver oti6858_device = { | 144 | static struct usb_serial_driver oti6858_device = { |
| @@ -161,8 +161,8 @@ static struct usb_serial_driver oti6858_device = { | |||
| 161 | .write_bulk_callback = oti6858_write_bulk_callback, | 161 | .write_bulk_callback = oti6858_write_bulk_callback, |
| 162 | .write_room = oti6858_write_room, | 162 | .write_room = oti6858_write_room, |
| 163 | .chars_in_buffer = oti6858_chars_in_buffer, | 163 | .chars_in_buffer = oti6858_chars_in_buffer, |
| 164 | .attach = oti6858_startup, | 164 | .port_probe = oti6858_port_probe, |
| 165 | .release = oti6858_release, | 165 | .port_remove = oti6858_port_remove, |
| 166 | }; | 166 | }; |
| 167 | 167 | ||
| 168 | static struct usb_serial_driver * const serial_drivers[] = { | 168 | static struct usb_serial_driver * const serial_drivers[] = { |
| @@ -331,36 +331,33 @@ static void send_data(struct work_struct *work) | |||
| 331 | usb_serial_port_softint(port); | 331 | usb_serial_port_softint(port); |
| 332 | } | 332 | } |
| 333 | 333 | ||
| 334 | static int oti6858_startup(struct usb_serial *serial) | 334 | static int oti6858_port_probe(struct usb_serial_port *port) |
| 335 | { | 335 | { |
| 336 | struct usb_serial_port *port = serial->port[0]; | ||
| 337 | struct oti6858_private *priv; | 336 | struct oti6858_private *priv; |
| 338 | int i; | ||
| 339 | |||
| 340 | for (i = 0; i < serial->num_ports; ++i) { | ||
| 341 | priv = kzalloc(sizeof(struct oti6858_private), GFP_KERNEL); | ||
| 342 | if (!priv) | ||
| 343 | break; | ||
| 344 | |||
| 345 | spin_lock_init(&priv->lock); | ||
| 346 | init_waitqueue_head(&priv->intr_wait); | ||
| 347 | /* INIT_WORK(&priv->setup_work, setup_line, serial->port[i]); */ | ||
| 348 | /* INIT_WORK(&priv->write_work, send_data, serial->port[i]); */ | ||
| 349 | priv->port = port; | ||
| 350 | INIT_DELAYED_WORK(&priv->delayed_setup_work, setup_line); | ||
| 351 | INIT_DELAYED_WORK(&priv->delayed_write_work, send_data); | ||
| 352 | |||
| 353 | usb_set_serial_port_data(serial->port[i], priv); | ||
| 354 | } | ||
| 355 | if (i == serial->num_ports) | ||
| 356 | return 0; | ||
| 357 | 337 | ||
| 358 | for (--i; i >= 0; --i) { | 338 | priv = kzalloc(sizeof(*priv), GFP_KERNEL); |
| 359 | priv = usb_get_serial_port_data(serial->port[i]); | 339 | if (!priv) |
| 360 | kfree(priv); | 340 | return -ENOMEM; |
| 361 | usb_set_serial_port_data(serial->port[i], NULL); | 341 | |
| 362 | } | 342 | spin_lock_init(&priv->lock); |
| 363 | return -ENOMEM; | 343 | init_waitqueue_head(&priv->intr_wait); |
| 344 | priv->port = port; | ||
| 345 | INIT_DELAYED_WORK(&priv->delayed_setup_work, setup_line); | ||
| 346 | INIT_DELAYED_WORK(&priv->delayed_write_work, send_data); | ||
| 347 | |||
| 348 | usb_set_serial_port_data(port, priv); | ||
| 349 | |||
| 350 | return 0; | ||
| 351 | } | ||
| 352 | |||
| 353 | static int oti6858_port_remove(struct usb_serial_port *port) | ||
| 354 | { | ||
| 355 | struct oti6858_private *priv; | ||
| 356 | |||
| 357 | priv = usb_get_serial_port_data(port); | ||
| 358 | kfree(priv); | ||
| 359 | |||
| 360 | return 0; | ||
| 364 | } | 361 | } |
| 365 | 362 | ||
| 366 | static int oti6858_write(struct tty_struct *tty, struct usb_serial_port *port, | 363 | static int oti6858_write(struct tty_struct *tty, struct usb_serial_port *port, |
| @@ -709,15 +706,6 @@ static int oti6858_ioctl(struct tty_struct *tty, | |||
| 709 | return -ENOIOCTLCMD; | 706 | return -ENOIOCTLCMD; |
| 710 | } | 707 | } |
| 711 | 708 | ||
| 712 | |||
| 713 | static void oti6858_release(struct usb_serial *serial) | ||
| 714 | { | ||
| 715 | int i; | ||
| 716 | |||
| 717 | for (i = 0; i < serial->num_ports; ++i) | ||
| 718 | kfree(usb_get_serial_port_data(serial->port[i])); | ||
| 719 | } | ||
| 720 | |||
| 721 | static void oti6858_read_int_callback(struct urb *urb) | 709 | static void oti6858_read_int_callback(struct urb *urb) |
| 722 | { | 710 | { |
| 723 | struct usb_serial_port *port = urb->context; | 711 | struct usb_serial_port *port = urb->context; |
diff --git a/drivers/usb/serial/pl2303.c b/drivers/usb/serial/pl2303.c index 892ebdc7a364..600241901361 100644 --- a/drivers/usb/serial/pl2303.c +++ b/drivers/usb/serial/pl2303.c | |||
| @@ -133,12 +133,15 @@ enum pl2303_type { | |||
| 133 | HX, /* HX version of the pl2303 chip */ | 133 | HX, /* HX version of the pl2303 chip */ |
| 134 | }; | 134 | }; |
| 135 | 135 | ||
| 136 | struct pl2303_serial_private { | ||
| 137 | enum pl2303_type type; | ||
| 138 | }; | ||
| 139 | |||
| 136 | struct pl2303_private { | 140 | struct pl2303_private { |
| 137 | spinlock_t lock; | 141 | spinlock_t lock; |
| 138 | wait_queue_head_t delta_msr_wait; | 142 | wait_queue_head_t delta_msr_wait; |
| 139 | u8 line_control; | 143 | u8 line_control; |
| 140 | u8 line_status; | 144 | u8 line_status; |
| 141 | enum pl2303_type type; | ||
| 142 | }; | 145 | }; |
| 143 | 146 | ||
| 144 | static int pl2303_vendor_read(__u16 value, __u16 index, | 147 | static int pl2303_vendor_read(__u16 value, __u16 index, |
| @@ -167,14 +170,19 @@ static int pl2303_vendor_write(__u16 value, __u16 index, | |||
| 167 | 170 | ||
| 168 | static int pl2303_startup(struct usb_serial *serial) | 171 | static int pl2303_startup(struct usb_serial *serial) |
| 169 | { | 172 | { |
| 170 | struct pl2303_private *priv; | 173 | struct pl2303_serial_private *spriv; |
| 171 | enum pl2303_type type = type_0; | 174 | enum pl2303_type type = type_0; |
| 172 | unsigned char *buf; | 175 | unsigned char *buf; |
| 173 | int i; | 176 | |
| 177 | spriv = kzalloc(sizeof(*spriv), GFP_KERNEL); | ||
| 178 | if (!spriv) | ||
| 179 | return -ENOMEM; | ||
| 174 | 180 | ||
| 175 | buf = kmalloc(10, GFP_KERNEL); | 181 | buf = kmalloc(10, GFP_KERNEL); |
| 176 | if (buf == NULL) | 182 | if (!buf) { |
| 183 | kfree(spriv); | ||
| 177 | return -ENOMEM; | 184 | return -ENOMEM; |
| 185 | } | ||
| 178 | 186 | ||
| 179 | if (serial->dev->descriptor.bDeviceClass == 0x02) | 187 | if (serial->dev->descriptor.bDeviceClass == 0x02) |
| 180 | type = type_0; | 188 | type = type_0; |
| @@ -186,15 +194,8 @@ static int pl2303_startup(struct usb_serial *serial) | |||
| 186 | type = type_1; | 194 | type = type_1; |
| 187 | dev_dbg(&serial->interface->dev, "device type: %d\n", type); | 195 | dev_dbg(&serial->interface->dev, "device type: %d\n", type); |
| 188 | 196 | ||
| 189 | for (i = 0; i < serial->num_ports; ++i) { | 197 | spriv->type = type; |
| 190 | priv = kzalloc(sizeof(struct pl2303_private), GFP_KERNEL); | 198 | usb_set_serial_data(serial, spriv); |
| 191 | if (!priv) | ||
| 192 | goto cleanup; | ||
| 193 | spin_lock_init(&priv->lock); | ||
| 194 | init_waitqueue_head(&priv->delta_msr_wait); | ||
| 195 | priv->type = type; | ||
| 196 | usb_set_serial_port_data(serial->port[i], priv); | ||
| 197 | } | ||
| 198 | 199 | ||
| 199 | pl2303_vendor_read(0x8484, 0, serial, buf); | 200 | pl2303_vendor_read(0x8484, 0, serial, buf); |
| 200 | pl2303_vendor_write(0x0404, 0, serial); | 201 | pl2303_vendor_write(0x0404, 0, serial); |
| @@ -213,15 +214,40 @@ static int pl2303_startup(struct usb_serial *serial) | |||
| 213 | 214 | ||
| 214 | kfree(buf); | 215 | kfree(buf); |
| 215 | return 0; | 216 | return 0; |
| 217 | } | ||
| 216 | 218 | ||
| 217 | cleanup: | 219 | static void pl2303_release(struct usb_serial *serial) |
| 218 | kfree(buf); | 220 | { |
| 219 | for (--i; i >= 0; --i) { | 221 | struct pl2303_serial_private *spriv; |
| 220 | priv = usb_get_serial_port_data(serial->port[i]); | 222 | |
| 221 | kfree(priv); | 223 | spriv = usb_get_serial_data(serial); |
| 222 | usb_set_serial_port_data(serial->port[i], NULL); | 224 | kfree(spriv); |
| 223 | } | 225 | } |
| 224 | return -ENOMEM; | 226 | |
| 227 | static int pl2303_port_probe(struct usb_serial_port *port) | ||
| 228 | { | ||
| 229 | struct pl2303_private *priv; | ||
| 230 | |||
| 231 | priv = kzalloc(sizeof(*priv), GFP_KERNEL); | ||
| 232 | if (!priv) | ||
| 233 | return -ENOMEM; | ||
| 234 | |||
| 235 | spin_lock_init(&priv->lock); | ||
| 236 | init_waitqueue_head(&priv->delta_msr_wait); | ||
| 237 | |||
| 238 | usb_set_serial_port_data(port, priv); | ||
| 239 | |||
| 240 | return 0; | ||
| 241 | } | ||
| 242 | |||
| 243 | static int pl2303_port_remove(struct usb_serial_port *port) | ||
| 244 | { | ||
| 245 | struct pl2303_private *priv; | ||
| 246 | |||
| 247 | priv = usb_get_serial_port_data(port); | ||
| 248 | kfree(priv); | ||
| 249 | |||
| 250 | return 0; | ||
| 225 | } | 251 | } |
| 226 | 252 | ||
| 227 | static int set_control_lines(struct usb_device *dev, u8 value) | 253 | static int set_control_lines(struct usb_device *dev, u8 value) |
| @@ -240,6 +266,7 @@ static void pl2303_set_termios(struct tty_struct *tty, | |||
| 240 | struct usb_serial_port *port, struct ktermios *old_termios) | 266 | struct usb_serial_port *port, struct ktermios *old_termios) |
| 241 | { | 267 | { |
| 242 | struct usb_serial *serial = port->serial; | 268 | struct usb_serial *serial = port->serial; |
| 269 | struct pl2303_serial_private *spriv = usb_get_serial_data(serial); | ||
| 243 | struct pl2303_private *priv = usb_get_serial_port_data(port); | 270 | struct pl2303_private *priv = usb_get_serial_port_data(port); |
| 244 | unsigned long flags; | 271 | unsigned long flags; |
| 245 | unsigned int cflag; | 272 | unsigned int cflag; |
| @@ -323,7 +350,7 @@ static void pl2303_set_termios(struct tty_struct *tty, | |||
| 323 | } | 350 | } |
| 324 | if (baud > 1228800) { | 351 | if (baud > 1228800) { |
| 325 | /* type_0, type_1 only support up to 1228800 baud */ | 352 | /* type_0, type_1 only support up to 1228800 baud */ |
| 326 | if (priv->type != HX) | 353 | if (spriv->type != HX) |
| 327 | baud = 1228800; | 354 | baud = 1228800; |
| 328 | else if (baud > 6000000) | 355 | else if (baud > 6000000) |
| 329 | baud = 6000000; | 356 | baud = 6000000; |
| @@ -426,7 +453,7 @@ static void pl2303_set_termios(struct tty_struct *tty, | |||
| 426 | buf[0], buf[1], buf[2], buf[3], buf[4], buf[5], buf[6]); | 453 | buf[0], buf[1], buf[2], buf[3], buf[4], buf[5], buf[6]); |
| 427 | 454 | ||
| 428 | if (cflag & CRTSCTS) { | 455 | if (cflag & CRTSCTS) { |
| 429 | if (priv->type == HX) | 456 | if (spriv->type == HX) |
| 430 | pl2303_vendor_write(0x0, 0x61, serial); | 457 | pl2303_vendor_write(0x0, 0x61, serial); |
| 431 | else | 458 | else |
| 432 | pl2303_vendor_write(0x0, 0x41, serial); | 459 | pl2303_vendor_write(0x0, 0x41, serial); |
| @@ -468,10 +495,10 @@ static int pl2303_open(struct tty_struct *tty, struct usb_serial_port *port) | |||
| 468 | { | 495 | { |
| 469 | struct ktermios tmp_termios; | 496 | struct ktermios tmp_termios; |
| 470 | struct usb_serial *serial = port->serial; | 497 | struct usb_serial *serial = port->serial; |
| 471 | struct pl2303_private *priv = usb_get_serial_port_data(port); | 498 | struct pl2303_serial_private *spriv = usb_get_serial_data(serial); |
| 472 | int result; | 499 | int result; |
| 473 | 500 | ||
| 474 | if (priv->type != HX) { | 501 | if (spriv->type != HX) { |
| 475 | usb_clear_halt(serial->dev, port->write_urb->pipe); | 502 | usb_clear_halt(serial->dev, port->write_urb->pipe); |
| 476 | usb_clear_halt(serial->dev, port->read_urb->pipe); | 503 | usb_clear_halt(serial->dev, port->read_urb->pipe); |
| 477 | } else { | 504 | } else { |
| @@ -655,17 +682,6 @@ static void pl2303_break_ctl(struct tty_struct *tty, int break_state) | |||
| 655 | dev_err(&port->dev, "error sending break = %d\n", result); | 682 | dev_err(&port->dev, "error sending break = %d\n", result); |
| 656 | } | 683 | } |
| 657 | 684 | ||
| 658 | static void pl2303_release(struct usb_serial *serial) | ||
| 659 | { | ||
| 660 | int i; | ||
| 661 | struct pl2303_private *priv; | ||
| 662 | |||
| 663 | for (i = 0; i < serial->num_ports; ++i) { | ||
| 664 | priv = usb_get_serial_port_data(serial->port[i]); | ||
| 665 | kfree(priv); | ||
| 666 | } | ||
| 667 | } | ||
| 668 | |||
| 669 | static void pl2303_update_line_status(struct usb_serial_port *port, | 685 | static void pl2303_update_line_status(struct usb_serial_port *port, |
| 670 | unsigned char *data, | 686 | unsigned char *data, |
| 671 | unsigned int actual_length) | 687 | unsigned int actual_length) |
| @@ -827,6 +843,8 @@ static struct usb_serial_driver pl2303_device = { | |||
| 827 | .read_int_callback = pl2303_read_int_callback, | 843 | .read_int_callback = pl2303_read_int_callback, |
| 828 | .attach = pl2303_startup, | 844 | .attach = pl2303_startup, |
| 829 | .release = pl2303_release, | 845 | .release = pl2303_release, |
| 846 | .port_probe = pl2303_port_probe, | ||
| 847 | .port_remove = pl2303_port_remove, | ||
| 830 | }; | 848 | }; |
| 831 | 849 | ||
| 832 | static struct usb_serial_driver * const serial_drivers[] = { | 850 | static struct usb_serial_driver * const serial_drivers[] = { |
diff --git a/drivers/usb/serial/spcp8x5.c b/drivers/usb/serial/spcp8x5.c index 9716efe92955..769c137f8975 100644 --- a/drivers/usb/serial/spcp8x5.c +++ b/drivers/usb/serial/spcp8x5.c | |||
| @@ -157,13 +157,10 @@ struct spcp8x5_private { | |||
| 157 | u8 line_status; | 157 | u8 line_status; |
| 158 | }; | 158 | }; |
| 159 | 159 | ||
| 160 | /* desc : when device plug in,this function would be called. | 160 | static int spcp8x5_port_probe(struct usb_serial_port *port) |
| 161 | * thanks to usb_serial subsystem,then do almost every things for us. And what | ||
| 162 | * we should do just alloc the buffer */ | ||
| 163 | static int spcp8x5_startup(struct usb_serial *serial) | ||
| 164 | { | 161 | { |
| 162 | struct usb_serial *serial = port->serial; | ||
| 165 | struct spcp8x5_private *priv; | 163 | struct spcp8x5_private *priv; |
| 166 | int i; | ||
| 167 | enum spcp8x5_type type = SPCP825_007_TYPE; | 164 | enum spcp8x5_type type = SPCP825_007_TYPE; |
| 168 | u16 product = le16_to_cpu(serial->dev->descriptor.idProduct); | 165 | u16 product = le16_to_cpu(serial->dev->descriptor.idProduct); |
| 169 | 166 | ||
| @@ -180,34 +177,27 @@ static int spcp8x5_startup(struct usb_serial *serial) | |||
| 180 | type = SPCP825_PHILIP_TYPE; | 177 | type = SPCP825_PHILIP_TYPE; |
| 181 | dev_dbg(&serial->dev->dev, "device type = %d\n", (int)type); | 178 | dev_dbg(&serial->dev->dev, "device type = %d\n", (int)type); |
| 182 | 179 | ||
| 183 | for (i = 0; i < serial->num_ports; ++i) { | 180 | priv = kzalloc(sizeof(*priv), GFP_KERNEL); |
| 184 | priv = kzalloc(sizeof(struct spcp8x5_private), GFP_KERNEL); | 181 | if (!priv) |
| 185 | if (!priv) | 182 | return -ENOMEM; |
| 186 | goto cleanup; | ||
| 187 | 183 | ||
| 188 | spin_lock_init(&priv->lock); | 184 | spin_lock_init(&priv->lock); |
| 189 | init_waitqueue_head(&priv->delta_msr_wait); | 185 | init_waitqueue_head(&priv->delta_msr_wait); |
| 190 | priv->type = type; | 186 | priv->type = type; |
| 191 | usb_set_serial_port_data(serial->port[i] , priv); | 187 | |
| 192 | } | 188 | usb_set_serial_port_data(port , priv); |
| 193 | 189 | ||
| 194 | return 0; | 190 | return 0; |
| 195 | cleanup: | ||
| 196 | for (--i; i >= 0; --i) { | ||
| 197 | priv = usb_get_serial_port_data(serial->port[i]); | ||
| 198 | kfree(priv); | ||
| 199 | usb_set_serial_port_data(serial->port[i] , NULL); | ||
| 200 | } | ||
| 201 | return -ENOMEM; | ||
| 202 | } | 191 | } |
| 203 | 192 | ||
| 204 | /* call when the device plug out. free all the memory alloced by probe */ | 193 | static int spcp8x5_port_remove(struct usb_serial_port *port) |
| 205 | static void spcp8x5_release(struct usb_serial *serial) | ||
| 206 | { | 194 | { |
| 207 | int i; | 195 | struct spcp8x5_private *priv; |
| 208 | 196 | ||
| 209 | for (i = 0; i < serial->num_ports; i++) | 197 | priv = usb_get_serial_port_data(port); |
| 210 | kfree(usb_get_serial_port_data(serial->port[i])); | 198 | kfree(priv); |
| 199 | |||
| 200 | return 0; | ||
| 211 | } | 201 | } |
| 212 | 202 | ||
| 213 | /* set the modem control line of the device. | 203 | /* set the modem control line of the device. |
| @@ -649,8 +639,8 @@ static struct usb_serial_driver spcp8x5_device = { | |||
| 649 | .ioctl = spcp8x5_ioctl, | 639 | .ioctl = spcp8x5_ioctl, |
| 650 | .tiocmget = spcp8x5_tiocmget, | 640 | .tiocmget = spcp8x5_tiocmget, |
| 651 | .tiocmset = spcp8x5_tiocmset, | 641 | .tiocmset = spcp8x5_tiocmset, |
| 652 | .attach = spcp8x5_startup, | 642 | .port_probe = spcp8x5_port_probe, |
| 653 | .release = spcp8x5_release, | 643 | .port_remove = spcp8x5_port_remove, |
| 654 | .process_read_urb = spcp8x5_process_read_urb, | 644 | .process_read_urb = spcp8x5_process_read_urb, |
| 655 | }; | 645 | }; |
| 656 | 646 | ||
diff --git a/drivers/usb/serial/ssu100.c b/drivers/usb/serial/ssu100.c index 015810b3785b..868d1e6852e2 100644 --- a/drivers/usb/serial/ssu100.c +++ b/drivers/usb/serial/ssu100.c | |||
| @@ -67,13 +67,6 @@ struct ssu100_port_private { | |||
| 67 | struct async_icount icount; | 67 | struct async_icount icount; |
| 68 | }; | 68 | }; |
| 69 | 69 | ||
| 70 | static void ssu100_release(struct usb_serial *serial) | ||
| 71 | { | ||
| 72 | struct ssu100_port_private *priv = usb_get_serial_port_data(*serial->port); | ||
| 73 | |||
| 74 | kfree(priv); | ||
| 75 | } | ||
| 76 | |||
| 77 | static inline int ssu100_control_msg(struct usb_device *dev, | 70 | static inline int ssu100_control_msg(struct usb_device *dev, |
| 78 | u8 request, u16 data, u16 index) | 71 | u8 request, u16 data, u16 index) |
| 79 | { | 72 | { |
| @@ -442,21 +435,33 @@ static int ssu100_ioctl(struct tty_struct *tty, | |||
| 442 | 435 | ||
| 443 | static int ssu100_attach(struct usb_serial *serial) | 436 | static int ssu100_attach(struct usb_serial *serial) |
| 444 | { | 437 | { |
| 438 | return ssu100_initdevice(serial->dev); | ||
| 439 | } | ||
| 440 | |||
| 441 | static int ssu100_port_probe(struct usb_serial_port *port) | ||
| 442 | { | ||
| 445 | struct ssu100_port_private *priv; | 443 | struct ssu100_port_private *priv; |
| 446 | struct usb_serial_port *port = *serial->port; | ||
| 447 | 444 | ||
| 448 | priv = kzalloc(sizeof(*priv), GFP_KERNEL); | 445 | priv = kzalloc(sizeof(*priv), GFP_KERNEL); |
| 449 | if (!priv) { | 446 | if (!priv) |
| 450 | dev_err(&port->dev, "%s- kmalloc(%Zd) failed.\n", __func__, | ||
| 451 | sizeof(*priv)); | ||
| 452 | return -ENOMEM; | 447 | return -ENOMEM; |
| 453 | } | ||
| 454 | 448 | ||
| 455 | spin_lock_init(&priv->status_lock); | 449 | spin_lock_init(&priv->status_lock); |
| 456 | init_waitqueue_head(&priv->delta_msr_wait); | 450 | init_waitqueue_head(&priv->delta_msr_wait); |
| 451 | |||
| 457 | usb_set_serial_port_data(port, priv); | 452 | usb_set_serial_port_data(port, priv); |
| 458 | 453 | ||
| 459 | return ssu100_initdevice(serial->dev); | 454 | return 0; |
| 455 | } | ||
| 456 | |||
| 457 | static int ssu100_port_remove(struct usb_serial_port *port) | ||
| 458 | { | ||
| 459 | struct ssu100_port_private *priv; | ||
| 460 | |||
| 461 | priv = usb_get_serial_port_data(port); | ||
| 462 | kfree(priv); | ||
| 463 | |||
| 464 | return 0; | ||
| 460 | } | 465 | } |
| 461 | 466 | ||
| 462 | static int ssu100_tiocmget(struct tty_struct *tty) | 467 | static int ssu100_tiocmget(struct tty_struct *tty) |
| @@ -647,7 +652,8 @@ static struct usb_serial_driver ssu100_device = { | |||
| 647 | .open = ssu100_open, | 652 | .open = ssu100_open, |
| 648 | .close = ssu100_close, | 653 | .close = ssu100_close, |
| 649 | .attach = ssu100_attach, | 654 | .attach = ssu100_attach, |
| 650 | .release = ssu100_release, | 655 | .port_probe = ssu100_port_probe, |
| 656 | .port_remove = ssu100_port_remove, | ||
| 651 | .dtr_rts = ssu100_dtr_rts, | 657 | .dtr_rts = ssu100_dtr_rts, |
| 652 | .process_read_urb = ssu100_process_read_urb, | 658 | .process_read_urb = ssu100_process_read_urb, |
| 653 | .tiocmget = ssu100_tiocmget, | 659 | .tiocmget = ssu100_tiocmget, |
diff --git a/drivers/usb/serial/ti_usb_3410_5052.c b/drivers/usb/serial/ti_usb_3410_5052.c index 6f49392cda5b..f2530d2ef3c4 100644 --- a/drivers/usb/serial/ti_usb_3410_5052.c +++ b/drivers/usb/serial/ti_usb_3410_5052.c | |||
| @@ -97,6 +97,8 @@ struct ti_device { | |||
| 97 | 97 | ||
| 98 | static int ti_startup(struct usb_serial *serial); | 98 | static int ti_startup(struct usb_serial *serial); |
| 99 | static void ti_release(struct usb_serial *serial); | 99 | static void ti_release(struct usb_serial *serial); |
| 100 | static int ti_port_probe(struct usb_serial_port *port); | ||
| 101 | static int ti_port_remove(struct usb_serial_port *port); | ||
| 100 | static int ti_open(struct tty_struct *tty, struct usb_serial_port *port); | 102 | static int ti_open(struct tty_struct *tty, struct usb_serial_port *port); |
| 101 | static void ti_close(struct usb_serial_port *port); | 103 | static void ti_close(struct usb_serial_port *port); |
| 102 | static int ti_write(struct tty_struct *tty, struct usb_serial_port *port, | 104 | static int ti_write(struct tty_struct *tty, struct usb_serial_port *port, |
| @@ -221,6 +223,8 @@ static struct usb_serial_driver ti_1port_device = { | |||
| 221 | .num_ports = 1, | 223 | .num_ports = 1, |
| 222 | .attach = ti_startup, | 224 | .attach = ti_startup, |
| 223 | .release = ti_release, | 225 | .release = ti_release, |
| 226 | .port_probe = ti_port_probe, | ||
| 227 | .port_remove = ti_port_remove, | ||
| 224 | .open = ti_open, | 228 | .open = ti_open, |
| 225 | .close = ti_close, | 229 | .close = ti_close, |
| 226 | .write = ti_write, | 230 | .write = ti_write, |
| @@ -249,6 +253,8 @@ static struct usb_serial_driver ti_2port_device = { | |||
| 249 | .num_ports = 2, | 253 | .num_ports = 2, |
| 250 | .attach = ti_startup, | 254 | .attach = ti_startup, |
| 251 | .release = ti_release, | 255 | .release = ti_release, |
| 256 | .port_probe = ti_port_probe, | ||
| 257 | .port_remove = ti_port_remove, | ||
| 252 | .open = ti_open, | 258 | .open = ti_open, |
| 253 | .close = ti_close, | 259 | .close = ti_close, |
| 254 | .write = ti_write, | 260 | .write = ti_write, |
| @@ -347,11 +353,8 @@ module_exit(ti_exit); | |||
| 347 | static int ti_startup(struct usb_serial *serial) | 353 | static int ti_startup(struct usb_serial *serial) |
| 348 | { | 354 | { |
| 349 | struct ti_device *tdev; | 355 | struct ti_device *tdev; |
| 350 | struct ti_port *tport; | ||
| 351 | struct usb_device *dev = serial->dev; | 356 | struct usb_device *dev = serial->dev; |
| 352 | int status; | 357 | int status; |
| 353 | int i; | ||
| 354 | |||
| 355 | 358 | ||
| 356 | dev_dbg(&dev->dev, | 359 | dev_dbg(&dev->dev, |
| 357 | "%s - product 0x%4X, num configurations %d, configuration value %d", | 360 | "%s - product 0x%4X, num configurations %d, configuration value %d", |
| @@ -399,42 +402,8 @@ static int ti_startup(struct usb_serial *serial) | |||
| 399 | goto free_tdev; | 402 | goto free_tdev; |
| 400 | } | 403 | } |
| 401 | 404 | ||
| 402 | /* set up port structures */ | ||
| 403 | for (i = 0; i < serial->num_ports; ++i) { | ||
| 404 | tport = kzalloc(sizeof(struct ti_port), GFP_KERNEL); | ||
| 405 | if (tport == NULL) { | ||
| 406 | dev_err(&dev->dev, "%s - out of memory\n", __func__); | ||
| 407 | status = -ENOMEM; | ||
| 408 | goto free_tports; | ||
| 409 | } | ||
| 410 | spin_lock_init(&tport->tp_lock); | ||
| 411 | tport->tp_uart_base_addr = (i == 0 ? | ||
| 412 | TI_UART1_BASE_ADDR : TI_UART2_BASE_ADDR); | ||
| 413 | tport->tp_closing_wait = closing_wait; | ||
| 414 | init_waitqueue_head(&tport->tp_msr_wait); | ||
| 415 | init_waitqueue_head(&tport->tp_write_wait); | ||
| 416 | if (kfifo_alloc(&tport->write_fifo, TI_WRITE_BUF_SIZE, | ||
| 417 | GFP_KERNEL)) { | ||
| 418 | dev_err(&dev->dev, "%s - out of memory\n", __func__); | ||
| 419 | kfree(tport); | ||
| 420 | status = -ENOMEM; | ||
| 421 | goto free_tports; | ||
| 422 | } | ||
| 423 | tport->tp_port = serial->port[i]; | ||
| 424 | tport->tp_tdev = tdev; | ||
| 425 | usb_set_serial_port_data(serial->port[i], tport); | ||
| 426 | tport->tp_uart_mode = 0; /* default is RS232 */ | ||
| 427 | } | ||
| 428 | |||
| 429 | return 0; | 405 | return 0; |
| 430 | 406 | ||
| 431 | free_tports: | ||
| 432 | for (--i; i >= 0; --i) { | ||
| 433 | tport = usb_get_serial_port_data(serial->port[i]); | ||
| 434 | kfifo_free(&tport->write_fifo); | ||
| 435 | kfree(tport); | ||
| 436 | usb_set_serial_port_data(serial->port[i], NULL); | ||
| 437 | } | ||
| 438 | free_tdev: | 407 | free_tdev: |
| 439 | kfree(tdev); | 408 | kfree(tdev); |
| 440 | usb_set_serial_data(serial, NULL); | 409 | usb_set_serial_data(serial, NULL); |
| @@ -444,21 +413,50 @@ free_tdev: | |||
| 444 | 413 | ||
| 445 | static void ti_release(struct usb_serial *serial) | 414 | static void ti_release(struct usb_serial *serial) |
| 446 | { | 415 | { |
| 447 | int i; | ||
| 448 | struct ti_device *tdev = usb_get_serial_data(serial); | 416 | struct ti_device *tdev = usb_get_serial_data(serial); |
| 417 | |||
| 418 | kfree(tdev); | ||
| 419 | } | ||
| 420 | |||
| 421 | static int ti_port_probe(struct usb_serial_port *port) | ||
| 422 | { | ||
| 449 | struct ti_port *tport; | 423 | struct ti_port *tport; |
| 450 | 424 | ||
| 451 | for (i = 0; i < serial->num_ports; ++i) { | 425 | tport = kzalloc(sizeof(*tport), GFP_KERNEL); |
| 452 | tport = usb_get_serial_port_data(serial->port[i]); | 426 | if (!tport) |
| 453 | if (tport) { | 427 | return -ENOMEM; |
| 454 | kfifo_free(&tport->write_fifo); | 428 | |
| 455 | kfree(tport); | 429 | spin_lock_init(&tport->tp_lock); |
| 456 | } | 430 | if (port == port->serial->port[0]) |
| 431 | tport->tp_uart_base_addr = TI_UART1_BASE_ADDR; | ||
| 432 | else | ||
| 433 | tport->tp_uart_base_addr = TI_UART2_BASE_ADDR; | ||
| 434 | tport->tp_closing_wait = closing_wait; | ||
| 435 | init_waitqueue_head(&tport->tp_msr_wait); | ||
| 436 | init_waitqueue_head(&tport->tp_write_wait); | ||
| 437 | if (kfifo_alloc(&tport->write_fifo, TI_WRITE_BUF_SIZE, GFP_KERNEL)) { | ||
| 438 | kfree(tport); | ||
| 439 | return -ENOMEM; | ||
| 457 | } | 440 | } |
| 441 | tport->tp_port = port; | ||
| 442 | tport->tp_tdev = usb_get_serial_data(port->serial); | ||
| 443 | tport->tp_uart_mode = 0; /* default is RS232 */ | ||
| 458 | 444 | ||
| 459 | kfree(tdev); | 445 | usb_set_serial_port_data(port, tport); |
| 446 | |||
| 447 | return 0; | ||
| 460 | } | 448 | } |
| 461 | 449 | ||
| 450 | static int ti_port_remove(struct usb_serial_port *port) | ||
| 451 | { | ||
| 452 | struct ti_port *tport; | ||
| 453 | |||
| 454 | tport = usb_get_serial_port_data(port); | ||
| 455 | kfifo_free(&tport->write_fifo); | ||
| 456 | kfree(tport); | ||
| 457 | |||
| 458 | return 0; | ||
| 459 | } | ||
| 462 | 460 | ||
| 463 | static int ti_open(struct tty_struct *tty, struct usb_serial_port *port) | 461 | static int ti_open(struct tty_struct *tty, struct usb_serial_port *port) |
| 464 | { | 462 | { |
diff --git a/include/linux/usb.h b/include/linux/usb.h index 07915a32fb9d..10278d18709c 100644 --- a/include/linux/usb.h +++ b/include/linux/usb.h | |||
| @@ -1778,17 +1778,6 @@ static inline int usb_translate_errors(int error_code) | |||
| 1778 | extern void usb_register_notify(struct notifier_block *nb); | 1778 | extern void usb_register_notify(struct notifier_block *nb); |
| 1779 | extern void usb_unregister_notify(struct notifier_block *nb); | 1779 | extern void usb_unregister_notify(struct notifier_block *nb); |
| 1780 | 1780 | ||
| 1781 | #ifdef DEBUG | ||
| 1782 | #define dbg(format, arg...) \ | ||
| 1783 | printk(KERN_DEBUG "%s: " format "\n", __FILE__, ##arg) | ||
| 1784 | #else | ||
| 1785 | #define dbg(format, arg...) \ | ||
| 1786 | do { \ | ||
| 1787 | if (0) \ | ||
| 1788 | printk(KERN_DEBUG "%s: " format "\n", __FILE__, ##arg); \ | ||
| 1789 | } while (0) | ||
| 1790 | #endif | ||
| 1791 | |||
| 1792 | /* debugfs stuff */ | 1781 | /* debugfs stuff */ |
| 1793 | extern struct dentry *usb_debug_root; | 1782 | extern struct dentry *usb_debug_root; |
| 1794 | 1783 | ||
diff --git a/include/linux/usb/Kbuild b/include/linux/usb/Kbuild index b607f3532e88..e69de29bb2d1 100644 --- a/include/linux/usb/Kbuild +++ b/include/linux/usb/Kbuild | |||
| @@ -1,10 +0,0 @@ | |||
| 1 | header-y += audio.h | ||
| 2 | header-y += cdc.h | ||
| 3 | header-y += ch9.h | ||
| 4 | header-y += ch11.h | ||
| 5 | header-y += functionfs.h | ||
| 6 | header-y += gadgetfs.h | ||
| 7 | header-y += midi.h | ||
| 8 | header-y += g_printer.h | ||
| 9 | header-y += tmc.h | ||
| 10 | header-y += video.h | ||
diff --git a/include/linux/usb/audio.h b/include/linux/usb/audio.h index a54b8255d75f..3d84619110a4 100644 --- a/include/linux/usb/audio.h +++ b/include/linux/usb/audio.h | |||
| @@ -17,531 +17,11 @@ | |||
| 17 | * Types and defines in this file are either specific to version 1.0 of | 17 | * Types and defines in this file are either specific to version 1.0 of |
| 18 | * this standard or common for newer versions. | 18 | * this standard or common for newer versions. |
| 19 | */ | 19 | */ |
| 20 | |||
| 21 | #ifndef __LINUX_USB_AUDIO_H | 20 | #ifndef __LINUX_USB_AUDIO_H |
| 22 | #define __LINUX_USB_AUDIO_H | 21 | #define __LINUX_USB_AUDIO_H |
| 23 | 22 | ||
| 24 | #include <linux/types.h> | 23 | #include <uapi/linux/usb/audio.h> |
| 25 | |||
| 26 | /* bInterfaceProtocol values to denote the version of the standard used */ | ||
| 27 | #define UAC_VERSION_1 0x00 | ||
| 28 | #define UAC_VERSION_2 0x20 | ||
| 29 | |||
| 30 | /* A.2 Audio Interface Subclass Codes */ | ||
| 31 | #define USB_SUBCLASS_AUDIOCONTROL 0x01 | ||
| 32 | #define USB_SUBCLASS_AUDIOSTREAMING 0x02 | ||
| 33 | #define USB_SUBCLASS_MIDISTREAMING 0x03 | ||
| 34 | |||
| 35 | /* A.5 Audio Class-Specific AC Interface Descriptor Subtypes */ | ||
| 36 | #define UAC_HEADER 0x01 | ||
| 37 | #define UAC_INPUT_TERMINAL 0x02 | ||
| 38 | #define UAC_OUTPUT_TERMINAL 0x03 | ||
| 39 | #define UAC_MIXER_UNIT 0x04 | ||
| 40 | #define UAC_SELECTOR_UNIT 0x05 | ||
| 41 | #define UAC_FEATURE_UNIT 0x06 | ||
| 42 | #define UAC1_PROCESSING_UNIT 0x07 | ||
| 43 | #define UAC1_EXTENSION_UNIT 0x08 | ||
| 44 | |||
| 45 | /* A.6 Audio Class-Specific AS Interface Descriptor Subtypes */ | ||
| 46 | #define UAC_AS_GENERAL 0x01 | ||
| 47 | #define UAC_FORMAT_TYPE 0x02 | ||
| 48 | #define UAC_FORMAT_SPECIFIC 0x03 | ||
| 49 | |||
| 50 | /* A.7 Processing Unit Process Types */ | ||
| 51 | #define UAC_PROCESS_UNDEFINED 0x00 | ||
| 52 | #define UAC_PROCESS_UP_DOWNMIX 0x01 | ||
| 53 | #define UAC_PROCESS_DOLBY_PROLOGIC 0x02 | ||
| 54 | #define UAC_PROCESS_STEREO_EXTENDER 0x03 | ||
| 55 | #define UAC_PROCESS_REVERB 0x04 | ||
| 56 | #define UAC_PROCESS_CHORUS 0x05 | ||
| 57 | #define UAC_PROCESS_DYN_RANGE_COMP 0x06 | ||
| 58 | |||
| 59 | /* A.8 Audio Class-Specific Endpoint Descriptor Subtypes */ | ||
| 60 | #define UAC_EP_GENERAL 0x01 | ||
| 61 | |||
| 62 | /* A.9 Audio Class-Specific Request Codes */ | ||
| 63 | #define UAC_SET_ 0x00 | ||
| 64 | #define UAC_GET_ 0x80 | ||
| 65 | |||
| 66 | #define UAC__CUR 0x1 | ||
| 67 | #define UAC__MIN 0x2 | ||
| 68 | #define UAC__MAX 0x3 | ||
| 69 | #define UAC__RES 0x4 | ||
| 70 | #define UAC__MEM 0x5 | ||
| 71 | |||
| 72 | #define UAC_SET_CUR (UAC_SET_ | UAC__CUR) | ||
| 73 | #define UAC_GET_CUR (UAC_GET_ | UAC__CUR) | ||
| 74 | #define UAC_SET_MIN (UAC_SET_ | UAC__MIN) | ||
| 75 | #define UAC_GET_MIN (UAC_GET_ | UAC__MIN) | ||
| 76 | #define UAC_SET_MAX (UAC_SET_ | UAC__MAX) | ||
| 77 | #define UAC_GET_MAX (UAC_GET_ | UAC__MAX) | ||
| 78 | #define UAC_SET_RES (UAC_SET_ | UAC__RES) | ||
| 79 | #define UAC_GET_RES (UAC_GET_ | UAC__RES) | ||
| 80 | #define UAC_SET_MEM (UAC_SET_ | UAC__MEM) | ||
| 81 | #define UAC_GET_MEM (UAC_GET_ | UAC__MEM) | ||
| 82 | |||
| 83 | #define UAC_GET_STAT 0xff | ||
| 84 | |||
| 85 | /* A.10 Control Selector Codes */ | ||
| 86 | |||
| 87 | /* A.10.1 Terminal Control Selectors */ | ||
| 88 | #define UAC_TERM_COPY_PROTECT 0x01 | ||
| 89 | |||
| 90 | /* A.10.2 Feature Unit Control Selectors */ | ||
| 91 | #define UAC_FU_MUTE 0x01 | ||
| 92 | #define UAC_FU_VOLUME 0x02 | ||
| 93 | #define UAC_FU_BASS 0x03 | ||
| 94 | #define UAC_FU_MID 0x04 | ||
| 95 | #define UAC_FU_TREBLE 0x05 | ||
| 96 | #define UAC_FU_GRAPHIC_EQUALIZER 0x06 | ||
| 97 | #define UAC_FU_AUTOMATIC_GAIN 0x07 | ||
| 98 | #define UAC_FU_DELAY 0x08 | ||
| 99 | #define UAC_FU_BASS_BOOST 0x09 | ||
| 100 | #define UAC_FU_LOUDNESS 0x0a | ||
| 101 | |||
| 102 | #define UAC_CONTROL_BIT(CS) (1 << ((CS) - 1)) | ||
| 103 | |||
| 104 | /* A.10.3.1 Up/Down-mix Processing Unit Controls Selectors */ | ||
| 105 | #define UAC_UD_ENABLE 0x01 | ||
| 106 | #define UAC_UD_MODE_SELECT 0x02 | ||
| 107 | |||
| 108 | /* A.10.3.2 Dolby Prologic (tm) Processing Unit Controls Selectors */ | ||
| 109 | #define UAC_DP_ENABLE 0x01 | ||
| 110 | #define UAC_DP_MODE_SELECT 0x02 | ||
| 111 | |||
| 112 | /* A.10.3.3 3D Stereo Extender Processing Unit Control Selectors */ | ||
| 113 | #define UAC_3D_ENABLE 0x01 | ||
| 114 | #define UAC_3D_SPACE 0x02 | ||
| 115 | |||
| 116 | /* A.10.3.4 Reverberation Processing Unit Control Selectors */ | ||
| 117 | #define UAC_REVERB_ENABLE 0x01 | ||
| 118 | #define UAC_REVERB_LEVEL 0x02 | ||
| 119 | #define UAC_REVERB_TIME 0x03 | ||
| 120 | #define UAC_REVERB_FEEDBACK 0x04 | ||
| 121 | |||
| 122 | /* A.10.3.5 Chorus Processing Unit Control Selectors */ | ||
| 123 | #define UAC_CHORUS_ENABLE 0x01 | ||
| 124 | #define UAC_CHORUS_LEVEL 0x02 | ||
| 125 | #define UAC_CHORUS_RATE 0x03 | ||
| 126 | #define UAC_CHORUS_DEPTH 0x04 | ||
| 127 | |||
| 128 | /* A.10.3.6 Dynamic Range Compressor Unit Control Selectors */ | ||
| 129 | #define UAC_DCR_ENABLE 0x01 | ||
| 130 | #define UAC_DCR_RATE 0x02 | ||
| 131 | #define UAC_DCR_MAXAMPL 0x03 | ||
| 132 | #define UAC_DCR_THRESHOLD 0x04 | ||
| 133 | #define UAC_DCR_ATTACK_TIME 0x05 | ||
| 134 | #define UAC_DCR_RELEASE_TIME 0x06 | ||
| 135 | |||
| 136 | /* A.10.4 Extension Unit Control Selectors */ | ||
| 137 | #define UAC_XU_ENABLE 0x01 | ||
| 138 | |||
| 139 | /* MIDI - A.1 MS Class-Specific Interface Descriptor Subtypes */ | ||
| 140 | #define UAC_MS_HEADER 0x01 | ||
| 141 | #define UAC_MIDI_IN_JACK 0x02 | ||
| 142 | #define UAC_MIDI_OUT_JACK 0x03 | ||
| 143 | |||
| 144 | /* MIDI - A.1 MS Class-Specific Endpoint Descriptor Subtypes */ | ||
| 145 | #define UAC_MS_GENERAL 0x01 | ||
| 146 | |||
| 147 | /* Terminals - 2.1 USB Terminal Types */ | ||
| 148 | #define UAC_TERMINAL_UNDEFINED 0x100 | ||
| 149 | #define UAC_TERMINAL_STREAMING 0x101 | ||
| 150 | #define UAC_TERMINAL_VENDOR_SPEC 0x1FF | ||
| 151 | |||
| 152 | /* Terminal Control Selectors */ | ||
| 153 | /* 4.3.2 Class-Specific AC Interface Descriptor */ | ||
| 154 | struct uac1_ac_header_descriptor { | ||
| 155 | __u8 bLength; /* 8 + n */ | ||
| 156 | __u8 bDescriptorType; /* USB_DT_CS_INTERFACE */ | ||
| 157 | __u8 bDescriptorSubtype; /* UAC_MS_HEADER */ | ||
| 158 | __le16 bcdADC; /* 0x0100 */ | ||
| 159 | __le16 wTotalLength; /* includes Unit and Terminal desc. */ | ||
| 160 | __u8 bInCollection; /* n */ | ||
| 161 | __u8 baInterfaceNr[]; /* [n] */ | ||
| 162 | } __attribute__ ((packed)); | ||
| 163 | |||
| 164 | #define UAC_DT_AC_HEADER_SIZE(n) (8 + (n)) | ||
| 165 | |||
| 166 | /* As above, but more useful for defining your own descriptors: */ | ||
| 167 | #define DECLARE_UAC_AC_HEADER_DESCRIPTOR(n) \ | ||
| 168 | struct uac1_ac_header_descriptor_##n { \ | ||
| 169 | __u8 bLength; \ | ||
| 170 | __u8 bDescriptorType; \ | ||
| 171 | __u8 bDescriptorSubtype; \ | ||
| 172 | __le16 bcdADC; \ | ||
| 173 | __le16 wTotalLength; \ | ||
| 174 | __u8 bInCollection; \ | ||
| 175 | __u8 baInterfaceNr[n]; \ | ||
| 176 | } __attribute__ ((packed)) | ||
| 177 | |||
| 178 | /* 4.3.2.1 Input Terminal Descriptor */ | ||
| 179 | struct uac_input_terminal_descriptor { | ||
| 180 | __u8 bLength; /* in bytes: 12 */ | ||
| 181 | __u8 bDescriptorType; /* CS_INTERFACE descriptor type */ | ||
| 182 | __u8 bDescriptorSubtype; /* INPUT_TERMINAL descriptor subtype */ | ||
| 183 | __u8 bTerminalID; /* Constant uniquely terminal ID */ | ||
| 184 | __le16 wTerminalType; /* USB Audio Terminal Types */ | ||
| 185 | __u8 bAssocTerminal; /* ID of the Output Terminal associated */ | ||
| 186 | __u8 bNrChannels; /* Number of logical output channels */ | ||
| 187 | __le16 wChannelConfig; | ||
| 188 | __u8 iChannelNames; | ||
| 189 | __u8 iTerminal; | ||
| 190 | } __attribute__ ((packed)); | ||
| 191 | |||
| 192 | #define UAC_DT_INPUT_TERMINAL_SIZE 12 | ||
| 193 | |||
| 194 | /* Terminals - 2.2 Input Terminal Types */ | ||
| 195 | #define UAC_INPUT_TERMINAL_UNDEFINED 0x200 | ||
| 196 | #define UAC_INPUT_TERMINAL_MICROPHONE 0x201 | ||
| 197 | #define UAC_INPUT_TERMINAL_DESKTOP_MICROPHONE 0x202 | ||
| 198 | #define UAC_INPUT_TERMINAL_PERSONAL_MICROPHONE 0x203 | ||
| 199 | #define UAC_INPUT_TERMINAL_OMNI_DIR_MICROPHONE 0x204 | ||
| 200 | #define UAC_INPUT_TERMINAL_MICROPHONE_ARRAY 0x205 | ||
| 201 | #define UAC_INPUT_TERMINAL_PROC_MICROPHONE_ARRAY 0x206 | ||
| 202 | |||
| 203 | /* Terminals - control selectors */ | ||
| 204 | |||
| 205 | #define UAC_TERMINAL_CS_COPY_PROTECT_CONTROL 0x01 | ||
| 206 | |||
| 207 | /* 4.3.2.2 Output Terminal Descriptor */ | ||
| 208 | struct uac1_output_terminal_descriptor { | ||
| 209 | __u8 bLength; /* in bytes: 9 */ | ||
| 210 | __u8 bDescriptorType; /* CS_INTERFACE descriptor type */ | ||
| 211 | __u8 bDescriptorSubtype; /* OUTPUT_TERMINAL descriptor subtype */ | ||
| 212 | __u8 bTerminalID; /* Constant uniquely terminal ID */ | ||
| 213 | __le16 wTerminalType; /* USB Audio Terminal Types */ | ||
| 214 | __u8 bAssocTerminal; /* ID of the Input Terminal associated */ | ||
| 215 | __u8 bSourceID; /* ID of the connected Unit or Terminal*/ | ||
| 216 | __u8 iTerminal; | ||
| 217 | } __attribute__ ((packed)); | ||
| 218 | |||
| 219 | #define UAC_DT_OUTPUT_TERMINAL_SIZE 9 | ||
| 220 | |||
| 221 | /* Terminals - 2.3 Output Terminal Types */ | ||
| 222 | #define UAC_OUTPUT_TERMINAL_UNDEFINED 0x300 | ||
| 223 | #define UAC_OUTPUT_TERMINAL_SPEAKER 0x301 | ||
| 224 | #define UAC_OUTPUT_TERMINAL_HEADPHONES 0x302 | ||
| 225 | #define UAC_OUTPUT_TERMINAL_HEAD_MOUNTED_DISPLAY_AUDIO 0x303 | ||
| 226 | #define UAC_OUTPUT_TERMINAL_DESKTOP_SPEAKER 0x304 | ||
| 227 | #define UAC_OUTPUT_TERMINAL_ROOM_SPEAKER 0x305 | ||
| 228 | #define UAC_OUTPUT_TERMINAL_COMMUNICATION_SPEAKER 0x306 | ||
| 229 | #define UAC_OUTPUT_TERMINAL_LOW_FREQ_EFFECTS_SPEAKER 0x307 | ||
| 230 | |||
| 231 | /* Set bControlSize = 2 as default setting */ | ||
| 232 | #define UAC_DT_FEATURE_UNIT_SIZE(ch) (7 + ((ch) + 1) * 2) | ||
| 233 | |||
| 234 | /* As above, but more useful for defining your own descriptors: */ | ||
| 235 | #define DECLARE_UAC_FEATURE_UNIT_DESCRIPTOR(ch) \ | ||
| 236 | struct uac_feature_unit_descriptor_##ch { \ | ||
| 237 | __u8 bLength; \ | ||
| 238 | __u8 bDescriptorType; \ | ||
| 239 | __u8 bDescriptorSubtype; \ | ||
| 240 | __u8 bUnitID; \ | ||
| 241 | __u8 bSourceID; \ | ||
| 242 | __u8 bControlSize; \ | ||
| 243 | __le16 bmaControls[ch + 1]; \ | ||
| 244 | __u8 iFeature; \ | ||
| 245 | } __attribute__ ((packed)) | ||
| 246 | |||
| 247 | /* 4.3.2.3 Mixer Unit Descriptor */ | ||
| 248 | struct uac_mixer_unit_descriptor { | ||
| 249 | __u8 bLength; | ||
| 250 | __u8 bDescriptorType; | ||
| 251 | __u8 bDescriptorSubtype; | ||
| 252 | __u8 bUnitID; | ||
| 253 | __u8 bNrInPins; | ||
| 254 | __u8 baSourceID[]; | ||
| 255 | } __attribute__ ((packed)); | ||
| 256 | 24 | ||
| 257 | static inline __u8 uac_mixer_unit_bNrChannels(struct uac_mixer_unit_descriptor *desc) | ||
| 258 | { | ||
| 259 | return desc->baSourceID[desc->bNrInPins]; | ||
| 260 | } | ||
| 261 | |||
| 262 | static inline __u32 uac_mixer_unit_wChannelConfig(struct uac_mixer_unit_descriptor *desc, | ||
| 263 | int protocol) | ||
| 264 | { | ||
| 265 | if (protocol == UAC_VERSION_1) | ||
| 266 | return (desc->baSourceID[desc->bNrInPins + 2] << 8) | | ||
| 267 | desc->baSourceID[desc->bNrInPins + 1]; | ||
| 268 | else | ||
| 269 | return (desc->baSourceID[desc->bNrInPins + 4] << 24) | | ||
| 270 | (desc->baSourceID[desc->bNrInPins + 3] << 16) | | ||
| 271 | (desc->baSourceID[desc->bNrInPins + 2] << 8) | | ||
| 272 | (desc->baSourceID[desc->bNrInPins + 1]); | ||
| 273 | } | ||
| 274 | |||
| 275 | static inline __u8 uac_mixer_unit_iChannelNames(struct uac_mixer_unit_descriptor *desc, | ||
| 276 | int protocol) | ||
| 277 | { | ||
| 278 | return (protocol == UAC_VERSION_1) ? | ||
| 279 | desc->baSourceID[desc->bNrInPins + 3] : | ||
| 280 | desc->baSourceID[desc->bNrInPins + 5]; | ||
| 281 | } | ||
| 282 | |||
| 283 | static inline __u8 *uac_mixer_unit_bmControls(struct uac_mixer_unit_descriptor *desc, | ||
| 284 | int protocol) | ||
| 285 | { | ||
| 286 | return (protocol == UAC_VERSION_1) ? | ||
| 287 | &desc->baSourceID[desc->bNrInPins + 4] : | ||
| 288 | &desc->baSourceID[desc->bNrInPins + 6]; | ||
| 289 | } | ||
| 290 | |||
| 291 | static inline __u8 uac_mixer_unit_iMixer(struct uac_mixer_unit_descriptor *desc) | ||
| 292 | { | ||
| 293 | __u8 *raw = (__u8 *) desc; | ||
| 294 | return raw[desc->bLength - 1]; | ||
| 295 | } | ||
| 296 | |||
| 297 | /* 4.3.2.4 Selector Unit Descriptor */ | ||
| 298 | struct uac_selector_unit_descriptor { | ||
| 299 | __u8 bLength; | ||
| 300 | __u8 bDescriptorType; | ||
| 301 | __u8 bDescriptorSubtype; | ||
| 302 | __u8 bUintID; | ||
| 303 | __u8 bNrInPins; | ||
| 304 | __u8 baSourceID[]; | ||
| 305 | } __attribute__ ((packed)); | ||
| 306 | |||
| 307 | static inline __u8 uac_selector_unit_iSelector(struct uac_selector_unit_descriptor *desc) | ||
| 308 | { | ||
| 309 | __u8 *raw = (__u8 *) desc; | ||
| 310 | return raw[desc->bLength - 1]; | ||
| 311 | } | ||
| 312 | |||
| 313 | /* 4.3.2.5 Feature Unit Descriptor */ | ||
| 314 | struct uac_feature_unit_descriptor { | ||
| 315 | __u8 bLength; | ||
| 316 | __u8 bDescriptorType; | ||
| 317 | __u8 bDescriptorSubtype; | ||
| 318 | __u8 bUnitID; | ||
| 319 | __u8 bSourceID; | ||
| 320 | __u8 bControlSize; | ||
| 321 | __u8 bmaControls[0]; /* variable length */ | ||
| 322 | } __attribute__((packed)); | ||
| 323 | |||
| 324 | static inline __u8 uac_feature_unit_iFeature(struct uac_feature_unit_descriptor *desc) | ||
| 325 | { | ||
| 326 | __u8 *raw = (__u8 *) desc; | ||
| 327 | return raw[desc->bLength - 1]; | ||
| 328 | } | ||
| 329 | |||
| 330 | /* 4.3.2.6 Processing Unit Descriptors */ | ||
| 331 | struct uac_processing_unit_descriptor { | ||
| 332 | __u8 bLength; | ||
| 333 | __u8 bDescriptorType; | ||
| 334 | __u8 bDescriptorSubtype; | ||
| 335 | __u8 bUnitID; | ||
| 336 | __u16 wProcessType; | ||
| 337 | __u8 bNrInPins; | ||
| 338 | __u8 baSourceID[]; | ||
| 339 | } __attribute__ ((packed)); | ||
| 340 | |||
| 341 | static inline __u8 uac_processing_unit_bNrChannels(struct uac_processing_unit_descriptor *desc) | ||
| 342 | { | ||
| 343 | return desc->baSourceID[desc->bNrInPins]; | ||
| 344 | } | ||
| 345 | |||
| 346 | static inline __u32 uac_processing_unit_wChannelConfig(struct uac_processing_unit_descriptor *desc, | ||
| 347 | int protocol) | ||
| 348 | { | ||
| 349 | if (protocol == UAC_VERSION_1) | ||
| 350 | return (desc->baSourceID[desc->bNrInPins + 2] << 8) | | ||
| 351 | desc->baSourceID[desc->bNrInPins + 1]; | ||
| 352 | else | ||
| 353 | return (desc->baSourceID[desc->bNrInPins + 4] << 24) | | ||
| 354 | (desc->baSourceID[desc->bNrInPins + 3] << 16) | | ||
| 355 | (desc->baSourceID[desc->bNrInPins + 2] << 8) | | ||
| 356 | (desc->baSourceID[desc->bNrInPins + 1]); | ||
| 357 | } | ||
| 358 | |||
| 359 | static inline __u8 uac_processing_unit_iChannelNames(struct uac_processing_unit_descriptor *desc, | ||
| 360 | int protocol) | ||
| 361 | { | ||
| 362 | return (protocol == UAC_VERSION_1) ? | ||
| 363 | desc->baSourceID[desc->bNrInPins + 3] : | ||
| 364 | desc->baSourceID[desc->bNrInPins + 5]; | ||
| 365 | } | ||
| 366 | |||
| 367 | static inline __u8 uac_processing_unit_bControlSize(struct uac_processing_unit_descriptor *desc, | ||
| 368 | int protocol) | ||
| 369 | { | ||
| 370 | return (protocol == UAC_VERSION_1) ? | ||
| 371 | desc->baSourceID[desc->bNrInPins + 4] : | ||
| 372 | desc->baSourceID[desc->bNrInPins + 6]; | ||
| 373 | } | ||
| 374 | |||
| 375 | static inline __u8 *uac_processing_unit_bmControls(struct uac_processing_unit_descriptor *desc, | ||
| 376 | int protocol) | ||
| 377 | { | ||
| 378 | return (protocol == UAC_VERSION_1) ? | ||
| 379 | &desc->baSourceID[desc->bNrInPins + 5] : | ||
| 380 | &desc->baSourceID[desc->bNrInPins + 7]; | ||
| 381 | } | ||
| 382 | |||
| 383 | static inline __u8 uac_processing_unit_iProcessing(struct uac_processing_unit_descriptor *desc, | ||
| 384 | int protocol) | ||
| 385 | { | ||
| 386 | __u8 control_size = uac_processing_unit_bControlSize(desc, protocol); | ||
| 387 | return desc->baSourceID[desc->bNrInPins + control_size]; | ||
| 388 | } | ||
| 389 | |||
| 390 | static inline __u8 *uac_processing_unit_specific(struct uac_processing_unit_descriptor *desc, | ||
| 391 | int protocol) | ||
| 392 | { | ||
| 393 | __u8 control_size = uac_processing_unit_bControlSize(desc, protocol); | ||
| 394 | return &desc->baSourceID[desc->bNrInPins + control_size + 1]; | ||
| 395 | } | ||
| 396 | |||
| 397 | /* 4.5.2 Class-Specific AS Interface Descriptor */ | ||
| 398 | struct uac1_as_header_descriptor { | ||
| 399 | __u8 bLength; /* in bytes: 7 */ | ||
| 400 | __u8 bDescriptorType; /* USB_DT_CS_INTERFACE */ | ||
| 401 | __u8 bDescriptorSubtype; /* AS_GENERAL */ | ||
| 402 | __u8 bTerminalLink; /* Terminal ID of connected Terminal */ | ||
| 403 | __u8 bDelay; /* Delay introduced by the data path */ | ||
| 404 | __le16 wFormatTag; /* The Audio Data Format */ | ||
| 405 | } __attribute__ ((packed)); | ||
| 406 | |||
| 407 | #define UAC_DT_AS_HEADER_SIZE 7 | ||
| 408 | |||
| 409 | /* Formats - A.1.1 Audio Data Format Type I Codes */ | ||
| 410 | #define UAC_FORMAT_TYPE_I_UNDEFINED 0x0 | ||
| 411 | #define UAC_FORMAT_TYPE_I_PCM 0x1 | ||
| 412 | #define UAC_FORMAT_TYPE_I_PCM8 0x2 | ||
| 413 | #define UAC_FORMAT_TYPE_I_IEEE_FLOAT 0x3 | ||
| 414 | #define UAC_FORMAT_TYPE_I_ALAW 0x4 | ||
| 415 | #define UAC_FORMAT_TYPE_I_MULAW 0x5 | ||
| 416 | |||
| 417 | struct uac_format_type_i_continuous_descriptor { | ||
| 418 | __u8 bLength; /* in bytes: 8 + (ns * 3) */ | ||
| 419 | __u8 bDescriptorType; /* USB_DT_CS_INTERFACE */ | ||
| 420 | __u8 bDescriptorSubtype; /* FORMAT_TYPE */ | ||
| 421 | __u8 bFormatType; /* FORMAT_TYPE_1 */ | ||
| 422 | __u8 bNrChannels; /* physical channels in the stream */ | ||
| 423 | __u8 bSubframeSize; /* */ | ||
| 424 | __u8 bBitResolution; | ||
| 425 | __u8 bSamFreqType; | ||
| 426 | __u8 tLowerSamFreq[3]; | ||
| 427 | __u8 tUpperSamFreq[3]; | ||
| 428 | } __attribute__ ((packed)); | ||
| 429 | |||
| 430 | #define UAC_FORMAT_TYPE_I_CONTINUOUS_DESC_SIZE 14 | ||
| 431 | |||
| 432 | struct uac_format_type_i_discrete_descriptor { | ||
| 433 | __u8 bLength; /* in bytes: 8 + (ns * 3) */ | ||
| 434 | __u8 bDescriptorType; /* USB_DT_CS_INTERFACE */ | ||
| 435 | __u8 bDescriptorSubtype; /* FORMAT_TYPE */ | ||
| 436 | __u8 bFormatType; /* FORMAT_TYPE_1 */ | ||
| 437 | __u8 bNrChannels; /* physical channels in the stream */ | ||
| 438 | __u8 bSubframeSize; /* */ | ||
| 439 | __u8 bBitResolution; | ||
| 440 | __u8 bSamFreqType; | ||
| 441 | __u8 tSamFreq[][3]; | ||
| 442 | } __attribute__ ((packed)); | ||
| 443 | |||
| 444 | #define DECLARE_UAC_FORMAT_TYPE_I_DISCRETE_DESC(n) \ | ||
| 445 | struct uac_format_type_i_discrete_descriptor_##n { \ | ||
| 446 | __u8 bLength; \ | ||
| 447 | __u8 bDescriptorType; \ | ||
| 448 | __u8 bDescriptorSubtype; \ | ||
| 449 | __u8 bFormatType; \ | ||
| 450 | __u8 bNrChannels; \ | ||
| 451 | __u8 bSubframeSize; \ | ||
| 452 | __u8 bBitResolution; \ | ||
| 453 | __u8 bSamFreqType; \ | ||
| 454 | __u8 tSamFreq[n][3]; \ | ||
| 455 | } __attribute__ ((packed)) | ||
| 456 | |||
| 457 | #define UAC_FORMAT_TYPE_I_DISCRETE_DESC_SIZE(n) (8 + (n * 3)) | ||
| 458 | |||
| 459 | struct uac_format_type_i_ext_descriptor { | ||
| 460 | __u8 bLength; | ||
| 461 | __u8 bDescriptorType; | ||
| 462 | __u8 bDescriptorSubtype; | ||
| 463 | __u8 bFormatType; | ||
| 464 | __u8 bSubslotSize; | ||
| 465 | __u8 bBitResolution; | ||
| 466 | __u8 bHeaderLength; | ||
| 467 | __u8 bControlSize; | ||
| 468 | __u8 bSideBandProtocol; | ||
| 469 | } __attribute__((packed)); | ||
| 470 | |||
| 471 | /* Formats - Audio Data Format Type I Codes */ | ||
| 472 | |||
| 473 | #define UAC_FORMAT_TYPE_II_MPEG 0x1001 | ||
| 474 | #define UAC_FORMAT_TYPE_II_AC3 0x1002 | ||
| 475 | |||
| 476 | struct uac_format_type_ii_discrete_descriptor { | ||
| 477 | __u8 bLength; | ||
| 478 | __u8 bDescriptorType; | ||
| 479 | __u8 bDescriptorSubtype; | ||
| 480 | __u8 bFormatType; | ||
| 481 | __le16 wMaxBitRate; | ||
| 482 | __le16 wSamplesPerFrame; | ||
| 483 | __u8 bSamFreqType; | ||
| 484 | __u8 tSamFreq[][3]; | ||
| 485 | } __attribute__((packed)); | ||
| 486 | |||
| 487 | struct uac_format_type_ii_ext_descriptor { | ||
| 488 | __u8 bLength; | ||
| 489 | __u8 bDescriptorType; | ||
| 490 | __u8 bDescriptorSubtype; | ||
| 491 | __u8 bFormatType; | ||
| 492 | __u16 wMaxBitRate; | ||
| 493 | __u16 wSamplesPerFrame; | ||
| 494 | __u8 bHeaderLength; | ||
| 495 | __u8 bSideBandProtocol; | ||
| 496 | } __attribute__((packed)); | ||
| 497 | |||
| 498 | /* type III */ | ||
| 499 | #define UAC_FORMAT_TYPE_III_IEC1937_AC3 0x2001 | ||
| 500 | #define UAC_FORMAT_TYPE_III_IEC1937_MPEG1_LAYER1 0x2002 | ||
| 501 | #define UAC_FORMAT_TYPE_III_IEC1937_MPEG2_NOEXT 0x2003 | ||
| 502 | #define UAC_FORMAT_TYPE_III_IEC1937_MPEG2_EXT 0x2004 | ||
| 503 | #define UAC_FORMAT_TYPE_III_IEC1937_MPEG2_LAYER1_LS 0x2005 | ||
| 504 | #define UAC_FORMAT_TYPE_III_IEC1937_MPEG2_LAYER23_LS 0x2006 | ||
| 505 | |||
| 506 | /* Formats - A.2 Format Type Codes */ | ||
| 507 | #define UAC_FORMAT_TYPE_UNDEFINED 0x0 | ||
| 508 | #define UAC_FORMAT_TYPE_I 0x1 | ||
| 509 | #define UAC_FORMAT_TYPE_II 0x2 | ||
| 510 | #define UAC_FORMAT_TYPE_III 0x3 | ||
| 511 | #define UAC_EXT_FORMAT_TYPE_I 0x81 | ||
| 512 | #define UAC_EXT_FORMAT_TYPE_II 0x82 | ||
| 513 | #define UAC_EXT_FORMAT_TYPE_III 0x83 | ||
| 514 | |||
| 515 | struct uac_iso_endpoint_descriptor { | ||
| 516 | __u8 bLength; /* in bytes: 7 */ | ||
| 517 | __u8 bDescriptorType; /* USB_DT_CS_ENDPOINT */ | ||
| 518 | __u8 bDescriptorSubtype; /* EP_GENERAL */ | ||
| 519 | __u8 bmAttributes; | ||
| 520 | __u8 bLockDelayUnits; | ||
| 521 | __le16 wLockDelay; | ||
| 522 | } __attribute__((packed)); | ||
| 523 | #define UAC_ISO_ENDPOINT_DESC_SIZE 7 | ||
| 524 | |||
| 525 | #define UAC_EP_CS_ATTR_SAMPLE_RATE 0x01 | ||
| 526 | #define UAC_EP_CS_ATTR_PITCH_CONTROL 0x02 | ||
| 527 | #define UAC_EP_CS_ATTR_FILL_MAX 0x80 | ||
| 528 | |||
| 529 | /* status word format (3.7.1.1) */ | ||
| 530 | |||
| 531 | #define UAC1_STATUS_TYPE_ORIG_MASK 0x0f | ||
| 532 | #define UAC1_STATUS_TYPE_ORIG_AUDIO_CONTROL_IF 0x0 | ||
| 533 | #define UAC1_STATUS_TYPE_ORIG_AUDIO_STREAM_IF 0x1 | ||
| 534 | #define UAC1_STATUS_TYPE_ORIG_AUDIO_STREAM_EP 0x2 | ||
| 535 | |||
| 536 | #define UAC1_STATUS_TYPE_IRQ_PENDING (1 << 7) | ||
| 537 | #define UAC1_STATUS_TYPE_MEM_CHANGED (1 << 6) | ||
| 538 | |||
| 539 | struct uac1_status_word { | ||
| 540 | __u8 bStatusType; | ||
| 541 | __u8 bOriginator; | ||
| 542 | } __attribute__((packed)); | ||
| 543 | |||
| 544 | #ifdef __KERNEL__ | ||
| 545 | 25 | ||
| 546 | struct usb_audio_control { | 26 | struct usb_audio_control { |
| 547 | struct list_head list; | 27 | struct list_head list; |
| @@ -561,6 +41,4 @@ struct usb_audio_control_selector { | |||
| 561 | struct usb_descriptor_header *desc; | 41 | struct usb_descriptor_header *desc; |
| 562 | }; | 42 | }; |
| 563 | 43 | ||
| 564 | #endif /* __KERNEL__ */ | ||
| 565 | |||
| 566 | #endif /* __LINUX_USB_AUDIO_H */ | 44 | #endif /* __LINUX_USB_AUDIO_H */ |
diff --git a/include/linux/usb/ch9.h b/include/linux/usb/ch9.h index d1d732c2838d..9c210f2283df 100644 --- a/include/linux/usb/ch9.h +++ b/include/linux/usb/ch9.h | |||
| @@ -29,887 +29,11 @@ | |||
| 29 | * someone that the two other points are non-issues for that | 29 | * someone that the two other points are non-issues for that |
| 30 | * particular descriptor type. | 30 | * particular descriptor type. |
| 31 | */ | 31 | */ |
| 32 | |||
| 33 | #ifndef __LINUX_USB_CH9_H | 32 | #ifndef __LINUX_USB_CH9_H |
| 34 | #define __LINUX_USB_CH9_H | 33 | #define __LINUX_USB_CH9_H |
| 35 | 34 | ||
| 36 | #include <linux/types.h> /* __u8 etc */ | 35 | #include <uapi/linux/usb/ch9.h> |
| 37 | #include <asm/byteorder.h> /* le16_to_cpu */ | ||
| 38 | |||
| 39 | /*-------------------------------------------------------------------------*/ | ||
| 40 | |||
| 41 | /* CONTROL REQUEST SUPPORT */ | ||
| 42 | |||
| 43 | /* | ||
| 44 | * USB directions | ||
| 45 | * | ||
| 46 | * This bit flag is used in endpoint descriptors' bEndpointAddress field. | ||
| 47 | * It's also one of three fields in control requests bRequestType. | ||
| 48 | */ | ||
| 49 | #define USB_DIR_OUT 0 /* to device */ | ||
| 50 | #define USB_DIR_IN 0x80 /* to host */ | ||
| 51 | |||
| 52 | /* | ||
| 53 | * USB types, the second of three bRequestType fields | ||
| 54 | */ | ||
| 55 | #define USB_TYPE_MASK (0x03 << 5) | ||
| 56 | #define USB_TYPE_STANDARD (0x00 << 5) | ||
| 57 | #define USB_TYPE_CLASS (0x01 << 5) | ||
| 58 | #define USB_TYPE_VENDOR (0x02 << 5) | ||
| 59 | #define USB_TYPE_RESERVED (0x03 << 5) | ||
| 60 | |||
| 61 | /* | ||
| 62 | * USB recipients, the third of three bRequestType fields | ||
| 63 | */ | ||
| 64 | #define USB_RECIP_MASK 0x1f | ||
| 65 | #define USB_RECIP_DEVICE 0x00 | ||
| 66 | #define USB_RECIP_INTERFACE 0x01 | ||
| 67 | #define USB_RECIP_ENDPOINT 0x02 | ||
| 68 | #define USB_RECIP_OTHER 0x03 | ||
| 69 | /* From Wireless USB 1.0 */ | ||
| 70 | #define USB_RECIP_PORT 0x04 | ||
| 71 | #define USB_RECIP_RPIPE 0x05 | ||
| 72 | |||
| 73 | /* | ||
| 74 | * Standard requests, for the bRequest field of a SETUP packet. | ||
| 75 | * | ||
| 76 | * These are qualified by the bRequestType field, so that for example | ||
| 77 | * TYPE_CLASS or TYPE_VENDOR specific feature flags could be retrieved | ||
| 78 | * by a GET_STATUS request. | ||
| 79 | */ | ||
| 80 | #define USB_REQ_GET_STATUS 0x00 | ||
| 81 | #define USB_REQ_CLEAR_FEATURE 0x01 | ||
| 82 | #define USB_REQ_SET_FEATURE 0x03 | ||
| 83 | #define USB_REQ_SET_ADDRESS 0x05 | ||
| 84 | #define USB_REQ_GET_DESCRIPTOR 0x06 | ||
| 85 | #define USB_REQ_SET_DESCRIPTOR 0x07 | ||
| 86 | #define USB_REQ_GET_CONFIGURATION 0x08 | ||
| 87 | #define USB_REQ_SET_CONFIGURATION 0x09 | ||
| 88 | #define USB_REQ_GET_INTERFACE 0x0A | ||
| 89 | #define USB_REQ_SET_INTERFACE 0x0B | ||
| 90 | #define USB_REQ_SYNCH_FRAME 0x0C | ||
| 91 | #define USB_REQ_SET_SEL 0x30 | ||
| 92 | #define USB_REQ_SET_ISOCH_DELAY 0x31 | ||
| 93 | |||
| 94 | #define USB_REQ_SET_ENCRYPTION 0x0D /* Wireless USB */ | ||
| 95 | #define USB_REQ_GET_ENCRYPTION 0x0E | ||
| 96 | #define USB_REQ_RPIPE_ABORT 0x0E | ||
| 97 | #define USB_REQ_SET_HANDSHAKE 0x0F | ||
| 98 | #define USB_REQ_RPIPE_RESET 0x0F | ||
| 99 | #define USB_REQ_GET_HANDSHAKE 0x10 | ||
| 100 | #define USB_REQ_SET_CONNECTION 0x11 | ||
| 101 | #define USB_REQ_SET_SECURITY_DATA 0x12 | ||
| 102 | #define USB_REQ_GET_SECURITY_DATA 0x13 | ||
| 103 | #define USB_REQ_SET_WUSB_DATA 0x14 | ||
| 104 | #define USB_REQ_LOOPBACK_DATA_WRITE 0x15 | ||
| 105 | #define USB_REQ_LOOPBACK_DATA_READ 0x16 | ||
| 106 | #define USB_REQ_SET_INTERFACE_DS 0x17 | ||
| 107 | |||
| 108 | /* The Link Power Management (LPM) ECN defines USB_REQ_TEST_AND_SET command, | ||
| 109 | * used by hubs to put ports into a new L1 suspend state, except that it | ||
| 110 | * forgot to define its number ... | ||
| 111 | */ | ||
| 112 | |||
| 113 | /* | ||
| 114 | * USB feature flags are written using USB_REQ_{CLEAR,SET}_FEATURE, and | ||
| 115 | * are read as a bit array returned by USB_REQ_GET_STATUS. (So there | ||
| 116 | * are at most sixteen features of each type.) Hubs may also support a | ||
| 117 | * new USB_REQ_TEST_AND_SET_FEATURE to put ports into L1 suspend. | ||
| 118 | */ | ||
| 119 | #define USB_DEVICE_SELF_POWERED 0 /* (read only) */ | ||
| 120 | #define USB_DEVICE_REMOTE_WAKEUP 1 /* dev may initiate wakeup */ | ||
| 121 | #define USB_DEVICE_TEST_MODE 2 /* (wired high speed only) */ | ||
| 122 | #define USB_DEVICE_BATTERY 2 /* (wireless) */ | ||
| 123 | #define USB_DEVICE_B_HNP_ENABLE 3 /* (otg) dev may initiate HNP */ | ||
| 124 | #define USB_DEVICE_WUSB_DEVICE 3 /* (wireless)*/ | ||
| 125 | #define USB_DEVICE_A_HNP_SUPPORT 4 /* (otg) RH port supports HNP */ | ||
| 126 | #define USB_DEVICE_A_ALT_HNP_SUPPORT 5 /* (otg) other RH port does */ | ||
| 127 | #define USB_DEVICE_DEBUG_MODE 6 /* (special devices only) */ | ||
| 128 | |||
| 129 | /* | ||
| 130 | * Test Mode Selectors | ||
| 131 | * See USB 2.0 spec Table 9-7 | ||
| 132 | */ | ||
| 133 | #define TEST_J 1 | ||
| 134 | #define TEST_K 2 | ||
| 135 | #define TEST_SE0_NAK 3 | ||
| 136 | #define TEST_PACKET 4 | ||
| 137 | #define TEST_FORCE_EN 5 | ||
| 138 | |||
| 139 | /* | ||
| 140 | * New Feature Selectors as added by USB 3.0 | ||
| 141 | * See USB 3.0 spec Table 9-6 | ||
| 142 | */ | ||
| 143 | #define USB_DEVICE_U1_ENABLE 48 /* dev may initiate U1 transition */ | ||
| 144 | #define USB_DEVICE_U2_ENABLE 49 /* dev may initiate U2 transition */ | ||
| 145 | #define USB_DEVICE_LTM_ENABLE 50 /* dev may send LTM */ | ||
| 146 | #define USB_INTRF_FUNC_SUSPEND 0 /* function suspend */ | ||
| 147 | |||
| 148 | #define USB_INTR_FUNC_SUSPEND_OPT_MASK 0xFF00 | ||
| 149 | /* | ||
| 150 | * Suspend Options, Table 9-7 USB 3.0 spec | ||
| 151 | */ | ||
| 152 | #define USB_INTRF_FUNC_SUSPEND_LP (1 << (8 + 0)) | ||
| 153 | #define USB_INTRF_FUNC_SUSPEND_RW (1 << (8 + 1)) | ||
| 154 | |||
| 155 | #define USB_ENDPOINT_HALT 0 /* IN/OUT will STALL */ | ||
| 156 | |||
| 157 | /* Bit array elements as returned by the USB_REQ_GET_STATUS request. */ | ||
| 158 | #define USB_DEV_STAT_U1_ENABLED 2 /* transition into U1 state */ | ||
| 159 | #define USB_DEV_STAT_U2_ENABLED 3 /* transition into U2 state */ | ||
| 160 | #define USB_DEV_STAT_LTM_ENABLED 4 /* Latency tolerance messages */ | ||
| 161 | |||
| 162 | /** | ||
| 163 | * struct usb_ctrlrequest - SETUP data for a USB device control request | ||
| 164 | * @bRequestType: matches the USB bmRequestType field | ||
| 165 | * @bRequest: matches the USB bRequest field | ||
| 166 | * @wValue: matches the USB wValue field (le16 byte order) | ||
| 167 | * @wIndex: matches the USB wIndex field (le16 byte order) | ||
| 168 | * @wLength: matches the USB wLength field (le16 byte order) | ||
| 169 | * | ||
| 170 | * This structure is used to send control requests to a USB device. It matches | ||
| 171 | * the different fields of the USB 2.0 Spec section 9.3, table 9-2. See the | ||
| 172 | * USB spec for a fuller description of the different fields, and what they are | ||
| 173 | * used for. | ||
| 174 | * | ||
| 175 | * Note that the driver for any interface can issue control requests. | ||
| 176 | * For most devices, interfaces don't coordinate with each other, so | ||
| 177 | * such requests may be made at any time. | ||
| 178 | */ | ||
| 179 | struct usb_ctrlrequest { | ||
| 180 | __u8 bRequestType; | ||
| 181 | __u8 bRequest; | ||
| 182 | __le16 wValue; | ||
| 183 | __le16 wIndex; | ||
| 184 | __le16 wLength; | ||
| 185 | } __attribute__ ((packed)); | ||
| 186 | |||
| 187 | /*-------------------------------------------------------------------------*/ | ||
| 188 | |||
| 189 | /* | ||
| 190 | * STANDARD DESCRIPTORS ... as returned by GET_DESCRIPTOR, or | ||
| 191 | * (rarely) accepted by SET_DESCRIPTOR. | ||
| 192 | * | ||
| 193 | * Note that all multi-byte values here are encoded in little endian | ||
| 194 | * byte order "on the wire". Within the kernel and when exposed | ||
| 195 | * through the Linux-USB APIs, they are not converted to cpu byte | ||
| 196 | * order; it is the responsibility of the client code to do this. | ||
| 197 | * The single exception is when device and configuration descriptors (but | ||
| 198 | * not other descriptors) are read from usbfs (i.e. /proc/bus/usb/BBB/DDD); | ||
| 199 | * in this case the fields are converted to host endianness by the kernel. | ||
| 200 | */ | ||
| 201 | |||
| 202 | /* | ||
| 203 | * Descriptor types ... USB 2.0 spec table 9.5 | ||
| 204 | */ | ||
| 205 | #define USB_DT_DEVICE 0x01 | ||
| 206 | #define USB_DT_CONFIG 0x02 | ||
| 207 | #define USB_DT_STRING 0x03 | ||
| 208 | #define USB_DT_INTERFACE 0x04 | ||
| 209 | #define USB_DT_ENDPOINT 0x05 | ||
| 210 | #define USB_DT_DEVICE_QUALIFIER 0x06 | ||
| 211 | #define USB_DT_OTHER_SPEED_CONFIG 0x07 | ||
| 212 | #define USB_DT_INTERFACE_POWER 0x08 | ||
| 213 | /* these are from a minor usb 2.0 revision (ECN) */ | ||
| 214 | #define USB_DT_OTG 0x09 | ||
| 215 | #define USB_DT_DEBUG 0x0a | ||
| 216 | #define USB_DT_INTERFACE_ASSOCIATION 0x0b | ||
| 217 | /* these are from the Wireless USB spec */ | ||
| 218 | #define USB_DT_SECURITY 0x0c | ||
| 219 | #define USB_DT_KEY 0x0d | ||
| 220 | #define USB_DT_ENCRYPTION_TYPE 0x0e | ||
| 221 | #define USB_DT_BOS 0x0f | ||
| 222 | #define USB_DT_DEVICE_CAPABILITY 0x10 | ||
| 223 | #define USB_DT_WIRELESS_ENDPOINT_COMP 0x11 | ||
| 224 | #define USB_DT_WIRE_ADAPTER 0x21 | ||
| 225 | #define USB_DT_RPIPE 0x22 | ||
| 226 | #define USB_DT_CS_RADIO_CONTROL 0x23 | ||
| 227 | /* From the T10 UAS specification */ | ||
| 228 | #define USB_DT_PIPE_USAGE 0x24 | ||
| 229 | /* From the USB 3.0 spec */ | ||
| 230 | #define USB_DT_SS_ENDPOINT_COMP 0x30 | ||
| 231 | |||
| 232 | /* Conventional codes for class-specific descriptors. The convention is | ||
| 233 | * defined in the USB "Common Class" Spec (3.11). Individual class specs | ||
| 234 | * are authoritative for their usage, not the "common class" writeup. | ||
| 235 | */ | ||
| 236 | #define USB_DT_CS_DEVICE (USB_TYPE_CLASS | USB_DT_DEVICE) | ||
| 237 | #define USB_DT_CS_CONFIG (USB_TYPE_CLASS | USB_DT_CONFIG) | ||
| 238 | #define USB_DT_CS_STRING (USB_TYPE_CLASS | USB_DT_STRING) | ||
| 239 | #define USB_DT_CS_INTERFACE (USB_TYPE_CLASS | USB_DT_INTERFACE) | ||
| 240 | #define USB_DT_CS_ENDPOINT (USB_TYPE_CLASS | USB_DT_ENDPOINT) | ||
| 241 | |||
| 242 | /* All standard descriptors have these 2 fields at the beginning */ | ||
| 243 | struct usb_descriptor_header { | ||
| 244 | __u8 bLength; | ||
| 245 | __u8 bDescriptorType; | ||
| 246 | } __attribute__ ((packed)); | ||
| 247 | |||
| 248 | |||
| 249 | /*-------------------------------------------------------------------------*/ | ||
| 250 | |||
| 251 | /* USB_DT_DEVICE: Device descriptor */ | ||
| 252 | struct usb_device_descriptor { | ||
| 253 | __u8 bLength; | ||
| 254 | __u8 bDescriptorType; | ||
| 255 | |||
| 256 | __le16 bcdUSB; | ||
| 257 | __u8 bDeviceClass; | ||
| 258 | __u8 bDeviceSubClass; | ||
| 259 | __u8 bDeviceProtocol; | ||
| 260 | __u8 bMaxPacketSize0; | ||
| 261 | __le16 idVendor; | ||
| 262 | __le16 idProduct; | ||
| 263 | __le16 bcdDevice; | ||
| 264 | __u8 iManufacturer; | ||
| 265 | __u8 iProduct; | ||
| 266 | __u8 iSerialNumber; | ||
| 267 | __u8 bNumConfigurations; | ||
| 268 | } __attribute__ ((packed)); | ||
| 269 | |||
| 270 | #define USB_DT_DEVICE_SIZE 18 | ||
| 271 | |||
| 272 | |||
| 273 | /* | ||
| 274 | * Device and/or Interface Class codes | ||
| 275 | * as found in bDeviceClass or bInterfaceClass | ||
| 276 | * and defined by www.usb.org documents | ||
| 277 | */ | ||
| 278 | #define USB_CLASS_PER_INTERFACE 0 /* for DeviceClass */ | ||
| 279 | #define USB_CLASS_AUDIO 1 | ||
| 280 | #define USB_CLASS_COMM 2 | ||
| 281 | #define USB_CLASS_HID 3 | ||
| 282 | #define USB_CLASS_PHYSICAL 5 | ||
| 283 | #define USB_CLASS_STILL_IMAGE 6 | ||
| 284 | #define USB_CLASS_PRINTER 7 | ||
| 285 | #define USB_CLASS_MASS_STORAGE 8 | ||
| 286 | #define USB_CLASS_HUB 9 | ||
| 287 | #define USB_CLASS_CDC_DATA 0x0a | ||
| 288 | #define USB_CLASS_CSCID 0x0b /* chip+ smart card */ | ||
| 289 | #define USB_CLASS_CONTENT_SEC 0x0d /* content security */ | ||
| 290 | #define USB_CLASS_VIDEO 0x0e | ||
| 291 | #define USB_CLASS_WIRELESS_CONTROLLER 0xe0 | ||
| 292 | #define USB_CLASS_MISC 0xef | ||
| 293 | #define USB_CLASS_APP_SPEC 0xfe | ||
| 294 | #define USB_CLASS_VENDOR_SPEC 0xff | ||
| 295 | |||
| 296 | #define USB_SUBCLASS_VENDOR_SPEC 0xff | ||
| 297 | |||
| 298 | /*-------------------------------------------------------------------------*/ | ||
| 299 | |||
| 300 | /* USB_DT_CONFIG: Configuration descriptor information. | ||
| 301 | * | ||
| 302 | * USB_DT_OTHER_SPEED_CONFIG is the same descriptor, except that the | ||
| 303 | * descriptor type is different. Highspeed-capable devices can look | ||
| 304 | * different depending on what speed they're currently running. Only | ||
| 305 | * devices with a USB_DT_DEVICE_QUALIFIER have any OTHER_SPEED_CONFIG | ||
| 306 | * descriptors. | ||
| 307 | */ | ||
| 308 | struct usb_config_descriptor { | ||
| 309 | __u8 bLength; | ||
| 310 | __u8 bDescriptorType; | ||
| 311 | |||
| 312 | __le16 wTotalLength; | ||
| 313 | __u8 bNumInterfaces; | ||
| 314 | __u8 bConfigurationValue; | ||
| 315 | __u8 iConfiguration; | ||
| 316 | __u8 bmAttributes; | ||
| 317 | __u8 bMaxPower; | ||
| 318 | } __attribute__ ((packed)); | ||
| 319 | |||
| 320 | #define USB_DT_CONFIG_SIZE 9 | ||
| 321 | |||
| 322 | /* from config descriptor bmAttributes */ | ||
| 323 | #define USB_CONFIG_ATT_ONE (1 << 7) /* must be set */ | ||
| 324 | #define USB_CONFIG_ATT_SELFPOWER (1 << 6) /* self powered */ | ||
| 325 | #define USB_CONFIG_ATT_WAKEUP (1 << 5) /* can wakeup */ | ||
| 326 | #define USB_CONFIG_ATT_BATTERY (1 << 4) /* battery powered */ | ||
| 327 | |||
| 328 | /*-------------------------------------------------------------------------*/ | ||
| 329 | |||
| 330 | /* USB_DT_STRING: String descriptor */ | ||
| 331 | struct usb_string_descriptor { | ||
| 332 | __u8 bLength; | ||
| 333 | __u8 bDescriptorType; | ||
| 334 | |||
| 335 | __le16 wData[1]; /* UTF-16LE encoded */ | ||
| 336 | } __attribute__ ((packed)); | ||
| 337 | |||
| 338 | /* note that "string" zero is special, it holds language codes that | ||
| 339 | * the device supports, not Unicode characters. | ||
| 340 | */ | ||
| 341 | |||
| 342 | /*-------------------------------------------------------------------------*/ | ||
| 343 | |||
| 344 | /* USB_DT_INTERFACE: Interface descriptor */ | ||
| 345 | struct usb_interface_descriptor { | ||
| 346 | __u8 bLength; | ||
| 347 | __u8 bDescriptorType; | ||
| 348 | |||
| 349 | __u8 bInterfaceNumber; | ||
| 350 | __u8 bAlternateSetting; | ||
| 351 | __u8 bNumEndpoints; | ||
| 352 | __u8 bInterfaceClass; | ||
| 353 | __u8 bInterfaceSubClass; | ||
| 354 | __u8 bInterfaceProtocol; | ||
| 355 | __u8 iInterface; | ||
| 356 | } __attribute__ ((packed)); | ||
| 357 | |||
| 358 | #define USB_DT_INTERFACE_SIZE 9 | ||
| 359 | |||
| 360 | /*-------------------------------------------------------------------------*/ | ||
| 361 | |||
| 362 | /* USB_DT_ENDPOINT: Endpoint descriptor */ | ||
| 363 | struct usb_endpoint_descriptor { | ||
| 364 | __u8 bLength; | ||
| 365 | __u8 bDescriptorType; | ||
| 366 | |||
| 367 | __u8 bEndpointAddress; | ||
| 368 | __u8 bmAttributes; | ||
| 369 | __le16 wMaxPacketSize; | ||
| 370 | __u8 bInterval; | ||
| 371 | |||
| 372 | /* NOTE: these two are _only_ in audio endpoints. */ | ||
| 373 | /* use USB_DT_ENDPOINT*_SIZE in bLength, not sizeof. */ | ||
| 374 | __u8 bRefresh; | ||
| 375 | __u8 bSynchAddress; | ||
| 376 | } __attribute__ ((packed)); | ||
| 377 | |||
| 378 | #define USB_DT_ENDPOINT_SIZE 7 | ||
| 379 | #define USB_DT_ENDPOINT_AUDIO_SIZE 9 /* Audio extension */ | ||
| 380 | |||
| 381 | |||
| 382 | /* | ||
| 383 | * Endpoints | ||
| 384 | */ | ||
| 385 | #define USB_ENDPOINT_NUMBER_MASK 0x0f /* in bEndpointAddress */ | ||
| 386 | #define USB_ENDPOINT_DIR_MASK 0x80 | ||
| 387 | |||
| 388 | #define USB_ENDPOINT_XFERTYPE_MASK 0x03 /* in bmAttributes */ | ||
| 389 | #define USB_ENDPOINT_XFER_CONTROL 0 | ||
| 390 | #define USB_ENDPOINT_XFER_ISOC 1 | ||
| 391 | #define USB_ENDPOINT_XFER_BULK 2 | ||
| 392 | #define USB_ENDPOINT_XFER_INT 3 | ||
| 393 | #define USB_ENDPOINT_MAX_ADJUSTABLE 0x80 | ||
| 394 | |||
| 395 | /* The USB 3.0 spec redefines bits 5:4 of bmAttributes as interrupt ep type. */ | ||
| 396 | #define USB_ENDPOINT_INTRTYPE 0x30 | ||
| 397 | #define USB_ENDPOINT_INTR_PERIODIC (0 << 4) | ||
| 398 | #define USB_ENDPOINT_INTR_NOTIFICATION (1 << 4) | ||
| 399 | |||
| 400 | #define USB_ENDPOINT_SYNCTYPE 0x0c | ||
| 401 | #define USB_ENDPOINT_SYNC_NONE (0 << 2) | ||
| 402 | #define USB_ENDPOINT_SYNC_ASYNC (1 << 2) | ||
| 403 | #define USB_ENDPOINT_SYNC_ADAPTIVE (2 << 2) | ||
| 404 | #define USB_ENDPOINT_SYNC_SYNC (3 << 2) | ||
| 405 | |||
| 406 | #define USB_ENDPOINT_USAGE_MASK 0x30 | ||
| 407 | #define USB_ENDPOINT_USAGE_DATA 0x00 | ||
| 408 | #define USB_ENDPOINT_USAGE_FEEDBACK 0x10 | ||
| 409 | #define USB_ENDPOINT_USAGE_IMPLICIT_FB 0x20 /* Implicit feedback Data endpoint */ | ||
| 410 | |||
| 411 | /*-------------------------------------------------------------------------*/ | ||
| 412 | |||
| 413 | /** | ||
| 414 | * usb_endpoint_num - get the endpoint's number | ||
| 415 | * @epd: endpoint to be checked | ||
| 416 | * | ||
| 417 | * Returns @epd's number: 0 to 15. | ||
| 418 | */ | ||
| 419 | static inline int usb_endpoint_num(const struct usb_endpoint_descriptor *epd) | ||
| 420 | { | ||
| 421 | return epd->bEndpointAddress & USB_ENDPOINT_NUMBER_MASK; | ||
| 422 | } | ||
| 423 | |||
| 424 | /** | ||
| 425 | * usb_endpoint_type - get the endpoint's transfer type | ||
| 426 | * @epd: endpoint to be checked | ||
| 427 | * | ||
| 428 | * Returns one of USB_ENDPOINT_XFER_{CONTROL, ISOC, BULK, INT} according | ||
| 429 | * to @epd's transfer type. | ||
| 430 | */ | ||
| 431 | static inline int usb_endpoint_type(const struct usb_endpoint_descriptor *epd) | ||
| 432 | { | ||
| 433 | return epd->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK; | ||
| 434 | } | ||
| 435 | |||
| 436 | /** | ||
| 437 | * usb_endpoint_dir_in - check if the endpoint has IN direction | ||
| 438 | * @epd: endpoint to be checked | ||
| 439 | * | ||
| 440 | * Returns true if the endpoint is of type IN, otherwise it returns false. | ||
| 441 | */ | ||
| 442 | static inline int usb_endpoint_dir_in(const struct usb_endpoint_descriptor *epd) | ||
| 443 | { | ||
| 444 | return ((epd->bEndpointAddress & USB_ENDPOINT_DIR_MASK) == USB_DIR_IN); | ||
| 445 | } | ||
| 446 | |||
| 447 | /** | ||
| 448 | * usb_endpoint_dir_out - check if the endpoint has OUT direction | ||
| 449 | * @epd: endpoint to be checked | ||
| 450 | * | ||
| 451 | * Returns true if the endpoint is of type OUT, otherwise it returns false. | ||
| 452 | */ | ||
| 453 | static inline int usb_endpoint_dir_out( | ||
| 454 | const struct usb_endpoint_descriptor *epd) | ||
| 455 | { | ||
| 456 | return ((epd->bEndpointAddress & USB_ENDPOINT_DIR_MASK) == USB_DIR_OUT); | ||
| 457 | } | ||
| 458 | |||
| 459 | /** | ||
| 460 | * usb_endpoint_xfer_bulk - check if the endpoint has bulk transfer type | ||
| 461 | * @epd: endpoint to be checked | ||
| 462 | * | ||
| 463 | * Returns true if the endpoint is of type bulk, otherwise it returns false. | ||
| 464 | */ | ||
| 465 | static inline int usb_endpoint_xfer_bulk( | ||
| 466 | const struct usb_endpoint_descriptor *epd) | ||
| 467 | { | ||
| 468 | return ((epd->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) == | ||
| 469 | USB_ENDPOINT_XFER_BULK); | ||
| 470 | } | ||
| 471 | |||
| 472 | /** | ||
| 473 | * usb_endpoint_xfer_control - check if the endpoint has control transfer type | ||
| 474 | * @epd: endpoint to be checked | ||
| 475 | * | ||
| 476 | * Returns true if the endpoint is of type control, otherwise it returns false. | ||
| 477 | */ | ||
| 478 | static inline int usb_endpoint_xfer_control( | ||
| 479 | const struct usb_endpoint_descriptor *epd) | ||
| 480 | { | ||
| 481 | return ((epd->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) == | ||
| 482 | USB_ENDPOINT_XFER_CONTROL); | ||
| 483 | } | ||
| 484 | |||
| 485 | /** | ||
| 486 | * usb_endpoint_xfer_int - check if the endpoint has interrupt transfer type | ||
| 487 | * @epd: endpoint to be checked | ||
| 488 | * | ||
| 489 | * Returns true if the endpoint is of type interrupt, otherwise it returns | ||
| 490 | * false. | ||
| 491 | */ | ||
| 492 | static inline int usb_endpoint_xfer_int( | ||
| 493 | const struct usb_endpoint_descriptor *epd) | ||
| 494 | { | ||
| 495 | return ((epd->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) == | ||
| 496 | USB_ENDPOINT_XFER_INT); | ||
| 497 | } | ||
| 498 | |||
| 499 | /** | ||
| 500 | * usb_endpoint_xfer_isoc - check if the endpoint has isochronous transfer type | ||
| 501 | * @epd: endpoint to be checked | ||
| 502 | * | ||
| 503 | * Returns true if the endpoint is of type isochronous, otherwise it returns | ||
| 504 | * false. | ||
| 505 | */ | ||
| 506 | static inline int usb_endpoint_xfer_isoc( | ||
| 507 | const struct usb_endpoint_descriptor *epd) | ||
| 508 | { | ||
| 509 | return ((epd->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) == | ||
| 510 | USB_ENDPOINT_XFER_ISOC); | ||
| 511 | } | ||
| 512 | |||
| 513 | /** | ||
| 514 | * usb_endpoint_is_bulk_in - check if the endpoint is bulk IN | ||
| 515 | * @epd: endpoint to be checked | ||
| 516 | * | ||
| 517 | * Returns true if the endpoint has bulk transfer type and IN direction, | ||
| 518 | * otherwise it returns false. | ||
| 519 | */ | ||
| 520 | static inline int usb_endpoint_is_bulk_in( | ||
| 521 | const struct usb_endpoint_descriptor *epd) | ||
| 522 | { | ||
| 523 | return usb_endpoint_xfer_bulk(epd) && usb_endpoint_dir_in(epd); | ||
| 524 | } | ||
| 525 | |||
| 526 | /** | ||
| 527 | * usb_endpoint_is_bulk_out - check if the endpoint is bulk OUT | ||
| 528 | * @epd: endpoint to be checked | ||
| 529 | * | ||
| 530 | * Returns true if the endpoint has bulk transfer type and OUT direction, | ||
| 531 | * otherwise it returns false. | ||
| 532 | */ | ||
| 533 | static inline int usb_endpoint_is_bulk_out( | ||
| 534 | const struct usb_endpoint_descriptor *epd) | ||
| 535 | { | ||
| 536 | return usb_endpoint_xfer_bulk(epd) && usb_endpoint_dir_out(epd); | ||
| 537 | } | ||
| 538 | |||
| 539 | /** | ||
| 540 | * usb_endpoint_is_int_in - check if the endpoint is interrupt IN | ||
| 541 | * @epd: endpoint to be checked | ||
| 542 | * | ||
| 543 | * Returns true if the endpoint has interrupt transfer type and IN direction, | ||
| 544 | * otherwise it returns false. | ||
| 545 | */ | ||
| 546 | static inline int usb_endpoint_is_int_in( | ||
| 547 | const struct usb_endpoint_descriptor *epd) | ||
| 548 | { | ||
| 549 | return usb_endpoint_xfer_int(epd) && usb_endpoint_dir_in(epd); | ||
| 550 | } | ||
| 551 | |||
| 552 | /** | ||
| 553 | * usb_endpoint_is_int_out - check if the endpoint is interrupt OUT | ||
| 554 | * @epd: endpoint to be checked | ||
| 555 | * | ||
| 556 | * Returns true if the endpoint has interrupt transfer type and OUT direction, | ||
| 557 | * otherwise it returns false. | ||
| 558 | */ | ||
| 559 | static inline int usb_endpoint_is_int_out( | ||
| 560 | const struct usb_endpoint_descriptor *epd) | ||
| 561 | { | ||
| 562 | return usb_endpoint_xfer_int(epd) && usb_endpoint_dir_out(epd); | ||
| 563 | } | ||
| 564 | |||
| 565 | /** | ||
| 566 | * usb_endpoint_is_isoc_in - check if the endpoint is isochronous IN | ||
| 567 | * @epd: endpoint to be checked | ||
| 568 | * | ||
| 569 | * Returns true if the endpoint has isochronous transfer type and IN direction, | ||
| 570 | * otherwise it returns false. | ||
| 571 | */ | ||
| 572 | static inline int usb_endpoint_is_isoc_in( | ||
| 573 | const struct usb_endpoint_descriptor *epd) | ||
| 574 | { | ||
| 575 | return usb_endpoint_xfer_isoc(epd) && usb_endpoint_dir_in(epd); | ||
| 576 | } | ||
| 577 | |||
| 578 | /** | ||
| 579 | * usb_endpoint_is_isoc_out - check if the endpoint is isochronous OUT | ||
| 580 | * @epd: endpoint to be checked | ||
| 581 | * | ||
| 582 | * Returns true if the endpoint has isochronous transfer type and OUT direction, | ||
| 583 | * otherwise it returns false. | ||
| 584 | */ | ||
| 585 | static inline int usb_endpoint_is_isoc_out( | ||
| 586 | const struct usb_endpoint_descriptor *epd) | ||
| 587 | { | ||
| 588 | return usb_endpoint_xfer_isoc(epd) && usb_endpoint_dir_out(epd); | ||
| 589 | } | ||
| 590 | |||
| 591 | /** | ||
| 592 | * usb_endpoint_maxp - get endpoint's max packet size | ||
| 593 | * @epd: endpoint to be checked | ||
| 594 | * | ||
| 595 | * Returns @epd's max packet | ||
| 596 | */ | ||
| 597 | static inline int usb_endpoint_maxp(const struct usb_endpoint_descriptor *epd) | ||
| 598 | { | ||
| 599 | return __le16_to_cpu(epd->wMaxPacketSize); | ||
| 600 | } | ||
| 601 | |||
| 602 | static inline int usb_endpoint_interrupt_type( | ||
| 603 | const struct usb_endpoint_descriptor *epd) | ||
| 604 | { | ||
| 605 | return epd->bmAttributes & USB_ENDPOINT_INTRTYPE; | ||
| 606 | } | ||
| 607 | |||
| 608 | /*-------------------------------------------------------------------------*/ | ||
| 609 | |||
| 610 | /* USB_DT_SS_ENDPOINT_COMP: SuperSpeed Endpoint Companion descriptor */ | ||
| 611 | struct usb_ss_ep_comp_descriptor { | ||
| 612 | __u8 bLength; | ||
| 613 | __u8 bDescriptorType; | ||
| 614 | |||
| 615 | __u8 bMaxBurst; | ||
| 616 | __u8 bmAttributes; | ||
| 617 | __le16 wBytesPerInterval; | ||
| 618 | } __attribute__ ((packed)); | ||
| 619 | |||
| 620 | #define USB_DT_SS_EP_COMP_SIZE 6 | ||
| 621 | |||
| 622 | /* Bits 4:0 of bmAttributes if this is a bulk endpoint */ | ||
| 623 | static inline int | ||
| 624 | usb_ss_max_streams(const struct usb_ss_ep_comp_descriptor *comp) | ||
| 625 | { | ||
| 626 | int max_streams; | ||
| 627 | |||
| 628 | if (!comp) | ||
| 629 | return 0; | ||
| 630 | |||
| 631 | max_streams = comp->bmAttributes & 0x1f; | ||
| 632 | |||
| 633 | if (!max_streams) | ||
| 634 | return 0; | ||
| 635 | |||
| 636 | max_streams = 1 << max_streams; | ||
| 637 | |||
| 638 | return max_streams; | ||
| 639 | } | ||
| 640 | |||
| 641 | /* Bits 1:0 of bmAttributes if this is an isoc endpoint */ | ||
| 642 | #define USB_SS_MULT(p) (1 + ((p) & 0x3)) | ||
| 643 | |||
| 644 | /*-------------------------------------------------------------------------*/ | ||
| 645 | |||
| 646 | /* USB_DT_DEVICE_QUALIFIER: Device Qualifier descriptor */ | ||
| 647 | struct usb_qualifier_descriptor { | ||
| 648 | __u8 bLength; | ||
| 649 | __u8 bDescriptorType; | ||
| 650 | |||
| 651 | __le16 bcdUSB; | ||
| 652 | __u8 bDeviceClass; | ||
| 653 | __u8 bDeviceSubClass; | ||
| 654 | __u8 bDeviceProtocol; | ||
| 655 | __u8 bMaxPacketSize0; | ||
| 656 | __u8 bNumConfigurations; | ||
| 657 | __u8 bRESERVED; | ||
| 658 | } __attribute__ ((packed)); | ||
| 659 | |||
| 660 | |||
| 661 | /*-------------------------------------------------------------------------*/ | ||
| 662 | |||
| 663 | /* USB_DT_OTG (from OTG 1.0a supplement) */ | ||
| 664 | struct usb_otg_descriptor { | ||
| 665 | __u8 bLength; | ||
| 666 | __u8 bDescriptorType; | ||
| 667 | |||
| 668 | __u8 bmAttributes; /* support for HNP, SRP, etc */ | ||
| 669 | } __attribute__ ((packed)); | ||
| 670 | |||
| 671 | /* from usb_otg_descriptor.bmAttributes */ | ||
| 672 | #define USB_OTG_SRP (1 << 0) | ||
| 673 | #define USB_OTG_HNP (1 << 1) /* swap host/device roles */ | ||
| 674 | |||
| 675 | /*-------------------------------------------------------------------------*/ | ||
| 676 | |||
| 677 | /* USB_DT_DEBUG: for special highspeed devices, replacing serial console */ | ||
| 678 | struct usb_debug_descriptor { | ||
| 679 | __u8 bLength; | ||
| 680 | __u8 bDescriptorType; | ||
| 681 | |||
| 682 | /* bulk endpoints with 8 byte maxpacket */ | ||
| 683 | __u8 bDebugInEndpoint; | ||
| 684 | __u8 bDebugOutEndpoint; | ||
| 685 | } __attribute__((packed)); | ||
| 686 | |||
| 687 | /*-------------------------------------------------------------------------*/ | ||
| 688 | |||
| 689 | /* USB_DT_INTERFACE_ASSOCIATION: groups interfaces */ | ||
| 690 | struct usb_interface_assoc_descriptor { | ||
| 691 | __u8 bLength; | ||
| 692 | __u8 bDescriptorType; | ||
| 693 | |||
| 694 | __u8 bFirstInterface; | ||
| 695 | __u8 bInterfaceCount; | ||
| 696 | __u8 bFunctionClass; | ||
| 697 | __u8 bFunctionSubClass; | ||
| 698 | __u8 bFunctionProtocol; | ||
| 699 | __u8 iFunction; | ||
| 700 | } __attribute__ ((packed)); | ||
| 701 | |||
| 702 | |||
| 703 | /*-------------------------------------------------------------------------*/ | ||
| 704 | |||
| 705 | /* USB_DT_SECURITY: group of wireless security descriptors, including | ||
| 706 | * encryption types available for setting up a CC/association. | ||
| 707 | */ | ||
| 708 | struct usb_security_descriptor { | ||
| 709 | __u8 bLength; | ||
| 710 | __u8 bDescriptorType; | ||
| 711 | |||
| 712 | __le16 wTotalLength; | ||
| 713 | __u8 bNumEncryptionTypes; | ||
| 714 | } __attribute__((packed)); | ||
| 715 | |||
| 716 | /*-------------------------------------------------------------------------*/ | ||
| 717 | |||
| 718 | /* USB_DT_KEY: used with {GET,SET}_SECURITY_DATA; only public keys | ||
| 719 | * may be retrieved. | ||
| 720 | */ | ||
| 721 | struct usb_key_descriptor { | ||
| 722 | __u8 bLength; | ||
| 723 | __u8 bDescriptorType; | ||
| 724 | |||
| 725 | __u8 tTKID[3]; | ||
| 726 | __u8 bReserved; | ||
| 727 | __u8 bKeyData[0]; | ||
| 728 | } __attribute__((packed)); | ||
| 729 | |||
| 730 | /*-------------------------------------------------------------------------*/ | ||
| 731 | |||
| 732 | /* USB_DT_ENCRYPTION_TYPE: bundled in DT_SECURITY groups */ | ||
| 733 | struct usb_encryption_descriptor { | ||
| 734 | __u8 bLength; | ||
| 735 | __u8 bDescriptorType; | ||
| 736 | |||
| 737 | __u8 bEncryptionType; | ||
| 738 | #define USB_ENC_TYPE_UNSECURE 0 | ||
| 739 | #define USB_ENC_TYPE_WIRED 1 /* non-wireless mode */ | ||
| 740 | #define USB_ENC_TYPE_CCM_1 2 /* aes128/cbc session */ | ||
| 741 | #define USB_ENC_TYPE_RSA_1 3 /* rsa3072/sha1 auth */ | ||
| 742 | __u8 bEncryptionValue; /* use in SET_ENCRYPTION */ | ||
| 743 | __u8 bAuthKeyIndex; | ||
| 744 | } __attribute__((packed)); | ||
| 745 | |||
| 746 | |||
| 747 | /*-------------------------------------------------------------------------*/ | ||
| 748 | |||
| 749 | /* USB_DT_BOS: group of device-level capabilities */ | ||
| 750 | struct usb_bos_descriptor { | ||
| 751 | __u8 bLength; | ||
| 752 | __u8 bDescriptorType; | ||
| 753 | |||
| 754 | __le16 wTotalLength; | ||
| 755 | __u8 bNumDeviceCaps; | ||
| 756 | } __attribute__((packed)); | ||
| 757 | |||
| 758 | #define USB_DT_BOS_SIZE 5 | ||
| 759 | /*-------------------------------------------------------------------------*/ | ||
| 760 | |||
| 761 | /* USB_DT_DEVICE_CAPABILITY: grouped with BOS */ | ||
| 762 | struct usb_dev_cap_header { | ||
| 763 | __u8 bLength; | ||
| 764 | __u8 bDescriptorType; | ||
| 765 | __u8 bDevCapabilityType; | ||
| 766 | } __attribute__((packed)); | ||
| 767 | |||
| 768 | #define USB_CAP_TYPE_WIRELESS_USB 1 | ||
| 769 | |||
| 770 | struct usb_wireless_cap_descriptor { /* Ultra Wide Band */ | ||
| 771 | __u8 bLength; | ||
| 772 | __u8 bDescriptorType; | ||
| 773 | __u8 bDevCapabilityType; | ||
| 774 | |||
| 775 | __u8 bmAttributes; | ||
| 776 | #define USB_WIRELESS_P2P_DRD (1 << 1) | ||
| 777 | #define USB_WIRELESS_BEACON_MASK (3 << 2) | ||
| 778 | #define USB_WIRELESS_BEACON_SELF (1 << 2) | ||
| 779 | #define USB_WIRELESS_BEACON_DIRECTED (2 << 2) | ||
| 780 | #define USB_WIRELESS_BEACON_NONE (3 << 2) | ||
| 781 | __le16 wPHYRates; /* bit rates, Mbps */ | ||
| 782 | #define USB_WIRELESS_PHY_53 (1 << 0) /* always set */ | ||
| 783 | #define USB_WIRELESS_PHY_80 (1 << 1) | ||
| 784 | #define USB_WIRELESS_PHY_107 (1 << 2) /* always set */ | ||
| 785 | #define USB_WIRELESS_PHY_160 (1 << 3) | ||
| 786 | #define USB_WIRELESS_PHY_200 (1 << 4) /* always set */ | ||
| 787 | #define USB_WIRELESS_PHY_320 (1 << 5) | ||
| 788 | #define USB_WIRELESS_PHY_400 (1 << 6) | ||
| 789 | #define USB_WIRELESS_PHY_480 (1 << 7) | ||
| 790 | __u8 bmTFITXPowerInfo; /* TFI power levels */ | ||
| 791 | __u8 bmFFITXPowerInfo; /* FFI power levels */ | ||
| 792 | __le16 bmBandGroup; | ||
| 793 | __u8 bReserved; | ||
| 794 | } __attribute__((packed)); | ||
| 795 | |||
| 796 | /* USB 2.0 Extension descriptor */ | ||
| 797 | #define USB_CAP_TYPE_EXT 2 | ||
| 798 | |||
| 799 | struct usb_ext_cap_descriptor { /* Link Power Management */ | ||
| 800 | __u8 bLength; | ||
| 801 | __u8 bDescriptorType; | ||
| 802 | __u8 bDevCapabilityType; | ||
| 803 | __le32 bmAttributes; | ||
| 804 | #define USB_LPM_SUPPORT (1 << 1) /* supports LPM */ | ||
| 805 | #define USB_BESL_SUPPORT (1 << 2) /* supports BESL */ | ||
| 806 | #define USB_BESL_BASELINE_VALID (1 << 3) /* Baseline BESL valid*/ | ||
| 807 | #define USB_BESL_DEEP_VALID (1 << 4) /* Deep BESL valid */ | ||
| 808 | #define USB_GET_BESL_BASELINE(p) (((p) & (0xf << 8)) >> 8) | ||
| 809 | #define USB_GET_BESL_DEEP(p) (((p) & (0xf << 12)) >> 12) | ||
| 810 | } __attribute__((packed)); | ||
| 811 | |||
| 812 | #define USB_DT_USB_EXT_CAP_SIZE 7 | ||
| 813 | |||
| 814 | /* | ||
| 815 | * SuperSpeed USB Capability descriptor: Defines the set of SuperSpeed USB | ||
| 816 | * specific device level capabilities | ||
| 817 | */ | ||
| 818 | #define USB_SS_CAP_TYPE 3 | ||
| 819 | struct usb_ss_cap_descriptor { /* Link Power Management */ | ||
| 820 | __u8 bLength; | ||
| 821 | __u8 bDescriptorType; | ||
| 822 | __u8 bDevCapabilityType; | ||
| 823 | __u8 bmAttributes; | ||
| 824 | #define USB_LTM_SUPPORT (1 << 1) /* supports LTM */ | ||
| 825 | __le16 wSpeedSupported; | ||
| 826 | #define USB_LOW_SPEED_OPERATION (1) /* Low speed operation */ | ||
| 827 | #define USB_FULL_SPEED_OPERATION (1 << 1) /* Full speed operation */ | ||
| 828 | #define USB_HIGH_SPEED_OPERATION (1 << 2) /* High speed operation */ | ||
| 829 | #define USB_5GBPS_OPERATION (1 << 3) /* Operation at 5Gbps */ | ||
| 830 | __u8 bFunctionalitySupport; | ||
| 831 | __u8 bU1devExitLat; | ||
| 832 | __le16 bU2DevExitLat; | ||
| 833 | } __attribute__((packed)); | ||
| 834 | |||
| 835 | #define USB_DT_USB_SS_CAP_SIZE 10 | ||
| 836 | |||
| 837 | /* | ||
| 838 | * Container ID Capability descriptor: Defines the instance unique ID used to | ||
| 839 | * identify the instance across all operating modes | ||
| 840 | */ | ||
| 841 | #define CONTAINER_ID_TYPE 4 | ||
| 842 | struct usb_ss_container_id_descriptor { | ||
| 843 | __u8 bLength; | ||
| 844 | __u8 bDescriptorType; | ||
| 845 | __u8 bDevCapabilityType; | ||
| 846 | __u8 bReserved; | ||
| 847 | __u8 ContainerID[16]; /* 128-bit number */ | ||
| 848 | } __attribute__((packed)); | ||
| 849 | |||
| 850 | #define USB_DT_USB_SS_CONTN_ID_SIZE 20 | ||
| 851 | /*-------------------------------------------------------------------------*/ | ||
| 852 | |||
| 853 | /* USB_DT_WIRELESS_ENDPOINT_COMP: companion descriptor associated with | ||
| 854 | * each endpoint descriptor for a wireless device | ||
| 855 | */ | ||
| 856 | struct usb_wireless_ep_comp_descriptor { | ||
| 857 | __u8 bLength; | ||
| 858 | __u8 bDescriptorType; | ||
| 859 | |||
| 860 | __u8 bMaxBurst; | ||
| 861 | __u8 bMaxSequence; | ||
| 862 | __le16 wMaxStreamDelay; | ||
| 863 | __le16 wOverTheAirPacketSize; | ||
| 864 | __u8 bOverTheAirInterval; | ||
| 865 | __u8 bmCompAttributes; | ||
| 866 | #define USB_ENDPOINT_SWITCH_MASK 0x03 /* in bmCompAttributes */ | ||
| 867 | #define USB_ENDPOINT_SWITCH_NO 0 | ||
| 868 | #define USB_ENDPOINT_SWITCH_SWITCH 1 | ||
| 869 | #define USB_ENDPOINT_SWITCH_SCALE 2 | ||
| 870 | } __attribute__((packed)); | ||
| 871 | |||
| 872 | /*-------------------------------------------------------------------------*/ | ||
| 873 | |||
| 874 | /* USB_REQ_SET_HANDSHAKE is a four-way handshake used between a wireless | ||
| 875 | * host and a device for connection set up, mutual authentication, and | ||
| 876 | * exchanging short lived session keys. The handshake depends on a CC. | ||
| 877 | */ | ||
| 878 | struct usb_handshake { | ||
| 879 | __u8 bMessageNumber; | ||
| 880 | __u8 bStatus; | ||
| 881 | __u8 tTKID[3]; | ||
| 882 | __u8 bReserved; | ||
| 883 | __u8 CDID[16]; | ||
| 884 | __u8 nonce[16]; | ||
| 885 | __u8 MIC[8]; | ||
| 886 | } __attribute__((packed)); | ||
| 887 | |||
| 888 | /*-------------------------------------------------------------------------*/ | ||
| 889 | |||
| 890 | /* USB_REQ_SET_CONNECTION modifies or revokes a connection context (CC). | ||
| 891 | * A CC may also be set up using non-wireless secure channels (including | ||
| 892 | * wired USB!), and some devices may support CCs with multiple hosts. | ||
| 893 | */ | ||
| 894 | struct usb_connection_context { | ||
| 895 | __u8 CHID[16]; /* persistent host id */ | ||
| 896 | __u8 CDID[16]; /* device id (unique w/in host context) */ | ||
| 897 | __u8 CK[16]; /* connection key */ | ||
| 898 | } __attribute__((packed)); | ||
| 899 | |||
| 900 | /*-------------------------------------------------------------------------*/ | ||
| 901 | 36 | ||
| 902 | /* USB 2.0 defines three speeds, here's how Linux identifies them */ | ||
| 903 | |||
| 904 | enum usb_device_speed { | ||
| 905 | USB_SPEED_UNKNOWN = 0, /* enumerating */ | ||
| 906 | USB_SPEED_LOW, USB_SPEED_FULL, /* usb 1.1 */ | ||
| 907 | USB_SPEED_HIGH, /* usb 2.0 */ | ||
| 908 | USB_SPEED_WIRELESS, /* wireless (usb 2.5) */ | ||
| 909 | USB_SPEED_SUPER, /* usb 3.0 */ | ||
| 910 | }; | ||
| 911 | |||
| 912 | #ifdef __KERNEL__ | ||
| 913 | 37 | ||
| 914 | /** | 38 | /** |
| 915 | * usb_speed_string() - Returns human readable-name of the speed. | 39 | * usb_speed_string() - Returns human readable-name of the speed. |
| @@ -919,86 +43,4 @@ enum usb_device_speed { | |||
| 919 | */ | 43 | */ |
| 920 | extern const char *usb_speed_string(enum usb_device_speed speed); | 44 | extern const char *usb_speed_string(enum usb_device_speed speed); |
| 921 | 45 | ||
| 922 | #endif | ||
| 923 | |||
| 924 | enum usb_device_state { | ||
| 925 | /* NOTATTACHED isn't in the USB spec, and this state acts | ||
| 926 | * the same as ATTACHED ... but it's clearer this way. | ||
| 927 | */ | ||
| 928 | USB_STATE_NOTATTACHED = 0, | ||
| 929 | |||
| 930 | /* chapter 9 and authentication (wireless) device states */ | ||
| 931 | USB_STATE_ATTACHED, | ||
| 932 | USB_STATE_POWERED, /* wired */ | ||
| 933 | USB_STATE_RECONNECTING, /* auth */ | ||
| 934 | USB_STATE_UNAUTHENTICATED, /* auth */ | ||
| 935 | USB_STATE_DEFAULT, /* limited function */ | ||
| 936 | USB_STATE_ADDRESS, | ||
| 937 | USB_STATE_CONFIGURED, /* most functions */ | ||
| 938 | |||
| 939 | USB_STATE_SUSPENDED | ||
| 940 | |||
| 941 | /* NOTE: there are actually four different SUSPENDED | ||
| 942 | * states, returning to POWERED, DEFAULT, ADDRESS, or | ||
| 943 | * CONFIGURED respectively when SOF tokens flow again. | ||
| 944 | * At this level there's no difference between L1 and L2 | ||
| 945 | * suspend states. (L2 being original USB 1.1 suspend.) | ||
| 946 | */ | ||
| 947 | }; | ||
| 948 | |||
| 949 | enum usb3_link_state { | ||
| 950 | USB3_LPM_U0 = 0, | ||
| 951 | USB3_LPM_U1, | ||
| 952 | USB3_LPM_U2, | ||
| 953 | USB3_LPM_U3 | ||
| 954 | }; | ||
| 955 | |||
| 956 | /* | ||
| 957 | * A U1 timeout of 0x0 means the parent hub will reject any transitions to U1. | ||
| 958 | * 0xff means the parent hub will accept transitions to U1, but will not | ||
| 959 | * initiate a transition. | ||
| 960 | * | ||
| 961 | * A U1 timeout of 0x1 to 0x7F also causes the hub to initiate a transition to | ||
| 962 | * U1 after that many microseconds. Timeouts of 0x80 to 0xFE are reserved | ||
| 963 | * values. | ||
| 964 | * | ||
| 965 | * A U2 timeout of 0x0 means the parent hub will reject any transitions to U2. | ||
| 966 | * 0xff means the parent hub will accept transitions to U2, but will not | ||
| 967 | * initiate a transition. | ||
| 968 | * | ||
| 969 | * A U2 timeout of 0x1 to 0xFE also causes the hub to initiate a transition to | ||
| 970 | * U2 after N*256 microseconds. Therefore a U2 timeout value of 0x1 means a U2 | ||
| 971 | * idle timer of 256 microseconds, 0x2 means 512 microseconds, 0xFE means | ||
| 972 | * 65.024ms. | ||
| 973 | */ | ||
| 974 | #define USB3_LPM_DISABLED 0x0 | ||
| 975 | #define USB3_LPM_U1_MAX_TIMEOUT 0x7F | ||
| 976 | #define USB3_LPM_U2_MAX_TIMEOUT 0xFE | ||
| 977 | #define USB3_LPM_DEVICE_INITIATED 0xFF | ||
| 978 | |||
| 979 | struct usb_set_sel_req { | ||
| 980 | __u8 u1_sel; | ||
| 981 | __u8 u1_pel; | ||
| 982 | __le16 u2_sel; | ||
| 983 | __le16 u2_pel; | ||
| 984 | } __attribute__ ((packed)); | ||
| 985 | |||
| 986 | /* | ||
| 987 | * The Set System Exit Latency control transfer provides one byte each for | ||
| 988 | * U1 SEL and U1 PEL, so the max exit latency is 0xFF. U2 SEL and U2 PEL each | ||
| 989 | * are two bytes long. | ||
| 990 | */ | ||
| 991 | #define USB3_LPM_MAX_U1_SEL_PEL 0xFF | ||
| 992 | #define USB3_LPM_MAX_U2_SEL_PEL 0xFFFF | ||
| 993 | |||
| 994 | /*-------------------------------------------------------------------------*/ | ||
| 995 | |||
| 996 | /* | ||
| 997 | * As per USB compliance update, a device that is actively drawing | ||
| 998 | * more than 100mA from USB must report itself as bus-powered in | ||
| 999 | * the GetStatus(DEVICE) call. | ||
| 1000 | * http://compliance.usb.org/index.asp?UpdateFile=Electrical&Format=Standard#34 | ||
| 1001 | */ | ||
| 1002 | #define USB_SELF_POWER_VBUS_MAX_DRAW 100 | ||
| 1003 | |||
| 1004 | #endif /* __LINUX_USB_CH9_H */ | 46 | #endif /* __LINUX_USB_CH9_H */ |
diff --git a/include/linux/usb/functionfs.h b/include/linux/usb/functionfs.h index a843d0851364..65d0a88dbc67 100644 --- a/include/linux/usb/functionfs.h +++ b/include/linux/usb/functionfs.h | |||
| @@ -1,171 +1,8 @@ | |||
| 1 | #ifndef __LINUX_FUNCTIONFS_H__ | 1 | #ifndef __LINUX_FUNCTIONFS_H__ |
| 2 | #define __LINUX_FUNCTIONFS_H__ 1 | 2 | #define __LINUX_FUNCTIONFS_H__ 1 |
| 3 | 3 | ||
| 4 | #include <uapi/linux/usb/functionfs.h> | ||
| 4 | 5 | ||
| 5 | #include <linux/types.h> | ||
| 6 | #include <linux/ioctl.h> | ||
| 7 | |||
| 8 | #include <linux/usb/ch9.h> | ||
| 9 | |||
| 10 | |||
| 11 | enum { | ||
| 12 | FUNCTIONFS_DESCRIPTORS_MAGIC = 1, | ||
| 13 | FUNCTIONFS_STRINGS_MAGIC = 2 | ||
| 14 | }; | ||
| 15 | |||
| 16 | |||
| 17 | #ifndef __KERNEL__ | ||
| 18 | |||
| 19 | /* Descriptor of an non-audio endpoint */ | ||
| 20 | struct usb_endpoint_descriptor_no_audio { | ||
| 21 | __u8 bLength; | ||
| 22 | __u8 bDescriptorType; | ||
| 23 | |||
| 24 | __u8 bEndpointAddress; | ||
| 25 | __u8 bmAttributes; | ||
| 26 | __le16 wMaxPacketSize; | ||
| 27 | __u8 bInterval; | ||
| 28 | } __attribute__((packed)); | ||
| 29 | |||
| 30 | |||
| 31 | /* | ||
| 32 | * All numbers must be in little endian order. | ||
| 33 | */ | ||
| 34 | |||
| 35 | struct usb_functionfs_descs_head { | ||
| 36 | __le32 magic; | ||
| 37 | __le32 length; | ||
| 38 | __le32 fs_count; | ||
| 39 | __le32 hs_count; | ||
| 40 | } __attribute__((packed)); | ||
| 41 | |||
| 42 | /* | ||
| 43 | * Descriptors format: | ||
| 44 | * | ||
| 45 | * | off | name | type | description | | ||
| 46 | * |-----+-----------+--------------+--------------------------------------| | ||
| 47 | * | 0 | magic | LE32 | FUNCTIONFS_{FS,HS}_DESCRIPTORS_MAGIC | | ||
| 48 | * | 4 | length | LE32 | length of the whole data chunk | | ||
| 49 | * | 8 | fs_count | LE32 | number of full-speed descriptors | | ||
| 50 | * | 12 | hs_count | LE32 | number of high-speed descriptors | | ||
| 51 | * | 16 | fs_descrs | Descriptor[] | list of full-speed descriptors | | ||
| 52 | * | | hs_descrs | Descriptor[] | list of high-speed descriptors | | ||
| 53 | * | ||
| 54 | * descs are just valid USB descriptors and have the following format: | ||
| 55 | * | ||
| 56 | * | off | name | type | description | | ||
| 57 | * |-----+-----------------+------+--------------------------| | ||
| 58 | * | 0 | bLength | U8 | length of the descriptor | | ||
| 59 | * | 1 | bDescriptorType | U8 | descriptor type | | ||
| 60 | * | 2 | payload | | descriptor's payload | | ||
| 61 | */ | ||
| 62 | |||
| 63 | struct usb_functionfs_strings_head { | ||
| 64 | __le32 magic; | ||
| 65 | __le32 length; | ||
| 66 | __le32 str_count; | ||
| 67 | __le32 lang_count; | ||
| 68 | } __attribute__((packed)); | ||
| 69 | |||
| 70 | /* | ||
| 71 | * Strings format: | ||
| 72 | * | ||
| 73 | * | off | name | type | description | | ||
| 74 | * |-----+------------+-----------------------+----------------------------| | ||
| 75 | * | 0 | magic | LE32 | FUNCTIONFS_STRINGS_MAGIC | | ||
| 76 | * | 4 | length | LE32 | length of the data chunk | | ||
| 77 | * | 8 | str_count | LE32 | number of strings | | ||
| 78 | * | 12 | lang_count | LE32 | number of languages | | ||
| 79 | * | 16 | stringtab | StringTab[lang_count] | table of strings per lang | | ||
| 80 | * | ||
| 81 | * For each language there is one stringtab entry (ie. there are lang_count | ||
| 82 | * stringtab entires). Each StringTab has following format: | ||
| 83 | * | ||
| 84 | * | off | name | type | description | | ||
| 85 | * |-----+---------+-------------------+------------------------------------| | ||
| 86 | * | 0 | lang | LE16 | language code | | ||
| 87 | * | 2 | strings | String[str_count] | array of strings in given language | | ||
| 88 | * | ||
| 89 | * For each string there is one strings entry (ie. there are str_count | ||
| 90 | * string entries). Each String is a NUL terminated string encoded in | ||
| 91 | * UTF-8. | ||
| 92 | */ | ||
| 93 | |||
| 94 | #endif | ||
| 95 | |||
| 96 | |||
| 97 | /* | ||
| 98 | * Events are delivered on the ep0 file descriptor, when the user mode driver | ||
| 99 | * reads from this file descriptor after writing the descriptors. Don't | ||
| 100 | * stop polling this descriptor. | ||
| 101 | */ | ||
| 102 | |||
| 103 | enum usb_functionfs_event_type { | ||
| 104 | FUNCTIONFS_BIND, | ||
| 105 | FUNCTIONFS_UNBIND, | ||
| 106 | |||
| 107 | FUNCTIONFS_ENABLE, | ||
| 108 | FUNCTIONFS_DISABLE, | ||
| 109 | |||
| 110 | FUNCTIONFS_SETUP, | ||
| 111 | |||
| 112 | FUNCTIONFS_SUSPEND, | ||
| 113 | FUNCTIONFS_RESUME | ||
| 114 | }; | ||
| 115 | |||
| 116 | /* NOTE: this structure must stay the same size and layout on | ||
| 117 | * both 32-bit and 64-bit kernels. | ||
| 118 | */ | ||
| 119 | struct usb_functionfs_event { | ||
| 120 | union { | ||
| 121 | /* SETUP: packet; DATA phase i/o precedes next event | ||
| 122 | *(setup.bmRequestType & USB_DIR_IN) flags direction */ | ||
| 123 | struct usb_ctrlrequest setup; | ||
| 124 | } __attribute__((packed)) u; | ||
| 125 | |||
| 126 | /* enum usb_functionfs_event_type */ | ||
| 127 | __u8 type; | ||
| 128 | __u8 _pad[3]; | ||
| 129 | } __attribute__((packed)); | ||
| 130 | |||
| 131 | |||
| 132 | /* Endpoint ioctls */ | ||
| 133 | /* The same as in gadgetfs */ | ||
| 134 | |||
| 135 | /* IN transfers may be reported to the gadget driver as complete | ||
| 136 | * when the fifo is loaded, before the host reads the data; | ||
| 137 | * OUT transfers may be reported to the host's "client" driver as | ||
| 138 | * complete when they're sitting in the FIFO unread. | ||
| 139 | * THIS returns how many bytes are "unclaimed" in the endpoint fifo | ||
| 140 | * (needed for precise fault handling, when the hardware allows it) | ||
| 141 | */ | ||
| 142 | #define FUNCTIONFS_FIFO_STATUS _IO('g', 1) | ||
| 143 | |||
| 144 | /* discards any unclaimed data in the fifo. */ | ||
| 145 | #define FUNCTIONFS_FIFO_FLUSH _IO('g', 2) | ||
| 146 | |||
| 147 | /* resets endpoint halt+toggle; used to implement set_interface. | ||
| 148 | * some hardware (like pxa2xx) can't support this. | ||
| 149 | */ | ||
| 150 | #define FUNCTIONFS_CLEAR_HALT _IO('g', 3) | ||
| 151 | |||
| 152 | /* Specific for functionfs */ | ||
| 153 | |||
| 154 | /* | ||
| 155 | * Returns reverse mapping of an interface. Called on EP0. If there | ||
| 156 | * is no such interface returns -EDOM. If function is not active | ||
| 157 | * returns -ENODEV. | ||
| 158 | */ | ||
| 159 | #define FUNCTIONFS_INTERFACE_REVMAP _IO('g', 128) | ||
| 160 | |||
| 161 | /* | ||
| 162 | * Returns real bEndpointAddress of an endpoint. If function is not | ||
| 163 | * active returns -ENODEV. | ||
| 164 | */ | ||
| 165 | #define FUNCTIONFS_ENDPOINT_REVMAP _IO('g', 129) | ||
| 166 | |||
| 167 | |||
| 168 | #ifdef __KERNEL__ | ||
| 169 | 6 | ||
| 170 | struct ffs_data; | 7 | struct ffs_data; |
| 171 | struct usb_composite_dev; | 8 | struct usb_composite_dev; |
| @@ -197,5 +34,3 @@ static void functionfs_release_dev_callback(struct ffs_data *ffs_data) | |||
| 197 | 34 | ||
| 198 | 35 | ||
| 199 | #endif | 36 | #endif |
| 200 | |||
| 201 | #endif | ||
diff --git a/include/uapi/linux/usb/Kbuild b/include/uapi/linux/usb/Kbuild index aafaa5aa54d4..6cb4ea826834 100644 --- a/include/uapi/linux/usb/Kbuild +++ b/include/uapi/linux/usb/Kbuild | |||
| @@ -1 +1,11 @@ | |||
| 1 | # UAPI Header export list | 1 | # UAPI Header export list |
| 2 | header-y += audio.h | ||
| 3 | header-y += cdc.h | ||
| 4 | header-y += ch11.h | ||
| 5 | header-y += ch9.h | ||
| 6 | header-y += functionfs.h | ||
| 7 | header-y += g_printer.h | ||
| 8 | header-y += gadgetfs.h | ||
| 9 | header-y += midi.h | ||
| 10 | header-y += tmc.h | ||
| 11 | header-y += video.h | ||
diff --git a/include/uapi/linux/usb/audio.h b/include/uapi/linux/usb/audio.h new file mode 100644 index 000000000000..ac90037894d9 --- /dev/null +++ b/include/uapi/linux/usb/audio.h | |||
| @@ -0,0 +1,545 @@ | |||
| 1 | /* | ||
| 2 | * <linux/usb/audio.h> -- USB Audio definitions. | ||
| 3 | * | ||
| 4 | * Copyright (C) 2006 Thumtronics Pty Ltd. | ||
| 5 | * Developed for Thumtronics by Grey Innovation | ||
| 6 | * Ben Williamson <ben.williamson@greyinnovation.com> | ||
| 7 | * | ||
| 8 | * This software is distributed under the terms of the GNU General Public | ||
| 9 | * License ("GPL") version 2, as published by the Free Software Foundation. | ||
| 10 | * | ||
| 11 | * This file holds USB constants and structures defined | ||
| 12 | * by the USB Device Class Definition for Audio Devices. | ||
| 13 | * Comments below reference relevant sections of that document: | ||
| 14 | * | ||
| 15 | * http://www.usb.org/developers/devclass_docs/audio10.pdf | ||
| 16 | * | ||
| 17 | * Types and defines in this file are either specific to version 1.0 of | ||
| 18 | * this standard or common for newer versions. | ||
| 19 | */ | ||
| 20 | |||
| 21 | #ifndef _UAPI__LINUX_USB_AUDIO_H | ||
| 22 | #define _UAPI__LINUX_USB_AUDIO_H | ||
| 23 | |||
| 24 | #include <linux/types.h> | ||
| 25 | |||
| 26 | /* bInterfaceProtocol values to denote the version of the standard used */ | ||
| 27 | #define UAC_VERSION_1 0x00 | ||
| 28 | #define UAC_VERSION_2 0x20 | ||
| 29 | |||
| 30 | /* A.2 Audio Interface Subclass Codes */ | ||
| 31 | #define USB_SUBCLASS_AUDIOCONTROL 0x01 | ||
| 32 | #define USB_SUBCLASS_AUDIOSTREAMING 0x02 | ||
| 33 | #define USB_SUBCLASS_MIDISTREAMING 0x03 | ||
| 34 | |||
| 35 | /* A.5 Audio Class-Specific AC Interface Descriptor Subtypes */ | ||
| 36 | #define UAC_HEADER 0x01 | ||
| 37 | #define UAC_INPUT_TERMINAL 0x02 | ||
| 38 | #define UAC_OUTPUT_TERMINAL 0x03 | ||
| 39 | #define UAC_MIXER_UNIT 0x04 | ||
| 40 | #define UAC_SELECTOR_UNIT 0x05 | ||
| 41 | #define UAC_FEATURE_UNIT 0x06 | ||
| 42 | #define UAC1_PROCESSING_UNIT 0x07 | ||
| 43 | #define UAC1_EXTENSION_UNIT 0x08 | ||
| 44 | |||
| 45 | /* A.6 Audio Class-Specific AS Interface Descriptor Subtypes */ | ||
| 46 | #define UAC_AS_GENERAL 0x01 | ||
| 47 | #define UAC_FORMAT_TYPE 0x02 | ||
| 48 | #define UAC_FORMAT_SPECIFIC 0x03 | ||
| 49 | |||
| 50 | /* A.7 Processing Unit Process Types */ | ||
| 51 | #define UAC_PROCESS_UNDEFINED 0x00 | ||
| 52 | #define UAC_PROCESS_UP_DOWNMIX 0x01 | ||
| 53 | #define UAC_PROCESS_DOLBY_PROLOGIC 0x02 | ||
| 54 | #define UAC_PROCESS_STEREO_EXTENDER 0x03 | ||
| 55 | #define UAC_PROCESS_REVERB 0x04 | ||
| 56 | #define UAC_PROCESS_CHORUS 0x05 | ||
| 57 | #define UAC_PROCESS_DYN_RANGE_COMP 0x06 | ||
| 58 | |||
| 59 | /* A.8 Audio Class-Specific Endpoint Descriptor Subtypes */ | ||
| 60 | #define UAC_EP_GENERAL 0x01 | ||
| 61 | |||
| 62 | /* A.9 Audio Class-Specific Request Codes */ | ||
| 63 | #define UAC_SET_ 0x00 | ||
| 64 | #define UAC_GET_ 0x80 | ||
| 65 | |||
| 66 | #define UAC__CUR 0x1 | ||
| 67 | #define UAC__MIN 0x2 | ||
| 68 | #define UAC__MAX 0x3 | ||
| 69 | #define UAC__RES 0x4 | ||
| 70 | #define UAC__MEM 0x5 | ||
| 71 | |||
| 72 | #define UAC_SET_CUR (UAC_SET_ | UAC__CUR) | ||
| 73 | #define UAC_GET_CUR (UAC_GET_ | UAC__CUR) | ||
| 74 | #define UAC_SET_MIN (UAC_SET_ | UAC__MIN) | ||
| 75 | #define UAC_GET_MIN (UAC_GET_ | UAC__MIN) | ||
| 76 | #define UAC_SET_MAX (UAC_SET_ | UAC__MAX) | ||
| 77 | #define UAC_GET_MAX (UAC_GET_ | UAC__MAX) | ||
| 78 | #define UAC_SET_RES (UAC_SET_ | UAC__RES) | ||
| 79 | #define UAC_GET_RES (UAC_GET_ | UAC__RES) | ||
| 80 | #define UAC_SET_MEM (UAC_SET_ | UAC__MEM) | ||
| 81 | #define UAC_GET_MEM (UAC_GET_ | UAC__MEM) | ||
| 82 | |||
| 83 | #define UAC_GET_STAT 0xff | ||
| 84 | |||
| 85 | /* A.10 Control Selector Codes */ | ||
| 86 | |||
| 87 | /* A.10.1 Terminal Control Selectors */ | ||
| 88 | #define UAC_TERM_COPY_PROTECT 0x01 | ||
| 89 | |||
| 90 | /* A.10.2 Feature Unit Control Selectors */ | ||
| 91 | #define UAC_FU_MUTE 0x01 | ||
| 92 | #define UAC_FU_VOLUME 0x02 | ||
| 93 | #define UAC_FU_BASS 0x03 | ||
| 94 | #define UAC_FU_MID 0x04 | ||
| 95 | #define UAC_FU_TREBLE 0x05 | ||
| 96 | #define UAC_FU_GRAPHIC_EQUALIZER 0x06 | ||
| 97 | #define UAC_FU_AUTOMATIC_GAIN 0x07 | ||
| 98 | #define UAC_FU_DELAY 0x08 | ||
| 99 | #define UAC_FU_BASS_BOOST 0x09 | ||
| 100 | #define UAC_FU_LOUDNESS 0x0a | ||
| 101 | |||
| 102 | #define UAC_CONTROL_BIT(CS) (1 << ((CS) - 1)) | ||
| 103 | |||
| 104 | /* A.10.3.1 Up/Down-mix Processing Unit Controls Selectors */ | ||
| 105 | #define UAC_UD_ENABLE 0x01 | ||
| 106 | #define UAC_UD_MODE_SELECT 0x02 | ||
| 107 | |||
| 108 | /* A.10.3.2 Dolby Prologic (tm) Processing Unit Controls Selectors */ | ||
| 109 | #define UAC_DP_ENABLE 0x01 | ||
| 110 | #define UAC_DP_MODE_SELECT 0x02 | ||
| 111 | |||
| 112 | /* A.10.3.3 3D Stereo Extender Processing Unit Control Selectors */ | ||
| 113 | #define UAC_3D_ENABLE 0x01 | ||
| 114 | #define UAC_3D_SPACE 0x02 | ||
| 115 | |||
| 116 | /* A.10.3.4 Reverberation Processing Unit Control Selectors */ | ||
| 117 | #define UAC_REVERB_ENABLE 0x01 | ||
| 118 | #define UAC_REVERB_LEVEL 0x02 | ||
| 119 | #define UAC_REVERB_TIME 0x03 | ||
| 120 | #define UAC_REVERB_FEEDBACK 0x04 | ||
| 121 | |||
| 122 | /* A.10.3.5 Chorus Processing Unit Control Selectors */ | ||
| 123 | #define UAC_CHORUS_ENABLE 0x01 | ||
| 124 | #define UAC_CHORUS_LEVEL 0x02 | ||
| 125 | #define UAC_CHORUS_RATE 0x03 | ||
| 126 | #define UAC_CHORUS_DEPTH 0x04 | ||
| 127 | |||
| 128 | /* A.10.3.6 Dynamic Range Compressor Unit Control Selectors */ | ||
| 129 | #define UAC_DCR_ENABLE 0x01 | ||
| 130 | #define UAC_DCR_RATE 0x02 | ||
| 131 | #define UAC_DCR_MAXAMPL 0x03 | ||
| 132 | #define UAC_DCR_THRESHOLD 0x04 | ||
| 133 | #define UAC_DCR_ATTACK_TIME 0x05 | ||
| 134 | #define UAC_DCR_RELEASE_TIME 0x06 | ||
| 135 | |||
| 136 | /* A.10.4 Extension Unit Control Selectors */ | ||
| 137 | #define UAC_XU_ENABLE 0x01 | ||
| 138 | |||
| 139 | /* MIDI - A.1 MS Class-Specific Interface Descriptor Subtypes */ | ||
| 140 | #define UAC_MS_HEADER 0x01 | ||
| 141 | #define UAC_MIDI_IN_JACK 0x02 | ||
| 142 | #define UAC_MIDI_OUT_JACK 0x03 | ||
| 143 | |||
| 144 | /* MIDI - A.1 MS Class-Specific Endpoint Descriptor Subtypes */ | ||
| 145 | #define UAC_MS_GENERAL 0x01 | ||
| 146 | |||
| 147 | /* Terminals - 2.1 USB Terminal Types */ | ||
| 148 | #define UAC_TERMINAL_UNDEFINED 0x100 | ||
| 149 | #define UAC_TERMINAL_STREAMING 0x101 | ||
| 150 | #define UAC_TERMINAL_VENDOR_SPEC 0x1FF | ||
| 151 | |||
| 152 | /* Terminal Control Selectors */ | ||
| 153 | /* 4.3.2 Class-Specific AC Interface Descriptor */ | ||
| 154 | struct uac1_ac_header_descriptor { | ||
| 155 | __u8 bLength; /* 8 + n */ | ||
| 156 | __u8 bDescriptorType; /* USB_DT_CS_INTERFACE */ | ||
| 157 | __u8 bDescriptorSubtype; /* UAC_MS_HEADER */ | ||
| 158 | __le16 bcdADC; /* 0x0100 */ | ||
| 159 | __le16 wTotalLength; /* includes Unit and Terminal desc. */ | ||
| 160 | __u8 bInCollection; /* n */ | ||
| 161 | __u8 baInterfaceNr[]; /* [n] */ | ||
| 162 | } __attribute__ ((packed)); | ||
| 163 | |||
| 164 | #define UAC_DT_AC_HEADER_SIZE(n) (8 + (n)) | ||
| 165 | |||
| 166 | /* As above, but more useful for defining your own descriptors: */ | ||
| 167 | #define DECLARE_UAC_AC_HEADER_DESCRIPTOR(n) \ | ||
| 168 | struct uac1_ac_header_descriptor_##n { \ | ||
| 169 | __u8 bLength; \ | ||
| 170 | __u8 bDescriptorType; \ | ||
| 171 | __u8 bDescriptorSubtype; \ | ||
| 172 | __le16 bcdADC; \ | ||
| 173 | __le16 wTotalLength; \ | ||
| 174 | __u8 bInCollection; \ | ||
| 175 | __u8 baInterfaceNr[n]; \ | ||
| 176 | } __attribute__ ((packed)) | ||
| 177 | |||
| 178 | /* 4.3.2.1 Input Terminal Descriptor */ | ||
| 179 | struct uac_input_terminal_descriptor { | ||
| 180 | __u8 bLength; /* in bytes: 12 */ | ||
| 181 | __u8 bDescriptorType; /* CS_INTERFACE descriptor type */ | ||
| 182 | __u8 bDescriptorSubtype; /* INPUT_TERMINAL descriptor subtype */ | ||
| 183 | __u8 bTerminalID; /* Constant uniquely terminal ID */ | ||
| 184 | __le16 wTerminalType; /* USB Audio Terminal Types */ | ||
| 185 | __u8 bAssocTerminal; /* ID of the Output Terminal associated */ | ||
| 186 | __u8 bNrChannels; /* Number of logical output channels */ | ||
| 187 | __le16 wChannelConfig; | ||
| 188 | __u8 iChannelNames; | ||
| 189 | __u8 iTerminal; | ||
| 190 | } __attribute__ ((packed)); | ||
| 191 | |||
| 192 | #define UAC_DT_INPUT_TERMINAL_SIZE 12 | ||
| 193 | |||
| 194 | /* Terminals - 2.2 Input Terminal Types */ | ||
| 195 | #define UAC_INPUT_TERMINAL_UNDEFINED 0x200 | ||
| 196 | #define UAC_INPUT_TERMINAL_MICROPHONE 0x201 | ||
| 197 | #define UAC_INPUT_TERMINAL_DESKTOP_MICROPHONE 0x202 | ||
| 198 | #define UAC_INPUT_TERMINAL_PERSONAL_MICROPHONE 0x203 | ||
| 199 | #define UAC_INPUT_TERMINAL_OMNI_DIR_MICROPHONE 0x204 | ||
| 200 | #define UAC_INPUT_TERMINAL_MICROPHONE_ARRAY 0x205 | ||
| 201 | #define UAC_INPUT_TERMINAL_PROC_MICROPHONE_ARRAY 0x206 | ||
| 202 | |||
| 203 | /* Terminals - control selectors */ | ||
| 204 | |||
| 205 | #define UAC_TERMINAL_CS_COPY_PROTECT_CONTROL 0x01 | ||
| 206 | |||
| 207 | /* 4.3.2.2 Output Terminal Descriptor */ | ||
| 208 | struct uac1_output_terminal_descriptor { | ||
| 209 | __u8 bLength; /* in bytes: 9 */ | ||
| 210 | __u8 bDescriptorType; /* CS_INTERFACE descriptor type */ | ||
| 211 | __u8 bDescriptorSubtype; /* OUTPUT_TERMINAL descriptor subtype */ | ||
| 212 | __u8 bTerminalID; /* Constant uniquely terminal ID */ | ||
| 213 | __le16 wTerminalType; /* USB Audio Terminal Types */ | ||
| 214 | __u8 bAssocTerminal; /* ID of the Input Terminal associated */ | ||
| 215 | __u8 bSourceID; /* ID of the connected Unit or Terminal*/ | ||
| 216 | __u8 iTerminal; | ||
| 217 | } __attribute__ ((packed)); | ||
| 218 | |||
| 219 | #define UAC_DT_OUTPUT_TERMINAL_SIZE 9 | ||
| 220 | |||
| 221 | /* Terminals - 2.3 Output Terminal Types */ | ||
| 222 | #define UAC_OUTPUT_TERMINAL_UNDEFINED 0x300 | ||
| 223 | #define UAC_OUTPUT_TERMINAL_SPEAKER 0x301 | ||
| 224 | #define UAC_OUTPUT_TERMINAL_HEADPHONES 0x302 | ||
| 225 | #define UAC_OUTPUT_TERMINAL_HEAD_MOUNTED_DISPLAY_AUDIO 0x303 | ||
| 226 | #define UAC_OUTPUT_TERMINAL_DESKTOP_SPEAKER 0x304 | ||
| 227 | #define UAC_OUTPUT_TERMINAL_ROOM_SPEAKER 0x305 | ||
| 228 | #define UAC_OUTPUT_TERMINAL_COMMUNICATION_SPEAKER 0x306 | ||
| 229 | #define UAC_OUTPUT_TERMINAL_LOW_FREQ_EFFECTS_SPEAKER 0x307 | ||
| 230 | |||
| 231 | /* Set bControlSize = 2 as default setting */ | ||
| 232 | #define UAC_DT_FEATURE_UNIT_SIZE(ch) (7 + ((ch) + 1) * 2) | ||
| 233 | |||
| 234 | /* As above, but more useful for defining your own descriptors: */ | ||
| 235 | #define DECLARE_UAC_FEATURE_UNIT_DESCRIPTOR(ch) \ | ||
| 236 | struct uac_feature_unit_descriptor_##ch { \ | ||
| 237 | __u8 bLength; \ | ||
| 238 | __u8 bDescriptorType; \ | ||
| 239 | __u8 bDescriptorSubtype; \ | ||
| 240 | __u8 bUnitID; \ | ||
| 241 | __u8 bSourceID; \ | ||
| 242 | __u8 bControlSize; \ | ||
| 243 | __le16 bmaControls[ch + 1]; \ | ||
| 244 | __u8 iFeature; \ | ||
| 245 | } __attribute__ ((packed)) | ||
| 246 | |||
| 247 | /* 4.3.2.3 Mixer Unit Descriptor */ | ||
| 248 | struct uac_mixer_unit_descriptor { | ||
| 249 | __u8 bLength; | ||
| 250 | __u8 bDescriptorType; | ||
| 251 | __u8 bDescriptorSubtype; | ||
| 252 | __u8 bUnitID; | ||
| 253 | __u8 bNrInPins; | ||
| 254 | __u8 baSourceID[]; | ||
| 255 | } __attribute__ ((packed)); | ||
| 256 | |||
| 257 | static inline __u8 uac_mixer_unit_bNrChannels(struct uac_mixer_unit_descriptor *desc) | ||
| 258 | { | ||
| 259 | return desc->baSourceID[desc->bNrInPins]; | ||
| 260 | } | ||
| 261 | |||
| 262 | static inline __u32 uac_mixer_unit_wChannelConfig(struct uac_mixer_unit_descriptor *desc, | ||
| 263 | int protocol) | ||
| 264 | { | ||
| 265 | if (protocol == UAC_VERSION_1) | ||
| 266 | return (desc->baSourceID[desc->bNrInPins + 2] << 8) | | ||
| 267 | desc->baSourceID[desc->bNrInPins + 1]; | ||
| 268 | else | ||
| 269 | return (desc->baSourceID[desc->bNrInPins + 4] << 24) | | ||
| 270 | (desc->baSourceID[desc->bNrInPins + 3] << 16) | | ||
| 271 | (desc->baSourceID[desc->bNrInPins + 2] << 8) | | ||
| 272 | (desc->baSourceID[desc->bNrInPins + 1]); | ||
| 273 | } | ||
| 274 | |||
| 275 | static inline __u8 uac_mixer_unit_iChannelNames(struct uac_mixer_unit_descriptor *desc, | ||
| 276 | int protocol) | ||
| 277 | { | ||
| 278 | return (protocol == UAC_VERSION_1) ? | ||
| 279 | desc->baSourceID[desc->bNrInPins + 3] : | ||
| 280 | desc->baSourceID[desc->bNrInPins + 5]; | ||
| 281 | } | ||
| 282 | |||
| 283 | static inline __u8 *uac_mixer_unit_bmControls(struct uac_mixer_unit_descriptor *desc, | ||
| 284 | int protocol) | ||
| 285 | { | ||
| 286 | return (protocol == UAC_VERSION_1) ? | ||
| 287 | &desc->baSourceID[desc->bNrInPins + 4] : | ||
| 288 | &desc->baSourceID[desc->bNrInPins + 6]; | ||
| 289 | } | ||
| 290 | |||
| 291 | static inline __u8 uac_mixer_unit_iMixer(struct uac_mixer_unit_descriptor *desc) | ||
| 292 | { | ||
| 293 | __u8 *raw = (__u8 *) desc; | ||
| 294 | return raw[desc->bLength - 1]; | ||
| 295 | } | ||
| 296 | |||
| 297 | /* 4.3.2.4 Selector Unit Descriptor */ | ||
| 298 | struct uac_selector_unit_descriptor { | ||
| 299 | __u8 bLength; | ||
| 300 | __u8 bDescriptorType; | ||
| 301 | __u8 bDescriptorSubtype; | ||
| 302 | __u8 bUintID; | ||
| 303 | __u8 bNrInPins; | ||
| 304 | __u8 baSourceID[]; | ||
| 305 | } __attribute__ ((packed)); | ||
| 306 | |||
| 307 | static inline __u8 uac_selector_unit_iSelector(struct uac_selector_unit_descriptor *desc) | ||
| 308 | { | ||
| 309 | __u8 *raw = (__u8 *) desc; | ||
| 310 | return raw[desc->bLength - 1]; | ||
| 311 | } | ||
| 312 | |||
| 313 | /* 4.3.2.5 Feature Unit Descriptor */ | ||
| 314 | struct uac_feature_unit_descriptor { | ||
| 315 | __u8 bLength; | ||
| 316 | __u8 bDescriptorType; | ||
| 317 | __u8 bDescriptorSubtype; | ||
| 318 | __u8 bUnitID; | ||
| 319 | __u8 bSourceID; | ||
| 320 | __u8 bControlSize; | ||
| 321 | __u8 bmaControls[0]; /* variable length */ | ||
| 322 | } __attribute__((packed)); | ||
| 323 | |||
| 324 | static inline __u8 uac_feature_unit_iFeature(struct uac_feature_unit_descriptor *desc) | ||
| 325 | { | ||
| 326 | __u8 *raw = (__u8 *) desc; | ||
| 327 | return raw[desc->bLength - 1]; | ||
| 328 | } | ||
| 329 | |||
| 330 | /* 4.3.2.6 Processing Unit Descriptors */ | ||
| 331 | struct uac_processing_unit_descriptor { | ||
| 332 | __u8 bLength; | ||
| 333 | __u8 bDescriptorType; | ||
| 334 | __u8 bDescriptorSubtype; | ||
| 335 | __u8 bUnitID; | ||
| 336 | __u16 wProcessType; | ||
| 337 | __u8 bNrInPins; | ||
| 338 | __u8 baSourceID[]; | ||
| 339 | } __attribute__ ((packed)); | ||
| 340 | |||
| 341 | static inline __u8 uac_processing_unit_bNrChannels(struct uac_processing_unit_descriptor *desc) | ||
| 342 | { | ||
| 343 | return desc->baSourceID[desc->bNrInPins]; | ||
| 344 | } | ||
| 345 | |||
| 346 | static inline __u32 uac_processing_unit_wChannelConfig(struct uac_processing_unit_descriptor *desc, | ||
| 347 | int protocol) | ||
| 348 | { | ||
| 349 | if (protocol == UAC_VERSION_1) | ||
| 350 | return (desc->baSourceID[desc->bNrInPins + 2] << 8) | | ||
| 351 | desc->baSourceID[desc->bNrInPins + 1]; | ||
| 352 | else | ||
| 353 | return (desc->baSourceID[desc->bNrInPins + 4] << 24) | | ||
| 354 | (desc->baSourceID[desc->bNrInPins + 3] << 16) | | ||
| 355 | (desc->baSourceID[desc->bNrInPins + 2] << 8) | | ||
| 356 | (desc->baSourceID[desc->bNrInPins + 1]); | ||
| 357 | } | ||
| 358 | |||
| 359 | static inline __u8 uac_processing_unit_iChannelNames(struct uac_processing_unit_descriptor *desc, | ||
| 360 | int protocol) | ||
| 361 | { | ||
| 362 | return (protocol == UAC_VERSION_1) ? | ||
| 363 | desc->baSourceID[desc->bNrInPins + 3] : | ||
| 364 | desc->baSourceID[desc->bNrInPins + 5]; | ||
| 365 | } | ||
| 366 | |||
| 367 | static inline __u8 uac_processing_unit_bControlSize(struct uac_processing_unit_descriptor *desc, | ||
| 368 | int protocol) | ||
| 369 | { | ||
| 370 | return (protocol == UAC_VERSION_1) ? | ||
| 371 | desc->baSourceID[desc->bNrInPins + 4] : | ||
| 372 | desc->baSourceID[desc->bNrInPins + 6]; | ||
| 373 | } | ||
| 374 | |||
| 375 | static inline __u8 *uac_processing_unit_bmControls(struct uac_processing_unit_descriptor *desc, | ||
| 376 | int protocol) | ||
| 377 | { | ||
| 378 | return (protocol == UAC_VERSION_1) ? | ||
| 379 | &desc->baSourceID[desc->bNrInPins + 5] : | ||
| 380 | &desc->baSourceID[desc->bNrInPins + 7]; | ||
| 381 | } | ||
| 382 | |||
| 383 | static inline __u8 uac_processing_unit_iProcessing(struct uac_processing_unit_descriptor *desc, | ||
| 384 | int protocol) | ||
| 385 | { | ||
| 386 | __u8 control_size = uac_processing_unit_bControlSize(desc, protocol); | ||
| 387 | return desc->baSourceID[desc->bNrInPins + control_size]; | ||
| 388 | } | ||
| 389 | |||
| 390 | static inline __u8 *uac_processing_unit_specific(struct uac_processing_unit_descriptor *desc, | ||
| 391 | int protocol) | ||
| 392 | { | ||
| 393 | __u8 control_size = uac_processing_unit_bControlSize(desc, protocol); | ||
| 394 | return &desc->baSourceID[desc->bNrInPins + control_size + 1]; | ||
| 395 | } | ||
| 396 | |||
| 397 | /* 4.5.2 Class-Specific AS Interface Descriptor */ | ||
| 398 | struct uac1_as_header_descriptor { | ||
| 399 | __u8 bLength; /* in bytes: 7 */ | ||
| 400 | __u8 bDescriptorType; /* USB_DT_CS_INTERFACE */ | ||
| 401 | __u8 bDescriptorSubtype; /* AS_GENERAL */ | ||
| 402 | __u8 bTerminalLink; /* Terminal ID of connected Terminal */ | ||
| 403 | __u8 bDelay; /* Delay introduced by the data path */ | ||
| 404 | __le16 wFormatTag; /* The Audio Data Format */ | ||
| 405 | } __attribute__ ((packed)); | ||
| 406 | |||
| 407 | #define UAC_DT_AS_HEADER_SIZE 7 | ||
| 408 | |||
| 409 | /* Formats - A.1.1 Audio Data Format Type I Codes */ | ||
| 410 | #define UAC_FORMAT_TYPE_I_UNDEFINED 0x0 | ||
| 411 | #define UAC_FORMAT_TYPE_I_PCM 0x1 | ||
| 412 | #define UAC_FORMAT_TYPE_I_PCM8 0x2 | ||
| 413 | #define UAC_FORMAT_TYPE_I_IEEE_FLOAT 0x3 | ||
| 414 | #define UAC_FORMAT_TYPE_I_ALAW 0x4 | ||
| 415 | #define UAC_FORMAT_TYPE_I_MULAW 0x5 | ||
| 416 | |||
| 417 | struct uac_format_type_i_continuous_descriptor { | ||
| 418 | __u8 bLength; /* in bytes: 8 + (ns * 3) */ | ||
| 419 | __u8 bDescriptorType; /* USB_DT_CS_INTERFACE */ | ||
| 420 | __u8 bDescriptorSubtype; /* FORMAT_TYPE */ | ||
| 421 | __u8 bFormatType; /* FORMAT_TYPE_1 */ | ||
| 422 | __u8 bNrChannels; /* physical channels in the stream */ | ||
| 423 | __u8 bSubframeSize; /* */ | ||
| 424 | __u8 bBitResolution; | ||
| 425 | __u8 bSamFreqType; | ||
| 426 | __u8 tLowerSamFreq[3]; | ||
| 427 | __u8 tUpperSamFreq[3]; | ||
| 428 | } __attribute__ ((packed)); | ||
| 429 | |||
| 430 | #define UAC_FORMAT_TYPE_I_CONTINUOUS_DESC_SIZE 14 | ||
| 431 | |||
| 432 | struct uac_format_type_i_discrete_descriptor { | ||
| 433 | __u8 bLength; /* in bytes: 8 + (ns * 3) */ | ||
| 434 | __u8 bDescriptorType; /* USB_DT_CS_INTERFACE */ | ||
| 435 | __u8 bDescriptorSubtype; /* FORMAT_TYPE */ | ||
| 436 | __u8 bFormatType; /* FORMAT_TYPE_1 */ | ||
| 437 | __u8 bNrChannels; /* physical channels in the stream */ | ||
| 438 | __u8 bSubframeSize; /* */ | ||
| 439 | __u8 bBitResolution; | ||
| 440 | __u8 bSamFreqType; | ||
| 441 | __u8 tSamFreq[][3]; | ||
| 442 | } __attribute__ ((packed)); | ||
| 443 | |||
| 444 | #define DECLARE_UAC_FORMAT_TYPE_I_DISCRETE_DESC(n) \ | ||
| 445 | struct uac_format_type_i_discrete_descriptor_##n { \ | ||
| 446 | __u8 bLength; \ | ||
| 447 | __u8 bDescriptorType; \ | ||
| 448 | __u8 bDescriptorSubtype; \ | ||
| 449 | __u8 bFormatType; \ | ||
| 450 | __u8 bNrChannels; \ | ||
| 451 | __u8 bSubframeSize; \ | ||
| 452 | __u8 bBitResolution; \ | ||
| 453 | __u8 bSamFreqType; \ | ||
| 454 | __u8 tSamFreq[n][3]; \ | ||
| 455 | } __attribute__ ((packed)) | ||
| 456 | |||
| 457 | #define UAC_FORMAT_TYPE_I_DISCRETE_DESC_SIZE(n) (8 + (n * 3)) | ||
| 458 | |||
| 459 | struct uac_format_type_i_ext_descriptor { | ||
| 460 | __u8 bLength; | ||
| 461 | __u8 bDescriptorType; | ||
| 462 | __u8 bDescriptorSubtype; | ||
| 463 | __u8 bFormatType; | ||
| 464 | __u8 bSubslotSize; | ||
| 465 | __u8 bBitResolution; | ||
| 466 | __u8 bHeaderLength; | ||
| 467 | __u8 bControlSize; | ||
| 468 | __u8 bSideBandProtocol; | ||
| 469 | } __attribute__((packed)); | ||
| 470 | |||
| 471 | /* Formats - Audio Data Format Type I Codes */ | ||
| 472 | |||
| 473 | #define UAC_FORMAT_TYPE_II_MPEG 0x1001 | ||
| 474 | #define UAC_FORMAT_TYPE_II_AC3 0x1002 | ||
| 475 | |||
| 476 | struct uac_format_type_ii_discrete_descriptor { | ||
| 477 | __u8 bLength; | ||
| 478 | __u8 bDescriptorType; | ||
| 479 | __u8 bDescriptorSubtype; | ||
| 480 | __u8 bFormatType; | ||
| 481 | __le16 wMaxBitRate; | ||
| 482 | __le16 wSamplesPerFrame; | ||
| 483 | __u8 bSamFreqType; | ||
| 484 | __u8 tSamFreq[][3]; | ||
| 485 | } __attribute__((packed)); | ||
| 486 | |||
| 487 | struct uac_format_type_ii_ext_descriptor { | ||
| 488 | __u8 bLength; | ||
| 489 | __u8 bDescriptorType; | ||
| 490 | __u8 bDescriptorSubtype; | ||
| 491 | __u8 bFormatType; | ||
| 492 | __u16 wMaxBitRate; | ||
| 493 | __u16 wSamplesPerFrame; | ||
| 494 | __u8 bHeaderLength; | ||
| 495 | __u8 bSideBandProtocol; | ||
| 496 | } __attribute__((packed)); | ||
| 497 | |||
| 498 | /* type III */ | ||
| 499 | #define UAC_FORMAT_TYPE_III_IEC1937_AC3 0x2001 | ||
| 500 | #define UAC_FORMAT_TYPE_III_IEC1937_MPEG1_LAYER1 0x2002 | ||
| 501 | #define UAC_FORMAT_TYPE_III_IEC1937_MPEG2_NOEXT 0x2003 | ||
| 502 | #define UAC_FORMAT_TYPE_III_IEC1937_MPEG2_EXT 0x2004 | ||
| 503 | #define UAC_FORMAT_TYPE_III_IEC1937_MPEG2_LAYER1_LS 0x2005 | ||
| 504 | #define UAC_FORMAT_TYPE_III_IEC1937_MPEG2_LAYER23_LS 0x2006 | ||
| 505 | |||
| 506 | /* Formats - A.2 Format Type Codes */ | ||
| 507 | #define UAC_FORMAT_TYPE_UNDEFINED 0x0 | ||
| 508 | #define UAC_FORMAT_TYPE_I 0x1 | ||
| 509 | #define UAC_FORMAT_TYPE_II 0x2 | ||
| 510 | #define UAC_FORMAT_TYPE_III 0x3 | ||
| 511 | #define UAC_EXT_FORMAT_TYPE_I 0x81 | ||
| 512 | #define UAC_EXT_FORMAT_TYPE_II 0x82 | ||
| 513 | #define UAC_EXT_FORMAT_TYPE_III 0x83 | ||
| 514 | |||
| 515 | struct uac_iso_endpoint_descriptor { | ||
| 516 | __u8 bLength; /* in bytes: 7 */ | ||
| 517 | __u8 bDescriptorType; /* USB_DT_CS_ENDPOINT */ | ||
| 518 | __u8 bDescriptorSubtype; /* EP_GENERAL */ | ||
| 519 | __u8 bmAttributes; | ||
| 520 | __u8 bLockDelayUnits; | ||
| 521 | __le16 wLockDelay; | ||
| 522 | } __attribute__((packed)); | ||
| 523 | #define UAC_ISO_ENDPOINT_DESC_SIZE 7 | ||
| 524 | |||
| 525 | #define UAC_EP_CS_ATTR_SAMPLE_RATE 0x01 | ||
| 526 | #define UAC_EP_CS_ATTR_PITCH_CONTROL 0x02 | ||
| 527 | #define UAC_EP_CS_ATTR_FILL_MAX 0x80 | ||
| 528 | |||
| 529 | /* status word format (3.7.1.1) */ | ||
| 530 | |||
| 531 | #define UAC1_STATUS_TYPE_ORIG_MASK 0x0f | ||
| 532 | #define UAC1_STATUS_TYPE_ORIG_AUDIO_CONTROL_IF 0x0 | ||
| 533 | #define UAC1_STATUS_TYPE_ORIG_AUDIO_STREAM_IF 0x1 | ||
| 534 | #define UAC1_STATUS_TYPE_ORIG_AUDIO_STREAM_EP 0x2 | ||
| 535 | |||
| 536 | #define UAC1_STATUS_TYPE_IRQ_PENDING (1 << 7) | ||
| 537 | #define UAC1_STATUS_TYPE_MEM_CHANGED (1 << 6) | ||
| 538 | |||
| 539 | struct uac1_status_word { | ||
| 540 | __u8 bStatusType; | ||
| 541 | __u8 bOriginator; | ||
| 542 | } __attribute__((packed)); | ||
| 543 | |||
| 544 | |||
| 545 | #endif /* _UAPI__LINUX_USB_AUDIO_H */ | ||
diff --git a/include/linux/usb/cdc.h b/include/uapi/linux/usb/cdc.h index 81a927930bfd..81a927930bfd 100644 --- a/include/linux/usb/cdc.h +++ b/include/uapi/linux/usb/cdc.h | |||
diff --git a/include/linux/usb/ch11.h b/include/uapi/linux/usb/ch11.h index 7692dc69ccf7..7692dc69ccf7 100644 --- a/include/linux/usb/ch11.h +++ b/include/uapi/linux/usb/ch11.h | |||
diff --git a/include/uapi/linux/usb/ch9.h b/include/uapi/linux/usb/ch9.h new file mode 100644 index 000000000000..50598472dc41 --- /dev/null +++ b/include/uapi/linux/usb/ch9.h | |||
| @@ -0,0 +1,993 @@ | |||
| 1 | /* | ||
| 2 | * This file holds USB constants and structures that are needed for | ||
| 3 | * USB device APIs. These are used by the USB device model, which is | ||
| 4 | * defined in chapter 9 of the USB 2.0 specification and in the | ||
| 5 | * Wireless USB 1.0 (spread around). Linux has several APIs in C that | ||
| 6 | * need these: | ||
| 7 | * | ||
| 8 | * - the master/host side Linux-USB kernel driver API; | ||
| 9 | * - the "usbfs" user space API; and | ||
| 10 | * - the Linux "gadget" slave/device/peripheral side driver API. | ||
| 11 | * | ||
| 12 | * USB 2.0 adds an additional "On The Go" (OTG) mode, which lets systems | ||
| 13 | * act either as a USB master/host or as a USB slave/device. That means | ||
| 14 | * the master and slave side APIs benefit from working well together. | ||
| 15 | * | ||
| 16 | * There's also "Wireless USB", using low power short range radios for | ||
| 17 | * peripheral interconnection but otherwise building on the USB framework. | ||
| 18 | * | ||
| 19 | * Note all descriptors are declared '__attribute__((packed))' so that: | ||
| 20 | * | ||
| 21 | * [a] they never get padded, either internally (USB spec writers | ||
| 22 | * probably handled that) or externally; | ||
| 23 | * | ||
| 24 | * [b] so that accessing bigger-than-a-bytes fields will never | ||
| 25 | * generate bus errors on any platform, even when the location of | ||
| 26 | * its descriptor inside a bundle isn't "naturally aligned", and | ||
| 27 | * | ||
| 28 | * [c] for consistency, removing all doubt even when it appears to | ||
| 29 | * someone that the two other points are non-issues for that | ||
| 30 | * particular descriptor type. | ||
| 31 | */ | ||
| 32 | |||
| 33 | #ifndef _UAPI__LINUX_USB_CH9_H | ||
| 34 | #define _UAPI__LINUX_USB_CH9_H | ||
| 35 | |||
| 36 | #include <linux/types.h> /* __u8 etc */ | ||
| 37 | #include <asm/byteorder.h> /* le16_to_cpu */ | ||
| 38 | |||
| 39 | /*-------------------------------------------------------------------------*/ | ||
| 40 | |||
| 41 | /* CONTROL REQUEST SUPPORT */ | ||
| 42 | |||
| 43 | /* | ||
| 44 | * USB directions | ||
| 45 | * | ||
| 46 | * This bit flag is used in endpoint descriptors' bEndpointAddress field. | ||
| 47 | * It's also one of three fields in control requests bRequestType. | ||
| 48 | */ | ||
| 49 | #define USB_DIR_OUT 0 /* to device */ | ||
| 50 | #define USB_DIR_IN 0x80 /* to host */ | ||
| 51 | |||
| 52 | /* | ||
| 53 | * USB types, the second of three bRequestType fields | ||
| 54 | */ | ||
| 55 | #define USB_TYPE_MASK (0x03 << 5) | ||
| 56 | #define USB_TYPE_STANDARD (0x00 << 5) | ||
| 57 | #define USB_TYPE_CLASS (0x01 << 5) | ||
| 58 | #define USB_TYPE_VENDOR (0x02 << 5) | ||
| 59 | #define USB_TYPE_RESERVED (0x03 << 5) | ||
| 60 | |||
| 61 | /* | ||
| 62 | * USB recipients, the third of three bRequestType fields | ||
| 63 | */ | ||
| 64 | #define USB_RECIP_MASK 0x1f | ||
| 65 | #define USB_RECIP_DEVICE 0x00 | ||
| 66 | #define USB_RECIP_INTERFACE 0x01 | ||
| 67 | #define USB_RECIP_ENDPOINT 0x02 | ||
| 68 | #define USB_RECIP_OTHER 0x03 | ||
| 69 | /* From Wireless USB 1.0 */ | ||
| 70 | #define USB_RECIP_PORT 0x04 | ||
| 71 | #define USB_RECIP_RPIPE 0x05 | ||
| 72 | |||
| 73 | /* | ||
| 74 | * Standard requests, for the bRequest field of a SETUP packet. | ||
| 75 | * | ||
| 76 | * These are qualified by the bRequestType field, so that for example | ||
| 77 | * TYPE_CLASS or TYPE_VENDOR specific feature flags could be retrieved | ||
| 78 | * by a GET_STATUS request. | ||
| 79 | */ | ||
| 80 | #define USB_REQ_GET_STATUS 0x00 | ||
| 81 | #define USB_REQ_CLEAR_FEATURE 0x01 | ||
| 82 | #define USB_REQ_SET_FEATURE 0x03 | ||
| 83 | #define USB_REQ_SET_ADDRESS 0x05 | ||
| 84 | #define USB_REQ_GET_DESCRIPTOR 0x06 | ||
| 85 | #define USB_REQ_SET_DESCRIPTOR 0x07 | ||
| 86 | #define USB_REQ_GET_CONFIGURATION 0x08 | ||
| 87 | #define USB_REQ_SET_CONFIGURATION 0x09 | ||
| 88 | #define USB_REQ_GET_INTERFACE 0x0A | ||
| 89 | #define USB_REQ_SET_INTERFACE 0x0B | ||
| 90 | #define USB_REQ_SYNCH_FRAME 0x0C | ||
| 91 | #define USB_REQ_SET_SEL 0x30 | ||
| 92 | #define USB_REQ_SET_ISOCH_DELAY 0x31 | ||
| 93 | |||
| 94 | #define USB_REQ_SET_ENCRYPTION 0x0D /* Wireless USB */ | ||
| 95 | #define USB_REQ_GET_ENCRYPTION 0x0E | ||
| 96 | #define USB_REQ_RPIPE_ABORT 0x0E | ||
| 97 | #define USB_REQ_SET_HANDSHAKE 0x0F | ||
| 98 | #define USB_REQ_RPIPE_RESET 0x0F | ||
| 99 | #define USB_REQ_GET_HANDSHAKE 0x10 | ||
| 100 | #define USB_REQ_SET_CONNECTION 0x11 | ||
| 101 | #define USB_REQ_SET_SECURITY_DATA 0x12 | ||
| 102 | #define USB_REQ_GET_SECURITY_DATA 0x13 | ||
| 103 | #define USB_REQ_SET_WUSB_DATA 0x14 | ||
| 104 | #define USB_REQ_LOOPBACK_DATA_WRITE 0x15 | ||
| 105 | #define USB_REQ_LOOPBACK_DATA_READ 0x16 | ||
| 106 | #define USB_REQ_SET_INTERFACE_DS 0x17 | ||
| 107 | |||
| 108 | /* The Link Power Management (LPM) ECN defines USB_REQ_TEST_AND_SET command, | ||
| 109 | * used by hubs to put ports into a new L1 suspend state, except that it | ||
| 110 | * forgot to define its number ... | ||
| 111 | */ | ||
| 112 | |||
| 113 | /* | ||
| 114 | * USB feature flags are written using USB_REQ_{CLEAR,SET}_FEATURE, and | ||
| 115 | * are read as a bit array returned by USB_REQ_GET_STATUS. (So there | ||
| 116 | * are at most sixteen features of each type.) Hubs may also support a | ||
| 117 | * new USB_REQ_TEST_AND_SET_FEATURE to put ports into L1 suspend. | ||
| 118 | */ | ||
| 119 | #define USB_DEVICE_SELF_POWERED 0 /* (read only) */ | ||
| 120 | #define USB_DEVICE_REMOTE_WAKEUP 1 /* dev may initiate wakeup */ | ||
| 121 | #define USB_DEVICE_TEST_MODE 2 /* (wired high speed only) */ | ||
| 122 | #define USB_DEVICE_BATTERY 2 /* (wireless) */ | ||
| 123 | #define USB_DEVICE_B_HNP_ENABLE 3 /* (otg) dev may initiate HNP */ | ||
| 124 | #define USB_DEVICE_WUSB_DEVICE 3 /* (wireless)*/ | ||
| 125 | #define USB_DEVICE_A_HNP_SUPPORT 4 /* (otg) RH port supports HNP */ | ||
| 126 | #define USB_DEVICE_A_ALT_HNP_SUPPORT 5 /* (otg) other RH port does */ | ||
| 127 | #define USB_DEVICE_DEBUG_MODE 6 /* (special devices only) */ | ||
| 128 | |||
| 129 | /* | ||
| 130 | * Test Mode Selectors | ||
| 131 | * See USB 2.0 spec Table 9-7 | ||
| 132 | */ | ||
| 133 | #define TEST_J 1 | ||
| 134 | #define TEST_K 2 | ||
| 135 | #define TEST_SE0_NAK 3 | ||
| 136 | #define TEST_PACKET 4 | ||
| 137 | #define TEST_FORCE_EN 5 | ||
| 138 | |||
| 139 | /* | ||
| 140 | * New Feature Selectors as added by USB 3.0 | ||
| 141 | * See USB 3.0 spec Table 9-6 | ||
| 142 | */ | ||
| 143 | #define USB_DEVICE_U1_ENABLE 48 /* dev may initiate U1 transition */ | ||
| 144 | #define USB_DEVICE_U2_ENABLE 49 /* dev may initiate U2 transition */ | ||
| 145 | #define USB_DEVICE_LTM_ENABLE 50 /* dev may send LTM */ | ||
| 146 | #define USB_INTRF_FUNC_SUSPEND 0 /* function suspend */ | ||
| 147 | |||
| 148 | #define USB_INTR_FUNC_SUSPEND_OPT_MASK 0xFF00 | ||
| 149 | /* | ||
| 150 | * Suspend Options, Table 9-7 USB 3.0 spec | ||
| 151 | */ | ||
| 152 | #define USB_INTRF_FUNC_SUSPEND_LP (1 << (8 + 0)) | ||
| 153 | #define USB_INTRF_FUNC_SUSPEND_RW (1 << (8 + 1)) | ||
| 154 | |||
| 155 | #define USB_ENDPOINT_HALT 0 /* IN/OUT will STALL */ | ||
| 156 | |||
| 157 | /* Bit array elements as returned by the USB_REQ_GET_STATUS request. */ | ||
| 158 | #define USB_DEV_STAT_U1_ENABLED 2 /* transition into U1 state */ | ||
| 159 | #define USB_DEV_STAT_U2_ENABLED 3 /* transition into U2 state */ | ||
| 160 | #define USB_DEV_STAT_LTM_ENABLED 4 /* Latency tolerance messages */ | ||
| 161 | |||
| 162 | /** | ||
| 163 | * struct usb_ctrlrequest - SETUP data for a USB device control request | ||
| 164 | * @bRequestType: matches the USB bmRequestType field | ||
| 165 | * @bRequest: matches the USB bRequest field | ||
| 166 | * @wValue: matches the USB wValue field (le16 byte order) | ||
| 167 | * @wIndex: matches the USB wIndex field (le16 byte order) | ||
| 168 | * @wLength: matches the USB wLength field (le16 byte order) | ||
| 169 | * | ||
| 170 | * This structure is used to send control requests to a USB device. It matches | ||
| 171 | * the different fields of the USB 2.0 Spec section 9.3, table 9-2. See the | ||
| 172 | * USB spec for a fuller description of the different fields, and what they are | ||
| 173 | * used for. | ||
| 174 | * | ||
| 175 | * Note that the driver for any interface can issue control requests. | ||
| 176 | * For most devices, interfaces don't coordinate with each other, so | ||
| 177 | * such requests may be made at any time. | ||
| 178 | */ | ||
| 179 | struct usb_ctrlrequest { | ||
| 180 | __u8 bRequestType; | ||
| 181 | __u8 bRequest; | ||
| 182 | __le16 wValue; | ||
| 183 | __le16 wIndex; | ||
| 184 | __le16 wLength; | ||
| 185 | } __attribute__ ((packed)); | ||
| 186 | |||
| 187 | /*-------------------------------------------------------------------------*/ | ||
| 188 | |||
| 189 | /* | ||
| 190 | * STANDARD DESCRIPTORS ... as returned by GET_DESCRIPTOR, or | ||
| 191 | * (rarely) accepted by SET_DESCRIPTOR. | ||
| 192 | * | ||
| 193 | * Note that all multi-byte values here are encoded in little endian | ||
| 194 | * byte order "on the wire". Within the kernel and when exposed | ||
| 195 | * through the Linux-USB APIs, they are not converted to cpu byte | ||
| 196 | * order; it is the responsibility of the client code to do this. | ||
| 197 | * The single exception is when device and configuration descriptors (but | ||
| 198 | * not other descriptors) are read from usbfs (i.e. /proc/bus/usb/BBB/DDD); | ||
| 199 | * in this case the fields are converted to host endianness by the kernel. | ||
| 200 | */ | ||
| 201 | |||
| 202 | /* | ||
| 203 | * Descriptor types ... USB 2.0 spec table 9.5 | ||
| 204 | */ | ||
| 205 | #define USB_DT_DEVICE 0x01 | ||
| 206 | #define USB_DT_CONFIG 0x02 | ||
| 207 | #define USB_DT_STRING 0x03 | ||
| 208 | #define USB_DT_INTERFACE 0x04 | ||
| 209 | #define USB_DT_ENDPOINT 0x05 | ||
| 210 | #define USB_DT_DEVICE_QUALIFIER 0x06 | ||
| 211 | #define USB_DT_OTHER_SPEED_CONFIG 0x07 | ||
| 212 | #define USB_DT_INTERFACE_POWER 0x08 | ||
| 213 | /* these are from a minor usb 2.0 revision (ECN) */ | ||
| 214 | #define USB_DT_OTG 0x09 | ||
| 215 | #define USB_DT_DEBUG 0x0a | ||
| 216 | #define USB_DT_INTERFACE_ASSOCIATION 0x0b | ||
| 217 | /* these are from the Wireless USB spec */ | ||
| 218 | #define USB_DT_SECURITY 0x0c | ||
| 219 | #define USB_DT_KEY 0x0d | ||
| 220 | #define USB_DT_ENCRYPTION_TYPE 0x0e | ||
| 221 | #define USB_DT_BOS 0x0f | ||
| 222 | #define USB_DT_DEVICE_CAPABILITY 0x10 | ||
| 223 | #define USB_DT_WIRELESS_ENDPOINT_COMP 0x11 | ||
| 224 | #define USB_DT_WIRE_ADAPTER 0x21 | ||
| 225 | #define USB_DT_RPIPE 0x22 | ||
| 226 | #define USB_DT_CS_RADIO_CONTROL 0x23 | ||
| 227 | /* From the T10 UAS specification */ | ||
| 228 | #define USB_DT_PIPE_USAGE 0x24 | ||
| 229 | /* From the USB 3.0 spec */ | ||
| 230 | #define USB_DT_SS_ENDPOINT_COMP 0x30 | ||
| 231 | |||
| 232 | /* Conventional codes for class-specific descriptors. The convention is | ||
| 233 | * defined in the USB "Common Class" Spec (3.11). Individual class specs | ||
| 234 | * are authoritative for their usage, not the "common class" writeup. | ||
| 235 | */ | ||
| 236 | #define USB_DT_CS_DEVICE (USB_TYPE_CLASS | USB_DT_DEVICE) | ||
| 237 | #define USB_DT_CS_CONFIG (USB_TYPE_CLASS | USB_DT_CONFIG) | ||
| 238 | #define USB_DT_CS_STRING (USB_TYPE_CLASS | USB_DT_STRING) | ||
| 239 | #define USB_DT_CS_INTERFACE (USB_TYPE_CLASS | USB_DT_INTERFACE) | ||
| 240 | #define USB_DT_CS_ENDPOINT (USB_TYPE_CLASS | USB_DT_ENDPOINT) | ||
| 241 | |||
| 242 | /* All standard descriptors have these 2 fields at the beginning */ | ||
| 243 | struct usb_descriptor_header { | ||
| 244 | __u8 bLength; | ||
| 245 | __u8 bDescriptorType; | ||
| 246 | } __attribute__ ((packed)); | ||
| 247 | |||
| 248 | |||
| 249 | /*-------------------------------------------------------------------------*/ | ||
| 250 | |||
| 251 | /* USB_DT_DEVICE: Device descriptor */ | ||
| 252 | struct usb_device_descriptor { | ||
| 253 | __u8 bLength; | ||
| 254 | __u8 bDescriptorType; | ||
| 255 | |||
| 256 | __le16 bcdUSB; | ||
| 257 | __u8 bDeviceClass; | ||
| 258 | __u8 bDeviceSubClass; | ||
| 259 | __u8 bDeviceProtocol; | ||
| 260 | __u8 bMaxPacketSize0; | ||
| 261 | __le16 idVendor; | ||
| 262 | __le16 idProduct; | ||
| 263 | __le16 bcdDevice; | ||
| 264 | __u8 iManufacturer; | ||
| 265 | __u8 iProduct; | ||
| 266 | __u8 iSerialNumber; | ||
| 267 | __u8 bNumConfigurations; | ||
| 268 | } __attribute__ ((packed)); | ||
| 269 | |||
| 270 | #define USB_DT_DEVICE_SIZE 18 | ||
| 271 | |||
| 272 | |||
| 273 | /* | ||
| 274 | * Device and/or Interface Class codes | ||
| 275 | * as found in bDeviceClass or bInterfaceClass | ||
| 276 | * and defined by www.usb.org documents | ||
| 277 | */ | ||
| 278 | #define USB_CLASS_PER_INTERFACE 0 /* for DeviceClass */ | ||
| 279 | #define USB_CLASS_AUDIO 1 | ||
| 280 | #define USB_CLASS_COMM 2 | ||
| 281 | #define USB_CLASS_HID 3 | ||
| 282 | #define USB_CLASS_PHYSICAL 5 | ||
| 283 | #define USB_CLASS_STILL_IMAGE 6 | ||
| 284 | #define USB_CLASS_PRINTER 7 | ||
| 285 | #define USB_CLASS_MASS_STORAGE 8 | ||
| 286 | #define USB_CLASS_HUB 9 | ||
| 287 | #define USB_CLASS_CDC_DATA 0x0a | ||
| 288 | #define USB_CLASS_CSCID 0x0b /* chip+ smart card */ | ||
| 289 | #define USB_CLASS_CONTENT_SEC 0x0d /* content security */ | ||
| 290 | #define USB_CLASS_VIDEO 0x0e | ||
| 291 | #define USB_CLASS_WIRELESS_CONTROLLER 0xe0 | ||
| 292 | #define USB_CLASS_MISC 0xef | ||
| 293 | #define USB_CLASS_APP_SPEC 0xfe | ||
| 294 | #define USB_CLASS_VENDOR_SPEC 0xff | ||
| 295 | |||
| 296 | #define USB_SUBCLASS_VENDOR_SPEC 0xff | ||
| 297 | |||
| 298 | /*-------------------------------------------------------------------------*/ | ||
| 299 | |||
| 300 | /* USB_DT_CONFIG: Configuration descriptor information. | ||
| 301 | * | ||
| 302 | * USB_DT_OTHER_SPEED_CONFIG is the same descriptor, except that the | ||
| 303 | * descriptor type is different. Highspeed-capable devices can look | ||
| 304 | * different depending on what speed they're currently running. Only | ||
| 305 | * devices with a USB_DT_DEVICE_QUALIFIER have any OTHER_SPEED_CONFIG | ||
| 306 | * descriptors. | ||
| 307 | */ | ||
| 308 | struct usb_config_descriptor { | ||
| 309 | __u8 bLength; | ||
| 310 | __u8 bDescriptorType; | ||
| 311 | |||
| 312 | __le16 wTotalLength; | ||
| 313 | __u8 bNumInterfaces; | ||
| 314 | __u8 bConfigurationValue; | ||
| 315 | __u8 iConfiguration; | ||
| 316 | __u8 bmAttributes; | ||
| 317 | __u8 bMaxPower; | ||
| 318 | } __attribute__ ((packed)); | ||
| 319 | |||
| 320 | #define USB_DT_CONFIG_SIZE 9 | ||
| 321 | |||
| 322 | /* from config descriptor bmAttributes */ | ||
| 323 | #define USB_CONFIG_ATT_ONE (1 << 7) /* must be set */ | ||
| 324 | #define USB_CONFIG_ATT_SELFPOWER (1 << 6) /* self powered */ | ||
| 325 | #define USB_CONFIG_ATT_WAKEUP (1 << 5) /* can wakeup */ | ||
| 326 | #define USB_CONFIG_ATT_BATTERY (1 << 4) /* battery powered */ | ||
| 327 | |||
| 328 | /*-------------------------------------------------------------------------*/ | ||
| 329 | |||
| 330 | /* USB_DT_STRING: String descriptor */ | ||
| 331 | struct usb_string_descriptor { | ||
| 332 | __u8 bLength; | ||
| 333 | __u8 bDescriptorType; | ||
| 334 | |||
| 335 | __le16 wData[1]; /* UTF-16LE encoded */ | ||
| 336 | } __attribute__ ((packed)); | ||
| 337 | |||
| 338 | /* note that "string" zero is special, it holds language codes that | ||
| 339 | * the device supports, not Unicode characters. | ||
| 340 | */ | ||
| 341 | |||
| 342 | /*-------------------------------------------------------------------------*/ | ||
| 343 | |||
| 344 | /* USB_DT_INTERFACE: Interface descriptor */ | ||
| 345 | struct usb_interface_descriptor { | ||
| 346 | __u8 bLength; | ||
| 347 | __u8 bDescriptorType; | ||
| 348 | |||
| 349 | __u8 bInterfaceNumber; | ||
| 350 | __u8 bAlternateSetting; | ||
| 351 | __u8 bNumEndpoints; | ||
| 352 | __u8 bInterfaceClass; | ||
| 353 | __u8 bInterfaceSubClass; | ||
| 354 | __u8 bInterfaceProtocol; | ||
| 355 | __u8 iInterface; | ||
| 356 | } __attribute__ ((packed)); | ||
| 357 | |||
| 358 | #define USB_DT_INTERFACE_SIZE 9 | ||
| 359 | |||
| 360 | /*-------------------------------------------------------------------------*/ | ||
| 361 | |||
| 362 | /* USB_DT_ENDPOINT: Endpoint descriptor */ | ||
| 363 | struct usb_endpoint_descriptor { | ||
| 364 | __u8 bLength; | ||
| 365 | __u8 bDescriptorType; | ||
| 366 | |||
| 367 | __u8 bEndpointAddress; | ||
| 368 | __u8 bmAttributes; | ||
| 369 | __le16 wMaxPacketSize; | ||
| 370 | __u8 bInterval; | ||
| 371 | |||
| 372 | /* NOTE: these two are _only_ in audio endpoints. */ | ||
| 373 | /* use USB_DT_ENDPOINT*_SIZE in bLength, not sizeof. */ | ||
| 374 | __u8 bRefresh; | ||
| 375 | __u8 bSynchAddress; | ||
| 376 | } __attribute__ ((packed)); | ||
| 377 | |||
| 378 | #define USB_DT_ENDPOINT_SIZE 7 | ||
| 379 | #define USB_DT_ENDPOINT_AUDIO_SIZE 9 /* Audio extension */ | ||
| 380 | |||
| 381 | |||
| 382 | /* | ||
| 383 | * Endpoints | ||
| 384 | */ | ||
| 385 | #define USB_ENDPOINT_NUMBER_MASK 0x0f /* in bEndpointAddress */ | ||
| 386 | #define USB_ENDPOINT_DIR_MASK 0x80 | ||
| 387 | |||
| 388 | #define USB_ENDPOINT_XFERTYPE_MASK 0x03 /* in bmAttributes */ | ||
| 389 | #define USB_ENDPOINT_XFER_CONTROL 0 | ||
| 390 | #define USB_ENDPOINT_XFER_ISOC 1 | ||
| 391 | #define USB_ENDPOINT_XFER_BULK 2 | ||
| 392 | #define USB_ENDPOINT_XFER_INT 3 | ||
| 393 | #define USB_ENDPOINT_MAX_ADJUSTABLE 0x80 | ||
| 394 | |||
| 395 | /* The USB 3.0 spec redefines bits 5:4 of bmAttributes as interrupt ep type. */ | ||
| 396 | #define USB_ENDPOINT_INTRTYPE 0x30 | ||
| 397 | #define USB_ENDPOINT_INTR_PERIODIC (0 << 4) | ||
| 398 | #define USB_ENDPOINT_INTR_NOTIFICATION (1 << 4) | ||
| 399 | |||
| 400 | #define USB_ENDPOINT_SYNCTYPE 0x0c | ||
| 401 | #define USB_ENDPOINT_SYNC_NONE (0 << 2) | ||
| 402 | #define USB_ENDPOINT_SYNC_ASYNC (1 << 2) | ||
| 403 | #define USB_ENDPOINT_SYNC_ADAPTIVE (2 << 2) | ||
| 404 | #define USB_ENDPOINT_SYNC_SYNC (3 << 2) | ||
| 405 | |||
| 406 | #define USB_ENDPOINT_USAGE_MASK 0x30 | ||
| 407 | #define USB_ENDPOINT_USAGE_DATA 0x00 | ||
| 408 | #define USB_ENDPOINT_USAGE_FEEDBACK 0x10 | ||
| 409 | #define USB_ENDPOINT_USAGE_IMPLICIT_FB 0x20 /* Implicit feedback Data endpoint */ | ||
| 410 | |||
| 411 | /*-------------------------------------------------------------------------*/ | ||
| 412 | |||
| 413 | /** | ||
| 414 | * usb_endpoint_num - get the endpoint's number | ||
| 415 | * @epd: endpoint to be checked | ||
| 416 | * | ||
| 417 | * Returns @epd's number: 0 to 15. | ||
| 418 | */ | ||
| 419 | static inline int usb_endpoint_num(const struct usb_endpoint_descriptor *epd) | ||
| 420 | { | ||
| 421 | return epd->bEndpointAddress & USB_ENDPOINT_NUMBER_MASK; | ||
| 422 | } | ||
| 423 | |||
| 424 | /** | ||
| 425 | * usb_endpoint_type - get the endpoint's transfer type | ||
| 426 | * @epd: endpoint to be checked | ||
| 427 | * | ||
| 428 | * Returns one of USB_ENDPOINT_XFER_{CONTROL, ISOC, BULK, INT} according | ||
| 429 | * to @epd's transfer type. | ||
| 430 | */ | ||
| 431 | static inline int usb_endpoint_type(const struct usb_endpoint_descriptor *epd) | ||
| 432 | { | ||
| 433 | return epd->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK; | ||
| 434 | } | ||
| 435 | |||
| 436 | /** | ||
| 437 | * usb_endpoint_dir_in - check if the endpoint has IN direction | ||
| 438 | * @epd: endpoint to be checked | ||
| 439 | * | ||
| 440 | * Returns true if the endpoint is of type IN, otherwise it returns false. | ||
| 441 | */ | ||
| 442 | static inline int usb_endpoint_dir_in(const struct usb_endpoint_descriptor *epd) | ||
| 443 | { | ||
| 444 | return ((epd->bEndpointAddress & USB_ENDPOINT_DIR_MASK) == USB_DIR_IN); | ||
| 445 | } | ||
| 446 | |||
| 447 | /** | ||
| 448 | * usb_endpoint_dir_out - check if the endpoint has OUT direction | ||
| 449 | * @epd: endpoint to be checked | ||
| 450 | * | ||
| 451 | * Returns true if the endpoint is of type OUT, otherwise it returns false. | ||
| 452 | */ | ||
| 453 | static inline int usb_endpoint_dir_out( | ||
| 454 | const struct usb_endpoint_descriptor *epd) | ||
| 455 | { | ||
| 456 | return ((epd->bEndpointAddress & USB_ENDPOINT_DIR_MASK) == USB_DIR_OUT); | ||
| 457 | } | ||
| 458 | |||
| 459 | /** | ||
| 460 | * usb_endpoint_xfer_bulk - check if the endpoint has bulk transfer type | ||
| 461 | * @epd: endpoint to be checked | ||
| 462 | * | ||
| 463 | * Returns true if the endpoint is of type bulk, otherwise it returns false. | ||
| 464 | */ | ||
| 465 | static inline int usb_endpoint_xfer_bulk( | ||
| 466 | const struct usb_endpoint_descriptor *epd) | ||
| 467 | { | ||
| 468 | return ((epd->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) == | ||
| 469 | USB_ENDPOINT_XFER_BULK); | ||
| 470 | } | ||
| 471 | |||
| 472 | /** | ||
| 473 | * usb_endpoint_xfer_control - check if the endpoint has control transfer type | ||
| 474 | * @epd: endpoint to be checked | ||
| 475 | * | ||
| 476 | * Returns true if the endpoint is of type control, otherwise it returns false. | ||
| 477 | */ | ||
| 478 | static inline int usb_endpoint_xfer_control( | ||
| 479 | const struct usb_endpoint_descriptor *epd) | ||
| 480 | { | ||
| 481 | return ((epd->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) == | ||
| 482 | USB_ENDPOINT_XFER_CONTROL); | ||
| 483 | } | ||
| 484 | |||
| 485 | /** | ||
| 486 | * usb_endpoint_xfer_int - check if the endpoint has interrupt transfer type | ||
| 487 | * @epd: endpoint to be checked | ||
| 488 | * | ||
| 489 | * Returns true if the endpoint is of type interrupt, otherwise it returns | ||
| 490 | * false. | ||
| 491 | */ | ||
| 492 | static inline int usb_endpoint_xfer_int( | ||
| 493 | const struct usb_endpoint_descriptor *epd) | ||
| 494 | { | ||
| 495 | return ((epd->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) == | ||
| 496 | USB_ENDPOINT_XFER_INT); | ||
| 497 | } | ||
| 498 | |||
| 499 | /** | ||
| 500 | * usb_endpoint_xfer_isoc - check if the endpoint has isochronous transfer type | ||
| 501 | * @epd: endpoint to be checked | ||
| 502 | * | ||
| 503 | * Returns true if the endpoint is of type isochronous, otherwise it returns | ||
| 504 | * false. | ||
| 505 | */ | ||
| 506 | static inline int usb_endpoint_xfer_isoc( | ||
| 507 | const struct usb_endpoint_descriptor *epd) | ||
| 508 | { | ||
| 509 | return ((epd->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) == | ||
| 510 | USB_ENDPOINT_XFER_ISOC); | ||
| 511 | } | ||
| 512 | |||
| 513 | /** | ||
| 514 | * usb_endpoint_is_bulk_in - check if the endpoint is bulk IN | ||
| 515 | * @epd: endpoint to be checked | ||
| 516 | * | ||
| 517 | * Returns true if the endpoint has bulk transfer type and IN direction, | ||
| 518 | * otherwise it returns false. | ||
| 519 | */ | ||
| 520 | static inline int usb_endpoint_is_bulk_in( | ||
| 521 | const struct usb_endpoint_descriptor *epd) | ||
| 522 | { | ||
| 523 | return usb_endpoint_xfer_bulk(epd) && usb_endpoint_dir_in(epd); | ||
| 524 | } | ||
| 525 | |||
| 526 | /** | ||
| 527 | * usb_endpoint_is_bulk_out - check if the endpoint is bulk OUT | ||
| 528 | * @epd: endpoint to be checked | ||
| 529 | * | ||
| 530 | * Returns true if the endpoint has bulk transfer type and OUT direction, | ||
| 531 | * otherwise it returns false. | ||
| 532 | */ | ||
| 533 | static inline int usb_endpoint_is_bulk_out( | ||
| 534 | const struct usb_endpoint_descriptor *epd) | ||
| 535 | { | ||
| 536 | return usb_endpoint_xfer_bulk(epd) && usb_endpoint_dir_out(epd); | ||
| 537 | } | ||
| 538 | |||
| 539 | /** | ||
| 540 | * usb_endpoint_is_int_in - check if the endpoint is interrupt IN | ||
| 541 | * @epd: endpoint to be checked | ||
| 542 | * | ||
| 543 | * Returns true if the endpoint has interrupt transfer type and IN direction, | ||
| 544 | * otherwise it returns false. | ||
| 545 | */ | ||
| 546 | static inline int usb_endpoint_is_int_in( | ||
| 547 | const struct usb_endpoint_descriptor *epd) | ||
| 548 | { | ||
| 549 | return usb_endpoint_xfer_int(epd) && usb_endpoint_dir_in(epd); | ||
| 550 | } | ||
| 551 | |||
| 552 | /** | ||
| 553 | * usb_endpoint_is_int_out - check if the endpoint is interrupt OUT | ||
| 554 | * @epd: endpoint to be checked | ||
| 555 | * | ||
| 556 | * Returns true if the endpoint has interrupt transfer type and OUT direction, | ||
| 557 | * otherwise it returns false. | ||
| 558 | */ | ||
| 559 | static inline int usb_endpoint_is_int_out( | ||
| 560 | const struct usb_endpoint_descriptor *epd) | ||
| 561 | { | ||
| 562 | return usb_endpoint_xfer_int(epd) && usb_endpoint_dir_out(epd); | ||
| 563 | } | ||
| 564 | |||
| 565 | /** | ||
| 566 | * usb_endpoint_is_isoc_in - check if the endpoint is isochronous IN | ||
| 567 | * @epd: endpoint to be checked | ||
| 568 | * | ||
| 569 | * Returns true if the endpoint has isochronous transfer type and IN direction, | ||
| 570 | * otherwise it returns false. | ||
| 571 | */ | ||
| 572 | static inline int usb_endpoint_is_isoc_in( | ||
| 573 | const struct usb_endpoint_descriptor *epd) | ||
| 574 | { | ||
| 575 | return usb_endpoint_xfer_isoc(epd) && usb_endpoint_dir_in(epd); | ||
| 576 | } | ||
| 577 | |||
| 578 | /** | ||
| 579 | * usb_endpoint_is_isoc_out - check if the endpoint is isochronous OUT | ||
| 580 | * @epd: endpoint to be checked | ||
| 581 | * | ||
| 582 | * Returns true if the endpoint has isochronous transfer type and OUT direction, | ||
| 583 | * otherwise it returns false. | ||
| 584 | */ | ||
| 585 | static inline int usb_endpoint_is_isoc_out( | ||
| 586 | const struct usb_endpoint_descriptor *epd) | ||
| 587 | { | ||
| 588 | return usb_endpoint_xfer_isoc(epd) && usb_endpoint_dir_out(epd); | ||
| 589 | } | ||
| 590 | |||
| 591 | /** | ||
| 592 | * usb_endpoint_maxp - get endpoint's max packet size | ||
| 593 | * @epd: endpoint to be checked | ||
| 594 | * | ||
| 595 | * Returns @epd's max packet | ||
| 596 | */ | ||
| 597 | static inline int usb_endpoint_maxp(const struct usb_endpoint_descriptor *epd) | ||
| 598 | { | ||
| 599 | return __le16_to_cpu(epd->wMaxPacketSize); | ||
| 600 | } | ||
| 601 | |||
| 602 | static inline int usb_endpoint_interrupt_type( | ||
| 603 | const struct usb_endpoint_descriptor *epd) | ||
| 604 | { | ||
| 605 | return epd->bmAttributes & USB_ENDPOINT_INTRTYPE; | ||
| 606 | } | ||
| 607 | |||
| 608 | /*-------------------------------------------------------------------------*/ | ||
| 609 | |||
| 610 | /* USB_DT_SS_ENDPOINT_COMP: SuperSpeed Endpoint Companion descriptor */ | ||
| 611 | struct usb_ss_ep_comp_descriptor { | ||
| 612 | __u8 bLength; | ||
| 613 | __u8 bDescriptorType; | ||
| 614 | |||
| 615 | __u8 bMaxBurst; | ||
| 616 | __u8 bmAttributes; | ||
| 617 | __le16 wBytesPerInterval; | ||
| 618 | } __attribute__ ((packed)); | ||
| 619 | |||
| 620 | #define USB_DT_SS_EP_COMP_SIZE 6 | ||
| 621 | |||
| 622 | /* Bits 4:0 of bmAttributes if this is a bulk endpoint */ | ||
| 623 | static inline int | ||
| 624 | usb_ss_max_streams(const struct usb_ss_ep_comp_descriptor *comp) | ||
| 625 | { | ||
| 626 | int max_streams; | ||
| 627 | |||
| 628 | if (!comp) | ||
| 629 | return 0; | ||
| 630 | |||
| 631 | max_streams = comp->bmAttributes & 0x1f; | ||
| 632 | |||
| 633 | if (!max_streams) | ||
| 634 | return 0; | ||
| 635 | |||
| 636 | max_streams = 1 << max_streams; | ||
| 637 | |||
| 638 | return max_streams; | ||
| 639 | } | ||
| 640 | |||
| 641 | /* Bits 1:0 of bmAttributes if this is an isoc endpoint */ | ||
| 642 | #define USB_SS_MULT(p) (1 + ((p) & 0x3)) | ||
| 643 | |||
| 644 | /*-------------------------------------------------------------------------*/ | ||
| 645 | |||
| 646 | /* USB_DT_DEVICE_QUALIFIER: Device Qualifier descriptor */ | ||
| 647 | struct usb_qualifier_descriptor { | ||
| 648 | __u8 bLength; | ||
| 649 | __u8 bDescriptorType; | ||
| 650 | |||
| 651 | __le16 bcdUSB; | ||
| 652 | __u8 bDeviceClass; | ||
| 653 | __u8 bDeviceSubClass; | ||
| 654 | __u8 bDeviceProtocol; | ||
| 655 | __u8 bMaxPacketSize0; | ||
| 656 | __u8 bNumConfigurations; | ||
| 657 | __u8 bRESERVED; | ||
| 658 | } __attribute__ ((packed)); | ||
| 659 | |||
| 660 | |||
| 661 | /*-------------------------------------------------------------------------*/ | ||
| 662 | |||
| 663 | /* USB_DT_OTG (from OTG 1.0a supplement) */ | ||
| 664 | struct usb_otg_descriptor { | ||
| 665 | __u8 bLength; | ||
| 666 | __u8 bDescriptorType; | ||
| 667 | |||
| 668 | __u8 bmAttributes; /* support for HNP, SRP, etc */ | ||
| 669 | } __attribute__ ((packed)); | ||
| 670 | |||
| 671 | /* from usb_otg_descriptor.bmAttributes */ | ||
| 672 | #define USB_OTG_SRP (1 << 0) | ||
| 673 | #define USB_OTG_HNP (1 << 1) /* swap host/device roles */ | ||
| 674 | |||
| 675 | /*-------------------------------------------------------------------------*/ | ||
| 676 | |||
| 677 | /* USB_DT_DEBUG: for special highspeed devices, replacing serial console */ | ||
| 678 | struct usb_debug_descriptor { | ||
| 679 | __u8 bLength; | ||
| 680 | __u8 bDescriptorType; | ||
| 681 | |||
| 682 | /* bulk endpoints with 8 byte maxpacket */ | ||
| 683 | __u8 bDebugInEndpoint; | ||
| 684 | __u8 bDebugOutEndpoint; | ||
| 685 | } __attribute__((packed)); | ||
| 686 | |||
| 687 | /*-------------------------------------------------------------------------*/ | ||
| 688 | |||
| 689 | /* USB_DT_INTERFACE_ASSOCIATION: groups interfaces */ | ||
| 690 | struct usb_interface_assoc_descriptor { | ||
| 691 | __u8 bLength; | ||
| 692 | __u8 bDescriptorType; | ||
| 693 | |||
| 694 | __u8 bFirstInterface; | ||
| 695 | __u8 bInterfaceCount; | ||
| 696 | __u8 bFunctionClass; | ||
| 697 | __u8 bFunctionSubClass; | ||
| 698 | __u8 bFunctionProtocol; | ||
| 699 | __u8 iFunction; | ||
| 700 | } __attribute__ ((packed)); | ||
| 701 | |||
| 702 | |||
| 703 | /*-------------------------------------------------------------------------*/ | ||
| 704 | |||
| 705 | /* USB_DT_SECURITY: group of wireless security descriptors, including | ||
| 706 | * encryption types available for setting up a CC/association. | ||
| 707 | */ | ||
| 708 | struct usb_security_descriptor { | ||
| 709 | __u8 bLength; | ||
| 710 | __u8 bDescriptorType; | ||
| 711 | |||
| 712 | __le16 wTotalLength; | ||
| 713 | __u8 bNumEncryptionTypes; | ||
| 714 | } __attribute__((packed)); | ||
| 715 | |||
| 716 | /*-------------------------------------------------------------------------*/ | ||
| 717 | |||
| 718 | /* USB_DT_KEY: used with {GET,SET}_SECURITY_DATA; only public keys | ||
| 719 | * may be retrieved. | ||
| 720 | */ | ||
| 721 | struct usb_key_descriptor { | ||
| 722 | __u8 bLength; | ||
| 723 | __u8 bDescriptorType; | ||
| 724 | |||
| 725 | __u8 tTKID[3]; | ||
| 726 | __u8 bReserved; | ||
| 727 | __u8 bKeyData[0]; | ||
| 728 | } __attribute__((packed)); | ||
| 729 | |||
| 730 | /*-------------------------------------------------------------------------*/ | ||
| 731 | |||
| 732 | /* USB_DT_ENCRYPTION_TYPE: bundled in DT_SECURITY groups */ | ||
| 733 | struct usb_encryption_descriptor { | ||
| 734 | __u8 bLength; | ||
| 735 | __u8 bDescriptorType; | ||
| 736 | |||
| 737 | __u8 bEncryptionType; | ||
| 738 | #define USB_ENC_TYPE_UNSECURE 0 | ||
| 739 | #define USB_ENC_TYPE_WIRED 1 /* non-wireless mode */ | ||
| 740 | #define USB_ENC_TYPE_CCM_1 2 /* aes128/cbc session */ | ||
| 741 | #define USB_ENC_TYPE_RSA_1 3 /* rsa3072/sha1 auth */ | ||
| 742 | __u8 bEncryptionValue; /* use in SET_ENCRYPTION */ | ||
| 743 | __u8 bAuthKeyIndex; | ||
| 744 | } __attribute__((packed)); | ||
| 745 | |||
| 746 | |||
| 747 | /*-------------------------------------------------------------------------*/ | ||
| 748 | |||
| 749 | /* USB_DT_BOS: group of device-level capabilities */ | ||
| 750 | struct usb_bos_descriptor { | ||
| 751 | __u8 bLength; | ||
| 752 | __u8 bDescriptorType; | ||
| 753 | |||
| 754 | __le16 wTotalLength; | ||
| 755 | __u8 bNumDeviceCaps; | ||
| 756 | } __attribute__((packed)); | ||
| 757 | |||
| 758 | #define USB_DT_BOS_SIZE 5 | ||
| 759 | /*-------------------------------------------------------------------------*/ | ||
| 760 | |||
| 761 | /* USB_DT_DEVICE_CAPABILITY: grouped with BOS */ | ||
| 762 | struct usb_dev_cap_header { | ||
| 763 | __u8 bLength; | ||
| 764 | __u8 bDescriptorType; | ||
| 765 | __u8 bDevCapabilityType; | ||
| 766 | } __attribute__((packed)); | ||
| 767 | |||
| 768 | #define USB_CAP_TYPE_WIRELESS_USB 1 | ||
| 769 | |||
| 770 | struct usb_wireless_cap_descriptor { /* Ultra Wide Band */ | ||
| 771 | __u8 bLength; | ||
| 772 | __u8 bDescriptorType; | ||
| 773 | __u8 bDevCapabilityType; | ||
| 774 | |||
| 775 | __u8 bmAttributes; | ||
| 776 | #define USB_WIRELESS_P2P_DRD (1 << 1) | ||
| 777 | #define USB_WIRELESS_BEACON_MASK (3 << 2) | ||
| 778 | #define USB_WIRELESS_BEACON_SELF (1 << 2) | ||
| 779 | #define USB_WIRELESS_BEACON_DIRECTED (2 << 2) | ||
| 780 | #define USB_WIRELESS_BEACON_NONE (3 << 2) | ||
| 781 | __le16 wPHYRates; /* bit rates, Mbps */ | ||
| 782 | #define USB_WIRELESS_PHY_53 (1 << 0) /* always set */ | ||
| 783 | #define USB_WIRELESS_PHY_80 (1 << 1) | ||
| 784 | #define USB_WIRELESS_PHY_107 (1 << 2) /* always set */ | ||
| 785 | #define USB_WIRELESS_PHY_160 (1 << 3) | ||
| 786 | #define USB_WIRELESS_PHY_200 (1 << 4) /* always set */ | ||
| 787 | #define USB_WIRELESS_PHY_320 (1 << 5) | ||
| 788 | #define USB_WIRELESS_PHY_400 (1 << 6) | ||
| 789 | #define USB_WIRELESS_PHY_480 (1 << 7) | ||
| 790 | __u8 bmTFITXPowerInfo; /* TFI power levels */ | ||
| 791 | __u8 bmFFITXPowerInfo; /* FFI power levels */ | ||
| 792 | __le16 bmBandGroup; | ||
| 793 | __u8 bReserved; | ||
| 794 | } __attribute__((packed)); | ||
| 795 | |||
| 796 | /* USB 2.0 Extension descriptor */ | ||
| 797 | #define USB_CAP_TYPE_EXT 2 | ||
| 798 | |||
| 799 | struct usb_ext_cap_descriptor { /* Link Power Management */ | ||
| 800 | __u8 bLength; | ||
| 801 | __u8 bDescriptorType; | ||
| 802 | __u8 bDevCapabilityType; | ||
| 803 | __le32 bmAttributes; | ||
| 804 | #define USB_LPM_SUPPORT (1 << 1) /* supports LPM */ | ||
| 805 | #define USB_BESL_SUPPORT (1 << 2) /* supports BESL */ | ||
| 806 | #define USB_BESL_BASELINE_VALID (1 << 3) /* Baseline BESL valid*/ | ||
| 807 | #define USB_BESL_DEEP_VALID (1 << 4) /* Deep BESL valid */ | ||
| 808 | #define USB_GET_BESL_BASELINE(p) (((p) & (0xf << 8)) >> 8) | ||
| 809 | #define USB_GET_BESL_DEEP(p) (((p) & (0xf << 12)) >> 12) | ||
| 810 | } __attribute__((packed)); | ||
| 811 | |||
| 812 | #define USB_DT_USB_EXT_CAP_SIZE 7 | ||
| 813 | |||
| 814 | /* | ||
| 815 | * SuperSpeed USB Capability descriptor: Defines the set of SuperSpeed USB | ||
| 816 | * specific device level capabilities | ||
| 817 | */ | ||
| 818 | #define USB_SS_CAP_TYPE 3 | ||
| 819 | struct usb_ss_cap_descriptor { /* Link Power Management */ | ||
| 820 | __u8 bLength; | ||
| 821 | __u8 bDescriptorType; | ||
| 822 | __u8 bDevCapabilityType; | ||
| 823 | __u8 bmAttributes; | ||
| 824 | #define USB_LTM_SUPPORT (1 << 1) /* supports LTM */ | ||
| 825 | __le16 wSpeedSupported; | ||
| 826 | #define USB_LOW_SPEED_OPERATION (1) /* Low speed operation */ | ||
| 827 | #define USB_FULL_SPEED_OPERATION (1 << 1) /* Full speed operation */ | ||
| 828 | #define USB_HIGH_SPEED_OPERATION (1 << 2) /* High speed operation */ | ||
| 829 | #define USB_5GBPS_OPERATION (1 << 3) /* Operation at 5Gbps */ | ||
| 830 | __u8 bFunctionalitySupport; | ||
| 831 | __u8 bU1devExitLat; | ||
| 832 | __le16 bU2DevExitLat; | ||
| 833 | } __attribute__((packed)); | ||
| 834 | |||
| 835 | #define USB_DT_USB_SS_CAP_SIZE 10 | ||
| 836 | |||
| 837 | /* | ||
| 838 | * Container ID Capability descriptor: Defines the instance unique ID used to | ||
| 839 | * identify the instance across all operating modes | ||
| 840 | */ | ||
| 841 | #define CONTAINER_ID_TYPE 4 | ||
| 842 | struct usb_ss_container_id_descriptor { | ||
| 843 | __u8 bLength; | ||
| 844 | __u8 bDescriptorType; | ||
| 845 | __u8 bDevCapabilityType; | ||
| 846 | __u8 bReserved; | ||
| 847 | __u8 ContainerID[16]; /* 128-bit number */ | ||
| 848 | } __attribute__((packed)); | ||
| 849 | |||
| 850 | #define USB_DT_USB_SS_CONTN_ID_SIZE 20 | ||
| 851 | /*-------------------------------------------------------------------------*/ | ||
| 852 | |||
| 853 | /* USB_DT_WIRELESS_ENDPOINT_COMP: companion descriptor associated with | ||
| 854 | * each endpoint descriptor for a wireless device | ||
| 855 | */ | ||
| 856 | struct usb_wireless_ep_comp_descriptor { | ||
| 857 | __u8 bLength; | ||
| 858 | __u8 bDescriptorType; | ||
| 859 | |||
| 860 | __u8 bMaxBurst; | ||
| 861 | __u8 bMaxSequence; | ||
| 862 | __le16 wMaxStreamDelay; | ||
| 863 | __le16 wOverTheAirPacketSize; | ||
| 864 | __u8 bOverTheAirInterval; | ||
| 865 | __u8 bmCompAttributes; | ||
| 866 | #define USB_ENDPOINT_SWITCH_MASK 0x03 /* in bmCompAttributes */ | ||
| 867 | #define USB_ENDPOINT_SWITCH_NO 0 | ||
| 868 | #define USB_ENDPOINT_SWITCH_SWITCH 1 | ||
| 869 | #define USB_ENDPOINT_SWITCH_SCALE 2 | ||
| 870 | } __attribute__((packed)); | ||
| 871 | |||
| 872 | /*-------------------------------------------------------------------------*/ | ||
| 873 | |||
| 874 | /* USB_REQ_SET_HANDSHAKE is a four-way handshake used between a wireless | ||
| 875 | * host and a device for connection set up, mutual authentication, and | ||
| 876 | * exchanging short lived session keys. The handshake depends on a CC. | ||
| 877 | */ | ||
| 878 | struct usb_handshake { | ||
| 879 | __u8 bMessageNumber; | ||
| 880 | __u8 bStatus; | ||
| 881 | __u8 tTKID[3]; | ||
| 882 | __u8 bReserved; | ||
| 883 | __u8 CDID[16]; | ||
| 884 | __u8 nonce[16]; | ||
| 885 | __u8 MIC[8]; | ||
| 886 | } __attribute__((packed)); | ||
| 887 | |||
| 888 | /*-------------------------------------------------------------------------*/ | ||
| 889 | |||
| 890 | /* USB_REQ_SET_CONNECTION modifies or revokes a connection context (CC). | ||
| 891 | * A CC may also be set up using non-wireless secure channels (including | ||
| 892 | * wired USB!), and some devices may support CCs with multiple hosts. | ||
| 893 | */ | ||
| 894 | struct usb_connection_context { | ||
| 895 | __u8 CHID[16]; /* persistent host id */ | ||
| 896 | __u8 CDID[16]; /* device id (unique w/in host context) */ | ||
| 897 | __u8 CK[16]; /* connection key */ | ||
| 898 | } __attribute__((packed)); | ||
| 899 | |||
| 900 | /*-------------------------------------------------------------------------*/ | ||
| 901 | |||
| 902 | /* USB 2.0 defines three speeds, here's how Linux identifies them */ | ||
| 903 | |||
| 904 | enum usb_device_speed { | ||
| 905 | USB_SPEED_UNKNOWN = 0, /* enumerating */ | ||
| 906 | USB_SPEED_LOW, USB_SPEED_FULL, /* usb 1.1 */ | ||
| 907 | USB_SPEED_HIGH, /* usb 2.0 */ | ||
| 908 | USB_SPEED_WIRELESS, /* wireless (usb 2.5) */ | ||
| 909 | USB_SPEED_SUPER, /* usb 3.0 */ | ||
| 910 | }; | ||
| 911 | |||
| 912 | |||
| 913 | enum usb_device_state { | ||
| 914 | /* NOTATTACHED isn't in the USB spec, and this state acts | ||
| 915 | * the same as ATTACHED ... but it's clearer this way. | ||
| 916 | */ | ||
| 917 | USB_STATE_NOTATTACHED = 0, | ||
| 918 | |||
| 919 | /* chapter 9 and authentication (wireless) device states */ | ||
| 920 | USB_STATE_ATTACHED, | ||
| 921 | USB_STATE_POWERED, /* wired */ | ||
| 922 | USB_STATE_RECONNECTING, /* auth */ | ||
| 923 | USB_STATE_UNAUTHENTICATED, /* auth */ | ||
| 924 | USB_STATE_DEFAULT, /* limited function */ | ||
| 925 | USB_STATE_ADDRESS, | ||
| 926 | USB_STATE_CONFIGURED, /* most functions */ | ||
| 927 | |||
| 928 | USB_STATE_SUSPENDED | ||
| 929 | |||
| 930 | /* NOTE: there are actually four different SUSPENDED | ||
| 931 | * states, returning to POWERED, DEFAULT, ADDRESS, or | ||
| 932 | * CONFIGURED respectively when SOF tokens flow again. | ||
| 933 | * At this level there's no difference between L1 and L2 | ||
| 934 | * suspend states. (L2 being original USB 1.1 suspend.) | ||
| 935 | */ | ||
| 936 | }; | ||
| 937 | |||
| 938 | enum usb3_link_state { | ||
| 939 | USB3_LPM_U0 = 0, | ||
| 940 | USB3_LPM_U1, | ||
| 941 | USB3_LPM_U2, | ||
| 942 | USB3_LPM_U3 | ||
| 943 | }; | ||
| 944 | |||
| 945 | /* | ||
| 946 | * A U1 timeout of 0x0 means the parent hub will reject any transitions to U1. | ||
| 947 | * 0xff means the parent hub will accept transitions to U1, but will not | ||
| 948 | * initiate a transition. | ||
| 949 | * | ||
| 950 | * A U1 timeout of 0x1 to 0x7F also causes the hub to initiate a transition to | ||
| 951 | * U1 after that many microseconds. Timeouts of 0x80 to 0xFE are reserved | ||
| 952 | * values. | ||
| 953 | * | ||
| 954 | * A U2 timeout of 0x0 means the parent hub will reject any transitions to U2. | ||
| 955 | * 0xff means the parent hub will accept transitions to U2, but will not | ||
| 956 | * initiate a transition. | ||
| 957 | * | ||
| 958 | * A U2 timeout of 0x1 to 0xFE also causes the hub to initiate a transition to | ||
| 959 | * U2 after N*256 microseconds. Therefore a U2 timeout value of 0x1 means a U2 | ||
| 960 | * idle timer of 256 microseconds, 0x2 means 512 microseconds, 0xFE means | ||
| 961 | * 65.024ms. | ||
| 962 | */ | ||
| 963 | #define USB3_LPM_DISABLED 0x0 | ||
| 964 | #define USB3_LPM_U1_MAX_TIMEOUT 0x7F | ||
| 965 | #define USB3_LPM_U2_MAX_TIMEOUT 0xFE | ||
| 966 | #define USB3_LPM_DEVICE_INITIATED 0xFF | ||
| 967 | |||
| 968 | struct usb_set_sel_req { | ||
| 969 | __u8 u1_sel; | ||
| 970 | __u8 u1_pel; | ||
| 971 | __le16 u2_sel; | ||
| 972 | __le16 u2_pel; | ||
| 973 | } __attribute__ ((packed)); | ||
| 974 | |||
| 975 | /* | ||
| 976 | * The Set System Exit Latency control transfer provides one byte each for | ||
| 977 | * U1 SEL and U1 PEL, so the max exit latency is 0xFF. U2 SEL and U2 PEL each | ||
| 978 | * are two bytes long. | ||
| 979 | */ | ||
| 980 | #define USB3_LPM_MAX_U1_SEL_PEL 0xFF | ||
| 981 | #define USB3_LPM_MAX_U2_SEL_PEL 0xFFFF | ||
| 982 | |||
| 983 | /*-------------------------------------------------------------------------*/ | ||
| 984 | |||
| 985 | /* | ||
| 986 | * As per USB compliance update, a device that is actively drawing | ||
| 987 | * more than 100mA from USB must report itself as bus-powered in | ||
| 988 | * the GetStatus(DEVICE) call. | ||
| 989 | * http://compliance.usb.org/index.asp?UpdateFile=Electrical&Format=Standard#34 | ||
| 990 | */ | ||
| 991 | #define USB_SELF_POWER_VBUS_MAX_DRAW 100 | ||
| 992 | |||
| 993 | #endif /* _UAPI__LINUX_USB_CH9_H */ | ||
diff --git a/include/uapi/linux/usb/functionfs.h b/include/uapi/linux/usb/functionfs.h new file mode 100644 index 000000000000..d6b01283f85c --- /dev/null +++ b/include/uapi/linux/usb/functionfs.h | |||
| @@ -0,0 +1,169 @@ | |||
| 1 | #ifndef _UAPI__LINUX_FUNCTIONFS_H__ | ||
| 2 | #define _UAPI__LINUX_FUNCTIONFS_H__ | ||
| 3 | |||
| 4 | |||
| 5 | #include <linux/types.h> | ||
| 6 | #include <linux/ioctl.h> | ||
| 7 | |||
| 8 | #include <linux/usb/ch9.h> | ||
| 9 | |||
| 10 | |||
| 11 | enum { | ||
| 12 | FUNCTIONFS_DESCRIPTORS_MAGIC = 1, | ||
| 13 | FUNCTIONFS_STRINGS_MAGIC = 2 | ||
| 14 | }; | ||
| 15 | |||
| 16 | |||
| 17 | #ifndef __KERNEL__ | ||
| 18 | |||
| 19 | /* Descriptor of an non-audio endpoint */ | ||
| 20 | struct usb_endpoint_descriptor_no_audio { | ||
| 21 | __u8 bLength; | ||
| 22 | __u8 bDescriptorType; | ||
| 23 | |||
| 24 | __u8 bEndpointAddress; | ||
| 25 | __u8 bmAttributes; | ||
| 26 | __le16 wMaxPacketSize; | ||
| 27 | __u8 bInterval; | ||
| 28 | } __attribute__((packed)); | ||
| 29 | |||
| 30 | |||
| 31 | /* | ||
| 32 | * All numbers must be in little endian order. | ||
| 33 | */ | ||
| 34 | |||
| 35 | struct usb_functionfs_descs_head { | ||
| 36 | __le32 magic; | ||
| 37 | __le32 length; | ||
| 38 | __le32 fs_count; | ||
| 39 | __le32 hs_count; | ||
| 40 | } __attribute__((packed)); | ||
| 41 | |||
| 42 | /* | ||
| 43 | * Descriptors format: | ||
| 44 | * | ||
| 45 | * | off | name | type | description | | ||
| 46 | * |-----+-----------+--------------+--------------------------------------| | ||
| 47 | * | 0 | magic | LE32 | FUNCTIONFS_{FS,HS}_DESCRIPTORS_MAGIC | | ||
| 48 | * | 4 | length | LE32 | length of the whole data chunk | | ||
| 49 | * | 8 | fs_count | LE32 | number of full-speed descriptors | | ||
| 50 | * | 12 | hs_count | LE32 | number of high-speed descriptors | | ||
| 51 | * | 16 | fs_descrs | Descriptor[] | list of full-speed descriptors | | ||
| 52 | * | | hs_descrs | Descriptor[] | list of high-speed descriptors | | ||
| 53 | * | ||
| 54 | * descs are just valid USB descriptors and have the following format: | ||
| 55 | * | ||
| 56 | * | off | name | type | description | | ||
| 57 | * |-----+-----------------+------+--------------------------| | ||
| 58 | * | 0 | bLength | U8 | length of the descriptor | | ||
| 59 | * | 1 | bDescriptorType | U8 | descriptor type | | ||
| 60 | * | 2 | payload | | descriptor's payload | | ||
| 61 | */ | ||
| 62 | |||
| 63 | struct usb_functionfs_strings_head { | ||
| 64 | __le32 magic; | ||
| 65 | __le32 length; | ||
| 66 | __le32 str_count; | ||
| 67 | __le32 lang_count; | ||
| 68 | } __attribute__((packed)); | ||
| 69 | |||
| 70 | /* | ||
| 71 | * Strings format: | ||
| 72 | * | ||
| 73 | * | off | name | type | description | | ||
| 74 | * |-----+------------+-----------------------+----------------------------| | ||
| 75 | * | 0 | magic | LE32 | FUNCTIONFS_STRINGS_MAGIC | | ||
| 76 | * | 4 | length | LE32 | length of the data chunk | | ||
| 77 | * | 8 | str_count | LE32 | number of strings | | ||
| 78 | * | 12 | lang_count | LE32 | number of languages | | ||
| 79 | * | 16 | stringtab | StringTab[lang_count] | table of strings per lang | | ||
| 80 | * | ||
| 81 | * For each language there is one stringtab entry (ie. there are lang_count | ||
| 82 | * stringtab entires). Each StringTab has following format: | ||
| 83 | * | ||
| 84 | * | off | name | type | description | | ||
| 85 | * |-----+---------+-------------------+------------------------------------| | ||
| 86 | * | 0 | lang | LE16 | language code | | ||
| 87 | * | 2 | strings | String[str_count] | array of strings in given language | | ||
| 88 | * | ||
| 89 | * For each string there is one strings entry (ie. there are str_count | ||
| 90 | * string entries). Each String is a NUL terminated string encoded in | ||
| 91 | * UTF-8. | ||
| 92 | */ | ||
| 93 | |||
| 94 | #endif | ||
| 95 | |||
| 96 | |||
| 97 | /* | ||
| 98 | * Events are delivered on the ep0 file descriptor, when the user mode driver | ||
| 99 | * reads from this file descriptor after writing the descriptors. Don't | ||
| 100 | * stop polling this descriptor. | ||
| 101 | */ | ||
| 102 | |||
| 103 | enum usb_functionfs_event_type { | ||
| 104 | FUNCTIONFS_BIND, | ||
| 105 | FUNCTIONFS_UNBIND, | ||
| 106 | |||
| 107 | FUNCTIONFS_ENABLE, | ||
| 108 | FUNCTIONFS_DISABLE, | ||
| 109 | |||
| 110 | FUNCTIONFS_SETUP, | ||
| 111 | |||
| 112 | FUNCTIONFS_SUSPEND, | ||
| 113 | FUNCTIONFS_RESUME | ||
| 114 | }; | ||
| 115 | |||
| 116 | /* NOTE: this structure must stay the same size and layout on | ||
| 117 | * both 32-bit and 64-bit kernels. | ||
| 118 | */ | ||
| 119 | struct usb_functionfs_event { | ||
| 120 | union { | ||
| 121 | /* SETUP: packet; DATA phase i/o precedes next event | ||
| 122 | *(setup.bmRequestType & USB_DIR_IN) flags direction */ | ||
| 123 | struct usb_ctrlrequest setup; | ||
| 124 | } __attribute__((packed)) u; | ||
| 125 | |||
| 126 | /* enum usb_functionfs_event_type */ | ||
| 127 | __u8 type; | ||
| 128 | __u8 _pad[3]; | ||
| 129 | } __attribute__((packed)); | ||
| 130 | |||
| 131 | |||
| 132 | /* Endpoint ioctls */ | ||
| 133 | /* The same as in gadgetfs */ | ||
| 134 | |||
| 135 | /* IN transfers may be reported to the gadget driver as complete | ||
| 136 | * when the fifo is loaded, before the host reads the data; | ||
| 137 | * OUT transfers may be reported to the host's "client" driver as | ||
| 138 | * complete when they're sitting in the FIFO unread. | ||
| 139 | * THIS returns how many bytes are "unclaimed" in the endpoint fifo | ||
| 140 | * (needed for precise fault handling, when the hardware allows it) | ||
| 141 | */ | ||
| 142 | #define FUNCTIONFS_FIFO_STATUS _IO('g', 1) | ||
| 143 | |||
| 144 | /* discards any unclaimed data in the fifo. */ | ||
| 145 | #define FUNCTIONFS_FIFO_FLUSH _IO('g', 2) | ||
| 146 | |||
| 147 | /* resets endpoint halt+toggle; used to implement set_interface. | ||
| 148 | * some hardware (like pxa2xx) can't support this. | ||
| 149 | */ | ||
| 150 | #define FUNCTIONFS_CLEAR_HALT _IO('g', 3) | ||
| 151 | |||
| 152 | /* Specific for functionfs */ | ||
| 153 | |||
| 154 | /* | ||
| 155 | * Returns reverse mapping of an interface. Called on EP0. If there | ||
| 156 | * is no such interface returns -EDOM. If function is not active | ||
| 157 | * returns -ENODEV. | ||
| 158 | */ | ||
| 159 | #define FUNCTIONFS_INTERFACE_REVMAP _IO('g', 128) | ||
| 160 | |||
| 161 | /* | ||
| 162 | * Returns real bEndpointAddress of an endpoint. If function is not | ||
| 163 | * active returns -ENODEV. | ||
| 164 | */ | ||
| 165 | #define FUNCTIONFS_ENDPOINT_REVMAP _IO('g', 129) | ||
| 166 | |||
| 167 | |||
| 168 | |||
| 169 | #endif /* _UAPI__LINUX_FUNCTIONFS_H__ */ | ||
diff --git a/include/linux/usb/g_printer.h b/include/uapi/linux/usb/g_printer.h index 6178fde50f74..6178fde50f74 100644 --- a/include/linux/usb/g_printer.h +++ b/include/uapi/linux/usb/g_printer.h | |||
diff --git a/include/linux/usb/gadgetfs.h b/include/uapi/linux/usb/gadgetfs.h index 0bb12e0d4f8f..0bb12e0d4f8f 100644 --- a/include/linux/usb/gadgetfs.h +++ b/include/uapi/linux/usb/gadgetfs.h | |||
diff --git a/include/linux/usb/midi.h b/include/uapi/linux/usb/midi.h index c8c52e3c91de..c8c52e3c91de 100644 --- a/include/linux/usb/midi.h +++ b/include/uapi/linux/usb/midi.h | |||
diff --git a/include/linux/usb/tmc.h b/include/uapi/linux/usb/tmc.h index c045ae12556c..c045ae12556c 100644 --- a/include/linux/usb/tmc.h +++ b/include/uapi/linux/usb/tmc.h | |||
diff --git a/include/linux/usb/video.h b/include/uapi/linux/usb/video.h index 3b3b95e01f71..3b3b95e01f71 100644 --- a/include/linux/usb/video.h +++ b/include/uapi/linux/usb/video.h | |||
