|
@@ -984,6 +984,7 @@ static void digi_write_bulk_callback(struct urb *urb)
|
|
|
struct usb_serial *serial;
|
|
|
struct digi_port *priv;
|
|
|
struct digi_serial *serial_priv;
|
|
|
+ unsigned long flags;
|
|
|
int ret = 0;
|
|
|
int status = urb->status;
|
|
|
|
|
@@ -1004,15 +1005,15 @@ static void digi_write_bulk_callback(struct urb *urb)
|
|
|
/* handle oob callback */
|
|
|
if (priv->dp_port_num == serial_priv->ds_oob_port_num) {
|
|
|
dev_dbg(&port->dev, "digi_write_bulk_callback: oob callback\n");
|
|
|
- spin_lock(&priv->dp_port_lock);
|
|
|
+ spin_lock_irqsave(&priv->dp_port_lock, flags);
|
|
|
priv->dp_write_urb_in_use = 0;
|
|
|
wake_up_interruptible(&port->write_wait);
|
|
|
- spin_unlock(&priv->dp_port_lock);
|
|
|
+ spin_unlock_irqrestore(&priv->dp_port_lock, flags);
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
/* try to send any buffered data on this port */
|
|
|
- spin_lock(&priv->dp_port_lock);
|
|
|
+ spin_lock_irqsave(&priv->dp_port_lock, flags);
|
|
|
priv->dp_write_urb_in_use = 0;
|
|
|
if (priv->dp_out_buf_len > 0) {
|
|
|
*((unsigned char *)(port->write_urb->transfer_buffer))
|
|
@@ -1035,7 +1036,7 @@ static void digi_write_bulk_callback(struct urb *urb)
|
|
|
/* lost the race in write_chan(). */
|
|
|
schedule_work(&priv->dp_wakeup_work);
|
|
|
|
|
|
- spin_unlock(&priv->dp_port_lock);
|
|
|
+ spin_unlock_irqrestore(&priv->dp_port_lock, flags);
|
|
|
if (ret && ret != -EPERM)
|
|
|
dev_err_console(port,
|
|
|
"%s: usb_submit_urb failed, ret=%d, port=%d\n",
|
|
@@ -1381,6 +1382,7 @@ static int digi_read_inb_callback(struct urb *urb)
|
|
|
struct usb_serial_port *port = urb->context;
|
|
|
struct digi_port *priv = usb_get_serial_port_data(port);
|
|
|
unsigned char *buf = urb->transfer_buffer;
|
|
|
+ unsigned long flags;
|
|
|
int opcode;
|
|
|
int len;
|
|
|
int port_status;
|
|
@@ -1407,7 +1409,7 @@ static int digi_read_inb_callback(struct urb *urb)
|
|
|
return -1;
|
|
|
}
|
|
|
|
|
|
- spin_lock(&priv->dp_port_lock);
|
|
|
+ spin_lock_irqsave(&priv->dp_port_lock, flags);
|
|
|
|
|
|
/* check for throttle; if set, do not resubmit read urb */
|
|
|
/* indicate the read chain needs to be restarted on unthrottle */
|
|
@@ -1444,7 +1446,7 @@ static int digi_read_inb_callback(struct urb *urb)
|
|
|
tty_flip_buffer_push(&port->port);
|
|
|
}
|
|
|
}
|
|
|
- spin_unlock(&priv->dp_port_lock);
|
|
|
+ spin_unlock_irqrestore(&priv->dp_port_lock, flags);
|
|
|
|
|
|
if (opcode == DIGI_CMD_RECEIVE_DISABLE)
|
|
|
dev_dbg(&port->dev, "%s: got RECEIVE_DISABLE\n", __func__);
|
|
@@ -1474,6 +1476,7 @@ static int digi_read_oob_callback(struct urb *urb)
|
|
|
struct digi_port *priv = usb_get_serial_port_data(port);
|
|
|
unsigned char *buf = urb->transfer_buffer;
|
|
|
int opcode, line, status, val;
|
|
|
+ unsigned long flags;
|
|
|
int i;
|
|
|
unsigned int rts;
|
|
|
|
|
@@ -1506,7 +1509,7 @@ static int digi_read_oob_callback(struct urb *urb)
|
|
|
rts = C_CRTSCTS(tty);
|
|
|
|
|
|
if (tty && opcode == DIGI_CMD_READ_INPUT_SIGNALS) {
|
|
|
- spin_lock(&priv->dp_port_lock);
|
|
|
+ spin_lock_irqsave(&priv->dp_port_lock, flags);
|
|
|
/* convert from digi flags to termiox flags */
|
|
|
if (val & DIGI_READ_INPUT_SIGNALS_CTS) {
|
|
|
priv->dp_modem_signals |= TIOCM_CTS;
|
|
@@ -1530,12 +1533,12 @@ static int digi_read_oob_callback(struct urb *urb)
|
|
|
else
|
|
|
priv->dp_modem_signals &= ~TIOCM_CD;
|
|
|
|
|
|
- spin_unlock(&priv->dp_port_lock);
|
|
|
+ spin_unlock_irqrestore(&priv->dp_port_lock, flags);
|
|
|
} else if (opcode == DIGI_CMD_TRANSMIT_IDLE) {
|
|
|
- spin_lock(&priv->dp_port_lock);
|
|
|
+ spin_lock_irqsave(&priv->dp_port_lock, flags);
|
|
|
priv->dp_transmit_idle = 1;
|
|
|
wake_up_interruptible(&priv->dp_transmit_idle_wait);
|
|
|
- spin_unlock(&priv->dp_port_lock);
|
|
|
+ spin_unlock_irqrestore(&priv->dp_port_lock, flags);
|
|
|
} else if (opcode == DIGI_CMD_IFLUSH_FIFO) {
|
|
|
wake_up_interruptible(&priv->dp_flush_wait);
|
|
|
}
|