mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-01-10 07:10:27 +00:00
USB fixes for 5.17-rc6
Here are a number of small USB driver fixes for 5.17-rc6 to resolve reported problems and add new device ids. They include: - dwc3 device mapping fix - dwc3 new device ids - xhci driver fixes - dwc3 driver fixes - gadget driver fixes - usb-serial driver device id updates All of these have been in linux-next with no reported problems. Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> -----BEGIN PGP SIGNATURE----- iG0EABECAC0WIQT0tgzFv3jCIUoxPcsxR9QN2y37KQUCYhjX2A8cZ3JlZ0Brcm9h aC5jb20ACgkQMUfUDdst+yk08gCdGfQALC/Ip5vHVYUvlV9AFQDxnS0AoIPkv22j d3JZG2tl+8kV1QBJXA0m =gOTz -----END PGP SIGNATURE----- Merge tag 'usb-5.17-rc6' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/usb Pull USB fixes from Greg KH: "Here are a number of small USB driver fixes for 5.17-rc6 to resolve reported problems and add new device ids. They include: - dwc3: - device mapping fix - new device ids - driver fixes - xhci driver fixes - gadget driver fixes - usb-serial driver device id updates All of these have been in linux-next with no reported problems" * tag 'usb-5.17-rc6' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/usb: usb: gadget: rndis: add spinlock for rndis response list usb: dwc3: gadget: Let the interrupt handler disable bottom halves. USB: gadget: validate endpoint index for xilinx udc USB: serial: option: add Telit LE910R1 compositions USB: serial: option: add support for DW5829e Revert "USB: serial: ch341: add new Product ID for CH341A" usb: dwc2: drd: fix soft connect when gadget is unconfigured usb: dwc3: pci: Fix Bay Trail phy GPIO mappings tps6598x: clear int mask on probe failure xhci: Prevent futile URB re-submissions due to incorrect return value. xhci: re-initialize the HC during resume if HCE was set usb: dwc3: pci: Add "snps,dis_u2_susphy_quirk" for Intel Bay Trail usb: dwc3: pci: add support for the Intel Raptor Lake-S
This commit is contained in:
commit
548b1af45d
@ -1418,6 +1418,7 @@ void dwc2_hsotg_core_connect(struct dwc2_hsotg *hsotg);
|
||||
void dwc2_hsotg_disconnect(struct dwc2_hsotg *dwc2);
|
||||
int dwc2_hsotg_set_test_mode(struct dwc2_hsotg *hsotg, int testmode);
|
||||
#define dwc2_is_device_connected(hsotg) (hsotg->connected)
|
||||
#define dwc2_is_device_enabled(hsotg) (hsotg->enabled)
|
||||
int dwc2_backup_device_registers(struct dwc2_hsotg *hsotg);
|
||||
int dwc2_restore_device_registers(struct dwc2_hsotg *hsotg, int remote_wakeup);
|
||||
int dwc2_gadget_enter_hibernation(struct dwc2_hsotg *hsotg);
|
||||
@ -1454,6 +1455,7 @@ static inline int dwc2_hsotg_set_test_mode(struct dwc2_hsotg *hsotg,
|
||||
int testmode)
|
||||
{ return 0; }
|
||||
#define dwc2_is_device_connected(hsotg) (0)
|
||||
#define dwc2_is_device_enabled(hsotg) (0)
|
||||
static inline int dwc2_backup_device_registers(struct dwc2_hsotg *hsotg)
|
||||
{ return 0; }
|
||||
static inline int dwc2_restore_device_registers(struct dwc2_hsotg *hsotg,
|
||||
|
@ -130,8 +130,10 @@ static int dwc2_drd_role_sw_set(struct usb_role_switch *sw, enum usb_role role)
|
||||
already = dwc2_ovr_avalid(hsotg, true);
|
||||
} else if (role == USB_ROLE_DEVICE) {
|
||||
already = dwc2_ovr_bvalid(hsotg, true);
|
||||
/* This clear DCTL.SFTDISCON bit */
|
||||
dwc2_hsotg_core_connect(hsotg);
|
||||
if (dwc2_is_device_enabled(hsotg)) {
|
||||
/* This clear DCTL.SFTDISCON bit */
|
||||
dwc2_hsotg_core_connect(hsotg);
|
||||
}
|
||||
} else {
|
||||
if (dwc2_is_device_mode(hsotg)) {
|
||||
if (!dwc2_ovr_bvalid(hsotg, false))
|
||||
|
@ -43,6 +43,7 @@
|
||||
#define PCI_DEVICE_ID_INTEL_ADLP 0x51ee
|
||||
#define PCI_DEVICE_ID_INTEL_ADLM 0x54ee
|
||||
#define PCI_DEVICE_ID_INTEL_ADLS 0x7ae1
|
||||
#define PCI_DEVICE_ID_INTEL_RPLS 0x7a61
|
||||
#define PCI_DEVICE_ID_INTEL_TGL 0x9a15
|
||||
#define PCI_DEVICE_ID_AMD_MR 0x163a
|
||||
|
||||
@ -85,8 +86,8 @@ static const struct acpi_gpio_mapping acpi_dwc3_byt_gpios[] = {
|
||||
static struct gpiod_lookup_table platform_bytcr_gpios = {
|
||||
.dev_id = "0000:00:16.0",
|
||||
.table = {
|
||||
GPIO_LOOKUP("INT33FC:00", 54, "reset", GPIO_ACTIVE_HIGH),
|
||||
GPIO_LOOKUP("INT33FC:02", 14, "cs", GPIO_ACTIVE_HIGH),
|
||||
GPIO_LOOKUP("INT33FC:00", 54, "cs", GPIO_ACTIVE_HIGH),
|
||||
GPIO_LOOKUP("INT33FC:02", 14, "reset", GPIO_ACTIVE_HIGH),
|
||||
{}
|
||||
},
|
||||
};
|
||||
@ -119,6 +120,13 @@ static const struct property_entry dwc3_pci_intel_properties[] = {
|
||||
{}
|
||||
};
|
||||
|
||||
static const struct property_entry dwc3_pci_intel_byt_properties[] = {
|
||||
PROPERTY_ENTRY_STRING("dr_mode", "peripheral"),
|
||||
PROPERTY_ENTRY_BOOL("snps,dis_u2_susphy_quirk"),
|
||||
PROPERTY_ENTRY_BOOL("linux,sysdev_is_parent"),
|
||||
{}
|
||||
};
|
||||
|
||||
static const struct property_entry dwc3_pci_mrfld_properties[] = {
|
||||
PROPERTY_ENTRY_STRING("dr_mode", "otg"),
|
||||
PROPERTY_ENTRY_STRING("linux,extcon-name", "mrfld_bcove_pwrsrc"),
|
||||
@ -161,6 +169,10 @@ static const struct software_node dwc3_pci_intel_swnode = {
|
||||
.properties = dwc3_pci_intel_properties,
|
||||
};
|
||||
|
||||
static const struct software_node dwc3_pci_intel_byt_swnode = {
|
||||
.properties = dwc3_pci_intel_byt_properties,
|
||||
};
|
||||
|
||||
static const struct software_node dwc3_pci_intel_mrfld_swnode = {
|
||||
.properties = dwc3_pci_mrfld_properties,
|
||||
};
|
||||
@ -344,7 +356,7 @@ static const struct pci_device_id dwc3_pci_id_table[] = {
|
||||
(kernel_ulong_t) &dwc3_pci_intel_swnode, },
|
||||
|
||||
{ PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_BYT),
|
||||
(kernel_ulong_t) &dwc3_pci_intel_swnode, },
|
||||
(kernel_ulong_t) &dwc3_pci_intel_byt_swnode, },
|
||||
|
||||
{ PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_MRFLD),
|
||||
(kernel_ulong_t) &dwc3_pci_intel_mrfld_swnode, },
|
||||
@ -409,6 +421,9 @@ static const struct pci_device_id dwc3_pci_id_table[] = {
|
||||
{ PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_ADLS),
|
||||
(kernel_ulong_t) &dwc3_pci_intel_swnode, },
|
||||
|
||||
{ PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_RPLS),
|
||||
(kernel_ulong_t) &dwc3_pci_intel_swnode, },
|
||||
|
||||
{ PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_TGL),
|
||||
(kernel_ulong_t) &dwc3_pci_intel_swnode, },
|
||||
|
||||
|
@ -4160,9 +4160,11 @@ static irqreturn_t dwc3_thread_interrupt(int irq, void *_evt)
|
||||
unsigned long flags;
|
||||
irqreturn_t ret = IRQ_NONE;
|
||||
|
||||
local_bh_disable();
|
||||
spin_lock_irqsave(&dwc->lock, flags);
|
||||
ret = dwc3_process_event_buf(evt);
|
||||
spin_unlock_irqrestore(&dwc->lock, flags);
|
||||
local_bh_enable();
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
@ -922,6 +922,7 @@ struct rndis_params *rndis_register(void (*resp_avail)(void *v), void *v)
|
||||
params->resp_avail = resp_avail;
|
||||
params->v = v;
|
||||
INIT_LIST_HEAD(¶ms->resp_queue);
|
||||
spin_lock_init(¶ms->resp_lock);
|
||||
pr_debug("%s: configNr = %d\n", __func__, i);
|
||||
|
||||
return params;
|
||||
@ -1015,12 +1016,14 @@ void rndis_free_response(struct rndis_params *params, u8 *buf)
|
||||
{
|
||||
rndis_resp_t *r, *n;
|
||||
|
||||
spin_lock(¶ms->resp_lock);
|
||||
list_for_each_entry_safe(r, n, ¶ms->resp_queue, list) {
|
||||
if (r->buf == buf) {
|
||||
list_del(&r->list);
|
||||
kfree(r);
|
||||
}
|
||||
}
|
||||
spin_unlock(¶ms->resp_lock);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(rndis_free_response);
|
||||
|
||||
@ -1030,14 +1033,17 @@ u8 *rndis_get_next_response(struct rndis_params *params, u32 *length)
|
||||
|
||||
if (!length) return NULL;
|
||||
|
||||
spin_lock(¶ms->resp_lock);
|
||||
list_for_each_entry_safe(r, n, ¶ms->resp_queue, list) {
|
||||
if (!r->send) {
|
||||
r->send = 1;
|
||||
*length = r->length;
|
||||
spin_unlock(¶ms->resp_lock);
|
||||
return r->buf;
|
||||
}
|
||||
}
|
||||
|
||||
spin_unlock(¶ms->resp_lock);
|
||||
return NULL;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(rndis_get_next_response);
|
||||
@ -1054,7 +1060,9 @@ static rndis_resp_t *rndis_add_response(struct rndis_params *params, u32 length)
|
||||
r->length = length;
|
||||
r->send = 0;
|
||||
|
||||
spin_lock(¶ms->resp_lock);
|
||||
list_add_tail(&r->list, ¶ms->resp_queue);
|
||||
spin_unlock(¶ms->resp_lock);
|
||||
return r;
|
||||
}
|
||||
|
||||
|
@ -174,6 +174,7 @@ typedef struct rndis_params {
|
||||
void (*resp_avail)(void *v);
|
||||
void *v;
|
||||
struct list_head resp_queue;
|
||||
spinlock_t resp_lock;
|
||||
} rndis_params;
|
||||
|
||||
/* RNDIS Message parser and other useless functions */
|
||||
|
@ -1615,6 +1615,8 @@ static void xudc_getstatus(struct xusb_udc *udc)
|
||||
break;
|
||||
case USB_RECIP_ENDPOINT:
|
||||
epnum = udc->setup.wIndex & USB_ENDPOINT_NUMBER_MASK;
|
||||
if (epnum >= XUSB_MAX_ENDPOINTS)
|
||||
goto stall;
|
||||
target_ep = &udc->ep[epnum];
|
||||
epcfgreg = udc->read_fn(udc->addr + target_ep->offset);
|
||||
halt = epcfgreg & XUSB_EP_CFG_STALL_MASK;
|
||||
@ -1682,6 +1684,10 @@ static void xudc_set_clear_feature(struct xusb_udc *udc)
|
||||
case USB_RECIP_ENDPOINT:
|
||||
if (!udc->setup.wValue) {
|
||||
endpoint = udc->setup.wIndex & USB_ENDPOINT_NUMBER_MASK;
|
||||
if (endpoint >= XUSB_MAX_ENDPOINTS) {
|
||||
xudc_ep0_stall(udc);
|
||||
return;
|
||||
}
|
||||
target_ep = &udc->ep[endpoint];
|
||||
outinbit = udc->setup.wIndex & USB_ENDPOINT_DIR_MASK;
|
||||
outinbit = outinbit >> 7;
|
||||
|
@ -1091,6 +1091,7 @@ int xhci_resume(struct xhci_hcd *xhci, bool hibernated)
|
||||
int retval = 0;
|
||||
bool comp_timer_running = false;
|
||||
bool pending_portevent = false;
|
||||
bool reinit_xhc = false;
|
||||
|
||||
if (!hcd->state)
|
||||
return 0;
|
||||
@ -1107,10 +1108,11 @@ int xhci_resume(struct xhci_hcd *xhci, bool hibernated)
|
||||
set_bit(HCD_FLAG_HW_ACCESSIBLE, &xhci->shared_hcd->flags);
|
||||
|
||||
spin_lock_irq(&xhci->lock);
|
||||
if ((xhci->quirks & XHCI_RESET_ON_RESUME) || xhci->broken_suspend)
|
||||
hibernated = true;
|
||||
|
||||
if (!hibernated) {
|
||||
if (hibernated || xhci->quirks & XHCI_RESET_ON_RESUME || xhci->broken_suspend)
|
||||
reinit_xhc = true;
|
||||
|
||||
if (!reinit_xhc) {
|
||||
/*
|
||||
* Some controllers might lose power during suspend, so wait
|
||||
* for controller not ready bit to clear, just as in xHC init.
|
||||
@ -1143,12 +1145,17 @@ int xhci_resume(struct xhci_hcd *xhci, bool hibernated)
|
||||
spin_unlock_irq(&xhci->lock);
|
||||
return -ETIMEDOUT;
|
||||
}
|
||||
temp = readl(&xhci->op_regs->status);
|
||||
}
|
||||
|
||||
/* If restore operation fails, re-initialize the HC during resume */
|
||||
if ((temp & STS_SRE) || hibernated) {
|
||||
temp = readl(&xhci->op_regs->status);
|
||||
|
||||
/* re-initialize the HC on Restore Error, or Host Controller Error */
|
||||
if (temp & (STS_SRE | STS_HCE)) {
|
||||
reinit_xhc = true;
|
||||
xhci_warn(xhci, "xHC error in resume, USBSTS 0x%x, Reinit\n", temp);
|
||||
}
|
||||
|
||||
if (reinit_xhc) {
|
||||
if ((xhci->quirks & XHCI_COMP_MODE_QUIRK) &&
|
||||
!(xhci_all_ports_seen_u0(xhci))) {
|
||||
del_timer_sync(&xhci->comp_mode_recovery_timer);
|
||||
@ -1604,9 +1611,12 @@ static int xhci_urb_enqueue(struct usb_hcd *hcd, struct urb *urb, gfp_t mem_flag
|
||||
struct urb_priv *urb_priv;
|
||||
int num_tds;
|
||||
|
||||
if (!urb || xhci_check_args(hcd, urb->dev, urb->ep,
|
||||
true, true, __func__) <= 0)
|
||||
if (!urb)
|
||||
return -EINVAL;
|
||||
ret = xhci_check_args(hcd, urb->dev, urb->ep,
|
||||
true, true, __func__);
|
||||
if (ret <= 0)
|
||||
return ret ? ret : -EINVAL;
|
||||
|
||||
slot_id = urb->dev->slot_id;
|
||||
ep_index = xhci_get_endpoint_index(&urb->ep->desc);
|
||||
@ -3323,7 +3333,7 @@ static int xhci_check_streams_endpoint(struct xhci_hcd *xhci,
|
||||
return -EINVAL;
|
||||
ret = xhci_check_args(xhci_to_hcd(xhci), udev, ep, 1, true, __func__);
|
||||
if (ret <= 0)
|
||||
return -EINVAL;
|
||||
return ret ? ret : -EINVAL;
|
||||
if (usb_ss_max_streams(&ep->ss_ep_comp) == 0) {
|
||||
xhci_warn(xhci, "WARN: SuperSpeed Endpoint Companion"
|
||||
" descriptor for ep 0x%x does not support streams\n",
|
||||
|
@ -81,7 +81,6 @@
|
||||
#define CH341_QUIRK_SIMULATE_BREAK BIT(1)
|
||||
|
||||
static const struct usb_device_id id_table[] = {
|
||||
{ USB_DEVICE(0x1a86, 0x5512) },
|
||||
{ USB_DEVICE(0x1a86, 0x5523) },
|
||||
{ USB_DEVICE(0x1a86, 0x7522) },
|
||||
{ USB_DEVICE(0x1a86, 0x7523) },
|
||||
|
@ -198,6 +198,8 @@ static void option_instat_callback(struct urb *urb);
|
||||
|
||||
#define DELL_PRODUCT_5821E 0x81d7
|
||||
#define DELL_PRODUCT_5821E_ESIM 0x81e0
|
||||
#define DELL_PRODUCT_5829E_ESIM 0x81e4
|
||||
#define DELL_PRODUCT_5829E 0x81e6
|
||||
|
||||
#define KYOCERA_VENDOR_ID 0x0c88
|
||||
#define KYOCERA_PRODUCT_KPC650 0x17da
|
||||
@ -1063,6 +1065,10 @@ static const struct usb_device_id option_ids[] = {
|
||||
.driver_info = RSVD(0) | RSVD(1) | RSVD(6) },
|
||||
{ USB_DEVICE(DELL_VENDOR_ID, DELL_PRODUCT_5821E_ESIM),
|
||||
.driver_info = RSVD(0) | RSVD(1) | RSVD(6) },
|
||||
{ USB_DEVICE(DELL_VENDOR_ID, DELL_PRODUCT_5829E),
|
||||
.driver_info = RSVD(0) | RSVD(6) },
|
||||
{ USB_DEVICE(DELL_VENDOR_ID, DELL_PRODUCT_5829E_ESIM),
|
||||
.driver_info = RSVD(0) | RSVD(6) },
|
||||
{ USB_DEVICE(ANYDATA_VENDOR_ID, ANYDATA_PRODUCT_ADU_E100A) }, /* ADU-E100, ADU-310 */
|
||||
{ USB_DEVICE(ANYDATA_VENDOR_ID, ANYDATA_PRODUCT_ADU_500A) },
|
||||
{ USB_DEVICE(ANYDATA_VENDOR_ID, ANYDATA_PRODUCT_ADU_620UW) },
|
||||
@ -1273,10 +1279,16 @@ static const struct usb_device_id option_ids[] = {
|
||||
.driver_info = NCTRL(2) },
|
||||
{ USB_DEVICE_INTERFACE_CLASS(TELIT_VENDOR_ID, 0x7011, 0xff), /* Telit LE910-S1 (ECM) */
|
||||
.driver_info = NCTRL(2) },
|
||||
{ USB_DEVICE_INTERFACE_CLASS(TELIT_VENDOR_ID, 0x701a, 0xff), /* Telit LE910R1 (RNDIS) */
|
||||
.driver_info = NCTRL(2) },
|
||||
{ USB_DEVICE_INTERFACE_CLASS(TELIT_VENDOR_ID, 0x701b, 0xff), /* Telit LE910R1 (ECM) */
|
||||
.driver_info = NCTRL(2) },
|
||||
{ USB_DEVICE(TELIT_VENDOR_ID, 0x9010), /* Telit SBL FN980 flashing device */
|
||||
.driver_info = NCTRL(0) | ZLP },
|
||||
{ USB_DEVICE(TELIT_VENDOR_ID, 0x9200), /* Telit LE910S1 flashing device */
|
||||
.driver_info = NCTRL(0) | ZLP },
|
||||
{ USB_DEVICE(TELIT_VENDOR_ID, 0x9201), /* Telit LE910R1 flashing device */
|
||||
.driver_info = NCTRL(0) | ZLP },
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, ZTE_PRODUCT_MF622, 0xff, 0xff, 0xff) }, /* ZTE WCDMA products */
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0002, 0xff, 0xff, 0xff),
|
||||
.driver_info = RSVD(1) },
|
||||
|
@ -761,12 +761,12 @@ static int tps6598x_probe(struct i2c_client *client)
|
||||
|
||||
ret = tps6598x_read32(tps, TPS_REG_STATUS, &status);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
goto err_clear_mask;
|
||||
trace_tps6598x_status(status);
|
||||
|
||||
ret = tps6598x_read32(tps, TPS_REG_SYSTEM_CONF, &conf);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
goto err_clear_mask;
|
||||
|
||||
/*
|
||||
* This fwnode has a "compatible" property, but is never populated as a
|
||||
@ -855,7 +855,8 @@ err_role_put:
|
||||
usb_role_switch_put(tps->role_sw);
|
||||
err_fwnode_put:
|
||||
fwnode_handle_put(fwnode);
|
||||
|
||||
err_clear_mask:
|
||||
tps6598x_write64(tps, TPS_REG_INT_MASK1, 0);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user