/**************************************************************************** * 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 maybe_unused, 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; }