|
@@ -73,7 +73,7 @@ static u16 rio_get_device_id(struct rio_mport *port, u16 destid, u8 hopcount)
|
|
|
|
|
|
rio_mport_read_config_32(port, destid, hopcount, RIO_DID_CSR, &result);
|
|
rio_mport_read_config_32(port, destid, hopcount, RIO_DID_CSR, &result);
|
|
|
|
|
|
- return RIO_GET_DID(result);
|
|
|
|
|
|
+ return RIO_GET_DID(port->sys_size, result);
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
/**
|
|
@@ -88,7 +88,7 @@ static u16 rio_get_device_id(struct rio_mport *port, u16 destid, u8 hopcount)
|
|
static void rio_set_device_id(struct rio_mport *port, u16 destid, u8 hopcount, u16 did)
|
|
static void rio_set_device_id(struct rio_mport *port, u16 destid, u8 hopcount, u16 did)
|
|
{
|
|
{
|
|
rio_mport_write_config_32(port, destid, hopcount, RIO_DID_CSR,
|
|
rio_mport_write_config_32(port, destid, hopcount, RIO_DID_CSR,
|
|
- RIO_SET_DID(did));
|
|
|
|
|
|
+ RIO_SET_DID(port->sys_size, did));
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
/**
|
|
@@ -100,7 +100,8 @@ static void rio_set_device_id(struct rio_mport *port, u16 destid, u8 hopcount, u
|
|
*/
|
|
*/
|
|
static void rio_local_set_device_id(struct rio_mport *port, u16 did)
|
|
static void rio_local_set_device_id(struct rio_mport *port, u16 did)
|
|
{
|
|
{
|
|
- rio_local_write_config_32(port, RIO_DID_CSR, RIO_SET_DID(did));
|
|
|
|
|
|
+ rio_local_write_config_32(port, RIO_DID_CSR, RIO_SET_DID(port->sys_size,
|
|
|
|
+ did));
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
/**
|
|
@@ -350,8 +351,18 @@ static struct rio_dev *rio_setup_device(struct rio_net *net,
|
|
rswitch->switchid = next_switchid;
|
|
rswitch->switchid = next_switchid;
|
|
rswitch->hopcount = hopcount;
|
|
rswitch->hopcount = hopcount;
|
|
rswitch->destid = destid;
|
|
rswitch->destid = destid;
|
|
|
|
+ rswitch->route_table = kzalloc(sizeof(u8)*
|
|
|
|
+ RIO_MAX_ROUTE_ENTRIES(port->sys_size),
|
|
|
|
+ GFP_KERNEL);
|
|
|
|
+ if (!rswitch->route_table) {
|
|
|
|
+ kfree(rdev);
|
|
|
|
+ rdev = NULL;
|
|
|
|
+ kfree(rswitch);
|
|
|
|
+ goto out;
|
|
|
|
+ }
|
|
/* Initialize switch route table */
|
|
/* Initialize switch route table */
|
|
- for (rdid = 0; rdid < RIO_MAX_ROUTE_ENTRIES; rdid++)
|
|
|
|
|
|
+ for (rdid = 0; rdid < RIO_MAX_ROUTE_ENTRIES(port->sys_size);
|
|
|
|
+ rdid++)
|
|
rswitch->route_table[rdid] = RIO_INVALID_ROUTE;
|
|
rswitch->route_table[rdid] = RIO_INVALID_ROUTE;
|
|
rdev->rswitch = rswitch;
|
|
rdev->rswitch = rswitch;
|
|
sprintf(rio_name(rdev), "%02x:s:%04x", rdev->net->id,
|
|
sprintf(rio_name(rdev), "%02x:s:%04x", rdev->net->id,
|
|
@@ -480,7 +491,7 @@ static u16 rio_get_host_deviceid_lock(struct rio_mport *port, u8 hopcount)
|
|
{
|
|
{
|
|
u32 result;
|
|
u32 result;
|
|
|
|
|
|
- rio_mport_read_config_32(port, RIO_ANY_DESTID, hopcount,
|
|
|
|
|
|
+ rio_mport_read_config_32(port, RIO_ANY_DESTID(port->sys_size), hopcount,
|
|
RIO_HOST_DID_LOCK_CSR, &result);
|
|
RIO_HOST_DID_LOCK_CSR, &result);
|
|
|
|
|
|
return (u16) (result & 0xffff);
|
|
return (u16) (result & 0xffff);
|
|
@@ -571,14 +582,16 @@ static int rio_enum_peer(struct rio_net *net, struct rio_mport *port,
|
|
}
|
|
}
|
|
|
|
|
|
/* Attempt to acquire device lock */
|
|
/* Attempt to acquire device lock */
|
|
- rio_mport_write_config_32(port, RIO_ANY_DESTID, hopcount,
|
|
|
|
|
|
+ rio_mport_write_config_32(port, RIO_ANY_DESTID(port->sys_size),
|
|
|
|
+ hopcount,
|
|
RIO_HOST_DID_LOCK_CSR, port->host_deviceid);
|
|
RIO_HOST_DID_LOCK_CSR, port->host_deviceid);
|
|
while ((tmp = rio_get_host_deviceid_lock(port, hopcount))
|
|
while ((tmp = rio_get_host_deviceid_lock(port, hopcount))
|
|
< port->host_deviceid) {
|
|
< port->host_deviceid) {
|
|
/* Delay a bit */
|
|
/* Delay a bit */
|
|
mdelay(1);
|
|
mdelay(1);
|
|
/* Attempt to acquire device lock again */
|
|
/* Attempt to acquire device lock again */
|
|
- rio_mport_write_config_32(port, RIO_ANY_DESTID, hopcount,
|
|
|
|
|
|
+ rio_mport_write_config_32(port, RIO_ANY_DESTID(port->sys_size),
|
|
|
|
+ hopcount,
|
|
RIO_HOST_DID_LOCK_CSR,
|
|
RIO_HOST_DID_LOCK_CSR,
|
|
port->host_deviceid);
|
|
port->host_deviceid);
|
|
}
|
|
}
|
|
@@ -590,7 +603,9 @@ static int rio_enum_peer(struct rio_net *net, struct rio_mport *port,
|
|
}
|
|
}
|
|
|
|
|
|
/* Setup new RIO device */
|
|
/* Setup new RIO device */
|
|
- if ((rdev = rio_setup_device(net, port, RIO_ANY_DESTID, hopcount, 1))) {
|
|
|
|
|
|
+ rdev = rio_setup_device(net, port, RIO_ANY_DESTID(port->sys_size),
|
|
|
|
+ hopcount, 1);
|
|
|
|
+ if (rdev) {
|
|
/* Add device to the global and bus/net specific list. */
|
|
/* Add device to the global and bus/net specific list. */
|
|
list_add_tail(&rdev->net_list, &net->devices);
|
|
list_add_tail(&rdev->net_list, &net->devices);
|
|
} else
|
|
} else
|
|
@@ -598,7 +613,8 @@ static int rio_enum_peer(struct rio_net *net, struct rio_mport *port,
|
|
|
|
|
|
if (rio_is_switch(rdev)) {
|
|
if (rio_is_switch(rdev)) {
|
|
next_switchid++;
|
|
next_switchid++;
|
|
- sw_inport = rio_get_swpinfo_inport(port, RIO_ANY_DESTID, hopcount);
|
|
|
|
|
|
+ sw_inport = rio_get_swpinfo_inport(port,
|
|
|
|
+ RIO_ANY_DESTID(port->sys_size), hopcount);
|
|
rio_route_add_entry(port, rdev->rswitch, RIO_GLOBAL_TABLE,
|
|
rio_route_add_entry(port, rdev->rswitch, RIO_GLOBAL_TABLE,
|
|
port->host_deviceid, sw_inport);
|
|
port->host_deviceid, sw_inport);
|
|
rdev->rswitch->route_table[port->host_deviceid] = sw_inport;
|
|
rdev->rswitch->route_table[port->host_deviceid] = sw_inport;
|
|
@@ -612,7 +628,8 @@ static int rio_enum_peer(struct rio_net *net, struct rio_mport *port,
|
|
}
|
|
}
|
|
|
|
|
|
num_ports =
|
|
num_ports =
|
|
- rio_get_swpinfo_tports(port, RIO_ANY_DESTID, hopcount);
|
|
|
|
|
|
+ rio_get_swpinfo_tports(port, RIO_ANY_DESTID(port->sys_size),
|
|
|
|
+ hopcount);
|
|
pr_debug(
|
|
pr_debug(
|
|
"RIO: found %s (vid %4.4x did %4.4x) with %d ports\n",
|
|
"RIO: found %s (vid %4.4x did %4.4x) with %d ports\n",
|
|
rio_name(rdev), rdev->vid, rdev->did, num_ports);
|
|
rio_name(rdev), rdev->vid, rdev->did, num_ports);
|
|
@@ -624,13 +641,15 @@ static int rio_enum_peer(struct rio_net *net, struct rio_mport *port,
|
|
cur_destid = next_destid;
|
|
cur_destid = next_destid;
|
|
|
|
|
|
if (rio_sport_is_active
|
|
if (rio_sport_is_active
|
|
- (port, RIO_ANY_DESTID, hopcount, port_num)) {
|
|
|
|
|
|
+ (port, RIO_ANY_DESTID(port->sys_size), hopcount,
|
|
|
|
+ port_num)) {
|
|
pr_debug(
|
|
pr_debug(
|
|
"RIO: scanning device on port %d\n",
|
|
"RIO: scanning device on port %d\n",
|
|
port_num);
|
|
port_num);
|
|
rio_route_add_entry(port, rdev->rswitch,
|
|
rio_route_add_entry(port, rdev->rswitch,
|
|
- RIO_GLOBAL_TABLE,
|
|
|
|
- RIO_ANY_DESTID, port_num);
|
|
|
|
|
|
+ RIO_GLOBAL_TABLE,
|
|
|
|
+ RIO_ANY_DESTID(port->sys_size),
|
|
|
|
+ port_num);
|
|
|
|
|
|
if (rio_enum_peer(net, port, hopcount + 1) < 0)
|
|
if (rio_enum_peer(net, port, hopcount + 1) < 0)
|
|
return -1;
|
|
return -1;
|
|
@@ -735,7 +754,8 @@ rio_disc_peer(struct rio_net *net, struct rio_mport *port, u16 destid,
|
|
pr_debug(
|
|
pr_debug(
|
|
"RIO: scanning device on port %d\n",
|
|
"RIO: scanning device on port %d\n",
|
|
port_num);
|
|
port_num);
|
|
- for (ndestid = 0; ndestid < RIO_ANY_DESTID;
|
|
|
|
|
|
+ for (ndestid = 0;
|
|
|
|
+ ndestid < RIO_ANY_DESTID(port->sys_size);
|
|
ndestid++) {
|
|
ndestid++) {
|
|
rio_route_get_entry(port, rdev->rswitch,
|
|
rio_route_get_entry(port, rdev->rswitch,
|
|
RIO_GLOBAL_TABLE,
|
|
RIO_GLOBAL_TABLE,
|
|
@@ -917,7 +937,9 @@ static void rio_build_route_tables(void)
|
|
|
|
|
|
list_for_each_entry(rdev, &rio_devices, global_list)
|
|
list_for_each_entry(rdev, &rio_devices, global_list)
|
|
if (rio_is_switch(rdev))
|
|
if (rio_is_switch(rdev))
|
|
- for (i = 0; i < RIO_MAX_ROUTE_ENTRIES; i++) {
|
|
|
|
|
|
+ for (i = 0;
|
|
|
|
+ i < RIO_MAX_ROUTE_ENTRIES(rdev->net->hport->sys_size);
|
|
|
|
+ i++) {
|
|
if (rio_route_get_entry
|
|
if (rio_route_get_entry
|
|
(rdev->net->hport, rdev->rswitch, RIO_GLOBAL_TABLE,
|
|
(rdev->net->hport, rdev->rswitch, RIO_GLOBAL_TABLE,
|
|
i, &sport) < 0)
|
|
i, &sport) < 0)
|
|
@@ -981,7 +1003,8 @@ int rio_disc_mport(struct rio_mport *mport)
|
|
del_timer_sync(&rio_enum_timer);
|
|
del_timer_sync(&rio_enum_timer);
|
|
|
|
|
|
pr_debug("done\n");
|
|
pr_debug("done\n");
|
|
- if (rio_disc_peer(net, mport, RIO_ANY_DESTID, 0) < 0) {
|
|
|
|
|
|
+ if (rio_disc_peer(net, mport, RIO_ANY_DESTID(mport->sys_size),
|
|
|
|
+ 0) < 0) {
|
|
printk(KERN_INFO
|
|
printk(KERN_INFO
|
|
"RIO: master port %d device has failed discovery\n",
|
|
"RIO: master port %d device has failed discovery\n",
|
|
mport->id);
|
|
mport->id);
|