public inbox for linux-rdma@vger.kernel.org
 help / color / mirror / Atom feed
From: Hal Rosenstock <hal-LDSdmyG8hGV8YrgS2mwiifqBs+8SCbDb@public.gmane.org>
To: Ira Weiny <weiny2-i2BcT+NCU+M@public.gmane.org>
Cc: "linux-rdma-u79uwXL29TY76Z2rM5mHXA@public.gmane.org"
	<linux-rdma-u79uwXL29TY76Z2rM5mHXA@public.gmane.org>
Subject: [PATCHv2 2/6] infiniband-diags/ibportstate: Add support for FDR10
Date: Wed, 31 Aug 2011 11:26:28 -0400	[thread overview]
Message-ID: <4E5E52A4.80603@dev.mellanox.co.il> (raw)


Signed-off-by: Hal Rosenstock <hal-VPRAkNaXOzVWk0Htik3J/w@public.gmane.org>
---
Changes since v1:
Rebased to latest master

 man/ibportstate.8 |    5 ++-
 src/ibportstate.c |   95 +++++++++++++++++++++++++++++++++++++++++++++++++++-
 2 files changed, 96 insertions(+), 4 deletions(-)

diff --git a/man/ibportstate.8 b/man/ibportstate.8
index 2a60db9..0537d7e 100644
--- a/man/ibportstate.8
+++ b/man/ibportstate.8
@@ -23,7 +23,7 @@ also allows the link speed/width enabled on any IB port to be adjusted.
 .TP
 op
 Port operations allowed
- supported ops: enable, disable, reset, speed, espeed, width, query,
+ supported ops: enable, disable, reset, speed, espeed, fdr10, width, query,
 		down, arm, active, vls, mtu, lid, smlid, lmc
  Default is query
 .PP
@@ -34,6 +34,7 @@ Port operations allowed
  (An error is indicated if PortInfo:LinkSpeedSupported does not support
   this setting)
  espeed ops are allowed on any port supporting extended link speeds
+ fdr10 ops are allowed on any port supporting fdr10
 (An error is indicated if port's capability mask indicates extended
  link speeds are not supported or if PortInfo:LinkSpeedExtSupported
  does not support this setting)
@@ -42,7 +43,7 @@ Port operations allowed
   this setting)
  (NOTE: Speed and width changes are not effected until the port goes through
   link renegotiation)
- query also validates port characteristics (link width, speed, and espeed)
+ query also validates port characteristics (link width, speed, espeed, and fdr10)
   based on the peer port. This checking is done when the port
   queried is a switch port as it relies on combined routing
   (an initial LID route with directed routing to the peer) which
