diff options
Diffstat (limited to 'drivers/usb/serial/qcserial.c')
| -rw-r--r-- | drivers/usb/serial/qcserial.c | 116 | 
1 files changed, 82 insertions, 34 deletions
diff --git a/drivers/usb/serial/qcserial.c b/drivers/usb/serial/qcserial.c index c65437cfd4a..b2aa003bf41 100644 --- a/drivers/usb/serial/qcserial.c +++ b/drivers/usb/serial/qcserial.c @@ -22,8 +22,17 @@  #define DRIVER_AUTHOR "Qualcomm Inc"  #define DRIVER_DESC "Qualcomm USB Serial driver" +/* standard device layouts supported by this driver */ +enum qcserial_layouts { +	QCSERIAL_G2K = 0,	/* Gobi 2000 */ +	QCSERIAL_G1K = 1,	/* Gobi 1000 */ +	QCSERIAL_SWI = 2,	/* Sierra Wireless */ +}; +  #define DEVICE_G1K(v, p) \ -	USB_DEVICE(v, p), .driver_info = 1 +	USB_DEVICE(v, p), .driver_info = QCSERIAL_G1K +#define DEVICE_SWI(v, p) \ +	USB_DEVICE(v, p), .driver_info = QCSERIAL_SWI  static const struct usb_device_id id_table[] = {  	/* Gobi 1000 devices */ @@ -126,19 +135,27 @@ static const struct usb_device_id id_table[] = {  	{USB_DEVICE(0x12D1, 0x14F1)},	/* Sony Gobi 3000 Composite */  	{USB_DEVICE(0x0AF0, 0x8120)},	/* Option GTM681W */ -	/* non Gobi Qualcomm serial devices */ -	{USB_DEVICE_INTERFACE_NUMBER(0x0f3d, 0x68a2, 0)},	/* Sierra Wireless MC7700 Device Management */ -	{USB_DEVICE_INTERFACE_NUMBER(0x0f3d, 0x68a2, 2)},	/* Sierra Wireless MC7700 NMEA */ -	{USB_DEVICE_INTERFACE_NUMBER(0x0f3d, 0x68a2, 3)},	/* Sierra Wireless MC7700 Modem */ -	{USB_DEVICE_INTERFACE_NUMBER(0x114f, 0x68a2, 0)},	/* Sierra Wireless MC7750 Device Management */ -	{USB_DEVICE_INTERFACE_NUMBER(0x114f, 0x68a2, 2)},	/* Sierra Wireless MC7750 NMEA */ -	{USB_DEVICE_INTERFACE_NUMBER(0x114f, 0x68a2, 3)},	/* Sierra Wireless MC7750 Modem */ -	{USB_DEVICE_INTERFACE_NUMBER(0x1199, 0x68a2, 0)},	/* Sierra Wireless MC7710 Device Management */ -	{USB_DEVICE_INTERFACE_NUMBER(0x1199, 0x68a2, 2)},	/* Sierra Wireless MC7710 NMEA */ -	{USB_DEVICE_INTERFACE_NUMBER(0x1199, 0x68a2, 3)},	/* Sierra Wireless MC7710 Modem */ -	{USB_DEVICE_INTERFACE_NUMBER(0x1199, 0x901c, 0)},	/* Sierra Wireless EM7700 Device Management */ -	{USB_DEVICE_INTERFACE_NUMBER(0x1199, 0x901c, 2)},	/* Sierra Wireless EM7700 NMEA */ -	{USB_DEVICE_INTERFACE_NUMBER(0x1199, 0x901c, 3)},	/* Sierra Wireless EM7700 Modem */ +	/* non-Gobi Sierra Wireless devices */ +	{DEVICE_SWI(0x0f3d, 0x68a2)},	/* Sierra Wireless MC7700 */ +	{DEVICE_SWI(0x114f, 0x68a2)},	/* Sierra Wireless MC7750 */ +	{DEVICE_SWI(0x1199, 0x68a2)},	/* Sierra Wireless MC7710 */ +	{DEVICE_SWI(0x1199, 0x68c0)},	/* Sierra Wireless MC73xx */ +	{DEVICE_SWI(0x1199, 0x901c)},	/* Sierra Wireless EM7700 */ +	{DEVICE_SWI(0x1199, 0x901f)},	/* Sierra Wireless EM7355 */ +	{DEVICE_SWI(0x1199, 0x9040)},	/* Sierra Wireless Modem */ +	{DEVICE_SWI(0x1199, 0x9041)},	/* Sierra Wireless MC7305/MC7355 */ +	{DEVICE_SWI(0x1199, 0x9051)},	/* Netgear AirCard 340U */ +	{DEVICE_SWI(0x1199, 0x9053)},	/* Sierra Wireless Modem */ +	{DEVICE_SWI(0x1199, 0x9054)},	/* Sierra Wireless Modem */ +	{DEVICE_SWI(0x1199, 0x9055)},	/* Netgear AirCard 341U */ +	{DEVICE_SWI(0x1199, 0x9056)},	/* Sierra Wireless Modem */ +	{DEVICE_SWI(0x1199, 0x9060)},	/* Sierra Wireless Modem */ +	{DEVICE_SWI(0x1199, 0x9061)},	/* Sierra Wireless Modem */ +	{DEVICE_SWI(0x413c, 0x81a2)},	/* Dell Wireless 5806 Gobi(TM) 4G LTE Mobile Broadband Card */ +	{DEVICE_SWI(0x413c, 0x81a3)},	/* Dell Wireless 5570 HSPA+ (42Mbps) Mobile Broadband Card */ +	{DEVICE_SWI(0x413c, 0x81a4)},	/* Dell Wireless 5570e HSPA+ (42Mbps) Mobile Broadband Card */ +	{DEVICE_SWI(0x413c, 0x81a8)},	/* Dell Wireless 5808 Gobi(TM) 4G LTE Mobile Broadband Card */ +	{DEVICE_SWI(0x413c, 0x81a9)},	/* Dell Wireless 5808e Gobi(TM) 4G LTE Mobile Broadband Card */  	{ }				/* Terminating entry */  }; @@ -151,11 +168,8 @@ static int qcprobe(struct usb_serial *serial, const struct usb_device_id *id)  	int retval = -ENODEV;  	__u8 nintf;  	__u8 ifnum; -	bool is_gobi1k = id->driver_info ? true : false;  	int altsetting = -1; -	dev_dbg(dev, "Is Gobi 1000 = %d\n", is_gobi1k); -  	nintf = serial->dev->actconfig->desc.bNumInterfaces;  	dev_dbg(dev, "Num Interfaces = %d\n", nintf);  	ifnum = intf->desc.bInterfaceNumber; @@ -183,32 +197,29 @@ static int qcprobe(struct usb_serial *serial, const struct usb_device_id *id)  	} -	/* allow any number of interfaces when doing direct interface match */ -	if (id->match_flags & USB_DEVICE_ID_MATCH_INT_NUMBER) { -		dev_dbg(dev, "Generic Qualcomm serial interface found\n"); -		altsetting = 0; -		goto done; -	} - -	if (nintf < 3 || nintf > 4) { -		dev_err(dev, "unknown number of interfaces: %d\n", nintf); -		goto done; -	} -  	/* default to enabling interface */  	altsetting = 0; -	/* Composite mode; don't bind to the QMI/net interface as that +	/* +	 * Composite mode; don't bind to the QMI/net interface as that  	 * gets handled by other drivers.  	 */ -	if (is_gobi1k) { -		/* Gobi 1K USB layout: +	switch (id->driver_info) { +	case QCSERIAL_G1K: +		/* +		 * Gobi 1K USB layout:  		 * 0: DM/DIAG (use libqcdm from ModemManager for communication)  		 * 1: serial port (doesn't respond)  		 * 2: AT-capable modem port  		 * 3: QMI/net  		 */ +		if (nintf < 3 || nintf > 4) { +			dev_err(dev, "unknown number of interfaces: %d\n", nintf); +			altsetting = -1; +			goto done; +		} +  		if (ifnum == 0) {  			dev_dbg(dev, "Gobi 1K DM/DIAG interface found\n");  			altsetting = 1; @@ -216,13 +227,21 @@ static int qcprobe(struct usb_serial *serial, const struct usb_device_id *id)  			dev_dbg(dev, "Modem port found\n");  		else  			altsetting = -1; -	} else { -		/* Gobi 2K+ USB layout: +		break; +	case QCSERIAL_G2K: +		/* +		 * Gobi 2K+ USB layout:  		 * 0: QMI/net  		 * 1: DM/DIAG (use libqcdm from ModemManager for communication)  		 * 2: AT-capable modem port  		 * 3: NMEA  		 */ +		if (nintf < 3 || nintf > 4) { +			dev_err(dev, "unknown number of interfaces: %d\n", nintf); +			altsetting = -1; +			goto done; +		} +  		switch (ifnum) {  		case 0:  			/* Don't claim the QMI/net interface */ @@ -243,6 +262,35 @@ static int qcprobe(struct usb_serial *serial, const struct usb_device_id *id)  			dev_dbg(dev, "Gobi 2K+ NMEA GPS interface found\n");  			break;  		} +		break; +	case QCSERIAL_SWI: +		/* +		 * Sierra Wireless layout: +		 * 0: DM/DIAG (use libqcdm from ModemManager for communication) +		 * 2: NMEA +		 * 3: AT-capable modem port +		 * 8: QMI/net +		 */ +		switch (ifnum) { +		case 0: +			dev_dbg(dev, "DM/DIAG interface found\n"); +			break; +		case 2: +			dev_dbg(dev, "NMEA GPS interface found\n"); +			break; +		case 3: +			dev_dbg(dev, "Modem port found\n"); +			break; +		default: +			/* don't claim any unsupported interface */ +			altsetting = -1; +			break; +		} +		break; +	default: +		dev_err(dev, "unsupported device layout type: %lu\n", +			id->driver_info); +		break;  	}  done:  | 
