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, ®); + 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