Lines Matching +full:rx +full:- +full:ctrl

2  * Copyright (C) 2005-2006 Atmel Corporation
4 * SPDX-License-Identifier: GPL-2.0+
11 * The u-boot networking stack is a little weird. It seems like the
16 * The MACB receives packets into 128-byte receive buffers, so the
21 * Therefore, define CONFIG_SYS_RX_ETH_BUFFER to 1 in the board-specific
22 * configuration header. This way, the core allocates one RX buffer
27 * 32-byte packet "alignment" (which really should be called
41 #include <asm/dma-mapping.h>
57 u32 ctrl; member
163 | MACB_BF(PHYA, macb->phy_addr) in macb_mdio_write()
190 | MACB_BF(PHYA, macb->phy_addr) in macb_mdio_read()
219 struct udevice *dev = eth_get_dev_by_name(bus->name); in macb_miiphy_read()
222 struct eth_device *dev = eth_get_dev_by_name(bus->name); in macb_miiphy_read()
226 if (macb->phy_addr != phy_adr) in macb_miiphy_read()
227 return -1; in macb_miiphy_read()
229 arch_get_mdio_control(bus->name); in macb_miiphy_read()
239 struct udevice *dev = eth_get_dev_by_name(bus->name); in macb_miiphy_write()
242 struct eth_device *dev = eth_get_dev_by_name(bus->name); in macb_miiphy_write()
246 if (macb->phy_addr != phy_adr) in macb_miiphy_write()
247 return -1; in macb_miiphy_write()
249 arch_get_mdio_control(bus->name); in macb_miiphy_write()
256 #define RX 1 macro
258 static inline void macb_invalidate_ring_desc(struct macb_device *macb, bool rx) in macb_invalidate_ring_desc() argument
260 if (rx) in macb_invalidate_ring_desc()
261 invalidate_dcache_range(macb->rx_ring_dma, in macb_invalidate_ring_desc()
262 ALIGN(macb->rx_ring_dma + MACB_RX_DMA_DESC_SIZE, in macb_invalidate_ring_desc()
265 invalidate_dcache_range(macb->tx_ring_dma, in macb_invalidate_ring_desc()
266 ALIGN(macb->tx_ring_dma + MACB_TX_DMA_DESC_SIZE, in macb_invalidate_ring_desc()
270 static inline void macb_flush_ring_desc(struct macb_device *macb, bool rx) in macb_flush_ring_desc() argument
272 if (rx) in macb_flush_ring_desc()
273 flush_dcache_range(macb->rx_ring_dma, macb->rx_ring_dma + in macb_flush_ring_desc()
276 flush_dcache_range(macb->tx_ring_dma, macb->tx_ring_dma + in macb_flush_ring_desc()
282 flush_dcache_range(macb->rx_buffer_dma, macb->rx_buffer_dma + in macb_flush_rx_buffer()
288 invalidate_dcache_range(macb->rx_buffer_dma, macb->rx_buffer_dma + in macb_invalidate_rx_buffer()
297 unsigned long paddr, ctrl; in _macb_send() local
298 unsigned int tx_head = macb->tx_head; in _macb_send()
303 ctrl = length & TXBUF_FRMLEN_MASK; in _macb_send()
304 ctrl |= TXBUF_FRAME_END; in _macb_send()
305 if (tx_head == (MACB_TX_RING_SIZE - 1)) { in _macb_send()
306 ctrl |= TXBUF_WRAP; in _macb_send()
307 macb->tx_head = 0; in _macb_send()
309 macb->tx_head++; in _macb_send()
312 macb->tx_ring[tx_head].ctrl = ctrl; in _macb_send()
313 macb->tx_ring[tx_head].addr = paddr; in _macb_send()
322 * re-use the transmit buffer as soon as we return... in _macb_send()
327 ctrl = macb->tx_ring[tx_head].ctrl; in _macb_send()
328 if (ctrl & TXBUF_USED) in _macb_send()
336 if (ctrl & TXBUF_UNDERRUN) in _macb_send()
338 if (ctrl & TXBUF_EXHAUSTED) in _macb_send()
353 i = macb->rx_tail; in reclaim_rx_buffers()
355 macb_invalidate_ring_desc(macb, RX); in reclaim_rx_buffers()
357 macb->rx_ring[i].addr &= ~RXADDR_USED; in reclaim_rx_buffers()
364 macb->rx_ring[i].addr &= ~RXADDR_USED; in reclaim_rx_buffers()
369 macb_flush_ring_desc(macb, RX); in reclaim_rx_buffers()
370 macb->rx_tail = new_tail; in reclaim_rx_buffers()
375 unsigned int next_rx_tail = macb->next_rx_tail; in _macb_recv()
380 macb->wrapped = false; in _macb_recv()
382 macb_invalidate_ring_desc(macb, RX); in _macb_recv()
384 if (!(macb->rx_ring[next_rx_tail].addr & RXADDR_USED)) in _macb_recv()
385 return -EAGAIN; in _macb_recv()
387 status = macb->rx_ring[next_rx_tail].ctrl; in _macb_recv()
389 if (next_rx_tail != macb->rx_tail) in _macb_recv()
391 macb->wrapped = false; in _macb_recv()
395 buffer = macb->rx_buffer + 128 * macb->rx_tail; in _macb_recv()
399 if (macb->wrapped) { in _macb_recv()
403 - macb->rx_tail); in _macb_recv()
404 taillen = length - headlen; in _macb_recv()
408 macb->rx_buffer, taillen); in _macb_recv()
416 macb->next_rx_tail = next_rx_tail; in _macb_recv()
420 macb->wrapped = true; in _macb_recv()
460 macb->phy_addr = i; in macb_phy_find()
489 /* Auto-detect phy_addr */ in macb_phy_init()
502 macb->phydev = phy_connect(macb->bus, macb->phy_addr, dev, in macb_phy_init()
503 macb->phy_interface); in macb_phy_init()
506 macb->phydev = phy_connect(macb->bus, macb->phy_addr, &macb->netdev, in macb_phy_init()
509 if (!macb->phydev) { in macb_phy_init()
511 return -ENODEV; in macb_phy_init()
514 phy_config(macb->phydev); in macb_phy_init()
519 /* Try to re-negotiate if we don't have link already. */ in macb_phy_init()
543 printf("%s: link up, 1000Mbps %s-duplex (lpa: 0x%04x)\n", in macb_phy_init()
568 printf("%s: link up, %sMbps %s-duplex (lpa: 0x%04x)\n", in macb_phy_init()
598 macb->dummy_desc->ctrl = TXBUF_USED; in gmac_init_multi_queues()
599 macb->dummy_desc->addr = 0; in gmac_init_multi_queues()
600 flush_dcache_range(macb->dummy_desc_dma, macb->dummy_desc_dma + in gmac_init_multi_queues()
604 gem_writel_queue_TBQP(macb, macb->dummy_desc_dma, i - 1); in gmac_init_multi_queues()
627 paddr = macb->rx_buffer_dma; in _macb_init()
629 if (i == (MACB_RX_RING_SIZE - 1)) in _macb_init()
631 macb->rx_ring[i].addr = paddr; in _macb_init()
632 macb->rx_ring[i].ctrl = 0; in _macb_init()
635 macb_flush_ring_desc(macb, RX); in _macb_init()
639 macb->tx_ring[i].addr = 0; in _macb_init()
640 if (i == (MACB_TX_RING_SIZE - 1)) in _macb_init()
641 macb->tx_ring[i].ctrl = TXBUF_USED | TXBUF_WRAP; in _macb_init()
643 macb->tx_ring[i].ctrl = TXBUF_USED; in _macb_init()
647 macb->rx_tail = 0; in _macb_init()
648 macb->tx_head = 0; in _macb_init()
649 macb->tx_tail = 0; in _macb_init()
650 macb->next_rx_tail = 0; in _macb_init()
652 macb_writel(macb, RBQP, macb->rx_ring_dma); in _macb_init()
653 macb_writel(macb, TBQP, macb->tx_ring_dma); in _macb_init()
666 if ((macb->phy_interface == PHY_INTERFACE_MODE_RMII) || in _macb_init()
667 (macb->phy_interface == PHY_INTERFACE_MODE_RGMII)) in _macb_init()
682 if (macb->phy_interface == PHY_INTERFACE_MODE_RMII) { in _macb_init()
689 if (macb->phy_interface == PHY_INTERFACE_MODE_RMII) in _macb_init()
716 return -1; in _macb_init()
718 /* Enable TX and RX */ in _macb_init()
737 /* Disable TX and RX, and clear statistics */ in _macb_halt()
759 unsigned long macb_hz = macb->pclk_rate; in macb_mdc_clk_div()
781 unsigned long macb_hz = macb->pclk_rate; in gem_mdc_clk_div()
825 /* TODO: we need check the rx/tx_ring_dma is dcache line aligned */ in _macb_eth_initialize()
826 macb->rx_buffer = dma_alloc_coherent(MACB_RX_BUFFER_SIZE, in _macb_eth_initialize()
827 &macb->rx_buffer_dma); in _macb_eth_initialize()
828 macb->rx_ring = dma_alloc_coherent(MACB_RX_DMA_DESC_SIZE, in _macb_eth_initialize()
829 &macb->rx_ring_dma); in _macb_eth_initialize()
830 macb->tx_ring = dma_alloc_coherent(MACB_TX_DMA_DESC_SIZE, in _macb_eth_initialize()
831 &macb->tx_ring_dma); in _macb_eth_initialize()
832 macb->dummy_desc = dma_alloc_coherent(MACB_TX_DUMMY_DMA_DESC_SIZE, in _macb_eth_initialize()
833 &macb->dummy_desc_dma); in _macb_eth_initialize()
854 return _macb_send(macb, netdev->name, packet, length); in macb_send()
863 macb->wrapped = false; in macb_recv()
865 macb->next_rx_tail = macb->rx_tail; in macb_recv()
869 reclaim_rx_buffers(macb, macb->next_rx_tail); in macb_recv()
880 return _macb_init(macb, netdev->name); in macb_init()
894 return _macb_write_hwaddr(macb, netdev->enetaddr); in macb_write_hwaddr()
905 return -1; in macb_eth_initialize()
909 netdev = &macb->netdev; in macb_eth_initialize()
911 macb->regs = regs; in macb_eth_initialize()
912 macb->phy_addr = phy_addr; in macb_eth_initialize()
915 sprintf(netdev->name, "gmac%d", id); in macb_eth_initialize()
917 sprintf(netdev->name, "macb%d", id); in macb_eth_initialize()
919 netdev->init = macb_init; in macb_eth_initialize()
920 netdev->halt = macb_halt; in macb_eth_initialize()
921 netdev->send = macb_send; in macb_eth_initialize()
922 netdev->recv = macb_recv; in macb_eth_initialize()
923 netdev->write_hwaddr = macb_write_hwaddr; in macb_eth_initialize()
933 return -ENOMEM; in macb_eth_initialize()
934 strncpy(mdiodev->name, netdev->name, MDIO_NAME_LEN); in macb_eth_initialize()
935 mdiodev->read = macb_miiphy_read; in macb_eth_initialize()
936 mdiodev->write = macb_miiphy_write; in macb_eth_initialize()
941 macb->bus = miiphy_get_dev_by_name(netdev->name); in macb_eth_initialize()
951 return _macb_init(dev, dev->name); in macb_start()
958 return _macb_send(macb, dev->name, packet, length); in macb_send()
965 macb->next_rx_tail = macb->rx_tail; in macb_recv()
966 macb->wrapped = false; in macb_recv()
975 reclaim_rx_buffers(macb, macb->next_rx_tail); in macb_free_pkt()
992 return _macb_write_hwaddr(macb, plat->enetaddr); in macb_write_hwaddr()
1014 return -EINVAL; in macb_enable_clk()
1022 return -EINVAL; in macb_enable_clk()
1024 macb->pclk_rate = clk_rate; in macb_enable_clk()
1037 phy_mode = fdt_getprop(gd->fdt_blob, dev_of_offset(dev), "phy-mode", in macb_eth_probe()
1040 macb->phy_interface = phy_get_interface_by_name(phy_mode); in macb_eth_probe()
1041 if (macb->phy_interface == -1) { in macb_eth_probe()
1043 return -EINVAL; in macb_eth_probe()
1046 macb->regs = (void *)pdata->iobase; in macb_eth_probe()
1057 macb->bus = mdio_alloc(); in macb_eth_probe()
1058 if (!macb->bus) in macb_eth_probe()
1059 return -ENOMEM; in macb_eth_probe()
1060 strncpy(macb->bus->name, dev->name, MDIO_NAME_LEN); in macb_eth_probe()
1061 macb->bus->read = macb_miiphy_read; in macb_eth_probe()
1062 macb->bus->write = macb_miiphy_write; in macb_eth_probe()
1064 ret = mdio_register(macb->bus); in macb_eth_probe()
1067 macb->bus = miiphy_get_dev_by_name(dev->name); in macb_eth_probe()
1078 free(macb->phydev); in macb_eth_remove()
1080 mdio_unregister(macb->bus); in macb_eth_remove()
1081 mdio_free(macb->bus); in macb_eth_remove()
1090 pdata->iobase = devfdt_get_addr(dev); in macb_eth_ofdata_to_platdata()
1096 { .compatible = "cdns,at91sam9260-macb" },
1097 { .compatible = "atmel,sama5d2-gem" },
1098 { .compatible = "atmel,sama5d3-gem" },
1099 { .compatible = "atmel,sama5d4-gem" },