Lines Matching refs:bp
95 static struct macb_dma_desc *macb_rx_desc(struct macb *bp, unsigned int index) in macb_rx_desc() argument
97 return &bp->rx_ring[macb_rx_ring_wrap(index)]; in macb_rx_desc()
100 static void *macb_rx_buffer(struct macb *bp, unsigned int index) in macb_rx_buffer() argument
102 return bp->rx_buffers + bp->rx_buffer_size * macb_rx_ring_wrap(index); in macb_rx_buffer()
105 static void macb_set_hwaddr(struct macb *bp) in macb_set_hwaddr() argument
110 bottom = cpu_to_le32(*((u32 *)bp->dev->dev_addr)); in macb_set_hwaddr()
111 macb_or_gem_writel(bp, SA1B, bottom); in macb_set_hwaddr()
112 top = cpu_to_le16(*((u16 *)(bp->dev->dev_addr + 4))); in macb_set_hwaddr()
113 macb_or_gem_writel(bp, SA1T, top); in macb_set_hwaddr()
116 macb_or_gem_writel(bp, SA2B, 0); in macb_set_hwaddr()
117 macb_or_gem_writel(bp, SA2T, 0); in macb_set_hwaddr()
118 macb_or_gem_writel(bp, SA3B, 0); in macb_set_hwaddr()
119 macb_or_gem_writel(bp, SA3T, 0); in macb_set_hwaddr()
120 macb_or_gem_writel(bp, SA4B, 0); in macb_set_hwaddr()
121 macb_or_gem_writel(bp, SA4T, 0); in macb_set_hwaddr()
124 static void macb_get_hwaddr(struct macb *bp) in macb_get_hwaddr() argument
132 pdata = dev_get_platdata(&bp->pdev->dev); in macb_get_hwaddr()
136 bottom = macb_or_gem_readl(bp, SA1B + i * 8); in macb_get_hwaddr()
137 top = macb_or_gem_readl(bp, SA1T + i * 8); in macb_get_hwaddr()
156 memcpy(bp->dev->dev_addr, addr, sizeof(addr)); in macb_get_hwaddr()
161 netdev_info(bp->dev, "invalid hw address, using random\n"); in macb_get_hwaddr()
162 eth_hw_addr_random(bp->dev); in macb_get_hwaddr()
167 struct macb *bp = bus->priv; in macb_mdio_read() local
170 macb_writel(bp, MAN, (MACB_BF(SOF, MACB_MAN_SOF) in macb_mdio_read()
177 while (!MACB_BFEXT(IDLE, macb_readl(bp, NSR))) in macb_mdio_read()
180 value = MACB_BFEXT(DATA, macb_readl(bp, MAN)); in macb_mdio_read()
188 struct macb *bp = bus->priv; in macb_mdio_write() local
190 macb_writel(bp, MAN, (MACB_BF(SOF, MACB_MAN_SOF) in macb_mdio_write()
198 while (!MACB_BFEXT(IDLE, macb_readl(bp, NSR))) in macb_mdio_write()
250 struct macb *bp = netdev_priv(dev); in macb_handle_link_change() local
251 struct phy_device *phydev = bp->phy_dev; in macb_handle_link_change()
256 spin_lock_irqsave(&bp->lock, flags); in macb_handle_link_change()
259 if ((bp->speed != phydev->speed) || in macb_handle_link_change()
260 (bp->duplex != phydev->duplex)) { in macb_handle_link_change()
263 reg = macb_readl(bp, NCFGR); in macb_handle_link_change()
265 if (macb_is_gem(bp)) in macb_handle_link_change()
273 bp->caps & MACB_CAPS_GIGABIT_MODE_AVAILABLE) in macb_handle_link_change()
276 macb_or_gem_writel(bp, NCFGR, reg); in macb_handle_link_change()
278 bp->speed = phydev->speed; in macb_handle_link_change()
279 bp->duplex = phydev->duplex; in macb_handle_link_change()
284 if (phydev->link != bp->link) { in macb_handle_link_change()
286 bp->speed = 0; in macb_handle_link_change()
287 bp->duplex = -1; in macb_handle_link_change()
289 bp->link = phydev->link; in macb_handle_link_change()
294 spin_unlock_irqrestore(&bp->lock, flags); in macb_handle_link_change()
301 macb_set_tx_clk(bp->tx_clk, phydev->speed, dev); in macb_handle_link_change()
318 struct macb *bp = netdev_priv(dev); in macb_mii_probe() local
324 phydev = phy_find_first(bp->mii_bus); in macb_mii_probe()
330 pdata = dev_get_platdata(&bp->pdev->dev); in macb_mii_probe()
332 ret = devm_gpio_request(&bp->pdev->dev, pdata->phy_irq_pin, "phy int"); in macb_mii_probe()
341 bp->phy_interface); in macb_mii_probe()
348 if (macb_is_gem(bp) && bp->caps & MACB_CAPS_GIGABIT_MODE_AVAILABLE) in macb_mii_probe()
353 if (bp->caps & MACB_CAPS_NO_GIGABIT_HALF) in macb_mii_probe()
358 bp->link = 0; in macb_mii_probe()
359 bp->speed = 0; in macb_mii_probe()
360 bp->duplex = -1; in macb_mii_probe()
361 bp->phy_dev = phydev; in macb_mii_probe()
366 static int macb_mii_init(struct macb *bp) in macb_mii_init() argument
373 macb_writel(bp, NCR, MACB_BIT(MPE)); in macb_mii_init()
375 bp->mii_bus = mdiobus_alloc(); in macb_mii_init()
376 if (bp->mii_bus == NULL) { in macb_mii_init()
381 bp->mii_bus->name = "MACB_mii_bus"; in macb_mii_init()
382 bp->mii_bus->read = &macb_mdio_read; in macb_mii_init()
383 bp->mii_bus->write = &macb_mdio_write; in macb_mii_init()
384 snprintf(bp->mii_bus->id, MII_BUS_ID_SIZE, "%s-%x", in macb_mii_init()
385 bp->pdev->name, bp->pdev->id); in macb_mii_init()
386 bp->mii_bus->priv = bp; in macb_mii_init()
387 bp->mii_bus->parent = &bp->dev->dev; in macb_mii_init()
388 pdata = dev_get_platdata(&bp->pdev->dev); in macb_mii_init()
390 bp->mii_bus->irq = kmalloc(sizeof(int)*PHY_MAX_ADDR, GFP_KERNEL); in macb_mii_init()
391 if (!bp->mii_bus->irq) { in macb_mii_init()
396 dev_set_drvdata(&bp->dev->dev, bp->mii_bus); in macb_mii_init()
398 np = bp->pdev->dev.of_node; in macb_mii_init()
401 err = of_mdiobus_register(bp->mii_bus, np); in macb_mii_init()
405 if (!err && !phy_find_first(bp->mii_bus)) { in macb_mii_init()
409 phydev = mdiobus_scan(bp->mii_bus, i); in macb_mii_init()
421 bp->mii_bus->irq[i] = PHY_POLL; in macb_mii_init()
424 bp->mii_bus->phy_mask = pdata->phy_mask; in macb_mii_init()
426 err = mdiobus_register(bp->mii_bus); in macb_mii_init()
432 err = macb_mii_probe(bp->dev); in macb_mii_init()
439 mdiobus_unregister(bp->mii_bus); in macb_mii_init()
441 kfree(bp->mii_bus->irq); in macb_mii_init()
443 mdiobus_free(bp->mii_bus); in macb_mii_init()
448 static void macb_update_stats(struct macb *bp) in macb_update_stats() argument
450 u32 __iomem *reg = bp->regs + MACB_PFR; in macb_update_stats()
451 u32 *p = &bp->hw_stats.macb.rx_pause_frames; in macb_update_stats()
452 u32 *end = &bp->hw_stats.macb.tx_pause_frames + 1; in macb_update_stats()
460 static int macb_halt_tx(struct macb *bp) in macb_halt_tx() argument
465 macb_writel(bp, NCR, macb_readl(bp, NCR) | MACB_BIT(THALT)); in macb_halt_tx()
470 status = macb_readl(bp, TSR); in macb_halt_tx()
480 static void macb_tx_unmap(struct macb *bp, struct macb_tx_skb *tx_skb) in macb_tx_unmap() argument
484 dma_unmap_page(&bp->pdev->dev, tx_skb->mapping, in macb_tx_unmap()
487 dma_unmap_single(&bp->pdev->dev, tx_skb->mapping, in macb_tx_unmap()
502 struct macb *bp = queue->bp; in macb_tx_error_task() local
509 netdev_vdbg(bp->dev, "macb_tx_error_task: q = %u, t = %u, h = %u\n", in macb_tx_error_task()
510 (unsigned int)(queue - bp->queues), in macb_tx_error_task()
519 spin_lock_irqsave(&bp->lock, flags); in macb_tx_error_task()
522 netif_tx_stop_all_queues(bp->dev); in macb_tx_error_task()
529 if (macb_halt_tx(bp)) in macb_tx_error_task()
531 netdev_err(bp->dev, "BUG: halt tx timed out\n"); in macb_tx_error_task()
548 macb_tx_unmap(bp, tx_skb); in macb_tx_error_task()
558 netdev_vdbg(bp->dev, "txerr skb %u (data %p) TX complete\n", in macb_tx_error_task()
560 bp->stats.tx_packets++; in macb_tx_error_task()
561 bp->stats.tx_bytes += skb->len; in macb_tx_error_task()
570 netdev_err(bp->dev, in macb_tx_error_task()
576 macb_tx_unmap(bp, tx_skb); in macb_tx_error_task()
594 macb_writel(bp, TSR, macb_readl(bp, TSR)); in macb_tx_error_task()
598 netif_tx_start_all_queues(bp->dev); in macb_tx_error_task()
599 macb_writel(bp, NCR, macb_readl(bp, NCR) | MACB_BIT(TSTART)); in macb_tx_error_task()
601 spin_unlock_irqrestore(&bp->lock, flags); in macb_tx_error_task()
609 struct macb *bp = queue->bp; in macb_tx_interrupt() local
610 u16 queue_index = queue - bp->queues; in macb_tx_interrupt()
612 status = macb_readl(bp, TSR); in macb_tx_interrupt()
613 macb_writel(bp, TSR, status); in macb_tx_interrupt()
615 if (bp->caps & MACB_CAPS_ISR_CLEAR_ON_WRITE) in macb_tx_interrupt()
618 netdev_vdbg(bp->dev, "macb_tx_interrupt status = 0x%03lx\n", in macb_tx_interrupt()
648 netdev_vdbg(bp->dev, "skb %u (data %p) TX complete\n", in macb_tx_interrupt()
650 bp->stats.tx_packets++; in macb_tx_interrupt()
651 bp->stats.tx_bytes += skb->len; in macb_tx_interrupt()
655 macb_tx_unmap(bp, tx_skb); in macb_tx_interrupt()
667 if (__netif_subqueue_stopped(bp->dev, queue_index) && in macb_tx_interrupt()
670 netif_wake_subqueue(bp->dev, queue_index); in macb_tx_interrupt()
673 static void gem_rx_refill(struct macb *bp) in gem_rx_refill() argument
679 while (CIRC_SPACE(bp->rx_prepared_head, bp->rx_tail, RX_RING_SIZE) > 0) { in gem_rx_refill()
680 entry = macb_rx_ring_wrap(bp->rx_prepared_head); in gem_rx_refill()
685 bp->rx_prepared_head++; in gem_rx_refill()
687 if (bp->rx_skbuff[entry] == NULL) { in gem_rx_refill()
689 skb = netdev_alloc_skb(bp->dev, bp->rx_buffer_size); in gem_rx_refill()
691 netdev_err(bp->dev, in gem_rx_refill()
697 paddr = dma_map_single(&bp->pdev->dev, skb->data, in gem_rx_refill()
698 bp->rx_buffer_size, DMA_FROM_DEVICE); in gem_rx_refill()
699 if (dma_mapping_error(&bp->pdev->dev, paddr)) { in gem_rx_refill()
704 bp->rx_skbuff[entry] = skb; in gem_rx_refill()
708 bp->rx_ring[entry].addr = paddr; in gem_rx_refill()
709 bp->rx_ring[entry].ctrl = 0; in gem_rx_refill()
714 bp->rx_ring[entry].addr &= ~MACB_BIT(RX_USED); in gem_rx_refill()
715 bp->rx_ring[entry].ctrl = 0; in gem_rx_refill()
722 netdev_vdbg(bp->dev, "rx ring: prepared head %d, tail %d\n", in gem_rx_refill()
723 bp->rx_prepared_head, bp->rx_tail); in gem_rx_refill()
727 static void discard_partial_frame(struct macb *bp, unsigned int begin, in discard_partial_frame() argument
733 struct macb_dma_desc *desc = macb_rx_desc(bp, frag); in discard_partial_frame()
747 static int gem_rx(struct macb *bp, int budget) in gem_rx() argument
758 entry = macb_rx_ring_wrap(bp->rx_tail); in gem_rx()
759 desc = &bp->rx_ring[entry]; in gem_rx()
770 bp->rx_tail++; in gem_rx()
774 netdev_err(bp->dev, in gem_rx()
776 bp->stats.rx_dropped++; in gem_rx()
779 skb = bp->rx_skbuff[entry]; in gem_rx()
781 netdev_err(bp->dev, in gem_rx()
783 bp->stats.rx_dropped++; in gem_rx()
787 bp->rx_skbuff[entry] = NULL; in gem_rx()
790 netdev_vdbg(bp->dev, "gem_rx %u (len %u)\n", entry, len); in gem_rx()
794 dma_unmap_single(&bp->pdev->dev, addr, in gem_rx()
795 bp->rx_buffer_size, DMA_FROM_DEVICE); in gem_rx()
797 skb->protocol = eth_type_trans(skb, bp->dev); in gem_rx()
799 if (bp->dev->features & NETIF_F_RXCSUM && in gem_rx()
800 !(bp->dev->flags & IFF_PROMISC) && in gem_rx()
804 bp->stats.rx_packets++; in gem_rx()
805 bp->stats.rx_bytes += skb->len; in gem_rx()
808 netdev_vdbg(bp->dev, "received skb of length %u, csum: %08x\n", in gem_rx()
819 gem_rx_refill(bp); in gem_rx()
824 static int macb_rx_frame(struct macb *bp, unsigned int first_frag, in macb_rx_frame() argument
833 desc = macb_rx_desc(bp, last_frag); in macb_rx_frame()
836 netdev_vdbg(bp->dev, "macb_rx_frame frags %u - %u (len %u)\n", in macb_rx_frame()
849 skb = netdev_alloc_skb(bp->dev, len + NET_IP_ALIGN); in macb_rx_frame()
851 bp->stats.rx_dropped++; in macb_rx_frame()
853 desc = macb_rx_desc(bp, frag); in macb_rx_frame()
871 unsigned int frag_len = bp->rx_buffer_size; in macb_rx_frame()
878 macb_rx_buffer(bp, frag), frag_len); in macb_rx_frame()
879 offset += bp->rx_buffer_size; in macb_rx_frame()
880 desc = macb_rx_desc(bp, frag); in macb_rx_frame()
891 skb->protocol = eth_type_trans(skb, bp->dev); in macb_rx_frame()
893 bp->stats.rx_packets++; in macb_rx_frame()
894 bp->stats.rx_bytes += skb->len; in macb_rx_frame()
895 netdev_vdbg(bp->dev, "received skb of length %u, csum: %08x\n", in macb_rx_frame()
902 static int macb_rx(struct macb *bp, int budget) in macb_rx() argument
908 for (tail = bp->rx_tail; budget > 0; tail++) { in macb_rx()
909 struct macb_dma_desc *desc = macb_rx_desc(bp, tail); in macb_rx()
923 discard_partial_frame(bp, first_frag, tail); in macb_rx()
931 dropped = macb_rx_frame(bp, first_frag, tail); in macb_rx()
941 bp->rx_tail = first_frag; in macb_rx()
943 bp->rx_tail = tail; in macb_rx()
950 struct macb *bp = container_of(napi, struct macb, napi); in macb_poll() local
954 status = macb_readl(bp, RSR); in macb_poll()
955 macb_writel(bp, RSR, status); in macb_poll()
959 netdev_vdbg(bp->dev, "poll: status = %08lx, budget = %d\n", in macb_poll()
962 work_done = bp->macbgem_ops.mog_rx(bp, budget); in macb_poll()
967 status = macb_readl(bp, RSR); in macb_poll()
969 if (bp->caps & MACB_CAPS_ISR_CLEAR_ON_WRITE) in macb_poll()
970 macb_writel(bp, ISR, MACB_BIT(RCOMP)); in macb_poll()
973 macb_writel(bp, IER, MACB_RX_INT_FLAGS); in macb_poll()
985 struct macb *bp = queue->bp; in macb_interrupt() local
986 struct net_device *dev = bp->dev; in macb_interrupt()
994 spin_lock(&bp->lock); in macb_interrupt()
1003 netdev_vdbg(bp->dev, "queue = %u, isr = 0x%08lx\n", in macb_interrupt()
1004 (unsigned int)(queue - bp->queues), in macb_interrupt()
1016 if (bp->caps & MACB_CAPS_ISR_CLEAR_ON_WRITE) in macb_interrupt()
1019 if (napi_schedule_prep(&bp->napi)) { in macb_interrupt()
1020 netdev_vdbg(bp->dev, "scheduling RX softirq\n"); in macb_interrupt()
1021 __napi_schedule(&bp->napi); in macb_interrupt()
1029 if (bp->caps & MACB_CAPS_ISR_CLEAR_ON_WRITE) in macb_interrupt()
1050 ctrl = macb_readl(bp, NCR); in macb_interrupt()
1051 macb_writel(bp, NCR, ctrl & ~MACB_BIT(RE)); in macb_interrupt()
1052 macb_writel(bp, NCR, ctrl | MACB_BIT(RE)); in macb_interrupt()
1054 if (bp->caps & MACB_CAPS_ISR_CLEAR_ON_WRITE) in macb_interrupt()
1055 macb_writel(bp, ISR, MACB_BIT(RXUBR)); in macb_interrupt()
1060 if (macb_is_gem(bp)) in macb_interrupt()
1061 bp->hw_stats.gem.rx_overruns++; in macb_interrupt()
1063 bp->hw_stats.macb.rx_overruns++; in macb_interrupt()
1065 if (bp->caps & MACB_CAPS_ISR_CLEAR_ON_WRITE) in macb_interrupt()
1077 if (bp->caps & MACB_CAPS_ISR_CLEAR_ON_WRITE) in macb_interrupt()
1084 spin_unlock(&bp->lock); in macb_interrupt()
1096 struct macb *bp = netdev_priv(dev); in macb_poll_controller() local
1102 for (q = 0, queue = bp->queues; q < bp->num_queues; ++q, ++queue) in macb_poll_controller()
1108 static inline unsigned int macb_count_tx_descriptors(struct macb *bp, in macb_count_tx_descriptors() argument
1111 return (len + bp->max_tx_length - 1) / bp->max_tx_length; in macb_count_tx_descriptors()
1114 static unsigned int macb_tx_map(struct macb *bp, in macb_tx_map() argument
1131 size = min(len, bp->max_tx_length); in macb_tx_map()
1135 mapping = dma_map_single(&bp->pdev->dev, in macb_tx_map()
1138 if (dma_mapping_error(&bp->pdev->dev, mapping)) in macb_tx_map()
1160 size = min(len, bp->max_tx_length); in macb_tx_map()
1164 mapping = skb_frag_dma_map(&bp->pdev->dev, frag, in macb_tx_map()
1166 if (dma_mapping_error(&bp->pdev->dev, mapping)) in macb_tx_map()
1184 netdev_err(bp->dev, "BUG! empty skb!\n"); in macb_tx_map()
1232 netdev_err(bp->dev, "TX DMA map failed\n"); in macb_tx_map()
1237 macb_tx_unmap(bp, tx_skb); in macb_tx_map()
1246 struct macb *bp = netdev_priv(dev); in macb_start_xmit() local
1247 struct macb_queue *queue = &bp->queues[queue_index]; in macb_start_xmit()
1252 netdev_vdbg(bp->dev, in macb_start_xmit()
1264 count = macb_count_tx_descriptors(bp, skb_headlen(skb)); in macb_start_xmit()
1268 count += macb_count_tx_descriptors(bp, frag_size); in macb_start_xmit()
1271 spin_lock_irqsave(&bp->lock, flags); in macb_start_xmit()
1276 spin_unlock_irqrestore(&bp->lock, flags); in macb_start_xmit()
1277 netdev_dbg(bp->dev, "tx_head = %u, tx_tail = %u\n", in macb_start_xmit()
1283 if (!macb_tx_map(bp, queue, skb)) { in macb_start_xmit()
1293 macb_writel(bp, NCR, macb_readl(bp, NCR) | MACB_BIT(TSTART)); in macb_start_xmit()
1299 spin_unlock_irqrestore(&bp->lock, flags); in macb_start_xmit()
1304 static void macb_init_rx_buffer_size(struct macb *bp, size_t size) in macb_init_rx_buffer_size() argument
1306 if (!macb_is_gem(bp)) { in macb_init_rx_buffer_size()
1307 bp->rx_buffer_size = MACB_RX_BUFFER_SIZE; in macb_init_rx_buffer_size()
1309 bp->rx_buffer_size = size; in macb_init_rx_buffer_size()
1311 if (bp->rx_buffer_size % RX_BUFFER_MULTIPLE) { in macb_init_rx_buffer_size()
1312 netdev_dbg(bp->dev, in macb_init_rx_buffer_size()
1315 bp->rx_buffer_size = in macb_init_rx_buffer_size()
1316 roundup(bp->rx_buffer_size, RX_BUFFER_MULTIPLE); in macb_init_rx_buffer_size()
1320 netdev_dbg(bp->dev, "mtu [%u] rx_buffer_size [%Zu]\n", in macb_init_rx_buffer_size()
1321 bp->dev->mtu, bp->rx_buffer_size); in macb_init_rx_buffer_size()
1324 static void gem_free_rx_buffers(struct macb *bp) in gem_free_rx_buffers() argument
1331 if (!bp->rx_skbuff) in gem_free_rx_buffers()
1335 skb = bp->rx_skbuff[i]; in gem_free_rx_buffers()
1340 desc = &bp->rx_ring[i]; in gem_free_rx_buffers()
1342 dma_unmap_single(&bp->pdev->dev, addr, bp->rx_buffer_size, in gem_free_rx_buffers()
1348 kfree(bp->rx_skbuff); in gem_free_rx_buffers()
1349 bp->rx_skbuff = NULL; in gem_free_rx_buffers()
1352 static void macb_free_rx_buffers(struct macb *bp) in macb_free_rx_buffers() argument
1354 if (bp->rx_buffers) { in macb_free_rx_buffers()
1355 dma_free_coherent(&bp->pdev->dev, in macb_free_rx_buffers()
1356 RX_RING_SIZE * bp->rx_buffer_size, in macb_free_rx_buffers()
1357 bp->rx_buffers, bp->rx_buffers_dma); in macb_free_rx_buffers()
1358 bp->rx_buffers = NULL; in macb_free_rx_buffers()
1362 static void macb_free_consistent(struct macb *bp) in macb_free_consistent() argument
1367 bp->macbgem_ops.mog_free_rx_buffers(bp); in macb_free_consistent()
1368 if (bp->rx_ring) { in macb_free_consistent()
1369 dma_free_coherent(&bp->pdev->dev, RX_RING_BYTES, in macb_free_consistent()
1370 bp->rx_ring, bp->rx_ring_dma); in macb_free_consistent()
1371 bp->rx_ring = NULL; in macb_free_consistent()
1374 for (q = 0, queue = bp->queues; q < bp->num_queues; ++q, ++queue) { in macb_free_consistent()
1378 dma_free_coherent(&bp->pdev->dev, TX_RING_BYTES, in macb_free_consistent()
1385 static int gem_alloc_rx_buffers(struct macb *bp) in gem_alloc_rx_buffers() argument
1390 bp->rx_skbuff = kzalloc(size, GFP_KERNEL); in gem_alloc_rx_buffers()
1391 if (!bp->rx_skbuff) in gem_alloc_rx_buffers()
1394 netdev_dbg(bp->dev, in gem_alloc_rx_buffers()
1396 RX_RING_SIZE, bp->rx_skbuff); in gem_alloc_rx_buffers()
1400 static int macb_alloc_rx_buffers(struct macb *bp) in macb_alloc_rx_buffers() argument
1404 size = RX_RING_SIZE * bp->rx_buffer_size; in macb_alloc_rx_buffers()
1405 bp->rx_buffers = dma_alloc_coherent(&bp->pdev->dev, size, in macb_alloc_rx_buffers()
1406 &bp->rx_buffers_dma, GFP_KERNEL); in macb_alloc_rx_buffers()
1407 if (!bp->rx_buffers) in macb_alloc_rx_buffers()
1410 netdev_dbg(bp->dev, in macb_alloc_rx_buffers()
1412 size, (unsigned long)bp->rx_buffers_dma, bp->rx_buffers); in macb_alloc_rx_buffers()
1416 static int macb_alloc_consistent(struct macb *bp) in macb_alloc_consistent() argument
1422 for (q = 0, queue = bp->queues; q < bp->num_queues; ++q, ++queue) { in macb_alloc_consistent()
1424 queue->tx_ring = dma_alloc_coherent(&bp->pdev->dev, size, in macb_alloc_consistent()
1429 netdev_dbg(bp->dev, in macb_alloc_consistent()
1441 bp->rx_ring = dma_alloc_coherent(&bp->pdev->dev, size, in macb_alloc_consistent()
1442 &bp->rx_ring_dma, GFP_KERNEL); in macb_alloc_consistent()
1443 if (!bp->rx_ring) in macb_alloc_consistent()
1445 netdev_dbg(bp->dev, in macb_alloc_consistent()
1447 size, (unsigned long)bp->rx_ring_dma, bp->rx_ring); in macb_alloc_consistent()
1449 if (bp->macbgem_ops.mog_alloc_rx_buffers(bp)) in macb_alloc_consistent()
1455 macb_free_consistent(bp); in macb_alloc_consistent()
1459 static void gem_init_rings(struct macb *bp) in gem_init_rings() argument
1465 for (q = 0, queue = bp->queues; q < bp->num_queues; ++q, ++queue) { in gem_init_rings()
1475 bp->rx_tail = 0; in gem_init_rings()
1476 bp->rx_prepared_head = 0; in gem_init_rings()
1478 gem_rx_refill(bp); in gem_init_rings()
1481 static void macb_init_rings(struct macb *bp) in macb_init_rings() argument
1486 addr = bp->rx_buffers_dma; in macb_init_rings()
1488 bp->rx_ring[i].addr = addr; in macb_init_rings()
1489 bp->rx_ring[i].ctrl = 0; in macb_init_rings()
1490 addr += bp->rx_buffer_size; in macb_init_rings()
1492 bp->rx_ring[RX_RING_SIZE - 1].addr |= MACB_BIT(RX_WRAP); in macb_init_rings()
1495 bp->queues[0].tx_ring[i].addr = 0; in macb_init_rings()
1496 bp->queues[0].tx_ring[i].ctrl = MACB_BIT(TX_USED); in macb_init_rings()
1498 bp->queues[0].tx_head = 0; in macb_init_rings()
1499 bp->queues[0].tx_tail = 0; in macb_init_rings()
1500 bp->queues[0].tx_ring[TX_RING_SIZE - 1].ctrl |= MACB_BIT(TX_WRAP); in macb_init_rings()
1502 bp->rx_tail = 0; in macb_init_rings()
1505 static void macb_reset_hw(struct macb *bp) in macb_reset_hw() argument
1514 macb_writel(bp, NCR, 0); in macb_reset_hw()
1517 macb_writel(bp, NCR, MACB_BIT(CLRSTAT)); in macb_reset_hw()
1520 macb_writel(bp, TSR, -1); in macb_reset_hw()
1521 macb_writel(bp, RSR, -1); in macb_reset_hw()
1524 for (q = 0, queue = bp->queues; q < bp->num_queues; ++q, ++queue) { in macb_reset_hw()
1530 static u32 gem_mdc_clk_div(struct macb *bp) in gem_mdc_clk_div() argument
1533 unsigned long pclk_hz = clk_get_rate(bp->pclk); in gem_mdc_clk_div()
1551 static u32 macb_mdc_clk_div(struct macb *bp) in macb_mdc_clk_div() argument
1556 if (macb_is_gem(bp)) in macb_mdc_clk_div()
1557 return gem_mdc_clk_div(bp); in macb_mdc_clk_div()
1559 pclk_hz = clk_get_rate(bp->pclk); in macb_mdc_clk_div()
1577 static u32 macb_dbw(struct macb *bp) in macb_dbw() argument
1579 if (!macb_is_gem(bp)) in macb_dbw()
1582 switch (GEM_BFEXT(DBWDEF, gem_readl(bp, DCFG1))) { in macb_dbw()
1601 static void macb_configure_dma(struct macb *bp) in macb_configure_dma() argument
1606 if (macb_is_gem(bp)) { in macb_configure_dma()
1607 dmacfg = gem_readl(bp, DMACFG) & ~GEM_BF(RXBS, -1L); in macb_configure_dma()
1608 dmacfg |= GEM_BF(RXBS, bp->rx_buffer_size / RX_BUFFER_MULTIPLE); in macb_configure_dma()
1609 if (bp->dma_burst_length) in macb_configure_dma()
1610 dmacfg = GEM_BFINS(FBLDO, bp->dma_burst_length, dmacfg); in macb_configure_dma()
1618 ncr = macb_readl(bp, NCR); in macb_configure_dma()
1619 __raw_writel(MACB_BIT(LLB), bp->regs + MACB_NCR); in macb_configure_dma()
1620 tmp = __raw_readl(bp->regs + MACB_NCR); in macb_configure_dma()
1628 macb_writel(bp, NCR, ncr); in macb_configure_dma()
1630 if (bp->dev->features & NETIF_F_HW_CSUM) in macb_configure_dma()
1634 netdev_dbg(bp->dev, "Cadence configure DMA with 0x%08x\n", in macb_configure_dma()
1636 gem_writel(bp, DMACFG, dmacfg); in macb_configure_dma()
1640 static void macb_init_hw(struct macb *bp) in macb_init_hw() argument
1647 macb_reset_hw(bp); in macb_init_hw()
1648 macb_set_hwaddr(bp); in macb_init_hw()
1650 config = macb_mdc_clk_div(bp); in macb_init_hw()
1655 if (bp->dev->flags & IFF_PROMISC) in macb_init_hw()
1657 else if (macb_is_gem(bp) && bp->dev->features & NETIF_F_RXCSUM) in macb_init_hw()
1659 if (!(bp->dev->flags & IFF_BROADCAST)) in macb_init_hw()
1661 config |= macb_dbw(bp); in macb_init_hw()
1662 macb_writel(bp, NCFGR, config); in macb_init_hw()
1663 bp->speed = SPEED_10; in macb_init_hw()
1664 bp->duplex = DUPLEX_HALF; in macb_init_hw()
1666 macb_configure_dma(bp); in macb_init_hw()
1669 macb_writel(bp, RBQP, bp->rx_ring_dma); in macb_init_hw()
1670 for (q = 0, queue = bp->queues; q < bp->num_queues; ++q, ++queue) { in macb_init_hw()
1681 macb_writel(bp, NCR, MACB_BIT(RE) | MACB_BIT(TE) | MACB_BIT(MPE)); in macb_init_hw()
1751 struct macb *bp = netdev_priv(dev); in macb_sethashtable() local
1760 macb_or_gem_writel(bp, HRB, mc_filter[0]); in macb_sethashtable()
1761 macb_or_gem_writel(bp, HRT, mc_filter[1]); in macb_sethashtable()
1770 struct macb *bp = netdev_priv(dev); in macb_set_rx_mode() local
1772 cfg = macb_readl(bp, NCFGR); in macb_set_rx_mode()
1779 if (macb_is_gem(bp)) in macb_set_rx_mode()
1786 if (macb_is_gem(bp) && dev->features & NETIF_F_RXCSUM) in macb_set_rx_mode()
1792 macb_or_gem_writel(bp, HRB, -1); in macb_set_rx_mode()
1793 macb_or_gem_writel(bp, HRT, -1); in macb_set_rx_mode()
1801 macb_or_gem_writel(bp, HRB, 0); in macb_set_rx_mode()
1802 macb_or_gem_writel(bp, HRT, 0); in macb_set_rx_mode()
1806 macb_writel(bp, NCFGR, cfg); in macb_set_rx_mode()
1811 struct macb *bp = netdev_priv(dev); in macb_open() local
1815 netdev_dbg(bp->dev, "open\n"); in macb_open()
1821 if (!bp->phy_dev) in macb_open()
1825 macb_init_rx_buffer_size(bp, bufsz); in macb_open()
1827 err = macb_alloc_consistent(bp); in macb_open()
1834 napi_enable(&bp->napi); in macb_open()
1836 bp->macbgem_ops.mog_init_rings(bp); in macb_open()
1837 macb_init_hw(bp); in macb_open()
1840 phy_start(bp->phy_dev); in macb_open()
1849 struct macb *bp = netdev_priv(dev); in macb_close() local
1853 napi_disable(&bp->napi); in macb_close()
1855 if (bp->phy_dev) in macb_close()
1856 phy_stop(bp->phy_dev); in macb_close()
1858 spin_lock_irqsave(&bp->lock, flags); in macb_close()
1859 macb_reset_hw(bp); in macb_close()
1861 spin_unlock_irqrestore(&bp->lock, flags); in macb_close()
1863 macb_free_consistent(bp); in macb_close()
1868 static void gem_update_stats(struct macb *bp) in gem_update_stats() argument
1871 u32 *p = &bp->hw_stats.gem.tx_octets_31_0; in gem_update_stats()
1875 u64 val = readl_relaxed(bp->regs + offset); in gem_update_stats()
1877 bp->ethtool_stats[i] += val; in gem_update_stats()
1882 val = readl_relaxed(bp->regs + offset + 4); in gem_update_stats()
1883 bp->ethtool_stats[i] += ((u64)val) << 32; in gem_update_stats()
1889 static struct net_device_stats *gem_get_stats(struct macb *bp) in gem_get_stats() argument
1891 struct gem_stats *hwstat = &bp->hw_stats.gem; in gem_get_stats()
1892 struct net_device_stats *nstat = &bp->stats; in gem_get_stats()
1894 gem_update_stats(bp); in gem_get_stats()
1930 struct macb *bp; in gem_get_ethtool_stats() local
1932 bp = netdev_priv(dev); in gem_get_ethtool_stats()
1933 gem_update_stats(bp); in gem_get_ethtool_stats()
1934 memcpy(data, &bp->ethtool_stats, sizeof(u64) * GEM_STATS_LEN); in gem_get_ethtool_stats()
1962 struct macb *bp = netdev_priv(dev); in macb_get_stats() local
1963 struct net_device_stats *nstat = &bp->stats; in macb_get_stats()
1964 struct macb_stats *hwstat = &bp->hw_stats.macb; in macb_get_stats()
1966 if (macb_is_gem(bp)) in macb_get_stats()
1967 return gem_get_stats(bp); in macb_get_stats()
1970 macb_update_stats(bp); in macb_get_stats()
2009 struct macb *bp = netdev_priv(dev); in macb_get_settings() local
2010 struct phy_device *phydev = bp->phy_dev; in macb_get_settings()
2020 struct macb *bp = netdev_priv(dev); in macb_set_settings() local
2021 struct phy_device *phydev = bp->phy_dev; in macb_set_settings()
2037 struct macb *bp = netdev_priv(dev); in macb_get_regs() local
2041 regs->version = (macb_readl(bp, MID) & ((1 << MACB_REV_SIZE) - 1)) in macb_get_regs()
2044 tail = macb_tx_ring_wrap(bp->queues[0].tx_tail); in macb_get_regs()
2045 head = macb_tx_ring_wrap(bp->queues[0].tx_head); in macb_get_regs()
2047 regs_buff[0] = macb_readl(bp, NCR); in macb_get_regs()
2048 regs_buff[1] = macb_or_gem_readl(bp, NCFGR); in macb_get_regs()
2049 regs_buff[2] = macb_readl(bp, NSR); in macb_get_regs()
2050 regs_buff[3] = macb_readl(bp, TSR); in macb_get_regs()
2051 regs_buff[4] = macb_readl(bp, RBQP); in macb_get_regs()
2052 regs_buff[5] = macb_readl(bp, TBQP); in macb_get_regs()
2053 regs_buff[6] = macb_readl(bp, RSR); in macb_get_regs()
2054 regs_buff[7] = macb_readl(bp, IMR); in macb_get_regs()
2058 regs_buff[10] = macb_tx_dma(&bp->queues[0], tail); in macb_get_regs()
2059 regs_buff[11] = macb_tx_dma(&bp->queues[0], head); in macb_get_regs()
2061 regs_buff[12] = macb_or_gem_readl(bp, USRIO); in macb_get_regs()
2062 if (macb_is_gem(bp)) { in macb_get_regs()
2063 regs_buff[13] = gem_readl(bp, DMACFG); in macb_get_regs()
2090 struct macb *bp = netdev_priv(dev); in macb_ioctl() local
2091 struct phy_device *phydev = bp->phy_dev; in macb_ioctl()
2105 struct macb *bp = netdev_priv(netdev); in macb_set_features() local
2109 if ((changed & NETIF_F_HW_CSUM) && macb_is_gem(bp)) { in macb_set_features()
2112 dmacfg = gem_readl(bp, DMACFG); in macb_set_features()
2117 gem_writel(bp, DMACFG, dmacfg); in macb_set_features()
2121 if ((changed & NETIF_F_RXCSUM) && macb_is_gem(bp)) { in macb_set_features()
2124 netcfg = gem_readl(bp, NCFGR); in macb_set_features()
2130 gem_writel(bp, NCFGR, netcfg); in macb_set_features()
2156 static void macb_configure_caps(struct macb *bp, const struct macb_config *dt_conf) in macb_configure_caps() argument
2161 bp->caps = dt_conf->caps; in macb_configure_caps()
2163 if (macb_is_gem_hw(bp->regs)) { in macb_configure_caps()
2164 bp->caps |= MACB_CAPS_MACB_IS_GEM; in macb_configure_caps()
2166 dcfg = gem_readl(bp, DCFG1); in macb_configure_caps()
2168 bp->caps |= MACB_CAPS_ISR_CLEAR_ON_WRITE; in macb_configure_caps()
2169 dcfg = gem_readl(bp, DCFG2); in macb_configure_caps()
2171 bp->caps |= MACB_CAPS_FIFO_MODE; in macb_configure_caps()
2174 netdev_dbg(bp->dev, "Cadence caps 0x%08x\n", bp->caps); in macb_configure_caps()
2261 struct macb *bp = netdev_priv(dev); in macb_init() local
2271 if (!(bp->queue_mask & (1 << hw_q))) in macb_init()
2274 queue = &bp->queues[q]; in macb_init()
2275 queue->bp = bp; in macb_init()
2311 netif_napi_add(dev, &bp->napi, macb_poll, 64); in macb_init()
2314 if (macb_is_gem(bp)) { in macb_init()
2315 bp->max_tx_length = GEM_MAX_TX_LEN; in macb_init()
2316 bp->macbgem_ops.mog_alloc_rx_buffers = gem_alloc_rx_buffers; in macb_init()
2317 bp->macbgem_ops.mog_free_rx_buffers = gem_free_rx_buffers; in macb_init()
2318 bp->macbgem_ops.mog_init_rings = gem_init_rings; in macb_init()
2319 bp->macbgem_ops.mog_rx = gem_rx; in macb_init()
2322 bp->max_tx_length = MACB_MAX_TX_LEN; in macb_init()
2323 bp->macbgem_ops.mog_alloc_rx_buffers = macb_alloc_rx_buffers; in macb_init()
2324 bp->macbgem_ops.mog_free_rx_buffers = macb_free_rx_buffers; in macb_init()
2325 bp->macbgem_ops.mog_init_rings = macb_init_rings; in macb_init()
2326 bp->macbgem_ops.mog_rx = macb_rx; in macb_init()
2333 if (macb_is_gem(bp) && !(bp->caps & MACB_CAPS_FIFO_MODE)) in macb_init()
2335 if (bp->caps & MACB_CAPS_SG_DISABLED) in macb_init()
2340 if (bp->phy_interface == PHY_INTERFACE_MODE_RGMII) in macb_init()
2342 else if (bp->phy_interface == PHY_INTERFACE_MODE_RMII && in macb_init()
2343 (bp->caps & MACB_CAPS_USRIO_DEFAULT_IS_MII)) in macb_init()
2345 else if (!(bp->caps & MACB_CAPS_USRIO_DEFAULT_IS_MII)) in macb_init()
2348 if (bp->caps & MACB_CAPS_USRIO_HAS_CLKEN) in macb_init()
2351 macb_or_gem_writel(bp, USRIO, val); in macb_init()
2354 val = macb_mdc_clk_div(bp); in macb_init()
2355 val |= macb_dbw(bp); in macb_init()
2356 macb_writel(bp, NCFGR, val); in macb_init()
2650 struct macb *bp = netdev_priv(dev); in at91ether_init() local
2662 macb_writel(bp, NCR, 0); in at91ether_init()
2665 if (bp->phy_interface == PHY_INTERFACE_MODE_RMII) in at91ether_init()
2668 macb_writel(bp, NCFGR, reg); in at91ether_init()
2745 struct macb *bp; in macb_probe() local
2771 dev = alloc_etherdev_mq(sizeof(*bp), num_queues); in macb_probe()
2781 bp = netdev_priv(dev); in macb_probe()
2782 bp->pdev = pdev; in macb_probe()
2783 bp->dev = dev; in macb_probe()
2784 bp->regs = mem; in macb_probe()
2785 bp->num_queues = num_queues; in macb_probe()
2786 bp->queue_mask = queue_mask; in macb_probe()
2788 bp->dma_burst_length = macb_config->dma_burst_length; in macb_probe()
2789 bp->pclk = pclk; in macb_probe()
2790 bp->hclk = hclk; in macb_probe()
2791 bp->tx_clk = tx_clk; in macb_probe()
2792 spin_lock_init(&bp->lock); in macb_probe()
2795 macb_configure_caps(bp, macb_config); in macb_probe()
2807 memcpy(bp->dev->dev_addr, mac, ETH_ALEN); in macb_probe()
2809 macb_get_hwaddr(bp); in macb_probe()
2815 bp->phy_interface = PHY_INTERFACE_MODE_RMII; in macb_probe()
2817 bp->phy_interface = PHY_INTERFACE_MODE_MII; in macb_probe()
2819 bp->phy_interface = err; in macb_probe()
2833 err = macb_mii_init(bp); in macb_probe()
2840 macb_is_gem(bp) ? "GEM" : "MACB", macb_readl(bp, MID), in macb_probe()
2843 phydev = bp->phy_dev; in macb_probe()
2866 struct macb *bp; in macb_remove() local
2871 bp = netdev_priv(dev); in macb_remove()
2872 if (bp->phy_dev) in macb_remove()
2873 phy_disconnect(bp->phy_dev); in macb_remove()
2874 mdiobus_unregister(bp->mii_bus); in macb_remove()
2875 kfree(bp->mii_bus->irq); in macb_remove()
2876 mdiobus_free(bp->mii_bus); in macb_remove()
2878 clk_disable_unprepare(bp->tx_clk); in macb_remove()
2879 clk_disable_unprepare(bp->hclk); in macb_remove()
2880 clk_disable_unprepare(bp->pclk); in macb_remove()
2891 struct macb *bp = netdev_priv(netdev); in macb_suspend() local
2896 clk_disable_unprepare(bp->tx_clk); in macb_suspend()
2897 clk_disable_unprepare(bp->hclk); in macb_suspend()
2898 clk_disable_unprepare(bp->pclk); in macb_suspend()
2907 struct macb *bp = netdev_priv(netdev); in macb_resume() local
2909 clk_prepare_enable(bp->pclk); in macb_resume()
2910 clk_prepare_enable(bp->hclk); in macb_resume()
2911 clk_prepare_enable(bp->tx_clk); in macb_resume()