From mboxrd@z Thu Jan 1 00:00:00 1970 From: Vince Bridgers Subject: [PATCH ethtool V3] Ethtool: Add Altera Triple Speed Ethernet Support Date: Thu, 29 May 2014 12:01:08 -0500 Message-ID: <1401382868-4390-1-git-send-email-vbridgers2013@gmail.com> Cc: vbridgers2013@gmail.com To: ben@decadent.org.uk, bwh@kernel.org, netdev@vger.kernel.org Return-path: Received: from mail-pb0-f43.google.com ([209.85.160.43]:38461 "EHLO mail-pb0-f43.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1756105AbaE2RFW (ORCPT ); Thu, 29 May 2014 13:05:22 -0400 Received: by mail-pb0-f43.google.com with SMTP id up15so688657pbc.30 for ; Thu, 29 May 2014 10:05:21 -0700 (PDT) Sender: netdev-owner@vger.kernel.org List-ID: This patch adds Altera Triple Speed Ethernet support for dumping formatted register output from Ethtool. Signed-off-by: Vince Bridgers --- V2: Add version check per review comments V3: Fix space before tab --- Makefile.am | 2 +- ethtool.c | 1 + internal.h | 4 +++ tse.c | 112 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 118 insertions(+), 1 deletion(-) create mode 100644 tse.c diff --git a/Makefile.am b/Makefile.am index fd3b17f..4698d16 100644 --- a/Makefile.am +++ b/Makefile.am @@ -13,7 +13,7 @@ ethtool_SOURCES += \ fec_8xx.c ibm_emac.c ixgb.c ixgbe.c natsemi.c \ pcnet32.c realtek.c tg3.c marvell.c vioc.c \ smsc911x.c at76c50x-usb.c sfc.c stmmac.c \ - sfpid.c sfpdiag.c ixgbevf.c + sfpid.c sfpdiag.c ixgbevf.c tse.c endif TESTS = test-cmdline test-features diff --git a/ethtool.c b/ethtool.c index 8e968a8..19b8b0c 100644 --- a/ethtool.c +++ b/ethtool.c @@ -910,6 +910,7 @@ static const struct { { "st_mac100", st_mac100_dump_regs }, { "st_gmac", st_gmac_dump_regs }, { "et131x", et131x_dump_regs }, + { "altera_tse", altera_tse_dump_regs }, #endif }; diff --git a/internal.h b/internal.h index 86a64f2..a9dfae0 100644 --- a/internal.h +++ b/internal.h @@ -243,6 +243,10 @@ int st_gmac_dump_regs(struct ethtool_drvinfo *info, struct ethtool_regs *regs); /* Et131x ethernet controller */ int et131x_dump_regs(struct ethtool_drvinfo *info, struct ethtool_regs *regs); +/* Altera TSE 10/100/1000 ethernet controller */ +int altera_tse_dump_regs(struct ethtool_drvinfo *info, + struct ethtool_regs *regs); + /* Rx flow classification */ int rxclass_parse_ruleopts(struct cmd_context *ctx, struct ethtool_rx_flow_spec *fsp); diff --git a/tse.c b/tse.c new file mode 100644 index 0000000..f554dfe --- /dev/null +++ b/tse.c @@ -0,0 +1,112 @@ +/**************************************************************************** + * Support for the Altera Triple Speed Ethernet 10/100/1000 Controller + * + * Copyright (C) 2014 Altera Corporation + * + * Author: Vince Bridgers + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 as published + * by the Free Software Foundation, incorporated herein by reference. + */ + +#include +#include +#include "internal.h" + +#define ALTERA_VERSION_MASK 0xffff +#define ALTERA_ETHTOOL_V1 1 + +int +bitset(u32 val, int bit) +{ + if (val & (1 << bit)) + return 1; + return 0; +} + +int altera_tse_dump_regs(struct ethtool_drvinfo *info, + struct ethtool_regs *regs) +{ + int i; + u32 *tsereg = (unsigned int *)regs->data; + u32 version = regs->version; + + if ((version & ALTERA_VERSION_MASK) > ALTERA_ETHTOOL_V1) + return -1; + + /* + * Version 1: Initial TSE driver release. No feature information + * available, 32-bits of version is equal to 1. + * + * Version 2: Lower 16-bits of version is 2, upper 16 bits are: + * Bit 16 - SGMDA or MSGDMA Registers + * Bit 17 - PCS Present + * Bit 18 - Supplementary MAC Address Filter Registers Present + * Bit 19 - Multicast Hash Filter Present + * Bit 20 - IEEE 1588 Feature Present + */ + fprintf(stdout, "Altera TSE 10/100/1000 Registers, Version %d\n", + version); + fprintf(stdout, "---------------------------------------------\n"); + fprintf(stdout, "Revision 0x%08X\n", tsereg[0]); + fprintf(stdout, " Core Version %d.%d\n", + (tsereg[0] & 0xffff) >> 8, + tsereg[0] & 0xff); + fprintf(stdout, " CustVersion 0x%08X\n", tsereg[0] >> 16); + fprintf(stdout, "Scratch 0x%08X\n", tsereg[1]); + fprintf(stdout, "Command/Config 0x%08X\n", tsereg[2]); + fprintf(stdout, " (0)TX_EN %d\n", bitset(tsereg[2], 0)); + fprintf(stdout, " (1)RX_EN %d\n", bitset(tsereg[2], 1)); + fprintf(stdout, " (2)XON_GEN %d\n", bitset(tsereg[2], 2)); + fprintf(stdout, " (3)ETH_SPEED %d\n", bitset(tsereg[2], 3)); + fprintf(stdout, " (4)PROMIS_EN %d\n", bitset(tsereg[2], 4)); + fprintf(stdout, " (5)PAD_EN %d\n", bitset(tsereg[2], 5)); + fprintf(stdout, " (6)CRC_FWD %d\n", bitset(tsereg[2], 6)); + fprintf(stdout, " (7)PAUSE_FWD %d\n", bitset(tsereg[2], 7)); + fprintf(stdout, " (8)PAUSE_IGN %d\n", bitset(tsereg[2], 8)); + fprintf(stdout, " (9)TXADDR_INS %d\n", bitset(tsereg[2], 9)); + fprintf(stdout, " (10)HD_EN %d\n", bitset(tsereg[2], 10)); + fprintf(stdout, " (11)EXCESS_COL %d\n", bitset(tsereg[2], 11)); + fprintf(stdout, " (12)LATE_COL %d\n", bitset(tsereg[2], 12)); + fprintf(stdout, " (13)SW_RESET %d\n", bitset(tsereg[2], 13)); + fprintf(stdout, " (14)MHASH_SEL %d\n", bitset(tsereg[2], 14)); + fprintf(stdout, " (15)LOOP_EN %d\n", bitset(tsereg[2], 15)); + fprintf(stdout, " (16-18)TX_ADDR_SEL %d\n", + (tsereg[2] & 0x30000) >> 16); + fprintf(stdout, " (19)MAGIC_EN %d\n", bitset(tsereg[2], 19)); + fprintf(stdout, " (20)SLEEP %d\n", bitset(tsereg[2], 20)); + fprintf(stdout, " (21)WAKEUP %d\n", bitset(tsereg[2], 21)); + fprintf(stdout, " (22)XOFF_GEN %d\n", bitset(tsereg[2], 22)); + fprintf(stdout, " (23)CTRL_FRAME_EN %d\n", bitset(tsereg[2], 23)); + fprintf(stdout, " (24)NO_LEN_CHECK %d\n", bitset(tsereg[2], 24)); + fprintf(stdout, " (25)ENA_10 %d\n", bitset(tsereg[2], 25)); + fprintf(stdout, " (26)RX_ERR_DISC %d\n", bitset(tsereg[2], 26)); + fprintf(stdout, " (31)CTRL_RESET %d\n", bitset(tsereg[2], 31)); + fprintf(stdout, "mac_0 0x%08X\n", tsereg[3]); + fprintf(stdout, "mac_1 0x%08X\n", tsereg[4]); + fprintf(stdout, "frm_length 0x%08X\n", tsereg[5]); + fprintf(stdout, "pause_quant 0x%08X\n", tsereg[6]); + fprintf(stdout, "rx_section_empty 0x%08X\n", tsereg[7]); + fprintf(stdout, "rx_section_full 0x%08X\n", tsereg[8]); + fprintf(stdout, "tx_section_empty 0x%08X\n", tsereg[9]); + fprintf(stdout, "tx_section_full 0x%08X\n", tsereg[0xa]); + fprintf(stdout, "rx_almost_empty 0x%08X\n", tsereg[0xb]); + fprintf(stdout, "rx_almost_full 0x%08X\n", tsereg[0xc]); + fprintf(stdout, "tx_almost_empty 0x%08X\n", tsereg[0xd]); + fprintf(stdout, "tx_almost_full 0x%08X\n", tsereg[0xe]); + fprintf(stdout, "mdio_addr0 0x%08X\n", tsereg[0xf]); + fprintf(stdout, "mdio_addr1 0x%08X\n", tsereg[0x10]); + fprintf(stdout, "holdoff_quant 0x%08X\n", tsereg[0x11]); + + fprintf(stdout, "tx_ipg_length 0x%08X\n", tsereg[0x17]); + fprintf(stdout, "Transmit Command 0x%08X\n", tsereg[0x3a]); + fprintf(stdout, "Receive Command 0x%08X\n", tsereg[0x3b]); + + for (i = 0; i < 64; i++) + fprintf(stdout, "Multicast Hash[%02d] 0x%08X\n", + i, + tsereg[0x40 + i]); + return 0; +} + -- 1.7.9.5