USB fixes for 4.10-rc7
Here are some small USB fixes for some reported issues, and the usual number of new device ids for 4.10-rc7. All of these, except the last new device id, have been in linux-next for a while with no reported issues. Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> -----BEGIN PGP SIGNATURE----- iG0EABECAC0WIQT0tgzFv3jCIUoxPcsxR9QN2y37KQUCWJW8Iw8cZ3JlZ0Brcm9h aC5jb20ACgkQMUfUDdst+ynTtQCfTZyPCHsDudlzuJeqrigE2AsfRfYAnR7OQiZK 6GgUHc8ulHGyF/Vuib3A =dZOf -----END PGP SIGNATURE----- Merge tag 'usb-4.10-rc7' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/usb Pull USB fixes from Greg KH: "Here are some small USB fixes for some reported issues, and the usual number of new device ids for 4.10-rc7. All of these, except the last new device id, have been in linux-next for a while with no reported issues" * tag 'usb-4.10-rc7' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/usb: USB: serial: pl2303: add ATEN device ID usb: gadget: f_fs: Assorted buffer overflow checks. USB: Add quirk for WORLDE easykey.25 MIDI keyboard usb: musb: Fix external abort on non-linefetch for musb_irq_work() usb: musb: Fix host mode error -71 regression USB: serial: option: add device ID for HP lt2523 (Novatel E371) USB: serial: qcserial: add Dell DW5570 QDL
This commit is contained in:
commit
8fcdcc42a5
|
@ -37,6 +37,10 @@ static const struct usb_device_id usb_quirk_list[] = {
|
|||
/* CBM - Flash disk */
|
||||
{ USB_DEVICE(0x0204, 0x6025), .driver_info = USB_QUIRK_RESET_RESUME },
|
||||
|
||||
/* WORLDE easy key (easykey.25) MIDI controller */
|
||||
{ USB_DEVICE(0x0218, 0x0401), .driver_info =
|
||||
USB_QUIRK_CONFIG_INTF_STRINGS },
|
||||
|
||||
/* HP 5300/5370C scanner */
|
||||
{ USB_DEVICE(0x03f0, 0x0701), .driver_info =
|
||||
USB_QUIRK_STRING_FETCH_255 },
|
||||
|
|
|
@ -2269,6 +2269,8 @@ static int __ffs_data_do_os_desc(enum ffs_os_desc_type type,
|
|||
if (len < sizeof(*d) || h->interface >= ffs->interfaces_count)
|
||||
return -EINVAL;
|
||||
length = le32_to_cpu(d->dwSize);
|
||||
if (len < length)
|
||||
return -EINVAL;
|
||||
type = le32_to_cpu(d->dwPropertyDataType);
|
||||
if (type < USB_EXT_PROP_UNICODE ||
|
||||
type > USB_EXT_PROP_UNICODE_MULTI) {
|
||||
|
@ -2277,6 +2279,11 @@ static int __ffs_data_do_os_desc(enum ffs_os_desc_type type,
|
|||
return -EINVAL;
|
||||
}
|
||||
pnl = le16_to_cpu(d->wPropertyNameLength);
|
||||
if (length < 14 + pnl) {
|
||||
pr_vdebug("invalid os descriptor length: %d pnl:%d (descriptor %d)\n",
|
||||
length, pnl, type);
|
||||
return -EINVAL;
|
||||
}
|
||||
pdl = le32_to_cpu(*(u32 *)((u8 *)data + 10 + pnl));
|
||||
if (length != 14 + pnl + pdl) {
|
||||
pr_vdebug("invalid os descriptor length: %d pnl:%d pdl:%d (descriptor %d)\n",
|
||||
|
@ -2363,6 +2370,9 @@ static int __ffs_data_got_descs(struct ffs_data *ffs,
|
|||
}
|
||||
}
|
||||
if (flags & (1 << i)) {
|
||||
if (len < 4) {
|
||||
goto error;
|
||||
}
|
||||
os_descs_count = get_unaligned_le32(data);
|
||||
data += 4;
|
||||
len -= 4;
|
||||
|
@ -2435,7 +2445,8 @@ static int __ffs_data_got_strings(struct ffs_data *ffs,
|
|||
|
||||
ENTER();
|
||||
|
||||
if (unlikely(get_unaligned_le32(data) != FUNCTIONFS_STRINGS_MAGIC ||
|
||||
if (unlikely(len < 16 ||
|
||||
get_unaligned_le32(data) != FUNCTIONFS_STRINGS_MAGIC ||
|
||||
get_unaligned_le32(data + 4) != len))
|
||||
goto error;
|
||||
str_count = get_unaligned_le32(data + 8);
|
||||
|
|
|
@ -594,11 +594,11 @@ static irqreturn_t musb_stage0_irq(struct musb *musb, u8 int_usb,
|
|||
| MUSB_PORT_STAT_RESUME;
|
||||
musb->rh_timer = jiffies
|
||||
+ msecs_to_jiffies(USB_RESUME_TIMEOUT);
|
||||
musb->need_finish_resume = 1;
|
||||
|
||||
musb->xceiv->otg->state = OTG_STATE_A_HOST;
|
||||
musb->is_active = 1;
|
||||
musb_host_resume_root_hub(musb);
|
||||
schedule_delayed_work(&musb->finish_resume_work,
|
||||
msecs_to_jiffies(USB_RESUME_TIMEOUT));
|
||||
break;
|
||||
case OTG_STATE_B_WAIT_ACON:
|
||||
musb->xceiv->otg->state = OTG_STATE_B_PERIPHERAL;
|
||||
|
@ -1925,6 +1925,14 @@ static void musb_pm_runtime_check_session(struct musb *musb)
|
|||
static void musb_irq_work(struct work_struct *data)
|
||||
{
|
||||
struct musb *musb = container_of(data, struct musb, irq_work.work);
|
||||
int error;
|
||||
|
||||
error = pm_runtime_get_sync(musb->controller);
|
||||
if (error < 0) {
|
||||
dev_err(musb->controller, "Could not enable: %i\n", error);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
musb_pm_runtime_check_session(musb);
|
||||
|
||||
|
@ -1932,6 +1940,9 @@ static void musb_irq_work(struct work_struct *data)
|
|||
musb->xceiv_old_state = musb->xceiv->otg->state;
|
||||
sysfs_notify(&musb->controller->kobj, NULL, "mode");
|
||||
}
|
||||
|
||||
pm_runtime_mark_last_busy(musb->controller);
|
||||
pm_runtime_put_autosuspend(musb->controller);
|
||||
}
|
||||
|
||||
static void musb_recover_from_babble(struct musb *musb)
|
||||
|
@ -2710,11 +2721,6 @@ static int musb_resume(struct device *dev)
|
|||
mask = MUSB_DEVCTL_BDEVICE | MUSB_DEVCTL_FSDEV | MUSB_DEVCTL_LSDEV;
|
||||
if ((devctl & mask) != (musb->context.devctl & mask))
|
||||
musb->port1_status = 0;
|
||||
if (musb->need_finish_resume) {
|
||||
musb->need_finish_resume = 0;
|
||||
schedule_delayed_work(&musb->finish_resume_work,
|
||||
msecs_to_jiffies(USB_RESUME_TIMEOUT));
|
||||
}
|
||||
|
||||
/*
|
||||
* The USB HUB code expects the device to be in RPM_ACTIVE once it came
|
||||
|
@ -2766,12 +2772,6 @@ static int musb_runtime_resume(struct device *dev)
|
|||
|
||||
musb_restore_context(musb);
|
||||
|
||||
if (musb->need_finish_resume) {
|
||||
musb->need_finish_resume = 0;
|
||||
schedule_delayed_work(&musb->finish_resume_work,
|
||||
msecs_to_jiffies(USB_RESUME_TIMEOUT));
|
||||
}
|
||||
|
||||
spin_lock_irqsave(&musb->lock, flags);
|
||||
error = musb_run_resume_work(musb);
|
||||
if (error)
|
||||
|
|
|
@ -410,7 +410,6 @@ struct musb {
|
|||
|
||||
/* is_suspended means USB B_PERIPHERAL suspend */
|
||||
unsigned is_suspended:1;
|
||||
unsigned need_finish_resume :1;
|
||||
|
||||
/* may_wakeup means remote wakeup is enabled */
|
||||
unsigned may_wakeup:1;
|
||||
|
|
|
@ -2007,6 +2007,7 @@ static const struct usb_device_id option_ids[] = {
|
|||
{ USB_DEVICE_AND_INTERFACE_INFO(WETELECOM_VENDOR_ID, WETELECOM_PRODUCT_WMD200, 0xff, 0xff, 0xff) },
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(WETELECOM_VENDOR_ID, WETELECOM_PRODUCT_6802, 0xff, 0xff, 0xff) },
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(WETELECOM_VENDOR_ID, WETELECOM_PRODUCT_WMD300, 0xff, 0xff, 0xff) },
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(0x03f0, 0x421d, 0xff, 0xff, 0xff) }, /* HP lt2523 (Novatel E371) */
|
||||
{ } /* Terminating entry */
|
||||
};
|
||||
MODULE_DEVICE_TABLE(usb, option_ids);
|
||||
|
|
|
@ -49,6 +49,7 @@ static const struct usb_device_id id_table[] = {
|
|||
{ USB_DEVICE(IODATA_VENDOR_ID, IODATA_PRODUCT_ID) },
|
||||
{ USB_DEVICE(IODATA_VENDOR_ID, IODATA_PRODUCT_ID_RSAQ5) },
|
||||
{ USB_DEVICE(ATEN_VENDOR_ID, ATEN_PRODUCT_ID) },
|
||||
{ USB_DEVICE(ATEN_VENDOR_ID, ATEN_PRODUCT_ID2) },
|
||||
{ USB_DEVICE(ATEN_VENDOR_ID2, ATEN_PRODUCT_ID) },
|
||||
{ USB_DEVICE(ELCOM_VENDOR_ID, ELCOM_PRODUCT_ID) },
|
||||
{ USB_DEVICE(ELCOM_VENDOR_ID, ELCOM_PRODUCT_ID_UCSGT) },
|
||||
|
|
|
@ -27,6 +27,7 @@
|
|||
#define ATEN_VENDOR_ID 0x0557
|
||||
#define ATEN_VENDOR_ID2 0x0547
|
||||
#define ATEN_PRODUCT_ID 0x2008
|
||||
#define ATEN_PRODUCT_ID2 0x2118
|
||||
|
||||
#define IODATA_VENDOR_ID 0x04bb
|
||||
#define IODATA_PRODUCT_ID 0x0a03
|
||||
|
|
|
@ -124,6 +124,7 @@ static const struct usb_device_id id_table[] = {
|
|||
{USB_DEVICE(0x1410, 0xa021)}, /* Novatel Gobi 3000 Composite */
|
||||
{USB_DEVICE(0x413c, 0x8193)}, /* Dell Gobi 3000 QDL */
|
||||
{USB_DEVICE(0x413c, 0x8194)}, /* Dell Gobi 3000 Composite */
|
||||
{USB_DEVICE(0x413c, 0x81a6)}, /* Dell DW5570 QDL (MC8805) */
|
||||
{USB_DEVICE(0x1199, 0x68a4)}, /* Sierra Wireless QDL */
|
||||
{USB_DEVICE(0x1199, 0x68a5)}, /* Sierra Wireless Modem */
|
||||
{USB_DEVICE(0x1199, 0x68a8)}, /* Sierra Wireless QDL */
|
||||
|
|
Loading…
Reference in New Issue