Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 3e1674c0 authored by Aaro Koskinen's avatar Aaro Koskinen Committed by Greg Kroah-Hartman
Browse files

staging: octeon-usb: eliminate submit_handle



Eliminate submit_handle, use a direct reference instead.

Signed-off-by: default avatarAaro Koskinen <aaro.koskinen@iki.fi>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 60f81507
Loading
Loading
Loading
Loading
+90 −142
Original line number Diff line number Diff line
@@ -1251,22 +1251,6 @@ static struct cvmx_usb_port_status cvmx_usb_get_status(struct cvmx_usb_state *us
	return result;
}

/**
 * Convert a USB transaction into a handle
 *
 * @usb:	 USB device state populated by cvmx_usb_initialize().
 * @transaction:
 *		 Transaction to get handle for
 *
 * Returns: Handle
 */
static inline int __cvmx_usb_get_submit_handle(struct cvmx_usb_state *usb,
					       struct cvmx_usb_transaction *transaction)
{
	return ((unsigned long)transaction - (unsigned long)usb->transaction) /
			sizeof(*transaction);
}

/**
 * Open a virtual pipe between the host and a USB device. A pipe
 * must be opened before data can be transferred between a device
@@ -2131,7 +2115,8 @@ static inline struct usb_hcd *octeon_to_hcd(struct octeon_hcd *p)
static void octeon_usb_urb_complete_callback(struct cvmx_usb_state *usb,
					     enum cvmx_usb_complete status,
					     struct cvmx_usb_pipe *pipe,
					     int submit_handle,
					     struct cvmx_usb_transaction
						*transaction,
					     int bytes_transferred,
					     struct urb *urb)
{
@@ -2172,10 +2157,10 @@ static void octeon_usb_urb_complete_callback(struct cvmx_usb_state *usb,
				urb->iso_frame_desc[i].actual_length = iso_packet[i].length;
				urb->actual_length += urb->iso_frame_desc[i].actual_length;
			} else {
				dev_dbg(dev, "ISOCHRONOUS packet=%d of %d status=%d pipe=%p submit=%d size=%d\n",
				dev_dbg(dev, "ISOCHRONOUS packet=%d of %d status=%d pipe=%p transaction=%p size=%d\n",
					i, urb->number_of_packets,
					iso_packet[i].status, pipe,
					submit_handle, iso_packet[i].length);
					transaction, iso_packet[i].length);
				urb->iso_frame_desc[i].status = -EREMOTEIO;
			}
		}
@@ -2193,26 +2178,26 @@ static void octeon_usb_urb_complete_callback(struct cvmx_usb_state *usb,
			urb->status = -ENOENT;
		break;
	case CVMX_USB_COMPLETE_STALL:
		dev_dbg(dev, "status=stall pipe=%p submit=%d size=%d\n",
			pipe, submit_handle, bytes_transferred);
		dev_dbg(dev, "status=stall pipe=%p transaction=%p size=%d\n",
			pipe, transaction, bytes_transferred);
		urb->status = -EPIPE;
		break;
	case CVMX_USB_COMPLETE_BABBLEERR:
		dev_dbg(dev, "status=babble pipe=%p submit=%d size=%d\n",
			pipe, submit_handle, bytes_transferred);
		dev_dbg(dev, "status=babble pipe=%p transaction=%p size=%d\n",
			pipe, transaction, bytes_transferred);
		urb->status = -EPIPE;
		break;
	case CVMX_USB_COMPLETE_SHORT:
		dev_dbg(dev, "status=short pipe=%p submit=%d size=%d\n",
			pipe, submit_handle, bytes_transferred);
		dev_dbg(dev, "status=short pipe=%p transaction=%p size=%d\n",
			pipe, transaction, bytes_transferred);
		urb->status = -EREMOTEIO;
		break;
	case CVMX_USB_COMPLETE_ERROR:
	case CVMX_USB_COMPLETE_XACTERR:
	case CVMX_USB_COMPLETE_DATATGLERR:
	case CVMX_USB_COMPLETE_FRAMEERR:
		dev_dbg(dev, "status=%d pipe=%p submit=%d size=%d\n",
			status, pipe, submit_handle, bytes_transferred);
		dev_dbg(dev, "status=%d pipe=%p transaction=%p size=%d\n",
			status, pipe, transaction, bytes_transferred);
		urb->status = -EPROTO;
		break;
	}
@@ -2237,8 +2222,6 @@ static void __cvmx_usb_perform_complete(struct cvmx_usb_state *usb,
					struct cvmx_usb_transaction *transaction,
					enum cvmx_usb_complete complete_code)
{
	int submit_handle;

	/* If this was a split then clear our split in progress marker */
	if (usb->active_split == transaction)
		usb->active_split = NULL;
