1 // SPDX-License-Identifier: GPL-2.0-only
2 /* 10G controller driver for Samsung SoCs
4 * Copyright (C) 2013 Samsung Electronics Co., Ltd.
5 * http://www.samsung.com
7 * Author: Siva Reddy Kallam <siva.kallam@samsung.com>
10 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
12 #include <linux/clk.h>
13 #include <linux/interrupt.h>
14 #include <linux/kernel.h>
15 #include <linux/netdevice.h>
16 #include <linux/net_tstamp.h>
17 #include <linux/phy.h>
18 #include <linux/ptp_clock_kernel.h>
20 #include "sxgbe_common.h"
21 #include "sxgbe_reg.h"
22 #include "sxgbe_dma.h"
25 char stat_string
[ETH_GSTRING_LEN
];
30 #define SXGBE_STAT(m) \
33 sizeof_field(struct sxgbe_extra_stats, m), \
34 offsetof(struct sxgbe_priv_data, xstats.m) \
37 static const struct sxgbe_stats sxgbe_gstrings_stats
[] = {
38 /* TX/RX IRQ events */
39 SXGBE_STAT(tx_process_stopped_irq
),
40 SXGBE_STAT(tx_ctxt_desc_err
),
41 SXGBE_STAT(tx_threshold
),
42 SXGBE_STAT(rx_threshold
),
45 SXGBE_STAT(normal_irq_n
),
46 SXGBE_STAT(tx_normal_irq_n
),
47 SXGBE_STAT(rx_normal_irq_n
),
48 SXGBE_STAT(napi_poll
),
50 SXGBE_STAT(tx_reset_ic_bit
),
51 SXGBE_STAT(rx_process_stopped_irq
),
52 SXGBE_STAT(rx_underflow_irq
),
54 /* Bus access errors */
55 SXGBE_STAT(fatal_bus_error_irq
),
56 SXGBE_STAT(tx_read_transfer_err
),
57 SXGBE_STAT(tx_write_transfer_err
),
58 SXGBE_STAT(tx_desc_access_err
),
59 SXGBE_STAT(tx_buffer_access_err
),
60 SXGBE_STAT(tx_data_transfer_err
),
61 SXGBE_STAT(rx_read_transfer_err
),
62 SXGBE_STAT(rx_write_transfer_err
),
63 SXGBE_STAT(rx_desc_access_err
),
64 SXGBE_STAT(rx_buffer_access_err
),
65 SXGBE_STAT(rx_data_transfer_err
),
68 SXGBE_STAT(tx_lpi_entry_n
),
69 SXGBE_STAT(tx_lpi_exit_n
),
70 SXGBE_STAT(rx_lpi_entry_n
),
71 SXGBE_STAT(rx_lpi_exit_n
),
72 SXGBE_STAT(eee_wakeup_error_n
),
76 SXGBE_STAT(rx_code_gmii_err
),
77 SXGBE_STAT(rx_watchdog_err
),
78 SXGBE_STAT(rx_crc_err
),
79 SXGBE_STAT(rx_gaint_pkt_err
),
80 SXGBE_STAT(ip_hdr_err
),
81 SXGBE_STAT(ip_payload_err
),
82 SXGBE_STAT(overflow_error
),
86 SXGBE_STAT(mac_ctl_pkt
),
87 SXGBE_STAT(dcb_ctl_pkt
),
90 SXGBE_STAT(untag_okt
),
91 SXGBE_STAT(other_pkt
),
92 SXGBE_STAT(svlan_tag_pkt
),
93 SXGBE_STAT(cvlan_tag_pkt
),
94 SXGBE_STAT(dvlan_ocvlan_icvlan_pkt
),
95 SXGBE_STAT(dvlan_osvlan_isvlan_pkt
),
96 SXGBE_STAT(dvlan_osvlan_icvlan_pkt
),
97 SXGBE_STAT(dvan_ocvlan_icvlan_pkt
),
100 SXGBE_STAT(not_ip_pkt
),
101 SXGBE_STAT(ip4_tcp_pkt
),
102 SXGBE_STAT(ip4_udp_pkt
),
103 SXGBE_STAT(ip4_icmp_pkt
),
104 SXGBE_STAT(ip4_unknown_pkt
),
105 SXGBE_STAT(ip6_tcp_pkt
),
106 SXGBE_STAT(ip6_udp_pkt
),
107 SXGBE_STAT(ip6_icmp_pkt
),
108 SXGBE_STAT(ip6_unknown_pkt
),
110 /* Filter specific */
111 SXGBE_STAT(vlan_filter_match
),
112 SXGBE_STAT(sa_filter_fail
),
113 SXGBE_STAT(da_filter_fail
),
114 SXGBE_STAT(hash_filter_pass
),
115 SXGBE_STAT(l3_filter_match
),
116 SXGBE_STAT(l4_filter_match
),
118 /* RX context specific */
119 SXGBE_STAT(timestamp_dropped
),
120 SXGBE_STAT(rx_msg_type_no_ptp
),
121 SXGBE_STAT(rx_ptp_type_sync
),
122 SXGBE_STAT(rx_ptp_type_follow_up
),
123 SXGBE_STAT(rx_ptp_type_delay_req
),
124 SXGBE_STAT(rx_ptp_type_delay_resp
),
125 SXGBE_STAT(rx_ptp_type_pdelay_req
),
126 SXGBE_STAT(rx_ptp_type_pdelay_resp
),
127 SXGBE_STAT(rx_ptp_type_pdelay_follow_up
),
128 SXGBE_STAT(rx_ptp_announce
),
129 SXGBE_STAT(rx_ptp_mgmt
),
130 SXGBE_STAT(rx_ptp_signal
),
131 SXGBE_STAT(rx_ptp_resv_msg_type
),
133 #define SXGBE_STATS_LEN ARRAY_SIZE(sxgbe_gstrings_stats)
135 static int sxgbe_get_eee(struct net_device
*dev
,
136 struct ethtool_eee
*edata
)
138 struct sxgbe_priv_data
*priv
= netdev_priv(dev
);
140 if (!priv
->hw_cap
.eee
)
143 edata
->eee_enabled
= priv
->eee_enabled
;
144 edata
->eee_active
= priv
->eee_active
;
145 edata
->tx_lpi_timer
= priv
->tx_lpi_timer
;
147 return phy_ethtool_get_eee(dev
->phydev
, edata
);
150 static int sxgbe_set_eee(struct net_device
*dev
,
151 struct ethtool_eee
*edata
)
153 struct sxgbe_priv_data
*priv
= netdev_priv(dev
);
155 priv
->eee_enabled
= edata
->eee_enabled
;
157 if (!priv
->eee_enabled
) {
158 sxgbe_disable_eee_mode(priv
);
160 /* We are asking for enabling the EEE but it is safe
161 * to verify all by invoking the eee_init function.
162 * In case of failure it will return an error.
164 priv
->eee_enabled
= sxgbe_eee_init(priv
);
165 if (!priv
->eee_enabled
)
168 /* Do not change tx_lpi_timer in case of failure */
169 priv
->tx_lpi_timer
= edata
->tx_lpi_timer
;
172 return phy_ethtool_set_eee(dev
->phydev
, edata
);
175 static void sxgbe_getdrvinfo(struct net_device
*dev
,
176 struct ethtool_drvinfo
*info
)
178 strlcpy(info
->driver
, KBUILD_MODNAME
, sizeof(info
->driver
));
179 strlcpy(info
->version
, DRV_VERSION
, sizeof(info
->version
));
182 static u32
sxgbe_getmsglevel(struct net_device
*dev
)
184 struct sxgbe_priv_data
*priv
= netdev_priv(dev
);
185 return priv
->msg_enable
;
188 static void sxgbe_setmsglevel(struct net_device
*dev
, u32 level
)
190 struct sxgbe_priv_data
*priv
= netdev_priv(dev
);
191 priv
->msg_enable
= level
;
194 static void sxgbe_get_strings(struct net_device
*dev
, u32 stringset
, u8
*data
)
201 for (i
= 0; i
< SXGBE_STATS_LEN
; i
++) {
202 memcpy(p
, sxgbe_gstrings_stats
[i
].stat_string
,
204 p
+= ETH_GSTRING_LEN
;
213 static int sxgbe_get_sset_count(struct net_device
*netdev
, int sset
)
219 len
= SXGBE_STATS_LEN
;
226 static void sxgbe_get_ethtool_stats(struct net_device
*dev
,
227 struct ethtool_stats
*dummy
, u64
*data
)
229 struct sxgbe_priv_data
*priv
= netdev_priv(dev
);
233 if (priv
->eee_enabled
) {
234 int val
= phy_get_eee_err(dev
->phydev
);
237 priv
->xstats
.eee_wakeup_error_n
= val
;
240 for (i
= 0; i
< SXGBE_STATS_LEN
; i
++) {
241 p
= (char *)priv
+ sxgbe_gstrings_stats
[i
].stat_offset
;
242 data
[i
] = (sxgbe_gstrings_stats
[i
].sizeof_stat
== sizeof(u64
))
243 ? (*(u64
*)p
) : (*(u32
*)p
);
247 static void sxgbe_get_channels(struct net_device
*dev
,
248 struct ethtool_channels
*channel
)
250 channel
->max_rx
= SXGBE_MAX_RX_CHANNELS
;
251 channel
->max_tx
= SXGBE_MAX_TX_CHANNELS
;
252 channel
->rx_count
= SXGBE_RX_QUEUES
;
253 channel
->tx_count
= SXGBE_TX_QUEUES
;
256 static u32
sxgbe_riwt2usec(u32 riwt
, struct sxgbe_priv_data
*priv
)
258 unsigned long clk
= clk_get_rate(priv
->sxgbe_clk
);
263 return (riwt
* 256) / (clk
/ 1000000);
266 static u32
sxgbe_usec2riwt(u32 usec
, struct sxgbe_priv_data
*priv
)
268 unsigned long clk
= clk_get_rate(priv
->sxgbe_clk
);
273 return (usec
* (clk
/ 1000000)) / 256;
276 static int sxgbe_get_coalesce(struct net_device
*dev
,
277 struct ethtool_coalesce
*ec
)
279 struct sxgbe_priv_data
*priv
= netdev_priv(dev
);
282 ec
->rx_coalesce_usecs
= sxgbe_riwt2usec(priv
->rx_riwt
, priv
);
287 static int sxgbe_set_coalesce(struct net_device
*dev
,
288 struct ethtool_coalesce
*ec
)
290 struct sxgbe_priv_data
*priv
= netdev_priv(dev
);
291 unsigned int rx_riwt
;
293 if (!ec
->rx_coalesce_usecs
)
296 rx_riwt
= sxgbe_usec2riwt(ec
->rx_coalesce_usecs
, priv
);
298 if ((rx_riwt
> SXGBE_MAX_DMA_RIWT
) || (rx_riwt
< SXGBE_MIN_DMA_RIWT
))
300 else if (!priv
->use_riwt
)
303 priv
->rx_riwt
= rx_riwt
;
304 priv
->hw
->dma
->rx_watchdog(priv
->ioaddr
, priv
->rx_riwt
);
309 static int sxgbe_get_rss_hash_opts(struct sxgbe_priv_data
*priv
,
310 struct ethtool_rxnfc
*cmd
)
314 /* Report default options for RSS on sxgbe */
315 switch (cmd
->flow_type
) {
318 cmd
->data
|= RXH_L4_B_0_1
| RXH_L4_B_2_3
;
325 cmd
->data
|= RXH_IP_SRC
| RXH_IP_DST
;
329 cmd
->data
|= RXH_L4_B_0_1
| RXH_L4_B_2_3
;
336 cmd
->data
|= RXH_IP_SRC
| RXH_IP_DST
;
345 static int sxgbe_get_rxnfc(struct net_device
*dev
, struct ethtool_rxnfc
*cmd
,
348 struct sxgbe_priv_data
*priv
= netdev_priv(dev
);
349 int ret
= -EOPNOTSUPP
;
353 ret
= sxgbe_get_rss_hash_opts(priv
, cmd
);
362 static int sxgbe_set_rss_hash_opt(struct sxgbe_priv_data
*priv
,
363 struct ethtool_rxnfc
*cmd
)
367 /* RSS does not support anything other than hashing
368 * to queues on src and dst IPs and ports
370 if (cmd
->data
& ~(RXH_IP_SRC
| RXH_IP_DST
|
371 RXH_L4_B_0_1
| RXH_L4_B_2_3
))
374 switch (cmd
->flow_type
) {
377 if (!(cmd
->data
& RXH_IP_SRC
) ||
378 !(cmd
->data
& RXH_IP_DST
) ||
379 !(cmd
->data
& RXH_L4_B_0_1
) ||
380 !(cmd
->data
& RXH_L4_B_2_3
))
382 reg_val
= SXGBE_CORE_RSS_CTL_TCP4TE
;
386 if (!(cmd
->data
& RXH_IP_SRC
) ||
387 !(cmd
->data
& RXH_IP_DST
) ||
388 !(cmd
->data
& RXH_L4_B_0_1
) ||
389 !(cmd
->data
& RXH_L4_B_2_3
))
391 reg_val
= SXGBE_CORE_RSS_CTL_UDP4TE
;
403 if (!(cmd
->data
& RXH_IP_SRC
) ||
404 !(cmd
->data
& RXH_IP_DST
) ||
405 (cmd
->data
& RXH_L4_B_0_1
) ||
406 (cmd
->data
& RXH_L4_B_2_3
))
408 reg_val
= SXGBE_CORE_RSS_CTL_IP2TE
;
414 /* Read SXGBE RSS control register and update */
415 reg_val
|= readl(priv
->ioaddr
+ SXGBE_CORE_RSS_CTL_REG
);
416 writel(reg_val
, priv
->ioaddr
+ SXGBE_CORE_RSS_CTL_REG
);
417 readl(priv
->ioaddr
+ SXGBE_CORE_RSS_CTL_REG
);
422 static int sxgbe_set_rxnfc(struct net_device
*dev
, struct ethtool_rxnfc
*cmd
)
424 struct sxgbe_priv_data
*priv
= netdev_priv(dev
);
425 int ret
= -EOPNOTSUPP
;
429 ret
= sxgbe_set_rss_hash_opt(priv
, cmd
);
438 static void sxgbe_get_regs(struct net_device
*dev
,
439 struct ethtool_regs
*regs
, void *space
)
441 struct sxgbe_priv_data
*priv
= netdev_priv(dev
);
442 u32
*reg_space
= (u32
*)space
;
445 void __iomem
*ioaddr
= priv
->ioaddr
;
447 memset(reg_space
, 0x0, REG_SPACE_SIZE
);
450 for (reg_offset
= START_MAC_REG_OFFSET
;
451 reg_offset
<= MAX_MAC_REG_OFFSET
; reg_offset
+= 4) {
452 reg_space
[reg_ix
] = readl(ioaddr
+ reg_offset
);
457 for (reg_offset
= START_MTL_REG_OFFSET
;
458 reg_offset
<= MAX_MTL_REG_OFFSET
; reg_offset
+= 4) {
459 reg_space
[reg_ix
] = readl(ioaddr
+ reg_offset
);
464 for (reg_offset
= START_DMA_REG_OFFSET
;
465 reg_offset
<= MAX_DMA_REG_OFFSET
; reg_offset
+= 4) {
466 reg_space
[reg_ix
] = readl(ioaddr
+ reg_offset
);
470 BUG_ON(reg_ix
* 4 > REG_SPACE_SIZE
);
473 static int sxgbe_get_regs_len(struct net_device
*dev
)
475 return REG_SPACE_SIZE
;
478 static const struct ethtool_ops sxgbe_ethtool_ops
= {
479 .supported_coalesce_params
= ETHTOOL_COALESCE_RX_USECS
,
480 .get_drvinfo
= sxgbe_getdrvinfo
,
481 .get_msglevel
= sxgbe_getmsglevel
,
482 .set_msglevel
= sxgbe_setmsglevel
,
483 .get_link
= ethtool_op_get_link
,
484 .get_strings
= sxgbe_get_strings
,
485 .get_ethtool_stats
= sxgbe_get_ethtool_stats
,
486 .get_sset_count
= sxgbe_get_sset_count
,
487 .get_channels
= sxgbe_get_channels
,
488 .get_coalesce
= sxgbe_get_coalesce
,
489 .set_coalesce
= sxgbe_set_coalesce
,
490 .get_rxnfc
= sxgbe_get_rxnfc
,
491 .set_rxnfc
= sxgbe_set_rxnfc
,
492 .get_regs
= sxgbe_get_regs
,
493 .get_regs_len
= sxgbe_get_regs_len
,
494 .get_eee
= sxgbe_get_eee
,
495 .set_eee
= sxgbe_set_eee
,
496 .get_link_ksettings
= phy_ethtool_get_link_ksettings
,
497 .set_link_ksettings
= phy_ethtool_set_link_ksettings
,
500 void sxgbe_set_ethtool_ops(struct net_device
*netdev
)
502 netdev
->ethtool_ops
= &sxgbe_ethtool_ops
;