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
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
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>
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
);
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
;
52 value
|= GMAC_CONTROL_2K
;
54 value
|= GMAC_CONTROL_JE
;
57 value
|= GMAC_CONTROL_TE
;
59 value
&= ~hw
->link
.speed_mask
;
62 value
|= hw
->link
.speed1000
;
65 value
|= hw
->link
.speed100
;
68 value
|= hw
->link
.speed10
;
73 writel(value
, ioaddr
+ GMAC_CONTROL
);
75 /* Mask GMAC interrupts */
76 value
= GMAC_INT_DEFAULT_MASK
;
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
);
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
);
95 value
|= GMAC_CONTROL_IPC
;
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
;
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
,
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
,
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
,
136 int numhashregs
, regs
;
138 switch (mcbitslog2
) {
140 writel(mcfilterbits
[0], ioaddr
+ GMAC_HASH_LOW
);
141 writel(mcfilterbits
[1], ioaddr
+ GMAC_HASH_HIGH
);
151 pr_debug("STMMAC: err in setting multicast filter\n");
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
;
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
,
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
;
211 struct netdev_hw_addr
*ha
;
213 netdev_for_each_uc_addr(ha
, dev
) {
214 stmmac_set_mac_addr(ioaddr
, ha
->addr
,
221 #ifdef FRAME_FILTER_DEBUG
222 /* Enable Receive all mode (to debug filtering_fail errors) */
223 value
|= GMAC_FRAME_FILTER_RA
;
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
,
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");
241 pr_debug("\tReceive Flow-Control ON\n");
242 flow
|= GMAC_FLOW_CTRL_RFE
;
245 pr_debug("\tTransmit Flow-Control ON\n");
246 flow
|= GMAC_FLOW_CTRL_TFE
;
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
)
279 status
= readl(ioaddr
+ GMAC_RGSMIIIS
);
282 /* Check the link status */
283 if (status
& GMAC_RGSMIIIS_LNKSTS
) {
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
;
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");
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
);
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
))
321 if (unlikely(intr_status
& GMAC_INT_STATUS_MMCRIS
))
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
);
354 static void dwmac1000_set_eee_mode(struct mac_device_info
*hw
,
355 bool en_tx_lpi_clockgating
)
357 void __iomem
*ioaddr
= hw
->pcsr
;
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
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
;
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
;
386 value
= readl(ioaddr
+ LPI_CTRL_STATUS
);
389 value
|= LPI_CTRL_STATUS_PLS
;
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
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
,
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
)
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
++;
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
++;
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
++;
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
++;
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);