Commit 6b0b3bda authored by Linus Torvalds's avatar Linus Torvalds

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

Pull USB fixes from Greg KH:
 "Here are a few minor USB fixes for 4.15-rc3.

  The largest here is the Kconfig text and configuration changes for the
  USB TypeC build options that you reported during the -rc1 merge
  window. The others are all just small fixes for reported issues, as
  well as some new device ids.

  The most "interesting" of anything here is the usbip fixes as it seems
  lots of people are starting to pay attention to that driver at the
  moment. These fixes should resolve all of the reported problems as of
  now.

  Of course there are the usual xhci and gadget fixes as well, can't go
  a pull request without those...

  All of these have been in linux-next for a while with no reported
  issues"

* tag 'usb-4.15-rc3' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/usb: (22 commits)
  usb: xhci: fix panic in xhci_free_virt_devices_depth_first
  xhci: Don't show incorrect WARN message about events for empty rings
  usbip: fix usbip attach to find a port that matches the requested speed
  usbip: Fix USB device hang due to wrong enabling of scatter-gather
  uas: Always apply US_FL_NO_ATA_1X quirk to Seagate devices
  usb: quirks: Add no-lpm quirk for KY-688 USB 3.1 Type-C Hub
  usb: build drivers/usb/common/ when USB_SUPPORT is set
  usb: hub: Cycle HUB power when initialization fails
  USB: core: Add type-specific length check of BOS descriptors
  usb: host: fix incorrect updating of offset
  USB: ulpi: fix bus-node lookup
  USB: usbfs: Filter flags passed in from user space
  usb: add user selectable option for the whole USB Type-C Support
  usb: f_fs: Force Reserved1=1 in OS_DESC_EXT_COMPAT
  usb: gadget: core: Fix ->udc_set_speed() speed handling
  usb: gadget: allow to enable legacy drivers without USB_ETH
  usb: gadget: udc: renesas_usb3: fix number of the pipes
  usb: gadget: don't dereference g until after it has been null checked
  USB: serial: usb_debug: add new USB device id
  usb: bdc: fix platform_no_drv_owner.cocci warnings
  ...
