Linux Audio

Check our new training course

Open-source upstreaming

Need help get the support for your hardware in upstream Linux?
Loading...
v3.5.6
  1/*******************************************************************************
  2  STMMAC Ethtool support
  3
  4  Copyright (C) 2007-2009  STMicroelectronics Ltd
  5
  6  This program is free software; you can redistribute it and/or modify it
  7  under the terms and conditions of the GNU General Public License,
  8  version 2, as published by the Free Software Foundation.
  9
 10  This program is distributed in the hope it will be useful, but WITHOUT
 11  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 12  FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
 13  more details.
 14
 15  You should have received a copy of the GNU General Public License along with
 16  this program; if not, write to the Free Software Foundation, Inc.,
 17  51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
 18
 19  The full GNU General Public License is included in this distribution in
 20  the file called "COPYING".
 21
 22  Author: Giuseppe Cavallaro <peppe.cavallaro@st.com>
 23*******************************************************************************/
 24
 25#include <linux/etherdevice.h>
 26#include <linux/ethtool.h>
 27#include <linux/interrupt.h>
 28#include <linux/mii.h>
 29#include <linux/phy.h>
 
 30#include <asm/io.h>
 31
 32#include "stmmac.h"
 33#include "dwmac_dma.h"
 34
 35#define REG_SPACE_SIZE	0x1054
 36#define MAC100_ETHTOOL_NAME	"st_mac100"
 37#define GMAC_ETHTOOL_NAME	"st_gmac"
 38
 
 
 39struct stmmac_stats {
 40	char stat_string[ETH_GSTRING_LEN];
 41	int sizeof_stat;
 42	int stat_offset;
 43};
 44
 45#define STMMAC_STAT(m)	\
 46	{ #m, FIELD_SIZEOF(struct stmmac_extra_stats, m),	\
 47	offsetof(struct stmmac_priv, xstats.m)}
 48
 49static const struct stmmac_stats stmmac_gstrings_stats[] = {
 50	/* Transmit errors */
 51	STMMAC_STAT(tx_underflow),
 52	STMMAC_STAT(tx_carrier),
 53	STMMAC_STAT(tx_losscarrier),
 54	STMMAC_STAT(vlan_tag),
 55	STMMAC_STAT(tx_deferred),
 56	STMMAC_STAT(tx_vlan),
 57	STMMAC_STAT(tx_jabber),
 58	STMMAC_STAT(tx_frame_flushed),
 59	STMMAC_STAT(tx_payload_error),
 60	STMMAC_STAT(tx_ip_header_error),
 61	/* Receive errors */
 62	STMMAC_STAT(rx_desc),
 63	STMMAC_STAT(sa_filter_fail),
 64	STMMAC_STAT(overflow_error),
 65	STMMAC_STAT(ipc_csum_error),
 66	STMMAC_STAT(rx_collision),
 67	STMMAC_STAT(rx_crc),
 68	STMMAC_STAT(dribbling_bit),
 69	STMMAC_STAT(rx_length),
 70	STMMAC_STAT(rx_mii),
 71	STMMAC_STAT(rx_multicast),
 72	STMMAC_STAT(rx_gmac_overflow),
 73	STMMAC_STAT(rx_watchdog),
 74	STMMAC_STAT(da_rx_filter_fail),
 75	STMMAC_STAT(sa_rx_filter_fail),
 76	STMMAC_STAT(rx_missed_cntr),
 77	STMMAC_STAT(rx_overflow_cntr),
 78	STMMAC_STAT(rx_vlan),
 79	/* Tx/Rx IRQ errors */
 80	STMMAC_STAT(tx_undeflow_irq),
 81	STMMAC_STAT(tx_process_stopped_irq),
 82	STMMAC_STAT(tx_jabber_irq),
 83	STMMAC_STAT(rx_overflow_irq),
 84	STMMAC_STAT(rx_buf_unav_irq),
 85	STMMAC_STAT(rx_process_stopped_irq),
 86	STMMAC_STAT(rx_watchdog_irq),
 87	STMMAC_STAT(tx_early_irq),
 88	STMMAC_STAT(fatal_bus_error_irq),
 89	/* Extra info */
 
 90	STMMAC_STAT(threshold),
 91	STMMAC_STAT(tx_pkt_n),
 92	STMMAC_STAT(rx_pkt_n),
 93	STMMAC_STAT(poll_n),
 94	STMMAC_STAT(sched_timer_n),
 95	STMMAC_STAT(normal_irq_n),
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 96};
 97#define STMMAC_STATS_LEN ARRAY_SIZE(stmmac_gstrings_stats)
 98
 99/* HW MAC Management counters (if supported) */
