All of lore.kernel.org
 help / color / mirror / Atom feed
* [RFC ETHTOOL PATCH 0/2] implement MDI-X set
@ 2012-07-25 17:52 Jesse Brandeburg
  2012-07-25 17:53 ` [RFC ETHTOOL PATCH 1/2] ethtool.h: implement new MDI-X set defines Jesse Brandeburg
  2012-07-25 17:53 ` [RFC ETHTOOL PATCH 2/2] ethtool: allow setting MDI-X state Jesse Brandeburg
  0 siblings, 2 replies; 5+ messages in thread
From: Jesse Brandeburg @ 2012-07-25 17:52 UTC (permalink / raw)
  To: netdev, bhutchings; +Cc: jesse.brandeburg

Some users reported issues connecting to some switches, where
they were unable to get link (see kernel.org bugzilla 11998)

This patch series improves ethtool to support controlling the
MDI/MDI-X state of a link.  It also adds support to the "get
settings" function to show if the MDI state was forced or not.

This is currently RFC because internal testing was not completed
but I am sending the patch to make sure the design is good.

Special thanks to Ben Hutchings for his input to this series.

Signed-off-by: Jesse Brandeburg <jesse.brandeburg@intel.com>

---

Jesse Brandeburg (2):
      ethtool: allow setting MDI-X state
      ethtool.h: implement new MDI-X set defines


 ethtool-copy.h |   17 +++++++++++------
 ethtool.8.in   |    8 ++++++++
 ethtool.c      |   48 +++++++++++++++++++++++++++++++++++++++++++++---
 3 files changed, 64 insertions(+), 9 deletions(-)

-- 
Jesse Brandeburg

^ permalink raw reply	[flat|nested] 5+ messages in thread

* [RFC ETHTOOL PATCH 1/2] ethtool.h: implement new MDI-X set defines
  2012-07-25 17:52 [RFC ETHTOOL PATCH 0/2] implement MDI-X set Jesse Brandeburg
@ 2012-07-25 17:53 ` Jesse Brandeburg
  2012-07-25 17:53 ` [RFC ETHTOOL PATCH 2/2] ethtool: allow setting MDI-X state Jesse Brandeburg
  1 sibling, 0 replies; 5+ messages in thread
From: Jesse Brandeburg @ 2012-07-25 17:53 UTC (permalink / raw)
  To: netdev, bhutchings; +Cc: jesse.brandeburg

These changes implement the kernel side of the interface
for allowing drivers to set MDI-X state on twisted pair.

Changes implemented as suggested by Ben Hutchings, thanks Ben!

see ethtool patches titled:
ethtool: allow setting MDI-X state

Signed-off-by: Jesse Brandeburg <jesse.brandeburg@intel.com>
CC: Ben Hutchings <bhutchings@solarflare.com>
---

 ethtool-copy.h |   17 +++++++++++------
 1 files changed, 11 insertions(+), 6 deletions(-)

diff --git a/ethtool-copy.h b/ethtool-copy.h
index 9e26a76..1e2673e 100644
--- a/ethtool-copy.h
+++ b/ethtool-copy.h
@@ -42,8 +42,10 @@ struct ethtool_cmd {
 				 * bits) in Mbps. Please use
 				 * ethtool_cmd_speed()/_set() to
 				 * access it */
-	__u8	eth_tp_mdix;
-	__u8	reserved2;
+	__u8	eth_tp_mdix;	/* twisted pair MDI-X status */
+	__u8	eth_tp_mdix_ctrl; /* twisted pair MDI-X control, when set,
+				   * link should be renegotiated if necessary
+				   */
 	__u32	lp_advertising;	/* Features the link partner advertises */
 	__u32	reserved[2];
 };
