From: Michael Bringmann <michael.bringm...@lsi.com>

Check whether the SRIO link ready status is valid for each driver instance.
Fix an issue with scanning/listing the set of network devices found when
multiple SRIO controller master ports are enabled.

Signed-off-by: Michael Bringmann <michael.bringm...@lsi.com>
---
 arch/arm/include/asm/axxia-rio.h        |    5 ++++-
 arch/arm/mach-axxia/rapidio.c           |   19 +++++++++++++++----
 arch/powerpc/include/asm/axxia-rio.h    |    5 ++++-
 drivers/rapidio/devices/lsi/axxia-rio.c |    2 +-
 drivers/rapidio/rio.c                   |    1 +
 5 files changed, 25 insertions(+), 7 deletions(-)

diff --git a/arch/arm/include/asm/axxia-rio.h b/arch/arm/include/asm/axxia-rio.h
index 492d476..8b7fba2 100644
--- a/arch/arm/include/asm/axxia-rio.h
+++ b/arch/arm/include/asm/axxia-rio.h
@@ -5,6 +5,8 @@
 #ifndef __ASM_AXXIA_RIO_H__
 #define __ASM_AXXIA_RIO_H__
 
+#include <linux/platform_device.h>
+
 /* Constants, Macros, etc. */
 
 #define AXXIA_RIO_SMALL_SYSTEM
@@ -76,7 +78,8 @@ extern int axxia_rio_apio_disable(struct rio_mport *mport);
 extern int axxia_rio_rpio_enable(struct rio_mport *mport, u32 mask, u32 bits);
 extern int axxia_rio_rpio_disable(struct rio_mport *mport);
 
-extern int axxia_rapidio_board_init(int devNum, int *portNdx);
+extern int axxia_rapidio_board_init(struct platform_device *dev, int devNum,
+                                   int *portNdx);
 
 
 /*****************************/
diff --git a/arch/arm/mach-axxia/rapidio.c b/arch/arm/mach-axxia/rapidio.c
index 82deeaa..244550f 100644
--- a/arch/arm/mach-axxia/rapidio.c
+++ b/arch/arm/mach-axxia/rapidio.c
@@ -38,6 +38,7 @@
  * axxia_rapidio_board_init -
  *   Perform board-specific initialization to support use of RapidIO busses
  *
+ * @dev:     [IN] RIO platform device
  * @ndx:     [IN] Which instance of SRIOC driver needs support
  * @portNdx: [OUT] Which port to use for the specified controller
  *
@@ -45,24 +46,34 @@
  */
 int
 axxia_rapidio_board_init(
+       struct platform_device *dev,
        int devNum,
        int *portNdx)
 {
+       /* Reset the RIO port id to zero for this device */
        void __iomem *gpregBase = ioremap(0x2010094000, 0x1000);
-       unsigned long srioCfg = 0;
+       unsigned long reg = 0;
 
        if (gpregBase == NULL)
                return -EFAULT;
 
-       srioCfg = inl((long unsigned int)(gpregBase + 0x60));
+       reg = inl((long unsigned int)(gpregBase + 0x60));
 
-       srioCfg &= ~(0xf << (devNum * 4));
+       reg &= ~(0xf << (devNum * 4));
 
-       outl_p(srioCfg, (long unsigned int)(gpregBase + 0x60));
+       outl_p(reg, (long unsigned int)(gpregBase + 0x60));
 
        (*portNdx) = 0;
 
        iounmap(gpregBase);
 
+       /* Verify that this device is actually enabled */
+       ncr_read(NCP_REGION_ID(0x115, 0), 0x23c, 4, &reg);
+       if ((reg & (1 << (21+(devNum*4)))) == 0) {
+               printk(KERN_INFO "%s: SRIO%d link not ready\n",
+                       dev->dev.of_node->full_name, devNum);
+               return -ENXIO;
+       }
+
        return 0;
 }
diff --git a/arch/powerpc/include/asm/axxia-rio.h 
b/arch/powerpc/include/asm/axxia-rio.h
index b461b80..7d7865b 100644
--- a/arch/powerpc/include/asm/axxia-rio.h
+++ b/arch/powerpc/include/asm/axxia-rio.h
@@ -5,6 +5,8 @@
 #ifndef __ASM_AXXIA_RIO_H__
 #define __ASM_AXXIA_RIO_H__
 
+#include <linux/platform_device.h>
+
 /* Constants, Macros, etc. */
 
 #define AXXIA_RIO_SYSMEM_BARRIER()     __asm__ __volatile__("msync")
@@ -72,7 +74,8 @@ extern int axxia_rio_apio_disable(struct rio_mport *mport);
 extern int axxia_rio_rpio_enable(struct rio_mport *mport, u32 mask, u32 bits);
 extern int axxia_rio_rpio_disable(struct rio_mport *mport);
 
-static inline int axxia_rapidio_board_init(int devNum, int *portNdx)
+static inline int axxia_rapidio_board_init(struct platform_device *dev,
+                                          int devNum, int *portNdx)
 {
        (*portNdx) = 0;
        return 0;
diff --git a/drivers/rapidio/devices/lsi/axxia-rio.c 
b/drivers/rapidio/devices/lsi/axxia-rio.c
index 5868569..4673b6b 100644
--- a/drivers/rapidio/devices/lsi/axxia-rio.c
+++ b/drivers/rapidio/devices/lsi/axxia-rio.c
@@ -1624,7 +1624,7 @@ static int axxia_rio_setup(struct platform_device *dev)
                          &irq, &linkdown_reset))
                return -EFAULT;
 
-       rc = axxia_rapidio_board_init(ndx, &portNdx);
+       rc = axxia_rapidio_board_init(dev, ndx, &portNdx);
        if (rc != 0)
                return rc;
 
diff --git a/drivers/rapidio/rio.c b/drivers/rapidio/rio.c
index 5312777..3148271 100644
--- a/drivers/rapidio/rio.c
+++ b/drivers/rapidio/rio.c
@@ -1574,6 +1574,7 @@ retry:
                }
                kfree(nptr);
                mport = rio_get_mport(RIO_ANY_ID, mport);
+               key = 0;
        }
        rdev = NULL;
 done:
-- 
1.7.9.5

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

Reply via email to