[linux-yocto] [PATCH 08/30] LSI AXM55xx rapidio: Change the timers for inbound messages

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


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

Used 'atomic' counter to track available inbound messages
between interrupt and foreground code.

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

diff --git a/drivers/rapidio/devices/lsi/axxia-rio-irq.c b/drivers/rapidio/devices/lsi/axxia-rio-irq.c
index 9879b7e..73b5a4c 100644
--- a/drivers/rapidio/devices/lsi/axxia-rio-irq.c
+++ b/drivers/rapidio/devices/lsi/axxia-rio-irq.c
@@ -1115,7 +1115,7 @@ static struct rio_msg_dme *alloc_message_engine(struct rio_mport *mport,
 	me->entries_in_use = 0;
 	me->write_idx = 0;
 	me->read_idx = 0;
-	me->pending = 0;
+	atomic_set(&me->pending, 0);
 	me->tx_dme_tmo = 0;
 	me->dme_no = dme_no;
 
@@ -1474,6 +1474,7 @@ 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)
@@ -1550,7 +1551,7 @@ static void ib_dme_irq_handler(struct rio_irq_handler *h, u32 state)
 				me->write_idx = (me->write_idx + 1) %
 						 me->entries;
 				num_new++;
-				me->pending++;
+				atomic_inc(&me->pending);
 				if (num_new == me->entries)
 					break;
 			}
@@ -1564,7 +1565,8 @@ 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);
 
-		if (me->pending &&
+		nPending = atomic_read(&me->pending);
+		if (nPending &&
 		    mport->inb_msg[mbox_no].mcback) {
 
 			mport->inb_msg[mbox_no].mcback(mport,
@@ -2345,6 +2347,7 @@ void *axxia_get_inb_message(struct rio_mport *mport, int mbox, int letter,
 	struct rio_rx_mbox *mb;
 	struct rio_msg_dme *me;
 	unsigned long iflags;
+	int nPending;
 	void *buf = NULL;
 
 	if ((mbox < 0) || (mbox >= RIO_MAX_RX_MBOX))
@@ -2371,7 +2374,8 @@ void *axxia_get_inb_message(struct rio_mport *mport, int mbox, int letter,
 		__rio_local_write_config_32(mport, RAB_INTR_ENAB_IDME, intr);
 	}
 
-	while (me->pending) {
+	nPending = atomic_read(&me->pending);
+	while (nPending) {
 		struct rio_msg_desc *desc = &me->desc[me->read_idx];
 		u32 dw0, dw1;
 
@@ -2399,7 +2403,8 @@ void *axxia_get_inb_message(struct rio_mport *mport, int mbox, int letter,
 					(dw0 & 0xff) | DME_DESC_DW0_VALID);
 			}
 			me->read_idx = (me->read_idx + 1) % me->entries;
-			me->pending--;
+			atomic_dec(&me->pending);
+			nPending--;
 			__ib_dme_event_dbg(priv, me->dme_no,
 					   1 << RIO_IB_DME_DESC_ERR);
 		} else {
@@ -2447,7 +2452,8 @@ void *axxia_get_inb_message(struct rio_mport *mport, int mbox, int letter,
 			mb->next_rx_slot = (mb->next_rx_slot + 1) %
 					    mb->ring_size;
 			me->read_idx = (me->read_idx + 1) % me->entries;
-			me->pending--;
+			atomic_dec(&me->pending);
+			nPending--;
 			goto done;
 		}
 	}
diff --git a/drivers/rapidio/devices/lsi/axxia-rio-irq.h b/drivers/rapidio/devices/lsi/axxia-rio-irq.h
index fde7140..7ed5fd8 100644
--- a/drivers/rapidio/devices/lsi/axxia-rio-irq.h
+++ b/drivers/rapidio/devices/lsi/axxia-rio-irq.h
@@ -216,7 +216,7 @@ struct rio_msg_dme {
 	int entries_in_use;
 	int write_idx;
 	int read_idx;
-	int pending;
+	atomic_t pending;
 	int tx_dme_tmo;
 	void *dev_id;
 	int dme_no;
-- 
1.7.9.5



More information about the linux-yocto mailing list