Lines Matching +full:rx +full:- +full:ctrl
1 // SPDX-License-Identifier: GPL-2.0+
3 * Copyright (C) 2005-2006 Atmel Corporation
10 * The u-boot networking stack is a little weird. It seems like the
15 * The MACB receives packets into 128-byte receive buffers, so the
20 * Therefore, define CONFIG_SYS_RX_ETH_BUFFER to 1 in the board-specific
21 * configuration header. This way, the core allocates one RX buffer
26 * 32-byte packet "alignment" (which really should be called
40 #include <asm/dma-mapping.h>
72 u32 ctrl; member
178 | MACB_BF(PHYA, macb->phy_addr) in macb_mdio_write()
205 | MACB_BF(PHYA, macb->phy_addr) in macb_mdio_read()
234 struct udevice *dev = eth_get_dev_by_name(bus->name); in macb_miiphy_read()
237 struct eth_device *dev = eth_get_dev_by_name(bus->name); in macb_miiphy_read()
241 if (macb->phy_addr != phy_adr) in macb_miiphy_read()
242 return -1; in macb_miiphy_read()
244 arch_get_mdio_control(bus->name); in macb_miiphy_read()
254 struct udevice *dev = eth_get_dev_by_name(bus->name); in macb_miiphy_write()
257 struct eth_device *dev = eth_get_dev_by_name(bus->name); in macb_miiphy_write()
261 if (macb->phy_addr != phy_adr) in macb_miiphy_write()
262 return -1; in macb_miiphy_write()
264 arch_get_mdio_control(bus->name); in macb_miiphy_write()
271 #define RX 1 macro
273 static inline void macb_invalidate_ring_desc(struct macb_device *macb, bool rx) in macb_invalidate_ring_desc() argument
275 if (rx) in macb_invalidate_ring_desc()
276 invalidate_dcache_range(macb->rx_ring_dma, in macb_invalidate_ring_desc()
277 ALIGN(macb->rx_ring_dma + MACB_RX_DMA_DESC_SIZE, in macb_invalidate_ring_desc()
280 invalidate_dcache_range(macb->tx_ring_dma, in macb_invalidate_ring_desc()
281 ALIGN(macb->tx_ring_dma + MACB_TX_DMA_DESC_SIZE, in macb_invalidate_ring_desc()
285 static inline void macb_flush_ring_desc(struct macb_device *macb, bool rx) in macb_flush_ring_desc() argument
287 if (rx) in macb_flush_ring_desc()
288 flush_dcache_range(macb->rx_ring_dma, macb->rx_ring_dma + in macb_flush_ring_desc()
291 flush_dcache_range(macb->tx_ring_dma, macb->tx_ring_dma + in macb_flush_ring_desc()
297 flush_dcache_range(macb->rx_buffer_dma, macb->rx_buffer_dma + in macb_flush_rx_buffer()
303 invalidate_dcache_range(macb->rx_buffer_dma, macb->rx_buffer_dma + in macb_invalidate_rx_buffer()
312 unsigned long paddr, ctrl; in _macb_send() local
313 unsigned int tx_head = macb->tx_head; in _macb_send()
318 ctrl = length & TXBUF_FRMLEN_MASK; in _macb_send()
319 ctrl |= TXBUF_FRAME_END; in _macb_send()
320 if (tx_head == (MACB_TX_RING_SIZE - 1)) { in _macb_send()
321 ctrl |= TXBUF_WRAP; in _macb_send()
322 macb->tx_head = 0; in _macb_send()
324 macb->tx_head++; in _macb_send()
327 macb->tx_ring[tx_head].ctrl = ctrl; in _macb_send()
328 macb->tx_ring[tx_head].addr = paddr; in _macb_send()
337 * re-use the transmit buffer as soon as we return... in _macb_send()
342 ctrl = macb->tx_ring[tx_head].ctrl; in _macb_send()
343 if (ctrl & TXBUF_USED) in _macb_send()
351 if (ctrl & TXBUF_UNDERRUN) in _macb_send()
353 if (ctrl & TXBUF_EXHAUSTED) in _macb_send()
368 i = macb->rx_tail; in reclaim_rx_buffers()
370 macb_invalidate_ring_desc(macb, RX); in reclaim_rx_buffers()
372 macb->rx_ring[i].addr &= ~RXADDR_USED; in reclaim_rx_buffers()
379 macb->rx_ring[i].addr &= ~RXADDR_USED; in reclaim_rx_buffers()
384 macb_flush_ring_desc(macb, RX); in reclaim_rx_buffers()
385 macb->rx_tail = new_tail; in reclaim_rx_buffers()
390 unsigned int next_rx_tail = macb->next_rx_tail; in _macb_recv()
395 macb->wrapped = false; in _macb_recv()
397 macb_invalidate_ring_desc(macb, RX); in _macb_recv()
399 if (!(macb->rx_ring[next_rx_tail].addr & RXADDR_USED)) in _macb_recv()
400 return -EAGAIN; in _macb_recv()
402 status = macb->rx_ring[next_rx_tail].ctrl; in _macb_recv()
404 if (next_rx_tail != macb->rx_tail) in _macb_recv()
406 macb->wrapped = false; in _macb_recv()
410 buffer = macb->rx_buffer + 128 * macb->rx_tail; in _macb_recv()
414 if (macb->wrapped) { in _macb_recv()
418 - macb->rx_tail); in _macb_recv()
419 taillen = length - headlen; in _macb_recv()
423 macb->rx_buffer, taillen); in _macb_recv()
431 macb->next_rx_tail = next_rx_tail; in _macb_recv()
435 macb->wrapped = true; in _macb_recv()
475 macb->phy_addr = i; in macb_phy_find()
486 return -ENODEV; in macb_phy_find()
490 * macb_linkspd_cb - Linkspeed change callback function
517 /* Auto-detect phy_addr */ in macb_phy_init()
526 return -ENODEV; in macb_phy_init()
531 macb->phydev = phy_connect(macb->bus, macb->phy_addr, dev, in macb_phy_init()
532 macb->phy_interface); in macb_phy_init()
535 macb->phydev = phy_connect(macb->bus, macb->phy_addr, &macb->netdev, in macb_phy_init()
538 if (!macb->phydev) { in macb_phy_init()
540 return -ENODEV; in macb_phy_init()
543 phy_config(macb->phydev); in macb_phy_init()
548 /* Try to re-negotiate if we don't have link already. */ in macb_phy_init()
562 return -ENETDOWN; in macb_phy_init()
572 printf("%s: link up, 1000Mbps %s-duplex (lpa: 0x%04x)\n", in macb_phy_init()
586 ret = macb_linkspd_cb(macb->regs, _1000BASET); in macb_phy_init()
601 printf("%s: link up, %sMbps %s-duplex (lpa: 0x%04x)\n", in macb_phy_init()
611 ret = macb_linkspd_cb(macb->regs, _100BASET); in macb_phy_init()
613 ret = macb_linkspd_cb(macb->regs, _10BASET); in macb_phy_init()
639 macb->dummy_desc->ctrl = TXBUF_USED; in gmac_init_multi_queues()
640 macb->dummy_desc->addr = 0; in gmac_init_multi_queues()
641 flush_dcache_range(macb->dummy_desc_dma, macb->dummy_desc_dma + in gmac_init_multi_queues()
645 gem_writel_queue_TBQP(macb, macb->dummy_desc_dma, i - 1); in gmac_init_multi_queues()
669 paddr = macb->rx_buffer_dma; in _macb_init()
671 if (i == (MACB_RX_RING_SIZE - 1)) in _macb_init()
673 macb->rx_ring[i].addr = paddr; in _macb_init()
674 macb->rx_ring[i].ctrl = 0; in _macb_init()
677 macb_flush_ring_desc(macb, RX); in _macb_init()
681 macb->tx_ring[i].addr = 0; in _macb_init()
682 if (i == (MACB_TX_RING_SIZE - 1)) in _macb_init()
683 macb->tx_ring[i].ctrl = TXBUF_USED | TXBUF_WRAP; in _macb_init()
685 macb->tx_ring[i].ctrl = TXBUF_USED; in _macb_init()
689 macb->rx_tail = 0; in _macb_init()
690 macb->tx_head = 0; in _macb_init()
691 macb->tx_tail = 0; in _macb_init()
692 macb->next_rx_tail = 0; in _macb_init()
698 macb_writel(macb, RBQP, macb->rx_ring_dma); in _macb_init()
699 macb_writel(macb, TBQP, macb->tx_ring_dma); in _macb_init()
712 if ((macb->phy_interface == PHY_INTERFACE_MODE_RMII) || in _macb_init()
713 (macb->phy_interface == PHY_INTERFACE_MODE_RGMII)) in _macb_init()
728 if (macb->phy_interface == PHY_INTERFACE_MODE_RMII) { in _macb_init()
735 if (macb->phy_interface == PHY_INTERFACE_MODE_RMII) in _macb_init()
765 /* Enable TX and RX */ in _macb_init()
784 /* Disable TX and RX, and clear statistics */ in _macb_halt()
806 unsigned long macb_hz = macb->pclk_rate; in macb_mdc_clk_div()
828 unsigned long macb_hz = macb->pclk_rate; in gem_mdc_clk_div()
872 /* TODO: we need check the rx/tx_ring_dma is dcache line aligned */ in _macb_eth_initialize()
873 macb->rx_buffer = dma_alloc_coherent(MACB_RX_BUFFER_SIZE, in _macb_eth_initialize()
874 &macb->rx_buffer_dma); in _macb_eth_initialize()
875 macb->rx_ring = dma_alloc_coherent(MACB_RX_DMA_DESC_SIZE, in _macb_eth_initialize()
876 &macb->rx_ring_dma); in _macb_eth_initialize()
877 macb->tx_ring = dma_alloc_coherent(MACB_TX_DMA_DESC_SIZE, in _macb_eth_initialize()
878 &macb->tx_ring_dma); in _macb_eth_initialize()
879 macb->dummy_desc = dma_alloc_coherent(MACB_TX_DUMMY_DMA_DESC_SIZE, in _macb_eth_initialize()
880 &macb->dummy_desc_dma); in _macb_eth_initialize()
901 return _macb_send(macb, netdev->name, packet, length); in macb_send()
910 macb->wrapped = false; in macb_recv()
912 macb->next_rx_tail = macb->rx_tail; in macb_recv()
916 reclaim_rx_buffers(macb, macb->next_rx_tail); in macb_recv()
927 return _macb_init(macb, netdev->name); in macb_init()
941 return _macb_write_hwaddr(macb, netdev->enetaddr); in macb_write_hwaddr()
952 return -1; in macb_eth_initialize()
956 netdev = &macb->netdev; in macb_eth_initialize()
958 macb->regs = regs; in macb_eth_initialize()
959 macb->phy_addr = phy_addr; in macb_eth_initialize()
962 sprintf(netdev->name, "gmac%d", id); in macb_eth_initialize()
964 sprintf(netdev->name, "macb%d", id); in macb_eth_initialize()
966 netdev->init = macb_init; in macb_eth_initialize()
967 netdev->halt = macb_halt; in macb_eth_initialize()
968 netdev->send = macb_send; in macb_eth_initialize()
969 netdev->recv = macb_recv; in macb_eth_initialize()
970 netdev->write_hwaddr = macb_write_hwaddr; in macb_eth_initialize()
980 return -ENOMEM; in macb_eth_initialize()
981 strncpy(mdiodev->name, netdev->name, MDIO_NAME_LEN); in macb_eth_initialize()
982 mdiodev->read = macb_miiphy_read; in macb_eth_initialize()
983 mdiodev->write = macb_miiphy_write; in macb_eth_initialize()
988 macb->bus = miiphy_get_dev_by_name(netdev->name); in macb_eth_initialize()
998 return _macb_init(dev, dev->name); in macb_start()
1005 return _macb_send(macb, dev->name, packet, length); in macb_send()
1012 macb->next_rx_tail = macb->rx_tail; in macb_recv()
1013 macb->wrapped = false; in macb_recv()
1022 reclaim_rx_buffers(macb, macb->next_rx_tail); in macb_free_pkt()
1039 return _macb_write_hwaddr(macb, plat->enetaddr); in macb_write_hwaddr()
1061 return -EINVAL; in macb_enable_clk()
1065 * we get -ENOSYS from clk_enable(). To handle this, we in macb_enable_clk()
1066 * don't fail for ret == -ENOSYS. in macb_enable_clk()
1069 if (ret && ret != -ENOSYS) in macb_enable_clk()
1074 return -EINVAL; in macb_enable_clk()
1076 macb->pclk_rate = clk_rate; in macb_enable_clk()
1089 phy_mode = fdt_getprop(gd->fdt_blob, dev_of_offset(dev), "phy-mode", in macb_eth_probe()
1092 macb->phy_interface = phy_get_interface_by_name(phy_mode); in macb_eth_probe()
1093 if (macb->phy_interface == -1) { in macb_eth_probe()
1095 return -EINVAL; in macb_eth_probe()
1098 macb->regs = (void *)pdata->iobase; in macb_eth_probe()
1109 macb->bus = mdio_alloc(); in macb_eth_probe()
1110 if (!macb->bus) in macb_eth_probe()
1111 return -ENOMEM; in macb_eth_probe()
1112 strncpy(macb->bus->name, dev->name, MDIO_NAME_LEN); in macb_eth_probe()
1113 macb->bus->read = macb_miiphy_read; in macb_eth_probe()
1114 macb->bus->write = macb_miiphy_write; in macb_eth_probe()
1116 ret = mdio_register(macb->bus); in macb_eth_probe()
1119 macb->bus = miiphy_get_dev_by_name(dev->name); in macb_eth_probe()
1130 free(macb->phydev); in macb_eth_remove()
1132 mdio_unregister(macb->bus); in macb_eth_remove()
1133 mdio_free(macb->bus); in macb_eth_remove()
1153 pdata->iobase = (phys_addr_t)dev_remap_addr(dev); in macb_eth_ofdata_to_platdata()
1154 if (!pdata->iobase) in macb_eth_ofdata_to_platdata()
1155 return -EINVAL; in macb_eth_ofdata_to_platdata()
1162 { .compatible = "cdns,at91sam9260-macb" },
1163 { .compatible = "atmel,sama5d2-gem" },
1164 { .compatible = "atmel,sama5d3-gem" },
1165 { .compatible = "atmel,sama5d4-gem" },
1166 { .compatible = "cdns,zynq-gem" },