100#define STMMAC_MMC_STAT(m)	\
101	{ #m, FIELD_SIZEOF(struct stmmac_counters, m),	\
102	offsetof(struct stmmac_priv, mmc.m)}
103
104static const struct stmmac_stats stmmac_mmc[] = {
105	STMMAC_MMC_STAT(mmc_tx_octetcount_gb),
106	STMMAC_MMC_STAT(mmc_tx_framecount_gb),
107	STMMAC_MMC_STAT(mmc_tx_broadcastframe_g),
108	STMMAC_MMC_STAT(mmc_tx_multicastframe_g),
109	STMMAC_MMC_STAT(mmc_tx_64_octets_gb),
110	STMMAC_MMC_STAT(mmc_tx_65_to_127_octets_gb),
111	STMMAC_MMC_STAT(mmc_tx_128_to_255_octets_gb),
112	STMMAC_MMC_STAT(mmc_tx_256_to_511_octets_gb),
113	STMMAC_MMC_STAT(mmc_tx_512_to_1023_octets_gb),
114	STMMAC_MMC_STAT(mmc_tx_1024_to_max_octets_gb),
115	STMMAC_MMC_STAT(mmc_tx_unicast_gb),
116	STMMAC_MMC_STAT(mmc_tx_multicast_gb),
117	STMMAC_MMC_STAT(mmc_tx_broadcast_gb),
118	STMMAC_MMC_STAT(mmc_tx_underflow_error),
119	STMMAC_MMC_STAT(mmc_tx_singlecol_g),
120	STMMAC_MMC_STAT(mmc_tx_multicol_g),
121	STMMAC_MMC_STAT(mmc_tx_deferred),
122	STMMAC_MMC_STAT(mmc_tx_latecol),
123	STMMAC_MMC_STAT(mmc_tx_exesscol),
124	STMMAC_MMC_STAT(mmc_tx_carrier_error),
125	STMMAC_MMC_STAT(mmc_tx_octetcount_g),
126	STMMAC_MMC_STAT(mmc_tx_framecount_g),
127	STMMAC_MMC_STAT(mmc_tx_excessdef),
128	STMMAC_MMC_STAT(mmc_tx_pause_frame),
129	STMMAC_MMC_STAT(mmc_tx_vlan_frame_g),
130	STMMAC_MMC_STAT(mmc_rx_framecount_gb),
131	STMMAC_MMC_STAT(mmc_rx_octetcount_gb),
132	STMMAC_MMC_STAT(mmc_rx_octetcount_g),
133	STMMAC_MMC_STAT(mmc_rx_broadcastframe_g),
134	STMMAC_MMC_STAT(mmc_rx_multicastframe_g),
135	STMMAC_MMC_STAT(mmc_rx_crc_errror),
136	STMMAC_MMC_STAT(mmc_rx_align_error),
137	STMMAC_MMC_STAT(mmc_rx_run_error),
138	STMMAC_MMC_STAT(mmc_rx_jabber_error),
139	STMMAC_MMC_STAT(mmc_rx_undersize_g),
140	STMMAC_MMC_STAT(mmc_rx_oversize_g),
141	STMMAC_MMC_STAT(mmc_rx_64_octets_gb),
142	STMMAC_MMC_STAT(mmc_rx_65_to_127_octets_gb),
143	STMMAC_MMC_STAT(mmc_rx_128_to_255_octets_gb),
144	STMMAC_MMC_STAT(mmc_rx_256_to_511_octets_gb),
145	STMMAC_MMC_STAT(mmc_rx_512_to_1023_octets_gb),
146	STMMAC_MMC_STAT(mmc_rx_1024_to_max_octets_gb),
147	STMMAC_MMC_STAT(mmc_rx_unicast_g),
148	STMMAC_MMC_STAT(mmc_rx_length_error),
149	STMMAC_MMC_STAT(mmc_rx_autofrangetype),
150	STMMAC_MMC_STAT(mmc_rx_pause_frames),
151	STMMAC_MMC_STAT(mmc_rx_fifo_overflow),
152	STMMAC_MMC_STAT(mmc_rx_vlan_frames_gb),
153	STMMAC_MMC_STAT(mmc_rx_watchdog_error),
154	STMMAC_MMC_STAT(mmc_rx_ipc_intr_mask),
155	STMMAC_MMC_STAT(mmc_rx_ipc_intr),
156	STMMAC_MMC_STAT(mmc_rx_ipv4_gd),
157	STMMAC_MMC_STAT(mmc_rx_ipv4_hderr),
158	STMMAC_MMC_STAT(mmc_rx_ipv4_nopay),
159	STMMAC_MMC_STAT(mmc_rx_ipv4_frag),
160	STMMAC_MMC_STAT(mmc_rx_ipv4_udsbl),
161	STMMAC_MMC_STAT(mmc_rx_ipv4_gd_octets),
162	STMMAC_MMC_STAT(mmc_rx_ipv4_hderr_octets),
163	STMMAC_MMC_STAT(mmc_rx_ipv4_nopay_octets),
164	STMMAC_MMC_STAT(mmc_rx_ipv4_frag_octets),
165	STMMAC_MMC_STAT(mmc_rx_ipv4_udsbl_octets),
166	STMMAC_MMC_STAT(mmc_rx_ipv6_gd_octets),
167	STMMAC_MMC_STAT(mmc_rx_ipv6_hderr_octets),
168	STMMAC_MMC_STAT(mmc_rx_ipv6_nopay_octets),
169	STMMAC_MMC_STAT(mmc_rx_ipv6_gd),
170	STMMAC_MMC_STAT(mmc_rx_ipv6_hderr),
171	STMMAC_MMC_STAT(mmc_rx_ipv6_nopay),
172	STMMAC_MMC_STAT(mmc_rx_udp_gd),
173	STMMAC_MMC_STAT(mmc_rx_udp_err),
174	STMMAC_MMC_STAT(mmc_rx_tcp_gd),
175	STMMAC_MMC_STAT(mmc_rx_tcp_err),
176	STMMAC_MMC_STAT(mmc_rx_icmp_gd),
177	STMMAC_MMC_STAT(mmc_rx_icmp_err),
178	STMMAC_MMC_STAT(mmc_rx_udp_gd_octets),
179	STMMAC_MMC_STAT(mmc_rx_udp_err_octets),
180	STMMAC_MMC_STAT(mmc_rx_tcp_gd_octets),
181	STMMAC_MMC_STAT(mmc_rx_tcp_err_octets),
182	STMMAC_MMC_STAT(mmc_rx_icmp_gd_octets),
183	STMMAC_MMC_STAT(mmc_rx_icmp_err_octets),
184};
185#define STMMAC_MMC_STATS_LEN ARRAY_SIZE(stmmac_mmc)
186
187static void stmmac_ethtool_getdrvinfo(struct net_device *dev,
188				      struct ethtool_drvinfo *info)
189{
190	struct stmmac_priv *priv = netdev_priv(dev);
191
192	if (priv->plat->has_gmac)
193		strlcpy(info->driver, GMAC_ETHTOOL_NAME, sizeof(info->driver));
194	else
195		strlcpy(info->driver, MAC100_ETHTOOL_NAME,
196			sizeof(info->driver));
197
198	strcpy(info->version, DRV_MODULE_VERSION);
199	info->fw_version[0] = '\0';
200}
201
202static int stmmac_ethtool_getsettings(struct net_device *dev,
203				      struct ethtool_cmd *cmd)
204{
205	struct stmmac_priv *priv = netdev_priv(dev);
206	struct phy_device *phy = priv->phydev;
207	int rc;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
208	if (phy == NULL) {
209		pr_err("%s: %s: PHY is not registered\n",
210		       __func__, dev->name);
211		return -ENODEV;
212	}
213	if (!netif_running(dev)) {
214		pr_err("%s: interface is disabled: we cannot track "
215		"link speed / duplex setting\n", dev->name);
216		return -EBUSY;
217	}
218	cmd->transceiver = XCVR_INTERNAL;
219	spin_lock_irq(&priv->lock);
220	rc = phy_ethtool_gset(phy, cmd);
221	spin_unlock_irq(&priv->lock);
222	return rc;
223}
224
225static int stmmac_ethtool_setsettings(struct net_device *dev,
226				      struct ethtool_cmd *cmd)
 
