aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/rapidio/rio-scan.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/rapidio/rio-scan.c')
-rw-r--r--drivers/rapidio/rio-scan.c84
1 files changed, 43 insertions, 41 deletions
diff --git a/drivers/rapidio/rio-scan.c b/drivers/rapidio/rio-scan.c
index 1eb82c4c712e..51f0af241eb7 100644
--- a/drivers/rapidio/rio-scan.c
+++ b/drivers/rapidio/rio-scan.c
@@ -437,9 +437,15 @@ static struct rio_dev __devinit *rio_setup_device(struct rio_net *net,
437 next_destid++; 437 next_destid++;
438 } else 438 } else
439 rdev->destid = rio_get_device_id(port, destid, hopcount); 439 rdev->destid = rio_get_device_id(port, destid, hopcount);
440 } else 440
441 /* Switch device has an associated destID */ 441 rdev->hopcount = 0xff;
442 rdev->destid = RIO_INVALID_DESTID; 442 } else {
443 /* Switch device has an associated destID which
444 * will be adjusted later
445 */
446 rdev->destid = destid;
447 rdev->hopcount = hopcount;
448 }
443 449
444 /* If a PE has both switch and other functions, show it as a switch */ 450 /* If a PE has both switch and other functions, show it as a switch */
445 if (rio_is_switch(rdev)) { 451 if (rio_is_switch(rdev)) {
@@ -450,8 +456,6 @@ static struct rio_dev __devinit *rio_setup_device(struct rio_net *net,
450 if (!rswitch) 456 if (!rswitch)
451 goto cleanup; 457 goto cleanup;
452 rswitch->switchid = next_switchid; 458 rswitch->switchid = next_switchid;
453 rswitch->hopcount = hopcount;
454 rswitch->destid = destid;
455 rswitch->port_ok = 0; 459 rswitch->port_ok = 0;
456 rswitch->route_table = kzalloc(sizeof(u8)* 460 rswitch->route_table = kzalloc(sizeof(u8)*
457 RIO_MAX_ROUTE_ENTRIES(port->sys_size), 461 RIO_MAX_ROUTE_ENTRIES(port->sys_size),
@@ -632,8 +636,7 @@ rio_unlock_device(struct rio_mport *port, u16 destid, u8 hopcount)
632 636
633/** 637/**
634 * rio_route_add_entry- Add a route entry to a switch routing table 638 * rio_route_add_entry- Add a route entry to a switch routing table
635 * @mport: Master port to send transaction 639 * @rdev: RIO device
636 * @rswitch: Switch device
637 * @table: Routing table ID 640 * @table: Routing table ID
638 * @route_destid: Destination ID to be routed 641 * @route_destid: Destination ID to be routed
639 * @route_port: Port number to be routed 642 * @route_port: Port number to be routed
@@ -647,31 +650,31 @@ rio_unlock_device(struct rio_mport *port, u16 destid, u8 hopcount)
647 * on failure. 650 * on failure.
648 */ 651 */
649static int 652static int
650rio_route_add_entry(struct rio_mport *mport, struct rio_switch *rswitch, 653rio_route_add_entry(struct rio_dev *rdev,
651 u16 table, u16 route_destid, u8 route_port, int lock) 654 u16 table, u16 route_destid, u8 route_port, int lock)
652{ 655{
653 int rc; 656 int rc;
654 657
655 if (lock) { 658 if (lock) {
656 rc = rio_lock_device(mport, rswitch->destid, 659 rc = rio_lock_device(rdev->net->hport, rdev->destid,
657 rswitch->hopcount, 1000); 660 rdev->hopcount, 1000);
658 if (rc) 661 if (rc)
659 return rc; 662 return rc;
660 } 663 }
661 664
662 rc = rswitch->add_entry(mport, rswitch->destid, 665 rc = rdev->rswitch->add_entry(rdev->net->hport, rdev->destid,
663 rswitch->hopcount, table, 666 rdev->hopcount, table,
664 route_destid, route_port); 667 route_destid, route_port);
665 if (lock) 668 if (lock)
666 rio_unlock_device(mport, rswitch->destid, rswitch->hopcount); 669 rio_unlock_device(rdev->net->hport, rdev->destid,
670 rdev->hopcount);
667 671
668 return rc; 672 return rc;
669} 673}
670 674
671/** 675/**
672 * rio_route_get_entry- Read a route entry in a switch routing table 676 * rio_route_get_entry- Read a route entry in a switch routing table
673 * @mport: Master port to send transaction 677 * @rdev: RIO device
674 * @rswitch: Switch device
675 * @table: Routing table ID 678 * @table: Routing table ID
676 * @route_destid: Destination ID to be routed 679 * @route_destid: Destination ID to be routed
677 * @route_port: Pointer to read port number into 680 * @route_port: Pointer to read port number into
@@ -685,23 +688,24 @@ rio_route_add_entry(struct rio_mport *mport, struct rio_switch *rswitch,
685 * on failure. 688 * on failure.
686 */ 689 */
687static int 690static int
688rio_route_get_entry(struct rio_mport *mport, struct rio_switch *rswitch, u16 table, 691rio_route_get_entry(struct rio_dev *rdev, u16 table,
689 u16 route_destid, u8 *route_port, int lock) 692 u16 route_destid, u8 *route_port, int lock)
690{ 693{
691 int rc; 694 int rc;
692 695
693 if (lock) { 696 if (lock) {
694 rc = rio_lock_device(mport, rswitch->destid, 697 rc = rio_lock_device(rdev->net->hport, rdev->destid,
695 rswitch->hopcount, 1000); 698 rdev->hopcount, 1000);
696 if (rc) 699 if (rc)
697 return rc; 700 return rc;
698 } 701 }
699 702
700 rc = rswitch->get_entry(mport, rswitch->destid, 703 rc = rdev->rswitch->get_entry(rdev->net->hport, rdev->destid,
701 rswitch->hopcount, table, 704 rdev->hopcount, table,
702 route_destid, route_port); 705 route_destid, route_port);
703 if (lock) 706 if (lock)
704 rio_unlock_device(mport, rswitch->destid, rswitch->hopcount); 707 rio_unlock_device(rdev->net->hport, rdev->destid,
708 rdev->hopcount);
705 709
706 return rc; 710 return rc;
707} 711}
@@ -811,14 +815,14 @@ static int __devinit rio_enum_peer(struct rio_net *net, struct rio_mport *port,
811 if (rio_is_switch(rdev)) { 815 if (rio_is_switch(rdev)) {
812 next_switchid++; 816 next_switchid++;
813 sw_inport = RIO_GET_PORT_NUM(rdev->swpinfo); 817 sw_inport = RIO_GET_PORT_NUM(rdev->swpinfo);
814 rio_route_add_entry(port, rdev->rswitch, RIO_GLOBAL_TABLE, 818 rio_route_add_entry(rdev, RIO_GLOBAL_TABLE,
815 port->host_deviceid, sw_inport, 0); 819 port->host_deviceid, sw_inport, 0);
816 rdev->rswitch->route_table[port->host_deviceid] = sw_inport; 820 rdev->rswitch->route_table[port->host_deviceid] = sw_inport;
817 821
818 for (destid = 0; destid < next_destid; destid++) { 822 for (destid = 0; destid < next_destid; destid++) {
819 if (destid == port->host_deviceid) 823 if (destid == port->host_deviceid)
820 continue; 824 continue;
821 rio_route_add_entry(port, rdev->rswitch, RIO_GLOBAL_TABLE, 825 rio_route_add_entry(rdev, RIO_GLOBAL_TABLE,
822 destid, sw_inport, 0); 826 destid, sw_inport, 0);
823 rdev->rswitch->route_table[destid] = sw_inport; 827 rdev->rswitch->route_table[destid] = sw_inport;
824 } 828 }
@@ -850,8 +854,7 @@ static int __devinit rio_enum_peer(struct rio_net *net, struct rio_mport *port,
850 "RIO: scanning device on port %d\n", 854 "RIO: scanning device on port %d\n",
851 port_num); 855 port_num);
852 rdev->rswitch->port_ok |= (1 << port_num); 856 rdev->rswitch->port_ok |= (1 << port_num);
853 rio_route_add_entry(port, rdev->rswitch, 857 rio_route_add_entry(rdev, RIO_GLOBAL_TABLE,
854 RIO_GLOBAL_TABLE,
855 RIO_ANY_DESTID(port->sys_size), 858 RIO_ANY_DESTID(port->sys_size),
856 port_num, 0); 859 port_num, 0);
857 860
@@ -865,7 +868,7 @@ static int __devinit rio_enum_peer(struct rio_net *net, struct rio_mport *port,
865 destid < next_destid; destid++) { 868 destid < next_destid; destid++) {
866 if (destid == port->host_deviceid) 869 if (destid == port->host_deviceid)
867 continue; 870 continue;
868 rio_route_add_entry(port, rdev->rswitch, 871 rio_route_add_entry(rdev,
869 RIO_GLOBAL_TABLE, 872 RIO_GLOBAL_TABLE,
870 destid, 873 destid,
871 port_num, 874 port_num,
@@ -904,7 +907,7 @@ static int __devinit rio_enum_peer(struct rio_net *net, struct rio_mport *port,
904 next_destid++; 907 next_destid++;
905 } 908 }
906 909
907 rdev->rswitch->destid = sw_destid; 910 rdev->destid = sw_destid;
908 } else 911 } else
909 pr_debug("RIO: found %s (vid %4.4x did %4.4x)\n", 912 pr_debug("RIO: found %s (vid %4.4x did %4.4x)\n",
910 rio_name(rdev), rdev->vid, rdev->did); 913 rio_name(rdev), rdev->vid, rdev->did);
@@ -958,7 +961,7 @@ rio_disc_peer(struct rio_net *net, struct rio_mport *port, u16 destid,
958 next_switchid++; 961 next_switchid++;
959 962
960 /* Associated destid is how we accessed this switch */ 963 /* Associated destid is how we accessed this switch */
961 rdev->rswitch->destid = destid; 964 rdev->destid = destid;
962 965
963 pr_debug( 966 pr_debug(
964 "RIO: found %s (vid %4.4x did %4.4x) with %d ports\n", 967 "RIO: found %s (vid %4.4x did %4.4x) with %d ports\n",
@@ -981,7 +984,7 @@ rio_disc_peer(struct rio_net *net, struct rio_mport *port, u16 destid,
981 for (ndestid = 0; 984 for (ndestid = 0;
982 ndestid < RIO_ANY_DESTID(port->sys_size); 985 ndestid < RIO_ANY_DESTID(port->sys_size);
983 ndestid++) { 986 ndestid++) {
984 rio_route_get_entry(port, rdev->rswitch, 987 rio_route_get_entry(rdev,
985 RIO_GLOBAL_TABLE, 988 RIO_GLOBAL_TABLE,
986 ndestid, 989 ndestid,
987 &route_port, 0); 990 &route_port, 0);
@@ -1076,7 +1079,7 @@ static void rio_update_route_tables(struct rio_mport *port)
1076 1079
1077 list_for_each_entry(rdev, &rio_devices, global_list) { 1080 list_for_each_entry(rdev, &rio_devices, global_list) {
1078 1081
1079 destid = (rio_is_switch(rdev))?rdev->rswitch->destid:rdev->destid; 1082 destid = rdev->destid;
1080 1083
1081 list_for_each_entry(rswitch, &rio_switches, node) { 1084 list_for_each_entry(rswitch, &rio_switches, node) {
1082 1085
@@ -1085,13 +1088,13 @@ static void rio_update_route_tables(struct rio_mport *port)
1085 1088
1086 if (RIO_INVALID_ROUTE == rswitch->route_table[destid]) { 1089 if (RIO_INVALID_ROUTE == rswitch->route_table[destid]) {
1087 /* Skip if destid ends in empty switch*/ 1090 /* Skip if destid ends in empty switch*/
1088 if (rswitch->destid == destid) 1091 if (rswitch->rdev->destid == destid)
1089 continue; 1092 continue;
1090 1093
1091 sport = RIO_GET_PORT_NUM(rswitch->rdev->swpinfo); 1094 sport = RIO_GET_PORT_NUM(rswitch->rdev->swpinfo);
1092 1095
1093 if (rswitch->add_entry) { 1096 if (rswitch->add_entry) {
1094 rio_route_add_entry(port, rswitch, 1097 rio_route_add_entry(rswitch->rdev,
1095 RIO_GLOBAL_TABLE, destid, 1098 RIO_GLOBAL_TABLE, destid,
1096 sport, 0); 1099 sport, 0);
1097 rswitch->route_table[destid] = sport; 1100 rswitch->route_table[destid] = sport;
@@ -1203,21 +1206,20 @@ static void rio_build_route_tables(void)
1203 1206
1204 list_for_each_entry(rdev, &rio_devices, global_list) 1207 list_for_each_entry(rdev, &rio_devices, global_list)
1205 if (rio_is_switch(rdev)) { 1208 if (rio_is_switch(rdev)) {
1206 rio_lock_device(rdev->net->hport, rdev->rswitch->destid, 1209 rio_lock_device(rdev->net->hport, rdev->destid,
1207 rdev->rswitch->hopcount, 1000); 1210 rdev->hopcount, 1000);
1208 for (i = 0; 1211 for (i = 0;
1209 i < RIO_MAX_ROUTE_ENTRIES(rdev->net->hport->sys_size); 1212 i < RIO_MAX_ROUTE_ENTRIES(rdev->net->hport->sys_size);
1210 i++) { 1213 i++) {
1211 if (rio_route_get_entry 1214 if (rio_route_get_entry(rdev,
1212 (rdev->net->hport, rdev->rswitch, 1215 RIO_GLOBAL_TABLE, i, &sport, 0) < 0)
1213 RIO_GLOBAL_TABLE, i, &sport, 0) < 0)
1214 continue; 1216 continue;
1215 rdev->rswitch->route_table[i] = sport; 1217 rdev->rswitch->route_table[i] = sport;
1216 } 1218 }
1217 1219
1218 rio_unlock_device(rdev->net->hport, 1220 rio_unlock_device(rdev->net->hport,
1219 rdev->rswitch->destid, 1221 rdev->destid,
1220 rdev->rswitch->hopcount); 1222 rdev->hopcount);
1221 } 1223 }
1222} 1224}
1223 1225