Lines Matching refs:geth

108 	struct gemini_ethernet *geth;  member
547 struct gemini_ethernet *geth = port->geth; in gmac_setup_txqs() local
563 desc_ring = dma_alloc_coherent(geth->dev, len * sizeof(*desc_ring), in gmac_setup_txqs()
572 dev_warn(geth->dev, "TX queue base is not aligned\n"); in gmac_setup_txqs()
573 dma_free_coherent(geth->dev, len * sizeof(*desc_ring), in gmac_setup_txqs()
606 struct gemini_ethernet *geth = port->geth; in gmac_clean_txq() local
629 dma_unmap_single(geth->dev, mapping, in gmac_clean_txq()
677 struct gemini_ethernet *geth = port->geth; in gmac_cleanup_txqs() local
694 dma_free_coherent(geth->dev, in gmac_cleanup_txqs()
702 struct gemini_ethernet *geth = port->geth; in gmac_setup_rxq() local
705 qhdr = geth->base + TOE_DEFAULT_Q_HDR_BASE(netdev->dev_id); in gmac_setup_rxq()
709 port->rxq_ring = dma_alloc_coherent(geth->dev, in gmac_setup_rxq()
715 dev_warn(geth->dev, "RX queue base is not aligned\n"); in gmac_setup_rxq()
725 gmac_get_queue_page(struct gemini_ethernet *geth, in gmac_get_queue_page() argument
736 if (!geth->freeq_pages) { in gmac_get_queue_page()
737 dev_err(geth->dev, "try to get page with no page list\n"); in gmac_get_queue_page()
742 for (i = 0; i < geth->num_freeq_pages; i++) { in gmac_get_queue_page()
743 gpage = &geth->freeq_pages[i]; in gmac_get_queue_page()
754 struct gemini_ethernet *geth = port->geth; in gmac_cleanup_rxq() local
764 qhdr = geth->base + in gmac_cleanup_rxq()
788 gpage = gmac_get_queue_page(geth, port, mapping + PAGE_SIZE); in gmac_cleanup_rxq()
790 dev_err(geth->dev, "could not find page\n"); in gmac_cleanup_rxq()
797 dma_free_coherent(geth->dev, sizeof(*port->rxq_ring) << port->rxq_order, in gmac_cleanup_rxq()
801 static struct page *geth_freeq_alloc_map_page(struct gemini_ethernet *geth, in geth_freeq_alloc_map_page() argument
817 mapping = dma_map_single(geth->dev, page_address(page), in geth_freeq_alloc_map_page()
819 if (dma_mapping_error(geth->dev, mapping)) { in geth_freeq_alloc_map_page()
830 frag_len = 1 << geth->freeq_frag_order; /* Usually 2048 */ in geth_freeq_alloc_map_page()
831 fpp_order = PAGE_SHIFT - geth->freeq_frag_order; in geth_freeq_alloc_map_page()
832 freeq_entry = geth->freeq_ring + (pn << fpp_order); in geth_freeq_alloc_map_page()
833 dev_dbg(geth->dev, "allocate page %d fragment length %d fragments per page %d, freeq entry %p\n", in geth_freeq_alloc_map_page()
842 gpage = &geth->freeq_pages[pn]; in geth_freeq_alloc_map_page()
844 mapping = geth->freeq_ring[pn << fpp_order].word2.buf_adr; in geth_freeq_alloc_map_page()
845 dma_unmap_single(geth->dev, mapping, frag_len, DMA_FROM_DEVICE); in geth_freeq_alloc_map_page()
853 dev_dbg(geth->dev, "page %d, DMA addr: %08x, page %p\n", in geth_freeq_alloc_map_page()
868 static unsigned int geth_fill_freeq(struct gemini_ethernet *geth, bool refill) in geth_fill_freeq() argument
870 unsigned int fpp_order = PAGE_SHIFT - geth->freeq_frag_order; in geth_fill_freeq()
878 m_pn = (1 << (geth->freeq_order - fpp_order)) - 1; in geth_fill_freeq()
880 spin_lock_irqsave(&geth->freeq_lock, flags); in geth_fill_freeq()
882 rw.bits32 = readl(geth->base + GLOBAL_SWFQ_RWPTR_REG); in geth_fill_freeq()
892 gpage = &geth->freeq_pages[pn]; in geth_fill_freeq()
895 dev_dbg(geth->dev, "fill entry %d page ref count %d add %d refs\n", in geth_fill_freeq()
904 page = geth_freeq_alloc_map_page(geth, pn); in geth_fill_freeq()
916 writew(pn << fpp_order, geth->base + GLOBAL_SWFQ_RWPTR_REG + 2); in geth_fill_freeq()
918 spin_unlock_irqrestore(&geth->freeq_lock, flags); in geth_fill_freeq()
923 static int geth_setup_freeq(struct gemini_ethernet *geth) in geth_setup_freeq() argument
925 unsigned int fpp_order = PAGE_SHIFT - geth->freeq_frag_order; in geth_setup_freeq()
926 unsigned int frag_len = 1 << geth->freeq_frag_order; in geth_setup_freeq()
927 unsigned int len = 1 << geth->freeq_order; in geth_setup_freeq()
934 geth->freeq_ring = dma_alloc_coherent(geth->dev, in geth_setup_freeq()
935 sizeof(*geth->freeq_ring) << geth->freeq_order, in geth_setup_freeq()
936 &geth->freeq_dma_base, GFP_KERNEL); in geth_setup_freeq()
937 if (!geth->freeq_ring) in geth_setup_freeq()
939 if (geth->freeq_dma_base & ~DMA_Q_BASE_MASK) { in geth_setup_freeq()
940 dev_warn(geth->dev, "queue ring base is not aligned\n"); in geth_setup_freeq()
945 geth->freeq_pages = kcalloc(pages, sizeof(*geth->freeq_pages), in geth_setup_freeq()
947 if (!geth->freeq_pages) in geth_setup_freeq()
949 geth->num_freeq_pages = pages; in geth_setup_freeq()
951 dev_info(geth->dev, "allocate %d pages for queue\n", pages); in geth_setup_freeq()
953 if (!geth_freeq_alloc_map_page(geth, pn)) in geth_setup_freeq()
956 filled = geth_fill_freeq(geth, false); in geth_setup_freeq()
960 qt.bits32 = readl(geth->base + GLOBAL_QUEUE_THRESHOLD_REG); in geth_setup_freeq()
962 writel(qt.bits32, geth->base + GLOBAL_QUEUE_THRESHOLD_REG); in geth_setup_freeq()
964 skbsz.bits.sw_skb_size = 1 << geth->freeq_frag_order; in geth_setup_freeq()
965 writel(skbsz.bits32, geth->base + GLOBAL_DMA_SKB_SIZE_REG); in geth_setup_freeq()
966 writel(geth->freeq_dma_base | geth->freeq_order, in geth_setup_freeq()
967 geth->base + GLOBAL_SW_FREEQ_BASE_SIZE_REG); in geth_setup_freeq()
977 mapping = geth->freeq_ring[pn << fpp_order].word2.buf_adr; in geth_setup_freeq()
978 dma_unmap_single(geth->dev, mapping, frag_len, DMA_FROM_DEVICE); in geth_setup_freeq()
979 gpage = &geth->freeq_pages[pn]; in geth_setup_freeq()
983 kfree(geth->freeq_pages); in geth_setup_freeq()
985 dma_free_coherent(geth->dev, in geth_setup_freeq()
986 sizeof(*geth->freeq_ring) << geth->freeq_order, in geth_setup_freeq()
987 geth->freeq_ring, geth->freeq_dma_base); in geth_setup_freeq()
988 geth->freeq_ring = NULL; in geth_setup_freeq()
996 static void geth_cleanup_freeq(struct gemini_ethernet *geth) in geth_cleanup_freeq() argument
998 unsigned int fpp_order = PAGE_SHIFT - geth->freeq_frag_order; in geth_cleanup_freeq()
999 unsigned int frag_len = 1 << geth->freeq_frag_order; in geth_cleanup_freeq()
1000 unsigned int len = 1 << geth->freeq_order; in geth_cleanup_freeq()
1004 writew(readw(geth->base + GLOBAL_SWFQ_RWPTR_REG), in geth_cleanup_freeq()
1005 geth->base + GLOBAL_SWFQ_RWPTR_REG + 2); in geth_cleanup_freeq()
1006 writel(0, geth->base + GLOBAL_SW_FREEQ_BASE_SIZE_REG); in geth_cleanup_freeq()
1012 mapping = geth->freeq_ring[pn << fpp_order].word2.buf_adr; in geth_cleanup_freeq()
1013 dma_unmap_single(geth->dev, mapping, frag_len, DMA_FROM_DEVICE); in geth_cleanup_freeq()
1015 gpage = &geth->freeq_pages[pn]; in geth_cleanup_freeq()
1020 kfree(geth->freeq_pages); in geth_cleanup_freeq()
1022 dma_free_coherent(geth->dev, in geth_cleanup_freeq()
1023 sizeof(*geth->freeq_ring) << geth->freeq_order, in geth_cleanup_freeq()
1024 geth->freeq_ring, geth->freeq_dma_base); in geth_cleanup_freeq()
1038 struct gemini_ethernet *geth = port->geth; in geth_resize_freeq() local
1049 other_netdev = geth->port1->netdev; in geth_resize_freeq()
1051 other_netdev = geth->port0->netdev; in geth_resize_freeq()
1071 dev_dbg(geth->dev, "set shared queue to size %d order %d\n", in geth_resize_freeq()
1073 if (geth->freeq_order == new_order) in geth_resize_freeq()
1076 spin_lock_irqsave(&geth->irq_lock, flags); in geth_resize_freeq()
1079 en = readl(geth->base + GLOBAL_INTERRUPT_ENABLE_4_REG); in geth_resize_freeq()
1081 writel(en, geth->base + GLOBAL_INTERRUPT_ENABLE_4_REG); in geth_resize_freeq()
1082 spin_unlock_irqrestore(&geth->irq_lock, flags); in geth_resize_freeq()
1085 if (geth->freeq_ring) in geth_resize_freeq()
1086 geth_cleanup_freeq(geth); in geth_resize_freeq()
1089 geth->freeq_order = new_order; in geth_resize_freeq()
1090 ret = geth_setup_freeq(geth); in geth_resize_freeq()
1096 spin_lock_irqsave(&geth->irq_lock, flags); in geth_resize_freeq()
1098 writel(en, geth->base + GLOBAL_INTERRUPT_ENABLE_4_REG); in geth_resize_freeq()
1099 spin_unlock_irqrestore(&geth->irq_lock, flags); in geth_resize_freeq()
1108 struct gemini_ethernet *geth = port->geth; in gmac_tx_irq_enable() local
1116 writel(mask, geth->base + GLOBAL_INTERRUPT_STATUS_0_REG); in gmac_tx_irq_enable()
1118 val = readl(geth->base + GLOBAL_INTERRUPT_ENABLE_0_REG); in gmac_tx_irq_enable()
1120 writel(val, geth->base + GLOBAL_INTERRUPT_ENABLE_0_REG); in gmac_tx_irq_enable()
1138 struct gemini_ethernet *geth = port->geth; in gmac_map_tx_bufs() local
1190 mapping = dma_map_single(geth->dev, buffer, buflen, in gmac_map_tx_bufs()
1192 if (dma_mapping_error(geth->dev, mapping)) in gmac_map_tx_bufs()
1215 dma_unmap_page(geth->dev, txq->ring[w].word2.buf_adr, in gmac_map_tx_bufs()
1305 struct gemini_ethernet *geth = port->geth; in gmac_enable_irq() local
1311 spin_lock_irqsave(&geth->irq_lock, flags); in gmac_enable_irq()
1314 val = readl(geth->base + GLOBAL_INTERRUPT_ENABLE_0_REG); in gmac_enable_irq()
1316 writel(val, geth->base + GLOBAL_INTERRUPT_ENABLE_0_REG); in gmac_enable_irq()
1319 val = readl(geth->base + GLOBAL_INTERRUPT_ENABLE_1_REG); in gmac_enable_irq()
1321 writel(val, geth->base + GLOBAL_INTERRUPT_ENABLE_1_REG); in gmac_enable_irq()
1324 val = readl(geth->base + GLOBAL_INTERRUPT_ENABLE_4_REG); in gmac_enable_irq()
1326 writel(val, geth->base + GLOBAL_INTERRUPT_ENABLE_4_REG); in gmac_enable_irq()
1328 spin_unlock_irqrestore(&geth->irq_lock, flags); in gmac_enable_irq()
1334 struct gemini_ethernet *geth = port->geth; in gmac_enable_rx_irq() local
1340 spin_lock_irqsave(&geth->irq_lock, flags); in gmac_enable_rx_irq()
1343 val = readl(geth->base + GLOBAL_INTERRUPT_ENABLE_1_REG); in gmac_enable_rx_irq()
1345 writel(val, geth->base + GLOBAL_INTERRUPT_ENABLE_1_REG); in gmac_enable_rx_irq()
1347 spin_unlock_irqrestore(&geth->irq_lock, flags); in gmac_enable_rx_irq()
1394 struct gemini_ethernet *geth = port->geth; in gmac_rx() local
1413 geth->base + GLOBAL_INTERRUPT_STATUS_1_REG); in gmac_rx()
1438 gpage = gmac_get_queue_page(geth, port, mapping + PAGE_SIZE); in gmac_rx()
1440 dev_err(geth->dev, "could not find mapping\n"); in gmac_rx()
1506 struct gemini_ethernet *geth = port->geth; in gmac_napi_poll() local
1510 freeq_threshold = 1 << (geth->freeq_order - 1); in gmac_napi_poll()
1524 geth_fill_freeq(geth, true); in gmac_napi_poll()
1534 struct gemini_ethernet *geth = port->geth; in gmac_dump_dma_state() local
1539 reg[0] = readl(geth->base + GLOBAL_INTERRUPT_STATUS_0_REG); in gmac_dump_dma_state()
1540 reg[1] = readl(geth->base + GLOBAL_INTERRUPT_STATUS_1_REG); in gmac_dump_dma_state()
1541 reg[2] = readl(geth->base + GLOBAL_INTERRUPT_STATUS_2_REG); in gmac_dump_dma_state()
1542 reg[3] = readl(geth->base + GLOBAL_INTERRUPT_STATUS_3_REG); in gmac_dump_dma_state()
1543 reg[4] = readl(geth->base + GLOBAL_INTERRUPT_STATUS_4_REG); in gmac_dump_dma_state()
1548 reg[0] = readl(geth->base + GLOBAL_INTERRUPT_ENABLE_0_REG); in gmac_dump_dma_state()
1549 reg[1] = readl(geth->base + GLOBAL_INTERRUPT_ENABLE_1_REG); in gmac_dump_dma_state()
1550 reg[2] = readl(geth->base + GLOBAL_INTERRUPT_ENABLE_2_REG); in gmac_dump_dma_state()
1551 reg[3] = readl(geth->base + GLOBAL_INTERRUPT_ENABLE_3_REG); in gmac_dump_dma_state()
1552 reg[4] = readl(geth->base + GLOBAL_INTERRUPT_ENABLE_4_REG); in gmac_dump_dma_state()
1589 ptr_reg = geth->base + GLOBAL_SWFQ_RWPTR_REG; in gmac_dump_dma_state()
1594 ptr_reg = geth->base + GLOBAL_HWFQ_RWPTR_REG; in gmac_dump_dma_state()
1606 struct gemini_ethernet *geth = port->geth; in gmac_update_hw_stats() local
1609 spin_lock_irqsave(&geth->irq_lock, flags); in gmac_update_hw_stats()
1627 geth->base + GLOBAL_INTERRUPT_STATUS_4_REG); in gmac_update_hw_stats()
1630 spin_unlock_irqrestore(&geth->irq_lock, flags); in gmac_update_hw_stats()
1641 struct gemini_ethernet *geth = port->geth; in gmac_get_intr_flags() local
1649 irqif_reg = geth->base + GLOBAL_INTERRUPT_STATUS_0_REG + offs; in gmac_get_intr_flags()
1650 irqen_reg = geth->base + GLOBAL_INTERRUPT_ENABLE_0_REG + offs; in gmac_get_intr_flags()
1670 struct gemini_ethernet *geth; in gmac_irq() local
1674 geth = port->geth; in gmac_irq()
1717 geth->base + GLOBAL_INTERRUPT_STATUS_4_REG); in gmac_irq()
1719 spin_lock(&geth->irq_lock); in gmac_irq()
1723 spin_unlock(&geth->irq_lock); in gmac_irq()
2233 struct gemini_ethernet *geth; in gemini_port_irq_thread() local
2236 geth = port->geth; in gemini_port_irq_thread()
2238 geth_fill_freeq(geth, true); in gemini_port_irq_thread()
2240 spin_lock_irqsave(&geth->irq_lock, flags); in gemini_port_irq_thread()
2242 writel(irqmask, geth->base + GLOBAL_INTERRUPT_STATUS_4_REG); in gemini_port_irq_thread()
2244 irqmask |= readl(geth->base + GLOBAL_INTERRUPT_ENABLE_4_REG); in gemini_port_irq_thread()
2245 writel(irqmask, geth->base + GLOBAL_INTERRUPT_ENABLE_4_REG); in gemini_port_irq_thread()
2246 spin_unlock_irqrestore(&geth->irq_lock, flags); in gemini_port_irq_thread()
2254 struct gemini_ethernet *geth; in gemini_port_irq() local
2258 geth = port->geth; in gemini_port_irq()
2259 spin_lock(&geth->irq_lock); in gemini_port_irq()
2261 val = readl(geth->base + GLOBAL_INTERRUPT_STATUS_4_REG); in gemini_port_irq()
2262 en = readl(geth->base + GLOBAL_INTERRUPT_ENABLE_4_REG); in gemini_port_irq()
2271 writel(en, geth->base + GLOBAL_INTERRUPT_ENABLE_4_REG); in gemini_port_irq()
2275 spin_unlock(&geth->irq_lock); in gemini_port_irq()
2287 geth_cleanup_freeq(port->geth); in gemini_port_remove()
2290 static void gemini_ethernet_init(struct gemini_ethernet *geth) in gemini_ethernet_init() argument
2293 if (geth->initialized) in gemini_ethernet_init()
2295 if (geth->port0 && geth->port1) in gemini_ethernet_init()
2296 geth->initialized = true; in gemini_ethernet_init()
2300 writel(0, geth->base + GLOBAL_INTERRUPT_ENABLE_0_REG); in gemini_ethernet_init()
2301 writel(0, geth->base + GLOBAL_INTERRUPT_ENABLE_1_REG); in gemini_ethernet_init()
2302 writel(0, geth->base + GLOBAL_INTERRUPT_ENABLE_2_REG); in gemini_ethernet_init()
2303 writel(0, geth->base + GLOBAL_INTERRUPT_ENABLE_3_REG); in gemini_ethernet_init()
2304 writel(0, geth->base + GLOBAL_INTERRUPT_ENABLE_4_REG); in gemini_ethernet_init()
2316 writel(0xCCFC0FC0, geth->base + GLOBAL_INTERRUPT_SELECT_0_REG); in gemini_ethernet_init()
2317 writel(0x00F00002, geth->base + GLOBAL_INTERRUPT_SELECT_1_REG); in gemini_ethernet_init()
2318 writel(0xFFFFFFFF, geth->base + GLOBAL_INTERRUPT_SELECT_2_REG); in gemini_ethernet_init()
2319 writel(0xFFFFFFFF, geth->base + GLOBAL_INTERRUPT_SELECT_3_REG); in gemini_ethernet_init()
2320 writel(0xFF000003, geth->base + GLOBAL_INTERRUPT_SELECT_4_REG); in gemini_ethernet_init()
2323 writel(~0, geth->base + GLOBAL_INTERRUPT_STATUS_0_REG); in gemini_ethernet_init()
2324 writel(~0, geth->base + GLOBAL_INTERRUPT_STATUS_1_REG); in gemini_ethernet_init()
2325 writel(~0, geth->base + GLOBAL_INTERRUPT_STATUS_2_REG); in gemini_ethernet_init()
2326 writel(~0, geth->base + GLOBAL_INTERRUPT_STATUS_3_REG); in gemini_ethernet_init()
2327 writel(~0, geth->base + GLOBAL_INTERRUPT_STATUS_4_REG); in gemini_ethernet_init()
2330 writel(0, geth->base + GLOBAL_SW_FREEQ_BASE_SIZE_REG); in gemini_ethernet_init()
2331 writel(0, geth->base + GLOBAL_HW_FREEQ_BASE_SIZE_REG); in gemini_ethernet_init()
2332 writel(0, geth->base + GLOBAL_SWFQ_RWPTR_REG); in gemini_ethernet_init()
2333 writel(0, geth->base + GLOBAL_HWFQ_RWPTR_REG); in gemini_ethernet_init()
2335 geth->freeq_frag_order = DEFAULT_RX_BUF_ORDER; in gemini_ethernet_init()
2339 geth->freeq_order = 1; in gemini_ethernet_init()
2357 struct gemini_ethernet *geth; in gemini_ethernet_port_probe() local
2367 geth = dev_get_drvdata(parent); in gemini_ethernet_port_probe()
2388 port->geth = geth; in gemini_ethernet_port_probe()
2443 geth->port0 = port; in gemini_ethernet_port_probe()
2445 geth->port1 = port; in gemini_ethernet_port_probe()
2448 gemini_ethernet_init(geth); in gemini_ethernet_port_probe()
2545 struct gemini_ethernet *geth; in gemini_ethernet_probe() local
2551 geth = devm_kzalloc(dev, sizeof(*geth), GFP_KERNEL); in gemini_ethernet_probe()
2552 if (!geth) in gemini_ethernet_probe()
2557 geth->base = devm_ioremap_resource(dev, res); in gemini_ethernet_probe()
2558 if (IS_ERR(geth->base)) in gemini_ethernet_probe()
2559 return PTR_ERR(geth->base); in gemini_ethernet_probe()
2560 geth->dev = dev; in gemini_ethernet_probe()
2565 val = readl(geth->base + GLOBAL_TOE_VERSION_REG); in gemini_ethernet_probe()
2575 spin_lock_init(&geth->irq_lock); in gemini_ethernet_probe()
2576 spin_lock_init(&geth->freeq_lock); in gemini_ethernet_probe()
2579 platform_set_drvdata(pdev, geth); in gemini_ethernet_probe()
2587 struct gemini_ethernet *geth = platform_get_drvdata(pdev); in gemini_ethernet_remove() local
2589 geth_cleanup_freeq(geth); in gemini_ethernet_remove()
2590 geth->initialized = false; in gemini_ethernet_remove()