1 /*******************************************************************************
2   This is the driver for the GMAC on-chip Ethernet controller for ST SoCs.
3   DWC Ether MAC 10/100/1000 Universal version 3.41a  has been used for
4   developing this code.
5 
6   This only implements the mac core functions for this chip.
7 
8   Copyright (C) 2007-2009  STMicroelectronics Ltd
9 
10   This program is free software; you can redistribute it and/or modify it
11   under the terms and conditions of the GNU General Public License,
12   version 2, as published by the Free Software Foundation.
13 
14   This program is distributed in the hope it will be useful, but WITHOUT
15   ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
16   FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
17   more details.
18 
19   The full GNU General Public License is included in this distribution in
20   the file called "COPYING".
21 
22   Author: Giuseppe Cavallaro <peppe.cavallaro@st.com>
23 *******************************************************************************/
24 
25 #include <linux/crc32.h>
26 #include <linux/slab.h>
27 #include <linux/ethtool.h>
28 #include <net/dsa.h>
29 #include <asm/io.h>
30 #include "stmmac.h"
31 #include "stmmac_pcs.h"
32 #include "dwmac1000.h"
33 
dwmac1000_core_init(struct mac_device_info * hw,struct net_device * dev)34 static void dwmac1000_core_init(struct mac_device_info *hw,
35 				struct net_device *dev)
36 {
37 	void __iomem *ioaddr = hw->pcsr;
38 	u32 value = readl(ioaddr + GMAC_CONTROL);
39 	int mtu = dev->mtu;
40 
41 	/* Configure GMAC core */
42 	value |= GMAC_CORE_INIT;
43 
44 	/* Clear ACS bit because Ethernet switch tagging formats such as
45 	 * Broadcom tags can look like invalid LLC/SNAP packets and cause the
46 	 * hardware to truncate packets on reception.
47 	 */
48 	if (netdev_uses_dsa(dev))
49 		value &= ~GMAC_CONTROL_ACS;
50 
51 	if (mtu > 1500)
52 		value |= GMAC_CONTROL_2K;
53 	if (mtu > 2000)
54 		value |= GMAC_CONTROL_JE;
55 
56 	if (hw->ps) {
57 		value |= GMAC_CONTROL_TE;
58 
59 		value &= ~hw->link.speed_mask;
60 		switch (hw->ps) {
61 		case SPEED_1000:
62 			value |= hw->link.speed1000;
63 			break;
64 		case SPEED_100:
65 			value |= hw->link.speed100;
66 			break;
67 		case SPEED_10:
68 			value |= hw->link.speed10;
69 			break;
70 		}
71 	}
72 
73 	writel(value, ioaddr + GMAC_CONTROL);
74 
75 	/* Mask GMAC interrupts */
76 	value = GMAC_INT_DEFAULT_MASK;
77 
78 	if (hw->pcs)
79 		value &= ~GMAC_INT_DISABLE_PCS;
80 
81 	writel(value, ioaddr + GMAC_INT_MASK);
82 
83 #ifdef STMMAC_VLAN_TAG_USED
84 	/* Tag detection without filtering */
85 	writel(0x0, ioaddr + GMAC_VLAN_TAG);
86 #endif
87 }
88 
dwmac1000_rx_ipc_enable(struct mac_device_info * hw)89 static int dwmac1000_rx_ipc_enable(struct mac_device_info *hw)
90 {
91 	void __iomem *ioaddr = hw->pcsr;
92 	u32 value = readl(ioaddr + GMAC_CONTROL);
93 
94 	if (hw->rx_csum)
95 		value |= GMAC_CONTROL_IPC;
96 	else
97 		value &= ~GMAC_CONTROL_IPC;
98 
99 	writel(value, ioaddr + GMAC_CONTROL);
100 
101 	value = readl(ioaddr + GMAC_CONTROL);
102 
103 	return !!(value & GMAC_CONTROL_IPC);
104 }
105 
dwmac1000_dump_regs(struct mac_device_info * hw,u32 * reg_space)106 static void dwmac1000_dump_regs(struct mac_device_info *hw, u32 *reg_space)
107 {
108 	void __iomem *ioaddr = hw->pcsr;
109 	int i;
110 
111 	for (i = 0; i < 55; i++)
112 		reg_space[i] = readl(ioaddr + i * 4);
113 }
114 
dwmac1000_set_umac_addr(struct mac_device_info * hw,unsigned char * addr,unsigned int reg_n)115 static void dwmac1000_set_umac_addr(struct mac_device_info *hw,
116 				    unsigned char *addr,
117 				    unsigned int reg_n)
118 {
119 	void __iomem *ioaddr = hw->pcsr;
120 	stmmac_set_mac_addr(ioaddr, addr, GMAC_ADDR_HIGH(reg_n),
121 			    GMAC_ADDR_LOW(reg_n));
122 }
123 
dwmac1000_get_umac_addr(struct mac_device_info * hw,unsigned char * addr,unsigned int reg_n)124 static void dwmac1000_get_umac_addr(struct mac_device_info *hw,
125 				    unsigned char *addr,
126 				    unsigned int reg_n)
127 {
128 	void __iomem *ioaddr = hw->pcsr;
129 	stmmac_get_mac_addr(ioaddr, addr, GMAC_ADDR_HIGH(reg_n),
130 			    GMAC_ADDR_LOW(reg_n));
131 }
132 
dwmac1000_set_mchash(void __iomem * ioaddr,u32 * mcfilterbits,int mcbitslog2)133 static void dwmac1000_set_mchash(void __iomem *ioaddr, u32 *mcfilterbits,
134 				 int mcbitslog2)
135 {
136 	int numhashregs, regs;
137 
138 	switch (mcbitslog2) {
139 	case 6:
140 		writel(mcfilterbits[0], ioaddr + GMAC_HASH_LOW);
141 		writel(mcfilterbits[1], ioaddr + GMAC_HASH_HIGH);
142 		return;
143 		break;
144 	case 7:
145 		numhashregs = 4;
146 		break;
147 	case 8:
148 		numhashregs = 8;
149 		break;
150 	default:
151 		pr_debug("STMMAC: err in setting multicast filter\n");
152 		return;
153 		break;
154 	}
155 	for (regs = 0; regs < numhashregs; regs++)
156 		writel(mcfilterbits[regs],
157 		       ioaddr + GMAC_EXTHASH_BASE + regs * 4);
158 }
159 
dwmac1000_set_filter(struct mac_device_info * hw,struct net_device * dev)160 static void dwmac1000_set_filter(struct mac_device_info *hw,
161 				 struct net_device *dev)
162 {
163 	void __iomem *ioaddr = (void __iomem *)dev->base_addr;
164 	unsigned int value = 0;
165 	unsigned int perfect_addr_number = hw->unicast_filter_entries;
166 	u32 mc_filter[8];
167 	int mcbitslog2 = hw->mcast_bits_log2;
168 
169 	pr_debug("%s: # mcasts %d, # unicast %d\n", __func__,
170 		 netdev_mc_count(dev), netdev_uc_count(dev));
171 
172 	memset(mc_filter, 0, sizeof(mc_filter));
173 
174 	if (dev->flags & IFF_PROMISC) {
175 		value = GMAC_FRAME_FILTER_PR;
176 	} else if (dev->flags & IFF_ALLMULTI) {
177 		value = GMAC_FRAME_FILTER_PM;	/* pass all multi */
178 	} else if (!netdev_mc_empty(dev)) {
179 		struct netdev_hw_addr *ha;
180 
181 		/* Hash filter for multicast */
182 		value = GMAC_FRAME_FILTER_HMC;
183 
184 		netdev_for_each_mc_addr(ha, dev) {
185 			/* The upper n bits of the calculated CRC are used to
186 			 * index the contents of the hash table. The number of
187 			 * bits used depends on the hardware configuration
188 			 * selected at core configuration time.
189 			 */
190 			int bit_nr = bitrev32(~crc32_le(~0, ha->addr,
191 					      ETH_ALEN)) >>
192 					      (32 - mcbitslog2);
193 			/* The most significant bit determines the register to
194 			 * use (H/L) while the other 5 bits determine the bit
195 			 * within the register.
196 			 */
197 			mc_filter[bit_nr >> 5] |= 1 << (bit_nr & 31);
198 		}
199 	}
200 
201 	dwmac1000_set_mchash(ioaddr, mc_filter, mcbitslog2);
202 
203 	/* Handle multiple unicast addresses (perfect filtering) */
204 	if (netdev_uc_count(dev) > perfect_addr_number)
205 		/* Switch to promiscuous mode if more than unicast
206 		 * addresses are requested than supported by hardware.
207 		 */
208 		value |= GMAC_FRAME_FILTER_PR;
209 	else {
210 		int reg = 1;
211 		struct netdev_hw_addr *ha;
212 
213 		netdev_for_each_uc_addr(ha, dev) {
214 			stmmac_set_mac_addr(ioaddr, ha->addr,
215 					    GMAC_ADDR_HIGH(reg),
216 					    GMAC_ADDR_LOW(reg));
217 			reg++;
218 		}
219 	}
220 
221 #ifdef FRAME_FILTER_DEBUG
222 	/* Enable Receive all mode (to debug filtering_fail errors) */
223 	value |= GMAC_FRAME_FILTER_RA;
224 #endif
225 	writel(value, ioaddr + GMAC_FRAME_FILTER);
226 }
227 
228 
dwmac1000_flow_ctrl(struct mac_device_info * hw,unsigned int duplex,unsigned int fc,unsigned int pause_time,u32 tx_cnt)229 static void dwmac1000_flow_ctrl(struct mac_device_info *hw, unsigned int duplex,
230 				unsigned int fc, unsigned int pause_time,
231 				u32 tx_cnt)
232 {
233 	void __iomem *ioaddr = hw->pcsr;
234 	/* Set flow such that DZPQ in Mac Register 6 is 0,
235 	 * and unicast pause detect is enabled.
236 	 */
237 	unsigned int flow = GMAC_FLOW_CTRL_UP;
238 
239 	pr_debug("GMAC Flow-Control:\n");
240 	if (fc & FLOW_RX) {
241 		pr_debug("\tReceive Flow-Control ON\n");
242 		flow |= GMAC_FLOW_CTRL_RFE;
243 	}
244 	if (fc & FLOW_TX) {
245 		pr_debug("\tTransmit Flow-Control ON\n");
246 		flow |= GMAC_FLOW_CTRL_TFE;
247 	}
248 
249 	if (duplex) {
250 		pr_debug("\tduplex mode: PAUSE %d\n", pause_time);
251 		flow |= (pause_time << GMAC_FLOW_CTRL_PT_SHIFT);
252 	}
253 
254 	writel(flow, ioaddr + GMAC_FLOW_CTRL);
255 }
256 
dwmac1000_pmt(struct mac_device_info * hw,unsigned long mode)257 static void dwmac1000_pmt(struct mac_device_info *hw, unsigned long mode)
258 {
259 	void __iomem *ioaddr = hw->pcsr;
260 	unsigned int pmt = 0;
261 
262 	if (mode & WAKE_MAGIC) {
263 		pr_debug("GMAC: WOL Magic frame\n");
264 		pmt |= power_down | magic_pkt_en;
265 	}
266 	if (mode & WAKE_UCAST) {
267 		pr_debug("GMAC: WOL on global unicast\n");
268 		pmt |= power_down | global_unicast | wake_up_frame_en;
269 	}
270 
271 	writel(pmt, ioaddr + GMAC_PMT);
272 }
273 
274 /* RGMII or SMII interface */
dwmac1000_rgsmii(void __iomem * ioaddr,struct stmmac_extra_stats * x)275 static void dwmac1000_rgsmii(void __iomem *ioaddr, struct stmmac_extra_stats *x)
276 {
277 	u32 status;
278 
279 	status = readl(ioaddr + GMAC_RGSMIIIS);
280 	x->irq_rgmii_n++;
281 
282 	/* Check the link status */
283 	if (status & GMAC_RGSMIIIS_LNKSTS) {
284 		int speed_value;
285 
286 		x->pcs_link = 1;
287 
288 		speed_value = ((status & GMAC_RGSMIIIS_SPEED) >>
289 			       GMAC_RGSMIIIS_SPEED_SHIFT);
290 		if (speed_value == GMAC_RGSMIIIS_SPEED_125)
291 			x->pcs_speed = SPEED_1000;
292 		else if (speed_value == GMAC_RGSMIIIS_SPEED_25)
293 			x->pcs_speed = SPEED_100;
294 		else
295 			x->pcs_speed = SPEED_10;
296 
297 		x->pcs_duplex = (status & GMAC_RGSMIIIS_LNKMOD_MASK);
298 
299 		pr_info("Link is Up - %d/%s\n", (int)x->pcs_speed,
300 			x->pcs_duplex ? "Full" : "Half");
301 	} else {
302 		x->pcs_link = 0;
303 		pr_info("Link is Down\n");
304 	}
305 }
306 
dwmac1000_irq_status(struct mac_device_info * hw,struct stmmac_extra_stats * x)307 static int dwmac1000_irq_status(struct mac_device_info *hw,
308 				struct stmmac_extra_stats *x)
309 {
310 	void __iomem *ioaddr = hw->pcsr;
311 	u32 intr_status = readl(ioaddr + GMAC_INT_STATUS);
312 	u32 intr_mask = readl(ioaddr + GMAC_INT_MASK);
313 	int ret = 0;
314 
315 	/* Discard masked bits */
316 	intr_status &= ~intr_mask;
317 
318 	/* Not used events (e.g. MMC interrupts) are not handled. */
319 	if ((intr_status & GMAC_INT_STATUS_MMCTIS))
320 		x->mmc_tx_irq_n++;
321 	if (unlikely(intr_status & GMAC_INT_STATUS_MMCRIS))
322 		x->mmc_rx_irq_n++;
323 	if (unlikely(intr_status & GMAC_INT_STATUS_MMCCSUM))
324 		x->mmc_rx_csum_offload_irq_n++;
325 	if (unlikely(intr_status & GMAC_INT_DISABLE_PMT)) {
326 		/* clear the PMT bits 5 and 6 by reading the PMT status reg */
327 		readl(ioaddr + GMAC_PMT);
328 		x->irq_receive_pmt_irq_n++;
329 	}
330 
331 	/* MAC tx/rx EEE LPI entry/exit interrupts */
332 	if (intr_status & GMAC_INT_STATUS_LPIIS) {
333 		/* Clean LPI interrupt by reading the Reg 12 */
334 		ret = readl(ioaddr + LPI_CTRL_STATUS);
335 
336 		if (ret & LPI_CTRL_STATUS_TLPIEN)
337 			x->irq_tx_path_in_lpi_mode_n++;
338 		if (ret & LPI_CTRL_STATUS_TLPIEX)
339 			x->irq_tx_path_exit_lpi_mode_n++;
340 		if (ret & LPI_CTRL_STATUS_RLPIEN)
341 			x->irq_rx_path_in_lpi_mode_n++;
342 		if (ret & LPI_CTRL_STATUS_RLPIEX)
343 			x->irq_rx_path_exit_lpi_mode_n++;
344 	}
345 
346 	dwmac_pcs_isr(ioaddr, GMAC_PCS_BASE, intr_status, x);
347 
348 	if (intr_status & PCS_RGSMIIIS_IRQ)
349 		dwmac1000_rgsmii(ioaddr, x);
350 
351 	return ret;
352 }
353 
dwmac1000_set_eee_mode(struct mac_device_info * hw,bool en_tx_lpi_clockgating)354 static void dwmac1000_set_eee_mode(struct mac_device_info *hw,
355 				   bool en_tx_lpi_clockgating)
356 {
357 	void __iomem *ioaddr = hw->pcsr;
358 	u32 value;
359 
360 	/*TODO - en_tx_lpi_clockgating treatment */
361 
362 	/* Enable the link status receive on RGMII, SGMII ore SMII
363 	 * receive path and instruct the transmit to enter in LPI
364 	 * state.
365 	 */
366 	value = readl(ioaddr + LPI_CTRL_STATUS);
367 	value |= LPI_CTRL_STATUS_LPIEN | LPI_CTRL_STATUS_LPITXA;
368 	writel(value, ioaddr + LPI_CTRL_STATUS);
369 }
370 
dwmac1000_reset_eee_mode(struct mac_device_info * hw)371 static void dwmac1000_reset_eee_mode(struct mac_device_info *hw)
372 {
373 	void __iomem *ioaddr = hw->pcsr;
374 	u32 value;
375 
376 	value = readl(ioaddr + LPI_CTRL_STATUS);
377 	value &= ~(LPI_CTRL_STATUS_LPIEN | LPI_CTRL_STATUS_LPITXA);
378 	writel(value, ioaddr + LPI_CTRL_STATUS);
379 }
380 
dwmac1000_set_eee_pls(struct mac_device_info * hw,int link)381 static void dwmac1000_set_eee_pls(struct mac_device_info *hw, int link)
382 {
383 	void __iomem *ioaddr = hw->pcsr;
384 	u32 value;
385 
386 	value = readl(ioaddr + LPI_CTRL_STATUS);
387 
388 	if (link)
389 		value |= LPI_CTRL_STATUS_PLS;
390 	else
391 		value &= ~LPI_CTRL_STATUS_PLS;
392 
393 	writel(value, ioaddr + LPI_CTRL_STATUS);
394 }
395 
dwmac1000_set_eee_timer(struct mac_device_info * hw,int ls,int tw)396 static void dwmac1000_set_eee_timer(struct mac_device_info *hw, int ls, int tw)
397 {
398 	void __iomem *ioaddr = hw->pcsr;
399 	int value = ((tw & 0xffff)) | ((ls & 0x7ff) << 16);
400 
401 	/* Program the timers in the LPI timer control register:
402 	 * LS: minimum time (ms) for which the link
403 	 *  status from PHY should be ok before transmitting
404 	 *  the LPI pattern.
405 	 * TW: minimum time (us) for which the core waits
406 	 *  after it has stopped transmitting the LPI pattern.
407 	 */
408 	writel(value, ioaddr + LPI_TIMER_CTRL);
409 }
410 
dwmac1000_ctrl_ane(void __iomem * ioaddr,bool ane,bool srgmi_ral,bool loopback)411 static void dwmac1000_ctrl_ane(void __iomem *ioaddr, bool ane, bool srgmi_ral,
412 			       bool loopback)
413 {
414 	dwmac_ctrl_ane(ioaddr, GMAC_PCS_BASE, ane, srgmi_ral, loopback);
415 }
416 
dwmac1000_rane(void __iomem * ioaddr,bool restart)417 static void dwmac1000_rane(void __iomem *ioaddr, bool restart)
418 {
419 	dwmac_rane(ioaddr, GMAC_PCS_BASE, restart);
420 }
421 
dwmac1000_get_adv_lp(void __iomem * ioaddr,struct rgmii_adv * adv)422 static void dwmac1000_get_adv_lp(void __iomem *ioaddr, struct rgmii_adv *adv)
423 {
424 	dwmac_get_adv_lp(ioaddr, GMAC_PCS_BASE, adv);
425 }
426 
dwmac1000_debug(void __iomem * ioaddr,struct stmmac_extra_stats * x,u32 rx_queues,u32 tx_queues)427 static void dwmac1000_debug(void __iomem *ioaddr, struct stmmac_extra_stats *x,
428 			    u32 rx_queues, u32 tx_queues)
429 {
430 	u32 value = readl(ioaddr + GMAC_DEBUG);
431 
432 	if (value & GMAC_DEBUG_TXSTSFSTS)
433 		x->mtl_tx_status_fifo_full++;
434 	if (value & GMAC_DEBUG_TXFSTS)
435 		x->mtl_tx_fifo_not_empty++;
436 	if (value & GMAC_DEBUG_TWCSTS)
437 		x->mmtl_fifo_ctrl++;
438 	if (value & GMAC_DEBUG_TRCSTS_MASK) {
439 		u32 trcsts = (value & GMAC_DEBUG_TRCSTS_MASK)
440 			     >> GMAC_DEBUG_TRCSTS_SHIFT;
441 		if (trcsts == GMAC_DEBUG_TRCSTS_WRITE)
442 			x->mtl_tx_fifo_read_ctrl_write++;
443 		else if (trcsts == GMAC_DEBUG_TRCSTS_TXW)
444 			x->mtl_tx_fifo_read_ctrl_wait++;
445 		else if (trcsts == GMAC_DEBUG_TRCSTS_READ)
446 			x->mtl_tx_fifo_read_ctrl_read++;
447 		else
448 			x->mtl_tx_fifo_read_ctrl_idle++;
449 	}
450 	if (value & GMAC_DEBUG_TXPAUSED)
451 		x->mac_tx_in_pause++;
452 	if (value & GMAC_DEBUG_TFCSTS_MASK) {
453 		u32 tfcsts = (value & GMAC_DEBUG_TFCSTS_MASK)
454 			      >> GMAC_DEBUG_TFCSTS_SHIFT;
455 
456 		if (tfcsts == GMAC_DEBUG_TFCSTS_XFER)
457 			x->mac_tx_frame_ctrl_xfer++;
458 		else if (tfcsts == GMAC_DEBUG_TFCSTS_GEN_PAUSE)
459 			x->mac_tx_frame_ctrl_pause++;
460 		else if (tfcsts == GMAC_DEBUG_TFCSTS_WAIT)
461 			x->mac_tx_frame_ctrl_wait++;
462 		else
463 			x->mac_tx_frame_ctrl_idle++;
464 	}
465 	if (value & GMAC_DEBUG_TPESTS)
466 		x->mac_gmii_tx_proto_engine++;
467 	if (value & GMAC_DEBUG_RXFSTS_MASK) {
468 		u32 rxfsts = (value & GMAC_DEBUG_RXFSTS_MASK)
469 			     >> GMAC_DEBUG_RRCSTS_SHIFT;
470 
471 		if (rxfsts == GMAC_DEBUG_RXFSTS_FULL)
472 			x->mtl_rx_fifo_fill_level_full++;
473 		else if (rxfsts == GMAC_DEBUG_RXFSTS_AT)
474 			x->mtl_rx_fifo_fill_above_thresh++;
475 		else if (rxfsts == GMAC_DEBUG_RXFSTS_BT)
476 			x->mtl_rx_fifo_fill_below_thresh++;
477 		else
478 			x->mtl_rx_fifo_fill_level_empty++;
479 	}
480 	if (value & GMAC_DEBUG_RRCSTS_MASK) {
481 		u32 rrcsts = (value & GMAC_DEBUG_RRCSTS_MASK) >>
482 			     GMAC_DEBUG_RRCSTS_SHIFT;
483 
484 		if (rrcsts == GMAC_DEBUG_RRCSTS_FLUSH)
485 			x->mtl_rx_fifo_read_ctrl_flush++;
486 		else if (rrcsts == GMAC_DEBUG_RRCSTS_RSTAT)
487 			x->mtl_rx_fifo_read_ctrl_read_data++;
488 		else if (rrcsts == GMAC_DEBUG_RRCSTS_RDATA)
489 			x->mtl_rx_fifo_read_ctrl_status++;
490 		else
491 			x->mtl_rx_fifo_read_ctrl_idle++;
492 	}
493 	if (value & GMAC_DEBUG_RWCSTS)
494 		x->mtl_rx_fifo_ctrl_active++;
495 	if (value & GMAC_DEBUG_RFCFCSTS_MASK)
496 		x->mac_rx_frame_ctrl_fifo = (value & GMAC_DEBUG_RFCFCSTS_MASK)
497 					    >> GMAC_DEBUG_RFCFCSTS_SHIFT;
498 	if (value & GMAC_DEBUG_RPESTS)
499 		x->mac_gmii_rx_proto_engine++;
500 }
501 
502 const struct stmmac_ops dwmac1000_ops = {
503 	.core_init = dwmac1000_core_init,
504 	.set_mac = stmmac_set_mac,
505 	.rx_ipc = dwmac1000_rx_ipc_enable,
506 	.dump_regs = dwmac1000_dump_regs,
507 	.host_irq_status = dwmac1000_irq_status,
508 	.set_filter = dwmac1000_set_filter,
509 	.flow_ctrl = dwmac1000_flow_ctrl,
510 	.pmt = dwmac1000_pmt,
511 	.set_umac_addr = dwmac1000_set_umac_addr,
512 	.get_umac_addr = dwmac1000_get_umac_addr,
513 	.set_eee_mode = dwmac1000_set_eee_mode,
514 	.reset_eee_mode = dwmac1000_reset_eee_mode,
515 	.set_eee_timer = dwmac1000_set_eee_timer,
516 	.set_eee_pls = dwmac1000_set_eee_pls,
517 	.debug = dwmac1000_debug,
518 	.pcs_ctrl_ane = dwmac1000_ctrl_ane,
519 	.pcs_rane = dwmac1000_rane,
520 	.pcs_get_adv_lp = dwmac1000_get_adv_lp,
521 };
522 
dwmac1000_setup(struct stmmac_priv * priv)523 int dwmac1000_setup(struct stmmac_priv *priv)
524 {
525 	struct mac_device_info *mac = priv->hw;
526 
527 	dev_info(priv->device, "\tDWMAC1000\n");
528 
529 	priv->dev->priv_flags |= IFF_UNICAST_FLT;
530 	mac->pcsr = priv->ioaddr;
531 	mac->multicast_filter_bins = priv->plat->multicast_filter_bins;
532 	mac->unicast_filter_entries = priv->plat->unicast_filter_entries;
533 	mac->mcast_bits_log2 = 0;
534 
535 	if (mac->multicast_filter_bins)
536 		mac->mcast_bits_log2 = ilog2(mac->multicast_filter_bins);
537 
538 	mac->link.duplex = GMAC_CONTROL_DM;
539 	mac->link.speed10 = GMAC_CONTROL_PS;
540 	mac->link.speed100 = GMAC_CONTROL_PS | GMAC_CONTROL_FES;
541 	mac->link.speed1000 = 0;
542 	mac->link.speed_mask = GMAC_CONTROL_PS | GMAC_CONTROL_FES;
543 	mac->mii.addr = GMAC_MII_ADDR;
544 	mac->mii.data = GMAC_MII_DATA;
545 	mac->mii.addr_shift = 11;
546 	mac->mii.addr_mask = 0x0000F800;
547 	mac->mii.reg_shift = 6;
548 	mac->mii.reg_mask = 0x000007C0;
549 	mac->mii.clk_csr_shift = 2;
550 	mac->mii.clk_csr_mask = GENMASK(5, 2);
551 
552 	return 0;
553 }
554