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 */
|
/* CBM - Flash disk */
|
||||||
{ USB_DEVICE(0x0204, 0x6025), .driver_info = USB_QUIRK_RESET_RESUME },
|
{ 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 */
|
/* HP 5300/5370C scanner */
|
||||||
{ USB_DEVICE(0x03f0, 0x0701), .driver_info =
|
{ USB_DEVICE(0x03f0, 0x0701), .driver_info =
|
||||||
USB_QUIRK_STRING_FETCH_255 },
|
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)
|
if (len < sizeof(*d) || h->interface >= ffs->interfaces_count)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
length = le32_to_cpu(d->dwSize);
|
length = le32_to_cpu(d->dwSize);
|
||||||
|
if (len < length)
|
||||||
|
return -EINVAL;
|
||||||
type = le32_to_cpu(d->dwPropertyDataType);
|
type = le32_to_cpu(d->dwPropertyDataType);
|
||||||
if (type < USB_EXT_PROP_UNICODE ||
|
if (type < USB_EXT_PROP_UNICODE ||
|
||||||
type > USB_EXT_PROP_UNICODE_MULTI) {
|
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;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
pnl = le16_to_cpu(d->wPropertyNameLength);
|
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));
|
pdl = le32_to_cpu(*(u32 *)((u8 *)data + 10 + pnl));
|
||||||
if (length != 14 + pnl + pdl) {
|
if (length != 14 + pnl + pdl) {
|
||||||
pr_vdebug("invalid os descriptor length: %d pnl:%d pdl:%d (descriptor %d)\n",
|
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 (flags & (1 << i)) {
|
||||||
|
if (len < 4) {
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
os_descs_count = get_unaligned_le32(data);
|
os_descs_count = get_unaligned_le32(data);
|
||||||
data += 4;
|
data += 4;
|
||||||
len -= 4;
|
len -= 4;
|
||||||
|
@ -2435,7 +2445,8 @@ static int __ffs_data_got_strings(struct ffs_data *ffs,
|
||||||
|
|
||||||
ENTER();
|
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))
|
get_unaligned_le32(data + 4) != len))
|
||||||
goto error;
|
goto error;
|
||||||
str_count = get_unaligned_le32(data + 8);
|
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_PORT_STAT_RESUME;
|
||||||
musb->rh_timer = jiffies
|
musb->rh_timer = jiffies
|
||||||
+ msecs_to_jiffies(USB_RESUME_TIMEOUT);
|
+ msecs_to_jiffies(USB_RESUME_TIMEOUT);
|
||||||
musb->need_finish_resume = 1;
|
|
||||||
|
|
||||||
musb->xceiv->otg->state = OTG_STATE_A_HOST;
|
musb->xceiv->otg->state = OTG_STATE_A_HOST;
|
||||||
musb->is_active = 1;
|
musb->is_active = 1;
|
||||||
musb_host_resume_root_hub(musb);
|
musb_host_resume_root_hub(musb);
|
||||||
|
schedule_delayed_work(&musb->finish_resume_work,
|
||||||
|
msecs_to_jiffies(USB_RESUME_TIMEOUT));
|
||||||
break;
|
break;
|
||||||
case OTG_STATE_B_WAIT_ACON:
|
case OTG_STATE_B_WAIT_ACON:
|
||||||
musb->xceiv->otg->state = OTG_STATE_B_PERIPHERAL;
|
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)
|
static void musb_irq_work(struct work_struct *data)
|
||||||
{
|
{
|
||||||
struct musb *musb = container_of(data, struct musb, irq_work.work);
|
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);
|
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;
|
musb->xceiv_old_state = musb->xceiv->otg->state;
|
||||||
sysfs_notify(&musb->controller->kobj, NULL, "mode");
|
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)
|
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;
|
mask = MUSB_DEVCTL_BDEVICE | MUSB_DEVCTL_FSDEV | MUSB_DEVCTL_LSDEV;
|
||||||
if ((devctl & mask) != (musb->context.devctl & mask))
|
if ((devctl & mask) != (musb->context.devctl & mask))
|
||||||
musb->port1_status = 0;
|
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
|
* 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);
|
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);
|
spin_lock_irqsave(&musb->lock, flags);
|
||||||
error = musb_run_resume_work(musb);
|
error = musb_run_resume_work(musb);
|
||||||
if (error)
|
if (error)
|
||||||
|
|
|
@ -410,7 +410,6 @@ struct musb {
|
||||||
|
|
||||||
/* is_suspended means USB B_PERIPHERAL suspend */
|
/* is_suspended means USB B_PERIPHERAL suspend */
|
||||||
unsigned is_suspended:1;
|
unsigned is_suspended:1;
|
||||||
unsigned need_finish_resume :1;
|
|
||||||
|
|
||||||
/* may_wakeup means remote wakeup is enabled */
|
/* may_wakeup means remote wakeup is enabled */
|
||||||
unsigned may_wakeup:1;
|
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_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_6802, 0xff, 0xff, 0xff) },
|
||||||
{ USB_DEVICE_AND_INTERFACE_INFO(WETELECOM_VENDOR_ID, WETELECOM_PRODUCT_WMD300, 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 */
|
{ } /* Terminating entry */
|
||||||
};
|
};
|
||||||
MODULE_DEVICE_TABLE(usb, option_ids);
|
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) },
|
||||||
{ USB_DEVICE(IODATA_VENDOR_ID, IODATA_PRODUCT_ID_RSAQ5) },
|
{ USB_DEVICE(IODATA_VENDOR_ID, IODATA_PRODUCT_ID_RSAQ5) },
|
||||||
{ USB_DEVICE(ATEN_VENDOR_ID, ATEN_PRODUCT_ID) },
|
{ 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(ATEN_VENDOR_ID2, ATEN_PRODUCT_ID) },
|
||||||
{ USB_DEVICE(ELCOM_VENDOR_ID, ELCOM_PRODUCT_ID) },
|
{ USB_DEVICE(ELCOM_VENDOR_ID, ELCOM_PRODUCT_ID) },
|
||||||
{ USB_DEVICE(ELCOM_VENDOR_ID, ELCOM_PRODUCT_ID_UCSGT) },
|
{ USB_DEVICE(ELCOM_VENDOR_ID, ELCOM_PRODUCT_ID_UCSGT) },
|
||||||
|
|
|
@ -27,6 +27,7 @@
|
||||||
#define ATEN_VENDOR_ID 0x0557
|
#define ATEN_VENDOR_ID 0x0557
|
||||||
#define ATEN_VENDOR_ID2 0x0547
|
#define ATEN_VENDOR_ID2 0x0547
|
||||||
#define ATEN_PRODUCT_ID 0x2008
|
#define ATEN_PRODUCT_ID 0x2008
|
||||||
|
#define ATEN_PRODUCT_ID2 0x2118
|
||||||
|
|
||||||
#define IODATA_VENDOR_ID 0x04bb
|
#define IODATA_VENDOR_ID 0x04bb
|
||||||
#define IODATA_PRODUCT_ID 0x0a03
|
#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(0x1410, 0xa021)}, /* Novatel Gobi 3000 Composite */
|
||||||
{USB_DEVICE(0x413c, 0x8193)}, /* Dell Gobi 3000 QDL */
|
{USB_DEVICE(0x413c, 0x8193)}, /* Dell Gobi 3000 QDL */
|
||||||
{USB_DEVICE(0x413c, 0x8194)}, /* Dell Gobi 3000 Composite */
|
{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, 0x68a4)}, /* Sierra Wireless QDL */
|
||||||
{USB_DEVICE(0x1199, 0x68a5)}, /* Sierra Wireless Modem */
|
{USB_DEVICE(0x1199, 0x68a5)}, /* Sierra Wireless Modem */
|
||||||
{USB_DEVICE(0x1199, 0x68a8)}, /* Sierra Wireless QDL */
|
{USB_DEVICE(0x1199, 0x68a8)}, /* Sierra Wireless QDL */
|
||||||
|
|
Loading…
Reference in New Issue