Lines Matching +full:rmii +full:- +full:clk +full:- +full:internal

1 // SPDX-License-Identifier: GPL-2.0+
17 * Copyright (c) 2001-2005 Greg Ungerer (gerg@snapgear.com)
20 * Copyright (c) 2004-2006 Macq Electronique SA.
22 * Copyright (C) 2010-2011 Freescale Semiconductor, Inc.
29 #include <linux/clk.h>
194 { .compatible = "fsl,imx25-fec", .data = &fec_imx25_info, },
195 { .compatible = "fsl,imx27-fec", .data = &fec_imx27_info, },
196 { .compatible = "fsl,imx28-fec", .data = &fec_imx28_info, },
197 { .compatible = "fsl,imx6q-fec", .data = &fec_imx6q_info, },
198 { .compatible = "fsl,mvf600-fec", .data = &fec_mvf600_info, },
199 { .compatible = "fsl,imx6sx-fec", .data = &fec_imx6sx_info, },
200 { .compatible = "fsl,imx6ul-fec", .data = &fec_imx6ul_info, },
201 { .compatible = "fsl,imx8mq-fec", .data = &fec_imx8mq_info, },
202 { .compatible = "fsl,imx8qm-fec", .data = &fec_imx8qm_info, },
203 { .compatible = "fsl,s32v234-fec", .data = &fec_s32v234_info, },
215 * if this is non-zero then assume it is the address to get MAC from.
237 #define MAX_JUMBO_BUF_SIZE (round_down(16384 - FEC_DRV_RESERVE_SPACE - 64, 64))
238 #define PKT_MAXBUF_SIZE (round_down(2048 - 64, 64))
312 ((addr >= txq->tso_hdrs_dma) && \
313 (addr < txq->tso_hdrs_dma + txq->bd.ring_size * TSO_HEADER_SIZE))
320 return (bdp >= bd->last) ? bd->base in fec_enet_get_nextdesc()
321 : (struct bufdesc *)(((void *)bdp) + bd->dsize); in fec_enet_get_nextdesc()
327 return (bdp <= bd->base) ? bd->last in fec_enet_get_prevdesc()
328 : (struct bufdesc *)(((void *)bdp) - bd->dsize); in fec_enet_get_prevdesc()
334 return ((const char *)bdp - (const char *)bd->base) >> bd->dsize_log2; in fec_enet_get_bd_index()
341 entries = (((const char *)txq->dirty_tx - in fec_enet_get_free_txdesc_num()
342 (const char *)txq->bd.cur) >> txq->bd.dsize_log2) - 1; in fec_enet_get_free_txdesc_num()
344 return entries >= 0 ? entries : entries + txq->bd.ring_size; in fec_enet_get_free_txdesc_num()
366 txq = fep->tx_queue[0]; in fec_dump()
367 bdp = txq->bd.base; in fec_dump()
372 bdp == txq->bd.cur ? 'S' : ' ', in fec_dump()
373 bdp == txq->dirty_tx ? 'H' : ' ', in fec_dump()
374 fec16_to_cpu(bdp->cbd_sc), in fec_dump()
375 fec32_to_cpu(bdp->cbd_bufaddr), in fec_dump()
376 fec16_to_cpu(bdp->cbd_datlen), in fec_dump()
377 txq->tx_buf[index].buf_p); in fec_dump()
378 bdp = fec_enet_get_nextdesc(bdp, &txq->bd); in fec_dump()
380 } while (bdp != txq->bd.base); in fec_dump()
385 * a band-aid with a manual flush in fec_enet_rx_queue.
423 fec_dma_free(dev, this->size, this->vaddr, this->dma_handle); in fec_dmam_release()
440 dr->vaddr = vaddr; in fec_dmam_alloc()
441 dr->dma_handle = *handle; in fec_dmam_alloc()
442 dr->size = size; in fec_dmam_alloc()
449 return skb->protocol == htons(ETH_P_IP) && ip_hdr(skb)->version == 4; in is_ipv4_pkt()
456 if (skb->ip_summed != CHECKSUM_PARTIAL) in fec_enet_clear_csum()
460 return -1; in fec_enet_clear_csum()
463 ip_hdr(skb)->check = 0; in fec_enet_clear_csum()
464 *(__sum16 *)(skb->head + skb->csum_start + skb->csum_offset) = 0; in fec_enet_clear_csum()
473 struct bpf_prog *xdp_prog = READ_ONCE(fep->xdp_prog); in fec_enet_create_page_pool()
475 .order = fep->pagepool_order, in fec_enet_create_page_pool()
478 .nid = dev_to_node(&fep->pdev->dev), in fec_enet_create_page_pool()
479 .dev = &fep->pdev->dev, in fec_enet_create_page_pool()
482 .max_len = fep->rx_frame_size, in fec_enet_create_page_pool()
486 rxq->page_pool = page_pool_create(&pp_params); in fec_enet_create_page_pool()
487 if (IS_ERR(rxq->page_pool)) { in fec_enet_create_page_pool()
488 err = PTR_ERR(rxq->page_pool); in fec_enet_create_page_pool()
489 rxq->page_pool = NULL; in fec_enet_create_page_pool()
493 err = xdp_rxq_info_reg(&rxq->xdp_rxq, fep->netdev, rxq->id, 0); in fec_enet_create_page_pool()
497 err = xdp_rxq_info_reg_mem_model(&rxq->xdp_rxq, MEM_TYPE_PAGE_POOL, in fec_enet_create_page_pool()
498 rxq->page_pool); in fec_enet_create_page_pool()
505 xdp_rxq_info_unreg(&rxq->xdp_rxq); in fec_enet_create_page_pool()
507 page_pool_destroy(rxq->page_pool); in fec_enet_create_page_pool()
508 rxq->page_pool = NULL; in fec_enet_create_page_pool()
518 struct bufdesc *bdp = txq->bd.cur; in fec_enet_txq_submit_frag_skb()
520 int nr_frags = skb_shinfo(skb)->nr_frags; in fec_enet_txq_submit_frag_skb()
531 this_frag = &skb_shinfo(skb)->frags[frag]; in fec_enet_txq_submit_frag_skb()
532 bdp = fec_enet_get_nextdesc(bdp, &txq->bd); in fec_enet_txq_submit_frag_skb()
535 status = fec16_to_cpu(bdp->cbd_sc); in fec_enet_txq_submit_frag_skb()
538 frag_len = skb_frag_size(&skb_shinfo(skb)->frags[frag]); in fec_enet_txq_submit_frag_skb()
541 if (frag == nr_frags - 1) { in fec_enet_txq_submit_frag_skb()
543 if (fep->bufdesc_ex) { in fec_enet_txq_submit_frag_skb()
545 if (unlikely(skb_shinfo(skb)->tx_flags & in fec_enet_txq_submit_frag_skb()
546 SKBTX_HW_TSTAMP && fep->hwts_tx_en)) in fec_enet_txq_submit_frag_skb()
551 if (fep->bufdesc_ex) { in fec_enet_txq_submit_frag_skb()
552 if (fep->quirks & FEC_QUIRK_HAS_AVB) in fec_enet_txq_submit_frag_skb()
553 estatus |= FEC_TX_BD_FTYPE(txq->bd.qid); in fec_enet_txq_submit_frag_skb()
554 if (skb->ip_summed == CHECKSUM_PARTIAL) in fec_enet_txq_submit_frag_skb()
557 ebdp->cbd_bdu = 0; in fec_enet_txq_submit_frag_skb()
558 ebdp->cbd_esc = cpu_to_fec32(estatus); in fec_enet_txq_submit_frag_skb()
563 index = fec_enet_get_bd_index(bdp, &txq->bd); in fec_enet_txq_submit_frag_skb()
564 if (((unsigned long) bufaddr) & fep->tx_align || in fec_enet_txq_submit_frag_skb()
565 fep->quirks & FEC_QUIRK_SWAP_FRAME) { in fec_enet_txq_submit_frag_skb()
566 memcpy(txq->tx_bounce[index], bufaddr, frag_len); in fec_enet_txq_submit_frag_skb()
567 bufaddr = txq->tx_bounce[index]; in fec_enet_txq_submit_frag_skb()
569 if (fep->quirks & FEC_QUIRK_SWAP_FRAME) in fec_enet_txq_submit_frag_skb()
573 addr = dma_map_single(&fep->pdev->dev, bufaddr, frag_len, in fec_enet_txq_submit_frag_skb()
575 if (dma_mapping_error(&fep->pdev->dev, addr)) { in fec_enet_txq_submit_frag_skb()
581 bdp->cbd_bufaddr = cpu_to_fec32(addr); in fec_enet_txq_submit_frag_skb()
582 bdp->cbd_datlen = cpu_to_fec16(frag_len); in fec_enet_txq_submit_frag_skb()
587 bdp->cbd_sc = cpu_to_fec16(status); in fec_enet_txq_submit_frag_skb()
592 bdp = txq->bd.cur; in fec_enet_txq_submit_frag_skb()
594 bdp = fec_enet_get_nextdesc(bdp, &txq->bd); in fec_enet_txq_submit_frag_skb()
595 dma_unmap_single(&fep->pdev->dev, fec32_to_cpu(bdp->cbd_bufaddr), in fec_enet_txq_submit_frag_skb()
596 fec16_to_cpu(bdp->cbd_datlen), DMA_TO_DEVICE); in fec_enet_txq_submit_frag_skb()
598 return ERR_PTR(-ENOMEM); in fec_enet_txq_submit_frag_skb()
605 int nr_frags = skb_shinfo(skb)->nr_frags; in fec_enet_txq_submit_skb()
623 /* Protocol checksum off-load for TCP and UDP. */ in fec_enet_txq_submit_skb()
630 bdp = txq->bd.cur; in fec_enet_txq_submit_skb()
632 status = fec16_to_cpu(bdp->cbd_sc); in fec_enet_txq_submit_skb()
636 bufaddr = skb->data; in fec_enet_txq_submit_skb()
639 index = fec_enet_get_bd_index(bdp, &txq->bd); in fec_enet_txq_submit_skb()
640 if (((unsigned long) bufaddr) & fep->tx_align || in fec_enet_txq_submit_skb()
641 fep->quirks & FEC_QUIRK_SWAP_FRAME) { in fec_enet_txq_submit_skb()
642 memcpy(txq->tx_bounce[index], skb->data, buflen); in fec_enet_txq_submit_skb()
643 bufaddr = txq->tx_bounce[index]; in fec_enet_txq_submit_skb()
645 if (fep->quirks & FEC_QUIRK_SWAP_FRAME) in fec_enet_txq_submit_skb()
650 addr = dma_map_single(&fep->pdev->dev, bufaddr, buflen, DMA_TO_DEVICE); in fec_enet_txq_submit_skb()
651 if (dma_mapping_error(&fep->pdev->dev, addr)) { in fec_enet_txq_submit_skb()
661 dma_unmap_single(&fep->pdev->dev, addr, in fec_enet_txq_submit_skb()
668 if (fep->bufdesc_ex) { in fec_enet_txq_submit_skb()
670 if (unlikely(skb_shinfo(skb)->tx_flags & in fec_enet_txq_submit_skb()
671 SKBTX_HW_TSTAMP && fep->hwts_tx_en)) in fec_enet_txq_submit_skb()
675 bdp->cbd_bufaddr = cpu_to_fec32(addr); in fec_enet_txq_submit_skb()
676 bdp->cbd_datlen = cpu_to_fec16(buflen); in fec_enet_txq_submit_skb()
678 if (fep->bufdesc_ex) { in fec_enet_txq_submit_skb()
682 if (unlikely(skb_shinfo(skb)->tx_flags & SKBTX_HW_TSTAMP && in fec_enet_txq_submit_skb()
683 fep->hwts_tx_en)) in fec_enet_txq_submit_skb()
684 skb_shinfo(skb)->tx_flags |= SKBTX_IN_PROGRESS; in fec_enet_txq_submit_skb()
686 if (fep->quirks & FEC_QUIRK_HAS_AVB) in fec_enet_txq_submit_skb()
687 estatus |= FEC_TX_BD_FTYPE(txq->bd.qid); in fec_enet_txq_submit_skb()
689 if (skb->ip_summed == CHECKSUM_PARTIAL) in fec_enet_txq_submit_skb()
692 ebdp->cbd_bdu = 0; in fec_enet_txq_submit_skb()
693 ebdp->cbd_esc = cpu_to_fec32(estatus); in fec_enet_txq_submit_skb()
696 index = fec_enet_get_bd_index(last_bdp, &txq->bd); in fec_enet_txq_submit_skb()
698 txq->tx_buf[index].buf_p = skb; in fec_enet_txq_submit_skb()
709 bdp->cbd_sc = cpu_to_fec16(status); in fec_enet_txq_submit_skb()
712 bdp = fec_enet_get_nextdesc(last_bdp, &txq->bd); in fec_enet_txq_submit_skb()
716 /* Make sure the update to bdp is performed before txq->bd.cur. */ in fec_enet_txq_submit_skb()
718 txq->bd.cur = bdp; in fec_enet_txq_submit_skb()
721 if (!(fep->quirks & FEC_QUIRK_ERR007885) || in fec_enet_txq_submit_skb()
722 !readl(txq->bd.reg_desc_active) || in fec_enet_txq_submit_skb()
723 !readl(txq->bd.reg_desc_active) || in fec_enet_txq_submit_skb()
724 !readl(txq->bd.reg_desc_active) || in fec_enet_txq_submit_skb()
725 !readl(txq->bd.reg_desc_active)) in fec_enet_txq_submit_skb()
726 writel(0, txq->bd.reg_desc_active); in fec_enet_txq_submit_skb()
743 status = fec16_to_cpu(bdp->cbd_sc); in fec_enet_txq_put_data_tso()
748 if (((unsigned long) data) & fep->tx_align || in fec_enet_txq_put_data_tso()
749 fep->quirks & FEC_QUIRK_SWAP_FRAME) { in fec_enet_txq_put_data_tso()
750 memcpy(txq->tx_bounce[index], data, size); in fec_enet_txq_put_data_tso()
751 data = txq->tx_bounce[index]; in fec_enet_txq_put_data_tso()
753 if (fep->quirks & FEC_QUIRK_SWAP_FRAME) in fec_enet_txq_put_data_tso()
757 addr = dma_map_single(&fep->pdev->dev, data, size, DMA_TO_DEVICE); in fec_enet_txq_put_data_tso()
758 if (dma_mapping_error(&fep->pdev->dev, addr)) { in fec_enet_txq_put_data_tso()
765 bdp->cbd_datlen = cpu_to_fec16(size); in fec_enet_txq_put_data_tso()
766 bdp->cbd_bufaddr = cpu_to_fec32(addr); in fec_enet_txq_put_data_tso()
768 if (fep->bufdesc_ex) { in fec_enet_txq_put_data_tso()
769 if (fep->quirks & FEC_QUIRK_HAS_AVB) in fec_enet_txq_put_data_tso()
770 estatus |= FEC_TX_BD_FTYPE(txq->bd.qid); in fec_enet_txq_put_data_tso()
771 if (skb->ip_summed == CHECKSUM_PARTIAL) in fec_enet_txq_put_data_tso()
773 ebdp->cbd_bdu = 0; in fec_enet_txq_put_data_tso()
774 ebdp->cbd_esc = cpu_to_fec32(estatus); in fec_enet_txq_put_data_tso()
782 if (fep->bufdesc_ex) in fec_enet_txq_put_data_tso()
783 ebdp->cbd_esc |= cpu_to_fec32(BD_ENET_TX_INT); in fec_enet_txq_put_data_tso()
786 bdp->cbd_sc = cpu_to_fec16(status); in fec_enet_txq_put_data_tso()
804 status = fec16_to_cpu(bdp->cbd_sc); in fec_enet_txq_put_hdr_tso()
808 bufaddr = txq->tso_hdrs + index * TSO_HEADER_SIZE; in fec_enet_txq_put_hdr_tso()
809 dmabuf = txq->tso_hdrs_dma + index * TSO_HEADER_SIZE; in fec_enet_txq_put_hdr_tso()
810 if (((unsigned long)bufaddr) & fep->tx_align || in fec_enet_txq_put_hdr_tso()
811 fep->quirks & FEC_QUIRK_SWAP_FRAME) { in fec_enet_txq_put_hdr_tso()
812 memcpy(txq->tx_bounce[index], skb->data, hdr_len); in fec_enet_txq_put_hdr_tso()
813 bufaddr = txq->tx_bounce[index]; in fec_enet_txq_put_hdr_tso()
815 if (fep->quirks & FEC_QUIRK_SWAP_FRAME) in fec_enet_txq_put_hdr_tso()
818 dmabuf = dma_map_single(&fep->pdev->dev, bufaddr, in fec_enet_txq_put_hdr_tso()
820 if (dma_mapping_error(&fep->pdev->dev, dmabuf)) { in fec_enet_txq_put_hdr_tso()
828 bdp->cbd_bufaddr = cpu_to_fec32(dmabuf); in fec_enet_txq_put_hdr_tso()
829 bdp->cbd_datlen = cpu_to_fec16(hdr_len); in fec_enet_txq_put_hdr_tso()
831 if (fep->bufdesc_ex) { in fec_enet_txq_put_hdr_tso()
832 if (fep->quirks & FEC_QUIRK_HAS_AVB) in fec_enet_txq_put_hdr_tso()
833 estatus |= FEC_TX_BD_FTYPE(txq->bd.qid); in fec_enet_txq_put_hdr_tso()
834 if (skb->ip_summed == CHECKSUM_PARTIAL) in fec_enet_txq_put_hdr_tso()
836 ebdp->cbd_bdu = 0; in fec_enet_txq_put_hdr_tso()
837 ebdp->cbd_esc = cpu_to_fec32(estatus); in fec_enet_txq_put_hdr_tso()
840 bdp->cbd_sc = cpu_to_fec16(status); in fec_enet_txq_put_hdr_tso()
851 struct bufdesc *bdp = txq->bd.cur; in fec_enet_txq_submit_tso()
865 /* Protocol checksum off-load for TCP and UDP. */ in fec_enet_txq_submit_tso()
874 total_len = skb->len - hdr_len; in fec_enet_txq_submit_tso()
878 index = fec_enet_get_bd_index(bdp, &txq->bd); in fec_enet_txq_submit_tso()
879 data_left = min_t(int, skb_shinfo(skb)->gso_size, total_len); in fec_enet_txq_submit_tso()
880 total_len -= data_left; in fec_enet_txq_submit_tso()
883 hdr = txq->tso_hdrs + index * TSO_HEADER_SIZE; in fec_enet_txq_submit_tso()
893 bdp = fec_enet_get_nextdesc(bdp, &txq->bd); in fec_enet_txq_submit_tso()
894 index = fec_enet_get_bd_index(bdp, &txq->bd); in fec_enet_txq_submit_tso()
903 data_left -= size; in fec_enet_txq_submit_tso()
907 bdp = fec_enet_get_nextdesc(bdp, &txq->bd); in fec_enet_txq_submit_tso()
911 txq->tx_buf[index].buf_p = skb; in fec_enet_txq_submit_tso()
914 txq->bd.cur = bdp; in fec_enet_txq_submit_tso()
917 if (!(fep->quirks & FEC_QUIRK_ERR007885) || in fec_enet_txq_submit_tso()
918 !readl(txq->bd.reg_desc_active) || in fec_enet_txq_submit_tso()
919 !readl(txq->bd.reg_desc_active) || in fec_enet_txq_submit_tso()
920 !readl(txq->bd.reg_desc_active) || in fec_enet_txq_submit_tso()
921 !readl(txq->bd.reg_desc_active)) in fec_enet_txq_submit_tso()
922 writel(0, txq->bd.reg_desc_active); in fec_enet_txq_submit_tso()
928 tmp_bdp = txq->bd.cur; in fec_enet_txq_submit_tso()
932 if (tmp_bdp->cbd_bufaddr && in fec_enet_txq_submit_tso()
933 !IS_TSO_HEADER(txq, fec32_to_cpu(tmp_bdp->cbd_bufaddr))) in fec_enet_txq_submit_tso()
934 dma_unmap_single(&fep->pdev->dev, in fec_enet_txq_submit_tso()
935 fec32_to_cpu(tmp_bdp->cbd_bufaddr), in fec_enet_txq_submit_tso()
936 fec16_to_cpu(tmp_bdp->cbd_datlen), in fec_enet_txq_submit_tso()
940 tmp_bdp->cbd_sc = 0; in fec_enet_txq_submit_tso()
941 tmp_bdp->cbd_datlen = 0; in fec_enet_txq_submit_tso()
942 tmp_bdp->cbd_bufaddr = 0; in fec_enet_txq_submit_tso()
945 if (fep->bufdesc_ex) { in fec_enet_txq_submit_tso()
947 ebdp->cbd_esc = 0; in fec_enet_txq_submit_tso()
950 tmp_bdp = fec_enet_get_nextdesc(tmp_bdp, &txq->bd); in fec_enet_txq_submit_tso()
969 txq = fep->tx_queue[queue]; in fec_enet_start_xmit()
980 if (entries_free <= txq->tx_stop_threshold) in fec_enet_start_xmit()
997 for (q = 0; q < fep->num_rx_queues; q++) { in fec_enet_bd_init()
999 rxq = fep->rx_queue[q]; in fec_enet_bd_init()
1000 bdp = rxq->bd.base; in fec_enet_bd_init()
1002 for (i = 0; i < rxq->bd.ring_size; i++) { in fec_enet_bd_init()
1005 if (bdp->cbd_bufaddr) in fec_enet_bd_init()
1006 bdp->cbd_sc = cpu_to_fec16(BD_ENET_RX_EMPTY); in fec_enet_bd_init()
1008 bdp->cbd_sc = cpu_to_fec16(0); in fec_enet_bd_init()
1009 bdp = fec_enet_get_nextdesc(bdp, &rxq->bd); in fec_enet_bd_init()
1013 bdp = fec_enet_get_prevdesc(bdp, &rxq->bd); in fec_enet_bd_init()
1014 bdp->cbd_sc |= cpu_to_fec16(BD_SC_WRAP); in fec_enet_bd_init()
1016 rxq->bd.cur = rxq->bd.base; in fec_enet_bd_init()
1019 for (q = 0; q < fep->num_tx_queues; q++) { in fec_enet_bd_init()
1021 txq = fep->tx_queue[q]; in fec_enet_bd_init()
1022 bdp = txq->bd.base; in fec_enet_bd_init()
1023 txq->bd.cur = bdp; in fec_enet_bd_init()
1025 for (i = 0; i < txq->bd.ring_size; i++) { in fec_enet_bd_init()
1027 bdp->cbd_sc = cpu_to_fec16(0); in fec_enet_bd_init()
1028 if (txq->tx_buf[i].type == FEC_TXBUF_T_SKB) { in fec_enet_bd_init()
1029 if (bdp->cbd_bufaddr && in fec_enet_bd_init()
1030 !IS_TSO_HEADER(txq, fec32_to_cpu(bdp->cbd_bufaddr))) in fec_enet_bd_init()
1031 dma_unmap_single(&fep->pdev->dev, in fec_enet_bd_init()
1032 fec32_to_cpu(bdp->cbd_bufaddr), in fec_enet_bd_init()
1033 fec16_to_cpu(bdp->cbd_datlen), in fec_enet_bd_init()
1035 if (txq->tx_buf[i].buf_p) in fec_enet_bd_init()
1036 dev_kfree_skb_any(txq->tx_buf[i].buf_p); in fec_enet_bd_init()
1037 } else if (txq->tx_buf[i].type == FEC_TXBUF_T_XDP_NDO) { in fec_enet_bd_init()
1038 if (bdp->cbd_bufaddr) in fec_enet_bd_init()
1039 dma_unmap_single(&fep->pdev->dev, in fec_enet_bd_init()
1040 fec32_to_cpu(bdp->cbd_bufaddr), in fec_enet_bd_init()
1041 fec16_to_cpu(bdp->cbd_datlen), in fec_enet_bd_init()
1044 if (txq->tx_buf[i].buf_p) in fec_enet_bd_init()
1045 xdp_return_frame(txq->tx_buf[i].buf_p); in fec_enet_bd_init()
1047 struct page *page = txq->tx_buf[i].buf_p; in fec_enet_bd_init()
1050 page_pool_put_page(pp_page_to_nmdesc(page)->pp, in fec_enet_bd_init()
1055 txq->tx_buf[i].buf_p = NULL; in fec_enet_bd_init()
1057 txq->tx_buf[i].type = FEC_TXBUF_T_SKB; in fec_enet_bd_init()
1058 bdp->cbd_bufaddr = cpu_to_fec32(0); in fec_enet_bd_init()
1059 bdp = fec_enet_get_nextdesc(bdp, &txq->bd); in fec_enet_bd_init()
1063 bdp = fec_enet_get_prevdesc(bdp, &txq->bd); in fec_enet_bd_init()
1064 bdp->cbd_sc |= cpu_to_fec16(BD_SC_WRAP); in fec_enet_bd_init()
1065 txq->dirty_tx = bdp; in fec_enet_bd_init()
1074 for (i = 0; i < fep->num_rx_queues; i++) in fec_enet_active_rxring()
1075 writel(0, fep->rx_queue[i]->bd.reg_desc_active); in fec_enet_active_rxring()
1085 for (i = 0; i < fep->num_rx_queues; i++) { in fec_enet_enable_ring()
1086 rxq = fep->rx_queue[i]; in fec_enet_enable_ring()
1087 writel(rxq->bd.dma, fep->hwp + FEC_R_DES_START(i)); in fec_enet_enable_ring()
1088 writel(fep->max_buf_size, fep->hwp + FEC_R_BUFF_SIZE(i)); in fec_enet_enable_ring()
1093 fep->hwp + FEC_RCMR(i)); in fec_enet_enable_ring()
1096 for (i = 0; i < fep->num_tx_queues; i++) { in fec_enet_enable_ring()
1097 txq = fep->tx_queue[i]; in fec_enet_enable_ring()
1098 writel(txq->bd.dma, fep->hwp + FEC_X_DES_START(i)); in fec_enet_enable_ring()
1103 fep->hwp + FEC_DMA_CFG(i)); in fec_enet_enable_ring()
1115 if (!allow_wol || !(fep->wol_flag & FEC_WOL_FLAG_SLEEP_ON)) { in fec_ctrl_reset()
1116 if (fep->quirks & FEC_QUIRK_HAS_MULTI_QUEUES || in fec_ctrl_reset()
1117 ((fep->quirks & FEC_QUIRK_NO_HARD_RESET) && fep->link)) { in fec_ctrl_reset()
1118 writel(0, fep->hwp + FEC_ECNTRL); in fec_ctrl_reset()
1120 writel(FEC_ECR_RESET, fep->hwp + FEC_ECNTRL); in fec_ctrl_reset()
1124 val = readl(fep->hwp + FEC_ECNTRL); in fec_ctrl_reset()
1126 writel(val, fep->hwp + FEC_ECNTRL); in fec_ctrl_reset()
1134 writel(ndev->dev_addr[3] | (ndev->dev_addr[2] << 8) | in fec_set_hw_mac_addr()
1135 (ndev->dev_addr[1] << 16) | (ndev->dev_addr[0] << 24), in fec_set_hw_mac_addr()
1136 fep->hwp + FEC_ADDR_LOW); in fec_set_hw_mac_addr()
1137 writel((ndev->dev_addr[5] << 16) | (ndev->dev_addr[4] << 24), in fec_set_hw_mac_addr()
1138 fep->hwp + FEC_ADDR_HIGH); in fec_set_hw_mac_addr()
1154 rcntl |= (fep->netdev->mtu + ETH_HLEN + ETH_FCS_LEN) << 16; in fec_restart()
1156 if (fep->bufdesc_ex) in fec_restart()
1162 * enet-mac reset will reset mac address registers too, in fec_restart()
1168 writel((0xffffffff & ~FEC_ENET_MII), fep->hwp + FEC_IEVENT); in fec_restart()
1175 if (fep->full_duplex == DUPLEX_FULL) { in fec_restart()
1177 writel(0x04, fep->hwp + FEC_X_CNTRL); in fec_restart()
1181 writel(0x0, fep->hwp + FEC_X_CNTRL); in fec_restart()
1185 writel(fep->phy_speed, fep->hwp + FEC_MII_SPEED); in fec_restart()
1188 if (fep->quirks & FEC_QUIRK_HAS_RACC) { in fec_restart()
1189 u32 val = readl(fep->hwp + FEC_RACC); in fec_restart()
1193 if (fep->csum_flags & FLAG_RX_CSUM_ENABLED) in fec_restart()
1198 writel(val, fep->hwp + FEC_RACC); in fec_restart()
1199 writel(min(fep->rx_frame_size, fep->max_buf_size), fep->hwp + FEC_FTRL); in fec_restart()
1205 * differently on enet-mac. in fec_restart()
1207 if (fep->quirks & FEC_QUIRK_ENET_MAC) { in fec_restart()
1211 /* RGMII, RMII or MII */ in fec_restart()
1212 if (phy_interface_mode_is_rgmii(fep->phy_interface)) in fec_restart()
1214 else if (fep->phy_interface == PHY_INTERFACE_MODE_RMII) in fec_restart()
1220 if (ndev->phydev) { in fec_restart()
1221 if (ndev->phydev->speed == SPEED_1000) in fec_restart()
1223 else if (ndev->phydev->speed == SPEED_100) in fec_restart()
1230 if (fep->quirks & FEC_QUIRK_USE_GASKET) { in fec_restart()
1233 writel(0, fep->hwp + FEC_MIIGSK_ENR); in fec_restart()
1234 while (readl(fep->hwp + FEC_MIIGSK_ENR) & 4) in fec_restart()
1239 * RMII, 50 MHz, no loopback, no echo in fec_restart()
1242 cfgr = (fep->phy_interface == PHY_INTERFACE_MODE_RMII) in fec_restart()
1244 if (ndev->phydev && ndev->phydev->speed == SPEED_10) in fec_restart()
1246 writel(cfgr, fep->hwp + FEC_MIIGSK_CFGR); in fec_restart()
1248 /* re-enable the gasket */ in fec_restart()
1249 writel(2, fep->hwp + FEC_MIIGSK_ENR); in fec_restart()
1256 if ((fep->pause_flag & FEC_PAUSE_FLAG_ENABLE) || in fec_restart()
1257 ((fep->pause_flag & FEC_PAUSE_FLAG_AUTONEG) && in fec_restart()
1258 ndev->phydev && ndev->phydev->pause)) { in fec_restart()
1262 writel(FEC_ENET_RSEM_V, fep->hwp + FEC_R_FIFO_RSEM); in fec_restart()
1263 writel(FEC_ENET_RSFL_V, fep->hwp + FEC_R_FIFO_RSFL); in fec_restart()
1264 writel(FEC_ENET_RAEM_V, fep->hwp + FEC_R_FIFO_RAEM); in fec_restart()
1265 writel(FEC_ENET_RAFL_V, fep->hwp + FEC_R_FIFO_RAFL); in fec_restart()
1268 writel(FEC_ENET_OPD_V, fep->hwp + FEC_OPD); in fec_restart()
1274 writel(rcntl, fep->hwp + FEC_R_CNTRL); in fec_restart()
1279 writel(0, fep->hwp + FEC_HASH_TABLE_HIGH); in fec_restart()
1280 writel(0, fep->hwp + FEC_HASH_TABLE_LOW); in fec_restart()
1283 if (fep->quirks & FEC_QUIRK_ENET_MAC) { in fec_restart()
1289 * (PKT_MAXBUF_SIZE - ETH_HLEN - ETH_FCS_LEN), configure the interface in fec_restart()
1290 * to operate in cut-through mode, triggered by the FIFO threshold. in fec_restart()
1291 * Otherwise, enable the ENET store-and-forward mode. in fec_restart()
1293 if ((fep->quirks & FEC_QUIRK_JUMBO_FRAME) && in fec_restart()
1294 (ndev->mtu > (PKT_MAXBUF_SIZE - ETH_HLEN - ETH_FCS_LEN))) in fec_restart()
1295 writel(0xF, fep->hwp + FEC_X_WMRK); in fec_restart()
1297 writel(FEC_TXWMRK_STRFWD, fep->hwp + FEC_X_WMRK); in fec_restart()
1300 if (fep->bufdesc_ex) in fec_restart()
1303 if (fep->quirks & FEC_QUIRK_DELAYED_CLKS_SUPPORT && in fec_restart()
1304 fep->rgmii_txc_dly) in fec_restart()
1306 if (fep->quirks & FEC_QUIRK_DELAYED_CLKS_SUPPORT && in fec_restart()
1307 fep->rgmii_rxc_dly) in fec_restart()
1312 writel(0 << 31, fep->hwp + FEC_MIB_CTRLSTAT); in fec_restart()
1316 writel(ecntl, fep->hwp + FEC_ECNTRL); in fec_restart()
1319 if (fep->bufdesc_ex) { in fec_restart()
1325 if (fep->link) in fec_restart()
1326 writel(FEC_DEFAULT_IMASK, fep->hwp + FEC_IMASK); in fec_restart()
1328 writel(0, fep->hwp + FEC_IMASK); in fec_restart()
1331 if (fep->quirks & FEC_QUIRK_HAS_COALESCE) in fec_restart()
1342 return imx_scu_get_handle(&fep->ipc_handle); in fec_enet_ipc_handle_init()
1347 struct device_node *np = fep->pdev->dev.of_node; in fec_enet_ipg_stop_set()
1351 if (!np || !fep->ipc_handle) in fec_enet_ipg_stop_set()
1360 imx_sc_misc_set_control(fep->ipc_handle, rsrc_id, IMX_SC_C_IPG_STOP, val); in fec_enet_ipg_stop_set()
1365 struct fec_platform_data *pdata = fep->pdev->dev.platform_data; in fec_enet_stop_mode()
1366 struct fec_stop_mode_gpr *stop_gpr = &fep->stop_gpr; in fec_enet_stop_mode()
1368 if (stop_gpr->gpr) { in fec_enet_stop_mode()
1370 regmap_update_bits(stop_gpr->gpr, stop_gpr->reg, in fec_enet_stop_mode()
1371 BIT(stop_gpr->bit), in fec_enet_stop_mode()
1372 BIT(stop_gpr->bit)); in fec_enet_stop_mode()
1374 regmap_update_bits(stop_gpr->gpr, stop_gpr->reg, in fec_enet_stop_mode()
1375 BIT(stop_gpr->bit), 0); in fec_enet_stop_mode()
1376 } else if (pdata && pdata->sleep_mode_enable) { in fec_enet_stop_mode()
1377 pdata->sleep_mode_enable(enabled); in fec_enet_stop_mode()
1387 writel(0, fep->hwp + FEC_IMASK); in fec_irqs_disable()
1394 writel(0, fep->hwp + FEC_IMASK); in fec_irqs_disable_except_wakeup()
1395 writel(FEC_ENET_WAKEUP, fep->hwp + FEC_IMASK); in fec_irqs_disable_except_wakeup()
1402 u32 rmii_mode = readl(fep->hwp + FEC_R_CNTRL) & FEC_RCR_RMII; in fec_stop()
1406 if (fep->link) { in fec_stop()
1407 writel(1, fep->hwp + FEC_X_CNTRL); /* Graceful transmit stop */ in fec_stop()
1409 if (!(readl(fep->hwp + FEC_IEVENT) & FEC_ENET_GRA)) in fec_stop()
1413 if (fep->bufdesc_ex) in fec_stop()
1417 writel(fep->phy_speed, fep->hwp + FEC_MII_SPEED); in fec_stop()
1418 writel(FEC_DEFAULT_IMASK, fep->hwp + FEC_IMASK); in fec_stop()
1421 if (fep->quirks & FEC_QUIRK_ENET_MAC && in fec_stop()
1422 !(fep->wol_flag & FEC_WOL_FLAG_SLEEP_ON)) { in fec_stop()
1423 writel(FEC_ECR_ETHEREN, fep->hwp + FEC_ECNTRL); in fec_stop()
1424 writel(rmii_mode, fep->hwp + FEC_R_CNTRL); in fec_stop()
1427 if (fep->bufdesc_ex) { in fec_stop()
1428 val = readl(fep->hwp + FEC_ECNTRL); in fec_stop()
1430 writel(val, fep->hwp + FEC_ECNTRL); in fec_stop()
1444 ndev->stats.tx_errors++; in fec_timeout()
1446 schedule_work(&fep->tx_timeout_work); in fec_timeout()
1453 struct net_device *ndev = fep->netdev; in fec_enet_timeout_work()
1457 napi_disable(&fep->napi); in fec_enet_timeout_work()
1462 napi_enable(&fep->napi); in fec_enet_timeout_work()
1474 spin_lock_irqsave(&fep->tmreg_lock, flags); in fec_enet_hwtstamp()
1475 ns = timecounter_cyc2time(&fep->tc, ts); in fec_enet_hwtstamp()
1476 spin_unlock_irqrestore(&fep->tmreg_lock, flags); in fec_enet_hwtstamp()
1479 hwtstamps->hwtstamp = ns_to_ktime(ns); in fec_enet_hwtstamp()
1499 txq = fep->tx_queue[queue_id]; in fec_enet_tx_queue()
1502 bdp = txq->dirty_tx; in fec_enet_tx_queue()
1505 bdp = fec_enet_get_nextdesc(bdp, &txq->bd); in fec_enet_tx_queue()
1507 while (bdp != READ_ONCE(txq->bd.cur)) { in fec_enet_tx_queue()
1510 status = fec16_to_cpu(READ_ONCE(bdp->cbd_sc)); in fec_enet_tx_queue()
1514 index = fec_enet_get_bd_index(bdp, &txq->bd); in fec_enet_tx_queue()
1516 if (txq->tx_buf[index].type == FEC_TXBUF_T_SKB) { in fec_enet_tx_queue()
1517 skb = txq->tx_buf[index].buf_p; in fec_enet_tx_queue()
1518 if (bdp->cbd_bufaddr && in fec_enet_tx_queue()
1519 !IS_TSO_HEADER(txq, fec32_to_cpu(bdp->cbd_bufaddr))) in fec_enet_tx_queue()
1520 dma_unmap_single(&fep->pdev->dev, in fec_enet_tx_queue()
1521 fec32_to_cpu(bdp->cbd_bufaddr), in fec_enet_tx_queue()
1522 fec16_to_cpu(bdp->cbd_datlen), in fec_enet_tx_queue()
1524 bdp->cbd_bufaddr = cpu_to_fec32(0); in fec_enet_tx_queue()
1536 if (txq->tx_buf[index].type == FEC_TXBUF_T_XDP_NDO) { in fec_enet_tx_queue()
1537 xdpf = txq->tx_buf[index].buf_p; in fec_enet_tx_queue()
1538 if (bdp->cbd_bufaddr) in fec_enet_tx_queue()
1539 dma_unmap_single(&fep->pdev->dev, in fec_enet_tx_queue()
1540 fec32_to_cpu(bdp->cbd_bufaddr), in fec_enet_tx_queue()
1541 fec16_to_cpu(bdp->cbd_datlen), in fec_enet_tx_queue()
1544 page = txq->tx_buf[index].buf_p; in fec_enet_tx_queue()
1547 bdp->cbd_bufaddr = cpu_to_fec32(0); in fec_enet_tx_queue()
1548 if (unlikely(!txq->tx_buf[index].buf_p)) { in fec_enet_tx_queue()
1549 txq->tx_buf[index].type = FEC_TXBUF_T_SKB; in fec_enet_tx_queue()
1553 frame_len = fec16_to_cpu(bdp->cbd_datlen); in fec_enet_tx_queue()
1560 ndev->stats.tx_errors++; in fec_enet_tx_queue()
1562 ndev->stats.tx_heartbeat_errors++; in fec_enet_tx_queue()
1564 ndev->stats.tx_window_errors++; in fec_enet_tx_queue()
1566 ndev->stats.tx_aborted_errors++; in fec_enet_tx_queue()
1568 ndev->stats.tx_fifo_errors++; in fec_enet_tx_queue()
1570 ndev->stats.tx_carrier_errors++; in fec_enet_tx_queue()
1572 ndev->stats.tx_packets++; in fec_enet_tx_queue()
1574 if (txq->tx_buf[index].type == FEC_TXBUF_T_SKB) in fec_enet_tx_queue()
1575 ndev->stats.tx_bytes += skb->len; in fec_enet_tx_queue()
1577 ndev->stats.tx_bytes += frame_len; in fec_enet_tx_queue()
1584 ndev->stats.collisions++; in fec_enet_tx_queue()
1586 if (txq->tx_buf[index].type == FEC_TXBUF_T_SKB) { in fec_enet_tx_queue()
1591 if (unlikely(skb_shinfo(skb)->tx_flags & SKBTX_IN_PROGRESS && in fec_enet_tx_queue()
1592 fep->hwts_tx_en) && fep->bufdesc_ex) { in fec_enet_tx_queue()
1596 fec_enet_hwtstamp(fep, fec32_to_cpu(ebdp->ts), &shhwtstamps); in fec_enet_tx_queue()
1602 } else if (txq->tx_buf[index].type == FEC_TXBUF_T_XDP_NDO) { in fec_enet_tx_queue()
1606 page_pool_put_page(pp_page_to_nmdesc(page)->pp, page, in fec_enet_tx_queue()
1610 txq->tx_buf[index].buf_p = NULL; in fec_enet_tx_queue()
1612 txq->tx_buf[index].type = FEC_TXBUF_T_SKB; in fec_enet_tx_queue()
1619 txq->dirty_tx = bdp; in fec_enet_tx_queue()
1622 bdp = fec_enet_get_nextdesc(bdp, &txq->bd); in fec_enet_tx_queue()
1628 if (entries_free >= txq->tx_wake_threshold) in fec_enet_tx_queue()
1634 if (bdp != txq->bd.cur && in fec_enet_tx_queue()
1635 readl(txq->bd.reg_desc_active) == 0) in fec_enet_tx_queue()
1636 writel(0, txq->bd.reg_desc_active); in fec_enet_tx_queue()
1645 for (i = fep->num_tx_queues - 1; i >= 0; i--) in fec_enet_tx()
1655 new_page = page_pool_dev_alloc_pages(rxq->page_pool); in fec_enet_update_cbd()
1657 return -ENOMEM; in fec_enet_update_cbd()
1659 rxq->rx_skb_info[index].page = new_page; in fec_enet_update_cbd()
1660 rxq->rx_skb_info[index].offset = FEC_ENET_XDP_HEADROOM; in fec_enet_update_cbd()
1662 bdp->cbd_bufaddr = cpu_to_fec32(phys_addr); in fec_enet_update_cbd()
1671 unsigned int sync, len = xdp->data_end - xdp->data; in fec_enet_run_xdp()
1682 sync = xdp->data_end - xdp->data; in fec_enet_run_xdp()
1687 rxq->stats[RX_XDP_PASS]++; in fec_enet_run_xdp()
1692 rxq->stats[RX_XDP_REDIRECT]++; in fec_enet_run_xdp()
1693 err = xdp_do_redirect(fep->netdev, xdp, prog); in fec_enet_run_xdp()
1701 rxq->stats[RX_XDP_TX]++; in fec_enet_run_xdp()
1704 rxq->stats[RX_XDP_TX_ERRORS]++; in fec_enet_run_xdp()
1712 bpf_warn_invalid_xdp_action(fep->netdev, prog, act); in fec_enet_run_xdp()
1719 rxq->stats[RX_XDP_DROP]++; in fec_enet_run_xdp()
1722 page = virt_to_head_page(xdp->data); in fec_enet_run_xdp()
1723 page_pool_put_page(rxq->page_pool, page, sync, true); in fec_enet_run_xdp()
1725 trace_xdp_exception(fep->netdev, prog, act); in fec_enet_run_xdp()
1734 if (ndev->features & NETIF_F_HW_VLAN_CTAG_RX) { in fec_enet_rx_vlan()
1736 const u16 vlan_tag = ntohs(vlan_header->h_vlan_TCI); in fec_enet_rx_vlan()
1740 memmove(skb->data + VLAN_HLEN, skb->data, ETH_ALEN * 2); in fec_enet_rx_vlan()
1765 bool need_swap = fep->quirks & FEC_QUIRK_SWAP_FRAME; in fec_enet_rx_queue()
1766 struct bpf_prog *xdp_prog = READ_ONCE(fep->xdp_prog); in fec_enet_rx_queue()
1779 if (fep->quirks & FEC_QUIRK_HAS_RACC) { in fec_enet_rx_queue()
1792 rxq = fep->rx_queue[queue_id]; in fec_enet_rx_queue()
1797 bdp = rxq->bd.cur; in fec_enet_rx_queue()
1798 xdp_init_buff(&xdp, PAGE_SIZE << fep->pagepool_order, &rxq->xdp_rxq); in fec_enet_rx_queue()
1800 while (!((status = fec16_to_cpu(bdp->cbd_sc)) & BD_ENET_RX_EMPTY)) { in fec_enet_rx_queue()
1806 writel(FEC_ENET_RXF_GET(queue_id), fep->hwp + FEC_IEVENT); in fec_enet_rx_queue()
1813 ndev->stats.rx_errors++; in fec_enet_rx_queue()
1816 ndev->stats.rx_fifo_errors++; in fec_enet_rx_queue()
1822 ndev->stats.rx_length_errors++; in fec_enet_rx_queue()
1827 ndev->stats.rx_crc_errors++; in fec_enet_rx_queue()
1830 ndev->stats.rx_frame_errors++; in fec_enet_rx_queue()
1835 ndev->stats.rx_packets++; in fec_enet_rx_queue()
1836 pkt_len = fec16_to_cpu(bdp->cbd_datlen); in fec_enet_rx_queue()
1837 ndev->stats.rx_bytes += pkt_len; in fec_enet_rx_queue()
1839 index = fec_enet_get_bd_index(bdp, &rxq->bd); in fec_enet_rx_queue()
1840 page = rxq->rx_skb_info[index].page; in fec_enet_rx_queue()
1841 cbd_bufaddr = bdp->cbd_bufaddr; in fec_enet_rx_queue()
1843 ndev->stats.rx_dropped++; in fec_enet_rx_queue()
1847 dma_sync_single_for_cpu(&fep->pdev->dev, in fec_enet_rx_queue()
1857 data_start, pkt_len - sub_len, false); in fec_enet_rx_queue()
1869 PAGE_SIZE << fep->pagepool_order); in fec_enet_rx_queue()
1871 page_pool_recycle_direct(rxq->page_pool, page); in fec_enet_rx_queue()
1872 ndev->stats.rx_dropped++; in fec_enet_rx_queue()
1879 skb_put(skb, pkt_len - sub_len); in fec_enet_rx_queue()
1891 if (fep->bufdesc_ex) in fec_enet_rx_queue()
1895 if (fep->bufdesc_ex && in fec_enet_rx_queue()
1896 (ebdp->cbd_esc & cpu_to_fec32(BD_ENET_RX_VLAN))) in fec_enet_rx_queue()
1899 skb->protocol = eth_type_trans(skb, ndev); in fec_enet_rx_queue()
1902 if (fep->hwts_rx_en && fep->bufdesc_ex) in fec_enet_rx_queue()
1903 fec_enet_hwtstamp(fep, fec32_to_cpu(ebdp->ts), in fec_enet_rx_queue()
1906 if (fep->bufdesc_ex && in fec_enet_rx_queue()
1907 (fep->csum_flags & FLAG_RX_CSUM_ENABLED)) { in fec_enet_rx_queue()
1908 if (!(ebdp->cbd_esc & cpu_to_fec32(FLAG_RX_CSUM_ERROR))) { in fec_enet_rx_queue()
1910 skb->ip_summed = CHECKSUM_UNNECESSARY; in fec_enet_rx_queue()
1917 napi_gro_receive(&fep->napi, skb); in fec_enet_rx_queue()
1926 if (fep->bufdesc_ex) { in fec_enet_rx_queue()
1929 ebdp->cbd_esc = cpu_to_fec32(BD_ENET_RX_INT); in fec_enet_rx_queue()
1930 ebdp->cbd_prot = 0; in fec_enet_rx_queue()
1931 ebdp->cbd_bdu = 0; in fec_enet_rx_queue()
1937 bdp->cbd_sc = cpu_to_fec16(status); in fec_enet_rx_queue()
1940 bdp = fec_enet_get_nextdesc(bdp, &rxq->bd); in fec_enet_rx_queue()
1946 writel(0, rxq->bd.reg_desc_active); in fec_enet_rx_queue()
1948 rxq->bd.cur = bdp; in fec_enet_rx_queue()
1962 for (i = fep->num_rx_queues - 1; i >= 0; i--) in fec_enet_rx()
1963 done += fec_enet_rx_queue(ndev, i, budget - done); in fec_enet_rx()
1972 int_events = readl(fep->hwp + FEC_IEVENT); in fec_enet_collect_events()
1977 writel(int_events, fep->hwp + FEC_IEVENT); in fec_enet_collect_events()
1989 if (fec_enet_collect_events(fep) && fep->link) { in fec_enet_interrupt()
1992 if (napi_schedule_prep(&fep->napi)) { in fec_enet_interrupt()
1994 writel(0, fep->hwp + FEC_IMASK); in fec_enet_interrupt()
1995 __napi_schedule(&fep->napi); in fec_enet_interrupt()
2004 struct net_device *ndev = napi->dev; in fec_enet_rx_napi()
2009 done += fec_enet_rx(ndev, budget - done); in fec_enet_rx_napi()
2015 writel(FEC_DEFAULT_IMASK, fep->hwp + FEC_IMASK); in fec_enet_rx_napi()
2021 /* ------------------------------------------------------------------------- */
2040 struct device_node *np = fep->pdev->dev.of_node; in fec_get_mac()
2045 else if (ret == -EPROBE_DEFER) in fec_get_mac()
2058 struct fec_platform_data *pdata = dev_get_platdata(&fep->pdev->dev); in fec_get_mac()
2061 iap = (unsigned char *)&pdata->mac; in fec_get_mac()
2070 cpu_to_be32(readl(fep->hwp + FEC_ADDR_LOW)); in fec_get_mac()
2072 cpu_to_be16(readl(fep->hwp + FEC_ADDR_HIGH) >> 16); in fec_get_mac()
2081 dev_err(&fep->pdev->dev, "Invalid MAC address: %pM\n", iap); in fec_get_mac()
2083 dev_info(&fep->pdev->dev, "Using random MAC address: %pM\n", in fec_get_mac()
2084 ndev->dev_addr); in fec_get_mac()
2089 eth_hw_addr_gen(ndev, iap, iap == macaddr ? fep->dev_id : 0); in fec_get_mac()
2094 /* ------------------------------------------------------------------------- */
2100 /* LPI Sleep Ts count base on tx clk (clk_ref).
2107 return us * (fep->clk_ref_rate / 1000) / 1000; in fec_enet_us_to_tx_cycle()
2124 writel(sleep_cycle, fep->hwp + FEC_LPI_SLEEP); in fec_enet_eee_mode_set()
2125 writel(wake_cycle, fep->hwp + FEC_LPI_WAKE); in fec_enet_eee_mode_set()
2133 struct phy_device *phy_dev = ndev->phydev; in fec_enet_adjust_link()
2142 fep->link = 0; in fec_enet_adjust_link()
2143 } else if (phy_dev->link) { in fec_enet_adjust_link()
2144 if (!fep->link) { in fec_enet_adjust_link()
2145 fep->link = phy_dev->link; in fec_enet_adjust_link()
2149 if (fep->full_duplex != phy_dev->duplex) { in fec_enet_adjust_link()
2150 fep->full_duplex = phy_dev->duplex; in fec_enet_adjust_link()
2154 if (phy_dev->speed != fep->speed) { in fec_enet_adjust_link()
2155 fep->speed = phy_dev->speed; in fec_enet_adjust_link()
2162 napi_disable(&fep->napi); in fec_enet_adjust_link()
2167 napi_enable(&fep->napi); in fec_enet_adjust_link()
2169 if (fep->quirks & FEC_QUIRK_HAS_EEE) in fec_enet_adjust_link()
2171 phy_dev->eee_cfg.tx_lpi_timer, in fec_enet_adjust_link()
2172 phy_dev->enable_tx_lpi); in fec_enet_adjust_link()
2174 if (fep->link) { in fec_enet_adjust_link()
2176 napi_disable(&fep->napi); in fec_enet_adjust_link()
2180 napi_enable(&fep->napi); in fec_enet_adjust_link()
2181 fep->link = phy_dev->link; in fec_enet_adjust_link()
2195 ret = readl_poll_timeout_atomic(fep->hwp + FEC_IEVENT, ievent, in fec_enet_mdio_wait()
2199 writel(FEC_ENET_MII, fep->hwp + FEC_IEVENT); in fec_enet_mdio_wait()
2206 struct fec_enet_private *fep = bus->priv; in fec_enet_mdio_read_c22()
2207 struct device *dev = &fep->pdev->dev; in fec_enet_mdio_read_c22()
2222 FEC_MMFR_TA, fep->hwp + FEC_MII_DATA); in fec_enet_mdio_read_c22()
2227 netdev_err(fep->netdev, "MDIO read timeout\n"); in fec_enet_mdio_read_c22()
2231 ret = FEC_MMFR_DATA(readl(fep->hwp + FEC_MII_DATA)); in fec_enet_mdio_read_c22()
2243 struct fec_enet_private *fep = bus->priv; in fec_enet_mdio_read_c45()
2244 struct device *dev = &fep->pdev->dev; in fec_enet_mdio_read_c45()
2257 fep->hwp + FEC_MII_DATA); in fec_enet_mdio_read_c45()
2262 netdev_err(fep->netdev, "MDIO address write timeout\n"); in fec_enet_mdio_read_c45()
2271 FEC_MMFR_TA, fep->hwp + FEC_MII_DATA); in fec_enet_mdio_read_c45()
2276 netdev_err(fep->netdev, "MDIO read timeout\n"); in fec_enet_mdio_read_c45()
2280 ret = FEC_MMFR_DATA(readl(fep->hwp + FEC_MII_DATA)); in fec_enet_mdio_read_c45()
2292 struct fec_enet_private *fep = bus->priv; in fec_enet_mdio_write_c22()
2293 struct device *dev = &fep->pdev->dev; in fec_enet_mdio_write_c22()
2308 fep->hwp + FEC_MII_DATA); in fec_enet_mdio_write_c22()
2313 netdev_err(fep->netdev, "MDIO write timeout\n"); in fec_enet_mdio_write_c22()
2324 struct fec_enet_private *fep = bus->priv; in fec_enet_mdio_write_c45()
2325 struct device *dev = &fep->pdev->dev; in fec_enet_mdio_write_c45()
2338 fep->hwp + FEC_MII_DATA); in fec_enet_mdio_write_c45()
2343 netdev_err(fep->netdev, "MDIO address write timeout\n"); in fec_enet_mdio_write_c45()
2351 fep->hwp + FEC_MII_DATA); in fec_enet_mdio_write_c45()
2356 netdev_err(fep->netdev, "MDIO write timeout\n"); in fec_enet_mdio_write_c45()
2368 struct phy_device *phy_dev = ndev->phydev; in fec_enet_phy_reset_after_clk_enable()
2372 } else if (fep->phy_node) { in fec_enet_phy_reset_after_clk_enable()
2380 phy_dev = of_phy_find_device(fep->phy_node); in fec_enet_phy_reset_after_clk_enable()
2383 put_device(&phy_dev->mdio.dev); in fec_enet_phy_reset_after_clk_enable()
2393 ret = clk_prepare_enable(fep->clk_enet_out); in fec_enet_clk_enable()
2397 if (fep->clk_ptp) { in fec_enet_clk_enable()
2398 mutex_lock(&fep->ptp_clk_mutex); in fec_enet_clk_enable()
2399 ret = clk_prepare_enable(fep->clk_ptp); in fec_enet_clk_enable()
2401 mutex_unlock(&fep->ptp_clk_mutex); in fec_enet_clk_enable()
2404 fep->ptp_clk_on = true; in fec_enet_clk_enable()
2406 mutex_unlock(&fep->ptp_clk_mutex); in fec_enet_clk_enable()
2409 ret = clk_prepare_enable(fep->clk_ref); in fec_enet_clk_enable()
2413 ret = clk_prepare_enable(fep->clk_2x_txclk); in fec_enet_clk_enable()
2419 clk_disable_unprepare(fep->clk_enet_out); in fec_enet_clk_enable()
2420 if (fep->clk_ptp) { in fec_enet_clk_enable()
2421 mutex_lock(&fep->ptp_clk_mutex); in fec_enet_clk_enable()
2422 clk_disable_unprepare(fep->clk_ptp); in fec_enet_clk_enable()
2423 fep->ptp_clk_on = false; in fec_enet_clk_enable()
2424 mutex_unlock(&fep->ptp_clk_mutex); in fec_enet_clk_enable()
2426 clk_disable_unprepare(fep->clk_ref); in fec_enet_clk_enable()
2427 clk_disable_unprepare(fep->clk_2x_txclk); in fec_enet_clk_enable()
2433 if (fep->clk_ref) in fec_enet_clk_enable()
2434 clk_disable_unprepare(fep->clk_ref); in fec_enet_clk_enable()
2436 if (fep->clk_ptp) { in fec_enet_clk_enable()
2437 mutex_lock(&fep->ptp_clk_mutex); in fec_enet_clk_enable()
2438 clk_disable_unprepare(fep->clk_ptp); in fec_enet_clk_enable()
2439 fep->ptp_clk_on = false; in fec_enet_clk_enable()
2440 mutex_unlock(&fep->ptp_clk_mutex); in fec_enet_clk_enable()
2443 clk_disable_unprepare(fep->clk_enet_out); in fec_enet_clk_enable()
2453 /* For rgmii tx internal delay, valid values are 0ps and 2000ps */ in fec_enet_parse_rgmii_delay()
2454 if (!of_property_read_u32(np, "tx-internal-delay-ps", &rgmii_tx_delay)) { in fec_enet_parse_rgmii_delay()
2456 dev_err(&fep->pdev->dev, "The only allowed RGMII TX delay values are: 0ps, 2000ps"); in fec_enet_parse_rgmii_delay()
2457 return -EINVAL; in fec_enet_parse_rgmii_delay()
2459 fep->rgmii_txc_dly = true; in fec_enet_parse_rgmii_delay()
2463 /* For rgmii rx internal delay, valid values are 0ps and 2000ps */ in fec_enet_parse_rgmii_delay()
2464 if (!of_property_read_u32(np, "rx-internal-delay-ps", &rgmii_rx_delay)) { in fec_enet_parse_rgmii_delay()
2466 dev_err(&fep->pdev->dev, "The only allowed RGMII RX delay values are: 0ps, 2000ps"); in fec_enet_parse_rgmii_delay()
2467 return -EINVAL; in fec_enet_parse_rgmii_delay()
2469 fep->rgmii_rxc_dly = true; in fec_enet_parse_rgmii_delay()
2483 int dev_id = fep->dev_id; in fec_enet_mii_probe()
2485 if (fep->phy_node) { in fec_enet_mii_probe()
2486 phy_dev = of_phy_connect(ndev, fep->phy_node, in fec_enet_mii_probe()
2488 fep->phy_interface); in fec_enet_mii_probe()
2491 return -ENODEV; in fec_enet_mii_probe()
2496 if (!mdiobus_is_registered_device(fep->mii_bus, phy_id)) in fec_enet_mii_probe()
2498 if (dev_id--) in fec_enet_mii_probe()
2500 strscpy(mdio_bus_id, fep->mii_bus->id, MII_BUS_ID_SIZE); in fec_enet_mii_probe()
2506 strscpy(mdio_bus_id, "fixed-0", MII_BUS_ID_SIZE); in fec_enet_mii_probe()
2513 fep->phy_interface); in fec_enet_mii_probe()
2522 if (fep->quirks & FEC_QUIRK_HAS_GBIT) { in fec_enet_mii_probe()
2533 if (fep->quirks & FEC_QUIRK_HAS_EEE) in fec_enet_mii_probe()
2536 fep->link = 0; in fec_enet_mii_probe()
2537 fep->full_duplex = 0; in fec_enet_mii_probe()
2552 int err = -ENXIO; in fec_enet_mii_init()
2561 * - fec0 supports MII & RMII modes while fec1 only supports RMII in fec_enet_mii_init()
2562 * - fec0 acts as the 1588 time master while fec1 is slave in fec_enet_mii_init()
2563 * - external phys can only be configured by fec0 in fec_enet_mii_init()
2573 if ((fep->quirks & FEC_QUIRK_SINGLE_MDIO) && fep->dev_id > 0) { in fec_enet_mii_init()
2576 fep->mii_bus = fec0_mii_bus; in fec_enet_mii_init()
2580 return -ENOENT; in fec_enet_mii_init()
2584 node = of_get_child_by_name(pdev->dev.of_node, "mdio"); in fec_enet_mii_init()
2586 of_property_read_u32(node, "clock-frequency", &bus_freq); in fec_enet_mii_init()
2588 "suppress-preamble"); in fec_enet_mii_init()
2595 * for ENET-MAC is 'ref_freq / ((MII_SPEED + 1) x 2)'. The i.MX28 in fec_enet_mii_init()
2599 mii_speed = DIV_ROUND_UP(clk_get_rate(fep->clk_ipg), bus_freq * 2); in fec_enet_mii_init()
2600 if (fep->quirks & FEC_QUIRK_ENET_MAC) in fec_enet_mii_init()
2601 mii_speed--; in fec_enet_mii_init()
2603 dev_err(&pdev->dev, in fec_enet_mii_init()
2605 clk_get_rate(fep->clk_ipg)); in fec_enet_mii_init()
2606 err = -EINVAL; in fec_enet_mii_init()
2616 * HOLDTIME + 1 is the number of clk cycles the fec is holding the in fec_enet_mii_init()
2622 holdtime = DIV_ROUND_UP(clk_get_rate(fep->clk_ipg), 100000000) - 1; in fec_enet_mii_init()
2624 fep->phy_speed = mii_speed << 1 | holdtime << 8; in fec_enet_mii_init()
2627 fep->phy_speed |= BIT(7); in fec_enet_mii_init()
2629 if (fep->quirks & FEC_QUIRK_CLEAR_SETUP_MII) { in fec_enet_mii_init()
2632 * - writing MSCR: in fec_enet_mii_init()
2633 * - mmfr[31:0]_not_zero & mscr[7:0]_is_zero & in fec_enet_mii_init()
2635 * - writing MMFR: in fec_enet_mii_init()
2636 * - mscr[7:0]_not_zero in fec_enet_mii_init()
2638 writel(0, fep->hwp + FEC_MII_DATA); in fec_enet_mii_init()
2641 writel(fep->phy_speed, fep->hwp + FEC_MII_SPEED); in fec_enet_mii_init()
2644 writel(FEC_ENET_MII, fep->hwp + FEC_IEVENT); in fec_enet_mii_init()
2646 fep->mii_bus = mdiobus_alloc(); in fec_enet_mii_init()
2647 if (fep->mii_bus == NULL) { in fec_enet_mii_init()
2648 err = -ENOMEM; in fec_enet_mii_init()
2652 fep->mii_bus->name = "fec_enet_mii_bus"; in fec_enet_mii_init()
2653 fep->mii_bus->read = fec_enet_mdio_read_c22; in fec_enet_mii_init()
2654 fep->mii_bus->write = fec_enet_mdio_write_c22; in fec_enet_mii_init()
2655 if (fep->quirks & FEC_QUIRK_HAS_MDIO_C45) { in fec_enet_mii_init()
2656 fep->mii_bus->read_c45 = fec_enet_mdio_read_c45; in fec_enet_mii_init()
2657 fep->mii_bus->write_c45 = fec_enet_mdio_write_c45; in fec_enet_mii_init()
2659 snprintf(fep->mii_bus->id, MII_BUS_ID_SIZE, "%s-%x", in fec_enet_mii_init()
2660 pdev->name, fep->dev_id + 1); in fec_enet_mii_init()
2661 fep->mii_bus->priv = fep; in fec_enet_mii_init()
2662 fep->mii_bus->parent = &pdev->dev; in fec_enet_mii_init()
2664 err = of_mdiobus_register(fep->mii_bus, node); in fec_enet_mii_init()
2671 phydev = mdiobus_get_phy(fep->mii_bus, addr); in fec_enet_mii_init()
2673 phydev->mac_managed_pm = true; in fec_enet_mii_init()
2679 if (fep->quirks & FEC_QUIRK_SINGLE_MDIO) in fec_enet_mii_init()
2680 fec0_mii_bus = fep->mii_bus; in fec_enet_mii_init()
2685 mdiobus_free(fep->mii_bus); in fec_enet_mii_init()
2693 if (--mii_cnt == 0) { in fec_enet_mii_remove()
2694 mdiobus_unregister(fep->mii_bus); in fec_enet_mii_remove()
2695 mdiobus_free(fep->mii_bus); in fec_enet_mii_remove()
2704 strscpy(info->driver, fep->pdev->dev.driver->name, in fec_enet_get_drvinfo()
2705 sizeof(info->driver)); in fec_enet_get_drvinfo()
2706 strscpy(info->bus_info, dev_name(&ndev->dev), sizeof(info->bus_info)); in fec_enet_get_drvinfo()
2715 r = platform_get_resource(fep->pdev, IORESOURCE_MEM, 0); in fec_enet_get_regs_len()
2800 u32 __iomem *theregs = (u32 __iomem *)fep->hwp; in fec_enet_get_regs()
2801 struct device *dev = &fep->pdev->dev; in fec_enet_get_regs()
2827 regs->version = fec_enet_register_version; in fec_enet_get_regs()
2829 memset(buf, 0, regs->len); in fec_enet_get_regs()
2835 !(fep->quirks & FEC_QUIRK_HAS_FRREG)) in fec_enet_get_regs()
2851 if (fep->bufdesc_ex) { in fec_enet_get_ts_info()
2853 info->so_timestamping = SOF_TIMESTAMPING_TX_SOFTWARE | in fec_enet_get_ts_info()
2857 if (fep->ptp_clock) in fec_enet_get_ts_info()
2858 info->phc_index = ptp_clock_index(fep->ptp_clock); in fec_enet_get_ts_info()
2860 info->tx_types = (1 << HWTSTAMP_TX_OFF) | in fec_enet_get_ts_info()
2863 info->rx_filters = (1 << HWTSTAMP_FILTER_NONE) | in fec_enet_get_ts_info()
2878 pause->autoneg = (fep->pause_flag & FEC_PAUSE_FLAG_AUTONEG) != 0; in fec_enet_get_pauseparam()
2879 pause->tx_pause = (fep->pause_flag & FEC_PAUSE_FLAG_ENABLE) != 0; in fec_enet_get_pauseparam()
2880 pause->rx_pause = pause->tx_pause; in fec_enet_get_pauseparam()
2888 if (!ndev->phydev) in fec_enet_set_pauseparam()
2889 return -ENODEV; in fec_enet_set_pauseparam()
2891 if (pause->tx_pause != pause->rx_pause) { in fec_enet_set_pauseparam()
2894 return -EINVAL; in fec_enet_set_pauseparam()
2897 fep->pause_flag = 0; in fec_enet_set_pauseparam()
2900 fep->pause_flag |= pause->rx_pause ? FEC_PAUSE_FLAG_ENABLE : 0; in fec_enet_set_pauseparam()
2901 fep->pause_flag |= pause->autoneg ? FEC_PAUSE_FLAG_AUTONEG : 0; in fec_enet_set_pauseparam()
2903 phy_set_sym_pause(ndev->phydev, pause->rx_pause, pause->tx_pause, in fec_enet_set_pauseparam()
2904 pause->autoneg); in fec_enet_set_pauseparam()
2906 if (pause->autoneg) { in fec_enet_set_pauseparam()
2909 phy_start_aneg(ndev->phydev); in fec_enet_set_pauseparam()
2912 napi_disable(&fep->napi); in fec_enet_set_pauseparam()
2917 napi_enable(&fep->napi); in fec_enet_set_pauseparam()
3007 fep->ethtool_stats[i] = readl(fep->hwp + fec_stats[i].offset); in fec_enet_update_ethtool_stats()
3016 for (i = fep->num_rx_queues - 1; i >= 0; i--) { in fec_enet_get_xdp_stats()
3017 rxq = fep->rx_queue[i]; in fec_enet_get_xdp_stats()
3020 xdp_stats[j] += rxq->stats[j]; in fec_enet_get_xdp_stats()
3033 for (i = fep->num_rx_queues - 1; i >= 0; i--) { in fec_enet_page_pool_stats()
3034 rxq = fep->rx_queue[i]; in fec_enet_page_pool_stats()
3036 if (!rxq->page_pool) in fec_enet_page_pool_stats()
3039 page_pool_get_stats(rxq->page_pool, &stats); in fec_enet_page_pool_stats()
3054 memcpy(data, fep->ethtool_stats, FEC_STATS_SIZE); in fec_enet_get_ethtool_stats()
3097 return -EOPNOTSUPP; in fec_enet_get_sset_count()
3108 writel(FEC_MIB_CTRLSTAT_DISABLE, fep->hwp + FEC_MIB_CTRLSTAT); in fec_enet_clear_ethtool_stats()
3111 writel(0, fep->hwp + fec_stats[i].offset); in fec_enet_clear_ethtool_stats()
3113 for (i = fep->num_rx_queues - 1; i >= 0; i--) { in fec_enet_clear_ethtool_stats()
3114 rxq = fep->rx_queue[i]; in fec_enet_clear_ethtool_stats()
3116 rxq->stats[j] = 0; in fec_enet_clear_ethtool_stats()
3120 writel(0, fep->hwp + FEC_MIB_CTRLSTAT); in fec_enet_clear_ethtool_stats()
3142 return us * (fep->itr_clk_rate / 64000) / 1000; in fec_enet_us_to_itr_clock()
3152 rx_ictt = fec_enet_us_to_itr_clock(ndev, fep->rx_time_itr); in fec_enet_itr_coal_set()
3153 tx_ictt = fec_enet_us_to_itr_clock(ndev, fep->tx_time_itr); in fec_enet_itr_coal_set()
3155 if (rx_ictt > 0 && fep->rx_pkts_itr > 1) { in fec_enet_itr_coal_set()
3158 rx_itr |= FEC_ITR_ICFT(fep->rx_pkts_itr); in fec_enet_itr_coal_set()
3162 if (tx_ictt > 0 && fep->tx_pkts_itr > 1) { in fec_enet_itr_coal_set()
3165 tx_itr |= FEC_ITR_ICFT(fep->tx_pkts_itr); in fec_enet_itr_coal_set()
3169 writel(tx_itr, fep->hwp + FEC_TXIC0); in fec_enet_itr_coal_set()
3170 writel(rx_itr, fep->hwp + FEC_RXIC0); in fec_enet_itr_coal_set()
3171 if (fep->quirks & FEC_QUIRK_HAS_MULTI_QUEUES) { in fec_enet_itr_coal_set()
3172 writel(tx_itr, fep->hwp + FEC_TXIC1); in fec_enet_itr_coal_set()
3173 writel(rx_itr, fep->hwp + FEC_RXIC1); in fec_enet_itr_coal_set()
3174 writel(tx_itr, fep->hwp + FEC_TXIC2); in fec_enet_itr_coal_set()
3175 writel(rx_itr, fep->hwp + FEC_RXIC2); in fec_enet_itr_coal_set()
3186 if (!(fep->quirks & FEC_QUIRK_HAS_COALESCE)) in fec_enet_get_coalesce()
3187 return -EOPNOTSUPP; in fec_enet_get_coalesce()
3189 ec->rx_coalesce_usecs = fep->rx_time_itr; in fec_enet_get_coalesce()
3190 ec->rx_max_coalesced_frames = fep->rx_pkts_itr; in fec_enet_get_coalesce()
3192 ec->tx_coalesce_usecs = fep->tx_time_itr; in fec_enet_get_coalesce()
3193 ec->tx_max_coalesced_frames = fep->tx_pkts_itr; in fec_enet_get_coalesce()
3204 struct device *dev = &fep->pdev->dev; in fec_enet_set_coalesce()
3207 if (!(fep->quirks & FEC_QUIRK_HAS_COALESCE)) in fec_enet_set_coalesce()
3208 return -EOPNOTSUPP; in fec_enet_set_coalesce()
3210 if (ec->rx_max_coalesced_frames > 255) { in fec_enet_set_coalesce()
3212 return -EINVAL; in fec_enet_set_coalesce()
3215 if (ec->tx_max_coalesced_frames > 255) { in fec_enet_set_coalesce()
3217 return -EINVAL; in fec_enet_set_coalesce()
3220 cycle = fec_enet_us_to_itr_clock(ndev, ec->rx_coalesce_usecs); in fec_enet_set_coalesce()
3223 return -EINVAL; in fec_enet_set_coalesce()
3226 cycle = fec_enet_us_to_itr_clock(ndev, ec->tx_coalesce_usecs); in fec_enet_set_coalesce()
3229 return -EINVAL; in fec_enet_set_coalesce()
3232 fep->rx_time_itr = ec->rx_coalesce_usecs; in fec_enet_set_coalesce()
3233 fep->rx_pkts_itr = ec->rx_max_coalesced_frames; in fec_enet_set_coalesce()
3235 fep->tx_time_itr = ec->tx_coalesce_usecs; in fec_enet_set_coalesce()
3236 fep->tx_pkts_itr = ec->tx_max_coalesced_frames; in fec_enet_set_coalesce()
3248 if (!(fep->quirks & FEC_QUIRK_HAS_EEE)) in fec_enet_get_eee()
3249 return -EOPNOTSUPP; in fec_enet_get_eee()
3252 return -ENETDOWN; in fec_enet_get_eee()
3254 return phy_ethtool_get_eee(ndev->phydev, edata); in fec_enet_get_eee()
3262 if (!(fep->quirks & FEC_QUIRK_HAS_EEE)) in fec_enet_set_eee()
3263 return -EOPNOTSUPP; in fec_enet_set_eee()
3266 return -ENETDOWN; in fec_enet_set_eee()
3268 return phy_ethtool_set_eee(ndev->phydev, edata); in fec_enet_set_eee()
3276 if (fep->wol_flag & FEC_WOL_HAS_MAGIC_PACKET) { in fec_enet_get_wol()
3277 wol->supported = WAKE_MAGIC; in fec_enet_get_wol()
3278 wol->wolopts = fep->wol_flag & FEC_WOL_FLAG_ENABLE ? WAKE_MAGIC : 0; in fec_enet_get_wol()
3280 wol->supported = wol->wolopts = 0; in fec_enet_get_wol()
3289 if (!(fep->wol_flag & FEC_WOL_HAS_MAGIC_PACKET)) in fec_enet_set_wol()
3290 return -EINVAL; in fec_enet_set_wol()
3292 if (wol->wolopts & ~WAKE_MAGIC) in fec_enet_set_wol()
3293 return -EINVAL; in fec_enet_set_wol()
3295 device_set_wakeup_enable(&ndev->dev, wol->wolopts & WAKE_MAGIC); in fec_enet_set_wol()
3296 if (device_may_wakeup(&ndev->dev)) in fec_enet_set_wol()
3297 fep->wol_flag |= FEC_WOL_FLAG_ENABLE; in fec_enet_set_wol()
3299 fep->wol_flag &= (~FEC_WOL_FLAG_ENABLE); in fec_enet_set_wol()
3339 for (q = 0; q < fep->num_rx_queues; q++) { in fec_enet_free_buffers()
3340 rxq = fep->rx_queue[q]; in fec_enet_free_buffers()
3341 for (i = 0; i < rxq->bd.ring_size; i++) in fec_enet_free_buffers()
3342 page_pool_put_full_page(rxq->page_pool, rxq->rx_skb_info[i].page, false); in fec_enet_free_buffers()
3345 rxq->stats[i] = 0; in fec_enet_free_buffers()
3347 if (xdp_rxq_info_is_reg(&rxq->xdp_rxq)) in fec_enet_free_buffers()
3348 xdp_rxq_info_unreg(&rxq->xdp_rxq); in fec_enet_free_buffers()
3349 page_pool_destroy(rxq->page_pool); in fec_enet_free_buffers()
3350 rxq->page_pool = NULL; in fec_enet_free_buffers()
3353 for (q = 0; q < fep->num_tx_queues; q++) { in fec_enet_free_buffers()
3354 txq = fep->tx_queue[q]; in fec_enet_free_buffers()
3355 for (i = 0; i < txq->bd.ring_size; i++) { in fec_enet_free_buffers()
3356 kfree(txq->tx_bounce[i]); in fec_enet_free_buffers()
3357 txq->tx_bounce[i] = NULL; in fec_enet_free_buffers()
3359 if (!txq->tx_buf[i].buf_p) { in fec_enet_free_buffers()
3360 txq->tx_buf[i].type = FEC_TXBUF_T_SKB; in fec_enet_free_buffers()
3364 if (txq->tx_buf[i].type == FEC_TXBUF_T_SKB) { in fec_enet_free_buffers()
3365 dev_kfree_skb(txq->tx_buf[i].buf_p); in fec_enet_free_buffers()
3366 } else if (txq->tx_buf[i].type == FEC_TXBUF_T_XDP_NDO) { in fec_enet_free_buffers()
3367 xdp_return_frame(txq->tx_buf[i].buf_p); in fec_enet_free_buffers()
3369 struct page *page = txq->tx_buf[i].buf_p; in fec_enet_free_buffers()
3371 page_pool_put_page(pp_page_to_nmdesc(page)->pp, in fec_enet_free_buffers()
3375 txq->tx_buf[i].buf_p = NULL; in fec_enet_free_buffers()
3376 txq->tx_buf[i].type = FEC_TXBUF_T_SKB; in fec_enet_free_buffers()
3387 for (i = 0; i < fep->num_tx_queues; i++) in fec_enet_free_queue()
3388 if (fep->tx_queue[i] && fep->tx_queue[i]->tso_hdrs) { in fec_enet_free_queue()
3389 txq = fep->tx_queue[i]; in fec_enet_free_queue()
3390 fec_dma_free(&fep->pdev->dev, in fec_enet_free_queue()
3391 txq->bd.ring_size * TSO_HEADER_SIZE, in fec_enet_free_queue()
3392 txq->tso_hdrs, txq->tso_hdrs_dma); in fec_enet_free_queue()
3395 for (i = 0; i < fep->num_rx_queues; i++) in fec_enet_free_queue()
3396 kfree(fep->rx_queue[i]); in fec_enet_free_queue()
3397 for (i = 0; i < fep->num_tx_queues; i++) in fec_enet_free_queue()
3398 kfree(fep->tx_queue[i]); in fec_enet_free_queue()
3408 for (i = 0; i < fep->num_tx_queues; i++) { in fec_enet_alloc_queue()
3411 ret = -ENOMEM; in fec_enet_alloc_queue()
3415 fep->tx_queue[i] = txq; in fec_enet_alloc_queue()
3416 txq->bd.ring_size = TX_RING_SIZE; in fec_enet_alloc_queue()
3417 fep->total_tx_ring_size += fep->tx_queue[i]->bd.ring_size; in fec_enet_alloc_queue()
3419 txq->tx_stop_threshold = FEC_MAX_SKB_DESCS; in fec_enet_alloc_queue()
3420 txq->tx_wake_threshold = FEC_MAX_SKB_DESCS + 2 * MAX_SKB_FRAGS; in fec_enet_alloc_queue()
3422 txq->tso_hdrs = fec_dma_alloc(&fep->pdev->dev, in fec_enet_alloc_queue()
3423 txq->bd.ring_size * TSO_HEADER_SIZE, in fec_enet_alloc_queue()
3424 &txq->tso_hdrs_dma, GFP_KERNEL); in fec_enet_alloc_queue()
3425 if (!txq->tso_hdrs) { in fec_enet_alloc_queue()
3426 ret = -ENOMEM; in fec_enet_alloc_queue()
3431 for (i = 0; i < fep->num_rx_queues; i++) { in fec_enet_alloc_queue()
3432 fep->rx_queue[i] = kzalloc(sizeof(*fep->rx_queue[i]), in fec_enet_alloc_queue()
3434 if (!fep->rx_queue[i]) { in fec_enet_alloc_queue()
3435 ret = -ENOMEM; in fec_enet_alloc_queue()
3439 fep->rx_queue[i]->bd.ring_size = RX_RING_SIZE; in fec_enet_alloc_queue()
3440 fep->total_rx_ring_size += fep->rx_queue[i]->bd.ring_size; in fec_enet_alloc_queue()
3459 rxq = fep->rx_queue[queue]; in fec_enet_alloc_rxq_buffers()
3460 bdp = rxq->bd.base; in fec_enet_alloc_rxq_buffers()
3462 err = fec_enet_create_page_pool(fep, rxq, rxq->bd.ring_size); in fec_enet_alloc_rxq_buffers()
3468 for (i = 0; i < rxq->bd.ring_size; i++) { in fec_enet_alloc_rxq_buffers()
3469 page = page_pool_dev_alloc_pages(rxq->page_pool); in fec_enet_alloc_rxq_buffers()
3474 bdp->cbd_bufaddr = cpu_to_fec32(phys_addr); in fec_enet_alloc_rxq_buffers()
3476 rxq->rx_skb_info[i].page = page; in fec_enet_alloc_rxq_buffers()
3477 rxq->rx_skb_info[i].offset = FEC_ENET_XDP_HEADROOM; in fec_enet_alloc_rxq_buffers()
3478 bdp->cbd_sc = cpu_to_fec16(BD_ENET_RX_EMPTY); in fec_enet_alloc_rxq_buffers()
3480 if (fep->bufdesc_ex) { in fec_enet_alloc_rxq_buffers()
3482 ebdp->cbd_esc = cpu_to_fec32(BD_ENET_RX_INT); in fec_enet_alloc_rxq_buffers()
3485 bdp = fec_enet_get_nextdesc(bdp, &rxq->bd); in fec_enet_alloc_rxq_buffers()
3489 bdp = fec_enet_get_prevdesc(bdp, &rxq->bd); in fec_enet_alloc_rxq_buffers()
3490 bdp->cbd_sc |= cpu_to_fec16(BD_SC_WRAP); in fec_enet_alloc_rxq_buffers()
3495 return -ENOMEM; in fec_enet_alloc_rxq_buffers()
3506 txq = fep->tx_queue[queue]; in fec_enet_alloc_txq_buffers()
3507 bdp = txq->bd.base; in fec_enet_alloc_txq_buffers()
3508 for (i = 0; i < txq->bd.ring_size; i++) { in fec_enet_alloc_txq_buffers()
3509 txq->tx_bounce[i] = kmalloc(FEC_ENET_TX_FRSIZE, GFP_KERNEL); in fec_enet_alloc_txq_buffers()
3510 if (!txq->tx_bounce[i]) in fec_enet_alloc_txq_buffers()
3513 bdp->cbd_sc = cpu_to_fec16(0); in fec_enet_alloc_txq_buffers()
3514 bdp->cbd_bufaddr = cpu_to_fec32(0); in fec_enet_alloc_txq_buffers()
3516 if (fep->bufdesc_ex) { in fec_enet_alloc_txq_buffers()
3518 ebdp->cbd_esc = cpu_to_fec32(BD_ENET_TX_INT); in fec_enet_alloc_txq_buffers()
3521 bdp = fec_enet_get_nextdesc(bdp, &txq->bd); in fec_enet_alloc_txq_buffers()
3525 bdp = fec_enet_get_prevdesc(bdp, &txq->bd); in fec_enet_alloc_txq_buffers()
3526 bdp->cbd_sc |= cpu_to_fec16(BD_SC_WRAP); in fec_enet_alloc_txq_buffers()
3532 return -ENOMEM; in fec_enet_alloc_txq_buffers()
3540 for (i = 0; i < fep->num_rx_queues; i++) in fec_enet_alloc_buffers()
3542 return -ENOMEM; in fec_enet_alloc_buffers()
3544 for (i = 0; i < fep->num_tx_queues; i++) in fec_enet_alloc_buffers()
3546 return -ENOMEM; in fec_enet_alloc_buffers()
3557 ret = pm_runtime_resume_and_get(&fep->pdev->dev); in fec_enet_open()
3561 pinctrl_pm_select_default_state(&fep->pdev->dev); in fec_enet_open()
3572 if (ndev->phydev && ndev->phydev->drv) in fec_enet_open()
3599 if (fep->quirks & FEC_QUIRK_ERR006687) in fec_enet_open()
3602 if (fep->quirks & FEC_QUIRK_HAS_PMQOS) in fec_enet_open()
3603 cpu_latency_qos_add_request(&fep->pm_qos_req, 0); in fec_enet_open()
3605 napi_enable(&fep->napi); in fec_enet_open()
3606 phy_start(ndev->phydev); in fec_enet_open()
3609 device_set_wakeup_enable(&ndev->dev, fep->wol_flag & in fec_enet_open()
3619 pm_runtime_mark_last_busy(&fep->pdev->dev); in fec_enet_open()
3620 pm_runtime_put_autosuspend(&fep->pdev->dev); in fec_enet_open()
3621 pinctrl_pm_select_sleep_state(&fep->pdev->dev); in fec_enet_open()
3630 phy_stop(ndev->phydev); in fec_enet_close()
3633 napi_disable(&fep->napi); in fec_enet_close()
3638 phy_disconnect(ndev->phydev); in fec_enet_close()
3640 if (fep->quirks & FEC_QUIRK_ERR006687) in fec_enet_close()
3646 if (fep->quirks & FEC_QUIRK_HAS_PMQOS) in fec_enet_close()
3647 cpu_latency_qos_remove_request(&fep->pm_qos_req); in fec_enet_close()
3649 pinctrl_pm_select_sleep_state(&fep->pdev->dev); in fec_enet_close()
3650 pm_runtime_mark_last_busy(&fep->pdev->dev); in fec_enet_close()
3651 pm_runtime_put_autosuspend(&fep->pdev->dev); in fec_enet_close()
3678 if (ndev->flags & IFF_PROMISC) { in set_multicast_list()
3679 tmp = readl(fep->hwp + FEC_R_CNTRL); in set_multicast_list()
3681 writel(tmp, fep->hwp + FEC_R_CNTRL); in set_multicast_list()
3685 tmp = readl(fep->hwp + FEC_R_CNTRL); in set_multicast_list()
3687 writel(tmp, fep->hwp + FEC_R_CNTRL); in set_multicast_list()
3689 if (ndev->flags & IFF_ALLMULTI) { in set_multicast_list()
3693 writel(0xffffffff, fep->hwp + FEC_GRP_HASH_TABLE_HIGH); in set_multicast_list()
3694 writel(0xffffffff, fep->hwp + FEC_GRP_HASH_TABLE_LOW); in set_multicast_list()
3702 crc = ether_crc_le(ndev->addr_len, ha->addr); in set_multicast_list()
3707 hash = (crc >> (32 - FEC_HASH_BITS)) & 0x3f; in set_multicast_list()
3710 hash_high |= 1 << (hash - 32); in set_multicast_list()
3715 writel(hash_high, fep->hwp + FEC_GRP_HASH_TABLE_HIGH); in set_multicast_list()
3716 writel(hash_low, fep->hwp + FEC_GRP_HASH_TABLE_LOW); in set_multicast_list()
3726 if (!is_valid_ether_addr(addr->sa_data)) in fec_set_mac_address()
3727 return -EADDRNOTAVAIL; in fec_set_mac_address()
3728 eth_hw_addr_set(ndev, addr->sa_data); in fec_set_mac_address()
3748 netdev_features_t changed = features ^ netdev->features; in fec_enet_set_netdev_features()
3750 netdev->features = features; in fec_enet_set_netdev_features()
3755 fep->csum_flags |= FLAG_RX_CSUM_ENABLED; in fec_enet_set_netdev_features()
3757 fep->csum_flags &= ~FLAG_RX_CSUM_ENABLED; in fec_enet_set_netdev_features()
3765 netdev_features_t changed = features ^ netdev->features; in fec_set_features()
3768 napi_disable(&fep->napi); in fec_set_features()
3775 napi_enable(&fep->napi); in fec_set_features()
3789 if (!(fep->quirks & FEC_QUIRK_HAS_AVB)) in fec_enet_select_queue()
3793 if (eth_type_vlan(skb->protocol)) { in fec_enet_select_queue()
3796 vlan_tag = ntohs(vhdr->h_vlan_TCI); in fec_enet_select_queue()
3799 vlan_tag = skb->vlan_tci; in fec_enet_select_queue()
3813 switch (bpf->command) { in fec_enet_bpf()
3819 if (fep->quirks & FEC_QUIRK_SWAP_FRAME) in fec_enet_bpf()
3820 return -EOPNOTSUPP; in fec_enet_bpf()
3822 if (!bpf->prog) in fec_enet_bpf()
3826 napi_disable(&fep->napi); in fec_enet_bpf()
3830 old_prog = xchg(&fep->xdp_prog, bpf->prog); in fec_enet_bpf()
3837 napi_enable(&fep->napi); in fec_enet_bpf()
3841 if (bpf->prog) in fec_enet_bpf()
3847 return -EOPNOTSUPP; in fec_enet_bpf()
3850 return -EOPNOTSUPP; in fec_enet_bpf()
3860 return (index % fep->num_tx_queues); in fec_enet_xdp_get_tx_queue()
3876 netdev_err_once(fep->netdev, "NOT enough BD for SG!\n"); in fec_enet_txq_xmit_frame()
3877 return -EBUSY; in fec_enet_txq_xmit_frame()
3881 bdp = txq->bd.cur; in fec_enet_txq_xmit_frame()
3882 status = fec16_to_cpu(bdp->cbd_sc); in fec_enet_txq_xmit_frame()
3885 index = fec_enet_get_bd_index(bdp, &txq->bd); in fec_enet_txq_xmit_frame()
3890 dma_addr = dma_map_single(&fep->pdev->dev, xdpf->data, in fec_enet_txq_xmit_frame()
3891 xdpf->len, DMA_TO_DEVICE); in fec_enet_txq_xmit_frame()
3892 if (dma_mapping_error(&fep->pdev->dev, dma_addr)) in fec_enet_txq_xmit_frame()
3893 return -ENOMEM; in fec_enet_txq_xmit_frame()
3895 frame_len = xdpf->len; in fec_enet_txq_xmit_frame()
3896 txq->tx_buf[index].buf_p = xdpf; in fec_enet_txq_xmit_frame()
3897 txq->tx_buf[index].type = FEC_TXBUF_T_XDP_NDO; in fec_enet_txq_xmit_frame()
3902 page = virt_to_page(xdpb->data); in fec_enet_txq_xmit_frame()
3904 (xdpb->data - xdpb->data_hard_start); in fec_enet_txq_xmit_frame()
3905 dma_sync_single_for_device(&fep->pdev->dev, dma_addr, in fec_enet_txq_xmit_frame()
3907 frame_len = xdpb->data_end - xdpb->data; in fec_enet_txq_xmit_frame()
3908 txq->tx_buf[index].buf_p = page; in fec_enet_txq_xmit_frame()
3909 txq->tx_buf[index].type = FEC_TXBUF_T_XDP_TX; in fec_enet_txq_xmit_frame()
3913 if (fep->bufdesc_ex) in fec_enet_txq_xmit_frame()
3916 bdp->cbd_bufaddr = cpu_to_fec32(dma_addr); in fec_enet_txq_xmit_frame()
3917 bdp->cbd_datlen = cpu_to_fec16(frame_len); in fec_enet_txq_xmit_frame()
3919 if (fep->bufdesc_ex) { in fec_enet_txq_xmit_frame()
3922 if (fep->quirks & FEC_QUIRK_HAS_AVB) in fec_enet_txq_xmit_frame()
3923 estatus |= FEC_TX_BD_FTYPE(txq->bd.qid); in fec_enet_txq_xmit_frame()
3925 ebdp->cbd_bdu = 0; in fec_enet_txq_xmit_frame()
3926 ebdp->cbd_esc = cpu_to_fec32(estatus); in fec_enet_txq_xmit_frame()
3938 bdp->cbd_sc = cpu_to_fec16(status); in fec_enet_txq_xmit_frame()
3941 bdp = fec_enet_get_nextdesc(bdp, &txq->bd); in fec_enet_txq_xmit_frame()
3943 /* Make sure the update to bdp are performed before txq->bd.cur. */ in fec_enet_txq_xmit_frame()
3946 txq->bd.cur = bdp; in fec_enet_txq_xmit_frame()
3949 writel(0, txq->bd.reg_desc_active); in fec_enet_txq_xmit_frame()
3963 txq = fep->tx_queue[queue]; in fec_enet_xdp_tx_xmit()
3964 nq = netdev_get_tx_queue(fep->netdev, queue); in fec_enet_xdp_tx_xmit()
3991 txq = fep->tx_queue[queue]; in fec_enet_xdp_xmit()
3992 nq = netdev_get_tx_queue(fep->netdev, queue); in fec_enet_xdp_xmit()
4015 return -EINVAL; in fec_hwtstamp_get()
4017 if (!fep->bufdesc_ex) in fec_hwtstamp_get()
4018 return -EOPNOTSUPP; in fec_hwtstamp_get()
4032 return -EINVAL; in fec_hwtstamp_set()
4034 if (!fep->bufdesc_ex) in fec_hwtstamp_set()
4035 return -EOPNOTSUPP; in fec_hwtstamp_set()
4046 return -EBUSY; in fec_change_mtu()
4050 fep->rx_frame_size = (PAGE_SIZE << order) - FEC_DRV_RESERVE_SPACE; in fec_change_mtu()
4051 fep->pagepool_order = order; in fec_change_mtu()
4052 WRITE_ONCE(ndev->mtu, new_mtu); in fec_change_mtu()
4094 unsigned dsize = fep->bufdesc_ex ? sizeof(struct bufdesc_ex) : in fec_enet_init()
4101 fep->rx_align = 0xf; in fec_enet_init()
4102 fep->tx_align = 0xf; in fec_enet_init()
4104 fep->rx_align = 0x3; in fec_enet_init()
4105 fep->tx_align = 0x3; in fec_enet_init()
4107 fep->rx_pkts_itr = FEC_ITR_ICFT_DEFAULT; in fec_enet_init()
4108 fep->tx_pkts_itr = FEC_ITR_ICFT_DEFAULT; in fec_enet_init()
4109 fep->rx_time_itr = FEC_ITR_ICTT_DEFAULT; in fec_enet_init()
4110 fep->tx_time_itr = FEC_ITR_ICTT_DEFAULT; in fec_enet_init()
4113 ret = dma_set_mask_and_coherent(&fep->pdev->dev, DMA_BIT_MASK(32)); in fec_enet_init()
4115 dev_warn(&fep->pdev->dev, "No suitable DMA available\n"); in fec_enet_init()
4123 bd_size = (fep->total_tx_ring_size + fep->total_rx_ring_size) * dsize; in fec_enet_init()
4126 cbd_base = fec_dmam_alloc(&fep->pdev->dev, bd_size, &bd_dma, in fec_enet_init()
4129 ret = -ENOMEM; in fec_enet_init()
4139 for (i = 0; i < fep->num_rx_queues; i++) { in fec_enet_init()
4140 struct fec_enet_priv_rx_q *rxq = fep->rx_queue[i]; in fec_enet_init()
4141 unsigned size = dsize * rxq->bd.ring_size; in fec_enet_init()
4143 rxq->bd.qid = i; in fec_enet_init()
4144 rxq->bd.base = cbd_base; in fec_enet_init()
4145 rxq->bd.cur = cbd_base; in fec_enet_init()
4146 rxq->bd.dma = bd_dma; in fec_enet_init()
4147 rxq->bd.dsize = dsize; in fec_enet_init()
4148 rxq->bd.dsize_log2 = dsize_log2; in fec_enet_init()
4149 rxq->bd.reg_desc_active = fep->hwp + offset_des_active_rxq[i]; in fec_enet_init()
4152 rxq->bd.last = (struct bufdesc *)(((void *)cbd_base) - dsize); in fec_enet_init()
4155 for (i = 0; i < fep->num_tx_queues; i++) { in fec_enet_init()
4156 struct fec_enet_priv_tx_q *txq = fep->tx_queue[i]; in fec_enet_init()
4157 unsigned size = dsize * txq->bd.ring_size; in fec_enet_init()
4159 txq->bd.qid = i; in fec_enet_init()
4160 txq->bd.base = cbd_base; in fec_enet_init()
4161 txq->bd.cur = cbd_base; in fec_enet_init()
4162 txq->bd.dma = bd_dma; in fec_enet_init()
4163 txq->bd.dsize = dsize; in fec_enet_init()
4164 txq->bd.dsize_log2 = dsize_log2; in fec_enet_init()
4165 txq->bd.reg_desc_active = fep->hwp + offset_des_active_txq[i]; in fec_enet_init()
4168 txq->bd.last = (struct bufdesc *)(((void *)cbd_base) - dsize); in fec_enet_init()
4173 ndev->watchdog_timeo = TX_TIMEOUT; in fec_enet_init()
4174 ndev->netdev_ops = &fec_netdev_ops; in fec_enet_init()
4175 ndev->ethtool_ops = &fec_enet_ethtool_ops; in fec_enet_init()
4177 writel(FEC_RX_DISABLED_IMASK, fep->hwp + FEC_IMASK); in fec_enet_init()
4178 netif_napi_add(ndev, &fep->napi, fec_enet_rx_napi); in fec_enet_init()
4180 if (fep->quirks & FEC_QUIRK_HAS_VLAN) in fec_enet_init()
4182 ndev->features |= NETIF_F_HW_VLAN_CTAG_RX; in fec_enet_init()
4184 if (fep->quirks & FEC_QUIRK_HAS_CSUM) { in fec_enet_init()
4188 ndev->features |= (NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM in fec_enet_init()
4190 fep->csum_flags |= FLAG_RX_CSUM_ENABLED; in fec_enet_init()
4193 if (fep->quirks & FEC_QUIRK_HAS_MULTI_QUEUES) { in fec_enet_init()
4194 fep->tx_align = 0; in fec_enet_init()
4195 fep->rx_align = 0x3f; in fec_enet_init()
4198 ndev->hw_features = ndev->features; in fec_enet_init()
4200 if (!(fep->quirks & FEC_QUIRK_SWAP_FRAME)) in fec_enet_init()
4201 ndev->xdp_features = NETDEV_XDP_ACT_BASIC | in fec_enet_init()
4206 if (fep->quirks & FEC_QUIRK_MIB_CLEAR) in fec_enet_init()
4222 netif_napi_del(&fep->napi); in fec_enet_deinit()
4231 struct device_node *np = pdev->dev.of_node; in fec_reset_phy()
4237 err = of_property_read_u32(np, "phy-reset-duration", &msec); in fec_reset_phy()
4242 err = of_property_read_u32(np, "phy-reset-post-delay", &phy_post_delay); in fec_reset_phy()
4245 return -EINVAL; in fec_reset_phy()
4247 phy_reset = devm_gpiod_get_optional(&pdev->dev, "phy-reset", in fec_reset_phy()
4250 return dev_err_probe(&pdev->dev, PTR_ERR(phy_reset), in fec_reset_phy()
4251 "failed to get phy-reset-gpios\n"); in fec_reset_phy()
4288 struct device_node *np = pdev->dev.of_node; in fec_enet_get_queue_num()
4296 of_property_read_u32(np, "fsl,num-tx-queues", num_tx); in fec_enet_get_queue_num()
4298 of_property_read_u32(np, "fsl,num-rx-queues", num_rx); in fec_enet_get_queue_num()
4301 dev_warn(&pdev->dev, "Invalid num_tx(=%d), fall back to 1\n", in fec_enet_get_queue_num()
4308 dev_warn(&pdev->dev, "Invalid num_rx(=%d), fall back to 1\n", in fec_enet_get_queue_num()
4334 if (fep->quirks & FEC_QUIRK_WAKEUP_FROM_INT2) in fec_enet_get_wakeup_irq()
4335 fep->wake_irq = fep->irq[2]; in fec_enet_get_wakeup_irq()
4337 fep->wake_irq = fep->irq[0]; in fec_enet_get_wakeup_irq()
4347 gpr_np = of_parse_phandle(np, "fsl,stop-mode", 0); in fec_enet_init_stop_mode()
4351 ret = of_property_read_u32_array(np, "fsl,stop-mode", out_val, in fec_enet_init_stop_mode()
4354 dev_dbg(&fep->pdev->dev, "no stop mode property\n"); in fec_enet_init_stop_mode()
4358 fep->stop_gpr.gpr = syscon_node_to_regmap(gpr_np); in fec_enet_init_stop_mode()
4359 if (IS_ERR(fep->stop_gpr.gpr)) { in fec_enet_init_stop_mode()
4360 dev_err(&fep->pdev->dev, "could not find gpr regmap\n"); in fec_enet_init_stop_mode()
4361 ret = PTR_ERR(fep->stop_gpr.gpr); in fec_enet_init_stop_mode()
4362 fep->stop_gpr.gpr = NULL; in fec_enet_init_stop_mode()
4366 fep->stop_gpr.reg = out_val[1]; in fec_enet_init_stop_mode()
4367 fep->stop_gpr.bit = out_val[2]; in fec_enet_init_stop_mode()
4384 struct device_node *np = pdev->dev.of_node, *phy_node; in fec_probe()
4397 return -ENOMEM; in fec_probe()
4399 SET_NETDEV_DEV(ndev, &pdev->dev); in fec_probe()
4404 dev_info = device_get_match_data(&pdev->dev); in fec_probe()
4406 dev_info = (const struct fec_devinfo *)pdev->id_entry->driver_data; in fec_probe()
4408 fep->quirks = dev_info->quirks; in fec_probe()
4410 fep->netdev = ndev; in fec_probe()
4411 fep->num_rx_queues = num_rx_qs; in fec_probe()
4412 fep->num_tx_queues = num_tx_qs; in fec_probe()
4416 if (fep->quirks & FEC_QUIRK_HAS_GBIT) in fec_probe()
4417 fep->pause_flag |= FEC_PAUSE_FLAG_AUTONEG; in fec_probe()
4421 pinctrl_pm_select_default_state(&pdev->dev); in fec_probe()
4423 fep->hwp = devm_platform_ioremap_resource(pdev, 0); in fec_probe()
4424 if (IS_ERR(fep->hwp)) { in fec_probe()
4425 ret = PTR_ERR(fep->hwp); in fec_probe()
4429 fep->pdev = pdev; in fec_probe()
4430 fep->dev_id = dev_id++; in fec_probe()
4436 !of_property_read_bool(np, "fsl,err006687-workaround-present")) in fec_probe()
4437 fep->quirks |= FEC_QUIRK_ERR006687; in fec_probe()
4443 if (of_property_read_bool(np, "fsl,magic-packet")) in fec_probe()
4444 fep->wol_flag |= FEC_WOL_HAS_MAGIC_PACKET; in fec_probe()
4450 phy_node = of_parse_phandle(np, "phy-handle", 0); in fec_probe()
4454 dev_err(&pdev->dev, in fec_probe()
4455 "broken fixed-link specification\n"); in fec_probe()
4460 fep->phy_node = phy_node; in fec_probe()
4462 ret = of_get_phy_mode(pdev->dev.of_node, &interface); in fec_probe()
4464 pdata = dev_get_platdata(&pdev->dev); in fec_probe()
4466 fep->phy_interface = pdata->phy; in fec_probe()
4468 fep->phy_interface = PHY_INTERFACE_MODE_MII; in fec_probe()
4470 fep->phy_interface = interface; in fec_probe()
4477 fep->clk_ipg = devm_clk_get(&pdev->dev, "ipg"); in fec_probe()
4478 if (IS_ERR(fep->clk_ipg)) { in fec_probe()
4479 ret = PTR_ERR(fep->clk_ipg); in fec_probe()
4483 fep->clk_ahb = devm_clk_get(&pdev->dev, "ahb"); in fec_probe()
4484 if (IS_ERR(fep->clk_ahb)) { in fec_probe()
4485 ret = PTR_ERR(fep->clk_ahb); in fec_probe()
4489 fep->itr_clk_rate = clk_get_rate(fep->clk_ahb); in fec_probe()
4492 fep->clk_enet_out = devm_clk_get_optional(&pdev->dev, "enet_out"); in fec_probe()
4493 if (IS_ERR(fep->clk_enet_out)) { in fec_probe()
4494 ret = PTR_ERR(fep->clk_enet_out); in fec_probe()
4498 fep->ptp_clk_on = false; in fec_probe()
4499 mutex_init(&fep->ptp_clk_mutex); in fec_probe()
4502 fep->clk_ref = devm_clk_get_optional(&pdev->dev, "enet_clk_ref"); in fec_probe()
4503 if (IS_ERR(fep->clk_ref)) { in fec_probe()
4504 ret = PTR_ERR(fep->clk_ref); in fec_probe()
4507 fep->clk_ref_rate = clk_get_rate(fep->clk_ref); in fec_probe()
4510 if (fep->rgmii_txc_dly || fep->rgmii_rxc_dly) { in fec_probe()
4511 fep->clk_2x_txclk = devm_clk_get(&pdev->dev, "enet_2x_txclk"); in fec_probe()
4512 if (IS_ERR(fep->clk_2x_txclk)) in fec_probe()
4513 fep->clk_2x_txclk = NULL; in fec_probe()
4516 fep->bufdesc_ex = fep->quirks & FEC_QUIRK_HAS_BUFDESC_EX; in fec_probe()
4517 fep->clk_ptp = devm_clk_get(&pdev->dev, "ptp"); in fec_probe()
4518 if (IS_ERR(fep->clk_ptp)) { in fec_probe()
4519 fep->clk_ptp = NULL; in fec_probe()
4520 fep->bufdesc_ex = false; in fec_probe()
4527 ret = clk_prepare_enable(fep->clk_ipg); in fec_probe()
4530 ret = clk_prepare_enable(fep->clk_ahb); in fec_probe()
4534 fep->reg_phy = devm_regulator_get_optional(&pdev->dev, "phy"); in fec_probe()
4535 if (!IS_ERR(fep->reg_phy)) { in fec_probe()
4536 ret = regulator_enable(fep->reg_phy); in fec_probe()
4538 dev_err(&pdev->dev, in fec_probe()
4543 if (PTR_ERR(fep->reg_phy) == -EPROBE_DEFER) { in fec_probe()
4544 ret = -EPROBE_DEFER; in fec_probe()
4547 fep->reg_phy = NULL; in fec_probe()
4550 pm_runtime_set_autosuspend_delay(&pdev->dev, FEC_MDIO_PM_TIMEOUT); in fec_probe()
4551 pm_runtime_use_autosuspend(&pdev->dev); in fec_probe()
4552 pm_runtime_get_noresume(&pdev->dev); in fec_probe()
4553 pm_runtime_set_active(&pdev->dev); in fec_probe()
4554 pm_runtime_enable(&pdev->dev); in fec_probe()
4561 if (fep->bufdesc_ex) in fec_probe()
4577 ret = devm_request_irq(&pdev->dev, irq, fec_enet_interrupt, in fec_probe()
4578 0, pdev->name, ndev); in fec_probe()
4582 fep->irq[i] = irq; in fec_probe()
4595 pinctrl_pm_select_sleep_state(&pdev->dev); in fec_probe()
4597 fep->pagepool_order = 0; in fec_probe()
4598 fep->rx_frame_size = FEC_ENET_RX_FRSIZE; in fec_probe()
4600 if (fep->quirks & FEC_QUIRK_JUMBO_FRAME) in fec_probe()
4601 fep->max_buf_size = MAX_JUMBO_BUF_SIZE; in fec_probe()
4603 fep->max_buf_size = PKT_MAXBUF_SIZE; in fec_probe()
4605 ndev->max_mtu = fep->max_buf_size - ETH_HLEN - ETH_FCS_LEN; in fec_probe()
4611 device_init_wakeup(&ndev->dev, fep->wol_flag & in fec_probe()
4614 if (fep->bufdesc_ex && fep->ptp_clock) in fec_probe()
4615 netdev_info(ndev, "registered PHC device %d\n", fep->dev_id); in fec_probe()
4617 INIT_WORK(&fep->tx_timeout_work, fec_enet_timeout_work); in fec_probe()
4619 pm_runtime_mark_last_busy(&pdev->dev); in fec_probe()
4620 pm_runtime_put_autosuspend(&pdev->dev); in fec_probe()
4632 pm_runtime_put_noidle(&pdev->dev); in fec_probe()
4633 pm_runtime_disable(&pdev->dev); in fec_probe()
4634 if (fep->reg_phy) in fec_probe()
4635 regulator_disable(fep->reg_phy); in fec_probe()
4637 clk_disable_unprepare(fep->clk_ahb); in fec_probe()
4639 clk_disable_unprepare(fep->clk_ipg); in fec_probe()
4650 dev_id--; in fec_probe()
4662 struct device_node *np = pdev->dev.of_node; in fec_drv_remove()
4665 ret = pm_runtime_get_sync(&pdev->dev); in fec_drv_remove()
4667 dev_err(&pdev->dev, in fec_drv_remove()
4671 cancel_work_sync(&fep->tx_timeout_work); in fec_drv_remove()
4675 if (fep->reg_phy) in fec_drv_remove()
4676 regulator_disable(fep->reg_phy); in fec_drv_remove()
4680 of_node_put(fep->phy_node); in fec_drv_remove()
4686 clk_disable_unprepare(fep->clk_ahb); in fec_drv_remove()
4687 clk_disable_unprepare(fep->clk_ipg); in fec_drv_remove()
4689 pm_runtime_put_noidle(&pdev->dev); in fec_drv_remove()
4690 pm_runtime_disable(&pdev->dev); in fec_drv_remove()
4704 if (fep->wol_flag & FEC_WOL_FLAG_ENABLE) in fec_suspend()
4705 fep->wol_flag |= FEC_WOL_FLAG_SLEEP_ON; in fec_suspend()
4706 phy_stop(ndev->phydev); in fec_suspend()
4707 napi_disable(&fep->napi); in fec_suspend()
4712 if (!(fep->wol_flag & FEC_WOL_FLAG_ENABLE)) { in fec_suspend()
4714 pinctrl_pm_select_sleep_state(&fep->pdev->dev); in fec_suspend()
4717 if (fep->wake_irq > 0) { in fec_suspend()
4718 disable_irq(fep->wake_irq); in fec_suspend()
4719 enable_irq_wake(fep->wake_irq); in fec_suspend()
4726 fep->rpm_active = !pm_runtime_status_suspended(dev); in fec_suspend()
4727 if (fep->rpm_active) { in fec_suspend()
4737 if (fep->reg_phy && !(fep->wol_flag & FEC_WOL_FLAG_ENABLE)) in fec_suspend()
4738 regulator_disable(fep->reg_phy); in fec_suspend()
4743 if (fep->clk_enet_out || fep->reg_phy) in fec_suspend()
4744 fep->link = 0; in fec_suspend()
4756 if (fep->reg_phy && !(fep->wol_flag & FEC_WOL_FLAG_ENABLE)) { in fec_resume()
4757 ret = regulator_enable(fep->reg_phy); in fec_resume()
4764 if (fep->rpm_active) in fec_resume()
4772 if (fep->wol_flag & FEC_WOL_FLAG_ENABLE) { in fec_resume()
4774 if (fep->wake_irq) { in fec_resume()
4775 disable_irq_wake(fep->wake_irq); in fec_resume()
4776 enable_irq(fep->wake_irq); in fec_resume()
4779 val = readl(fep->hwp + FEC_ECNTRL); in fec_resume()
4781 writel(val, fep->hwp + FEC_ECNTRL); in fec_resume()
4782 fep->wol_flag &= ~FEC_WOL_FLAG_SLEEP_ON; in fec_resume()
4784 pinctrl_pm_select_default_state(&fep->pdev->dev); in fec_resume()
4790 napi_enable(&fep->napi); in fec_resume()
4791 phy_init_hw(ndev->phydev); in fec_resume()
4792 phy_start(ndev->phydev); in fec_resume()
4799 if (fep->reg_phy) in fec_resume()
4800 regulator_disable(fep->reg_phy); in fec_resume()
4809 clk_disable_unprepare(fep->clk_ahb); in fec_runtime_suspend()
4810 clk_disable_unprepare(fep->clk_ipg); in fec_runtime_suspend()
4821 ret = clk_prepare_enable(fep->clk_ahb); in fec_runtime_resume()
4824 ret = clk_prepare_enable(fep->clk_ipg); in fec_runtime_resume()
4831 clk_disable_unprepare(fep->clk_ahb); in fec_runtime_resume()