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

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
...@@ -1251,22 +1251,6 @@ static struct cvmx_usb_port_status cvmx_usb_get_status(struct cvmx_usb_state *us ...@@ -1251,22 +1251,6 @@ static struct cvmx_usb_port_status cvmx_usb_get_status(struct cvmx_usb_state *us
return result; 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 * Open a virtual pipe between the host and a USB device. A pipe
* must be opened before data can be transferred between a device * 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) ...@@ -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, static void octeon_usb_urb_complete_callback(struct cvmx_usb_state *usb,
enum cvmx_usb_complete status, enum cvmx_usb_complete status,
struct cvmx_usb_pipe *pipe, struct cvmx_usb_pipe *pipe,
int submit_handle, struct cvmx_usb_transaction
*transaction,
int bytes_transferred, int bytes_transferred,
struct urb *urb) struct urb *urb)
{ {
...@@ -2172,10 +2157,10 @@ static void octeon_usb_urb_complete_callback(struct cvmx_usb_state *usb, ...@@ -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->iso_frame_desc[i].actual_length = iso_packet[i].length;
urb->actual_length += urb->iso_frame_desc[i].actual_length; urb->actual_length += urb->iso_frame_desc[i].actual_length;
} else { } 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, i, urb->number_of_packets,
iso_packet[i].status, pipe, iso_packet[i].status, pipe,
submit_handle, iso_packet[i].length); transaction, iso_packet[i].length);
urb->iso_frame_desc[i].status = -EREMOTEIO; urb->iso_frame_desc[i].status = -EREMOTEIO;
} }
} }
...@@ -2193,26 +2178,26 @@ static void octeon_usb_urb_complete_callback(struct cvmx_usb_state *usb, ...@@ -2193,26 +2178,26 @@ static void octeon_usb_urb_complete_callback(struct cvmx_usb_state *usb,
urb->status = -ENOENT; urb->status = -ENOENT;
break; break;
case CVMX_USB_COMPLETE_STALL: case CVMX_USB_COMPLETE_STALL:
dev_dbg(dev, "status=stall pipe=%p submit=%d size=%d\n", dev_dbg(dev, "status=stall pipe=%p transaction=%p size=%d\n",
pipe, submit_handle, bytes_transferred); pipe, transaction, bytes_transferred);
urb->status = -EPIPE; urb->status = -EPIPE;
break; break;
case CVMX_USB_COMPLETE_BABBLEERR: case CVMX_USB_COMPLETE_BABBLEERR:
dev_dbg(dev, "status=babble pipe=%p submit=%d size=%d\n", dev_dbg(dev, "status=babble pipe=%p transaction=%p size=%d\n",
pipe, submit_handle, bytes_transferred); pipe, transaction, bytes_transferred);
urb->status = -EPIPE; urb->status = -EPIPE;
break; break;
case CVMX_USB_COMPLETE_SHORT: case CVMX_USB_COMPLETE_SHORT:
dev_dbg(dev, "status=short pipe=%p submit=%d size=%d\n", dev_dbg(dev, "status=short pipe=%p transaction=%p size=%d\n",
pipe, submit_handle, bytes_transferred); pipe, transaction, bytes_transferred);
urb->status = -EREMOTEIO; urb->status = -EREMOTEIO;
break; break;
case CVMX_USB_COMPLETE_ERROR: case CVMX_USB_COMPLETE_ERROR:
case CVMX_USB_COMPLETE_XACTERR: case CVMX_USB_COMPLETE_XACTERR:
case CVMX_USB_COMPLETE_DATATGLERR: case CVMX_USB_COMPLETE_DATATGLERR:
case CVMX_USB_COMPLETE_FRAMEERR: case CVMX_USB_COMPLETE_FRAMEERR:
dev_dbg(dev, "status=%d pipe=%p submit=%d size=%d\n", dev_dbg(dev, "status=%d pipe=%p transaction=%p size=%d\n",
status, pipe, submit_handle, bytes_transferred); status, pipe, transaction, bytes_transferred);
urb->status = -EPROTO; urb->status = -EPROTO;
break; break;
} }
...@@ -2237,8 +2222,6 @@ static void __cvmx_usb_perform_complete(struct cvmx_usb_state *usb, ...@@ -2237,8 +2222,6 @@ static void __cvmx_usb_perform_complete(struct cvmx_usb_state *usb,
struct cvmx_usb_transaction *transaction, struct cvmx_usb_transaction *transaction,
enum cvmx_usb_complete complete_code) enum cvmx_usb_complete complete_code)
{ {
int submit_handle;
/* If this was a split then clear our split in progress marker */ /* If this was a split then clear our split in progress marker */
if (usb->active_split == transaction) if (usb->active_split == transaction)
usb->active_split = NULL; usb->active_split = NULL;
...@@ -2282,9 +2265,8 @@ static void __cvmx_usb_perform_complete(struct cvmx_usb_state *usb, ...@@ -2282,9 +2265,8 @@ static void __cvmx_usb_perform_complete(struct cvmx_usb_state *usb,
__cvmx_usb_append_pipe(&usb->idle_pipes, pipe); __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, octeon_usb_urb_complete_callback(usb, complete_code, pipe,
submit_handle, transaction,
transaction->actual_bytes, transaction->actual_bytes,
transaction->urb); transaction->urb);
__cvmx_usb_free_transaction(usb, transaction); __cvmx_usb_free_transaction(usb, transaction);
...@@ -2313,32 +2295,30 @@ static void __cvmx_usb_perform_complete(struct cvmx_usb_state *usb, ...@@ -2313,32 +2295,30 @@ static void __cvmx_usb_perform_complete(struct cvmx_usb_state *usb,
* A description of each ISO packet * A description of each ISO packet
* @urb: URB for the callback * @urb: URB for the callback
* *
* Returns: Submit handle or negative on failure. Matches the result * Returns: Transaction or NULL on failure.
* in the external API.
*/ */
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, struct cvmx_usb_pipe *pipe,
enum cvmx_usb_transfer type, enum cvmx_usb_transfer type,
uint64_t buffer, uint64_t buffer,
int buffer_length, int buffer_length,
uint64_t control_header, uint64_t control_header,
int iso_start_frame, int iso_start_frame,
int iso_number_packets, int iso_number_packets,
struct cvmx_usb_iso_packet *iso_packets, struct cvmx_usb_iso_packet *iso_packets,
struct urb *urb) struct urb *urb)
{ {
int submit_handle;
struct cvmx_usb_transaction *transaction; struct cvmx_usb_transaction *transaction;
/* Fail if the pipe isn't open */ /* Fail if the pipe isn't open */
if (unlikely((pipe->flags & __CVMX_USB_PIPE_FLAGS_OPEN) == 0)) if (unlikely((pipe->flags & __CVMX_USB_PIPE_FLAGS_OPEN) == 0))
return -EINVAL; return NULL;
if (unlikely(pipe->transfer_type != type)) if (unlikely(pipe->transfer_type != type))
return -EINVAL; return NULL;
transaction = __cvmx_usb_alloc_transaction(usb); transaction = __cvmx_usb_alloc_transaction(usb);
if (unlikely(!transaction)) if (unlikely(!transaction))
return -ENOMEM; return NULL;
transaction->type = type; transaction->type = type;
transaction->buffer = buffer; transaction->buffer = buffer;
...@@ -2369,13 +2349,11 @@ static int __cvmx_usb_submit_transaction(struct cvmx_usb_state *usb, ...@@ -2369,13 +2349,11 @@ static int __cvmx_usb_submit_transaction(struct cvmx_usb_state *usb,
} }
pipe->tail = transaction; 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 */ /* We may need to schedule the pipe if this was the head of the pipe */
if (!transaction->prev) if (!transaction->prev)
__cvmx_usb_schedule(usb, 0); __cvmx_usb_schedule(usb, 0);
return submit_handle; return transaction;
} }
...@@ -2386,25 +2364,20 @@ static int __cvmx_usb_submit_transaction(struct cvmx_usb_state *usb, ...@@ -2386,25 +2364,20 @@ static int __cvmx_usb_submit_transaction(struct cvmx_usb_state *usb,
* @pipe: Handle to the pipe for the transfer. * @pipe: Handle to the pipe for the transfer.
* @urb: URB. * @urb: URB.
* *
* Returns: A submitted transaction handle or negative on * Returns: A submitted transaction or NULL on failure.
* failure. Negative values are error codes.
*/ */
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 cvmx_usb_pipe *pipe,
struct urb *urb) struct urb *urb)
{ {
int submit_handle; return __cvmx_usb_submit_transaction(usb, pipe, CVMX_USB_TRANSFER_BULK,
urb->transfer_dma,
submit_handle = __cvmx_usb_submit_transaction(usb, pipe, urb->transfer_buffer_length,
CVMX_USB_TRANSFER_BULK, 0, /* control_header */
urb->transfer_dma, 0, /* iso_start_frame */
urb->transfer_buffer_length, 0, /* iso_number_packets */
0, /* control_header */ NULL, /* iso_packets */
0, /* iso_start_frame */ urb);
0, /* iso_number_packets */
NULL, /* iso_packets */
urb);
return submit_handle;
} }
...@@ -2415,25 +2388,21 @@ static int cvmx_usb_submit_bulk(struct cvmx_usb_state *usb, ...@@ -2415,25 +2388,21 @@ static int cvmx_usb_submit_bulk(struct cvmx_usb_state *usb,
* @pipe: Handle to the pipe for the transfer. * @pipe: Handle to the pipe for the transfer.
* @urb: URB returned when the callback is called. * @urb: URB returned when the callback is called.
* *
* Returns: A submitted transaction handle or negative on * Returns: A submitted transaction or NULL on failure.
* failure. Negative values are error codes.
*/ */
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 cvmx_usb_pipe *pipe,
struct urb *urb) struct urb *urb)
{ {
int submit_handle; return __cvmx_usb_submit_transaction(usb, pipe,
CVMX_USB_TRANSFER_INTERRUPT,
submit_handle = __cvmx_usb_submit_transaction(usb, pipe, urb->transfer_dma,
CVMX_USB_TRANSFER_INTERRUPT, urb->transfer_buffer_length,
urb->transfer_dma, 0, /* control_header */
urb->transfer_buffer_length, 0, /* iso_start_frame */
0, /* control_header */ 0, /* iso_number_packets */
0, /* iso_start_frame */ NULL, /* iso_packets */
0, /* iso_number_packets */ urb);
NULL, /* iso_packets */
urb);
return submit_handle;
} }
...@@ -2444,14 +2413,12 @@ static int cvmx_usb_submit_interrupt(struct cvmx_usb_state *usb, ...@@ -2444,14 +2413,12 @@ static int cvmx_usb_submit_interrupt(struct cvmx_usb_state *usb,
* @pipe: Handle to the pipe for the transfer. * @pipe: Handle to the pipe for the transfer.
* @urb: URB. * @urb: URB.
* *
* Returns: A submitted transaction handle or negative on * Returns: A submitted transaction or NULL on failure.
* failure. Negative values are error codes.
*/ */
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 cvmx_usb_pipe *pipe,
struct urb *urb) struct urb *urb)
{ {
int submit_handle;
int buffer_length = urb->transfer_buffer_length; int buffer_length = urb->transfer_buffer_length;
uint64_t control_header = urb->setup_dma; uint64_t control_header = urb->setup_dma;
union cvmx_usb_control_header *header = union cvmx_usb_control_header *header =
...@@ -2460,16 +2427,14 @@ static int cvmx_usb_submit_control(struct cvmx_usb_state *usb, ...@@ -2460,16 +2427,14 @@ static int cvmx_usb_submit_control(struct cvmx_usb_state *usb,
if ((header->s.request_type & 0x80) == 0) if ((header->s.request_type & 0x80) == 0)
buffer_length = le16_to_cpu(header->s.length); 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, CVMX_USB_TRANSFER_CONTROL,
urb->transfer_dma, urb->transfer_dma, buffer_length,
buffer_length, control_header,
control_header, 0, /* iso_start_frame */
0, /* iso_start_frame */ 0, /* iso_number_packets */
0, /* iso_number_packets */ NULL, /* iso_packets */
NULL, /* iso_packets */ urb);
urb);
return submit_handle;
} }
...@@ -2480,27 +2445,23 @@ static int cvmx_usb_submit_control(struct cvmx_usb_state *usb, ...@@ -2480,27 +2445,23 @@ static int cvmx_usb_submit_control(struct cvmx_usb_state *usb,
* @pipe: Handle to the pipe for the transfer. * @pipe: Handle to the pipe for the transfer.
* @urb: URB returned when the callback is called. * @urb: URB returned when the callback is called.
* *
* Returns: A submitted transaction handle or negative on * Returns: A submitted transaction or NULL on failure.
* failure. Negative values are error codes.
*/ */
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 cvmx_usb_pipe *pipe,
struct urb *urb) struct urb *urb)
{ {
int submit_handle;
struct cvmx_usb_iso_packet *packets; struct cvmx_usb_iso_packet *packets;
packets = (struct cvmx_usb_iso_packet *) urb->setup_packet; 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, CVMX_USB_TRANSFER_ISOCHRONOUS,
urb->transfer_dma, urb->transfer_dma,
urb->transfer_buffer_length, urb->transfer_buffer_length,
0, /* control_header */ 0, /* control_header */
urb->start_frame, urb->start_frame,
urb->number_of_packets, urb->number_of_packets,
packets, packets, urb);
urb);
return submit_handle;
} }
...@@ -2513,27 +2474,18 @@ static int cvmx_usb_submit_isochronous(struct cvmx_usb_state *usb, ...@@ -2513,27 +2474,18 @@ static int cvmx_usb_submit_isochronous(struct cvmx_usb_state *usb,
* *
* @usb: USB device state populated by cvmx_usb_initialize(). * @usb: USB device state populated by cvmx_usb_initialize().
* @pipe: Pipe to cancel requests in. * @pipe: Pipe to cancel requests in.
* @submit_handle: * @transaction: Transaction to cancel, returned by the submit function.
* Handle to transaction to cancel, returned by the submit
* function.
* *
* Returns: 0 or a negative error code. * Returns: 0 or a negative error code.
*/ */
static int cvmx_usb_cancel(struct cvmx_usb_state *usb, static int cvmx_usb_cancel(struct cvmx_usb_state *usb,
struct cvmx_usb_pipe *pipe, 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 */ /* Fail if the pipe isn't open */
if (unlikely((pipe->flags & __CVMX_USB_PIPE_FLAGS_OPEN) == 0)) if (unlikely((pipe->flags & __CVMX_USB_PIPE_FLAGS_OPEN) == 0))
return -EINVAL; return -EINVAL;
transaction = usb->transaction + submit_handle;
/* Fail if this transaction already completed */ /* Fail if this transaction already completed */
if (unlikely((transaction->flags & __CVMX_USB_TRANSACTION_FLAGS_IN_USE) == 0)) if (unlikely((transaction->flags & __CVMX_USB_TRANSACTION_FLAGS_IN_USE) == 0))
return -EINVAL; return -EINVAL;
...@@ -2584,8 +2536,7 @@ static int cvmx_usb_cancel_all(struct cvmx_usb_state *usb, ...@@ -2584,8 +2536,7 @@ static int cvmx_usb_cancel_all(struct cvmx_usb_state *usb,
/* Simply loop through and attempt to cancel each transaction */ /* Simply loop through and attempt to cancel each transaction */
while (pipe->head) { while (pipe->head) {
int result = cvmx_usb_cancel(usb, pipe, int result = cvmx_usb_cancel(usb, pipe, pipe->head);
__cvmx_usb_get_submit_handle(usb, pipe->head));
if (unlikely(result != 0)) if (unlikely(result != 0))
return result; return result;
} }
...@@ -3231,7 +3182,7 @@ static int octeon_usb_urb_enqueue(struct usb_hcd *hcd, ...@@ -3231,7 +3182,7 @@ static int octeon_usb_urb_enqueue(struct usb_hcd *hcd,
{ {
struct octeon_hcd *priv = hcd_to_octeon(hcd); struct octeon_hcd *priv = hcd_to_octeon(hcd);
struct device *dev = hcd->self.controller; struct device *dev = hcd->self.controller;
int submit_handle = -1; struct cvmx_usb_transaction *transaction = NULL;
struct cvmx_usb_pipe *pipe; struct cvmx_usb_pipe *pipe;
unsigned long flags; unsigned long flags;
struct cvmx_usb_iso_packet *iso_packet; struct cvmx_usb_iso_packet *iso_packet;
...@@ -3346,13 +3297,13 @@ static int octeon_usb_urb_enqueue(struct usb_hcd *hcd, ...@@ -3346,13 +3297,13 @@ static int octeon_usb_urb_enqueue(struct usb_hcd *hcd,
* this saves us a bunch of logic. * this saves us a bunch of logic.
*/ */
urb->setup_packet = (char *)iso_packet; urb->setup_packet = (char *)iso_packet;
submit_handle = cvmx_usb_submit_isochronous(&priv->usb, transaction = cvmx_usb_submit_isochronous(&priv->usb,
pipe, urb); pipe, urb);
/* /*
* If submit failed we need to free our private packet * If submit failed we need to free our private packet
* list. * list.
*/ */
if (submit_handle < 0) { if (!transaction) {
urb->setup_packet = NULL; urb->setup_packet = NULL;
kfree(iso_packet); kfree(iso_packet);
} }
...@@ -3361,26 +3312,25 @@ static int octeon_usb_urb_enqueue(struct usb_hcd *hcd, ...@@ -3361,26 +3312,25 @@ static int octeon_usb_urb_enqueue(struct usb_hcd *hcd,
case PIPE_INTERRUPT: case PIPE_INTERRUPT:
dev_dbg(dev, "Submit interrupt to %d.%d\n", dev_dbg(dev, "Submit interrupt to %d.%d\n",
usb_pipedevice(urb->pipe), usb_pipeendpoint(urb->pipe)); usb_pipedevice(urb->pipe), usb_pipeendpoint(urb->pipe));
submit_handle = cvmx_usb_submit_interrupt(&priv->usb, pipe, transaction = cvmx_usb_submit_interrupt(&priv->usb, pipe, urb);
urb);
break; break;
case PIPE_CONTROL: case PIPE_CONTROL:
dev_dbg(dev, "Submit control to %d.%d\n", dev_dbg(dev, "Submit control to %d.%d\n",
usb_pipedevice(urb->pipe), usb_pipeendpoint(urb->pipe)); 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; break;
case PIPE_BULK: case PIPE_BULK:
dev_dbg(dev, "Submit bulk to %d.%d\n", dev_dbg(dev, "Submit bulk to %d.%d\n",
usb_pipedevice(urb->pipe), usb_pipeendpoint(urb->pipe)); 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; break;
} }
if (submit_handle < 0) { if (!transaction) {
spin_unlock_irqrestore(&priv->lock, flags); spin_unlock_irqrestore(&priv->lock, flags);
dev_dbg(dev, "Failed to submit\n"); dev_dbg(dev, "Failed to submit\n");
return -ENOMEM; return -ENOMEM;
} }
urb->hcpriv = (void *)(long)submit_handle; urb->hcpriv = transaction;
spin_unlock_irqrestore(&priv->lock, flags); spin_unlock_irqrestore(&priv->lock, flags);
return 0; return 0;
} }
...@@ -3393,13 +3343,11 @@ static void octeon_usb_urb_dequeue_work(unsigned long arg) ...@@ -3393,13 +3343,11 @@ static void octeon_usb_urb_dequeue_work(unsigned long arg)
spin_lock_irqsave(&priv->lock, flags); spin_lock_irqsave(&priv->lock, flags);
while (!list_empty(&priv->dequeue_list)) { while (!list_empty(&priv->dequeue_list)) {
int submit_handle;
struct urb *urb = container_of(priv->dequeue_list.next, struct urb, urb_list); struct urb *urb = container_of(priv->dequeue_list.next, struct urb, urb_list);
list_del(&urb->urb_list); list_del(&urb->urb_list);
/* not enqueued on dequeue_list */ /* not enqueued on dequeue_list */
INIT_LIST_HEAD(&urb->urb_list); INIT_LIST_HEAD(&urb->urb_list);
submit_handle = (long)urb->hcpriv; cvmx_usb_cancel(&priv->usb, urb->ep->hcpriv, urb->hcpriv);
cvmx_usb_cancel(&priv->usb, urb->ep->hcpriv, submit_handle);
} }
spin_unlock_irqrestore(&priv->lock, flags); spin_unlock_irqrestore(&priv->lock, flags);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment