dwmac1000_core.c (15459B)
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 5 developing this code. 6 7 This only implements the mac core functions for this chip. 8 9 Copyright (C) 2007-2009 STMicroelectronics Ltd 10 11 12 Author: Giuseppe Cavallaro <peppe.cavallaro@st.com> 13*******************************************************************************/ 14 15#include <linux/crc32.h> 16#include <linux/slab.h> 17#include <linux/ethtool.h> 18#include <net/dsa.h> 19#include <asm/io.h> 20#include "stmmac.h" 21#include "stmmac_pcs.h" 22#include "dwmac1000.h" 23 24static void dwmac1000_core_init(struct mac_device_info *hw, 25 struct net_device *dev) 26{ 27 struct stmmac_priv *priv = netdev_priv(dev); 28 void __iomem *ioaddr = hw->pcsr; 29 u32 value = readl(ioaddr + GMAC_CONTROL); 30 int mtu = dev->mtu; 31 32 /* Configure GMAC core */ 33 value |= GMAC_CORE_INIT; 34 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. 38 */ 39 if (netdev_uses_dsa(dev) || !priv->plat->enh_desc) 40 value &= ~GMAC_CONTROL_ACS; 41 42 if (mtu > 1500) 43 value |= GMAC_CONTROL_2K; 44 if (mtu > 2000) 45 value |= GMAC_CONTROL_JE; 46 47 if (hw->ps) { 48 value |= GMAC_CONTROL_TE; 49 50 value &= ~hw->link.speed_mask; 51 switch (hw->ps) { 52 case SPEED_1000: 53 value |= hw->link.speed1000; 54 break; 55 case SPEED_100: 56 value |= hw->link.speed100; 57 break; 58 case SPEED_10: 59 value |= hw->link.speed10; 60 break; 61 } 62 } 63 64 writel(value, ioaddr + GMAC_CONTROL); 65 66 /* Mask GMAC interrupts */ 67 value = GMAC_INT_DEFAULT_MASK; 68 69 if (hw->pcs) 70 value &= ~GMAC_INT_DISABLE_PCS; 71 72 writel(value, ioaddr + GMAC_INT_MASK); 73 74#ifdef STMMAC_VLAN_TAG_USED 75 /* Tag detection without filtering */ 76 writel(0x0, ioaddr + GMAC_VLAN_TAG); 77#endif 78} 79 80static int dwmac1000_rx_ipc_enable(struct mac_device_info *hw) 81{ 82 void __iomem *ioaddr = hw->pcsr; 83 u32 value = readl(ioaddr + GMAC_CONTROL); 84 85 if (hw->rx_csum) 86 value |= GMAC_CONTROL_IPC; 87 else 88 value &= ~GMAC_CONTROL_IPC; 89 90 writel(value, ioaddr + GMAC_CONTROL); 91 92 value = readl(ioaddr + GMAC_CONTROL); 93 94 return !!(value & GMAC_CONTROL_IPC); 95} 96 97static void dwmac1000_dump_regs(struct mac_device_info *hw, u32 *reg_space) 98{ 99 void __iomem *ioaddr = hw->pcsr; 100 int i; 101 102 for (i = 0; i < 55; i++) 103 reg_space[i] = readl(ioaddr + i * 4); 104} 105 106static void dwmac1000_set_umac_addr(struct mac_device_info *hw, 107 const unsigned char *addr, 108 unsigned int reg_n) 109{ 110 void __iomem *ioaddr = hw->pcsr; 111 stmmac_set_mac_addr(ioaddr, addr, GMAC_ADDR_HIGH(reg_n), 112 GMAC_ADDR_LOW(reg_n)); 113} 114 115static void dwmac1000_get_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_get_mac_addr(ioaddr, addr, GMAC_ADDR_HIGH(reg_n), 121 GMAC_ADDR_LOW(reg_n)); 122} 123 124static void dwmac1000_set_mchash(void __iomem *ioaddr, u32 *mcfilterbits, 125 int mcbitslog2) 126{ 127 int numhashregs, regs; 128 129 switch (mcbitslog2) { 130 case 6: 131 writel(mcfilterbits[0], ioaddr + GMAC_HASH_LOW); 132 writel(mcfilterbits[1], ioaddr + GMAC_HASH_HIGH); 133 return; 134 case 7: 135 numhashregs = 4; 136 break; 137 case 8: 138 numhashregs = 8; 139 break; 140 default: 141 pr_debug("STMMAC: err in setting multicast filter\n"); 142 return; 143 } 144 for (regs = 0; regs < numhashregs; regs++) 145 writel(mcfilterbits[regs], 146 ioaddr + GMAC_EXTHASH_BASE + regs * 4); 147} 148 149static void dwmac1000_set_filter(struct mac_device_info *hw, 150 struct net_device *dev) 151{ 152 void __iomem *ioaddr = (void __iomem *)dev->base_addr; 153 unsigned int value = 0; 154 unsigned int perfect_addr_number = hw->unicast_filter_entries; 155 u32 mc_filter[8]; 156 int mcbitslog2 = hw->mcast_bits_log2; 157 158 pr_debug("%s: # mcasts %d, # unicast %d\n", __func__, 159 netdev_mc_count(dev), netdev_uc_count(dev)); 160 161 memset(mc_filter, 0, sizeof(mc_filter)); 162 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; 172 173 /* Hash filter for multicast */ 174 value = GMAC_FRAME_FILTER_HMC; 175 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. 181 */ 182 int bit_nr = bitrev32(~crc32_le(~0, ha->addr, 183 ETH_ALEN)) >> 184 (32 - mcbitslog2); 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. 188 */ 189 mc_filter[bit_nr >> 5] |= 1 << (bit_nr & 31); 190 } 191 } 192 193 value |= GMAC_FRAME_FILTER_HPF; 194 dwmac1000_set_mchash(ioaddr, mc_filter, mcbitslog2); 195 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. 200 */ 201 value |= GMAC_FRAME_FILTER_PR; 202 else { 203 int reg = 1; 204 struct netdev_hw_addr *ha; 205 206 netdev_for_each_uc_addr(ha, dev) { 207 stmmac_set_mac_addr(ioaddr, ha->addr, 208 GMAC_ADDR_HIGH(reg), 209 GMAC_ADDR_LOW(reg)); 210 reg++; 211 } 212 213 while (reg < perfect_addr_number) { 214 writel(0, ioaddr + GMAC_ADDR_HIGH(reg)); 215 writel(0, ioaddr + GMAC_ADDR_LOW(reg)); 216 reg++; 217 } 218 } 219 220#ifdef FRAME_FILTER_DEBUG 221 /* Enable Receive all mode (to debug filtering_fail errors) */ 222 value |= GMAC_FRAME_FILTER_RA; 223#endif 224 writel(value, ioaddr + GMAC_FRAME_FILTER); 225} 226 227 228static void dwmac1000_flow_ctrl(struct mac_device_info *hw, unsigned int duplex, 229 unsigned int fc, unsigned int pause_time, 230 u32 tx_cnt) 231{ 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. 235 */ 236 unsigned int flow = GMAC_FLOW_CTRL_UP; 237 238 pr_debug("GMAC Flow-Control:\n"); 239 if (fc & FLOW_RX) { 240 pr_debug("\tReceive Flow-Control ON\n"); 241 flow |= GMAC_FLOW_CTRL_RFE; 242 } 243 if (fc & FLOW_TX) { 244 pr_debug("\tTransmit Flow-Control ON\n"); 245 flow |= GMAC_FLOW_CTRL_TFE; 246 } 247 248 if (duplex) { 249 pr_debug("\tduplex mode: PAUSE %d\n", pause_time); 250 flow |= (pause_time << GMAC_FLOW_CTRL_PT_SHIFT); 251 } 252 253 writel(flow, ioaddr + GMAC_FLOW_CTRL); 254} 255 256static void dwmac1000_pmt(struct mac_device_info *hw, unsigned long mode) 257{ 258 void __iomem *ioaddr = hw->pcsr; 259 unsigned int pmt = 0; 260 261 if (mode & WAKE_MAGIC) { 262 pr_debug("GMAC: WOL Magic frame\n"); 263 pmt |= power_down | magic_pkt_en; 264 } 265 if (mode & WAKE_UCAST) { 266 pr_debug("GMAC: WOL on global unicast\n"); 267 pmt |= power_down | global_unicast | wake_up_frame_en; 268 } 269 270 writel(pmt, ioaddr + GMAC_PMT); 271} 272 273/* RGMII or SMII interface */ 274static void dwmac1000_rgsmii(void __iomem *ioaddr, struct stmmac_extra_stats *x) 275{ 276 u32 status; 277 278 status = readl(ioaddr + GMAC_RGSMIIIS); 279 x->irq_rgmii_n++; 280 281 /* Check the link status */ 282 if (status & GMAC_RGSMIIIS_LNKSTS) { 283 int speed_value; 284 285 x->pcs_link = 1; 286 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; 293 else 294 x->pcs_speed = SPEED_10; 295 296 x->pcs_duplex = (status & GMAC_RGSMIIIS_LNKMOD_MASK); 297 298 pr_info("Link is Up - %d/%s\n", (int)x->pcs_speed, 299 x->pcs_duplex ? "Full" : "Half"); 300 } else { 301 x->pcs_link = 0; 302 pr_info("Link is Down\n"); 303 } 304} 305 306static int dwmac1000_irq_status(struct mac_device_info *hw, 307 struct stmmac_extra_stats *x) 308{ 309 void __iomem *ioaddr = hw->pcsr; 310 u32 intr_status = readl(ioaddr + GMAC_INT_STATUS); 311 u32 intr_mask = readl(ioaddr + GMAC_INT_MASK); 312 int ret = 0; 313 314 /* Discard masked bits */ 315 intr_status &= ~intr_mask; 316 317 /* Not used events (e.g. MMC interrupts) are not handled. */ 318 if ((intr_status & GMAC_INT_STATUS_MMCTIS)) 319 x->mmc_tx_irq_n++; 320 if (unlikely(intr_status & GMAC_INT_STATUS_MMCRIS)) 321 x->mmc_rx_irq_n++; 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++; 328 } 329 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); 334 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++; 343 } 344 345 dwmac_pcs_isr(ioaddr, GMAC_PCS_BASE, intr_status, x); 346 347 if (intr_status & PCS_RGSMIIIS_IRQ) 348 dwmac1000_rgsmii(ioaddr, x); 349 350 return ret; 351} 352 353static void dwmac1000_set_eee_mode(struct mac_device_info *hw, 354 bool en_tx_lpi_clockgating) 355{ 356 void __iomem *ioaddr = hw->pcsr; 357 u32 value; 358 359 /*TODO - en_tx_lpi_clockgating treatment */ 360 361 /* Enable the link status receive on RGMII, SGMII ore SMII 362 * receive path and instruct the transmit to enter in LPI 363 * state. 364 */ 365 value = readl(ioaddr + LPI_CTRL_STATUS); 366 value |= LPI_CTRL_STATUS_LPIEN | LPI_CTRL_STATUS_LPITXA; 367 writel(value, ioaddr + LPI_CTRL_STATUS); 368} 369 370static void dwmac1000_reset_eee_mode(struct mac_device_info *hw) 371{ 372 void __iomem *ioaddr = hw->pcsr; 373 u32 value; 374 375 value = readl(ioaddr + LPI_CTRL_STATUS); 376 value &= ~(LPI_CTRL_STATUS_LPIEN | LPI_CTRL_STATUS_LPITXA); 377 writel(value, ioaddr + LPI_CTRL_STATUS); 378} 379 380static void dwmac1000_set_eee_pls(struct mac_device_info *hw, int link) 381{ 382 void __iomem *ioaddr = hw->pcsr; 383 u32 value; 384 385 value = readl(ioaddr + LPI_CTRL_STATUS); 386 387 if (link) 388 value |= LPI_CTRL_STATUS_PLS; 389 else 390 value &= ~LPI_CTRL_STATUS_PLS; 391 392 writel(value, ioaddr + LPI_CTRL_STATUS); 393} 394 395static void dwmac1000_set_eee_timer(struct mac_device_info *hw, int ls, int tw) 396{ 397 void __iomem *ioaddr = hw->pcsr; 398 int value = ((tw & 0xffff)) | ((ls & 0x7ff) << 16); 399 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 403 * the LPI pattern. 404 * TW: minimum time (us) for which the core waits 405 * after it has stopped transmitting the LPI pattern. 406 */ 407 writel(value, ioaddr + LPI_TIMER_CTRL); 408} 409 410static void dwmac1000_ctrl_ane(void __iomem *ioaddr, bool ane, bool srgmi_ral, 411 bool loopback) 412{ 413 dwmac_ctrl_ane(ioaddr, GMAC_PCS_BASE, ane, srgmi_ral, loopback); 414} 415 416static void dwmac1000_rane(void __iomem *ioaddr, bool restart) 417{ 418 dwmac_rane(ioaddr, GMAC_PCS_BASE, restart); 419} 420 421static void dwmac1000_get_adv_lp(void __iomem *ioaddr, struct rgmii_adv *adv) 422{ 423 dwmac_get_adv_lp(ioaddr, GMAC_PCS_BASE, adv); 424} 425 426static void dwmac1000_debug(void __iomem *ioaddr, struct stmmac_extra_stats *x, 427 u32 rx_queues, u32 tx_queues) 428{ 429 u32 value = readl(ioaddr + GMAC_DEBUG); 430 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) 436 x->mmtl_fifo_ctrl++; 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++; 446 else 447 x->mtl_tx_fifo_read_ctrl_idle++; 448 } 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; 454 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++; 461 else 462 x->mac_tx_frame_ctrl_idle++; 463 } 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; 469 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++; 476 else 477 x->mtl_rx_fifo_fill_level_empty++; 478 } 479 if (value & GMAC_DEBUG_RRCSTS_MASK) { 480 u32 rrcsts = (value & GMAC_DEBUG_RRCSTS_MASK) >> 481 GMAC_DEBUG_RRCSTS_SHIFT; 482 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++; 489 else 490 x->mtl_rx_fifo_read_ctrl_idle++; 491 } 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++; 499} 500 501static void dwmac1000_set_mac_loopback(void __iomem *ioaddr, bool enable) 502{ 503 u32 value = readl(ioaddr + GMAC_CONTROL); 504 505 if (enable) 506 value |= GMAC_CONTROL_LM; 507 else 508 value &= ~GMAC_CONTROL_LM; 509 510 writel(value, ioaddr + GMAC_CONTROL); 511} 512 513const 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, 533}; 534 535int dwmac1000_setup(struct stmmac_priv *priv) 536{ 537 struct mac_device_info *mac = priv->hw; 538 539 dev_info(priv->device, "\tDWMAC1000\n"); 540 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; 546 547 if (mac->multicast_filter_bins) 548 mac->mcast_bits_log2 = ilog2(mac->multicast_filter_bins); 549 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); 563 564 return 0; 565}