[linux-yocto] [PATCH 11/30] LSI AXM55xx rapidio: Speed up bottleneck in inbox.

Charlie Paul cpaul.windriver at gmail.com
Tue May 6 09:36:43 PDT 2014


From: Michael Bringmann <michael.bringmann at lsi.com>

The throughput for the inbox was too slow therfore the size of the
inbox mail buffer was increased 8 times. This eased the bottlneck

Signed-off-by: Michael Bringmann <michael.bringmann at lsi.com>
---
 drivers/rapidio/devices/lsi/axxia-rio-irq.c |   24 +++++++++---------------
 drivers/rapidio/devices/lsi/axxia-rio.c     |    4 ++--
 2 files changed, 11 insertions(+), 17 deletions(-)

diff --git a/drivers/rapidio/devices/lsi/axxia-rio-irq.c b/drivers/rapidio/devices/lsi/axxia-rio-irq.c
index 73b5a4c..6a4d227 100644
--- a/drivers/rapidio/devices/lsi/axxia-rio-irq.c
+++ b/drivers/rapidio/devices/lsi/axxia-rio-irq.c
@@ -1010,7 +1010,7 @@ static inline int choose_ob_dme(
 			if (len > sz)
 				continue;
 
-			if (dme->entries >= (dme->entries_in_use+1)) {
+			if (dme->entries > (dme->entries_in_use+1)) {
 				(*ob_dme) = dme;
 				(*buf_sz) = sz;
 				return ret + i;
@@ -1474,7 +1474,6 @@ static void ib_dme_irq_handler(struct rio_irq_handler *h, u32 state)
 		u32 dw0;
 		int dme_no = 31 - CNTLZW(dme_mask);
 		int num_new;
-		int nPending;
 		dme_mask ^= (1 << dme_no);
 
 		while (mb->me[letter]->dme_no != dme_no)
@@ -1514,7 +1513,7 @@ static void ib_dme_irq_handler(struct rio_irq_handler *h, u32 state)
 #endif
 		/**
 		 * Set Valid flag to 0 on each desc with a new message.
-		 * Flag is reset when the message beloning to the desc
+		 * Flag is reset when the message belonging to the desc
 		 * is fetched in get_inb_message().
 		 * HW descriptor update and fetch is in order.
 		 */
@@ -1545,6 +1544,12 @@ static void ib_dme_irq_handler(struct rio_irq_handler *h, u32 state)
 						dw0 & ~DME_DESC_DW0_VALID);
 				}
 
+				if (mport->inb_msg[mbox_no].mcback)
+					mport->inb_msg[mbox_no].mcback(mport,
+								me->dev_id,
+								mbox_no,
+								desc->desc_no);
+
 				__ib_dme_dw_dbg(priv, dw0);
 				__ib_dme_event_dbg(priv, dme_no,
 						   1 << RIO_IB_DME_RX_PUSH);
@@ -1565,16 +1570,6 @@ static void ib_dme_irq_handler(struct rio_irq_handler *h, u32 state)
 			__ib_dme_event_dbg(priv, dme_no,
 					   1 << RIO_IB_DME_RX_RING_FULL);
 
-		nPending = atomic_read(&me->pending);
-		if (nPending &&
-		    mport->inb_msg[mbox_no].mcback) {
-
-			mport->inb_msg[mbox_no].mcback(mport,
-						       me->dev_id,
-						       mbox_no,
-						       letter);
-		}
-
 		if (dme_stat & IB_DME_STAT_SLEEPING) {
 			struct rio_msg_desc *desc;
 			u32 dme_ctrl;
@@ -2129,8 +2124,7 @@ static struct rio_msg_desc *get_ob_desc(struct rio_mport *mport,
 					   DESC_TABLE_W0(desc->desc_no),
 					   &dw0);
 		}
-		if (!(dw0 & DME_DESC_DW0_VALID) ||
-		    (dw0 & DME_DESC_DW0_ERROR_MASK)) {
+		if (!(dw0 & DME_DESC_DW0_VALID)) {
 			if (desc_num != mb->write_idx)
 				return NULL;
 			if (desc_num == mb->write_idx)
diff --git a/drivers/rapidio/devices/lsi/axxia-rio.c b/drivers/rapidio/devices/lsi/axxia-rio.c
index 4673b6b..1f1fc39 100644
--- a/drivers/rapidio/devices/lsi/axxia-rio.c
+++ b/drivers/rapidio/devices/lsi/axxia-rio.c
@@ -1369,7 +1369,7 @@ static int rio_mport_dtb_setup(struct platform_device *dev,
 		return -ENOMEM;
 	}
 	rio_init_dbell_res(&mport->riores[RIO_DOORBELL_RESOURCE], 0, 0xffff);
-	rio_init_mbox_res(&mport->riores[RIO_INB_MBOX_RESOURCE], 0, 8);
+	rio_init_mbox_res(&mport->riores[RIO_INB_MBOX_RESOURCE], 0, 64);
 	rio_init_mbox_res(&mport->riores[RIO_OUTB_MBOX_RESOURCE], 0, 3);
 	sprintf(mport->name, "RIO%d mport", mport->id);
 
@@ -1743,7 +1743,7 @@ err_ops:
 /*
   The probe function for RapidIO peer-to-peer network.
 */
-static int __devinit axxia_of_rio_rpn_probe(struct platform_device *dev)
+static int axxia_of_rio_rpn_probe(struct platform_device *dev)
 {
 	IODP(KERN_INFO "Setting up RapidIO peer-to-peer network %s\n",
 	       dev->dev.of_node->full_name);
-- 
1.7.9.5



More information about the linux-yocto mailing list