diff options
-rw-r--r-- | ethtool.8.in | 8 | ||||
-rw-r--r-- | ethtool.c | 55 |
2 files changed, 53 insertions, 10 deletions
diff --git a/ethtool.8.in b/ethtool.8.in index 7253832..3208d38 100644 --- a/ethtool.8.in +++ b/ethtool.8.in @@ -229,6 +229,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 @@ -521,6 +522,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 @@ -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 @@ -602,16 +604,25 @@ static int dump_ecmd(struct ethtool_cmd *ep) if (ep->port == PORT_TP) { fprintf(stdout, " MDI-X: "); - switch (ep->eth_tp_mdix) { - case ETH_TP_MDI: - fprintf(stdout, "off\n"); - break; - case ETH_TP_MDI_X: - fprintf(stdout, "on\n"); - break; - default: - fprintf(stdout, "Unknown\n"); - break; + 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) { + case ETH_TP_MDI: + fprintf(stdout, "off"); + break; + case ETH_TP_MDI_X: + fprintf(stdout, "on"); + break; + default: + fprintf(stdout, "Unknown"); + break; + } + if (ep->eth_tp_mdix_ctrl == ETH_TP_MDI_AUTO) + fprintf(stdout, " (auto)"); + fprintf(stdout, "\n"); } } @@ -2199,6 +2210,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; @@ -2259,6 +2271,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) @@ -2380,6 +2405,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) @@ -2439,6 +2471,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"); } } @@ -3604,6 +3638,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" |