Prev: [PATCH 2/9] RapidIO,powerpc/85xx: modify RIO port-write interrupt handler
Next: [PATCH 1/9] RapidIO: fix RapidIO sysfs hierarchy
From: Alexandre Bounine on 13 Aug 2010 11:30 Add explicit device access check before performing device enumeration. This gives a chance to clear possible link error conditions by issuing safe maintenance read request(s). Signed-off-by: Alexandre Bounine <alexandre.bounine(a)idt.com> Reviewed-by: Thomas Moll <thomas.moll(a)sysgo.com> Cc: Matt Porter <mporter(a)kernel.crashing.org> Cc: Li Yang <leoli(a)freescale.com> Cc: Kumar Gala <galak(a)kernel.crashing.org> --- drivers/rapidio/rio-scan.c | 6 ++++++ drivers/rapidio/rio.c | 2 +- drivers/rapidio/rio.h | 2 ++ 3 files changed, 9 insertions(+), 1 deletions(-) diff --git a/drivers/rapidio/rio-scan.c b/drivers/rapidio/rio-scan.c index 5dc33d1..fb5324b 100644 --- a/drivers/rapidio/rio-scan.c +++ b/drivers/rapidio/rio-scan.c @@ -761,6 +761,12 @@ static int __devinit rio_enum_peer(struct rio_net *net, struct rio_mport *port, u16 destid; int tmp; + if (rio_mport_chk_dev_access(port, + RIO_ANY_DESTID(port->sys_size), hopcount)) { + pr_debug("RIO: device access check failed\n"); + return -1; + } + if (rio_get_host_deviceid_lock(port, hopcount) == port->host_deviceid) { pr_debug("RIO: PE already discovered by this host\n"); /* diff --git a/drivers/rapidio/rio.c b/drivers/rapidio/rio.c index 22f7847..9621a7b 100644 --- a/drivers/rapidio/rio.c +++ b/drivers/rapidio/rio.c @@ -544,7 +544,7 @@ rio_chk_dev_route(struct rio_dev *rdev, struct rio_dev **nrdev, int *npnum) * @destid: Device destination ID in network * @hopcount: Number of hops into the network */ -static int +int rio_mport_chk_dev_access(struct rio_mport *mport, u16 destid, u8 hopcount) { int i = 0; diff --git a/drivers/rapidio/rio.h b/drivers/rapidio/rio.h index bc71ba1..d249a12 100644 --- a/drivers/rapidio/rio.h +++ b/drivers/rapidio/rio.h @@ -24,6 +24,8 @@ extern u32 rio_mport_get_physefb(struct rio_mport *port, int local, u16 destid, u8 hopcount); extern u32 rio_mport_get_efb(struct rio_mport *port, int local, u16 destid, u8 hopcount, u32 from); +extern int rio_mport_chk_dev_access(struct rio_mport *mport, u16 destid, + u8 hopcount); extern int rio_create_sysfs_dev_files(struct rio_dev *rdev); extern int rio_enum_mport(struct rio_mport *mport); extern int rio_disc_mport(struct rio_mport *mport); -- 1.7.0.5 -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo(a)vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/ |