USB fixes for 4.15-rc3
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. Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> -----BEGIN PGP SIGNATURE----- iG0EABECAC0WIQT0tgzFv3jCIUoxPcsxR9QN2y37KQUCWia97w8cZ3JlZ0Brcm9h aC5jb20ACgkQMUfUDdst+ynwMQCeL6klrbARdug4GQWqmO2eDIYr2aQAn2MFYd5P VWCn8WsAf7toUTsB+J/g =z/by -----END PGP SIGNATURE----- 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 ...
This commit is contained in:
commit
6b0b3bda3d
@ -105,6 +105,7 @@ obj-$(CONFIG_TC) += tc/
|
||||
obj-$(CONFIG_UWB) += uwb/
|
||||
obj-$(CONFIG_USB_PHY) += usb/
|
||||
obj-$(CONFIG_USB) += usb/
|
||||
obj-$(CONFIG_USB_SUPPORT) += usb/
|
||||
obj-$(CONFIG_PCI) += usb/
|
||||
obj-$(CONFIG_USB_GADGET) += usb/
|
||||
obj-$(CONFIG_OF) += usb/
|
||||
|
@ -180,9 +180,9 @@ static int ulpi_of_register(struct ulpi *ulpi)
|
||||
/* Find a ulpi bus underneath the parent or the grandparent */
|
||||
parent = ulpi->dev.parent;
|
||||
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)
|
||||
np = of_find_node_by_name(parent->parent->of_node, "ulpi");
|
||||
np = of_get_child_by_name(parent->parent->of_node, "ulpi");
|
||||
if (!np)
|
||||
return 0;
|
||||
|
||||
|
@ -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 */
|
||||
int usb_get_bos_descriptor(struct usb_device *dev)
|
||||
{
|
||||
struct device *ddev = &dev->dev;
|
||||
struct usb_bos_descriptor *bos;
|
||||
struct usb_dev_cap_header *cap;
|
||||
struct usb_ssp_cap_descriptor *ssp_cap;
|
||||
unsigned char *buffer;
|
||||
int length, total_len, num, i;
|
||||
int length, total_len, num, i, ssac;
|
||||
__u8 cap_type;
|
||||
int ret;
|
||||
|
||||
bos = kzalloc(sizeof(struct usb_bos_descriptor), GFP_KERNEL);
|
||||
@ -965,7 +976,13 @@ int usb_get_bos_descriptor(struct usb_device *dev)
|
||||
dev->bos->desc->bNumDeviceCaps = i;
|
||||
break;
|
||||
}
|
||||
cap_type = cap->bDevCapabilityType;
|
||||
length = cap->bLength;
|
||||
if (bos_desc_len[cap_type] && length < bos_desc_len[cap_type]) {
|
||||
dev->bos->desc->bNumDeviceCaps = i;
|
||||
break;
|
||||
}
|
||||
|
||||
total_len -= length;
|
||||
|
||||
if (cap->bDescriptorType != USB_DT_DEVICE_CAPABILITY) {
|
||||
@ -973,7 +990,7 @@ int usb_get_bos_descriptor(struct usb_device *dev)
|
||||
continue;
|
||||
}
|
||||
|
||||
switch (cap->bDevCapabilityType) {
|
||||
switch (cap_type) {
|
||||
case USB_CAP_TYPE_WIRELESS_USB:
|
||||
/* Wireless USB cap descriptor is handled by wusb */
|
||||
break;
|
||||
@ -986,8 +1003,11 @@ int usb_get_bos_descriptor(struct usb_device *dev)
|
||||
(struct usb_ss_cap_descriptor *)buffer;
|
||||
break;
|
||||
case USB_SSP_CAP_TYPE:
|
||||
dev->bos->ssp_cap =
|
||||
(struct usb_ssp_cap_descriptor *)buffer;
|
||||
ssp_cap = (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;
|
||||
case CONTAINER_ID_TYPE:
|
||||
dev->bos->ss_id =
|
||||
|
@ -1442,14 +1442,18 @@ static int proc_do_submiturb(struct usb_dev_state *ps, struct usbdevfs_urb *uurb
|
||||
int number_of_packets = 0;
|
||||
unsigned int stream_id = 0;
|
||||
void *buf;
|
||||
|
||||
if (uurb->flags & ~(USBDEVFS_URB_ISO_ASAP |
|
||||
USBDEVFS_URB_SHORT_NOT_OK |
|
||||
unsigned long mask = USBDEVFS_URB_SHORT_NOT_OK |
|
||||
USBDEVFS_URB_BULK_CONTINUATION |
|
||||
USBDEVFS_URB_NO_FSBR |
|
||||
USBDEVFS_URB_ZERO_PACKET |
|
||||
USBDEVFS_URB_NO_INTERRUPT))
|
||||
return -EINVAL;
|
||||
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;
|
||||
|
||||
if ((unsigned int)uurb->buffer_length >= USBFS_XFER_MAX)
|
||||
return -EINVAL;
|
||||
if (uurb->buffer_length > 0 && !uurb->buffer)
|
||||
|
@ -4948,6 +4948,15 @@ loop:
|
||||
usb_put_dev(udev);
|
||||
if ((status == -ENOTCONN) || (status == -ENOTSUPP))
|
||||
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 ||
|
||||
!hcd->driver->port_handed_over ||
|
||||
|
@ -146,6 +146,9 @@ static const struct usb_device_id usb_quirk_list[] = {
|
||||
/* appletouch */
|
||||
{ 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 */
|
||||
{ USB_DEVICE(0x05e3, 0x0616), .driver_info = USB_QUIRK_NO_LPM },
|
||||
|
||||
|
@ -508,8 +508,8 @@ choice
|
||||
controller, and the relevant drivers for each function declared
|
||||
by the device.
|
||||
|
||||
source "drivers/usb/gadget/legacy/Kconfig"
|
||||
|
||||
endchoice
|
||||
|
||||
source "drivers/usb/gadget/legacy/Kconfig"
|
||||
|
||||
endif # USB_GADGET
|
||||
|
@ -146,7 +146,6 @@ int config_ep_by_speed(struct usb_gadget *g,
|
||||
struct usb_function *f,
|
||||
struct usb_ep *_ep)
|
||||
{
|
||||
struct usb_composite_dev *cdev = get_gadget_data(g);
|
||||
struct usb_endpoint_descriptor *chosen_desc = NULL;
|
||||
struct usb_descriptor_header **speed_desc = NULL;
|
||||
|
||||
@ -226,8 +225,12 @@ ep_found:
|
||||
_ep->maxburst = comp_desc->bMaxBurst + 1;
|
||||
break;
|
||||
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");
|
||||
}
|
||||
_ep->maxburst = 1;
|
||||
break;
|
||||
}
|
||||
|
@ -1012,7 +1012,7 @@ static ssize_t ffs_epfile_io(struct file *file, struct ffs_io_data *io_data)
|
||||
else
|
||||
ret = ep->status;
|
||||
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;
|
||||
} else {
|
||||
req->buf = data;
|
||||
@ -2282,9 +2282,18 @@ static int __ffs_data_do_os_desc(enum ffs_os_desc_type type,
|
||||
int i;
|
||||
|
||||
if (len < sizeof(*d) ||
|
||||
d->bFirstInterfaceNumber >= ffs->interfaces_count ||
|
||||
!d->Reserved1)
|
||||
d->bFirstInterfaceNumber >= ffs->interfaces_count)
|
||||
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)
|
||||
if (d->Reserved2[i])
|
||||
return -EINVAL;
|
||||
|
@ -13,6 +13,14 @@
|
||||
# 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
|
||||
tristate "Gadget Zero (DEVELOPMENT)"
|
||||
select USB_LIBCOMPOSITE
|
||||
@ -490,3 +498,5 @@ config USB_G_WEBCAM
|
||||
|
||||
Say "y" to link the driver statically, or "m" to build a
|
||||
dynamically linked module called "g_webcam".
|
||||
|
||||
endif
|
||||
|
@ -642,7 +642,6 @@ static const struct of_device_id bdc_of_match[] = {
|
||||
static struct platform_driver bdc_driver = {
|
||||
.driver = {
|
||||
.name = BRCM_BDC_NAME,
|
||||
.owner = THIS_MODULE,
|
||||
.pm = &bdc_pm_ops,
|
||||
.of_match_table = bdc_of_match,
|
||||
},
|
||||
|
@ -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,
|
||||
enum usb_device_speed speed)
|
||||
{
|
||||
if (udc->gadget->ops->udc_set_speed)
|
||||
udc->gadget->ops->udc_set_speed(udc->gadget, speed);
|
||||
if (udc->gadget->ops->udc_set_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 @@
|
||||
#define USB3_EP0_SS_MAX_PACKET_SIZE 512
|
||||
#define USB3_EP0_HSFS_MAX_PACKET_SIZE 64
|
||||
#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_DMA_NUM_SETTING_AREA 4
|
||||
/*
|
||||
|
@ -827,7 +827,7 @@ static ssize_t fill_registers_buffer(struct debug_buffer *buf)
|
||||
default: /* unknown */
|
||||
break;
|
||||
}
|
||||
temp = (cap >> 8) & 0xff;
|
||||
offset = (cap >> 8) & 0xff;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
@ -934,6 +934,12 @@ void xhci_free_virt_devices_depth_first(struct xhci_hcd *xhci, int slot_id)
|
||||
if (!vdev)
|
||||
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);
|
||||
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 */
|
||||
@ -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 */
|
||||
xhci_debugfs_remove_slot(xhci, slot_id);
|
||||
xhci_free_virt_device(xhci, slot_id);
|
||||
|
@ -2477,12 +2477,16 @@ static int handle_tx_event(struct xhci_hcd *xhci,
|
||||
*/
|
||||
if (list_empty(&ep_ring->td_list)) {
|
||||
/*
|
||||
* A stopped endpoint may generate an extra completion
|
||||
* event if the device was suspended. Don't print
|
||||
* warnings.
|
||||
* Don't print wanings if it's due to a stopped endpoint
|
||||
* generating an extra completion event if the device
|
||||
* 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 ||
|
||||
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",
|
||||
TRB_TO_SLOT_ID(le32_to_cpu(event->flags)),
|
||||
ep_index);
|
||||
|
@ -238,6 +238,7 @@ static void option_instat_callback(struct urb *urb);
|
||||
/* These Quectel products use Quectel's vendor ID */
|
||||
#define QUECTEL_PRODUCT_EC21 0x0121
|
||||
#define QUECTEL_PRODUCT_EC25 0x0125
|
||||
#define QUECTEL_PRODUCT_BG96 0x0296
|
||||
|
||||
#define CMOTECH_VENDOR_ID 0x16d8
|
||||
#define CMOTECH_PRODUCT_6001 0x6001
|
||||
@ -1182,6 +1183,8 @@ static const struct usb_device_id option_ids[] = {
|
||||
.driver_info = (kernel_ulong_t)&net_intf4_blacklist },
|
||||
{ USB_DEVICE(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_EC25),
|
||||
.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_CMU_300) },
|
||||
{ USB_DEVICE(CMOTECH_VENDOR_ID, CMOTECH_PRODUCT_6003),
|
||||
|
@ -31,12 +31,14 @@ static const struct usb_device_id id_table[] = {
|
||||
};
|
||||
|
||||
static const struct usb_device_id dbc_id_table[] = {
|
||||
{ USB_DEVICE(0x1d6b, 0x0010) },
|
||||
{ USB_DEVICE(0x1d6b, 0x0011) },
|
||||
{ },
|
||||
};
|
||||
|
||||
static const struct usb_device_id id_table_combined[] = {
|
||||
{ USB_DEVICE(0x0525, 0x127a) },
|
||||
{ USB_DEVICE(0x1d6b, 0x0010) },
|
||||
{ USB_DEVICE(0x1d6b, 0x0011) },
|
||||
{ },
|
||||
};
|
||||
|
@ -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);
|
||||
|
||||
if (flags & US_FL_IGNORE_UAS) {
|
||||
|
@ -1,13 +1,53 @@
|
||||
|
||||
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.
|
||||
|
||||
config TYPEC
|
||||
tristate
|
||||
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).
|
||||
|
||||
if TYPEC
|
||||
|
||||
config TYPEC_TCPM
|
||||
tristate "USB Type-C Port Controller Manager"
|
||||
depends on USB
|
||||
select TYPEC
|
||||
help
|
||||
The Type-C Port Controller Manager provides a USB PD and USB Type-C
|
||||
state machine for use with Type-C Port Controllers.
|
||||
@ -22,7 +62,6 @@ config TYPEC_WCOVE
|
||||
depends on INTEL_SOC_PMIC
|
||||
depends on INTEL_PMC_IPC
|
||||
depends on BXT_WC_PMIC_OPREGION
|
||||
select TYPEC
|
||||
help
|
||||
This driver adds support for USB Type-C detection on Intel Broxton
|
||||
platforms that have Intel Whiskey Cove PMIC. The driver can detect the
|
||||
@ -31,14 +70,13 @@ config TYPEC_WCOVE
|
||||
To compile this driver as module, choose M here: the module will be
|
||||
called typec_wcove
|
||||
|
||||
endif
|
||||
endif # TYPEC_TCPM
|
||||
|
||||
source "drivers/usb/typec/ucsi/Kconfig"
|
||||
|
||||
config TYPEC_TPS6598X
|
||||
tristate "TI TPS6598x USB Power Delivery controller driver"
|
||||
depends on I2C
|
||||
select TYPEC
|
||||
help
|
||||
Say Y or M here if your system has TI TPS65982 or TPS65983 USB Power
|
||||
Delivery controller.
|
||||
@ -46,4 +84,4 @@ config TYPEC_TPS6598X
|
||||
If you choose to build this driver as a dynamically linked module, the
|
||||
module will be called tps6598x.ko.
|
||||
|
||||
endmenu
|
||||
endif # TYPEC
|
||||
|
@ -1,7 +1,6 @@
|
||||
config TYPEC_UCSI
|
||||
tristate "USB Type-C Connector System Software Interface driver"
|
||||
depends on !CPU_BIG_ENDIAN
|
||||
select TYPEC
|
||||
help
|
||||
USB Type-C Connector System Software Interface (UCSI) is a
|
||||
specification for an interface that allows the operating system to
|
||||
|
@ -1098,7 +1098,6 @@ static int hcd_name_to_id(const char *name)
|
||||
static int vhci_setup(struct usb_hcd *hcd)
|
||||
{
|
||||
struct vhci *vhci = *((void **)dev_get_platdata(hcd->self.controller));
|
||||
hcd->self.sg_tablesize = ~0;
|
||||
if (usb_hcd_is_primary_hcd(hcd)) {
|
||||
vhci->vhci_hcd_hs = hcd_to_vhci_hcd(hcd);
|
||||
vhci->vhci_hcd_hs->vhci = vhci;
|
||||
|
@ -880,6 +880,8 @@ struct usb_wireless_cap_descriptor { /* Ultra Wide Band */
|
||||
__u8 bReserved;
|
||||
} __attribute__((packed));
|
||||
|
||||
#define USB_DT_USB_WIRELESS_CAP_SIZE 11
|
||||
|
||||
/* USB 2.0 Extension descriptor */
|
||||
#define USB_CAP_TYPE_EXT 2
|
||||
|
||||
@ -1072,6 +1074,7 @@ struct usb_ptm_cap_descriptor {
|
||||
__u8 bDevCapabilityType;
|
||||
} __attribute__((packed));
|
||||
|
||||
#define USB_DT_USB_PTM_ID_SIZE 3
|
||||
/*
|
||||
* The size of the descriptor for the Sublink Speed Attribute Count
|
||||
* (SSAC) specified in bmAttributes[4:0].
|
||||
|
@ -329,9 +329,17 @@ err:
|
||||
int usbip_vhci_get_free_port(uint32_t speed)
|
||||
{
|
||||
for (int i = 0; i < vhci_driver->nports; i++) {
|
||||
if (speed == USB_SPEED_SUPER &&
|
||||
vhci_driver->idev[i].hub != HUB_SPEED_SUPER)
|
||||
continue;
|
||||
|
||||
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;
|
||||
break;
|
||||
}
|
||||
|
||||
if (vhci_driver->idev[i].status == VDEV_ST_NULL)
|
||||
return vhci_driver->idev[i].port;
|
||||
|
Loading…
Reference in New Issue
Block a user