/* write data to ring buffer. and then start the write transfer */ static int spcp8x5_write(struct usb_serial_port *port, const unsigned char *buf, int count) { struct spcp8x5_private *priv = usb_get_serial_port_data(port); unsigned long flags; dev_dbg(&port->dev, "%d bytes\n", count); if (!count) return count; spin_lock_irqsave(&priv->lock, flags); count = put_ringbuf(priv->buf, buf, count); spin_unlock_irqrestore(&priv->lock, flags); spcp8x5_send(port); return count; }
/* this is the call back function for write urb. NOTE we should not sleep in * this routine. check the urb return code and then submit the write urb again * to hold the write loop */ static void spcp8x5_write_bulk_callback(struct urb *urb) { struct usb_serial_port *port = urb->context; struct spcp8x5_private *priv = usb_get_serial_port_data(port); int result; int status = urb->status; switch (status) { case 0: /* success */ break; case -ECONNRESET: case -ENOENT: case -ESHUTDOWN: /* this urb is terminated, clean up */ dev_dbg(&port->dev, "urb shutting down with status: %d\n", status); priv->write_urb_in_use = 0; return; default: /* error in the urb, so we have to resubmit it */ dbg("%s - Overflow in write", __func__); dbg("%s - nonzero write bulk status received: %d", __func__, status); port->write_urb->transfer_buffer_length = 1; port->write_urb->dev = port->serial->dev; result = usb_submit_urb(port->write_urb, GFP_ATOMIC); if (result) dev_dbg(&port->dev, "failed resubmitting write urb %d\n", result); else return; } priv->write_urb_in_use = 0; /* send any buffered data */ spcp8x5_send(port); }