1 // SPDX-License-Identifier: GPL-2.0-only
2 /*******************************************************************************
3 This is the driver for the GMAC on-chip Ethernet controller for ST SoCs.
4 DWC Ether MAC 10/100/1000 Universal version 3.41a has been used for
7 This only implements the mac core functions for this chip.
9 Copyright (C) 2007-2009 STMicroelectronics Ltd
12 Author: Giuseppe Cavallaro <peppe.cavallaro@st.com>
13 *******************************************************************************/
15 #include <linux/crc32.h>
16 #include <linux/slab.h>
17 #include <linux/ethtool.h>
21 #include "stmmac_pcs.h"
22 #include "dwmac1000.h"
24 static void dwmac1000_core_init(struct mac_device_info
*hw
,
25 struct net_device
*dev
)
27 struct stmmac_priv
*priv
= netdev_priv(dev
);
28 void __iomem
*ioaddr
= hw
->pcsr
;
29 u32 value
= readl(ioaddr
+ GMAC_CONTROL
);
32 /* Configure GMAC core */
33 value
|= GMAC_CORE_INIT
;
35 /* Clear ACS bit because Ethernet switch tagging formats such as
36 * Broadcom tags can look like invalid LLC/SNAP packets and cause the
37 * hardware to truncate packets on reception.
39 if (netdev_uses_dsa(dev
) || !priv
->plat
->enh_desc
)
40 value
&= ~GMAC_CONTROL_ACS
;
43 value
|= GMAC_CONTROL_2K
;
45 value
|= GMAC_CONTROL_JE
;
48 value
|= GMAC_CONTROL_TE
;
50 value
&= ~hw
->link
.speed_mask
;
53 value
|= hw
->link
.speed1000
;
56 value
|= hw
->link
.speed100
;
59 value
|= hw
->link
.speed10
;
64 writel(value
, ioaddr
+ GMAC_CONTROL
);
66 /* Mask GMAC interrupts */
67 value
= GMAC_INT_DEFAULT_MASK
;
70 value
&= ~GMAC_INT_DISABLE_PCS
;
72 writel(value
, ioaddr
+ GMAC_INT_MASK
);
74 #ifdef STMMAC_VLAN_TAG_USED
75 /* Tag detection without filtering */
76 writel(0x0, ioaddr
+ GMAC_VLAN_TAG
);
80 static int dwmac1000_rx_ipc_enable(struct mac_device_info
*hw
)
82 void __iomem
*ioaddr
= hw
->pcsr
;
83 u32 value
= readl(ioaddr
+ GMAC_CONTROL
);
86 value
|= GMAC_CONTROL_IPC
;
88 value
&= ~GMAC_CONTROL_IPC
;
90 writel(value
, ioaddr
+ GMAC_CONTROL
);
92 value
= readl(ioaddr
+ GMAC_CONTROL
);
94 return !!(value
& GMAC_CONTROL_IPC
);
97 static void dwmac1000_dump_regs(struct mac_device_info
*hw
, u32
*reg_space
)
99 void __iomem
*ioaddr
= hw
->pcsr
;
102 for (i
= 0; i
< 55; i
++)
103 reg_space
[i
] = readl(ioaddr
+ i
* 4);
106 static void dwmac1000_set_umac_addr(struct mac_device_info
*hw
,
110 void __iomem
*ioaddr
= hw
->pcsr
;
111 stmmac_set_mac_addr(ioaddr
, addr
, GMAC_ADDR_HIGH(reg_n
),
112 GMAC_ADDR_LOW(reg_n
));
115 static void dwmac1000_get_umac_addr(struct mac_device_info
*hw
,
119 void __iomem
*ioaddr
= hw
->pcsr
;
120 stmmac_get_mac_addr(ioaddr
, addr
, GMAC_ADDR_HIGH(reg_n
),
121 GMAC_ADDR_LOW(reg_n
));
124 static void dwmac1000_set_mchash(void __iomem
*ioaddr
, u32
*mcfilterbits
,
127 int numhashregs
, regs
;
129 switch (mcbitslog2
) {
131 writel(mcfilterbits
[0], ioaddr
+ GMAC_HASH_LOW
);
132 writel(mcfilterbits
[1], ioaddr
+ GMAC_HASH_HIGH
);
141 pr_debug("STMMAC: err in setting multicast filter\n");
144 for (regs
= 0; regs
< numhashregs
; regs
++)
145 writel(mcfilterbits
[regs
],
146 ioaddr
+ GMAC_EXTHASH_BASE
+ regs
* 4);
149 static void dwmac1000_set_filter(struct mac_device_info
*hw
,
150 struct net_device
*dev
)
152 void __iomem
*ioaddr
= (void __iomem
*)dev
->base_addr
;
153 unsigned int value
= 0;
154 unsigned int perfect_addr_number
= hw
->unicast_filter_entries
;
156 int mcbitslog2
= hw
->mcast_bits_log2
;
158 pr_debug("%s: # mcasts %d, # unicast %d\n", __func__
,
159 netdev_mc_count(dev
), netdev_uc_count(dev
));
161 memset(mc_filter
, 0, sizeof(mc_filter
));
163 if (dev
->flags
& IFF_PROMISC
) {
164 value
= GMAC_FRAME_FILTER_PR
| GMAC_FRAME_FILTER_PCF
;
165 } else if (dev
->flags
& IFF_ALLMULTI
) {
166 value
= GMAC_FRAME_FILTER_PM
; /* pass all multi */
167 } else if (!netdev_mc_empty(dev
) && (mcbitslog2
== 0)) {
168 /* Fall back to all multicast if we've no filter */
169 value
= GMAC_FRAME_FILTER_PM
;
170 } else if (!netdev_mc_empty(dev
)) {
171 struct netdev_hw_addr
*ha
;
173 /* Hash filter for multicast */
174 value
= GMAC_FRAME_FILTER_HMC
;
176 netdev_for_each_mc_addr(ha
, dev
) {
177 /* The upper n bits of the calculated CRC are used to
178 * index the contents of the hash table. The number of
179 * bits used depends on the hardware configuration
180 * selected at core configuration time.
182 int bit_nr
= bitrev32(~crc32_le(~0, ha
->addr
,
185 /* The most significant bit determines the register to
186 * use (H/L) while the other 5 bits determine the bit
187 * within the register.
189 mc_filter
[bit_nr
>> 5] |= 1 << (bit_nr
& 31);
193 value
|= GMAC_FRAME_FILTER_HPF
;
194 dwmac1000_set_mchash(ioaddr
, mc_filter
, mcbitslog2
);
196 /* Handle multiple unicast addresses (perfect filtering) */
197 if (netdev_uc_count(dev
) > perfect_addr_number
)
198 /* Switch to promiscuous mode if more than unicast
199 * addresses are requested than supported by hardware.
201 value
|= GMAC_FRAME_FILTER_PR
;
204 struct netdev_hw_addr
*ha
;
206 netdev_for_each_uc_addr(ha
, dev
) {
207 stmmac_set_mac_addr(ioaddr
, ha
->addr
,
213 while (reg
< perfect_addr_number
) {
214 writel(0, ioaddr
+ GMAC_ADDR_HIGH(reg
));
215 writel(0, ioaddr
+ GMAC_ADDR_LOW(reg
));
220 #ifdef FRAME_FILTER_DEBUG
221 /* Enable Receive all mode (to debug filtering_fail errors) */
222 value
|= GMAC_FRAME_FILTER_RA
;
224 writel(value
, ioaddr
+ GMAC_FRAME_FILTER
);
228 static void dwmac1000_flow_ctrl(struct mac_device_info
*hw
, unsigned int duplex
,
229 unsigned int fc
, unsigned int pause_time
,
232 void __iomem
*ioaddr
= hw
->pcsr
;
233 /* Set flow such that DZPQ in Mac Register 6 is 0,
234 * and unicast pause detect is enabled.
236 unsigned int flow
= GMAC_FLOW_CTRL_UP
;
238 pr_debug("GMAC Flow-Control:\n");
240 pr_debug("\tReceive Flow-Control ON\n");
241 flow
|= GMAC_FLOW_CTRL_RFE
;
244 pr_debug("\tTransmit Flow-Control ON\n");
245 flow
|= GMAC_FLOW_CTRL_TFE
;
249 pr_debug("\tduplex mode: PAUSE %d\n", pause_time
);
250 flow
|= (pause_time
<< GMAC_FLOW_CTRL_PT_SHIFT
);
253 writel(flow
, ioaddr
+ GMAC_FLOW_CTRL
);
256 static void dwmac1000_pmt(struct mac_device_info
*hw
, unsigned long mode
)
258 void __iomem
*ioaddr
= hw
->pcsr
;
259 unsigned int pmt
= 0;
261 if (mode
& WAKE_MAGIC
) {
262 pr_debug("GMAC: WOL Magic frame\n");
263 pmt
|= power_down
| magic_pkt_en
;
265 if (mode
& WAKE_UCAST
) {
266 pr_debug("GMAC: WOL on global unicast\n");
267 pmt
|= power_down
| global_unicast
| wake_up_frame_en
;
270 writel(pmt
, ioaddr
+ GMAC_PMT
);
273 /* RGMII or SMII interface */
274 static void dwmac1000_rgsmii(void __iomem
*ioaddr
, struct stmmac_extra_stats
*x
)
278 status
= readl(ioaddr
+ GMAC_RGSMIIIS
);
281 /* Check the link status */
282 if (status
& GMAC_RGSMIIIS_LNKSTS
) {
287 speed_value
= ((status
& GMAC_RGSMIIIS_SPEED
) >>
288 GMAC_RGSMIIIS_SPEED_SHIFT
);
289 if (speed_value
== GMAC_RGSMIIIS_SPEED_125
)
290 x
->pcs_speed
= SPEED_1000
;
291 else if (speed_value
== GMAC_RGSMIIIS_SPEED_25
)
292 x
->pcs_speed
= SPEED_100
;
294 x
->pcs_speed
= SPEED_10
;
296 x
->pcs_duplex
= (status
& GMAC_RGSMIIIS_LNKMOD_MASK
);
298 pr_info("Link is Up - %d/%s\n", (int)x
->pcs_speed
,
299 x
->pcs_duplex
? "Full" : "Half");
302 pr_info("Link is Down\n");
306 static int dwmac1000_irq_status(struct mac_device_info
*hw
,
307 struct stmmac_extra_stats
*x
)
309 void __iomem
*ioaddr
= hw
->pcsr
;
310 u32 intr_status
= readl(ioaddr
+ GMAC_INT_STATUS
);
311 u32 intr_mask
= readl(ioaddr
+ GMAC_INT_MASK
);
314 /* Discard masked bits */
315 intr_status
&= ~intr_mask
;
317 /* Not used events (e.g. MMC interrupts) are not handled. */
318 if ((intr_status
& GMAC_INT_STATUS_MMCTIS
))
320 if (unlikely(intr_status
& GMAC_INT_STATUS_MMCRIS
))
322 if (unlikely(intr_status
& GMAC_INT_STATUS_MMCCSUM
))
323 x
->mmc_rx_csum_offload_irq_n
++;
324 if (unlikely(intr_status
& GMAC_INT_DISABLE_PMT
)) {
325 /* clear the PMT bits 5 and 6 by reading the PMT status reg */
326 readl(ioaddr
+ GMAC_PMT
);
327 x
->irq_receive_pmt_irq_n
++;
330 /* MAC tx/rx EEE LPI entry/exit interrupts */
331 if (intr_status
& GMAC_INT_STATUS_LPIIS
) {
332 /* Clean LPI interrupt by reading the Reg 12 */
333 ret
= readl(ioaddr
+ LPI_CTRL_STATUS
);
335 if (ret
& LPI_CTRL_STATUS_TLPIEN
)
336 x
->irq_tx_path_in_lpi_mode_n
++;
337 if (ret
& LPI_CTRL_STATUS_TLPIEX
)
338 x
->irq_tx_path_exit_lpi_mode_n
++;
339 if (ret
& LPI_CTRL_STATUS_RLPIEN
)
340 x
->irq_rx_path_in_lpi_mode_n
++;
341 if (ret
& LPI_CTRL_STATUS_RLPIEX
)
342 x
->irq_rx_path_exit_lpi_mode_n
++;
345 dwmac_pcs_isr(ioaddr
, GMAC_PCS_BASE
, intr_status
, x
);
347 if (intr_status
& PCS_RGSMIIIS_IRQ
)
348 dwmac1000_rgsmii(ioaddr
, x
);
353 static void dwmac1000_set_eee_mode(struct mac_device_info
*hw
,
354 bool en_tx_lpi_clockgating
)
356 void __iomem
*ioaddr
= hw
->pcsr
;
359 /*TODO - en_tx_lpi_clockgating treatment */
361 /* Enable the link status receive on RGMII, SGMII ore SMII
362 * receive path and instruct the transmit to enter in LPI
365 value
= readl(ioaddr
+ LPI_CTRL_STATUS
);
366 value
|= LPI_CTRL_STATUS_LPIEN
| LPI_CTRL_STATUS_LPITXA
;
367 writel(value
, ioaddr
+ LPI_CTRL_STATUS
);
370 static void dwmac1000_reset_eee_mode(struct mac_device_info
*hw
)
372 void __iomem
*ioaddr
= hw
->pcsr
;
375 value
= readl(ioaddr
+ LPI_CTRL_STATUS
);
376 value
&= ~(LPI_CTRL_STATUS_LPIEN
| LPI_CTRL_STATUS_LPITXA
);
377 writel(value
, ioaddr
+ LPI_CTRL_STATUS
);
380 static void dwmac1000_set_eee_pls(struct mac_device_info
*hw
, int link
)
382 void __iomem
*ioaddr
= hw
->pcsr
;
385 value
= readl(ioaddr
+ LPI_CTRL_STATUS
);
388 value
|= LPI_CTRL_STATUS_PLS
;
390 value
&= ~LPI_CTRL_STATUS_PLS
;
392 writel(value
, ioaddr
+ LPI_CTRL_STATUS
);
395 static void dwmac1000_set_eee_timer(struct mac_device_info
*hw
, int ls
, int tw
)
397 void __iomem
*ioaddr
= hw
->pcsr
;
398 int value
= ((tw
& 0xffff)) | ((ls
& 0x7ff) << 16);
400 /* Program the timers in the LPI timer control register:
401 * LS: minimum time (ms) for which the link
402 * status from PHY should be ok before transmitting
404 * TW: minimum time (us) for which the core waits
405 * after it has stopped transmitting the LPI pattern.
407 writel(value
, ioaddr
+ LPI_TIMER_CTRL
);
410 static void dwmac1000_ctrl_ane(void __iomem
*ioaddr
, bool ane
, bool srgmi_ral
,
413 dwmac_ctrl_ane(ioaddr
, GMAC_PCS_BASE
, ane
, srgmi_ral
, loopback
);
416 static void dwmac1000_rane(void __iomem
*ioaddr
, bool restart
)
418 dwmac_rane(ioaddr
, GMAC_PCS_BASE
, restart
);
421 static void dwmac1000_get_adv_lp(void __iomem
*ioaddr
, struct rgmii_adv
*adv
)
423 dwmac_get_adv_lp(ioaddr
, GMAC_PCS_BASE
, adv
);
426 static void dwmac1000_debug(void __iomem
*ioaddr
, struct stmmac_extra_stats
*x
,
427 u32 rx_queues
, u32 tx_queues
)
429 u32 value
= readl(ioaddr
+ GMAC_DEBUG
);
431 if (value
& GMAC_DEBUG_TXSTSFSTS
)
432 x
->mtl_tx_status_fifo_full
++;
433 if (value
& GMAC_DEBUG_TXFSTS
)
434 x
->mtl_tx_fifo_not_empty
++;
435 if (value
& GMAC_DEBUG_TWCSTS
)
437 if (value
& GMAC_DEBUG_TRCSTS_MASK
) {
438 u32 trcsts
= (value
& GMAC_DEBUG_TRCSTS_MASK
)
439 >> GMAC_DEBUG_TRCSTS_SHIFT
;
440 if (trcsts
== GMAC_DEBUG_TRCSTS_WRITE
)
441 x
->mtl_tx_fifo_read_ctrl_write
++;
442 else if (trcsts
== GMAC_DEBUG_TRCSTS_TXW
)
443 x
->mtl_tx_fifo_read_ctrl_wait
++;
444 else if (trcsts
== GMAC_DEBUG_TRCSTS_READ
)
445 x
->mtl_tx_fifo_read_ctrl_read
++;
447 x
->mtl_tx_fifo_read_ctrl_idle
++;
449 if (value
& GMAC_DEBUG_TXPAUSED
)
450 x
->mac_tx_in_pause
++;
451 if (value
& GMAC_DEBUG_TFCSTS_MASK
) {
452 u32 tfcsts
= (value
& GMAC_DEBUG_TFCSTS_MASK
)
453 >> GMAC_DEBUG_TFCSTS_SHIFT
;
455 if (tfcsts
== GMAC_DEBUG_TFCSTS_XFER
)
456 x
->mac_tx_frame_ctrl_xfer
++;
457 else if (tfcsts
== GMAC_DEBUG_TFCSTS_GEN_PAUSE
)
458 x
->mac_tx_frame_ctrl_pause
++;
459 else if (tfcsts
== GMAC_DEBUG_TFCSTS_WAIT
)
460 x
->mac_tx_frame_ctrl_wait
++;
462 x
->mac_tx_frame_ctrl_idle
++;
464 if (value
& GMAC_DEBUG_TPESTS
)
465 x
->mac_gmii_tx_proto_engine
++;
466 if (value
& GMAC_DEBUG_RXFSTS_MASK
) {
467 u32 rxfsts
= (value
& GMAC_DEBUG_RXFSTS_MASK
)
468 >> GMAC_DEBUG_RRCSTS_SHIFT
;
470 if (rxfsts
== GMAC_DEBUG_RXFSTS_FULL
)
471 x
->mtl_rx_fifo_fill_level_full
++;
472 else if (rxfsts
== GMAC_DEBUG_RXFSTS_AT
)
473 x
->mtl_rx_fifo_fill_above_thresh
++;
474 else if (rxfsts
== GMAC_DEBUG_RXFSTS_BT
)
475 x
->mtl_rx_fifo_fill_below_thresh
++;
477 x
->mtl_rx_fifo_fill_level_empty
++;
479 if (value
& GMAC_DEBUG_RRCSTS_MASK
) {
480 u32 rrcsts
= (value
& GMAC_DEBUG_RRCSTS_MASK
) >>
481 GMAC_DEBUG_RRCSTS_SHIFT
;
483 if (rrcsts
== GMAC_DEBUG_RRCSTS_FLUSH
)
484 x
->mtl_rx_fifo_read_ctrl_flush
++;
485 else if (rrcsts
== GMAC_DEBUG_RRCSTS_RSTAT
)
486 x
->mtl_rx_fifo_read_ctrl_read_data
++;
487 else if (rrcsts
== GMAC_DEBUG_RRCSTS_RDATA
)
488 x
->mtl_rx_fifo_read_ctrl_status
++;
490 x
->mtl_rx_fifo_read_ctrl_idle
++;
492 if (value
& GMAC_DEBUG_RWCSTS
)
493 x
->mtl_rx_fifo_ctrl_active
++;
494 if (value
& GMAC_DEBUG_RFCFCSTS_MASK
)
495 x
->mac_rx_frame_ctrl_fifo
= (value
& GMAC_DEBUG_RFCFCSTS_MASK
)
496 >> GMAC_DEBUG_RFCFCSTS_SHIFT
;
497 if (value
& GMAC_DEBUG_RPESTS
)
498 x
->mac_gmii_rx_proto_engine
++;
501 static void dwmac1000_set_mac_loopback(void __iomem
*ioaddr
, bool enable
)
503 u32 value
= readl(ioaddr
+ GMAC_CONTROL
);
506 value
|= GMAC_CONTROL_LM
;
508 value
&= ~GMAC_CONTROL_LM
;
510 writel(value
, ioaddr
+ GMAC_CONTROL
);
513 const struct stmmac_ops dwmac1000_ops
= {
514 .core_init
= dwmac1000_core_init
,
515 .set_mac
= stmmac_set_mac
,
516 .rx_ipc
= dwmac1000_rx_ipc_enable
,
517 .dump_regs
= dwmac1000_dump_regs
,
518 .host_irq_status
= dwmac1000_irq_status
,
519 .set_filter
= dwmac1000_set_filter
,
520 .flow_ctrl
= dwmac1000_flow_ctrl
,
521 .pmt
= dwmac1000_pmt
,
522 .set_umac_addr
= dwmac1000_set_umac_addr
,
523 .get_umac_addr
= dwmac1000_get_umac_addr
,
524 .set_eee_mode
= dwmac1000_set_eee_mode
,
525 .reset_eee_mode
= dwmac1000_reset_eee_mode
,
526 .set_eee_timer
= dwmac1000_set_eee_timer
,
527 .set_eee_pls
= dwmac1000_set_eee_pls
,
528 .debug
= dwmac1000_debug
,
529 .pcs_ctrl_ane
= dwmac1000_ctrl_ane
,
530 .pcs_rane
= dwmac1000_rane
,
531 .pcs_get_adv_lp
= dwmac1000_get_adv_lp
,
532 .set_mac_loopback
= dwmac1000_set_mac_loopback
,
535 int dwmac1000_setup(struct stmmac_priv
*priv
)
537 struct mac_device_info
*mac
= priv
->hw
;
539 dev_info(priv
->device
, "\tDWMAC1000\n");
541 priv
->dev
->priv_flags
|= IFF_UNICAST_FLT
;
542 mac
->pcsr
= priv
->ioaddr
;
543 mac
->multicast_filter_bins
= priv
->plat
->multicast_filter_bins
;
544 mac
->unicast_filter_entries
= priv
->plat
->unicast_filter_entries
;
545 mac
->mcast_bits_log2
= 0;
547 if (mac
->multicast_filter_bins
)
548 mac
->mcast_bits_log2
= ilog2(mac
->multicast_filter_bins
);
550 mac
->link
.duplex
= GMAC_CONTROL_DM
;
551 mac
->link
.speed10
= GMAC_CONTROL_PS
;
552 mac
->link
.speed100
= GMAC_CONTROL_PS
| GMAC_CONTROL_FES
;
553 mac
->link
.speed1000
= 0;
554 mac
->link
.speed_mask
= GMAC_CONTROL_PS
| GMAC_CONTROL_FES
;
555 mac
->mii
.addr
= GMAC_MII_ADDR
;
556 mac
->mii
.data
= GMAC_MII_DATA
;
557 mac
->mii
.addr_shift
= 11;
558 mac
->mii
.addr_mask
= 0x0000F800;
559 mac
->mii
.reg_shift
= 6;
560 mac
->mii
.reg_mask
= 0x000007C0;
561 mac
->mii
.clk_csr_shift
= 2;
562 mac
->mii
.clk_csr_mask
= GENMASK(5, 2);