diff options
26 files changed, 213 insertions, 144 deletions
diff --git a/Documentation/devicetree/bindings/usb/usb251xb.txt b/Documentation/devicetree/bindings/usb/usb251xb.txt index 0c065f77658f..3957d4edaa74 100644 --- a/Documentation/devicetree/bindings/usb/usb251xb.txt +++ b/Documentation/devicetree/bindings/usb/usb251xb.txt | |||
| @@ -7,18 +7,18 @@ Required properties : | |||
| 7 | - compatible : Should be "microchip,usb251xb" or one of the specific types: | 7 | - compatible : Should be "microchip,usb251xb" or one of the specific types: |
| 8 | "microchip,usb2512b", "microchip,usb2512bi", "microchip,usb2513b", | 8 | "microchip,usb2512b", "microchip,usb2512bi", "microchip,usb2513b", |
| 9 | "microchip,usb2513bi", "microchip,usb2514b", "microchip,usb2514bi" | 9 | "microchip,usb2513bi", "microchip,usb2514b", "microchip,usb2514bi" |
| 10 | - hub-reset-gpios : Should specify the gpio for hub reset | 10 | - reset-gpios : Should specify the gpio for hub reset |
| 11 | - reg : I2C address on the selected bus (default is <0x2C>) | ||
| 11 | 12 | ||
| 12 | Optional properties : | 13 | Optional properties : |
| 13 | - reg : I2C address on the selected bus (default is <0x2C>) | ||
| 14 | - skip-config : Skip Hub configuration, but only send the USB-Attach command | 14 | - skip-config : Skip Hub configuration, but only send the USB-Attach command |
| 15 | - vendor-id : USB Vendor ID of the hub (16 bit, default is 0x0424) | 15 | - vendor-id : Set USB Vendor ID of the hub (16 bit, default is 0x0424) |
| 16 | - product-id : USB Product ID of the hub (16 bit, default depends on type) | 16 | - product-id : Set USB Product ID of the hub (16 bit, default depends on type) |
| 17 | - device-id : USB Device ID of the hub (16 bit, default is 0x0bb3) | 17 | - device-id : Set USB Device ID of the hub (16 bit, default is 0x0bb3) |
| 18 | - language-id : USB Language ID (16 bit, default is 0x0000) | 18 | - language-id : Set USB Language ID (16 bit, default is 0x0000) |
| 19 | - manufacturer : USB Manufacturer string (max 31 characters long) | 19 | - manufacturer : Set USB Manufacturer string (max 31 characters long) |
| 20 | - product : USB Product string (max 31 characters long) | 20 | - product : Set USB Product string (max 31 characters long) |
| 21 | - serial : USB Serial string (max 31 characters long) | 21 | - serial : Set USB Serial string (max 31 characters long) |
| 22 | - {bus,self}-powered : selects between self- and bus-powered operation (default | 22 | - {bus,self}-powered : selects between self- and bus-powered operation (default |
| 23 | is self-powered) | 23 | is self-powered) |
| 24 | - disable-hi-speed : disable USB Hi-Speed support | 24 | - disable-hi-speed : disable USB Hi-Speed support |
| @@ -31,8 +31,10 @@ Optional properties : | |||
| 31 | (default is individual) | 31 | (default is individual) |
| 32 | - dynamic-power-switching : enable auto-switching from self- to bus-powered | 32 | - dynamic-power-switching : enable auto-switching from self- to bus-powered |
| 33 | operation if the local power source is removed or unavailable | 33 | operation if the local power source is removed or unavailable |
| 34 | - oc-delay-{100us,4ms,8ms,16ms} : set over current timer delay (default is 8ms) | 34 | - oc-delay-us : Delay time (in microseconds) for filtering the over-current |
| 35 | - compound-device : indicated the hub is part of a compound device | 35 | sense inputs. Valid values are 100, 4000, 8000 (default) and 16000. If |
| 36 | an invalid value is given, the default is used instead. | ||
| 37 | - compound-device : indicate the hub is part of a compound device | ||
| 36 | - port-mapping-mode : enable port mapping mode | 38 | - port-mapping-mode : enable port mapping mode |
| 37 | - string-support : enable string descriptor support (required for manufacturer, | 39 | - string-support : enable string descriptor support (required for manufacturer, |
| 38 | product and serial string configuration) | 40 | product and serial string configuration) |
| @@ -40,34 +42,15 @@ Optional properties : | |||
| 40 | device connected. | 42 | device connected. |
| 41 | - sp-disabled-ports : Specifies the ports which will be self-power disabled | 43 | - sp-disabled-ports : Specifies the ports which will be self-power disabled |
| 42 | - bp-disabled-ports : Specifies the ports which will be bus-power disabled | 44 | - bp-disabled-ports : Specifies the ports which will be bus-power disabled |
| 43 | - max-sp-power : Specifies the maximum current the hub consumes from an | 45 | - power-on-time-ms : Specifies the time it takes from the time the host |
| 44 | upstream port when operating as self-powered hub including the power | 46 | initiates the power-on sequence to a port until the port has adequate |
| 45 | consumption of a permanently attached peripheral if the hub is | 47 | power. The value is given in ms in a 0 - 510 range (default is 100ms). |
| 46 | configured as a compound device. The value is given in mA in a 0 - 500 | ||
| 47 | range (default is 2). | ||
| 48 | - max-bp-power : Specifies the maximum current the hub consumes from an | ||
| 49 | upstream port when operating as bus-powered hub including the power | ||
| 50 | consumption of a permanently attached peripheral if the hub is | ||
| 51 | configured as a compound device. The value is given in mA in a 0 - 500 | ||
| 52 | range (default is 100). | ||
| 53 | - max-sp-current : Specifies the maximum current the hub consumes from an | ||
| 54 | upstream port when operating as self-powered hub EXCLUDING the power | ||
| 55 | consumption of a permanently attached peripheral if the hub is | ||
| 56 | configured as a compound device. The value is given in mA in a 0 - 500 | ||
| 57 | range (default is 2). | ||
| 58 | - max-bp-current : Specifies the maximum current the hub consumes from an | ||
| 59 | upstream port when operating as bus-powered hub EXCLUDING the power | ||
| 60 | consumption of a permanently attached peripheral if the hub is | ||
| 61 | configured as a compound device. The value is given in mA in a 0 - 500 | ||
| 62 | range (default is 100). | ||
| 63 | - power-on-time : Specifies the time it takes from the time the host initiates | ||
| 64 | the power-on sequence to a port until the port has adequate power. The | ||
| 65 | value is given in ms in a 0 - 510 range (default is 100ms). | ||
| 66 | 48 | ||
| 67 | Examples: | 49 | Examples: |
| 68 | usb2512b@2c { | 50 | usb2512b@2c { |
| 69 | compatible = "microchip,usb2512b"; | 51 | compatible = "microchip,usb2512b"; |
| 70 | hub-reset-gpios = <&gpio1 4 GPIO_ACTIVE_LOW>; | 52 | reg = <0x2c>; |
| 53 | reset-gpios = <&gpio1 4 GPIO_ACTIVE_LOW>; | ||
| 71 | }; | 54 | }; |
| 72 | 55 | ||
| 73 | usb2514b@2c { | 56 | usb2514b@2c { |
diff --git a/MAINTAINERS b/MAINTAINERS index c265a5fe4848..c776906f67a9 100644 --- a/MAINTAINERS +++ b/MAINTAINERS | |||
| @@ -8307,7 +8307,6 @@ M: Richard Leitner <richard.leitner@skidata.com> | |||
| 8307 | L: linux-usb@vger.kernel.org | 8307 | L: linux-usb@vger.kernel.org |
| 8308 | S: Maintained | 8308 | S: Maintained |
| 8309 | F: drivers/usb/misc/usb251xb.c | 8309 | F: drivers/usb/misc/usb251xb.c |
| 8310 | F: include/linux/platform_data/usb251xb.h | ||
| 8311 | F: Documentation/devicetree/bindings/usb/usb251xb.txt | 8310 | F: Documentation/devicetree/bindings/usb/usb251xb.txt |
| 8312 | 8311 | ||
| 8313 | MICROSOFT SURFACE PRO 3 BUTTON DRIVER | 8312 | MICROSOFT SURFACE PRO 3 BUTTON DRIVER |
diff --git a/drivers/usb/dwc3/dwc3-omap.c b/drivers/usb/dwc3/dwc3-omap.c index 2092e46b1380..f8d0747810e7 100644 --- a/drivers/usb/dwc3/dwc3-omap.c +++ b/drivers/usb/dwc3/dwc3-omap.c | |||
| @@ -250,6 +250,7 @@ static void dwc3_omap_set_mailbox(struct dwc3_omap *omap, | |||
| 250 | val = dwc3_omap_read_utmi_ctrl(omap); | 250 | val = dwc3_omap_read_utmi_ctrl(omap); |
| 251 | val |= USBOTGSS_UTMI_OTG_CTRL_IDDIG; | 251 | val |= USBOTGSS_UTMI_OTG_CTRL_IDDIG; |
| 252 | dwc3_omap_write_utmi_ctrl(omap, val); | 252 | dwc3_omap_write_utmi_ctrl(omap, val); |
| 253 | break; | ||
| 253 | 254 | ||
| 254 | case OMAP_DWC3_VBUS_OFF: | 255 | case OMAP_DWC3_VBUS_OFF: |
| 255 | val = dwc3_omap_read_utmi_ctrl(omap); | 256 | val = dwc3_omap_read_utmi_ctrl(omap); |
| @@ -392,7 +393,7 @@ static void dwc3_omap_set_utmi_mode(struct dwc3_omap *omap) | |||
| 392 | { | 393 | { |
| 393 | u32 reg; | 394 | u32 reg; |
| 394 | struct device_node *node = omap->dev->of_node; | 395 | struct device_node *node = omap->dev->of_node; |
| 395 | int utmi_mode = 0; | 396 | u32 utmi_mode = 0; |
| 396 | 397 | ||
| 397 | reg = dwc3_omap_read_utmi_ctrl(omap); | 398 | reg = dwc3_omap_read_utmi_ctrl(omap); |
| 398 | 399 | ||
diff --git a/drivers/usb/dwc3/gadget.c b/drivers/usb/dwc3/gadget.c index 4db97ecae885..0d75158e43fe 100644 --- a/drivers/usb/dwc3/gadget.c +++ b/drivers/usb/dwc3/gadget.c | |||
| @@ -1342,6 +1342,68 @@ static int dwc3_gadget_ep_dequeue(struct usb_ep *ep, | |||
| 1342 | if (r == req) { | 1342 | if (r == req) { |
| 1343 | /* wait until it is processed */ | 1343 | /* wait until it is processed */ |
| 1344 | dwc3_stop_active_transfer(dwc, dep->number, true); | 1344 | dwc3_stop_active_transfer(dwc, dep->number, true); |
| 1345 | |||
| 1346 | /* | ||
| 1347 | * If request was already started, this means we had to | ||
| 1348 | * stop the transfer. With that we also need to ignore | ||
| 1349 | * all TRBs used by the request, however TRBs can only | ||
| 1350 | * be modified after completion of END_TRANSFER | ||
| 1351 | * command. So what we do here is that we wait for | ||
| 1352 | * END_TRANSFER completion and only after that, we jump | ||
| 1353 | * over TRBs by clearing HWO and incrementing dequeue | ||
| 1354 | * pointer. | ||
| 1355 | * | ||
| 1356 | * Note that we have 2 possible types of transfers here: | ||
| 1357 | * | ||
| 1358 | * i) Linear buffer request | ||
| 1359 | * ii) SG-list based request | ||
| 1360 | * | ||
| 1361 | * SG-list based requests will have r->num_pending_sgs | ||
| 1362 | * set to a valid number (> 0). Linear requests, | ||
| 1363 | * normally use a single TRB. | ||
| 1364 | * | ||
| 1365 | * For each of these two cases, if r->unaligned flag is | ||
| 1366 | * set, one extra TRB has been used to align transfer | ||
| 1367 | * size to wMaxPacketSize. | ||
| 1368 | * | ||
| 1369 | * All of these cases need to be taken into | ||
| 1370 | * consideration so we don't mess up our TRB ring | ||
| 1371 | * pointers. | ||
| 1372 | */ | ||
| 1373 | wait_event_lock_irq(dep->wait_end_transfer, | ||
| 1374 | !(dep->flags & DWC3_EP_END_TRANSFER_PENDING), | ||
| 1375 | dwc->lock); | ||
| 1376 | |||
| 1377 | if (!r->trb) | ||
| 1378 | goto out1; | ||
| 1379 | |||
| 1380 | if (r->num_pending_sgs) { | ||
| 1381 | struct dwc3_trb *trb; | ||
| 1382 | int i = 0; | ||
| 1383 | |||
| 1384 | for (i = 0; i < r->num_pending_sgs; i++) { | ||
| 1385 | trb = r->trb + i; | ||
| 1386 | trb->ctrl &= ~DWC3_TRB_CTRL_HWO; | ||
| 1387 | dwc3_ep_inc_deq(dep); | ||
| 1388 | } | ||
| 1389 | |||
| 1390 | if (r->unaligned) { | ||
| 1391 | trb = r->trb + r->num_pending_sgs + 1; | ||
| 1392 | trb->ctrl &= ~DWC3_TRB_CTRL_HWO; | ||
| 1393 | dwc3_ep_inc_deq(dep); | ||
| 1394 | } | ||
| 1395 | } else { | ||
| 1396 | struct dwc3_trb *trb = r->trb; | ||
| 1397 | |||
| 1398 | trb->ctrl &= ~DWC3_TRB_CTRL_HWO; | ||
| 1399 | dwc3_ep_inc_deq(dep); | ||
| 1400 | |||
| 1401 | if (r->unaligned) { | ||
| 1402 | trb = r->trb + 1; | ||
| 1403 | trb->ctrl &= ~DWC3_TRB_CTRL_HWO; | ||
| 1404 | dwc3_ep_inc_deq(dep); | ||
| 1405 | } | ||
| 1406 | } | ||
| 1345 | goto out1; | 1407 | goto out1; |
| 1346 | } | 1408 | } |
| 1347 | dev_err(dwc->dev, "request %p was not queued to %s\n", | 1409 | dev_err(dwc->dev, "request %p was not queued to %s\n", |
| @@ -1352,6 +1414,7 @@ static int dwc3_gadget_ep_dequeue(struct usb_ep *ep, | |||
| 1352 | 1414 | ||
| 1353 | out1: | 1415 | out1: |
| 1354 | /* giveback the request */ | 1416 | /* giveback the request */ |
| 1417 | dep->queued_requests--; | ||
| 1355 | dwc3_gadget_giveback(dep, req, -ECONNRESET); | 1418 | dwc3_gadget_giveback(dep, req, -ECONNRESET); |
| 1356 | 1419 | ||
| 1357 | out0: | 1420 | out0: |
| @@ -2126,12 +2189,12 @@ static int __dwc3_cleanup_done_trbs(struct dwc3 *dwc, struct dwc3_ep *dep, | |||
| 2126 | return 1; | 2189 | return 1; |
| 2127 | } | 2190 | } |
| 2128 | 2191 | ||
| 2129 | if ((trb->ctrl & DWC3_TRB_CTRL_HWO) && status != -ESHUTDOWN) | ||
| 2130 | return 1; | ||
| 2131 | |||
| 2132 | count = trb->size & DWC3_TRB_SIZE_MASK; | 2192 | count = trb->size & DWC3_TRB_SIZE_MASK; |
| 2133 | req->remaining += count; | 2193 | req->remaining += count; |
| 2134 | 2194 | ||
| 2195 | if ((trb->ctrl & DWC3_TRB_CTRL_HWO) && status != -ESHUTDOWN) | ||
| 2196 | return 1; | ||
| 2197 | |||
| 2135 | if (dep->direction) { | 2198 | if (dep->direction) { |
| 2136 | if (count) { | 2199 | if (count) { |
| 2137 | trb_status = DWC3_TRB_SIZE_TRBSTS(trb->size); | 2200 | trb_status = DWC3_TRB_SIZE_TRBSTS(trb->size); |
| @@ -3228,15 +3291,10 @@ void dwc3_gadget_exit(struct dwc3 *dwc) | |||
| 3228 | 3291 | ||
| 3229 | int dwc3_gadget_suspend(struct dwc3 *dwc) | 3292 | int dwc3_gadget_suspend(struct dwc3 *dwc) |
| 3230 | { | 3293 | { |
| 3231 | int ret; | ||
| 3232 | |||
| 3233 | if (!dwc->gadget_driver) | 3294 | if (!dwc->gadget_driver) |
| 3234 | return 0; | 3295 | return 0; |
| 3235 | 3296 | ||
| 3236 | ret = dwc3_gadget_run_stop(dwc, false, false); | 3297 | dwc3_gadget_run_stop(dwc, false, false); |
| 3237 | if (ret < 0) | ||
| 3238 | return ret; | ||
| 3239 | |||
| 3240 | dwc3_disconnect_gadget(dwc); | 3298 | dwc3_disconnect_gadget(dwc); |
| 3241 | __dwc3_gadget_stop(dwc); | 3299 | __dwc3_gadget_stop(dwc); |
| 3242 | 3300 | ||
diff --git a/drivers/usb/dwc3/gadget.h b/drivers/usb/dwc3/gadget.h index 3129bcf74d7d..265e223ab645 100644 --- a/drivers/usb/dwc3/gadget.h +++ b/drivers/usb/dwc3/gadget.h | |||
| @@ -28,23 +28,23 @@ struct dwc3; | |||
| 28 | #define gadget_to_dwc(g) (container_of(g, struct dwc3, gadget)) | 28 | #define gadget_to_dwc(g) (container_of(g, struct dwc3, gadget)) |
| 29 | 29 | ||
| 30 | /* DEPCFG parameter 1 */ | 30 | /* DEPCFG parameter 1 */ |
| 31 | #define DWC3_DEPCFG_INT_NUM(n) ((n) << 0) | 31 | #define DWC3_DEPCFG_INT_NUM(n) (((n) & 0x1f) << 0) |
| 32 | #define DWC3_DEPCFG_XFER_COMPLETE_EN (1 << 8) | 32 | #define DWC3_DEPCFG_XFER_COMPLETE_EN (1 << 8) |
| 33 | #define DWC3_DEPCFG_XFER_IN_PROGRESS_EN (1 << 9) | 33 | #define DWC3_DEPCFG_XFER_IN_PROGRESS_EN (1 << 9) |
| 34 | #define DWC3_DEPCFG_XFER_NOT_READY_EN (1 << 10) | 34 | #define DWC3_DEPCFG_XFER_NOT_READY_EN (1 << 10) |
| 35 | #define DWC3_DEPCFG_FIFO_ERROR_EN (1 << 11) | 35 | #define DWC3_DEPCFG_FIFO_ERROR_EN (1 << 11) |
| 36 | #define DWC3_DEPCFG_STREAM_EVENT_EN (1 << 13) | 36 | #define DWC3_DEPCFG_STREAM_EVENT_EN (1 << 13) |
| 37 | #define DWC3_DEPCFG_BINTERVAL_M1(n) ((n) << 16) | 37 | #define DWC3_DEPCFG_BINTERVAL_M1(n) (((n) & 0xff) << 16) |
| 38 | #define DWC3_DEPCFG_STREAM_CAPABLE (1 << 24) | 38 | #define DWC3_DEPCFG_STREAM_CAPABLE (1 << 24) |
| 39 | #define DWC3_DEPCFG_EP_NUMBER(n) ((n) << 25) | 39 | #define DWC3_DEPCFG_EP_NUMBER(n) (((n) & 0x1f) << 25) |
| 40 | #define DWC3_DEPCFG_BULK_BASED (1 << 30) | 40 | #define DWC3_DEPCFG_BULK_BASED (1 << 30) |
| 41 | #define DWC3_DEPCFG_FIFO_BASED (1 << 31) | 41 | #define DWC3_DEPCFG_FIFO_BASED (1 << 31) |
| 42 | 42 | ||
| 43 | /* DEPCFG parameter 0 */ | 43 | /* DEPCFG parameter 0 */ |
| 44 | #define DWC3_DEPCFG_EP_TYPE(n) ((n) << 1) | 44 | #define DWC3_DEPCFG_EP_TYPE(n) (((n) & 0x3) << 1) |
| 45 | #define DWC3_DEPCFG_MAX_PACKET_SIZE(n) ((n) << 3) | 45 | #define DWC3_DEPCFG_MAX_PACKET_SIZE(n) (((n) & 0x7ff) << 3) |
| 46 | #define DWC3_DEPCFG_FIFO_NUMBER(n) ((n) << 17) | 46 | #define DWC3_DEPCFG_FIFO_NUMBER(n) (((n) & 0x1f) << 17) |
| 47 | #define DWC3_DEPCFG_BURST_SIZE(n) ((n) << 22) | 47 | #define DWC3_DEPCFG_BURST_SIZE(n) (((n) & 0xf) << 22) |
| 48 | #define DWC3_DEPCFG_DATA_SEQ_NUM(n) ((n) << 26) | 48 | #define DWC3_DEPCFG_DATA_SEQ_NUM(n) ((n) << 26) |
| 49 | /* This applies for core versions earlier than 1.94a */ | 49 | /* This applies for core versions earlier than 1.94a */ |
| 50 | #define DWC3_DEPCFG_IGN_SEQ_NUM (1 << 31) | 50 | #define DWC3_DEPCFG_IGN_SEQ_NUM (1 << 31) |
diff --git a/drivers/usb/gadget/configfs.c b/drivers/usb/gadget/configfs.c index 78c44979dde3..cbff3b02840d 100644 --- a/drivers/usb/gadget/configfs.c +++ b/drivers/usb/gadget/configfs.c | |||
| @@ -269,6 +269,7 @@ static ssize_t gadget_dev_desc_UDC_store(struct config_item *item, | |||
| 269 | ret = unregister_gadget(gi); | 269 | ret = unregister_gadget(gi); |
| 270 | if (ret) | 270 | if (ret) |
| 271 | goto err; | 271 | goto err; |
| 272 | kfree(name); | ||
| 272 | } else { | 273 | } else { |
| 273 | if (gi->composite.gadget_driver.udc_name) { | 274 | if (gi->composite.gadget_driver.udc_name) { |
| 274 | ret = -EBUSY; | 275 | ret = -EBUSY; |
diff --git a/drivers/usb/gadget/function/f_fs.c b/drivers/usb/gadget/function/f_fs.c index a5b7cd615698..a0085571824d 100644 --- a/drivers/usb/gadget/function/f_fs.c +++ b/drivers/usb/gadget/function/f_fs.c | |||
| @@ -1834,11 +1834,14 @@ static int ffs_func_eps_enable(struct ffs_function *func) | |||
| 1834 | spin_lock_irqsave(&func->ffs->eps_lock, flags); | 1834 | spin_lock_irqsave(&func->ffs->eps_lock, flags); |
| 1835 | while(count--) { | 1835 | while(count--) { |
| 1836 | struct usb_endpoint_descriptor *ds; | 1836 | struct usb_endpoint_descriptor *ds; |
| 1837 | struct usb_ss_ep_comp_descriptor *comp_desc = NULL; | ||
| 1838 | int needs_comp_desc = false; | ||
| 1837 | int desc_idx; | 1839 | int desc_idx; |
| 1838 | 1840 | ||
| 1839 | if (ffs->gadget->speed == USB_SPEED_SUPER) | 1841 | if (ffs->gadget->speed == USB_SPEED_SUPER) { |
| 1840 | desc_idx = 2; | 1842 | desc_idx = 2; |
| 1841 | else if (ffs->gadget->speed == USB_SPEED_HIGH) | 1843 | needs_comp_desc = true; |
| 1844 | } else if (ffs->gadget->speed == USB_SPEED_HIGH) | ||
| 1842 | desc_idx = 1; | 1845 | desc_idx = 1; |
| 1843 | else | 1846 | else |
| 1844 | desc_idx = 0; | 1847 | desc_idx = 0; |
| @@ -1855,6 +1858,14 @@ static int ffs_func_eps_enable(struct ffs_function *func) | |||
| 1855 | 1858 | ||
| 1856 | ep->ep->driver_data = ep; | 1859 | ep->ep->driver_data = ep; |
| 1857 | ep->ep->desc = ds; | 1860 | ep->ep->desc = ds; |
| 1861 | |||
| 1862 | comp_desc = (struct usb_ss_ep_comp_descriptor *)(ds + | ||
| 1863 | USB_DT_ENDPOINT_SIZE); | ||
| 1864 | ep->ep->maxburst = comp_desc->bMaxBurst + 1; | ||
| 1865 | |||
| 1866 | if (needs_comp_desc) | ||
| 1867 | ep->ep->comp_desc = comp_desc; | ||
| 1868 | |||
| 1858 | ret = usb_ep_enable(ep->ep); | 1869 | ret = usb_ep_enable(ep->ep); |
| 1859 | if (likely(!ret)) { | 1870 | if (likely(!ret)) { |
| 1860 | epfile->ep = ep; | 1871 | epfile->ep = ep; |
| @@ -2253,7 +2264,7 @@ static int __ffs_data_do_os_desc(enum ffs_os_desc_type type, | |||
| 2253 | 2264 | ||
| 2254 | if (len < sizeof(*d) || | 2265 | if (len < sizeof(*d) || |
| 2255 | d->bFirstInterfaceNumber >= ffs->interfaces_count || | 2266 | d->bFirstInterfaceNumber >= ffs->interfaces_count || |
| 2256 | d->Reserved1) | 2267 | !d->Reserved1) |
| 2257 | return -EINVAL; | 2268 | return -EINVAL; |
| 2258 | for (i = 0; i < ARRAY_SIZE(d->Reserved2); ++i) | 2269 | for (i = 0; i < ARRAY_SIZE(d->Reserved2); ++i) |
| 2259 | if (d->Reserved2[i]) | 2270 | if (d->Reserved2[i]) |
diff --git a/drivers/usb/gadget/function/f_uvc.c b/drivers/usb/gadget/function/f_uvc.c index 27ed51b5082f..29b41b5dee04 100644 --- a/drivers/usb/gadget/function/f_uvc.c +++ b/drivers/usb/gadget/function/f_uvc.c | |||
| @@ -258,13 +258,6 @@ uvc_function_setup(struct usb_function *f, const struct usb_ctrlrequest *ctrl) | |||
| 258 | memcpy(&uvc_event->req, ctrl, sizeof(uvc_event->req)); | 258 | memcpy(&uvc_event->req, ctrl, sizeof(uvc_event->req)); |
| 259 | v4l2_event_queue(&uvc->vdev, &v4l2_event); | 259 | v4l2_event_queue(&uvc->vdev, &v4l2_event); |
| 260 | 260 | ||
| 261 | /* Pass additional setup data to userspace */ | ||
| 262 | if (uvc->event_setup_out && uvc->event_length) { | ||
| 263 | uvc->control_req->length = uvc->event_length; | ||
| 264 | return usb_ep_queue(uvc->func.config->cdev->gadget->ep0, | ||
| 265 | uvc->control_req, GFP_ATOMIC); | ||
| 266 | } | ||
| 267 | |||
| 268 | return 0; | 261 | return 0; |
| 269 | } | 262 | } |
| 270 | 263 | ||
diff --git a/drivers/usb/gadget/legacy/inode.c b/drivers/usb/gadget/legacy/inode.c index 79a2d8fba6b6..a2c916869293 100644 --- a/drivers/usb/gadget/legacy/inode.c +++ b/drivers/usb/gadget/legacy/inode.c | |||
| @@ -1781,8 +1781,10 @@ dev_config (struct file *fd, const char __user *buf, size_t len, loff_t *ptr) | |||
| 1781 | 1781 | ||
| 1782 | spin_lock_irq (&dev->lock); | 1782 | spin_lock_irq (&dev->lock); |
| 1783 | value = -EINVAL; | 1783 | value = -EINVAL; |
| 1784 | if (dev->buf) | 1784 | if (dev->buf) { |
| 1785 | kfree(kbuf); | ||
| 1785 | goto fail; | 1786 | goto fail; |
| 1787 | } | ||
| 1786 | dev->buf = kbuf; | 1788 | dev->buf = kbuf; |
| 1787 | 1789 | ||
| 1788 | /* full or low speed config */ | 1790 | /* full or low speed config */ |
diff --git a/drivers/usb/gadget/udc/atmel_usba_udc.c b/drivers/usb/gadget/udc/atmel_usba_udc.c index 11bbce28bc23..2035906b8ced 100644 --- a/drivers/usb/gadget/udc/atmel_usba_udc.c +++ b/drivers/usb/gadget/udc/atmel_usba_udc.c | |||
| @@ -610,7 +610,7 @@ usba_ep_enable(struct usb_ep *_ep, const struct usb_endpoint_descriptor *desc) | |||
| 610 | { | 610 | { |
| 611 | struct usba_ep *ep = to_usba_ep(_ep); | 611 | struct usba_ep *ep = to_usba_ep(_ep); |
| 612 | struct usba_udc *udc = ep->udc; | 612 | struct usba_udc *udc = ep->udc; |
| 613 | unsigned long flags, ept_cfg, maxpacket; | 613 | unsigned long flags, maxpacket; |
| 614 | unsigned int nr_trans; | 614 | unsigned int nr_trans; |
| 615 | 615 | ||
| 616 | DBG(DBG_GADGET, "%s: ep_enable: desc=%p\n", ep->ep.name, desc); | 616 | DBG(DBG_GADGET, "%s: ep_enable: desc=%p\n", ep->ep.name, desc); |
| @@ -630,7 +630,7 @@ usba_ep_enable(struct usb_ep *_ep, const struct usb_endpoint_descriptor *desc) | |||
| 630 | ep->is_in = 0; | 630 | ep->is_in = 0; |
| 631 | 631 | ||
| 632 | DBG(DBG_ERR, "%s: EPT_CFG = 0x%lx (maxpacket = %lu)\n", | 632 | DBG(DBG_ERR, "%s: EPT_CFG = 0x%lx (maxpacket = %lu)\n", |
| 633 | ep->ep.name, ept_cfg, maxpacket); | 633 | ep->ep.name, ep->ept_cfg, maxpacket); |
| 634 | 634 | ||
| 635 | if (usb_endpoint_dir_in(desc)) { | 635 | if (usb_endpoint_dir_in(desc)) { |
| 636 | ep->is_in = 1; | 636 | ep->is_in = 1; |
diff --git a/drivers/usb/gadget/udc/dummy_hcd.c b/drivers/usb/gadget/udc/dummy_hcd.c index c60abe3a68f9..8cabc5944d5f 100644 --- a/drivers/usb/gadget/udc/dummy_hcd.c +++ b/drivers/usb/gadget/udc/dummy_hcd.c | |||
| @@ -1031,6 +1031,8 @@ static int dummy_udc_probe(struct platform_device *pdev) | |||
| 1031 | int rc; | 1031 | int rc; |
| 1032 | 1032 | ||
| 1033 | dum = *((void **)dev_get_platdata(&pdev->dev)); | 1033 | dum = *((void **)dev_get_platdata(&pdev->dev)); |
| 1034 | /* Clear usb_gadget region for new registration to udc-core */ | ||
| 1035 | memzero_explicit(&dum->gadget, sizeof(struct usb_gadget)); | ||
| 1034 | dum->gadget.name = gadget_name; | 1036 | dum->gadget.name = gadget_name; |
| 1035 | dum->gadget.ops = &dummy_ops; | 1037 | dum->gadget.ops = &dummy_ops; |
| 1036 | dum->gadget.max_speed = USB_SPEED_SUPER; | 1038 | dum->gadget.max_speed = USB_SPEED_SUPER; |
diff --git a/drivers/usb/gadget/udc/net2280.c b/drivers/usb/gadget/udc/net2280.c index 85504419ab31..3828c2ec8623 100644 --- a/drivers/usb/gadget/udc/net2280.c +++ b/drivers/usb/gadget/udc/net2280.c | |||
| @@ -1146,15 +1146,15 @@ static int scan_dma_completions(struct net2280_ep *ep) | |||
| 1146 | */ | 1146 | */ |
| 1147 | while (!list_empty(&ep->queue)) { | 1147 | while (!list_empty(&ep->queue)) { |
| 1148 | struct net2280_request *req; | 1148 | struct net2280_request *req; |
| 1149 | u32 tmp; | 1149 | u32 req_dma_count; |
| 1150 | 1150 | ||
| 1151 | req = list_entry(ep->queue.next, | 1151 | req = list_entry(ep->queue.next, |
| 1152 | struct net2280_request, queue); | 1152 | struct net2280_request, queue); |
| 1153 | if (!req->valid) | 1153 | if (!req->valid) |
| 1154 | break; | 1154 | break; |
| 1155 | rmb(); | 1155 | rmb(); |
| 1156 | tmp = le32_to_cpup(&req->td->dmacount); | 1156 | req_dma_count = le32_to_cpup(&req->td->dmacount); |
| 1157 | if ((tmp & BIT(VALID_BIT)) != 0) | 1157 | if ((req_dma_count & BIT(VALID_BIT)) != 0) |
| 1158 | break; | 1158 | break; |
| 1159 | 1159 | ||
| 1160 | /* SHORT_PACKET_TRANSFERRED_INTERRUPT handles "usb-short" | 1160 | /* SHORT_PACKET_TRANSFERRED_INTERRUPT handles "usb-short" |
| @@ -1163,40 +1163,41 @@ static int scan_dma_completions(struct net2280_ep *ep) | |||
| 1163 | */ | 1163 | */ |
| 1164 | if (unlikely(req->td->dmadesc == 0)) { | 1164 | if (unlikely(req->td->dmadesc == 0)) { |
| 1165 | /* paranoia */ | 1165 | /* paranoia */ |
| 1166 | tmp = readl(&ep->dma->dmacount); | 1166 | u32 const ep_dmacount = readl(&ep->dma->dmacount); |
| 1167 | if (tmp & DMA_BYTE_COUNT_MASK) | 1167 | |
| 1168 | if (ep_dmacount & DMA_BYTE_COUNT_MASK) | ||
| 1168 | break; | 1169 | break; |
| 1169 | /* single transfer mode */ | 1170 | /* single transfer mode */ |
| 1170 | dma_done(ep, req, tmp, 0); | 1171 | dma_done(ep, req, req_dma_count, 0); |
| 1171 | num_completed++; | 1172 | num_completed++; |
| 1172 | break; | 1173 | break; |
| 1173 | } else if (!ep->is_in && | 1174 | } else if (!ep->is_in && |
| 1174 | (req->req.length % ep->ep.maxpacket) && | 1175 | (req->req.length % ep->ep.maxpacket) && |
| 1175 | !(ep->dev->quirks & PLX_PCIE)) { | 1176 | !(ep->dev->quirks & PLX_PCIE)) { |
| 1176 | 1177 | ||
| 1177 | tmp = readl(&ep->regs->ep_stat); | 1178 | u32 const ep_stat = readl(&ep->regs->ep_stat); |
| 1178 | /* AVOID TROUBLE HERE by not issuing short reads from | 1179 | /* AVOID TROUBLE HERE by not issuing short reads from |
| 1179 | * your gadget driver. That helps avoids errata 0121, | 1180 | * your gadget driver. That helps avoids errata 0121, |
| 1180 | * 0122, and 0124; not all cases trigger the warning. | 1181 | * 0122, and 0124; not all cases trigger the warning. |
| 1181 | */ | 1182 | */ |
| 1182 | if ((tmp & BIT(NAK_OUT_PACKETS)) == 0) { | 1183 | if ((ep_stat & BIT(NAK_OUT_PACKETS)) == 0) { |
| 1183 | ep_warn(ep->dev, "%s lost packet sync!\n", | 1184 | ep_warn(ep->dev, "%s lost packet sync!\n", |
| 1184 | ep->ep.name); | 1185 | ep->ep.name); |
| 1185 | req->req.status = -EOVERFLOW; | 1186 | req->req.status = -EOVERFLOW; |
| 1186 | } else { | 1187 | } else { |
| 1187 | tmp = readl(&ep->regs->ep_avail); | 1188 | u32 const ep_avail = readl(&ep->regs->ep_avail); |
| 1188 | if (tmp) { | 1189 | if (ep_avail) { |
| 1189 | /* fifo gets flushed later */ | 1190 | /* fifo gets flushed later */ |
| 1190 | ep->out_overflow = 1; | 1191 | ep->out_overflow = 1; |
| 1191 | ep_dbg(ep->dev, | 1192 | ep_dbg(ep->dev, |
| 1192 | "%s dma, discard %d len %d\n", | 1193 | "%s dma, discard %d len %d\n", |
| 1193 | ep->ep.name, tmp, | 1194 | ep->ep.name, ep_avail, |
| 1194 | req->req.length); | 1195 | req->req.length); |
| 1195 | req->req.status = -EOVERFLOW; | 1196 | req->req.status = -EOVERFLOW; |
| 1196 | } | 1197 | } |
| 1197 | } | 1198 | } |
| 1198 | } | 1199 | } |
| 1199 | dma_done(ep, req, tmp, 0); | 1200 | dma_done(ep, req, req_dma_count, 0); |
| 1200 | num_completed++; | 1201 | num_completed++; |
| 1201 | } | 1202 | } |
| 1202 | 1203 | ||
diff --git a/drivers/usb/gadget/udc/pxa27x_udc.c b/drivers/usb/gadget/udc/pxa27x_udc.c index e1335ad5bce9..832c4fdbe985 100644 --- a/drivers/usb/gadget/udc/pxa27x_udc.c +++ b/drivers/usb/gadget/udc/pxa27x_udc.c | |||
| @@ -2534,9 +2534,10 @@ static int pxa_udc_remove(struct platform_device *_dev) | |||
| 2534 | usb_del_gadget_udc(&udc->gadget); | 2534 | usb_del_gadget_udc(&udc->gadget); |
| 2535 | pxa_cleanup_debugfs(udc); | 2535 | pxa_cleanup_debugfs(udc); |
| 2536 | 2536 | ||
| 2537 | if (!IS_ERR_OR_NULL(udc->transceiver)) | 2537 | if (!IS_ERR_OR_NULL(udc->transceiver)) { |
| 2538 | usb_unregister_notifier(udc->transceiver, &pxa27x_udc_phy); | 2538 | usb_unregister_notifier(udc->transceiver, &pxa27x_udc_phy); |
| 2539 | usb_put_phy(udc->transceiver); | 2539 | usb_put_phy(udc->transceiver); |
| 2540 | } | ||
| 2540 | 2541 | ||
| 2541 | udc->transceiver = NULL; | 2542 | udc->transceiver = NULL; |
| 2542 | the_controller = NULL; | 2543 | the_controller = NULL; |
diff --git a/drivers/usb/host/ohci-at91.c b/drivers/usb/host/ohci-at91.c index 414e3c376dbb..5302f988e7e6 100644 --- a/drivers/usb/host/ohci-at91.c +++ b/drivers/usb/host/ohci-at91.c | |||
| @@ -350,7 +350,7 @@ static int ohci_at91_hub_control(struct usb_hcd *hcd, u16 typeReq, u16 wValue, | |||
| 350 | 350 | ||
| 351 | case USB_PORT_FEAT_SUSPEND: | 351 | case USB_PORT_FEAT_SUSPEND: |
| 352 | dev_dbg(hcd->self.controller, "SetPortFeat: SUSPEND\n"); | 352 | dev_dbg(hcd->self.controller, "SetPortFeat: SUSPEND\n"); |
| 353 | if (valid_port(wIndex)) { | 353 | if (valid_port(wIndex) && ohci_at91->sfr_regmap) { |
| 354 | ohci_at91_port_suspend(ohci_at91->sfr_regmap, | 354 | ohci_at91_port_suspend(ohci_at91->sfr_regmap, |
| 355 | 1); | 355 | 1); |
| 356 | return 0; | 356 | return 0; |
| @@ -393,7 +393,7 @@ static int ohci_at91_hub_control(struct usb_hcd *hcd, u16 typeReq, u16 wValue, | |||
| 393 | 393 | ||
| 394 | case USB_PORT_FEAT_SUSPEND: | 394 | case USB_PORT_FEAT_SUSPEND: |
| 395 | dev_dbg(hcd->self.controller, "ClearPortFeature: SUSPEND\n"); | 395 | dev_dbg(hcd->self.controller, "ClearPortFeature: SUSPEND\n"); |
| 396 | if (valid_port(wIndex)) { | 396 | if (valid_port(wIndex) && ohci_at91->sfr_regmap) { |
| 397 | ohci_at91_port_suspend(ohci_at91->sfr_regmap, | 397 | ohci_at91_port_suspend(ohci_at91->sfr_regmap, |
| 398 | 0); | 398 | 0); |
| 399 | return 0; | 399 | return 0; |
diff --git a/drivers/usb/host/xhci-dbg.c b/drivers/usb/host/xhci-dbg.c index 363d125300ea..2b4a00fa735d 100644 --- a/drivers/usb/host/xhci-dbg.c +++ b/drivers/usb/host/xhci-dbg.c | |||
| @@ -109,7 +109,7 @@ static void xhci_print_cap_regs(struct xhci_hcd *xhci) | |||
| 109 | xhci_dbg(xhci, "RTSOFF 0x%x:\n", temp & RTSOFF_MASK); | 109 | xhci_dbg(xhci, "RTSOFF 0x%x:\n", temp & RTSOFF_MASK); |
| 110 | 110 | ||
| 111 | /* xhci 1.1 controllers have the HCCPARAMS2 register */ | 111 | /* xhci 1.1 controllers have the HCCPARAMS2 register */ |
| 112 | if (hci_version > 100) { | 112 | if (hci_version > 0x100) { |
| 113 | temp = readl(&xhci->cap_regs->hcc_params2); | 113 | temp = readl(&xhci->cap_regs->hcc_params2); |
| 114 | xhci_dbg(xhci, "HCC PARAMS2 0x%x:\n", (unsigned int) temp); | 114 | xhci_dbg(xhci, "HCC PARAMS2 0x%x:\n", (unsigned int) temp); |
| 115 | xhci_dbg(xhci, " HC %s Force save context capability", | 115 | xhci_dbg(xhci, " HC %s Force save context capability", |
diff --git a/drivers/usb/host/xhci-mtk.c b/drivers/usb/host/xhci-mtk.c index 9066ec9e0c2e..67d5dc79b6b5 100644 --- a/drivers/usb/host/xhci-mtk.c +++ b/drivers/usb/host/xhci-mtk.c | |||
| @@ -382,7 +382,6 @@ static int usb_wakeup_of_property_parse(struct xhci_hcd_mtk *mtk, | |||
| 382 | 382 | ||
| 383 | static int xhci_mtk_setup(struct usb_hcd *hcd); | 383 | static int xhci_mtk_setup(struct usb_hcd *hcd); |
| 384 | static const struct xhci_driver_overrides xhci_mtk_overrides __initconst = { | 384 | static const struct xhci_driver_overrides xhci_mtk_overrides __initconst = { |
| 385 | .extra_priv_size = sizeof(struct xhci_hcd), | ||
| 386 | .reset = xhci_mtk_setup, | 385 | .reset = xhci_mtk_setup, |
| 387 | }; | 386 | }; |
| 388 | 387 | ||
| @@ -678,13 +677,13 @@ static int xhci_mtk_probe(struct platform_device *pdev) | |||
| 678 | goto power_off_phys; | 677 | goto power_off_phys; |
| 679 | } | 678 | } |
| 680 | 679 | ||
| 681 | if (HCC_MAX_PSA(xhci->hcc_params) >= 4) | ||
| 682 | xhci->shared_hcd->can_do_streams = 1; | ||
| 683 | |||
| 684 | ret = usb_add_hcd(hcd, irq, IRQF_SHARED); | 680 | ret = usb_add_hcd(hcd, irq, IRQF_SHARED); |
| 685 | if (ret) | 681 | if (ret) |
| 686 | goto put_usb3_hcd; | 682 | goto put_usb3_hcd; |
| 687 | 683 | ||
| 684 | if (HCC_MAX_PSA(xhci->hcc_params) >= 4) | ||
| 685 | xhci->shared_hcd->can_do_streams = 1; | ||
| 686 | |||
| 688 | ret = usb_add_hcd(xhci->shared_hcd, irq, IRQF_SHARED); | 687 | ret = usb_add_hcd(xhci->shared_hcd, irq, IRQF_SHARED); |
| 689 | if (ret) | 688 | if (ret) |
| 690 | goto dealloc_usb2_hcd; | 689 | goto dealloc_usb2_hcd; |
diff --git a/drivers/usb/host/xhci-plat.c b/drivers/usb/host/xhci-plat.c index 6d33b42ffcf5..bd02a6cd8e2c 100644 --- a/drivers/usb/host/xhci-plat.c +++ b/drivers/usb/host/xhci-plat.c | |||
| @@ -286,6 +286,8 @@ static int xhci_plat_remove(struct platform_device *dev) | |||
| 286 | struct xhci_hcd *xhci = hcd_to_xhci(hcd); | 286 | struct xhci_hcd *xhci = hcd_to_xhci(hcd); |
| 287 | struct clk *clk = xhci->clk; | 287 | struct clk *clk = xhci->clk; |
| 288 | 288 | ||
| 289 | xhci->xhc_state |= XHCI_STATE_REMOVING; | ||
| 290 | |||
| 289 | usb_remove_hcd(xhci->shared_hcd); | 291 | usb_remove_hcd(xhci->shared_hcd); |
| 290 | usb_phy_shutdown(hcd->usb_phy); | 292 | usb_phy_shutdown(hcd->usb_phy); |
| 291 | 293 | ||
diff --git a/drivers/usb/host/xhci-tegra.c b/drivers/usb/host/xhci-tegra.c index a59fafb4b329..74436f8ca538 100644 --- a/drivers/usb/host/xhci-tegra.c +++ b/drivers/usb/host/xhci-tegra.c | |||
| @@ -1308,7 +1308,6 @@ static int tegra_xhci_setup(struct usb_hcd *hcd) | |||
| 1308 | } | 1308 | } |
| 1309 | 1309 | ||
| 1310 | static const struct xhci_driver_overrides tegra_xhci_overrides __initconst = { | 1310 | static const struct xhci_driver_overrides tegra_xhci_overrides __initconst = { |
| 1311 | .extra_priv_size = sizeof(struct xhci_hcd), | ||
| 1312 | .reset = tegra_xhci_setup, | 1311 | .reset = tegra_xhci_setup, |
| 1313 | }; | 1312 | }; |
| 1314 | 1313 | ||
diff --git a/drivers/usb/misc/iowarrior.c b/drivers/usb/misc/iowarrior.c index 095778ff984d..37c63cb39714 100644 --- a/drivers/usb/misc/iowarrior.c +++ b/drivers/usb/misc/iowarrior.c | |||
| @@ -781,12 +781,6 @@ static int iowarrior_probe(struct usb_interface *interface, | |||
| 781 | iface_desc = interface->cur_altsetting; | 781 | iface_desc = interface->cur_altsetting; |
| 782 | dev->product_id = le16_to_cpu(udev->descriptor.idProduct); | 782 | dev->product_id = le16_to_cpu(udev->descriptor.idProduct); |
| 783 | 783 | ||
| 784 | if (iface_desc->desc.bNumEndpoints < 1) { | ||
| 785 | dev_err(&interface->dev, "Invalid number of endpoints\n"); | ||
| 786 | retval = -EINVAL; | ||
| 787 | goto error; | ||
| 788 | } | ||
| 789 | |||
| 790 | /* set up the endpoint information */ | 784 | /* set up the endpoint information */ |
| 791 | for (i = 0; i < iface_desc->desc.bNumEndpoints; ++i) { | 785 | for (i = 0; i < iface_desc->desc.bNumEndpoints; ++i) { |
| 792 | endpoint = &iface_desc->endpoint[i].desc; | 786 | endpoint = &iface_desc->endpoint[i].desc; |
| @@ -797,6 +791,21 @@ static int iowarrior_probe(struct usb_interface *interface, | |||
| 797 | /* this one will match for the IOWarrior56 only */ | 791 | /* this one will match for the IOWarrior56 only */ |
| 798 | dev->int_out_endpoint = endpoint; | 792 | dev->int_out_endpoint = endpoint; |
| 799 | } | 793 | } |
| 794 | |||
| 795 | if (!dev->int_in_endpoint) { | ||
| 796 | dev_err(&interface->dev, "no interrupt-in endpoint found\n"); | ||
| 797 | retval = -ENODEV; | ||
| 798 | goto error; | ||
| 799 | } | ||
| 800 | |||
| 801 | if (dev->product_id == USB_DEVICE_ID_CODEMERCS_IOW56) { | ||
| 802 | if (!dev->int_out_endpoint) { | ||
| 803 | dev_err(&interface->dev, "no interrupt-out endpoint found\n"); | ||
| 804 | retval = -ENODEV; | ||
| 805 | goto error; | ||
| 806 | } | ||
| 807 | } | ||
| 808 | |||
| 800 | /* we have to check the report_size often, so remember it in the endianness suitable for our machine */ | 809 | /* we have to check the report_size often, so remember it in the endianness suitable for our machine */ |
| 801 | dev->report_size = usb_endpoint_maxp(dev->int_in_endpoint); | 810 | dev->report_size = usb_endpoint_maxp(dev->int_in_endpoint); |
| 802 | if ((dev->interface->cur_altsetting->desc.bInterfaceNumber == 0) && | 811 | if ((dev->interface->cur_altsetting->desc.bInterfaceNumber == 0) && |
diff --git a/drivers/usb/misc/usb251xb.c b/drivers/usb/misc/usb251xb.c index 4e18600dc9b4..91f66d68bcb7 100644 --- a/drivers/usb/misc/usb251xb.c +++ b/drivers/usb/misc/usb251xb.c | |||
| @@ -375,18 +375,24 @@ static int usb251xb_get_ofdata(struct usb251xb *hub, | |||
| 375 | if (of_get_property(np, "dynamic-power-switching", NULL)) | 375 | if (of_get_property(np, "dynamic-power-switching", NULL)) |
| 376 | hub->conf_data2 |= BIT(7); | 376 | hub->conf_data2 |= BIT(7); |
| 377 | 377 | ||
| 378 | if (of_get_property(np, "oc-delay-100us", NULL)) { | 378 | if (!of_property_read_u32(np, "oc-delay-us", property_u32)) { |
| 379 | hub->conf_data2 &= ~BIT(5); | 379 | if (*property_u32 == 100) { |
| 380 | hub->conf_data2 &= ~BIT(4); | 380 | /* 100 us*/ |
| 381 | } else if (of_get_property(np, "oc-delay-4ms", NULL)) { | 381 | hub->conf_data2 &= ~BIT(5); |
| 382 | hub->conf_data2 &= ~BIT(5); | 382 | hub->conf_data2 &= ~BIT(4); |
| 383 | hub->conf_data2 |= BIT(4); | 383 | } else if (*property_u32 == 4000) { |
| 384 | } else if (of_get_property(np, "oc-delay-8ms", NULL)) { | 384 | /* 4 ms */ |
| 385 | hub->conf_data2 |= BIT(5); | 385 | hub->conf_data2 &= ~BIT(5); |
| 386 | hub->conf_data2 &= ~BIT(4); | 386 | hub->conf_data2 |= BIT(4); |
| 387 | } else if (of_get_property(np, "oc-delay-16ms", NULL)) { | 387 | } else if (*property_u32 == 16000) { |
| 388 | hub->conf_data2 |= BIT(5); | 388 | /* 16 ms */ |
| 389 | hub->conf_data2 |= BIT(4); | 389 | hub->conf_data2 |= BIT(5); |
| 390 | hub->conf_data2 |= BIT(4); | ||
| 391 | } else { | ||
| 392 | /* 8 ms (DEFAULT) */ | ||
| 393 | hub->conf_data2 |= BIT(5); | ||
| 394 | hub->conf_data2 &= ~BIT(4); | ||
| 395 | } | ||
| 390 | } | 396 | } |
| 391 | 397 | ||
| 392 | if (of_get_property(np, "compound-device", NULL)) | 398 | if (of_get_property(np, "compound-device", NULL)) |
| @@ -432,30 +438,9 @@ static int usb251xb_get_ofdata(struct usb251xb *hub, | |||
| 432 | } | 438 | } |
| 433 | } | 439 | } |
| 434 | 440 | ||
| 435 | hub->max_power_sp = USB251XB_DEF_MAX_POWER_SELF; | ||
| 436 | if (!of_property_read_u32(np, "max-sp-power", property_u32)) | ||
| 437 | hub->max_power_sp = min_t(u8, be32_to_cpu(*property_u32) / 2, | ||
| 438 | 250); | ||
| 439 | |||
| 440 | hub->max_power_bp = USB251XB_DEF_MAX_POWER_BUS; | ||
| 441 | if (!of_property_read_u32(np, "max-bp-power", property_u32)) | ||
| 442 | hub->max_power_bp = min_t(u8, be32_to_cpu(*property_u32) / 2, | ||
| 443 | 250); | ||
| 444 | |||
| 445 | hub->max_current_sp = USB251XB_DEF_MAX_CURRENT_SELF; | ||
| 446 | if (!of_property_read_u32(np, "max-sp-current", property_u32)) | ||
| 447 | hub->max_current_sp = min_t(u8, be32_to_cpu(*property_u32) / 2, | ||
| 448 | 250); | ||
| 449 | |||
| 450 | hub->max_current_bp = USB251XB_DEF_MAX_CURRENT_BUS; | ||
| 451 | if (!of_property_read_u32(np, "max-bp-current", property_u32)) | ||
| 452 | hub->max_current_bp = min_t(u8, be32_to_cpu(*property_u32) / 2, | ||
| 453 | 250); | ||
| 454 | |||
| 455 | hub->power_on_time = USB251XB_DEF_POWER_ON_TIME; | 441 | hub->power_on_time = USB251XB_DEF_POWER_ON_TIME; |
| 456 | if (!of_property_read_u32(np, "power-on-time", property_u32)) | 442 | if (!of_property_read_u32(np, "power-on-time-ms", property_u32)) |
| 457 | hub->power_on_time = min_t(u8, be32_to_cpu(*property_u32) / 2, | 443 | hub->power_on_time = min_t(u8, *property_u32 / 2, 255); |
| 458 | 255); | ||
| 459 | 444 | ||
| 460 | if (of_property_read_u16_array(np, "language-id", &hub->lang_id, 1)) | 445 | if (of_property_read_u16_array(np, "language-id", &hub->lang_id, 1)) |
| 461 | hub->lang_id = USB251XB_DEF_LANGUAGE_ID; | 446 | hub->lang_id = USB251XB_DEF_LANGUAGE_ID; |
| @@ -492,6 +477,10 @@ static int usb251xb_get_ofdata(struct usb251xb *hub, | |||
| 492 | /* The following parameters are currently not exposed to devicetree, but | 477 | /* The following parameters are currently not exposed to devicetree, but |
| 493 | * may be as soon as needed. | 478 | * may be as soon as needed. |
| 494 | */ | 479 | */ |
| 480 | hub->max_power_sp = USB251XB_DEF_MAX_POWER_SELF; | ||
| 481 | hub->max_power_bp = USB251XB_DEF_MAX_POWER_BUS; | ||
| 482 | hub->max_current_sp = USB251XB_DEF_MAX_CURRENT_SELF; | ||
| 483 | hub->max_current_bp = USB251XB_DEF_MAX_CURRENT_BUS; | ||
| 495 | hub->bat_charge_en = USB251XB_DEF_BATTERY_CHARGING_ENABLE; | 484 | hub->bat_charge_en = USB251XB_DEF_BATTERY_CHARGING_ENABLE; |
| 496 | hub->boost_up = USB251XB_DEF_BOOST_UP; | 485 | hub->boost_up = USB251XB_DEF_BOOST_UP; |
| 497 | hub->boost_x = USB251XB_DEF_BOOST_X; | 486 | hub->boost_x = USB251XB_DEF_BOOST_X; |
diff --git a/drivers/usb/phy/phy-isp1301.c b/drivers/usb/phy/phy-isp1301.c index db68156568e6..b3b33cf7ddf6 100644 --- a/drivers/usb/phy/phy-isp1301.c +++ b/drivers/usb/phy/phy-isp1301.c | |||
| @@ -33,6 +33,12 @@ static const struct i2c_device_id isp1301_id[] = { | |||
| 33 | }; | 33 | }; |
| 34 | MODULE_DEVICE_TABLE(i2c, isp1301_id); | 34 | MODULE_DEVICE_TABLE(i2c, isp1301_id); |
| 35 | 35 | ||
| 36 | static const struct of_device_id isp1301_of_match[] = { | ||
| 37 | {.compatible = "nxp,isp1301" }, | ||
| 38 | { }, | ||
| 39 | }; | ||
| 40 | MODULE_DEVICE_TABLE(of, isp1301_of_match); | ||
| 41 | |||
| 36 | static struct i2c_client *isp1301_i2c_client; | 42 | static struct i2c_client *isp1301_i2c_client; |
| 37 | 43 | ||
| 38 | static int __isp1301_write(struct isp1301 *isp, u8 reg, u8 value, u8 clear) | 44 | static int __isp1301_write(struct isp1301 *isp, u8 reg, u8 value, u8 clear) |
| @@ -130,6 +136,7 @@ static int isp1301_remove(struct i2c_client *client) | |||
| 130 | static struct i2c_driver isp1301_driver = { | 136 | static struct i2c_driver isp1301_driver = { |
| 131 | .driver = { | 137 | .driver = { |
| 132 | .name = DRV_NAME, | 138 | .name = DRV_NAME, |
| 139 | .of_match_table = of_match_ptr(isp1301_of_match), | ||
| 133 | }, | 140 | }, |
| 134 | .probe = isp1301_probe, | 141 | .probe = isp1301_probe, |
| 135 | .remove = isp1301_remove, | 142 | .remove = isp1301_remove, |
diff --git a/drivers/usb/serial/digi_acceleport.c b/drivers/usb/serial/digi_acceleport.c index ab78111e0968..6537d3ca2797 100644 --- a/drivers/usb/serial/digi_acceleport.c +++ b/drivers/usb/serial/digi_acceleport.c | |||
| @@ -1500,7 +1500,7 @@ static int digi_read_oob_callback(struct urb *urb) | |||
| 1500 | return -1; | 1500 | return -1; |
| 1501 | 1501 | ||
| 1502 | /* handle each oob command */ | 1502 | /* handle each oob command */ |
| 1503 | for (i = 0; i < urb->actual_length - 4; i += 4) { | 1503 | for (i = 0; i < urb->actual_length - 3; i += 4) { |
| 1504 | opcode = buf[i]; | 1504 | opcode = buf[i]; |
| 1505 | line = buf[i + 1]; | 1505 | line = buf[i + 1]; |
| 1506 | status = buf[i + 2]; | 1506 | status = buf[i + 2]; |
diff --git a/drivers/usb/serial/io_ti.c b/drivers/usb/serial/io_ti.c index ceaeebaa6f90..a76b95d32157 100644 --- a/drivers/usb/serial/io_ti.c +++ b/drivers/usb/serial/io_ti.c | |||
| @@ -1674,6 +1674,12 @@ static void edge_interrupt_callback(struct urb *urb) | |||
| 1674 | function = TIUMP_GET_FUNC_FROM_CODE(data[0]); | 1674 | function = TIUMP_GET_FUNC_FROM_CODE(data[0]); |
| 1675 | dev_dbg(dev, "%s - port_number %d, function %d, info 0x%x\n", __func__, | 1675 | dev_dbg(dev, "%s - port_number %d, function %d, info 0x%x\n", __func__, |
| 1676 | port_number, function, data[1]); | 1676 | port_number, function, data[1]); |
| 1677 | |||
| 1678 | if (port_number >= edge_serial->serial->num_ports) { | ||
| 1679 | dev_err(dev, "bad port number %d\n", port_number); | ||
| 1680 | goto exit; | ||
| 1681 | } | ||
| 1682 | |||
| 1677 | port = edge_serial->serial->port[port_number]; | 1683 | port = edge_serial->serial->port[port_number]; |
| 1678 | edge_port = usb_get_serial_port_data(port); | 1684 | edge_port = usb_get_serial_port_data(port); |
| 1679 | if (!edge_port) { | 1685 | if (!edge_port) { |
| @@ -1755,7 +1761,7 @@ static void edge_bulk_in_callback(struct urb *urb) | |||
| 1755 | 1761 | ||
| 1756 | port_number = edge_port->port->port_number; | 1762 | port_number = edge_port->port->port_number; |
| 1757 | 1763 | ||
| 1758 | if (edge_port->lsr_event) { | 1764 | if (urb->actual_length > 0 && edge_port->lsr_event) { |
| 1759 | edge_port->lsr_event = 0; | 1765 | edge_port->lsr_event = 0; |
| 1760 | dev_dbg(dev, "%s ===== Port %u LSR Status = %02x, Data = %02x ======\n", | 1766 | dev_dbg(dev, "%s ===== Port %u LSR Status = %02x, Data = %02x ======\n", |
| 1761 | __func__, port_number, edge_port->lsr_mask, *data); | 1767 | __func__, port_number, edge_port->lsr_mask, *data); |
diff --git a/drivers/usb/serial/omninet.c b/drivers/usb/serial/omninet.c index a180b17d2432..dd706953b466 100644 --- a/drivers/usb/serial/omninet.c +++ b/drivers/usb/serial/omninet.c | |||
| @@ -31,7 +31,6 @@ | |||
| 31 | #define BT_IGNITIONPRO_ID 0x2000 | 31 | #define BT_IGNITIONPRO_ID 0x2000 |
| 32 | 32 | ||
| 33 | /* function prototypes */ | 33 | /* function prototypes */ |
| 34 | static int omninet_open(struct tty_struct *tty, struct usb_serial_port *port); | ||
| 35 | static void omninet_process_read_urb(struct urb *urb); | 34 | static void omninet_process_read_urb(struct urb *urb); |
| 36 | static void omninet_write_bulk_callback(struct urb *urb); | 35 | static void omninet_write_bulk_callback(struct urb *urb); |
| 37 | static int omninet_write(struct tty_struct *tty, struct usb_serial_port *port, | 36 | static int omninet_write(struct tty_struct *tty, struct usb_serial_port *port, |
| @@ -60,7 +59,6 @@ static struct usb_serial_driver zyxel_omninet_device = { | |||
| 60 | .attach = omninet_attach, | 59 | .attach = omninet_attach, |
| 61 | .port_probe = omninet_port_probe, | 60 | .port_probe = omninet_port_probe, |
| 62 | .port_remove = omninet_port_remove, | 61 | .port_remove = omninet_port_remove, |
| 63 | .open = omninet_open, | ||
| 64 | .write = omninet_write, | 62 | .write = omninet_write, |
| 65 | .write_room = omninet_write_room, | 63 | .write_room = omninet_write_room, |
| 66 | .write_bulk_callback = omninet_write_bulk_callback, | 64 | .write_bulk_callback = omninet_write_bulk_callback, |
| @@ -140,17 +138,6 @@ static int omninet_port_remove(struct usb_serial_port *port) | |||
| 140 | return 0; | 138 | return 0; |
| 141 | } | 139 | } |
| 142 | 140 | ||
| 143 | static int omninet_open(struct tty_struct *tty, struct usb_serial_port *port) | ||
| 144 | { | ||
| 145 | struct usb_serial *serial = port->serial; | ||
| 146 | struct usb_serial_port *wport; | ||
| 147 | |||
| 148 | wport = serial->port[1]; | ||
| 149 | tty_port_tty_set(&wport->port, tty); | ||
| 150 | |||
| 151 | return usb_serial_generic_open(tty, port); | ||
| 152 | } | ||
| 153 | |||
| 154 | #define OMNINET_HEADERLEN 4 | 141 | #define OMNINET_HEADERLEN 4 |
| 155 | #define OMNINET_BULKOUTSIZE 64 | 142 | #define OMNINET_BULKOUTSIZE 64 |
| 156 | #define OMNINET_PAYLOADSIZE (OMNINET_BULKOUTSIZE - OMNINET_HEADERLEN) | 143 | #define OMNINET_PAYLOADSIZE (OMNINET_BULKOUTSIZE - OMNINET_HEADERLEN) |
diff --git a/drivers/usb/serial/safe_serial.c b/drivers/usb/serial/safe_serial.c index 93c6c9b08daa..8a069aa154ed 100644 --- a/drivers/usb/serial/safe_serial.c +++ b/drivers/usb/serial/safe_serial.c | |||
| @@ -200,6 +200,11 @@ static void safe_process_read_urb(struct urb *urb) | |||
| 200 | if (!safe) | 200 | if (!safe) |
| 201 | goto out; | 201 | goto out; |
| 202 | 202 | ||
| 203 | if (length < 2) { | ||
| 204 | dev_err(&port->dev, "malformed packet\n"); | ||
| 205 | return; | ||
| 206 | } | ||
| 207 | |||
| 203 | fcs = fcs_compute10(data, length, CRC10_INITFCS); | 208 | fcs = fcs_compute10(data, length, CRC10_INITFCS); |
| 204 | if (fcs) { | 209 | if (fcs) { |
| 205 | dev_err(&port->dev, "%s - bad CRC %x\n", __func__, fcs); | 210 | dev_err(&port->dev, "%s - bad CRC %x\n", __func__, fcs); |
diff --git a/drivers/usb/storage/unusual_devs.h b/drivers/usb/storage/unusual_devs.h index 16cc18369111..9129f6cb8230 100644 --- a/drivers/usb/storage/unusual_devs.h +++ b/drivers/usb/storage/unusual_devs.h | |||
| @@ -2071,6 +2071,20 @@ UNUSUAL_DEV( 0x1370, 0x6828, 0x0110, 0x0110, | |||
| 2071 | USB_SC_DEVICE, USB_PR_DEVICE, NULL, | 2071 | USB_SC_DEVICE, USB_PR_DEVICE, NULL, |
| 2072 | US_FL_IGNORE_RESIDUE ), | 2072 | US_FL_IGNORE_RESIDUE ), |
| 2073 | 2073 | ||
| 2074 | /* | ||
| 2075 | * Reported by Tobias Jakobi <tjakobi@math.uni-bielefeld.de> | ||
| 2076 | * The INIC-3619 bridge is used in the StarTech SLSODDU33B | ||
| 2077 | * SATA-USB enclosure for slimline optical drives. | ||
| 2078 | * | ||
| 2079 | * The quirk enables MakeMKV to properly exchange keys with | ||
| 2080 | * an installed BD drive. | ||
| 2081 | */ | ||
| 2082 | UNUSUAL_DEV( 0x13fd, 0x3609, 0x0209, 0x0209, | ||
| 2083 | "Initio Corporation", | ||
| 2084 | "INIC-3619", | ||
| 2085 | USB_SC_DEVICE, USB_PR_DEVICE, NULL, | ||
| 2086 | US_FL_IGNORE_RESIDUE ), | ||
| 2087 | |||
| 2074 | /* Reported by Qinglin Ye <yestyle@gmail.com> */ | 2088 | /* Reported by Qinglin Ye <yestyle@gmail.com> */ |
| 2075 | UNUSUAL_DEV( 0x13fe, 0x3600, 0x0100, 0x0100, | 2089 | UNUSUAL_DEV( 0x13fe, 0x3600, 0x0100, 0x0100, |
| 2076 | "Kingston", | 2090 | "Kingston", |
