blob: a16ada8b85075aca852ae79dac03fb384dbd2aa2 [file] [log] [blame]
Giuseppe Cavallaro47dd7a52009-10-14 15:13:45 -07001/*******************************************************************************
2 Copyright (C) 2007-2009 STMicroelectronics Ltd
3
4 This program is free software; you can redistribute it and/or modify it
5 under the terms and conditions of the GNU General Public License,
6 version 2, as published by the Free Software Foundation.
7
8 This program is distributed in the hope it will be useful, but WITHOUT
9 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
10 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
11 more details.
12
Giuseppe Cavallaro47dd7a52009-10-14 15:13:45 -070013 The full GNU General Public License is included in this distribution in
14 the file called "COPYING".
15
16 Author: Giuseppe Cavallaro <peppe.cavallaro@st.com>
17*******************************************************************************/
18
Rayagond Kokatanurbd4242d2012-08-22 21:28:18 +000019#ifndef __STMMAC_H__
20#define __STMMAC_H__
21
Giuseppe CAVALLARObfab27a2011-12-21 03:58:19 +000022#define STMMAC_RESOURCE_NAME "stmmaceth"
Alexandre TORGUE06bce7d2016-04-01 11:37:36 +020023#define DRV_MODULE_VERSION "Jan_2016"
Giuseppe CAVALLAROba1377ff2012-04-04 04:33:25 +000024
25#include <linux/clk.h>
Giuseppe CAVALLAROee7946a2010-01-06 23:07:14 +000026#include <linux/stmmac.h>
Giuseppe CAVALLARO286a8372011-10-18 00:01:24 +000027#include <linux/phy.h>
Giuseppe CAVALLARO33d5e332012-06-07 19:25:07 +000028#include <linux/pci.h>
Giuseppe Cavallaro47dd7a52009-10-14 15:13:45 -070029#include "common.h"
Rayagond Kokatanur92ba6882013-03-26 04:43:11 +000030#include <linux/ptp_clock_kernel.h>
Artem Panfilovd6228b72019-01-20 19:05:15 +030031#include <linux/net_tstamp.h>
Chen-Yu Tsaic5e4ddb2014-01-17 21:24:41 +080032#include <linux/reset.h>
Giuseppe Cavallaro47dd7a52009-10-14 15:13:45 -070033
Joachim Eastwoode56788c2015-05-20 20:03:07 +020034struct stmmac_resources {
35 void __iomem *addr;
36 const char *mac;
37 int wol_irq;
38 int lpi_irq;
39 int irq;
40};
41
Giuseppe CAVALLARO362b37b2014-08-27 11:27:00 +020042struct stmmac_tx_info {
43 dma_addr_t buf;
44 bool map_as_page;
Giuseppe Cavallaro553e2ab2016-02-29 14:27:31 +010045 unsigned len;
Giuseppe Cavallaro2a6d8e12016-02-29 14:27:32 +010046 bool last_segment;
Giuseppe Cavallaro96951362016-02-29 14:27:33 +010047 bool is_jumbo;
Giuseppe CAVALLARO362b37b2014-08-27 11:27:00 +020048};
49
Joao Pintoce736782017-04-06 09:49:10 +010050/* Frequently used values are kept adjacent for cache effect */
51struct stmmac_tx_queue {
Jose Abreu8fce3332018-09-17 09:22:56 +010052 u32 tx_count_frames;
53 struct timer_list txtimer;
Joao Pintoce736782017-04-06 09:49:10 +010054 u32 queue_index;
55 struct stmmac_priv *priv_data;
56 struct dma_extended_desc *dma_etx ____cacheline_aligned_in_smp;
57 struct dma_desc *dma_tx;
58 struct sk_buff **tx_skbuff;
59 struct stmmac_tx_info *tx_skbuff_dma;
60 unsigned int cur_tx;
61 unsigned int dirty_tx;
62 dma_addr_t dma_tx_phy;
63 u32 tx_tail_addr;
Niklas Cassel8d212a9e2018-02-19 18:11:09 +010064 u32 mss;
Joao Pintoce736782017-04-06 09:49:10 +010065};
66
Joao Pinto54139cf2017-04-06 09:49:09 +010067struct stmmac_rx_queue {
68 u32 queue_index;
69 struct stmmac_priv *priv_data;
70 struct dma_extended_desc *dma_erx;
71 struct dma_desc *dma_rx ____cacheline_aligned_in_smp;
72 struct sk_buff **rx_skbuff;
73 dma_addr_t *rx_skbuff_dma;
74 unsigned int cur_rx;
75 unsigned int dirty_rx;
76 u32 rx_zeroc_thresh;
77 dma_addr_t dma_rx_phy;
78 u32 rx_tail_addr;
Jose Abreu8fce3332018-09-17 09:22:56 +010079};
80
81struct stmmac_channel {
Jose Abreu4ccb45852019-02-19 10:38:47 +010082 struct napi_struct rx_napi ____cacheline_aligned_in_smp;
83 struct napi_struct tx_napi ____cacheline_aligned_in_smp;
Jose Abreu8fce3332018-09-17 09:22:56 +010084 struct stmmac_priv *priv_data;
85 u32 index;
Joao Pinto54139cf2017-04-06 09:49:09 +010086};
87
Jose Abreu4dbbe8d2018-05-04 10:01:38 +010088struct stmmac_tc_entry {
89 bool in_use;
90 bool in_hw;
91 bool is_last;
92 bool is_frag;
93 void *frag_ptr;
94 unsigned int table_pos;
95 u32 handle;
96 u32 prio;
97 struct {
98 u32 match_data;
99 u32 match_en;
100 u8 af:1;
101 u8 rf:1;
102 u8 im:1;
103 u8 nc:1;
104 u8 res1:4;
105 u8 frame_offset;
106 u8 ok_index;
107 u8 dma_ch_no;
108 u32 res2;
109 } __packed val;
110};
111
Jose Abreu9a8a02c2018-05-31 18:01:27 +0100112#define STMMAC_PPS_MAX 4
113struct stmmac_pps_cfg {
114 bool available;
115 struct timespec64 start;
116 struct timespec64 period;
117};
118
Giuseppe Cavallaro47dd7a52009-10-14 15:13:45 -0700119struct stmmac_priv {
120 /* Frequently used values are kept adjacent for cache effect */
Giuseppe CAVALLARO1bb6dea2013-04-08 02:10:02 +0000121 u32 tx_coal_frames;
122 u32 tx_coal_timer;
Joao Pintoce736782017-04-06 09:49:10 +0100123
Giuseppe Cavallaro47dd7a52009-10-14 15:13:45 -0700124 int tx_coalesce;
Giuseppe CAVALLARO1bb6dea2013-04-08 02:10:02 +0000125 int hwts_tx_en;
Giuseppe CAVALLARO1bb6dea2013-04-08 02:10:02 +0000126 bool tx_path_in_lpi_mode;
Alexandre TORGUEf748be52016-04-01 11:37:34 +0200127 bool tso;
Giuseppe Cavallaro47dd7a52009-10-14 15:13:45 -0700128
Giuseppe Cavallaro47dd7a52009-10-14 15:13:45 -0700129 unsigned int dma_buf_sz;
Giuseppe Cavallaro22ad3832016-02-29 14:27:41 +0100130 unsigned int rx_copybreak;
Giuseppe CAVALLARO1bb6dea2013-04-08 02:10:02 +0000131 u32 rx_riwt;
132 int hwts_rx_en;
LABBE Corentin5bacd772017-03-29 07:05:40 +0200133
Giuseppe CAVALLARO1bb6dea2013-04-08 02:10:02 +0000134 void __iomem *ioaddr;
135 struct net_device *dev;
Giuseppe Cavallaro47dd7a52009-10-14 15:13:45 -0700136 struct device *device;
Giuseppe CAVALLAROdb98a0b2010-01-06 23:07:17 +0000137 struct mac_device_info *hw;
Jose Abreu7cfde0a2018-06-15 16:17:27 +0100138 int (*hwif_quirks)(struct stmmac_priv *priv);
Thierry Reding29555fa2018-05-24 16:09:07 +0200139 struct mutex lock;
Giuseppe Cavallaro47dd7a52009-10-14 15:13:45 -0700140
Joao Pinto54139cf2017-04-06 09:49:09 +0100141 /* RX Queue */
142 struct stmmac_rx_queue rx_queue[MTL_MAX_RX_QUEUES];
143
Joao Pintoce736782017-04-06 09:49:10 +0100144 /* TX Queue */
145 struct stmmac_tx_queue tx_queue[MTL_MAX_TX_QUEUES];
146
Jose Abreu8fce3332018-09-17 09:22:56 +0100147 /* Generic channel for NAPI */
148 struct stmmac_channel channel[STMMAC_CH_MAX];
149
LABBE Corentin4d869b02017-05-24 09:16:46 +0200150 bool oldlink;
Giuseppe Cavallaro47dd7a52009-10-14 15:13:45 -0700151 int speed;
152 int oldduplex;
153 unsigned int flow_ctrl;
154 unsigned int pause;
155 struct mii_bus *mii;
Giuseppe CAVALLARO36bcfe72011-07-20 00:05:23 +0000156 int mii_irq[PHY_MAX_ADDR];
Giuseppe Cavallaro47dd7a52009-10-14 15:13:45 -0700157
Giuseppe CAVALLARO1bb6dea2013-04-08 02:10:02 +0000158 struct stmmac_extra_stats xstats ____cacheline_aligned_in_smp;
Jose Abreu8bf993a2018-03-29 10:40:19 +0100159 struct stmmac_safety_stats sstats;
Giuseppe CAVALLARO1bb6dea2013-04-08 02:10:02 +0000160 struct plat_stmmacenet_data *plat;
161 struct dma_features dma_cap;
162 struct stmmac_counters mmc;
163 int hw_cap_support;
164 int synopsys_id;
Giuseppe Cavallaro47dd7a52009-10-14 15:13:45 -0700165 u32 msg_enable;
Giuseppe Cavallaro47dd7a52009-10-14 15:13:45 -0700166 int wolopts;
Deepak Sikri3172d3a2011-09-01 21:51:37 +0000167 int wol_irq;
Giuseppe CAVALLAROcd7201f2012-04-04 04:33:27 +0000168 int clk_csr;
Giuseppe CAVALLAROd7659552012-06-27 21:14:37 +0000169 struct timer_list eee_ctrl_timer;
Giuseppe CAVALLAROd7659552012-06-27 21:14:37 +0000170 int lpi_irq;
171 int eee_enabled;
172 int eee_active;
173 int tx_lpi_timer;
Giuseppe CAVALLARO4a7d6662013-03-26 04:43:05 +0000174 unsigned int mode;
Jose Abreu5f0456b2018-04-23 09:05:15 +0100175 unsigned int chain_mode;
Giuseppe CAVALLAROc24602e2013-03-26 04:43:06 +0000176 int extend_desc;
Artem Panfilovd6228b72019-01-20 19:05:15 +0300177 struct hwtstamp_config tstamp_config;
Rayagond Kokatanur92ba6882013-03-26 04:43:11 +0000178 struct ptp_clock *ptp_clock;
179 struct ptp_clock_info ptp_clock_ops;
Giuseppe CAVALLARO1bb6dea2013-04-08 02:10:02 +0000180 unsigned int default_addend;
Jose Abreu9a8a02c2018-05-31 18:01:27 +0100181 u32 sub_second_inc;
182 u32 systime_flags;
Giuseppe CAVALLARO1bb6dea2013-04-08 02:10:02 +0000183 u32 adv_ts;
184 int use_riwt;
Srinivas Kandagatla89f7f2c2014-01-16 10:53:00 +0000185 int irq_wake;
Rayagond Kokatanur92ba6882013-03-26 04:43:11 +0000186 spinlock_t ptp_lock;
Alexandre TORGUE36ff7c12016-04-01 11:37:32 +0200187 void __iomem *mmcaddr;
Giuseppe CAVALLAROba1ffd72016-11-14 09:27:29 +0100188 void __iomem *ptpaddr;
Mathieu Olivari466c5ac2015-05-22 19:03:29 -0700189
190#ifdef CONFIG_DEBUG_FS
191 struct dentry *dbgfs_dir;
192 struct dentry *dbgfs_rings_status;
193 struct dentry *dbgfs_dma_cap;
194#endif
Jose Abreu34877a12018-03-29 10:40:18 +0100195
196 unsigned long state;
197 struct workqueue_struct *wq;
198 struct work_struct service_task;
Jose Abreu4dbbe8d2018-05-04 10:01:38 +0100199
200 /* TC Handling */
201 unsigned int tc_entries_max;
202 unsigned int tc_off_max;
203 struct stmmac_tc_entry *tc_entries;
Jose Abreu9a8a02c2018-05-31 18:01:27 +0100204
205 /* Pulse Per Second output */
206 struct stmmac_pps_cfg pps[STMMAC_PPS_MAX];
Jose Abreu34877a12018-03-29 10:40:18 +0100207};
208
209enum stmmac_state {
210 STMMAC_DOWN,
211 STMMAC_RESET_REQUESTED,
212 STMMAC_RESETING,
213 STMMAC_SERVICE_SCHED,
Giuseppe Cavallaro47dd7a52009-10-14 15:13:45 -0700214};
215
Joe Perchesd6cc64e2013-09-23 11:37:59 -0700216int stmmac_mdio_unregister(struct net_device *ndev);
217int stmmac_mdio_register(struct net_device *ndev);
Srinivas Kandagatla073752a2014-01-16 10:52:27 +0000218int stmmac_mdio_reset(struct mii_bus *mii);
Joe Perchesd6cc64e2013-09-23 11:37:59 -0700219void stmmac_set_ethtool_ops(struct net_device *netdev);
Andy Shevchenko915af652014-11-05 11:45:32 +0200220
Giuseppe CAVALLAROc30a70d2016-10-19 09:06:41 +0200221void stmmac_ptp_register(struct stmmac_priv *priv);
Joe Perchesd6cc64e2013-09-23 11:37:59 -0700222void stmmac_ptp_unregister(struct stmmac_priv *priv);
Joachim Eastwoodf4e7bd82016-05-01 22:58:19 +0200223int stmmac_resume(struct device *dev);
224int stmmac_suspend(struct device *dev);
225int stmmac_dvr_remove(struct device *dev);
Joachim Eastwood15ffac72015-05-20 20:03:08 +0200226int stmmac_dvr_probe(struct device *device,
227 struct plat_stmmacenet_data *plat_dat,
228 struct stmmac_resources *res);
Giuseppe CAVALLAROd7659552012-06-27 21:14:37 +0000229void stmmac_disable_eee_mode(struct stmmac_priv *priv);
230bool stmmac_eee_init(struct stmmac_priv *priv);
Giuseppe CAVALLAROba1377ff2012-04-04 04:33:25 +0000231
Jose Abreu091810d2019-05-24 10:20:19 +0200232#if IS_ENABLED(CONFIG_STMMAC_SELFTESTS)
233void stmmac_selftest_run(struct net_device *dev,
234 struct ethtool_test *etest, u64 *buf);
235void stmmac_selftest_get_strings(struct stmmac_priv *priv, u8 *data);
236int stmmac_selftest_get_count(struct stmmac_priv *priv);
237#else
238static inline void stmmac_selftest_run(struct net_device *dev,
239 struct ethtool_test *etest, u64 *buf)
240{
241 /* Not enabled */
242}
243static inline void stmmac_selftest_get_strings(struct stmmac_priv *priv,
244 u8 *data)
245{
246 /* Not enabled */
247}
248static inline int stmmac_selftest_get_count(struct stmmac_priv *priv)
249{
250 return -EOPNOTSUPP;
251}
252#endif /* CONFIG_STMMAC_SELFTESTS */
253
Rayagond Kokatanurbd4242d2012-08-22 21:28:18 +0000254#endif /* __STMMAC_H__ */