Lines Matching refs:bp
69 static struct macb_dma_desc *macb_tx_desc(struct macb *bp, unsigned int index) in macb_tx_desc() argument
71 return &bp->tx_ring[macb_tx_ring_wrap(index)]; in macb_tx_desc()
74 static struct macb_tx_skb *macb_tx_skb(struct macb *bp, unsigned int index) in macb_tx_skb() argument
76 return &bp->tx_skb[macb_tx_ring_wrap(index)]; in macb_tx_skb()
79 static dma_addr_t macb_tx_dma(struct macb *bp, unsigned int index) in macb_tx_dma() argument
85 return bp->tx_ring_dma + offset; in macb_tx_dma()
93 static struct macb_dma_desc *macb_rx_desc(struct macb *bp, unsigned int index) in macb_rx_desc() argument
95 return &bp->rx_ring[macb_rx_ring_wrap(index)]; in macb_rx_desc()
98 static void *macb_rx_buffer(struct macb *bp, unsigned int index) in macb_rx_buffer() argument
100 return bp->rx_buffers + bp->rx_buffer_size * macb_rx_ring_wrap(index); in macb_rx_buffer()
103 void macb_set_hwaddr(struct macb *bp) in macb_set_hwaddr() argument
108 bottom = cpu_to_le32(*((u32 *)bp->dev->dev_addr)); in macb_set_hwaddr()
109 macb_or_gem_writel(bp, SA1B, bottom); in macb_set_hwaddr()
110 top = cpu_to_le16(*((u16 *)(bp->dev->dev_addr + 4))); in macb_set_hwaddr()
111 macb_or_gem_writel(bp, SA1T, top); in macb_set_hwaddr()
114 macb_or_gem_writel(bp, SA2B, 0); in macb_set_hwaddr()
115 macb_or_gem_writel(bp, SA2T, 0); in macb_set_hwaddr()
116 macb_or_gem_writel(bp, SA3B, 0); in macb_set_hwaddr()
117 macb_or_gem_writel(bp, SA3T, 0); in macb_set_hwaddr()
118 macb_or_gem_writel(bp, SA4B, 0); in macb_set_hwaddr()
119 macb_or_gem_writel(bp, SA4T, 0); in macb_set_hwaddr()
123 void macb_get_hwaddr(struct macb *bp) in macb_get_hwaddr() argument
131 pdata = dev_get_platdata(&bp->pdev->dev); in macb_get_hwaddr()
135 bottom = macb_or_gem_readl(bp, SA1B + i * 8); in macb_get_hwaddr()
136 top = macb_or_gem_readl(bp, SA1T + i * 8); in macb_get_hwaddr()
155 memcpy(bp->dev->dev_addr, addr, sizeof(addr)); in macb_get_hwaddr()
160 netdev_info(bp->dev, "invalid hw address, using random\n"); in macb_get_hwaddr()
161 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()
247 struct macb *bp = netdev_priv(dev); in macb_handle_link_change() local
248 struct phy_device *phydev = bp->phy_dev; in macb_handle_link_change()
253 spin_lock_irqsave(&bp->lock, flags); in macb_handle_link_change()
256 if ((bp->speed != phydev->speed) || in macb_handle_link_change()
257 (bp->duplex != phydev->duplex)) { in macb_handle_link_change()
260 reg = macb_readl(bp, NCFGR); in macb_handle_link_change()
262 if (macb_is_gem(bp)) in macb_handle_link_change()
270 bp->caps & MACB_CAPS_GIGABIT_MODE_AVAILABLE) in macb_handle_link_change()
273 macb_or_gem_writel(bp, NCFGR, reg); in macb_handle_link_change()
275 bp->speed = phydev->speed; in macb_handle_link_change()
276 bp->duplex = phydev->duplex; in macb_handle_link_change()
281 if (phydev->link != bp->link) { in macb_handle_link_change()
283 bp->speed = 0; in macb_handle_link_change()
284 bp->duplex = -1; in macb_handle_link_change()
286 bp->link = phydev->link; in macb_handle_link_change()
291 spin_unlock_irqrestore(&bp->lock, flags); in macb_handle_link_change()
293 if (!IS_ERR(bp->tx_clk)) in macb_handle_link_change()
294 macb_set_tx_clk(bp->tx_clk, phydev->speed, dev); in macb_handle_link_change()
313 struct macb *bp = netdev_priv(dev); in macb_mii_probe() local
319 phydev = phy_find_first(bp->mii_bus); in macb_mii_probe()
325 pdata = dev_get_platdata(&bp->pdev->dev); in macb_mii_probe()
327 ret = devm_gpio_request(&bp->pdev->dev, pdata->phy_irq_pin, "phy int"); in macb_mii_probe()
336 bp->phy_interface); in macb_mii_probe()
343 if (macb_is_gem(bp) && bp->caps & MACB_CAPS_GIGABIT_MODE_AVAILABLE) in macb_mii_probe()
350 bp->link = 0; in macb_mii_probe()
351 bp->speed = 0; in macb_mii_probe()
352 bp->duplex = -1; in macb_mii_probe()
353 bp->phy_dev = phydev; in macb_mii_probe()
358 int macb_mii_init(struct macb *bp) in macb_mii_init() argument
365 macb_writel(bp, NCR, MACB_BIT(MPE)); in macb_mii_init()
367 bp->mii_bus = mdiobus_alloc(); in macb_mii_init()
368 if (bp->mii_bus == NULL) { in macb_mii_init()
373 bp->mii_bus->name = "MACB_mii_bus"; in macb_mii_init()
374 bp->mii_bus->read = &macb_mdio_read; in macb_mii_init()
375 bp->mii_bus->write = &macb_mdio_write; in macb_mii_init()
376 snprintf(bp->mii_bus->id, MII_BUS_ID_SIZE, "%s-%x", in macb_mii_init()
377 bp->pdev->name, bp->pdev->id); in macb_mii_init()
378 bp->mii_bus->priv = bp; in macb_mii_init()
379 bp->mii_bus->parent = &bp->dev->dev; in macb_mii_init()
380 pdata = dev_get_platdata(&bp->pdev->dev); in macb_mii_init()
382 bp->mii_bus->irq = kmalloc(sizeof(int)*PHY_MAX_ADDR, GFP_KERNEL); in macb_mii_init()
383 if (!bp->mii_bus->irq) { in macb_mii_init()
388 dev_set_drvdata(&bp->dev->dev, bp->mii_bus); in macb_mii_init()
390 np = bp->pdev->dev.of_node; in macb_mii_init()
393 err = of_mdiobus_register(bp->mii_bus, np); in macb_mii_init()
397 if (!err && !phy_find_first(bp->mii_bus)) { in macb_mii_init()
401 phydev = mdiobus_scan(bp->mii_bus, i); in macb_mii_init()
413 bp->mii_bus->irq[i] = PHY_POLL; in macb_mii_init()
416 bp->mii_bus->phy_mask = pdata->phy_mask; in macb_mii_init()
418 err = mdiobus_register(bp->mii_bus); in macb_mii_init()
424 err = macb_mii_probe(bp->dev); in macb_mii_init()
431 mdiobus_unregister(bp->mii_bus); in macb_mii_init()
433 kfree(bp->mii_bus->irq); in macb_mii_init()
435 mdiobus_free(bp->mii_bus); in macb_mii_init()
441 static void macb_update_stats(struct macb *bp) in macb_update_stats() argument
443 u32 __iomem *reg = bp->regs + MACB_PFR; in macb_update_stats()
444 u32 *p = &bp->hw_stats.macb.rx_pause_frames; in macb_update_stats()
445 u32 *end = &bp->hw_stats.macb.tx_pause_frames + 1; in macb_update_stats()
453 static int macb_halt_tx(struct macb *bp) in macb_halt_tx() argument
458 macb_writel(bp, NCR, macb_readl(bp, NCR) | MACB_BIT(THALT)); in macb_halt_tx()
463 status = macb_readl(bp, TSR); in macb_halt_tx()
473 static void macb_tx_unmap(struct macb *bp, struct macb_tx_skb *tx_skb) in macb_tx_unmap() argument
477 dma_unmap_page(&bp->pdev->dev, tx_skb->mapping, in macb_tx_unmap()
480 dma_unmap_single(&bp->pdev->dev, tx_skb->mapping, in macb_tx_unmap()
493 struct macb *bp = container_of(work, struct macb, tx_error_task); in macb_tx_error_task() local
498 netdev_vdbg(bp->dev, "macb_tx_error_task: t = %u, h = %u\n", in macb_tx_error_task()
499 bp->tx_tail, bp->tx_head); in macb_tx_error_task()
502 netif_stop_queue(bp->dev); in macb_tx_error_task()
508 if (macb_halt_tx(bp)) in macb_tx_error_task()
510 netdev_err(bp->dev, "BUG: halt tx timed out\n"); in macb_tx_error_task()
518 for (tail = bp->tx_tail; tail != bp->tx_head; tail++) { in macb_tx_error_task()
522 desc = macb_tx_desc(bp, tail); in macb_tx_error_task()
524 tx_skb = macb_tx_skb(bp, tail); in macb_tx_error_task()
530 macb_tx_unmap(bp, tx_skb); in macb_tx_error_task()
532 tx_skb = macb_tx_skb(bp, tail); in macb_tx_error_task()
540 netdev_vdbg(bp->dev, "txerr skb %u (data %p) TX complete\n", in macb_tx_error_task()
542 bp->stats.tx_packets++; in macb_tx_error_task()
543 bp->stats.tx_bytes += skb->len; in macb_tx_error_task()
552 netdev_err(bp->dev, in macb_tx_error_task()
558 macb_tx_unmap(bp, tx_skb); in macb_tx_error_task()
565 macb_writel(bp, TBQP, bp->tx_ring_dma); in macb_tx_error_task()
567 bp->tx_head = bp->tx_tail = 0; in macb_tx_error_task()
570 netif_wake_queue(bp->dev); in macb_tx_error_task()
573 macb_writel(bp, TSR, macb_readl(bp, TSR)); in macb_tx_error_task()
574 macb_writel(bp, IER, MACB_TX_INT_FLAGS); in macb_tx_error_task()
577 static void macb_tx_interrupt(struct macb *bp) in macb_tx_interrupt() argument
583 status = macb_readl(bp, TSR); in macb_tx_interrupt()
584 macb_writel(bp, TSR, status); in macb_tx_interrupt()
586 if (bp->caps & MACB_CAPS_ISR_CLEAR_ON_WRITE) in macb_tx_interrupt()
587 macb_writel(bp, ISR, MACB_BIT(TCOMP)); in macb_tx_interrupt()
589 netdev_vdbg(bp->dev, "macb_tx_interrupt status = 0x%03lx\n", in macb_tx_interrupt()
592 head = bp->tx_head; in macb_tx_interrupt()
593 for (tail = bp->tx_tail; tail != head; tail++) { in macb_tx_interrupt()
599 desc = macb_tx_desc(bp, tail); in macb_tx_interrupt()
614 tx_skb = macb_tx_skb(bp, tail); in macb_tx_interrupt()
619 netdev_vdbg(bp->dev, "skb %u (data %p) TX complete\n", in macb_tx_interrupt()
621 bp->stats.tx_packets++; in macb_tx_interrupt()
622 bp->stats.tx_bytes += skb->len; in macb_tx_interrupt()
626 macb_tx_unmap(bp, tx_skb); in macb_tx_interrupt()
637 bp->tx_tail = tail; in macb_tx_interrupt()
638 if (netif_queue_stopped(bp->dev) in macb_tx_interrupt()
639 && CIRC_CNT(bp->tx_head, bp->tx_tail, in macb_tx_interrupt()
641 netif_wake_queue(bp->dev); in macb_tx_interrupt()
644 static void gem_rx_refill(struct macb *bp) in gem_rx_refill() argument
650 while (CIRC_SPACE(bp->rx_prepared_head, bp->rx_tail, RX_RING_SIZE) > 0) { in gem_rx_refill()
651 entry = macb_rx_ring_wrap(bp->rx_prepared_head); in gem_rx_refill()
656 bp->rx_prepared_head++; in gem_rx_refill()
658 if (bp->rx_skbuff[entry] == NULL) { in gem_rx_refill()
660 skb = netdev_alloc_skb(bp->dev, bp->rx_buffer_size); in gem_rx_refill()
662 netdev_err(bp->dev, in gem_rx_refill()
668 paddr = dma_map_single(&bp->pdev->dev, skb->data, in gem_rx_refill()
669 bp->rx_buffer_size, DMA_FROM_DEVICE); in gem_rx_refill()
670 if (dma_mapping_error(&bp->pdev->dev, paddr)) { in gem_rx_refill()
675 bp->rx_skbuff[entry] = skb; in gem_rx_refill()
679 bp->rx_ring[entry].addr = paddr; in gem_rx_refill()
680 bp->rx_ring[entry].ctrl = 0; in gem_rx_refill()
690 netdev_vdbg(bp->dev, "rx ring: prepared head %d, tail %d\n", in gem_rx_refill()
691 bp->rx_prepared_head, bp->rx_tail); in gem_rx_refill()
695 static void discard_partial_frame(struct macb *bp, unsigned int begin, in discard_partial_frame() argument
701 struct macb_dma_desc *desc = macb_rx_desc(bp, frag); in discard_partial_frame()
715 static int gem_rx(struct macb *bp, int budget) in gem_rx() argument
726 entry = macb_rx_ring_wrap(bp->rx_tail); in gem_rx()
727 desc = &bp->rx_ring[entry]; in gem_rx()
738 bp->rx_tail++; in gem_rx()
742 netdev_err(bp->dev, in gem_rx()
744 bp->stats.rx_dropped++; in gem_rx()
747 skb = bp->rx_skbuff[entry]; in gem_rx()
749 netdev_err(bp->dev, in gem_rx()
751 bp->stats.rx_dropped++; in gem_rx()
755 bp->rx_skbuff[entry] = NULL; in gem_rx()
758 netdev_vdbg(bp->dev, "gem_rx %u (len %u)\n", entry, len); in gem_rx()
762 dma_unmap_single(&bp->pdev->dev, addr, in gem_rx()
763 bp->rx_buffer_size, DMA_FROM_DEVICE); in gem_rx()
765 skb->protocol = eth_type_trans(skb, bp->dev); in gem_rx()
767 if (bp->dev->features & NETIF_F_RXCSUM && in gem_rx()
768 !(bp->dev->flags & IFF_PROMISC) && in gem_rx()
772 bp->stats.rx_packets++; in gem_rx()
773 bp->stats.rx_bytes += skb->len; in gem_rx()
776 netdev_vdbg(bp->dev, "received skb of length %u, csum: %08x\n", in gem_rx()
787 gem_rx_refill(bp); in gem_rx()
792 static int macb_rx_frame(struct macb *bp, unsigned int first_frag, in macb_rx_frame() argument
801 desc = macb_rx_desc(bp, last_frag); in macb_rx_frame()
804 netdev_vdbg(bp->dev, "macb_rx_frame frags %u - %u (len %u)\n", in macb_rx_frame()
817 skb = netdev_alloc_skb(bp->dev, len + NET_IP_ALIGN); in macb_rx_frame()
819 bp->stats.rx_dropped++; in macb_rx_frame()
821 desc = macb_rx_desc(bp, frag); in macb_rx_frame()
839 unsigned int frag_len = bp->rx_buffer_size; in macb_rx_frame()
846 macb_rx_buffer(bp, frag), frag_len); in macb_rx_frame()
847 offset += bp->rx_buffer_size; in macb_rx_frame()
848 desc = macb_rx_desc(bp, frag); in macb_rx_frame()
859 skb->protocol = eth_type_trans(skb, bp->dev); in macb_rx_frame()
861 bp->stats.rx_packets++; in macb_rx_frame()
862 bp->stats.rx_bytes += skb->len; in macb_rx_frame()
863 netdev_vdbg(bp->dev, "received skb of length %u, csum: %08x\n", in macb_rx_frame()
870 static int macb_rx(struct macb *bp, int budget) in macb_rx() argument
876 for (tail = bp->rx_tail; budget > 0; tail++) { in macb_rx()
877 struct macb_dma_desc *desc = macb_rx_desc(bp, tail); in macb_rx()
891 discard_partial_frame(bp, first_frag, tail); in macb_rx()
899 dropped = macb_rx_frame(bp, first_frag, tail); in macb_rx()
909 bp->rx_tail = first_frag; in macb_rx()
911 bp->rx_tail = tail; in macb_rx()
918 struct macb *bp = container_of(napi, struct macb, napi); in macb_poll() local
922 status = macb_readl(bp, RSR); in macb_poll()
923 macb_writel(bp, RSR, status); in macb_poll()
927 netdev_vdbg(bp->dev, "poll: status = %08lx, budget = %d\n", in macb_poll()
930 work_done = bp->macbgem_ops.mog_rx(bp, budget); in macb_poll()
935 status = macb_readl(bp, RSR); in macb_poll()
937 if (bp->caps & MACB_CAPS_ISR_CLEAR_ON_WRITE) in macb_poll()
938 macb_writel(bp, ISR, MACB_BIT(RCOMP)); in macb_poll()
941 macb_writel(bp, IER, MACB_RX_INT_FLAGS); in macb_poll()
953 struct macb *bp = netdev_priv(dev); in macb_interrupt() local
956 status = macb_readl(bp, ISR); in macb_interrupt()
961 spin_lock(&bp->lock); in macb_interrupt()
966 macb_writel(bp, IDR, -1); in macb_interrupt()
970 netdev_vdbg(bp->dev, "isr = 0x%08lx\n", (unsigned long)status); in macb_interrupt()
980 macb_writel(bp, IDR, MACB_RX_INT_FLAGS); in macb_interrupt()
981 if (bp->caps & MACB_CAPS_ISR_CLEAR_ON_WRITE) in macb_interrupt()
982 macb_writel(bp, ISR, MACB_BIT(RCOMP)); in macb_interrupt()
984 if (napi_schedule_prep(&bp->napi)) { in macb_interrupt()
985 netdev_vdbg(bp->dev, "scheduling RX softirq\n"); in macb_interrupt()
986 __napi_schedule(&bp->napi); in macb_interrupt()
991 macb_writel(bp, IDR, MACB_TX_INT_FLAGS); in macb_interrupt()
992 schedule_work(&bp->tx_error_task); in macb_interrupt()
994 if (bp->caps & MACB_CAPS_ISR_CLEAR_ON_WRITE) in macb_interrupt()
995 macb_writel(bp, ISR, MACB_TX_ERR_FLAGS); in macb_interrupt()
1001 macb_tx_interrupt(bp); in macb_interrupt()
1010 if (macb_is_gem(bp)) in macb_interrupt()
1011 bp->hw_stats.gem.rx_overruns++; in macb_interrupt()
1013 bp->hw_stats.macb.rx_overruns++; in macb_interrupt()
1015 if (bp->caps & MACB_CAPS_ISR_CLEAR_ON_WRITE) in macb_interrupt()
1016 macb_writel(bp, ISR, MACB_BIT(ISR_ROVR)); in macb_interrupt()
1027 if (bp->caps & MACB_CAPS_ISR_CLEAR_ON_WRITE) in macb_interrupt()
1028 macb_writel(bp, ISR, MACB_BIT(HRESP)); in macb_interrupt()
1031 status = macb_readl(bp, ISR); in macb_interrupt()
1034 spin_unlock(&bp->lock); in macb_interrupt()
1054 static inline unsigned int macb_count_tx_descriptors(struct macb *bp, in macb_count_tx_descriptors() argument
1057 return (len + bp->max_tx_length - 1) / bp->max_tx_length; in macb_count_tx_descriptors()
1060 static unsigned int macb_tx_map(struct macb *bp, in macb_tx_map() argument
1064 unsigned int len, entry, i, tx_head = bp->tx_head; in macb_tx_map()
1076 size = min(len, bp->max_tx_length); in macb_tx_map()
1078 tx_skb = &bp->tx_skb[entry]; in macb_tx_map()
1080 mapping = dma_map_single(&bp->pdev->dev, in macb_tx_map()
1083 if (dma_mapping_error(&bp->pdev->dev, mapping)) in macb_tx_map()
1105 size = min(len, bp->max_tx_length); in macb_tx_map()
1107 tx_skb = &bp->tx_skb[entry]; in macb_tx_map()
1109 mapping = skb_frag_dma_map(&bp->pdev->dev, frag, in macb_tx_map()
1111 if (dma_mapping_error(&bp->pdev->dev, mapping)) in macb_tx_map()
1129 netdev_err(bp->dev, "BUG! empty skb!\n"); in macb_tx_map()
1146 desc = &bp->tx_ring[entry]; in macb_tx_map()
1152 tx_skb = &bp->tx_skb[entry]; in macb_tx_map()
1153 desc = &bp->tx_ring[entry]; in macb_tx_map()
1170 } while (i != bp->tx_head); in macb_tx_map()
1172 bp->tx_head = tx_head; in macb_tx_map()
1177 netdev_err(bp->dev, "TX DMA map failed\n"); in macb_tx_map()
1179 for (i = bp->tx_head; i != tx_head; i++) { in macb_tx_map()
1180 tx_skb = macb_tx_skb(bp, i); in macb_tx_map()
1182 macb_tx_unmap(bp, tx_skb); in macb_tx_map()
1190 struct macb *bp = netdev_priv(dev); in macb_start_xmit() local
1195 netdev_vdbg(bp->dev, in macb_start_xmit()
1207 count = macb_count_tx_descriptors(bp, skb_headlen(skb)); in macb_start_xmit()
1211 count += macb_count_tx_descriptors(bp, frag_size); in macb_start_xmit()
1214 spin_lock_irqsave(&bp->lock, flags); in macb_start_xmit()
1217 if (CIRC_SPACE(bp->tx_head, bp->tx_tail, TX_RING_SIZE) < count) { in macb_start_xmit()
1219 spin_unlock_irqrestore(&bp->lock, flags); in macb_start_xmit()
1220 netdev_dbg(bp->dev, "tx_head = %u, tx_tail = %u\n", in macb_start_xmit()
1221 bp->tx_head, bp->tx_tail); in macb_start_xmit()
1226 if (!macb_tx_map(bp, skb)) { in macb_start_xmit()
1236 macb_writel(bp, NCR, macb_readl(bp, NCR) | MACB_BIT(TSTART)); in macb_start_xmit()
1238 if (CIRC_SPACE(bp->tx_head, bp->tx_tail, TX_RING_SIZE) < 1) in macb_start_xmit()
1242 spin_unlock_irqrestore(&bp->lock, flags); in macb_start_xmit()
1247 static void macb_init_rx_buffer_size(struct macb *bp, size_t size) in macb_init_rx_buffer_size() argument
1249 if (!macb_is_gem(bp)) { in macb_init_rx_buffer_size()
1250 bp->rx_buffer_size = MACB_RX_BUFFER_SIZE; in macb_init_rx_buffer_size()
1252 bp->rx_buffer_size = size; in macb_init_rx_buffer_size()
1254 if (bp->rx_buffer_size % RX_BUFFER_MULTIPLE) { in macb_init_rx_buffer_size()
1255 netdev_dbg(bp->dev, in macb_init_rx_buffer_size()
1258 bp->rx_buffer_size = in macb_init_rx_buffer_size()
1259 roundup(bp->rx_buffer_size, RX_BUFFER_MULTIPLE); in macb_init_rx_buffer_size()
1263 netdev_dbg(bp->dev, "mtu [%u] rx_buffer_size [%Zu]\n", in macb_init_rx_buffer_size()
1264 bp->dev->mtu, bp->rx_buffer_size); in macb_init_rx_buffer_size()
1267 static void gem_free_rx_buffers(struct macb *bp) in gem_free_rx_buffers() argument
1274 if (!bp->rx_skbuff) in gem_free_rx_buffers()
1278 skb = bp->rx_skbuff[i]; in gem_free_rx_buffers()
1283 desc = &bp->rx_ring[i]; in gem_free_rx_buffers()
1285 dma_unmap_single(&bp->pdev->dev, addr, bp->rx_buffer_size, in gem_free_rx_buffers()
1291 kfree(bp->rx_skbuff); in gem_free_rx_buffers()
1292 bp->rx_skbuff = NULL; in gem_free_rx_buffers()
1295 static void macb_free_rx_buffers(struct macb *bp) in macb_free_rx_buffers() argument
1297 if (bp->rx_buffers) { in macb_free_rx_buffers()
1298 dma_free_coherent(&bp->pdev->dev, in macb_free_rx_buffers()
1299 RX_RING_SIZE * bp->rx_buffer_size, in macb_free_rx_buffers()
1300 bp->rx_buffers, bp->rx_buffers_dma); in macb_free_rx_buffers()
1301 bp->rx_buffers = NULL; in macb_free_rx_buffers()
1305 static void macb_free_consistent(struct macb *bp) in macb_free_consistent() argument
1307 if (bp->tx_skb) { in macb_free_consistent()
1308 kfree(bp->tx_skb); in macb_free_consistent()
1309 bp->tx_skb = NULL; in macb_free_consistent()
1311 bp->macbgem_ops.mog_free_rx_buffers(bp); in macb_free_consistent()
1312 if (bp->rx_ring) { in macb_free_consistent()
1313 dma_free_coherent(&bp->pdev->dev, RX_RING_BYTES, in macb_free_consistent()
1314 bp->rx_ring, bp->rx_ring_dma); in macb_free_consistent()
1315 bp->rx_ring = NULL; in macb_free_consistent()
1317 if (bp->tx_ring) { in macb_free_consistent()
1318 dma_free_coherent(&bp->pdev->dev, TX_RING_BYTES, in macb_free_consistent()
1319 bp->tx_ring, bp->tx_ring_dma); in macb_free_consistent()
1320 bp->tx_ring = NULL; in macb_free_consistent()
1324 static int gem_alloc_rx_buffers(struct macb *bp) in gem_alloc_rx_buffers() argument
1329 bp->rx_skbuff = kzalloc(size, GFP_KERNEL); in gem_alloc_rx_buffers()
1330 if (!bp->rx_skbuff) in gem_alloc_rx_buffers()
1333 netdev_dbg(bp->dev, in gem_alloc_rx_buffers()
1335 RX_RING_SIZE, bp->rx_skbuff); in gem_alloc_rx_buffers()
1339 static int macb_alloc_rx_buffers(struct macb *bp) in macb_alloc_rx_buffers() argument
1343 size = RX_RING_SIZE * bp->rx_buffer_size; in macb_alloc_rx_buffers()
1344 bp->rx_buffers = dma_alloc_coherent(&bp->pdev->dev, size, in macb_alloc_rx_buffers()
1345 &bp->rx_buffers_dma, GFP_KERNEL); in macb_alloc_rx_buffers()
1346 if (!bp->rx_buffers) in macb_alloc_rx_buffers()
1349 netdev_dbg(bp->dev, in macb_alloc_rx_buffers()
1351 size, (unsigned long)bp->rx_buffers_dma, bp->rx_buffers); in macb_alloc_rx_buffers()
1355 static int macb_alloc_consistent(struct macb *bp) in macb_alloc_consistent() argument
1360 bp->tx_skb = kmalloc(size, GFP_KERNEL); in macb_alloc_consistent()
1361 if (!bp->tx_skb) in macb_alloc_consistent()
1365 bp->rx_ring = dma_alloc_coherent(&bp->pdev->dev, size, in macb_alloc_consistent()
1366 &bp->rx_ring_dma, GFP_KERNEL); in macb_alloc_consistent()
1367 if (!bp->rx_ring) in macb_alloc_consistent()
1369 netdev_dbg(bp->dev, in macb_alloc_consistent()
1371 size, (unsigned long)bp->rx_ring_dma, bp->rx_ring); in macb_alloc_consistent()
1374 bp->tx_ring = dma_alloc_coherent(&bp->pdev->dev, size, in macb_alloc_consistent()
1375 &bp->tx_ring_dma, GFP_KERNEL); in macb_alloc_consistent()
1376 if (!bp->tx_ring) in macb_alloc_consistent()
1378 netdev_dbg(bp->dev, in macb_alloc_consistent()
1380 size, (unsigned long)bp->tx_ring_dma, bp->tx_ring); in macb_alloc_consistent()
1382 if (bp->macbgem_ops.mog_alloc_rx_buffers(bp)) in macb_alloc_consistent()
1388 macb_free_consistent(bp); in macb_alloc_consistent()
1392 static void gem_init_rings(struct macb *bp) in gem_init_rings() argument
1397 bp->tx_ring[i].addr = 0; in gem_init_rings()
1398 bp->tx_ring[i].ctrl = MACB_BIT(TX_USED); in gem_init_rings()
1400 bp->tx_ring[TX_RING_SIZE - 1].ctrl |= MACB_BIT(TX_WRAP); in gem_init_rings()
1402 bp->rx_tail = bp->rx_prepared_head = bp->tx_head = bp->tx_tail = 0; in gem_init_rings()
1404 gem_rx_refill(bp); in gem_init_rings()
1407 static void macb_init_rings(struct macb *bp) in macb_init_rings() argument
1412 addr = bp->rx_buffers_dma; in macb_init_rings()
1414 bp->rx_ring[i].addr = addr; in macb_init_rings()
1415 bp->rx_ring[i].ctrl = 0; in macb_init_rings()
1416 addr += bp->rx_buffer_size; in macb_init_rings()
1418 bp->rx_ring[RX_RING_SIZE - 1].addr |= MACB_BIT(RX_WRAP); in macb_init_rings()
1421 bp->tx_ring[i].addr = 0; in macb_init_rings()
1422 bp->tx_ring[i].ctrl = MACB_BIT(TX_USED); in macb_init_rings()
1424 bp->tx_ring[TX_RING_SIZE - 1].ctrl |= MACB_BIT(TX_WRAP); in macb_init_rings()
1426 bp->rx_tail = bp->tx_head = bp->tx_tail = 0; in macb_init_rings()
1429 static void macb_reset_hw(struct macb *bp) in macb_reset_hw() argument
1435 macb_writel(bp, NCR, 0); in macb_reset_hw()
1438 macb_writel(bp, NCR, MACB_BIT(CLRSTAT)); in macb_reset_hw()
1441 macb_writel(bp, TSR, -1); in macb_reset_hw()
1442 macb_writel(bp, RSR, -1); in macb_reset_hw()
1445 macb_writel(bp, IDR, -1); in macb_reset_hw()
1446 macb_readl(bp, ISR); in macb_reset_hw()
1449 static u32 gem_mdc_clk_div(struct macb *bp) in gem_mdc_clk_div() argument
1452 unsigned long pclk_hz = clk_get_rate(bp->pclk); in gem_mdc_clk_div()
1470 static u32 macb_mdc_clk_div(struct macb *bp) in macb_mdc_clk_div() argument
1475 if (macb_is_gem(bp)) in macb_mdc_clk_div()
1476 return gem_mdc_clk_div(bp); in macb_mdc_clk_div()
1478 pclk_hz = clk_get_rate(bp->pclk); in macb_mdc_clk_div()
1496 static u32 macb_dbw(struct macb *bp) in macb_dbw() argument
1498 if (!macb_is_gem(bp)) in macb_dbw()
1501 switch (GEM_BFEXT(DBWDEF, gem_readl(bp, DCFG1))) { in macb_dbw()
1520 static void macb_configure_dma(struct macb *bp) in macb_configure_dma() argument
1524 if (macb_is_gem(bp)) { in macb_configure_dma()
1525 dmacfg = gem_readl(bp, DMACFG) & ~GEM_BF(RXBS, -1L); in macb_configure_dma()
1526 dmacfg |= GEM_BF(RXBS, bp->rx_buffer_size / RX_BUFFER_MULTIPLE); in macb_configure_dma()
1527 if (bp->dma_burst_length) in macb_configure_dma()
1528 dmacfg = GEM_BFINS(FBLDO, bp->dma_burst_length, dmacfg); in macb_configure_dma()
1531 if (bp->dev->features & NETIF_F_HW_CSUM) in macb_configure_dma()
1535 netdev_dbg(bp->dev, "Cadence configure DMA with 0x%08x\n", in macb_configure_dma()
1537 gem_writel(bp, DMACFG, dmacfg); in macb_configure_dma()
1541 static void macb_init_hw(struct macb *bp) in macb_init_hw() argument
1545 macb_reset_hw(bp); in macb_init_hw()
1546 macb_set_hwaddr(bp); in macb_init_hw()
1548 config = macb_mdc_clk_div(bp); in macb_init_hw()
1553 if (bp->dev->flags & IFF_PROMISC) in macb_init_hw()
1555 else if (macb_is_gem(bp) && bp->dev->features & NETIF_F_RXCSUM) in macb_init_hw()
1557 if (!(bp->dev->flags & IFF_BROADCAST)) in macb_init_hw()
1559 config |= macb_dbw(bp); in macb_init_hw()
1560 macb_writel(bp, NCFGR, config); in macb_init_hw()
1561 bp->speed = SPEED_10; in macb_init_hw()
1562 bp->duplex = DUPLEX_HALF; in macb_init_hw()
1564 macb_configure_dma(bp); in macb_init_hw()
1567 macb_writel(bp, RBQP, bp->rx_ring_dma); in macb_init_hw()
1568 macb_writel(bp, TBQP, bp->tx_ring_dma); in macb_init_hw()
1571 macb_writel(bp, NCR, MACB_BIT(RE) | MACB_BIT(TE) | MACB_BIT(MPE)); in macb_init_hw()
1574 macb_writel(bp, IER, (MACB_RX_INT_FLAGS in macb_init_hw()
1647 struct macb *bp = netdev_priv(dev); in macb_sethashtable() local
1656 macb_or_gem_writel(bp, HRB, mc_filter[0]); in macb_sethashtable()
1657 macb_or_gem_writel(bp, HRT, mc_filter[1]); in macb_sethashtable()
1666 struct macb *bp = netdev_priv(dev); in macb_set_rx_mode() local
1668 cfg = macb_readl(bp, NCFGR); in macb_set_rx_mode()
1675 if (macb_is_gem(bp)) in macb_set_rx_mode()
1682 if (macb_is_gem(bp) && dev->features & NETIF_F_RXCSUM) in macb_set_rx_mode()
1688 macb_or_gem_writel(bp, HRB, -1); in macb_set_rx_mode()
1689 macb_or_gem_writel(bp, HRT, -1); in macb_set_rx_mode()
1697 macb_or_gem_writel(bp, HRB, 0); in macb_set_rx_mode()
1698 macb_or_gem_writel(bp, HRT, 0); in macb_set_rx_mode()
1702 macb_writel(bp, NCFGR, cfg); in macb_set_rx_mode()
1708 struct macb *bp = netdev_priv(dev); in macb_open() local
1712 netdev_dbg(bp->dev, "open\n"); in macb_open()
1718 if (!bp->phy_dev) in macb_open()
1722 macb_init_rx_buffer_size(bp, bufsz); in macb_open()
1724 err = macb_alloc_consistent(bp); in macb_open()
1731 napi_enable(&bp->napi); in macb_open()
1733 bp->macbgem_ops.mog_init_rings(bp); in macb_open()
1734 macb_init_hw(bp); in macb_open()
1737 phy_start(bp->phy_dev); in macb_open()
1746 struct macb *bp = netdev_priv(dev); in macb_close() local
1750 napi_disable(&bp->napi); in macb_close()
1752 if (bp->phy_dev) in macb_close()
1753 phy_stop(bp->phy_dev); in macb_close()
1755 spin_lock_irqsave(&bp->lock, flags); in macb_close()
1756 macb_reset_hw(bp); in macb_close()
1758 spin_unlock_irqrestore(&bp->lock, flags); in macb_close()
1760 macb_free_consistent(bp); in macb_close()
1765 static void gem_update_stats(struct macb *bp) in gem_update_stats() argument
1767 u32 __iomem *reg = bp->regs + GEM_OTX; in gem_update_stats()
1768 u32 *p = &bp->hw_stats.gem.tx_octets_31_0; in gem_update_stats()
1769 u32 *end = &bp->hw_stats.gem.rx_udp_checksum_errors + 1; in gem_update_stats()
1775 static struct net_device_stats *gem_get_stats(struct macb *bp) in gem_get_stats() argument
1777 struct gem_stats *hwstat = &bp->hw_stats.gem; in gem_get_stats()
1778 struct net_device_stats *nstat = &bp->stats; in gem_get_stats()
1780 gem_update_stats(bp); in gem_get_stats()
1815 struct macb *bp = netdev_priv(dev); in macb_get_stats() local
1816 struct net_device_stats *nstat = &bp->stats; in macb_get_stats()
1817 struct macb_stats *hwstat = &bp->hw_stats.macb; in macb_get_stats()
1819 if (macb_is_gem(bp)) in macb_get_stats()
1820 return gem_get_stats(bp); in macb_get_stats()
1823 macb_update_stats(bp); in macb_get_stats()
1863 struct macb *bp = netdev_priv(dev); in macb_get_settings() local
1864 struct phy_device *phydev = bp->phy_dev; in macb_get_settings()
1874 struct macb *bp = netdev_priv(dev); in macb_set_settings() local
1875 struct phy_device *phydev = bp->phy_dev; in macb_set_settings()
1891 struct macb *bp = netdev_priv(dev); in macb_get_regs() local
1895 regs->version = (macb_readl(bp, MID) & ((1 << MACB_REV_SIZE) - 1)) in macb_get_regs()
1898 tail = macb_tx_ring_wrap(bp->tx_tail); in macb_get_regs()
1899 head = macb_tx_ring_wrap(bp->tx_head); in macb_get_regs()
1901 regs_buff[0] = macb_readl(bp, NCR); in macb_get_regs()
1902 regs_buff[1] = macb_or_gem_readl(bp, NCFGR); in macb_get_regs()
1903 regs_buff[2] = macb_readl(bp, NSR); in macb_get_regs()
1904 regs_buff[3] = macb_readl(bp, TSR); in macb_get_regs()
1905 regs_buff[4] = macb_readl(bp, RBQP); in macb_get_regs()
1906 regs_buff[5] = macb_readl(bp, TBQP); in macb_get_regs()
1907 regs_buff[6] = macb_readl(bp, RSR); in macb_get_regs()
1908 regs_buff[7] = macb_readl(bp, IMR); in macb_get_regs()
1912 regs_buff[10] = macb_tx_dma(bp, tail); in macb_get_regs()
1913 regs_buff[11] = macb_tx_dma(bp, head); in macb_get_regs()
1915 if (macb_is_gem(bp)) { in macb_get_regs()
1916 regs_buff[12] = gem_readl(bp, USRIO); in macb_get_regs()
1917 regs_buff[13] = gem_readl(bp, DMACFG); in macb_get_regs()
1933 struct macb *bp = netdev_priv(dev); in macb_ioctl() local
1934 struct phy_device *phydev = bp->phy_dev; in macb_ioctl()
1949 struct macb *bp = netdev_priv(netdev); in macb_set_features() local
1953 if ((changed & NETIF_F_HW_CSUM) && macb_is_gem(bp)) { in macb_set_features()
1956 dmacfg = gem_readl(bp, DMACFG); in macb_set_features()
1961 gem_writel(bp, DMACFG, dmacfg); in macb_set_features()
1965 if ((changed & NETIF_F_RXCSUM) && macb_is_gem(bp)) { in macb_set_features()
1968 netcfg = gem_readl(bp, NCFGR); in macb_set_features()
1974 gem_writel(bp, NCFGR, netcfg); in macb_set_features()
2029 static void macb_configure_caps(struct macb *bp) in macb_configure_caps() argument
2035 if (bp->pdev->dev.of_node) { in macb_configure_caps()
2036 match = of_match_node(macb_dt_ids, bp->pdev->dev.of_node); in macb_configure_caps()
2040 bp->caps = config->caps; in macb_configure_caps()
2045 bp->dma_burst_length = config->dma_burst_length; in macb_configure_caps()
2049 if (MACB_BFEXT(IDNUM, macb_readl(bp, MID)) == 0x2) in macb_configure_caps()
2050 bp->caps |= MACB_CAPS_MACB_IS_GEM; in macb_configure_caps()
2052 if (macb_is_gem(bp)) { in macb_configure_caps()
2053 dcfg = gem_readl(bp, DCFG1); in macb_configure_caps()
2055 bp->caps |= MACB_CAPS_ISR_CLEAR_ON_WRITE; in macb_configure_caps()
2056 dcfg = gem_readl(bp, DCFG2); in macb_configure_caps()
2058 bp->caps |= MACB_CAPS_FIFO_MODE; in macb_configure_caps()
2061 netdev_dbg(bp->dev, "Cadence caps 0x%08x\n", bp->caps); in macb_configure_caps()
2069 struct macb *bp; in macb_probe() local
2082 dev = alloc_etherdev(sizeof(*bp)); in macb_probe()
2088 bp = netdev_priv(dev); in macb_probe()
2089 bp->pdev = pdev; in macb_probe()
2090 bp->dev = dev; in macb_probe()
2092 spin_lock_init(&bp->lock); in macb_probe()
2093 INIT_WORK(&bp->tx_error_task, macb_tx_error_task); in macb_probe()
2095 bp->pclk = devm_clk_get(&pdev->dev, "pclk"); in macb_probe()
2096 if (IS_ERR(bp->pclk)) { in macb_probe()
2097 err = PTR_ERR(bp->pclk); in macb_probe()
2102 bp->hclk = devm_clk_get(&pdev->dev, "hclk"); in macb_probe()
2103 if (IS_ERR(bp->hclk)) { in macb_probe()
2104 err = PTR_ERR(bp->hclk); in macb_probe()
2109 bp->tx_clk = devm_clk_get(&pdev->dev, "tx_clk"); in macb_probe()
2111 err = clk_prepare_enable(bp->pclk); in macb_probe()
2117 err = clk_prepare_enable(bp->hclk); in macb_probe()
2123 if (!IS_ERR(bp->tx_clk)) { in macb_probe()
2124 err = clk_prepare_enable(bp->tx_clk); in macb_probe()
2132 bp->regs = devm_ioremap(&pdev->dev, regs->start, resource_size(regs)); in macb_probe()
2133 if (!bp->regs) { in macb_probe()
2149 netif_napi_add(dev, &bp->napi, macb_poll, 64); in macb_probe()
2155 macb_configure_caps(bp); in macb_probe()
2158 if (macb_is_gem(bp)) { in macb_probe()
2159 bp->max_tx_length = GEM_MAX_TX_LEN; in macb_probe()
2160 bp->macbgem_ops.mog_alloc_rx_buffers = gem_alloc_rx_buffers; in macb_probe()
2161 bp->macbgem_ops.mog_free_rx_buffers = gem_free_rx_buffers; in macb_probe()
2162 bp->macbgem_ops.mog_init_rings = gem_init_rings; in macb_probe()
2163 bp->macbgem_ops.mog_rx = gem_rx; in macb_probe()
2165 bp->max_tx_length = MACB_MAX_TX_LEN; in macb_probe()
2166 bp->macbgem_ops.mog_alloc_rx_buffers = macb_alloc_rx_buffers; in macb_probe()
2167 bp->macbgem_ops.mog_free_rx_buffers = macb_free_rx_buffers; in macb_probe()
2168 bp->macbgem_ops.mog_init_rings = macb_init_rings; in macb_probe()
2169 bp->macbgem_ops.mog_rx = macb_rx; in macb_probe()
2175 if (macb_is_gem(bp) && !(bp->caps & MACB_CAPS_FIFO_MODE)) in macb_probe()
2177 if (bp->caps & MACB_CAPS_SG_DISABLED) in macb_probe()
2182 config = macb_mdc_clk_div(bp); in macb_probe()
2183 config |= macb_dbw(bp); in macb_probe()
2184 macb_writel(bp, NCFGR, config); in macb_probe()
2188 memcpy(bp->dev->dev_addr, mac, ETH_ALEN); in macb_probe()
2190 macb_get_hwaddr(bp); in macb_probe()
2196 bp->phy_interface = PHY_INTERFACE_MODE_RMII; in macb_probe()
2198 bp->phy_interface = PHY_INTERFACE_MODE_MII; in macb_probe()
2200 bp->phy_interface = err; in macb_probe()
2203 if (bp->phy_interface == PHY_INTERFACE_MODE_RGMII) in macb_probe()
2204 macb_or_gem_writel(bp, USRIO, GEM_BIT(RGMII)); in macb_probe()
2205 else if (bp->phy_interface == PHY_INTERFACE_MODE_RMII) in macb_probe()
2207 macb_or_gem_writel(bp, USRIO, (MACB_BIT(RMII) | in macb_probe()
2210 macb_or_gem_writel(bp, USRIO, 0); in macb_probe()
2214 macb_or_gem_writel(bp, USRIO, MACB_BIT(CLKEN)); in macb_probe()
2216 macb_or_gem_writel(bp, USRIO, MACB_BIT(MII)); in macb_probe()
2225 err = macb_mii_init(bp); in macb_probe()
2234 macb_is_gem(bp) ? "GEM" : "MACB", macb_readl(bp, MID), in macb_probe()
2237 phydev = bp->phy_dev; in macb_probe()
2246 if (!IS_ERR(bp->tx_clk)) in macb_probe()
2247 clk_disable_unprepare(bp->tx_clk); in macb_probe()
2249 clk_disable_unprepare(bp->hclk); in macb_probe()
2251 clk_disable_unprepare(bp->pclk); in macb_probe()
2261 struct macb *bp; in macb_remove() local
2266 bp = netdev_priv(dev); in macb_remove()
2267 if (bp->phy_dev) in macb_remove()
2268 phy_disconnect(bp->phy_dev); in macb_remove()
2269 mdiobus_unregister(bp->mii_bus); in macb_remove()
2270 kfree(bp->mii_bus->irq); in macb_remove()
2271 mdiobus_free(bp->mii_bus); in macb_remove()
2273 if (!IS_ERR(bp->tx_clk)) in macb_remove()
2274 clk_disable_unprepare(bp->tx_clk); in macb_remove()
2275 clk_disable_unprepare(bp->hclk); in macb_remove()
2276 clk_disable_unprepare(bp->pclk); in macb_remove()
2288 struct macb *bp = netdev_priv(netdev); in macb_suspend() local
2293 if (!IS_ERR(bp->tx_clk)) in macb_suspend()
2294 clk_disable_unprepare(bp->tx_clk); in macb_suspend()
2295 clk_disable_unprepare(bp->hclk); in macb_suspend()
2296 clk_disable_unprepare(bp->pclk); in macb_suspend()
2305 struct macb *bp = netdev_priv(netdev); in macb_resume() local
2307 clk_prepare_enable(bp->pclk); in macb_resume()
2308 clk_prepare_enable(bp->hclk); in macb_resume()
2309 if (!IS_ERR(bp->tx_clk)) in macb_resume()
2310 clk_prepare_enable(bp->tx_clk); in macb_resume()