diff options
Diffstat (limited to 'drivers/net/usb/qmi_wwan.c')
| -rw-r--r-- | drivers/net/usb/qmi_wwan.c | 310 | 
1 files changed, 72 insertions, 238 deletions
diff --git a/drivers/net/usb/qmi_wwan.c b/drivers/net/usb/qmi_wwan.c index 2ea126a16d7..6883c371c59 100644 --- a/drivers/net/usb/qmi_wwan.c +++ b/drivers/net/usb/qmi_wwan.c @@ -108,7 +108,7 @@ static int qmi_wwan_register_subdriver(struct usbnet *dev)  	atomic_set(&info->pmcount, 0);  	/* register subdriver */ -	subdriver = usb_cdc_wdm_register(info->control, &dev->status->desc, 512, &qmi_wwan_cdc_wdm_manage_power); +	subdriver = usb_cdc_wdm_register(info->control, &dev->status->desc, 4096, &qmi_wwan_cdc_wdm_manage_power);  	if (IS_ERR(subdriver)) {  		dev_err(&info->control->dev, "subdriver registration failed\n");  		rv = PTR_ERR(subdriver); @@ -139,10 +139,18 @@ static int qmi_wwan_bind(struct usbnet *dev, struct usb_interface *intf)  	BUILD_BUG_ON((sizeof(((struct usbnet *)0)->data) < sizeof(struct qmi_wwan_state))); -	/* require a single interrupt status endpoint for subdriver */ +	/* control and data is shared? */ +	if (intf->cur_altsetting->desc.bNumEndpoints == 3) { +		info->control = intf; +		info->data = intf; +		goto shared; +	} + +	/* else require a single interrupt status endpoint on control intf */  	if (intf->cur_altsetting->desc.bNumEndpoints != 1)  		goto err; +	/* and a number of CDC descriptors */  	while (len > 3) {  		struct usb_descriptor_header *h = (void *)buf; @@ -231,8 +239,9 @@ next_desc:  	if (status < 0)  		goto err; +shared:  	status = qmi_wwan_register_subdriver(dev); -	if (status < 0) { +	if (status < 0 && info->control != info->data) {  		usb_set_intfdata(info->data, NULL);  		usb_driver_release_interface(driver, info->data);  	} @@ -241,38 +250,6 @@ err:  	return status;  } -/* Some devices combine the "control" and "data" functions into a - * single interface with all three endpoints: interrupt + bulk in and - * out - */ -static int qmi_wwan_bind_shared(struct usbnet *dev, struct usb_interface *intf) -{ -	int rv; -	struct qmi_wwan_state *info = (void *)&dev->data; - -	/* ZTE makes devices where the interface descriptors and endpoint -	 * configurations of two or more interfaces are identical, even -	 * though the functions are completely different.  If set, then -	 * driver_info->data is a bitmap of acceptable interface numbers -	 * allowing us to bind to one such interface without binding to -	 * all of them -	 */ -	if (dev->driver_info->data && -	    !test_bit(intf->cur_altsetting->desc.bInterfaceNumber, &dev->driver_info->data)) { -		dev_info(&intf->dev, "not on our whitelist - ignored"); -		rv = -ENODEV; -		goto err; -	} - -	/*  control and data is shared */ -	info->control = intf; -	info->data = intf; -	rv = qmi_wwan_register_subdriver(dev); - -err: -	return rv; -} -  static void qmi_wwan_unbind(struct usbnet *dev, struct usb_interface *intf)  {  	struct qmi_wwan_state *info = (void *)&dev->data; @@ -315,7 +292,7 @@ static int qmi_wwan_suspend(struct usb_interface *intf, pm_message_t message)  	if (ret < 0)  		goto err; -	if (info->subdriver && info->subdriver->suspend) +	if (intf == info->control && info->subdriver && info->subdriver->suspend)  		ret = info->subdriver->suspend(intf, message);  	if (ret < 0)  		usbnet_resume(intf); @@ -328,13 +305,14 @@ static int qmi_wwan_resume(struct usb_interface *intf)  	struct usbnet *dev = usb_get_intfdata(intf);  	struct qmi_wwan_state *info = (void *)&dev->data;  	int ret = 0; +	bool callsub = (intf == info->control && info->subdriver && info->subdriver->resume); -	if (info->subdriver && info->subdriver->resume) +	if (callsub)  		ret = info->subdriver->resume(intf);  	if (ret < 0)  		goto err;  	ret = usbnet_resume(intf); -	if (ret < 0 && info->subdriver && info->subdriver->resume && info->subdriver->suspend) +	if (ret < 0 && callsub && info->subdriver->suspend)  		info->subdriver->suspend(intf, PMSG_SUSPEND);  err:  	return ret; @@ -348,225 +326,71 @@ static const struct driver_info	qmi_wwan_info = {  	.manage_power	= qmi_wwan_manage_power,  }; -static const struct driver_info	qmi_wwan_shared = { -	.description	= "WWAN/QMI device", -	.flags		= FLAG_WWAN, -	.bind		= qmi_wwan_bind_shared, -	.unbind		= qmi_wwan_unbind, -	.manage_power	= qmi_wwan_manage_power, -}; - -static const struct driver_info	qmi_wwan_force_int0 = { -	.description	= "Qualcomm WWAN/QMI device", -	.flags		= FLAG_WWAN, -	.bind		= qmi_wwan_bind_shared, -	.unbind		= qmi_wwan_unbind, -	.manage_power	= qmi_wwan_manage_power, -	.data		= BIT(0), /* interface whitelist bitmap */ -}; - -static const struct driver_info	qmi_wwan_force_int1 = { -	.description	= "Qualcomm WWAN/QMI device", -	.flags		= FLAG_WWAN, -	.bind		= qmi_wwan_bind_shared, -	.unbind		= qmi_wwan_unbind, -	.manage_power	= qmi_wwan_manage_power, -	.data		= BIT(1), /* interface whitelist bitmap */ -}; - -static const struct driver_info qmi_wwan_force_int2 = { -	.description	= "Qualcomm WWAN/QMI device", -	.flags		= FLAG_WWAN, -	.bind		= qmi_wwan_bind_shared, -	.unbind		= qmi_wwan_unbind, -	.manage_power	= qmi_wwan_manage_power, -	.data		= BIT(2), /* interface whitelist bitmap */ -}; - -static const struct driver_info	qmi_wwan_force_int3 = { -	.description	= "Qualcomm WWAN/QMI device", -	.flags		= FLAG_WWAN, -	.bind		= qmi_wwan_bind_shared, -	.unbind		= qmi_wwan_unbind, -	.manage_power	= qmi_wwan_manage_power, -	.data		= BIT(3), /* interface whitelist bitmap */ -}; - -static const struct driver_info	qmi_wwan_force_int4 = { -	.description	= "Qualcomm WWAN/QMI device", -	.flags		= FLAG_WWAN, -	.bind		= qmi_wwan_bind_shared, -	.unbind		= qmi_wwan_unbind, -	.manage_power	= qmi_wwan_manage_power, -	.data		= BIT(4), /* interface whitelist bitmap */ -}; - -/* Sierra Wireless provide equally useless interface descriptors - * Devices in QMI mode can be switched between two different - * configurations: - *   a) USB interface #8 is QMI/wwan - *   b) USB interfaces #8, #19 and #20 are QMI/wwan - * - * Both configurations provide a number of other interfaces (serial++), - * some of which have the same endpoint configuration as we expect, so - * a whitelist or blacklist is necessary. - * - * FIXME: The below whitelist should include BIT(20).  It does not - * because I cannot get it to work... - */ -static const struct driver_info	qmi_wwan_sierra = { -	.description	= "Sierra Wireless wwan/QMI device", -	.flags		= FLAG_WWAN, -	.bind		= qmi_wwan_bind_shared, -	.unbind		= qmi_wwan_unbind, -	.manage_power	= qmi_wwan_manage_power, -	.data		= BIT(8) | BIT(19), /* interface whitelist bitmap */ -}; -  #define HUAWEI_VENDOR_ID	0x12D1 +/* map QMI/wwan function by a fixed interface number */ +#define QMI_FIXED_INTF(vend, prod, num) \ +	USB_DEVICE_INTERFACE_NUMBER(vend, prod, num), \ +	.driver_info = (unsigned long)&qmi_wwan_info +  /* Gobi 1000 QMI/wwan interface number is 3 according to qcserial */  #define QMI_GOBI1K_DEVICE(vend, prod) \ -	USB_DEVICE(vend, prod), \ -	.driver_info = (unsigned long)&qmi_wwan_force_int3 +	QMI_FIXED_INTF(vend, prod, 3) -/* Gobi 2000 and Gobi 3000 QMI/wwan interface number is 0 according to qcserial */ +/* Gobi 2000/3000 QMI/wwan interface number is 0 according to qcserial */  #define QMI_GOBI_DEVICE(vend, prod) \ -	USB_DEVICE(vend, prod), \ -	.driver_info = (unsigned long)&qmi_wwan_force_int0 +	QMI_FIXED_INTF(vend, prod, 0)  static const struct usb_device_id products[] = { +	/* 1. CDC ECM like devices match on the control interface */  	{	/* Huawei E392, E398 and possibly others sharing both device id and more... */ -		.match_flags        = USB_DEVICE_ID_MATCH_VENDOR | USB_DEVICE_ID_MATCH_INT_INFO, -		.idVendor           = HUAWEI_VENDOR_ID, -		.bInterfaceClass    = USB_CLASS_VENDOR_SPEC, -		.bInterfaceSubClass = 1, -		.bInterfaceProtocol = 9, /* CDC Ethernet *control* interface */ +		USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, USB_CLASS_VENDOR_SPEC, 1, 9),  		.driver_info        = (unsigned long)&qmi_wwan_info,  	},  	{	/* Vodafone/Huawei K5005 (12d1:14c8) and similar modems */ -		.match_flags        = USB_DEVICE_ID_MATCH_VENDOR | USB_DEVICE_ID_MATCH_INT_INFO, -		.idVendor           = HUAWEI_VENDOR_ID, -		.bInterfaceClass    = USB_CLASS_VENDOR_SPEC, -		.bInterfaceSubClass = 1, -		.bInterfaceProtocol = 57, /* CDC Ethernet *control* interface */ +		USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, USB_CLASS_VENDOR_SPEC, 1, 57),  		.driver_info        = (unsigned long)&qmi_wwan_info,  	}, -	{	/* Huawei E392, E398 and possibly others in "Windows mode" -		 * using a combined control and data interface without any CDC -		 * functional descriptors -		 */ -		.match_flags        = USB_DEVICE_ID_MATCH_VENDOR | USB_DEVICE_ID_MATCH_INT_INFO, -		.idVendor           = HUAWEI_VENDOR_ID, -		.bInterfaceClass    = USB_CLASS_VENDOR_SPEC, -		.bInterfaceSubClass = 1, -		.bInterfaceProtocol = 17, -		.driver_info        = (unsigned long)&qmi_wwan_shared, -	}, -	{	/* Pantech UML290 */ -		.match_flags	    = USB_DEVICE_ID_MATCH_DEVICE | USB_DEVICE_ID_MATCH_INT_INFO, -		.idVendor           = 0x106c, -		.idProduct          = 0x3718, -		.bInterfaceClass    = 0xff, -		.bInterfaceSubClass = 0xf0, -		.bInterfaceProtocol = 0xff, -		.driver_info        = (unsigned long)&qmi_wwan_shared, -	}, -	{	/* ZTE MF820D */ -		.match_flags	    = USB_DEVICE_ID_MATCH_DEVICE | USB_DEVICE_ID_MATCH_INT_INFO, -		.idVendor           = 0x19d2, -		.idProduct          = 0x0167, -		.bInterfaceClass    = 0xff, -		.bInterfaceSubClass = 0xff, -		.bInterfaceProtocol = 0xff, -		.driver_info        = (unsigned long)&qmi_wwan_force_int4, -	}, -	{	/* ZTE MF821D */ -		.match_flags        = USB_DEVICE_ID_MATCH_DEVICE | USB_DEVICE_ID_MATCH_INT_INFO, -		.idVendor           = 0x19d2, -		.idProduct          = 0x0326, -		.bInterfaceClass    = 0xff, -		.bInterfaceSubClass = 0xff, -		.bInterfaceProtocol = 0xff, -		.driver_info        = (unsigned long)&qmi_wwan_force_int4, -	}, -	{	/* ZTE (Vodafone) K3520-Z */ -		.match_flags	    = USB_DEVICE_ID_MATCH_DEVICE | USB_DEVICE_ID_MATCH_INT_INFO, -		.idVendor           = 0x19d2, -		.idProduct          = 0x0055, -		.bInterfaceClass    = 0xff, -		.bInterfaceSubClass = 0xff, -		.bInterfaceProtocol = 0xff, -		.driver_info        = (unsigned long)&qmi_wwan_force_int1, -	}, -	{	/* ZTE (Vodafone) K3565-Z */ -		.match_flags	    = USB_DEVICE_ID_MATCH_DEVICE | USB_DEVICE_ID_MATCH_INT_INFO, -		.idVendor           = 0x19d2, -		.idProduct          = 0x0063, -		.bInterfaceClass    = 0xff, -		.bInterfaceSubClass = 0xff, -		.bInterfaceProtocol = 0xff, -		.driver_info        = (unsigned long)&qmi_wwan_force_int4, -	}, -	{	/* ZTE (Vodafone) K3570-Z */ -		.match_flags	    = USB_DEVICE_ID_MATCH_DEVICE | USB_DEVICE_ID_MATCH_INT_INFO, -		.idVendor           = 0x19d2, -		.idProduct          = 0x1008, -		.bInterfaceClass    = 0xff, -		.bInterfaceSubClass = 0xff, -		.bInterfaceProtocol = 0xff, -		.driver_info        = (unsigned long)&qmi_wwan_force_int4, -	}, -	{	/* ZTE (Vodafone) K3571-Z */ -		.match_flags	    = USB_DEVICE_ID_MATCH_DEVICE | USB_DEVICE_ID_MATCH_INT_INFO, -		.idVendor           = 0x19d2, -		.idProduct          = 0x1010, -		.bInterfaceClass    = 0xff, -		.bInterfaceSubClass = 0xff, -		.bInterfaceProtocol = 0xff, -		.driver_info        = (unsigned long)&qmi_wwan_force_int4, -	}, -	{	/* ZTE (Vodafone) K3765-Z */ -		.match_flags	    = USB_DEVICE_ID_MATCH_DEVICE | USB_DEVICE_ID_MATCH_INT_INFO, -		.idVendor           = 0x19d2, -		.idProduct          = 0x2002, -		.bInterfaceClass    = 0xff, -		.bInterfaceSubClass = 0xff, -		.bInterfaceProtocol = 0xff, -		.driver_info        = (unsigned long)&qmi_wwan_force_int4, + +	/* 2. Combined interface devices matching on class+protocol */ +	{	/* Huawei E367 and possibly others in "Windows mode" */ +		USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, USB_CLASS_VENDOR_SPEC, 1, 7), +		.driver_info        = (unsigned long)&qmi_wwan_info,  	}, -	{	/* ZTE (Vodafone) K4505-Z */ -		.match_flags	    = USB_DEVICE_ID_MATCH_DEVICE | USB_DEVICE_ID_MATCH_INT_INFO, -		.idVendor           = 0x19d2, -		.idProduct          = 0x0104, -		.bInterfaceClass    = 0xff, -		.bInterfaceSubClass = 0xff, -		.bInterfaceProtocol = 0xff, -		.driver_info        = (unsigned long)&qmi_wwan_force_int4, +	{	/* Huawei E392, E398 and possibly others in "Windows mode" */ +		USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, USB_CLASS_VENDOR_SPEC, 1, 17), +		.driver_info        = (unsigned long)&qmi_wwan_info,  	}, -	{	/* ZTE MF60 */ -		.match_flags	    = USB_DEVICE_ID_MATCH_DEVICE | USB_DEVICE_ID_MATCH_INT_INFO, -		.idVendor           = 0x19d2, -		.idProduct          = 0x1402, -		.bInterfaceClass    = 0xff, -		.bInterfaceSubClass = 0xff, -		.bInterfaceProtocol = 0xff, -		.driver_info        = (unsigned long)&qmi_wwan_force_int2, +	{	/* Pantech UML290, P4200 and more */ +		USB_VENDOR_AND_INTERFACE_INFO(0x106c, USB_CLASS_VENDOR_SPEC, 0xf0, 0xff), +		.driver_info        = (unsigned long)&qmi_wwan_info,  	}, -	{	/* Sierra Wireless MC77xx in QMI mode */ -		.match_flags	    = USB_DEVICE_ID_MATCH_DEVICE | USB_DEVICE_ID_MATCH_INT_INFO, -		.idVendor           = 0x1199, -		.idProduct          = 0x68a2, -		.bInterfaceClass    = 0xff, -		.bInterfaceSubClass = 0xff, -		.bInterfaceProtocol = 0xff, -		.driver_info        = (unsigned long)&qmi_wwan_sierra, +	{	/* Pantech UML290 - newer firmware */ +		USB_VENDOR_AND_INTERFACE_INFO(0x106c, USB_CLASS_VENDOR_SPEC, 0xf1, 0xff), +		.driver_info        = (unsigned long)&qmi_wwan_info,  	}, -	/* Gobi 1000 devices */ +	/* 3. Combined interface devices matching on interface number */ +	{QMI_FIXED_INTF(0x19d2, 0x0055, 1)},	/* ZTE (Vodafone) K3520-Z */ +	{QMI_FIXED_INTF(0x19d2, 0x0063, 4)},	/* ZTE (Vodafone) K3565-Z */ +	{QMI_FIXED_INTF(0x19d2, 0x0104, 4)},	/* ZTE (Vodafone) K4505-Z */ +	{QMI_FIXED_INTF(0x19d2, 0x0157, 5)},	/* ZTE MF683 */ +	{QMI_FIXED_INTF(0x19d2, 0x0167, 4)},	/* ZTE MF820D */ +	{QMI_FIXED_INTF(0x19d2, 0x0326, 4)},	/* ZTE MF821D */ +	{QMI_FIXED_INTF(0x19d2, 0x1008, 4)},	/* ZTE (Vodafone) K3570-Z */ +	{QMI_FIXED_INTF(0x19d2, 0x1010, 4)},	/* ZTE (Vodafone) K3571-Z */ +	{QMI_FIXED_INTF(0x19d2, 0x1018, 3)},	/* ZTE (Vodafone) K5006-Z */ +	{QMI_FIXED_INTF(0x19d2, 0x1402, 2)},	/* ZTE MF60 */ +	{QMI_FIXED_INTF(0x19d2, 0x2002, 4)},	/* ZTE (Vodafone) K3765-Z */ +	{QMI_FIXED_INTF(0x0f3d, 0x68a2, 8)},    /* Sierra Wireless MC7700 */ +	{QMI_FIXED_INTF(0x114f, 0x68a2, 8)},    /* Sierra Wireless MC7750 */ +	{QMI_FIXED_INTF(0x1199, 0x68a2, 8)},	/* Sierra Wireless MC7710 in QMI mode */ +	{QMI_FIXED_INTF(0x1199, 0x68a2, 19)},	/* Sierra Wireless MC7710 in QMI mode */ +	{QMI_FIXED_INTF(0x1199, 0x901c, 8)},    /* Sierra Wireless EM7700 */ + +	/* 4. Gobi 1000 devices */  	{QMI_GOBI1K_DEVICE(0x05c6, 0x9212)},	/* Acer Gobi Modem Device */  	{QMI_GOBI1K_DEVICE(0x03f0, 0x1f1d)},	/* HP un2400 Gobi Modem Device */ -	{QMI_GOBI1K_DEVICE(0x03f0, 0x371d)},	/* HP un2430 Mobile Broadband Module */  	{QMI_GOBI1K_DEVICE(0x04da, 0x250d)},	/* Panasonic Gobi Modem device */  	{QMI_GOBI1K_DEVICE(0x413c, 0x8172)},	/* Dell Gobi Modem device */  	{QMI_GOBI1K_DEVICE(0x1410, 0xa001)},	/* Novatel Gobi Modem device */ @@ -579,9 +403,11 @@ static const struct usb_device_id products[] = {  	{QMI_GOBI1K_DEVICE(0x05c6, 0x9222)},	/* Generic Gobi Modem device */  	{QMI_GOBI1K_DEVICE(0x05c6, 0x9009)},	/* Generic Gobi Modem device */ -	/* Gobi 2000 and 3000 devices */ +	/* 5. Gobi 2000 and 3000 devices */  	{QMI_GOBI_DEVICE(0x413c, 0x8186)},	/* Dell Gobi 2000 Modem device (N0218, VU936) */ +	{QMI_GOBI_DEVICE(0x413c, 0x8194)},	/* Dell Gobi 3000 Composite */  	{QMI_GOBI_DEVICE(0x05c6, 0x920b)},	/* Generic Gobi 2000 Modem device */ +	{QMI_GOBI_DEVICE(0x05c6, 0x920d)},	/* Gobi 3000 Composite */  	{QMI_GOBI_DEVICE(0x05c6, 0x9225)},	/* Sony Gobi 2000 Modem device (N0279, VU730) */  	{QMI_GOBI_DEVICE(0x05c6, 0x9245)},	/* Samsung Gobi 2000 Modem device (VL176) */  	{QMI_GOBI_DEVICE(0x03f0, 0x251d)},	/* HP Gobi 2000 Modem device (VP412) */ @@ -589,6 +415,8 @@ static const struct usb_device_id products[] = {  	{QMI_GOBI_DEVICE(0x05c6, 0x9265)},	/* Asus Gobi 2000 Modem device (VR305) */  	{QMI_GOBI_DEVICE(0x05c6, 0x9235)},	/* Top Global Gobi 2000 Modem device (VR306) */  	{QMI_GOBI_DEVICE(0x05c6, 0x9275)},	/* iRex Technologies Gobi 2000 Modem device (VR307) */ +	{QMI_GOBI_DEVICE(0x1199, 0x68a5)},	/* Sierra Wireless Modem */ +	{QMI_GOBI_DEVICE(0x1199, 0x68a9)},	/* Sierra Wireless Modem */  	{QMI_GOBI_DEVICE(0x1199, 0x9001)},	/* Sierra Wireless Gobi 2000 Modem device (VT773) */  	{QMI_GOBI_DEVICE(0x1199, 0x9002)},	/* Sierra Wireless Gobi 2000 Modem device (VT773) */  	{QMI_GOBI_DEVICE(0x1199, 0x9003)},	/* Sierra Wireless Gobi 2000 Modem device (VT773) */ @@ -600,11 +428,17 @@ static const struct usb_device_id products[] = {  	{QMI_GOBI_DEVICE(0x1199, 0x9009)},	/* Sierra Wireless Gobi 2000 Modem device (VT773) */  	{QMI_GOBI_DEVICE(0x1199, 0x900a)},	/* Sierra Wireless Gobi 2000 Modem device (VT773) */  	{QMI_GOBI_DEVICE(0x1199, 0x9011)},	/* Sierra Wireless Gobi 2000 Modem device (MC8305) */ +	{QMI_FIXED_INTF(0x1199, 0x9011, 5)},	/* alternate interface number!? */  	{QMI_GOBI_DEVICE(0x16d8, 0x8002)},	/* CMDTech Gobi 2000 Modem device (VU922) */  	{QMI_GOBI_DEVICE(0x05c6, 0x9205)},	/* Gobi 2000 Modem device */  	{QMI_GOBI_DEVICE(0x1199, 0x9013)},	/* Sierra Wireless Gobi 3000 Modem device (MC8355) */ +	{QMI_GOBI_DEVICE(0x03f0, 0x371d)},	/* HP un2430 Mobile Broadband Module */  	{QMI_GOBI_DEVICE(0x1199, 0x9015)},	/* Sierra Wireless Gobi 3000 Modem device */  	{QMI_GOBI_DEVICE(0x1199, 0x9019)},	/* Sierra Wireless Gobi 3000 Modem device */ +	{QMI_GOBI_DEVICE(0x1199, 0x901b)},	/* Sierra Wireless MC7770 */ +	{QMI_GOBI_DEVICE(0x12d1, 0x14f1)},	/* Sony Gobi 3000 Composite */ +	{QMI_GOBI_DEVICE(0x1410, 0xa021)},	/* Foxconn Gobi 3000 Modem device (Novatel E396) */ +  	{ }					/* END */  };  MODULE_DEVICE_TABLE(usb, products); @@ -620,7 +454,7 @@ static int qmi_wwan_probe(struct usb_interface *intf, const struct usb_device_id  	 */  	if (!id->driver_info) {  		dev_dbg(&intf->dev, "setting defaults for dynamic device id\n"); -		id->driver_info = (unsigned long)&qmi_wwan_shared; +		id->driver_info = (unsigned long)&qmi_wwan_info;  	}  	return usbnet_probe(intf, id);  |