1852ba100SJustin Hibbits /*
2852ba100SJustin Hibbits  * Copyright 2008-2012 Freescale Semiconductor Inc.
3852ba100SJustin Hibbits  *
4852ba100SJustin Hibbits  * Redistribution and use in source and binary forms, with or without
5852ba100SJustin Hibbits  * modification, are permitted provided that the following conditions are met:
6852ba100SJustin Hibbits  *     * Redistributions of source code must retain the above copyright
7852ba100SJustin Hibbits  *       notice, this list of conditions and the following disclaimer.
8852ba100SJustin Hibbits  *     * Redistributions in binary form must reproduce the above copyright
9852ba100SJustin Hibbits  *       notice, this list of conditions and the following disclaimer in the
10852ba100SJustin Hibbits  *       documentation and/or other materials provided with the distribution.
11852ba100SJustin Hibbits  *     * Neither the name of Freescale Semiconductor nor the
12852ba100SJustin Hibbits  *       names of its contributors may be used to endorse or promote products
13852ba100SJustin Hibbits  *       derived from this software without specific prior written permission.
14852ba100SJustin Hibbits  *
15852ba100SJustin Hibbits  *
16852ba100SJustin Hibbits  * ALTERNATIVELY, this software may be distributed under the terms of the
17852ba100SJustin Hibbits  * GNU General Public License ("GPL") as published by the Free Software
18852ba100SJustin Hibbits  * Foundation, either version 2 of that License or (at your option) any
19852ba100SJustin Hibbits  * later version.
20852ba100SJustin Hibbits  *
21852ba100SJustin Hibbits  * THIS SOFTWARE IS PROVIDED BY Freescale Semiconductor ``AS IS'' AND ANY
22852ba100SJustin Hibbits  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
23852ba100SJustin Hibbits  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
24852ba100SJustin Hibbits  * DISCLAIMED. IN NO EVENT SHALL Freescale Semiconductor BE LIABLE FOR ANY
25852ba100SJustin Hibbits  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
26852ba100SJustin Hibbits  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
27852ba100SJustin Hibbits  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
28852ba100SJustin Hibbits  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
29852ba100SJustin Hibbits  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
30852ba100SJustin Hibbits  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31852ba100SJustin Hibbits  */
32852ba100SJustin Hibbits 
33852ba100SJustin Hibbits 
34852ba100SJustin Hibbits #include "fsl_fman_dtsec.h"
35852ba100SJustin Hibbits 
36852ba100SJustin Hibbits 
fman_dtsec_stop_rx(struct dtsec_regs * regs)37852ba100SJustin Hibbits void fman_dtsec_stop_rx(struct dtsec_regs *regs)
38852ba100SJustin Hibbits {
39852ba100SJustin Hibbits 	/* Assert the graceful stop bit */
40852ba100SJustin Hibbits 	iowrite32be(ioread32be(&regs->rctrl) | RCTRL_GRS, &regs->rctrl);
41852ba100SJustin Hibbits }
42852ba100SJustin Hibbits 
fman_dtsec_stop_tx(struct dtsec_regs * regs)43852ba100SJustin Hibbits void fman_dtsec_stop_tx(struct dtsec_regs *regs)
44852ba100SJustin Hibbits {
45852ba100SJustin Hibbits 	/* Assert the graceful stop bit */
46852ba100SJustin Hibbits 	iowrite32be(ioread32be(&regs->tctrl) | DTSEC_TCTRL_GTS, &regs->tctrl);
47852ba100SJustin Hibbits }
48852ba100SJustin Hibbits 
fman_dtsec_start_tx(struct dtsec_regs * regs)49852ba100SJustin Hibbits void fman_dtsec_start_tx(struct dtsec_regs *regs)
50852ba100SJustin Hibbits {
51852ba100SJustin Hibbits 	/* clear the graceful stop bit */
52852ba100SJustin Hibbits 	iowrite32be(ioread32be(&regs->tctrl) & ~DTSEC_TCTRL_GTS, &regs->tctrl);
53852ba100SJustin Hibbits }
54852ba100SJustin Hibbits 
fman_dtsec_start_rx(struct dtsec_regs * regs)55852ba100SJustin Hibbits void fman_dtsec_start_rx(struct dtsec_regs *regs)
56852ba100SJustin Hibbits {
57852ba100SJustin Hibbits 	/* clear the graceful stop bit */
58852ba100SJustin Hibbits 	iowrite32be(ioread32be(&regs->rctrl) & ~RCTRL_GRS, &regs->rctrl);
59852ba100SJustin Hibbits }
60852ba100SJustin Hibbits 
fman_dtsec_defconfig(struct dtsec_cfg * cfg)61852ba100SJustin Hibbits void fman_dtsec_defconfig(struct dtsec_cfg *cfg)
62852ba100SJustin Hibbits {
63852ba100SJustin Hibbits 	cfg->halfdup_on = DEFAULT_HALFDUP_ON;
64852ba100SJustin Hibbits 	cfg->halfdup_retransmit = DEFAULT_HALFDUP_RETRANSMIT;
65852ba100SJustin Hibbits 	cfg->halfdup_coll_window = DEFAULT_HALFDUP_COLL_WINDOW;
66852ba100SJustin Hibbits 	cfg->halfdup_excess_defer = DEFAULT_HALFDUP_EXCESS_DEFER;
67852ba100SJustin Hibbits 	cfg->halfdup_no_backoff = DEFAULT_HALFDUP_NO_BACKOFF;
68852ba100SJustin Hibbits 	cfg->halfdup_bp_no_backoff = DEFAULT_HALFDUP_BP_NO_BACKOFF;
69852ba100SJustin Hibbits 	cfg->halfdup_alt_backoff_val = DEFAULT_HALFDUP_ALT_BACKOFF_VAL;
70852ba100SJustin Hibbits 	cfg->halfdup_alt_backoff_en = DEFAULT_HALFDUP_ALT_BACKOFF_EN;
71852ba100SJustin Hibbits 	cfg->rx_drop_bcast = DEFAULT_RX_DROP_BCAST;
72852ba100SJustin Hibbits 	cfg->rx_short_frm = DEFAULT_RX_SHORT_FRM;
73852ba100SJustin Hibbits 	cfg->rx_len_check = DEFAULT_RX_LEN_CHECK;
74852ba100SJustin Hibbits 	cfg->tx_pad_crc = DEFAULT_TX_PAD_CRC;
75852ba100SJustin Hibbits 	cfg->tx_crc = DEFAULT_TX_CRC;
76852ba100SJustin Hibbits 	cfg->rx_ctrl_acc = DEFAULT_RX_CTRL_ACC;
77852ba100SJustin Hibbits 	cfg->tx_pause_time = DEFAULT_TX_PAUSE_TIME;
78852ba100SJustin Hibbits 	cfg->tbipa = DEFAULT_TBIPA; /* PHY address 0 is reserved (DPAA RM)*/
79852ba100SJustin Hibbits 	cfg->rx_prepend = DEFAULT_RX_PREPEND;
80852ba100SJustin Hibbits 	cfg->ptp_tsu_en = DEFAULT_PTP_TSU_EN;
81852ba100SJustin Hibbits 	cfg->ptp_exception_en = DEFAULT_PTP_EXCEPTION_EN;
82852ba100SJustin Hibbits 	cfg->preamble_len = DEFAULT_PREAMBLE_LEN;
83852ba100SJustin Hibbits 	cfg->rx_preamble = DEFAULT_RX_PREAMBLE;
84852ba100SJustin Hibbits 	cfg->tx_preamble = DEFAULT_TX_PREAMBLE;
85852ba100SJustin Hibbits 	cfg->loopback = DEFAULT_LOOPBACK;
86852ba100SJustin Hibbits 	cfg->rx_time_stamp_en = DEFAULT_RX_TIME_STAMP_EN;
87852ba100SJustin Hibbits 	cfg->tx_time_stamp_en = DEFAULT_TX_TIME_STAMP_EN;
88852ba100SJustin Hibbits 	cfg->rx_flow = DEFAULT_RX_FLOW;
89852ba100SJustin Hibbits 	cfg->tx_flow = DEFAULT_TX_FLOW;
90852ba100SJustin Hibbits 	cfg->rx_group_hash_exd = DEFAULT_RX_GROUP_HASH_EXD;
91852ba100SJustin Hibbits 	cfg->tx_pause_time_extd = DEFAULT_TX_PAUSE_TIME_EXTD;
92852ba100SJustin Hibbits 	cfg->rx_promisc = DEFAULT_RX_PROMISC;
93852ba100SJustin Hibbits 	cfg->non_back_to_back_ipg1 = DEFAULT_NON_BACK_TO_BACK_IPG1;
94852ba100SJustin Hibbits 	cfg->non_back_to_back_ipg2 = DEFAULT_NON_BACK_TO_BACK_IPG2;
95852ba100SJustin Hibbits 	cfg->min_ifg_enforcement = DEFAULT_MIN_IFG_ENFORCEMENT;
96852ba100SJustin Hibbits 	cfg->back_to_back_ipg = DEFAULT_BACK_TO_BACK_IPG;
97852ba100SJustin Hibbits 	cfg->maximum_frame = DEFAULT_MAXIMUM_FRAME;
98852ba100SJustin Hibbits 	cfg->tbi_phy_addr = DEFAULT_TBI_PHY_ADDR;
99852ba100SJustin Hibbits 	cfg->wake_on_lan = DEFAULT_WAKE_ON_LAN;
100852ba100SJustin Hibbits }
101852ba100SJustin Hibbits 
fman_dtsec_init(struct dtsec_regs * regs,struct dtsec_cfg * cfg,enum enet_interface iface_mode,enum enet_speed iface_speed,uint8_t * macaddr,uint8_t fm_rev_maj,uint8_t fm_rev_min,uint32_t exception_mask)102852ba100SJustin Hibbits int fman_dtsec_init(struct dtsec_regs *regs, struct dtsec_cfg *cfg,
103852ba100SJustin Hibbits 		enum enet_interface iface_mode,
104852ba100SJustin Hibbits 		enum enet_speed iface_speed,
105852ba100SJustin Hibbits 		uint8_t *macaddr,
106852ba100SJustin Hibbits 		uint8_t fm_rev_maj,
107852ba100SJustin Hibbits 		uint8_t fm_rev_min,
108852ba100SJustin Hibbits 		uint32_t exception_mask)
109852ba100SJustin Hibbits {
110852ba100SJustin Hibbits 	bool		is_rgmii = FALSE;
111852ba100SJustin Hibbits 	bool		is_sgmii = FALSE;
112852ba100SJustin Hibbits 	bool		is_qsgmii = FALSE;
113852ba100SJustin Hibbits 	int		i;
114852ba100SJustin Hibbits 	uint32_t	tmp;
115852ba100SJustin Hibbits 
116852ba100SJustin Hibbits UNUSED(fm_rev_maj);UNUSED(fm_rev_min);
117852ba100SJustin Hibbits 
118852ba100SJustin Hibbits 	/* let's start with a soft reset */
119852ba100SJustin Hibbits 	iowrite32be(MACCFG1_SOFT_RESET, &regs->maccfg1);
120852ba100SJustin Hibbits 	iowrite32be(0, &regs->maccfg1);
121852ba100SJustin Hibbits 
122852ba100SJustin Hibbits 	/*************dtsec_id2******************/
123852ba100SJustin Hibbits 	tmp =  ioread32be(&regs->tsec_id2);
124852ba100SJustin Hibbits 
125852ba100SJustin Hibbits 	/* check RGMII support */
126852ba100SJustin Hibbits 	if (iface_mode == E_ENET_IF_RGMII ||
127852ba100SJustin Hibbits 			iface_mode == E_ENET_IF_RMII)
128852ba100SJustin Hibbits 		if (tmp & DTSEC_ID2_INT_REDUCED_OFF)
129852ba100SJustin Hibbits 			return -EINVAL;
130852ba100SJustin Hibbits 
131852ba100SJustin Hibbits 	if (iface_mode == E_ENET_IF_SGMII ||
132852ba100SJustin Hibbits 			iface_mode == E_ENET_IF_MII)
133852ba100SJustin Hibbits 		if (tmp & DTSEC_ID2_INT_REDUCED_OFF)
134852ba100SJustin Hibbits 			return -EINVAL;
135852ba100SJustin Hibbits 
136852ba100SJustin Hibbits 	/***************ECNTRL************************/
137852ba100SJustin Hibbits 
138852ba100SJustin Hibbits 	is_rgmii = (bool)((iface_mode == E_ENET_IF_RGMII) ? TRUE : FALSE);
139852ba100SJustin Hibbits 	is_sgmii = (bool)((iface_mode == E_ENET_IF_SGMII) ? TRUE : FALSE);
140852ba100SJustin Hibbits 	is_qsgmii = (bool)((iface_mode == E_ENET_IF_QSGMII) ? TRUE : FALSE);
141852ba100SJustin Hibbits 
142852ba100SJustin Hibbits 	tmp = 0;
143852ba100SJustin Hibbits 	if (is_rgmii || iface_mode == E_ENET_IF_GMII)
144852ba100SJustin Hibbits 		tmp |= DTSEC_ECNTRL_GMIIM;
145852ba100SJustin Hibbits 	if (is_sgmii)
146852ba100SJustin Hibbits 		tmp |= (DTSEC_ECNTRL_SGMIIM | DTSEC_ECNTRL_TBIM);
147852ba100SJustin Hibbits 	if (is_qsgmii)
148852ba100SJustin Hibbits 		tmp |= (DTSEC_ECNTRL_SGMIIM | DTSEC_ECNTRL_TBIM |
149852ba100SJustin Hibbits 				DTSEC_ECNTRL_QSGMIIM);
150852ba100SJustin Hibbits 	if (is_rgmii)
151852ba100SJustin Hibbits 		tmp |= DTSEC_ECNTRL_RPM;
152852ba100SJustin Hibbits 	if (iface_speed == E_ENET_SPEED_100)
153852ba100SJustin Hibbits 		tmp |= DTSEC_ECNTRL_R100M;
154852ba100SJustin Hibbits 
155852ba100SJustin Hibbits 	iowrite32be(tmp, &regs->ecntrl);
156852ba100SJustin Hibbits 	/***************ECNTRL************************/
157852ba100SJustin Hibbits 
158852ba100SJustin Hibbits 	/***************TCTRL************************/
159852ba100SJustin Hibbits 	tmp = 0;
160852ba100SJustin Hibbits 	if (cfg->halfdup_on)
161852ba100SJustin Hibbits 		tmp |= DTSEC_TCTRL_THDF;
162852ba100SJustin Hibbits 	if (cfg->tx_time_stamp_en)
163852ba100SJustin Hibbits 		tmp |= DTSEC_TCTRL_TTSE;
164852ba100SJustin Hibbits 
165852ba100SJustin Hibbits 	iowrite32be(tmp, &regs->tctrl);
166852ba100SJustin Hibbits 
167852ba100SJustin Hibbits 	/***************TCTRL************************/
168852ba100SJustin Hibbits 
169852ba100SJustin Hibbits 	/***************PTV************************/
170852ba100SJustin Hibbits 	tmp = 0;
171852ba100SJustin Hibbits 
172852ba100SJustin Hibbits #ifdef FM_SHORT_PAUSE_TIME_ERRATA_DTSEC1
173852ba100SJustin Hibbits 	if ((fm_rev_maj == 1) && (fm_rev_min == 0))
174852ba100SJustin Hibbits 		cfg->tx_pause_time += 2;
175852ba100SJustin Hibbits #endif /* FM_SHORT_PAUSE_TIME_ERRATA_DTSEC1 */
176852ba100SJustin Hibbits 
177852ba100SJustin Hibbits 	if (cfg->tx_pause_time)
178852ba100SJustin Hibbits 		tmp |= cfg->tx_pause_time;
179852ba100SJustin Hibbits 	if (cfg->tx_pause_time_extd)
180852ba100SJustin Hibbits 		tmp |= cfg->tx_pause_time_extd << PTV_PTE_OFST;
181852ba100SJustin Hibbits 	iowrite32be(tmp, &regs->ptv);
182852ba100SJustin Hibbits 
183852ba100SJustin Hibbits 	/***************RCTRL************************/
184852ba100SJustin Hibbits 	tmp = 0;
185852ba100SJustin Hibbits 	tmp |= ((uint32_t)(cfg->rx_prepend & 0x0000001f)) << 16;
186852ba100SJustin Hibbits 	if (cfg->rx_ctrl_acc)
187852ba100SJustin Hibbits 		tmp |= RCTRL_CFA;
188852ba100SJustin Hibbits 	if (cfg->rx_group_hash_exd)
189852ba100SJustin Hibbits 		tmp |= RCTRL_GHTX;
190852ba100SJustin Hibbits 	if (cfg->rx_time_stamp_en)
191852ba100SJustin Hibbits 		tmp |= RCTRL_RTSE;
192852ba100SJustin Hibbits 	if (cfg->rx_drop_bcast)
193852ba100SJustin Hibbits 		tmp |= RCTRL_BC_REJ;
194852ba100SJustin Hibbits 	if (cfg->rx_short_frm)
195852ba100SJustin Hibbits 		tmp |= RCTRL_RSF;
196852ba100SJustin Hibbits 	if (cfg->rx_promisc)
197852ba100SJustin Hibbits 		tmp |= RCTRL_PROM;
198852ba100SJustin Hibbits 
199852ba100SJustin Hibbits 	iowrite32be(tmp, &regs->rctrl);
200852ba100SJustin Hibbits 	/***************RCTRL************************/
201852ba100SJustin Hibbits 
202852ba100SJustin Hibbits 	/*
203852ba100SJustin Hibbits 	 * Assign a Phy Address to the TBI (TBIPA).
204852ba100SJustin Hibbits 	 * Done also in cases where TBI is not selected to avoid conflict with
205852ba100SJustin Hibbits 	 * the external PHY's Physical address
206852ba100SJustin Hibbits 	 */
207852ba100SJustin Hibbits 	iowrite32be(cfg->tbipa, &regs->tbipa);
208852ba100SJustin Hibbits 
209852ba100SJustin Hibbits 	/***************TMR_CTL************************/
210852ba100SJustin Hibbits 	iowrite32be(0, &regs->tmr_ctrl);
211852ba100SJustin Hibbits 
212852ba100SJustin Hibbits 	if (cfg->ptp_tsu_en) {
213852ba100SJustin Hibbits 		tmp = 0;
214852ba100SJustin Hibbits 		tmp |= TMR_PEVENT_TSRE;
215852ba100SJustin Hibbits 		iowrite32be(tmp, &regs->tmr_pevent);
216852ba100SJustin Hibbits 
217852ba100SJustin Hibbits 		if (cfg->ptp_exception_en) {
218852ba100SJustin Hibbits 			tmp = 0;
219852ba100SJustin Hibbits 			tmp |= TMR_PEMASK_TSREEN;
220852ba100SJustin Hibbits 			iowrite32be(tmp, &regs->tmr_pemask);
221852ba100SJustin Hibbits 		}
222852ba100SJustin Hibbits 	}
223852ba100SJustin Hibbits 
224852ba100SJustin Hibbits 	/***************MACCFG1***********************/
225852ba100SJustin Hibbits 	tmp = 0;
226852ba100SJustin Hibbits 	if (cfg->loopback)
227852ba100SJustin Hibbits 		tmp |= MACCFG1_LOOPBACK;
228852ba100SJustin Hibbits 	if (cfg->rx_flow)
229852ba100SJustin Hibbits 		tmp |= MACCFG1_RX_FLOW;
230852ba100SJustin Hibbits 	if (cfg->tx_flow)
231852ba100SJustin Hibbits 		tmp |= MACCFG1_TX_FLOW;
232852ba100SJustin Hibbits 	iowrite32be(tmp, &regs->maccfg1);
233852ba100SJustin Hibbits 
234852ba100SJustin Hibbits 	/***************MACCFG1***********************/
235852ba100SJustin Hibbits 
236852ba100SJustin Hibbits 	/***************MACCFG2***********************/
237852ba100SJustin Hibbits 	tmp = 0;
238852ba100SJustin Hibbits 
239852ba100SJustin Hibbits 	if (iface_speed < E_ENET_SPEED_1000)
240852ba100SJustin Hibbits 		tmp |= MACCFG2_NIBBLE_MODE;
241852ba100SJustin Hibbits 	else if (iface_speed == E_ENET_SPEED_1000)
242852ba100SJustin Hibbits 		tmp |= MACCFG2_BYTE_MODE;
243852ba100SJustin Hibbits 
244852ba100SJustin Hibbits 	tmp |= ((uint32_t) cfg->preamble_len & 0x0000000f)
245852ba100SJustin Hibbits 		<< PREAMBLE_LENGTH_SHIFT;
246852ba100SJustin Hibbits 
247852ba100SJustin Hibbits 	if (cfg->rx_preamble)
248852ba100SJustin Hibbits 		tmp |= MACCFG2_PRE_AM_Rx_EN;
249852ba100SJustin Hibbits 	if (cfg->tx_preamble)
250852ba100SJustin Hibbits 		tmp |= MACCFG2_PRE_AM_Tx_EN;
251852ba100SJustin Hibbits 	if (cfg->rx_len_check)
252852ba100SJustin Hibbits 		tmp |= MACCFG2_LENGTH_CHECK;
253852ba100SJustin Hibbits 	if (cfg->tx_pad_crc)
254852ba100SJustin Hibbits 		tmp |= MACCFG2_PAD_CRC_EN;
255852ba100SJustin Hibbits 	if (cfg->tx_crc)
256852ba100SJustin Hibbits 		tmp |= MACCFG2_CRC_EN;
257852ba100SJustin Hibbits 	if (!cfg->halfdup_on)
258852ba100SJustin Hibbits 		tmp |= MACCFG2_FULL_DUPLEX;
259852ba100SJustin Hibbits 	iowrite32be(tmp, &regs->maccfg2);
260852ba100SJustin Hibbits 
261852ba100SJustin Hibbits 	/***************MACCFG2***********************/
262852ba100SJustin Hibbits 
263852ba100SJustin Hibbits 	/***************IPGIFG************************/
264852ba100SJustin Hibbits 	tmp = (((cfg->non_back_to_back_ipg1 <<
265852ba100SJustin Hibbits 		IPGIFG_NON_BACK_TO_BACK_IPG_1_SHIFT)
266852ba100SJustin Hibbits 		& IPGIFG_NON_BACK_TO_BACK_IPG_1)
267852ba100SJustin Hibbits 		| ((cfg->non_back_to_back_ipg2 <<
268852ba100SJustin Hibbits 		IPGIFG_NON_BACK_TO_BACK_IPG_2_SHIFT)
269852ba100SJustin Hibbits 		& IPGIFG_NON_BACK_TO_BACK_IPG_2)
270852ba100SJustin Hibbits 		| ((cfg->min_ifg_enforcement <<
271852ba100SJustin Hibbits 		IPGIFG_MIN_IFG_ENFORCEMENT_SHIFT)
272852ba100SJustin Hibbits 		& IPGIFG_MIN_IFG_ENFORCEMENT)
273852ba100SJustin Hibbits 		| (cfg->back_to_back_ipg & IPGIFG_BACK_TO_BACK_IPG));
274852ba100SJustin Hibbits 	iowrite32be(tmp, &regs->ipgifg);
275852ba100SJustin Hibbits 
276852ba100SJustin Hibbits 	/***************IPGIFG************************/
277852ba100SJustin Hibbits 
278852ba100SJustin Hibbits 	/***************HAFDUP************************/
279852ba100SJustin Hibbits 	tmp = 0;
280852ba100SJustin Hibbits 
281852ba100SJustin Hibbits 	if (cfg->halfdup_alt_backoff_en)
282852ba100SJustin Hibbits 		tmp = (uint32_t)(HAFDUP_ALT_BEB |
283852ba100SJustin Hibbits 				((cfg->halfdup_alt_backoff_val & 0x0000000f)
284852ba100SJustin Hibbits 				 << HAFDUP_ALTERNATE_BEB_TRUNCATION_SHIFT));
285852ba100SJustin Hibbits 	if (cfg->halfdup_bp_no_backoff)
286852ba100SJustin Hibbits 		tmp |= HAFDUP_BP_NO_BACKOFF;
287852ba100SJustin Hibbits 	if (cfg->halfdup_no_backoff)
288852ba100SJustin Hibbits 		tmp |= HAFDUP_NO_BACKOFF;
289852ba100SJustin Hibbits 	if (cfg->halfdup_excess_defer)
290852ba100SJustin Hibbits 		tmp |= HAFDUP_EXCESS_DEFER;
291852ba100SJustin Hibbits 	tmp |= ((cfg->halfdup_retransmit << HAFDUP_RETRANSMISSION_MAX_SHIFT)
292852ba100SJustin Hibbits 		& HAFDUP_RETRANSMISSION_MAX);
293852ba100SJustin Hibbits 	tmp |= (cfg->halfdup_coll_window & HAFDUP_COLLISION_WINDOW);
294852ba100SJustin Hibbits 
295852ba100SJustin Hibbits 	iowrite32be(tmp, &regs->hafdup);
296852ba100SJustin Hibbits 	/***************HAFDUP************************/
297852ba100SJustin Hibbits 
298852ba100SJustin Hibbits 	/***************MAXFRM************************/
299852ba100SJustin Hibbits 	/* Initialize MAXFRM */
300852ba100SJustin Hibbits 	iowrite32be(cfg->maximum_frame, &regs->maxfrm);
301852ba100SJustin Hibbits 
302852ba100SJustin Hibbits 	/***************MAXFRM************************/
303852ba100SJustin Hibbits 
304852ba100SJustin Hibbits 	/***************CAM1************************/
305852ba100SJustin Hibbits 	iowrite32be(0xffffffff, &regs->cam1);
306852ba100SJustin Hibbits 	iowrite32be(0xffffffff, &regs->cam2);
307852ba100SJustin Hibbits 
308852ba100SJustin Hibbits 	/***************IMASK************************/
309852ba100SJustin Hibbits 	iowrite32be(exception_mask, &regs->imask);
310852ba100SJustin Hibbits 	/***************IMASK************************/
311852ba100SJustin Hibbits 
312852ba100SJustin Hibbits 	/***************IEVENT************************/
313852ba100SJustin Hibbits 	iowrite32be(0xffffffff, &regs->ievent);
314852ba100SJustin Hibbits 
315852ba100SJustin Hibbits 	/***************MACSTNADDR1/2*****************/
316852ba100SJustin Hibbits 
317852ba100SJustin Hibbits 	tmp = (uint32_t)((macaddr[5] << 24) |
318852ba100SJustin Hibbits 			 (macaddr[4] << 16) |
319852ba100SJustin Hibbits 			 (macaddr[3] << 8) |
320852ba100SJustin Hibbits 			  macaddr[2]);
321852ba100SJustin Hibbits 	iowrite32be(tmp, &regs->macstnaddr1);
322852ba100SJustin Hibbits 
323852ba100SJustin Hibbits 	tmp = (uint32_t)((macaddr[1] << 24) |
324852ba100SJustin Hibbits 			 (macaddr[0] << 16));
325852ba100SJustin Hibbits 	iowrite32be(tmp, &regs->macstnaddr2);
326852ba100SJustin Hibbits 
327852ba100SJustin Hibbits 	/***************MACSTNADDR1/2*****************/
328852ba100SJustin Hibbits 
329852ba100SJustin Hibbits 	/*****************HASH************************/
330852ba100SJustin Hibbits 	for (i = 0; i < NUM_OF_HASH_REGS ; i++) {
331852ba100SJustin Hibbits 		/* Initialize IADDRx */
332852ba100SJustin Hibbits 		iowrite32be(0, &regs->igaddr[i]);
333852ba100SJustin Hibbits 		/* Initialize GADDRx */
334852ba100SJustin Hibbits 		iowrite32be(0, &regs->gaddr[i]);
335852ba100SJustin Hibbits 	}
336852ba100SJustin Hibbits 
337852ba100SJustin Hibbits 	fman_dtsec_reset_stat(regs);
338852ba100SJustin Hibbits 
339852ba100SJustin Hibbits 	return 0;
340852ba100SJustin Hibbits }
341852ba100SJustin Hibbits 
fman_dtsec_get_max_frame_len(struct dtsec_regs * regs)342852ba100SJustin Hibbits uint16_t fman_dtsec_get_max_frame_len(struct dtsec_regs *regs)
343852ba100SJustin Hibbits {
344852ba100SJustin Hibbits 	return (uint16_t)ioread32be(&regs->maxfrm);
345852ba100SJustin Hibbits }
346852ba100SJustin Hibbits 
fman_dtsec_set_max_frame_len(struct dtsec_regs * regs,uint16_t length)347852ba100SJustin Hibbits void fman_dtsec_set_max_frame_len(struct dtsec_regs *regs, uint16_t length)
348852ba100SJustin Hibbits {
349852ba100SJustin Hibbits 	iowrite32be(length, &regs->maxfrm);
350852ba100SJustin Hibbits }
351852ba100SJustin Hibbits 
fman_dtsec_set_mac_address(struct dtsec_regs * regs,uint8_t * adr)352852ba100SJustin Hibbits void fman_dtsec_set_mac_address(struct dtsec_regs *regs, uint8_t *adr)
353852ba100SJustin Hibbits {
354852ba100SJustin Hibbits 	uint32_t tmp;
355852ba100SJustin Hibbits 
356852ba100SJustin Hibbits 	tmp = (uint32_t)((adr[5] << 24) |
357852ba100SJustin Hibbits 			 (adr[4] << 16) |
358852ba100SJustin Hibbits 			 (adr[3] << 8) |
359852ba100SJustin Hibbits 			  adr[2]);
360852ba100SJustin Hibbits 	iowrite32be(tmp, &regs->macstnaddr1);
361852ba100SJustin Hibbits 
362852ba100SJustin Hibbits 	tmp = (uint32_t)((adr[1] << 24) |
363852ba100SJustin Hibbits 			 (adr[0] << 16));
364852ba100SJustin Hibbits 	iowrite32be(tmp, &regs->macstnaddr2);
365852ba100SJustin Hibbits }
366852ba100SJustin Hibbits 
fman_dtsec_get_mac_address(struct dtsec_regs * regs,uint8_t * macaddr)367852ba100SJustin Hibbits void fman_dtsec_get_mac_address(struct dtsec_regs *regs, uint8_t *macaddr)
368852ba100SJustin Hibbits {
369852ba100SJustin Hibbits 	uint32_t tmp1, tmp2;
370852ba100SJustin Hibbits 
371852ba100SJustin Hibbits 	tmp1 = ioread32be(&regs->macstnaddr1);
372852ba100SJustin Hibbits 	tmp2 = ioread32be(&regs->macstnaddr2);
373852ba100SJustin Hibbits 
374852ba100SJustin Hibbits 	macaddr[0] = (uint8_t)((tmp2 & 0x00ff0000) >> 16);
375852ba100SJustin Hibbits 	macaddr[1] = (uint8_t)((tmp2 & 0xff000000) >> 24);
376852ba100SJustin Hibbits 	macaddr[2] = (uint8_t)(tmp1 & 0x000000ff);
377852ba100SJustin Hibbits 	macaddr[3] = (uint8_t)((tmp1 & 0x0000ff00) >> 8);
378852ba100SJustin Hibbits 	macaddr[4] = (uint8_t)((tmp1 & 0x00ff0000) >> 16);
379852ba100SJustin Hibbits 	macaddr[5] = (uint8_t)((tmp1 & 0xff000000) >> 24);
380852ba100SJustin Hibbits }
381852ba100SJustin Hibbits 
fman_dtsec_set_hash_table(struct dtsec_regs * regs,uint32_t crc,bool mcast,bool ghtx)382852ba100SJustin Hibbits void fman_dtsec_set_hash_table(struct dtsec_regs *regs, uint32_t crc, bool mcast, bool ghtx)
383852ba100SJustin Hibbits {
384852ba100SJustin Hibbits     int32_t bucket;
385852ba100SJustin Hibbits     if (ghtx)
386852ba100SJustin Hibbits         bucket = (int32_t)((crc >> 23) & 0x1ff);
387852ba100SJustin Hibbits     else {
388852ba100SJustin Hibbits         bucket = (int32_t)((crc >> 24) & 0xff);
389852ba100SJustin Hibbits         /* if !ghtx and mcast the bit must be set in gaddr instead of igaddr. */
390852ba100SJustin Hibbits         if (mcast)
391852ba100SJustin Hibbits             bucket += 0x100;
392852ba100SJustin Hibbits     }
393852ba100SJustin Hibbits     fman_dtsec_set_bucket(regs, bucket, TRUE);
394852ba100SJustin Hibbits }
395852ba100SJustin Hibbits 
fman_dtsec_set_bucket(struct dtsec_regs * regs,int bucket,bool enable)396852ba100SJustin Hibbits void fman_dtsec_set_bucket(struct dtsec_regs *regs, int bucket, bool enable)
397852ba100SJustin Hibbits {
398852ba100SJustin Hibbits 	int reg_idx = (bucket >> 5) & 0xf;
399852ba100SJustin Hibbits 	int bit_idx = bucket & 0x1f;
400852ba100SJustin Hibbits 	uint32_t bit_mask = 0x80000000 >> bit_idx;
401852ba100SJustin Hibbits 	uint32_t *reg;
402852ba100SJustin Hibbits 
403852ba100SJustin Hibbits 	if (reg_idx > 7)
404852ba100SJustin Hibbits 		reg = &regs->gaddr[reg_idx-8];
405852ba100SJustin Hibbits 	else
406852ba100SJustin Hibbits 		reg = &regs->igaddr[reg_idx];
407852ba100SJustin Hibbits 
408852ba100SJustin Hibbits 	if (enable)
409852ba100SJustin Hibbits 		iowrite32be(ioread32be(reg) | bit_mask, reg);
410852ba100SJustin Hibbits 	else
411852ba100SJustin Hibbits 		iowrite32be(ioread32be(reg) & (~bit_mask), reg);
412852ba100SJustin Hibbits }
413852ba100SJustin Hibbits 
fman_dtsec_reset_filter_table(struct dtsec_regs * regs,bool mcast,bool ucast)414852ba100SJustin Hibbits void fman_dtsec_reset_filter_table(struct dtsec_regs *regs, bool mcast, bool ucast)
415852ba100SJustin Hibbits {
416852ba100SJustin Hibbits 	int		i;
417852ba100SJustin Hibbits 	bool	ghtx;
418852ba100SJustin Hibbits 
419852ba100SJustin Hibbits 	ghtx = (bool)((ioread32be(&regs->rctrl) & RCTRL_GHTX) ? TRUE : FALSE);
420852ba100SJustin Hibbits 
421852ba100SJustin Hibbits 	if (ucast || (ghtx && mcast)) {
422852ba100SJustin Hibbits 		for (i = 0; i < NUM_OF_HASH_REGS; i++)
423852ba100SJustin Hibbits 			iowrite32be(0, &regs->igaddr[i]);
424852ba100SJustin Hibbits 	}
425852ba100SJustin Hibbits 	if (mcast) {
426852ba100SJustin Hibbits 		for (i = 0; i < NUM_OF_HASH_REGS; i++)
427852ba100SJustin Hibbits 			iowrite32be(0, &regs->gaddr[i]);
428852ba100SJustin Hibbits 	}
429852ba100SJustin Hibbits }
430852ba100SJustin Hibbits 
fman_dtsec_set_tbi_phy_addr(struct dtsec_regs * regs,uint8_t addr)431852ba100SJustin Hibbits int fman_dtsec_set_tbi_phy_addr(struct dtsec_regs *regs,
432852ba100SJustin Hibbits 		uint8_t addr)
433852ba100SJustin Hibbits {
434852ba100SJustin Hibbits 	if (addr > 0 && addr < 32)
435852ba100SJustin Hibbits 		iowrite32be(addr, &regs->tbipa);
436852ba100SJustin Hibbits 	else
437852ba100SJustin Hibbits 		return -EINVAL;
438852ba100SJustin Hibbits 
439852ba100SJustin Hibbits 	return 0;
440852ba100SJustin Hibbits }
441852ba100SJustin Hibbits 
fman_dtsec_set_wol(struct dtsec_regs * regs,bool en)442852ba100SJustin Hibbits void fman_dtsec_set_wol(struct dtsec_regs *regs, bool en)
443852ba100SJustin Hibbits {
444852ba100SJustin Hibbits 	uint32_t tmp;
445852ba100SJustin Hibbits 
446852ba100SJustin Hibbits 	tmp = ioread32be(&regs->maccfg2);
447852ba100SJustin Hibbits 	if (en)
448852ba100SJustin Hibbits 		tmp |= MACCFG2_MAGIC_PACKET_EN;
449852ba100SJustin Hibbits 	else
450852ba100SJustin Hibbits 		tmp &= ~MACCFG2_MAGIC_PACKET_EN;
451852ba100SJustin Hibbits 	iowrite32be(tmp, &regs->maccfg2);
452852ba100SJustin Hibbits }
453852ba100SJustin Hibbits 
fman_dtsec_adjust_link(struct dtsec_regs * regs,enum enet_interface iface_mode,enum enet_speed speed,bool full_dx)454852ba100SJustin Hibbits int fman_dtsec_adjust_link(struct dtsec_regs *regs,
455852ba100SJustin Hibbits 		enum enet_interface iface_mode,
456852ba100SJustin Hibbits 		enum enet_speed speed, bool full_dx)
457852ba100SJustin Hibbits {
458852ba100SJustin Hibbits 	uint32_t		tmp;
459852ba100SJustin Hibbits 
460852ba100SJustin Hibbits 	UNUSED(iface_mode);
461852ba100SJustin Hibbits 
462852ba100SJustin Hibbits 	if ((speed == E_ENET_SPEED_1000) && !full_dx)
463852ba100SJustin Hibbits 		return -EINVAL;
464852ba100SJustin Hibbits 
465852ba100SJustin Hibbits 	tmp = ioread32be(&regs->maccfg2);
466852ba100SJustin Hibbits 	if (!full_dx)
467852ba100SJustin Hibbits 		tmp &= ~MACCFG2_FULL_DUPLEX;
468852ba100SJustin Hibbits 	else
469852ba100SJustin Hibbits 		tmp |= MACCFG2_FULL_DUPLEX;
470852ba100SJustin Hibbits 
471852ba100SJustin Hibbits 	tmp &= ~(MACCFG2_NIBBLE_MODE | MACCFG2_BYTE_MODE);
472852ba100SJustin Hibbits 	if (speed < E_ENET_SPEED_1000)
473852ba100SJustin Hibbits 		tmp |= MACCFG2_NIBBLE_MODE;
474852ba100SJustin Hibbits 	else if (speed == E_ENET_SPEED_1000)
475852ba100SJustin Hibbits 		tmp |= MACCFG2_BYTE_MODE;
476852ba100SJustin Hibbits 	iowrite32be(tmp, &regs->maccfg2);
477852ba100SJustin Hibbits 
478852ba100SJustin Hibbits 	tmp = ioread32be(&regs->ecntrl);
479852ba100SJustin Hibbits 	if (speed == E_ENET_SPEED_100)
480852ba100SJustin Hibbits 		tmp |= DTSEC_ECNTRL_R100M;
481852ba100SJustin Hibbits 	else
482852ba100SJustin Hibbits 		tmp &= ~DTSEC_ECNTRL_R100M;
483852ba100SJustin Hibbits 	iowrite32be(tmp, &regs->ecntrl);
484852ba100SJustin Hibbits 
485852ba100SJustin Hibbits 	return 0;
486852ba100SJustin Hibbits }
487852ba100SJustin Hibbits 
fman_dtsec_set_uc_promisc(struct dtsec_regs * regs,bool enable)488852ba100SJustin Hibbits void fman_dtsec_set_uc_promisc(struct dtsec_regs *regs, bool enable)
489852ba100SJustin Hibbits {
490852ba100SJustin Hibbits 	uint32_t		tmp;
491852ba100SJustin Hibbits 
492852ba100SJustin Hibbits 	tmp = ioread32be(&regs->rctrl);
493852ba100SJustin Hibbits 
494852ba100SJustin Hibbits 	if (enable)
495852ba100SJustin Hibbits 		tmp |= RCTRL_UPROM;
496852ba100SJustin Hibbits 	else
497852ba100SJustin Hibbits 		tmp &= ~RCTRL_UPROM;
498852ba100SJustin Hibbits 
499852ba100SJustin Hibbits 	iowrite32be(tmp, &regs->rctrl);
500852ba100SJustin Hibbits }
501852ba100SJustin Hibbits 
fman_dtsec_set_mc_promisc(struct dtsec_regs * regs,bool enable)502852ba100SJustin Hibbits void fman_dtsec_set_mc_promisc(struct dtsec_regs *regs, bool enable)
503852ba100SJustin Hibbits {
504852ba100SJustin Hibbits 	uint32_t		tmp;
505852ba100SJustin Hibbits 
506852ba100SJustin Hibbits 	tmp = ioread32be(&regs->rctrl);
507852ba100SJustin Hibbits 
508852ba100SJustin Hibbits 	if (enable)
509852ba100SJustin Hibbits 		tmp |= RCTRL_MPROM;
510852ba100SJustin Hibbits 	else
511852ba100SJustin Hibbits 		tmp &= ~RCTRL_MPROM;
512852ba100SJustin Hibbits 
513852ba100SJustin Hibbits 	iowrite32be(tmp, &regs->rctrl);
514852ba100SJustin Hibbits }
515852ba100SJustin Hibbits 
fman_dtsec_get_clear_carry_regs(struct dtsec_regs * regs,uint32_t * car1,uint32_t * car2)516852ba100SJustin Hibbits bool fman_dtsec_get_clear_carry_regs(struct dtsec_regs *regs,
517852ba100SJustin Hibbits 				uint32_t *car1, uint32_t *car2)
518852ba100SJustin Hibbits {
519852ba100SJustin Hibbits 	/* read carry registers */
520852ba100SJustin Hibbits 	*car1 = ioread32be(&regs->car1);
521852ba100SJustin Hibbits 	*car2 = ioread32be(&regs->car2);
522852ba100SJustin Hibbits 	/* clear carry registers */
523852ba100SJustin Hibbits 	if (*car1)
524852ba100SJustin Hibbits 		iowrite32be(*car1, &regs->car1);
525852ba100SJustin Hibbits 	if (*car2)
526852ba100SJustin Hibbits 		iowrite32be(*car2, &regs->car2);
527852ba100SJustin Hibbits 
528852ba100SJustin Hibbits 	return (bool)((*car1 | *car2) ? TRUE : FALSE);
529852ba100SJustin Hibbits }
530852ba100SJustin Hibbits 
fman_dtsec_reset_stat(struct dtsec_regs * regs)531852ba100SJustin Hibbits void fman_dtsec_reset_stat(struct dtsec_regs *regs)
532852ba100SJustin Hibbits {
533852ba100SJustin Hibbits 	/* clear HW counters */
534852ba100SJustin Hibbits 	iowrite32be(ioread32be(&regs->ecntrl) |
535852ba100SJustin Hibbits 			DTSEC_ECNTRL_CLRCNT, &regs->ecntrl);
536852ba100SJustin Hibbits }
537852ba100SJustin Hibbits 
fman_dtsec_set_stat_level(struct dtsec_regs * regs,enum dtsec_stat_level level)538852ba100SJustin Hibbits int fman_dtsec_set_stat_level(struct dtsec_regs *regs, enum dtsec_stat_level level)
539852ba100SJustin Hibbits {
540852ba100SJustin Hibbits 	switch (level) {
541852ba100SJustin Hibbits 	case E_MAC_STAT_NONE:
542852ba100SJustin Hibbits 		iowrite32be(0xffffffff, &regs->cam1);
543852ba100SJustin Hibbits 		iowrite32be(0xffffffff, &regs->cam2);
544852ba100SJustin Hibbits 		iowrite32be(ioread32be(&regs->ecntrl) & ~DTSEC_ECNTRL_STEN,
545852ba100SJustin Hibbits 				&regs->ecntrl);
546852ba100SJustin Hibbits 		iowrite32be(ioread32be(&regs->imask) & ~DTSEC_IMASK_MSROEN,
547852ba100SJustin Hibbits 				&regs->imask);
548852ba100SJustin Hibbits 		break;
549852ba100SJustin Hibbits 	case E_MAC_STAT_PARTIAL:
550852ba100SJustin Hibbits 		iowrite32be(CAM1_ERRORS_ONLY, &regs->cam1);
551852ba100SJustin Hibbits 		iowrite32be(CAM2_ERRORS_ONLY, &regs->cam2);
552852ba100SJustin Hibbits 		iowrite32be(ioread32be(&regs->ecntrl) | DTSEC_ECNTRL_STEN,
553852ba100SJustin Hibbits 				&regs->ecntrl);
554852ba100SJustin Hibbits 		iowrite32be(ioread32be(&regs->imask) | DTSEC_IMASK_MSROEN,
555852ba100SJustin Hibbits 				&regs->imask);
556852ba100SJustin Hibbits 		break;
557852ba100SJustin Hibbits 	case E_MAC_STAT_MIB_GRP1:
558852ba100SJustin Hibbits 		iowrite32be((uint32_t)~CAM1_MIB_GRP_1, &regs->cam1);
559852ba100SJustin Hibbits 		iowrite32be((uint32_t)~CAM2_MIB_GRP_1, &regs->cam2);
560852ba100SJustin Hibbits 		iowrite32be(ioread32be(&regs->ecntrl) | DTSEC_ECNTRL_STEN,
561852ba100SJustin Hibbits 				&regs->ecntrl);
562852ba100SJustin Hibbits 		iowrite32be(ioread32be(&regs->imask) | DTSEC_IMASK_MSROEN,
563852ba100SJustin Hibbits 				&regs->imask);
564852ba100SJustin Hibbits 		break;
565852ba100SJustin Hibbits 	case E_MAC_STAT_FULL:
566852ba100SJustin Hibbits 		iowrite32be(0, &regs->cam1);
567852ba100SJustin Hibbits 		iowrite32be(0, &regs->cam2);
568852ba100SJustin Hibbits 		iowrite32be(ioread32be(&regs->ecntrl) | DTSEC_ECNTRL_STEN,
569852ba100SJustin Hibbits 				&regs->ecntrl);
570852ba100SJustin Hibbits 		iowrite32be(ioread32be(&regs->imask) | DTSEC_IMASK_MSROEN,
571852ba100SJustin Hibbits 				&regs->imask);
572852ba100SJustin Hibbits 		break;
573852ba100SJustin Hibbits 	default:
574852ba100SJustin Hibbits 		return -EINVAL;
575852ba100SJustin Hibbits 	}
576852ba100SJustin Hibbits 
577852ba100SJustin Hibbits 	return 0;
578852ba100SJustin Hibbits }
579852ba100SJustin Hibbits 
fman_dtsec_set_ts(struct dtsec_regs * regs,bool en)580852ba100SJustin Hibbits void fman_dtsec_set_ts(struct dtsec_regs *regs, bool en)
581852ba100SJustin Hibbits {
582852ba100SJustin Hibbits 	if (en) {
583852ba100SJustin Hibbits 		iowrite32be(ioread32be(&regs->rctrl) | RCTRL_RTSE,
584852ba100SJustin Hibbits 				&regs->rctrl);
585852ba100SJustin Hibbits 		iowrite32be(ioread32be(&regs->tctrl) | DTSEC_TCTRL_TTSE,
586852ba100SJustin Hibbits 				&regs->tctrl);
587852ba100SJustin Hibbits 	} else {
588852ba100SJustin Hibbits 		iowrite32be(ioread32be(&regs->rctrl) & ~RCTRL_RTSE,
589852ba100SJustin Hibbits 				&regs->rctrl);
590852ba100SJustin Hibbits 		iowrite32be(ioread32be(&regs->tctrl) & ~DTSEC_TCTRL_TTSE,
591852ba100SJustin Hibbits 				&regs->tctrl);
592852ba100SJustin Hibbits 	}
593852ba100SJustin Hibbits }
594852ba100SJustin Hibbits 
fman_dtsec_enable(struct dtsec_regs * regs,bool apply_rx,bool apply_tx)595852ba100SJustin Hibbits void fman_dtsec_enable(struct dtsec_regs *regs, bool apply_rx, bool apply_tx)
596852ba100SJustin Hibbits {
597852ba100SJustin Hibbits 	uint32_t tmp;
598852ba100SJustin Hibbits 
599852ba100SJustin Hibbits 	tmp = ioread32be(&regs->maccfg1);
600852ba100SJustin Hibbits 
601852ba100SJustin Hibbits 	if (apply_rx)
602852ba100SJustin Hibbits 		tmp |= MACCFG1_RX_EN ;
603852ba100SJustin Hibbits 
604852ba100SJustin Hibbits 	if (apply_tx)
605852ba100SJustin Hibbits 		tmp |= MACCFG1_TX_EN ;
606852ba100SJustin Hibbits 
607852ba100SJustin Hibbits 	iowrite32be(tmp, &regs->maccfg1);
608852ba100SJustin Hibbits }
609852ba100SJustin Hibbits 
fman_dtsec_clear_addr_in_paddr(struct dtsec_regs * regs,uint8_t paddr_num)610852ba100SJustin Hibbits void fman_dtsec_clear_addr_in_paddr(struct dtsec_regs *regs, uint8_t paddr_num)
611852ba100SJustin Hibbits {
612852ba100SJustin Hibbits     iowrite32be(0, &regs->macaddr[paddr_num].exact_match1);
613852ba100SJustin Hibbits     iowrite32be(0, &regs->macaddr[paddr_num].exact_match2);
614852ba100SJustin Hibbits }
615852ba100SJustin Hibbits 
fman_dtsec_add_addr_in_paddr(struct dtsec_regs * regs,uint64_t addr,uint8_t paddr_num)616852ba100SJustin Hibbits void fman_dtsec_add_addr_in_paddr(struct dtsec_regs *regs,
617852ba100SJustin Hibbits 				uint64_t addr,
618852ba100SJustin Hibbits 				uint8_t paddr_num)
619852ba100SJustin Hibbits {
620852ba100SJustin Hibbits 	uint32_t tmp;
621852ba100SJustin Hibbits 
622852ba100SJustin Hibbits 	tmp = (uint32_t)(addr);
623852ba100SJustin Hibbits 	/* swap */
624852ba100SJustin Hibbits 	tmp = (((tmp & 0x000000FF) << 24) |
625852ba100SJustin Hibbits 		((tmp & 0x0000FF00) <<  8) |
626852ba100SJustin Hibbits 		((tmp & 0x00FF0000) >>  8) |
627852ba100SJustin Hibbits 		((tmp & 0xFF000000) >> 24));
628852ba100SJustin Hibbits 	iowrite32be(tmp, &regs->macaddr[paddr_num].exact_match1);
629852ba100SJustin Hibbits 
630852ba100SJustin Hibbits 	tmp = (uint32_t)(addr>>32);
631852ba100SJustin Hibbits 	/* swap */
632852ba100SJustin Hibbits 	tmp = (((tmp & 0x000000FF) << 24) |
633852ba100SJustin Hibbits 		((tmp & 0x0000FF00) <<  8) |
634852ba100SJustin Hibbits 		((tmp & 0x00FF0000) >>  8) |
635852ba100SJustin Hibbits 		((tmp & 0xFF000000) >> 24));
636852ba100SJustin Hibbits 	iowrite32be(tmp, &regs->macaddr[paddr_num].exact_match2);
637852ba100SJustin Hibbits }
638852ba100SJustin Hibbits 
fman_dtsec_disable(struct dtsec_regs * regs,bool apply_rx,bool apply_tx)639852ba100SJustin Hibbits void fman_dtsec_disable(struct dtsec_regs *regs, bool apply_rx, bool apply_tx)
640852ba100SJustin Hibbits {
641852ba100SJustin Hibbits 	uint32_t tmp;
642852ba100SJustin Hibbits 
643852ba100SJustin Hibbits 	tmp = ioread32be(&regs->maccfg1);
644852ba100SJustin Hibbits 
645852ba100SJustin Hibbits 	if (apply_rx)
646852ba100SJustin Hibbits 		tmp &= ~MACCFG1_RX_EN;
647852ba100SJustin Hibbits 
648852ba100SJustin Hibbits 	if (apply_tx)
649852ba100SJustin Hibbits 		tmp &= ~MACCFG1_TX_EN;
650852ba100SJustin Hibbits 
651852ba100SJustin Hibbits 	iowrite32be(tmp, &regs->maccfg1);
652852ba100SJustin Hibbits }
653852ba100SJustin Hibbits 
fman_dtsec_set_tx_pause_frames(struct dtsec_regs * regs,uint16_t time)654852ba100SJustin Hibbits void fman_dtsec_set_tx_pause_frames(struct dtsec_regs *regs, uint16_t time)
655852ba100SJustin Hibbits {
656852ba100SJustin Hibbits 	uint32_t ptv = 0;
657852ba100SJustin Hibbits 
658852ba100SJustin Hibbits 	/* fixme: don't enable tx pause for half-duplex */
659852ba100SJustin Hibbits 
660852ba100SJustin Hibbits 	if (time) {
661852ba100SJustin Hibbits 		ptv = ioread32be(&regs->ptv);
662852ba100SJustin Hibbits 		ptv &= 0xffff0000;
663852ba100SJustin Hibbits 		ptv |= time & 0x0000ffff;
664852ba100SJustin Hibbits 		iowrite32be(ptv, &regs->ptv);
665852ba100SJustin Hibbits 
666852ba100SJustin Hibbits 		/* trigger the transmission of a flow-control pause frame */
667852ba100SJustin Hibbits 		iowrite32be(ioread32be(&regs->maccfg1) | MACCFG1_TX_FLOW,
668852ba100SJustin Hibbits 				&regs->maccfg1);
669852ba100SJustin Hibbits 	} else
670852ba100SJustin Hibbits 		iowrite32be(ioread32be(&regs->maccfg1) & ~MACCFG1_TX_FLOW,
671852ba100SJustin Hibbits 				&regs->maccfg1);
672852ba100SJustin Hibbits }
673852ba100SJustin Hibbits 
fman_dtsec_handle_rx_pause(struct dtsec_regs * regs,bool en)674852ba100SJustin Hibbits void fman_dtsec_handle_rx_pause(struct dtsec_regs *regs, bool en)
675852ba100SJustin Hibbits {
676852ba100SJustin Hibbits 	uint32_t tmp;
677852ba100SJustin Hibbits 
678852ba100SJustin Hibbits 	/* todo: check if mac is set to full-duplex */
679852ba100SJustin Hibbits 
680852ba100SJustin Hibbits 	tmp = ioread32be(&regs->maccfg1);
681852ba100SJustin Hibbits 	if (en)
682852ba100SJustin Hibbits 		tmp |= MACCFG1_RX_FLOW;
683852ba100SJustin Hibbits 	else
684852ba100SJustin Hibbits 		tmp &= ~MACCFG1_RX_FLOW;
685852ba100SJustin Hibbits 	iowrite32be(tmp, &regs->maccfg1);
686852ba100SJustin Hibbits }
687852ba100SJustin Hibbits 
fman_dtsec_get_rctrl(struct dtsec_regs * regs)688852ba100SJustin Hibbits uint32_t fman_dtsec_get_rctrl(struct dtsec_regs *regs)
689852ba100SJustin Hibbits {
690852ba100SJustin Hibbits 	return ioread32be(&regs->rctrl);
691852ba100SJustin Hibbits }
692852ba100SJustin Hibbits 
fman_dtsec_get_revision(struct dtsec_regs * regs)693852ba100SJustin Hibbits uint32_t fman_dtsec_get_revision(struct dtsec_regs *regs)
694852ba100SJustin Hibbits {
695852ba100SJustin Hibbits 	return ioread32be(&regs->tsec_id);
696852ba100SJustin Hibbits }
697852ba100SJustin Hibbits 
fman_dtsec_get_event(struct dtsec_regs * regs,uint32_t ev_mask)698852ba100SJustin Hibbits uint32_t fman_dtsec_get_event(struct dtsec_regs *regs, uint32_t ev_mask)
699852ba100SJustin Hibbits {
700852ba100SJustin Hibbits 	return ioread32be(&regs->ievent) & ev_mask;
701852ba100SJustin Hibbits }
702852ba100SJustin Hibbits 
fman_dtsec_ack_event(struct dtsec_regs * regs,uint32_t ev_mask)703852ba100SJustin Hibbits void fman_dtsec_ack_event(struct dtsec_regs *regs, uint32_t ev_mask)
704852ba100SJustin Hibbits {
705852ba100SJustin Hibbits 	iowrite32be(ev_mask, &regs->ievent);
706852ba100SJustin Hibbits }
707852ba100SJustin Hibbits 
fman_dtsec_get_interrupt_mask(struct dtsec_regs * regs)708852ba100SJustin Hibbits uint32_t fman_dtsec_get_interrupt_mask(struct dtsec_regs *regs)
709852ba100SJustin Hibbits {
710852ba100SJustin Hibbits 	return ioread32be(&regs->imask);
711852ba100SJustin Hibbits }
712852ba100SJustin Hibbits 
fman_dtsec_check_and_clear_tmr_event(struct dtsec_regs * regs)713852ba100SJustin Hibbits uint32_t fman_dtsec_check_and_clear_tmr_event(struct dtsec_regs *regs)
714852ba100SJustin Hibbits {
715852ba100SJustin Hibbits 	uint32_t event;
716852ba100SJustin Hibbits 
717852ba100SJustin Hibbits 	event = ioread32be(&regs->tmr_pevent);
718852ba100SJustin Hibbits 	event &= ioread32be(&regs->tmr_pemask);
719852ba100SJustin Hibbits 
720852ba100SJustin Hibbits 	if (event)
721852ba100SJustin Hibbits 		iowrite32be(event, &regs->tmr_pevent);
722852ba100SJustin Hibbits 	return event;
723852ba100SJustin Hibbits }
724852ba100SJustin Hibbits 
fman_dtsec_enable_tmr_interrupt(struct dtsec_regs * regs)725852ba100SJustin Hibbits void fman_dtsec_enable_tmr_interrupt(struct dtsec_regs *regs)
726852ba100SJustin Hibbits {
727852ba100SJustin Hibbits 	iowrite32be(ioread32be(&regs->tmr_pemask) | TMR_PEMASK_TSREEN,
728852ba100SJustin Hibbits 			&regs->tmr_pemask);
729852ba100SJustin Hibbits }
730852ba100SJustin Hibbits 
fman_dtsec_disable_tmr_interrupt(struct dtsec_regs * regs)731852ba100SJustin Hibbits void fman_dtsec_disable_tmr_interrupt(struct dtsec_regs *regs)
732852ba100SJustin Hibbits {
733852ba100SJustin Hibbits 	iowrite32be(ioread32be(&regs->tmr_pemask) & ~TMR_PEMASK_TSREEN,
734852ba100SJustin Hibbits 			&regs->tmr_pemask);
735852ba100SJustin Hibbits }
736852ba100SJustin Hibbits 
fman_dtsec_enable_interrupt(struct dtsec_regs * regs,uint32_t ev_mask)737852ba100SJustin Hibbits void fman_dtsec_enable_interrupt(struct dtsec_regs *regs, uint32_t ev_mask)
738852ba100SJustin Hibbits {
739852ba100SJustin Hibbits 	iowrite32be(ioread32be(&regs->imask) | ev_mask, &regs->imask);
740852ba100SJustin Hibbits }
741852ba100SJustin Hibbits 
fman_dtsec_disable_interrupt(struct dtsec_regs * regs,uint32_t ev_mask)742852ba100SJustin Hibbits void fman_dtsec_disable_interrupt(struct dtsec_regs *regs, uint32_t ev_mask)
743852ba100SJustin Hibbits {
744852ba100SJustin Hibbits 	iowrite32be(ioread32be(&regs->imask) & ~ev_mask, &regs->imask);
745852ba100SJustin Hibbits }
746852ba100SJustin Hibbits 
fman_dtsec_get_stat_counter(struct dtsec_regs * regs,enum dtsec_stat_counters reg_name)747852ba100SJustin Hibbits uint32_t fman_dtsec_get_stat_counter(struct dtsec_regs *regs,
748852ba100SJustin Hibbits 		enum dtsec_stat_counters reg_name)
749852ba100SJustin Hibbits {
750852ba100SJustin Hibbits 	uint32_t ret_val;
751852ba100SJustin Hibbits 
752852ba100SJustin Hibbits 	switch (reg_name) {
753852ba100SJustin Hibbits 	case E_DTSEC_STAT_TR64:
754852ba100SJustin Hibbits 		ret_val = ioread32be(&regs->tr64);
755852ba100SJustin Hibbits 		break;
756852ba100SJustin Hibbits 	case E_DTSEC_STAT_TR127:
757852ba100SJustin Hibbits 		ret_val = ioread32be(&regs->tr127);
758852ba100SJustin Hibbits 		break;
759852ba100SJustin Hibbits 	case E_DTSEC_STAT_TR255:
760852ba100SJustin Hibbits 		ret_val = ioread32be(&regs->tr255);
761852ba100SJustin Hibbits 		break;
762852ba100SJustin Hibbits 	case E_DTSEC_STAT_TR511:
763852ba100SJustin Hibbits 		ret_val = ioread32be(&regs->tr511);
764852ba100SJustin Hibbits 		break;
765852ba100SJustin Hibbits 	case E_DTSEC_STAT_TR1K:
766852ba100SJustin Hibbits 		ret_val = ioread32be(&regs->tr1k);
767852ba100SJustin Hibbits 		break;
768852ba100SJustin Hibbits 	case E_DTSEC_STAT_TRMAX:
769852ba100SJustin Hibbits 		ret_val = ioread32be(&regs->trmax);
770852ba100SJustin Hibbits 		break;
771852ba100SJustin Hibbits 	case E_DTSEC_STAT_TRMGV:
772852ba100SJustin Hibbits 		ret_val = ioread32be(&regs->trmgv);
773852ba100SJustin Hibbits 		break;
774852ba100SJustin Hibbits 	case E_DTSEC_STAT_RBYT:
775852ba100SJustin Hibbits 		ret_val = ioread32be(&regs->rbyt);
776852ba100SJustin Hibbits 		break;
777852ba100SJustin Hibbits 	case E_DTSEC_STAT_RPKT:
778852ba100SJustin Hibbits 		ret_val = ioread32be(&regs->rpkt);
779852ba100SJustin Hibbits 		break;
780852ba100SJustin Hibbits 	case E_DTSEC_STAT_RMCA:
781852ba100SJustin Hibbits 		ret_val = ioread32be(&regs->rmca);
782852ba100SJustin Hibbits 		break;
783852ba100SJustin Hibbits 	case E_DTSEC_STAT_RBCA:
784852ba100SJustin Hibbits 		ret_val = ioread32be(&regs->rbca);
785852ba100SJustin Hibbits 		break;
786852ba100SJustin Hibbits 	case E_DTSEC_STAT_RXPF:
787852ba100SJustin Hibbits 		ret_val = ioread32be(&regs->rxpf);
788852ba100SJustin Hibbits 		break;
789852ba100SJustin Hibbits 	case E_DTSEC_STAT_RALN:
790852ba100SJustin Hibbits 		ret_val = ioread32be(&regs->raln);
791852ba100SJustin Hibbits 		break;
792852ba100SJustin Hibbits 	case E_DTSEC_STAT_RFLR:
793852ba100SJustin Hibbits 		ret_val = ioread32be(&regs->rflr);
794852ba100SJustin Hibbits 		break;
795852ba100SJustin Hibbits 	case E_DTSEC_STAT_RCDE:
796852ba100SJustin Hibbits 		ret_val = ioread32be(&regs->rcde);
797852ba100SJustin Hibbits 		break;
798852ba100SJustin Hibbits 	case E_DTSEC_STAT_RCSE:
799852ba100SJustin Hibbits 		ret_val = ioread32be(&regs->rcse);
800852ba100SJustin Hibbits 		break;
801852ba100SJustin Hibbits 	case E_DTSEC_STAT_RUND:
802852ba100SJustin Hibbits 		ret_val = ioread32be(&regs->rund);
803852ba100SJustin Hibbits 		break;
804852ba100SJustin Hibbits 	case E_DTSEC_STAT_ROVR:
805852ba100SJustin Hibbits 		ret_val = ioread32be(&regs->rovr);
806852ba100SJustin Hibbits 		break;
807852ba100SJustin Hibbits 	case E_DTSEC_STAT_RFRG:
808852ba100SJustin Hibbits 		ret_val = ioread32be(&regs->rfrg);
809852ba100SJustin Hibbits 		break;
810852ba100SJustin Hibbits 	case E_DTSEC_STAT_RJBR:
811852ba100SJustin Hibbits 		ret_val = ioread32be(&regs->rjbr);
812852ba100SJustin Hibbits 		break;
813852ba100SJustin Hibbits 	case E_DTSEC_STAT_RDRP:
814852ba100SJustin Hibbits 		ret_val = ioread32be(&regs->rdrp);
815852ba100SJustin Hibbits 		break;
816852ba100SJustin Hibbits 	case E_DTSEC_STAT_TFCS:
817852ba100SJustin Hibbits 		ret_val = ioread32be(&regs->tfcs);
818852ba100SJustin Hibbits 		break;
819852ba100SJustin Hibbits 	case E_DTSEC_STAT_TBYT:
820852ba100SJustin Hibbits 		ret_val = ioread32be(&regs->tbyt);
821852ba100SJustin Hibbits 		break;
822852ba100SJustin Hibbits 	case E_DTSEC_STAT_TPKT:
823852ba100SJustin Hibbits 		ret_val = ioread32be(&regs->tpkt);
824852ba100SJustin Hibbits 		break;
825852ba100SJustin Hibbits 	case E_DTSEC_STAT_TMCA:
826852ba100SJustin Hibbits 		ret_val = ioread32be(&regs->tmca);
827852ba100SJustin Hibbits 		break;
828852ba100SJustin Hibbits 	case E_DTSEC_STAT_TBCA:
829852ba100SJustin Hibbits 		ret_val = ioread32be(&regs->tbca);
830852ba100SJustin Hibbits 		break;
831852ba100SJustin Hibbits 	case E_DTSEC_STAT_TXPF:
832852ba100SJustin Hibbits 		ret_val = ioread32be(&regs->txpf);
833852ba100SJustin Hibbits 		break;
834852ba100SJustin Hibbits 	case E_DTSEC_STAT_TNCL:
835852ba100SJustin Hibbits 		ret_val = ioread32be(&regs->tncl);
836852ba100SJustin Hibbits 		break;
837852ba100SJustin Hibbits 	case E_DTSEC_STAT_TDRP:
838852ba100SJustin Hibbits 		ret_val = ioread32be(&regs->tdrp);
839852ba100SJustin Hibbits 		break;
840852ba100SJustin Hibbits 	default:
841852ba100SJustin Hibbits 		ret_val = 0;
842852ba100SJustin Hibbits 	}
843852ba100SJustin Hibbits 
844852ba100SJustin Hibbits 	return ret_val;
845852ba100SJustin Hibbits }
846