@@ -2282,9 +2265,8 @@ static void __cvmx_usb_perform_complete(struct cvmx_usb_state *usb,
		__cvmx_usb_append_pipe(&usb->idle_pipes, pipe);

	}
	submit_handle = __cvmx_usb_get_submit_handle(usb, transaction);
	octeon_usb_urb_complete_callback(usb, complete_code, pipe,
					 submit_handle,
					 transaction,
					 transaction->actual_bytes,
					 transaction->urb);
	__cvmx_usb_free_transaction(usb, transaction);
@@ -2313,10 +2295,9 @@ static void __cvmx_usb_perform_complete(struct cvmx_usb_state *usb,
 *		    A description of each ISO packet
 * @urb:	    URB for the callback
 *
 * Returns: Submit handle or negative on failure. Matches the result
 *	    in the external API.
 * Returns: Transaction or NULL on failure.
 */
static int __cvmx_usb_submit_transaction(struct cvmx_usb_state *usb,
static struct cvmx_usb_transaction *__cvmx_usb_submit_transaction(struct cvmx_usb_state *usb,
								  struct cvmx_usb_pipe *pipe,
								  enum cvmx_usb_transfer type,
								  uint64_t buffer,
@@ -2327,18 +2308,17 @@ static int __cvmx_usb_submit_transaction(struct cvmx_usb_state *usb,
								  struct cvmx_usb_iso_packet *iso_packets,
								  struct urb *urb)
{
	int submit_handle;
	struct cvmx_usb_transaction *transaction;

	/* Fail if the pipe isn't open */
	if (unlikely((pipe->flags & __CVMX_USB_PIPE_FLAGS_OPEN) == 0))
		return -EINVAL;
		return NULL;
	if (unlikely(pipe->transfer_type != type))
		return -EINVAL;
		return NULL;

	transaction = __cvmx_usb_alloc_transaction(usb);
	if (unlikely(!transaction))
		return -ENOMEM;
		return NULL;

	transaction->type = type;
	transaction->buffer = buffer;
@@ -2369,13 +2349,11 @@ static int __cvmx_usb_submit_transaction(struct cvmx_usb_state *usb,
	}
	pipe->tail = transaction;

	submit_handle = __cvmx_usb_get_submit_handle(usb, transaction);

	/* We may need to schedule the pipe if this was the head of the pipe */
	if (!transaction->prev)
		__cvmx_usb_schedule(usb, 0);

	return submit_handle;
	return transaction;
}


@@ -2386,17 +2364,13 @@ static int __cvmx_usb_submit_transaction(struct cvmx_usb_state *usb,
 * @pipe:	    Handle to the pipe for the transfer.
 * @urb:	    URB.
 *
 * Returns: A submitted transaction handle or negative on
 *	    failure. Negative values are error codes.
 * Returns: A submitted transaction or NULL on failure.
 */
static int cvmx_usb_submit_bulk(struct cvmx_usb_state *usb,
static struct cvmx_usb_transaction *cvmx_usb_submit_bulk(struct cvmx_usb_state *usb,
							 struct cvmx_usb_pipe *pipe,
							 struct urb *urb)
{
	int submit_handle;

	submit_handle = __cvmx_usb_submit_transaction(usb, pipe,
						      CVMX_USB_TRANSFER_BULK,
	return __cvmx_usb_submit_transaction(usb, pipe, CVMX_USB_TRANSFER_BULK,
					     urb->transfer_dma,
					     urb->transfer_buffer_length,
					     0, /* control_header */
@@ -2404,7 +2378,6 @@ static int cvmx_usb_submit_bulk(struct cvmx_usb_state *usb,
					     0, /* iso_number_packets */
					     NULL, /* iso_packets */
					     urb);
	return submit_handle;
}


@@ -2415,16 +2388,13 @@ static int cvmx_usb_submit_bulk(struct cvmx_usb_state *usb,
 * @pipe:	    Handle to the pipe for the transfer.
 * @urb:	    URB returned when the callback is called.
 *
 * Returns: A submitted transaction handle or negative on
 *	    failure. Negative values are error codes.
 * Returns: A submitted transaction or NULL on failure.
 */
static int cvmx_usb_submit_interrupt(struct cvmx_usb_state *usb,
static struct cvmx_usb_transaction *cvmx_usb_submit_interrupt(struct cvmx_usb_state *usb,
							      struct cvmx_usb_pipe *pipe,
							      struct urb *urb)
{
	int submit_handle;

	submit_handle = __cvmx_usb_submit_transaction(usb, pipe,
	return __cvmx_usb_submit_transaction(usb, pipe,
					     CVMX_USB_TRANSFER_INTERRUPT,
					     urb->transfer_dma,
					     urb->transfer_buffer_length,
@@ -2433,7 +2403,6 @@ static int cvmx_usb_submit_interrupt(struct cvmx_usb_state *usb,
					     0, /* iso_number_packets */
					     NULL, /* iso_packets */
					     urb);
	return submit_handle;
}


@@ -2444,14 +2413,12 @@ static int cvmx_usb_submit_interrupt(struct cvmx_usb_state *usb,
 * @pipe:	    Handle to the pipe for the transfer.
 * @urb:	    URB.
 *
 * Returns: A submitted transaction handle or negative on
 *	    failure. Negative values are error codes.
 * Returns: A submitted transaction or NULL on failure.
 */
static int cvmx_usb_submit_control(struct cvmx_usb_state *usb,
static struct cvmx_usb_transaction *cvmx_usb_submit_control(struct cvmx_usb_state *usb,
							    struct cvmx_usb_pipe *pipe,
							    struct urb *urb)
{
	int submit_handle;
	int buffer_length = urb->transfer_buffer_length;
	uint64_t control_header = urb->setup_dma;
	union cvmx_usb_control_header *header =
@@ -2460,16 +2427,14 @@ static int cvmx_usb_submit_control(struct cvmx_usb_state *usb,
	if ((header->s.request_type & 0x80) == 0)
		buffer_length = le16_to_cpu(header->s.length);

	submit_handle = __cvmx_usb_submit_transaction(usb, pipe,
	return __cvmx_usb_submit_transaction(usb, pipe,
					     CVMX_USB_TRANSFER_CONTROL,
						      urb->transfer_dma,
						      buffer_length,
					     urb->transfer_dma, buffer_length,
					     control_header,
					     0, /* iso_start_frame */
					     0, /* iso_number_packets */
					     NULL, /* iso_packets */
					     urb);
	return submit_handle;
}


@@ -2480,27 +2445,23 @@ static int cvmx_usb_submit_control(struct cvmx_usb_state *usb,
 * @pipe:	    Handle to the pipe for the transfer.
 * @urb:	    URB returned when the callback is called.
 *
 * Returns: A submitted transaction handle or negative on
 *	    failure. Negative values are error codes.
 * Returns: A submitted transaction or NULL on failure.
 */
static int cvmx_usb_submit_isochronous(struct cvmx_usb_state *usb,
static struct cvmx_usb_transaction *cvmx_usb_submit_isochronous(struct cvmx_usb_state *usb,
								struct cvmx_usb_pipe *pipe,
								struct urb *urb)
{
	int submit_handle;
	struct cvmx_usb_iso_packet *packets;

	packets = (struct cvmx_usb_iso_packet *) urb->setup_packet;
	submit_handle = __cvmx_usb_submit_transaction(usb, pipe,
	return __cvmx_usb_submit_transaction(usb, pipe,
					     CVMX_USB_TRANSFER_ISOCHRONOUS,
					     urb->transfer_dma,
					     urb->transfer_buffer_length,
					     0, /* control_header */
					     urb->start_frame,
					     urb->number_of_packets,
						      packets,
						      urb);
	return submit_handle;
					     packets, urb);
}


@@ -2513,27 +2474,18 @@ static int cvmx_usb_submit_isochronous(struct cvmx_usb_state *usb,
 *
 * @usb:	 USB device state populated by cvmx_usb_initialize().
 * @pipe:	 Pipe to cancel requests in.
 * @submit_handle:
 *		 Handle to transaction to cancel, returned by the submit
 *		 function.
 * @transaction: Transaction to cancel, returned by the submit function.
 *
 * Returns: 0 or a negative error code.
 */
static int cvmx_usb_cancel(struct cvmx_usb_state *usb,
			   struct cvmx_usb_pipe *pipe,
			   int submit_handle)
			   struct cvmx_usb_transaction *transaction)
{
	struct cvmx_usb_transaction *transaction;

	if (unlikely((submit_handle < 0) || (submit_handle >= MAX_TRANSACTIONS)))
		return -EINVAL;

	/* Fail if the pipe isn't open */
	if (unlikely((pipe->flags & __CVMX_USB_PIPE_FLAGS_OPEN) == 0))
		return -EINVAL;

	transaction = usb->transaction + submit_handle;

	/* Fail if this transaction already completed */
	if (unlikely((transaction->flags & __CVMX_USB_TRANSACTION_FLAGS_IN_USE) == 0))
		return -EINVAL;
@@ -2584,8 +2536,7 @@ static int cvmx_usb_cancel_all(struct cvmx_usb_state *usb,

	/* Simply loop through and attempt to cancel each transaction */
	while (pipe->head) {
		int result = cvmx_usb_cancel(usb, pipe,
			__cvmx_usb_get_submit_handle(usb, pipe->head));
		int result = cvmx_usb_cancel(usb, pipe, pipe->head);
		if (unlikely(result != 0))
			return result;
	}
@@ -3231,7 +3182,7 @@ static int octeon_usb_urb_enqueue(struct usb_hcd *hcd,
{
	struct octeon_hcd *priv = hcd_to_octeon(hcd);
	struct device *dev = hcd->self.controller;
	int submit_handle = -1;
	struct cvmx_usb_transaction *transaction = NULL;
	struct cvmx_usb_pipe *pipe;
	unsigned long flags;
	struct cvmx_usb_iso_packet *iso_packet;
@@ -3346,13 +3297,13 @@ static int octeon_usb_urb_enqueue(struct usb_hcd *hcd,
			 * this saves us a bunch of logic.
			 */
			urb->setup_packet = (char *)iso_packet;
			submit_handle = cvmx_usb_submit_isochronous(&priv->usb,
			transaction = cvmx_usb_submit_isochronous(&priv->usb,
								  pipe, urb);
			/*
			 * If submit failed we need to free our private packet
			 * list.
			 */
			if (submit_handle < 0) {
			if (!transaction) {
				urb->setup_packet = NULL;
				kfree(iso_packet);
			}
@@ -3361,26 +3312,25 @@ static int octeon_usb_urb_enqueue(struct usb_hcd *hcd,
	case PIPE_INTERRUPT:
		dev_dbg(dev, "Submit interrupt to %d.%d\n",
			usb_pipedevice(urb->pipe), usb_pipeendpoint(urb->pipe));
		submit_handle = cvmx_usb_submit_interrupt(&priv->usb, pipe,
							  urb);
		transaction = cvmx_usb_submit_interrupt(&priv->usb, pipe, urb);
		break;
	case PIPE_CONTROL:
		dev_dbg(dev, "Submit control to %d.%d\n",
			usb_pipedevice(urb->pipe), usb_pipeendpoint(urb->pipe));
		submit_handle = cvmx_usb_submit_control(&priv->usb, pipe, urb);
		transaction = cvmx_usb_submit_control(&priv->usb, pipe, urb);
		break;
	case PIPE_BULK:
		dev_dbg(dev, "Submit bulk to %d.%d\n",
			usb_pipedevice(urb->pipe), usb_pipeendpoint(urb->pipe));
		submit_handle = cvmx_usb_submit_bulk(&priv->usb, pipe, urb);
		transaction = cvmx_usb_submit_bulk(&priv->usb, pipe, urb);
		break;
	}
	if (submit_handle < 0) {
	if (!transaction) {
		spin_unlock_irqrestore(&priv->lock, flags);
		dev_dbg(dev, "Failed to submit\n");
		return -ENOMEM;
	}
	urb->hcpriv = (void *)(long)submit_handle;
	urb->hcpriv = transaction;
	spin_unlock_irqrestore(&priv->lock, flags);
	return 0;
}
@@ -3393,13 +3343,11 @@ static void octeon_usb_urb_dequeue_work(unsigned long arg)
	spin_lock_irqsave(&priv->lock, flags);

	while (!list_empty(&priv->dequeue_list)) {
		int submit_handle;
		struct urb *urb = container_of(priv->dequeue_list.next, struct urb, urb_list);
		list_del(&urb->urb_list);
		/* not enqueued on dequeue_list */
		INIT_LIST_HEAD(&urb->urb_list);
		submit_handle = (long)urb->hcpriv;
		cvmx_usb_cancel(&priv->usb, urb->ep->hcpriv, submit_handle);
		cvmx_usb_cancel(&priv->usb, urb->ep->hcpriv, urb->hcpriv);
	}

	spin_unlock_irqrestore(&priv->lock, flags);