Merge tag 'usb-3.8-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/usb
Pull USB patches from Greg Kroah-Hartman: "Here's the big set of USB patches for 3.8-rc1. Lots of USB host driver cleanups in here, and a bit of a reorg of the EHCI driver to make it easier for the different EHCI platform drivers to all work together nicer, which was a reduction in overall code. We also deleted some unused firmware files, and got rid of the very old file_storage usb gadget driver that had been broken for a long time. This means we ended up removing way more code than added, always a nice thing to see: 310 files changed, 3028 insertions(+), 10754 deletions(-) Other than that, the usual set of new device ids, driver fixes, gadget driver and controller updates and the like. All of these have been in the linux-next tree for a number of weeks. Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>" * tag 'usb-3.8-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/usb: (228 commits) USB: mark uas driver as BROKEN xhci: Add Lynx Point LP to list of Intel switchable hosts uwb: fix uwb_dev_unlock() missed at an error path in uwb_rc_cmd_async() USB: ftdi_sio: Add support for Newport AGILIS motor drivers MAINTAINERS: remove drivers/block/ub.c USB: chipidea: fix use after free bug ezusb: add dependency to USB usb: ftdi_sio: fixup BeagleBone A5+ quirk USB: cp210x: add Virtenio Preon32 device id usb: storage: remove redundant memset() in usb_probe_stor1() USB: option: blacklist network interface on Huawei E173 USB: OHCI: workaround for hardware bug: retired TDs not added to the Done Queue USB: add new zte 3g-dongle's pid to option.c USB: opticon: switch to generic read implementation USB: opticon: refactor reab-urb processing USB: opticon: use usb-serial bulk-in urb USB: opticon: increase bulk-in size USB: opticon: use port as urb context USB: opticon: pass port to get_serial_info USB: opticon: make private data port specific ...
This commit is contained in:
@@ -68,10 +68,6 @@
|
||||
#define THROTTLED 0x01
|
||||
#define ACTUALLY_THROTTLED 0x02
|
||||
|
||||
/*
|
||||
* Version Information
|
||||
*/
|
||||
#define DRIVER_VERSION "v2.0"
|
||||
#define DRIVER_AUTHOR "Naranjo, Manuel Francisco <naranjo.manuel@gmail.com>, Johan Hovold <jhovold@gmail.com>"
|
||||
#define DRIVER_DESC "AIRcable USB Driver"
|
||||
|
||||
@@ -192,5 +188,4 @@ module_usb_serial_driver(serial_drivers, id_table);
|
||||
|
||||
MODULE_AUTHOR(DRIVER_AUTHOR);
|
||||
MODULE_DESCRIPTION(DRIVER_DESC);
|
||||
MODULE_VERSION(DRIVER_VERSION);
|
||||
MODULE_LICENSE("GPL");
|
||||
|
||||
@@ -37,11 +37,6 @@
|
||||
#include <linux/mutex.h>
|
||||
#include <linux/spinlock.h>
|
||||
|
||||
/*
|
||||
* Version information
|
||||
*/
|
||||
|
||||
#define DRIVER_VERSION "v0.7"
|
||||
#define DRIVER_AUTHOR "Bart Hartgers <bart.hartgers+ark3116@gmail.com>"
|
||||
#define DRIVER_DESC "USB ARK3116 serial/IrDA driver"
|
||||
#define DRIVER_DEV_DESC "ARK3116 RS232/IrDA"
|
||||
|
||||
@@ -37,10 +37,6 @@
|
||||
#include <linux/usb/serial.h>
|
||||
#include "belkin_sa.h"
|
||||
|
||||
/*
|
||||
* Version Information
|
||||
*/
|
||||
#define DRIVER_VERSION "v1.3"
|
||||
#define DRIVER_AUTHOR "William Greathouse <wgreathouse@smva.com>"
|
||||
#define DRIVER_DESC "USB Belkin Serial converter driver"
|
||||
|
||||
@@ -509,5 +505,4 @@ module_usb_serial_driver(serial_drivers, id_table);
|
||||
|
||||
MODULE_AUTHOR(DRIVER_AUTHOR);
|
||||
MODULE_DESCRIPTION(DRIVER_DESC);
|
||||
MODULE_VERSION(DRIVER_VERSION);
|
||||
MODULE_LICENSE("GPL");
|
||||
|
||||
@@ -121,7 +121,6 @@ static int usb_serial_device_remove(struct device *dev)
|
||||
return retval;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_HOTPLUG
|
||||
static ssize_t store_new_id(struct device_driver *driver,
|
||||
const char *buf, size_t count)
|
||||
{
|
||||
@@ -159,15 +158,6 @@ static void free_dynids(struct usb_serial_driver *drv)
|
||||
spin_unlock(&drv->dynids.lock);
|
||||
}
|
||||
|
||||
#else
|
||||
static struct driver_attribute drv_attrs[] = {
|
||||
__ATTR_NULL,
|
||||
};
|
||||
static inline void free_dynids(struct usb_serial_driver *drv)
|
||||
{
|
||||
}
|
||||
#endif
|
||||
|
||||
struct bus_type usb_serial_bus_type = {
|
||||
.name = "usb-serial",
|
||||
.match = usb_serial_device_match,
|
||||
|
||||
@@ -24,10 +24,6 @@
|
||||
#include <linux/uaccess.h>
|
||||
#include <linux/usb/serial.h>
|
||||
|
||||
/*
|
||||
* Version Information
|
||||
*/
|
||||
#define DRIVER_VERSION "v0.09"
|
||||
#define DRIVER_DESC "Silicon Labs CP210x RS232 serial adaptor driver"
|
||||
|
||||
/*
|
||||
@@ -35,8 +31,7 @@
|
||||
*/
|
||||
static int cp210x_open(struct tty_struct *tty, struct usb_serial_port *);
|
||||
static void cp210x_close(struct usb_serial_port *);
|
||||
static void cp210x_get_termios(struct tty_struct *,
|
||||
struct usb_serial_port *port);
|
||||
static void cp210x_get_termios(struct tty_struct *, struct usb_serial_port *);
|
||||
static void cp210x_get_termios_port(struct usb_serial_port *port,
|
||||
unsigned int *cflagp, unsigned int *baudp);
|
||||
static void cp210x_change_speed(struct tty_struct *, struct usb_serial_port *,
|
||||
@@ -118,6 +113,7 @@ static const struct usb_device_id id_table[] = {
|
||||
{ USB_DEVICE(0x10C4, 0x8477) }, /* Balluff RFID */
|
||||
{ USB_DEVICE(0x10C4, 0x85EA) }, /* AC-Services IBUS-IF */
|
||||
{ USB_DEVICE(0x10C4, 0x85EB) }, /* AC-Services CIS-IBUS */
|
||||
{ USB_DEVICE(0x10C4, 0x85F8) }, /* Virtenio Preon32 */
|
||||
{ USB_DEVICE(0x10C4, 0x8664) }, /* AC-Services CAN-IF */
|
||||
{ USB_DEVICE(0x10C4, 0x8665) }, /* AC-Services OBD-IF */
|
||||
{ USB_DEVICE(0x10C4, 0xEA60) }, /* Silicon Labs factory default */
|
||||
@@ -169,7 +165,7 @@ struct cp210x_serial_private {
|
||||
static struct usb_serial_driver cp210x_device = {
|
||||
.driver = {
|
||||
.owner = THIS_MODULE,
|
||||
.name = "cp210x",
|
||||
.name = "cp210x",
|
||||
},
|
||||
.id_table = id_table,
|
||||
.num_ports = 1,
|
||||
@@ -179,7 +175,7 @@ static struct usb_serial_driver cp210x_device = {
|
||||
.close = cp210x_close,
|
||||
.break_ctl = cp210x_break_ctl,
|
||||
.set_termios = cp210x_set_termios,
|
||||
.tiocmget = cp210x_tiocmget,
|
||||
.tiocmget = cp210x_tiocmget,
|
||||
.tiocmset = cp210x_tiocmset,
|
||||
.attach = cp210x_startup,
|
||||
.release = cp210x_release,
|
||||
@@ -281,7 +277,7 @@ static int cp210x_get_config(struct usb_serial_port *port, u8 request,
|
||||
int result, i, length;
|
||||
|
||||
/* Number of integers required to contain the array */
|
||||
length = (((size - 1) | 3) + 1)/4;
|
||||
length = (((size - 1) | 3) + 1) / 4;
|
||||
|
||||
buf = kcalloc(length, sizeof(__le32), GFP_KERNEL);
|
||||
if (!buf) {
|
||||
@@ -328,12 +324,11 @@ static int cp210x_set_config(struct usb_serial_port *port, u8 request,
|
||||
int result, i, length;
|
||||
|
||||
/* Number of integers required to contain the array */
|
||||
length = (((size - 1) | 3) + 1)/4;
|
||||
length = (((size - 1) | 3) + 1) / 4;
|
||||
|
||||
buf = kmalloc(length * sizeof(__le32), GFP_KERNEL);
|
||||
if (!buf) {
|
||||
dev_err(&port->dev, "%s - out of memory.\n",
|
||||
__func__);
|
||||
dev_err(&port->dev, "%s - out of memory.\n", __func__);
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
@@ -384,7 +379,8 @@ static inline int cp210x_set_config_single(struct usb_serial_port *port,
|
||||
* cp210x_quantise_baudrate
|
||||
* Quantises the baud rate as per AN205 Table 1
|
||||
*/
|
||||
static unsigned int cp210x_quantise_baudrate(unsigned int baud) {
|
||||
static unsigned int cp210x_quantise_baudrate(unsigned int baud)
|
||||
{
|
||||
if (baud <= 300)
|
||||
baud = 300;
|
||||
else if (baud <= 600) baud = 600;
|
||||
@@ -467,9 +463,7 @@ static void cp210x_get_termios(struct tty_struct *tty,
|
||||
cp210x_get_termios_port(tty->driver_data,
|
||||
&tty->termios.c_cflag, &baud);
|
||||
tty_encode_baud_rate(tty, baud, baud);
|
||||
}
|
||||
|
||||
else {
|
||||
} else {
|
||||
unsigned int cflag;
|
||||
cflag = 0;
|
||||
cp210x_get_termios_port(port, &cflag, &baud);
|
||||
@@ -693,8 +687,8 @@ static void cp210x_set_termios(struct tty_struct *tty,
|
||||
break;*/
|
||||
default:
|
||||
dev_dbg(dev, "cp210x driver does not support the number of bits requested, using 8 bit mode\n");
|
||||
bits |= BITS_DATA_8;
|
||||
break;
|
||||
bits |= BITS_DATA_8;
|
||||
break;
|
||||
}
|
||||
if (cp210x_set_config(port, CP210X_SET_LINE_CTL, &bits, 2))
|
||||
dev_dbg(dev, "Number of data bits requested not supported by device\n");
|
||||
@@ -767,7 +761,7 @@ static void cp210x_set_termios(struct tty_struct *tty,
|
||||
|
||||
}
|
||||
|
||||
static int cp210x_tiocmset (struct tty_struct *tty,
|
||||
static int cp210x_tiocmset(struct tty_struct *tty,
|
||||
unsigned int set, unsigned int clear)
|
||||
{
|
||||
struct usb_serial_port *port = tty->driver_data;
|
||||
@@ -809,7 +803,7 @@ static void cp210x_dtr_rts(struct usb_serial_port *p, int on)
|
||||
cp210x_tiocmset_port(p, 0, TIOCM_DTR|TIOCM_RTS);
|
||||
}
|
||||
|
||||
static int cp210x_tiocmget (struct tty_struct *tty)
|
||||
static int cp210x_tiocmget(struct tty_struct *tty)
|
||||
{
|
||||
struct usb_serial_port *port = tty->driver_data;
|
||||
unsigned int control;
|
||||
@@ -829,7 +823,7 @@ static int cp210x_tiocmget (struct tty_struct *tty)
|
||||
return result;
|
||||
}
|
||||
|
||||
static void cp210x_break_ctl (struct tty_struct *tty, int break_state)
|
||||
static void cp210x_break_ctl(struct tty_struct *tty, int break_state)
|
||||
{
|
||||
struct usb_serial_port *port = tty->driver_data;
|
||||
unsigned int state;
|
||||
@@ -874,5 +868,4 @@ static void cp210x_release(struct usb_serial *serial)
|
||||
module_usb_serial_driver(serial_drivers, id_table);
|
||||
|
||||
MODULE_DESCRIPTION(DRIVER_DESC);
|
||||
MODULE_VERSION(DRIVER_VERSION);
|
||||
MODULE_LICENSE("GPL");
|
||||
|
||||
@@ -43,10 +43,6 @@
|
||||
|
||||
#define CYBERJACK_LOCAL_BUF_SIZE 32
|
||||
|
||||
/*
|
||||
* Version Information
|
||||
*/
|
||||
#define DRIVER_VERSION "v1.01"
|
||||
#define DRIVER_AUTHOR "Matthias Bruestle"
|
||||
#define DRIVER_DESC "REINER SCT cyberJack pinpad/e-com USB Chipcard Reader Driver"
|
||||
|
||||
@@ -441,5 +437,4 @@ module_usb_serial_driver(serial_drivers, id_table);
|
||||
|
||||
MODULE_AUTHOR(DRIVER_AUTHOR);
|
||||
MODULE_DESCRIPTION(DRIVER_DESC);
|
||||
MODULE_VERSION(DRIVER_VERSION);
|
||||
MODULE_LICENSE("GPL");
|
||||
|
||||
@@ -50,10 +50,6 @@ static bool stats;
|
||||
static int interval;
|
||||
static bool unstable_bauds;
|
||||
|
||||
/*
|
||||
* Version Information
|
||||
*/
|
||||
#define DRIVER_VERSION "v1.10"
|
||||
#define DRIVER_AUTHOR "Lonnie Mendez <dignome@gmail.com>, Neil Whelchel <koyama@firstlight.net>"
|
||||
#define DRIVER_DESC "Cypress USB to Serial Driver"
|
||||
|
||||
@@ -1303,7 +1299,6 @@ module_usb_serial_driver(serial_drivers, id_table_combined);
|
||||
|
||||
MODULE_AUTHOR(DRIVER_AUTHOR);
|
||||
MODULE_DESCRIPTION(DRIVER_DESC);
|
||||
MODULE_VERSION(DRIVER_VERSION);
|
||||
MODULE_LICENSE("GPL");
|
||||
|
||||
module_param(stats, bool, S_IRUGO | S_IWUSR);
|
||||
|
||||
@@ -32,10 +32,6 @@
|
||||
|
||||
/* Defines */
|
||||
|
||||
/*
|
||||
* Version Information
|
||||
*/
|
||||
#define DRIVER_VERSION "v1.80.1.2"
|
||||
#define DRIVER_AUTHOR "Peter Berger <pberger@brimson.com>, Al Borchers <borchers@steinerpoint.com>"
|
||||
#define DRIVER_DESC "Digi AccelePort USB-2/USB-4 Serial Converter driver"
|
||||
|
||||
|
||||
@@ -28,10 +28,6 @@
|
||||
#include <linux/usb.h>
|
||||
#include <linux/usb/serial.h>
|
||||
|
||||
/*
|
||||
* Version Information
|
||||
*/
|
||||
#define DRIVER_VERSION "v1.3"
|
||||
#define DRIVER_AUTHOR "Greg Kroah-Hartman <greg@kroah.com>, Gary Brubaker <xavyer@ix.netcom.com>"
|
||||
#define DRIVER_DESC "USB Empeg Mark I/II Driver"
|
||||
|
||||
|
||||
@@ -73,7 +73,6 @@ struct ftdi_private {
|
||||
char prev_status; /* Used for TIOCMIWAIT */
|
||||
bool dev_gone; /* Used to abort TIOCMIWAIT */
|
||||
char transmit_empty; /* If transmitter is empty or not */
|
||||
struct usb_serial_port *port;
|
||||
__u16 interface; /* FT2232C, FT2232H or FT4232H port interface
|
||||
(0 for FT232/245) */
|
||||
|
||||
@@ -192,6 +191,7 @@ static struct usb_device_id id_table_combined [] = {
|
||||
{ USB_DEVICE(FTDI_VID, FTDI_OPENDCC_THROTTLE_PID) },
|
||||
{ USB_DEVICE(FTDI_VID, FTDI_OPENDCC_GATEWAY_PID) },
|
||||
{ USB_DEVICE(FTDI_VID, FTDI_OPENDCC_GBM_PID) },
|
||||
{ USB_DEVICE(NEWPORT_VID, NEWPORT_AGILIS_PID) },
|
||||
{ USB_DEVICE(INTERBIOMETRICS_VID, INTERBIOMETRICS_IOBOARD_PID) },
|
||||
{ USB_DEVICE(INTERBIOMETRICS_VID, INTERBIOMETRICS_MINI_IOBOARD_PID) },
|
||||
{ USB_DEVICE(FTDI_VID, FTDI_SPROG_II) },
|
||||
@@ -923,6 +923,9 @@ static int ftdi_get_icount(struct tty_struct *tty,
|
||||
static int ftdi_ioctl(struct tty_struct *tty,
|
||||
unsigned int cmd, unsigned long arg);
|
||||
static void ftdi_break_ctl(struct tty_struct *tty, int break_state);
|
||||
static int ftdi_chars_in_buffer(struct tty_struct *tty);
|
||||
static int ftdi_get_modem_status(struct tty_struct *tty,
|
||||
unsigned char status[2]);
|
||||
|
||||
static unsigned short int ftdi_232am_baud_base_to_divisor(int baud, int base);
|
||||
static unsigned short int ftdi_232am_baud_to_divisor(int baud);
|
||||
@@ -957,6 +960,7 @@ static struct usb_serial_driver ftdi_sio_device = {
|
||||
.ioctl = ftdi_ioctl,
|
||||
.set_termios = ftdi_set_termios,
|
||||
.break_ctl = ftdi_break_ctl,
|
||||
.chars_in_buffer = ftdi_chars_in_buffer,
|
||||
};
|
||||
|
||||
static struct usb_serial_driver * const serial_drivers[] = {
|
||||
@@ -1090,6 +1094,7 @@ static int update_mctrl(struct usb_serial_port *port, unsigned int set,
|
||||
__func__,
|
||||
(set & TIOCM_DTR) ? "HIGH" : (clear & TIOCM_DTR) ? "LOW" : "unchanged",
|
||||
(set & TIOCM_RTS) ? "HIGH" : (clear & TIOCM_RTS) ? "LOW" : "unchanged");
|
||||
rv = usb_translate_errors(rv);
|
||||
} else {
|
||||
dev_dbg(dev, "%s - DTR %s, RTS %s\n", __func__,
|
||||
(set & TIOCM_DTR) ? "HIGH" : (clear & TIOCM_DTR) ? "LOW" : "unchanged",
|
||||
@@ -1682,7 +1687,6 @@ static int ftdi_sio_port_probe(struct usb_serial_port *port)
|
||||
|
||||
kref_init(&priv->kref);
|
||||
mutex_init(&priv->cfg_lock);
|
||||
memset(&priv->icount, 0x00, sizeof(priv->icount));
|
||||
init_waitqueue_head(&priv->delta_msr_wait);
|
||||
|
||||
priv->flags = ASYNC_LOW_LATENCY;
|
||||
@@ -1691,7 +1695,6 @@ static int ftdi_sio_port_probe(struct usb_serial_port *port)
|
||||
if (quirk && quirk->port_probe)
|
||||
quirk->port_probe(priv);
|
||||
|
||||
priv->port = port;
|
||||
usb_set_serial_port_data(port, priv);
|
||||
|
||||
ftdi_determine_type(port);
|
||||
@@ -1781,7 +1784,7 @@ static int ftdi_8u2232c_probe(struct usb_serial *serial)
|
||||
struct usb_device *udev = serial->dev;
|
||||
|
||||
if ((udev->manufacturer && !strcmp(udev->manufacturer, "CALAO Systems")) ||
|
||||
(udev->product && !strcmp(udev->product, "BeagleBone/XDS100")))
|
||||
(udev->product && !strcmp(udev->product, "BeagleBone/XDS100V2")))
|
||||
return ftdi_jtag_probe(serial);
|
||||
|
||||
return 0;
|
||||
@@ -2089,6 +2092,29 @@ static void ftdi_break_ctl(struct tty_struct *tty, int break_state)
|
||||
|
||||
}
|
||||
|
||||
static int ftdi_chars_in_buffer(struct tty_struct *tty)
|
||||
{
|
||||
struct usb_serial_port *port = tty->driver_data;
|
||||
int chars;
|
||||
unsigned char buf[2];
|
||||
int ret;
|
||||
|
||||
chars = usb_serial_generic_chars_in_buffer(tty);
|
||||
if (chars)
|
||||
goto out;
|
||||
|
||||
/* Check if hardware buffer is empty. */
|
||||
ret = ftdi_get_modem_status(tty, buf);
|
||||
if (ret == 2) {
|
||||
if (!(buf[1] & FTDI_RS_TEMT))
|
||||
chars = 1;
|
||||
}
|
||||
out:
|
||||
dev_dbg(&port->dev, "%s - %d\n", __func__, chars);
|
||||
|
||||
return chars;
|
||||
}
|
||||
|
||||
/* old_termios contains the original termios settings and tty->termios contains
|
||||
* the new setting to be used
|
||||
* WARNING: set_termios calls this with old_termios in kernel space
|
||||
@@ -2272,7 +2298,14 @@ no_c_cflag_changes:
|
||||
}
|
||||
}
|
||||
|
||||
static int ftdi_tiocmget(struct tty_struct *tty)
|
||||
/*
|
||||
* Get modem-control status.
|
||||
*
|
||||
* Returns the number of status bytes retrieved (device dependant), or
|
||||
* negative error code.
|
||||
*/
|
||||
static int ftdi_get_modem_status(struct tty_struct *tty,
|
||||
unsigned char status[2])
|
||||
{
|
||||
struct usb_serial_port *port = tty->driver_data;
|
||||
struct ftdi_private *priv = usb_get_serial_port_data(port);
|
||||
@@ -2312,16 +2345,43 @@ static int ftdi_tiocmget(struct tty_struct *tty)
|
||||
FTDI_SIO_GET_MODEM_STATUS_REQUEST_TYPE,
|
||||
0, priv->interface,
|
||||
buf, len, WDR_TIMEOUT);
|
||||
if (ret < 0)
|
||||
if (ret < 0) {
|
||||
dev_err(&port->dev, "failed to get modem status: %d\n", ret);
|
||||
ret = usb_translate_errors(ret);
|
||||
goto out;
|
||||
}
|
||||
|
||||
ret = (buf[0] & FTDI_SIO_DSR_MASK ? TIOCM_DSR : 0) |
|
||||
(buf[0] & FTDI_SIO_CTS_MASK ? TIOCM_CTS : 0) |
|
||||
(buf[0] & FTDI_SIO_RI_MASK ? TIOCM_RI : 0) |
|
||||
(buf[0] & FTDI_SIO_RLSD_MASK ? TIOCM_CD : 0) |
|
||||
priv->last_dtr_rts;
|
||||
status[0] = buf[0];
|
||||
if (ret > 1)
|
||||
status[1] = buf[1];
|
||||
else
|
||||
status[1] = 0;
|
||||
|
||||
dev_dbg(&port->dev, "%s - 0x%02x%02x\n", __func__, status[0],
|
||||
status[1]);
|
||||
out:
|
||||
kfree(buf);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int ftdi_tiocmget(struct tty_struct *tty)
|
||||
{
|
||||
struct usb_serial_port *port = tty->driver_data;
|
||||
struct ftdi_private *priv = usb_get_serial_port_data(port);
|
||||
unsigned char buf[2];
|
||||
int ret;
|
||||
|
||||
ret = ftdi_get_modem_status(tty, buf);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
ret = (buf[0] & FTDI_SIO_DSR_MASK ? TIOCM_DSR : 0) |
|
||||
(buf[0] & FTDI_SIO_CTS_MASK ? TIOCM_CTS : 0) |
|
||||
(buf[0] & FTDI_SIO_RI_MASK ? TIOCM_RI : 0) |
|
||||
(buf[0] & FTDI_SIO_RLSD_MASK ? TIOCM_CD : 0) |
|
||||
priv->last_dtr_rts;
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
@@ -752,6 +752,12 @@
|
||||
#define TTI_VID 0x103E /* Vendor Id */
|
||||
#define TTI_QL355P_PID 0x03E8 /* TTi QL355P power supply */
|
||||
|
||||
/*
|
||||
* Newport Cooperation (www.newport.com)
|
||||
*/
|
||||
#define NEWPORT_VID 0x104D
|
||||
#define NEWPORT_AGILIS_PID 0x3000
|
||||
|
||||
/* Interbiometrics USB I/O Board */
|
||||
/* Developed for Interbiometrics by Rudolf Gugler */
|
||||
#define INTERBIOMETRICS_VID 0x1209
|
||||
|
||||
@@ -262,6 +262,7 @@ int usb_serial_generic_chars_in_buffer(struct tty_struct *tty)
|
||||
dev_dbg(&port->dev, "%s - returns %d\n", __func__, chars);
|
||||
return chars;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(usb_serial_generic_chars_in_buffer);
|
||||
|
||||
static int usb_serial_generic_submit_read_urb(struct usb_serial_port *port,
|
||||
int index, gfp_t mem_flags)
|
||||
|
||||
@@ -20,10 +20,6 @@
|
||||
#include <linux/usb.h>
|
||||
#include <linux/usb/serial.h>
|
||||
|
||||
/*
|
||||
* Version Information
|
||||
*/
|
||||
#define DRIVER_VERSION "v1.00"
|
||||
#define DRIVER_DESC "HP4x (48/49) Generic Serial driver"
|
||||
|
||||
#define HP_VENDOR_ID 0x03f0
|
||||
@@ -52,5 +48,4 @@ static struct usb_serial_driver * const serial_drivers[] = {
|
||||
module_usb_serial_driver(serial_drivers, id_table);
|
||||
|
||||
MODULE_DESCRIPTION(DRIVER_DESC);
|
||||
MODULE_VERSION(DRIVER_VERSION);
|
||||
MODULE_LICENSE("GPL");
|
||||
|
||||
@@ -51,10 +51,6 @@
|
||||
#include "io_ionsp.h" /* info for the iosp messages */
|
||||
#include "io_16654.h" /* 16654 UART defines */
|
||||
|
||||
/*
|
||||
* Version Information
|
||||
*/
|
||||
#define DRIVER_VERSION "v2.7"
|
||||
#define DRIVER_AUTHOR "Greg Kroah-Hartman <greg@kroah.com> and David Iacovelli"
|
||||
#define DRIVER_DESC "Edgeport USB Serial Driver"
|
||||
|
||||
|
||||
@@ -40,10 +40,6 @@
|
||||
#include "io_usbvend.h"
|
||||
#include "io_ti.h"
|
||||
|
||||
/*
|
||||
* Version Information
|
||||
*/
|
||||
#define DRIVER_VERSION "v0.7mode043006"
|
||||
#define DRIVER_AUTHOR "Greg Kroah-Hartman <greg@kroah.com> and David Iacovelli"
|
||||
#define DRIVER_DESC "Edgeport USB Serial Driver"
|
||||
|
||||
|
||||
@@ -25,11 +25,6 @@
|
||||
|
||||
#define KP_RETRIES 100
|
||||
|
||||
/*
|
||||
* Version Information
|
||||
*/
|
||||
|
||||
#define DRIVER_VERSION "v1.0"
|
||||
#define DRIVER_AUTHOR "Ganesh Varadarajan <ganesh@veritas.com>"
|
||||
#define DRIVER_DESC "USB PocketPC PDA driver"
|
||||
|
||||
|
||||
@@ -49,10 +49,6 @@
|
||||
#include <linux/uaccess.h>
|
||||
#include "usb-wwan.h"
|
||||
|
||||
/*
|
||||
* Version Information
|
||||
*/
|
||||
#define DRIVER_VERSION "v0.4"
|
||||
#define DRIVER_AUTHOR "Roelf Diedericks"
|
||||
#define DRIVER_DESC "IPWireless tty driver"
|
||||
|
||||
|
||||
@@ -32,10 +32,6 @@
|
||||
#include "iuu_phoenix.h"
|
||||
#include <linux/random.h>
|
||||
|
||||
/*
|
||||
* Version Information
|
||||
*/
|
||||
#define DRIVER_VERSION "v0.12"
|
||||
#define DRIVER_DESC "Infinity USB Unlimited Phoenix driver"
|
||||
|
||||
static const struct usb_device_id id_table[] = {
|
||||
@@ -1164,7 +1160,7 @@ static ssize_t store_vcc_mode(struct device *dev,
|
||||
struct iuu_private *priv = usb_get_serial_port_data(port);
|
||||
unsigned long v;
|
||||
|
||||
if (strict_strtoul(buf, 10, &v)) {
|
||||
if (kstrtoul(buf, 10, &v)) {
|
||||
dev_err(dev, "%s - vcc_mode: %s is not a unsigned long\n",
|
||||
__func__, buf);
|
||||
goto fail_store_vcc_mode;
|
||||
@@ -1232,8 +1228,6 @@ MODULE_AUTHOR("Alain Degreffe eczema@ecze.com");
|
||||
MODULE_DESCRIPTION(DRIVER_DESC);
|
||||
MODULE_LICENSE("GPL");
|
||||
|
||||
MODULE_VERSION(DRIVER_VERSION);
|
||||
|
||||
module_param(xmas, bool, S_IRUGO | S_IWUSR);
|
||||
MODULE_PARM_DESC(xmas, "Xmas colors enabled or not");
|
||||
|
||||
|
||||
@@ -44,10 +44,6 @@
|
||||
#include <linux/usb/ezusb.h>
|
||||
#include "keyspan.h"
|
||||
|
||||
/*
|
||||
* Version Information
|
||||
*/
|
||||
#define DRIVER_VERSION "v1.1.5"
|
||||
#define DRIVER_AUTHOR "Hugh Blemings <hugh@misc.nu"
|
||||
#define DRIVER_DESC "Keyspan USB to Serial Converter Driver"
|
||||
|
||||
|
||||
@@ -42,10 +42,6 @@
|
||||
#undef XIRCOM
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Version Information
|
||||
*/
|
||||
#define DRIVER_VERSION "v1.1"
|
||||
#define DRIVER_AUTHOR "Brian Warner <warner@lothar.com>"
|
||||
#define DRIVER_DESC "USB Keyspan PDA Converter driver"
|
||||
|
||||
|
||||
@@ -49,10 +49,6 @@
|
||||
#include <linux/usb/serial.h>
|
||||
#include "kl5kusb105.h"
|
||||
|
||||
/*
|
||||
* Version Information
|
||||
*/
|
||||
#define DRIVER_VERSION "v0.4"
|
||||
#define DRIVER_AUTHOR "Utz-Uwe Haus <haus@uuhaus.de>, Johan Hovold <jhovold@gmail.com>"
|
||||
#define DRIVER_DESC "KLSI KL5KUSB105 chipset USB->Serial Converter driver"
|
||||
|
||||
|
||||
@@ -38,8 +38,6 @@
|
||||
#include <linux/ioctl.h>
|
||||
#include "kobil_sct.h"
|
||||
|
||||
/* Version Information */
|
||||
#define DRIVER_VERSION "21/05/2004"
|
||||
#define DRIVER_AUTHOR "KOBIL Systems GmbH - http://www.kobil.com"
|
||||
#define DRIVER_DESC "KOBIL USB Smart Card Terminal Driver (experimental)"
|
||||
|
||||
|
||||
@@ -38,10 +38,6 @@
|
||||
#include <linux/ioctl.h>
|
||||
#include "mct_u232.h"
|
||||
|
||||
/*
|
||||
* Version Information
|
||||
*/
|
||||
#define DRIVER_VERSION "z2.1" /* Linux in-kernel version */
|
||||
#define DRIVER_AUTHOR "Wolfgang Grandegger <wolfgang@ces.ch>"
|
||||
#define DRIVER_DESC "Magic Control Technology USB-RS232 converter driver"
|
||||
|
||||
|
||||
@@ -20,8 +20,6 @@
|
||||
#include <linux/uaccess.h>
|
||||
#include <linux/usb/serial.h>
|
||||
|
||||
/* Version Information */
|
||||
#define DRIVER_VERSION "v1.2.0.0"
|
||||
#define DRIVER_DESC "Metrologic Instruments Inc. - USB-POS driver"
|
||||
|
||||
/* Product information. */
|
||||
|
||||
@@ -36,10 +36,6 @@
|
||||
#include <linux/uaccess.h>
|
||||
#include <linux/parport.h>
|
||||
|
||||
/*
|
||||
* Version Information
|
||||
*/
|
||||
#define DRIVER_VERSION "2.1"
|
||||
#define DRIVER_AUTHOR "Aspire Communications pvt Ltd."
|
||||
#define DRIVER_DESC "Moschip USB Serial Driver"
|
||||
|
||||
|
||||
@@ -35,10 +35,6 @@
|
||||
#include <linux/usb/serial.h>
|
||||
#include <linux/uaccess.h>
|
||||
|
||||
/*
|
||||
* Version Information
|
||||
*/
|
||||
#define DRIVER_VERSION "1.3.2"
|
||||
#define DRIVER_DESC "Moschip 7840/7820 USB Serial Driver"
|
||||
|
||||
/*
|
||||
|
||||
@@ -23,10 +23,6 @@
|
||||
#include <linux/usb.h>
|
||||
#include <linux/usb/serial.h>
|
||||
|
||||
/*
|
||||
* Version Information
|
||||
*/
|
||||
#define DRIVER_VERSION "v1.1"
|
||||
#define DRIVER_AUTHOR "Alessandro Zummo"
|
||||
#define DRIVER_DESC "USB ZyXEL omni.net LCD PLUS Driver"
|
||||
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
/*
|
||||
* Opticon USB barcode to serial driver
|
||||
*
|
||||
* Copyright (C) 2011 - 2012 Johan Hovold <jhovold@gmail.com>
|
||||
* Copyright (C) 2011 Martin Jansen <martin.jansen@opticon.com>
|
||||
* Copyright (C) 2008 - 2009 Greg Kroah-Hartman <gregkh@suse.de>
|
||||
* Copyright (C) 2008 - 2009 Novell Inc.
|
||||
@@ -40,114 +41,70 @@ MODULE_DEVICE_TABLE(usb, id_table);
|
||||
|
||||
/* This structure holds all of the individual device information */
|
||||
struct opticon_private {
|
||||
struct usb_device *udev;
|
||||
struct usb_serial *serial;
|
||||
struct usb_serial_port *port;
|
||||
unsigned char *bulk_in_buffer;
|
||||
struct urb *bulk_read_urb;
|
||||
int buffer_size;
|
||||
u8 bulk_address;
|
||||
spinlock_t lock; /* protects the following flags */
|
||||
bool throttled;
|
||||
bool actually_throttled;
|
||||
bool rts;
|
||||
bool cts;
|
||||
int outstanding_urbs;
|
||||
};
|
||||
|
||||
|
||||
|
||||
static void opticon_read_bulk_callback(struct urb *urb)
|
||||
static void opticon_process_data_packet(struct usb_serial_port *port,
|
||||
const unsigned char *buf, size_t len)
|
||||
{
|
||||
struct opticon_private *priv = urb->context;
|
||||
unsigned char *data = urb->transfer_buffer;
|
||||
struct usb_serial_port *port = priv->port;
|
||||
int status = urb->status;
|
||||
struct tty_struct *tty;
|
||||
int result;
|
||||
int data_length;
|
||||
|
||||
tty = tty_port_tty_get(&port->port);
|
||||
if (!tty)
|
||||
return;
|
||||
|
||||
tty_insert_flip_string(tty, buf, len);
|
||||
tty_flip_buffer_push(tty);
|
||||
tty_kref_put(tty);
|
||||
}
|
||||
|
||||
static void opticon_process_status_packet(struct usb_serial_port *port,
|
||||
const unsigned char *buf, size_t len)
|
||||
{
|
||||
struct opticon_private *priv = usb_get_serial_port_data(port);
|
||||
unsigned long flags;
|
||||
|
||||
switch (status) {
|
||||
case 0:
|
||||
/* success */
|
||||
break;
|
||||
case -ECONNRESET:
|
||||
case -ENOENT:
|
||||
case -ESHUTDOWN:
|
||||
/* this urb is terminated, clean up */
|
||||
dev_dbg(&priv->udev->dev, "%s - urb shutting down with status: %d\n",
|
||||
__func__, status);
|
||||
spin_lock_irqsave(&priv->lock, flags);
|
||||
if (buf[0] == 0x00)
|
||||
priv->cts = false;
|
||||
else
|
||||
priv->cts = true;
|
||||
spin_unlock_irqrestore(&priv->lock, flags);
|
||||
}
|
||||
|
||||
static void opticon_process_read_urb(struct urb *urb)
|
||||
{
|
||||
struct usb_serial_port *port = urb->context;
|
||||
const unsigned char *hdr = urb->transfer_buffer;
|
||||
const unsigned char *data = hdr + 2;
|
||||
size_t data_len = urb->actual_length - 2;
|
||||
|
||||
if (urb->actual_length <= 2) {
|
||||
dev_dbg(&port->dev, "malformed packet received: %d bytes\n",
|
||||
urb->actual_length);
|
||||
return;
|
||||
default:
|
||||
dev_dbg(&priv->udev->dev, "%s - nonzero urb status received: %d\n",
|
||||
__func__, status);
|
||||
goto exit;
|
||||
}
|
||||
|
||||
usb_serial_debug_data(&port->dev, __func__, urb->actual_length, data);
|
||||
|
||||
if (urb->actual_length > 2) {
|
||||
data_length = urb->actual_length - 2;
|
||||
|
||||
/*
|
||||
* Data from the device comes with a 2 byte header:
|
||||
*
|
||||
* <0x00><0x00>data...
|
||||
* This is real data to be sent to the tty layer
|
||||
* <0x00><0x01)level
|
||||
* This is a CTS level change, the third byte is the CTS
|
||||
* value (0 for low, 1 for high).
|
||||
*/
|
||||
if ((data[0] == 0x00) && (data[1] == 0x00)) {
|
||||
/* real data, send it to the tty layer */
|
||||
tty = tty_port_tty_get(&port->port);
|
||||
if (tty) {
|
||||
tty_insert_flip_string(tty, data + 2,
|
||||
data_length);
|
||||
tty_flip_buffer_push(tty);
|
||||
tty_kref_put(tty);
|
||||
}
|
||||
} else {
|
||||
if ((data[0] == 0x00) && (data[1] == 0x01)) {
|
||||
spin_lock_irqsave(&priv->lock, flags);
|
||||
/* CTS status information package */
|
||||
if (data[2] == 0x00)
|
||||
priv->cts = false;
|
||||
else
|
||||
priv->cts = true;
|
||||
spin_unlock_irqrestore(&priv->lock, flags);
|
||||
} else {
|
||||
dev_dbg(&priv->udev->dev,
|
||||
"Unknown data packet received from the device:"
|
||||
" %2x %2x\n",
|
||||
data[0], data[1]);
|
||||
}
|
||||
}
|
||||
/*
|
||||
* Data from the device comes with a 2 byte header:
|
||||
*
|
||||
* <0x00><0x00>data...
|
||||
* This is real data to be sent to the tty layer
|
||||
* <0x00><0x01>level
|
||||
* This is a CTS level change, the third byte is the CTS
|
||||
* value (0 for low, 1 for high).
|
||||
*/
|
||||
if ((hdr[0] == 0x00) && (hdr[1] == 0x00)) {
|
||||
opticon_process_data_packet(port, data, data_len);
|
||||
} else if ((hdr[0] == 0x00) && (hdr[1] == 0x01)) {
|
||||
opticon_process_status_packet(port, data, data_len);
|
||||
} else {
|
||||
dev_dbg(&priv->udev->dev,
|
||||
"Improper amount of data received from the device, "
|
||||
"%d bytes", urb->actual_length);
|
||||
dev_dbg(&port->dev, "unknown packet received: %02x %02x\n",
|
||||
hdr[0], hdr[1]);
|
||||
}
|
||||
|
||||
exit:
|
||||
spin_lock(&priv->lock);
|
||||
|
||||
/* Continue trying to always read if we should */
|
||||
if (!priv->throttled) {
|
||||
usb_fill_bulk_urb(priv->bulk_read_urb, priv->udev,
|
||||
usb_rcvbulkpipe(priv->udev,
|
||||
priv->bulk_address),
|
||||
priv->bulk_in_buffer, priv->buffer_size,
|
||||
opticon_read_bulk_callback, priv);
|
||||
result = usb_submit_urb(priv->bulk_read_urb, GFP_ATOMIC);
|
||||
if (result)
|
||||
dev_err(&port->dev,
|
||||
"%s - failed resubmitting read urb, error %d\n",
|
||||
__func__, result);
|
||||
} else
|
||||
priv->actually_throttled = true;
|
||||
spin_unlock(&priv->lock);
|
||||
}
|
||||
|
||||
static int send_control_msg(struct usb_serial_port *port, u8 requesttype,
|
||||
@@ -175,52 +132,35 @@ static int send_control_msg(struct usb_serial_port *port, u8 requesttype,
|
||||
|
||||
static int opticon_open(struct tty_struct *tty, struct usb_serial_port *port)
|
||||
{
|
||||
struct opticon_private *priv = usb_get_serial_data(port->serial);
|
||||
struct opticon_private *priv = usb_get_serial_port_data(port);
|
||||
unsigned long flags;
|
||||
int result = 0;
|
||||
int res;
|
||||
|
||||
spin_lock_irqsave(&priv->lock, flags);
|
||||
priv->throttled = false;
|
||||
priv->actually_throttled = false;
|
||||
priv->port = port;
|
||||
priv->rts = false;
|
||||
spin_unlock_irqrestore(&priv->lock, flags);
|
||||
|
||||
/* Clear RTS line */
|
||||
send_control_msg(port, CONTROL_RTS, 0);
|
||||
|
||||
/* Setup the read URB and start reading from the device */
|
||||
usb_fill_bulk_urb(priv->bulk_read_urb, priv->udev,
|
||||
usb_rcvbulkpipe(priv->udev,
|
||||
priv->bulk_address),
|
||||
priv->bulk_in_buffer, priv->buffer_size,
|
||||
opticon_read_bulk_callback, priv);
|
||||
|
||||
/* clear the halt status of the enpoint */
|
||||
usb_clear_halt(priv->udev, priv->bulk_read_urb->pipe);
|
||||
usb_clear_halt(port->serial->dev, port->read_urb->pipe);
|
||||
|
||||
res = usb_serial_generic_open(tty, port);
|
||||
if (!res)
|
||||
return res;
|
||||
|
||||
result = usb_submit_urb(priv->bulk_read_urb, GFP_KERNEL);
|
||||
if (result)
|
||||
dev_err(&port->dev,
|
||||
"%s - failed resubmitting read urb, error %d\n",
|
||||
__func__, result);
|
||||
/* Request CTS line state, sometimes during opening the current
|
||||
* CTS state can be missed. */
|
||||
send_control_msg(port, RESEND_CTS_STATE, 1);
|
||||
return result;
|
||||
}
|
||||
|
||||
static void opticon_close(struct usb_serial_port *port)
|
||||
{
|
||||
struct opticon_private *priv = usb_get_serial_data(port->serial);
|
||||
|
||||
/* shutdown our urbs */
|
||||
usb_kill_urb(priv->bulk_read_urb);
|
||||
return res;
|
||||
}
|
||||
|
||||
static void opticon_write_control_callback(struct urb *urb)
|
||||
{
|
||||
struct opticon_private *priv = urb->context;
|
||||
struct usb_serial_port *port = urb->context;
|
||||
struct opticon_private *priv = usb_get_serial_port_data(port);
|
||||
int status = urb->status;
|
||||
unsigned long flags;
|
||||
|
||||
@@ -231,20 +171,21 @@ static void opticon_write_control_callback(struct urb *urb)
|
||||
kfree(urb->setup_packet);
|
||||
|
||||
if (status)
|
||||
dev_dbg(&priv->udev->dev, "%s - nonzero write bulk status received: %d\n",
|
||||
dev_dbg(&port->dev,
|
||||
"%s - non-zero urb status received: %d\n",
|
||||
__func__, status);
|
||||
|
||||
spin_lock_irqsave(&priv->lock, flags);
|
||||
--priv->outstanding_urbs;
|
||||
spin_unlock_irqrestore(&priv->lock, flags);
|
||||
|
||||
usb_serial_port_softint(priv->port);
|
||||
usb_serial_port_softint(port);
|
||||
}
|
||||
|
||||
static int opticon_write(struct tty_struct *tty, struct usb_serial_port *port,
|
||||
const unsigned char *buf, int count)
|
||||
{
|
||||
struct opticon_private *priv = usb_get_serial_data(port->serial);
|
||||
struct opticon_private *priv = usb_get_serial_port_data(port);
|
||||
struct usb_serial *serial = port->serial;
|
||||
struct urb *urb;
|
||||
unsigned char *buffer;
|
||||
@@ -298,7 +239,7 @@ static int opticon_write(struct tty_struct *tty, struct usb_serial_port *port,
|
||||
usb_fill_control_urb(urb, serial->dev,
|
||||
usb_sndctrlpipe(serial->dev, 0),
|
||||
(unsigned char *)dr, buffer, count,
|
||||
opticon_write_control_callback, priv);
|
||||
opticon_write_control_callback, port);
|
||||
|
||||
/* send it down the pipe */
|
||||
status = usb_submit_urb(urb, GFP_ATOMIC);
|
||||
@@ -331,7 +272,7 @@ error_no_buffer:
|
||||
static int opticon_write_room(struct tty_struct *tty)
|
||||
{
|
||||
struct usb_serial_port *port = tty->driver_data;
|
||||
struct opticon_private *priv = usb_get_serial_data(port->serial);
|
||||
struct opticon_private *priv = usb_get_serial_port_data(port);
|
||||
unsigned long flags;
|
||||
|
||||
/*
|
||||
@@ -350,44 +291,10 @@ static int opticon_write_room(struct tty_struct *tty)
|
||||
return 2048;
|
||||
}
|
||||
|
||||
static void opticon_throttle(struct tty_struct *tty)
|
||||
{
|
||||
struct usb_serial_port *port = tty->driver_data;
|
||||
struct opticon_private *priv = usb_get_serial_data(port->serial);
|
||||
unsigned long flags;
|
||||
|
||||
spin_lock_irqsave(&priv->lock, flags);
|
||||
priv->throttled = true;
|
||||
spin_unlock_irqrestore(&priv->lock, flags);
|
||||
}
|
||||
|
||||
|
||||
static void opticon_unthrottle(struct tty_struct *tty)
|
||||
{
|
||||
struct usb_serial_port *port = tty->driver_data;
|
||||
struct opticon_private *priv = usb_get_serial_data(port->serial);
|
||||
unsigned long flags;
|
||||
int result, was_throttled;
|
||||
|
||||
spin_lock_irqsave(&priv->lock, flags);
|
||||
priv->throttled = false;
|
||||
was_throttled = priv->actually_throttled;
|
||||
priv->actually_throttled = false;
|
||||
spin_unlock_irqrestore(&priv->lock, flags);
|
||||
|
||||
if (was_throttled) {
|
||||
result = usb_submit_urb(priv->bulk_read_urb, GFP_ATOMIC);
|
||||
if (result)
|
||||
dev_err(&port->dev,
|
||||
"%s - failed submitting read urb, error %d\n",
|
||||
__func__, result);
|
||||
}
|
||||
}
|
||||
|
||||
static int opticon_tiocmget(struct tty_struct *tty)
|
||||
{
|
||||
struct usb_serial_port *port = tty->driver_data;
|
||||
struct opticon_private *priv = usb_get_serial_data(port->serial);
|
||||
struct opticon_private *priv = usb_get_serial_port_data(port);
|
||||
unsigned long flags;
|
||||
int result = 0;
|
||||
|
||||
@@ -407,7 +314,7 @@ static int opticon_tiocmset(struct tty_struct *tty,
|
||||
{
|
||||
struct usb_serial_port *port = tty->driver_data;
|
||||
struct usb_serial *serial = port->serial;
|
||||
struct opticon_private *priv = usb_get_serial_data(port->serial);
|
||||
struct opticon_private *priv = usb_get_serial_port_data(port);
|
||||
unsigned long flags;
|
||||
bool rts;
|
||||
bool changed = false;
|
||||
@@ -438,7 +345,7 @@ static int opticon_tiocmset(struct tty_struct *tty,
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int get_serial_info(struct opticon_private *priv,
|
||||
static int get_serial_info(struct usb_serial_port *port,
|
||||
struct serial_struct __user *serial)
|
||||
{
|
||||
struct serial_struct tmp;
|
||||
@@ -450,7 +357,7 @@ static int get_serial_info(struct opticon_private *priv,
|
||||
|
||||
/* fake emulate a 16550 uart to make userspace code happy */
|
||||
tmp.type = PORT_16550A;
|
||||
tmp.line = priv->serial->minor;
|
||||
tmp.line = port->serial->minor;
|
||||
tmp.port = 0;
|
||||
tmp.irq = 0;
|
||||
tmp.flags = ASYNC_SKIP_TEST | ASYNC_AUTO_IRQ;
|
||||
@@ -468,13 +375,12 @@ static int opticon_ioctl(struct tty_struct *tty,
|
||||
unsigned int cmd, unsigned long arg)
|
||||
{
|
||||
struct usb_serial_port *port = tty->driver_data;
|
||||
struct opticon_private *priv = usb_get_serial_data(port->serial);
|
||||
|
||||
dev_dbg(&port->dev, "%s - port %d, cmd = 0x%x\n", __func__, port->number, cmd);
|
||||
|
||||
switch (cmd) {
|
||||
case TIOCGSERIAL:
|
||||
return get_serial_info(priv,
|
||||
return get_serial_info(port,
|
||||
(struct serial_struct __user *)arg);
|
||||
}
|
||||
|
||||
@@ -482,107 +388,37 @@ static int opticon_ioctl(struct tty_struct *tty,
|
||||
}
|
||||
|
||||
static int opticon_startup(struct usb_serial *serial)
|
||||
{
|
||||
if (!serial->num_bulk_in) {
|
||||
dev_err(&serial->dev->dev, "no bulk in endpoint\n");
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int opticon_port_probe(struct usb_serial_port *port)
|
||||
{
|
||||
struct opticon_private *priv;
|
||||
struct usb_host_interface *intf;
|
||||
int i;
|
||||
int retval = -ENOMEM;
|
||||
bool bulk_in_found = false;
|
||||
|
||||
/* create our private serial structure */
|
||||
priv = kzalloc(sizeof(*priv), GFP_KERNEL);
|
||||
if (priv == NULL) {
|
||||
dev_err(&serial->dev->dev, "%s - Out of memory\n", __func__);
|
||||
if (!priv)
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
spin_lock_init(&priv->lock);
|
||||
priv->serial = serial;
|
||||
priv->port = serial->port[0];
|
||||
priv->udev = serial->dev;
|
||||
priv->outstanding_urbs = 0; /* Init the outstanding urbs */
|
||||
|
||||
/* find our bulk endpoint */
|
||||
intf = serial->interface->altsetting;
|
||||
for (i = 0; i < intf->desc.bNumEndpoints; ++i) {
|
||||
struct usb_endpoint_descriptor *endpoint;
|
||||
usb_set_serial_port_data(port, priv);
|
||||
|
||||
endpoint = &intf->endpoint[i].desc;
|
||||
if (!usb_endpoint_is_bulk_in(endpoint))
|
||||
continue;
|
||||
|
||||
priv->bulk_read_urb = usb_alloc_urb(0, GFP_KERNEL);
|
||||
if (!priv->bulk_read_urb) {
|
||||
dev_err(&priv->udev->dev, "out of memory\n");
|
||||
goto error;
|
||||
}
|
||||
|
||||
priv->buffer_size = usb_endpoint_maxp(endpoint) * 2;
|
||||
priv->bulk_in_buffer = kmalloc(priv->buffer_size, GFP_KERNEL);
|
||||
if (!priv->bulk_in_buffer) {
|
||||
dev_err(&priv->udev->dev, "out of memory\n");
|
||||
goto error;
|
||||
}
|
||||
|
||||
priv->bulk_address = endpoint->bEndpointAddress;
|
||||
|
||||
bulk_in_found = true;
|
||||
break;
|
||||
}
|
||||
|
||||
if (!bulk_in_found) {
|
||||
dev_err(&priv->udev->dev,
|
||||
"Error - the proper endpoints were not found!\n");
|
||||
goto error;
|
||||
}
|
||||
|
||||
usb_set_serial_data(serial, priv);
|
||||
return 0;
|
||||
|
||||
error:
|
||||
usb_free_urb(priv->bulk_read_urb);
|
||||
kfree(priv->bulk_in_buffer);
|
||||
kfree(priv);
|
||||
return retval;
|
||||
}
|
||||
|
||||
static void opticon_disconnect(struct usb_serial *serial)
|
||||
{
|
||||
struct opticon_private *priv = usb_get_serial_data(serial);
|
||||
|
||||
usb_kill_urb(priv->bulk_read_urb);
|
||||
usb_free_urb(priv->bulk_read_urb);
|
||||
}
|
||||
|
||||
static void opticon_release(struct usb_serial *serial)
|
||||
{
|
||||
struct opticon_private *priv = usb_get_serial_data(serial);
|
||||
|
||||
kfree(priv->bulk_in_buffer);
|
||||
kfree(priv);
|
||||
}
|
||||
|
||||
static int opticon_suspend(struct usb_serial *serial, pm_message_t message)
|
||||
{
|
||||
struct opticon_private *priv = usb_get_serial_data(serial);
|
||||
|
||||
usb_kill_urb(priv->bulk_read_urb);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int opticon_resume(struct usb_serial *serial)
|
||||
static int opticon_port_remove(struct usb_serial_port *port)
|
||||
{
|
||||
struct opticon_private *priv = usb_get_serial_data(serial);
|
||||
struct usb_serial_port *port = serial->port[0];
|
||||
int result;
|
||||
struct opticon_private *priv = usb_get_serial_port_data(port);
|
||||
|
||||
mutex_lock(&port->port.mutex);
|
||||
/* This is protected by the port mutex against close/open */
|
||||
if (test_bit(ASYNCB_INITIALIZED, &port->port.flags))
|
||||
result = usb_submit_urb(priv->bulk_read_urb, GFP_NOIO);
|
||||
else
|
||||
result = 0;
|
||||
mutex_unlock(&port->port.mutex);
|
||||
return result;
|
||||
kfree(priv);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct usb_serial_driver opticon_device = {
|
||||
@@ -592,20 +428,19 @@ static struct usb_serial_driver opticon_device = {
|
||||
},
|
||||
.id_table = id_table,
|
||||
.num_ports = 1,
|
||||
.bulk_in_size = 256,
|
||||
.attach = opticon_startup,
|
||||
.port_probe = opticon_port_probe,
|
||||
.port_remove = opticon_port_remove,
|
||||
.open = opticon_open,
|
||||
.close = opticon_close,
|
||||
.write = opticon_write,
|
||||
.write_room = opticon_write_room,
|
||||
.disconnect = opticon_disconnect,
|
||||
.release = opticon_release,
|
||||
.throttle = opticon_throttle,
|
||||
.unthrottle = opticon_unthrottle,
|
||||
.throttle = usb_serial_generic_throttle,
|
||||
.unthrottle = usb_serial_generic_unthrottle,
|
||||
.ioctl = opticon_ioctl,
|
||||
.tiocmget = opticon_tiocmget,
|
||||
.tiocmset = opticon_tiocmset,
|
||||
.suspend = opticon_suspend,
|
||||
.resume = opticon_resume,
|
||||
.process_read_urb = opticon_process_read_urb,
|
||||
};
|
||||
|
||||
static struct usb_serial_driver * const serial_drivers[] = {
|
||||
|
||||
@@ -28,7 +28,6 @@
|
||||
device features.
|
||||
*/
|
||||
|
||||
#define DRIVER_VERSION "v0.7.2"
|
||||
#define DRIVER_AUTHOR "Matthias Urlichs <smurf@smurf.noris.de>"
|
||||
#define DRIVER_DESC "USB Driver for GSM modems"
|
||||
|
||||
@@ -81,6 +80,7 @@ static void option_instat_callback(struct urb *urb);
|
||||
#define OPTION_PRODUCT_GTM380_MODEM 0x7201
|
||||
|
||||
#define HUAWEI_VENDOR_ID 0x12D1
|
||||
#define HUAWEI_PRODUCT_E173 0x140C
|
||||
#define HUAWEI_PRODUCT_K4505 0x1464
|
||||
#define HUAWEI_PRODUCT_K3765 0x1465
|
||||
#define HUAWEI_PRODUCT_K4605 0x14C6
|
||||
@@ -553,6 +553,8 @@ static const struct usb_device_id option_ids[] = {
|
||||
{ USB_DEVICE(QUANTA_VENDOR_ID, QUANTA_PRODUCT_GLX) },
|
||||
{ USB_DEVICE(QUANTA_VENDOR_ID, QUANTA_PRODUCT_GKE) },
|
||||
{ USB_DEVICE(QUANTA_VENDOR_ID, QUANTA_PRODUCT_GLE) },
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E173, 0xff, 0xff, 0xff),
|
||||
.driver_info = (kernel_ulong_t) &net_intf1_blacklist },
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_K4505, 0xff, 0xff, 0xff),
|
||||
.driver_info = (kernel_ulong_t) &huawei_cdc12_blacklist },
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_K3765, 0xff, 0xff, 0xff),
|
||||
@@ -741,23 +743,23 @@ static const struct usb_device_id option_ids[] = {
|
||||
{ USB_DEVICE(ANYDATA_VENDOR_ID, ANYDATA_PRODUCT_ADU_620UW) },
|
||||
{ USB_DEVICE(AXESSTEL_VENDOR_ID, AXESSTEL_PRODUCT_MV110H) },
|
||||
{ USB_DEVICE(YISO_VENDOR_ID, YISO_PRODUCT_U893) },
|
||||
{ USB_DEVICE(BANDRICH_VENDOR_ID, BANDRICH_PRODUCT_C100_1) },
|
||||
{ USB_DEVICE(BANDRICH_VENDOR_ID, BANDRICH_PRODUCT_C100_2) },
|
||||
{ USB_DEVICE(BANDRICH_VENDOR_ID, BANDRICH_PRODUCT_1004) },
|
||||
{ USB_DEVICE(BANDRICH_VENDOR_ID, BANDRICH_PRODUCT_1005) },
|
||||
{ USB_DEVICE(BANDRICH_VENDOR_ID, BANDRICH_PRODUCT_1006) },
|
||||
{ USB_DEVICE(BANDRICH_VENDOR_ID, BANDRICH_PRODUCT_1007) },
|
||||
{ USB_DEVICE(BANDRICH_VENDOR_ID, BANDRICH_PRODUCT_1008) },
|
||||
{ USB_DEVICE(BANDRICH_VENDOR_ID, BANDRICH_PRODUCT_1009) },
|
||||
{ USB_DEVICE(BANDRICH_VENDOR_ID, BANDRICH_PRODUCT_100A) },
|
||||
{ USB_DEVICE(BANDRICH_VENDOR_ID, BANDRICH_PRODUCT_100B) },
|
||||
{ USB_DEVICE(BANDRICH_VENDOR_ID, BANDRICH_PRODUCT_100C) },
|
||||
{ USB_DEVICE(BANDRICH_VENDOR_ID, BANDRICH_PRODUCT_100D) },
|
||||
{ USB_DEVICE(BANDRICH_VENDOR_ID, BANDRICH_PRODUCT_100E) },
|
||||
{ USB_DEVICE(BANDRICH_VENDOR_ID, BANDRICH_PRODUCT_100F) },
|
||||
{ USB_DEVICE(BANDRICH_VENDOR_ID, BANDRICH_PRODUCT_1010) },
|
||||
{ USB_DEVICE(BANDRICH_VENDOR_ID, BANDRICH_PRODUCT_1011) },
|
||||
{ USB_DEVICE(BANDRICH_VENDOR_ID, BANDRICH_PRODUCT_1012) },
|
||||
{ USB_DEVICE_INTERFACE_CLASS(BANDRICH_VENDOR_ID, BANDRICH_PRODUCT_C100_1, 0xff) },
|
||||
{ USB_DEVICE_INTERFACE_CLASS(BANDRICH_VENDOR_ID, BANDRICH_PRODUCT_C100_2, 0xff) },
|
||||
{ USB_DEVICE_INTERFACE_CLASS(BANDRICH_VENDOR_ID, BANDRICH_PRODUCT_1004, 0xff) },
|
||||
{ USB_DEVICE_INTERFACE_CLASS(BANDRICH_VENDOR_ID, BANDRICH_PRODUCT_1005, 0xff) },
|
||||
{ USB_DEVICE_INTERFACE_CLASS(BANDRICH_VENDOR_ID, BANDRICH_PRODUCT_1006, 0xff) },
|
||||
{ USB_DEVICE_INTERFACE_CLASS(BANDRICH_VENDOR_ID, BANDRICH_PRODUCT_1007, 0xff) },
|
||||
{ USB_DEVICE_INTERFACE_CLASS(BANDRICH_VENDOR_ID, BANDRICH_PRODUCT_1008, 0xff) },
|
||||
{ USB_DEVICE_INTERFACE_CLASS(BANDRICH_VENDOR_ID, BANDRICH_PRODUCT_1009, 0xff) },
|
||||
{ USB_DEVICE_INTERFACE_CLASS(BANDRICH_VENDOR_ID, BANDRICH_PRODUCT_100A, 0xff) },
|
||||
{ USB_DEVICE_INTERFACE_CLASS(BANDRICH_VENDOR_ID, BANDRICH_PRODUCT_100B, 0xff) },
|
||||
{ USB_DEVICE_INTERFACE_CLASS(BANDRICH_VENDOR_ID, BANDRICH_PRODUCT_100C, 0xff) },
|
||||
{ USB_DEVICE_INTERFACE_CLASS(BANDRICH_VENDOR_ID, BANDRICH_PRODUCT_100D, 0xff) },
|
||||
{ USB_DEVICE_INTERFACE_CLASS(BANDRICH_VENDOR_ID, BANDRICH_PRODUCT_100E, 0xff) },
|
||||
{ USB_DEVICE_INTERFACE_CLASS(BANDRICH_VENDOR_ID, BANDRICH_PRODUCT_100F, 0xff) },
|
||||
{ USB_DEVICE_INTERFACE_CLASS(BANDRICH_VENDOR_ID, BANDRICH_PRODUCT_1010, 0xff) },
|
||||
{ USB_DEVICE_INTERFACE_CLASS(BANDRICH_VENDOR_ID, BANDRICH_PRODUCT_1011, 0xff) },
|
||||
{ USB_DEVICE_INTERFACE_CLASS(BANDRICH_VENDOR_ID, BANDRICH_PRODUCT_1012, 0xff) },
|
||||
{ USB_DEVICE(KYOCERA_VENDOR_ID, KYOCERA_PRODUCT_KPC650) },
|
||||
{ USB_DEVICE(KYOCERA_VENDOR_ID, KYOCERA_PRODUCT_KPC680) },
|
||||
{ USB_DEVICE(QUALCOMM_VENDOR_ID, 0x6000)}, /* ZTE AC8700 */
|
||||
@@ -884,6 +886,10 @@ static const struct usb_device_id option_ids[] = {
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0126, 0xff, 0xff, 0xff),
|
||||
.driver_info = (kernel_ulong_t)&net_intf5_blacklist },
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0128, 0xff, 0xff, 0xff) },
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0135, 0xff, 0xff, 0xff) },
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0136, 0xff, 0xff, 0xff) },
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0137, 0xff, 0xff, 0xff) },
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0139, 0xff, 0xff, 0xff) },
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0142, 0xff, 0xff, 0xff) },
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0143, 0xff, 0xff, 0xff) },
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0144, 0xff, 0xff, 0xff) },
|
||||
@@ -904,20 +910,34 @@ static const struct usb_device_id option_ids[] = {
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0165, 0xff, 0xff, 0xff) },
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0167, 0xff, 0xff, 0xff),
|
||||
.driver_info = (kernel_ulong_t)&net_intf4_blacklist },
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0189, 0xff, 0xff, 0xff) },
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0191, 0xff, 0xff, 0xff), /* ZTE EuFi890 */
|
||||
.driver_info = (kernel_ulong_t)&net_intf4_blacklist },
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0196, 0xff, 0xff, 0xff) },
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0197, 0xff, 0xff, 0xff) },
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0199, 0xff, 0xff, 0xff), /* ZTE MF820S */
|
||||
.driver_info = (kernel_ulong_t)&net_intf1_blacklist },
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0200, 0xff, 0xff, 0xff) },
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0201, 0xff, 0xff, 0xff) },
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0254, 0xff, 0xff, 0xff) },
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0257, 0xff, 0xff, 0xff), /* ZTE MF821 */
|
||||
.driver_info = (kernel_ulong_t)&net_intf3_blacklist },
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0265, 0xff, 0xff, 0xff) },
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0284, 0xff, 0xff, 0xff) },
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0317, 0xff, 0xff, 0xff) },
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0326, 0xff, 0xff, 0xff),
|
||||
.driver_info = (kernel_ulong_t)&net_intf4_blacklist },
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0330, 0xff, 0xff, 0xff) },
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0395, 0xff, 0xff, 0xff) },
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0414, 0xff, 0xff, 0xff) },
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0417, 0xff, 0xff, 0xff) },
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1008, 0xff, 0xff, 0xff),
|
||||
.driver_info = (kernel_ulong_t)&net_intf4_blacklist },
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1010, 0xff, 0xff, 0xff),
|
||||
.driver_info = (kernel_ulong_t)&net_intf4_blacklist },
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1012, 0xff, 0xff, 0xff),
|
||||
.driver_info = (kernel_ulong_t)&net_intf4_blacklist },
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1018, 0xff, 0xff, 0xff) },
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1021, 0xff, 0xff, 0xff),
|
||||
.driver_info = (kernel_ulong_t)&net_intf2_blacklist },
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1057, 0xff, 0xff, 0xff) },
|
||||
@@ -1097,6 +1117,10 @@ static const struct usb_device_id option_ids[] = {
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1298, 0xff, 0xff, 0xff) },
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1299, 0xff, 0xff, 0xff) },
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1300, 0xff, 0xff, 0xff) },
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1301, 0xff, 0xff, 0xff) },
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1302, 0xff, 0xff, 0xff) },
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1303, 0xff, 0xff, 0xff) },
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1333, 0xff, 0xff, 0xff) },
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1401, 0xff, 0xff, 0xff),
|
||||
.driver_info = (kernel_ulong_t)&net_intf2_blacklist },
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1402, 0xff, 0xff, 0xff),
|
||||
@@ -1174,22 +1198,22 @@ static const struct usb_device_id option_ids[] = {
|
||||
{ USB_DEVICE(LONGCHEER_VENDOR_ID, ZOOM_PRODUCT_4597) },
|
||||
{ USB_DEVICE(HAIER_VENDOR_ID, HAIER_PRODUCT_CE100) },
|
||||
/* Pirelli */
|
||||
{ USB_DEVICE(PIRELLI_VENDOR_ID, PIRELLI_PRODUCT_C100_1)},
|
||||
{ USB_DEVICE(PIRELLI_VENDOR_ID, PIRELLI_PRODUCT_C100_2)},
|
||||
{ USB_DEVICE(PIRELLI_VENDOR_ID, PIRELLI_PRODUCT_1004)},
|
||||
{ USB_DEVICE(PIRELLI_VENDOR_ID, PIRELLI_PRODUCT_1005)},
|
||||
{ USB_DEVICE(PIRELLI_VENDOR_ID, PIRELLI_PRODUCT_1006)},
|
||||
{ USB_DEVICE(PIRELLI_VENDOR_ID, PIRELLI_PRODUCT_1007)},
|
||||
{ USB_DEVICE(PIRELLI_VENDOR_ID, PIRELLI_PRODUCT_1008)},
|
||||
{ USB_DEVICE(PIRELLI_VENDOR_ID, PIRELLI_PRODUCT_1009)},
|
||||
{ USB_DEVICE(PIRELLI_VENDOR_ID, PIRELLI_PRODUCT_100A)},
|
||||
{ USB_DEVICE(PIRELLI_VENDOR_ID, PIRELLI_PRODUCT_100B) },
|
||||
{ USB_DEVICE(PIRELLI_VENDOR_ID, PIRELLI_PRODUCT_100C) },
|
||||
{ USB_DEVICE(PIRELLI_VENDOR_ID, PIRELLI_PRODUCT_100D) },
|
||||
{ USB_DEVICE(PIRELLI_VENDOR_ID, PIRELLI_PRODUCT_100E) },
|
||||
{ USB_DEVICE(PIRELLI_VENDOR_ID, PIRELLI_PRODUCT_100F) },
|
||||
{ USB_DEVICE(PIRELLI_VENDOR_ID, PIRELLI_PRODUCT_1011)},
|
||||
{ USB_DEVICE(PIRELLI_VENDOR_ID, PIRELLI_PRODUCT_1012)},
|
||||
{ USB_DEVICE_INTERFACE_CLASS(PIRELLI_VENDOR_ID, PIRELLI_PRODUCT_C100_1, 0xff) },
|
||||
{ USB_DEVICE_INTERFACE_CLASS(PIRELLI_VENDOR_ID, PIRELLI_PRODUCT_C100_2, 0xff) },
|
||||
{ USB_DEVICE_INTERFACE_CLASS(PIRELLI_VENDOR_ID, PIRELLI_PRODUCT_1004, 0xff) },
|
||||
{ USB_DEVICE_INTERFACE_CLASS(PIRELLI_VENDOR_ID, PIRELLI_PRODUCT_1005, 0xff) },
|
||||
{ USB_DEVICE_INTERFACE_CLASS(PIRELLI_VENDOR_ID, PIRELLI_PRODUCT_1006, 0xff) },
|
||||
{ USB_DEVICE_INTERFACE_CLASS(PIRELLI_VENDOR_ID, PIRELLI_PRODUCT_1007, 0xff) },
|
||||
{ USB_DEVICE_INTERFACE_CLASS(PIRELLI_VENDOR_ID, PIRELLI_PRODUCT_1008, 0xff) },
|
||||
{ USB_DEVICE_INTERFACE_CLASS(PIRELLI_VENDOR_ID, PIRELLI_PRODUCT_1009, 0xff) },
|
||||
{ USB_DEVICE_INTERFACE_CLASS(PIRELLI_VENDOR_ID, PIRELLI_PRODUCT_100A, 0xff) },
|
||||
{ USB_DEVICE_INTERFACE_CLASS(PIRELLI_VENDOR_ID, PIRELLI_PRODUCT_100B, 0xff) },
|
||||
{ USB_DEVICE_INTERFACE_CLASS(PIRELLI_VENDOR_ID, PIRELLI_PRODUCT_100C, 0xff) },
|
||||
{ USB_DEVICE_INTERFACE_CLASS(PIRELLI_VENDOR_ID, PIRELLI_PRODUCT_100D, 0xff) },
|
||||
{ USB_DEVICE_INTERFACE_CLASS(PIRELLI_VENDOR_ID, PIRELLI_PRODUCT_100E, 0xff) },
|
||||
{ USB_DEVICE_INTERFACE_CLASS(PIRELLI_VENDOR_ID, PIRELLI_PRODUCT_100F, 0xff) },
|
||||
{ USB_DEVICE_INTERFACE_CLASS(PIRELLI_VENDOR_ID, PIRELLI_PRODUCT_1011, 0xff) },
|
||||
{ USB_DEVICE_INTERFACE_CLASS(PIRELLI_VENDOR_ID, PIRELLI_PRODUCT_1012, 0xff) },
|
||||
/* Cinterion */
|
||||
{ USB_DEVICE(CINTERION_VENDOR_ID, CINTERION_PRODUCT_EU3_E) },
|
||||
{ USB_DEVICE(CINTERION_VENDOR_ID, CINTERION_PRODUCT_EU3_P) },
|
||||
@@ -1350,20 +1374,10 @@ static int option_probe(struct usb_serial *serial,
|
||||
&serial->interface->cur_altsetting->desc;
|
||||
struct usb_device_descriptor *dev_desc = &serial->dev->descriptor;
|
||||
|
||||
/*
|
||||
* D-Link DWM 652 still exposes CD-Rom emulation interface in modem
|
||||
* mode.
|
||||
*/
|
||||
if (dev_desc->idVendor == DLINK_VENDOR_ID &&
|
||||
dev_desc->idProduct == DLINK_PRODUCT_DWM_652 &&
|
||||
iface_desc->bInterfaceClass == 0x08)
|
||||
/* Never bind to the CD-Rom emulation interface */
|
||||
if (iface_desc->bInterfaceClass == 0x08)
|
||||
return -ENODEV;
|
||||
|
||||
/* Bandrich modem and AT command interface is 0xff */
|
||||
if ((dev_desc->idVendor == BANDRICH_VENDOR_ID ||
|
||||
dev_desc->idVendor == PIRELLI_VENDOR_ID) &&
|
||||
iface_desc->bInterfaceClass != 0xff)
|
||||
return -ENODEV;
|
||||
/*
|
||||
* Don't bind reserved interfaces (like network ones) which often have
|
||||
* the same class/subclass/protocol as the serial interfaces. Look at
|
||||
@@ -1378,9 +1392,9 @@ static int option_probe(struct usb_serial *serial,
|
||||
* Don't bind network interface on Samsung GT-B3730, it is handled by
|
||||
* a separate module.
|
||||
*/
|
||||
if (dev_desc->idVendor == SAMSUNG_VENDOR_ID &&
|
||||
dev_desc->idProduct == SAMSUNG_PRODUCT_GT_B3730 &&
|
||||
iface_desc->bInterfaceClass != USB_CLASS_CDC_DATA)
|
||||
if (dev_desc->idVendor == cpu_to_le16(SAMSUNG_VENDOR_ID) &&
|
||||
dev_desc->idProduct == cpu_to_le16(SAMSUNG_PRODUCT_GT_B3730) &&
|
||||
iface_desc->bInterfaceClass != USB_CLASS_CDC_DATA)
|
||||
return -ENODEV;
|
||||
|
||||
/* Store device id so we can use it during attach. */
|
||||
@@ -1518,5 +1532,4 @@ static int option_send_setup(struct usb_serial_port *port)
|
||||
|
||||
MODULE_AUTHOR(DRIVER_AUTHOR);
|
||||
MODULE_DESCRIPTION(DRIVER_DESC);
|
||||
MODULE_VERSION(DRIVER_VERSION);
|
||||
MODULE_LICENSE("GPL");
|
||||
|
||||
@@ -57,7 +57,6 @@
|
||||
#define OTI6858_DESCRIPTION \
|
||||
"Ours Technology Inc. OTi-6858 USB to serial adapter driver"
|
||||
#define OTI6858_AUTHOR "Tomasz Michal Lukaszewski <FIXME@FIXME>"
|
||||
#define OTI6858_VERSION "0.2"
|
||||
|
||||
static const struct usb_device_id id_table[] = {
|
||||
{ USB_DEVICE(OTI6858_VENDOR_ID, OTI6858_PRODUCT_ID) },
|
||||
@@ -899,5 +898,4 @@ module_usb_serial_driver(serial_drivers, id_table);
|
||||
|
||||
MODULE_DESCRIPTION(OTI6858_DESCRIPTION);
|
||||
MODULE_AUTHOR(OTI6858_AUTHOR);
|
||||
MODULE_VERSION(OTI6858_VERSION);
|
||||
MODULE_LICENSE("GPL");
|
||||
|
||||
@@ -65,8 +65,6 @@
|
||||
#define QT2_WRITE_BUFFER_SIZE 512 /* size of write buffer */
|
||||
#define QT2_WRITE_CONTROL_SIZE 5 /* control bytes used for a write */
|
||||
|
||||
/* Version Information */
|
||||
#define DRIVER_VERSION "v0.1"
|
||||
#define DRIVER_DESC "Quatech 2nd gen USB to Serial Driver"
|
||||
|
||||
#define USB_VENDOR_ID_QUATECH 0x061d
|
||||
|
||||
@@ -16,8 +16,6 @@
|
||||
#include <linux/usb.h>
|
||||
#include <linux/usb/serial.h>
|
||||
|
||||
/* Version Information */
|
||||
#define DRIVER_VERSION "Version 0.1 09/26/2005"
|
||||
#define DRIVER_AUTHOR "Thomas Hergenhahn@web.de http://libnodave.sf.net"
|
||||
#define DRIVER_DESC "Driver for Siemens USB/MPI adapter"
|
||||
|
||||
|
||||
@@ -18,7 +18,7 @@
|
||||
*/
|
||||
/* Uncomment to log function calls */
|
||||
/* #define DEBUG */
|
||||
#define DRIVER_VERSION "v.1.7.16"
|
||||
|
||||
#define DRIVER_AUTHOR "Kevin Lloyd, Elina Pasheva, Matthew Safar, Rory Filer"
|
||||
#define DRIVER_DESC "USB Driver for Sierra Wireless USB modems"
|
||||
|
||||
@@ -1078,7 +1078,6 @@ module_usb_serial_driver(serial_drivers, id_table);
|
||||
|
||||
MODULE_AUTHOR(DRIVER_AUTHOR);
|
||||
MODULE_DESCRIPTION(DRIVER_DESC);
|
||||
MODULE_VERSION(DRIVER_VERSION);
|
||||
MODULE_LICENSE("GPL");
|
||||
|
||||
module_param(nmea, bool, S_IRUGO | S_IWUSR);
|
||||
|
||||
@@ -28,9 +28,6 @@
|
||||
#include <linux/usb.h>
|
||||
#include <linux/usb/serial.h>
|
||||
|
||||
|
||||
/* Version Information */
|
||||
#define DRIVER_VERSION "v0.10"
|
||||
#define DRIVER_DESC "SPCP8x5 USB to serial adaptor driver"
|
||||
|
||||
#define SPCP8x5_007_VID 0x04FC
|
||||
@@ -651,5 +648,4 @@ static struct usb_serial_driver * const serial_drivers[] = {
|
||||
module_usb_serial_driver(serial_drivers, id_table);
|
||||
|
||||
MODULE_DESCRIPTION(DRIVER_DESC);
|
||||
MODULE_VERSION(DRIVER_VERSION);
|
||||
MODULE_LICENSE("GPL");
|
||||
|
||||
@@ -46,8 +46,6 @@
|
||||
#define FULLPWRBIT 0x00000080
|
||||
#define NEXT_BOARD_POWER_BIT 0x00000004
|
||||
|
||||
/* Version Information */
|
||||
#define DRIVER_VERSION "v0.1"
|
||||
#define DRIVER_DESC "Quatech SSU-100 USB to Serial Driver"
|
||||
|
||||
#define USB_VENDOR_ID_QUATECH 0x061d /* Quatech VID */
|
||||
|
||||
@@ -19,7 +19,6 @@
|
||||
- controlling the baud rate doesn't make sense
|
||||
*/
|
||||
|
||||
#define DRIVER_VERSION "v0.7.2"
|
||||
#define DRIVER_AUTHOR "Matthias Urlichs <smurf@smurf.noris.de>"
|
||||
#define DRIVER_DESC "USB Driver for GSM modems"
|
||||
|
||||
@@ -710,5 +709,4 @@ EXPORT_SYMBOL(usb_wwan_resume);
|
||||
|
||||
MODULE_AUTHOR(DRIVER_AUTHOR);
|
||||
MODULE_DESCRIPTION(DRIVER_DESC);
|
||||
MODULE_VERSION(DRIVER_VERSION);
|
||||
MODULE_LICENSE("GPL");
|
||||
|
||||
@@ -10,8 +10,6 @@
|
||||
#include <linux/usb.h>
|
||||
#include <linux/usb/serial.h>
|
||||
|
||||
|
||||
#define DRIVER_VERSION "v1.0"
|
||||
#define DRIVER_DESC "ViVOpay USB Serial Driver"
|
||||
|
||||
#define VIVOPAY_VENDOR_ID 0x1d5f
|
||||
@@ -42,5 +40,4 @@ module_usb_serial_driver(serial_drivers, id_table);
|
||||
|
||||
MODULE_AUTHOR("Forest Bond <forest.bond@outpostembedded.com>");
|
||||
MODULE_DESCRIPTION(DRIVER_DESC);
|
||||
MODULE_VERSION(DRIVER_VERSION);
|
||||
MODULE_LICENSE("GPL");
|
||||
|
||||
Reference in New Issue
Block a user