From: Michael Bringmann <michael.bringm...@lsi.com> Used 'atomic' counter to track available inbound messages between interrupt and foreground code. Also, enable both SRIO modules by default with check for SRIO link ready status to validated the accesses.
Signed-off-by: Michael Bringmann <michael.bringm...@lsi.com> --- arch/arm/boot/dts/axm55xx.dts | 4 ++-- drivers/rapidio/devices/lsi/axxia-rio-irq.c | 18 ++++++++++++------ drivers/rapidio/devices/lsi/axxia-rio-irq.h | 2 +- 3 files changed, 15 insertions(+), 9 deletions(-) diff --git a/arch/arm/boot/dts/axm55xx.dts b/arch/arm/boot/dts/axm55xx.dts index 1cba111..826a6e6 100644 --- a/arch/arm/boot/dts/axm55xx.dts +++ b/arch/arm/boot/dts/axm55xx.dts @@ -439,7 +439,7 @@ rio0: rapidio@0x3100000000 { index = <0>; - status = "disabled"; + status = "okay"; #address-cells = <2>; #size-cells = <2>; compatible = "axxia,rapidio-delta"; @@ -454,7 +454,7 @@ rio1: rapidio@0x3140000000 { index = <1>; - status = "disabled"; + status = "okay"; #address-cells = <2>; #size-cells = <2>; compatible = "axxia,rapidio-delta"; 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 -- _______________________________________________ linux-yocto mailing list linux-yo...@yoctoproject.org https://lists.yoctoproject.org/listinfo/linux-yocto