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:
commit
9f10adc544
|
@ -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
|
||||||
- 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.
|
||||||
|
|
||||||
|
|
|
@ -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,
|
||||||
|
|
|
@ -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,
|
||||||
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);
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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(),
|
||||||
|
|
Loading…
Reference in New Issue