On 14-05-02 03:16 PM, Charlie Paul wrote:
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.

Are these two changes related ? There's only a tenuous linkage between
the two. As such, they should be two commits.

Bruce


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;


--
_______________________________________________
linux-yocto mailing list
linux-yocto@yoctoproject.org
https://lists.yoctoproject.org/listinfo/linux-yocto

Reply via email to