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