the IRQ masking/unmasking APIs use the HV_UIO driver's
read and write CBs for their work.

Signed-off-by: Srikanth Kaka <srikant...@oneconvergence.com>
Signed-off-by: Vag Singh <vag.si...@oneconvergence.com>
Signed-off-by: Anand Thulasiram <av...@juniper.net>
---
 drivers/bus/vmbus/freebsd/vmbus_bus.c | 15 ++++++++++++++
 drivers/bus/vmbus/freebsd/vmbus_uio.c | 28 +++++++++++++++++++++++++++
 2 files changed, 43 insertions(+)

diff --git a/drivers/bus/vmbus/freebsd/vmbus_bus.c 
b/drivers/bus/vmbus/freebsd/vmbus_bus.c
index fa0f4883f7..b275723bd3 100644
--- a/drivers/bus/vmbus/freebsd/vmbus_bus.c
+++ b/drivers/bus/vmbus/freebsd/vmbus_bus.c
@@ -265,3 +265,18 @@ rte_vmbus_scan(void)
 error:
        return -1;
 }
+
+void rte_vmbus_irq_mask(struct rte_vmbus_device *device)
+{
+       vmbus_uio_irq_control(device, 1);
+}
+
+void rte_vmbus_irq_unmask(struct rte_vmbus_device *device)
+{
+       vmbus_uio_irq_control(device, 0);
+}
+
+int rte_vmbus_irq_read(struct rte_vmbus_device *device)
+{
+       return vmbus_uio_irq_read(device);
+}
diff --git a/drivers/bus/vmbus/freebsd/vmbus_uio.c 
b/drivers/bus/vmbus/freebsd/vmbus_uio.c
index ca6f5fac59..7eb8b73e29 100644
--- a/drivers/bus/vmbus/freebsd/vmbus_uio.c
+++ b/drivers/bus/vmbus/freebsd/vmbus_uio.c
@@ -38,6 +38,34 @@ static const char *map_names[VMBUS_MAX_RESOURCE] = {
        [HV_SEND_BUF_MAP]  = "send_buf",
 };
 
+/* Control interrupts */
+void vmbus_uio_irq_control(struct rte_vmbus_device *dev, int32_t onoff)
+{
+       if (write(dev->intr_handle.fd, &onoff, sizeof(onoff)) < 0) {
+               VMBUS_LOG(ERR, "cannot write to %d:%s",
+                       dev->intr_handle.fd, strerror(errno));
+       }
+}
+
+int vmbus_uio_irq_read(struct rte_vmbus_device *dev)
+{
+       int32_t count;
+       int cc;
+
+       cc = read(dev->intr_handle.fd, &count, sizeof(count));
+       if (cc < (int)sizeof(count)) {
+               if (cc < 0) {
+                       VMBUS_LOG(ERR, "IRQ read failed %s",
+                                 strerror(errno));
+                       return -errno;
+               }
+               VMBUS_LOG(ERR, "can't read IRQ count");
+               return -EINVAL;
+       }
+
+       return count;
+}
+
 void
 vmbus_uio_free_resource(struct rte_vmbus_device *dev,
                struct mapped_vmbus_resource *uio_res)
-- 
2.30.2

Reply via email to