Skip to content

Commit

Permalink
USB: remove references to port->port.count from the serial drivers
Browse files Browse the repository at this point in the history
This patch (as1344) removes references to port->port.count from the
USB serial drivers.  Now that serial ports are properly reference
counted, port.count checking is unnecessary and incorrect.  Drivers
should assume that the port is in use from the time the open method
runs until the close method is called.

Signed-off-by: Alan Stern <stern@rowland.harvard.edu>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
  • Loading branch information
Alan Stern authored and Greg Kroah-Hartman committed Mar 2, 2010
1 parent a108bfc commit 1f87158
Show file tree
Hide file tree
Showing 11 changed files with 66 additions and 126 deletions.
34 changes: 13 additions & 21 deletions drivers/usb/serial/aircable.c
Original file line number Diff line number Diff line change
Expand Up @@ -468,10 +468,6 @@ static void aircable_read_bulk_callback(struct urb *urb)

if (status) {
dbg("%s - urb status = %d", __func__, status);
if (!port->port.count) {
dbg("%s - port is closed, exiting.", __func__);
return;
}
if (status == -EPROTO) {
dbg("%s - caught -EPROTO, resubmitting the urb",
__func__);
Expand Down Expand Up @@ -530,23 +526,19 @@ static void aircable_read_bulk_callback(struct urb *urb)
}
tty_kref_put(tty);

/* Schedule the next read _if_ we are still open */
if (port->port.count) {
usb_fill_bulk_urb(port->read_urb, port->serial->dev,
usb_rcvbulkpipe(port->serial->dev,
port->bulk_in_endpointAddress),
port->read_urb->transfer_buffer,
port->read_urb->transfer_buffer_length,
aircable_read_bulk_callback, port);

result = usb_submit_urb(urb, GFP_ATOMIC);
if (result)
dev_err(&urb->dev->dev,
"%s - failed resubmitting read urb, error %d\n",
__func__, result);
}

return;
/* Schedule the next read */
usb_fill_bulk_urb(port->read_urb, port->serial->dev,
usb_rcvbulkpipe(port->serial->dev,
port->bulk_in_endpointAddress),
port->read_urb->transfer_buffer,
port->read_urb->transfer_buffer_length,
aircable_read_bulk_callback, port);

result = usb_submit_urb(urb, GFP_ATOMIC);
if (result && result != -EPERM)
dev_err(&urb->dev->dev,
"%s - failed resubmitting read urb, error %d\n",
__func__, result);
}

/* Based on ftdi_sio.c throttle */
Expand Down
6 changes: 3 additions & 3 deletions drivers/usb/serial/cypress_m8.c
Original file line number Diff line number Diff line change
Expand Up @@ -1321,9 +1321,9 @@ static void cypress_read_int_callback(struct urb *urb)
continue_read:
tty_kref_put(tty);

/* Continue trying to always read... unless the port has closed. */
/* Continue trying to always read */

if (port->port.count > 0 && priv->comm_is_ok) {
if (priv->comm_is_ok) {
usb_fill_int_urb(port->interrupt_in_urb, port->serial->dev,
usb_rcvintpipe(port->serial->dev,
port->interrupt_in_endpointAddress),
Expand All @@ -1332,7 +1332,7 @@ static void cypress_read_int_callback(struct urb *urb)
cypress_read_int_callback, port,
priv->read_urb_interval);
result = usb_submit_urb(port->interrupt_in_urb, GFP_ATOMIC);
if (result) {
if (result && result != -EPERM) {
dev_err(&urb->dev->dev, "%s - failed resubmitting "
"read urb, error %d\n", __func__,
result);
Expand Down
19 changes: 8 additions & 11 deletions drivers/usb/serial/digi_acceleport.c
Original file line number Diff line number Diff line change
Expand Up @@ -1262,10 +1262,10 @@ static void digi_write_bulk_callback(struct urb *urb)
return;
}

/* try to send any buffered data on this port, if it is open */
/* try to send any buffered data on this port */
spin_lock(&priv->dp_port_lock);
priv->dp_write_urb_in_use = 0;
if (port->port.count && priv->dp_out_buf_len > 0) {
if (priv->dp_out_buf_len > 0) {
*((unsigned char *)(port->write_urb->transfer_buffer))
= (unsigned char)DIGI_CMD_SEND_DATA;
*((unsigned char *)(port->write_urb->transfer_buffer) + 1)
Expand All @@ -1288,7 +1288,7 @@ static void digi_write_bulk_callback(struct urb *urb)
schedule_work(&priv->dp_wakeup_work);

spin_unlock(&priv->dp_port_lock);
if (ret)
if (ret && ret != -EPERM)
dev_err(&port->dev,
"%s: usb_submit_urb failed, ret=%d, port=%d\n",
__func__, ret, priv->dp_port_num);
Expand Down Expand Up @@ -1353,8 +1353,7 @@ static int digi_open(struct tty_struct *tty, struct usb_serial_port *port)
struct digi_port *priv = usb_get_serial_port_data(port);
struct ktermios not_termios;

dbg("digi_open: TOP: port=%d, open_count=%d",
priv->dp_port_num, port->port.count);
dbg("digi_open: TOP: port=%d", priv->dp_port_num);

/* be sure the device is started up */
if (digi_startup_device(port->serial) != 0)
Expand Down Expand Up @@ -1393,8 +1392,7 @@ static void digi_close(struct usb_serial_port *port)
unsigned char buf[32];
struct digi_port *priv = usb_get_serial_port_data(port);

dbg("digi_close: TOP: port=%d, open_count=%d",
priv->dp_port_num, port->port.count);
dbg("digi_close: TOP: port=%d", priv->dp_port_num);

mutex_lock(&port->serial->disc_mutex);
/* if disconnected, just clear flags */
Expand Down Expand Up @@ -1629,7 +1627,7 @@ static void digi_read_bulk_callback(struct urb *urb)
/* continue read */
urb->dev = port->serial->dev;
ret = usb_submit_urb(urb, GFP_ATOMIC);
if (ret != 0) {
if (ret != 0 && ret != -EPERM) {
dev_err(&port->dev,
"%s: failed resubmitting urb, ret=%d, port=%d\n",
__func__, ret, priv->dp_port_num);
Expand Down Expand Up @@ -1662,7 +1660,7 @@ static int digi_read_inb_callback(struct urb *urb)

/* do not process callbacks on closed ports */
/* but do continue the read chain */
if (port->port.count == 0)
if (urb->status == -ENOENT)
return 0;

/* short/multiple packet check */
Expand Down Expand Up @@ -1767,8 +1765,7 @@ static int digi_read_oob_callback(struct urb *urb)

tty = tty_port_tty_get(&port->port);
rts = 0;
if (port->port.count)
rts = tty->termios->c_cflag & CRTSCTS;
rts = tty->termios->c_cflag & CRTSCTS;

if (opcode == DIGI_CMD_READ_INPUT_SIGNALS) {
spin_lock(&priv->dp_port_lock);
Expand Down
3 changes: 2 additions & 1 deletion drivers/usb/serial/generic.c
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
#include <linux/usb/serial.h>
#include <linux/uaccess.h>
#include <linux/kfifo.h>
#include <linux/serial.h>

static int debug;

Expand Down Expand Up @@ -585,7 +586,7 @@ int usb_serial_generic_resume(struct usb_serial *serial)

for (i = 0; i < serial->num_ports; i++) {
port = serial->port[i];
if (!port->port.count)
if (!test_bit(ASYNCB_INITIALIZED, &port->port.flags))
continue;

if (port->read_urb) {
Expand Down
5 changes: 0 additions & 5 deletions drivers/usb/serial/ir-usb.c
Original file line number Diff line number Diff line change
Expand Up @@ -445,11 +445,6 @@ static void ir_read_bulk_callback(struct urb *urb)

dbg("%s - port %d", __func__, port->number);

if (!port->port.count) {
dbg("%s - port closed.", __func__);
return;
}

switch (status) {
case 0: /* Successful */
/*
Expand Down
57 changes: 18 additions & 39 deletions drivers/usb/serial/keyspan.c
Original file line number Diff line number Diff line change
Expand Up @@ -464,13 +464,9 @@ static void usa26_indat_callback(struct urb *urb)

/* Resubmit urb so we continue receiving */
urb->dev = port->serial->dev;
if (port->port.count) {
err = usb_submit_urb(urb, GFP_ATOMIC);
if (err != 0)
dbg("%s - resubmit read urb failed. (%d)",
__func__, err);
}
return;
err = usb_submit_urb(urb, GFP_ATOMIC);
if (err != 0)
dbg("%s - resubmit read urb failed. (%d)", __func__, err);
}

/* Outdat handling is common for all devices */
Expand All @@ -483,8 +479,7 @@ static void usa2x_outdat_callback(struct urb *urb)
p_priv = usb_get_serial_port_data(port);
dbg("%s - urb %d", __func__, urb == p_priv->out_urbs[1]);

if (port->port.count)
usb_serial_port_softint(port);
usb_serial_port_softint(port);
}

static void usa26_inack_callback(struct urb *urb)
Expand Down Expand Up @@ -615,12 +610,10 @@ static void usa28_indat_callback(struct urb *urb)

/* Resubmit urb so we continue receiving */
urb->dev = port->serial->dev;
if (port->port.count) {
err = usb_submit_urb(urb, GFP_ATOMIC);
if (err != 0)
dbg("%s - resubmit read urb failed. (%d)",
__func__, err);
}
err = usb_submit_urb(urb, GFP_ATOMIC);
if (err != 0)
dbg("%s - resubmit read urb failed. (%d)",
__func__, err);
p_priv->in_flip ^= 1;

urb = p_priv->in_urbs[p_priv->in_flip];
Expand Down Expand Up @@ -856,12 +849,9 @@ static void usa49_indat_callback(struct urb *urb)

/* Resubmit urb so we continue receiving */
urb->dev = port->serial->dev;
if (port->port.count) {
err = usb_submit_urb(urb, GFP_ATOMIC);
if (err != 0)
dbg("%s - resubmit read urb failed. (%d)",
__func__, err);
}
err = usb_submit_urb(urb, GFP_ATOMIC);
if (err != 0)
dbg("%s - resubmit read urb failed. (%d)", __func__, err);
}

static void usa49wg_indat_callback(struct urb *urb)
Expand Down Expand Up @@ -904,11 +894,7 @@ static void usa49wg_indat_callback(struct urb *urb)
/* no error on any byte */
i++;
for (x = 1; x < len ; ++x)
if (port->port.count)
tty_insert_flip_char(tty,
data[i++], 0);
else
i++;
tty_insert_flip_char(tty, data[i++], 0);
} else {
/*
* some bytes had errors, every byte has status
Expand All @@ -922,14 +908,12 @@ static void usa49wg_indat_callback(struct urb *urb)
if (stat & RXERROR_PARITY)
flag |= TTY_PARITY;
/* XXX should handle break (0x10) */
if (port->port.count)
tty_insert_flip_char(tty,
tty_insert_flip_char(tty,
data[i+1], flag);
i += 2;
}
}
if (port->port.count)
tty_flip_buffer_push(tty);
tty_flip_buffer_push(tty);
tty_kref_put(tty);
}
}
Expand Down Expand Up @@ -1013,13 +997,9 @@ static void usa90_indat_callback(struct urb *urb)

/* Resubmit urb so we continue receiving */
urb->dev = port->serial->dev;
if (port->port.count) {
err = usb_submit_urb(urb, GFP_ATOMIC);
if (err != 0)
dbg("%s - resubmit read urb failed. (%d)",
__func__, err);
}
return;
err = usb_submit_urb(urb, GFP_ATOMIC);
if (err != 0)
dbg("%s - resubmit read urb failed. (%d)", __func__, err);
}


Expand Down Expand Up @@ -2418,8 +2398,7 @@ static int keyspan_usa90_send_setup(struct usb_serial *serial,
msg.portEnabled = 0;
/* Sending intermediate configs */
else {
if (port->port.count)
msg.portEnabled = 1;
msg.portEnabled = 1;
msg.txBreak = (p_priv->break_on);
}

Expand Down
4 changes: 2 additions & 2 deletions drivers/usb/serial/option.c
Original file line number Diff line number Diff line change
Expand Up @@ -971,9 +971,9 @@ static void option_indat_callback(struct urb *urb)
tty_kref_put(tty);

/* Resubmit urb so we continue receiving */
if (port->port.count && status != -ESHUTDOWN) {
if (status != -ESHUTDOWN) {
err = usb_submit_urb(urb, GFP_ATOMIC);
if (err)
if (err && err != -EPERM)
printk(KERN_ERR "%s: resubmit read urb failed. "
"(%d)", __func__, err);
else
Expand Down
21 changes: 6 additions & 15 deletions drivers/usb/serial/oti6858.c
Original file line number Diff line number Diff line change
Expand Up @@ -585,9 +585,6 @@ static int oti6858_open(struct tty_struct *tty, struct usb_serial_port *port)
usb_clear_halt(serial->dev, port->write_urb->pipe);
usb_clear_halt(serial->dev, port->read_urb->pipe);

if (port->port.count != 1)
return 0;

buf = kmalloc(OTI6858_CTRL_PKT_SIZE, GFP_KERNEL);
if (buf == NULL) {
dev_err(&port->dev, "%s(): out of memory!\n", __func__);
Expand Down Expand Up @@ -934,10 +931,6 @@ static void oti6858_read_bulk_callback(struct urb *urb)
spin_unlock_irqrestore(&priv->lock, flags);

if (status != 0) {
if (!port->port.count) {
dbg("%s(): port is closed, exiting", __func__);
return;
}
/*
if (status == -EPROTO) {
* PL2303 mysteriously fails with -EPROTO reschedule
Expand All @@ -961,14 +954,12 @@ static void oti6858_read_bulk_callback(struct urb *urb)
}
tty_kref_put(tty);

/* schedule the interrupt urb if we are still open */
if (port->port.count != 0) {
port->interrupt_in_urb->dev = port->serial->dev;
result = usb_submit_urb(port->interrupt_in_urb, GFP_ATOMIC);
if (result != 0) {
dev_err(&port->dev, "%s(): usb_submit_urb() failed,"
" error %d\n", __func__, result);
}
/* schedule the interrupt urb */
port->interrupt_in_urb->dev = port->serial->dev;
result = usb_submit_urb(port->interrupt_in_urb, GFP_ATOMIC);
if (result != 0 && result != -EPERM) {
dev_err(&port->dev, "%s(): usb_submit_urb() failed,"
" error %d\n", __func__, result);
}
}

Expand Down
18 changes: 5 additions & 13 deletions drivers/usb/serial/pl2303.c
Original file line number Diff line number Diff line change
Expand Up @@ -1071,10 +1071,6 @@ static void pl2303_read_bulk_callback(struct urb *urb)

if (status) {
dbg("%s - urb status = %d", __func__, status);
if (!port->port.count) {
dbg("%s - port is closed, exiting.", __func__);
return;
}
if (status == -EPROTO) {
/* PL2303 mysteriously fails with -EPROTO reschedule
* the read */
Expand Down Expand Up @@ -1107,15 +1103,11 @@ static void pl2303_read_bulk_callback(struct urb *urb)
}
tty_kref_put(tty);
/* Schedule the next read _if_ we are still open */
if (port->port.count) {
urb->dev = port->serial->dev;
result = usb_submit_urb(urb, GFP_ATOMIC);
if (result)
dev_err(&urb->dev->dev, "%s - failed resubmitting"
" read urb, error %d\n", __func__, result);
}

return;
urb->dev = port->serial->dev;
result = usb_submit_urb(urb, GFP_ATOMIC);
if (result && result != -EPERM)
dev_err(&urb->dev->dev, "%s - failed resubmitting"
" read urb, error %d\n", __func__, result);
}

static void pl2303_write_bulk_callback(struct urb *urb)
Expand Down
8 changes: 4 additions & 4 deletions drivers/usb/serial/sierra.c
Original file line number Diff line number Diff line change
Expand Up @@ -610,10 +610,10 @@ static void sierra_indat_callback(struct urb *urb)
}

/* Resubmit urb so we continue receiving */
if (port->port.count && status != -ESHUTDOWN && status != -EPERM) {
if (status != -ESHUTDOWN && status != -EPERM) {
usb_mark_last_busy(port->serial->dev);
err = usb_submit_urb(urb, GFP_ATOMIC);
if (err)
if (err && err != -EPERM)
dev_err(&port->dev, "resubmit read urb failed."
"(%d)\n", err);
}
Expand Down Expand Up @@ -672,11 +672,11 @@ static void sierra_instat_callback(struct urb *urb)
dev_dbg(&port->dev, "%s: error %d\n", __func__, status);

/* Resubmit urb so we continue receiving IRQ data */
if (port->port.count && status != -ESHUTDOWN && status != -ENOENT) {
if (status != -ESHUTDOWN && status != -ENOENT) {
usb_mark_last_busy(serial->dev);
urb->dev = serial->dev;
err = usb_submit_urb(urb, GFP_ATOMIC);
if (err)
if (err && err != -EPERM)
dev_err(&port->dev, "%s: resubmit intr urb "
"failed. (%d)\n", __func__, err);
}
Expand Down
Loading

0 comments on commit 1f87158

Please sign in to comment.