USB-serial updates for v3.19-rc1

These changes add a new "simple" driver for Google USB-serial
 devices and add support for Huawei Gobi modems to qcserial.
 
 Included are also some removals of unnecessary atomic allocations and
 a few spelling fixes.
 
 Signed-off-by: Johan Hovold <johan@kernel.org>
 -----BEGIN PGP SIGNATURE-----
 Version: GnuPG v2
 
 iQIcBAABAgAGBQJUdgpuAAoJEEEN5E/e4bSVaJQQALOUxnD2buLDycTzKDhaPfxd
 iRAHkPWWFOnMGiSQ2gzxgYVVg+qqFMPZkRSHo+/eBpOjKZsVITavyD3W0h5JHJ9S
 yOCH3/tSU1w6P5zTN22qwrOvQ0R1+h+KSc7r8c2tXw2G8DXDog4qKDWRAh0IJiro
 E6qR9yvTcwgXWXN4eMsmUNotiC7lMeMpk1pW8BJlALQ66CNkCJNQ6j5J0d9L8pTA
 JaTBgMFWOniSVLGvWz6ylBEN3Xd8OWcHKpDsJoLIm/urWLazhjMtQpr//YsyyIvl
 uFVB7ejt2fi18ae+2Tv3VojGYuY5Hk4oRgtZjoTceSks65HBSdNnqcUXrWkJOMLy
 So59wUzZMD2KVjtVW1vzLtwcZwbyrVntW+8Nm7skFDVVBY041r5fgsIJ1weWz7c4
 sGUmF0Gkr/rK8yn6BPoUvRun5hdxySr1dl+sTZdD+ATwZpAV6YsThwd38csFxeG5
 MLKFbksm2dFCyczyINkp/39bHlWr8LQmZbuxHa09sklaM97z08duuDJlTdcUK089
 ZDRI1kviGYeib4OXljHXrWV1E9FVE85kkKBL9BHYfX85nf8RVv++ZB1vqYjQfhUJ
 Pj7vXsae++e4AeAZNTE8060QLgpSZMAVqOwAuous+mb0piPp5uHYhBmrQhPqhcXP
 5zPUrKOL63AsTnKNgHyX
 =m/eD
 -----END PGP SIGNATURE-----

Merge tag 'usb-serial-3.19-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/johan/usb-serial into usb-next

Johan writes:

USB-serial updates for v3.19-rc1

These changes add a new "simple" driver for Google USB-serial
devices and add support for Huawei Gobi modems to qcserial.

Included are also some removals of unnecessary atomic allocations and
a few spelling fixes.

Signed-off-by: Johan Hovold <johan@kernel.org>
This commit is contained in:
Greg Kroah-Hartman 2014-11-26 10:41:46 -08:00
commit 9f10adc544
8 changed files with 60 additions and 16 deletions

View File

@ -145,7 +145,7 @@ Keyspan PDA Serial Adapter
Single port DB-9 serial adapter, pushed as a PDA adapter for iMacs (mostly Single port DB-9 serial adapter, pushed as a PDA adapter for iMacs (mostly
sold in Macintosh catalogs, comes in a translucent white/green dongle). sold in Macintosh catalogs, comes in a translucent white/green dongle).
Fairly simple device. Firmware is homebrew. Fairly simple device. Firmware is homebrew.
This driver also works for the Xircom/Entrgra single port serial adapter. This driver also works for the Xircom/Entrega single port serial adapter.
Current status: Current status:
Things that work: Things that work:

View File

@ -60,6 +60,7 @@ config USB_SERIAL_SIMPLE
- Suunto ANT+ USB device. - Suunto ANT+ USB device.
- Medtronic CareLink USB device - Medtronic CareLink USB device
- Fundamental Software dongle. - Fundamental Software dongle.
- Google USB serial devices
- HP4x calculators - HP4x calculators
- a number of Motorola phones - a number of Motorola phones
- Novatel Wireless GPS receivers - Novatel Wireless GPS receivers
@ -606,10 +607,10 @@ config USB_SERIAL_CYBERJACK
If unsure, say N. If unsure, say N.
config USB_SERIAL_XIRCOM config USB_SERIAL_XIRCOM
tristate "USB Xircom / Entregra Single Port Serial Driver" tristate "USB Xircom / Entrega Single Port Serial Driver"
select USB_EZUSB_FX2 select USB_EZUSB_FX2
help help
Say Y here if you want to use a Xircom or Entregra single port USB to Say Y here if you want to use a Xircom or Entrega single port USB to
serial converter device. This driver makes use of firmware serial converter device. This driver makes use of firmware
developed from scratch by Brian Warner. developed from scratch by Brian Warner.

