xref: /OK3568_Linux_fs/kernel/drivers/net/ethernet/samsung/sxgbe/sxgbe_common.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0-only */
2*4882a593Smuzhiyun /* 10G controller driver for Samsung SoCs
3*4882a593Smuzhiyun  *
4*4882a593Smuzhiyun  * Copyright (C) 2013 Samsung Electronics Co., Ltd.
5*4882a593Smuzhiyun  *		http://www.samsung.com
6*4882a593Smuzhiyun  *
7*4882a593Smuzhiyun  * Author: Siva Reddy Kallam <siva.kallam@samsung.com>
8*4882a593Smuzhiyun  */
9*4882a593Smuzhiyun 
10*4882a593Smuzhiyun #ifndef __SXGBE_COMMON_H__
11*4882a593Smuzhiyun #define __SXGBE_COMMON_H__
12*4882a593Smuzhiyun 
13*4882a593Smuzhiyun /* forward references */
14*4882a593Smuzhiyun struct sxgbe_desc_ops;
15*4882a593Smuzhiyun struct sxgbe_dma_ops;
16*4882a593Smuzhiyun struct sxgbe_mtl_ops;
17*4882a593Smuzhiyun 
18*4882a593Smuzhiyun #define SXGBE_RESOURCE_NAME	"sam_sxgbeeth"
19*4882a593Smuzhiyun #define DRV_MODULE_VERSION	"November_2013"
20*4882a593Smuzhiyun 
21*4882a593Smuzhiyun /* MAX HW feature words */
22*4882a593Smuzhiyun #define SXGBE_HW_WORDS 3
23*4882a593Smuzhiyun 
24*4882a593Smuzhiyun #define SXGBE_RX_COE_NONE	0
25*4882a593Smuzhiyun 
26*4882a593Smuzhiyun /* CSR Frequency Access Defines*/
27*4882a593Smuzhiyun #define SXGBE_CSR_F_150M	150000000
28*4882a593Smuzhiyun #define SXGBE_CSR_F_250M	250000000
29*4882a593Smuzhiyun #define SXGBE_CSR_F_300M	300000000
30*4882a593Smuzhiyun #define SXGBE_CSR_F_350M	350000000
31*4882a593Smuzhiyun #define SXGBE_CSR_F_400M	400000000
32*4882a593Smuzhiyun #define SXGBE_CSR_F_500M	500000000
33*4882a593Smuzhiyun 
34*4882a593Smuzhiyun /* pause time */
35*4882a593Smuzhiyun #define SXGBE_PAUSE_TIME 0x200
36*4882a593Smuzhiyun 
37*4882a593Smuzhiyun /* tx queues */
38*4882a593Smuzhiyun #define SXGBE_TX_QUEUES   8
39*4882a593Smuzhiyun #define SXGBE_RX_QUEUES   16
40*4882a593Smuzhiyun 
41*4882a593Smuzhiyun /* Calculated based how much time does it take to fill 256KB Rx memory
42*4882a593Smuzhiyun  * at 10Gb speed at 156MHz clock rate and considered little less then
43*4882a593Smuzhiyun  * the actual value.
44*4882a593Smuzhiyun  */
45*4882a593Smuzhiyun #define SXGBE_MAX_DMA_RIWT	0x70
46*4882a593Smuzhiyun #define SXGBE_MIN_DMA_RIWT	0x01
47*4882a593Smuzhiyun 
48*4882a593Smuzhiyun /* Tx coalesce parameters */
49*4882a593Smuzhiyun #define SXGBE_COAL_TX_TIMER	40000
50*4882a593Smuzhiyun #define SXGBE_MAX_COAL_TX_TICK	100000
51*4882a593Smuzhiyun #define SXGBE_TX_MAX_FRAMES	512
52*4882a593Smuzhiyun #define SXGBE_TX_FRAMES	128
53*4882a593Smuzhiyun 
54*4882a593Smuzhiyun /* SXGBE TX FIFO is 8K, Rx FIFO is 16K */
55*4882a593Smuzhiyun #define BUF_SIZE_16KiB 16384
56*4882a593Smuzhiyun #define BUF_SIZE_8KiB 8192
57*4882a593Smuzhiyun #define BUF_SIZE_4KiB 4096
58*4882a593Smuzhiyun #define BUF_SIZE_2KiB 2048
59*4882a593Smuzhiyun 
60*4882a593Smuzhiyun #define SXGBE_DEFAULT_LIT_LS	0x3E8
61*4882a593Smuzhiyun #define SXGBE_DEFAULT_TWT_LS	0x0
62*4882a593Smuzhiyun 
63*4882a593Smuzhiyun /* Flow Control defines */
64*4882a593Smuzhiyun #define SXGBE_FLOW_OFF		0
65*4882a593Smuzhiyun #define SXGBE_FLOW_RX		1
66*4882a593Smuzhiyun #define SXGBE_FLOW_TX		2
67*4882a593Smuzhiyun #define SXGBE_FLOW_AUTO		(SXGBE_FLOW_TX | SXGBE_FLOW_RX)
68*4882a593Smuzhiyun 
69*4882a593Smuzhiyun #define SF_DMA_MODE 1		/* DMA STORE-AND-FORWARD Operation Mode */
70*4882a593Smuzhiyun 
71*4882a593Smuzhiyun /* errors */
72*4882a593Smuzhiyun #define RX_GMII_ERR		0x01
73*4882a593Smuzhiyun #define RX_WATCHDOG_ERR		0x02
74*4882a593Smuzhiyun #define RX_CRC_ERR		0x03
75*4882a593Smuzhiyun #define RX_GAINT_ERR		0x04
76*4882a593Smuzhiyun #define RX_IP_HDR_ERR		0x05
77*4882a593Smuzhiyun #define RX_PAYLOAD_ERR		0x06
78*4882a593Smuzhiyun #define RX_OVERFLOW_ERR		0x07
79*4882a593Smuzhiyun 
80*4882a593Smuzhiyun /* pkt type */
81*4882a593Smuzhiyun #define RX_LEN_PKT		0x00
82*4882a593Smuzhiyun #define RX_MACCTL_PKT		0x01
83*4882a593Smuzhiyun #define RX_DCBCTL_PKT		0x02
84*4882a593Smuzhiyun #define RX_ARP_PKT		0x03
85*4882a593Smuzhiyun #define RX_OAM_PKT		0x04
86*4882a593Smuzhiyun #define RX_UNTAG_PKT		0x05
87*4882a593Smuzhiyun #define RX_OTHER_PKT		0x07
88*4882a593Smuzhiyun #define RX_SVLAN_PKT		0x08
89*4882a593Smuzhiyun #define RX_CVLAN_PKT		0x09
90*4882a593Smuzhiyun #define RX_DVLAN_OCVLAN_ICVLAN_PKT		0x0A
91*4882a593Smuzhiyun #define RX_DVLAN_OSVLAN_ISVLAN_PKT		0x0B
92*4882a593Smuzhiyun #define RX_DVLAN_OSVLAN_ICVLAN_PKT		0x0C
93*4882a593Smuzhiyun #define RX_DVLAN_OCVLAN_ISVLAN_PKT		0x0D
94*4882a593Smuzhiyun 
95*4882a593Smuzhiyun #define RX_NOT_IP_PKT		0x00
96*4882a593Smuzhiyun #define RX_IPV4_TCP_PKT		0x01
97*4882a593Smuzhiyun #define RX_IPV4_UDP_PKT		0x02
98*4882a593Smuzhiyun #define RX_IPV4_ICMP_PKT	0x03
99*4882a593Smuzhiyun #define RX_IPV4_UNKNOWN_PKT	0x07
100*4882a593Smuzhiyun #define RX_IPV6_TCP_PKT		0x09
101*4882a593Smuzhiyun #define RX_IPV6_UDP_PKT		0x0A
102*4882a593Smuzhiyun #define RX_IPV6_ICMP_PKT	0x0B
103*4882a593Smuzhiyun #define RX_IPV6_UNKNOWN_PKT	0x0F
104*4882a593Smuzhiyun 
105*4882a593Smuzhiyun #define RX_NO_PTP		0x00
106*4882a593Smuzhiyun #define RX_PTP_SYNC		0x01
107*4882a593Smuzhiyun #define RX_PTP_FOLLOW_UP	0x02
108*4882a593Smuzhiyun #define RX_PTP_DELAY_REQ	0x03
109*4882a593Smuzhiyun #define RX_PTP_DELAY_RESP	0x04
110*4882a593Smuzhiyun #define RX_PTP_PDELAY_REQ	0x05
111*4882a593Smuzhiyun #define RX_PTP_PDELAY_RESP	0x06
112*4882a593Smuzhiyun #define RX_PTP_PDELAY_FOLLOW_UP	0x07
113*4882a593Smuzhiyun #define RX_PTP_ANNOUNCE		0x08
114*4882a593Smuzhiyun #define RX_PTP_MGMT		0x09
115*4882a593Smuzhiyun #define RX_PTP_SIGNAL		0x0A
116*4882a593Smuzhiyun #define RX_PTP_RESV_MSG		0x0F
117*4882a593Smuzhiyun 
118*4882a593Smuzhiyun /* EEE-LPI mode  flags*/
119*4882a593Smuzhiyun #define TX_ENTRY_LPI_MODE	0x10
120*4882a593Smuzhiyun #define TX_EXIT_LPI_MODE	0x20
121*4882a593Smuzhiyun #define RX_ENTRY_LPI_MODE	0x40
122*4882a593Smuzhiyun #define RX_EXIT_LPI_MODE	0x80
123*4882a593Smuzhiyun 
124*4882a593Smuzhiyun /* EEE-LPI Interrupt status flag */
125*4882a593Smuzhiyun #define LPI_INT_STATUS		BIT(5)
126*4882a593Smuzhiyun 
127*4882a593Smuzhiyun /* EEE-LPI Default timer values */
128*4882a593Smuzhiyun #define LPI_LINK_STATUS_TIMER	0x3E8
129*4882a593Smuzhiyun #define LPI_MAC_WAIT_TIMER	0x00
130*4882a593Smuzhiyun 
131*4882a593Smuzhiyun /* EEE-LPI Control and status definitions */
132*4882a593Smuzhiyun #define LPI_CTRL_STATUS_TXA	BIT(19)
133*4882a593Smuzhiyun #define LPI_CTRL_STATUS_PLSDIS	BIT(18)
134*4882a593Smuzhiyun #define LPI_CTRL_STATUS_PLS	BIT(17)
135*4882a593Smuzhiyun #define LPI_CTRL_STATUS_LPIEN	BIT(16)
136*4882a593Smuzhiyun #define LPI_CTRL_STATUS_TXRSTP	BIT(11)
137*4882a593Smuzhiyun #define LPI_CTRL_STATUS_RXRSTP	BIT(10)
138*4882a593Smuzhiyun #define LPI_CTRL_STATUS_RLPIST	BIT(9)
139*4882a593Smuzhiyun #define LPI_CTRL_STATUS_TLPIST	BIT(8)
140*4882a593Smuzhiyun #define LPI_CTRL_STATUS_RLPIEX	BIT(3)
141*4882a593Smuzhiyun #define LPI_CTRL_STATUS_RLPIEN	BIT(2)
142*4882a593Smuzhiyun #define LPI_CTRL_STATUS_TLPIEX	BIT(1)
143*4882a593Smuzhiyun #define LPI_CTRL_STATUS_TLPIEN	BIT(0)
144*4882a593Smuzhiyun 
145*4882a593Smuzhiyun enum dma_irq_status {
146*4882a593Smuzhiyun 	tx_hard_error	= BIT(0),
147*4882a593Smuzhiyun 	tx_bump_tc	= BIT(1),
148*4882a593Smuzhiyun 	handle_tx	= BIT(2),
149*4882a593Smuzhiyun 	rx_hard_error	= BIT(3),
150*4882a593Smuzhiyun 	rx_bump_tc	= BIT(4),
151*4882a593Smuzhiyun 	handle_rx	= BIT(5),
152*4882a593Smuzhiyun };
153*4882a593Smuzhiyun 
154*4882a593Smuzhiyun #define NETIF_F_HW_VLAN_ALL     (NETIF_F_HW_VLAN_CTAG_RX |	\
155*4882a593Smuzhiyun 				 NETIF_F_HW_VLAN_STAG_RX |	\
156*4882a593Smuzhiyun 				 NETIF_F_HW_VLAN_CTAG_TX |	\
157*4882a593Smuzhiyun 				 NETIF_F_HW_VLAN_STAG_TX |	\
158*4882a593Smuzhiyun 				 NETIF_F_HW_VLAN_CTAG_FILTER |	\
159*4882a593Smuzhiyun 				 NETIF_F_HW_VLAN_STAG_FILTER)
160*4882a593Smuzhiyun 
161*4882a593Smuzhiyun /* MMC control defines */
162*4882a593Smuzhiyun #define SXGBE_MMC_CTRL_CNT_FRZ  0x00000008
163*4882a593Smuzhiyun 
164*4882a593Smuzhiyun /* SXGBE HW ADDR regs */
165*4882a593Smuzhiyun #define SXGBE_ADDR_HIGH(reg)    (((reg > 15) ? 0x00000800 : 0x00000040) + \
166*4882a593Smuzhiyun 				 (reg * 8))
167*4882a593Smuzhiyun #define SXGBE_ADDR_LOW(reg)     (((reg > 15) ? 0x00000804 : 0x00000044) + \
168*4882a593Smuzhiyun 				 (reg * 8))
169*4882a593Smuzhiyun #define SXGBE_MAX_PERFECT_ADDRESSES 32 /* Maximum unicast perfect filtering */
170*4882a593Smuzhiyun #define SXGBE_FRAME_FILTER       0x00000004      /* Frame Filter */
171*4882a593Smuzhiyun 
172*4882a593Smuzhiyun /* SXGBE Frame Filter defines */
173*4882a593Smuzhiyun #define SXGBE_FRAME_FILTER_PR    0x00000001      /* Promiscuous Mode */
174*4882a593Smuzhiyun #define SXGBE_FRAME_FILTER_HUC   0x00000002      /* Hash Unicast */
175*4882a593Smuzhiyun #define SXGBE_FRAME_FILTER_HMC   0x00000004      /* Hash Multicast */
176*4882a593Smuzhiyun #define SXGBE_FRAME_FILTER_DAIF  0x00000008      /* DA Inverse Filtering */
177*4882a593Smuzhiyun #define SXGBE_FRAME_FILTER_PM    0x00000010      /* Pass all multicast */
178*4882a593Smuzhiyun #define SXGBE_FRAME_FILTER_DBF   0x00000020      /* Disable Broadcast frames */
179*4882a593Smuzhiyun #define SXGBE_FRAME_FILTER_SAIF  0x00000100      /* Inverse Filtering */
180*4882a593Smuzhiyun #define SXGBE_FRAME_FILTER_SAF   0x00000200      /* Source Address Filter */
181*4882a593Smuzhiyun #define SXGBE_FRAME_FILTER_HPF   0x00000400      /* Hash or perfect Filter */
182*4882a593Smuzhiyun #define SXGBE_FRAME_FILTER_RA    0x80000000      /* Receive all mode */
183*4882a593Smuzhiyun 
184*4882a593Smuzhiyun #define SXGBE_HASH_TABLE_SIZE    64
185*4882a593Smuzhiyun #define SXGBE_HASH_HIGH          0x00000008      /* Multicast Hash Table High */
186*4882a593Smuzhiyun #define SXGBE_HASH_LOW           0x0000000c      /* Multicast Hash Table Low */
187*4882a593Smuzhiyun 
188*4882a593Smuzhiyun #define SXGBE_HI_REG_AE          0x80000000
189*4882a593Smuzhiyun 
190*4882a593Smuzhiyun /* Minimum and maximum MTU */
191*4882a593Smuzhiyun #define MIN_MTU         68
192*4882a593Smuzhiyun #define MAX_MTU         9000
193*4882a593Smuzhiyun 
194*4882a593Smuzhiyun #define SXGBE_FOR_EACH_QUEUE(max_queues, queue_num)			\
195*4882a593Smuzhiyun 	for (queue_num = 0; queue_num < max_queues; queue_num++)
196*4882a593Smuzhiyun 
197*4882a593Smuzhiyun #define DRV_VERSION "1.0.0"
198*4882a593Smuzhiyun 
199*4882a593Smuzhiyun #define SXGBE_MAX_RX_CHANNELS	16
200*4882a593Smuzhiyun #define SXGBE_MAX_TX_CHANNELS	16
201*4882a593Smuzhiyun 
202*4882a593Smuzhiyun #define START_MAC_REG_OFFSET	0x0000
203*4882a593Smuzhiyun #define MAX_MAC_REG_OFFSET	0x0DFC
204*4882a593Smuzhiyun #define START_MTL_REG_OFFSET	0x1000
205*4882a593Smuzhiyun #define MAX_MTL_REG_OFFSET	0x18FC
206*4882a593Smuzhiyun #define START_DMA_REG_OFFSET	0x3000
207*4882a593Smuzhiyun #define MAX_DMA_REG_OFFSET	0x38FC
208*4882a593Smuzhiyun 
209*4882a593Smuzhiyun #define REG_SPACE_SIZE		0x2000
210*4882a593Smuzhiyun 
211*4882a593Smuzhiyun /* sxgbe statistics counters */
212*4882a593Smuzhiyun struct sxgbe_extra_stats {
213*4882a593Smuzhiyun 	/* TX/RX IRQ events */
214*4882a593Smuzhiyun 	unsigned long tx_underflow_irq;
215*4882a593Smuzhiyun 	unsigned long tx_process_stopped_irq;
216*4882a593Smuzhiyun 	unsigned long tx_ctxt_desc_err;
217*4882a593Smuzhiyun 	unsigned long tx_threshold;
218*4882a593Smuzhiyun 	unsigned long rx_threshold;
219*4882a593Smuzhiyun 	unsigned long tx_pkt_n;
220*4882a593Smuzhiyun 	unsigned long rx_pkt_n;
221*4882a593Smuzhiyun 	unsigned long normal_irq_n;
222*4882a593Smuzhiyun 	unsigned long tx_normal_irq_n;
223*4882a593Smuzhiyun 	unsigned long rx_normal_irq_n;
224*4882a593Smuzhiyun 	unsigned long napi_poll;
225*4882a593Smuzhiyun 	unsigned long tx_clean;
226*4882a593Smuzhiyun 	unsigned long tx_reset_ic_bit;
227*4882a593Smuzhiyun 	unsigned long rx_process_stopped_irq;
228*4882a593Smuzhiyun 	unsigned long rx_underflow_irq;
229*4882a593Smuzhiyun 
230*4882a593Smuzhiyun 	/* Bus access errors */
231*4882a593Smuzhiyun 	unsigned long fatal_bus_error_irq;
232*4882a593Smuzhiyun 	unsigned long tx_read_transfer_err;
233*4882a593Smuzhiyun 	unsigned long tx_write_transfer_err;
234*4882a593Smuzhiyun 	unsigned long tx_desc_access_err;
235*4882a593Smuzhiyun 	unsigned long tx_buffer_access_err;
236*4882a593Smuzhiyun 	unsigned long tx_data_transfer_err;
237*4882a593Smuzhiyun 	unsigned long rx_read_transfer_err;
238*4882a593Smuzhiyun 	unsigned long rx_write_transfer_err;
239*4882a593Smuzhiyun 	unsigned long rx_desc_access_err;
240*4882a593Smuzhiyun 	unsigned long rx_buffer_access_err;
241*4882a593Smuzhiyun 	unsigned long rx_data_transfer_err;
242*4882a593Smuzhiyun 
243*4882a593Smuzhiyun 	/* EEE-LPI stats */
244*4882a593Smuzhiyun 	unsigned long tx_lpi_entry_n;
245*4882a593Smuzhiyun 	unsigned long tx_lpi_exit_n;
246*4882a593Smuzhiyun 	unsigned long rx_lpi_entry_n;
247*4882a593Smuzhiyun 	unsigned long rx_lpi_exit_n;
248*4882a593Smuzhiyun 	unsigned long eee_wakeup_error_n;
249*4882a593Smuzhiyun 
250*4882a593Smuzhiyun 	/* RX specific */
251*4882a593Smuzhiyun 	/* L2 error */
252*4882a593Smuzhiyun 	unsigned long rx_code_gmii_err;
253*4882a593Smuzhiyun 	unsigned long rx_watchdog_err;
254*4882a593Smuzhiyun 	unsigned long rx_crc_err;
255*4882a593Smuzhiyun 	unsigned long rx_gaint_pkt_err;
256*4882a593Smuzhiyun 	unsigned long ip_hdr_err;
257*4882a593Smuzhiyun 	unsigned long ip_payload_err;
258*4882a593Smuzhiyun 	unsigned long overflow_error;
259*4882a593Smuzhiyun 
260*4882a593Smuzhiyun 	/* L2 Pkt type */
261*4882a593Smuzhiyun 	unsigned long len_pkt;
262*4882a593Smuzhiyun 	unsigned long mac_ctl_pkt;
263*4882a593Smuzhiyun 	unsigned long dcb_ctl_pkt;
264*4882a593Smuzhiyun 	unsigned long arp_pkt;
265*4882a593Smuzhiyun 	unsigned long oam_pkt;
266*4882a593Smuzhiyun 	unsigned long untag_okt;
267*4882a593Smuzhiyun 	unsigned long other_pkt;
268*4882a593Smuzhiyun 	unsigned long svlan_tag_pkt;
269*4882a593Smuzhiyun 	unsigned long cvlan_tag_pkt;
270*4882a593Smuzhiyun 	unsigned long dvlan_ocvlan_icvlan_pkt;
271*4882a593Smuzhiyun 	unsigned long dvlan_osvlan_isvlan_pkt;
272*4882a593Smuzhiyun 	unsigned long dvlan_osvlan_icvlan_pkt;
273*4882a593Smuzhiyun 	unsigned long dvan_ocvlan_icvlan_pkt;
274*4882a593Smuzhiyun 
275*4882a593Smuzhiyun 	/* L3/L4 Pkt type */
276*4882a593Smuzhiyun 	unsigned long not_ip_pkt;
277*4882a593Smuzhiyun 	unsigned long ip4_tcp_pkt;
278*4882a593Smuzhiyun 	unsigned long ip4_udp_pkt;
279*4882a593Smuzhiyun 	unsigned long ip4_icmp_pkt;
280*4882a593Smuzhiyun 	unsigned long ip4_unknown_pkt;
281*4882a593Smuzhiyun 	unsigned long ip6_tcp_pkt;
282*4882a593Smuzhiyun 	unsigned long ip6_udp_pkt;
283*4882a593Smuzhiyun 	unsigned long ip6_icmp_pkt;
284*4882a593Smuzhiyun 	unsigned long ip6_unknown_pkt;
285*4882a593Smuzhiyun 
286*4882a593Smuzhiyun 	/* Filter specific */
287*4882a593Smuzhiyun 	unsigned long vlan_filter_match;
288*4882a593Smuzhiyun 	unsigned long sa_filter_fail;
289*4882a593Smuzhiyun 	unsigned long da_filter_fail;
290*4882a593Smuzhiyun 	unsigned long hash_filter_pass;
291*4882a593Smuzhiyun 	unsigned long l3_filter_match;
292*4882a593Smuzhiyun 	unsigned long l4_filter_match;
293*4882a593Smuzhiyun 
294*4882a593Smuzhiyun 	/* RX context specific */
295*4882a593Smuzhiyun 	unsigned long timestamp_dropped;
296*4882a593Smuzhiyun 	unsigned long rx_msg_type_no_ptp;
297*4882a593Smuzhiyun 	unsigned long rx_ptp_type_sync;
298*4882a593Smuzhiyun 	unsigned long rx_ptp_type_follow_up;
299*4882a593Smuzhiyun 	unsigned long rx_ptp_type_delay_req;
300*4882a593Smuzhiyun 	unsigned long rx_ptp_type_delay_resp;
301*4882a593Smuzhiyun 	unsigned long rx_ptp_type_pdelay_req;
302*4882a593Smuzhiyun 	unsigned long rx_ptp_type_pdelay_resp;
303*4882a593Smuzhiyun 	unsigned long rx_ptp_type_pdelay_follow_up;
304*4882a593Smuzhiyun 	unsigned long rx_ptp_announce;
305*4882a593Smuzhiyun 	unsigned long rx_ptp_mgmt;
306*4882a593Smuzhiyun 	unsigned long rx_ptp_signal;
307*4882a593Smuzhiyun 	unsigned long rx_ptp_resv_msg_type;
308*4882a593Smuzhiyun };
309*4882a593Smuzhiyun 
310*4882a593Smuzhiyun struct mac_link {
311*4882a593Smuzhiyun 	int port;
312*4882a593Smuzhiyun 	int duplex;
313*4882a593Smuzhiyun 	int speed;
314*4882a593Smuzhiyun };
315*4882a593Smuzhiyun 
316*4882a593Smuzhiyun struct mii_regs {
317*4882a593Smuzhiyun 	unsigned int addr;	/* MII Address */
318*4882a593Smuzhiyun 	unsigned int data;	/* MII Data */
319*4882a593Smuzhiyun };
320*4882a593Smuzhiyun 
321*4882a593Smuzhiyun struct sxgbe_core_ops {
322*4882a593Smuzhiyun 	/* MAC core initialization */
323*4882a593Smuzhiyun 	void (*core_init)(void __iomem *ioaddr);
324*4882a593Smuzhiyun 	/* Dump MAC registers */
325*4882a593Smuzhiyun 	void (*dump_regs)(void __iomem *ioaddr);
326*4882a593Smuzhiyun 	/* Handle extra events on specific interrupts hw dependent */
327*4882a593Smuzhiyun 	int (*host_irq_status)(void __iomem *ioaddr,
328*4882a593Smuzhiyun 			       struct sxgbe_extra_stats *x);
329*4882a593Smuzhiyun 	/* Set power management mode (e.g. magic frame) */
330*4882a593Smuzhiyun 	void (*pmt)(void __iomem *ioaddr, unsigned long mode);
331*4882a593Smuzhiyun 	/* Set/Get Unicast MAC addresses */
332*4882a593Smuzhiyun 	void (*set_umac_addr)(void __iomem *ioaddr, unsigned char *addr,
333*4882a593Smuzhiyun 			      unsigned int reg_n);
334*4882a593Smuzhiyun 	void (*get_umac_addr)(void __iomem *ioaddr, unsigned char *addr,
335*4882a593Smuzhiyun 			      unsigned int reg_n);
336*4882a593Smuzhiyun 	void (*enable_rx)(void __iomem *ioaddr, bool enable);
337*4882a593Smuzhiyun 	void (*enable_tx)(void __iomem *ioaddr, bool enable);
338*4882a593Smuzhiyun 
339*4882a593Smuzhiyun 	/* controller version specific operations */
340*4882a593Smuzhiyun 	int (*get_controller_version)(void __iomem *ioaddr);
341*4882a593Smuzhiyun 
342*4882a593Smuzhiyun 	/* If supported then get the optional core features */
343*4882a593Smuzhiyun 	unsigned int (*get_hw_feature)(void __iomem *ioaddr,
344*4882a593Smuzhiyun 				       unsigned char feature_index);
345*4882a593Smuzhiyun 	/* adjust SXGBE speed */
346*4882a593Smuzhiyun 	void (*set_speed)(void __iomem *ioaddr, unsigned char speed);
347*4882a593Smuzhiyun 
348*4882a593Smuzhiyun 	/* EEE-LPI specific operations */
349*4882a593Smuzhiyun 	void (*set_eee_mode)(void __iomem *ioaddr);
350*4882a593Smuzhiyun 	void (*reset_eee_mode)(void __iomem *ioaddr);
351*4882a593Smuzhiyun 	void (*set_eee_timer)(void __iomem *ioaddr, const int ls,
352*4882a593Smuzhiyun 			      const int tw);
353*4882a593Smuzhiyun 	void (*set_eee_pls)(void __iomem *ioaddr, const int link);
354*4882a593Smuzhiyun 
355*4882a593Smuzhiyun 	/* Enable disable checksum offload operations */
356*4882a593Smuzhiyun 	void (*enable_rx_csum)(void __iomem *ioaddr);
357*4882a593Smuzhiyun 	void (*disable_rx_csum)(void __iomem *ioaddr);
358*4882a593Smuzhiyun 	void (*enable_rxqueue)(void __iomem *ioaddr, int queue_num);
359*4882a593Smuzhiyun 	void (*disable_rxqueue)(void __iomem *ioaddr, int queue_num);
360*4882a593Smuzhiyun };
361*4882a593Smuzhiyun 
362*4882a593Smuzhiyun const struct sxgbe_core_ops *sxgbe_get_core_ops(void);
363*4882a593Smuzhiyun 
364*4882a593Smuzhiyun struct sxgbe_ops {
365*4882a593Smuzhiyun 	const struct sxgbe_core_ops *mac;
366*4882a593Smuzhiyun 	const struct sxgbe_desc_ops *desc;
367*4882a593Smuzhiyun 	const struct sxgbe_dma_ops *dma;
368*4882a593Smuzhiyun 	const struct sxgbe_mtl_ops *mtl;
369*4882a593Smuzhiyun 	struct mii_regs mii;	/* MII register Addresses */
370*4882a593Smuzhiyun 	struct mac_link link;
371*4882a593Smuzhiyun 	unsigned int ctrl_uid;
372*4882a593Smuzhiyun 	unsigned int ctrl_id;
373*4882a593Smuzhiyun };
374*4882a593Smuzhiyun 
375*4882a593Smuzhiyun /* SXGBE private data structures */
376*4882a593Smuzhiyun struct sxgbe_tx_queue {
377*4882a593Smuzhiyun 	unsigned int irq_no;
378*4882a593Smuzhiyun 	struct sxgbe_priv_data *priv_ptr;
379*4882a593Smuzhiyun 	struct sxgbe_tx_norm_desc *dma_tx;
380*4882a593Smuzhiyun 	dma_addr_t dma_tx_phy;
381*4882a593Smuzhiyun 	dma_addr_t *tx_skbuff_dma;
382*4882a593Smuzhiyun 	struct sk_buff **tx_skbuff;
383*4882a593Smuzhiyun 	struct timer_list txtimer;
384*4882a593Smuzhiyun 	unsigned int cur_tx;
385*4882a593Smuzhiyun 	unsigned int dirty_tx;
386*4882a593Smuzhiyun 	u32 tx_count_frames;
387*4882a593Smuzhiyun 	u32 tx_coal_frames;
388*4882a593Smuzhiyun 	u32 tx_coal_timer;
389*4882a593Smuzhiyun 	int hwts_tx_en;
390*4882a593Smuzhiyun 	u16 prev_mss;
391*4882a593Smuzhiyun 	u8 queue_no;
392*4882a593Smuzhiyun };
393*4882a593Smuzhiyun 
394*4882a593Smuzhiyun struct sxgbe_rx_queue {
395*4882a593Smuzhiyun 	struct sxgbe_priv_data *priv_ptr;
396*4882a593Smuzhiyun 	struct sxgbe_rx_norm_desc *dma_rx;
397*4882a593Smuzhiyun 	struct sk_buff **rx_skbuff;
398*4882a593Smuzhiyun 	unsigned int cur_rx;
399*4882a593Smuzhiyun 	unsigned int dirty_rx;
400*4882a593Smuzhiyun 	unsigned int irq_no;
401*4882a593Smuzhiyun 	u32 rx_riwt;
402*4882a593Smuzhiyun 	dma_addr_t *rx_skbuff_dma;
403*4882a593Smuzhiyun 	dma_addr_t dma_rx_phy;
404*4882a593Smuzhiyun 	u8 queue_no;
405*4882a593Smuzhiyun };
406*4882a593Smuzhiyun 
407*4882a593Smuzhiyun /* SXGBE HW capabilities */
408*4882a593Smuzhiyun struct sxgbe_hw_features {
409*4882a593Smuzhiyun 	/****** CAP [0] *******/
410*4882a593Smuzhiyun 	unsigned int pmt_remote_wake_up;
411*4882a593Smuzhiyun 	unsigned int pmt_magic_frame;
412*4882a593Smuzhiyun 	/* IEEE 1588-2008 */
413*4882a593Smuzhiyun 	unsigned int atime_stamp;
414*4882a593Smuzhiyun 
415*4882a593Smuzhiyun 	unsigned int eee;
416*4882a593Smuzhiyun 
417*4882a593Smuzhiyun 	unsigned int tx_csum_offload;
418*4882a593Smuzhiyun 	unsigned int rx_csum_offload;
419*4882a593Smuzhiyun 	unsigned int multi_macaddr;
420*4882a593Smuzhiyun 	unsigned int tstamp_srcselect;
421*4882a593Smuzhiyun 	unsigned int sa_vlan_insert;
422*4882a593Smuzhiyun 
423*4882a593Smuzhiyun 	/****** CAP [1] *******/
424*4882a593Smuzhiyun 	unsigned int rxfifo_size;
425*4882a593Smuzhiyun 	unsigned int txfifo_size;
426*4882a593Smuzhiyun 	unsigned int atstmap_hword;
427*4882a593Smuzhiyun 	unsigned int dcb_enable;
428*4882a593Smuzhiyun 	unsigned int splithead_enable;
429*4882a593Smuzhiyun 	unsigned int tcpseg_offload;
430*4882a593Smuzhiyun 	unsigned int debug_mem;
431*4882a593Smuzhiyun 	unsigned int rss_enable;
432*4882a593Smuzhiyun 	unsigned int hash_tsize;
433*4882a593Smuzhiyun 	unsigned int l3l4_filer_size;
434*4882a593Smuzhiyun 
435*4882a593Smuzhiyun 	/* This value is in bytes and
436*4882a593Smuzhiyun 	 * as mentioned in HW features
437*4882a593Smuzhiyun 	 * of SXGBE data book
438*4882a593Smuzhiyun 	 */
439*4882a593Smuzhiyun 	unsigned int rx_mtl_qsize;
440*4882a593Smuzhiyun 	unsigned int tx_mtl_qsize;
441*4882a593Smuzhiyun 
442*4882a593Smuzhiyun 	/****** CAP [2] *******/
443*4882a593Smuzhiyun 	/* TX and RX number of channels */
444*4882a593Smuzhiyun 	unsigned int rx_mtl_queues;
445*4882a593Smuzhiyun 	unsigned int tx_mtl_queues;
446*4882a593Smuzhiyun 	unsigned int rx_dma_channels;
447*4882a593Smuzhiyun 	unsigned int tx_dma_channels;
448*4882a593Smuzhiyun 	unsigned int pps_output_count;
449*4882a593Smuzhiyun 	unsigned int aux_input_count;
450*4882a593Smuzhiyun };
451*4882a593Smuzhiyun 
452*4882a593Smuzhiyun struct sxgbe_priv_data {
453*4882a593Smuzhiyun 	/* DMA descriptos */
454*4882a593Smuzhiyun 	struct sxgbe_tx_queue *txq[SXGBE_TX_QUEUES];
455*4882a593Smuzhiyun 	struct sxgbe_rx_queue *rxq[SXGBE_RX_QUEUES];
456*4882a593Smuzhiyun 	u8 cur_rx_qnum;
457*4882a593Smuzhiyun 
458*4882a593Smuzhiyun 	unsigned int dma_tx_size;
459*4882a593Smuzhiyun 	unsigned int dma_rx_size;
460*4882a593Smuzhiyun 	unsigned int dma_buf_sz;
461*4882a593Smuzhiyun 	u32 rx_riwt;
462*4882a593Smuzhiyun 
463*4882a593Smuzhiyun 	struct napi_struct napi;
464*4882a593Smuzhiyun 
465*4882a593Smuzhiyun 	void __iomem *ioaddr;
466*4882a593Smuzhiyun 	struct net_device *dev;
467*4882a593Smuzhiyun 	struct device *device;
468*4882a593Smuzhiyun 	struct sxgbe_ops *hw;	/* sxgbe specific ops */
469*4882a593Smuzhiyun 	int no_csum_insertion;
470*4882a593Smuzhiyun 	int irq;
471*4882a593Smuzhiyun 	int rxcsum_insertion;
472*4882a593Smuzhiyun 	spinlock_t stats_lock;	/* lock for tx/rx statatics */
473*4882a593Smuzhiyun 
474*4882a593Smuzhiyun 	int oldlink;
475*4882a593Smuzhiyun 	int speed;
476*4882a593Smuzhiyun 	int oldduplex;
477*4882a593Smuzhiyun 	struct mii_bus *mii;
478*4882a593Smuzhiyun 	int mii_irq[PHY_MAX_ADDR];
479*4882a593Smuzhiyun 	u8 rx_pause;
480*4882a593Smuzhiyun 	u8 tx_pause;
481*4882a593Smuzhiyun 
482*4882a593Smuzhiyun 	struct sxgbe_extra_stats xstats;
483*4882a593Smuzhiyun 	struct sxgbe_plat_data *plat;
484*4882a593Smuzhiyun 	struct sxgbe_hw_features hw_cap;
485*4882a593Smuzhiyun 
486*4882a593Smuzhiyun 	u32 msg_enable;
487*4882a593Smuzhiyun 
488*4882a593Smuzhiyun 	struct clk *sxgbe_clk;
489*4882a593Smuzhiyun 	int clk_csr;
490*4882a593Smuzhiyun 	unsigned int mode;
491*4882a593Smuzhiyun 	unsigned int default_addend;
492*4882a593Smuzhiyun 
493*4882a593Smuzhiyun 	/* advanced time stamp support */
494*4882a593Smuzhiyun 	u32 adv_ts;
495*4882a593Smuzhiyun 	int use_riwt;
496*4882a593Smuzhiyun 	struct ptp_clock *ptp_clock;
497*4882a593Smuzhiyun 
498*4882a593Smuzhiyun 	/* tc control */
499*4882a593Smuzhiyun 	int tx_tc;
500*4882a593Smuzhiyun 	int rx_tc;
501*4882a593Smuzhiyun 	/* EEE-LPI specific members */
502*4882a593Smuzhiyun 	struct timer_list eee_ctrl_timer;
503*4882a593Smuzhiyun 	bool tx_path_in_lpi_mode;
504*4882a593Smuzhiyun 	int lpi_irq;
505*4882a593Smuzhiyun 	int eee_enabled;
506*4882a593Smuzhiyun 	int eee_active;
507*4882a593Smuzhiyun 	int tx_lpi_timer;
508*4882a593Smuzhiyun };
509*4882a593Smuzhiyun 
510*4882a593Smuzhiyun /* Function prototypes */
511*4882a593Smuzhiyun struct sxgbe_priv_data *sxgbe_drv_probe(struct device *device,
512*4882a593Smuzhiyun 					struct sxgbe_plat_data *plat_dat,
513*4882a593Smuzhiyun 					void __iomem *addr);
514*4882a593Smuzhiyun int sxgbe_drv_remove(struct net_device *ndev);
515*4882a593Smuzhiyun void sxgbe_set_ethtool_ops(struct net_device *netdev);
516*4882a593Smuzhiyun int sxgbe_mdio_unregister(struct net_device *ndev);
517*4882a593Smuzhiyun int sxgbe_mdio_register(struct net_device *ndev);
518*4882a593Smuzhiyun int sxgbe_register_platform(void);
519*4882a593Smuzhiyun void sxgbe_unregister_platform(void);
520*4882a593Smuzhiyun 
521*4882a593Smuzhiyun #ifdef CONFIG_PM
522*4882a593Smuzhiyun int sxgbe_suspend(struct net_device *ndev);
523*4882a593Smuzhiyun int sxgbe_resume(struct net_device *ndev);
524*4882a593Smuzhiyun int sxgbe_freeze(struct net_device *ndev);
525*4882a593Smuzhiyun int sxgbe_restore(struct net_device *ndev);
526*4882a593Smuzhiyun #endif /* CONFIG_PM */
527*4882a593Smuzhiyun 
528*4882a593Smuzhiyun const struct sxgbe_mtl_ops *sxgbe_get_mtl_ops(void);
529*4882a593Smuzhiyun 
530*4882a593Smuzhiyun void sxgbe_disable_eee_mode(struct sxgbe_priv_data * const priv);
531*4882a593Smuzhiyun bool sxgbe_eee_init(struct sxgbe_priv_data * const priv);
532*4882a593Smuzhiyun #endif /* __SXGBE_COMMON_H__ */
533