Lines Matching refs:geth

107 	struct gemini_ethernet *geth;  member
549 struct gemini_ethernet *geth = port->geth; in gmac_setup_txqs() local
565 desc_ring = dma_alloc_coherent(geth->dev, len * sizeof(*desc_ring), in gmac_setup_txqs()
574 dev_warn(geth->dev, "TX queue base is not aligned\n"); in gmac_setup_txqs()
575 dma_free_coherent(geth->dev, len * sizeof(*desc_ring), in gmac_setup_txqs()
608 struct gemini_ethernet *geth = port->geth; in gmac_clean_txq() local
631 dma_unmap_single(geth->dev, mapping, in gmac_clean_txq()
679 struct gemini_ethernet *geth = port->geth; in gmac_cleanup_txqs() local
696 dma_free_coherent(geth->dev, in gmac_cleanup_txqs()
704 struct gemini_ethernet *geth = port->geth; in gmac_setup_rxq() local
707 qhdr = geth->base + TOE_DEFAULT_Q_HDR_BASE(netdev->dev_id); in gmac_setup_rxq()
711 port->rxq_ring = dma_alloc_coherent(geth->dev, in gmac_setup_rxq()
717 dev_warn(geth->dev, "RX queue base is not aligned\n"); in gmac_setup_rxq()
727 gmac_get_queue_page(struct gemini_ethernet *geth, in gmac_get_queue_page() argument
738 if (!geth->freeq_pages) { in gmac_get_queue_page()
739 dev_err(geth->dev, "try to get page with no page list\n"); in gmac_get_queue_page()
744 for (i = 0; i < geth->num_freeq_pages; i++) { in gmac_get_queue_page()
745 gpage = &geth->freeq_pages[i]; in gmac_get_queue_page()
756 struct gemini_ethernet *geth = port->geth; in gmac_cleanup_rxq() local
766 qhdr = geth->base + in gmac_cleanup_rxq()
790 gpage = gmac_get_queue_page(geth, port, mapping + PAGE_SIZE); in gmac_cleanup_rxq()
792 dev_err(geth->dev, "could not find page\n"); in gmac_cleanup_rxq()
799 dma_free_coherent(geth->dev, sizeof(*port->rxq_ring) << port->rxq_order, in gmac_cleanup_rxq()
803 static struct page *geth_freeq_alloc_map_page(struct gemini_ethernet *geth, in geth_freeq_alloc_map_page() argument
819 mapping = dma_map_single(geth->dev, page_address(page), in geth_freeq_alloc_map_page()
821 if (dma_mapping_error(geth->dev, mapping)) { in geth_freeq_alloc_map_page()
832 frag_len = 1 << geth->freeq_frag_order; /* Usually 2048 */ in geth_freeq_alloc_map_page()
833 fpp_order = PAGE_SHIFT - geth->freeq_frag_order; in geth_freeq_alloc_map_page()
834 freeq_entry = geth->freeq_ring + (pn << fpp_order); in geth_freeq_alloc_map_page()
835 dev_dbg(geth->dev, "allocate page %d fragment length %d fragments per page %d, freeq entry %p\n", in geth_freeq_alloc_map_page()
844 gpage = &geth->freeq_pages[pn]; in geth_freeq_alloc_map_page()
846 mapping = geth->freeq_ring[pn << fpp_order].word2.buf_adr; in geth_freeq_alloc_map_page()
847 dma_unmap_single(geth->dev, mapping, frag_len, DMA_FROM_DEVICE); in geth_freeq_alloc_map_page()
855 dev_dbg(geth->dev, "page %d, DMA addr: %08x, page %p\n", in geth_freeq_alloc_map_page()
870 static unsigned int geth_fill_freeq(struct gemini_ethernet *geth, bool refill) in geth_fill_freeq() argument
872 unsigned int fpp_order = PAGE_SHIFT - geth->freeq_frag_order; in geth_fill_freeq()
880 m_pn = (1 << (geth->freeq_order - fpp_order)) - 1; in geth_fill_freeq()
882 spin_lock_irqsave(&geth->freeq_lock, flags); in geth_fill_freeq()
884 rw.bits32 = readl(geth->base + GLOBAL_SWFQ_RWPTR_REG); in geth_fill_freeq()
894 gpage = &geth->freeq_pages[pn]; in geth_fill_freeq()
897 dev_dbg(geth->dev, "fill entry %d page ref count %d add %d refs\n", in geth_fill_freeq()
906 page = geth_freeq_alloc_map_page(geth, pn); in geth_fill_freeq()
918 writew(pn << fpp_order, geth->base + GLOBAL_SWFQ_RWPTR_REG + 2); in geth_fill_freeq()
920 spin_unlock_irqrestore(&geth->freeq_lock, flags); in geth_fill_freeq()
925 static int geth_setup_freeq(struct gemini_ethernet *geth) in geth_setup_freeq() argument
927 unsigned int fpp_order = PAGE_SHIFT - geth->freeq_frag_order; in geth_setup_freeq()
928 unsigned int frag_len = 1 << geth->freeq_frag_order; in geth_setup_freeq()
929 unsigned int len = 1 << geth->freeq_order; in geth_setup_freeq()
936 geth->freeq_ring = dma_alloc_coherent(geth->dev, in geth_setup_freeq()
937 sizeof(*geth->freeq_ring) << geth->freeq_order, in geth_setup_freeq()
938 &geth->freeq_dma_base, GFP_KERNEL); in geth_setup_freeq()
939 if (!geth->freeq_ring) in geth_setup_freeq()
941 if (geth->freeq_dma_base & ~DMA_Q_BASE_MASK) { in geth_setup_freeq()
942 dev_warn(geth->dev, "queue ring base is not aligned\n"); in geth_setup_freeq()
947 geth->freeq_pages = kcalloc(pages, sizeof(*geth->freeq_pages), in geth_setup_freeq()
949 if (!geth->freeq_pages) in geth_setup_freeq()
951 geth->num_freeq_pages = pages; in geth_setup_freeq()
953 dev_info(geth->dev, "allocate %d pages for queue\n", pages); in geth_setup_freeq()
955 if (!geth_freeq_alloc_map_page(geth, pn)) in geth_setup_freeq()
958 filled = geth_fill_freeq(geth, false); in geth_setup_freeq()
962 qt.bits32 = readl(geth->base + GLOBAL_QUEUE_THRESHOLD_REG); in geth_setup_freeq()
964 writel(qt.bits32, geth->base + GLOBAL_QUEUE_THRESHOLD_REG); in geth_setup_freeq()
966 skbsz.bits.sw_skb_size = 1 << geth->freeq_frag_order; in geth_setup_freeq()
967 writel(skbsz.bits32, geth->base + GLOBAL_DMA_SKB_SIZE_REG); in geth_setup_freeq()
968 writel(geth->freeq_dma_base | geth->freeq_order, in geth_setup_freeq()
969 geth->base + GLOBAL_SW_FREEQ_BASE_SIZE_REG); in geth_setup_freeq()
979 mapping = geth->freeq_ring[pn << fpp_order].word2.buf_adr; in geth_setup_freeq()
980 dma_unmap_single(geth->dev, mapping, frag_len, DMA_FROM_DEVICE); in geth_setup_freeq()
981 gpage = &geth->freeq_pages[pn]; in geth_setup_freeq()
985 kfree(geth->freeq_pages); in geth_setup_freeq()
987 dma_free_coherent(geth->dev, in geth_setup_freeq()
988 sizeof(*geth->freeq_ring) << geth->freeq_order, in geth_setup_freeq()
989 geth->freeq_ring, geth->freeq_dma_base); in geth_setup_freeq()
990 geth->freeq_ring = NULL; in geth_setup_freeq()
998 static void geth_cleanup_freeq(struct gemini_ethernet *geth) in geth_cleanup_freeq() argument
1000 unsigned int fpp_order = PAGE_SHIFT - geth->freeq_frag_order; in geth_cleanup_freeq()
1001 unsigned int frag_len = 1 << geth->freeq_frag_order; in geth_cleanup_freeq()
1002 unsigned int len = 1 << geth->freeq_order; in geth_cleanup_freeq()
1006 writew(readw(geth->base + GLOBAL_SWFQ_RWPTR_REG), in geth_cleanup_freeq()
1007 geth->base + GLOBAL_SWFQ_RWPTR_REG + 2); in geth_cleanup_freeq()
1008 writel(0, geth->base + GLOBAL_SW_FREEQ_BASE_SIZE_REG); in geth_cleanup_freeq()
1014 mapping = geth->freeq_ring[pn << fpp_order].word2.buf_adr; in geth_cleanup_freeq()
1015 dma_unmap_single(geth->dev, mapping, frag_len, DMA_FROM_DEVICE); in geth_cleanup_freeq()
1017 gpage = &geth->freeq_pages[pn]; in geth_cleanup_freeq()
1022 kfree(geth->freeq_pages); in geth_cleanup_freeq()
1024 dma_free_coherent(geth->dev, in geth_cleanup_freeq()
1025 sizeof(*geth->freeq_ring) << geth->freeq_order, in geth_cleanup_freeq()
1026 geth->freeq_ring, geth->freeq_dma_base); in geth_cleanup_freeq()
1040 struct gemini_ethernet *geth = port->geth; in geth_resize_freeq() local
1051 other_netdev = geth->port1->netdev; in geth_resize_freeq()
1053 other_netdev = geth->port0->netdev; in geth_resize_freeq()
1073 dev_dbg(geth->dev, "set shared queue to size %d order %d\n", in geth_resize_freeq()
1075 if (geth->freeq_order == new_order) in geth_resize_freeq()
1078 spin_lock_irqsave(&geth->irq_lock, flags); in geth_resize_freeq()
1081 en = readl(geth->base + GLOBAL_INTERRUPT_ENABLE_4_REG); in geth_resize_freeq()
1083 writel(en, geth->base + GLOBAL_INTERRUPT_ENABLE_4_REG); in geth_resize_freeq()
1084 spin_unlock_irqrestore(&geth->irq_lock, flags); in geth_resize_freeq()
1087 if (geth->freeq_ring) in geth_resize_freeq()
1088 geth_cleanup_freeq(geth); in geth_resize_freeq()
1091 geth->freeq_order = new_order; in geth_resize_freeq()
1092 ret = geth_setup_freeq(geth); in geth_resize_freeq()
1098 spin_lock_irqsave(&geth->irq_lock, flags); in geth_resize_freeq()
1100 writel(en, geth->base + GLOBAL_INTERRUPT_ENABLE_4_REG); in geth_resize_freeq()
1101 spin_unlock_irqrestore(&geth->irq_lock, flags); in geth_resize_freeq()
1110 struct gemini_ethernet *geth = port->geth; in gmac_tx_irq_enable() local
1116 spin_lock_irqsave(&geth->irq_lock, flags); in gmac_tx_irq_enable()
1121 writel(mask, geth->base + GLOBAL_INTERRUPT_STATUS_0_REG); in gmac_tx_irq_enable()
1123 val = readl(geth->base + GLOBAL_INTERRUPT_ENABLE_0_REG); in gmac_tx_irq_enable()
1125 writel(val, geth->base + GLOBAL_INTERRUPT_ENABLE_0_REG); in gmac_tx_irq_enable()
1127 spin_unlock_irqrestore(&geth->irq_lock, flags); in gmac_tx_irq_enable()
1145 struct gemini_ethernet *geth = port->geth; in gmac_map_tx_bufs() local
1219 mapping = dma_map_single(geth->dev, buffer, buflen, in gmac_map_tx_bufs()
1221 if (dma_mapping_error(geth->dev, mapping)) in gmac_map_tx_bufs()
1244 dma_unmap_page(geth->dev, txq->ring[w].word2.buf_adr, in gmac_map_tx_bufs()
1334 struct gemini_ethernet *geth = port->geth; in gmac_enable_irq() local
1340 spin_lock_irqsave(&geth->irq_lock, flags); in gmac_enable_irq()
1343 val = readl(geth->base + GLOBAL_INTERRUPT_ENABLE_0_REG); in gmac_enable_irq()
1345 writel(val, geth->base + GLOBAL_INTERRUPT_ENABLE_0_REG); in gmac_enable_irq()
1348 val = readl(geth->base + GLOBAL_INTERRUPT_ENABLE_1_REG); in gmac_enable_irq()
1350 writel(val, geth->base + GLOBAL_INTERRUPT_ENABLE_1_REG); in gmac_enable_irq()
1353 val = readl(geth->base + GLOBAL_INTERRUPT_ENABLE_4_REG); in gmac_enable_irq()
1355 writel(val, geth->base + GLOBAL_INTERRUPT_ENABLE_4_REG); in gmac_enable_irq()
1357 spin_unlock_irqrestore(&geth->irq_lock, flags); in gmac_enable_irq()
1363 struct gemini_ethernet *geth = port->geth; in gmac_enable_rx_irq() local
1369 spin_lock_irqsave(&geth->irq_lock, flags); in gmac_enable_rx_irq()
1372 val = readl(geth->base + GLOBAL_INTERRUPT_ENABLE_1_REG); in gmac_enable_rx_irq()
1374 writel(val, geth->base + GLOBAL_INTERRUPT_ENABLE_1_REG); in gmac_enable_rx_irq()
1376 spin_unlock_irqrestore(&geth->irq_lock, flags); in gmac_enable_rx_irq()
1423 struct gemini_ethernet *geth = port->geth; in gmac_rx() local
1440 spin_lock_irqsave(&geth->irq_lock, flags); in gmac_rx()
1444 geth->base + GLOBAL_INTERRUPT_STATUS_1_REG); in gmac_rx()
1445 spin_unlock_irqrestore(&geth->irq_lock, flags); in gmac_rx()
1471 gpage = gmac_get_queue_page(geth, port, mapping + PAGE_SIZE); in gmac_rx()
1473 dev_err(geth->dev, "could not find mapping\n"); in gmac_rx()
1539 struct gemini_ethernet *geth = port->geth; in gmac_napi_poll() local
1543 freeq_threshold = 1 << (geth->freeq_order - 1); in gmac_napi_poll()
1557 geth_fill_freeq(geth, true); in gmac_napi_poll()
1567 struct gemini_ethernet *geth = port->geth; in gmac_dump_dma_state() local
1572 reg[0] = readl(geth->base + GLOBAL_INTERRUPT_STATUS_0_REG); in gmac_dump_dma_state()
1573 reg[1] = readl(geth->base + GLOBAL_INTERRUPT_STATUS_1_REG); in gmac_dump_dma_state()
1574 reg[2] = readl(geth->base + GLOBAL_INTERRUPT_STATUS_2_REG); in gmac_dump_dma_state()
1575 reg[3] = readl(geth->base + GLOBAL_INTERRUPT_STATUS_3_REG); in gmac_dump_dma_state()
1576 reg[4] = readl(geth->base + GLOBAL_INTERRUPT_STATUS_4_REG); in gmac_dump_dma_state()
1581 reg[0] = readl(geth->base + GLOBAL_INTERRUPT_ENABLE_0_REG); in gmac_dump_dma_state()
1582 reg[1] = readl(geth->base + GLOBAL_INTERRUPT_ENABLE_1_REG); in gmac_dump_dma_state()
1583 reg[2] = readl(geth->base + GLOBAL_INTERRUPT_ENABLE_2_REG); in gmac_dump_dma_state()
1584 reg[3] = readl(geth->base + GLOBAL_INTERRUPT_ENABLE_3_REG); in gmac_dump_dma_state()
1585 reg[4] = readl(geth->base + GLOBAL_INTERRUPT_ENABLE_4_REG); in gmac_dump_dma_state()
1622 ptr_reg = geth->base + GLOBAL_SWFQ_RWPTR_REG; in gmac_dump_dma_state()
1627 ptr_reg = geth->base + GLOBAL_HWFQ_RWPTR_REG; in gmac_dump_dma_state()
1639 struct gemini_ethernet *geth = port->geth; in gmac_update_hw_stats() local
1642 spin_lock_irqsave(&geth->irq_lock, flags); in gmac_update_hw_stats()
1660 geth->base + GLOBAL_INTERRUPT_STATUS_4_REG); in gmac_update_hw_stats()
1663 spin_unlock_irqrestore(&geth->irq_lock, flags); in gmac_update_hw_stats()
1674 struct gemini_ethernet *geth = port->geth; in gmac_get_intr_flags() local
1682 irqif_reg = geth->base + GLOBAL_INTERRUPT_STATUS_0_REG + offs; in gmac_get_intr_flags()
1683 irqen_reg = geth->base + GLOBAL_INTERRUPT_ENABLE_0_REG + offs; in gmac_get_intr_flags()
1703 struct gemini_ethernet *geth; in gmac_irq() local
1707 geth = port->geth; in gmac_irq()
1749 spin_lock(&geth->irq_lock); in gmac_irq()
1751 geth->base + GLOBAL_INTERRUPT_STATUS_4_REG); in gmac_irq()
1755 spin_unlock(&geth->irq_lock); in gmac_irq()
2263 struct gemini_ethernet *geth; in gemini_port_irq_thread() local
2266 geth = port->geth; in gemini_port_irq_thread()
2268 geth_fill_freeq(geth, true); in gemini_port_irq_thread()
2270 spin_lock_irqsave(&geth->irq_lock, flags); in gemini_port_irq_thread()
2272 writel(irqmask, geth->base + GLOBAL_INTERRUPT_STATUS_4_REG); in gemini_port_irq_thread()
2274 irqmask |= readl(geth->base + GLOBAL_INTERRUPT_ENABLE_4_REG); in gemini_port_irq_thread()
2275 writel(irqmask, geth->base + GLOBAL_INTERRUPT_ENABLE_4_REG); in gemini_port_irq_thread()
2276 spin_unlock_irqrestore(&geth->irq_lock, flags); in gemini_port_irq_thread()
2284 struct gemini_ethernet *geth; in gemini_port_irq() local
2288 geth = port->geth; in gemini_port_irq()
2289 spin_lock(&geth->irq_lock); in gemini_port_irq()
2291 val = readl(geth->base + GLOBAL_INTERRUPT_STATUS_4_REG); in gemini_port_irq()
2292 en = readl(geth->base + GLOBAL_INTERRUPT_ENABLE_4_REG); in gemini_port_irq()
2301 writel(en, geth->base + GLOBAL_INTERRUPT_ENABLE_4_REG); in gemini_port_irq()
2305 spin_unlock(&geth->irq_lock); in gemini_port_irq()
2317 geth_cleanup_freeq(port->geth); in gemini_port_remove()
2320 static void gemini_ethernet_init(struct gemini_ethernet *geth) in gemini_ethernet_init() argument
2323 if (geth->initialized) in gemini_ethernet_init()
2325 if (geth->port0 && geth->port1) in gemini_ethernet_init()
2326 geth->initialized = true; in gemini_ethernet_init()
2330 writel(0, geth->base + GLOBAL_INTERRUPT_ENABLE_0_REG); in gemini_ethernet_init()
2331 writel(0, geth->base + GLOBAL_INTERRUPT_ENABLE_1_REG); in gemini_ethernet_init()
2332 writel(0, geth->base + GLOBAL_INTERRUPT_ENABLE_2_REG); in gemini_ethernet_init()
2333 writel(0, geth->base + GLOBAL_INTERRUPT_ENABLE_3_REG); in gemini_ethernet_init()
2334 writel(0, geth->base + GLOBAL_INTERRUPT_ENABLE_4_REG); in gemini_ethernet_init()
2346 writel(0xCCFC0FC0, geth->base + GLOBAL_INTERRUPT_SELECT_0_REG); in gemini_ethernet_init()
2347 writel(0x00F00002, geth->base + GLOBAL_INTERRUPT_SELECT_1_REG); in gemini_ethernet_init()
2348 writel(0xFFFFFFFF, geth->base + GLOBAL_INTERRUPT_SELECT_2_REG); in gemini_ethernet_init()
2349 writel(0xFFFFFFFF, geth->base + GLOBAL_INTERRUPT_SELECT_3_REG); in gemini_ethernet_init()
2350 writel(0xFF000003, geth->base + GLOBAL_INTERRUPT_SELECT_4_REG); in gemini_ethernet_init()
2353 writel(~0, geth->base + GLOBAL_INTERRUPT_STATUS_0_REG); in gemini_ethernet_init()
2354 writel(~0, geth->base + GLOBAL_INTERRUPT_STATUS_1_REG); in gemini_ethernet_init()
2355 writel(~0, geth->base + GLOBAL_INTERRUPT_STATUS_2_REG); in gemini_ethernet_init()
2356 writel(~0, geth->base + GLOBAL_INTERRUPT_STATUS_3_REG); in gemini_ethernet_init()
2357 writel(~0, geth->base + GLOBAL_INTERRUPT_STATUS_4_REG); in gemini_ethernet_init()
2360 writel(0, geth->base + GLOBAL_SW_FREEQ_BASE_SIZE_REG); in gemini_ethernet_init()
2361 writel(0, geth->base + GLOBAL_HW_FREEQ_BASE_SIZE_REG); in gemini_ethernet_init()
2362 writel(0, geth->base + GLOBAL_SWFQ_RWPTR_REG); in gemini_ethernet_init()
2363 writel(0, geth->base + GLOBAL_HWFQ_RWPTR_REG); in gemini_ethernet_init()
2365 geth->freeq_frag_order = DEFAULT_RX_BUF_ORDER; in gemini_ethernet_init()
2369 geth->freeq_order = 1; in gemini_ethernet_init()
2388 struct gemini_ethernet *geth; in gemini_ethernet_port_probe() local
2397 geth = dev_get_drvdata(parent); in gemini_ethernet_port_probe()
2418 port->geth = geth; in gemini_ethernet_port_probe()
2467 geth->port0 = port; in gemini_ethernet_port_probe()
2469 geth->port1 = port; in gemini_ethernet_port_probe()
2472 gemini_ethernet_init(geth); in gemini_ethernet_port_probe()
2571 struct gemini_ethernet *geth; in gemini_ethernet_probe() local
2576 geth = devm_kzalloc(dev, sizeof(*geth), GFP_KERNEL); in gemini_ethernet_probe()
2577 if (!geth) in gemini_ethernet_probe()
2579 geth->base = devm_platform_get_and_ioremap_resource(pdev, 0, NULL); in gemini_ethernet_probe()
2580 if (IS_ERR(geth->base)) in gemini_ethernet_probe()
2581 return PTR_ERR(geth->base); in gemini_ethernet_probe()
2582 geth->dev = dev; in gemini_ethernet_probe()
2587 val = readl(geth->base + GLOBAL_TOE_VERSION_REG); in gemini_ethernet_probe()
2597 spin_lock_init(&geth->irq_lock); in gemini_ethernet_probe()
2598 spin_lock_init(&geth->freeq_lock); in gemini_ethernet_probe()
2601 platform_set_drvdata(pdev, geth); in gemini_ethernet_probe()
2609 struct gemini_ethernet *geth = platform_get_drvdata(pdev); in gemini_ethernet_remove() local
2611 geth_cleanup_freeq(geth); in gemini_ethernet_remove()
2612 geth->initialized = false; in gemini_ethernet_remove()