Lines Matching +full:xgene +full:- +full:enet

1 // SPDX-License-Identifier: GPL-2.0-or-later
3 * Applied Micro X-Gene SoC Ethernet v2 Driver
20 pdev = pdata->pdev; in xge_get_resources()
21 dev = &pdev->dev; in xge_get_resources()
22 ndev = pdata->ndev; in xge_get_resources()
27 return -ENODEV; in xge_get_resources()
30 pdata->resources.base_addr = devm_ioremap(dev, res->start, in xge_get_resources()
32 if (!pdata->resources.base_addr) { in xge_get_resources()
33 dev_err(dev, "Unable to retrieve ENET Port CSR region\n"); in xge_get_resources()
34 return -ENOMEM; in xge_get_resources()
40 memcpy(ndev->perm_addr, ndev->dev_addr, ndev->addr_len); in xge_get_resources()
44 dev_err(dev, "Unable to get phy-connection-type\n"); in xge_get_resources()
47 pdata->resources.phy_mode = phy_mode; in xge_get_resources()
49 if (pdata->resources.phy_mode != PHY_INTERFACE_MODE_RGMII) { in xge_get_resources()
50 dev_err(dev, "Incorrect phy-connection-type specified\n"); in xge_get_resources()
51 return -ENODEV; in xge_get_resources()
57 pdata->resources.irq = ret; in xge_get_resources()
65 struct xge_desc_ring *ring = pdata->rx_ring; in xge_refill_buffers()
66 const u8 slots = XGENE_ENET_NUM_DESC - 1; in xge_refill_buffers()
67 struct device *dev = &pdata->pdev->dev; in xge_refill_buffers()
70 u8 tail = ring->tail; in xge_refill_buffers()
77 raw_desc = &ring->raw_desc[tail]; in xge_refill_buffers()
82 return -ENOMEM; in xge_refill_buffers()
84 dma_addr = dma_map_single(dev, skb->data, len, DMA_FROM_DEVICE); in xge_refill_buffers()
88 return -EINVAL; in xge_refill_buffers()
91 ring->pkt_info[tail].skb = skb; in xge_refill_buffers()
92 ring->pkt_info[tail].dma_addr = dma_addr; in xge_refill_buffers()
94 addr_hi = GET_BITS(NEXT_DESC_ADDRH, le64_to_cpu(raw_desc->m1)); in xge_refill_buffers()
95 addr_lo = GET_BITS(NEXT_DESC_ADDRL, le64_to_cpu(raw_desc->m1)); in xge_refill_buffers()
96 raw_desc->m1 = cpu_to_le64(SET_BITS(NEXT_DESC_ADDRL, addr_lo) | in xge_refill_buffers()
102 raw_desc->m0 = cpu_to_le64(SET_BITS(PKT_ADDRL, dma_addr) | in xge_refill_buffers()
107 ring->tail = tail; in xge_refill_buffers()
122 pdata->nbufs = NUM_BUFS; in xge_init_hw()
131 if (napi_schedule_prep(&pdata->napi)) { in xge_irq()
133 __napi_schedule(&pdata->napi); in xge_irq()
144 snprintf(pdata->irq_name, IRQ_ID_SIZE, "%s", ndev->name); in xge_request_irq()
146 ret = request_irq(pdata->resources.irq, xge_irq, 0, pdata->irq_name, in xge_request_irq()
149 netdev_err(ndev, "Failed to request irq %s\n", pdata->irq_name); in xge_request_irq()
158 free_irq(pdata->resources.irq, pdata); in xge_free_irq()
163 if (GET_BITS(E, le64_to_cpu(raw_desc->m0)) && in is_tx_slot_available()
164 (GET_BITS(PKT_SIZE, le64_to_cpu(raw_desc->m0)) == SLOT_EMPTY)) in is_tx_slot_available()
173 struct device *dev = &pdata->pdev->dev; in xge_start_xmit()
182 tx_ring = pdata->tx_ring; in xge_start_xmit()
183 tail = tx_ring->tail; in xge_start_xmit()
185 raw_desc = &tx_ring->raw_desc[tail]; in xge_start_xmit()
199 memcpy(pkt_buf, skb->data, len); in xge_start_xmit()
201 addr_hi = GET_BITS(NEXT_DESC_ADDRH, le64_to_cpu(raw_desc->m1)); in xge_start_xmit()
202 addr_lo = GET_BITS(NEXT_DESC_ADDRL, le64_to_cpu(raw_desc->m1)); in xge_start_xmit()
203 raw_desc->m1 = cpu_to_le64(SET_BITS(NEXT_DESC_ADDRL, addr_lo) | in xge_start_xmit()
208 tx_ring->pkt_info[tail].skb = skb; in xge_start_xmit()
209 tx_ring->pkt_info[tail].dma_addr = dma_addr; in xge_start_xmit()
210 tx_ring->pkt_info[tail].pkt_buf = pkt_buf; in xge_start_xmit()
214 raw_desc->m0 = cpu_to_le64(SET_BITS(PKT_ADDRL, dma_addr) | in xge_start_xmit()
220 tx_ring->tail = (tail + 1) & (XGENE_ENET_NUM_DESC - 1); in xge_start_xmit()
227 if (GET_BITS(E, le64_to_cpu(raw_desc->m0)) && in is_tx_hw_done()
228 !GET_BITS(PKT_SIZE, le64_to_cpu(raw_desc->m0))) in is_tx_hw_done()
237 struct device *dev = &pdata->pdev->dev; in xge_txc_poll()
246 tx_ring = pdata->tx_ring; in xge_txc_poll()
247 head = tx_ring->head; in xge_txc_poll()
254 raw_desc = &tx_ring->raw_desc[head]; in xge_txc_poll()
261 skb = tx_ring->pkt_info[head].skb; in xge_txc_poll()
262 dma_addr = tx_ring->pkt_info[head].dma_addr; in xge_txc_poll()
263 pkt_buf = tx_ring->pkt_info[head].pkt_buf; in xge_txc_poll()
264 pdata->stats.tx_packets++; in xge_txc_poll()
265 pdata->stats.tx_bytes += skb->len; in xge_txc_poll()
270 raw_desc->m0 = cpu_to_le64(SET_BITS(E, 1) | in xge_txc_poll()
274 head = (head + 1) & (XGENE_ENET_NUM_DESC - 1); in xge_txc_poll()
280 tx_ring->head = head; in xge_txc_poll()
286 struct device *dev = &pdata->pdev->dev; in xge_rx_poll()
297 rx_ring = pdata->rx_ring; in xge_rx_poll()
298 head = rx_ring->head; in xge_rx_poll()
305 raw_desc = &rx_ring->raw_desc[head]; in xge_rx_poll()
307 if (GET_BITS(E, le64_to_cpu(raw_desc->m0))) in xge_rx_poll()
312 skb = rx_ring->pkt_info[head].skb; in xge_rx_poll()
313 rx_ring->pkt_info[head].skb = NULL; in xge_rx_poll()
314 dma_addr = rx_ring->pkt_info[head].dma_addr; in xge_rx_poll()
315 len = GET_BITS(PKT_SIZE, le64_to_cpu(raw_desc->m0)); in xge_rx_poll()
319 rx_error = GET_BITS(D, le64_to_cpu(raw_desc->m2)); in xge_rx_poll()
321 pdata->stats.rx_errors++; in xge_rx_poll()
327 skb->protocol = eth_type_trans(skb, ndev); in xge_rx_poll()
329 pdata->stats.rx_packets++; in xge_rx_poll()
330 pdata->stats.rx_bytes += len; in xge_rx_poll()
331 napi_gro_receive(&pdata->napi, skb); in xge_rx_poll()
340 head = (head + 1) & (XGENE_ENET_NUM_DESC - 1); in xge_rx_poll()
344 rx_ring->head = head; in xge_rx_poll()
353 struct device *dev = &pdata->pdev->dev; in xge_delete_desc_ring()
360 if (ring->desc_addr) in xge_delete_desc_ring()
361 dma_free_coherent(dev, size, ring->desc_addr, ring->dma_addr); in xge_delete_desc_ring()
363 kfree(ring->pkt_info); in xge_delete_desc_ring()
370 struct xge_desc_ring *ring = pdata->rx_ring; in xge_free_buffers()
371 struct device *dev = &pdata->pdev->dev; in xge_free_buffers()
377 skb = ring->pkt_info[i].skb; in xge_free_buffers()
378 dma_addr = ring->pkt_info[i].dma_addr; in xge_free_buffers()
394 xge_delete_desc_ring(ndev, pdata->tx_ring); in xge_delete_desc_rings()
398 xge_delete_desc_ring(ndev, pdata->rx_ring); in xge_delete_desc_rings()
404 struct device *dev = &pdata->pdev->dev; in xge_create_desc_ring()
412 ring->ndev = ndev; in xge_create_desc_ring()
415 ring->desc_addr = dma_alloc_coherent(dev, size, &ring->dma_addr, in xge_create_desc_ring()
417 if (!ring->desc_addr) in xge_create_desc_ring()
420 ring->pkt_info = kcalloc(XGENE_ENET_NUM_DESC, sizeof(*ring->pkt_info), in xge_create_desc_ring()
422 if (!ring->pkt_info) in xge_create_desc_ring()
446 pdata->tx_ring = ring; in xge_create_desc_rings()
454 pdata->rx_ring = ring; in xge_create_desc_rings()
465 return -ENOMEM; in xge_create_desc_rings()
477 napi_enable(&pdata->napi); in xge_open()
485 phy_start(ndev->phydev); in xge_open()
498 phy_stop(ndev->phydev); in xge_close()
502 napi_disable(&pdata->napi); in xge_close()
510 struct net_device *ndev = napi->dev; in xge_napi()
543 if (!GET_BITS(E, le64_to_cpu(raw_desc->m0))) in is_tx_pending()
552 struct device *dev = &pdata->pdev->dev; in xge_free_pending_skb()
560 tx_ring = pdata->tx_ring; in xge_free_pending_skb()
563 raw_desc = &tx_ring->raw_desc[i]; in xge_free_pending_skb()
568 skb = tx_ring->pkt_info[i].skb; in xge_free_pending_skb()
569 dma_addr = tx_ring->pkt_info[i].dma_addr; in xge_free_pending_skb()
570 pkt_buf = tx_ring->pkt_info[i].pkt_buf; in xge_free_pending_skb()
587 napi_disable(&pdata->napi); in xge_timeout()
594 xge_setup_desc(pdata->tx_ring); in xge_timeout()
598 napi_enable(&pdata->napi); in xge_timeout()
611 struct xge_stats *stats = &pdata->stats; in xge_get_stats64()
613 storage->tx_packets += stats->tx_packets; in xge_get_stats64()
614 storage->tx_bytes += stats->tx_bytes; in xge_get_stats64()
616 storage->rx_packets += stats->rx_packets; in xge_get_stats64()
617 storage->rx_bytes += stats->rx_bytes; in xge_get_stats64()
618 storage->rx_errors += stats->rx_errors; in xge_get_stats64()
632 struct device *dev = &pdev->dev; in xge_probe()
639 return -ENOMEM; in xge_probe()
643 pdata->pdev = pdev; in xge_probe()
644 pdata->ndev = ndev; in xge_probe()
647 ndev->netdev_ops = &xgene_ndev_ops; in xge_probe()
649 ndev->features |= NETIF_F_GSO | in xge_probe()
656 ndev->hw_features = ndev->features; in xge_probe()
673 netif_napi_add(ndev, &pdata->napi, xge_napi); in xge_probe()
697 ndev = pdata->ndev; in xge_remove()
717 if (!pdata->ndev) in xge_shutdown()
731 .name = "xgene-enet-v2",
740 MODULE_DESCRIPTION("APM X-Gene SoC Ethernet v2 driver");