[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-Id: <1512507203-17693-4-git-send-email-scott.branden@broadcom.com>
Date: Tue, 5 Dec 2017 12:53:23 -0800
From: Scott Branden <scott.branden@...adcom.com>
To: "John W. Linville" <linville@...driver.com>
Cc: BCM Kernel Feedback <bcm-kernel-feedback-list@...adcom.com>,
Steve Lin <steven.lin1@...adcom.com>,
Michael Chan <michael.chan@...adcom.com>,
netdev@...r.kernel.org, Paul Greenwalt <paul.greenwalt@...el.com>,
Stephen Hemminger <shemminger@...tta.com>,
Scott Branden <scott.branden@...adcom.com>
Subject: [PATCH v2 3/3] ethtool: Add ETHTOOL_RESET support via --reset command
Add ETHTOOL_RESET support via --reset command.
ie. ethtool --reset DEVNAME <flagname(s)>
flagnames currently match the ETH_RESET_xxx names:
mgmt,irq,dma,filter,offload,mac,phy,ram,dedicated,all
Alternatively, you can specific component bitfield directly using
ethtool --reset DEVNAME flags %x
Signed-off-by: Scott Branden <scott.branden@...adcom.com>
---
ethtool.8.in | 58 +++++++++++++++++++++++++++++++++++++++++++++-
ethtool.c | 75 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 132 insertions(+), 1 deletion(-)
diff --git a/ethtool.8.in b/ethtool.8.in
index 90ead41..e77ecd3 100644
--- a/ethtool.8.in
+++ b/ethtool.8.in
@@ -354,6 +354,21 @@ ethtool \- query or control network driver and hardware settings
.B ethtool \-\-get\-phy\-tunable
.I devname
.RB [ downshift ]
+.HP
+.B ethtool \-\-reset
+.I devname
+.BN flags
+.RB [ mgmt ]
+.RB [ irq ]
+.RB [ dma ]
+.RB [ filter ]
+.RB [ offload ]
+.RB [ mac ]
+.RB [ phy ]
+.RB [ ram ]
+.RB [ ap ]
+.RB [ dedicated ]
+.RB [ all ]
.
.\" Adjust lines (i.e. full justification) and hyphenate.
.ad
@@ -1006,6 +1021,46 @@ Downshift is useful where cable does not have the 4 pairs instance.
Gets the PHY downshift count/status.
.RE
+.TP
+.B \-\-reset
+Reset hardware components specified by flags and components listed below
+.RS 4
+.TP
+.BI flags \ N
+Resets the components based on direct flags mask
+.TP
+.B mgmt
+Management processor
+.TP
+.B irq
+Interrupt requester
+.TP
+.B dma
+DMA engine
+.TP
+.B filter
+Filtering/flow direction
+.TP
+.B offload
+Protocol offload
+.TP
+.B mac
+Media access controller
+.TP
+.B phy
+Transceiver/PHY
+.TP
+.B ram
+RAM shared between multiple components
+.B ap
+Application Processor
+.TP
+.B dedicated
+All components dedicated to this interface
+.TP
+.B all
+All components used by this interface, even if shared
+.RE
.SH BUGS
Not supported (in part or whole) on all network drivers.
.SH AUTHOR
@@ -1023,7 +1078,8 @@ Andi Kleen,
Alexander Duyck,
Sucheta Chakraborty,
Jesse Brandeburg,
-Ben Hutchings.
+Ben Hutchings,
+Scott Branden.
.SH AVAILABILITY
.B ethtool
is available from
diff --git a/ethtool.c b/ethtool.c
index c89b660..5bcf5d2 100644
--- a/ethtool.c
+++ b/ethtool.c
@@ -4636,6 +4636,68 @@ static int do_get_phy_tunable(struct cmd_context *ctx)
return err;
}
+static int do_reset(struct cmd_context *ctx)
+{
+ struct ethtool_value resetinfo;
+ int argc = ctx->argc;
+ char **argp = ctx->argp;
+ int i;
+
+ if (argc == 0)
+ exit_bad_args();
+
+ resetinfo.data = 0;
+
+ for (i = 0; i < argc; i++) {
+ if (!strcmp(argp[i], "flags")) {
+ __u32 flags;
+
+ i++;
+ if (i >= argc)
+ exit_bad_args();
+ flags = strtoul(argp[i], NULL, 0);
+ if (flags == 0)
+ exit_bad_args();
+ else
+ resetinfo.data |= flags;
+ } else if (!strcmp(argp[i], "mgmt")) {
+ resetinfo.data |= ETH_RESET_MGMT;
+ } else if (!strcmp(argp[i], "irq")) {
+ resetinfo.data |= ETH_RESET_IRQ;
+ } else if (!strcmp(argp[i], "dma")) {
+ resetinfo.data |= ETH_RESET_DMA;
+ } else if (!strcmp(argp[i], "filter")) {
+ resetinfo.data |= ETH_RESET_FILTER;
+ } else if (!strcmp(argp[i], "offload")) {
+ resetinfo.data |= ETH_RESET_OFFLOAD;
+ } else if (!strcmp(argp[i], "mac")) {
+ resetinfo.data |= ETH_RESET_MAC;
+ } else if (!strcmp(argp[i], "phy")) {
+ resetinfo.data |= ETH_RESET_PHY;
+ } else if (!strcmp(argp[i], "ram")) {
+ resetinfo.data |= ETH_RESET_RAM;
+ } else if (!strcmp(argp[i], "ap")) {
+ resetinfo.data |= ETH_RESET_AP;
+ } else if (!strcmp(argp[i], "dedicated")) {
+ resetinfo.data |= ETH_RESET_DEDICATED;
+ } else if (!strcmp(argp[i], "all")) {
+ resetinfo.data |= ETH_RESET_ALL;
+ } else {
+ exit_bad_args();
+ }
+ }
+
+ resetinfo.cmd = ETHTOOL_RESET;
+
+ if (send_ioctl(ctx, &resetinfo)) {
+ perror("Cannot issue RESET");
+ return 1;
+ }
+ fprintf(stdout, "RESET 0x%x issued\n", resetinfo.data);
+
+ return 0;
+}
+
static int parse_named_bool(struct cmd_context *ctx, const char *name, u8 *on)
{
if (ctx->argc < 2)
@@ -4898,6 +4960,19 @@ static const struct option {
" [ downshift on|off [count N] ]\n"},
{ "--get-phy-tunable", 1, do_get_phy_tunable, "Get PHY tunable",
" [ downshift ]\n"},
+ { "--reset", 1, do_reset, "Reset components",
+ " [ flags %x ]\n"
+ " [ mgmt ]\n"
+ " [ irq ]\n"
+ " [ dma ]\n"
+ " [ filter ]\n"
+ " [ offload ]\n"
+ " [ mac ]\n"
+ " [ phy ]\n"
+ " [ ram ]\n"
+ " [ ap ]\n"
+ " [ dedicated ]\n"
+ " [ all ]\n"},
{ "-h|--help", 0, show_usage, "Show this help" },
{ "--version", 0, do_version, "Show version number" },
{}
--
2.5.0
Powered by blists - more mailing lists