aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/usb/serial/cypress_m8.c26
1 files changed, 20 insertions, 6 deletions
diff --git a/drivers/usb/serial/cypress_m8.c b/drivers/usb/serial/cypress_m8.c
index ee70fddcab60..40cfbe1d3517 100644
--- a/drivers/usb/serial/cypress_m8.c
+++ b/drivers/usb/serial/cypress_m8.c
@@ -129,6 +129,8 @@ struct cypress_private {
129 int cmd_ctrl; /* always set this to 1 before issuing a command */ 129 int cmd_ctrl; /* always set this to 1 before issuing a command */
130 struct cypress_buf *buf; /* write buffer */ 130 struct cypress_buf *buf; /* write buffer */
131 int write_urb_in_use; /* write urb in use indicator */ 131 int write_urb_in_use; /* write urb in use indicator */
132 int write_urb_interval; /* interval to use for write urb */
133 int read_urb_interval; /* interval to use for read urb */
132 int termios_initialized; 134 int termios_initialized;
133 __u8 line_control; /* holds dtr / rts value */ 135 __u8 line_control; /* holds dtr / rts value */
134 __u8 current_status; /* received from last read - info on dsr,cts,cd,ri,etc */ 136 __u8 current_status; /* received from last read - info on dsr,cts,cd,ri,etc */
@@ -472,8 +474,9 @@ static unsigned rate_to_mask (int rate)
472static int generic_startup (struct usb_serial *serial) 474static int generic_startup (struct usb_serial *serial)
473{ 475{
474 struct cypress_private *priv; 476 struct cypress_private *priv;
477 struct usb_serial_port *port = serial->port[0];
475 478
476 dbg("%s - port %d", __FUNCTION__, serial->port[0]->number); 479 dbg("%s - port %d", __FUNCTION__, port->number);
477 480
478 priv = kzalloc(sizeof (struct cypress_private), GFP_KERNEL); 481 priv = kzalloc(sizeof (struct cypress_private), GFP_KERNEL);
479 if (!priv) 482 if (!priv)
@@ -489,13 +492,24 @@ static int generic_startup (struct usb_serial *serial)
489 492
490 usb_reset_configuration (serial->dev); 493 usb_reset_configuration (serial->dev);
491 494
492 interval = 1;
493 priv->cmd_ctrl = 0; 495 priv->cmd_ctrl = 0;
494 priv->line_control = 0; 496 priv->line_control = 0;
495 priv->termios_initialized = 0; 497 priv->termios_initialized = 0;
496 priv->rx_flags = 0; 498 priv->rx_flags = 0;
497 priv->cbr_mask = B300; 499 priv->cbr_mask = B300;
498 usb_set_serial_port_data(serial->port[0], priv); 500 if (interval > 0) {
501 priv->write_urb_interval = interval;
502 priv->read_urb_interval = interval;
503 dbg("%s - port %d read & write intervals forced to %d",
504 __FUNCTION__,port->number,interval);
505 } else {
506 priv->write_urb_interval = port->interrupt_out_urb->interval;
507 priv->read_urb_interval = port->interrupt_in_urb->interval;
508 dbg("%s - port %d intervals: read=%d write=%d",
509 __FUNCTION__,port->number,
510 priv->read_urb_interval,priv->write_urb_interval);
511 }
512 usb_set_serial_port_data(port, priv);
499 513
500 return 0; 514 return 0;
501} 515}
@@ -624,7 +638,7 @@ static int cypress_open (struct usb_serial_port *port, struct file *filp)
624 usb_fill_int_urb(port->interrupt_in_urb, serial->dev, 638 usb_fill_int_urb(port->interrupt_in_urb, serial->dev,
625 usb_rcvintpipe(serial->dev, port->interrupt_in_endpointAddress), 639 usb_rcvintpipe(serial->dev, port->interrupt_in_endpointAddress),
626 port->interrupt_in_urb->transfer_buffer, port->interrupt_in_urb->transfer_buffer_length, 640 port->interrupt_in_urb->transfer_buffer, port->interrupt_in_urb->transfer_buffer_length,
627 cypress_read_int_callback, port, interval); 641 cypress_read_int_callback, port, priv->read_urb_interval);
628 result = usb_submit_urb(port->interrupt_in_urb, GFP_KERNEL); 642 result = usb_submit_urb(port->interrupt_in_urb, GFP_KERNEL);
629 643
630 if (result){ 644 if (result){
@@ -808,7 +822,7 @@ send:
808 822
809 port->interrupt_out_urb->transfer_buffer_length = actual_size; 823 port->interrupt_out_urb->transfer_buffer_length = actual_size;
810 port->interrupt_out_urb->dev = port->serial->dev; 824 port->interrupt_out_urb->dev = port->serial->dev;
811 port->interrupt_out_urb->interval = interval; 825 port->interrupt_out_urb->interval = priv->write_urb_interval;
812 result = usb_submit_urb (port->interrupt_out_urb, GFP_ATOMIC); 826 result = usb_submit_urb (port->interrupt_out_urb, GFP_ATOMIC);
813 if (result) { 827 if (result) {
814 dev_err(&port->dev, "%s - failed submitting write urb, error %d\n", __FUNCTION__, 828 dev_err(&port->dev, "%s - failed submitting write urb, error %d\n", __FUNCTION__,
@@ -1349,7 +1363,7 @@ continue_read:
1349 port->interrupt_in_endpointAddress), 1363 port->interrupt_in_endpointAddress),
1350 port->interrupt_in_urb->transfer_buffer, 1364 port->interrupt_in_urb->transfer_buffer,
1351 port->interrupt_in_urb->transfer_buffer_length, 1365 port->interrupt_in_urb->transfer_buffer_length,
1352 cypress_read_int_callback, port, interval); 1366 cypress_read_int_callback, port, priv->read_urb_interval);
1353 result = usb_submit_urb(port->interrupt_in_urb, GFP_ATOMIC); 1367 result = usb_submit_urb(port->interrupt_in_urb, GFP_ATOMIC);
1354 if (result) 1368 if (result)
1355 dev_err(&urb->dev->dev, "%s - failed resubmitting " 1369 dev_err(&urb->dev->dev, "%s - failed resubmitting "