提交 ae05cbd5 编写于 作者: A Alexandre Bounine 提交者: Linus Torvalds

rapidio: use stored ingress port number instead of register read

The switch port information is obtained and stored during RIO device
setup.  Therefore repeated reads from Switch Port Information CAR may be
removed.
Signed-off-by: NAlexandre 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: NAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: NLinus Torvalds <torvalds@linux-foundation.org>
上级 93e2cbd2
...@@ -420,6 +420,11 @@ static struct rio_dev __devinit *rio_setup_device(struct rio_net *net, ...@@ -420,6 +420,11 @@ static struct rio_dev __devinit *rio_setup_device(struct rio_net *net,
hopcount, RIO_EFB_ERR_MGMNT); hopcount, RIO_EFB_ERR_MGMNT);
} }
if (rdev->pef & (RIO_PEF_SWITCH | RIO_PEF_MULTIPORT)) {
rio_mport_read_config_32(port, destid, hopcount,
RIO_SWP_INFO_CAR, &rdev->swpinfo);
}
rio_mport_read_config_32(port, destid, hopcount, RIO_SRC_OPS_CAR, rio_mport_read_config_32(port, destid, hopcount, RIO_SRC_OPS_CAR,
&rdev->src_ops); &rdev->src_ops);
rio_mport_read_config_32(port, destid, hopcount, RIO_DST_OPS_CAR, rio_mport_read_config_32(port, destid, hopcount, RIO_DST_OPS_CAR,
...@@ -439,8 +444,6 @@ static struct rio_dev __devinit *rio_setup_device(struct rio_net *net, ...@@ -439,8 +444,6 @@ static struct rio_dev __devinit *rio_setup_device(struct rio_net *net,
/* If a PE has both switch and other functions, show it as a switch */ /* If a PE has both switch and other functions, show it as a switch */
if (rio_is_switch(rdev)) { if (rio_is_switch(rdev)) {
rio_mport_read_config_32(port, destid, hopcount,
RIO_SWP_INFO_CAR, &rdev->swpinfo);
rswitch = kzalloc(sizeof(struct rio_switch), GFP_KERNEL); rswitch = kzalloc(sizeof(struct rio_switch), GFP_KERNEL);
if (!rswitch) if (!rswitch)
goto cleanup; goto cleanup;
...@@ -458,6 +461,7 @@ static struct rio_dev __devinit *rio_setup_device(struct rio_net *net, ...@@ -458,6 +461,7 @@ static struct rio_dev __devinit *rio_setup_device(struct rio_net *net,
rdid++) rdid++)
rswitch->route_table[rdid] = RIO_INVALID_ROUTE; rswitch->route_table[rdid] = RIO_INVALID_ROUTE;
rdev->rswitch = rswitch; rdev->rswitch = rswitch;
rswitch->rdev = rdev;
dev_set_name(&rdev->dev, "%02x:s:%04x", rdev->net->id, dev_set_name(&rdev->dev, "%02x:s:%04x", rdev->net->id,
rdev->rswitch->switchid); rdev->rswitch->switchid);
rio_switch_init(rdev, do_enum); rio_switch_init(rdev, do_enum);
...@@ -718,25 +722,6 @@ static u16 rio_get_host_deviceid_lock(struct rio_mport *port, u8 hopcount) ...@@ -718,25 +722,6 @@ static u16 rio_get_host_deviceid_lock(struct rio_mport *port, u8 hopcount)
return (u16) (result & 0xffff); return (u16) (result & 0xffff);
} }
/**
* rio_get_swpinfo_inport- Gets the ingress port number
* @mport: Master port to send transaction
* @destid: Destination ID associated with the switch
* @hopcount: Number of hops to the device
*
* Returns port number being used to access the switch device.
*/
static u8
rio_get_swpinfo_inport(struct rio_mport *mport, u16 destid, u8 hopcount)
{
u32 result;
rio_mport_read_config_32(mport, destid, hopcount, RIO_SWP_INFO_CAR,
&result);
return (u8) (result & 0xff);
}
/** /**
* rio_get_swpinfo_tports- Gets total number of ports on the switch * rio_get_swpinfo_tports- Gets total number of ports on the switch
* @mport: Master port to send transaction * @mport: Master port to send transaction
...@@ -834,8 +819,7 @@ static int __devinit rio_enum_peer(struct rio_net *net, struct rio_mport *port, ...@@ -834,8 +819,7 @@ static int __devinit 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, sw_inport = RIO_GET_PORT_NUM(rdev->swpinfo);
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, 0); port->host_deviceid, sw_inport, 0);
rdev->rswitch->route_table[port->host_deviceid] = sw_inport; rdev->rswitch->route_table[port->host_deviceid] = sw_inport;
...@@ -989,8 +973,7 @@ rio_disc_peer(struct rio_net *net, struct rio_mport *port, u16 destid, ...@@ -989,8 +973,7 @@ rio_disc_peer(struct rio_net *net, struct rio_mport *port, u16 destid,
"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);
for (port_num = 0; port_num < num_ports; port_num++) { for (port_num = 0; port_num < num_ports; port_num++) {
if (rio_get_swpinfo_inport(port, destid, hopcount) == if (RIO_GET_PORT_NUM(rdev->swpinfo) == port_num)
port_num)
continue; continue;
if (rio_sport_is_active if (rio_sport_is_active
...@@ -1109,8 +1092,7 @@ static void rio_update_route_tables(struct rio_mport *port) ...@@ -1109,8 +1092,7 @@ static void rio_update_route_tables(struct rio_mport *port)
if (rswitch->destid == destid) if (rswitch->destid == destid)
continue; continue;
sport = rio_get_swpinfo_inport(port, sport = RIO_GET_PORT_NUM(rswitch->rdev->swpinfo);
rswitch->destid, rswitch->hopcount);
if (rswitch->add_entry) { if (rswitch->add_entry) {
rio_route_add_entry(port, rswitch, rio_route_add_entry(port, rswitch,
......
...@@ -112,7 +112,7 @@ struct rio_dev { ...@@ -112,7 +112,7 @@ struct rio_dev {
u16 asm_rev; u16 asm_rev;
u16 efptr; u16 efptr;
u32 pef; u32 pef;
u32 swpinfo; /* Only used for switches */ u32 swpinfo;
u32 src_ops; u32 src_ops;
u32 dst_ops; u32 dst_ops;
u32 comp_tag; u32 comp_tag;
...@@ -219,6 +219,7 @@ struct rio_net { ...@@ -219,6 +219,7 @@ struct rio_net {
/** /**
* struct rio_switch - RIO switch info * struct rio_switch - RIO switch info
* @node: Node in global list of switches * @node: Node in global list of switches
* @rdev: Associated RIO device structure
* @switchid: Switch ID that is unique across a network * @switchid: Switch ID that is unique across a network
* @hopcount: Hopcount to this switch * @hopcount: Hopcount to this switch
* @destid: Associated destid in the path * @destid: Associated destid in the path
...@@ -234,6 +235,7 @@ struct rio_net { ...@@ -234,6 +235,7 @@ struct rio_net {
*/ */
struct rio_switch { struct rio_switch {
struct list_head node; struct list_head node;
struct rio_dev *rdev;
u16 switchid; u16 switchid;
u16 hopcount; u16 hopcount;
u16 destid; u16 destid;
......
...@@ -33,6 +33,7 @@ ...@@ -33,6 +33,7 @@
#define RIO_PEF_MEMORY 0x40000000 /* [I] MMIO */ #define RIO_PEF_MEMORY 0x40000000 /* [I] MMIO */
#define RIO_PEF_PROCESSOR 0x20000000 /* [I] Processor */ #define RIO_PEF_PROCESSOR 0x20000000 /* [I] Processor */
#define RIO_PEF_SWITCH 0x10000000 /* [I] Switch */ #define RIO_PEF_SWITCH 0x10000000 /* [I] Switch */
#define RIO_PEF_MULTIPORT 0x08000000 /* [VI, 2.1] Multiport */
#define RIO_PEF_INB_MBOX 0x00f00000 /* [II] Mailboxes */ #define RIO_PEF_INB_MBOX 0x00f00000 /* [II] Mailboxes */
#define RIO_PEF_INB_MBOX0 0x00800000 /* [II] Mailbox 0 */ #define RIO_PEF_INB_MBOX0 0x00800000 /* [II] Mailbox 0 */
#define RIO_PEF_INB_MBOX1 0x00400000 /* [II] Mailbox 1 */ #define RIO_PEF_INB_MBOX1 0x00400000 /* [II] Mailbox 1 */
...@@ -51,6 +52,7 @@ ...@@ -51,6 +52,7 @@
#define RIO_SWP_INFO_PORT_TOTAL_MASK 0x0000ff00 /* [I] Total number of ports */ #define RIO_SWP_INFO_PORT_TOTAL_MASK 0x0000ff00 /* [I] Total number of ports */
#define RIO_SWP_INFO_PORT_NUM_MASK 0x000000ff /* [I] Maintenance transaction port number */ #define RIO_SWP_INFO_PORT_NUM_MASK 0x000000ff /* [I] Maintenance transaction port number */
#define RIO_GET_TOTAL_PORTS(x) ((x & RIO_SWP_INFO_PORT_TOTAL_MASK) >> 8) #define RIO_GET_TOTAL_PORTS(x) ((x & RIO_SWP_INFO_PORT_TOTAL_MASK) >> 8)
#define RIO_GET_PORT_NUM(x) (x & RIO_SWP_INFO_PORT_NUM_MASK)
#define RIO_SRC_OPS_CAR 0x18 /* [I] Source Operations CAR */ #define RIO_SRC_OPS_CAR 0x18 /* [I] Source Operations CAR */
#define RIO_SRC_OPS_READ 0x00008000 /* [I] Read op */ #define RIO_SRC_OPS_READ 0x00008000 /* [I] Read op */
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册