Merge tag 'usb-4.7-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/usb
Pull USB updates from Greg KH: "Here's the big pull request for USB and PHY drivers for 4.7-rc1 Full details in the shortlog, but it's the normal major gadget driver updates, phy updates, new usbip code, as well as a bit of lots of other stuff. All have been in linux-next with no reported issues" * tag 'usb-4.7-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/usb: (164 commits) USB: serial: ti_usb_3410_5052: add MOXA UPORT 11x0 support USB: serial: fix minor-number allocation USB: serial: quatech2: fix use-after-free in probe error path USB: serial: mxuport: fix use-after-free in probe error path USB: serial: keyspan: fix debug and error messages USB: serial: keyspan: fix URB unlink USB: serial: keyspan: fix use-after-free in probe error path USB: serial: io_edgeport: fix memory leaks in probe error path USB: serial: io_edgeport: fix memory leaks in attach error path usb: Remove unnecessary space before operator ','. usb: Remove unnecessary space before open square bracket. USB: FHCI: avoid redundant condition usb: host: xhci-rcar: Avoid long wait in xhci_reset() usb/host/fotg210: remove dead code in create_sysfs_files usb: wusbcore: Do not initialise statics to 0. usb: wusbcore: Remove space before ',' and '(' . USB: serial: cp210x: clean up CRTSCTS flag code USB: serial: cp210x: get rid of magic numbers in CRTSCTS flag code USB: serial: cp210x: fix hardware flow-control disable USB: serial: option: add even more ZTE device ids ...
This commit is contained in:
@@ -331,6 +331,42 @@ struct cp210x_comm_status {
|
||||
*/
|
||||
#define PURGE_ALL 0x000f
|
||||
|
||||
/* CP210X_GET_FLOW/CP210X_SET_FLOW read/write these 0x10 bytes */
|
||||
struct cp210x_flow_ctl {
|
||||
__le32 ulControlHandshake;
|
||||
__le32 ulFlowReplace;
|
||||
__le32 ulXonLimit;
|
||||
__le32 ulXoffLimit;
|
||||
} __packed;
|
||||
|
||||
/* cp210x_flow_ctl::ulControlHandshake */
|
||||
#define CP210X_SERIAL_DTR_MASK GENMASK(1, 0)
|
||||
#define CP210X_SERIAL_DTR_SHIFT(_mode) (_mode)
|
||||
#define CP210X_SERIAL_CTS_HANDSHAKE BIT(3)
|
||||
#define CP210X_SERIAL_DSR_HANDSHAKE BIT(4)
|
||||
#define CP210X_SERIAL_DCD_HANDSHAKE BIT(5)
|
||||
#define CP210X_SERIAL_DSR_SENSITIVITY BIT(6)
|
||||
|
||||
/* values for cp210x_flow_ctl::ulControlHandshake::CP210X_SERIAL_DTR_MASK */
|
||||
#define CP210X_SERIAL_DTR_INACTIVE 0
|
||||
#define CP210X_SERIAL_DTR_ACTIVE 1
|
||||
#define CP210X_SERIAL_DTR_FLOW_CTL 2
|
||||
|
||||
/* cp210x_flow_ctl::ulFlowReplace */
|
||||
#define CP210X_SERIAL_AUTO_TRANSMIT BIT(0)
|
||||
#define CP210X_SERIAL_AUTO_RECEIVE BIT(1)
|
||||
#define CP210X_SERIAL_ERROR_CHAR BIT(2)
|
||||
#define CP210X_SERIAL_NULL_STRIPPING BIT(3)
|
||||
#define CP210X_SERIAL_BREAK_CHAR BIT(4)
|
||||
#define CP210X_SERIAL_RTS_MASK GENMASK(7, 6)
|
||||
#define CP210X_SERIAL_RTS_SHIFT(_mode) (_mode << 6)
|
||||
#define CP210X_SERIAL_XOFF_CONTINUE BIT(31)
|
||||
|
||||
/* values for cp210x_flow_ctl::ulFlowReplace::CP210X_SERIAL_RTS_MASK */
|
||||
#define CP210X_SERIAL_RTS_INACTIVE 0
|
||||
#define CP210X_SERIAL_RTS_ACTIVE 1
|
||||
#define CP210X_SERIAL_RTS_FLOW_CTL 2
|
||||
|
||||
/*
|
||||
* Reads a variable-sized block of CP210X_ registers, identified by req.
|
||||
* Returns data into buf in native USB byte order.
|
||||
@@ -698,9 +734,10 @@ static void cp210x_get_termios_port(struct usb_serial_port *port,
|
||||
{
|
||||
struct device *dev = &port->dev;
|
||||
unsigned int cflag;
|
||||
u8 modem_ctl[16];
|
||||
struct cp210x_flow_ctl flow_ctl;
|
||||
u32 baud;
|
||||
u16 bits;
|
||||
u32 ctl_hs;
|
||||
|
||||
cp210x_read_u32_reg(port, CP210X_GET_BAUDRATE, &baud);
|
||||
|
||||
@@ -796,9 +833,10 @@ static void cp210x_get_termios_port(struct usb_serial_port *port,
|
||||
break;
|
||||
}
|
||||
|
||||
cp210x_read_reg_block(port, CP210X_GET_FLOW, modem_ctl,
|
||||
sizeof(modem_ctl));
|
||||
if (modem_ctl[0] & 0x08) {
|
||||
cp210x_read_reg_block(port, CP210X_GET_FLOW, &flow_ctl,
|
||||
sizeof(flow_ctl));
|
||||
ctl_hs = le32_to_cpu(flow_ctl.ulControlHandshake);
|
||||
if (ctl_hs & CP210X_SERIAL_CTS_HANDSHAKE) {
|
||||
dev_dbg(dev, "%s - flow control = CRTSCTS\n", __func__);
|
||||
cflag |= CRTSCTS;
|
||||
} else {
|
||||
@@ -867,7 +905,6 @@ static void cp210x_set_termios(struct tty_struct *tty,
|
||||
struct device *dev = &port->dev;
|
||||
unsigned int cflag, old_cflag;
|
||||
u16 bits;
|
||||
u8 modem_ctl[16];
|
||||
|
||||
cflag = tty->termios.c_cflag;
|
||||
old_cflag = old_termios->c_cflag;
|
||||
@@ -951,35 +988,44 @@ static void cp210x_set_termios(struct tty_struct *tty,
|
||||
}
|
||||
|
||||
if ((cflag & CRTSCTS) != (old_cflag & CRTSCTS)) {
|
||||
struct cp210x_flow_ctl flow_ctl;
|
||||
u32 ctl_hs;
|
||||
u32 flow_repl;
|
||||
|
||||
/* Only bytes 0, 4 and 7 out of first 8 have functional bits */
|
||||
|
||||
cp210x_read_reg_block(port, CP210X_GET_FLOW, modem_ctl,
|
||||
sizeof(modem_ctl));
|
||||
dev_dbg(dev, "%s - read modem controls = %02x .. .. .. %02x .. .. %02x\n",
|
||||
__func__, modem_ctl[0], modem_ctl[4], modem_ctl[7]);
|
||||
cp210x_read_reg_block(port, CP210X_GET_FLOW, &flow_ctl,
|
||||
sizeof(flow_ctl));
|
||||
ctl_hs = le32_to_cpu(flow_ctl.ulControlHandshake);
|
||||
flow_repl = le32_to_cpu(flow_ctl.ulFlowReplace);
|
||||
dev_dbg(dev, "%s - read ulControlHandshake=0x%08x, ulFlowReplace=0x%08x\n",
|
||||
__func__, ctl_hs, flow_repl);
|
||||
|
||||
ctl_hs &= ~CP210X_SERIAL_DSR_HANDSHAKE;
|
||||
ctl_hs &= ~CP210X_SERIAL_DCD_HANDSHAKE;
|
||||
ctl_hs &= ~CP210X_SERIAL_DSR_SENSITIVITY;
|
||||
ctl_hs &= ~CP210X_SERIAL_DTR_MASK;
|
||||
ctl_hs |= CP210X_SERIAL_DTR_SHIFT(CP210X_SERIAL_DTR_ACTIVE);
|
||||
if (cflag & CRTSCTS) {
|
||||
modem_ctl[0] &= ~0x7B;
|
||||
modem_ctl[0] |= 0x09;
|
||||
modem_ctl[4] = 0x80;
|
||||
/* FIXME - why clear reserved bits just read? */
|
||||
modem_ctl[5] = 0;
|
||||
modem_ctl[6] = 0;
|
||||
modem_ctl[7] = 0;
|
||||
ctl_hs |= CP210X_SERIAL_CTS_HANDSHAKE;
|
||||
|
||||
flow_repl &= ~CP210X_SERIAL_RTS_MASK;
|
||||
flow_repl |= CP210X_SERIAL_RTS_SHIFT(
|
||||
CP210X_SERIAL_RTS_FLOW_CTL);
|
||||
dev_dbg(dev, "%s - flow control = CRTSCTS\n", __func__);
|
||||
} else {
|
||||
modem_ctl[0] &= ~0x7B;
|
||||
modem_ctl[0] |= 0x01;
|
||||
/* FIXME - OR here instead of assignment looks wrong */
|
||||
modem_ctl[4] |= 0x40;
|
||||
ctl_hs &= ~CP210X_SERIAL_CTS_HANDSHAKE;
|
||||
|
||||
flow_repl &= ~CP210X_SERIAL_RTS_MASK;
|
||||
flow_repl |= CP210X_SERIAL_RTS_SHIFT(
|
||||
CP210X_SERIAL_RTS_ACTIVE);
|
||||
dev_dbg(dev, "%s - flow control = NONE\n", __func__);
|
||||
}
|
||||
|
||||
dev_dbg(dev, "%s - write modem controls = %02x .. .. .. %02x .. .. %02x\n",
|
||||
__func__, modem_ctl[0], modem_ctl[4], modem_ctl[7]);
|
||||
cp210x_write_reg_block(port, CP210X_SET_FLOW, modem_ctl,
|
||||
sizeof(modem_ctl));
|
||||
dev_dbg(dev, "%s - write ulControlHandshake=0x%08x, ulFlowReplace=0x%08x\n",
|
||||
__func__, ctl_hs, flow_repl);
|
||||
flow_ctl.ulControlHandshake = cpu_to_le32(ctl_hs);
|
||||
flow_ctl.ulFlowReplace = cpu_to_le32(flow_repl);
|
||||
cp210x_write_reg_block(port, CP210X_SET_FLOW, &flow_ctl,
|
||||
sizeof(flow_ctl));
|
||||
}
|
||||
|
||||
}
|
||||
|
@@ -93,27 +93,27 @@ static int ftdi_8u2232c_probe(struct usb_serial *serial);
|
||||
static void ftdi_USB_UIRT_setup(struct ftdi_private *priv);
|
||||
static void ftdi_HE_TIRA1_setup(struct ftdi_private *priv);
|
||||
|
||||
static struct ftdi_sio_quirk ftdi_jtag_quirk = {
|
||||
static const struct ftdi_sio_quirk ftdi_jtag_quirk = {
|
||||
.probe = ftdi_jtag_probe,
|
||||
};
|
||||
|
||||
static struct ftdi_sio_quirk ftdi_NDI_device_quirk = {
|
||||
static const struct ftdi_sio_quirk ftdi_NDI_device_quirk = {
|
||||
.probe = ftdi_NDI_device_setup,
|
||||
};
|
||||
|
||||
static struct ftdi_sio_quirk ftdi_USB_UIRT_quirk = {
|
||||
static const struct ftdi_sio_quirk ftdi_USB_UIRT_quirk = {
|
||||
.port_probe = ftdi_USB_UIRT_setup,
|
||||
};
|
||||
|
||||
static struct ftdi_sio_quirk ftdi_HE_TIRA1_quirk = {
|
||||
static const struct ftdi_sio_quirk ftdi_HE_TIRA1_quirk = {
|
||||
.port_probe = ftdi_HE_TIRA1_setup,
|
||||
};
|
||||
|
||||
static struct ftdi_sio_quirk ftdi_stmclite_quirk = {
|
||||
static const struct ftdi_sio_quirk ftdi_stmclite_quirk = {
|
||||
.probe = ftdi_stmclite_probe,
|
||||
};
|
||||
|
||||
static struct ftdi_sio_quirk ftdi_8u2232c_quirk = {
|
||||
static const struct ftdi_sio_quirk ftdi_8u2232c_quirk = {
|
||||
.probe = ftdi_8u2232c_probe,
|
||||
};
|
||||
|
||||
@@ -1775,7 +1775,7 @@ static void remove_sysfs_attrs(struct usb_serial_port *port)
|
||||
static int ftdi_sio_probe(struct usb_serial *serial,
|
||||
const struct usb_device_id *id)
|
||||
{
|
||||
struct ftdi_sio_quirk *quirk =
|
||||
const struct ftdi_sio_quirk *quirk =
|
||||
(struct ftdi_sio_quirk *)id->driver_info;
|
||||
|
||||
if (quirk && quirk->probe) {
|
||||
@@ -1792,7 +1792,7 @@ static int ftdi_sio_probe(struct usb_serial *serial,
|
||||
static int ftdi_sio_port_probe(struct usb_serial_port *port)
|
||||
{
|
||||
struct ftdi_private *priv;
|
||||
struct ftdi_sio_quirk *quirk = usb_get_serial_data(port->serial);
|
||||
const struct ftdi_sio_quirk *quirk = usb_get_serial_data(port->serial);
|
||||
|
||||
|
||||
priv = kzalloc(sizeof(struct ftdi_private), GFP_KERNEL);
|
||||
|
@@ -2849,14 +2849,16 @@ static int edge_startup(struct usb_serial *serial)
|
||||
/* not set up yet, so do it now */
|
||||
edge_serial->interrupt_read_urb =
|
||||
usb_alloc_urb(0, GFP_KERNEL);
|
||||
if (!edge_serial->interrupt_read_urb)
|
||||
return -ENOMEM;
|
||||
if (!edge_serial->interrupt_read_urb) {
|
||||
response = -ENOMEM;
|
||||
break;
|
||||
}
|
||||
|
||||
edge_serial->interrupt_in_buffer =
|
||||
kmalloc(buffer_size, GFP_KERNEL);
|
||||
if (!edge_serial->interrupt_in_buffer) {
|
||||
usb_free_urb(edge_serial->interrupt_read_urb);
|
||||
return -ENOMEM;
|
||||
response = -ENOMEM;
|
||||
break;
|
||||
}
|
||||
edge_serial->interrupt_in_endpoint =
|
||||
endpoint->bEndpointAddress;
|
||||
@@ -2884,14 +2886,16 @@ static int edge_startup(struct usb_serial *serial)
|
||||
/* not set up yet, so do it now */
|
||||
edge_serial->read_urb =
|
||||
usb_alloc_urb(0, GFP_KERNEL);
|
||||
if (!edge_serial->read_urb)
|
||||
return -ENOMEM;
|
||||
if (!edge_serial->read_urb) {
|
||||
response = -ENOMEM;
|
||||
break;
|
||||
}
|
||||
|
||||
edge_serial->bulk_in_buffer =
|
||||
kmalloc(buffer_size, GFP_KERNEL);
|
||||
if (!edge_serial->bulk_in_buffer) {
|
||||
usb_free_urb(edge_serial->read_urb);
|
||||
return -ENOMEM;
|
||||
response = -ENOMEM;
|
||||
break;
|
||||
}
|
||||
edge_serial->bulk_in_endpoint =
|
||||
endpoint->bEndpointAddress;
|
||||
@@ -2917,9 +2921,22 @@ static int edge_startup(struct usb_serial *serial)
|
||||
}
|
||||
}
|
||||
|
||||
if (!interrupt_in_found || !bulk_in_found || !bulk_out_found) {
|
||||
dev_err(ddev, "Error - the proper endpoints were not found!\n");
|
||||
return -ENODEV;
|
||||
if (response || !interrupt_in_found || !bulk_in_found ||
|
||||
!bulk_out_found) {
|
||||
if (!response) {
|
||||
dev_err(ddev, "expected endpoints not found\n");
|
||||
response = -ENODEV;
|
||||
}
|
||||
|
||||
usb_free_urb(edge_serial->interrupt_read_urb);
|
||||
kfree(edge_serial->interrupt_in_buffer);
|
||||
|
||||
usb_free_urb(edge_serial->read_urb);
|
||||
kfree(edge_serial->bulk_in_buffer);
|
||||
|
||||
kfree(edge_serial);
|
||||
|
||||
return response;
|
||||
}
|
||||
|
||||
/* start interrupt read for this edgeport this interrupt will
|
||||
@@ -2942,16 +2959,9 @@ static void edge_disconnect(struct usb_serial *serial)
|
||||
{
|
||||
struct edgeport_serial *edge_serial = usb_get_serial_data(serial);
|
||||
|
||||
/* stop reads and writes on all ports */
|
||||
/* free up our endpoint stuff */
|
||||
if (edge_serial->is_epic) {
|
||||
usb_kill_urb(edge_serial->interrupt_read_urb);
|
||||
usb_free_urb(edge_serial->interrupt_read_urb);
|
||||
kfree(edge_serial->interrupt_in_buffer);
|
||||
|
||||
usb_kill_urb(edge_serial->read_urb);
|
||||
usb_free_urb(edge_serial->read_urb);
|
||||
kfree(edge_serial->bulk_in_buffer);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2964,6 +2974,16 @@ static void edge_release(struct usb_serial *serial)
|
||||
{
|
||||
struct edgeport_serial *edge_serial = usb_get_serial_data(serial);
|
||||
|
||||
if (edge_serial->is_epic) {
|
||||
usb_kill_urb(edge_serial->interrupt_read_urb);
|
||||
usb_free_urb(edge_serial->interrupt_read_urb);
|
||||
kfree(edge_serial->interrupt_in_buffer);
|
||||
|
||||
usb_kill_urb(edge_serial->read_urb);
|
||||
usb_free_urb(edge_serial->read_urb);
|
||||
kfree(edge_serial->bulk_in_buffer);
|
||||
}
|
||||
|
||||
kfree(edge_serial);
|
||||
}
|
||||
|
||||
|
@@ -255,7 +255,7 @@ static int keyspan_write(struct tty_struct *tty,
|
||||
return count;
|
||||
}
|
||||
|
||||
dev_dbg(&port->dev, "%s - endpoint %d flip %d\n",
|
||||
dev_dbg(&port->dev, "%s - endpoint %x flip %d\n",
|
||||
__func__, usb_pipeendpoint(this_urb->pipe), flip);
|
||||
|
||||
if (this_urb->status == -EINPROGRESS) {
|
||||
@@ -300,7 +300,7 @@ static void usa26_indat_callback(struct urb *urb)
|
||||
endpoint = usb_pipeendpoint(urb->pipe);
|
||||
|
||||
if (status) {
|
||||
dev_dbg(&urb->dev->dev, "%s - nonzero status: %x on endpoint %d.\n",
|
||||
dev_dbg(&urb->dev->dev, "%s - nonzero status %d on endpoint %x\n",
|
||||
__func__, status, endpoint);
|
||||
return;
|
||||
}
|
||||
@@ -393,7 +393,8 @@ static void usa26_instat_callback(struct urb *urb)
|
||||
serial = urb->context;
|
||||
|
||||
if (status) {
|
||||
dev_dbg(&urb->dev->dev, "%s - nonzero status: %x\n", __func__, status);
|
||||
dev_dbg(&urb->dev->dev, "%s - nonzero status: %d\n",
|
||||
__func__, status);
|
||||
return;
|
||||
}
|
||||
if (urb->actual_length != 9) {
|
||||
@@ -452,7 +453,7 @@ static void usa28_indat_callback(struct urb *urb)
|
||||
|
||||
do {
|
||||
if (status) {
|
||||
dev_dbg(&urb->dev->dev, "%s - nonzero status: %x on endpoint %d.\n",
|
||||
dev_dbg(&urb->dev->dev, "%s - nonzero status %d on endpoint %x\n",
|
||||
__func__, status, usb_pipeendpoint(urb->pipe));
|
||||
return;
|
||||
}
|
||||
@@ -511,7 +512,8 @@ static void usa28_instat_callback(struct urb *urb)
|
||||
serial = urb->context;
|
||||
|
||||
if (status) {
|
||||
dev_dbg(&urb->dev->dev, "%s - nonzero status: %x\n", __func__, status);
|
||||
dev_dbg(&urb->dev->dev, "%s - nonzero status: %d\n",
|
||||
__func__, status);
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -591,7 +593,8 @@ static void usa49_instat_callback(struct urb *urb)
|
||||
serial = urb->context;
|
||||
|
||||
if (status) {
|
||||
dev_dbg(&urb->dev->dev, "%s - nonzero status: %x\n", __func__, status);
|
||||
dev_dbg(&urb->dev->dev, "%s - nonzero status: %d\n",
|
||||
__func__, status);
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -646,7 +649,7 @@ static void usa49_indat_callback(struct urb *urb)
|
||||
endpoint = usb_pipeendpoint(urb->pipe);
|
||||
|
||||
if (status) {
|
||||
dev_dbg(&urb->dev->dev, "%s - nonzero status: %x on endpoint %d.\n",
|
||||
dev_dbg(&urb->dev->dev, "%s - nonzero status %d on endpoint %x\n",
|
||||
__func__, status, endpoint);
|
||||
return;
|
||||
}
|
||||
@@ -698,7 +701,8 @@ static void usa49wg_indat_callback(struct urb *urb)
|
||||
serial = urb->context;
|
||||
|
||||
if (status) {
|
||||
dev_dbg(&urb->dev->dev, "%s - nonzero status: %x\n", __func__, status);
|
||||
dev_dbg(&urb->dev->dev, "%s - nonzero status: %d\n",
|
||||
__func__, status);
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -774,8 +778,8 @@ static void usa90_indat_callback(struct urb *urb)
|
||||
endpoint = usb_pipeendpoint(urb->pipe);
|
||||
|
||||
if (status) {
|
||||
dev_dbg(&urb->dev->dev, "%s - nonzero status: %x on endpoint %d.\n",
|
||||
__func__, status, endpoint);
|
||||
dev_dbg(&urb->dev->dev, "%s - nonzero status %d on endpoint %x\n",
|
||||
__func__, status, endpoint);
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -847,7 +851,8 @@ static void usa90_instat_callback(struct urb *urb)
|
||||
serial = urb->context;
|
||||
|
||||
if (status) {
|
||||
dev_dbg(&urb->dev->dev, "%s - nonzero status: %x\n", __func__, status);
|
||||
dev_dbg(&urb->dev->dev, "%s - nonzero status: %d\n",
|
||||
__func__, status);
|
||||
return;
|
||||
}
|
||||
if (urb->actual_length < 14) {
|
||||
@@ -912,7 +917,8 @@ static void usa67_instat_callback(struct urb *urb)
|
||||
serial = urb->context;
|
||||
|
||||
if (status) {
|
||||
dev_dbg(&urb->dev->dev, "%s - nonzero status: %x\n", __func__, status);
|
||||
dev_dbg(&urb->dev->dev, "%s - nonzero status: %d\n",
|
||||
__func__, status);
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -1082,12 +1088,6 @@ static int keyspan_open(struct tty_struct *tty, struct usb_serial_port *port)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline void stop_urb(struct urb *urb)
|
||||
{
|
||||
if (urb && urb->status == -EINPROGRESS)
|
||||
usb_kill_urb(urb);
|
||||
}
|
||||
|
||||
static void keyspan_dtr_rts(struct usb_serial_port *port, int on)
|
||||
{
|
||||
struct keyspan_port_private *p_priv = usb_get_serial_port_data(port);
|
||||
@@ -1114,10 +1114,10 @@ static void keyspan_close(struct usb_serial_port *port)
|
||||
p_priv->out_flip = 0;
|
||||
p_priv->in_flip = 0;
|
||||
|
||||
stop_urb(p_priv->inack_urb);
|
||||
usb_kill_urb(p_priv->inack_urb);
|
||||
for (i = 0; i < 2; i++) {
|
||||
stop_urb(p_priv->in_urbs[i]);
|
||||
stop_urb(p_priv->out_urbs[i]);
|
||||
usb_kill_urb(p_priv->in_urbs[i]);
|
||||
usb_kill_urb(p_priv->out_urbs[i]);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1221,8 +1221,8 @@ static struct usb_endpoint_descriptor const *find_ep(struct usb_serial const *se
|
||||
if (ep->bEndpointAddress == endpoint)
|
||||
return ep;
|
||||
}
|
||||
dev_warn(&serial->interface->dev, "found no endpoint descriptor for "
|
||||
"endpoint %x\n", endpoint);
|
||||
dev_warn(&serial->interface->dev, "found no endpoint descriptor for endpoint %x\n",
|
||||
endpoint);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
@@ -1237,7 +1237,8 @@ static struct urb *keyspan_setup_urb(struct usb_serial *serial, int endpoint,
|
||||
if (endpoint == -1)
|
||||
return NULL; /* endpoint not needed */
|
||||
|
||||
dev_dbg(&serial->interface->dev, "%s - alloc for endpoint %d.\n", __func__, endpoint);
|
||||
dev_dbg(&serial->interface->dev, "%s - alloc for endpoint %x\n",
|
||||
__func__, endpoint);
|
||||
urb = usb_alloc_urb(0, GFP_KERNEL); /* No ISO */
|
||||
if (!urb)
|
||||
return NULL;
|
||||
@@ -1572,7 +1573,8 @@ static int keyspan_usa26_send_setup(struct usb_serial *serial,
|
||||
return -1;
|
||||
}
|
||||
|
||||
dev_dbg(&port->dev, "%s - endpoint %d\n", __func__, usb_pipeendpoint(this_urb->pipe));
|
||||
dev_dbg(&port->dev, "%s - endpoint %x\n",
|
||||
__func__, usb_pipeendpoint(this_urb->pipe));
|
||||
|
||||
/* Save reset port val for resend.
|
||||
Don't overwrite resend for open/close condition. */
|
||||
@@ -1838,7 +1840,7 @@ static int keyspan_usa49_send_setup(struct usb_serial *serial,
|
||||
return -1;
|
||||
}
|
||||
|
||||
dev_dbg(&port->dev, "%s - endpoint %d (%d)\n",
|
||||
dev_dbg(&port->dev, "%s - endpoint %x (%d)\n",
|
||||
__func__, usb_pipeendpoint(this_urb->pipe), device_port);
|
||||
|
||||
/* Save reset port val for resend.
|
||||
@@ -2365,9 +2367,9 @@ static void keyspan_disconnect(struct usb_serial *serial)
|
||||
|
||||
s_priv = usb_get_serial_data(serial);
|
||||
|
||||
stop_urb(s_priv->instat_urb);
|
||||
stop_urb(s_priv->glocont_urb);
|
||||
stop_urb(s_priv->indat_urb);
|
||||
usb_kill_urb(s_priv->instat_urb);
|
||||
usb_kill_urb(s_priv->glocont_urb);
|
||||
usb_kill_urb(s_priv->indat_urb);
|
||||
}
|
||||
|
||||
static void keyspan_release(struct usb_serial *serial)
|
||||
@@ -2376,6 +2378,10 @@ static void keyspan_release(struct usb_serial *serial)
|
||||
|
||||
s_priv = usb_get_serial_data(serial);
|
||||
|
||||
/* Make sure to unlink the URBs submitted in attach. */
|
||||
usb_kill_urb(s_priv->instat_urb);
|
||||
usb_kill_urb(s_priv->indat_urb);
|
||||
|
||||
usb_free_urb(s_priv->instat_urb);
|
||||
usb_free_urb(s_priv->indat_urb);
|
||||
usb_free_urb(s_priv->glocont_urb);
|
||||
@@ -2491,11 +2497,11 @@ static int keyspan_port_remove(struct usb_serial_port *port)
|
||||
|
||||
p_priv = usb_get_serial_port_data(port);
|
||||
|
||||
stop_urb(p_priv->inack_urb);
|
||||
stop_urb(p_priv->outcont_urb);
|
||||
usb_kill_urb(p_priv->inack_urb);
|
||||
usb_kill_urb(p_priv->outcont_urb);
|
||||
for (i = 0; i < 2; i++) {
|
||||
stop_urb(p_priv->in_urbs[i]);
|
||||
stop_urb(p_priv->out_urbs[i]);
|
||||
usb_kill_urb(p_priv->in_urbs[i]);
|
||||
usb_kill_urb(p_priv->out_urbs[i]);
|
||||
}
|
||||
|
||||
usb_free_urb(p_priv->inack_urb);
|
||||
|
@@ -1259,6 +1259,15 @@ static int mxuport_attach(struct usb_serial *serial)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void mxuport_release(struct usb_serial *serial)
|
||||
{
|
||||
struct usb_serial_port *port0 = serial->port[0];
|
||||
struct usb_serial_port *port1 = serial->port[1];
|
||||
|
||||
usb_serial_generic_close(port1);
|
||||
usb_serial_generic_close(port0);
|
||||
}
|
||||
|
||||
static int mxuport_open(struct tty_struct *tty, struct usb_serial_port *port)
|
||||
{
|
||||
struct mxuport_port *mxport = usb_get_serial_port_data(port);
|
||||
@@ -1361,6 +1370,7 @@ static struct usb_serial_driver mxuport_device = {
|
||||
.probe = mxuport_probe,
|
||||
.port_probe = mxuport_port_probe,
|
||||
.attach = mxuport_attach,
|
||||
.release = mxuport_release,
|
||||
.calc_num_ports = mxuport_calc_num_ports,
|
||||
.open = mxuport_open,
|
||||
.close = mxuport_close,
|
||||
|
@@ -375,18 +375,22 @@ static void option_instat_callback(struct urb *urb);
|
||||
#define HAIER_PRODUCT_CE81B 0x10f8
|
||||
#define HAIER_PRODUCT_CE100 0x2009
|
||||
|
||||
/* Cinterion (formerly Siemens) products */
|
||||
#define SIEMENS_VENDOR_ID 0x0681
|
||||
#define CINTERION_VENDOR_ID 0x1e2d
|
||||
/* Gemalto's Cinterion products (formerly Siemens) */
|
||||
#define SIEMENS_VENDOR_ID 0x0681
|
||||
#define CINTERION_VENDOR_ID 0x1e2d
|
||||
#define CINTERION_PRODUCT_HC25_MDMNET 0x0040
|
||||
#define CINTERION_PRODUCT_HC25_MDM 0x0047
|
||||
#define CINTERION_PRODUCT_HC25_MDMNET 0x0040
|
||||
#define CINTERION_PRODUCT_HC28_MDMNET 0x004A /* same for HC28J */
|
||||
#define CINTERION_PRODUCT_HC28_MDM 0x004C
|
||||
#define CINTERION_PRODUCT_HC28_MDMNET 0x004A /* same for HC28J */
|
||||
#define CINTERION_PRODUCT_EU3_E 0x0051
|
||||
#define CINTERION_PRODUCT_EU3_P 0x0052
|
||||
#define CINTERION_PRODUCT_PH8 0x0053
|
||||
#define CINTERION_PRODUCT_AHXX 0x0055
|
||||
#define CINTERION_PRODUCT_PLXX 0x0060
|
||||
#define CINTERION_PRODUCT_PH8_2RMNET 0x0082
|
||||
#define CINTERION_PRODUCT_PH8_AUDIO 0x0083
|
||||
#define CINTERION_PRODUCT_AHXX_2RMNET 0x0084
|
||||
#define CINTERION_PRODUCT_AHXX_AUDIO 0x0085
|
||||
|
||||
/* Olivetti products */
|
||||
#define OLIVETTI_VENDOR_ID 0x0b3c
|
||||
@@ -633,6 +637,10 @@ static const struct option_blacklist_info telit_le922_blacklist_usbcfg3 = {
|
||||
.reserved = BIT(1) | BIT(2) | BIT(3),
|
||||
};
|
||||
|
||||
static const struct option_blacklist_info cinterion_rmnet2_blacklist = {
|
||||
.reserved = BIT(4) | BIT(5),
|
||||
};
|
||||
|
||||
static const struct usb_device_id option_ids[] = {
|
||||
{ USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_COLT) },
|
||||
{ USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_RICOLA) },
|
||||
@@ -1602,7 +1610,79 @@ static const struct usb_device_id option_ids[] = {
|
||||
.driver_info = (kernel_ulong_t)&net_intf3_blacklist },
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0178, 0xff, 0xff, 0xff),
|
||||
.driver_info = (kernel_ulong_t)&net_intf3_blacklist },
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0xffe9, 0xff, 0xff, 0xff) },
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0xff42, 0xff, 0xff, 0xff) },
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0xff43, 0xff, 0xff, 0xff) },
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0xff44, 0xff, 0xff, 0xff) },
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0xff45, 0xff, 0xff, 0xff) },
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0xff46, 0xff, 0xff, 0xff) },
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0xff47, 0xff, 0xff, 0xff) },
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0xff48, 0xff, 0xff, 0xff) },
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0xff49, 0xff, 0xff, 0xff) },
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0xff4a, 0xff, 0xff, 0xff) },
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0xff4b, 0xff, 0xff, 0xff) },
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0xff4c, 0xff, 0xff, 0xff) },
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0xff4d, 0xff, 0xff, 0xff) },
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0xff4e, 0xff, 0xff, 0xff) },
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0xff4f, 0xff, 0xff, 0xff) },
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0xff50, 0xff, 0xff, 0xff) },
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0xff51, 0xff, 0xff, 0xff) },
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0xff52, 0xff, 0xff, 0xff) },
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0xff53, 0xff, 0xff, 0xff) },
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0xff54, 0xff, 0xff, 0xff) },
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0xff55, 0xff, 0xff, 0xff) },
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0xff56, 0xff, 0xff, 0xff) },
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0xff57, 0xff, 0xff, 0xff) },
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0xff58, 0xff, 0xff, 0xff) },
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0xff59, 0xff, 0xff, 0xff) },
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0xff5a, 0xff, 0xff, 0xff) },
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0xff5b, 0xff, 0xff, 0xff) },
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0xff5c, 0xff, 0xff, 0xff) },
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0xff5d, 0xff, 0xff, 0xff) },
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0xff5e, 0xff, 0xff, 0xff) },
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0xff5f, 0xff, 0xff, 0xff) },
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0xff60, 0xff, 0xff, 0xff) },
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0xff61, 0xff, 0xff, 0xff) },
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0xff62, 0xff, 0xff, 0xff) },
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0xff63, 0xff, 0xff, 0xff) },
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0xff64, 0xff, 0xff, 0xff) },
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0xff65, 0xff, 0xff, 0xff) },
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0xff66, 0xff, 0xff, 0xff) },
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0xff67, 0xff, 0xff, 0xff) },
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0xff68, 0xff, 0xff, 0xff) },
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0xff69, 0xff, 0xff, 0xff) },
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0xff6a, 0xff, 0xff, 0xff) },
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0xff6b, 0xff, 0xff, 0xff) },
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0xff6c, 0xff, 0xff, 0xff) },
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0xff6d, 0xff, 0xff, 0xff) },
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0xff6e, 0xff, 0xff, 0xff) },
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0xff6f, 0xff, 0xff, 0xff) },
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0xff70, 0xff, 0xff, 0xff) },
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0xff71, 0xff, 0xff, 0xff) },
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0xff72, 0xff, 0xff, 0xff) },
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0xff73, 0xff, 0xff, 0xff) },
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0xff74, 0xff, 0xff, 0xff) },
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0xff75, 0xff, 0xff, 0xff) },
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0xff76, 0xff, 0xff, 0xff) },
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0xff77, 0xff, 0xff, 0xff) },
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0xff78, 0xff, 0xff, 0xff) },
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0xff79, 0xff, 0xff, 0xff) },
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0xff7a, 0xff, 0xff, 0xff) },
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0xff7b, 0xff, 0xff, 0xff) },
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0xff7c, 0xff, 0xff, 0xff) },
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0xff7d, 0xff, 0xff, 0xff) },
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0xff7e, 0xff, 0xff, 0xff) },
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0xff7f, 0xff, 0xff, 0xff) },
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0xff80, 0xff, 0xff, 0xff) },
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0xff81, 0xff, 0xff, 0xff) },
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0xff82, 0xff, 0xff, 0xff) },
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0xff83, 0xff, 0xff, 0xff) },
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0xff84, 0xff, 0xff, 0xff) },
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0xff85, 0xff, 0xff, 0xff) },
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0xff86, 0xff, 0xff, 0xff) },
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0xff87, 0xff, 0xff, 0xff) },
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0xff88, 0xff, 0xff, 0xff) },
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0xff89, 0xff, 0xff, 0xff) },
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0xff8a, 0xff, 0xff, 0xff) },
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0xff8b, 0xff, 0xff, 0xff) },
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0xff8c, 0xff, 0xff, 0xff) },
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0xff8d, 0xff, 0xff, 0xff) },
|
||||
@@ -1613,6 +1693,61 @@ static const struct usb_device_id option_ids[] = {
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0xff92, 0xff, 0xff, 0xff) },
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0xff93, 0xff, 0xff, 0xff) },
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0xff94, 0xff, 0xff, 0xff) },
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0xff9f, 0xff, 0xff, 0xff) },
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0xffa0, 0xff, 0xff, 0xff) },
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0xffa1, 0xff, 0xff, 0xff) },
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0xffa2, 0xff, 0xff, 0xff) },
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0xffa3, 0xff, 0xff, 0xff) },
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0xffa4, 0xff, 0xff, 0xff) },
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0xffa5, 0xff, 0xff, 0xff) },
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0xffa6, 0xff, 0xff, 0xff) },
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0xffa7, 0xff, 0xff, 0xff) },
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0xffa8, 0xff, 0xff, 0xff) },
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0xffa9, 0xff, 0xff, 0xff) },
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0xffaa, 0xff, 0xff, 0xff) },
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0xffab, 0xff, 0xff, 0xff) },
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0xffac, 0xff, 0xff, 0xff) },
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0xffae, 0xff, 0xff, 0xff) },
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0xffaf, 0xff, 0xff, 0xff) },
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0xffb0, 0xff, 0xff, 0xff) },
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0xffb1, 0xff, 0xff, 0xff) },
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0xffb2, 0xff, 0xff, 0xff) },
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0xffb3, 0xff, 0xff, 0xff) },
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0xffb4, 0xff, 0xff, 0xff) },
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0xffb5, 0xff, 0xff, 0xff) },
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0xffb6, 0xff, 0xff, 0xff) },
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0xffb7, 0xff, 0xff, 0xff) },
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0xffb8, 0xff, 0xff, 0xff) },
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0xffb9, 0xff, 0xff, 0xff) },
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0xffba, 0xff, 0xff, 0xff) },
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0xffbb, 0xff, 0xff, 0xff) },
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0xffbc, 0xff, 0xff, 0xff) },
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0xffbd, 0xff, 0xff, 0xff) },
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0xffbe, 0xff, 0xff, 0xff) },
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0xffbf, 0xff, 0xff, 0xff) },
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0xffc0, 0xff, 0xff, 0xff) },
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0xffc1, 0xff, 0xff, 0xff) },
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0xffc2, 0xff, 0xff, 0xff) },
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0xffc3, 0xff, 0xff, 0xff) },
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0xffc4, 0xff, 0xff, 0xff) },
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0xffc5, 0xff, 0xff, 0xff) },
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0xffc6, 0xff, 0xff, 0xff) },
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0xffc7, 0xff, 0xff, 0xff) },
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0xffc8, 0xff, 0xff, 0xff) },
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0xffc9, 0xff, 0xff, 0xff) },
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0xffca, 0xff, 0xff, 0xff) },
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0xffcb, 0xff, 0xff, 0xff) },
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0xffcc, 0xff, 0xff, 0xff) },
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0xffcd, 0xff, 0xff, 0xff) },
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0xffce, 0xff, 0xff, 0xff) },
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0xffcf, 0xff, 0xff, 0xff) },
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0xffd0, 0xff, 0xff, 0xff) },
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0xffd1, 0xff, 0xff, 0xff) },
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0xffd2, 0xff, 0xff, 0xff) },
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0xffd3, 0xff, 0xff, 0xff) },
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0xffd4, 0xff, 0xff, 0xff) },
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0xffd5, 0xff, 0xff, 0xff) },
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0xffe9, 0xff, 0xff, 0xff) },
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0xffec, 0xff, 0xff, 0xff) },
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0xffee, 0xff, 0xff, 0xff) },
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0xfff6, 0xff, 0xff, 0xff) },
|
||||
@@ -1712,7 +1847,13 @@ static const struct usb_device_id option_ids[] = {
|
||||
{ USB_DEVICE_INTERFACE_CLASS(CINTERION_VENDOR_ID, CINTERION_PRODUCT_AHXX, 0xff) },
|
||||
{ USB_DEVICE(CINTERION_VENDOR_ID, CINTERION_PRODUCT_PLXX),
|
||||
.driver_info = (kernel_ulong_t)&net_intf4_blacklist },
|
||||
{ USB_DEVICE(CINTERION_VENDOR_ID, CINTERION_PRODUCT_HC28_MDM) },
|
||||
{ USB_DEVICE_INTERFACE_CLASS(CINTERION_VENDOR_ID, CINTERION_PRODUCT_PH8_2RMNET, 0xff),
|
||||
.driver_info = (kernel_ulong_t)&cinterion_rmnet2_blacklist },
|
||||
{ USB_DEVICE_INTERFACE_CLASS(CINTERION_VENDOR_ID, CINTERION_PRODUCT_PH8_AUDIO, 0xff),
|
||||
.driver_info = (kernel_ulong_t)&net_intf4_blacklist },
|
||||
{ USB_DEVICE_INTERFACE_CLASS(CINTERION_VENDOR_ID, CINTERION_PRODUCT_AHXX_2RMNET, 0xff) },
|
||||
{ USB_DEVICE_INTERFACE_CLASS(CINTERION_VENDOR_ID, CINTERION_PRODUCT_AHXX_AUDIO, 0xff) },
|
||||
{ USB_DEVICE(CINTERION_VENDOR_ID, CINTERION_PRODUCT_HC28_MDM) },
|
||||
{ USB_DEVICE(CINTERION_VENDOR_ID, CINTERION_PRODUCT_HC28_MDMNET) },
|
||||
{ USB_DEVICE(SIEMENS_VENDOR_ID, CINTERION_PRODUCT_HC25_MDM) },
|
||||
{ USB_DEVICE(SIEMENS_VENDOR_ID, CINTERION_PRODUCT_HC25_MDMNET) },
|
||||
|
@@ -141,6 +141,7 @@ static void qt2_release(struct usb_serial *serial)
|
||||
|
||||
serial_priv = usb_get_serial_data(serial);
|
||||
|
||||
usb_kill_urb(serial_priv->read_urb);
|
||||
usb_free_urb(serial_priv->read_urb);
|
||||
kfree(serial_priv->read_buffer);
|
||||
kfree(serial_priv);
|
||||
|
@@ -80,6 +80,7 @@ struct ti_device {
|
||||
int td_open_port_count;
|
||||
struct usb_serial *td_serial;
|
||||
int td_is_3410;
|
||||
bool td_rs485_only;
|
||||
int td_urb_error;
|
||||
};
|
||||
|
||||
@@ -160,6 +161,11 @@ static const struct usb_device_id ti_id_table_3410[] = {
|
||||
{ USB_DEVICE(ABBOTT_VENDOR_ID, ABBOTT_STRIP_PORT_ID) },
|
||||
{ USB_DEVICE(TI_VENDOR_ID, FRI2_PRODUCT_ID) },
|
||||
{ USB_DEVICE(HONEYWELL_VENDOR_ID, HONEYWELL_HGI80_PRODUCT_ID) },
|
||||
{ USB_DEVICE(MXU1_VENDOR_ID, MXU1_1110_PRODUCT_ID) },
|
||||
{ USB_DEVICE(MXU1_VENDOR_ID, MXU1_1130_PRODUCT_ID) },
|
||||
{ USB_DEVICE(MXU1_VENDOR_ID, MXU1_1131_PRODUCT_ID) },
|
||||
{ USB_DEVICE(MXU1_VENDOR_ID, MXU1_1150_PRODUCT_ID) },
|
||||
{ USB_DEVICE(MXU1_VENDOR_ID, MXU1_1151_PRODUCT_ID) },
|
||||
{ } /* terminator */
|
||||
};
|
||||
|
||||
@@ -193,6 +199,11 @@ static const struct usb_device_id ti_id_table_combined[] = {
|
||||
{ USB_DEVICE(ABBOTT_VENDOR_ID, ABBOTT_STRIP_PORT_ID) },
|
||||
{ USB_DEVICE(TI_VENDOR_ID, FRI2_PRODUCT_ID) },
|
||||
{ USB_DEVICE(HONEYWELL_VENDOR_ID, HONEYWELL_HGI80_PRODUCT_ID) },
|
||||
{ USB_DEVICE(MXU1_VENDOR_ID, MXU1_1110_PRODUCT_ID) },
|
||||
{ USB_DEVICE(MXU1_VENDOR_ID, MXU1_1130_PRODUCT_ID) },
|
||||
{ USB_DEVICE(MXU1_VENDOR_ID, MXU1_1131_PRODUCT_ID) },
|
||||
{ USB_DEVICE(MXU1_VENDOR_ID, MXU1_1150_PRODUCT_ID) },
|
||||
{ USB_DEVICE(MXU1_VENDOR_ID, MXU1_1151_PRODUCT_ID) },
|
||||
{ } /* terminator */
|
||||
};
|
||||
|
||||
@@ -277,6 +288,11 @@ MODULE_FIRMWARE("mts_gsm.fw");
|
||||
MODULE_FIRMWARE("mts_edge.fw");
|
||||
MODULE_FIRMWARE("mts_mt9234mu.fw");
|
||||
MODULE_FIRMWARE("mts_mt9234zba.fw");
|
||||
MODULE_FIRMWARE("moxa/moxa-1110.fw");
|
||||
MODULE_FIRMWARE("moxa/moxa-1130.fw");
|
||||
MODULE_FIRMWARE("moxa/moxa-1131.fw");
|
||||
MODULE_FIRMWARE("moxa/moxa-1150.fw");
|
||||
MODULE_FIRMWARE("moxa/moxa-1151.fw");
|
||||
|
||||
module_param(closing_wait, int, S_IRUGO | S_IWUSR);
|
||||
MODULE_PARM_DESC(closing_wait,
|
||||
@@ -292,6 +308,9 @@ static int ti_startup(struct usb_serial *serial)
|
||||
{
|
||||
struct ti_device *tdev;
|
||||
struct usb_device *dev = serial->dev;
|
||||
struct usb_host_interface *cur_altsetting;
|
||||
int num_endpoints;
|
||||
u16 vid, pid;
|
||||
int status;
|
||||
|
||||
dev_dbg(&dev->dev,
|
||||
@@ -315,8 +334,22 @@ static int ti_startup(struct usb_serial *serial)
|
||||
dev_dbg(&dev->dev, "%s - device type is %s\n", __func__,
|
||||
tdev->td_is_3410 ? "3410" : "5052");
|
||||
|
||||
/* if we have only 1 configuration, download firmware */
|
||||
if (dev->descriptor.bNumConfigurations == 1) {
|
||||
vid = le16_to_cpu(dev->descriptor.idVendor);
|
||||
pid = le16_to_cpu(dev->descriptor.idProduct);
|
||||
if (vid == MXU1_VENDOR_ID) {
|
||||
switch (pid) {
|
||||
case MXU1_1130_PRODUCT_ID:
|
||||
case MXU1_1131_PRODUCT_ID:
|
||||
tdev->td_rs485_only = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
cur_altsetting = serial->interface->cur_altsetting;
|
||||
num_endpoints = cur_altsetting->desc.bNumEndpoints;
|
||||
|
||||
/* if we have only 1 configuration and 1 endpoint, download firmware */
|
||||
if (dev->descriptor.bNumConfigurations == 1 && num_endpoints == 1) {
|
||||
status = ti_download_firmware(tdev);
|
||||
|
||||
if (status != 0)
|
||||
@@ -371,7 +404,11 @@ static int ti_port_probe(struct usb_serial_port *port)
|
||||
port->port.closing_wait = msecs_to_jiffies(10 * closing_wait);
|
||||
tport->tp_port = port;
|
||||
tport->tp_tdev = usb_get_serial_data(port->serial);
|
||||
tport->tp_uart_mode = 0; /* default is RS232 */
|
||||
|
||||
if (tport->tp_tdev->td_rs485_only)
|
||||
tport->tp_uart_mode = TI_UART_485_RECEIVER_DISABLED;
|
||||
else
|
||||
tport->tp_uart_mode = TI_UART_232;
|
||||
|
||||
usb_set_serial_port_data(port, tport);
|
||||
|
||||
@@ -1450,6 +1487,16 @@ static int ti_download_firmware(struct ti_device *tdev)
|
||||
const struct firmware *fw_p;
|
||||
char buf[32];
|
||||
|
||||
if (le16_to_cpu(dev->descriptor.idVendor) == MXU1_VENDOR_ID) {
|
||||
snprintf(buf,
|
||||
sizeof(buf),
|
||||
"moxa/moxa-%04x.fw",
|
||||
le16_to_cpu(dev->descriptor.idProduct));
|
||||
|
||||
status = request_firmware(&fw_p, buf, &dev->dev);
|
||||
goto check_firmware;
|
||||
}
|
||||
|
||||
/* try ID specific firmware first, then try generic firmware */
|
||||
sprintf(buf, "ti_usb-v%04x-p%04x.fw",
|
||||
le16_to_cpu(dev->descriptor.idVendor),
|
||||
@@ -1487,6 +1534,8 @@ static int ti_download_firmware(struct ti_device *tdev)
|
||||
}
|
||||
status = request_firmware(&fw_p, buf, &dev->dev);
|
||||
}
|
||||
|
||||
check_firmware:
|
||||
if (status) {
|
||||
dev_err(&dev->dev, "%s - firmware not found\n", __func__);
|
||||
return -ENOENT;
|
||||
|
@@ -60,6 +60,14 @@
|
||||
#define HONEYWELL_VENDOR_ID 0x10ac
|
||||
#define HONEYWELL_HGI80_PRODUCT_ID 0x0102 /* Honeywell HGI80 */
|
||||
|
||||
/* Moxa UPORT 11x0 vendor and product IDs */
|
||||
#define MXU1_VENDOR_ID 0x110a
|
||||
#define MXU1_1110_PRODUCT_ID 0x1110
|
||||
#define MXU1_1130_PRODUCT_ID 0x1130
|
||||
#define MXU1_1131_PRODUCT_ID 0x1131
|
||||
#define MXU1_1150_PRODUCT_ID 0x1150
|
||||
#define MXU1_1151_PRODUCT_ID 0x1151
|
||||
|
||||
/* Commands */
|
||||
#define TI_GET_VERSION 0x01
|
||||
#define TI_GET_PORT_STATUS 0x02
|
||||
|
@@ -96,7 +96,8 @@ static int allocate_minors(struct usb_serial *serial, int num_ports)
|
||||
mutex_lock(&table_lock);
|
||||
for (i = 0; i < num_ports; ++i) {
|
||||
port = serial->port[i];
|
||||
minor = idr_alloc(&serial_minors, port, 0, 0, GFP_KERNEL);
|
||||
minor = idr_alloc(&serial_minors, port, 0,
|
||||
USB_SERIAL_TTY_MINORS, GFP_KERNEL);
|
||||
if (minor < 0)
|
||||
goto error;
|
||||
port->minor = minor;
|
||||
@@ -815,7 +816,7 @@ static int usb_serial_probe(struct usb_interface *interface,
|
||||
}
|
||||
}
|
||||
|
||||
#if defined(CONFIG_USB_SERIAL_PL2303) || defined(CONFIG_USB_SERIAL_PL2303_MODULE)
|
||||
#if IS_ENABLED(CONFIG_USB_SERIAL_PL2303)
|
||||
/* BEGIN HORRIBLE HACK FOR PL2303 */
|
||||
/* this is needed due to the looney way its endpoints are set up */
|
||||
if (((le16_to_cpu(dev->descriptor.idVendor) == PL2303_VENDOR_ID) &&
|
||||
|
Reference in New Issue
Block a user