diff --git a/src/ibportstate.c b/src/ibportstate.c
index f7ad37f..9077413 100644
--- a/src/ibportstate.c
+++ b/src/ibportstate.c
@@ -54,6 +54,7 @@ enum port_ops {
 	DISABLE,
 	SPEED,
 	ESPEED,
+	FDR10SPEED,
 	WIDTH,
 	DOWN,
 	ARM,
@@ -68,6 +69,7 @@ enum port_ops {
 struct ibmad_port *srcport;
 int speed = 0; /* no state change */
 int espeed = 0; /* no state change */
+int fdr10 = 0; /* no state change */
 int width = 0; /* no state change */
 int lid;
 int smlid;
@@ -86,6 +88,7 @@ struct {
 	{"disable", NULL, 0},	/* DISABLE */
 	{"speed", &speed, 0},	/* SPEED */
 	{"espeed", &espeed, 0},	/* EXTENDED SPEED */
+	{"fdr10", &fdr10, 0},	/* FDR10 SPEED */
 	{"width", &width, 0},	/* WIDTH */
 	{"down", NULL, 0},	/* DOWN */
 	{"arm", NULL, 0},	/* ARM */
@@ -118,6 +121,15 @@ static int get_node_info(ib_portid_t * dest, uint8_t * data)
 		return 0;
 }
 
+static int is_mlnx_ext_port_info_supported(uint32_t devid)
+{
+	if (devid == 0xc738)
+		return 1;
+	if (devid >= 0x1003 && devid <= 0x1010)
+		return 1;
+	return 0;
+}
+
 static int get_port_info(ib_portid_t * dest, uint8_t * data, int portnum,
 			 int is_switch)
 {
@@ -212,6 +224,33 @@ static void set_port_info(ib_portid_t * dest, uint8_t * data, int portnum,
 	show_port_info(dest, data, portnum, espeed_cap);
 }
 
+static void get_ext_port_info(ib_portid_t * dest, uint8_t * data, int portnum)
+{
+	if (!smp_query_via(data, dest, IB_ATTR_MLNX_EXT_PORT_INFO,
+			   portnum, 0, srcport))
+		IBERROR("smp query ext portinfo failed");
+}
+
+static void show_ext_port_info(ib_portid_t * dest, uint8_t * data, int portnum)
+{
+	char buf[256];
+
+	mad_dump_mlnx_ext_port_info(buf, sizeof buf, data, IB_SMP_DATA_SIZE);
+
+	printf("# Extended Port info: %s port %d\n%s", portid2str(dest),
+	       portnum, buf);
+}
+
+static void set_ext_port_info(ib_portid_t * dest, uint8_t * data, int portnum)
+{
+	if (!smp_set_via(data, dest, IB_ATTR_MLNX_EXT_PORT_INFO,
+			 portnum, 0, srcport))
+		IBERROR("smp set ext portinfo failed");
+
+	printf("\nAfter ExtendedPortInfo set:\n");
+	show_ext_port_info(dest, data, portnum);
+}
+
 static int get_link_width(int lwe, int lws)
 {
 	if (lwe == 255)
@@ -303,17 +342,21 @@ int main(int argc, char **argv)
 	ib_portid_t portid = { 0 };
 	int port_op = -1;
 	int is_switch, is_peer_switch, espeed_cap, peer_espeed_cap;
-	int state, physstate, lwe, lws, lwa, lse, lss, lsa, lsee, lses, lsea;
+	int state, physstate, lwe, lws, lwa, lse, lss, lsa, lsee, lses, lsea,
+	    fdr10s, fdr10e, fdr10a;
 	int peerlocalportnum, peerlwe, peerlws, peerlwa, peerlse, peerlss,
-	    peerlsa, peerlsee, peerlses, peerlsea;
+	    peerlsa, peerlsee, peerlses, peerlsea, peerfdr10s, peerfdr10e,
+	    peerfdr10a;
 	int peerwidth, peerspeed, peerespeed;
 	uint8_t data[IB_SMP_DATA_SIZE] = { 0 };
+	uint8_t data2[IB_SMP_DATA_SIZE] = { 0 };
 	ib_portid_t peerportid = { 0 };
 	int portnum = 0;
 	ib_portid_t selfportid = { 0 };
 	int selfport = 0;
 	int changed = 0;
 	int i;
+	uint16_t devid, rem_devid;
 	long val;
 	char usage_args[] = "<dest dr_path|lid|guid> <portnum> [<op>]\n"
 	    "\nSupported ops: enable, disable, reset, speed, width, query,\n"
@@ -379,6 +422,10 @@ int main(int argc, char **argv)
 				if (val < 0 || val > 31)
 					IBERROR("invalid extended speed value %ld", val);
 				break;
+			case FDR10SPEED:
+				if (val < 0 || val > 1)
+					IBERROR("invalid fdr10 speed value %ld", val);
+				break;
 			case WIDTH:
 				if (val < 0 || (val > 15 && val != 255))
 					IBERROR("invalid width value %ld", val);
@@ -415,6 +462,7 @@ int main(int argc, char **argv)
 		port_op = QUERY;
 
 	is_switch = get_node_info(&portid, data);
+	devid = mad_get_field(data, 0, IB_NODE_DEVID_F);
 
 	if (port_op != QUERY || changed)
 		printf("Initial %s PortInfo:\n", is_switch ? "Switch" : "CA");
@@ -422,6 +470,10 @@ int main(int argc, char **argv)
 		printf("%s PortInfo:\n", is_switch ? "Switch" : "CA");
 	espeed_cap = get_port_info(&portid, data, portnum, is_switch);
 	show_port_info(&portid, data, portnum, espeed_cap);
+	if (is_mlnx_ext_port_info_supported(devid)) {
+		get_ext_port_info(&portid, data2, portnum);
+		show_ext_port_info(&portid, data2, portnum);
+	}
 
 	if (port_op != QUERY || changed) {
 		/*
@@ -475,6 +527,15 @@ int main(int argc, char **argv)
 		if (port_args[LMC].set)
 			mad_set_field(data, 0, IB_PORT_LMC_F, lmc);
 
+		if (port_args[FDR10SPEED].set) {
+			mad_set_field(data2, 0,
+				      IB_MLNX_EXT_PORT_STATE_CHG_ENABLE_F,
+				      FDR10);
+			mad_set_field(data2, 0,
+				      IB_MLNX_EXT_PORT_LINK_SPEED_ENABLED_F,
+				      fdr10);
+			set_ext_port_info(&portid, data2, portnum);
+		}
 		set_port_info(&portid, data, portnum, is_switch);
 
 	} else if (is_switch && portnum) {
@@ -495,6 +556,15 @@ int main(int argc, char **argv)
 					 &lsa);
 			mad_decode_field(data, IB_PORT_LINK_SPEED_ENABLED_F,
 					 &lse);
+			mad_decode_field(data2,
+					 IB_MLNX_EXT_PORT_LINK_SPEED_SUPPORTED_F,
+					 &fdr10s);
+			mad_decode_field(data2,
+					 IB_MLNX_EXT_PORT_LINK_SPEED_ENABLED_F,
+					 &fdr10e);
+			mad_decode_field(data2,
+					 IB_MLNX_EXT_PORT_LINK_SPEED_ACTIVE_F,
+					 &fdr10a);
 			if (espeed_cap) {
 				mad_decode_field(data,
 						 IB_PORT_LINK_SPEED_EXT_SUPPORTED_F,
@@ -521,6 +591,7 @@ int main(int argc, char **argv)
 
 			/* Get peer port NodeInfo to obtain peer port number */
 			is_peer_switch = get_node_info(&peerportid, data);
+			rem_devid = mad_get_field(data, 0, IB_NODE_DEVID_F);
 
 			mad_decode_field(data, IB_NODE_LOCAL_PORT_F,
 					 &peerlocalportnum);
@@ -530,8 +601,14 @@ int main(int argc, char **argv)
 			peer_espeed_cap = get_port_info(&peerportid, data,
 							peerlocalportnum,
 							is_peer_switch);
+			if (is_mlnx_ext_port_info_supported(rem_devid))
+				get_ext_port_info(&peerportid, data2,
+						  peerlocalportnum);
 			show_port_info(&peerportid, data, peerlocalportnum,
 				       peer_espeed_cap);
+			if (is_mlnx_ext_port_info_supported(rem_devid))
+				show_ext_port_info(&peerportid, data2,
+						   peerlocalportnum);
 
 			mad_decode_field(data, IB_PORT_LINK_WIDTH_ENABLED_F,
 					 &peerlwe);
@@ -545,6 +622,15 @@ int main(int argc, char **argv)
 					 &peerlsa);
 			mad_decode_field(data, IB_PORT_LINK_SPEED_ENABLED_F,
 					 &peerlse);
+			mad_decode_field(data2,
+					 IB_MLNX_EXT_PORT_LINK_SPEED_SUPPORTED_F,
+					 &peerfdr10s);
+			mad_decode_field(data2,
+					 IB_MLNX_EXT_PORT_LINK_SPEED_ENABLED_F,
+					 &peerfdr10e);
+			mad_decode_field(data2,
+					 IB_MLNX_EXT_PORT_LINK_SPEED_ACTIVE_F,
+					 &peerfdr10a);
 			if (peer_espeed_cap) {
 				mad_decode_field(data,
 						 IB_PORT_LINK_SPEED_EXT_SUPPORTED_F,
@@ -574,6 +660,11 @@ int main(int argc, char **argv)
 								peerlses);
 				validate_extended_speed(espeed, peerespeed,
 							lsea);
+			} else {
+				if (fdr10e & FDR10 && peerfdr10e & FDR10) {
+					if (!(fdr10a & FDR10))
+						IBWARN("Peer ports operating at  active speed %d rather than FDR10", lsa);
+				}
 			}
 		}
 	}
-- 
1.5.3

--
To unsubscribe from this list: send the line "unsubscribe linux-rdma" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

             reply	other threads:[~2011-08-31 15:26 UTC|newest]

Thread overview: 2+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2011-08-31 15:26 Hal Rosenstock [this message]
     [not found] ` <4E5E52A4.80603-LDSdmyG8hGV8YrgS2mwiifqBs+8SCbDb@public.gmane.org>
2011-08-31 23:31   ` [PATCHv2 2/6] infiniband-diags/ibportstate: Add support for FDR10 Ira Weiny

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=4E5E52A4.80603@dev.mellanox.co.il \
    --to=hal-ldsdmyg8hgv8yrgs2mwiifqbs+8scbdb@public.gmane.org \
    --cc=linux-rdma-u79uwXL29TY76Z2rM5mHXA@public.gmane.org \
    --cc=weiny2-i2BcT+NCU+M@public.gmane.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox