mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git
synced 2024-12-29 17:22:07 +00:00
Merge branch 'usb-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/usb.git
This commit is contained in:
commit
e54d7c2236
@ -1520,6 +1520,14 @@ static struct pci_device_id nhi_ids[] = {
|
|||||||
.driver_data = (kernel_ulong_t)&icl_nhi_ops },
|
.driver_data = (kernel_ulong_t)&icl_nhi_ops },
|
||||||
{ PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_LNL_NHI1),
|
{ PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_LNL_NHI1),
|
||||||
.driver_data = (kernel_ulong_t)&icl_nhi_ops },
|
.driver_data = (kernel_ulong_t)&icl_nhi_ops },
|
||||||
|
{ PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_PTL_M_NHI0),
|
||||||
|
.driver_data = (kernel_ulong_t)&icl_nhi_ops },
|
||||||
|
{ PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_PTL_M_NHI1),
|
||||||
|
.driver_data = (kernel_ulong_t)&icl_nhi_ops },
|
||||||
|
{ PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_PTL_P_NHI0),
|
||||||
|
.driver_data = (kernel_ulong_t)&icl_nhi_ops },
|
||||||
|
{ PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_PTL_P_NHI1),
|
||||||
|
.driver_data = (kernel_ulong_t)&icl_nhi_ops },
|
||||||
{ PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_BARLOW_RIDGE_HOST_80G_NHI) },
|
{ PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_BARLOW_RIDGE_HOST_80G_NHI) },
|
||||||
{ PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_BARLOW_RIDGE_HOST_40G_NHI) },
|
{ PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_BARLOW_RIDGE_HOST_40G_NHI) },
|
||||||
|
|
||||||
|
@ -92,6 +92,10 @@ extern const struct tb_nhi_ops icl_nhi_ops;
|
|||||||
#define PCI_DEVICE_ID_INTEL_RPL_NHI1 0xa76d
|
#define PCI_DEVICE_ID_INTEL_RPL_NHI1 0xa76d
|
||||||
#define PCI_DEVICE_ID_INTEL_LNL_NHI0 0xa833
|
#define PCI_DEVICE_ID_INTEL_LNL_NHI0 0xa833
|
||||||
#define PCI_DEVICE_ID_INTEL_LNL_NHI1 0xa834
|
#define PCI_DEVICE_ID_INTEL_LNL_NHI1 0xa834
|
||||||
|
#define PCI_DEVICE_ID_INTEL_PTL_M_NHI0 0xe333
|
||||||
|
#define PCI_DEVICE_ID_INTEL_PTL_M_NHI1 0xe334
|
||||||
|
#define PCI_DEVICE_ID_INTEL_PTL_P_NHI0 0xe433
|
||||||
|
#define PCI_DEVICE_ID_INTEL_PTL_P_NHI1 0xe434
|
||||||
|
|
||||||
#define PCI_CLASS_SERIAL_USB_USB4 0x0c0340
|
#define PCI_CLASS_SERIAL_USB_USB4 0x0c0340
|
||||||
|
|
||||||
|
@ -103,6 +103,7 @@ static int tb_retimer_nvm_add(struct tb_retimer *rt)
|
|||||||
|
|
||||||
err_nvm:
|
err_nvm:
|
||||||
dev_dbg(&rt->dev, "NVM upgrade disabled\n");
|
dev_dbg(&rt->dev, "NVM upgrade disabled\n");
|
||||||
|
rt->no_nvm_upgrade = true;
|
||||||
if (!IS_ERR(nvm))
|
if (!IS_ERR(nvm))
|
||||||
tb_nvm_free(nvm);
|
tb_nvm_free(nvm);
|
||||||
|
|
||||||
@ -182,8 +183,6 @@ static ssize_t nvm_authenticate_show(struct device *dev,
|
|||||||
|
|
||||||
if (!rt->nvm)
|
if (!rt->nvm)
|
||||||
ret = -EAGAIN;
|
ret = -EAGAIN;
|
||||||
else if (rt->no_nvm_upgrade)
|
|
||||||
ret = -EOPNOTSUPP;
|
|
||||||
else
|
else
|
||||||
ret = sysfs_emit(buf, "%#x\n", rt->auth_status);
|
ret = sysfs_emit(buf, "%#x\n", rt->auth_status);
|
||||||
|
|
||||||
@ -323,8 +322,6 @@ static ssize_t nvm_version_show(struct device *dev,
|
|||||||
|
|
||||||
if (!rt->nvm)
|
if (!rt->nvm)
|
||||||
ret = -EAGAIN;
|
ret = -EAGAIN;
|
||||||
else if (rt->no_nvm_upgrade)
|
|
||||||
ret = -EOPNOTSUPP;
|
|
||||||
else
|
else
|
||||||
ret = sysfs_emit(buf, "%x.%x\n", rt->nvm->major, rt->nvm->minor);
|
ret = sysfs_emit(buf, "%x.%x\n", rt->nvm->major, rt->nvm->minor);
|
||||||
|
|
||||||
@ -342,6 +339,19 @@ static ssize_t vendor_show(struct device *dev, struct device_attribute *attr,
|
|||||||
}
|
}
|
||||||
static DEVICE_ATTR_RO(vendor);
|
static DEVICE_ATTR_RO(vendor);
|
||||||
|
|
||||||
|
static umode_t retimer_is_visible(struct kobject *kobj, struct attribute *attr,
|
||||||
|
int n)
|
||||||
|
{
|
||||||
|
struct device *dev = kobj_to_dev(kobj);
|
||||||
|
struct tb_retimer *rt = tb_to_retimer(dev);
|
||||||
|
|
||||||
|
if (attr == &dev_attr_nvm_authenticate.attr ||
|
||||||
|
attr == &dev_attr_nvm_version.attr)
|
||||||
|
return rt->no_nvm_upgrade ? 0 : attr->mode;
|
||||||
|
|
||||||
|
return attr->mode;
|
||||||
|
}
|
||||||
|
|
||||||
static struct attribute *retimer_attrs[] = {
|
static struct attribute *retimer_attrs[] = {
|
||||||
&dev_attr_device.attr,
|
&dev_attr_device.attr,
|
||||||
&dev_attr_nvm_authenticate.attr,
|
&dev_attr_nvm_authenticate.attr,
|
||||||
@ -351,6 +361,7 @@ static struct attribute *retimer_attrs[] = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
static const struct attribute_group retimer_group = {
|
static const struct attribute_group retimer_group = {
|
||||||
|
.is_visible = retimer_is_visible,
|
||||||
.attrs = retimer_attrs,
|
.attrs = retimer_attrs,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -2059,6 +2059,37 @@ static void tb_exit_redrive(struct tb_port *port)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void tb_switch_enter_redrive(struct tb_switch *sw)
|
||||||
|
{
|
||||||
|
struct tb_port *port;
|
||||||
|
|
||||||
|
tb_switch_for_each_port(sw, port)
|
||||||
|
tb_enter_redrive(port);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Called during system and runtime suspend to forcefully exit redrive
|
||||||
|
* mode without querying whether the resource is available.
|
||||||
|
*/
|
||||||
|
static void tb_switch_exit_redrive(struct tb_switch *sw)
|
||||||
|
{
|
||||||
|
struct tb_port *port;
|
||||||
|
|
||||||
|
if (!(sw->quirks & QUIRK_KEEP_POWER_IN_DP_REDRIVE))
|
||||||
|
return;
|
||||||
|
|
||||||
|
tb_switch_for_each_port(sw, port) {
|
||||||
|
if (!tb_port_is_dpin(port))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (port->redrive) {
|
||||||
|
port->redrive = false;
|
||||||
|
pm_runtime_put(&sw->dev);
|
||||||
|
tb_port_dbg(port, "exit redrive mode\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static void tb_dp_resource_unavailable(struct tb *tb, struct tb_port *port)
|
static void tb_dp_resource_unavailable(struct tb *tb, struct tb_port *port)
|
||||||
{
|
{
|
||||||
struct tb_port *in, *out;
|
struct tb_port *in, *out;
|
||||||
@ -2909,6 +2940,7 @@ static int tb_start(struct tb *tb, bool reset)
|
|||||||
tb_create_usb3_tunnels(tb->root_switch);
|
tb_create_usb3_tunnels(tb->root_switch);
|
||||||
/* Add DP IN resources for the root switch */
|
/* Add DP IN resources for the root switch */
|
||||||
tb_add_dp_resources(tb->root_switch);
|
tb_add_dp_resources(tb->root_switch);
|
||||||
|
tb_switch_enter_redrive(tb->root_switch);
|
||||||
/* Make the discovered switches available to the userspace */
|
/* Make the discovered switches available to the userspace */
|
||||||
device_for_each_child(&tb->root_switch->dev, NULL,
|
device_for_each_child(&tb->root_switch->dev, NULL,
|
||||||
tb_scan_finalize_switch);
|
tb_scan_finalize_switch);
|
||||||
@ -2924,6 +2956,7 @@ static int tb_suspend_noirq(struct tb *tb)
|
|||||||
|
|
||||||
tb_dbg(tb, "suspending...\n");
|
tb_dbg(tb, "suspending...\n");
|
||||||
tb_disconnect_and_release_dp(tb);
|
tb_disconnect_and_release_dp(tb);
|
||||||
|
tb_switch_exit_redrive(tb->root_switch);
|
||||||
tb_switch_suspend(tb->root_switch, false);
|
tb_switch_suspend(tb->root_switch, false);
|
||||||
tcm->hotplug_active = false; /* signal tb_handle_hotplug to quit */
|
tcm->hotplug_active = false; /* signal tb_handle_hotplug to quit */
|
||||||
tb_dbg(tb, "suspend finished\n");
|
tb_dbg(tb, "suspend finished\n");
|
||||||
@ -3016,6 +3049,7 @@ static int tb_resume_noirq(struct tb *tb)
|
|||||||
tb_dbg(tb, "tunnels restarted, sleeping for 100ms\n");
|
tb_dbg(tb, "tunnels restarted, sleeping for 100ms\n");
|
||||||
msleep(100);
|
msleep(100);
|
||||||
}
|
}
|
||||||
|
tb_switch_enter_redrive(tb->root_switch);
|
||||||
/* Allow tb_handle_hotplug to progress events */
|
/* Allow tb_handle_hotplug to progress events */
|
||||||
tcm->hotplug_active = true;
|
tcm->hotplug_active = true;
|
||||||
tb_dbg(tb, "resume finished\n");
|
tb_dbg(tb, "resume finished\n");
|
||||||
@ -3079,6 +3113,12 @@ static int tb_runtime_suspend(struct tb *tb)
|
|||||||
struct tb_cm *tcm = tb_priv(tb);
|
struct tb_cm *tcm = tb_priv(tb);
|
||||||
|
|
||||||
mutex_lock(&tb->lock);
|
mutex_lock(&tb->lock);
|
||||||
|
/*
|
||||||
|
* The below call only releases DP resources to allow exiting and
|
||||||
|
* re-entering redrive mode.
|
||||||
|
*/
|
||||||
|
tb_disconnect_and_release_dp(tb);
|
||||||
|
tb_switch_exit_redrive(tb->root_switch);
|
||||||
tb_switch_suspend(tb->root_switch, true);
|
tb_switch_suspend(tb->root_switch, true);
|
||||||
tcm->hotplug_active = false;
|
tcm->hotplug_active = false;
|
||||||
mutex_unlock(&tb->lock);
|
mutex_unlock(&tb->lock);
|
||||||
@ -3110,6 +3150,7 @@ static int tb_runtime_resume(struct tb *tb)
|
|||||||
tb_restore_children(tb->root_switch);
|
tb_restore_children(tb->root_switch);
|
||||||
list_for_each_entry_safe(tunnel, n, &tcm->tunnel_list, list)
|
list_for_each_entry_safe(tunnel, n, &tcm->tunnel_list, list)
|
||||||
tb_tunnel_restart(tunnel);
|
tb_tunnel_restart(tunnel);
|
||||||
|
tb_switch_enter_redrive(tb->root_switch);
|
||||||
tcm->hotplug_active = true;
|
tcm->hotplug_active = true;
|
||||||
mutex_unlock(&tb->lock);
|
mutex_unlock(&tb->lock);
|
||||||
|
|
||||||
|
@ -436,7 +436,7 @@ int xhci_ring_expansion(struct xhci_hcd *xhci, struct xhci_ring *ring,
|
|||||||
goto free_segments;
|
goto free_segments;
|
||||||
}
|
}
|
||||||
|
|
||||||
xhci_link_rings(xhci, ring, &new_ring);
|
xhci_link_rings(xhci, &new_ring, ring);
|
||||||
trace_xhci_ring_expansion(ring);
|
trace_xhci_ring_expansion(ring);
|
||||||
xhci_dbg_trace(xhci, trace_xhci_dbg_ring_expansion,
|
xhci_dbg_trace(xhci, trace_xhci_dbg_ring_expansion,
|
||||||
"ring expansion succeed, now has %d segments",
|
"ring expansion succeed, now has %d segments",
|
||||||
|
@ -1199,8 +1199,6 @@ static void xhci_handle_cmd_stop_ep(struct xhci_hcd *xhci, int slot_id,
|
|||||||
* Keep retrying until the EP starts and stops again, on
|
* Keep retrying until the EP starts and stops again, on
|
||||||
* chips where this is known to help. Wait for 100ms.
|
* chips where this is known to help. Wait for 100ms.
|
||||||
*/
|
*/
|
||||||
if (!(xhci->quirks & XHCI_NEC_HOST))
|
|
||||||
break;
|
|
||||||
if (time_is_before_jiffies(ep->stop_time + msecs_to_jiffies(100)))
|
if (time_is_before_jiffies(ep->stop_time + msecs_to_jiffies(100)))
|
||||||
break;
|
break;
|
||||||
fallthrough;
|
fallthrough;
|
||||||
|
@ -625,6 +625,8 @@ static void option_instat_callback(struct urb *urb);
|
|||||||
#define MEIGSMART_PRODUCT_SRM825L 0x4d22
|
#define MEIGSMART_PRODUCT_SRM825L 0x4d22
|
||||||
/* MeiG Smart SLM320 based on UNISOC UIS8910 */
|
/* MeiG Smart SLM320 based on UNISOC UIS8910 */
|
||||||
#define MEIGSMART_PRODUCT_SLM320 0x4d41
|
#define MEIGSMART_PRODUCT_SLM320 0x4d41
|
||||||
|
/* MeiG Smart SLM770A based on ASR1803 */
|
||||||
|
#define MEIGSMART_PRODUCT_SLM770A 0x4d57
|
||||||
|
|
||||||
/* Device flags */
|
/* Device flags */
|
||||||
|
|
||||||
@ -1395,6 +1397,12 @@ static const struct usb_device_id option_ids[] = {
|
|||||||
.driver_info = RSVD(0) | NCTRL(2) | RSVD(3) | RSVD(4) },
|
.driver_info = RSVD(0) | NCTRL(2) | RSVD(3) | RSVD(4) },
|
||||||
{ USB_DEVICE_INTERFACE_CLASS(TELIT_VENDOR_ID, 0x10aa, 0xff), /* Telit FN920C04 (MBIM) */
|
{ USB_DEVICE_INTERFACE_CLASS(TELIT_VENDOR_ID, 0x10aa, 0xff), /* Telit FN920C04 (MBIM) */
|
||||||
.driver_info = NCTRL(3) | RSVD(4) | RSVD(5) },
|
.driver_info = NCTRL(3) | RSVD(4) | RSVD(5) },
|
||||||
|
{ USB_DEVICE_INTERFACE_CLASS(TELIT_VENDOR_ID, 0x10c0, 0xff), /* Telit FE910C04 (rmnet) */
|
||||||
|
.driver_info = RSVD(0) | NCTRL(3) },
|
||||||
|
{ USB_DEVICE_INTERFACE_CLASS(TELIT_VENDOR_ID, 0x10c4, 0xff), /* Telit FE910C04 (rmnet) */
|
||||||
|
.driver_info = RSVD(0) | NCTRL(3) },
|
||||||
|
{ USB_DEVICE_INTERFACE_CLASS(TELIT_VENDOR_ID, 0x10c8, 0xff), /* Telit FE910C04 (rmnet) */
|
||||||
|
.driver_info = RSVD(0) | NCTRL(2) | RSVD(3) | RSVD(4) },
|
||||||
{ USB_DEVICE(TELIT_VENDOR_ID, TELIT_PRODUCT_ME910),
|
{ USB_DEVICE(TELIT_VENDOR_ID, TELIT_PRODUCT_ME910),
|
||||||
.driver_info = NCTRL(0) | RSVD(1) | RSVD(3) },
|
.driver_info = NCTRL(0) | RSVD(1) | RSVD(3) },
|
||||||
{ USB_DEVICE(TELIT_VENDOR_ID, TELIT_PRODUCT_ME910_DUAL_MODEM),
|
{ USB_DEVICE(TELIT_VENDOR_ID, TELIT_PRODUCT_ME910_DUAL_MODEM),
|
||||||
@ -2247,6 +2255,8 @@ static const struct usb_device_id option_ids[] = {
|
|||||||
.driver_info = NCTRL(2) },
|
.driver_info = NCTRL(2) },
|
||||||
{ USB_DEVICE_AND_INTERFACE_INFO(MEDIATEK_VENDOR_ID, 0x7127, 0xff, 0x00, 0x00),
|
{ USB_DEVICE_AND_INTERFACE_INFO(MEDIATEK_VENDOR_ID, 0x7127, 0xff, 0x00, 0x00),
|
||||||
.driver_info = NCTRL(2) | NCTRL(3) | NCTRL(4) },
|
.driver_info = NCTRL(2) | NCTRL(3) | NCTRL(4) },
|
||||||
|
{ USB_DEVICE_AND_INTERFACE_INFO(MEDIATEK_VENDOR_ID, 0x7129, 0xff, 0x00, 0x00), /* MediaTek T7XX */
|
||||||
|
.driver_info = NCTRL(2) | NCTRL(3) | NCTRL(4) },
|
||||||
{ USB_DEVICE(CELLIENT_VENDOR_ID, CELLIENT_PRODUCT_MEN200) },
|
{ USB_DEVICE(CELLIENT_VENDOR_ID, CELLIENT_PRODUCT_MEN200) },
|
||||||
{ USB_DEVICE(CELLIENT_VENDOR_ID, CELLIENT_PRODUCT_MPL200),
|
{ USB_DEVICE(CELLIENT_VENDOR_ID, CELLIENT_PRODUCT_MPL200),
|
||||||
.driver_info = RSVD(1) | RSVD(4) },
|
.driver_info = RSVD(1) | RSVD(4) },
|
||||||
@ -2375,6 +2385,18 @@ static const struct usb_device_id option_ids[] = {
|
|||||||
{ USB_DEVICE_AND_INTERFACE_INFO(0x3731, 0x0116, 0xff, 0xff, 0x30) }, /* NetPrisma LCUK54-WWD for Golbal EDU */
|
{ USB_DEVICE_AND_INTERFACE_INFO(0x3731, 0x0116, 0xff, 0xff, 0x30) }, /* NetPrisma LCUK54-WWD for Golbal EDU */
|
||||||
{ USB_DEVICE_AND_INTERFACE_INFO(0x3731, 0x0116, 0xff, 0x00, 0x40) },
|
{ USB_DEVICE_AND_INTERFACE_INFO(0x3731, 0x0116, 0xff, 0x00, 0x40) },
|
||||||
{ USB_DEVICE_AND_INTERFACE_INFO(0x3731, 0x0116, 0xff, 0xff, 0x40) },
|
{ USB_DEVICE_AND_INTERFACE_INFO(0x3731, 0x0116, 0xff, 0xff, 0x40) },
|
||||||
|
{ USB_DEVICE_AND_INTERFACE_INFO(0x3731, 0x010a, 0xff, 0xff, 0x30) }, /* NetPrisma LCUK54-WRD for WWAN Ready */
|
||||||
|
{ USB_DEVICE_AND_INTERFACE_INFO(0x3731, 0x010a, 0xff, 0x00, 0x40) },
|
||||||
|
{ USB_DEVICE_AND_INTERFACE_INFO(0x3731, 0x010a, 0xff, 0xff, 0x40) },
|
||||||
|
{ USB_DEVICE_AND_INTERFACE_INFO(0x3731, 0x010b, 0xff, 0xff, 0x30) }, /* NetPrisma LCUK54-WWD for WWAN Ready */
|
||||||
|
{ USB_DEVICE_AND_INTERFACE_INFO(0x3731, 0x010b, 0xff, 0x00, 0x40) },
|
||||||
|
{ USB_DEVICE_AND_INTERFACE_INFO(0x3731, 0x010b, 0xff, 0xff, 0x40) },
|
||||||
|
{ USB_DEVICE_AND_INTERFACE_INFO(0x3731, 0x010c, 0xff, 0xff, 0x30) }, /* NetPrisma LCUK54-WRD for WWAN Ready */
|
||||||
|
{ USB_DEVICE_AND_INTERFACE_INFO(0x3731, 0x010c, 0xff, 0x00, 0x40) },
|
||||||
|
{ USB_DEVICE_AND_INTERFACE_INFO(0x3731, 0x010c, 0xff, 0xff, 0x40) },
|
||||||
|
{ USB_DEVICE_AND_INTERFACE_INFO(0x3731, 0x010d, 0xff, 0xff, 0x30) }, /* NetPrisma LCUK54-WWD for WWAN Ready */
|
||||||
|
{ USB_DEVICE_AND_INTERFACE_INFO(0x3731, 0x010d, 0xff, 0x00, 0x40) },
|
||||||
|
{ USB_DEVICE_AND_INTERFACE_INFO(0x3731, 0x010d, 0xff, 0xff, 0x40) },
|
||||||
{ USB_DEVICE_AND_INTERFACE_INFO(OPPO_VENDOR_ID, OPPO_PRODUCT_R11, 0xff, 0xff, 0x30) },
|
{ USB_DEVICE_AND_INTERFACE_INFO(OPPO_VENDOR_ID, OPPO_PRODUCT_R11, 0xff, 0xff, 0x30) },
|
||||||
{ USB_DEVICE_AND_INTERFACE_INFO(SIERRA_VENDOR_ID, SIERRA_PRODUCT_EM9191, 0xff, 0xff, 0x30) },
|
{ USB_DEVICE_AND_INTERFACE_INFO(SIERRA_VENDOR_ID, SIERRA_PRODUCT_EM9191, 0xff, 0xff, 0x30) },
|
||||||
{ USB_DEVICE_AND_INTERFACE_INFO(SIERRA_VENDOR_ID, SIERRA_PRODUCT_EM9191, 0xff, 0xff, 0x40) },
|
{ USB_DEVICE_AND_INTERFACE_INFO(SIERRA_VENDOR_ID, SIERRA_PRODUCT_EM9191, 0xff, 0xff, 0x40) },
|
||||||
@ -2382,9 +2404,14 @@ static const struct usb_device_id option_ids[] = {
|
|||||||
{ USB_DEVICE_AND_INTERFACE_INFO(UNISOC_VENDOR_ID, TOZED_PRODUCT_LT70C, 0xff, 0, 0) },
|
{ USB_DEVICE_AND_INTERFACE_INFO(UNISOC_VENDOR_ID, TOZED_PRODUCT_LT70C, 0xff, 0, 0) },
|
||||||
{ USB_DEVICE_AND_INTERFACE_INFO(UNISOC_VENDOR_ID, LUAT_PRODUCT_AIR720U, 0xff, 0, 0) },
|
{ USB_DEVICE_AND_INTERFACE_INFO(UNISOC_VENDOR_ID, LUAT_PRODUCT_AIR720U, 0xff, 0, 0) },
|
||||||
{ USB_DEVICE_AND_INTERFACE_INFO(MEIGSMART_VENDOR_ID, MEIGSMART_PRODUCT_SLM320, 0xff, 0, 0) },
|
{ USB_DEVICE_AND_INTERFACE_INFO(MEIGSMART_VENDOR_ID, MEIGSMART_PRODUCT_SLM320, 0xff, 0, 0) },
|
||||||
|
{ USB_DEVICE_AND_INTERFACE_INFO(MEIGSMART_VENDOR_ID, MEIGSMART_PRODUCT_SLM770A, 0xff, 0, 0) },
|
||||||
{ USB_DEVICE_AND_INTERFACE_INFO(MEIGSMART_VENDOR_ID, MEIGSMART_PRODUCT_SRM825L, 0xff, 0xff, 0x30) },
|
{ USB_DEVICE_AND_INTERFACE_INFO(MEIGSMART_VENDOR_ID, MEIGSMART_PRODUCT_SRM825L, 0xff, 0xff, 0x30) },
|
||||||
{ USB_DEVICE_AND_INTERFACE_INFO(MEIGSMART_VENDOR_ID, MEIGSMART_PRODUCT_SRM825L, 0xff, 0xff, 0x40) },
|
{ USB_DEVICE_AND_INTERFACE_INFO(MEIGSMART_VENDOR_ID, MEIGSMART_PRODUCT_SRM825L, 0xff, 0xff, 0x40) },
|
||||||
{ USB_DEVICE_AND_INTERFACE_INFO(MEIGSMART_VENDOR_ID, MEIGSMART_PRODUCT_SRM825L, 0xff, 0xff, 0x60) },
|
{ USB_DEVICE_AND_INTERFACE_INFO(MEIGSMART_VENDOR_ID, MEIGSMART_PRODUCT_SRM825L, 0xff, 0xff, 0x60) },
|
||||||
|
{ USB_DEVICE_INTERFACE_CLASS(0x1bbb, 0x0530, 0xff), /* TCL IK512 MBIM */
|
||||||
|
.driver_info = NCTRL(1) },
|
||||||
|
{ USB_DEVICE_INTERFACE_CLASS(0x1bbb, 0x0640, 0xff), /* TCL IK512 ECM */
|
||||||
|
.driver_info = NCTRL(3) },
|
||||||
{ } /* Terminating entry */
|
{ } /* Terminating entry */
|
||||||
};
|
};
|
||||||
MODULE_DEVICE_TABLE(usb, option_ids);
|
MODULE_DEVICE_TABLE(usb, option_ids);
|
||||||
|
Loading…
Reference in New Issue
Block a user