Commit 9f10adc5 authored by Greg Kroah-Hartman's avatar Greg Kroah-Hartman

Merge tag 'usb-serial-3.19-rc1' of...

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: default avatarJohan Hovold <johan@kernel.org>
parents 6629467b e7181d00
...@@ -145,7 +145,7 @@ Keyspan PDA Serial Adapter ...@@ -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:
......
...@@ -60,6 +60,7 @@ config USB_SERIAL_SIMPLE ...@@ -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 ...@@ -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.
......
/* /*
* 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 { ...@@ -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[] = { ...@@ -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[] = { ...@@ -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) ...@@ -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 = { ...@@ -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,
......
...@@ -244,7 +244,7 @@ static int kobil_open(struct tty_struct *tty, struct usb_serial_port *port) ...@@ -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);
} }
......
...@@ -1657,7 +1657,7 @@ static void change_port_settings(struct tty_struct *tty, ...@@ -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, ...@@ -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);
} }
......
...@@ -1904,7 +1904,7 @@ static void mos7840_change_port_settings(struct tty_struct *tty, ...@@ -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, ...@@ -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);
......
...@@ -27,12 +27,15 @@ enum qcserial_layouts { ...@@ -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[] = { ...@@ -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) ...@@ -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);
......
...@@ -56,6 +56,14 @@ DEVICE(funsoft, FUNSOFT_IDS); ...@@ -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[] = { ...@@ -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[] = { ...@@ -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(),
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment