diff options
Diffstat (limited to 'drivers/usb/serial/digi_acceleport.c')
-rw-r--r-- | drivers/usb/serial/digi_acceleport.c | 38 |
1 files changed, 13 insertions, 25 deletions
diff --git a/drivers/usb/serial/digi_acceleport.c b/drivers/usb/serial/digi_acceleport.c index 68e80be6b9e1..68b0aa5e516c 100644 --- a/drivers/usb/serial/digi_acceleport.c +++ b/drivers/usb/serial/digi_acceleport.c | |||
@@ -470,18 +470,18 @@ static int digi_read_oob_callback(struct urb *urb); | |||
470 | 470 | ||
471 | static int debug; | 471 | static int debug; |
472 | 472 | ||
473 | static struct usb_device_id id_table_combined [] = { | 473 | static const struct usb_device_id id_table_combined[] = { |
474 | { USB_DEVICE(DIGI_VENDOR_ID, DIGI_2_ID) }, | 474 | { USB_DEVICE(DIGI_VENDOR_ID, DIGI_2_ID) }, |
475 | { USB_DEVICE(DIGI_VENDOR_ID, DIGI_4_ID) }, | 475 | { USB_DEVICE(DIGI_VENDOR_ID, DIGI_4_ID) }, |
476 | { } /* Terminating entry */ | 476 | { } /* Terminating entry */ |
477 | }; | 477 | }; |
478 | 478 | ||
479 | static struct usb_device_id id_table_2 [] = { | 479 | static const struct usb_device_id id_table_2[] = { |
480 | { USB_DEVICE(DIGI_VENDOR_ID, DIGI_2_ID) }, | 480 | { USB_DEVICE(DIGI_VENDOR_ID, DIGI_2_ID) }, |
481 | { } /* Terminating entry */ | 481 | { } /* Terminating entry */ |
482 | }; | 482 | }; |
483 | 483 | ||
484 | static struct usb_device_id id_table_4 [] = { | 484 | static const struct usb_device_id id_table_4[] = { |
485 | { USB_DEVICE(DIGI_VENDOR_ID, DIGI_4_ID) }, | 485 | { USB_DEVICE(DIGI_VENDOR_ID, DIGI_4_ID) }, |
486 | { } /* Terminating entry */ | 486 | { } /* Terminating entry */ |
487 | }; | 487 | }; |
@@ -1262,10 +1262,10 @@ static void digi_write_bulk_callback(struct urb *urb) | |||
1262 | return; | 1262 | return; |
1263 | } | 1263 | } |
1264 | 1264 | ||
1265 | /* try to send any buffered data on this port, if it is open */ | 1265 | /* try to send any buffered data on this port */ |
1266 | spin_lock(&priv->dp_port_lock); | 1266 | spin_lock(&priv->dp_port_lock); |
1267 | priv->dp_write_urb_in_use = 0; | 1267 | priv->dp_write_urb_in_use = 0; |
1268 | if (port->port.count && priv->dp_out_buf_len > 0) { | 1268 | if (priv->dp_out_buf_len > 0) { |
1269 | *((unsigned char *)(port->write_urb->transfer_buffer)) | 1269 | *((unsigned char *)(port->write_urb->transfer_buffer)) |
1270 | = (unsigned char)DIGI_CMD_SEND_DATA; | 1270 | = (unsigned char)DIGI_CMD_SEND_DATA; |
1271 | *((unsigned char *)(port->write_urb->transfer_buffer) + 1) | 1271 | *((unsigned char *)(port->write_urb->transfer_buffer) + 1) |
@@ -1288,7 +1288,7 @@ static void digi_write_bulk_callback(struct urb *urb) | |||
1288 | schedule_work(&priv->dp_wakeup_work); | 1288 | schedule_work(&priv->dp_wakeup_work); |
1289 | 1289 | ||
1290 | spin_unlock(&priv->dp_port_lock); | 1290 | spin_unlock(&priv->dp_port_lock); |
1291 | if (ret) | 1291 | if (ret && ret != -EPERM) |
1292 | dev_err(&port->dev, | 1292 | dev_err(&port->dev, |
1293 | "%s: usb_submit_urb failed, ret=%d, port=%d\n", | 1293 | "%s: usb_submit_urb failed, ret=%d, port=%d\n", |
1294 | __func__, ret, priv->dp_port_num); | 1294 | __func__, ret, priv->dp_port_num); |
@@ -1353,8 +1353,7 @@ static int digi_open(struct tty_struct *tty, struct usb_serial_port *port) | |||
1353 | struct digi_port *priv = usb_get_serial_port_data(port); | 1353 | struct digi_port *priv = usb_get_serial_port_data(port); |
1354 | struct ktermios not_termios; | 1354 | struct ktermios not_termios; |
1355 | 1355 | ||
1356 | dbg("digi_open: TOP: port=%d, open_count=%d", | 1356 | dbg("digi_open: TOP: port=%d", priv->dp_port_num); |
1357 | priv->dp_port_num, port->port.count); | ||
1358 | 1357 | ||
1359 | /* be sure the device is started up */ | 1358 | /* be sure the device is started up */ |
1360 | if (digi_startup_device(port->serial) != 0) | 1359 | if (digi_startup_device(port->serial) != 0) |
@@ -1393,8 +1392,7 @@ static void digi_close(struct usb_serial_port *port) | |||
1393 | unsigned char buf[32]; | 1392 | unsigned char buf[32]; |
1394 | struct digi_port *priv = usb_get_serial_port_data(port); | 1393 | struct digi_port *priv = usb_get_serial_port_data(port); |
1395 | 1394 | ||
1396 | dbg("digi_close: TOP: port=%d, open_count=%d", | 1395 | dbg("digi_close: TOP: port=%d", priv->dp_port_num); |
1397 | priv->dp_port_num, port->port.count); | ||
1398 | 1396 | ||
1399 | mutex_lock(&port->serial->disc_mutex); | 1397 | mutex_lock(&port->serial->disc_mutex); |
1400 | /* if disconnected, just clear flags */ | 1398 | /* if disconnected, just clear flags */ |
@@ -1629,7 +1627,7 @@ static void digi_read_bulk_callback(struct urb *urb) | |||
1629 | /* continue read */ | 1627 | /* continue read */ |
1630 | urb->dev = port->serial->dev; | 1628 | urb->dev = port->serial->dev; |
1631 | ret = usb_submit_urb(urb, GFP_ATOMIC); | 1629 | ret = usb_submit_urb(urb, GFP_ATOMIC); |
1632 | if (ret != 0) { | 1630 | if (ret != 0 && ret != -EPERM) { |
1633 | dev_err(&port->dev, | 1631 | dev_err(&port->dev, |
1634 | "%s: failed resubmitting urb, ret=%d, port=%d\n", | 1632 | "%s: failed resubmitting urb, ret=%d, port=%d\n", |
1635 | __func__, ret, priv->dp_port_num); | 1633 | __func__, ret, priv->dp_port_num); |
@@ -1658,12 +1656,11 @@ static int digi_read_inb_callback(struct urb *urb) | |||
1658 | int port_status = ((unsigned char *)urb->transfer_buffer)[2]; | 1656 | int port_status = ((unsigned char *)urb->transfer_buffer)[2]; |
1659 | unsigned char *data = ((unsigned char *)urb->transfer_buffer) + 3; | 1657 | unsigned char *data = ((unsigned char *)urb->transfer_buffer) + 3; |
1660 | int flag, throttled; | 1658 | int flag, throttled; |
1661 | int i; | ||
1662 | int status = urb->status; | 1659 | int status = urb->status; |
1663 | 1660 | ||
1664 | /* do not process callbacks on closed ports */ | 1661 | /* do not process callbacks on closed ports */ |
1665 | /* but do continue the read chain */ | 1662 | /* but do continue the read chain */ |
1666 | if (port->port.count == 0) | 1663 | if (urb->status == -ENOENT) |
1667 | return 0; | 1664 | return 0; |
1668 | 1665 | ||
1669 | /* short/multiple packet check */ | 1666 | /* short/multiple packet check */ |
@@ -1705,17 +1702,9 @@ static int digi_read_inb_callback(struct urb *urb) | |||
1705 | 1702 | ||
1706 | /* data length is len-1 (one byte of len is port_status) */ | 1703 | /* data length is len-1 (one byte of len is port_status) */ |
1707 | --len; | 1704 | --len; |
1708 | |||
1709 | len = tty_buffer_request_room(tty, len); | ||
1710 | if (len > 0) { | 1705 | if (len > 0) { |
1711 | /* Hot path */ | 1706 | tty_insert_flip_string_fixed_flag(tty, data, len, |
1712 | if (flag == TTY_NORMAL) | 1707 | flag); |
1713 | tty_insert_flip_string(tty, data, len); | ||
1714 | else { | ||
1715 | for (i = 0; i < len; i++) | ||
1716 | tty_insert_flip_char(tty, | ||
1717 | data[i], flag); | ||
1718 | } | ||
1719 | tty_flip_buffer_push(tty); | 1708 | tty_flip_buffer_push(tty); |
1720 | } | 1709 | } |
1721 | } | 1710 | } |
@@ -1776,8 +1765,7 @@ static int digi_read_oob_callback(struct urb *urb) | |||
1776 | 1765 | ||
1777 | tty = tty_port_tty_get(&port->port); | 1766 | tty = tty_port_tty_get(&port->port); |
1778 | rts = 0; | 1767 | rts = 0; |
1779 | if (port->port.count) | 1768 | rts = tty->termios->c_cflag & CRTSCTS; |
1780 | rts = tty->termios->c_cflag & CRTSCTS; | ||
1781 | 1769 | ||
1782 | if (opcode == DIGI_CMD_READ_INPUT_SIGNALS) { | 1770 | if (opcode == DIGI_CMD_READ_INPUT_SIGNALS) { |
1783 | spin_lock(&priv->dp_port_lock); | 1771 | spin_lock(&priv->dp_port_lock); |