static int ps3_vuart_queue_rx_bytes()

in ps3-vuart.c [543:587]


static int ps3_vuart_queue_rx_bytes(struct ps3_system_bus_device *dev,
	u64 *bytes_queued)
{
	static unsigned long dbg_number;
	int result;
	struct ps3_vuart_port_priv *priv = to_port_priv(dev);
	struct list_buffer *lb;
	u64 bytes;

	*bytes_queued = 0;

	result = ps3_vuart_get_rx_bytes_waiting(dev, &bytes);
	BUG_ON(result);

	if (result)
		return -EIO;

	if (!bytes)
		return 0;

	/* Add some extra space for recently arrived data. */

	bytes += 128;

	lb = kmalloc(sizeof(struct list_buffer) + bytes, GFP_ATOMIC);

	if (!lb)
		return -ENOMEM;

	ps3_vuart_raw_read(dev, lb->data, bytes, &bytes);

	lb->head = lb->data;
	lb->tail = lb->data + bytes;
	lb->dbg_number = ++dbg_number;

	list_add_tail(&lb->link, &priv->rx_list.head);
	priv->rx_list.bytes_held += bytes;

	dev_dbg(&dev->core, "%s:%d: buf_%lu: queued %llxh bytes\n",
		__func__, __LINE__, lb->dbg_number, bytes);

	*bytes_queued = bytes;

	return 0;
}