perf tools: Don't clone maps from parent when synthesizing forks
[linux/fpc-iii.git] / drivers / net / ethernet / stmicro / stmmac / dwmac1000_core.c
blob0877bde6e860b24a4f6003e817ee82a0726f0f11
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.
6 This only implements the mac core functions for this chip.
8 Copyright (C) 2007-2009 STMicroelectronics Ltd
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.
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.
19 The full GNU General Public License is included in this distribution in
20 the file called "COPYING".
22 Author: Giuseppe Cavallaro <peppe.cavallaro@st.com>
23 *******************************************************************************/
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"
34 static void dwmac1000_core_init(struct mac_device_info *hw,
35 struct net_device *dev)
37 void __iomem *ioaddr = hw->pcsr;
38 u32 value = readl(ioaddr + GMAC_CONTROL);
39 int mtu = dev->mtu;
41 /* Configure GMAC core */
42 value |= GMAC_CORE_INIT;
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.
48 if (netdev_uses_dsa(dev))
49 value &= ~GMAC_CONTROL_ACS;
51 if (mtu > 1500)
52 value |= GMAC_CONTROL_2K;
53 if (mtu > 2000)
54 value |= GMAC_CONTROL_JE;
56 if (hw->ps) {
57 value |= GMAC_CONTROL_TE;
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;
73 writel(value, ioaddr + GMAC_CONTROL);
75 /* Mask GMAC interrupts */
76 value = GMAC_INT_DEFAULT_MASK;
78 if (hw->pcs)
79 value &= ~GMAC_INT_DISABLE_PCS;
81 writel(value, ioaddr + GMAC_INT_MASK);
83 #ifdef STMMAC_VLAN_TAG_USED
84 /* Tag detection without filtering */
85 writel(0x0, ioaddr + GMAC_VLAN_TAG);
86 #endif
89 static int dwmac1000_rx_ipc_enable(struct mac_device_info *hw)
91 void __iomem *ioaddr = hw->pcsr;
92 u32 value = readl(ioaddr + GMAC_CONTROL);
94 if (hw->rx_csum)
95 value |= GMAC_CONTROL_IPC;
96 else
97 value &= ~GMAC_CONTROL_IPC;
99 writel(value, ioaddr + GMAC_CONTROL);
101 value = readl(ioaddr + GMAC_CONTROL);
103 return !!(value & GMAC_CONTROL_IPC);
106 static void dwmac1000_dump_regs(struct mac_device_info *hw, u32 *reg_space)
108 void __iomem *ioaddr = hw->pcsr;
109 int i;
111 for (i = 0; i < 55; i++)
112 reg_space[i] = readl(ioaddr + i * 4);
115 static void dwmac1000_set_umac_addr(struct mac_device_info *hw,
116 unsigned char *addr,
117 unsigned int reg_n)
119 void __iomem *ioaddr = hw->pcsr;
120 stmmac_set_mac_addr(ioaddr, addr, GMAC_ADDR_HIGH(reg_n),
121 GMAC_ADDR_LOW(reg_n));
124 static void dwmac1000_get_umac_addr(struct mac_device_info *hw,
125 unsigned char *addr,
126 unsigned int reg_n)
128 void __iomem *ioaddr = hw->pcsr;
129 stmmac_get_mac_addr(ioaddr, addr, GMAC_ADDR_HIGH(reg_n),
130 GMAC_ADDR_LOW(reg_n));
133 static void dwmac1000_set_mchash(void __iomem *ioaddr, u32 *mcfilterbits,
134 int mcbitslog2)
136 int numhashregs, regs;
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;
155 for (regs = 0; regs < numhashregs; regs++)
156 writel(mcfilterbits[regs],
157 ioaddr + GMAC_EXTHASH_BASE + regs * 4);
160 static void dwmac1000_set_filter(struct mac_device_info *hw,
161 struct net_device *dev)
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;
169 pr_debug("%s: # mcasts %d, # unicast %d\n", __func__,
170 netdev_mc_count(dev), netdev_uc_count(dev));
172 memset(mc_filter, 0, sizeof(mc_filter));
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;
181 /* Hash filter for multicast */
182 value = GMAC_FRAME_FILTER_HMC;
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.
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.
197 mc_filter[bit_nr >> 5] |= 1 << (bit_nr & 31);
201 dwmac1000_set_mchash(ioaddr, mc_filter, mcbitslog2);
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.
208 value |= GMAC_FRAME_FILTER_PR;
209 else {
210 int reg = 1;
211 struct netdev_hw_addr *ha;
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++;
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);
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)
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.
237 unsigned int flow = GMAC_FLOW_CTRL_UP;
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;
244 if (fc & FLOW_TX) {
245 pr_debug("\tTransmit Flow-Control ON\n");
246 flow |= GMAC_FLOW_CTRL_TFE;
249 if (duplex) {
250 pr_debug("\tduplex mode: PAUSE %d\n", pause_time);
251 flow |= (pause_time << GMAC_FLOW_CTRL_PT_SHIFT);
254 writel(flow, ioaddr + GMAC_FLOW_CTRL);
257 static void dwmac1000_pmt(struct mac_device_info *hw, unsigned long mode)
259 void __iomem *ioaddr = hw->pcsr;
260 unsigned int pmt = 0;
262 if (mode & WAKE_MAGIC) {
263 pr_debug("GMAC: WOL Magic frame\n");
264 pmt |= power_down | magic_pkt_en;
266 if (mode & WAKE_UCAST) {
267 pr_debug("GMAC: WOL on global unicast\n");
268 pmt |= power_down | global_unicast | wake_up_frame_en;
271 writel(pmt, ioaddr + GMAC_PMT);
274 /* RGMII or SMII interface */
275 static void dwmac1000_rgsmii(void __iomem *ioaddr, struct stmmac_extra_stats *x)
277 u32 status;
279 status = readl(ioaddr + GMAC_RGSMIIIS);
280 x->irq_rgmii_n++;
282 /* Check the link status */
283 if (status & GMAC_RGSMIIIS_LNKSTS) {
284 int speed_value;
286 x->pcs_link = 1;
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;
297 x->pcs_duplex = (status & GMAC_RGSMIIIS_LNKMOD_MASK);
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");
307 static int dwmac1000_irq_status(struct mac_device_info *hw,
308 struct stmmac_extra_stats *x)
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;
315 /* Discard masked bits */
316 intr_status &= ~intr_mask;
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++;
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);
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++;
346 dwmac_pcs_isr(ioaddr, GMAC_PCS_BASE, intr_status, x);
348 if (intr_status & PCS_RGSMIIIS_IRQ)
349 dwmac1000_rgsmii(ioaddr, x);
351 return ret;
354 static void dwmac1000_set_eee_mode(struct mac_device_info *hw,
355 bool en_tx_lpi_clockgating)
357 void __iomem *ioaddr = hw->pcsr;
358 u32 value;
360 /*TODO - en_tx_lpi_clockgating treatment */
362 /* Enable the link status receive on RGMII, SGMII ore SMII
363 * receive path and instruct the transmit to enter in LPI
364 * state.
366 value = readl(ioaddr + LPI_CTRL_STATUS);
367 value |= LPI_CTRL_STATUS_LPIEN | LPI_CTRL_STATUS_LPITXA;
368 writel(value, ioaddr + LPI_CTRL_STATUS);
371 static void dwmac1000_reset_eee_mode(struct mac_device_info *hw)
373 void __iomem *ioaddr = hw->pcsr;
374 u32 value;
376 value = readl(ioaddr + LPI_CTRL_STATUS);
377 value &= ~(LPI_CTRL_STATUS_LPIEN | LPI_CTRL_STATUS_LPITXA);
378 writel(value, ioaddr + LPI_CTRL_STATUS);
381 static void dwmac1000_set_eee_pls(struct mac_device_info *hw, int link)
383 void __iomem *ioaddr = hw->pcsr;
384 u32 value;
386 value = readl(ioaddr + LPI_CTRL_STATUS);
388 if (link)
389 value |= LPI_CTRL_STATUS_PLS;
390 else
391 value &= ~LPI_CTRL_STATUS_PLS;
393 writel(value, ioaddr + LPI_CTRL_STATUS);
396 static void dwmac1000_set_eee_timer(struct mac_device_info *hw, int ls, int tw)
398 void __iomem *ioaddr = hw->pcsr;
399 int value = ((tw & 0xffff)) | ((ls & 0x7ff) << 16);
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.
408 writel(value, ioaddr + LPI_TIMER_CTRL);
411 static void dwmac1000_ctrl_ane(void __iomem *ioaddr, bool ane, bool srgmi_ral,
412 bool loopback)
414 dwmac_ctrl_ane(ioaddr, GMAC_PCS_BASE, ane, srgmi_ral, loopback);
417 static void dwmac1000_rane(void __iomem *ioaddr, bool restart)
419 dwmac_rane(ioaddr, GMAC_PCS_BASE, restart);
422 static void dwmac1000_get_adv_lp(void __iomem *ioaddr, struct rgmii_adv *adv)
424 dwmac_get_adv_lp(ioaddr, GMAC_PCS_BASE, adv);
427 static void dwmac1000_debug(void __iomem *ioaddr, struct stmmac_extra_stats *x,
428 u32 rx_queues, u32 tx_queues)
430 u32 value = readl(ioaddr + GMAC_DEBUG);
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++;
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;
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++;
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;
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++;
480 if (value & GMAC_DEBUG_RRCSTS_MASK) {
481 u32 rrcsts = (value & GMAC_DEBUG_RRCSTS_MASK) >>
482 GMAC_DEBUG_RRCSTS_SHIFT;
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++;
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++;
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,
523 int dwmac1000_setup(struct stmmac_priv *priv)
525 struct mac_device_info *mac = priv->hw;
527 dev_info(priv->device, "\tDWMAC1000\n");
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;
535 if (mac->multicast_filter_bins)
536 mac->mcast_bits_log2 = ilog2(mac->multicast_filter_bins);
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);
552 return 0;