aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/rapidio/rio-scan.c
diff options
context:
space:
mode:
authorAlexandre Bounine <alexandre.bounine@idt.com>2012-10-04 20:16:02 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2012-10-05 14:05:22 -0400
commit8d4630dcf41214719cf44a94f8eec2a83f69943b (patch)
treed74ac3f278a982573217a4112ffdd78c02438c7a /drivers/rapidio/rio-scan.c
parent71afe3417173437361d4f4900a925f0158a4d713 (diff)
rapidio: apply RX/TX enable to active switch ports only
Apply port RX/TX enable operations only to active switch ports. RapidIO specification (Part 6: LP-Serial Physical Layer) recommends to keep Output Port Enable (TX) and Input Port Enable (RX) control bits in disabled state (0b0) after device reset. It also allows to have implementation specific reset state for these bits. This patch ensures that TX/RX enable action is applied only to active switch's ports while preserving an initial state of inactive ones. This patch is intended to keep inactive switch ports with inbound and outbound packet transfers disabled to block unexpected packets during hot insertion event. While it does not fix any visible malfunction it is intended to prevent such events in future. Signed-off-by: Alexandre Bounine <alexandre.bounine@idt.com> Cc: Matt Porter <mporter@kernel.crashing.org> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'drivers/rapidio/rio-scan.c')
-rw-r--r--drivers/rapidio/rio-scan.c9
1 files changed, 5 insertions, 4 deletions
diff --git a/drivers/rapidio/rio-scan.c b/drivers/rapidio/rio-scan.c
index 2bebd791a092..02e686b4c19a 100644
--- a/drivers/rapidio/rio-scan.c
+++ b/drivers/rapidio/rio-scan.c
@@ -839,12 +839,10 @@ static int __devinit rio_enum_peer(struct rio_net *net, struct rio_mport *port,
839 for (port_num = 0; 839 for (port_num = 0;
840 port_num < RIO_GET_TOTAL_PORTS(rdev->swpinfo); 840 port_num < RIO_GET_TOTAL_PORTS(rdev->swpinfo);
841 port_num++) { 841 port_num++) {
842 /*Enable Input Output Port (transmitter reviever)*/ 842 if (sw_inport == port_num) {
843 rio_enable_rx_tx_port(port, 0, 843 rio_enable_rx_tx_port(port, 0,
844 RIO_ANY_DESTID(port->sys_size), 844 RIO_ANY_DESTID(port->sys_size),
845 hopcount, port_num); 845 hopcount, port_num);
846
847 if (sw_inport == port_num) {
848 rdev->rswitch->port_ok |= (1 << port_num); 846 rdev->rswitch->port_ok |= (1 << port_num);
849 continue; 847 continue;
850 } 848 }
@@ -857,6 +855,9 @@ static int __devinit rio_enum_peer(struct rio_net *net, struct rio_mport *port,
857 pr_debug( 855 pr_debug(
858 "RIO: scanning device on port %d\n", 856 "RIO: scanning device on port %d\n",
859 port_num); 857 port_num);
858 rio_enable_rx_tx_port(port, 0,
859 RIO_ANY_DESTID(port->sys_size),
860 hopcount, port_num);
860 rdev->rswitch->port_ok |= (1 << port_num); 861 rdev->rswitch->port_ok |= (1 << port_num);
861 rio_route_add_entry(rdev, RIO_GLOBAL_TABLE, 862 rio_route_add_entry(rdev, RIO_GLOBAL_TABLE,
862 RIO_ANY_DESTID(port->sys_size), 863 RIO_ANY_DESTID(port->sys_size),