View File

@ -1,5 +1,5 @@
/* /*
* USB Keyspan PDA / Xircom / Entregra Converter driver * USB Keyspan PDA / Xircom / Entrega Converter driver
* *
* Copyright (C) 1999 - 2001 Greg Kroah-Hartman <greg@kroah.com> * Copyright (C) 1999 - 2001 Greg Kroah-Hartman <greg@kroah.com>
* Copyright (C) 1999, 2000 Brian Warner <warner@lothar.com> * Copyright (C) 1999, 2000 Brian Warner <warner@lothar.com>
@ -58,11 +58,11 @@ struct keyspan_pda_private {
#define KEYSPAN_PDA_FAKE_ID 0x0103 #define KEYSPAN_PDA_FAKE_ID 0x0103
#define KEYSPAN_PDA_ID 0x0104 /* no clue */ #define KEYSPAN_PDA_ID 0x0104 /* no clue */
/* For Xircom PGSDB9 and older Entregra version of the same device */ /* For Xircom PGSDB9 and older Entrega version of the same device */
#define XIRCOM_VENDOR_ID 0x085a #define XIRCOM_VENDOR_ID 0x085a
#define XIRCOM_FAKE_ID 0x8027 #define XIRCOM_FAKE_ID 0x8027
#define ENTREGRA_VENDOR_ID 0x1645 #define ENTREGA_VENDOR_ID 0x1645
#define ENTREGRA_FAKE_ID 0x8093 #define ENTREGA_FAKE_ID 0x8093
static const struct usb_device_id id_table_combined[] = { static const struct usb_device_id id_table_combined[] = {
#ifdef KEYSPAN #ifdef KEYSPAN
@ -70,7 +70,7 @@ static const struct usb_device_id id_table_combined[] = {
#endif #endif
#ifdef XIRCOM #ifdef XIRCOM
{ USB_DEVICE(XIRCOM_VENDOR_ID, XIRCOM_FAKE_ID) }, { USB_DEVICE(XIRCOM_VENDOR_ID, XIRCOM_FAKE_ID) },
{ USB_DEVICE(ENTREGRA_VENDOR_ID, ENTREGRA_FAKE_ID) }, { USB_DEVICE(ENTREGA_VENDOR_ID, ENTREGA_FAKE_ID) },
#endif #endif
{ USB_DEVICE(KEYSPAN_VENDOR_ID, KEYSPAN_PDA_ID) }, { USB_DEVICE(KEYSPAN_VENDOR_ID, KEYSPAN_PDA_ID) },
{ } /* Terminating entry */ { } /* Terminating entry */
@ -93,7 +93,7 @@ static const struct usb_device_id id_table_fake[] = {
#ifdef XIRCOM #ifdef XIRCOM
static const struct usb_device_id id_table_fake_xircom[] = { static const struct usb_device_id id_table_fake_xircom[] = {
{ USB_DEVICE(XIRCOM_VENDOR_ID, XIRCOM_FAKE_ID) }, { USB_DEVICE(XIRCOM_VENDOR_ID, XIRCOM_FAKE_ID) },
{ USB_DEVICE(ENTREGRA_VENDOR_ID, ENTREGRA_FAKE_ID) }, { USB_DEVICE(ENTREGA_VENDOR_ID, ENTREGA_FAKE_ID) },
{ } { }
}; };
#endif #endif
@ -667,7 +667,7 @@ static int keyspan_pda_fake_startup(struct usb_serial *serial)
#endif #endif
#ifdef XIRCOM #ifdef XIRCOM
else if ((le16_to_cpu(serial->dev->descriptor.idVendor) == XIRCOM_VENDOR_ID) || else if ((le16_to_cpu(serial->dev->descriptor.idVendor) == XIRCOM_VENDOR_ID) ||
(le16_to_cpu(serial->dev->descriptor.idVendor) == ENTREGRA_VENDOR_ID)) (le16_to_cpu(serial->dev->descriptor.idVendor) == ENTREGA_VENDOR_ID))
fw_name = "keyspan_pda/xircom_pgs.fw"; fw_name = "keyspan_pda/xircom_pgs.fw";
#endif #endif
else { else {
@ -744,7 +744,7 @@ static struct usb_serial_driver xircom_pgs_fake_device = {
.owner = THIS_MODULE, .owner = THIS_MODULE,
.name = "xircom_no_firm", .name = "xircom_no_firm",
}, },
.description = "Xircom / Entregra PGS - (prerenumeration)", .description = "Xircom / Entrega PGS - (prerenumeration)",
.id_table = id_table_fake_xircom, .id_table = id_table_fake_xircom,
.num_ports = 1, .num_ports = 1,
.attach = keyspan_pda_fake_startup, .attach = keyspan_pda_fake_startup,

View File

@ -244,7 +244,7 @@ static int kobil_open(struct tty_struct *tty, struct usb_serial_port *port)
priv->device_type == KOBIL_ADAPTER_B_PRODUCT_ID || priv->device_type == KOBIL_ADAPTER_B_PRODUCT_ID ||
priv->device_type == KOBIL_KAAN_SIM_PRODUCT_ID) { priv->device_type == KOBIL_KAAN_SIM_PRODUCT_ID) {
/* start reading (Adapter B 'cause PNP string) */ /* start reading (Adapter B 'cause PNP string) */
result = usb_submit_urb(port->interrupt_in_urb, GFP_ATOMIC); result = usb_submit_urb(port->interrupt_in_urb, GFP_KERNEL);
dev_dbg(dev, "%s - Send read URB returns: %i\n", __func__, result); dev_dbg(dev, "%s - Send read URB returns: %i\n", __func__, result);
} }

View File

@ -1657,7 +1657,7 @@ static void change_port_settings(struct tty_struct *tty,
write_mos_reg(serial, port_number, IER, 0x0c); write_mos_reg(serial, port_number, IER, 0x0c);
if (port->read_urb->status != -EINPROGRESS) { if (port->read_urb->status != -EINPROGRESS) {
status = usb_submit_urb(port->read_urb, GFP_ATOMIC); status = usb_submit_urb(port->read_urb, GFP_KERNEL);
if (status) if (status)
dev_dbg(&port->dev, "usb_submit_urb(read bulk) failed, status = %d\n", status); dev_dbg(&port->dev, "usb_submit_urb(read bulk) failed, status = %d\n", status);
} }
@ -1702,7 +1702,7 @@ static void mos7720_set_termios(struct tty_struct *tty,
change_port_settings(tty, mos7720_port, old_termios); change_port_settings(tty, mos7720_port, old_termios);
if (port->read_urb->status != -EINPROGRESS) { if (port->read_urb->status != -EINPROGRESS) {
status = usb_submit_urb(port->read_urb, GFP_ATOMIC); status = usb_submit_urb(port->read_urb, GFP_KERNEL);
if (status) if (status)
dev_dbg(&port->dev, "usb_submit_urb(read bulk) failed, status = %d\n", status); dev_dbg(&port->dev, "usb_submit_urb(read bulk) failed, status = %d\n", status);
} }

View File

@ -1904,7 +1904,7 @@ static void mos7840_change_port_settings(struct tty_struct *tty,
if (mos7840_port->read_urb_busy == false) { if (mos7840_port->read_urb_busy == false) {
mos7840_port->read_urb_busy = true; mos7840_port->read_urb_busy = true;
status = usb_submit_urb(mos7840_port->read_urb, GFP_ATOMIC); status = usb_submit_urb(mos7840_port->read_urb, GFP_KERNEL);
if (status) { if (status) {
dev_dbg(&port->dev, "usb_submit_urb(read bulk) failed, status = %d\n", dev_dbg(&port->dev, "usb_submit_urb(read bulk) failed, status = %d\n",
status); status);
@ -1968,7 +1968,7 @@ static void mos7840_set_termios(struct tty_struct *tty,
if (mos7840_port->read_urb_busy == false) { if (mos7840_port->read_urb_busy == false) {
mos7840_port->read_urb_busy = true; mos7840_port->read_urb_busy = true;
status = usb_submit_urb(mos7840_port->read_urb, GFP_ATOMIC); status = usb_submit_urb(mos7840_port->read_urb, GFP_KERNEL);
if (status) { if (status) {
dev_dbg(&port->dev, "usb_submit_urb(read bulk) failed, status = %d\n", dev_dbg(&port->dev, "usb_submit_urb(read bulk) failed, status = %d\n",
status); status);

View File

@ -27,12 +27,15 @@ enum qcserial_layouts {
QCSERIAL_G2K = 0, /* Gobi 2000 */ QCSERIAL_G2K = 0, /* Gobi 2000 */
QCSERIAL_G1K = 1, /* Gobi 1000 */ QCSERIAL_G1K = 1, /* Gobi 1000 */
QCSERIAL_SWI = 2, /* Sierra Wireless */ QCSERIAL_SWI = 2, /* Sierra Wireless */
QCSERIAL_HWI = 3, /* Huawei */
}; };
#define DEVICE_G1K(v, p) \ #define DEVICE_G1K(v, p) \
USB_DEVICE(v, p), .driver_info = QCSERIAL_G1K USB_DEVICE(v, p), .driver_info = QCSERIAL_G1K
#define DEVICE_SWI(v, p) \ #define DEVICE_SWI(v, p) \
USB_DEVICE(v, p), .driver_info = QCSERIAL_SWI USB_DEVICE(v, p), .driver_info = QCSERIAL_SWI
#define DEVICE_HWI(v, p) \
USB_DEVICE(v, p), .driver_info = QCSERIAL_HWI
static const struct usb_device_id id_table[] = { static const struct usb_device_id id_table[] = {
/* Gobi 1000 devices */ /* Gobi 1000 devices */
@ -157,6 +160,9 @@ static const struct usb_device_id id_table[] = {
{DEVICE_SWI(0x413c, 0x81a8)}, /* Dell Wireless 5808 Gobi(TM) 4G LTE 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 */ {DEVICE_SWI(0x413c, 0x81a9)}, /* Dell Wireless 5808e Gobi(TM) 4G LTE Mobile Broadband Card */
/* Huawei devices */
{DEVICE_HWI(0x03f0, 0x581d)}, /* HP lt4112 LTE/HSPA+ Gobi 4G Modem (Huawei me906e) */
{ } /* Terminating entry */ { } /* Terminating entry */
}; };
MODULE_DEVICE_TABLE(usb, id_table); MODULE_DEVICE_TABLE(usb, id_table);
@ -287,6 +293,33 @@ static int qcprobe(struct usb_serial *serial, const struct usb_device_id *id)
break; break;
} }
break; break;
case QCSERIAL_HWI:
/*
* Huawei layout:
* 0: AT-capable modem port
* 1: DM/DIAG
* 2: AT-capable modem port
* 3: CCID-compatible PCSC interface
* 4: QMI/net
* 5: NMEA
*/
switch (ifnum) {
case 0:
case 2:
dev_dbg(dev, "Modem port found\n");
break;
case 1:
dev_dbg(dev, "DM/DIAG interface found\n");
break;
case 5:
dev_dbg(dev, "NMEA GPS interface found\n");
break;
default:
/* don't claim any unsupported interface */
altsetting = -1;
break;
}
break;
default: default:
dev_err(dev, "unsupported device layout type: %lu\n", dev_err(dev, "unsupported device layout type: %lu\n",
id->driver_info); id->driver_info);

View File

@ -56,6 +56,14 @@ DEVICE(funsoft, FUNSOFT_IDS);
{ USB_DEVICE(0x8087, 0x0716) } { USB_DEVICE(0x8087, 0x0716) }
DEVICE(flashloader, FLASHLOADER_IDS); DEVICE(flashloader, FLASHLOADER_IDS);
/* Google Serial USB SubClass */
#define GOOGLE_IDS() \
{ USB_VENDOR_AND_INTERFACE_INFO(0x18d1, \
USB_CLASS_VENDOR_SPEC, \
0x50, \
0x01) }
DEVICE(google, GOOGLE_IDS);
/* ViVOpay USB Serial Driver */ /* ViVOpay USB Serial Driver */
#define VIVOPAY_IDS() \ #define VIVOPAY_IDS() \
{ USB_DEVICE(0x1d5f, 0x1004) } /* ViVOpay 8800 */ { USB_DEVICE(0x1d5f, 0x1004) } /* ViVOpay 8800 */
@ -97,6 +105,7 @@ static struct usb_serial_driver * const serial_drivers[] = {
&zio_device, &zio_device,
&funsoft_device, &funsoft_device,
&flashloader_device, &flashloader_device,
&google_device,
&vivopay_device, &vivopay_device,
&moto_modem_device, &moto_modem_device,
&novatel_gps_device, &novatel_gps_device,
@ -111,6 +120,7 @@ static const struct usb_device_id id_table[] = {
ZIO_IDS(), ZIO_IDS(),
FUNSOFT_IDS(), FUNSOFT_IDS(),
FLASHLOADER_IDS(), FLASHLOADER_IDS(),
GOOGLE_IDS(),
VIVOPAY_IDS(), VIVOPAY_IDS(),
MOTO_IDS(), MOTO_IDS(),
NOVATEL_IDS(), NOVATEL_IDS(),