[linux-yocto] [PATCH 113/161] LSI AXM55xx rapidio: Speed up bottleneck in inbox.
Cristian Bercaru
cristian.bercaru at windriver.com
Thu May 21 12:21:35 PDT 2015
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