Lines Matching refs:macb

129 static int macb_is_gem(struct macb_device *macb)  in macb_is_gem()  argument
131 return MACB_BFEXT(IDNUM, macb_readl(macb, MID)) == 0x2; in macb_is_gem()
142 static int gem_is_gigabit_capable(struct macb_device *macb) in gem_is_gigabit_capable() argument
148 return macb_is_gem(macb) && !cpu_is_sama5d2() && !cpu_is_sama5d4(); in gem_is_gigabit_capable()
151 static void macb_mdio_write(struct macb_device *macb, u8 reg, u16 value) in macb_mdio_write() argument
157 netctl = macb_readl(macb, NCR); in macb_mdio_write()
159 macb_writel(macb, NCR, netctl); in macb_mdio_write()
163 | MACB_BF(PHYA, macb->phy_addr) in macb_mdio_write()
167 macb_writel(macb, MAN, frame); in macb_mdio_write()
170 netstat = macb_readl(macb, NSR); in macb_mdio_write()
173 netctl = macb_readl(macb, NCR); in macb_mdio_write()
175 macb_writel(macb, NCR, netctl); in macb_mdio_write()
178 static u16 macb_mdio_read(struct macb_device *macb, u8 reg) in macb_mdio_read() argument
184 netctl = macb_readl(macb, NCR); in macb_mdio_read()
186 macb_writel(macb, NCR, netctl); in macb_mdio_read()
190 | MACB_BF(PHYA, macb->phy_addr) in macb_mdio_read()
193 macb_writel(macb, MAN, frame); in macb_mdio_read()
196 netstat = macb_readl(macb, NSR); in macb_mdio_read()
199 frame = macb_readl(macb, MAN); in macb_mdio_read()
201 netctl = macb_readl(macb, NCR); in macb_mdio_read()
203 macb_writel(macb, NCR, netctl); in macb_mdio_read()
220 struct macb_device *macb = dev_get_priv(dev); in macb_miiphy_read() local
223 struct macb_device *macb = to_macb(dev); in macb_miiphy_read() local
226 if (macb->phy_addr != phy_adr) in macb_miiphy_read()
230 value = macb_mdio_read(macb, reg); in macb_miiphy_read()
240 struct macb_device *macb = dev_get_priv(dev); in macb_miiphy_write() local
243 struct macb_device *macb = to_macb(dev); in macb_miiphy_write()
246 if (macb->phy_addr != phy_adr) in macb_miiphy_write()
250 macb_mdio_write(macb, reg, value); in macb_miiphy_write()
258 static inline void macb_invalidate_ring_desc(struct macb_device *macb, bool rx) in macb_invalidate_ring_desc() argument
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
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()
280 static inline void macb_flush_rx_buffer(struct macb_device *macb) in macb_flush_rx_buffer() argument
282 flush_dcache_range(macb->rx_buffer_dma, macb->rx_buffer_dma + in macb_flush_rx_buffer()
286 static inline void macb_invalidate_rx_buffer(struct macb_device *macb) in macb_invalidate_rx_buffer() argument
288 invalidate_dcache_range(macb->rx_buffer_dma, macb->rx_buffer_dma + in macb_invalidate_rx_buffer()
294 static int _macb_send(struct macb_device *macb, const char *name, void *packet, in _macb_send() argument
298 unsigned int tx_head = macb->tx_head; 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()
315 macb_flush_ring_desc(macb, TX); in _macb_send()
318 macb_writel(macb, NCR, MACB_BIT(TE) | MACB_BIT(RE) | MACB_BIT(TSTART)); in _macb_send()
326 macb_invalidate_ring_desc(macb, TX); in _macb_send()
327 ctrl = macb->tx_ring[tx_head].ctrl; in _macb_send()
348 static void reclaim_rx_buffers(struct macb_device *macb, in reclaim_rx_buffers() argument
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()
373 static int _macb_recv(struct macb_device *macb, uchar **packetp) in _macb_recv() argument
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()
387 status = macb->rx_ring[next_rx_tail].ctrl; in _macb_recv()
389 if (next_rx_tail != macb->rx_tail) in _macb_recv()
390 reclaim_rx_buffers(macb, next_rx_tail); in _macb_recv()
391 macb->wrapped = false; in _macb_recv()
395 buffer = macb->rx_buffer + 128 * macb->rx_tail; in _macb_recv()
398 macb_invalidate_rx_buffer(macb); in _macb_recv()
399 if (macb->wrapped) { in _macb_recv()
403 - macb->rx_tail); 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()
428 static void macb_phy_reset(struct macb_device *macb, const char *name) in macb_phy_reset() argument
434 macb_mdio_write(macb, MII_ADVERTISE, adv); in macb_phy_reset()
436 macb_mdio_write(macb, MII_BMCR, (BMCR_ANENABLE in macb_phy_reset()
440 status = macb_mdio_read(macb, MII_BMSR); in macb_phy_reset()
453 static int macb_phy_find(struct macb_device *macb, const char *name) in macb_phy_find() argument
460 macb->phy_addr = i; in macb_phy_find()
461 phy_id = macb_mdio_read(macb, MII_PHYSID1); in macb_phy_find()
477 static int macb_phy_init(struct macb_device *macb, const char *name) in macb_phy_init()
481 struct macb_device *macb = dev_get_priv(dev); in macb_phy_init() local
490 if (!macb_phy_find(macb, name)) in macb_phy_init()
494 phy_id = macb_mdio_read(macb, MII_PHYSID1); 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()
514 phy_config(macb->phydev); in macb_phy_init()
517 status = macb_mdio_read(macb, MII_BMSR); in macb_phy_init()
520 macb_phy_reset(macb, name); in macb_phy_init()
523 status = macb_mdio_read(macb, MII_BMSR); in macb_phy_init()
537 if (gem_is_gigabit_capable(macb)) { in macb_phy_init()
538 lpa = macb_mdio_read(macb, MII_STAT1000); in macb_phy_init()
548 ncfgr = macb_readl(macb, NCFGR); in macb_phy_init()
555 macb_writel(macb, NCFGR, ncfgr); in macb_phy_init()
562 adv = macb_mdio_read(macb, MII_ADVERTISE); in macb_phy_init()
563 lpa = macb_mdio_read(macb, MII_LPA); in macb_phy_init()
574 ncfgr = macb_readl(macb, NCFGR); in macb_phy_init()
580 macb_writel(macb, NCFGR, ncfgr); in macb_phy_init()
585 static int gmac_init_multi_queues(struct macb_device *macb) in gmac_init_multi_queues() argument
591 queue_mask = gem_readl(macb, DCFG6) & 0xff; in gmac_init_multi_queues()
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()
612 static int _macb_init(struct macb_device *macb, const char *name) in _macb_init()
616 struct macb_device *macb = dev_get_priv(dev); in _macb_init() local
627 paddr = macb->rx_buffer_dma; 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()
636 macb_flush_rx_buffer(macb); in _macb_init()
639 macb->tx_ring[i].addr = 0; 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()
645 macb_flush_ring_desc(macb, TX); 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()
655 if (macb_is_gem(macb)) { in _macb_init()
657 gmac_init_multi_queues(macb); 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()
668 gem_writel(macb, UR, GEM_BIT(RGMII)); in _macb_init()
670 gem_writel(macb, UR, 0); in _macb_init()
673 gem_writel(macb, UR, GEM_BIT(RGMII)); in _macb_init()
675 gem_writel(macb, UR, 0); in _macb_init()
682 if (macb->phy_interface == PHY_INTERFACE_MODE_RMII) { in _macb_init()
683 macb_writel(macb, USRIO, in _macb_init()
686 macb_writel(macb, USRIO, MACB_BIT(CLKEN)); in _macb_init()
689 if (macb->phy_interface == PHY_INTERFACE_MODE_RMII) in _macb_init()
690 macb_writel(macb, USRIO, 0); in _macb_init()
692 macb_writel(macb, USRIO, MACB_BIT(MII)); in _macb_init()
697 macb_writel(macb, USRIO, MACB_BIT(RMII) | MACB_BIT(CLKEN)); in _macb_init()
699 macb_writel(macb, USRIO, 0); in _macb_init()
703 macb_writel(macb, USRIO, MACB_BIT(CLKEN)); in _macb_init()
705 macb_writel(macb, USRIO, MACB_BIT(MII)); in _macb_init()
714 if (!macb_phy_init(macb, name)) in _macb_init()
719 macb_writel(macb, NCR, MACB_BIT(TE) | MACB_BIT(RE)); in _macb_init()
724 static void _macb_halt(struct macb_device *macb) in _macb_halt() argument
729 ncr = macb_readl(macb, NCR); in _macb_halt()
731 macb_writel(macb, NCR, ncr); in _macb_halt()
734 tsr = macb_readl(macb, TSR); in _macb_halt()
738 macb_writel(macb, NCR, MACB_BIT(CLRSTAT)); in _macb_halt()
741 static int _macb_write_hwaddr(struct macb_device *macb, unsigned char *enetaddr) in _macb_write_hwaddr() argument
749 macb_writel(macb, SA1B, hwaddr_bottom); in _macb_write_hwaddr()
751 macb_writel(macb, SA1T, hwaddr_top); in _macb_write_hwaddr()
755 static u32 macb_mdc_clk_div(int id, struct macb_device *macb) in macb_mdc_clk_div() argument
759 unsigned long macb_hz = macb->pclk_rate; in macb_mdc_clk_div()
776 static u32 gem_mdc_clk_div(int id, struct macb_device *macb) in gem_mdc_clk_div() argument
781 unsigned long macb_hz = macb->pclk_rate; in gem_mdc_clk_div()
807 static u32 macb_dbw(struct macb_device *macb) in macb_dbw() argument
809 switch (GEM_BFEXT(DBWDEF, gem_readl(macb, DCFG1))) { in macb_dbw()
820 static void _macb_eth_initialize(struct macb_device *macb) in _macb_eth_initialize() argument
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()
839 if (macb_is_gem(macb)) { in _macb_eth_initialize()
840 ncfgr = gem_mdc_clk_div(id, macb); in _macb_eth_initialize()
841 ncfgr |= macb_dbw(macb); in _macb_eth_initialize()
843 ncfgr = macb_mdc_clk_div(id, macb); in _macb_eth_initialize()
846 macb_writel(macb, NCFGR, ncfgr); in _macb_eth_initialize()
852 struct macb_device *macb = to_macb(netdev); in macb_send() local
854 return _macb_send(macb, netdev->name, packet, length); in macb_send()
859 struct macb_device *macb = to_macb(netdev); in macb_recv() local
863 macb->wrapped = false; in macb_recv()
865 macb->next_rx_tail = macb->rx_tail; in macb_recv()
866 length = _macb_recv(macb, &packet); in macb_recv()
869 reclaim_rx_buffers(macb, macb->next_rx_tail); in macb_recv()
878 struct macb_device *macb = to_macb(netdev); in macb_init() local
880 return _macb_init(macb, netdev->name); in macb_init()
885 struct macb_device *macb = to_macb(netdev); in macb_halt() local
887 return _macb_halt(macb); in macb_halt()
892 struct macb_device *macb = to_macb(netdev); in macb_write_hwaddr() local
894 return _macb_write_hwaddr(macb, netdev->enetaddr); in macb_write_hwaddr()
899 struct macb_device *macb; in macb_eth_initialize() local
902 macb = malloc(sizeof(struct macb_device)); in macb_eth_initialize()
903 if (!macb) { in macb_eth_initialize()
907 memset(macb, 0, sizeof(struct macb_device)); 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()
914 if (macb_is_gem(macb)) in macb_eth_initialize()
925 _macb_eth_initialize(macb); in macb_eth_initialize()
941 macb->bus = miiphy_get_dev_by_name(netdev->name); in macb_eth_initialize()
956 struct macb_device *macb = dev_get_priv(dev); in macb_send() local
958 return _macb_send(macb, dev->name, packet, length); in macb_send()
963 struct macb_device *macb = dev_get_priv(dev); in macb_recv() local
965 macb->next_rx_tail = macb->rx_tail; in macb_recv()
966 macb->wrapped = false; in macb_recv()
968 return _macb_recv(macb, packetp); in macb_recv()
973 struct macb_device *macb = dev_get_priv(dev); in macb_free_pkt() local
975 reclaim_rx_buffers(macb, macb->next_rx_tail); in macb_free_pkt()
982 struct macb_device *macb = dev_get_priv(dev); in macb_stop() local
984 _macb_halt(macb); in macb_stop()
990 struct macb_device *macb = dev_get_priv(dev); in macb_write_hwaddr() local
992 return _macb_write_hwaddr(macb, plat->enetaddr); in macb_write_hwaddr()
1007 struct macb_device *macb = dev_get_priv(dev); in macb_enable_clk() local
1024 macb->pclk_rate = clk_rate; in macb_enable_clk()
1033 struct macb_device *macb = dev_get_priv(dev); in macb_eth_probe() local
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()
1046 macb->regs = (void *)pdata->iobase; in macb_eth_probe()
1054 _macb_eth_initialize(macb); in macb_eth_probe()
1057 macb->bus = mdio_alloc(); in macb_eth_probe()
1058 if (!macb->bus) 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()
1075 struct macb_device *macb = dev_get_priv(dev); in macb_eth_remove() local
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()