Lines Matching +full:enable +full:- +full:lpa

1 // SPDX-License-Identifier: GPL-2.0+
19 #define ETH_PORT_STR "brcm,enetsw-port"
150 writel_be(0, priv->base + MII_SC_REG); in bcm6368_mdio_read()
159 writel_be(val, priv->base + MII_SC_REG); in bcm6368_mdio_read()
162 return readw_be(priv->base + MII_DAT_REG); in bcm6368_mdio_read()
170 writel_be(0, priv->base + MII_SC_REG); in bcm6368_mdio_write()
181 writel_be(val, priv->base + MII_SC_REG); in bcm6368_mdio_write()
191 return dma_prepare_rcv_buf(&priv->rx_dma, packet, len); in bcm6368_eth_free_pkt()
198 return dma_receive(&priv->rx_dma, (void**)packetp, NULL); in bcm6368_eth_recv()
207 memset(packet + length, 0, ETH_ZLEN - length); in bcm6368_eth_send()
211 return dma_send(&priv->tx_dma, packet, length, NULL); in bcm6368_eth_send()
219 for (i = 0; i < priv->num_ports; i++) { in bcm6368_eth_adjust_link()
221 int val, j, up, adv, lpa, speed, duplex, media; in bcm6368_eth_adjust_link() local
225 port = &priv->used_ports[i]; in bcm6368_eth_adjust_link()
226 if (!port->used) in bcm6368_eth_adjust_link()
229 if (port->bypass_link) in bcm6368_eth_adjust_link()
235 port->phy_id, MII_BMSR); in bcm6368_eth_adjust_link()
241 if (!(up ^ priv->sw_port_link[i])) in bcm6368_eth_adjust_link()
244 priv->sw_port_link[i] = up; in bcm6368_eth_adjust_link()
248 dev_info(&priv->pdev->dev, "link DOWN on %s\n", in bcm6368_eth_adjust_link()
249 port->name); in bcm6368_eth_adjust_link()
251 priv->base + ETH_PORTOV_REG(i)); in bcm6368_eth_adjust_link()
254 priv->base + ETH_PTCTRL_REG(i)); in bcm6368_eth_adjust_link()
259 port->phy_id, MII_ADVERTISE); in bcm6368_eth_adjust_link()
261 lpa = bcm6368_mdio_read(priv, external_phy, port->phy_id, in bcm6368_eth_adjust_link()
264 /* figure out media and duplex from advertise and LPA values */ in bcm6368_eth_adjust_link()
265 media = mii_nway_result(lpa & adv); in bcm6368_eth_adjust_link()
275 port->phy_id, MII_CTRL1000); in bcm6368_eth_adjust_link()
277 lpa = bcm6368_mdio_read(priv, external_phy, in bcm6368_eth_adjust_link()
278 port->phy_id, MII_STAT1000); in bcm6368_eth_adjust_link()
281 (lpa & (LPA_1000FULL | LPA_1000HALF))) { in bcm6368_eth_adjust_link()
283 duplex = (lpa & LPA_1000FULL); in bcm6368_eth_adjust_link()
287 pr_alert("link UP on %s, %dMbps, %s-duplex\n", in bcm6368_eth_adjust_link()
288 port->name, speed, duplex ? "full" : "half"); in bcm6368_eth_adjust_link()
300 writeb_be(override, priv->base + ETH_PORTOV_REG(i)); in bcm6368_eth_adjust_link()
301 writeb_be(0, priv->base + ETH_PTCTRL_REG(i)); in bcm6368_eth_adjust_link()
313 for (i = 0; i < priv->num_ports; i++) { in bcm6368_eth_start()
314 setbits_8(priv->base + ETH_PORTOV_REG(i), in bcm6368_eth_start()
316 setbits_8(priv->base + ETH_PTCTRL_REG(i), in bcm6368_eth_start()
318 priv->sw_port_link[i] = 0; in bcm6368_eth_start()
321 /* enable external ports */ in bcm6368_eth_start()
322 for (i = ETH_RGMII_PORT0; i < priv->num_ports; i++) { in bcm6368_eth_start()
325 if (!priv->used_ports[i].used) in bcm6368_eth_start()
328 if (priv->rgmii_override) in bcm6368_eth_start()
330 if (priv->rgmii_timing) in bcm6368_eth_start()
333 setbits_8(priv->base + ETH_RGMII_CTRL_REG(i), rgmii_ctrl); in bcm6368_eth_start()
337 setbits_8(priv->base + ETH_GMCR_REG, ETH_GMCR_RST_MIB_MASK); in bcm6368_eth_start()
339 clrbits_8(priv->base + ETH_GMCR_REG, ETH_GMCR_RST_MIB_MASK); in bcm6368_eth_start()
343 setbits_8(priv->base + ETH_IMPOV_REG, in bcm6368_eth_start()
346 /* enable switch forward engine */ in bcm6368_eth_start()
347 setbits_8(priv->base + ETH_SWMODE_REG, ETH_SWMODE_FWD_EN_MASK); in bcm6368_eth_start()
351 int ret = dma_prepare_rcv_buf(&priv->rx_dma, net_rx_packets[i], in bcm6368_eth_start()
357 /* enable dma rx channel */ in bcm6368_eth_start()
358 dma_enable(&priv->rx_dma); in bcm6368_eth_start()
360 /* enable dma tx channel */ in bcm6368_eth_start()
361 dma_enable(&priv->tx_dma); in bcm6368_eth_start()
364 for (i = 0; i < priv->num_ports; i++) { in bcm6368_eth_start()
368 port = &priv->used_ports[i]; in bcm6368_eth_start()
369 if (!port->used) in bcm6368_eth_start()
372 if (!port->bypass_link) in bcm6368_eth_start()
378 switch (port->force_speed) { in bcm6368_eth_start()
389 __func__, port->name); in bcm6368_eth_start()
393 if (port->force_duplex_full) in bcm6368_eth_start()
396 writeb_be(override, priv->base + ETH_PORTOV_REG(i)); in bcm6368_eth_start()
397 writeb_be(0, priv->base + ETH_PTCTRL_REG(i)); in bcm6368_eth_start()
411 for (i = 0; i < priv->num_ports; i++) { in bcm6368_eth_stop()
412 setbits_8(priv->base + ETH_PORTOV_REG(i), in bcm6368_eth_stop()
414 setbits_8(priv->base + ETH_PTCTRL_REG(i), in bcm6368_eth_stop()
419 for (i = ETH_RGMII_PORT0; i < priv->num_ports; i++) { in bcm6368_eth_stop()
420 if (!priv->used_ports[i].used) in bcm6368_eth_stop()
423 clrbits_8(priv->base + ETH_RGMII_CTRL_REG(i), in bcm6368_eth_stop()
428 clrbits_8(priv->base + ETH_IMPOV_REG, in bcm6368_eth_stop()
432 clrbits_8(priv->base + ETH_SWMODE_REG, ETH_SWMODE_FWD_EN_MASK); in bcm6368_eth_stop()
435 dma_disable(&priv->rx_dma); in bcm6368_eth_stop()
438 dma_disable(&priv->tx_dma); in bcm6368_eth_stop()
450 { .compatible = "brcm,bcm6368-enet", },
458 for (i = 0; i < priv->num_ports; ++i) { in bcm6368_phy_is_external()
459 if (!priv->used_ports[i].used) in bcm6368_phy_is_external()
461 if (priv->used_ports[i].phy_id == phy_id) in bcm6368_phy_is_external()
471 struct bcm6368_eth_priv *priv = bus->priv; in bcm6368_mii_mdio_read()
480 struct bcm6368_eth_priv *priv = bus->priv; in bcm6368_mii_mdio_write()
493 return -ENOMEM; in bcm6368_mdio_init()
496 bus->read = bcm6368_mii_mdio_read; in bcm6368_mdio_init()
497 bus->write = bcm6368_mii_mdio_write; in bcm6368_mdio_init()
498 bus->priv = priv; in bcm6368_mdio_init()
499 snprintf(bus->name, sizeof(bus->name), "%s", name); in bcm6368_mdio_init()
512 priv->base = dev_remap_addr(dev); in bcm6368_eth_probe()
513 if (!priv->base) in bcm6368_eth_probe()
514 return -EINVAL; in bcm6368_eth_probe()
515 pdata->iobase = (phys_addr_t) priv->base; in bcm6368_eth_probe()
518 num_ports = dev_read_u32_default(dev, "brcm,num-ports", ETH_MAX_PORT); in bcm6368_eth_probe()
520 return -EINVAL; in bcm6368_eth_probe()
523 ret = dma_get_by_name(dev, "tx", &priv->tx_dma); in bcm6368_eth_probe()
525 return -EINVAL; in bcm6368_eth_probe()
527 ret = dma_get_by_name(dev, "rx", &priv->rx_dma); in bcm6368_eth_probe()
529 return -EINVAL; in bcm6368_eth_probe()
531 /* try to enable clocks */ in bcm6368_eth_probe()
576 priv->num_ports = num_ports; in bcm6368_eth_probe()
577 if (dev_read_bool(dev, "brcm,rgmii-override")) in bcm6368_eth_probe()
578 priv->rgmii_override = true; in bcm6368_eth_probe()
579 if (dev_read_bool(dev, "brcm,rgmii-timing")) in bcm6368_eth_probe()
580 priv->rgmii_timing = true; in bcm6368_eth_probe()
596 return -EINVAL; in bcm6368_eth_probe()
602 return -EINVAL; in bcm6368_eth_probe()
605 phy_id = ofnode_read_u32_default(node, "brcm,phy-id", -1); in bcm6368_eth_probe()
607 priv->used_ports[p].used = true; in bcm6368_eth_probe()
608 priv->used_ports[p].name = label; in bcm6368_eth_probe()
609 priv->used_ports[p].phy_id = phy_id; in bcm6368_eth_probe()
611 if (ofnode_read_bool(node, "full-duplex")) in bcm6368_eth_probe()
612 priv->used_ports[p].force_duplex_full = true; in bcm6368_eth_probe()
613 if (ofnode_read_bool(node, "bypass-link")) in bcm6368_eth_probe()
614 priv->used_ports[p].bypass_link = true; in bcm6368_eth_probe()
617 priv->used_ports[p].force_speed = speed; in bcm6368_eth_probe()
621 ret = bcm6368_mdio_init(dev->name, priv); in bcm6368_eth_probe()
625 /* enable jumbo on all ports */ in bcm6368_eth_probe()
626 writel_be(0x1ff, priv->base + ETH_JMBCTL_PORT_REG); in bcm6368_eth_probe()
627 writew_be(9728, priv->base + ETH_JMBCTL_MAXSIZE_REG); in bcm6368_eth_probe()