parents 54b99370 80e45769
...@@ -105,6 +105,7 @@ obj-$(CONFIG_TC) += tc/ ...@@ -105,6 +105,7 @@ obj-$(CONFIG_TC) += tc/
obj-$(CONFIG_UWB) += uwb/ obj-$(CONFIG_UWB) += uwb/
obj-$(CONFIG_USB_PHY) += usb/ obj-$(CONFIG_USB_PHY) += usb/
obj-$(CONFIG_USB) += usb/ obj-$(CONFIG_USB) += usb/
obj-$(CONFIG_USB_SUPPORT) += usb/
obj-$(CONFIG_PCI) += usb/ obj-$(CONFIG_PCI) += usb/
obj-$(CONFIG_USB_GADGET) += usb/ obj-$(CONFIG_USB_GADGET) += usb/
obj-$(CONFIG_OF) += usb/ obj-$(CONFIG_OF) += usb/
......
...@@ -180,9 +180,9 @@ static int ulpi_of_register(struct ulpi *ulpi) ...@@ -180,9 +180,9 @@ static int ulpi_of_register(struct ulpi *ulpi)
/* Find a ulpi bus underneath the parent or the grandparent */ /* Find a ulpi bus underneath the parent or the grandparent */
parent = ulpi->dev.parent; parent = ulpi->dev.parent;
if (parent->of_node) if (parent->of_node)
np = of_find_node_by_name(parent->of_node, "ulpi"); np = of_get_child_by_name(parent->of_node, "ulpi");
else if (parent->parent && parent->parent->of_node) else if (parent->parent && parent->parent->of_node)
np = of_find_node_by_name(parent->parent->of_node, "ulpi"); np = of_get_child_by_name(parent->parent->of_node, "ulpi");
if (!np) if (!np)
return 0; return 0;
......
...@@ -905,14 +905,25 @@ void usb_release_bos_descriptor(struct usb_device *dev) ...@@ -905,14 +905,25 @@ void usb_release_bos_descriptor(struct usb_device *dev)
} }
} }
static const __u8 bos_desc_len[256] = {
[USB_CAP_TYPE_WIRELESS_USB] = USB_DT_USB_WIRELESS_CAP_SIZE,
[USB_CAP_TYPE_EXT] = USB_DT_USB_EXT_CAP_SIZE,
[USB_SS_CAP_TYPE] = USB_DT_USB_SS_CAP_SIZE,
[USB_SSP_CAP_TYPE] = USB_DT_USB_SSP_CAP_SIZE(1),
[CONTAINER_ID_TYPE] = USB_DT_USB_SS_CONTN_ID_SIZE,
[USB_PTM_CAP_TYPE] = USB_DT_USB_PTM_ID_SIZE,
};
/* Get BOS descriptor set */ /* Get BOS descriptor set */
int usb_get_bos_descriptor(struct usb_device *dev) int usb_get_bos_descriptor(struct usb_device *dev)
{ {
struct device *ddev = &dev->dev; struct device *ddev = &dev->dev;
struct usb_bos_descriptor *bos; struct usb_bos_descriptor *bos;
struct usb_dev_cap_header *cap; struct usb_dev_cap_header *cap;
struct usb_ssp_cap_descriptor *ssp_cap;
unsigned char *buffer; unsigned char *buffer;
int length, total_len, num, i; int length, total_len, num, i, ssac;
__u8 cap_type;
int ret; int ret;
bos = kzalloc(sizeof(struct usb_bos_descriptor), GFP_KERNEL); bos = kzalloc(sizeof(struct usb_bos_descriptor), GFP_KERNEL);
...@@ -965,7 +976,13 @@ int usb_get_bos_descriptor(struct usb_device *dev) ...@@ -965,7 +976,13 @@ int usb_get_bos_descriptor(struct usb_device *dev)
dev->bos->desc->bNumDeviceCaps = i; dev->bos->desc->bNumDeviceCaps = i;
break; break;
} }
cap_type = cap->bDevCapabilityType;
length = cap->bLength; length = cap->bLength;
if (bos_desc_len[cap_type] && length < bos_desc_len[cap_type]) {
dev->bos->desc->bNumDeviceCaps = i;
break;
}
total_len -= length; total_len -= length;
if (cap->bDescriptorType != USB_DT_DEVICE_CAPABILITY) { if (cap->bDescriptorType != USB_DT_DEVICE_CAPABILITY) {
...@@ -973,7 +990,7 @@ int usb_get_bos_descriptor(struct usb_device *dev) ...@@ -973,7 +990,7 @@ int usb_get_bos_descriptor(struct usb_device *dev)
continue; continue;
} }
switch (cap->bDevCapabilityType) { switch (cap_type) {
case USB_CAP_TYPE_WIRELESS_USB: case USB_CAP_TYPE_WIRELESS_USB:
/* Wireless USB cap descriptor is handled by wusb */ /* Wireless USB cap descriptor is handled by wusb */
break; break;
...@@ -986,8 +1003,11 @@ int usb_get_bos_descriptor(struct usb_device *dev) ...@@ -986,8 +1003,11 @@ int usb_get_bos_descriptor(struct usb_device *dev)
(struct usb_ss_cap_descriptor *)buffer; (struct usb_ss_cap_descriptor *)buffer;
break; break;
case USB_SSP_CAP_TYPE: case USB_SSP_CAP_TYPE:
dev->bos->ssp_cap = ssp_cap = (struct usb_ssp_cap_descriptor *)buffer;
(struct usb_ssp_cap_descriptor *)buffer; ssac = (le32_to_cpu(ssp_cap->bmAttributes) &
USB_SSP_SUBLINK_SPEED_ATTRIBS) + 1;
if (length >= USB_DT_USB_SSP_CAP_SIZE(ssac))
dev->bos->ssp_cap = ssp_cap;
break; break;
case CONTAINER_ID_TYPE: case CONTAINER_ID_TYPE:
dev->bos->ss_id = dev->bos->ss_id =
......
...@@ -1442,14 +1442,18 @@ static int proc_do_submiturb(struct usb_dev_state *ps, struct usbdevfs_urb *uurb ...@@ -1442,14 +1442,18 @@ static int proc_do_submiturb(struct usb_dev_state *ps, struct usbdevfs_urb *uurb
int number_of_packets = 0; int number_of_packets = 0;
unsigned int stream_id = 0; unsigned int stream_id = 0;
void *buf; void *buf;
unsigned long mask = USBDEVFS_URB_SHORT_NOT_OK |
if (uurb->flags & ~(USBDEVFS_URB_ISO_ASAP |
USBDEVFS_URB_SHORT_NOT_OK |
USBDEVFS_URB_BULK_CONTINUATION | USBDEVFS_URB_BULK_CONTINUATION |
USBDEVFS_URB_NO_FSBR | USBDEVFS_URB_NO_FSBR |
USBDEVFS_URB_ZERO_PACKET | USBDEVFS_URB_ZERO_PACKET |
USBDEVFS_URB_NO_INTERRUPT)) USBDEVFS_URB_NO_INTERRUPT;
/* USBDEVFS_URB_ISO_ASAP is a special case */
if (uurb->type == USBDEVFS_URB_TYPE_ISO)
mask |= USBDEVFS_URB_ISO_ASAP;
if (uurb->flags & ~mask)
return -EINVAL; return -EINVAL;
if ((unsigned int)uurb->buffer_length >= USBFS_XFER_MAX) if ((unsigned int)uurb->buffer_length >= USBFS_XFER_MAX)
return -EINVAL; return -EINVAL;
if (uurb->buffer_length > 0 && !uurb->buffer) if (uurb->buffer_length > 0 && !uurb->buffer)
......
...@@ -4948,6 +4948,15 @@ static void hub_port_connect(struct usb_hub *hub, int port1, u16 portstatus, ...@@ -4948,6 +4948,15 @@ static void hub_port_connect(struct usb_hub *hub, int port1, u16 portstatus,
usb_put_dev(udev); usb_put_dev(udev);
if ((status == -ENOTCONN) || (status == -ENOTSUPP)) if ((status == -ENOTCONN) || (status == -ENOTSUPP))
break; break;
/* When halfway through our retry count, power-cycle the port */
if (i == (SET_CONFIG_TRIES / 2) - 1) {
dev_info(&port_dev->dev, "attempt power cycle\n");
usb_hub_set_port_power(hdev, hub, port1, false);
msleep(2 * hub_power_on_good_delay(hub));
usb_hub_set_port_power(hdev, hub, port1, true);
msleep(hub_power_on_good_delay(hub));
}
} }
if (hub->hdev->parent || if (hub->hdev->parent ||
!hcd->driver->port_handed_over || !hcd->driver->port_handed_over ||
......
...@@ -146,6 +146,9 @@ static const struct usb_device_id usb_quirk_list[] = { ...@@ -146,6 +146,9 @@ static const struct usb_device_id usb_quirk_list[] = {
/* appletouch */ /* appletouch */
{ USB_DEVICE(0x05ac, 0x021a), .driver_info = USB_QUIRK_RESET_RESUME }, { USB_DEVICE(0x05ac, 0x021a), .driver_info = USB_QUIRK_RESET_RESUME },
/* Genesys Logic hub, internally used by KY-688 USB 3.1 Type-C Hub */
{ USB_DEVICE(0x05e3, 0x0612), .driver_info = USB_QUIRK_NO_LPM },
/* Genesys Logic hub, internally used by Moshi USB to Ethernet Adapter */ /* Genesys Logic hub, internally used by Moshi USB to Ethernet Adapter */
{ USB_DEVICE(0x05e3, 0x0616), .driver_info = USB_QUIRK_NO_LPM }, { USB_DEVICE(0x05e3, 0x0616), .driver_info = USB_QUIRK_NO_LPM },
......
...@@ -508,8 +508,8 @@ choice ...@@ -508,8 +508,8 @@ choice
controller, and the relevant drivers for each function declared controller, and the relevant drivers for each function declared
by the device. by the device.
source "drivers/usb/gadget/legacy/Kconfig"
endchoice endchoice
source "drivers/usb/gadget/legacy/Kconfig"
endif # USB_GADGET endif # USB_GADGET
...@@ -146,7 +146,6 @@ int config_ep_by_speed(struct usb_gadget *g, ...@@ -146,7 +146,6 @@ int config_ep_by_speed(struct usb_gadget *g,
struct usb_function *f, struct usb_function *f,
struct usb_ep *_ep) struct usb_ep *_ep)
{ {
struct usb_composite_dev *cdev = get_gadget_data(g);
struct usb_endpoint_descriptor *chosen_desc = NULL; struct usb_endpoint_descriptor *chosen_desc = NULL;
struct usb_descriptor_header **speed_desc = NULL; struct usb_descriptor_header **speed_desc = NULL;
...@@ -226,8 +225,12 @@ int config_ep_by_speed(struct usb_gadget *g, ...@@ -226,8 +225,12 @@ int config_ep_by_speed(struct usb_gadget *g,
_ep->maxburst = comp_desc->bMaxBurst + 1; _ep->maxburst = comp_desc->bMaxBurst + 1;
break; break;
default: default:
if (comp_desc->bMaxBurst != 0) if (comp_desc->bMaxBurst != 0) {
struct usb_composite_dev *cdev;
cdev = get_gadget_data(g);
ERROR(cdev, "ep0 bMaxBurst must be 0\n"); ERROR(cdev, "ep0 bMaxBurst must be 0\n");
}
_ep->maxburst = 1; _ep->maxburst = 1;
break; break;
} }
......
...@@ -1012,7 +1012,7 @@ static ssize_t ffs_epfile_io(struct file *file, struct ffs_io_data *io_data) ...@@ -1012,7 +1012,7 @@ static ssize_t ffs_epfile_io(struct file *file, struct ffs_io_data *io_data)
else else
ret = ep->status; ret = ep->status;
goto error_mutex; goto error_mutex;
} else if (!(req = usb_ep_alloc_request(ep->ep, GFP_KERNEL))) { } else if (!(req = usb_ep_alloc_request(ep->ep, GFP_ATOMIC))) {
ret = -ENOMEM; ret = -ENOMEM;
} else { } else {
req->buf = data; req->buf = data;
...@@ -2282,9 +2282,18 @@ static int __ffs_data_do_os_desc(enum ffs_os_desc_type type, ...@@ -2282,9 +2282,18 @@ static int __ffs_data_do_os_desc(enum ffs_os_desc_type type,
int i; int i;
if (len < sizeof(*d) || if (len < sizeof(*d) ||
d->bFirstInterfaceNumber >= ffs->interfaces_count || d->bFirstInterfaceNumber >= ffs->interfaces_count)
!d->Reserved1)
return -EINVAL; return -EINVAL;
if (d->Reserved1 != 1) {
/*
* According to the spec, Reserved1 must be set to 1
* but older kernels incorrectly rejected non-zero
* values. We fix it here to avoid returning EINVAL
* in response to values we used to accept.
*/
pr_debug("usb_ext_compat_desc::Reserved1 forced to 1\n");
d->Reserved1 = 1;
}
for (i = 0; i < ARRAY_SIZE(d->Reserved2); ++i) for (i = 0; i < ARRAY_SIZE(d->Reserved2); ++i)
if (d->Reserved2[i]) if (d->Reserved2[i])
return -EINVAL; return -EINVAL;
......
...@@ -13,6 +13,14 @@ ...@@ -13,6 +13,14 @@
# both kinds of controller can also support "USB On-the-Go" (CONFIG_USB_OTG). # both kinds of controller can also support "USB On-the-Go" (CONFIG_USB_OTG).
# #
menuconfig USB_GADGET_LEGACY
bool "Legacy USB Gadget Support"
help
Legacy USB gadgets are USB gadgets that do not use the USB gadget
configfs interface.
if USB_GADGET_LEGACY
config USB_ZERO config USB_ZERO
tristate "Gadget Zero (DEVELOPMENT)" tristate "Gadget Zero (DEVELOPMENT)"
select USB_LIBCOMPOSITE select USB_LIBCOMPOSITE
...@@ -490,3 +498,5 @@ config USB_G_WEBCAM ...@@ -490,3 +498,5 @@ config USB_G_WEBCAM
Say "y" to link the driver statically, or "m" to build a Say "y" to link the driver statically, or "m" to build a
dynamically linked module called "g_webcam". dynamically linked module called "g_webcam".
endif
...@@ -642,7 +642,6 @@ static const struct of_device_id bdc_of_match[] = { ...@@ -642,7 +642,6 @@ static const struct of_device_id bdc_of_match[] = {
static struct platform_driver bdc_driver = { static struct platform_driver bdc_driver = {
.driver = { .driver = {
.name = BRCM_BDC_NAME, .name = BRCM_BDC_NAME,
.owner = THIS_MODULE,
.pm = &bdc_pm_ops, .pm = &bdc_pm_ops,
.of_match_table = bdc_of_match, .of_match_table = bdc_of_match,
}, },
......
...@@ -1069,8 +1069,12 @@ static inline void usb_gadget_udc_stop(struct usb_udc *udc) ...@@ -1069,8 +1069,12 @@ static inline void usb_gadget_udc_stop(struct usb_udc *udc)
static inline void usb_gadget_udc_set_speed(struct usb_udc *udc, static inline void usb_gadget_udc_set_speed(struct usb_udc *udc,
enum usb_device_speed speed) enum usb_device_speed speed)
{ {
if (udc->gadget->ops->udc_set_speed) if (udc->gadget->ops->udc_set_speed) {
udc->gadget->ops->udc_set_speed(udc->gadget, speed); enum usb_device_speed s;
s = min(speed, udc->gadget->max_speed);
udc->gadget->ops->udc_set_speed(udc->gadget, s);
}
} }
/** /**
......
...@@ -252,7 +252,7 @@ ...@@ -252,7 +252,7 @@
#define USB3_EP0_SS_MAX_PACKET_SIZE 512 #define USB3_EP0_SS_MAX_PACKET_SIZE 512
#define USB3_EP0_HSFS_MAX_PACKET_SIZE 64 #define USB3_EP0_HSFS_MAX_PACKET_SIZE 64
#define USB3_EP0_BUF_SIZE 8 #define USB3_EP0_BUF_SIZE 8
#define USB3_MAX_NUM_PIPES 30 #define USB3_MAX_NUM_PIPES 6 /* This includes PIPE 0 */
#define USB3_WAIT_US 3 #define USB3_WAIT_US 3
#define USB3_DMA_NUM_SETTING_AREA 4 #define USB3_DMA_NUM_SETTING_AREA 4
/* /*
......
...@@ -827,7 +827,7 @@ static ssize_t fill_registers_buffer(struct debug_buffer *buf) ...@@ -827,7 +827,7 @@ static ssize_t fill_registers_buffer(struct debug_buffer *buf)
default: /* unknown */ default: /* unknown */
break; break;
} }
temp = (cap >> 8) & 0xff; offset = (cap >> 8) & 0xff;
} }
} }
#endif #endif
......
...@@ -934,6 +934,12 @@ void xhci_free_virt_devices_depth_first(struct xhci_hcd *xhci, int slot_id) ...@@ -934,6 +934,12 @@ void xhci_free_virt_devices_depth_first(struct xhci_hcd *xhci, int slot_id)
if (!vdev) if (!vdev)
return; return;
if (vdev->real_port == 0 ||
vdev->real_port > HCS_MAX_PORTS(xhci->hcs_params1)) {
xhci_dbg(xhci, "Bad vdev->real_port.\n");
goto out;
}
tt_list_head = &(xhci->rh_bw[vdev->real_port - 1].tts); tt_list_head = &(xhci->rh_bw[vdev->real_port - 1].tts);
list_for_each_entry_safe(tt_info, next, tt_list_head, tt_list) { list_for_each_entry_safe(tt_info, next, tt_list_head, tt_list) {
/* is this a hub device that added a tt_info to the tts list */ /* is this a hub device that added a tt_info to the tts list */
...@@ -947,6 +953,7 @@ void xhci_free_virt_devices_depth_first(struct xhci_hcd *xhci, int slot_id) ...@@ -947,6 +953,7 @@ void xhci_free_virt_devices_depth_first(struct xhci_hcd *xhci, int slot_id)
} }
} }
} }
out:
/* we are now at a leaf device */ /* we are now at a leaf device */
xhci_debugfs_remove_slot(xhci, slot_id); xhci_debugfs_remove_slot(xhci, slot_id);
xhci_free_virt_device(xhci, slot_id); xhci_free_virt_device(xhci, slot_id);
......
...@@ -2477,12 +2477,16 @@ static int handle_tx_event(struct xhci_hcd *xhci, ...@@ -2477,12 +2477,16 @@ static int handle_tx_event(struct xhci_hcd *xhci,
*/ */
if (list_empty(&ep_ring->td_list)) { if (list_empty(&ep_ring->td_list)) {
/* /*
* A stopped endpoint may generate an extra completion * Don't print wanings if it's due to a stopped endpoint
* event if the device was suspended. Don't print * generating an extra completion event if the device
* warnings. * was suspended. Or, a event for the last TRB of a
* short TD we already got a short event for.
* The short TD is already removed from the TD list.
*/ */
if (!(trb_comp_code == COMP_STOPPED || if (!(trb_comp_code == COMP_STOPPED ||
trb_comp_code == COMP_STOPPED_LENGTH_INVALID)) { trb_comp_code == COMP_STOPPED_LENGTH_INVALID ||
ep_ring->last_td_was_short)) {
xhci_warn(xhci, "WARN Event TRB for slot %d ep %d with no TDs queued?\n", xhci_warn(xhci, "WARN Event TRB for slot %d ep %d with no TDs queued?\n",
TRB_TO_SLOT_ID(le32_to_cpu(event->flags)), TRB_TO_SLOT_ID(le32_to_cpu(event->flags)),
ep_index); ep_index);
......
...@@ -238,6 +238,7 @@ static void option_instat_callback(struct urb *urb); ...@@ -238,6 +238,7 @@ static void option_instat_callback(struct urb *urb);
/* These Quectel products use Quectel's vendor ID */ /* These Quectel products use Quectel's vendor ID */
#define QUECTEL_PRODUCT_EC21 0x0121 #define QUECTEL_PRODUCT_EC21 0x0121
#define QUECTEL_PRODUCT_EC25 0x0125 #define QUECTEL_PRODUCT_EC25 0x0125
#define QUECTEL_PRODUCT_BG96 0x0296
#define CMOTECH_VENDOR_ID 0x16d8 #define CMOTECH_VENDOR_ID 0x16d8
#define CMOTECH_PRODUCT_6001 0x6001 #define CMOTECH_PRODUCT_6001 0x6001
...@@ -1182,6 +1183,8 @@ static const struct usb_device_id option_ids[] = { ...@@ -1182,6 +1183,8 @@ static const struct usb_device_id option_ids[] = {
.driver_info = (kernel_ulong_t)&net_intf4_blacklist }, .driver_info = (kernel_ulong_t)&net_intf4_blacklist },
{ USB_DEVICE(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_EC25), { USB_DEVICE(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_EC25),
.driver_info = (kernel_ulong_t)&net_intf4_blacklist }, .driver_info = (kernel_ulong_t)&net_intf4_blacklist },
{ USB_DEVICE(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_BG96),
.driver_info = (kernel_ulong_t)&net_intf4_blacklist },
{ USB_DEVICE(CMOTECH_VENDOR_ID, CMOTECH_PRODUCT_6001) }, { USB_DEVICE(CMOTECH_VENDOR_ID, CMOTECH_PRODUCT_6001) },
{ USB_DEVICE(CMOTECH_VENDOR_ID, CMOTECH_PRODUCT_CMU_300) }, { USB_DEVICE(CMOTECH_VENDOR_ID, CMOTECH_PRODUCT_CMU_300) },
{ USB_DEVICE(CMOTECH_VENDOR_ID, CMOTECH_PRODUCT_6003), { USB_DEVICE(CMOTECH_VENDOR_ID, CMOTECH_PRODUCT_6003),
......
...@@ -31,12 +31,14 @@ static const struct usb_device_id id_table[] = { ...@@ -31,12 +31,14 @@ static const struct usb_device_id id_table[] = {
}; };
static const struct usb_device_id dbc_id_table[] = { static const struct usb_device_id dbc_id_table[] = {
{ USB_DEVICE(0x1d6b, 0x0010) },
{ USB_DEVICE(0x1d6b, 0x0011) }, { USB_DEVICE(0x1d6b, 0x0011) },
{ }, { },
}; };
static const struct usb_device_id id_table_combined[] = { static const struct usb_device_id id_table_combined[] = {
{ USB_DEVICE(0x0525, 0x127a) }, { USB_DEVICE(0x0525, 0x127a) },
{ USB_DEVICE(0x1d6b, 0x0010) },
{ USB_DEVICE(0x1d6b, 0x0011) }, { USB_DEVICE(0x1d6b, 0x0011) },
{ }, { },
}; };
......
...@@ -112,6 +112,10 @@ static int uas_use_uas_driver(struct usb_interface *intf, ...@@ -112,6 +112,10 @@ static int uas_use_uas_driver(struct usb_interface *intf,
} }
} }
/* All Seagate disk enclosures have broken ATA pass-through support */
if (le16_to_cpu(udev->descriptor.idVendor) == 0x0bc2)
flags |= US_FL_NO_ATA_1X;
usb_stor_adjust_quirks(udev, &flags); usb_stor_adjust_quirks(udev, &flags);
if (flags & US_FL_IGNORE_UAS) { if (flags & US_FL_IGNORE_UAS) {
......
menu "USB Power Delivery and Type-C drivers" menuconfig TYPEC
tristate "USB Type-C Support"
help
USB Type-C Specification defines a cable and connector for USB where
only one type of plug is supported on both ends, i.e. there will not
be Type-A plug on one end of the cable and Type-B plug on the other.
Determination of the host-to-device relationship happens through a
specific Configuration Channel (CC) which goes through the USB Type-C
cable. The Configuration Channel may also be used to detect optional
Accessory Modes - Analog Audio and Debug - and if USB Power Delivery
is supported, the Alternate Modes, where the connector is used for
something else then USB communication.
USB Power Delivery Specification defines a protocol that can be used
to negotiate the voltage and current levels with the connected
partners. USB Power Delivery allows higher voltages then the normal
5V, up to 20V, and current up to 5A over the cable. The USB Power
Delivery protocol is also used to negotiate the optional Alternate
Modes when they are supported. USB Power Delivery does not depend on
USB Type-C connector, however it is mostly used together with USB
Type-C connectors.
USB Type-C and USB Power Delivery Specifications define a set of state
machines that need to be implemented in either software or firmware.
Simple USB Type-C PHYs, for example USB Type-C Port Controller
Interface Specification compliant "Port Controllers" need the state
machines to be handled in the OS, but stand-alone USB Type-C and Power
Delivery controllers handle the state machines inside their firmware.
The USB Type-C and Power Delivery controllers usually function
autonomously, and do not necessarily require drivers.
Enable this configurations option if you have USB Type-C connectors on
your system and 1) you know your USB Type-C hardware requires OS
control (a driver) to function, or 2) if you need to be able to read
the status of the USB Type-C ports in your system, or 3) if you need
to be able to swap the power role (decide are you supplying or
consuming power over the cable) or data role (host or device) when
both roles are supported.
For more information, see the kernel documentation for USB Type-C
Connector Class API (Documentation/driver-api/usb/typec.rst)
<https://www.kernel.org/doc/html/latest/driver-api/usb/typec.html>
and ABI (Documentation/ABI/testing/sysfs-class-typec).
config TYPEC if TYPEC
tristate
config TYPEC_TCPM config TYPEC_TCPM
tristate "USB Type-C Port Controller Manager" tristate "USB Type-C Port Controller Manager"
depends on USB depends on USB
select TYPEC
help help
The Type-C Port Controller Manager provides a USB PD and USB Type-C The Type-C Port Controller Manager provides a USB PD and USB Type-C
state machine for use with Type-C Port Controllers. state machine for use with Type-C Port Controllers.
...@@ -22,7 +62,6 @@ config TYPEC_WCOVE ...@@ -22,7 +62,6 @@ config TYPEC_WCOVE
depends on INTEL_SOC_PMIC depends on INTEL_SOC_PMIC
depends on INTEL_PMC_IPC depends on INTEL_PMC_IPC
depends on BXT_WC_PMIC_OPREGION depends on BXT_WC_PMIC_OPREGION
select TYPEC
help help
This driver adds support for USB Type-C detection on Intel Broxton This driver adds support for USB Type-C detection on Intel Broxton
platforms that have Intel Whiskey Cove PMIC. The driver can detect the platforms that have Intel Whiskey Cove PMIC. The driver can detect the
...@@ -31,14 +70,13 @@ config TYPEC_WCOVE ...@@ -31,14 +70,13 @@ config TYPEC_WCOVE
To compile this driver as module, choose M here: the module will be To compile this driver as module, choose M here: the module will be
called typec_wcove called typec_wcove
endif endif # TYPEC_TCPM
source "drivers/usb/typec/ucsi/Kconfig" source "drivers/usb/typec/ucsi/Kconfig"
config TYPEC_TPS6598X config TYPEC_TPS6598X
tristate "TI TPS6598x USB Power Delivery controller driver" tristate "TI TPS6598x USB Power Delivery controller driver"
depends on I2C depends on I2C
select TYPEC
help help
Say Y or M here if your system has TI TPS65982 or TPS65983 USB Power Say Y or M here if your system has TI TPS65982 or TPS65983 USB Power
Delivery controller. Delivery controller.
...@@ -46,4 +84,4 @@ config TYPEC_TPS6598X ...@@ -46,4 +84,4 @@ config TYPEC_TPS6598X
If you choose to build this driver as a dynamically linked module, the If you choose to build this driver as a dynamically linked module, the
module will be called tps6598x.ko. module will be called tps6598x.ko.
endmenu endif # TYPEC
config TYPEC_UCSI config TYPEC_UCSI
tristate "USB Type-C Connector System Software Interface driver" tristate "USB Type-C Connector System Software Interface driver"
depends on !CPU_BIG_ENDIAN depends on !CPU_BIG_ENDIAN
select TYPEC
help help
USB Type-C Connector System Software Interface (UCSI) is a USB Type-C Connector System Software Interface (UCSI) is a
specification for an interface that allows the operating system to specification for an interface that allows the operating system to
......
...@@ -1098,7 +1098,6 @@ static int hcd_name_to_id(const char *name) ...@@ -1098,7 +1098,6 @@ static int hcd_name_to_id(const char *name)
static int vhci_setup(struct usb_hcd *hcd) static int vhci_setup(struct usb_hcd *hcd)
{ {
struct vhci *vhci = *((void **)dev_get_platdata(hcd->self.controller)); struct vhci *vhci = *((void **)dev_get_platdata(hcd->self.controller));
hcd->self.sg_tablesize = ~0;
if (usb_hcd_is_primary_hcd(hcd)) { if (usb_hcd_is_primary_hcd(hcd)) {
vhci->vhci_hcd_hs = hcd_to_vhci_hcd(hcd); vhci->vhci_hcd_hs = hcd_to_vhci_hcd(hcd);
vhci->vhci_hcd_hs->vhci = vhci; vhci->vhci_hcd_hs->vhci = vhci;
......
...@@ -880,6 +880,8 @@ struct usb_wireless_cap_descriptor { /* Ultra Wide Band */ ...@@ -880,6 +880,8 @@ struct usb_wireless_cap_descriptor { /* Ultra Wide Band */
__u8 bReserved; __u8 bReserved;
} __attribute__((packed)); } __attribute__((packed));
#define USB_DT_USB_WIRELESS_CAP_SIZE 11
/* USB 2.0 Extension descriptor */ /* USB 2.0 Extension descriptor */
#define USB_CAP_TYPE_EXT 2 #define USB_CAP_TYPE_EXT 2
...@@ -1072,6 +1074,7 @@ struct usb_ptm_cap_descriptor { ...@@ -1072,6 +1074,7 @@ struct usb_ptm_cap_descriptor {
__u8 bDevCapabilityType; __u8 bDevCapabilityType;
} __attribute__((packed)); } __attribute__((packed));
#define USB_DT_USB_PTM_ID_SIZE 3
/* /*
* The size of the descriptor for the Sublink Speed Attribute Count * The size of the descriptor for the Sublink Speed Attribute Count
* (SSAC) specified in bmAttributes[4:0]. * (SSAC) specified in bmAttributes[4:0].
......
...@@ -329,9 +329,17 @@ int usbip_vhci_refresh_device_list(void) ...@@ -329,9 +329,17 @@ int usbip_vhci_refresh_device_list(void)
int usbip_vhci_get_free_port(uint32_t speed) int usbip_vhci_get_free_port(uint32_t speed)
{ {
for (int i = 0; i < vhci_driver->nports; i++) { for (int i = 0; i < vhci_driver->nports; i++) {
if (speed == USB_SPEED_SUPER &&
vhci_driver->idev[i].hub != HUB_SPEED_SUPER) switch (speed) {
case USB_SPEED_SUPER:
if (vhci_driver->idev[i].hub != HUB_SPEED_SUPER)
continue;
break;
default:
if (vhci_driver->idev[i].hub != HUB_SPEED_HIGH)
continue; continue;
break;
}
if (vhci_driver->idev[i].status == VDEV_ST_NULL) if (vhci_driver->idev[i].status == VDEV_ST_NULL)
return vhci_driver->idev[i].port; return vhci_driver->idev[i].port;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment