blob: 272b9ca663148f36ccb7ae45363df773f2dd4c4c [file] [log] [blame]
Giuseppe Cavallaro47dd7a52009-10-14 15:13:45 -07001/*******************************************************************************
2 STMMAC Common Header File
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
Giuseppe Cavallaro47dd7a52009-10-14 15:13:45 -070015 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
Rayagond Kokatanurbd4242d2012-08-22 21:28:18 +000021#ifndef __COMMON_H__
22#define __COMMON_H__
23
Giuseppe CAVALLARObfab27a2011-12-21 03:58:19 +000024#include <linux/etherdevice.h>
Giuseppe CAVALLARO5e33c792010-01-06 23:07:21 +000025#include <linux/netdevice.h>
Giuseppe Cavallaroafea0362016-02-29 14:27:28 +010026#include <linux/stmmac.h>
Giuseppe CAVALLARObfab27a2011-12-21 03:58:19 +000027#include <linux/phy.h>
28#include <linux/module.h>
Javier Martinez Canillas12c70f32016-09-12 10:03:44 -040029#if IS_ENABLED(CONFIG_VLAN_8021Q)
Giuseppe CAVALLARO8f617542010-04-13 20:21:16 +000030#define STMMAC_VLAN_TAG_USED
31#include <linux/if_vlan.h>
32#endif
33
Giuseppe CAVALLARO56b106a2010-04-13 20:21:12 +000034#include "descs.h"
Jose Abreu42de0472018-04-16 16:08:12 +010035#include "hwif.h"
Giuseppe CAVALLARO1c901a42011-09-01 21:51:38 +000036#include "mmc.h"
Giuseppe CAVALLARO56b106a2010-04-13 20:21:12 +000037
Giuseppe CAVALLARO62a2ab92012-11-25 23:10:43 +000038/* Synopsys Core versions */
Jose Abreu48ae5552018-08-08 09:04:29 +010039#define DWMAC_CORE_3_40 0x34
40#define DWMAC_CORE_3_50 0x35
41#define DWMAC_CORE_4_00 0x40
42#define DWMAC_CORE_4_10 0x41
43#define DWMAC_CORE_5_00 0x50
44#define DWMAC_CORE_5_10 0x51
45#define DWXGMAC_CORE_2_10 0x21
46
Alexandre TORGUE48863ce2016-04-01 11:37:30 +020047#define STMMAC_CHAN0 0 /* Always supported and default for all chips */
Giuseppe CAVALLARO62a2ab92012-11-25 23:10:43 +000048
Pavel Machek22d3efe2016-11-28 12:55:59 +010049/* These need to be power of two, and >= 4 */
Giuseppe Cavallaroe3ad57c2016-02-29 14:27:30 +010050#define DMA_TX_SIZE 512
51#define DMA_RX_SIZE 512
52#define STMMAC_GET_ENTRY(x, size) ((x + 1) & (size - 1))
53
Giuseppe CAVALLARO56b106a2010-04-13 20:21:12 +000054#undef FRAME_FILTER_DEBUG
55/* #define FRAME_FILTER_DEBUG */
Giuseppe Cavallaro47dd7a52009-10-14 15:13:45 -070056
Giuseppe CAVALLARO915c1992014-11-18 09:47:00 +010057/* Extra statistic and debug information exposed by ethtool */
Giuseppe Cavallaro47dd7a52009-10-14 15:13:45 -070058struct stmmac_extra_stats {
59 /* Transmit errors */
60 unsigned long tx_underflow ____cacheline_aligned;
61 unsigned long tx_carrier;
62 unsigned long tx_losscarrier;
Giuseppe CAVALLARO3c20f722011-10-26 19:43:09 +000063 unsigned long vlan_tag;
Giuseppe Cavallaro47dd7a52009-10-14 15:13:45 -070064 unsigned long tx_deferred;
65 unsigned long tx_vlan;
66 unsigned long tx_jabber;
67 unsigned long tx_frame_flushed;
68 unsigned long tx_payload_error;
69 unsigned long tx_ip_header_error;
70 /* Receive errors */
71 unsigned long rx_desc;
Giuseppe CAVALLARO3c20f722011-10-26 19:43:09 +000072 unsigned long sa_filter_fail;
73 unsigned long overflow_error;
74 unsigned long ipc_csum_error;
Giuseppe Cavallaro47dd7a52009-10-14 15:13:45 -070075 unsigned long rx_collision;
LABBE Corentine0a76602017-02-08 09:31:17 +010076 unsigned long rx_crc_errors;
Giuseppe CAVALLARO1cc5a732012-02-15 00:10:37 +000077 unsigned long dribbling_bit;
Giuseppe Cavallaro1b924032010-02-04 09:33:21 -080078 unsigned long rx_length;
Giuseppe Cavallaro47dd7a52009-10-14 15:13:45 -070079 unsigned long rx_mii;
80 unsigned long rx_multicast;
81 unsigned long rx_gmac_overflow;
82 unsigned long rx_watchdog;
83 unsigned long da_rx_filter_fail;
84 unsigned long sa_rx_filter_fail;
85 unsigned long rx_missed_cntr;
86 unsigned long rx_overflow_cntr;
87 unsigned long rx_vlan;
Giuseppe CAVALLARO62a2ab92012-11-25 23:10:43 +000088 /* Tx/Rx IRQ error info */
Giuseppe Cavallaro47dd7a52009-10-14 15:13:45 -070089 unsigned long tx_undeflow_irq;
90 unsigned long tx_process_stopped_irq;
91 unsigned long tx_jabber_irq;
92 unsigned long rx_overflow_irq;
93 unsigned long rx_buf_unav_irq;
94 unsigned long rx_process_stopped_irq;
95 unsigned long rx_watchdog_irq;
96 unsigned long tx_early_irq;
97 unsigned long fatal_bus_error_irq;
Giuseppe CAVALLARO62a2ab92012-11-25 23:10:43 +000098 /* Tx/Rx IRQ Events */
99 unsigned long rx_early_irq;
Giuseppe Cavallaro47dd7a52009-10-14 15:13:45 -0700100 unsigned long threshold;
101 unsigned long tx_pkt_n;
102 unsigned long rx_pkt_n;
Giuseppe Cavallaro47dd7a52009-10-14 15:13:45 -0700103 unsigned long normal_irq_n;
Giuseppe CAVALLARO9125cdd2012-11-25 23:10:42 +0000104 unsigned long rx_normal_irq_n;
105 unsigned long napi_poll;
106 unsigned long tx_normal_irq_n;
107 unsigned long tx_clean;
Giuseppe Cavallaro0e80bdc2016-02-29 14:27:38 +0100108 unsigned long tx_set_ic_bit;
Giuseppe CAVALLARO62a2ab92012-11-25 23:10:43 +0000109 unsigned long irq_receive_pmt_irq_n;
110 /* MMC info */
Giuseppe CAVALLAROd7659552012-06-27 21:14:37 +0000111 unsigned long mmc_tx_irq_n;
112 unsigned long mmc_rx_irq_n;
113 unsigned long mmc_rx_csum_offload_irq_n;
114 /* EEE */
Giuseppe CAVALLAROd7659552012-06-27 21:14:37 +0000115 unsigned long irq_tx_path_in_lpi_mode_n;
116 unsigned long irq_tx_path_exit_lpi_mode_n;
117 unsigned long irq_rx_path_in_lpi_mode_n;
118 unsigned long irq_rx_path_exit_lpi_mode_n;
119 unsigned long phy_eee_wakeup_error_n;
Giuseppe CAVALLAROc24602e2013-03-26 04:43:06 +0000120 /* Extended RDES status */
121 unsigned long ip_hdr_err;
122 unsigned long ip_payload_err;
123 unsigned long ip_csum_bypassed;
124 unsigned long ipv4_pkt_rcvd;
125 unsigned long ipv6_pkt_rcvd;
Giuseppe CAVALLAROee112c12016-11-14 09:27:30 +0100126 unsigned long no_ptp_rx_msg_type_ext;
127 unsigned long ptp_rx_msg_type_sync;
128 unsigned long ptp_rx_msg_type_follow_up;
129 unsigned long ptp_rx_msg_type_delay_req;
130 unsigned long ptp_rx_msg_type_delay_resp;
131 unsigned long ptp_rx_msg_type_pdelay_req;
132 unsigned long ptp_rx_msg_type_pdelay_resp;
133 unsigned long ptp_rx_msg_type_pdelay_follow_up;
134 unsigned long ptp_rx_msg_type_announce;
135 unsigned long ptp_rx_msg_type_management;
136 unsigned long ptp_rx_msg_pkt_reserved_type;
Giuseppe CAVALLAROc24602e2013-03-26 04:43:06 +0000137 unsigned long ptp_frame_type;
138 unsigned long ptp_ver;
139 unsigned long timestamp_dropped;
140 unsigned long av_pkt_rcvd;
141 unsigned long av_tagged_pkt_rcvd;
142 unsigned long vlan_tag_priority_val;
143 unsigned long l3_filter_match;
144 unsigned long l4_filter_match;
145 unsigned long l3_l4_filter_no_match;
Giuseppe CAVALLARO0982a0f2013-03-26 04:43:07 +0000146 /* PCS */
147 unsigned long irq_pcs_ane_n;
148 unsigned long irq_pcs_link_n;
149 unsigned long irq_rgmii_n;
Giuseppe CAVALLAROe58bb432013-03-26 04:43:08 +0000150 unsigned long pcs_link;
151 unsigned long pcs_duplex;
152 unsigned long pcs_speed;
Giuseppe CAVALLARO2f7a7912015-11-30 11:33:10 +0100153 /* debug register */
154 unsigned long mtl_tx_status_fifo_full;
155 unsigned long mtl_tx_fifo_not_empty;
156 unsigned long mmtl_fifo_ctrl;
157 unsigned long mtl_tx_fifo_read_ctrl_write;
158 unsigned long mtl_tx_fifo_read_ctrl_wait;
159 unsigned long mtl_tx_fifo_read_ctrl_read;
160 unsigned long mtl_tx_fifo_read_ctrl_idle;
161 unsigned long mac_tx_in_pause;
162 unsigned long mac_tx_frame_ctrl_xfer;
163 unsigned long mac_tx_frame_ctrl_idle;
164 unsigned long mac_tx_frame_ctrl_wait;
165 unsigned long mac_tx_frame_ctrl_pause;
166 unsigned long mac_gmii_tx_proto_engine;
167 unsigned long mtl_rx_fifo_fill_level_full;
168 unsigned long mtl_rx_fifo_fill_above_thresh;
169 unsigned long mtl_rx_fifo_fill_below_thresh;
170 unsigned long mtl_rx_fifo_fill_level_empty;
171 unsigned long mtl_rx_fifo_read_ctrl_flush;
172 unsigned long mtl_rx_fifo_read_ctrl_read_data;
173 unsigned long mtl_rx_fifo_read_ctrl_status;
174 unsigned long mtl_rx_fifo_read_ctrl_idle;
175 unsigned long mtl_rx_fifo_ctrl_active;
176 unsigned long mac_rx_frame_ctrl_fifo;
177 unsigned long mac_gmii_rx_proto_engine;
Alexandre TORGUEf748be52016-04-01 11:37:34 +0200178 /* TSO */
179 unsigned long tx_tso_frames;
180 unsigned long tx_tso_nfrags;
Giuseppe Cavallaro47dd7a52009-10-14 15:13:45 -0700181};
182
Jose Abreu8bf993a2018-03-29 10:40:19 +0100183/* Safety Feature statistics exposed by ethtool */
184struct stmmac_safety_stats {
185 unsigned long mac_errors[32];
186 unsigned long mtl_errors[32];
187 unsigned long dma_errors[32];
188};
189
190/* Number of fields in Safety Stats */
191#define STMMAC_SAFETY_FEAT_SIZE \
192 (sizeof(struct stmmac_safety_stats) / sizeof(unsigned long))
193
Giuseppe CAVALLAROcd7201f2012-04-04 04:33:27 +0000194/* CSR Frequency Access Defines*/
195#define CSR_F_35M 35000000
196#define CSR_F_60M 60000000
197#define CSR_F_100M 100000000
198#define CSR_F_150M 150000000
199#define CSR_F_250M 250000000
200#define CSR_F_300M 300000000
201
202#define MAC_CSR_H_FRQ_MASK 0x20
203
Giuseppe CAVALLAROaec7ff22010-01-06 23:07:18 +0000204#define HASH_TABLE_SIZE 64
Vince Bridgersf88203a2015-04-15 11:17:42 -0500205#define PAUSE_TIME 0xffff
Giuseppe CAVALLAROaec7ff22010-01-06 23:07:18 +0000206
207/* Flow Control defines */
208#define FLOW_OFF 0
209#define FLOW_RX 1
210#define FLOW_TX 2
211#define FLOW_AUTO (FLOW_TX | FLOW_RX)
212
Giuseppe CAVALLAROe58bb432013-03-26 04:43:08 +0000213/* PCS defines */
214#define STMMAC_PCS_RGMII (1 << 0)
215#define STMMAC_PCS_SGMII (1 << 1)
216#define STMMAC_PCS_TBI (1 << 2)
217#define STMMAC_PCS_RTBI (1 << 3)
218
Giuseppe CAVALLAROceb694992013-04-08 02:10:01 +0000219#define SF_DMA_MODE 1 /* DMA STORE-AND-FORWARD Operation Mode */
Giuseppe CAVALLAROaec7ff22010-01-06 23:07:18 +0000220
Rayagond Kokatanur1db123f2011-10-18 00:01:22 +0000221/* DAM HW feature register fields */
Giuseppe CAVALLAROceb694992013-04-08 02:10:01 +0000222#define DMA_HW_FEAT_MIISEL 0x00000001 /* 10/100 Mbps Support */
223#define DMA_HW_FEAT_GMIISEL 0x00000002 /* 1000 Mbps Support */
224#define DMA_HW_FEAT_HDSEL 0x00000004 /* Half-Duplex Support */
225#define DMA_HW_FEAT_EXTHASHEN 0x00000008 /* Expanded DA Hash Filter */
226#define DMA_HW_FEAT_HASHSEL 0x00000010 /* HASH Filter */
227#define DMA_HW_FEAT_ADDMAC 0x00000020 /* Multiple MAC Addr Reg */
228#define DMA_HW_FEAT_PCSSEL 0x00000040 /* PCS registers */
229#define DMA_HW_FEAT_L3L4FLTREN 0x00000080 /* Layer 3 & Layer 4 Feature */
230#define DMA_HW_FEAT_SMASEL 0x00000100 /* SMA(MDIO) Interface */
231#define DMA_HW_FEAT_RWKSEL 0x00000200 /* PMT Remote Wakeup */
232#define DMA_HW_FEAT_MGKSEL 0x00000400 /* PMT Magic Packet */
233#define DMA_HW_FEAT_MMCSEL 0x00000800 /* RMON Module */
234#define DMA_HW_FEAT_TSVER1SEL 0x00001000 /* Only IEEE 1588-2002 */
235#define DMA_HW_FEAT_TSVER2SEL 0x00002000 /* IEEE 1588-2008 PTPv2 */
236#define DMA_HW_FEAT_EEESEL 0x00004000 /* Energy Efficient Ethernet */
237#define DMA_HW_FEAT_AVSEL 0x00008000 /* AV Feature */
238#define DMA_HW_FEAT_TXCOESEL 0x00010000 /* Checksum Offload in Tx */
239#define DMA_HW_FEAT_RXTYP1COE 0x00020000 /* IP COE (Type 1) in Rx */
240#define DMA_HW_FEAT_RXTYP2COE 0x00040000 /* IP COE (Type 2) in Rx */
241#define DMA_HW_FEAT_RXFIFOSIZE 0x00080000 /* Rx FIFO > 2048 Bytes */
242#define DMA_HW_FEAT_RXCHCNT 0x00300000 /* No. additional Rx Channels */
243#define DMA_HW_FEAT_TXCHCNT 0x00c00000 /* No. additional Tx Channels */
244#define DMA_HW_FEAT_ENHDESSEL 0x01000000 /* Alternate Descriptor */
245/* Timestamping with Internal System Time */
246#define DMA_HW_FEAT_INTTSEN 0x02000000
247#define DMA_HW_FEAT_FLEXIPPSEN 0x04000000 /* Flexible PPS Output */
248#define DMA_HW_FEAT_SAVLANINS 0x08000000 /* Source Addr or VLAN */
249#define DMA_HW_FEAT_ACTPHYIF 0x70000000 /* Active/selected PHY iface */
Giuseppe CAVALLARO0f1f88a2012-04-18 19:48:21 +0000250#define DEFAULT_DMA_PBL 8
Rayagond Kokatanur1db123f2011-10-18 00:01:22 +0000251
Giuseppe CAVALLARO70523e632016-06-24 15:16:24 +0200252/* PCS status and mask defines */
253#define PCS_ANE_IRQ BIT(2) /* PCS Auto-Negotiation */
254#define PCS_LINK_IRQ BIT(1) /* PCS Link */
255#define PCS_RGSMIIIS_IRQ BIT(0) /* RGMII or SMII Interrupt */
256
Giuseppe CAVALLARO62a2ab92012-11-25 23:10:43 +0000257/* Max/Min RI Watchdog Timer count value */
258#define MAX_DMA_RIWT 0xff
259#define MIN_DMA_RIWT 0x20
Giuseppe CAVALLARO9125cdd2012-11-25 23:10:42 +0000260/* Tx coalesce parameters */
Jose Abreu8fce3332018-09-17 09:22:56 +0100261#define STMMAC_COAL_TX_TIMER 1000
Giuseppe CAVALLARO9125cdd2012-11-25 23:10:42 +0000262#define STMMAC_MAX_COAL_TX_TICK 100000
263#define STMMAC_TX_MAX_FRAMES 256
Jose Abreu8fce3332018-09-17 09:22:56 +0100264#define STMMAC_TX_FRAMES 25
Giuseppe CAVALLARO9125cdd2012-11-25 23:10:42 +0000265
Joao Pintoabe80fd2017-03-17 16:11:07 +0000266/* Packets types */
267enum packets_types {
268 PACKET_AVCPQ = 0x1, /* AV Untagged Control packets */
269 PACKET_PTPQ = 0x2, /* PTP Packets */
270 PACKET_DCBCPQ = 0x3, /* DCB Control Packets */
271 PACKET_UPQ = 0x4, /* Untagged Packets */
272 PACKET_MCBCQ = 0x5, /* Multicast & Broadcast Packets */
273};
274
Giuseppe CAVALLAROceb694992013-04-08 02:10:01 +0000275/* Rx IPC status */
276enum rx_frame_status {
Fabrice Gasnierc1fa3212016-02-29 14:27:34 +0100277 good_frame = 0x0,
278 discard_frame = 0x1,
279 csum_none = 0x2,
280 llc_snap = 0x4,
281 dma_own = 0x8,
Alexandre TORGUE753a7102016-04-01 11:37:28 +0200282 rx_not_ls = 0x10,
Giuseppe Cavallaro47dd7a52009-10-14 15:13:45 -0700283};
284
Fabrice Gasnierc363b652016-02-29 14:27:36 +0100285/* Tx status */
286enum tx_frame_status {
287 tx_done = 0x0,
288 tx_not_ls = 0x1,
289 tx_err = 0x2,
290 tx_dma_own = 0x4,
291};
292
Giuseppe CAVALLARO9125cdd2012-11-25 23:10:42 +0000293enum dma_irq_status {
294 tx_hard_error = 0x1,
295 tx_hard_error_bump_tc = 0x2,
296 handle_rx = 0x4,
297 handle_tx = 0x8,
Giuseppe CAVALLAROaec7ff22010-01-06 23:07:18 +0000298};
Giuseppe Cavallaro47dd7a52009-10-14 15:13:45 -0700299
Giuseppe CAVALLARO915c1992014-11-18 09:47:00 +0100300/* EEE and LPI defines */
nandini sharma162fb1d2014-08-28 08:11:41 +0200301#define CORE_IRQ_TX_PATH_IN_LPI_MODE (1 << 0)
302#define CORE_IRQ_TX_PATH_EXIT_LPI_MODE (1 << 1)
303#define CORE_IRQ_RX_PATH_IN_LPI_MODE (1 << 2)
304#define CORE_IRQ_RX_PATH_EXIT_LPI_MODE (1 << 3)
Giuseppe CAVALLARO0982a0f2013-03-26 04:43:07 +0000305
Alexandre TORGUE48863ce2016-04-01 11:37:30 +0200306#define CORE_IRQ_MTL_RX_OVERFLOW BIT(8)
Giuseppe CAVALLAROd7659552012-06-27 21:14:37 +0000307
Giuseppe CAVALLARO915c1992014-11-18 09:47:00 +0100308/* Physical Coding Sublayer */
Giuseppe CAVALLAROe58bb432013-03-26 04:43:08 +0000309struct rgmii_adv {
310 unsigned int pause;
311 unsigned int duplex;
312 unsigned int lp_pause;
313 unsigned int lp_duplex;
314};
315
316#define STMMAC_PCS_PAUSE 1
317#define STMMAC_PCS_ASYM_PAUSE 2
318
Giuseppe CAVALLAROe7434822011-09-01 21:51:41 +0000319/* DMA HW capabilities */
320struct dma_features {
321 unsigned int mbps_10_100;
322 unsigned int mbps_1000;
323 unsigned int half_duplex;
324 unsigned int hash_filter;
325 unsigned int multi_addr;
326 unsigned int pcs;
327 unsigned int sma_mdio;
328 unsigned int pmt_remote_wake_up;
329 unsigned int pmt_magic_frame;
330 unsigned int rmon;
Giuseppe CAVALLAROceb694992013-04-08 02:10:01 +0000331 /* IEEE 1588-2002 */
Giuseppe CAVALLAROe7434822011-09-01 21:51:41 +0000332 unsigned int time_stamp;
Giuseppe CAVALLAROceb694992013-04-08 02:10:01 +0000333 /* IEEE 1588-2008 */
Giuseppe CAVALLAROe7434822011-09-01 21:51:41 +0000334 unsigned int atime_stamp;
335 /* 802.3az - Energy-Efficient Ethernet (EEE) */
336 unsigned int eee;
337 unsigned int av;
Alexandre TORGUE48863ce2016-04-01 11:37:30 +0200338 unsigned int tsoen;
Giuseppe CAVALLAROe7434822011-09-01 21:51:41 +0000339 /* TX and RX csum */
340 unsigned int tx_coe;
Alexandre TORGUE48863ce2016-04-01 11:37:30 +0200341 unsigned int rx_coe;
Giuseppe CAVALLAROe7434822011-09-01 21:51:41 +0000342 unsigned int rx_coe_type1;
343 unsigned int rx_coe_type2;
344 unsigned int rxfifo_over_2048;
345 /* TX and RX number of channels */
346 unsigned int number_rx_channel;
347 unsigned int number_tx_channel;
jpinto9eb12472016-12-28 12:57:48 +0000348 /* TX and RX number of queues */
349 unsigned int number_rx_queues;
350 unsigned int number_tx_queues;
Jose Abreu9a8a02c2018-05-31 18:01:27 +0100351 /* PPS output */
352 unsigned int pps_out_num;
Giuseppe CAVALLAROceb694992013-04-08 02:10:01 +0000353 /* Alternate (enhanced) DESC mode */
Giuseppe CAVALLAROe7434822011-09-01 21:51:41 +0000354 unsigned int enh_desc;
Thierry Reding11fbf812017-03-10 17:34:58 +0100355 /* TX and RX FIFO sizes */
356 unsigned int tx_fifo_size;
357 unsigned int rx_fifo_size;
Jose Abreu8bf993a2018-03-29 10:40:19 +0100358 /* Automotive Safety Package */
359 unsigned int asp;
Jose Abreu4dbbe8d2018-05-04 10:01:38 +0100360 /* RX Parser */
361 unsigned int frpsel;
362 unsigned int frpbs;
363 unsigned int frpes;
Giuseppe CAVALLAROe7434822011-09-01 21:51:41 +0000364};
365
Giuseppe CAVALLAROaec7ff22010-01-06 23:07:18 +0000366/* GMAC TX FIFO is 8K, Rx FIFO is 16K */
367#define BUF_SIZE_16KiB 16384
Thor Thayer8137b6e2018-11-08 11:42:14 -0600368/* RX Buffer size must be < 8191 and multiple of 4/8/16 bytes */
369#define BUF_SIZE_8KiB 8188
Giuseppe CAVALLAROaec7ff22010-01-06 23:07:18 +0000370#define BUF_SIZE_4KiB 4096
371#define BUF_SIZE_2KiB 2048
Giuseppe Cavallaro47dd7a52009-10-14 15:13:45 -0700372
Giuseppe CAVALLAROaec7ff22010-01-06 23:07:18 +0000373/* Power Down and WOL */
374#define PMT_NOT_SUPPORTED 0
375#define PMT_SUPPORTED 1
Giuseppe Cavallaro47dd7a52009-10-14 15:13:45 -0700376
Giuseppe CAVALLAROaec7ff22010-01-06 23:07:18 +0000377/* Common MAC defines */
378#define MAC_CTRL_REG 0x00000000 /* MAC Control */
379#define MAC_ENABLE_TX 0x00000008 /* Transmitter Enable */
LABBE Corentin28089222017-02-08 09:31:06 +0100380#define MAC_ENABLE_RX 0x00000004 /* Receiver Enable */
Giuseppe Cavallaro47dd7a52009-10-14 15:13:45 -0700381
Giuseppe CAVALLAROd7659552012-06-27 21:14:37 +0000382/* Default LPI timers */
Giuseppe CAVALLAROf5351ef2013-06-18 07:03:23 +0200383#define STMMAC_DEFAULT_LIT_LS 0x3E8
nandini sharma438a62b2014-08-28 08:11:42 +0200384#define STMMAC_DEFAULT_TWT_LS 0x1E
Giuseppe CAVALLAROd7659552012-06-27 21:14:37 +0000385
Giuseppe CAVALLARO4a7d6662013-03-26 04:43:05 +0000386#define STMMAC_CHAIN_MODE 0x1
387#define STMMAC_RING_MODE 0x2
388
Vince Bridgers2618abb2014-01-20 05:39:01 -0600389#define JUMBO_LEN 9000
390
Andy Shevchenko915af652014-11-05 11:45:32 +0200391extern const struct stmmac_desc_ops enh_desc_ops;
392extern const struct stmmac_desc_ops ndesc_ops;
393
Vince Bridgers7ed24bb2014-07-31 15:49:13 -0500394struct mac_device_info;
395
Andy Shevchenko915af652014-11-05 11:45:32 +0200396extern const struct stmmac_hwtimestamp stmmac_ptp;
Alexandre TORGUE48863ce2016-04-01 11:37:30 +0200397extern const struct stmmac_mode_ops dwmac4_ring_mode_ops;
Andy Shevchenko915af652014-11-05 11:45:32 +0200398
Giuseppe Cavallaro47dd7a52009-10-14 15:13:45 -0700399struct mac_link {
LABBE Corentinca84dfb2017-05-24 09:16:47 +0200400 u32 speed_mask;
401 u32 speed10;
402 u32 speed100;
403 u32 speed1000;
Jose Abreu21427542018-08-08 09:04:30 +0100404 u32 speed2500;
405 u32 speed10000;
LABBE Corentinca84dfb2017-05-24 09:16:47 +0200406 u32 duplex;
Giuseppe Cavallaro47dd7a52009-10-14 15:13:45 -0700407};
408
409struct mii_regs {
410 unsigned int addr; /* MII Address */
411 unsigned int data; /* MII Data */
LABBE Corentinb91dce42016-12-01 16:19:41 +0100412 unsigned int addr_shift; /* MII address shift */
413 unsigned int reg_shift; /* MII reg shift */
414 unsigned int addr_mask; /* MII address mask */
415 unsigned int reg_mask; /* MII reg mask */
416 unsigned int clk_csr_shift;
417 unsigned int clk_csr_mask;
Giuseppe Cavallaro47dd7a52009-10-14 15:13:45 -0700418};
419
Giuseppe Cavallaro47dd7a52009-10-14 15:13:45 -0700420struct mac_device_info {
Giuseppe CAVALLAROceb694992013-04-08 02:10:01 +0000421 const struct stmmac_ops *mac;
422 const struct stmmac_desc_ops *desc;
423 const struct stmmac_dma_ops *dma;
Giuseppe CAVALLARO29896a62014-03-10 13:40:33 +0100424 const struct stmmac_mode_ops *mode;
Rayagond Kokatanur891434b2013-03-26 04:43:10 +0000425 const struct stmmac_hwtimestamp *ptp;
Jose Abreu4dbbe8d2018-05-04 10:01:38 +0100426 const struct stmmac_tc_ops *tc;
Giuseppe CAVALLAROdb98a0b2010-01-06 23:07:17 +0000427 struct mii_regs mii; /* MII register Addresses */
428 struct mac_link link;
Vince Bridgers7ed24bb2014-07-31 15:49:13 -0500429 void __iomem *pcsr; /* vpointer to device CSRs */
Vince Bridgers3b57de92014-07-31 15:49:17 -0500430 int multicast_filter_bins;
431 int unicast_filter_entries;
432 int mcast_bits_log2;
Giuseppe CAVALLAROd2afb5b2014-09-01 09:17:52 +0200433 unsigned int rx_csum;
Giuseppe CAVALLARO3fe5cad2016-06-24 15:16:25 +0200434 unsigned int pcs;
435 unsigned int pmt;
Giuseppe CAVALLARO02e57b92016-06-24 15:16:26 +0200436 unsigned int ps;
Giuseppe Cavallaro47dd7a52009-10-14 15:13:45 -0700437};
438
Joao Pintoabe80fd2017-03-17 16:11:07 +0000439struct stmmac_rx_routing {
440 u32 reg_mask;
441 u32 reg_shift;
442};
443
Jose Abreu5f0456b2018-04-23 09:05:15 +0100444int dwmac100_setup(struct stmmac_priv *priv);
445int dwmac1000_setup(struct stmmac_priv *priv);
446int dwmac4_setup(struct stmmac_priv *priv);
Jose Abreu21427542018-08-08 09:04:30 +0100447int dwxgmac2_setup(struct stmmac_priv *priv);
Giuseppe CAVALLAROaec7ff22010-01-06 23:07:18 +0000448
Joe Perchesd6cc64e2013-09-23 11:37:59 -0700449void stmmac_set_mac_addr(void __iomem *ioaddr, u8 addr[6],
450 unsigned int high, unsigned int low);
451void stmmac_get_mac_addr(void __iomem *ioaddr, unsigned char *addr,
452 unsigned int high, unsigned int low);
Joe Perchesd6cc64e2013-09-23 11:37:59 -0700453void stmmac_set_mac(void __iomem *ioaddr, bool enable);
Giuseppe CAVALLARObfab27a2011-12-21 03:58:19 +0000454
Alexandre TORGUE477286b2016-04-01 11:37:31 +0200455void stmmac_dwmac4_set_mac_addr(void __iomem *ioaddr, u8 addr[6],
456 unsigned int high, unsigned int low);
457void stmmac_dwmac4_get_mac_addr(void __iomem *ioaddr, unsigned char *addr,
458 unsigned int high, unsigned int low);
459void stmmac_dwmac4_set_mac(void __iomem *ioaddr, bool enable);
460
Joe Perchesd6cc64e2013-09-23 11:37:59 -0700461void dwmac_dma_flush_tx_fifo(void __iomem *ioaddr);
Giuseppe CAVALLARO70523e632016-06-24 15:16:24 +0200462
Giuseppe CAVALLARO29896a62014-03-10 13:40:33 +0100463extern const struct stmmac_mode_ops ring_mode_ops;
464extern const struct stmmac_mode_ops chain_mode_ops;
Alexandre TORGUEf748be52016-04-01 11:37:34 +0200465extern const struct stmmac_desc_ops dwmac4_desc_ops;
Rayagond Kokatanurbd4242d2012-08-22 21:28:18 +0000466
467#endif /* __COMMON_H__ */