rapidio/tsi721: add query_mport callback
authorAlexandre Bounine <alexandre.bounine@idt.com>
Tue, 22 Mar 2016 21:26:02 +0000 (14:26 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Tue, 22 Mar 2016 22:36:02 +0000 (15:36 -0700)
Add device-specific implementation of query_mport callback function.

Signed-off-by: Alexandre Bounine <alexandre.bounine@idt.com>
Cc: Matt Porter <mporter@kernel.crashing.org>
Cc: Aurelien Jacquiot <a-jacquiot@ti.com>
Cc: Andre van Herk <andre.van.herk@prodrive-technologies.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
drivers/rapidio/devices/tsi721.c

index d463d2cbd0af041eb19cbbab5359f7205c238cc8..cd40f0f9fbfe5a11e39aa4f26cb17b5e0bf07d4f 100644 (file)
@@ -2287,6 +2287,39 @@ static int tsi721_messages_init(struct tsi721_device *priv)
        return 0;
 }
 
+/**
+ * tsi721_query_mport - Fetch inbound message from the Tsi721 MSG Queue
+ * @mport: Master port implementing the Inbound Messaging Engine
+ * @mbox: Inbound mailbox number
+ *
+ * Returns pointer to the message on success or NULL on failure.
+ */
+static int tsi721_query_mport(struct rio_mport *mport,
+                             struct rio_mport_attr *attr)
+{
+       struct tsi721_device *priv = mport->priv;
+       u32 rval;
+
+       rval = ioread32(priv->regs + (0x100 + RIO_PORT_N_ERR_STS_CSR(0)));
+       if (rval & RIO_PORT_N_ERR_STS_PORT_OK) {
+               rval = ioread32(priv->regs + (0x100 + RIO_PORT_N_CTL2_CSR(0)));
+               attr->link_speed = (rval & RIO_PORT_N_CTL2_SEL_BAUD) >> 28;
+               rval = ioread32(priv->regs + (0x100 + RIO_PORT_N_CTL_CSR(0)));
+               attr->link_width = (rval & RIO_PORT_N_CTL_IPW) >> 27;
+       } else
+               attr->link_speed = RIO_LINK_DOWN;
+
+#ifdef CONFIG_RAPIDIO_DMA_ENGINE
+       attr->flags = RIO_MPORT_DMA | RIO_MPORT_DMA_SG;
+       attr->dma_max_sge = 0;
+       attr->dma_max_size = TSI721_BDMA_MAX_BCOUNT;
+       attr->dma_align = 0;
+#else
+       attr->flags = 0;
+#endif
+       return 0;
+}
+
 /**
  * tsi721_disable_ints - disables all device interrupts
  * @priv: pointer to tsi721 private data
@@ -2372,6 +2405,7 @@ static int tsi721_setup_mport(struct tsi721_device *priv)
        ops->get_inb_message = tsi721_get_inb_message;
        ops->map_inb = tsi721_rio_map_inb_mem;
        ops->unmap_inb = tsi721_rio_unmap_inb_mem;
+       ops->query_mport = tsi721_query_mport;
 
        mport = kzalloc(sizeof(struct rio_mport), GFP_KERNEL);
        if (!mport) {