mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-08-26 19:00:25 +00:00
HID: intel_ish-hid: Enhance API to get ring buffer sizes
Added two APIs: - ishtp_cl_get_tx_free_buffer_size: This returns total size available for a client to queue TX data. - ishtp_cl_get_tx_free_rings: This returns total number of TX rings available for a client. Signed-off-by: Srinivas Pandruvada <srinivas.pandruvada@linux.intel.com> Signed-off-by: Jiri Kosina <jkosina@suse.cz>
This commit is contained in:
parent
f26de33faf
commit
18c0b54674
3 changed files with 31 additions and 0 deletions
|
@ -69,6 +69,8 @@ int ishtp_cl_alloc_tx_ring(struct ishtp_cl *cl)
|
|||
int j;
|
||||
unsigned long flags;
|
||||
|
||||
cl->tx_ring_free_size = 0;
|
||||
|
||||
/* Allocate pool to free Tx bufs */
|
||||
for (j = 0; j < cl->tx_ring_size; ++j) {
|
||||
struct ishtp_cl_tx_ring *tx_buf;
|
||||
|
@ -85,6 +87,7 @@ int ishtp_cl_alloc_tx_ring(struct ishtp_cl *cl)
|
|||
|
||||
spin_lock_irqsave(&cl->tx_free_list_spinlock, flags);
|
||||
list_add_tail(&tx_buf->list, &cl->tx_free_list.list);
|
||||
++cl->tx_ring_free_size;
|
||||
spin_unlock_irqrestore(&cl->tx_free_list_spinlock, flags);
|
||||
}
|
||||
return 0;
|
||||
|
@ -144,6 +147,7 @@ void ishtp_cl_free_tx_ring(struct ishtp_cl *cl)
|
|||
tx_buf = list_entry(cl->tx_free_list.list.next,
|
||||
struct ishtp_cl_tx_ring, list);
|
||||
list_del(&tx_buf->list);
|
||||
--cl->tx_ring_free_size;
|
||||
kfree(tx_buf->send_buf.data);
|
||||
kfree(tx_buf);
|
||||
}
|
||||
|
|
|
@ -22,6 +22,25 @@
|
|||
#include "hbm.h"
|
||||
#include "client.h"
|
||||
|
||||
int ishtp_cl_get_tx_free_buffer_size(struct ishtp_cl *cl)
|
||||
{
|
||||
unsigned long tx_free_flags;
|
||||
int size;
|
||||
|
||||
spin_lock_irqsave(&cl->tx_free_list_spinlock, tx_free_flags);
|
||||
size = cl->tx_ring_free_size * cl->device->fw_client->props.max_msg_length;
|
||||
spin_unlock_irqrestore(&cl->tx_free_list_spinlock, tx_free_flags);
|
||||
|
||||
return size;
|
||||
}
|
||||
EXPORT_SYMBOL(ishtp_cl_get_tx_free_buffer_size);
|
||||
|
||||
int ishtp_cl_get_tx_free_rings(struct ishtp_cl *cl)
|
||||
{
|
||||
return cl->tx_ring_free_size;
|
||||
}
|
||||
EXPORT_SYMBOL(ishtp_cl_get_tx_free_rings);
|
||||
|
||||
/**
|
||||
* ishtp_read_list_flush() - Flush read queue
|
||||
* @cl: ishtp client instance
|
||||
|
@ -90,6 +109,7 @@ static void ishtp_cl_init(struct ishtp_cl *cl, struct ishtp_device *dev)
|
|||
|
||||
cl->rx_ring_size = CL_DEF_RX_RING_SIZE;
|
||||
cl->tx_ring_size = CL_DEF_TX_RING_SIZE;
|
||||
cl->tx_ring_free_size = cl->tx_ring_size;
|
||||
|
||||
/* dma */
|
||||
cl->last_tx_path = CL_TX_PATH_IPC;
|
||||
|
@ -577,6 +597,8 @@ int ishtp_cl_send(struct ishtp_cl *cl, uint8_t *buf, size_t length)
|
|||
* max ISHTP message size per client
|
||||
*/
|
||||
list_del_init(&cl_msg->list);
|
||||
--cl->tx_ring_free_size;
|
||||
|
||||
spin_unlock_irqrestore(&cl->tx_free_list_spinlock, tx_free_flags);
|
||||
memcpy(cl_msg->send_buf.data, buf, length);
|
||||
cl_msg->send_buf.size = length;
|
||||
|
@ -685,6 +707,7 @@ static void ipc_tx_callback(void *prm)
|
|||
ishtp_write_message(dev, &ishtp_hdr, pmsg);
|
||||
spin_lock_irqsave(&cl->tx_free_list_spinlock, tx_free_flags);
|
||||
list_add_tail(&cl_msg->list, &cl->tx_free_list.list);
|
||||
++cl->tx_ring_free_size;
|
||||
spin_unlock_irqrestore(&cl->tx_free_list_spinlock,
|
||||
tx_free_flags);
|
||||
} else {
|
||||
|
@ -778,6 +801,7 @@ static void ishtp_cl_send_msg_dma(struct ishtp_device *dev,
|
|||
ishtp_write_message(dev, &hdr, (unsigned char *)&dma_xfer);
|
||||
spin_lock_irqsave(&cl->tx_free_list_spinlock, tx_free_flags);
|
||||
list_add_tail(&cl_msg->list, &cl->tx_free_list.list);
|
||||
++cl->tx_ring_free_size;
|
||||
spin_unlock_irqrestore(&cl->tx_free_list_spinlock, tx_free_flags);
|
||||
++cl->send_msg_cnt_dma;
|
||||
}
|
||||
|
|
|
@ -84,6 +84,7 @@ struct ishtp_cl {
|
|||
/* Client Tx buffers list */
|
||||
unsigned int tx_ring_size;
|
||||
struct ishtp_cl_tx_ring tx_list, tx_free_list;
|
||||
int tx_ring_free_size;
|
||||
spinlock_t tx_list_spinlock;
|
||||
spinlock_t tx_free_list_spinlock;
|
||||
size_t tx_offs; /* Offset in buffer at head of 'tx_list' */
|
||||
|
@ -137,6 +138,8 @@ int ishtp_cl_alloc_rx_ring(struct ishtp_cl *cl);
|
|||
int ishtp_cl_alloc_tx_ring(struct ishtp_cl *cl);
|
||||
void ishtp_cl_free_rx_ring(struct ishtp_cl *cl);
|
||||
void ishtp_cl_free_tx_ring(struct ishtp_cl *cl);
|
||||
int ishtp_cl_get_tx_free_buffer_size(struct ishtp_cl *cl);
|
||||
int ishtp_cl_get_tx_free_rings(struct ishtp_cl *cl);
|
||||
|
||||
/* DMA I/F functions */
|
||||
void recv_ishtp_cl_msg_dma(struct ishtp_device *dev, void *msg,
|
||||
|
|
Loading…
Reference in a new issue