Lines Matching +full:k1 +full:- +full:emac
1 // SPDX-License-Identifier: GPL-2.0
3 * SpacemiT K1 Ethernet driver
5 * Copyright (C) 2023-2025 SpacemiT (Hangzhou) Technology Co. Ltd
12 #include <linux/dma-mapping.h>
80 * struct emac_desc_ring - Software-side information for one descriptor ring
138 /* Softirq-safe, hold while touching hardware statistics */
144 writel(val, priv->iobase + reg); in emac_wr()
149 return readl(priv->iobase + reg); in emac_rd()
156 if (phy_interface_mode_is_rgmii(priv->phy_interface)) in emac_phy_interface_config()
159 regmap_update_bits(priv->regmap_apmu, in emac_phy_interface_config()
160 priv->regmap_apmu_offset + APMU_EMAC_CTRL_REG, in emac_phy_interface_config()
208 regmap_set_bits(priv->regmap_apmu, in emac_init_hw()
209 priv->regmap_apmu_offset + APMU_EMAC_CTRL_REG, in emac_init_hw()
288 struct emac_desc_ring *tx_ring = &priv->tx_ring; in emac_tx_avail()
291 if (tx_ring->tail > tx_ring->head) in emac_tx_avail()
292 avail = tx_ring->tail - tx_ring->head - 1; in emac_tx_avail()
294 avail = tx_ring->total_cnt - tx_ring->head + tx_ring->tail - 1; in emac_tx_avail()
301 mod_timer(&priv->txtimer, in emac_tx_coal_timer_resched()
302 jiffies + usecs_to_jiffies(priv->tx_coal_timeout)); in emac_tx_coal_timer_resched()
309 napi_schedule(&priv->napi); in emac_tx_coal_timer()
314 priv->tx_count_frames += pkt_num; in emac_tx_should_interrupt()
315 if (likely(priv->tx_coal_frames > priv->tx_count_frames)) { in emac_tx_should_interrupt()
320 priv->tx_count_frames = 0; in emac_tx_should_interrupt()
331 tx_ring = &priv->tx_ring; in emac_free_tx_buf()
332 tx_buf = &tx_ring->tx_desc_buf[i]; in emac_free_tx_buf()
335 buf = &tx_buf->buf[j]; in emac_free_tx_buf()
336 if (!buf->dma_addr) in emac_free_tx_buf()
339 if (buf->map_as_page) in emac_free_tx_buf()
340 dma_unmap_page(&priv->pdev->dev, buf->dma_addr, in emac_free_tx_buf()
341 buf->dma_len, DMA_TO_DEVICE); in emac_free_tx_buf()
343 dma_unmap_single(&priv->pdev->dev, in emac_free_tx_buf()
344 buf->dma_addr, buf->dma_len, in emac_free_tx_buf()
347 buf->dma_addr = 0; in emac_free_tx_buf()
348 buf->map_as_page = false; in emac_free_tx_buf()
349 buf->buff_addr = NULL; in emac_free_tx_buf()
352 if (tx_buf->skb) { in emac_free_tx_buf()
353 dev_kfree_skb_any(tx_buf->skb); in emac_free_tx_buf()
354 tx_buf->skb = NULL; in emac_free_tx_buf()
360 struct emac_desc_ring *tx_ring = &priv->tx_ring; in emac_clean_tx_desc_ring()
363 for (i = 0; i < tx_ring->total_cnt; i++) in emac_clean_tx_desc_ring()
366 tx_ring->head = 0; in emac_clean_tx_desc_ring()
367 tx_ring->tail = 0; in emac_clean_tx_desc_ring()
376 rx_ring = &priv->rx_ring; in emac_clean_rx_desc_ring()
378 for (i = 0; i < rx_ring->total_cnt; i++) { in emac_clean_rx_desc_ring()
379 rx_buf = &rx_ring->rx_desc_buf[i]; in emac_clean_rx_desc_ring()
381 if (!rx_buf->skb) in emac_clean_rx_desc_ring()
384 dma_unmap_single(&priv->pdev->dev, rx_buf->dma_addr, in emac_clean_rx_desc_ring()
385 rx_buf->dma_len, DMA_FROM_DEVICE); in emac_clean_rx_desc_ring()
387 dev_kfree_skb(rx_buf->skb); in emac_clean_rx_desc_ring()
388 rx_buf->skb = NULL; in emac_clean_rx_desc_ring()
391 rx_ring->tail = 0; in emac_clean_rx_desc_ring()
392 rx_ring->head = 0; in emac_clean_rx_desc_ring()
397 struct emac_desc_ring *tx_ring = &priv->tx_ring; in emac_alloc_tx_resources()
398 struct platform_device *pdev = priv->pdev; in emac_alloc_tx_resources()
400 tx_ring->tx_desc_buf = kcalloc(tx_ring->total_cnt, in emac_alloc_tx_resources()
401 sizeof(*tx_ring->tx_desc_buf), in emac_alloc_tx_resources()
404 if (!tx_ring->tx_desc_buf) in emac_alloc_tx_resources()
405 return -ENOMEM; in emac_alloc_tx_resources()
407 tx_ring->total_size = tx_ring->total_cnt * sizeof(struct emac_desc); in emac_alloc_tx_resources()
408 tx_ring->total_size = ALIGN(tx_ring->total_size, PAGE_SIZE); in emac_alloc_tx_resources()
410 tx_ring->desc_addr = dma_alloc_coherent(&pdev->dev, tx_ring->total_size, in emac_alloc_tx_resources()
411 &tx_ring->desc_dma_addr, in emac_alloc_tx_resources()
413 if (!tx_ring->desc_addr) { in emac_alloc_tx_resources()
414 kfree(tx_ring->tx_desc_buf); in emac_alloc_tx_resources()
415 return -ENOMEM; in emac_alloc_tx_resources()
418 tx_ring->head = 0; in emac_alloc_tx_resources()
419 tx_ring->tail = 0; in emac_alloc_tx_resources()
426 struct emac_desc_ring *rx_ring = &priv->rx_ring; in emac_alloc_rx_resources()
427 struct platform_device *pdev = priv->pdev; in emac_alloc_rx_resources()
429 rx_ring->rx_desc_buf = kcalloc(rx_ring->total_cnt, in emac_alloc_rx_resources()
430 sizeof(*rx_ring->rx_desc_buf), in emac_alloc_rx_resources()
432 if (!rx_ring->rx_desc_buf) in emac_alloc_rx_resources()
433 return -ENOMEM; in emac_alloc_rx_resources()
435 rx_ring->total_size = rx_ring->total_cnt * sizeof(struct emac_desc); in emac_alloc_rx_resources()
437 rx_ring->total_size = ALIGN(rx_ring->total_size, PAGE_SIZE); in emac_alloc_rx_resources()
439 rx_ring->desc_addr = dma_alloc_coherent(&pdev->dev, rx_ring->total_size, in emac_alloc_rx_resources()
440 &rx_ring->desc_dma_addr, in emac_alloc_rx_resources()
442 if (!rx_ring->desc_addr) { in emac_alloc_rx_resources()
443 kfree(rx_ring->rx_desc_buf); in emac_alloc_rx_resources()
444 return -ENOMEM; in emac_alloc_rx_resources()
447 rx_ring->head = 0; in emac_alloc_rx_resources()
448 rx_ring->tail = 0; in emac_alloc_rx_resources()
455 struct emac_desc_ring *tr = &priv->tx_ring; in emac_free_tx_resources()
456 struct device *dev = &priv->pdev->dev; in emac_free_tx_resources()
460 kfree(tr->tx_desc_buf); in emac_free_tx_resources()
461 tr->tx_desc_buf = NULL; in emac_free_tx_resources()
463 dma_free_coherent(dev, tr->total_size, tr->desc_addr, in emac_free_tx_resources()
464 tr->desc_dma_addr); in emac_free_tx_resources()
465 tr->desc_addr = NULL; in emac_free_tx_resources()
470 struct emac_desc_ring *rr = &priv->rx_ring; in emac_free_rx_resources()
471 struct device *dev = &priv->pdev->dev; in emac_free_rx_resources()
475 kfree(rr->rx_desc_buf); in emac_free_rx_resources()
476 rr->rx_desc_buf = NULL; in emac_free_rx_resources()
478 dma_free_coherent(dev, rr->total_size, rr->desc_addr, in emac_free_rx_resources()
479 rr->desc_dma_addr); in emac_free_rx_resources()
480 rr->desc_addr = NULL; in emac_free_rx_resources()
485 struct net_device *ndev = priv->ndev; in emac_tx_clean_desc()
492 tx_ring = &priv->tx_ring; in emac_tx_clean_desc()
494 i = tx_ring->tail; in emac_tx_clean_desc()
496 while (i != tx_ring->head) { in emac_tx_clean_desc()
497 tx_desc = &((struct emac_desc *)tx_ring->desc_addr)[i]; in emac_tx_clean_desc()
500 if (READ_ONCE(tx_desc->desc0) & TX_DESC_0_OWN) in emac_tx_clean_desc()
506 if (++i == tx_ring->total_cnt) in emac_tx_clean_desc()
510 tx_ring->tail = i; in emac_tx_clean_desc()
513 emac_tx_avail(priv) > tx_ring->total_cnt / 4)) in emac_tx_clean_desc()
526 len = FIELD_GET(RX_DESC_0_FRAME_PACKET_LENGTH_MASK, desc->desc0); in emac_rx_frame_good()
528 if (WARN_ON_ONCE(!(desc->desc0 & RX_DESC_0_LAST_DESCRIPTOR))) in emac_rx_frame_good()
530 else if (desc->desc0 & RX_DESC_0_FRAME_RUNT) in emac_rx_frame_good()
532 else if (desc->desc0 & RX_DESC_0_FRAME_CRC_ERR) in emac_rx_frame_good()
534 else if (desc->desc0 & RX_DESC_0_FRAME_MAX_LEN_ERR) in emac_rx_frame_good()
536 else if (desc->desc0 & RX_DESC_0_FRAME_JABBER_ERR) in emac_rx_frame_good()
538 else if (desc->desc0 & RX_DESC_0_FRAME_LENGTH_ERR) in emac_rx_frame_good()
540 else if (len <= ETH_FCS_LEN || len > priv->dma_buf_sz) in emac_rx_frame_good()
545 dev_dbg_ratelimited(&priv->ndev->dev, "RX error: %s", msg); in emac_rx_frame_good()
552 struct emac_desc_ring *rx_ring = &priv->rx_ring; in emac_alloc_rx_desc_buffers()
554 struct net_device *ndev = priv->ndev; in emac_alloc_rx_desc_buffers()
559 i = rx_ring->head; in emac_alloc_rx_desc_buffers()
560 rx_buf = &rx_ring->rx_desc_buf[i]; in emac_alloc_rx_desc_buffers()
562 while (!rx_buf->skb) { in emac_alloc_rx_desc_buffers()
563 skb = netdev_alloc_skb_ip_align(ndev, priv->dma_buf_sz); in emac_alloc_rx_desc_buffers()
567 skb->dev = ndev; in emac_alloc_rx_desc_buffers()
569 rx_buf->skb = skb; in emac_alloc_rx_desc_buffers()
570 rx_buf->dma_len = priv->dma_buf_sz; in emac_alloc_rx_desc_buffers()
571 rx_buf->dma_addr = dma_map_single(&priv->pdev->dev, skb->data, in emac_alloc_rx_desc_buffers()
572 priv->dma_buf_sz, in emac_alloc_rx_desc_buffers()
574 if (dma_mapping_error(&priv->pdev->dev, rx_buf->dma_addr)) { in emac_alloc_rx_desc_buffers()
575 dev_err_ratelimited(&ndev->dev, "Mapping skb failed\n"); in emac_alloc_rx_desc_buffers()
579 rx_desc_addr = &((struct emac_desc *)rx_ring->desc_addr)[i]; in emac_alloc_rx_desc_buffers()
583 rx_desc.buffer_addr_1 = rx_buf->dma_addr; in emac_alloc_rx_desc_buffers()
585 rx_buf->dma_len); in emac_alloc_rx_desc_buffers()
587 if (++i == rx_ring->total_cnt) { in emac_alloc_rx_desc_buffers()
594 WRITE_ONCE(rx_desc_addr->desc0, rx_desc.desc0 | RX_DESC_0_OWN); in emac_alloc_rx_desc_buffers()
596 rx_buf = &rx_ring->rx_desc_buf[i]; in emac_alloc_rx_desc_buffers()
599 rx_ring->head = i; in emac_alloc_rx_desc_buffers()
604 rx_buf->skb = NULL; in emac_alloc_rx_desc_buffers()
610 struct net_device *ndev = priv->ndev; in emac_rx_clean_desc()
617 rx_ring = &priv->rx_ring; in emac_rx_clean_desc()
619 i = rx_ring->tail; in emac_rx_clean_desc()
621 while (budget--) { in emac_rx_clean_desc()
622 rx_desc = &((struct emac_desc *)rx_ring->desc_addr)[i]; in emac_rx_clean_desc()
625 if (READ_ONCE(rx_desc->desc0) & RX_DESC_0_OWN) in emac_rx_clean_desc()
630 rx_buf = &rx_ring->rx_desc_buf[i]; in emac_rx_clean_desc()
632 if (!rx_buf->skb) in emac_rx_clean_desc()
637 dma_unmap_single(&priv->pdev->dev, rx_buf->dma_addr, in emac_rx_clean_desc()
638 rx_buf->dma_len, DMA_FROM_DEVICE); in emac_rx_clean_desc()
641 skb = rx_buf->skb; in emac_rx_clean_desc()
644 rx_desc->desc0); in emac_rx_clean_desc()
645 skb_len -= ETH_FCS_LEN; in emac_rx_clean_desc()
648 skb->dev = ndev; in emac_rx_clean_desc()
649 ndev->hard_header_len = ETH_HLEN; in emac_rx_clean_desc()
651 skb->protocol = eth_type_trans(skb, ndev); in emac_rx_clean_desc()
653 skb->ip_summed = CHECKSUM_NONE; in emac_rx_clean_desc()
655 napi_gro_receive(&priv->napi, skb); in emac_rx_clean_desc()
658 rx_buf->skb = NULL; in emac_rx_clean_desc()
660 dev_kfree_skb_irq(rx_buf->skb); in emac_rx_clean_desc()
661 rx_buf->skb = NULL; in emac_rx_clean_desc()
664 if (++i == rx_ring->total_cnt) in emac_rx_clean_desc()
668 rx_ring->tail = i; in emac_rx_clean_desc()
690 * For convenience, skb->data is fragment 0, frags[0] is fragment 1, etc.
709 /* Non-fragmented part */ in emac_tx_map_frag()
711 addr = dma_map_single(dev, skb->data, len, DMA_TO_DEVICE); in emac_tx_map_frag()
715 frag = &skb_shinfo(skb)->frags[frag_idx - 1]; in emac_tx_map_frag()
725 tx_buf->buf[buf_idx].dma_addr = addr; in emac_tx_map_frag()
726 tx_buf->buf[buf_idx].dma_len = len; in emac_tx_map_frag()
727 tx_buf->buf[buf_idx].map_as_page = map_as_page; in emac_tx_map_frag()
730 tx_desc->buffer_addr_1 = addr; in emac_tx_map_frag()
731 tx_desc->desc1 |= FIELD_PREP(TX_DESC_1_BUFFER_SIZE_1_MASK, len); in emac_tx_map_frag()
733 tx_desc->buffer_addr_2 = addr; in emac_tx_map_frag()
734 tx_desc->desc1 |= FIELD_PREP(TX_DESC_1_BUFFER_SIZE_2_MASK, len); in emac_tx_map_frag()
742 struct emac_desc_ring *tx_ring = &priv->tx_ring; in emac_tx_mem_map()
744 struct device *dev = &priv->pdev->dev; in emac_tx_mem_map()
749 frag_num = skb_shinfo(skb)->nr_frags; in emac_tx_mem_map()
750 head = tx_ring->head; in emac_tx_mem_map()
761 tx_buf = &tx_ring->tx_desc_buf[head]; in emac_tx_mem_map()
763 &((struct emac_desc *)tx_ring->desc_addr)[head]; in emac_tx_mem_map()
774 if (++head == tx_ring->total_cnt) { in emac_tx_mem_map()
782 dev_err_ratelimited(&priv->ndev->dev, in emac_tx_mem_map()
792 tx_buf->skb = skb; in emac_tx_mem_map()
802 tx_desc_addr = &((struct emac_desc *)tx_ring->desc_addr)[old_head]; in emac_tx_mem_map()
804 WRITE_ONCE(tx_desc_addr->desc0, tx_desc_addr->desc0 | TX_DESC_0_OWN); in emac_tx_mem_map()
808 tx_ring->head = head; in emac_tx_mem_map()
813 dev_dstats_tx_dropped(priv->ndev); in emac_tx_mem_map()
820 int nfrags = skb_shinfo(skb)->nr_frags; in emac_start_xmit()
821 struct device *dev = &priv->pdev->dev; in emac_start_xmit()
850 emac_set_mac_addr(priv, ndev->dev_addr); in emac_set_mac_address()
886 if (ndev->flags & IFF_PROMISC) { in emac_set_rx_mode()
889 } else if ((ndev->flags & IFF_ALLMULTI) || in emac_set_rx_mode()
900 * The hash table is an array of 4 16-bit registers. It in emac_set_rx_mode()
903 hash = emac_ether_addr_hash(ha->addr); in emac_set_rx_mode()
924 return -EBUSY; in emac_change_mtu()
930 priv->dma_buf_sz = EMAC_DEFAULT_BUFSIZE; in emac_change_mtu()
932 priv->dma_buf_sz = EMAC_RX_BUF_2K; in emac_change_mtu()
934 priv->dma_buf_sz = EMAC_RX_BUF_4K; in emac_change_mtu()
936 ndev->mtu = mtu; in emac_change_mtu()
945 schedule_work(&priv->tx_timeout_task); in emac_tx_timeout()
950 struct emac_priv *priv = bus->priv; in emac_mii_read()
961 ret = readl_poll_timeout(priv->iobase + MAC_MDIO_CONTROL, val, in emac_mii_read()
974 struct emac_priv *priv = bus->priv; in emac_mii_write()
986 ret = readl_poll_timeout(priv->iobase + MAC_MDIO_CONTROL, val, in emac_mii_write()
994 struct device *dev = &priv->pdev->dev; in emac_mdio_init()
1001 return -ENOMEM; in emac_mdio_init()
1003 mii->priv = priv; in emac_mdio_init()
1004 mii->name = "k1_emac_mii"; in emac_mdio_init()
1005 mii->read = emac_mii_read; in emac_mdio_init()
1006 mii->write = emac_mii_write; in emac_mdio_init()
1007 mii->parent = dev; in emac_mdio_init()
1008 mii->phy_mask = ~0; in emac_mdio_init()
1009 snprintf(mii->id, MII_BUS_ID_SIZE, "%s", priv->pdev->name); in emac_mdio_init()
1011 mii_np = of_get_available_child_by_name(dev->of_node, "mdio-bus"); in emac_mdio_init()
1046 priv->flow_control = fc; in emac_set_fc()
1051 struct phy_device *phydev = priv->ndev->phydev; in emac_set_fc_autoneg()
1055 local_adv = linkmode_adv_to_lcl_adv_t(phydev->advertising); in emac_set_fc_autoneg()
1059 if (phydev->pause) in emac_set_fc_autoneg()
1062 if (phydev->asym_pause) in emac_set_fc_autoneg()
1067 priv->flow_control_autoneg = true; in emac_set_fc_autoneg()
1073 * Even though this MAC supports gigabit operation, it only provides 32-bit
1074 * statistics counters. The most overflow-prone counters are the "bytes" ones,
1097 ret = readl_poll_timeout_atomic(priv->iobase + control_reg, val, in emac_read_stat_cnt()
1102 netdev_err(priv->ndev, "Read stat timeout\n"); in emac_read_stat_cnt()
1142 u64 *tx_stats_off = priv->tx_stats_off.array; in emac_stats_update()
1143 u64 *rx_stats_off = priv->rx_stats_off.array; in emac_stats_update()
1144 u64 *tx_stats = priv->tx_stats.array; in emac_stats_update()
1145 u64 *rx_stats = priv->rx_stats.array; in emac_stats_update()
1148 assert_spin_locked(&priv->stats_lock); in emac_stats_update()
1150 if (!netif_running(priv->ndev) || !netif_device_present(priv->ndev)) { in emac_stats_update()
1155 for (i = 0; i < sizeof(priv->tx_stats) / sizeof(*tx_stats); i++) { in emac_stats_update()
1166 * Re-initializing while bringing interface up resets counters in emac_stats_update()
1168 * last time we did emac_down() to the new hardware-provided in emac_stats_update()
1176 for (i = 0; i < sizeof(priv->rx_stats) / sizeof(*rx_stats); i++) { in emac_stats_update()
1183 mod_timer(&priv->stats_timer, jiffies + EMAC_STATS_TIMER_PERIOD * HZ); in emac_stats_update()
1190 spin_lock(&priv->stats_lock); in emac_stats_timer()
1194 spin_unlock(&priv->stats_lock); in emac_stats_timer()
1217 stats = per_cpu_ptr(priv->ndev->dstats, cpu); in emac_get_stat_tx_drops()
1219 start = u64_stats_fetch_begin(&stats->syncp); in emac_get_stat_tx_drops()
1220 tx_drops = u64_stats_read(&stats->tx_drops); in emac_get_stat_tx_drops()
1221 } while (u64_stats_fetch_retry(&stats->syncp, start)); in emac_get_stat_tx_drops()
1236 tx_stats = &priv->tx_stats; in emac_get_stats64()
1237 rx_stats = &priv->rx_stats; in emac_get_stats64()
1240 storage->tx_dropped = emac_get_stat_tx_drops(priv); in emac_get_stats64()
1242 spin_lock_bh(&priv->stats_lock); in emac_get_stats64()
1246 storage->tx_packets = tx_stats->stats.tx_ok_pkts; in emac_get_stats64()
1247 storage->tx_bytes = tx_stats->stats.tx_ok_bytes; in emac_get_stats64()
1248 storage->tx_errors = tx_stats->stats.tx_err_pkts; in emac_get_stats64()
1250 storage->rx_packets = rx_stats->stats.rx_ok_pkts; in emac_get_stats64()
1251 storage->rx_bytes = rx_stats->stats.rx_ok_bytes; in emac_get_stats64()
1252 storage->rx_errors = rx_stats->stats.rx_err_total_pkts; in emac_get_stats64()
1253 storage->rx_crc_errors = rx_stats->stats.rx_crc_err_pkts; in emac_get_stats64()
1254 storage->rx_frame_errors = rx_stats->stats.rx_align_err_pkts; in emac_get_stats64()
1255 storage->rx_length_errors = rx_stats->stats.rx_len_err_pkts; in emac_get_stats64()
1257 storage->collisions = tx_stats->stats.tx_singleclsn_pkts; in emac_get_stats64()
1258 storage->collisions += tx_stats->stats.tx_multiclsn_pkts; in emac_get_stats64()
1259 storage->collisions += tx_stats->stats.tx_excessclsn_pkts; in emac_get_stats64()
1261 storage->rx_missed_errors = rx_stats->stats.rx_drp_fifo_full_pkts; in emac_get_stats64()
1262 storage->rx_missed_errors += rx_stats->stats.rx_truncate_fifo_full_pkts; in emac_get_stats64()
1264 spin_unlock_bh(&priv->stats_lock); in emac_get_stats64()
1274 rx_stats = &priv->rx_stats; in emac_get_rmon_stats()
1278 spin_lock_bh(&priv->stats_lock); in emac_get_rmon_stats()
1282 rmon_stats->undersize_pkts = rx_stats->stats.rx_len_undersize_pkts; in emac_get_rmon_stats()
1283 rmon_stats->oversize_pkts = rx_stats->stats.rx_len_oversize_pkts; in emac_get_rmon_stats()
1284 rmon_stats->fragments = rx_stats->stats.rx_len_fragment_pkts; in emac_get_rmon_stats()
1285 rmon_stats->jabbers = rx_stats->stats.rx_len_jabber_pkts; in emac_get_rmon_stats()
1289 rmon_stats->hist[0] = rx_stats->stats.rx_64_pkts; in emac_get_rmon_stats()
1290 rmon_stats->hist[1] = rx_stats->stats.rx_65_127_pkts; in emac_get_rmon_stats()
1291 rmon_stats->hist[2] = rx_stats->stats.rx_128_255_pkts; in emac_get_rmon_stats()
1292 rmon_stats->hist[3] = rx_stats->stats.rx_256_511_pkts; in emac_get_rmon_stats()
1293 rmon_stats->hist[4] = rx_stats->stats.rx_512_1023_pkts; in emac_get_rmon_stats()
1294 rmon_stats->hist[5] = rx_stats->stats.rx_1024_1518_pkts; in emac_get_rmon_stats()
1295 rmon_stats->hist[6] = rx_stats->stats.rx_1519_plus_pkts; in emac_get_rmon_stats()
1297 spin_unlock_bh(&priv->stats_lock); in emac_get_rmon_stats()
1307 tx_stats = &priv->tx_stats; in emac_get_eth_mac_stats()
1308 rx_stats = &priv->rx_stats; in emac_get_eth_mac_stats()
1310 spin_lock_bh(&priv->stats_lock); in emac_get_eth_mac_stats()
1314 mac_stats->MulticastFramesXmittedOK = tx_stats->stats.tx_multicast_pkts; in emac_get_eth_mac_stats()
1315 mac_stats->BroadcastFramesXmittedOK = tx_stats->stats.tx_broadcast_pkts; in emac_get_eth_mac_stats()
1317 mac_stats->MulticastFramesReceivedOK = in emac_get_eth_mac_stats()
1318 rx_stats->stats.rx_multicast_pkts; in emac_get_eth_mac_stats()
1319 mac_stats->BroadcastFramesReceivedOK = in emac_get_eth_mac_stats()
1320 rx_stats->stats.rx_broadcast_pkts; in emac_get_eth_mac_stats()
1322 mac_stats->SingleCollisionFrames = tx_stats->stats.tx_singleclsn_pkts; in emac_get_eth_mac_stats()
1323 mac_stats->MultipleCollisionFrames = tx_stats->stats.tx_multiclsn_pkts; in emac_get_eth_mac_stats()
1324 mac_stats->LateCollisions = tx_stats->stats.tx_lateclsn_pkts; in emac_get_eth_mac_stats()
1325 mac_stats->FramesAbortedDueToXSColls = in emac_get_eth_mac_stats()
1326 tx_stats->stats.tx_excessclsn_pkts; in emac_get_eth_mac_stats()
1328 spin_unlock_bh(&priv->stats_lock); in emac_get_eth_mac_stats()
1338 tx_stats = &priv->tx_stats; in emac_get_pause_stats()
1339 rx_stats = &priv->rx_stats; in emac_get_pause_stats()
1341 spin_lock_bh(&priv->stats_lock); in emac_get_pause_stats()
1345 pause_stats->tx_pause_frames = tx_stats->stats.tx_pause_pkts; in emac_get_pause_stats()
1346 pause_stats->rx_pause_frames = rx_stats->stats.rx_pause_pkts; in emac_get_pause_stats()
1348 spin_unlock_bh(&priv->stats_lock); in emac_get_pause_stats()
1370 return -EOPNOTSUPP; in emac_get_sset_count()
1393 u64 *rx_stats = (u64 *)&priv->rx_stats; in emac_get_ethtool_stats()
1396 spin_lock_bh(&priv->stats_lock); in emac_get_ethtool_stats()
1403 spin_unlock_bh(&priv->stats_lock); in emac_get_ethtool_stats()
1418 regs->version = 1; in emac_ethtool_get_regs()
1433 pause->autoneg = priv->flow_control_autoneg; in emac_get_pauseparam()
1434 pause->tx_pause = !!(priv->flow_control & FLOW_CTRL_TX); in emac_get_pauseparam()
1435 pause->rx_pause = !!(priv->flow_control & FLOW_CTRL_RX); in emac_get_pauseparam()
1445 return -ENETDOWN; in emac_set_pauseparam()
1447 priv->flow_control_autoneg = pause->autoneg; in emac_set_pauseparam()
1449 if (pause->autoneg) { in emac_set_pauseparam()
1452 if (pause->tx_pause) in emac_set_pauseparam()
1455 if (pause->rx_pause) in emac_set_pauseparam()
1467 strscpy(info->driver, DRIVER_NAME, sizeof(info->driver)); in emac_get_drvinfo()
1468 info->n_stats = ARRAY_SIZE(emac_ethtool_rx_stats); in emac_get_drvinfo()
1477 ndev = priv->ndev; in emac_tx_timeout_task()
1498 priv->dma_buf_sz = EMAC_DEFAULT_BUFSIZE; in emac_sw_init()
1500 priv->tx_ring.total_cnt = DEFAULT_TX_RING_NUM; in emac_sw_init()
1501 priv->rx_ring.total_cnt = DEFAULT_RX_RING_NUM; in emac_sw_init()
1503 spin_lock_init(&priv->stats_lock); in emac_sw_init()
1505 INIT_WORK(&priv->tx_timeout_task, emac_tx_timeout_task); in emac_sw_init()
1507 priv->tx_coal_frames = EMAC_TX_FRAMES; in emac_sw_init()
1508 priv->tx_coal_timeout = EMAC_TX_COAL_TIMEOUT; in emac_sw_init()
1510 timer_setup(&priv->txtimer, emac_tx_coal_timer, 0); in emac_sw_init()
1511 timer_setup(&priv->stats_timer, emac_stats_timer, 0); in emac_sw_init()
1550 if (napi_schedule_prep(&priv->napi)) { in emac_interrupt_handler()
1552 __napi_schedule_irqoff(&priv->napi); in emac_interrupt_handler()
1566 val = (u32)priv->tx_ring.desc_dma_addr; in emac_configure_tx()
1569 /* Set TX inter-frame gap value, enable transmit */ in emac_configure_tx()
1589 val = (u32)priv->rx_ring.desc_dma_addr; in emac_configure_rx()
1607 struct phy_device *phydev = dev->phydev; in emac_adjust_link()
1610 if (phydev->link) { in emac_adjust_link()
1616 phydev->duplex == DUPLEX_FULL); in emac_adjust_link()
1620 switch (phydev->speed) { in emac_adjust_link()
1631 netdev_err(dev, "Unknown speed: %d\n", phydev->speed); in emac_adjust_link()
1632 phydev->speed = SPEED_UNKNOWN; in emac_adjust_link()
1653 if (phy_interface_mode_is_rgmii(priv->phy_interface)) { in emac_update_delay_line()
1657 val |= FIELD_PREP(EMAC_RX_DLINE_CODE_MASK, priv->rx_delay); in emac_update_delay_line()
1662 val |= FIELD_PREP(EMAC_TX_DLINE_CODE_MASK, priv->tx_delay); in emac_update_delay_line()
1665 regmap_update_bits(priv->regmap_apmu, in emac_update_delay_line()
1666 priv->regmap_apmu_offset + APMU_EMAC_DLINE_REG, in emac_update_delay_line()
1673 struct device *dev = &priv->pdev->dev; in emac_phy_connect()
1678 ret = of_get_phy_mode(dev->of_node, &priv->phy_interface); in emac_phy_connect()
1680 netdev_err(ndev, "No phy-mode found"); in emac_phy_connect()
1684 switch (priv->phy_interface) { in emac_phy_connect()
1693 phy_modes(priv->phy_interface)); in emac_phy_connect()
1694 return -EINVAL; in emac_phy_connect()
1697 np = of_parse_phandle(dev->of_node, "phy-handle", 0); in emac_phy_connect()
1698 if (!np && of_phy_is_fixed_link(dev->of_node)) in emac_phy_connect()
1699 np = of_node_get(dev->of_node); in emac_phy_connect()
1703 return -ENODEV; in emac_phy_connect()
1711 priv->phy_interface); in emac_phy_connect()
1714 ret = -ENODEV; in emac_phy_connect()
1720 phydev->mac_managed_pm = true; in emac_phy_connect()
1731 struct platform_device *pdev = priv->pdev; in emac_up()
1732 struct net_device *ndev = priv->ndev; in emac_up()
1735 pm_runtime_get_sync(&pdev->dev); in emac_up()
1739 dev_err(&pdev->dev, "emac_phy_connect failed\n"); in emac_up()
1745 emac_set_mac_addr(priv, ndev->dev_addr); in emac_up()
1751 phy_start(ndev->phydev); in emac_up()
1753 ret = request_irq(priv->irq, emac_interrupt_handler, IRQF_SHARED, in emac_up()
1754 ndev->name, ndev); in emac_up()
1756 dev_err(&pdev->dev, "request_irq failed\n"); in emac_up()
1771 napi_enable(&priv->napi); in emac_up()
1775 mod_timer(&priv->stats_timer, jiffies); in emac_up()
1781 phy_disconnect(ndev->phydev); in emac_up()
1784 pm_runtime_put_sync(&pdev->dev); in emac_up()
1790 struct platform_device *pdev = priv->pdev; in emac_down()
1791 struct net_device *ndev = priv->ndev; in emac_down()
1795 phy_disconnect(ndev->phydev); in emac_down()
1800 free_irq(priv->irq, ndev); in emac_down()
1802 napi_disable(&priv->napi); in emac_down()
1804 timer_delete_sync(&priv->txtimer); in emac_down()
1805 cancel_work_sync(&priv->tx_timeout_task); in emac_down()
1807 timer_delete_sync(&priv->stats_timer); in emac_down()
1813 spin_lock_bh(&priv->stats_lock); in emac_down()
1817 priv->tx_stats_off = priv->tx_stats; in emac_down()
1818 priv->rx_stats_off = priv->rx_stats; in emac_down()
1820 spin_unlock_bh(&priv->stats_lock); in emac_down()
1822 pm_runtime_put_sync(&pdev->dev); in emac_down()
1830 struct device *dev = &priv->pdev->dev; in emac_open()
1922 #define EMAC_MAX_DELAY_PS (delay_unit_to_ps(EMAC_MAX_DELAY_UNIT - 1))
1926 struct device_node *np = pdev->dev.of_node; in emac_config_dt()
1927 struct device *dev = &pdev->dev; in emac_config_dt()
1931 priv->iobase = devm_platform_ioremap_resource(pdev, 0); in emac_config_dt()
1932 if (IS_ERR(priv->iobase)) in emac_config_dt()
1933 return dev_err_probe(dev, PTR_ERR(priv->iobase), in emac_config_dt()
1936 priv->regmap_apmu = in emac_config_dt()
1938 &priv->regmap_apmu_offset); in emac_config_dt()
1940 if (IS_ERR(priv->regmap_apmu)) in emac_config_dt()
1941 return dev_err_probe(dev, PTR_ERR(priv->regmap_apmu), in emac_config_dt()
1944 priv->irq = platform_get_irq(pdev, 0); in emac_config_dt()
1945 if (priv->irq < 0) in emac_config_dt()
1946 return priv->irq; in emac_config_dt()
1950 if (ret == -EPROBE_DEFER) in emac_config_dt()
1954 dev_info(&pdev->dev, "Using random MAC address\n"); in emac_config_dt()
1955 eth_hw_addr_random(priv->ndev); in emac_config_dt()
1957 eth_hw_addr_set(priv->ndev, mac_addr); in emac_config_dt()
1960 priv->tx_delay = 0; in emac_config_dt()
1961 priv->rx_delay = 0; in emac_config_dt()
1963 of_property_read_u32(np, "tx-internal-delay-ps", &priv->tx_delay); in emac_config_dt()
1964 of_property_read_u32(np, "rx-internal-delay-ps", &priv->rx_delay); in emac_config_dt()
1966 if (priv->tx_delay > EMAC_MAX_DELAY_PS) { in emac_config_dt()
1967 dev_err(&pdev->dev, in emac_config_dt()
1968 "tx-internal-delay-ps too large: max %d, got %d", in emac_config_dt()
1969 EMAC_MAX_DELAY_PS, priv->tx_delay); in emac_config_dt()
1970 return -EINVAL; in emac_config_dt()
1973 if (priv->rx_delay > EMAC_MAX_DELAY_PS) { in emac_config_dt()
1974 dev_err(&pdev->dev, in emac_config_dt()
1975 "rx-internal-delay-ps too large: max %d, got %d", in emac_config_dt()
1976 EMAC_MAX_DELAY_PS, priv->rx_delay); in emac_config_dt()
1977 return -EINVAL; in emac_config_dt()
1980 priv->tx_delay = delay_ps_to_unit(priv->tx_delay); in emac_config_dt()
1981 priv->rx_delay = delay_ps_to_unit(priv->rx_delay); in emac_config_dt()
1995 struct device *dev = &pdev->dev; in emac_probe()
2003 return -ENOMEM; in emac_probe()
2005 ndev->hw_features = NETIF_F_SG; in emac_probe()
2006 ndev->features |= ndev->hw_features; in emac_probe()
2008 ndev->max_mtu = EMAC_RX_BUF_4K - (ETH_HLEN + ETH_FCS_LEN); in emac_probe()
2009 ndev->pcpu_stat_type = NETDEV_PCPU_STAT_DSTATS; in emac_probe()
2012 priv->ndev = ndev; in emac_probe()
2013 priv->pdev = pdev; in emac_probe()
2020 ndev->watchdog_timeo = 5 * HZ; in emac_probe()
2021 ndev->base_addr = (unsigned long)priv->iobase; in emac_probe()
2022 ndev->irq = priv->irq; in emac_probe()
2024 ndev->ethtool_ops = &emac_ethtool_ops; in emac_probe()
2025 ndev->netdev_ops = &emac_netdev_ops; in emac_probe()
2027 devm_pm_runtime_enable(&pdev->dev); in emac_probe()
2029 priv->bus_clk = devm_clk_get_enabled(&pdev->dev, NULL); in emac_probe()
2030 if (IS_ERR(priv->bus_clk)) in emac_probe()
2031 return dev_err_probe(dev, PTR_ERR(priv->bus_clk), in emac_probe()
2034 reset = devm_reset_control_get_optional_exclusive_deasserted(&pdev->dev, in emac_probe()
2040 if (of_phy_is_fixed_link(dev->of_node)) { in emac_probe()
2041 ret = of_phy_register_fixed_link(dev->of_node); in emac_probe()
2044 "Failed to register fixed-link\n"); in emac_probe()
2048 dev->of_node); in emac_probe()
2062 SET_NETDEV_DEV(ndev, &pdev->dev); in emac_probe()
2070 netif_napi_add(ndev, &priv->napi, emac_rx_poll); in emac_probe()
2076 timer_delete_sync(&priv->txtimer); in emac_probe()
2077 timer_delete_sync(&priv->stats_timer); in emac_probe()
2086 timer_shutdown_sync(&priv->txtimer); in emac_remove()
2087 cancel_work_sync(&priv->tx_timeout_task); in emac_remove()
2089 timer_shutdown_sync(&priv->stats_timer); in emac_remove()
2097 struct net_device *ndev = priv->ndev; in emac_resume()
2100 ret = clk_prepare_enable(priv->bus_clk); in emac_resume()
2111 clk_disable_unprepare(priv->bus_clk); in emac_resume()
2117 mod_timer(&priv->stats_timer, jiffies); in emac_resume()
2125 struct net_device *ndev = priv->ndev; in emac_suspend()
2128 clk_disable_unprepare(priv->bus_clk); in emac_suspend()
2134 clk_disable_unprepare(priv->bus_clk); in emac_suspend()
2144 { .compatible = "spacemit,k1-emac" },
2160 MODULE_DESCRIPTION("SpacemiT K1 Ethernet driver");