Beispiel #1
0
void usb_serial_generic_write_bulk_callback(struct urb *urb)
{
    unsigned long flags;
    struct usb_serial_port *port = urb->context;
    int status = urb->status;
    int i;

    for (i = 0; i < ARRAY_SIZE(port->write_urbs); ++i)
        if (port->write_urbs[i] == urb)
            break;

    spin_lock_irqsave(&port->lock, flags);
    port->tx_bytes -= urb->transfer_buffer_length;
    set_bit(i, &port->write_urbs_free);
    spin_unlock_irqrestore(&port->lock, flags);

    if (status) {
        dev_dbg(&port->dev, "%s - non-zero urb status: %d\n",
                __func__, status);

        spin_lock_irqsave(&port->lock, flags);
        kfifo_reset_out(&port->write_fifo);
        spin_unlock_irqrestore(&port->lock, flags);
    } else {
        usb_serial_generic_write_start(port);
    }

    usb_serial_port_softint(port);
}
static void generic_cleanup(struct usb_serial_port *port)
{
	struct usb_serial *serial = port->serial;
	unsigned long flags;
	int i;

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

	if (serial->dev) {
		/* shutdown any bulk transfers that might be going on */
		if (port->bulk_out_size) {
			usb_kill_urb(port->write_urb);
			for (i = 0; i < ARRAY_SIZE(port->write_urbs); ++i)
				usb_kill_urb(port->write_urbs[i]);

			spin_lock_irqsave(&port->lock, flags);
			kfifo_reset_out(&port->write_fifo);
			spin_unlock_irqrestore(&port->lock, flags);
		}
		if (port->bulk_in_size) {
			for (i = 0; i < ARRAY_SIZE(port->read_urbs); ++i)
				usb_kill_urb(port->read_urbs[i]);
		}
	}
}
void usb_serial_generic_write_bulk_callback(struct urb *urb)
{
	unsigned long flags;
	struct usb_serial_port *port = urb->context;
	int status = urb->status;

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

	if (port->serial->type->max_in_flight_urbs) {
		kfree(urb->transfer_buffer);

		spin_lock_irqsave(&port->lock, flags);
		--port->urbs_in_flight;
		port->tx_bytes_flight -= urb->transfer_buffer_length;
		if (port->urbs_in_flight < 0)
			port->urbs_in_flight = 0;
		spin_unlock_irqrestore(&port->lock, flags);
	} else {
		port->write_urb_busy = 0;

		if (status)
			kfifo_reset_out(&port->write_fifo);
		else
			usb_serial_generic_write_start(port);
	}

	if (status)
		dbg("%s - non-zero urb status: %d", __func__, status);

	usb_serial_port_softint(port);
}
Beispiel #4
0
/**
 * kfifo_skip - skip output data
 * @fifo: the fifo to be used.
 * @len: number of bytes to skip
 */
void kfifo_skip(struct kfifo *fifo, unsigned int len)
{
	if (len < kfifo_len(fifo)) {
		__kfifo_add_out(fifo, len);
		return;
	}
	kfifo_reset_out(fifo);
}
void usb_serial_generic_close(struct usb_serial_port *port)
{
	unsigned long flags;
	int i;

	if (port->bulk_out_size) {
		for (i = 0; i < ARRAY_SIZE(port->write_urbs); ++i)
			usb_kill_urb(port->write_urbs[i]);

		spin_lock_irqsave(&port->lock, flags);
		kfifo_reset_out(&port->write_fifo);
		spin_unlock_irqrestore(&port->lock, flags);
	}
	if (port->bulk_in_size) {
		for (i = 0; i < ARRAY_SIZE(port->read_urbs); ++i)
			usb_kill_urb(port->read_urbs[i]);
	}
}
Beispiel #6
0
static int iio_request_update_kfifo(struct iio_buffer *r)
{
	int ret = 0;
	struct iio_kfifo *buf = iio_to_kfifo(r);

	mutex_lock(&buf->user_lock);
	if (buf->update_needed) {
		kfifo_free(&buf->kf);
		ret = __iio_allocate_kfifo(buf, buf->buffer.bytes_per_datum,
				   buf->buffer.length);
		buf->update_needed = false;
	} else {
		kfifo_reset_out(&buf->kf);
	}
	mutex_unlock(&buf->user_lock);

	return ret;
}