[linux-yocto] [PATCH 103/161] LSI AXM55xx: Validate SRIO link ready status during driver initialization.
Cristian Bercaru
cristian.bercaru at windriver.com
Thu May 21 12:21:25 PDT 2015
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, ®);
+ 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