1 /* 10G controller driver for Samsung SoCs
3 * Copyright (C) 2013 Samsung Electronics Co., Ltd.
4 * http://www.samsung.com
6 * Author: Siva Reddy Kallam <siva.kallam@samsung.com>
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License version 2 as
10 * published by the Free Software Foundation.
13 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
15 #include <linux/clk.h>
16 #include <linux/interrupt.h>
17 #include <linux/kernel.h>
18 #include <linux/netdevice.h>
19 #include <linux/net_tstamp.h>
20 #include <linux/phy.h>
21 #include <linux/ptp_clock_kernel.h>
23 #include "sxgbe_common.h"
24 #include "sxgbe_reg.h"
25 #include "sxgbe_dma.h"
28 char stat_string
[ETH_GSTRING_LEN
];
33 #define SXGBE_STAT(m) \
36 FIELD_SIZEOF(struct sxgbe_extra_stats, m), \
37 offsetof(struct sxgbe_priv_data, xstats.m) \
40 static const struct sxgbe_stats sxgbe_gstrings_stats
[] = {
41 /* TX/RX IRQ events */
42 SXGBE_STAT(tx_process_stopped_irq
),
43 SXGBE_STAT(tx_ctxt_desc_err
),
44 SXGBE_STAT(tx_threshold
),
45 SXGBE_STAT(rx_threshold
),
48 SXGBE_STAT(normal_irq_n
),
49 SXGBE_STAT(tx_normal_irq_n
),
50 SXGBE_STAT(rx_normal_irq_n
),
51 SXGBE_STAT(napi_poll
),
53 SXGBE_STAT(tx_reset_ic_bit
),
54 SXGBE_STAT(rx_process_stopped_irq
),
55 SXGBE_STAT(rx_underflow_irq
),
57 /* Bus access errors */
58 SXGBE_STAT(fatal_bus_error_irq
),
59 SXGBE_STAT(tx_read_transfer_err
),
60 SXGBE_STAT(tx_write_transfer_err
),
61 SXGBE_STAT(tx_desc_access_err
),
62 SXGBE_STAT(tx_buffer_access_err
),
63 SXGBE_STAT(tx_data_transfer_err
),
64 SXGBE_STAT(rx_read_transfer_err
),
65 SXGBE_STAT(rx_write_transfer_err
),
66 SXGBE_STAT(rx_desc_access_err
),
67 SXGBE_STAT(rx_buffer_access_err
),
68 SXGBE_STAT(rx_data_transfer_err
),
71 SXGBE_STAT(tx_lpi_entry_n
),
72 SXGBE_STAT(tx_lpi_exit_n
),
73 SXGBE_STAT(rx_lpi_entry_n
),
74 SXGBE_STAT(rx_lpi_exit_n
),
75 SXGBE_STAT(eee_wakeup_error_n
),
79 SXGBE_STAT(rx_code_gmii_err
),
80 SXGBE_STAT(rx_watchdog_err
),
81 SXGBE_STAT(rx_crc_err
),
82 SXGBE_STAT(rx_gaint_pkt_err
),
83 SXGBE_STAT(ip_hdr_err
),
84 SXGBE_STAT(ip_payload_err
),
85 SXGBE_STAT(overflow_error
),
89 SXGBE_STAT(mac_ctl_pkt
),
90 SXGBE_STAT(dcb_ctl_pkt
),
93 SXGBE_STAT(untag_okt
),
94 SXGBE_STAT(other_pkt
),
95 SXGBE_STAT(svlan_tag_pkt
),
96 SXGBE_STAT(cvlan_tag_pkt
),
97 SXGBE_STAT(dvlan_ocvlan_icvlan_pkt
),
98 SXGBE_STAT(dvlan_osvlan_isvlan_pkt
),
99 SXGBE_STAT(dvlan_osvlan_icvlan_pkt
),
100 SXGBE_STAT(dvan_ocvlan_icvlan_pkt
),
103 SXGBE_STAT(not_ip_pkt
),
104 SXGBE_STAT(ip4_tcp_pkt
),
105 SXGBE_STAT(ip4_udp_pkt
),
106 SXGBE_STAT(ip4_icmp_pkt
),
107 SXGBE_STAT(ip4_unknown_pkt
),
108 SXGBE_STAT(ip6_tcp_pkt
),
109 SXGBE_STAT(ip6_udp_pkt
),
110 SXGBE_STAT(ip6_icmp_pkt
),
111 SXGBE_STAT(ip6_unknown_pkt
),
113 /* Filter specific */
114 SXGBE_STAT(vlan_filter_match
),
115 SXGBE_STAT(sa_filter_fail
),
116 SXGBE_STAT(da_filter_fail
),
117 SXGBE_STAT(hash_filter_pass
),
118 SXGBE_STAT(l3_filter_match
),
119 SXGBE_STAT(l4_filter_match
),
121 /* RX context specific */
122 SXGBE_STAT(timestamp_dropped
),
123 SXGBE_STAT(rx_msg_type_no_ptp
),
124 SXGBE_STAT(rx_ptp_type_sync
),
125 SXGBE_STAT(rx_ptp_type_follow_up
),
126 SXGBE_STAT(rx_ptp_type_delay_req
),
127 SXGBE_STAT(rx_ptp_type_delay_resp
),
128 SXGBE_STAT(rx_ptp_type_pdelay_req
),
129 SXGBE_STAT(rx_ptp_type_pdelay_resp
),
130 SXGBE_STAT(rx_ptp_type_pdelay_follow_up
),
131 SXGBE_STAT(rx_ptp_announce
),
132 SXGBE_STAT(rx_ptp_mgmt
),
133 SXGBE_STAT(rx_ptp_signal
),
134 SXGBE_STAT(rx_ptp_resv_msg_type
),
136 #define SXGBE_STATS_LEN ARRAY_SIZE(sxgbe_gstrings_stats)
138 static int sxgbe_get_eee(struct net_device
*dev
,
139 struct ethtool_eee
*edata
)
141 struct sxgbe_priv_data
*priv
= netdev_priv(dev
);
143 if (!priv
->hw_cap
.eee
)
146 edata
->eee_enabled
= priv
->eee_enabled
;
147 edata
->eee_active
= priv
->eee_active
;
148 edata
->tx_lpi_timer
= priv
->tx_lpi_timer
;
150 return phy_ethtool_get_eee(priv
->phydev
, edata
);
153 static int sxgbe_set_eee(struct net_device
*dev
,
154 struct ethtool_eee
*edata
)
156 struct sxgbe_priv_data
*priv
= netdev_priv(dev
);
158 priv
->eee_enabled
= edata
->eee_enabled
;
160 if (!priv
->eee_enabled
) {
161 sxgbe_disable_eee_mode(priv
);
163 /* We are asking for enabling the EEE but it is safe
164 * to verify all by invoking the eee_init function.
165 * In case of failure it will return an error.
167 priv
->eee_enabled
= sxgbe_eee_init(priv
);
168 if (!priv
->eee_enabled
)
171 /* Do not change tx_lpi_timer in case of failure */
172 priv
->tx_lpi_timer
= edata
->tx_lpi_timer
;
175 return phy_ethtool_set_eee(priv
->phydev
, edata
);
178 static void sxgbe_getdrvinfo(struct net_device
*dev
,
179 struct ethtool_drvinfo
*info
)
181 strlcpy(info
->driver
, KBUILD_MODNAME
, sizeof(info
->driver
));
182 strlcpy(info
->version
, DRV_VERSION
, sizeof(info
->version
));
185 static int sxgbe_getsettings(struct net_device
*dev
,
186 struct ethtool_cmd
*cmd
)
188 struct sxgbe_priv_data
*priv
= netdev_priv(dev
);
191 return phy_ethtool_gset(priv
->phydev
, cmd
);
196 static int sxgbe_setsettings(struct net_device
*dev
, struct ethtool_cmd
*cmd
)
198 struct sxgbe_priv_data
*priv
= netdev_priv(dev
);
201 return phy_ethtool_sset(priv
->phydev
, cmd
);
206 static u32
sxgbe_getmsglevel(struct net_device
*dev
)
208 struct sxgbe_priv_data
*priv
= netdev_priv(dev
);
209 return priv
->msg_enable
;
212 static void sxgbe_setmsglevel(struct net_device
*dev
, u32 level
)
214 struct sxgbe_priv_data
*priv
= netdev_priv(dev
);
215 priv
->msg_enable
= level
;
218 static void sxgbe_get_strings(struct net_device
*dev
, u32 stringset
, u8
*data
)
225 for (i
= 0; i
< SXGBE_STATS_LEN
; i
++) {
226 memcpy(p
, sxgbe_gstrings_stats
[i
].stat_string
,
228 p
+= ETH_GSTRING_LEN
;
237 static int sxgbe_get_sset_count(struct net_device
*netdev
, int sset
)
243 len
= SXGBE_STATS_LEN
;
250 static void sxgbe_get_ethtool_stats(struct net_device
*dev
,
251 struct ethtool_stats
*dummy
, u64
*data
)
253 struct sxgbe_priv_data
*priv
= netdev_priv(dev
);
257 if (priv
->eee_enabled
) {
258 int val
= phy_get_eee_err(priv
->phydev
);
261 priv
->xstats
.eee_wakeup_error_n
= val
;
264 for (i
= 0; i
< SXGBE_STATS_LEN
; i
++) {
265 p
= (char *)priv
+ sxgbe_gstrings_stats
[i
].stat_offset
;
266 data
[i
] = (sxgbe_gstrings_stats
[i
].sizeof_stat
== sizeof(u64
))
267 ? (*(u64
*)p
) : (*(u32
*)p
);
271 static void sxgbe_get_channels(struct net_device
*dev
,
272 struct ethtool_channels
*channel
)
274 channel
->max_rx
= SXGBE_MAX_RX_CHANNELS
;
275 channel
->max_tx
= SXGBE_MAX_TX_CHANNELS
;
276 channel
->rx_count
= SXGBE_RX_QUEUES
;
277 channel
->tx_count
= SXGBE_TX_QUEUES
;
280 static u32
sxgbe_riwt2usec(u32 riwt
, struct sxgbe_priv_data
*priv
)
282 unsigned long clk
= clk_get_rate(priv
->sxgbe_clk
);
287 return (riwt
* 256) / (clk
/ 1000000);
290 static u32
sxgbe_usec2riwt(u32 usec
, struct sxgbe_priv_data
*priv
)
292 unsigned long clk
= clk_get_rate(priv
->sxgbe_clk
);
297 return (usec
* (clk
/ 1000000)) / 256;
300 static int sxgbe_get_coalesce(struct net_device
*dev
,
301 struct ethtool_coalesce
*ec
)
303 struct sxgbe_priv_data
*priv
= netdev_priv(dev
);
306 ec
->rx_coalesce_usecs
= sxgbe_riwt2usec(priv
->rx_riwt
, priv
);
311 static int sxgbe_set_coalesce(struct net_device
*dev
,
312 struct ethtool_coalesce
*ec
)
314 struct sxgbe_priv_data
*priv
= netdev_priv(dev
);
315 unsigned int rx_riwt
;
317 if (!ec
->rx_coalesce_usecs
)
320 rx_riwt
= sxgbe_usec2riwt(ec
->rx_coalesce_usecs
, priv
);
322 if ((rx_riwt
> SXGBE_MAX_DMA_RIWT
) || (rx_riwt
< SXGBE_MIN_DMA_RIWT
))
324 else if (!priv
->use_riwt
)
327 priv
->rx_riwt
= rx_riwt
;
328 priv
->hw
->dma
->rx_watchdog(priv
->ioaddr
, priv
->rx_riwt
);
333 static int sxgbe_get_rss_hash_opts(struct sxgbe_priv_data
*priv
,
334 struct ethtool_rxnfc
*cmd
)
338 /* Report default options for RSS on sxgbe */
339 switch (cmd
->flow_type
) {
342 cmd
->data
|= RXH_L4_B_0_1
| RXH_L4_B_2_3
;
348 cmd
->data
|= RXH_IP_SRC
| RXH_IP_DST
;
352 cmd
->data
|= RXH_L4_B_0_1
| RXH_L4_B_2_3
;
358 cmd
->data
|= RXH_IP_SRC
| RXH_IP_DST
;
367 static int sxgbe_get_rxnfc(struct net_device
*dev
, struct ethtool_rxnfc
*cmd
,
370 struct sxgbe_priv_data
*priv
= netdev_priv(dev
);
371 int ret
= -EOPNOTSUPP
;
375 ret
= sxgbe_get_rss_hash_opts(priv
, cmd
);
384 static int sxgbe_set_rss_hash_opt(struct sxgbe_priv_data
*priv
,
385 struct ethtool_rxnfc
*cmd
)
389 /* RSS does not support anything other than hashing
390 * to queues on src and dst IPs and ports
392 if (cmd
->data
& ~(RXH_IP_SRC
| RXH_IP_DST
|
393 RXH_L4_B_0_1
| RXH_L4_B_2_3
))
396 switch (cmd
->flow_type
) {
399 if (!(cmd
->data
& RXH_IP_SRC
) ||
400 !(cmd
->data
& RXH_IP_DST
) ||
401 !(cmd
->data
& RXH_L4_B_0_1
) ||
402 !(cmd
->data
& RXH_L4_B_2_3
))
404 reg_val
= SXGBE_CORE_RSS_CTL_TCP4TE
;
408 if (!(cmd
->data
& RXH_IP_SRC
) ||
409 !(cmd
->data
& RXH_IP_DST
) ||
410 !(cmd
->data
& RXH_L4_B_0_1
) ||
411 !(cmd
->data
& RXH_L4_B_2_3
))
413 reg_val
= SXGBE_CORE_RSS_CTL_UDP4TE
;
425 if (!(cmd
->data
& RXH_IP_SRC
) ||
426 !(cmd
->data
& RXH_IP_DST
) ||
427 (cmd
->data
& RXH_L4_B_0_1
) ||
428 (cmd
->data
& RXH_L4_B_2_3
))
430 reg_val
= SXGBE_CORE_RSS_CTL_IP2TE
;
436 /* Read SXGBE RSS control register and update */
437 reg_val
|= readl(priv
->ioaddr
+ SXGBE_CORE_RSS_CTL_REG
);
438 writel(reg_val
, priv
->ioaddr
+ SXGBE_CORE_RSS_CTL_REG
);
439 readl(priv
->ioaddr
+ SXGBE_CORE_RSS_CTL_REG
);
444 static int sxgbe_set_rxnfc(struct net_device
*dev
, struct ethtool_rxnfc
*cmd
)
446 struct sxgbe_priv_data
*priv
= netdev_priv(dev
);
447 int ret
= -EOPNOTSUPP
;
451 ret
= sxgbe_set_rss_hash_opt(priv
, cmd
);
460 static void sxgbe_get_regs(struct net_device
*dev
,
461 struct ethtool_regs
*regs
, void *space
)
463 struct sxgbe_priv_data
*priv
= netdev_priv(dev
);
464 u32
*reg_space
= (u32
*)space
;
467 void __iomem
*ioaddr
= priv
->ioaddr
;
469 memset(reg_space
, 0x0, REG_SPACE_SIZE
);
472 for (reg_offset
= START_MAC_REG_OFFSET
;
473 reg_offset
<= MAX_MAC_REG_OFFSET
; reg_offset
+= 4) {
474 reg_space
[reg_ix
] = readl(ioaddr
+ reg_offset
);
479 for (reg_offset
= START_MTL_REG_OFFSET
;
480 reg_offset
<= MAX_MTL_REG_OFFSET
; reg_offset
+= 4) {
481 reg_space
[reg_ix
] = readl(ioaddr
+ reg_offset
);
486 for (reg_offset
= START_DMA_REG_OFFSET
;
487 reg_offset
<= MAX_DMA_REG_OFFSET
; reg_offset
+= 4) {
488 reg_space
[reg_ix
] = readl(ioaddr
+ reg_offset
);
492 BUG_ON(reg_ix
* 4 > REG_SPACE_SIZE
);
495 static int sxgbe_get_regs_len(struct net_device
*dev
)
497 return REG_SPACE_SIZE
;
500 static const struct ethtool_ops sxgbe_ethtool_ops
= {
501 .get_drvinfo
= sxgbe_getdrvinfo
,
502 .get_settings
= sxgbe_getsettings
,
503 .set_settings
= sxgbe_setsettings
,
504 .get_msglevel
= sxgbe_getmsglevel
,
505 .set_msglevel
= sxgbe_setmsglevel
,
506 .get_link
= ethtool_op_get_link
,
507 .get_strings
= sxgbe_get_strings
,
508 .get_ethtool_stats
= sxgbe_get_ethtool_stats
,
509 .get_sset_count
= sxgbe_get_sset_count
,
510 .get_channels
= sxgbe_get_channels
,
511 .get_coalesce
= sxgbe_get_coalesce
,
512 .set_coalesce
= sxgbe_set_coalesce
,
513 .get_rxnfc
= sxgbe_get_rxnfc
,
514 .set_rxnfc
= sxgbe_set_rxnfc
,
515 .get_regs
= sxgbe_get_regs
,
516 .get_regs_len
= sxgbe_get_regs_len
,
517 .get_eee
= sxgbe_get_eee
,
518 .set_eee
= sxgbe_set_eee
,
521 void sxgbe_set_ethtool_ops(struct net_device
*netdev
)
523 netdev
->ethtool_ops
= &sxgbe_ethtool_ops
;