227{
228	struct stmmac_priv *priv = netdev_priv(dev);
229	struct phy_device *phy = priv->phydev;
230	int rc;
231
232	spin_lock(&priv->lock);
233	rc = phy_ethtool_sset(phy, cmd);
234	spin_unlock(&priv->lock);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
235
236	return rc;
237}
238
239static u32 stmmac_ethtool_getmsglevel(struct net_device *dev)
240{
241	struct stmmac_priv *priv = netdev_priv(dev);
242	return priv->msg_enable;
243}
244
245static void stmmac_ethtool_setmsglevel(struct net_device *dev, u32 level)
246{
247	struct stmmac_priv *priv = netdev_priv(dev);
248	priv->msg_enable = level;
249
250}
251
252static int stmmac_check_if_running(struct net_device *dev)
253{
254	if (!netif_running(dev))
255		return -EBUSY;
256	return 0;
257}
258
259static int stmmac_ethtool_get_regs_len(struct net_device *dev)
260{
261	return REG_SPACE_SIZE;
262}
263
264static void stmmac_ethtool_gregs(struct net_device *dev,
265			  struct ethtool_regs *regs, void *space)
266{
267	int i;
268	u32 *reg_space = (u32 *) space;
269
270	struct stmmac_priv *priv = netdev_priv(dev);
271
272	memset(reg_space, 0x0, REG_SPACE_SIZE);
273
274	if (!priv->plat->has_gmac) {
275		/* MAC registers */
276		for (i = 0; i < 12; i++)
277			reg_space[i] = readl(priv->ioaddr + (i * 4));
278		/* DMA registers */
279		for (i = 0; i < 9; i++)
280			reg_space[i + 12] =
281			    readl(priv->ioaddr + (DMA_BUS_MODE + (i * 4)));
282		reg_space[22] = readl(priv->ioaddr + DMA_CUR_TX_BUF_ADDR);
283		reg_space[23] = readl(priv->ioaddr + DMA_CUR_RX_BUF_ADDR);
284	} else {
285		/* MAC registers */
286		for (i = 0; i < 55; i++)
287			reg_space[i] = readl(priv->ioaddr + (i * 4));
288		/* DMA registers */
289		for (i = 0; i < 22; i++)
290			reg_space[i + 55] =
291			    readl(priv->ioaddr + (DMA_BUS_MODE + (i * 4)));
292	}
293}
294
295static void
296stmmac_get_pauseparam(struct net_device *netdev,
297		      struct ethtool_pauseparam *pause)
298{
299	struct stmmac_priv *priv = netdev_priv(netdev);
300
301	spin_lock(&priv->lock);
302
303	pause->rx_pause = 0;
304	pause->tx_pause = 0;
305	pause->autoneg = priv->phydev->autoneg;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
306
307	if (priv->flow_ctrl & FLOW_RX)
308		pause->rx_pause = 1;
309	if (priv->flow_ctrl & FLOW_TX)
310		pause->tx_pause = 1;
311
312	spin_unlock(&priv->lock);
313}
314
315static int
316stmmac_set_pauseparam(struct net_device *netdev,
317		      struct ethtool_pauseparam *pause)
318{
319	struct stmmac_priv *priv = netdev_priv(netdev);
320	struct phy_device *phy = priv->phydev;
 
321	int new_pause = FLOW_OFF;
322	int ret = 0;
323
324	spin_lock(&priv->lock);
 
 
 
 
 
 
 
 
 
 
 
325
326	if (pause->rx_pause)
327		new_pause |= FLOW_RX;
328	if (pause->tx_pause)
329		new_pause |= FLOW_TX;
330
331	priv->flow_ctrl = new_pause;
332	phy->autoneg = pause->autoneg;
333
334	if (phy->autoneg) {
335		if (netif_running(netdev))
336			ret = phy_start_aneg(phy);
337	} else
338		priv->hw->mac->flow_ctrl(priv->ioaddr, phy->duplex,
339					 priv->flow_ctrl, priv->pause);
340	spin_unlock(&priv->lock);
341	return ret;
342}
343
344static void stmmac_get_ethtool_stats(struct net_device *dev,
345				 struct ethtool_stats *dummy, u64 *data)
346{
 
 
347	struct stmmac_priv *priv = netdev_priv(dev);
 
 
 
348	int i, j = 0;
349
 
 
 
 
 
 
 
 
 
350	/* Update the DMA HW counters for dwmac10/100 */
351	if (!priv->plat->has_gmac)
352		priv->hw->dma->dma_diagnostic_fr(&dev->stats,
353						 (void *) &priv->xstats,
354						 priv->ioaddr);
355	else {
356		/* If supported, for new GMAC chips expose the MMC counters */
357		if (priv->dma_cap.rmon) {
358			dwmac_mmc_read(priv->ioaddr, &priv->mmc);
359
360			for (i = 0; i < STMMAC_MMC_STATS_LEN; i++) {
361				char *p;
362				p = (char *)priv + stmmac_mmc[i].stat_offset;
363
364				data[j++] = (stmmac_mmc[i].sizeof_stat ==
365					     sizeof(u64)) ? (*(u64 *)p) :
366					     (*(u32 *)p);
367			}
368		}
 
 
 
 
 
 
 
 
 
 
 
369	}
370	for (i = 0; i < STMMAC_STATS_LEN; i++) {
371		char *p = (char *)priv + stmmac_gstrings_stats[i].stat_offset;
372		data[j++] = (stmmac_gstrings_stats[i].sizeof_stat ==
373			     sizeof(u64)) ? (*(u64 *)p) : (*(u32 *)p);
374	}
375}
376
377static int stmmac_get_sset_count(struct net_device *netdev, int sset)
378{
379	struct stmmac_priv *priv = netdev_priv(netdev);
380	int len;
 
 
381
382	switch (sset) {
383	case ETH_SS_STATS:
384		len = STMMAC_STATS_LEN;
385
386		if (priv->dma_cap.rmon)
387			len += STMMAC_MMC_STATS_LEN;
 
 
 
 
 
 
 
 
 
 
388
389		return len;
390	default:
391		return -EOPNOTSUPP;
392	}
393}
394
395static void stmmac_get_strings(struct net_device *dev, u32 stringset, u8 *data)
396{
397	int i;
398	u8 *p = data;
399	struct stmmac_priv *priv = netdev_priv(dev);
 
 
400
401	switch (stringset) {
402	case ETH_SS_STATS:
 
 
 
 
 
 
 
 
 
 
 
403		if (priv->dma_cap.rmon)
404			for (i = 0; i < STMMAC_MMC_STATS_LEN; i++) {
405				memcpy(p, stmmac_mmc[i].stat_string,
406				       ETH_GSTRING_LEN);
407				p += ETH_GSTRING_LEN;
408			}
409		for (i = 0; i < STMMAC_STATS_LEN; i++) {
410			memcpy(p, stmmac_gstrings_stats[i].stat_string,
411				ETH_GSTRING_LEN);
412			p += ETH_GSTRING_LEN;
413		}
414		break;
415	default:
416		WARN_ON(1);
417		break;
418	}
419}
420
421/* Currently only support WOL through Magic packet. */
422static void stmmac_get_wol(struct net_device *dev, struct ethtool_wolinfo *wol)
423{
424	struct stmmac_priv *priv = netdev_priv(dev);
425
426	spin_lock_irq(&priv->lock);
427	if (device_can_wakeup(priv->device)) {
428		wol->supported = WAKE_MAGIC | WAKE_UCAST;
429		wol->wolopts = priv->wolopts;
430	}
431	spin_unlock_irq(&priv->lock);
432}
433
434static int stmmac_set_wol(struct net_device *dev, struct ethtool_wolinfo *wol)
435{
436	struct stmmac_priv *priv = netdev_priv(dev);
437	u32 support = WAKE_MAGIC | WAKE_UCAST;
438
439	/* By default almost all GMAC devices support the WoL via
440	 * magic frame but we can disable it if the HW capability
441	 * register shows no support for pmt_magic_frame. */
442	if ((priv->hw_cap_support) && (!priv->dma_cap.pmt_magic_frame))
443		wol->wolopts &= ~WAKE_MAGIC;
444
445	if (!device_can_wakeup(priv->device))
446		return -EINVAL;
447
448	if (wol->wolopts & ~support)
449		return -EINVAL;
450
451	if (wol->wolopts) {
452		pr_info("stmmac: wakeup enable\n");
453		device_set_wakeup_enable(priv->device, 1);
454		enable_irq_wake(priv->wol_irq);
455	} else {
456		device_set_wakeup_enable(priv->device, 0);
457		disable_irq_wake(priv->wol_irq);
458	}
459
460	spin_lock_irq(&priv->lock);
461	priv->wolopts = wol->wolopts;
462	spin_unlock_irq(&priv->lock);
463
464	return 0;
465}
466
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
467static const struct ethtool_ops stmmac_ethtool_ops = {
468	.begin = stmmac_check_if_running,
469	.get_drvinfo = stmmac_ethtool_getdrvinfo,
470	.get_settings = stmmac_ethtool_getsettings,
471	.set_settings = stmmac_ethtool_setsettings,
472	.get_msglevel = stmmac_ethtool_getmsglevel,
473	.set_msglevel = stmmac_ethtool_setmsglevel,
474	.get_regs = stmmac_ethtool_gregs,
475	.get_regs_len = stmmac_ethtool_get_regs_len,
476	.get_link = ethtool_op_get_link,
 
477	.get_pauseparam = stmmac_get_pauseparam,
478	.set_pauseparam = stmmac_set_pauseparam,
479	.get_ethtool_stats = stmmac_get_ethtool_stats,
480	.get_strings = stmmac_get_strings,
481	.get_wol = stmmac_get_wol,
482	.set_wol = stmmac_set_wol,
 
 
483	.get_sset_count	= stmmac_get_sset_count,
484	.get_ts_info = ethtool_op_get_ts_info,
 
 
 
 
 
 
485};
486
487void stmmac_set_ethtool_ops(struct net_device *netdev)
488{
489	SET_ETHTOOL_OPS(netdev, &stmmac_ethtool_ops);
490}
v4.17
  1/*******************************************************************************
  2  STMMAC Ethtool support
  3
  4  Copyright (C) 2007-2009  STMicroelectronics Ltd
  5
  6  This program is free software; you can redistribute it and/or modify it
  7  under the terms and conditions of the GNU General Public License,
  8  version 2, as published by the Free Software Foundation.
  9
 10  This program is distributed in the hope it will be useful, but WITHOUT
 11  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 12  FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
 13  more details.
 14
 
 
 
 
 15  The full GNU General Public License is included in this distribution in
 16  the file called "COPYING".
 17
 18  Author: Giuseppe Cavallaro <peppe.cavallaro@st.com>
 19*******************************************************************************/
 20
 21#include <linux/etherdevice.h>
 22#include <linux/ethtool.h>
 23#include <linux/interrupt.h>
 24#include <linux/mii.h>
 25#include <linux/phy.h>
 26#include <linux/net_tstamp.h>
 27#include <asm/io.h>
 28
 29#include "stmmac.h"
 30#include "dwmac_dma.h"
 31
 32#define REG_SPACE_SIZE	0x1060
 33#define MAC100_ETHTOOL_NAME	"st_mac100"
 34#define GMAC_ETHTOOL_NAME	"st_gmac"
 35
 36#define ETHTOOL_DMA_OFFSET	55
 37
 38struct stmmac_stats {
 39	char stat_string[ETH_GSTRING_LEN];
 40	int sizeof_stat;
 41	int stat_offset;
 42};
 43
 44#define STMMAC_STAT(m)	\
 45	{ #m, FIELD_SIZEOF(struct stmmac_extra_stats, m),	\
 46	offsetof(struct stmmac_priv, xstats.m)}
 47
 48static const struct stmmac_stats stmmac_gstrings_stats[] = {
 49	/* Transmit errors */
 50	STMMAC_STAT(tx_underflow),
 51	STMMAC_STAT(tx_carrier),
 52	STMMAC_STAT(tx_losscarrier),
 53	STMMAC_STAT(vlan_tag),
 54	STMMAC_STAT(tx_deferred),
 55	STMMAC_STAT(tx_vlan),
 56	STMMAC_STAT(tx_jabber),
 57	STMMAC_STAT(tx_frame_flushed),
 58	STMMAC_STAT(tx_payload_error),
 59	STMMAC_STAT(tx_ip_header_error),
 60	/* Receive errors */
 61	STMMAC_STAT(rx_desc),
 62	STMMAC_STAT(sa_filter_fail),
 63	STMMAC_STAT(overflow_error),
 64	STMMAC_STAT(ipc_csum_error),
 65	STMMAC_STAT(rx_collision),
 66	STMMAC_STAT(rx_crc_errors),
 67	STMMAC_STAT(dribbling_bit),
 68	STMMAC_STAT(rx_length),
 69	STMMAC_STAT(rx_mii),
 70	STMMAC_STAT(rx_multicast),
 71	STMMAC_STAT(rx_gmac_overflow),
 72	STMMAC_STAT(rx_watchdog),
 73	STMMAC_STAT(da_rx_filter_fail),
 74	STMMAC_STAT(sa_rx_filter_fail),
 75	STMMAC_STAT(rx_missed_cntr),
 76	STMMAC_STAT(rx_overflow_cntr),
 77	STMMAC_STAT(rx_vlan),
 78	/* Tx/Rx IRQ error info */
 79	STMMAC_STAT(tx_undeflow_irq),
 80	STMMAC_STAT(tx_process_stopped_irq),
 81	STMMAC_STAT(tx_jabber_irq),
 82	STMMAC_STAT(rx_overflow_irq),
 83	STMMAC_STAT(rx_buf_unav_irq),
 84	STMMAC_STAT(rx_process_stopped_irq),
 85	STMMAC_STAT(rx_watchdog_irq),
 86	STMMAC_STAT(tx_early_irq),
 87	STMMAC_STAT(fatal_bus_error_irq),
 88	/* Tx/Rx IRQ Events */
 89	STMMAC_STAT(rx_early_irq),
 90	STMMAC_STAT(threshold),
 91	STMMAC_STAT(tx_pkt_n),
 92	STMMAC_STAT(rx_pkt_n),
 
 
 93	STMMAC_STAT(normal_irq_n),
 94	STMMAC_STAT(rx_normal_irq_n),
 95	STMMAC_STAT(napi_poll),
 96	STMMAC_STAT(tx_normal_irq_n),
 97	STMMAC_STAT(tx_clean),
 98	STMMAC_STAT(tx_set_ic_bit),
 99	STMMAC_STAT(irq_receive_pmt_irq_n),
100	/* MMC info */
101	STMMAC_STAT(mmc_tx_irq_n),
102	STMMAC_STAT(mmc_rx_irq_n),
103	STMMAC_STAT(mmc_rx_csum_offload_irq_n),
104	/* EEE */
105	STMMAC_STAT(irq_tx_path_in_lpi_mode_n),
106	STMMAC_STAT(irq_tx_path_exit_lpi_mode_n),
107	STMMAC_STAT(irq_rx_path_in_lpi_mode_n),
108	STMMAC_STAT(irq_rx_path_exit_lpi_mode_n),
109	STMMAC_STAT(phy_eee_wakeup_error_n),
110	/* Extended RDES status */
111	STMMAC_STAT(ip_hdr_err),
112	STMMAC_STAT(ip_payload_err),
113	STMMAC_STAT(ip_csum_bypassed),
114	STMMAC_STAT(ipv4_pkt_rcvd),
115	STMMAC_STAT(ipv6_pkt_rcvd),
116	STMMAC_STAT(no_ptp_rx_msg_type_ext),
117	STMMAC_STAT(ptp_rx_msg_type_sync),
118	STMMAC_STAT(ptp_rx_msg_type_follow_up),
119	STMMAC_STAT(ptp_rx_msg_type_delay_req),
120	STMMAC_STAT(ptp_rx_msg_type_delay_resp),
121	STMMAC_STAT(ptp_rx_msg_type_pdelay_req),
122	STMMAC_STAT(ptp_rx_msg_type_pdelay_resp),
123	STMMAC_STAT(ptp_rx_msg_type_pdelay_follow_up),
124	STMMAC_STAT(ptp_rx_msg_type_announce),
125	STMMAC_STAT(ptp_rx_msg_type_management),
126	STMMAC_STAT(ptp_rx_msg_pkt_reserved_type),
127	STMMAC_STAT(ptp_frame_type),
128	STMMAC_STAT(ptp_ver),
129	STMMAC_STAT(timestamp_dropped),
130	STMMAC_STAT(av_pkt_rcvd),
131	STMMAC_STAT(av_tagged_pkt_rcvd),
132	STMMAC_STAT(vlan_tag_priority_val),
133	STMMAC_STAT(l3_filter_match),
134	STMMAC_STAT(l4_filter_match),
135	STMMAC_STAT(l3_l4_filter_no_match),
136	/* PCS */
137	STMMAC_STAT(irq_pcs_ane_n),
138	STMMAC_STAT(irq_pcs_link_n),
139	STMMAC_STAT(irq_rgmii_n),
140	/* DEBUG */
141	STMMAC_STAT(mtl_tx_status_fifo_full),
142	STMMAC_STAT(mtl_tx_fifo_not_empty),
143	STMMAC_STAT(mmtl_fifo_ctrl),
144	STMMAC_STAT(mtl_tx_fifo_read_ctrl_write),
145	STMMAC_STAT(mtl_tx_fifo_read_ctrl_wait),
146	STMMAC_STAT(mtl_tx_fifo_read_ctrl_read),
147	STMMAC_STAT(mtl_tx_fifo_read_ctrl_idle),
148	STMMAC_STAT(mac_tx_in_pause),
149	STMMAC_STAT(mac_tx_frame_ctrl_xfer),
150	STMMAC_STAT(mac_tx_frame_ctrl_idle),
151	STMMAC_STAT(mac_tx_frame_ctrl_wait),
152	STMMAC_STAT(mac_tx_frame_ctrl_pause),
153	STMMAC_STAT(mac_gmii_tx_proto_engine),
154	STMMAC_STAT(mtl_rx_fifo_fill_level_full),
155	STMMAC_STAT(mtl_rx_fifo_fill_above_thresh),
156	STMMAC_STAT(mtl_rx_fifo_fill_below_thresh),
157	STMMAC_STAT(mtl_rx_fifo_fill_level_empty),
158	STMMAC_STAT(mtl_rx_fifo_read_ctrl_flush),
159	STMMAC_STAT(mtl_rx_fifo_read_ctrl_read_data),
160	STMMAC_STAT(mtl_rx_fifo_read_ctrl_status),
161	STMMAC_STAT(mtl_rx_fifo_read_ctrl_idle),
162	STMMAC_STAT(mtl_rx_fifo_ctrl_active),
163	STMMAC_STAT(mac_rx_frame_ctrl_fifo),
164	STMMAC_STAT(mac_gmii_rx_proto_engine),
165	/* TSO */
166	STMMAC_STAT(tx_tso_frames),
167	STMMAC_STAT(tx_tso_nfrags),
168};
169#define STMMAC_STATS_LEN ARRAY_SIZE(stmmac_gstrings_stats)
170
171/* HW MAC Management counters (if supported) */
172#define STMMAC_MMC_STAT(m)	\
173	{ #m, FIELD_SIZEOF(struct stmmac_counters, m),	\
174	offsetof(struct stmmac_priv, mmc.m)}
175
176static const struct stmmac_stats stmmac_mmc[] = {
177	STMMAC_MMC_STAT(mmc_tx_octetcount_gb),
178	STMMAC_MMC_STAT(mmc_tx_framecount_gb),
179	STMMAC_MMC_STAT(mmc_tx_broadcastframe_g),
180	STMMAC_MMC_STAT(mmc_tx_multicastframe_g),
181	STMMAC_MMC_STAT(mmc_tx_64_octets_gb),
182	STMMAC_MMC_STAT(mmc_tx_65_to_127_octets_gb),
183	STMMAC_MMC_STAT(mmc_tx_128_to_255_octets_gb),
184	STMMAC_MMC_STAT(mmc_tx_256_to_511_octets_gb),
185	STMMAC_MMC_STAT(mmc_tx_512_to_1023_octets_gb),
186	STMMAC_MMC_STAT(mmc_tx_1024_to_max_octets_gb),
187	STMMAC_MMC_STAT(mmc_tx_unicast_gb),
188	STMMAC_MMC_STAT(mmc_tx_multicast_gb),
189	STMMAC_MMC_STAT(mmc_tx_broadcast_gb),
190	STMMAC_MMC_STAT(mmc_tx_underflow_error),
191	STMMAC_MMC_STAT(mmc_tx_singlecol_g),
192	STMMAC_MMC_STAT(mmc_tx_multicol_g),
193	STMMAC_MMC_STAT(mmc_tx_deferred),
194	STMMAC_MMC_STAT(mmc_tx_latecol),
195	STMMAC_MMC_STAT(mmc_tx_exesscol),
196	STMMAC_MMC_STAT(mmc_tx_carrier_error),
197	STMMAC_MMC_STAT(mmc_tx_octetcount_g),
198	STMMAC_MMC_STAT(mmc_tx_framecount_g),
199	STMMAC_MMC_STAT(mmc_tx_excessdef),
200	STMMAC_MMC_STAT(mmc_tx_pause_frame),
201	STMMAC_MMC_STAT(mmc_tx_vlan_frame_g),
202	STMMAC_MMC_STAT(mmc_rx_framecount_gb),
203	STMMAC_MMC_STAT(mmc_rx_octetcount_gb),
204	STMMAC_MMC_STAT(mmc_rx_octetcount_g),
205	STMMAC_MMC_STAT(mmc_rx_broadcastframe_g),
206	STMMAC_MMC_STAT(mmc_rx_multicastframe_g),
207	STMMAC_MMC_STAT(mmc_rx_crc_error),
208	STMMAC_MMC_STAT(mmc_rx_align_error),
209	STMMAC_MMC_STAT(mmc_rx_run_error),
210	STMMAC_MMC_STAT(mmc_rx_jabber_error),
211	STMMAC_MMC_STAT(mmc_rx_undersize_g),
212	STMMAC_MMC_STAT(mmc_rx_oversize_g),
213	STMMAC_MMC_STAT(mmc_rx_64_octets_gb),
214	STMMAC_MMC_STAT(mmc_rx_65_to_127_octets_gb),
215	STMMAC_MMC_STAT(mmc_rx_128_to_255_octets_gb),
216	STMMAC_MMC_STAT(mmc_rx_256_to_511_octets_gb),
217	STMMAC_MMC_STAT(mmc_rx_512_to_1023_octets_gb),
218	STMMAC_MMC_STAT(mmc_rx_1024_to_max_octets_gb),
219	STMMAC_MMC_STAT(mmc_rx_unicast_g),
220	STMMAC_MMC_STAT(mmc_rx_length_error),
221	STMMAC_MMC_STAT(mmc_rx_autofrangetype),
222	STMMAC_MMC_STAT(mmc_rx_pause_frames),
223	STMMAC_MMC_STAT(mmc_rx_fifo_overflow),
224	STMMAC_MMC_STAT(mmc_rx_vlan_frames_gb),
225	STMMAC_MMC_STAT(mmc_rx_watchdog_error),
226	STMMAC_MMC_STAT(mmc_rx_ipc_intr_mask),
227	STMMAC_MMC_STAT(mmc_rx_ipc_intr),
228	STMMAC_MMC_STAT(mmc_rx_ipv4_gd),
229	STMMAC_MMC_STAT(mmc_rx_ipv4_hderr),
230	STMMAC_MMC_STAT(mmc_rx_ipv4_nopay),
231	STMMAC_MMC_STAT(mmc_rx_ipv4_frag),
232	STMMAC_MMC_STAT(mmc_rx_ipv4_udsbl),
233	STMMAC_MMC_STAT(mmc_rx_ipv4_gd_octets),
234	STMMAC_MMC_STAT(mmc_rx_ipv4_hderr_octets),
235	STMMAC_MMC_STAT(mmc_rx_ipv4_nopay_octets),
236	STMMAC_MMC_STAT(mmc_rx_ipv4_frag_octets),
237	STMMAC_MMC_STAT(mmc_rx_ipv4_udsbl_octets),
238	STMMAC_MMC_STAT(mmc_rx_ipv6_gd_octets),
239	STMMAC_MMC_STAT(mmc_rx_ipv6_hderr_octets),
240	STMMAC_MMC_STAT(mmc_rx_ipv6_nopay_octets),
241	STMMAC_MMC_STAT(mmc_rx_ipv6_gd),
242	STMMAC_MMC_STAT(mmc_rx_ipv6_hderr),
243	STMMAC_MMC_STAT(mmc_rx_ipv6_nopay),
244	STMMAC_MMC_STAT(mmc_rx_udp_gd),
245	STMMAC_MMC_STAT(mmc_rx_udp_err),
246	STMMAC_MMC_STAT(mmc_rx_tcp_gd),
247	STMMAC_MMC_STAT(mmc_rx_tcp_err),
248	STMMAC_MMC_STAT(mmc_rx_icmp_gd),
249	STMMAC_MMC_STAT(mmc_rx_icmp_err),
250	STMMAC_MMC_STAT(mmc_rx_udp_gd_octets),
251	STMMAC_MMC_STAT(mmc_rx_udp_err_octets),
252	STMMAC_MMC_STAT(mmc_rx_tcp_gd_octets),
253	STMMAC_MMC_STAT(mmc_rx_tcp_err_octets),
254	STMMAC_MMC_STAT(mmc_rx_icmp_gd_octets),
255	STMMAC_MMC_STAT(mmc_rx_icmp_err_octets),
256};
257#define STMMAC_MMC_STATS_LEN ARRAY_SIZE(stmmac_mmc)
258
259static void stmmac_ethtool_getdrvinfo(struct net_device *dev,
260				      struct ethtool_drvinfo *info)
261{
262	struct stmmac_priv *priv = netdev_priv(dev);
263
264	if (priv->plat->has_gmac || priv->plat->has_gmac4)
265		strlcpy(info->driver, GMAC_ETHTOOL_NAME, sizeof(info->driver));
266	else
267		strlcpy(info->driver, MAC100_ETHTOOL_NAME,
268			sizeof(info->driver));
269
270	strlcpy(info->version, DRV_MODULE_VERSION, sizeof(info->version));
 
271}
272
273static int stmmac_ethtool_get_link_ksettings(struct net_device *dev,
274					     struct ethtool_link_ksettings *cmd)
275{
276	struct stmmac_priv *priv = netdev_priv(dev);
277	struct phy_device *phy = dev->phydev;
278
279	if (priv->hw->pcs & STMMAC_PCS_RGMII ||
280	    priv->hw->pcs & STMMAC_PCS_SGMII) {
281		struct rgmii_adv adv;
282		u32 supported, advertising, lp_advertising;
283
284		if (!priv->xstats.pcs_link) {
285			cmd->base.speed = SPEED_UNKNOWN;
286			cmd->base.duplex = DUPLEX_UNKNOWN;
287			return 0;
288		}
289		cmd->base.duplex = priv->xstats.pcs_duplex;
290
291		cmd->base.speed = priv->xstats.pcs_speed;
292
293		/* Get and convert ADV/LP_ADV from the HW AN registers */
294		if (!priv->hw->mac->pcs_get_adv_lp)
295			return -EOPNOTSUPP;	/* should never happen indeed */
296
297		priv->hw->mac->pcs_get_adv_lp(priv->ioaddr, &adv);
298
299		/* Encoding of PSE bits is defined in 802.3z, 37.2.1.4 */
300
301		ethtool_convert_link_mode_to_legacy_u32(
302			&supported, cmd->link_modes.supported);
303		ethtool_convert_link_mode_to_legacy_u32(
304			&advertising, cmd->link_modes.advertising);
305		ethtool_convert_link_mode_to_legacy_u32(
306			&lp_advertising, cmd->link_modes.lp_advertising);
307
308		if (adv.pause & STMMAC_PCS_PAUSE)
309			advertising |= ADVERTISED_Pause;
310		if (adv.pause & STMMAC_PCS_ASYM_PAUSE)
311			advertising |= ADVERTISED_Asym_Pause;
312		if (adv.lp_pause & STMMAC_PCS_PAUSE)
313			lp_advertising |= ADVERTISED_Pause;
314		if (adv.lp_pause & STMMAC_PCS_ASYM_PAUSE)
315			lp_advertising |= ADVERTISED_Asym_Pause;
316
317		/* Reg49[3] always set because ANE is always supported */
318		cmd->base.autoneg = ADVERTISED_Autoneg;
319		supported |= SUPPORTED_Autoneg;
320		advertising |= ADVERTISED_Autoneg;
321		lp_advertising |= ADVERTISED_Autoneg;
322
323		if (adv.duplex) {
324			supported |= (SUPPORTED_1000baseT_Full |
325				      SUPPORTED_100baseT_Full |
326				      SUPPORTED_10baseT_Full);
327			advertising |= (ADVERTISED_1000baseT_Full |
328					ADVERTISED_100baseT_Full |
329					ADVERTISED_10baseT_Full);
330		} else {
331			supported |= (SUPPORTED_1000baseT_Half |
332				      SUPPORTED_100baseT_Half |
333				      SUPPORTED_10baseT_Half);
334			advertising |= (ADVERTISED_1000baseT_Half |
335					ADVERTISED_100baseT_Half |
336					ADVERTISED_10baseT_Half);
337		}
338		if (adv.lp_duplex)
339			lp_advertising |= (ADVERTISED_1000baseT_Full |
340					   ADVERTISED_100baseT_Full |
341					   ADVERTISED_10baseT_Full);
342		else
343			lp_advertising |= (ADVERTISED_1000baseT_Half |
344					   ADVERTISED_100baseT_Half |
345					   ADVERTISED_10baseT_Half);
346		cmd->base.port = PORT_OTHER;
347
348		ethtool_convert_legacy_u32_to_link_mode(
349			cmd->link_modes.supported, supported);
350		ethtool_convert_legacy_u32_to_link_mode(
351			cmd->link_modes.advertising, advertising);
352		ethtool_convert_legacy_u32_to_link_mode(
353			cmd->link_modes.lp_advertising, lp_advertising);
354
355		return 0;
356	}
357
358	if (phy == NULL) {
359		pr_err("%s: %s: PHY is not registered\n",
360		       __func__, dev->name);
361		return -ENODEV;
362	}
363	if (!netif_running(dev)) {
364		pr_err("%s: interface is disabled: we cannot track "
365		"link speed / duplex setting\n", dev->name);
366		return -EBUSY;
367	}
368	phy_ethtool_ksettings_get(phy, cmd);
369	return 0;
 
 
 
370}
371
372static int
373stmmac_ethtool_set_link_ksettings(struct net_device *dev,
374				  const struct ethtool_link_ksettings *cmd)
375{
376	struct stmmac_priv *priv = netdev_priv(dev);
377	struct phy_device *phy = dev->phydev;
378	int rc;
379
380	if (priv->hw->pcs & STMMAC_PCS_RGMII ||
381	    priv->hw->pcs & STMMAC_PCS_SGMII) {
382		u32 mask = ADVERTISED_Autoneg | ADVERTISED_Pause;
383
384		/* Only support ANE */
385		if (cmd->base.autoneg != AUTONEG_ENABLE)
386			return -EINVAL;
387
388		mask &= (ADVERTISED_1000baseT_Half |
389			ADVERTISED_1000baseT_Full |
390			ADVERTISED_100baseT_Half |
391			ADVERTISED_100baseT_Full |
392			ADVERTISED_10baseT_Half |
393			ADVERTISED_10baseT_Full);
394
395		spin_lock(&priv->lock);
396
397		if (priv->hw->mac->pcs_ctrl_ane)
398			priv->hw->mac->pcs_ctrl_ane(priv->ioaddr, 1,
399						    priv->hw->ps, 0);
400
401		spin_unlock(&priv->lock);
402
403		return 0;
404	}
405
406	rc = phy_ethtool_ksettings_set(phy, cmd);
407
408	return rc;
409}
410
411static u32 stmmac_ethtool_getmsglevel(struct net_device *dev)
412{
413	struct stmmac_priv *priv = netdev_priv(dev);
414	return priv->msg_enable;
415}
416
417static void stmmac_ethtool_setmsglevel(struct net_device *dev, u32 level)
418{
419	struct stmmac_priv *priv = netdev_priv(dev);
420	priv->msg_enable = level;
421
422}
423
424static int stmmac_check_if_running(struct net_device *dev)
425{
426	if (!netif_running(dev))
427		return -EBUSY;
428	return 0;
429}
430
431static int stmmac_ethtool_get_regs_len(struct net_device *dev)
432{
433	return REG_SPACE_SIZE;
434}
435
436static void stmmac_ethtool_gregs(struct net_device *dev,
437			  struct ethtool_regs *regs, void *space)
438{
 
439	u32 *reg_space = (u32 *) space;
440
441	struct stmmac_priv *priv = netdev_priv(dev);
442
443	memset(reg_space, 0x0, REG_SPACE_SIZE);
444
445	priv->hw->mac->dump_regs(priv->hw, reg_space);
446	priv->hw->dma->dump_regs(priv->ioaddr, reg_space);
447	/* Copy DMA registers to where ethtool expects them */
448	memcpy(&reg_space[ETHTOOL_DMA_OFFSET], &reg_space[DMA_BUS_MODE / 4],
449	       NUM_DWMAC1000_DMA_REGS * 4);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
450}
451
452static void
453stmmac_get_pauseparam(struct net_device *netdev,
454		      struct ethtool_pauseparam *pause)
455{
456	struct stmmac_priv *priv = netdev_priv(netdev);
457
 
 
458	pause->rx_pause = 0;
459	pause->tx_pause = 0;
460
461	if (priv->hw->pcs && priv->hw->mac->pcs_get_adv_lp) {
462		struct rgmii_adv adv_lp;
463
464		pause->autoneg = 1;
465		priv->hw->mac->pcs_get_adv_lp(priv->ioaddr, &adv_lp);
466		if (!adv_lp.pause)
467			return;
468	} else {
469		if (!(netdev->phydev->supported & SUPPORTED_Pause) ||
470		    !(netdev->phydev->supported & SUPPORTED_Asym_Pause))
471			return;
472	}
473
474	pause->autoneg = netdev->phydev->autoneg;
475
476	if (priv->flow_ctrl & FLOW_RX)
477		pause->rx_pause = 1;
478	if (priv->flow_ctrl & FLOW_TX)
479		pause->tx_pause = 1;
480
 
481}
482
483static int
484stmmac_set_pauseparam(struct net_device *netdev,
485		      struct ethtool_pauseparam *pause)
486{
487	struct stmmac_priv *priv = netdev_priv(netdev);
488	u32 tx_cnt = priv->plat->tx_queues_to_use;
489	struct phy_device *phy = netdev->phydev;
490	int new_pause = FLOW_OFF;
 
491
492	if (priv->hw->pcs && priv->hw->mac->pcs_get_adv_lp) {
493		struct rgmii_adv adv_lp;
494
495		pause->autoneg = 1;
496		priv->hw->mac->pcs_get_adv_lp(priv->ioaddr, &adv_lp);
497		if (!adv_lp.pause)
498			return -EOPNOTSUPP;
499	} else {
500		if (!(phy->supported & SUPPORTED_Pause) ||
501		    !(phy->supported & SUPPORTED_Asym_Pause))
502			return -EOPNOTSUPP;
503	}
504
505	if (pause->rx_pause)
506		new_pause |= FLOW_RX;
507	if (pause->tx_pause)
508		new_pause |= FLOW_TX;
509
510	priv->flow_ctrl = new_pause;
511	phy->autoneg = pause->autoneg;
512
513	if (phy->autoneg) {
514		if (netif_running(netdev))
515			return phy_start_aneg(phy);
516	}
517
518	priv->hw->mac->flow_ctrl(priv->hw, phy->duplex, priv->flow_ctrl,
519				 priv->pause, tx_cnt);
520	return 0;
521}
522
523static void stmmac_get_ethtool_stats(struct net_device *dev,
524				 struct ethtool_stats *dummy, u64 *data)
525{
526	const char *(*dump)(struct stmmac_safety_stats *stats, int index,
527			unsigned long *count);
528	struct stmmac_priv *priv = netdev_priv(dev);
529	u32 rx_queues_count = priv->plat->rx_queues_to_use;
530	u32 tx_queues_count = priv->plat->tx_queues_to_use;
531	unsigned long count;
532	int i, j = 0;
533
534	if (priv->dma_cap.asp && priv->hw->mac->safety_feat_dump) {
535		dump = priv->hw->mac->safety_feat_dump;
536
537		for (i = 0; i < STMMAC_SAFETY_FEAT_SIZE; i++) {
538			if (dump(&priv->sstats, i, &count))
539				data[j++] = count;
540		}
541	}
542
543	/* Update the DMA HW counters for dwmac10/100 */
544	if (priv->hw->dma->dma_diagnostic_fr)
545		priv->hw->dma->dma_diagnostic_fr(&dev->stats,
546						 (void *) &priv->xstats,
547						 priv->ioaddr);
548	else {
549		/* If supported, for new GMAC chips expose the MMC counters */
550		if (priv->dma_cap.rmon) {
551			dwmac_mmc_read(priv->mmcaddr, &priv->mmc);
552
553			for (i = 0; i < STMMAC_MMC_STATS_LEN; i++) {
554				char *p;
555				p = (char *)priv + stmmac_mmc[i].stat_offset;
556
557				data[j++] = (stmmac_mmc[i].sizeof_stat ==
558					     sizeof(u64)) ? (*(u64 *)p) :
559					     (*(u32 *)p);
560			}
561		}
562		if (priv->eee_enabled) {
563			int val = phy_get_eee_err(dev->phydev);
564			if (val)
565				priv->xstats.phy_eee_wakeup_error_n = val;
566		}
567
568		if ((priv->hw->mac->debug) &&
569		    (priv->synopsys_id >= DWMAC_CORE_3_50))
570			priv->hw->mac->debug(priv->ioaddr,
571					     (void *)&priv->xstats,
572					     rx_queues_count, tx_queues_count);
573	}
574	for (i = 0; i < STMMAC_STATS_LEN; i++) {
575		char *p = (char *)priv + stmmac_gstrings_stats[i].stat_offset;
576		data[j++] = (stmmac_gstrings_stats[i].sizeof_stat ==
577			     sizeof(u64)) ? (*(u64 *)p) : (*(u32 *)p);
578	}
579}
580
581static int stmmac_get_sset_count(struct net_device *netdev, int sset)
582{
583	struct stmmac_priv *priv = netdev_priv(netdev);
584	const char *(*dump)(struct stmmac_safety_stats *stats, int index,
585			unsigned long *count);
586	int i, len, safety_len = 0;
587
588	switch (sset) {
589	case ETH_SS_STATS:
590		len = STMMAC_STATS_LEN;
591
592		if (priv->dma_cap.rmon)
593			len += STMMAC_MMC_STATS_LEN;
594		if (priv->dma_cap.asp && priv->hw->mac->safety_feat_dump) {
595			dump = priv->hw->mac->safety_feat_dump;
596
597			for (i = 0; i < STMMAC_SAFETY_FEAT_SIZE; i++) {
598				if (dump(&priv->sstats, i, NULL))
599					safety_len++;
600			}
601
602			len += safety_len;
603		}
604
605		return len;
606	default:
607		return -EOPNOTSUPP;
608	}
609}
610
611static void stmmac_get_strings(struct net_device *dev, u32 stringset, u8 *data)
612{
613	int i;
614	u8 *p = data;
615	struct stmmac_priv *priv = netdev_priv(dev);
616	const char *(*dump)(struct stmmac_safety_stats *stats, int index,
617			unsigned long *count);
618
619	switch (stringset) {
620	case ETH_SS_STATS:
621		if (priv->dma_cap.asp && priv->hw->mac->safety_feat_dump) {
622			dump = priv->hw->mac->safety_feat_dump;
623			for (i = 0; i < STMMAC_SAFETY_FEAT_SIZE; i++) {
624				const char *desc = dump(&priv->sstats, i, NULL);
625
626				if (desc) {
627					memcpy(p, desc, ETH_GSTRING_LEN);
628					p += ETH_GSTRING_LEN;
629				}
630			}
631		}
632		if (priv->dma_cap.rmon)
633			for (i = 0; i < STMMAC_MMC_STATS_LEN; i++) {
634				memcpy(p, stmmac_mmc[i].stat_string,
635				       ETH_GSTRING_LEN);
636				p += ETH_GSTRING_LEN;
637			}
638		for (i = 0; i < STMMAC_STATS_LEN; i++) {
639			memcpy(p, stmmac_gstrings_stats[i].stat_string,
640				ETH_GSTRING_LEN);
641			p += ETH_GSTRING_LEN;
642		}
643		break;
644	default:
645		WARN_ON(1);
646		break;
647	}
648}
649
650/* Currently only support WOL through Magic packet. */
651static void stmmac_get_wol(struct net_device *dev, struct ethtool_wolinfo *wol)
652{
653	struct stmmac_priv *priv = netdev_priv(dev);
654
655	spin_lock_irq(&priv->lock);
656	if (device_can_wakeup(priv->device)) {
657		wol->supported = WAKE_MAGIC | WAKE_UCAST;
658		wol->wolopts = priv->wolopts;
659	}
660	spin_unlock_irq(&priv->lock);
661}
662
663static int stmmac_set_wol(struct net_device *dev, struct ethtool_wolinfo *wol)
664{
665	struct stmmac_priv *priv = netdev_priv(dev);
666	u32 support = WAKE_MAGIC | WAKE_UCAST;
667
668	/* By default almost all GMAC devices support the WoL via
669	 * magic frame but we can disable it if the HW capability
670	 * register shows no support for pmt_magic_frame. */
671	if ((priv->hw_cap_support) && (!priv->dma_cap.pmt_magic_frame))
672		wol->wolopts &= ~WAKE_MAGIC;
673
674	if (!device_can_wakeup(priv->device))
675		return -EINVAL;
676
677	if (wol->wolopts & ~support)
678		return -EINVAL;
679
680	if (wol->wolopts) {
681		pr_info("stmmac: wakeup enable\n");
682		device_set_wakeup_enable(priv->device, 1);
683		enable_irq_wake(priv->wol_irq);
684	} else {
685		device_set_wakeup_enable(priv->device, 0);
686		disable_irq_wake(priv->wol_irq);
687	}
688
689	spin_lock_irq(&priv->lock);
690	priv->wolopts = wol->wolopts;
691	spin_unlock_irq(&priv->lock);
692
693	return 0;
694}
695
696static int stmmac_ethtool_op_get_eee(struct net_device *dev,
697				     struct ethtool_eee *edata)
698{
699	struct stmmac_priv *priv = netdev_priv(dev);
700
701	if (!priv->dma_cap.eee)
702		return -EOPNOTSUPP;
703
704	edata->eee_enabled = priv->eee_enabled;
705	edata->eee_active = priv->eee_active;
706	edata->tx_lpi_timer = priv->tx_lpi_timer;
707
708	return phy_ethtool_get_eee(dev->phydev, edata);
709}
710
711static int stmmac_ethtool_op_set_eee(struct net_device *dev,
712				     struct ethtool_eee *edata)
713{
714	struct stmmac_priv *priv = netdev_priv(dev);
715
716	priv->eee_enabled = edata->eee_enabled;
717
718	if (!priv->eee_enabled)
719		stmmac_disable_eee_mode(priv);
720	else {
721		/* We are asking for enabling the EEE but it is safe
722		 * to verify all by invoking the eee_init function.
723		 * In case of failure it will return an error.
724		 */
725		priv->eee_enabled = stmmac_eee_init(priv);
726		if (!priv->eee_enabled)
727			return -EOPNOTSUPP;
728
729		/* Do not change tx_lpi_timer in case of failure */
730		priv->tx_lpi_timer = edata->tx_lpi_timer;
731	}
732
733	return phy_ethtool_set_eee(dev->phydev, edata);
734}
735
736static u32 stmmac_usec2riwt(u32 usec, struct stmmac_priv *priv)
737{
738	unsigned long clk = clk_get_rate(priv->plat->stmmac_clk);
739
740	if (!clk)
741		return 0;
742
743	return (usec * (clk / 1000000)) / 256;
744}
745
746static u32 stmmac_riwt2usec(u32 riwt, struct stmmac_priv *priv)
747{
748	unsigned long clk = clk_get_rate(priv->plat->stmmac_clk);
749
750	if (!clk)
751		return 0;
752
753	return (riwt * 256) / (clk / 1000000);
754}
755
756static int stmmac_get_coalesce(struct net_device *dev,
757			       struct ethtool_coalesce *ec)
758{
759	struct stmmac_priv *priv = netdev_priv(dev);
760
761	ec->tx_coalesce_usecs = priv->tx_coal_timer;
762	ec->tx_max_coalesced_frames = priv->tx_coal_frames;
763
764	if (priv->use_riwt)
765		ec->rx_coalesce_usecs = stmmac_riwt2usec(priv->rx_riwt, priv);
766
767	return 0;
768}
769
770static int stmmac_set_coalesce(struct net_device *dev,
771			       struct ethtool_coalesce *ec)
772{
773	struct stmmac_priv *priv = netdev_priv(dev);
774	u32 rx_cnt = priv->plat->rx_queues_to_use;
775	unsigned int rx_riwt;
776
777	/* Check not supported parameters  */
778	if ((ec->rx_max_coalesced_frames) || (ec->rx_coalesce_usecs_irq) ||
779	    (ec->rx_max_coalesced_frames_irq) || (ec->tx_coalesce_usecs_irq) ||
780	    (ec->use_adaptive_rx_coalesce) || (ec->use_adaptive_tx_coalesce) ||
781	    (ec->pkt_rate_low) || (ec->rx_coalesce_usecs_low) ||
782	    (ec->rx_max_coalesced_frames_low) || (ec->tx_coalesce_usecs_high) ||
783	    (ec->tx_max_coalesced_frames_low) || (ec->pkt_rate_high) ||
784	    (ec->tx_coalesce_usecs_low) || (ec->rx_coalesce_usecs_high) ||
785	    (ec->rx_max_coalesced_frames_high) ||
786	    (ec->tx_max_coalesced_frames_irq) ||
787	    (ec->stats_block_coalesce_usecs) ||
788	    (ec->tx_max_coalesced_frames_high) || (ec->rate_sample_interval))
789		return -EOPNOTSUPP;
790
791	if (ec->rx_coalesce_usecs == 0)
792		return -EINVAL;
793
794	if ((ec->tx_coalesce_usecs == 0) &&
795	    (ec->tx_max_coalesced_frames == 0))
796		return -EINVAL;
797
798	if ((ec->tx_coalesce_usecs > STMMAC_MAX_COAL_TX_TICK) ||
799	    (ec->tx_max_coalesced_frames > STMMAC_TX_MAX_FRAMES))
800		return -EINVAL;
801
802	rx_riwt = stmmac_usec2riwt(ec->rx_coalesce_usecs, priv);
803
804	if ((rx_riwt > MAX_DMA_RIWT) || (rx_riwt < MIN_DMA_RIWT))
805		return -EINVAL;
806	else if (!priv->use_riwt)
807		return -EOPNOTSUPP;
808
809	/* Only copy relevant parameters, ignore all others. */
810	priv->tx_coal_frames = ec->tx_max_coalesced_frames;
811	priv->tx_coal_timer = ec->tx_coalesce_usecs;
812	priv->rx_riwt = rx_riwt;
813	priv->hw->dma->rx_watchdog(priv->ioaddr, priv->rx_riwt, rx_cnt);
814
815	return 0;
816}
817
818static int stmmac_get_ts_info(struct net_device *dev,
819			      struct ethtool_ts_info *info)
820{
821	struct stmmac_priv *priv = netdev_priv(dev);
822
823	if ((priv->dma_cap.time_stamp || priv->dma_cap.atime_stamp)) {
824
825		info->so_timestamping = SOF_TIMESTAMPING_TX_SOFTWARE |
826					SOF_TIMESTAMPING_TX_HARDWARE |
827					SOF_TIMESTAMPING_RX_SOFTWARE |
828					SOF_TIMESTAMPING_RX_HARDWARE |
829					SOF_TIMESTAMPING_SOFTWARE |
830					SOF_TIMESTAMPING_RAW_HARDWARE;
831
832		if (priv->ptp_clock)
833			info->phc_index = ptp_clock_index(priv->ptp_clock);
834
835		info->tx_types = (1 << HWTSTAMP_TX_OFF) | (1 << HWTSTAMP_TX_ON);
836
837		info->rx_filters = ((1 << HWTSTAMP_FILTER_NONE) |
838				    (1 << HWTSTAMP_FILTER_PTP_V1_L4_EVENT) |
839				    (1 << HWTSTAMP_FILTER_PTP_V1_L4_SYNC) |
840				    (1 << HWTSTAMP_FILTER_PTP_V1_L4_DELAY_REQ) |
841				    (1 << HWTSTAMP_FILTER_PTP_V2_L4_EVENT) |
842				    (1 << HWTSTAMP_FILTER_PTP_V2_L4_SYNC) |
843				    (1 << HWTSTAMP_FILTER_PTP_V2_L4_DELAY_REQ) |
844				    (1 << HWTSTAMP_FILTER_PTP_V2_EVENT) |
845				    (1 << HWTSTAMP_FILTER_PTP_V2_SYNC) |
846				    (1 << HWTSTAMP_FILTER_PTP_V2_DELAY_REQ) |
847				    (1 << HWTSTAMP_FILTER_ALL));
848		return 0;
849	} else
850		return ethtool_op_get_ts_info(dev, info);
851}
852
853static int stmmac_get_tunable(struct net_device *dev,
854			      const struct ethtool_tunable *tuna, void *data)
855{
856	struct stmmac_priv *priv = netdev_priv(dev);
857	int ret = 0;
858
859	switch (tuna->id) {
860	case ETHTOOL_RX_COPYBREAK:
861		*(u32 *)data = priv->rx_copybreak;
862		break;
863	default:
864		ret = -EINVAL;
865		break;
866	}
867
868	return ret;
869}
870
871static int stmmac_set_tunable(struct net_device *dev,
872			      const struct ethtool_tunable *tuna,
873			      const void *data)
874{
875	struct stmmac_priv *priv = netdev_priv(dev);
876	int ret = 0;
877
878	switch (tuna->id) {
879	case ETHTOOL_RX_COPYBREAK:
880		priv->rx_copybreak = *(u32 *)data;
881		break;
882	default:
883		ret = -EINVAL;
884		break;
885	}
886
887	return ret;
888}
889
890static const struct ethtool_ops stmmac_ethtool_ops = {
891	.begin = stmmac_check_if_running,
892	.get_drvinfo = stmmac_ethtool_getdrvinfo,
 
 
893	.get_msglevel = stmmac_ethtool_getmsglevel,
894	.set_msglevel = stmmac_ethtool_setmsglevel,
895	.get_regs = stmmac_ethtool_gregs,
896	.get_regs_len = stmmac_ethtool_get_regs_len,
897	.get_link = ethtool_op_get_link,
898	.nway_reset = phy_ethtool_nway_reset,
899	.get_pauseparam = stmmac_get_pauseparam,
900	.set_pauseparam = stmmac_set_pauseparam,
901	.get_ethtool_stats = stmmac_get_ethtool_stats,
902	.get_strings = stmmac_get_strings,
903	.get_wol = stmmac_get_wol,
904	.set_wol = stmmac_set_wol,
905	.get_eee = stmmac_ethtool_op_get_eee,
906	.set_eee = stmmac_ethtool_op_set_eee,
907	.get_sset_count	= stmmac_get_sset_count,
908	.get_ts_info = stmmac_get_ts_info,
909	.get_coalesce = stmmac_get_coalesce,
910	.set_coalesce = stmmac_set_coalesce,
911	.get_tunable = stmmac_get_tunable,
912	.set_tunable = stmmac_set_tunable,
913	.get_link_ksettings = stmmac_ethtool_get_link_ksettings,
914	.set_link_ksettings = stmmac_ethtool_set_link_ksettings,
915};
916
917void stmmac_set_ethtool_ops(struct net_device *netdev)
918{
919	netdev->ethtool_ops = &stmmac_ethtool_ops;
920}