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