HID: intel_ish-hid: Enhance API to get ring buffer sizes
authorSrinivas Pandruvada <srinivas.pandruvada@linux.intel.com>
Tue, 11 Sep 2018 23:44:19 +0000 (16:44 -0700)
committerJiri Kosina <jkosina@suse.cz>
Mon, 24 Sep 2018 09:20:06 +0000 (11:20 +0200)
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>
drivers/hid/intel-ish-hid/ishtp/client-buffers.c
drivers/hid/intel-ish-hid/ishtp/client.c
drivers/hid/intel-ish-hid/ishtp/client.h

index 12d6130..248651c 100644 (file)
@@ -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);
        }
index 007443e..faeccdb 100644 (file)
 #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;
 }
index a82ee4d..042f4c4 100644 (file)
@@ -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,