@@ -945,10 +947,13 @@ enum ethtool_sfeatures_retval_bits {
 #define AUTONEG_DISABLE		0x00
 #define AUTONEG_ENABLE		0x01
 
-/* Mode MDI or MDI-X */
-#define ETH_TP_MDI_INVALID	0x00
-#define ETH_TP_MDI		0x01
-#define ETH_TP_MDI_X		0x02
+/* MDI or MDI-X status/control - if MDI/MDI_X/AUTO is set then
+ * the driver is required to renegotiate link
+ */
+#define ETH_TP_MDI_INVALID	0x00 /* status: unknown; control: unsupported */
+#define ETH_TP_MDI		0x01 /* status: MDI;     control: force MDI */
+#define ETH_TP_MDI_X		0x02 /* status: MDI-X;   control: force MDI-X */
+#define ETH_TP_MDI_AUTO		0x03 /*                  control: auto-select */
 
 /* Wake-On-Lan options. */
 #define WAKE_PHY		(1 << 0)

^ permalink raw reply related	[flat|nested] 5+ messages in thread

* [RFC ETHTOOL PATCH 2/2] ethtool: allow setting MDI-X state
  2012-07-25 17:52 [RFC ETHTOOL PATCH 0/2] implement MDI-X set Jesse Brandeburg
  2012-07-25 17:53 ` [RFC ETHTOOL PATCH 1/2] ethtool.h: implement new MDI-X set defines Jesse Brandeburg
@ 2012-07-25 17:53 ` Jesse Brandeburg
  2012-07-25 22:59   ` Ben Hutchings
  1 sibling, 1 reply; 5+ messages in thread
From: Jesse Brandeburg @ 2012-07-25 17:53 UTC (permalink / raw)
  To: netdev, bhutchings; +Cc: jesse.brandeburg

A bit ago ethtool added support for reading MDI-X state, this
patch finishes the implementation, adding the complementary write
command.

Add support to ethtool for controlling the MDI-X (crossover)
state of a network port.  Most adapters correctly negotiate
MDI-X, but some ill-behaved switches have trouble and end up
picking the wrong MDI setting, which results in complete loss of
link.  Usually this error condition can be observed when multiple
ethtool -r ethX are required before link is achieved.

This patch allows the user to override the normal "auto" setting
and force the crossover state to on or off.

The set will fail if the driver doesn't support the get, as
suggested by Ben Hutchings.

# ./ethtool -s p1p1 mdix off
setting MDI not supported

In addition the do_gset output was changed slightly to report the
value set by the user (when the driver supports the set)

old:
MDI-X: on

new:
MDI-X: on (auto)
or
MDI-X: on (forced)

usage is ethtool -s eth0 mdix [auto|on|off]

Signed-off-by: Jesse Brandeburg <jesse.brandeburg@intel.com>
CC: Ben Hutchings <bhutchings@solarflare.com>
---

 ethtool.8.in |    8 ++++++++
 ethtool.c    |   48 +++++++++++++++++++++++++++++++++++++++++++++---
 2 files changed, 53 insertions(+), 3 deletions(-)

diff --git a/ethtool.8.in b/ethtool.8.in
index 523b737..fbfb252 100644
--- a/ethtool.8.in
+++ b/ethtool.8.in
@@ -239,6 +239,7 @@ ethtool \- query or control network driver and hardware settings
 .BI speed \ N
 .B2 duplex half full
 .B4 port tp aui bnc mii fibre
+.B3 mdix auto on off
 .B2 autoneg on off
 .BN advertise
 .BN phyad
@@ -518,6 +519,13 @@ Sets full or half duplex mode.
 .A4 port tp aui bnc mii fibre
 Selects device port.
 .TP
+.A3 mdix auto on off
+Selects MDI-X mode for port. May be used to override the automatic detection
+feature of most adapters.  Auto means automatic detection of MDI status, on
+forces MDI-X (crossover) mode, while off means MDI (straight through) mode.
+The driver should guarantee that this command takes effect immediately, and
+if necessary may reset the link to cause the change to take effect.
+.TP
 .A2 autoneg on off
 Specifies whether autonegotiation should be enabled. Autonegotiation 
 is enabled by default, but in some network devices may have trouble
diff --git a/ethtool.c b/ethtool.c
index f18f611..7b60895 100644
--- a/ethtool.c
+++ b/ethtool.c
@@ -18,6 +18,8 @@
  * Rx Network Flow Control configuration support <santwona.behera@sun.com>
  * Various features by Ben Hutchings <bhutchings@solarflare.com>;
  *	Copyright 2009, 2010 Solarflare Communications
+ * MDI-X set support by Jesse Brandeburg <jesse.brandeburg@intel.com>
+ * 	Copyright 2012 Intel Corporation
  *
  * TODO:
  *   * show settings for all devices
@@ -559,13 +561,29 @@ static int dump_ecmd(struct ethtool_cmd *ep)
 		fprintf(stdout, "	MDI-X: ");
 		switch (ep->eth_tp_mdix) {
 		case ETH_TP_MDI:
-			fprintf(stdout, "off\n");
+			fprintf(stdout, "off");
 			break;
 		case ETH_TP_MDI_X:
-			fprintf(stdout, "on\n");
+			fprintf(stdout, "on");
 			break;
 		default:
-			fprintf(stdout, "Unknown\n");
+			fprintf(stdout, "Unknown");
+			break;
+		}
+		switch (ep->eth_tp_mdix_ctrl) {
+		case ETH_TP_MDI:
+		case ETH_TP_MDI_X:
+			/* forced via sset */
+			fprintf(stdout, " (forced)\n");
+			break;
+		case ETH_TP_MDI_AUTO:
+			/* not forced */
+			fprintf(stdout, " (auto)\n");
+			break;
+		case ETH_TP_MDI_INVALID:
+		default:
+			/* this interface doesn't support gset MDI-X */
+			fprintf(stdout, "\n");
 			break;
 		}
 	}
@@ -1939,6 +1957,7 @@ static int do_sset(struct cmd_context *ctx)
 	int speed_wanted = -1;
 	int duplex_wanted = -1;
 	int port_wanted = -1;
+	int mdix_wanted = -1;
 	int autoneg_wanted = -1;
 	int phyad_wanted = -1;
 	int xcvr_wanted = -1;
@@ -1999,6 +2018,19 @@ static int do_sset(struct cmd_context *ctx)
 				port_wanted = PORT_FIBRE;
 			else
 				exit_bad_args();
+		} else if (!strcmp(argp[i], "mdix")) {
+			gset_changed = 1;
+			i += 1;
+			if (i >= argc)
+				exit_bad_args();
+			if (!strcmp(argp[i], "auto"))
+				mdix_wanted = ETH_TP_MDI_AUTO;
+			else if (!strcmp(argp[i], "on"))
+				mdix_wanted = ETH_TP_MDI_X;
+			else if (!strcmp(argp[i], "off"))
+				mdix_wanted = ETH_TP_MDI;
+			else
+				exit_bad_args();
 		} else if (!strcmp(argp[i], "autoneg")) {
 			i += 1;
 			if (i >= argc)
@@ -2120,6 +2152,13 @@ static int do_sset(struct cmd_context *ctx)
 				ecmd.duplex = duplex_wanted;
 			if (port_wanted != -1)
 				ecmd.port = port_wanted;
+			if (mdix_wanted != -1) {
+				/* check driver supports MDI-X */
+				if (ecmd.eth_tp_mdix_ctrl != ETH_TP_MDI_INVALID)
+					ecmd.eth_tp_mdix_ctrl = mdix_wanted;
+				else
+					fprintf(stderr, "setting MDI not supported\n");
+			}
 			if (autoneg_wanted != -1)
 				ecmd.autoneg = autoneg_wanted;
 			if (phyad_wanted != -1)
@@ -2179,6 +2218,8 @@ static int do_sset(struct cmd_context *ctx)
 				fprintf(stderr, "  not setting phy_address\n");
 			if (xcvr_wanted != -1)
 				fprintf(stderr, "  not setting transceiver\n");
+			if (mdix_wanted != -1)
+				fprintf(stderr, "  not setting mdix\n");
 		}
 	}
 
@@ -3285,6 +3326,7 @@ static const struct option {
 	  "		[ speed %d ]\n"
 	  "		[ duplex half|full ]\n"
 	  "		[ port tp|aui|bnc|mii|fibre ]\n"
+	  "		[ mdix auto|on|off ]\n"
 	  "		[ autoneg on|off ]\n"
 	  "		[ advertise %x ]\n"
 	  "		[ phyad %d ]\n"

^ permalink raw reply related	[flat|nested] 5+ messages in thread

* Re: [RFC ETHTOOL PATCH 2/2] ethtool: allow setting MDI-X state
  2012-07-25 17:53 ` [RFC ETHTOOL PATCH 2/2] ethtool: allow setting MDI-X state Jesse Brandeburg
@ 2012-07-25 22:59   ` Ben Hutchings
       [not found]     ` <20120726163033.GA20122@jbrandeb-snb.jf.intel.com>
  0 siblings, 1 reply; 5+ messages in thread
From: Ben Hutchings @ 2012-07-25 22:59 UTC (permalink / raw)
  To: Jesse Brandeburg; +Cc: netdev

On Wed, 2012-07-25 at 10:53 -0700, Jesse Brandeburg wrote:
> A bit ago ethtool added support for reading MDI-X state, this
> patch finishes the implementation, adding the complementary write
> command.
> 
> Add support to ethtool for controlling the MDI-X (crossover)
> state of a network port.  Most adapters correctly negotiate
> MDI-X, but some ill-behaved switches have trouble and end up
> picking the wrong MDI setting, which results in complete loss of
> link.  Usually this error condition can be observed when multiple
> ethtool -r ethX are required before link is achieved.
> 
> This patch allows the user to override the normal "auto" setting
> and force the crossover state to on or off.
> 
> The set will fail if the driver doesn't support the get, as
> suggested by Ben Hutchings.
> 
> # ./ethtool -s p1p1 mdix off
> setting MDI not supported
> 
> In addition the do_gset output was changed slightly to report the
> value set by the user (when the driver supports the set)
> 
> old:
> MDI-X: on
> 
> new:
> MDI-X: on (auto)
> or
> MDI-X: on (forced)
> 
> usage is ethtool -s eth0 mdix [auto|on|off]
[...]
> --- a/ethtool.c
> +++ b/ethtool.c
> @@ -18,6 +18,8 @@
>   * Rx Network Flow Control configuration support <santwona.behera@sun.com>
>   * Various features by Ben Hutchings <bhutchings@solarflare.com>;
>   *	Copyright 2009, 2010 Solarflare Communications
> + * MDI-X set support by Jesse Brandeburg <jesse.brandeburg@intel.com>
> + * 	Copyright 2012 Intel Corporation
>   *
>   * TODO:
>   *   * show settings for all devices
> @@ -559,13 +561,29 @@ static int dump_ecmd(struct ethtool_cmd *ep)
>  		fprintf(stdout, "	MDI-X: ");
>  		switch (ep->eth_tp_mdix) {
>  		case ETH_TP_MDI:
> -			fprintf(stdout, "off\n");
> +			fprintf(stdout, "off");
>  			break;
>  		case ETH_TP_MDI_X:
> -			fprintf(stdout, "on\n");
> +			fprintf(stdout, "on");
>  			break;
>  		default:
> -			fprintf(stdout, "Unknown\n");
> +			fprintf(stdout, "Unknown");
> +			break;
> +		}
> +		switch (ep->eth_tp_mdix_ctrl) {
> +		case ETH_TP_MDI:
> +		case ETH_TP_MDI_X:
> +			/* forced via sset */
> +			fprintf(stdout, " (forced)\n");
[...]

How about when you have a forced mode but the driver reports eth_tp_mdix
= ETH_TP_MDI_INVALID because the link is down?  This is going to result
in:

        MDI-X: Unknown (forced)

which makes no sense at all.  So I think that we have to do something
like:

	if (ep->eth_tp_mdix_ctrl == ETH_TP_MDI) {
		fprintf(stdout, "off (forced)\n");
	} else if (ep->eth_tp_mdix_ctrl == ETH_TP_MDI_X) {
		fprintf(stdout, "on (forced)\n");
	} else {
		switch (ep->eth_tp_mdix) {
			...
		}
		if (ep->eth_tp_mdix_ctrl == ETH_TP_MDI_AUTO)
			fprintf(stdout, " (auto)");
		fprintf(stdout, "\n");
	}

Or else we require that when the mode is forced then drivers report that
as the current status even if the link is down.

Ben.

-- 
Ben Hutchings, Staff Engineer, Solarflare
Not speaking for my employer; that's the marketing department's job.
They asked us to note that Solarflare product names are trademarked.

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [RFC ETHTOOL PATCH 2/2] ethtool: allow setting MDI-X state
       [not found]     ` <20120726163033.GA20122@jbrandeb-snb.jf.intel.com>
@ 2012-07-26 16:35       ` Ben Hutchings
  0 siblings, 0 replies; 5+ messages in thread
From: Ben Hutchings @ 2012-07-26 16:35 UTC (permalink / raw)
  To: Jesse Brandeburg; +Cc: netdev

On Thu, 2012-07-26 at 09:30 -0700, Jesse Brandeburg wrote:
> On Wed, Jul 25, 2012 at 11:59:02PM +0100, Ben Hutchings wrote:
> > On Wed, 2012-07-25 at 10:53 -0700, Jesse Brandeburg wrote:
> > How about when you have a forced mode but the driver reports eth_tp_mdix
> > = ETH_TP_MDI_INVALID because the link is down?  This is going to result
> > in:
> > 
> >         MDI-X: Unknown (forced)
> > 
> > which makes no sense at all.  So I think that we have to do something
> > like:
> > 
> > 	if (ep->eth_tp_mdix_ctrl == ETH_TP_MDI) {
> > 		fprintf(stdout, "off (forced)\n");
> > 	} else if (ep->eth_tp_mdix_ctrl == ETH_TP_MDI_X) {
> > 		fprintf(stdout, "on (forced)\n");
> > 	} else {
> > 		switch (ep->eth_tp_mdix) {
> > 			...
> > 		}
> > 		if (ep->eth_tp_mdix_ctrl == ETH_TP_MDI_AUTO)
> > 			fprintf(stdout, " (auto)");
> > 		fprintf(stdout, "\n");
> > 	}
> > 
> > Or else we require that when the mode is forced then drivers report that
> > as the current status even if the link is down.
> 
> I tried that and it works swimmingly.  How does this look?
[...]

That looks good, thanks.

Ben.

-- 
Ben Hutchings, Staff Engineer, Solarflare
Not speaking for my employer; that's the marketing department's job.
They asked us to note that Solarflare product names are trademarked.

^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2012-07-26 16:35 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2012-07-25 17:52 [RFC ETHTOOL PATCH 0/2] implement MDI-X set Jesse Brandeburg
2012-07-25 17:53 ` [RFC ETHTOOL PATCH 1/2] ethtool.h: implement new MDI-X set defines Jesse Brandeburg
2012-07-25 17:53 ` [RFC ETHTOOL PATCH 2/2] ethtool: allow setting MDI-X state Jesse Brandeburg
2012-07-25 22:59   ` Ben Hutchings
     [not found]     ` <20120726163033.GA20122@jbrandeb-snb.jf.intel.com>
2012-07-26 16:35       ` Ben Hutchings

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.