|
@@ -255,3 +255,48 @@ int ishtp_cl_io_rb_recycle(struct ishtp_cl_rb *rb)
|
|
return rets;
|
|
return rets;
|
|
}
|
|
}
|
|
EXPORT_SYMBOL(ishtp_cl_io_rb_recycle);
|
|
EXPORT_SYMBOL(ishtp_cl_io_rb_recycle);
|
|
|
|
+
|
|
|
|
+/**
|
|
|
|
+ * ishtp_cl_tx_empty() -test whether client device tx buffer is empty
|
|
|
|
+ * @cl: Pointer to client device instance
|
|
|
|
+ *
|
|
|
|
+ * Look client device tx buffer list, and check whether this list is empty
|
|
|
|
+ *
|
|
|
|
+ * Return: true if client tx buffer list is empty else false
|
|
|
|
+ */
|
|
|
|
+bool ishtp_cl_tx_empty(struct ishtp_cl *cl)
|
|
|
|
+{
|
|
|
|
+ int tx_list_empty;
|
|
|
|
+ unsigned long tx_flags;
|
|
|
|
+
|
|
|
|
+ spin_lock_irqsave(&cl->tx_list_spinlock, tx_flags);
|
|
|
|
+ tx_list_empty = list_empty(&cl->tx_list.list);
|
|
|
|
+ spin_unlock_irqrestore(&cl->tx_list_spinlock, tx_flags);
|
|
|
|
+
|
|
|
|
+ return !!tx_list_empty;
|
|
|
|
+}
|
|
|
|
+EXPORT_SYMBOL(ishtp_cl_tx_empty);
|
|
|
|
+
|
|
|
|
+/**
|
|
|
|
+ * ishtp_cl_rx_get_rb() -Get a rb from client device rx buffer list
|
|
|
|
+ * @cl: Pointer to client device instance
|
|
|
|
+ *
|
|
|
|
+ * Check client device in-processing buffer list and get a rb from it.
|
|
|
|
+ *
|
|
|
|
+ * Return: rb pointer if buffer list isn't empty else NULL
|
|
|
|
+ */
|
|
|
|
+struct ishtp_cl_rb *ishtp_cl_rx_get_rb(struct ishtp_cl *cl)
|
|
|
|
+{
|
|
|
|
+ unsigned long rx_flags;
|
|
|
|
+ struct ishtp_cl_rb *rb;
|
|
|
|
+
|
|
|
|
+ spin_lock_irqsave(&cl->in_process_spinlock, rx_flags);
|
|
|
|
+ rb = list_first_entry_or_null(&cl->in_process_list.list,
|
|
|
|
+ struct ishtp_cl_rb, list);
|
|
|
|
+ if (rb)
|
|
|
|
+ list_del_init(&rb->list);
|
|
|
|
+ spin_unlock_irqrestore(&cl->in_process_spinlock, rx_flags);
|
|
|
|
+
|
|
|
|
+ return rb;
|
|
|
|
+}
|
|
|
|
+EXPORT_SYMBOL(ishtp_cl_rx_get_rb);
|