[linux-yocto] [PATCH 01/30] LSI AXM55xx: Validate SRIO link ready status during driver initialization.

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


From: Michael Bringmann <michael.bringmann at 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.bringmann at 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



More information about the linux-yocto mailing list