147dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro/*******************************************************************************
247dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro  STMMAC Ethtool support
347dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro
447dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro  Copyright (C) 2007-2009  STMicroelectronics Ltd
547dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro
647dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro  This program is free software; you can redistribute it and/or modify it
747dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro  under the terms and conditions of the GNU General Public License,
847dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro  version 2, as published by the Free Software Foundation.
947dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro
1047dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro  This program is distributed in the hope it will be useful, but WITHOUT
1147dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
1247dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro  FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
1347dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro  more details.
1447dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro
1547dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro  You should have received a copy of the GNU General Public License along with
1647dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro  this program; if not, write to the Free Software Foundation, Inc.,
1747dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro  51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
1847dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro
1947dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro  The full GNU General Public License is included in this distribution in
2047dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro  the file called "COPYING".
2147dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro
2247dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro  Author: Giuseppe Cavallaro <peppe.cavallaro@st.com>
2347dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro*******************************************************************************/
2447dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro
2547dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro#include <linux/etherdevice.h>
2647dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro#include <linux/ethtool.h>
27a6b7a407865aab9f849dd99a71072b7cd1175116Alexey Dobriyan#include <linux/interrupt.h>
2847dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro#include <linux/mii.h>
2947dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro#include <linux/phy.h>
30b7f080cfe223b3b7424872639d153695615a9255Alexey Dobriyan#include <asm/io.h>
3147dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro
3247dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro#include "stmmac.h"
33aec7ff278145280c2c78377aeb98feed02c8b636Giuseppe CAVALLARO#include "dwmac_dma.h"
3447dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro
3547dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro#define REG_SPACE_SIZE	0x1054
3647dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro#define MAC100_ETHTOOL_NAME	"st_mac100"
3747dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro#define GMAC_ETHTOOL_NAME	"st_gmac"
3847dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro
3947dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallarostruct stmmac_stats {
4047dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro	char stat_string[ETH_GSTRING_LEN];
4147dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro	int sizeof_stat;
4247dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro	int stat_offset;
4347dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro};
4447dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro
4547dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro#define STMMAC_STAT(m)	\
4647dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro	{ #m, FIELD_SIZEOF(struct stmmac_extra_stats, m),	\
4747dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro	offsetof(struct stmmac_priv, xstats.m)}
4847dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro
491c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLAROstatic const struct stmmac_stats stmmac_gstrings_stats[] = {
501cc5a735185a963ed9324a65e1f2db02bf52c0d4Giuseppe CAVALLARO	/* Transmit errors */
5147dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro	STMMAC_STAT(tx_underflow),
5247dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro	STMMAC_STAT(tx_carrier),
5347dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro	STMMAC_STAT(tx_losscarrier),
543c20f72f9108b2fcf30ec63d8a4203736c01ccd0Giuseppe CAVALLARO	STMMAC_STAT(vlan_tag),
5547dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro	STMMAC_STAT(tx_deferred),
5647dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro	STMMAC_STAT(tx_vlan),
5747dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro	STMMAC_STAT(tx_jabber),
5847dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro	STMMAC_STAT(tx_frame_flushed),
5947dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro	STMMAC_STAT(tx_payload_error),
6047dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro	STMMAC_STAT(tx_ip_header_error),
611cc5a735185a963ed9324a65e1f2db02bf52c0d4Giuseppe CAVALLARO	/* Receive errors */
6247dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro	STMMAC_STAT(rx_desc),
633c20f72f9108b2fcf30ec63d8a4203736c01ccd0Giuseppe CAVALLARO	STMMAC_STAT(sa_filter_fail),
643c20f72f9108b2fcf30ec63d8a4203736c01ccd0Giuseppe CAVALLARO	STMMAC_STAT(overflow_error),
653c20f72f9108b2fcf30ec63d8a4203736c01ccd0Giuseppe CAVALLARO	STMMAC_STAT(ipc_csum_error),
6647dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro	STMMAC_STAT(rx_collision),
6747dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro	STMMAC_STAT(rx_crc),
681cc5a735185a963ed9324a65e1f2db02bf52c0d4Giuseppe CAVALLARO	STMMAC_STAT(dribbling_bit),
691b924032533033a4dae1a239981677bdae21949bGiuseppe Cavallaro	STMMAC_STAT(rx_length),
7047dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro	STMMAC_STAT(rx_mii),
7147dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro	STMMAC_STAT(rx_multicast),
7247dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro	STMMAC_STAT(rx_gmac_overflow),
7347dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro	STMMAC_STAT(rx_watchdog),
7447dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro	STMMAC_STAT(da_rx_filter_fail),
7547dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro	STMMAC_STAT(sa_rx_filter_fail),
7647dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro	STMMAC_STAT(rx_missed_cntr),
7747dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro	STMMAC_STAT(rx_overflow_cntr),
781cc5a735185a963ed9324a65e1f2db02bf52c0d4Giuseppe CAVALLARO	STMMAC_STAT(rx_vlan),
791cc5a735185a963ed9324a65e1f2db02bf52c0d4Giuseppe CAVALLARO	/* Tx/Rx IRQ errors */
8047dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro	STMMAC_STAT(tx_undeflow_irq),
8147dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro	STMMAC_STAT(tx_process_stopped_irq),
8247dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro	STMMAC_STAT(tx_jabber_irq),
8347dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro	STMMAC_STAT(rx_overflow_irq),
8447dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro	STMMAC_STAT(rx_buf_unav_irq),
8547dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro	STMMAC_STAT(rx_process_stopped_irq),
8647dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro	STMMAC_STAT(rx_watchdog_irq),
8747dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro	STMMAC_STAT(tx_early_irq),
8847dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro	STMMAC_STAT(fatal_bus_error_irq),
891cc5a735185a963ed9324a65e1f2db02bf52c0d4Giuseppe CAVALLARO	/* Extra info */
9047dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro	STMMAC_STAT(threshold),
9147dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro	STMMAC_STAT(tx_pkt_n),
9247dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro	STMMAC_STAT(rx_pkt_n),
9347dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro	STMMAC_STAT(poll_n),
9447dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro	STMMAC_STAT(sched_timer_n),
9547dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro	STMMAC_STAT(normal_irq_n),
9647dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro};
9747dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro#define STMMAC_STATS_LEN ARRAY_SIZE(stmmac_gstrings_stats)
9847dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro
991c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO/* HW MAC Management counters (if supported) */
1001c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO#define STMMAC_MMC_STAT(m)	\
1011c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO	{ #m, FIELD_SIZEOF(struct stmmac_counters, m),	\
1021c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO	offsetof(struct stmmac_priv, mmc.m)}
1031c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO
10438fe7a93fc734357c4811f1c710b1906a87d315cGiuseppe CAVALLAROstatic const struct stmmac_stats stmmac_mmc[] = {
1051c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO	STMMAC_MMC_STAT(mmc_tx_octetcount_gb),
1061c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO	STMMAC_MMC_STAT(mmc_tx_framecount_gb),
1071c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO	STMMAC_MMC_STAT(mmc_tx_broadcastframe_g),
1081c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO	STMMAC_MMC_STAT(mmc_tx_multicastframe_g),
1091c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO	STMMAC_MMC_STAT(mmc_tx_64_octets_gb),
1101c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO	STMMAC_MMC_STAT(mmc_tx_65_to_127_octets_gb),
1111c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO	STMMAC_MMC_STAT(mmc_tx_128_to_255_octets_gb),
1121c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO	STMMAC_MMC_STAT(mmc_tx_256_to_511_octets_gb),
1131c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO	STMMAC_MMC_STAT(mmc_tx_512_to_1023_octets_gb),
1141c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO	STMMAC_MMC_STAT(mmc_tx_1024_to_max_octets_gb),
1151c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO	STMMAC_MMC_STAT(mmc_tx_unicast_gb),
1161c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO	STMMAC_MMC_STAT(mmc_tx_multicast_gb),
1171c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO	STMMAC_MMC_STAT(mmc_tx_broadcast_gb),
1181c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO	STMMAC_MMC_STAT(mmc_tx_underflow_error),
1191c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO	STMMAC_MMC_STAT(mmc_tx_singlecol_g),
1201c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO	STMMAC_MMC_STAT(mmc_tx_multicol_g),
1211c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO	STMMAC_MMC_STAT(mmc_tx_deferred),
1221c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO	STMMAC_MMC_STAT(mmc_tx_latecol),
1231c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO	STMMAC_MMC_STAT(mmc_tx_exesscol),
1241c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO	STMMAC_MMC_STAT(mmc_tx_carrier_error),
1251c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO	STMMAC_MMC_STAT(mmc_tx_octetcount_g),
1261c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO	STMMAC_MMC_STAT(mmc_tx_framecount_g),
1271c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO	STMMAC_MMC_STAT(mmc_tx_excessdef),
1281c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO	STMMAC_MMC_STAT(mmc_tx_pause_frame),
1291c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO	STMMAC_MMC_STAT(mmc_tx_vlan_frame_g),
1301c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO	STMMAC_MMC_STAT(mmc_rx_framecount_gb),
1311c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO	STMMAC_MMC_STAT(mmc_rx_octetcount_gb),
1321c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO	STMMAC_MMC_STAT(mmc_rx_octetcount_g),
1331c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO	STMMAC_MMC_STAT(mmc_rx_broadcastframe_g),
1341c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO	STMMAC_MMC_STAT(mmc_rx_multicastframe_g),
1351c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO	STMMAC_MMC_STAT(mmc_rx_crc_errror),
1361c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO	STMMAC_MMC_STAT(mmc_rx_align_error),
1371c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO	STMMAC_MMC_STAT(mmc_rx_run_error),
1381c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO	STMMAC_MMC_STAT(mmc_rx_jabber_error),
1391c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO	STMMAC_MMC_STAT(mmc_rx_undersize_g),
1401c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO	STMMAC_MMC_STAT(mmc_rx_oversize_g),
1411c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO	STMMAC_MMC_STAT(mmc_rx_64_octets_gb),
1421c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO	STMMAC_MMC_STAT(mmc_rx_65_to_127_octets_gb),
1431c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO	STMMAC_MMC_STAT(mmc_rx_128_to_255_octets_gb),
1441c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO	STMMAC_MMC_STAT(mmc_rx_256_to_511_octets_gb),
1451c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO	STMMAC_MMC_STAT(mmc_rx_512_to_1023_octets_gb),
1461c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO	STMMAC_MMC_STAT(mmc_rx_1024_to_max_octets_gb),
1471c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO	STMMAC_MMC_STAT(mmc_rx_unicast_g),
1481c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO	STMMAC_MMC_STAT(mmc_rx_length_error),
1491c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO	STMMAC_MMC_STAT(mmc_rx_autofrangetype),
1501c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO	STMMAC_MMC_STAT(mmc_rx_pause_frames),
1511c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO	STMMAC_MMC_STAT(mmc_rx_fifo_overflow),
1521c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO	STMMAC_MMC_STAT(mmc_rx_vlan_frames_gb),
1531c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO	STMMAC_MMC_STAT(mmc_rx_watchdog_error),
1541c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO	STMMAC_MMC_STAT(mmc_rx_ipc_intr_mask),
1551c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO	STMMAC_MMC_STAT(mmc_rx_ipc_intr),
1561c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO	STMMAC_MMC_STAT(mmc_rx_ipv4_gd),
1571c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO	STMMAC_MMC_STAT(mmc_rx_ipv4_hderr),
1581c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO	STMMAC_MMC_STAT(mmc_rx_ipv4_nopay),
1591c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO	STMMAC_MMC_STAT(mmc_rx_ipv4_frag),
1601c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO	STMMAC_MMC_STAT(mmc_rx_ipv4_udsbl),
1611c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO	STMMAC_MMC_STAT(mmc_rx_ipv4_gd_octets),
1621c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO	STMMAC_MMC_STAT(mmc_rx_ipv4_hderr_octets),
1631c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO	STMMAC_MMC_STAT(mmc_rx_ipv4_nopay_octets),
1641c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO	STMMAC_MMC_STAT(mmc_rx_ipv4_frag_octets),
1651c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO	STMMAC_MMC_STAT(mmc_rx_ipv4_udsbl_octets),
1661c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO	STMMAC_MMC_STAT(mmc_rx_ipv6_gd_octets),
1671c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO	STMMAC_MMC_STAT(mmc_rx_ipv6_hderr_octets),
1681c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO	STMMAC_MMC_STAT(mmc_rx_ipv6_nopay_octets),
1691c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO	STMMAC_MMC_STAT(mmc_rx_ipv6_gd),
1701c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO	STMMAC_MMC_STAT(mmc_rx_ipv6_hderr),
1711c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO	STMMAC_MMC_STAT(mmc_rx_ipv6_nopay),
1721c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO	STMMAC_MMC_STAT(mmc_rx_udp_gd),
1731c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO	STMMAC_MMC_STAT(mmc_rx_udp_err),
1741c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO	STMMAC_MMC_STAT(mmc_rx_tcp_gd),
1751c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO	STMMAC_MMC_STAT(mmc_rx_tcp_err),
1761c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO	STMMAC_MMC_STAT(mmc_rx_icmp_gd),
1771c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO	STMMAC_MMC_STAT(mmc_rx_icmp_err),
1781c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO	STMMAC_MMC_STAT(mmc_rx_udp_gd_octets),
1791c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO	STMMAC_MMC_STAT(mmc_rx_udp_err_octets),
1801c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO	STMMAC_MMC_STAT(mmc_rx_tcp_gd_octets),
1811c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO	STMMAC_MMC_STAT(mmc_rx_tcp_err_octets),
1821c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO	STMMAC_MMC_STAT(mmc_rx_icmp_gd_octets),
1831c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO	STMMAC_MMC_STAT(mmc_rx_icmp_err_octets),
1841c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO};
18538fe7a93fc734357c4811f1c710b1906a87d315cGiuseppe CAVALLARO#define STMMAC_MMC_STATS_LEN ARRAY_SIZE(stmmac_mmc)
1861c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO
1878ee17ae68c0f1e281a432a4318fa2511e25c9492stephen hemmingerstatic void stmmac_ethtool_getdrvinfo(struct net_device *dev,
1888ee17ae68c0f1e281a432a4318fa2511e25c9492stephen hemminger				      struct ethtool_drvinfo *info)
18947dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro{
19047dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro	struct stmmac_priv *priv = netdev_priv(dev);
19147dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro
1921c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO	if (priv->plat->has_gmac)
19333a5ba144e3e7ffc1cd4a1d205e99c16078885bfRick Jones		strlcpy(info->driver, GMAC_ETHTOOL_NAME, sizeof(info->driver));
1941c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO	else
19533a5ba144e3e7ffc1cd4a1d205e99c16078885bfRick Jones		strlcpy(info->driver, MAC100_ETHTOOL_NAME,
19633a5ba144e3e7ffc1cd4a1d205e99c16078885bfRick Jones			sizeof(info->driver));
19747dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro
19847dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro	strcpy(info->version, DRV_MODULE_VERSION);
19947dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro	info->fw_version[0] = '\0';
20047dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro}
20147dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro
2028ee17ae68c0f1e281a432a4318fa2511e25c9492stephen hemmingerstatic int stmmac_ethtool_getsettings(struct net_device *dev,
2038ee17ae68c0f1e281a432a4318fa2511e25c9492stephen hemminger				      struct ethtool_cmd *cmd)
20447dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro{
20547dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro	struct stmmac_priv *priv = netdev_priv(dev);
20647dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro	struct phy_device *phy = priv->phydev;
20747dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro	int rc;
20847dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro	if (phy == NULL) {
20947dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro		pr_err("%s: %s: PHY is not registered\n",
21047dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro		       __func__, dev->name);
21147dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro		return -ENODEV;
21247dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro	}
21347dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro	if (!netif_running(dev)) {
21447dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro		pr_err("%s: interface is disabled: we cannot track "
21547dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro		"link speed / duplex setting\n", dev->name);
21647dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro		return -EBUSY;
21747dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro	}
21847dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro	cmd->transceiver = XCVR_INTERNAL;
21947dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro	spin_lock_irq(&priv->lock);
22047dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro	rc = phy_ethtool_gset(phy, cmd);
22147dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro	spin_unlock_irq(&priv->lock);
22247dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro	return rc;
22347dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro}
22447dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro
2258ee17ae68c0f1e281a432a4318fa2511e25c9492stephen hemmingerstatic int stmmac_ethtool_setsettings(struct net_device *dev,
2268ee17ae68c0f1e281a432a4318fa2511e25c9492stephen hemminger				      struct ethtool_cmd *cmd)
22747dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro{
22847dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro	struct stmmac_priv *priv = netdev_priv(dev);
22947dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro	struct phy_device *phy = priv->phydev;
23047dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro	int rc;
23147dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro
23247dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro	spin_lock(&priv->lock);
23347dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro	rc = phy_ethtool_sset(phy, cmd);
23447dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro	spin_unlock(&priv->lock);
23547dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro
23647dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro	return rc;
23747dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro}
23847dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro
2398ee17ae68c0f1e281a432a4318fa2511e25c9492stephen hemmingerstatic u32 stmmac_ethtool_getmsglevel(struct net_device *dev)
24047dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro{
24147dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro	struct stmmac_priv *priv = netdev_priv(dev);
24247dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro	return priv->msg_enable;
24347dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro}
24447dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro
2458ee17ae68c0f1e281a432a4318fa2511e25c9492stephen hemmingerstatic void stmmac_ethtool_setmsglevel(struct net_device *dev, u32 level)
24647dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro{
24747dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro	struct stmmac_priv *priv = netdev_priv(dev);
24847dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro	priv->msg_enable = level;
24947dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro
25047dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro}
25147dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro
2528ee17ae68c0f1e281a432a4318fa2511e25c9492stephen hemmingerstatic int stmmac_check_if_running(struct net_device *dev)
25347dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro{
25447dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro	if (!netif_running(dev))
25547dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro		return -EBUSY;
25647dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro	return 0;
25747dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro}
25847dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro
2598ee17ae68c0f1e281a432a4318fa2511e25c9492stephen hemmingerstatic int stmmac_ethtool_get_regs_len(struct net_device *dev)
26047dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro{
26147dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro	return REG_SPACE_SIZE;
26247dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro}
26347dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro
2648ee17ae68c0f1e281a432a4318fa2511e25c9492stephen hemmingerstatic void stmmac_ethtool_gregs(struct net_device *dev,
26547dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro			  struct ethtool_regs *regs, void *space)
26647dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro{
26747dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro	int i;
26847dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro	u32 *reg_space = (u32 *) space;
26947dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro
27047dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro	struct stmmac_priv *priv = netdev_priv(dev);
27147dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro
27247dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro	memset(reg_space, 0x0, REG_SPACE_SIZE);
27347dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro
2749dfeb4d953f914bd3bb56ce60e22ee84687399ceGiuseppe CAVALLARO	if (!priv->plat->has_gmac) {
27547dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro		/* MAC registers */
27647dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro		for (i = 0; i < 12; i++)
277ad01b7d480a4a135f974afd5c617c417e0b0542fGiuseppe CAVALLARO			reg_space[i] = readl(priv->ioaddr + (i * 4));
27847dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro		/* DMA registers */
27947dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro		for (i = 0; i < 9; i++)
28047dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro			reg_space[i + 12] =
281ad01b7d480a4a135f974afd5c617c417e0b0542fGiuseppe CAVALLARO			    readl(priv->ioaddr + (DMA_BUS_MODE + (i * 4)));
282ad01b7d480a4a135f974afd5c617c417e0b0542fGiuseppe CAVALLARO		reg_space[22] = readl(priv->ioaddr + DMA_CUR_TX_BUF_ADDR);
283ad01b7d480a4a135f974afd5c617c417e0b0542fGiuseppe CAVALLARO		reg_space[23] = readl(priv->ioaddr + DMA_CUR_RX_BUF_ADDR);
28447dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro	} else {
28547dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro		/* MAC registers */
28647dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro		for (i = 0; i < 55; i++)
287ad01b7d480a4a135f974afd5c617c417e0b0542fGiuseppe CAVALLARO			reg_space[i] = readl(priv->ioaddr + (i * 4));
28847dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro		/* DMA registers */
28947dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro		for (i = 0; i < 22; i++)
29047dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro			reg_space[i + 55] =
291ad01b7d480a4a135f974afd5c617c417e0b0542fGiuseppe CAVALLARO			    readl(priv->ioaddr + (DMA_BUS_MODE + (i * 4)));
29247dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro	}
29347dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro}
29447dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro
29547dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallarostatic void
29647dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallarostmmac_get_pauseparam(struct net_device *netdev,
29747dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro		      struct ethtool_pauseparam *pause)
29847dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro{
29947dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro	struct stmmac_priv *priv = netdev_priv(netdev);
30047dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro
30147dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro	spin_lock(&priv->lock);
30247dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro
30347dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro	pause->rx_pause = 0;
30447dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro	pause->tx_pause = 0;
30547dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro	pause->autoneg = priv->phydev->autoneg;
30647dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro
30747dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro	if (priv->flow_ctrl & FLOW_RX)
30847dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro		pause->rx_pause = 1;
30947dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro	if (priv->flow_ctrl & FLOW_TX)
31047dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro		pause->tx_pause = 1;
31147dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro
31247dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro	spin_unlock(&priv->lock);
31347dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro}
31447dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro
31547dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallarostatic int
31647dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallarostmmac_set_pauseparam(struct net_device *netdev,
31747dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro		      struct ethtool_pauseparam *pause)
31847dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro{
31947dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro	struct stmmac_priv *priv = netdev_priv(netdev);
32047dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro	struct phy_device *phy = priv->phydev;
32147dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro	int new_pause = FLOW_OFF;
32247dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro	int ret = 0;
32347dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro
32447dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro	spin_lock(&priv->lock);
32547dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro
32647dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro	if (pause->rx_pause)
32747dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro		new_pause |= FLOW_RX;
32847dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro	if (pause->tx_pause)
32947dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro		new_pause |= FLOW_TX;
33047dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro
33147dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro	priv->flow_ctrl = new_pause;
33264c7f304b81a9a92dc7046c97a10427a5997dc07Giuseppe CAVALLARO	phy->autoneg = pause->autoneg;
33347dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro
33447dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro	if (phy->autoneg) {
3351334cb60826377de8f75adb9902c25302222f4feDavid Decotigny		if (netif_running(netdev))
3361334cb60826377de8f75adb9902c25302222f4feDavid Decotigny			ret = phy_start_aneg(phy);
337ad01b7d480a4a135f974afd5c617c417e0b0542fGiuseppe CAVALLARO	} else
338ad01b7d480a4a135f974afd5c617c417e0b0542fGiuseppe CAVALLARO		priv->hw->mac->flow_ctrl(priv->ioaddr, phy->duplex,
339db98a0b001df79ffcdd4f231c3516411786a1113Giuseppe CAVALLARO					 priv->flow_ctrl, priv->pause);
34047dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro	spin_unlock(&priv->lock);
34147dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro	return ret;
34247dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro}
34347dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro
34447dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallarostatic void stmmac_get_ethtool_stats(struct net_device *dev,
34547dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro				 struct ethtool_stats *dummy, u64 *data)
34647dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro{
34747dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro	struct stmmac_priv *priv = netdev_priv(dev);
3481c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO	int i, j = 0;
34947dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro
3501c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO	/* Update the DMA HW counters for dwmac10/100 */
3511c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO	if (!priv->plat->has_gmac)
3521c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO		priv->hw->dma->dma_diagnostic_fr(&dev->stats,
3531c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO						 (void *) &priv->xstats,
3541c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO						 priv->ioaddr);
3551c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO	else {
3561c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO		/* If supported, for new GMAC chips expose the MMC counters */
35738fe7a93fc734357c4811f1c710b1906a87d315cGiuseppe CAVALLARO		if (priv->dma_cap.rmon) {
35838fe7a93fc734357c4811f1c710b1906a87d315cGiuseppe CAVALLARO			dwmac_mmc_read(priv->ioaddr, &priv->mmc);
3591c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO
36038fe7a93fc734357c4811f1c710b1906a87d315cGiuseppe CAVALLARO			for (i = 0; i < STMMAC_MMC_STATS_LEN; i++) {
36138fe7a93fc734357c4811f1c710b1906a87d315cGiuseppe CAVALLARO				char *p;
36238fe7a93fc734357c4811f1c710b1906a87d315cGiuseppe CAVALLARO				p = (char *)priv + stmmac_mmc[i].stat_offset;
3631c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO
36438fe7a93fc734357c4811f1c710b1906a87d315cGiuseppe CAVALLARO				data[j++] = (stmmac_mmc[i].sizeof_stat ==
36538fe7a93fc734357c4811f1c710b1906a87d315cGiuseppe CAVALLARO					     sizeof(u64)) ? (*(u64 *)p) :
36638fe7a93fc734357c4811f1c710b1906a87d315cGiuseppe CAVALLARO					     (*(u32 *)p);
36738fe7a93fc734357c4811f1c710b1906a87d315cGiuseppe CAVALLARO			}
3681c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO		}
3691c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO	}
37047dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro	for (i = 0; i < STMMAC_STATS_LEN; i++) {
37147dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro		char *p = (char *)priv + stmmac_gstrings_stats[i].stat_offset;
3721c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO		data[j++] = (stmmac_gstrings_stats[i].sizeof_stat ==
3731c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO			     sizeof(u64)) ? (*(u64 *)p) : (*(u32 *)p);
37447dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro	}
37547dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro}
37647dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro
37747dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallarostatic int stmmac_get_sset_count(struct net_device *netdev, int sset)
37847dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro{
3791c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO	struct stmmac_priv *priv = netdev_priv(netdev);
3801c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO	int len;
3811c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO
38247dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro	switch (sset) {
38347dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro	case ETH_SS_STATS:
3841c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO		len = STMMAC_STATS_LEN;
3851c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO
38638fe7a93fc734357c4811f1c710b1906a87d315cGiuseppe CAVALLARO		if (priv->dma_cap.rmon)
3871c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO			len += STMMAC_MMC_STATS_LEN;
3881c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO
3891c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO		return len;
39047dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro	default:
39147dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro		return -EOPNOTSUPP;
39247dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro	}
39347dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro}
39447dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro
39547dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallarostatic void stmmac_get_strings(struct net_device *dev, u32 stringset, u8 *data)
39647dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro{
39747dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro	int i;
39847dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro	u8 *p = data;
3991c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO	struct stmmac_priv *priv = netdev_priv(dev);
40047dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro
40147dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro	switch (stringset) {
40247dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro	case ETH_SS_STATS:
40338fe7a93fc734357c4811f1c710b1906a87d315cGiuseppe CAVALLARO		if (priv->dma_cap.rmon)
4041c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO			for (i = 0; i < STMMAC_MMC_STATS_LEN; i++) {
40538fe7a93fc734357c4811f1c710b1906a87d315cGiuseppe CAVALLARO				memcpy(p, stmmac_mmc[i].stat_string,
4061c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO				       ETH_GSTRING_LEN);
4071c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO				p += ETH_GSTRING_LEN;
4081c901a46d576926287b05fc145bd3fd31a3e65deGiuseppe CAVALLARO			}
40947dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro		for (i = 0; i < STMMAC_STATS_LEN; i++) {
41047dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro			memcpy(p, stmmac_gstrings_stats[i].stat_string,
41147dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro				ETH_GSTRING_LEN);
41247dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro			p += ETH_GSTRING_LEN;
41347dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro		}
41447dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro		break;
41547dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro	default:
41647dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro		WARN_ON(1);
41747dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro		break;
41847dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro	}
41947dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro}
42047dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro
42147dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro/* Currently only support WOL through Magic packet. */
42247dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallarostatic void stmmac_get_wol(struct net_device *dev, struct ethtool_wolinfo *wol)
42347dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro{
42447dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro	struct stmmac_priv *priv = netdev_priv(dev);
42547dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro
42647dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro	spin_lock_irq(&priv->lock);
427543876c92837a8b208b5c99ec225c1f5a581900eGiuseppe Cavallaro	if (device_can_wakeup(priv->device)) {
42874ae2fd7d326750d973920c30d5269596724ca71Giuseppe Cavallaro		wol->supported = WAKE_MAGIC | WAKE_UCAST;
42947dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro		wol->wolopts = priv->wolopts;
43047dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro	}
43147dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro	spin_unlock_irq(&priv->lock);
43247dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro}
43347dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro
43447dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallarostatic int stmmac_set_wol(struct net_device *dev, struct ethtool_wolinfo *wol)
43547dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro{
43647dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro	struct stmmac_priv *priv = netdev_priv(dev);
43774ae2fd7d326750d973920c30d5269596724ca71Giuseppe Cavallaro	u32 support = WAKE_MAGIC | WAKE_UCAST;
43847dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro
43919e30c14371f7afd38d1d35a693b96423a4db144Giuseppe CAVALLARO	/* By default almost all GMAC devices support the WoL via
44019e30c14371f7afd38d1d35a693b96423a4db144Giuseppe CAVALLARO	 * magic frame but we can disable it if the HW capability
44119e30c14371f7afd38d1d35a693b96423a4db144Giuseppe CAVALLARO	 * register shows no support for pmt_magic_frame. */
44219e30c14371f7afd38d1d35a693b96423a4db144Giuseppe CAVALLARO	if ((priv->hw_cap_support) && (!priv->dma_cap.pmt_magic_frame))
44319e30c14371f7afd38d1d35a693b96423a4db144Giuseppe CAVALLARO		wol->wolopts &= ~WAKE_MAGIC;
44419e30c14371f7afd38d1d35a693b96423a4db144Giuseppe CAVALLARO
445543876c92837a8b208b5c99ec225c1f5a581900eGiuseppe Cavallaro	if (!device_can_wakeup(priv->device))
44647dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro		return -EINVAL;
44747dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro
44847dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro	if (wol->wolopts & ~support)
44947dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro		return -EINVAL;
45047dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro
451543876c92837a8b208b5c99ec225c1f5a581900eGiuseppe Cavallaro	if (wol->wolopts) {
452543876c92837a8b208b5c99ec225c1f5a581900eGiuseppe Cavallaro		pr_info("stmmac: wakeup enable\n");
45347dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro		device_set_wakeup_enable(priv->device, 1);
4543172d3afa998ffb8f1971746ca960cbe98d62444Deepak Sikri		enable_irq_wake(priv->wol_irq);
455543876c92837a8b208b5c99ec225c1f5a581900eGiuseppe Cavallaro	} else {
456543876c92837a8b208b5c99ec225c1f5a581900eGiuseppe Cavallaro		device_set_wakeup_enable(priv->device, 0);
4573172d3afa998ffb8f1971746ca960cbe98d62444Deepak Sikri		disable_irq_wake(priv->wol_irq);
458543876c92837a8b208b5c99ec225c1f5a581900eGiuseppe Cavallaro	}
45947dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro
46047dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro	spin_lock_irq(&priv->lock);
46147dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro	priv->wolopts = wol->wolopts;
46247dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro	spin_unlock_irq(&priv->lock);
46347dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro
46447dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro	return 0;
46547dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro}
46647dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro
4679b07be4b2a78166bc54c8eedf18da8a8aafacfabstephen hemmingerstatic const struct ethtool_ops stmmac_ethtool_ops = {
46847dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro	.begin = stmmac_check_if_running,
46947dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro	.get_drvinfo = stmmac_ethtool_getdrvinfo,
47047dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro	.get_settings = stmmac_ethtool_getsettings,
47147dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro	.set_settings = stmmac_ethtool_setsettings,
47247dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro	.get_msglevel = stmmac_ethtool_getmsglevel,
47347dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro	.set_msglevel = stmmac_ethtool_setmsglevel,
47447dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro	.get_regs = stmmac_ethtool_gregs,
47547dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro	.get_regs_len = stmmac_ethtool_get_regs_len,
47647dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro	.get_link = ethtool_op_get_link,
47747dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro	.get_pauseparam = stmmac_get_pauseparam,
47847dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro	.set_pauseparam = stmmac_set_pauseparam,
47947dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro	.get_ethtool_stats = stmmac_get_ethtool_stats,
48047dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro	.get_strings = stmmac_get_strings,
48147dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro	.get_wol = stmmac_get_wol,
48247dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro	.set_wol = stmmac_set_wol,
48347dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro	.get_sset_count	= stmmac_get_sset_count,
48447dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro};
48547dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro
48647dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallarovoid stmmac_set_ethtool_ops(struct net_device *netdev)
48747dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro{
48847dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro	SET_ETHTOOL_OPS(netdev, &stmmac_ethtool_ops);
48947dd7a540b8a0cdc028914b7351fca0cf0a1d305Giuseppe Cavallaro}
490