diff options
author | Alexandre Bounine <alexandre.bounine@idt.com> | 2010-10-27 18:34:32 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2010-10-27 21:03:16 -0400 |
commit | e274e0ed0a2ac31d5eaf7c891e4e1d99197517b2 (patch) | |
tree | cae2c7911b21f8ddbf52ee4fdef6673997240529 /drivers/rapidio | |
parent | 6429cd49f45450cd77a57b70b0dfa98fe2794da0 (diff) |
rapidio: add device access check into the enumeration
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@idt.com>
Cc: Thomas Moll <thomas.moll@sysgo.com>
Cc: Matt Porter <mporter@kernel.crashing.org>
Cc: Li Yang <leoli@freescale.com>
Cc: Kumar Gala <galak@kernel.crashing.org>
Cc: Micha Nelissen <micha@neli.hopto.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'drivers/rapidio')
-rw-r--r-- | drivers/rapidio/rio-scan.c | 6 | ||||
-rw-r--r-- | drivers/rapidio/rio.c | 2 | ||||
-rw-r--r-- | 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 d2ea01872d6a..e3efdf93df5a 100644 --- a/drivers/rapidio/rio-scan.c +++ b/drivers/rapidio/rio-scan.c | |||
@@ -762,6 +762,12 @@ static int __devinit rio_enum_peer(struct rio_net *net, struct rio_mport *port, | |||
762 | u16 destid; | 762 | u16 destid; |
763 | int tmp; | 763 | int tmp; |
764 | 764 | ||
765 | if (rio_mport_chk_dev_access(port, | ||
766 | RIO_ANY_DESTID(port->sys_size), hopcount)) { | ||
767 | pr_debug("RIO: device access check failed\n"); | ||
768 | return -1; | ||
769 | } | ||
770 | |||
765 | if (rio_get_host_deviceid_lock(port, hopcount) == port->host_deviceid) { | 771 | if (rio_get_host_deviceid_lock(port, hopcount) == port->host_deviceid) { |
766 | pr_debug("RIO: PE already discovered by this host\n"); | 772 | pr_debug("RIO: PE already discovered by this host\n"); |
767 | /* | 773 | /* |
diff --git a/drivers/rapidio/rio.c b/drivers/rapidio/rio.c index aefc2a0004d4..fa5e3cbe4c83 100644 --- a/drivers/rapidio/rio.c +++ b/drivers/rapidio/rio.c | |||
@@ -546,7 +546,7 @@ err_out: | |||
546 | * @destid: Device destination ID in network | 546 | * @destid: Device destination ID in network |
547 | * @hopcount: Number of hops into the network | 547 | * @hopcount: Number of hops into the network |
548 | */ | 548 | */ |
549 | static int | 549 | int |
550 | rio_mport_chk_dev_access(struct rio_mport *mport, u16 destid, u8 hopcount) | 550 | rio_mport_chk_dev_access(struct rio_mport *mport, u16 destid, u8 hopcount) |
551 | { | 551 | { |
552 | int i = 0; | 552 | int i = 0; |
diff --git a/drivers/rapidio/rio.h b/drivers/rapidio/rio.h index bc71ba1d239e..d249a1205c7d 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, | |||
24 | u16 destid, u8 hopcount); | 24 | u16 destid, u8 hopcount); |
25 | extern u32 rio_mport_get_efb(struct rio_mport *port, int local, u16 destid, | 25 | extern u32 rio_mport_get_efb(struct rio_mport *port, int local, u16 destid, |
26 | u8 hopcount, u32 from); | 26 | u8 hopcount, u32 from); |
27 | extern int rio_mport_chk_dev_access(struct rio_mport *mport, u16 destid, | ||
28 | u8 hopcount); | ||
27 | extern int rio_create_sysfs_dev_files(struct rio_dev *rdev); | 29 | extern int rio_create_sysfs_dev_files(struct rio_dev *rdev); |
28 | extern int rio_enum_mport(struct rio_mport *mport); | 30 | extern int rio_enum_mport(struct rio_mport *mport); |
29 | extern int rio_disc_mport(struct rio_mport *mport); | 31 | extern int rio_disc_mport(struct rio_mport *mport); |