Lines Matching +full:route +full:- +full:ptp

1 // SPDX-License-Identifier: GPL-2.0
4 * Copyright (C) 2020 Texas Instruments Incorporated - http://www.ti.com/
32 #include <linux/dma/ti-cppi5.h>
33 #include <linux/dma/k3-udma-glue.h>
40 #include "am65-cpsw-nuss.h"
41 #include "am65-cpsw-switchdev.h"
42 #include "k3-cppi-desc-pool.h"
43 #include "am65-cpts.h"
132 /* The PTP event messages - Sync, Delay_Req, Pdelay_Req, and Pdelay_Resp. */
182 writel(mac_hi, slave->port_base + AM65_CPSW_PORTN_REG_SA_H); in am65_cpsw_port_set_sl_mac()
183 writel(mac_lo, slave->port_base + AM65_CPSW_PORTN_REG_SA_L); in am65_cpsw_port_set_sl_mac()
197 return -EINVAL; in am65_cpsw_port_set_dscp_map()
200 return -EINVAL; in am65_cpsw_port_set_dscp_map()
202 /* 32-bit register offset to this dscp */ in am65_cpsw_port_set_dscp_map()
207 val = readl(slave->port_base + AM65_CPSW_PORTN_REG_DSCP_MAP + reg_ofs); in am65_cpsw_port_set_dscp_map()
210 writel(val, slave->port_base + AM65_CPSW_PORTN_REG_DSCP_MAP + reg_ofs); in am65_cpsw_port_set_dscp_map()
221 * https://datatracker.ietf.org/doc/html/rfc8325#section-4.3 in am65_cpsw_port_enable_dscp_map()
223 * https://datatracker.ietf.org/doc/html/rfc8622#section-11 in am65_cpsw_port_enable_dscp_map()
273 val = readl(slave->port_base + AM65_CPSW_PORTN_REG_CTL); in am65_cpsw_port_enable_dscp_map()
276 writel(val, slave->port_base + AM65_CPSW_PORTN_REG_CTL); in am65_cpsw_port_enable_dscp_map()
281 cpsw_sl_reset(port->slave.mac_sl, 100); in am65_cpsw_sl_ctl_reset()
284 port->port_base + AM65_CPSW_PORT_REG_RX_MAXLEN); in am65_cpsw_sl_ctl_reset()
289 common->nuss_ver = readl(common->ss_base); in am65_cpsw_nuss_get_ver()
290 common->cpsw_ver = readl(common->cpsw_base); in am65_cpsw_nuss_get_ver()
291 dev_info(common->dev, in am65_cpsw_nuss_get_ver()
293 common->nuss_ver, in am65_cpsw_nuss_get_ver()
294 common->cpsw_ver, in am65_cpsw_nuss_get_ver()
295 common->port_num + 1, in am65_cpsw_nuss_get_ver()
296 common->pdata.quirks); in am65_cpsw_nuss_get_ver()
307 if (!common->is_emac_mode) in am65_cpsw_nuss_ndo_slave_add_vid()
313 ret = pm_runtime_resume_and_get(common->dev); in am65_cpsw_nuss_ndo_slave_add_vid()
317 port_mask = BIT(port->port_id) | ALE_PORT_HOST; in am65_cpsw_nuss_ndo_slave_add_vid()
320 dev_info(common->dev, "Adding vlan %d to vlan filter\n", vid); in am65_cpsw_nuss_ndo_slave_add_vid()
321 ret = cpsw_ale_vlan_add_modify(common->ale, vid, port_mask, in am65_cpsw_nuss_ndo_slave_add_vid()
324 pm_runtime_put(common->dev); in am65_cpsw_nuss_ndo_slave_add_vid()
335 if (!common->is_emac_mode) in am65_cpsw_nuss_ndo_slave_kill_vid()
341 ret = pm_runtime_resume_and_get(common->dev); in am65_cpsw_nuss_ndo_slave_kill_vid()
345 dev_info(common->dev, "Removing vlan %d from vlan filter\n", vid); in am65_cpsw_nuss_ndo_slave_kill_vid()
346 ret = cpsw_ale_del_vlan(common->ale, vid, in am65_cpsw_nuss_ndo_slave_kill_vid()
347 BIT(port->port_id) | ALE_PORT_HOST); in am65_cpsw_nuss_ndo_slave_kill_vid()
349 pm_runtime_put(common->dev); in am65_cpsw_nuss_ndo_slave_kill_vid()
356 struct am65_cpsw_common *common = port->common; in am65_cpsw_slave_set_promisc()
358 if (promisc && !common->is_emac_mode) { in am65_cpsw_slave_set_promisc()
359 dev_dbg(common->dev, "promisc mode requested in switch mode"); in am65_cpsw_slave_set_promisc()
365 cpsw_ale_control_set(common->ale, port->port_id, in am65_cpsw_slave_set_promisc()
367 dev_dbg(common->dev, "promisc enabled\n"); in am65_cpsw_slave_set_promisc()
370 cpsw_ale_control_set(common->ale, port->port_id, in am65_cpsw_slave_set_promisc()
372 dev_dbg(common->dev, "promisc disabled\n"); in am65_cpsw_slave_set_promisc()
383 promisc = !!(ndev->flags & IFF_PROMISC); in am65_cpsw_nuss_ndo_slave_set_rx_mode()
390 cpsw_ale_set_allmulti(common->ale, in am65_cpsw_nuss_ndo_slave_set_rx_mode()
391 ndev->flags & IFF_ALLMULTI, port->port_id); in am65_cpsw_nuss_ndo_slave_set_rx_mode()
395 cpsw_ale_flush_multicast(common->ale, port_mask, -1); in am65_cpsw_nuss_ndo_slave_set_rx_mode()
402 cpsw_ale_add_mcast(common->ale, ha->addr, in am65_cpsw_nuss_ndo_slave_set_rx_mode()
417 tx_chn = &common->tx_chns[txqueue]; in am65_cpsw_nuss_ndo_host_tx_timeout()
418 trans_start = READ_ONCE(netif_txq->trans_start); in am65_cpsw_nuss_ndo_host_tx_timeout()
423 jiffies_to_msecs(jiffies - trans_start), in am65_cpsw_nuss_ndo_host_tx_timeout()
425 k3_cppi_desc_pool_avail(tx_chn->desc_pool)); in am65_cpsw_nuss_ndo_host_tx_timeout()
437 struct am65_cpsw_rx_chn *rx_chn = &common->rx_chns; in am65_cpsw_nuss_rx_push()
439 struct device *dev = common->dev; in am65_cpsw_nuss_rx_push()
444 desc_rx = k3_cppi_desc_pool_alloc(rx_chn->desc_pool); in am65_cpsw_nuss_rx_push()
447 return -ENOMEM; in am65_cpsw_nuss_rx_push()
449 desc_dma = k3_cppi_desc_pool_virt2dma(rx_chn->desc_pool, desc_rx); in am65_cpsw_nuss_rx_push()
451 buf_dma = dma_map_single(rx_chn->dma_dev, in am65_cpsw_nuss_rx_push()
454 if (unlikely(dma_mapping_error(rx_chn->dma_dev, buf_dma))) { in am65_cpsw_nuss_rx_push()
455 k3_cppi_desc_pool_free(rx_chn->desc_pool, desc_rx); in am65_cpsw_nuss_rx_push()
457 return -EINVAL; in am65_cpsw_nuss_rx_push()
462 k3_udma_glue_rx_dma_to_cppi5_addr(rx_chn->rx_chn, &buf_dma); in am65_cpsw_nuss_rx_push()
466 swdata->page = page; in am65_cpsw_nuss_rx_push()
467 swdata->flow_id = flow_idx; in am65_cpsw_nuss_rx_push()
469 return k3_udma_glue_push_rx_chn(rx_chn->rx_chn, flow_idx, in am65_cpsw_nuss_rx_push()
479 val = readl(host_p->port_base + AM65_CPSW_PORT_REG_PRI_CTL); in am65_cpsw_nuss_set_p0_ptype()
481 if (common->pf_p0_rx_ptype_rrobin) { in am65_cpsw_nuss_set_p0_ptype()
493 writel(pri_map, host_p->port_base + AM65_CPSW_PORT_REG_RX_PRI_MAP); in am65_cpsw_nuss_set_p0_ptype()
494 writel(val, host_p->port_base + AM65_CPSW_PORT_REG_PRI_CTL); in am65_cpsw_nuss_set_p0_ptype()
509 struct am65_cpsw_rx_chn *rx_chn = &common->rx_chns; in am65_cpsw_destroy_rxq()
514 flow = &rx_chn->flows[id]; in am65_cpsw_destroy_rxq()
515 napi_disable(&flow->napi_rx); in am65_cpsw_destroy_rxq()
516 hrtimer_cancel(&flow->rx_hrtimer); in am65_cpsw_destroy_rxq()
517 k3_udma_glue_reset_rx_chn(rx_chn->rx_chn, id, rx_chn, in am65_cpsw_destroy_rxq()
520 for (port = 0; port < common->port_num; port++) { in am65_cpsw_destroy_rxq()
521 if (!common->ports[port].ndev) in am65_cpsw_destroy_rxq()
524 rxq = &common->ports[port].xdp_rxq[id]; in am65_cpsw_destroy_rxq()
530 if (flow->page_pool) { in am65_cpsw_destroy_rxq()
531 page_pool_destroy(flow->page_pool); in am65_cpsw_destroy_rxq()
532 flow->page_pool = NULL; in am65_cpsw_destroy_rxq()
538 struct am65_cpsw_rx_chn *rx_chn = &common->rx_chns; in am65_cpsw_destroy_rxqs()
541 reinit_completion(&common->tdown_complete); in am65_cpsw_destroy_rxqs()
542 k3_udma_glue_tdown_rx_chn(rx_chn->rx_chn, true); in am65_cpsw_destroy_rxqs()
544 if (common->pdata.quirks & AM64_CPSW_QUIRK_DMA_RX_TDOWN_IRQ) { in am65_cpsw_destroy_rxqs()
545 id = wait_for_completion_timeout(&common->tdown_complete, msecs_to_jiffies(1000)); in am65_cpsw_destroy_rxqs()
547 dev_err(common->dev, "rx teardown timeout\n"); in am65_cpsw_destroy_rxqs()
550 for (id = common->rx_ch_num_flows - 1; id >= 0; id--) in am65_cpsw_destroy_rxqs()
553 k3_udma_glue_disable_rx_chn(common->rx_chns.rx_chn); in am65_cpsw_destroy_rxqs()
558 struct am65_cpsw_rx_chn *rx_chn = &common->rx_chns; in am65_cpsw_create_rxq()
563 .nid = dev_to_node(common->dev), in am65_cpsw_create_rxq()
564 .dev = common->dev, in am65_cpsw_create_rxq()
574 flow = &rx_chn->flows[id]; in am65_cpsw_create_rxq()
575 pp_params.napi = &flow->napi_rx; in am65_cpsw_create_rxq()
582 flow->page_pool = pool; in am65_cpsw_create_rxq()
587 for (port = 0; port < common->port_num; port++) { in am65_cpsw_create_rxq()
588 if (!common->ports[port].ndev) in am65_cpsw_create_rxq()
592 rxq = &common->ports[port].xdp_rxq[id]; in am65_cpsw_create_rxq()
593 ret = xdp_rxq_info_reg(rxq, common->ports[port].ndev, in am65_cpsw_create_rxq()
594 id, flow->napi_rx.napi_id); in am65_cpsw_create_rxq()
606 page = page_pool_dev_alloc_pages(flow->page_pool); in am65_cpsw_create_rxq()
608 dev_err(common->dev, "cannot allocate page in flow %d\n", in am65_cpsw_create_rxq()
610 ret = -ENOMEM; in am65_cpsw_create_rxq()
616 dev_err(common->dev, in am65_cpsw_create_rxq()
624 napi_enable(&flow->napi_rx); in am65_cpsw_create_rxq()
636 for (id = 0; id < common->rx_ch_num_flows; id++) { in am65_cpsw_create_rxqs()
639 dev_err(common->dev, "couldn't create rxq %d: %d\n", in am65_cpsw_create_rxqs()
645 ret = k3_udma_glue_enable_rx_chn(common->rx_chns.rx_chn); in am65_cpsw_create_rxqs()
647 dev_err(common->dev, "couldn't enable rx chn: %d\n", ret); in am65_cpsw_create_rxqs()
654 for (--id; id >= 0; id--) in am65_cpsw_create_rxqs()
662 struct am65_cpsw_tx_chn *tx_chn = &common->tx_chns[id]; in am65_cpsw_destroy_txq()
664 napi_disable(&tx_chn->napi_tx); in am65_cpsw_destroy_txq()
665 hrtimer_cancel(&tx_chn->tx_hrtimer); in am65_cpsw_destroy_txq()
666 k3_udma_glue_reset_tx_chn(tx_chn->tx_chn, tx_chn, in am65_cpsw_destroy_txq()
668 k3_udma_glue_disable_tx_chn(tx_chn->tx_chn); in am65_cpsw_destroy_txq()
673 struct am65_cpsw_tx_chn *tx_chn = common->tx_chns; in am65_cpsw_destroy_txqs()
677 atomic_set(&common->tdown_cnt, common->tx_ch_num); in am65_cpsw_destroy_txqs()
680 reinit_completion(&common->tdown_complete); in am65_cpsw_destroy_txqs()
682 for (id = 0; id < common->tx_ch_num; id++) in am65_cpsw_destroy_txqs()
685 id = wait_for_completion_timeout(&common->tdown_complete, in am65_cpsw_destroy_txqs()
688 dev_err(common->dev, "tx teardown timeout\n"); in am65_cpsw_destroy_txqs()
690 for (id = common->tx_ch_num - 1; id >= 0; id--) in am65_cpsw_destroy_txqs()
696 struct am65_cpsw_tx_chn *tx_chn = &common->tx_chns[id]; in am65_cpsw_create_txq()
699 ret = k3_udma_glue_enable_tx_chn(tx_chn->tx_chn); in am65_cpsw_create_txq()
703 napi_enable(&tx_chn->napi_tx); in am65_cpsw_create_txq()
712 for (id = 0; id < common->tx_ch_num; id++) { in am65_cpsw_create_txqs()
715 dev_err(common->dev, "couldn't create txq %d: %d\n", in am65_cpsw_create_txqs()
724 for (--id; id >= 0; id--) in am65_cpsw_create_txqs()
736 return (desc - pool_addr) >> dsize_log2; in am65_cpsw_nuss_desc_idx()
745 desc_idx = am65_cpsw_nuss_desc_idx(tx_chn->desc_pool, desc, in am65_cpsw_nuss_set_buf_type()
746 tx_chn->dsize_log2); in am65_cpsw_nuss_set_buf_type()
747 k3_cppi_desc_pool_desc_info_set(tx_chn->desc_pool, desc_idx, in am65_cpsw_nuss_set_buf_type()
757 desc_tx = k3_cppi_desc_pool_dma2virt(tx_chn->desc_pool, desc_dma); in am65_cpsw_nuss_buf_type()
758 desc_idx = am65_cpsw_nuss_desc_idx(tx_chn->desc_pool, desc_tx, in am65_cpsw_nuss_buf_type()
759 tx_chn->dsize_log2); in am65_cpsw_nuss_buf_type()
761 return (enum am65_cpsw_tx_buf_type)k3_cppi_desc_pool_desc_info(tx_chn->desc_pool, in am65_cpsw_nuss_buf_type()
769 page_pool_put_full_page(flow->page_pool, page, allow_direct); in am65_cpsw_put_page()
782 desc_rx = k3_cppi_desc_pool_dma2virt(rx_chn->desc_pool, desc_dma); in am65_cpsw_nuss_rx_cleanup()
784 page = swdata->page; in am65_cpsw_nuss_rx_cleanup()
785 flow_id = swdata->flow_id; in am65_cpsw_nuss_rx_cleanup()
787 k3_udma_glue_rx_cppi5_to_dma_addr(rx_chn->rx_chn, &buf_dma); in am65_cpsw_nuss_rx_cleanup()
788 dma_unmap_single(rx_chn->dma_dev, buf_dma, buf_dma_len, DMA_FROM_DEVICE); in am65_cpsw_nuss_rx_cleanup()
789 k3_cppi_desc_pool_free(rx_chn->desc_pool, desc_rx); in am65_cpsw_nuss_rx_cleanup()
790 am65_cpsw_put_page(&rx_chn->flows[flow_id], page, false); in am65_cpsw_nuss_rx_cleanup()
804 k3_udma_glue_tx_cppi5_to_dma_addr(tx_chn->tx_chn, &buf_dma); in am65_cpsw_nuss_xmit_free()
806 dma_unmap_single(tx_chn->dma_dev, buf_dma, buf_dma_len, DMA_TO_DEVICE); in am65_cpsw_nuss_xmit_free()
809 k3_udma_glue_tx_cppi5_to_dma_addr(tx_chn->tx_chn, &next_desc_dma); in am65_cpsw_nuss_xmit_free()
811 next_desc = k3_cppi_desc_pool_dma2virt(tx_chn->desc_pool, in am65_cpsw_nuss_xmit_free()
814 k3_udma_glue_tx_cppi5_to_dma_addr(tx_chn->tx_chn, &buf_dma); in am65_cpsw_nuss_xmit_free()
816 dma_unmap_page(tx_chn->dma_dev, buf_dma, buf_dma_len, in am65_cpsw_nuss_xmit_free()
820 k3_udma_glue_tx_cppi5_to_dma_addr(tx_chn->tx_chn, &next_desc_dma); in am65_cpsw_nuss_xmit_free()
822 k3_cppi_desc_pool_free(tx_chn->desc_pool, next_desc); in am65_cpsw_nuss_xmit_free()
825 k3_cppi_desc_pool_free(tx_chn->desc_pool, first_desc); in am65_cpsw_nuss_xmit_free()
837 desc_tx = k3_cppi_desc_pool_dma2virt(tx_chn->desc_pool, desc_dma); in am65_cpsw_nuss_tx_cleanup()
865 skb->dev = ndev; in am65_cpsw_build_skb()
876 if (common->usage_count) in am65_cpsw_nuss_common_open()
882 common->cpsw_base + AM65_CPSW_REG_CTL); in am65_cpsw_nuss_common_open()
885 host_p->port_base + AM65_CPSW_PORT_REG_RX_MAXLEN); in am65_cpsw_nuss_common_open()
887 writel(common->rx_flow_id_base, in am65_cpsw_nuss_common_open()
888 host_p->port_base + AM65_CPSW_PORT0_REG_FLOW_ID_OFFSET); in am65_cpsw_nuss_common_open()
890 host_p->port_base + AM65_CPSW_P0_REG_CTL); in am65_cpsw_nuss_common_open()
896 for (port_idx = 0; port_idx < common->port_num; port_idx++) { in am65_cpsw_nuss_common_open()
897 struct am65_cpsw_port *port = &common->ports[port_idx]; in am65_cpsw_nuss_common_open()
899 if (!port->disabled) in am65_cpsw_nuss_common_open()
900 val |= BIT(port->port_id); in am65_cpsw_nuss_common_open()
902 writel(val, common->cpsw_base + AM65_CPSW_REG_STAT_PORT_EN); in am65_cpsw_nuss_common_open()
905 writel(0, common->cpsw_base + AM65_CPSW_REG_PTYPE); in am65_cpsw_nuss_common_open()
907 cpsw_ale_start(common->ale); in am65_cpsw_nuss_common_open()
910 cpsw_ale_control_set(common->ale, HOST_PORT_NUM, in am65_cpsw_nuss_common_open()
912 cpsw_ale_control_set(common->ale, HOST_PORT_NUM, in am65_cpsw_nuss_common_open()
915 cpsw_ale_control_set(common->ale, HOST_PORT_NUM, ALE_VLAN_AWARE, 1); in am65_cpsw_nuss_common_open()
916 cpsw_ale_control_set(common->ale, HOST_PORT_NUM, in am65_cpsw_nuss_common_open()
920 port_mask = GENMASK(common->port_num, 0) & in am65_cpsw_nuss_common_open()
921 ~common->disabled_ports_mask; in am65_cpsw_nuss_common_open()
923 cpsw_ale_add_vlan(common->ale, 0, port_mask, in am65_cpsw_nuss_common_open()
927 if (common->is_emac_mode) in am65_cpsw_nuss_common_open()
942 dev_dbg(common->dev, "cpsw_nuss started\n"); in am65_cpsw_nuss_common_open()
953 if (common->usage_count != 1) in am65_cpsw_nuss_common_stop()
956 cpsw_ale_control_set(common->ale, HOST_PORT_NUM, in am65_cpsw_nuss_common_stop()
961 cpsw_ale_stop(common->ale); in am65_cpsw_nuss_common_stop()
963 writel(0, common->cpsw_base + AM65_CPSW_REG_CTL); in am65_cpsw_nuss_common_stop()
964 writel(0, common->cpsw_base + AM65_CPSW_REG_STAT_PORT_EN); in am65_cpsw_nuss_common_stop()
966 dev_dbg(common->dev, "cpsw_nuss stopped\n"); in am65_cpsw_nuss_common_stop()
976 phylink_stop(port->slave.phylink); in am65_cpsw_nuss_ndo_slave_stop()
980 phylink_disconnect_phy(port->slave.phylink); in am65_cpsw_nuss_ndo_slave_stop()
986 common->usage_count--; in am65_cpsw_nuss_ndo_slave_stop()
987 pm_runtime_put(common->dev); in am65_cpsw_nuss_ndo_slave_stop()
998 return am65_cpsw_nuss_ndo_slave_add_vid(port->ndev, 0, vid); in cpsw_restore_vlans()
1008 ret = pm_runtime_resume_and_get(common->dev); in am65_cpsw_nuss_ndo_slave_open()
1013 cpsw_sl_ctl_set(port->slave.mac_sl, CPSW_SL_CTL_CMD_IDLE); in am65_cpsw_nuss_ndo_slave_open()
1014 cpsw_sl_wait_for_idle(port->slave.mac_sl, 100); in am65_cpsw_nuss_ndo_slave_open()
1015 cpsw_sl_ctl_reset(port->slave.mac_sl); in am65_cpsw_nuss_ndo_slave_open()
1018 cpsw_sl_reg_write(port->slave.mac_sl, CPSW_SL_SOFT_RESET, 1); in am65_cpsw_nuss_ndo_slave_open()
1020 reg = cpsw_sl_reg_read(port->slave.mac_sl, CPSW_SL_SOFT_RESET); in am65_cpsw_nuss_ndo_slave_open()
1022 dev_err(common->dev, "soft RESET didn't complete\n"); in am65_cpsw_nuss_ndo_slave_open()
1023 ret = -ETIMEDOUT; in am65_cpsw_nuss_ndo_slave_open()
1028 ret = netif_set_real_num_tx_queues(ndev, common->tx_ch_num); in am65_cpsw_nuss_ndo_slave_open()
1030 dev_err(common->dev, "cannot set real number of tx queues\n"); in am65_cpsw_nuss_ndo_slave_open()
1034 ret = netif_set_real_num_rx_queues(ndev, common->rx_ch_num_flows); in am65_cpsw_nuss_ndo_slave_open()
1036 dev_err(common->dev, "cannot set real number of rx queues\n"); in am65_cpsw_nuss_ndo_slave_open()
1040 for (i = 0; i < common->tx_ch_num; i++) { in am65_cpsw_nuss_ndo_slave_open()
1044 txq->tx_maxrate = common->tx_chns[i].rate_mbps; in am65_cpsw_nuss_ndo_slave_open()
1051 common->usage_count++; in am65_cpsw_nuss_ndo_slave_open()
1057 reg = readl(common->cpsw_base + AM65_CPSW_REG_CTL); in am65_cpsw_nuss_ndo_slave_open()
1059 writel(reg, common->cpsw_base + AM65_CPSW_REG_CTL); in am65_cpsw_nuss_ndo_slave_open()
1062 am65_cpsw_port_set_sl_mac(port, ndev->dev_addr); in am65_cpsw_nuss_ndo_slave_open()
1065 if (common->is_emac_mode) in am65_cpsw_nuss_ndo_slave_open()
1070 /* mac_sl should be configured via phy-link interface */ in am65_cpsw_nuss_ndo_slave_open()
1073 ret = phylink_of_phy_connect(port->slave.phylink, port->slave.port_np, 0); in am65_cpsw_nuss_ndo_slave_open()
1080 phylink_start(port->slave.phylink); in am65_cpsw_nuss_ndo_slave_open()
1089 pm_runtime_put(common->dev); in am65_cpsw_nuss_ndo_slave_open()
1103 u32 pkt_len = xdpf->len; in am65_cpsw_xdp_tx_frame()
1107 host_desc = k3_cppi_desc_pool_alloc(tx_chn->desc_pool); in am65_cpsw_xdp_tx_frame()
1109 ndev->stats.tx_dropped++; in am65_cpsw_xdp_tx_frame()
1115 dma_buf = dma_map_single(tx_chn->dma_dev, xdpf->data, in am65_cpsw_xdp_tx_frame()
1117 if (unlikely(dma_mapping_error(tx_chn->dma_dev, dma_buf))) { in am65_cpsw_xdp_tx_frame()
1118 ndev->stats.tx_dropped++; in am65_cpsw_xdp_tx_frame()
1127 cppi5_desc_set_pktids(&host_desc->hdr, 0, AM65_CPSW_CPPI_TX_FLOW_ID); in am65_cpsw_xdp_tx_frame()
1128 cppi5_desc_set_tags_ids(&host_desc->hdr, 0, port->port_id); in am65_cpsw_xdp_tx_frame()
1130 k3_udma_glue_tx_dma_to_cppi5_addr(tx_chn->tx_chn, &dma_buf); in am65_cpsw_xdp_tx_frame()
1137 netif_txq = netdev_get_tx_queue(ndev, tx_chn->id); in am65_cpsw_xdp_tx_frame()
1140 dma_desc = k3_cppi_desc_pool_virt2dma(tx_chn->desc_pool, host_desc); in am65_cpsw_xdp_tx_frame()
1142 ret = k3_udma_glue_push_tx_chn(tx_chn->tx_chn, host_desc, in am65_cpsw_xdp_tx_frame()
1145 spin_lock_bh(&tx_chn->lock); in am65_cpsw_xdp_tx_frame()
1146 ret = k3_udma_glue_push_tx_chn(tx_chn->tx_chn, host_desc, in am65_cpsw_xdp_tx_frame()
1148 spin_unlock_bh(&tx_chn->lock); in am65_cpsw_xdp_tx_frame()
1153 ndev->stats.tx_errors++; in am65_cpsw_xdp_tx_frame()
1161 k3_udma_glue_tx_cppi5_to_dma_addr(tx_chn->tx_chn, &dma_buf); in am65_cpsw_xdp_tx_frame()
1162 dma_unmap_single(tx_chn->dma_dev, dma_buf, pkt_len, DMA_TO_DEVICE); in am65_cpsw_xdp_tx_frame()
1164 k3_cppi_desc_pool_free(tx_chn->desc_pool, host_desc); in am65_cpsw_xdp_tx_frame()
1173 struct am65_cpsw_common *common = flow->common; in am65_cpsw_run_xdp()
1174 struct net_device *ndev = port->ndev; in am65_cpsw_run_xdp()
1186 prog = READ_ONCE(port->xdp_prog); in am65_cpsw_run_xdp()
1192 *len = xdp->data_end - xdp->data; in am65_cpsw_run_xdp()
1199 tx_chn = &common->tx_chns[cpu % AM65_CPSW_MAX_QUEUES]; in am65_cpsw_run_xdp()
1200 netif_txq = netdev_get_tx_queue(ndev, tx_chn->id); in am65_cpsw_run_xdp()
1204 ndev->stats.tx_dropped++; in am65_cpsw_run_xdp()
1233 ndev->stats.rx_dropped++; in am65_cpsw_run_xdp()
1236 page = virt_to_head_page(xdp->data); in am65_cpsw_run_xdp()
1243 /* RX psdata[2] word format - checksum information */
1255 * AM65_CPSW_RX_PSD_CSUM_ERR bit - indicates csum error in am65_cpsw_nuss_rx_csum()
1257 * bits - indicates IPv4/IPv6 packet in am65_cpsw_nuss_rx_csum()
1258 * AM65_CPSW_RX_PSD_IS_FRAGMENT bit - indicates fragmented packet in am65_cpsw_nuss_rx_csum()
1264 if (unlikely(!(skb->dev->features & NETIF_F_RXCSUM))) in am65_cpsw_nuss_rx_csum()
1272 skb->ip_summed = CHECKSUM_UNNECESSARY; in am65_cpsw_nuss_rx_csum()
1279 struct am65_cpsw_rx_chn *rx_chn = &flow->common->rx_chns; in am65_cpsw_nuss_rx_packets()
1281 struct am65_cpsw_common *common = flow->common; in am65_cpsw_nuss_rx_packets()
1284 struct device *dev = common->dev; in am65_cpsw_nuss_rx_packets()
1290 u32 flow_idx = flow->id; in am65_cpsw_nuss_rx_packets()
1298 ret = k3_udma_glue_pop_rx_chn(rx_chn->rx_chn, flow_idx, &desc_dma); in am65_cpsw_nuss_rx_packets()
1300 if (ret != -ENODATA) in am65_cpsw_nuss_rx_packets()
1307 if (common->pdata.quirks & AM64_CPSW_QUIRK_DMA_RX_TDOWN_IRQ) in am65_cpsw_nuss_rx_packets()
1308 complete(&common->tdown_complete); in am65_cpsw_nuss_rx_packets()
1312 desc_rx = k3_cppi_desc_pool_dma2virt(rx_chn->desc_pool, desc_dma); in am65_cpsw_nuss_rx_packets()
1317 page = swdata->page; in am65_cpsw_nuss_rx_packets()
1320 k3_udma_glue_rx_cppi5_to_dma_addr(rx_chn->rx_chn, &buf_dma); in am65_cpsw_nuss_rx_packets()
1322 cppi5_desc_get_tags_ids(&desc_rx->hdr, &port_id, NULL); in am65_cpsw_nuss_rx_packets()
1325 ndev = port->ndev; in am65_cpsw_nuss_rx_packets()
1330 dma_unmap_single(rx_chn->dma_dev, buf_dma, buf_dma_len, DMA_FROM_DEVICE); in am65_cpsw_nuss_rx_packets()
1331 k3_cppi_desc_pool_free(rx_chn->desc_pool, desc_rx); in am65_cpsw_nuss_rx_packets()
1333 if (port->xdp_prog) { in am65_cpsw_nuss_rx_packets()
1334 xdp_init_buff(&xdp, PAGE_SIZE, &port->xdp_rxq[flow->id]); in am65_cpsw_nuss_rx_packets()
1342 headroom = xdp.data - xdp.data_hard_start; in am65_cpsw_nuss_rx_packets()
1355 am65_cpsw_nuss_set_offload_fwd_mark(skb, ndev_priv->offload_fwd_mark); in am65_cpsw_nuss_rx_packets()
1357 if (port->rx_ts_enabled) in am65_cpsw_nuss_rx_packets()
1358 am65_cpts_rx_timestamp(common->cpts, skb); in am65_cpsw_nuss_rx_packets()
1360 skb->protocol = eth_type_trans(skb, ndev); in am65_cpsw_nuss_rx_packets()
1362 napi_gro_receive(&flow->napi_rx, skb); in am65_cpsw_nuss_rx_packets()
1367 new_page = page_pool_dev_alloc_pages(flow->page_pool); in am65_cpsw_nuss_rx_packets()
1370 return -ENOMEM; in am65_cpsw_nuss_rx_packets()
1375 ndev->stats.rx_dropped++; in am65_cpsw_nuss_rx_packets()
1383 ndev->stats.rx_errors++; in am65_cpsw_nuss_rx_packets()
1384 ndev->stats.rx_dropped++; in am65_cpsw_nuss_rx_packets()
1396 enable_irq(flow->irq); in am65_cpsw_nuss_rx_timer_callback()
1403 struct am65_cpsw_common *common = flow->common; in am65_cpsw_nuss_rx_poll()
1412 while (cur_budget--) { in am65_cpsw_nuss_rx_poll()
1423 dev_dbg(common->dev, "%s num_rx:%d %d\n", __func__, num_rx, budget); in am65_cpsw_nuss_rx_poll()
1426 if (flow->irq_disabled) { in am65_cpsw_nuss_rx_poll()
1427 flow->irq_disabled = false; in am65_cpsw_nuss_rx_poll()
1428 if (unlikely(flow->rx_pace_timeout)) { in am65_cpsw_nuss_rx_poll()
1429 hrtimer_start(&flow->rx_hrtimer, in am65_cpsw_nuss_rx_poll()
1430 ns_to_ktime(flow->rx_pace_timeout), in am65_cpsw_nuss_rx_poll()
1433 enable_irq(flow->irq); in am65_cpsw_nuss_rx_poll()
1449 desc_tx = k3_cppi_desc_pool_dma2virt(tx_chn->desc_pool, in am65_cpsw_nuss_tx_compl_packet_skb()
1455 am65_cpts_tx_timestamp(tx_chn->common->cpts, skb); in am65_cpsw_nuss_tx_compl_packet_skb()
1457 dev_sw_netstats_tx_add(skb->dev, 1, skb->len); in am65_cpsw_nuss_tx_compl_packet_skb()
1474 desc_tx = k3_cppi_desc_pool_dma2virt(tx_chn->desc_pool, desc_dma); in am65_cpsw_nuss_tx_compl_packet_xdp()
1475 cppi5_desc_get_tags_ids(&desc_tx->hdr, NULL, &port_id); in am65_cpsw_nuss_tx_compl_packet_xdp()
1481 dev_sw_netstats_tx_add(port->ndev, 1, xdpf->len); in am65_cpsw_nuss_tx_compl_packet_xdp()
1482 *ndev = port->ndev; in am65_cpsw_nuss_tx_compl_packet_xdp()
1497 (k3_cppi_desc_pool_avail(tx_chn->desc_pool) >= MAX_SKB_FRAGS)) in am65_cpsw_nuss_tx_wake()
1508 struct device *dev = common->dev; in am65_cpsw_nuss_tx_compl_packets()
1518 tx_chn = &common->tx_chns[chn]; in am65_cpsw_nuss_tx_compl_packets()
1521 spin_lock(&tx_chn->lock); in am65_cpsw_nuss_tx_compl_packets()
1522 res = k3_udma_glue_pop_tx_chn(tx_chn->tx_chn, &desc_dma); in am65_cpsw_nuss_tx_compl_packets()
1523 spin_unlock(&tx_chn->lock); in am65_cpsw_nuss_tx_compl_packets()
1524 if (res == -ENODATA) in am65_cpsw_nuss_tx_compl_packets()
1528 if (atomic_dec_and_test(&common->tdown_cnt)) in am65_cpsw_nuss_tx_compl_packets()
1529 complete(&common->tdown_complete); in am65_cpsw_nuss_tx_compl_packets()
1537 ndev = skb->dev; in am65_cpsw_nuss_tx_compl_packets()
1538 total_bytes = skb->len; in am65_cpsw_nuss_tx_compl_packets()
1543 total_bytes = xdpf->len; in am65_cpsw_nuss_tx_compl_packets()
1567 struct device *dev = common->dev; in am65_cpsw_nuss_tx_compl_packets_2g()
1577 tx_chn = &common->tx_chns[chn]; in am65_cpsw_nuss_tx_compl_packets_2g()
1580 res = k3_udma_glue_pop_tx_chn(tx_chn->tx_chn, &desc_dma); in am65_cpsw_nuss_tx_compl_packets_2g()
1581 if (res == -ENODATA) in am65_cpsw_nuss_tx_compl_packets_2g()
1585 if (atomic_dec_and_test(&common->tdown_cnt)) in am65_cpsw_nuss_tx_compl_packets_2g()
1586 complete(&common->tdown_complete); in am65_cpsw_nuss_tx_compl_packets_2g()
1594 ndev = skb->dev; in am65_cpsw_nuss_tx_compl_packets_2g()
1595 total_bytes += skb->len; in am65_cpsw_nuss_tx_compl_packets_2g()
1600 total_bytes += xdpf->len; in am65_cpsw_nuss_tx_compl_packets_2g()
1628 enable_irq(tx_chns->irq); in am65_cpsw_nuss_tx_timer_callback()
1638 if (AM65_CPSW_IS_CPSW2G(tx_chn->common)) in am65_cpsw_nuss_tx_poll()
1639 num_tx = am65_cpsw_nuss_tx_compl_packets_2g(tx_chn->common, tx_chn->id, in am65_cpsw_nuss_tx_poll()
1642 num_tx = am65_cpsw_nuss_tx_compl_packets(tx_chn->common, in am65_cpsw_nuss_tx_poll()
1643 tx_chn->id, budget, &tdown); in am65_cpsw_nuss_tx_poll()
1649 if (unlikely(tx_chn->tx_pace_timeout && !tdown)) { in am65_cpsw_nuss_tx_poll()
1650 hrtimer_start(&tx_chn->tx_hrtimer, in am65_cpsw_nuss_tx_poll()
1651 ns_to_ktime(tx_chn->tx_pace_timeout), in am65_cpsw_nuss_tx_poll()
1654 enable_irq(tx_chn->irq); in am65_cpsw_nuss_tx_poll()
1665 flow->irq_disabled = true; in am65_cpsw_nuss_rx_irq()
1667 napi_schedule(&flow->napi_rx); in am65_cpsw_nuss_rx_irq()
1677 napi_schedule(&tx_chn->napi_tx); in am65_cpsw_nuss_tx_irq()
1688 struct device *dev = common->dev; in am65_cpsw_nuss_ndo_slave_xmit()
1701 if (port->tx_ts_enabled) in am65_cpsw_nuss_ndo_slave_xmit()
1702 am65_cpts_prep_tx_timestamp(common->cpts, skb); in am65_cpsw_nuss_ndo_slave_xmit()
1707 tx_chn = &common->tx_chns[q_idx]; in am65_cpsw_nuss_ndo_slave_xmit()
1711 buf_dma = dma_map_single(tx_chn->dma_dev, skb->data, pkt_len, in am65_cpsw_nuss_ndo_slave_xmit()
1713 if (unlikely(dma_mapping_error(tx_chn->dma_dev, buf_dma))) { in am65_cpsw_nuss_ndo_slave_xmit()
1715 ndev->stats.tx_errors++; in am65_cpsw_nuss_ndo_slave_xmit()
1719 first_desc = k3_cppi_desc_pool_alloc(tx_chn->desc_pool); in am65_cpsw_nuss_ndo_slave_xmit()
1722 dma_unmap_single(tx_chn->dma_dev, buf_dma, pkt_len, in am65_cpsw_nuss_ndo_slave_xmit()
1732 cppi5_desc_set_pktids(&first_desc->hdr, 0, AM65_CPSW_CPPI_TX_FLOW_ID); in am65_cpsw_nuss_ndo_slave_xmit()
1734 cppi5_desc_set_tags_ids(&first_desc->hdr, 0, port->port_id); in am65_cpsw_nuss_ndo_slave_xmit()
1736 k3_udma_glue_tx_dma_to_cppi5_addr(tx_chn->tx_chn, &buf_dma); in am65_cpsw_nuss_ndo_slave_xmit()
1744 if (likely(skb->ip_summed == CHECKSUM_PARTIAL)) { in am65_cpsw_nuss_ndo_slave_xmit()
1748 cs_offset = cs_start + skb->csum_offset; in am65_cpsw_nuss_ndo_slave_xmit()
1751 ((cs_start + 1) << 16) | (skb->len - cs_start); in am65_cpsw_nuss_ndo_slave_xmit()
1762 for (i = 0; i < skb_shinfo(skb)->nr_frags; i++) { in am65_cpsw_nuss_ndo_slave_xmit()
1763 skb_frag_t *frag = &skb_shinfo(skb)->frags[i]; in am65_cpsw_nuss_ndo_slave_xmit()
1766 next_desc = k3_cppi_desc_pool_alloc(tx_chn->desc_pool); in am65_cpsw_nuss_ndo_slave_xmit()
1775 buf_dma = skb_frag_dma_map(tx_chn->dma_dev, frag, 0, frag_size, in am65_cpsw_nuss_ndo_slave_xmit()
1777 if (unlikely(dma_mapping_error(tx_chn->dma_dev, buf_dma))) { in am65_cpsw_nuss_ndo_slave_xmit()
1779 k3_cppi_desc_pool_free(tx_chn->desc_pool, next_desc); in am65_cpsw_nuss_ndo_slave_xmit()
1780 ndev->stats.tx_errors++; in am65_cpsw_nuss_ndo_slave_xmit()
1785 k3_udma_glue_tx_dma_to_cppi5_addr(tx_chn->tx_chn, &buf_dma); in am65_cpsw_nuss_ndo_slave_xmit()
1789 desc_dma = k3_cppi_desc_pool_virt2dma(tx_chn->desc_pool, in am65_cpsw_nuss_ndo_slave_xmit()
1791 k3_udma_glue_tx_dma_to_cppi5_addr(tx_chn->tx_chn, &desc_dma); in am65_cpsw_nuss_ndo_slave_xmit()
1797 WARN_ON(pkt_len != skb->len); in am65_cpsw_nuss_ndo_slave_xmit()
1806 desc_dma = k3_cppi_desc_pool_virt2dma(tx_chn->desc_pool, first_desc); in am65_cpsw_nuss_ndo_slave_xmit()
1808 ret = k3_udma_glue_push_tx_chn(tx_chn->tx_chn, first_desc, desc_dma); in am65_cpsw_nuss_ndo_slave_xmit()
1810 spin_lock_bh(&tx_chn->lock); in am65_cpsw_nuss_ndo_slave_xmit()
1811 ret = k3_udma_glue_push_tx_chn(tx_chn->tx_chn, first_desc, desc_dma); in am65_cpsw_nuss_ndo_slave_xmit()
1812 spin_unlock_bh(&tx_chn->lock); in am65_cpsw_nuss_ndo_slave_xmit()
1818 ndev->stats.tx_errors++; in am65_cpsw_nuss_ndo_slave_xmit()
1822 if (k3_cppi_desc_pool_avail(tx_chn->desc_pool) < MAX_SKB_FRAGS) { in am65_cpsw_nuss_ndo_slave_xmit()
1828 /* re-check for smp */ in am65_cpsw_nuss_ndo_slave_xmit()
1829 if (k3_cppi_desc_pool_avail(tx_chn->desc_pool) >= in am65_cpsw_nuss_ndo_slave_xmit()
1841 ndev->stats.tx_dropped++; in am65_cpsw_nuss_ndo_slave_xmit()
1864 ret = pm_runtime_resume_and_get(common->dev); in am65_cpsw_nuss_ndo_slave_set_mac_address()
1868 cpsw_ale_del_ucast(common->ale, ndev->dev_addr, in am65_cpsw_nuss_ndo_slave_set_mac_address()
1870 cpsw_ale_add_ucast(common->ale, sockaddr->sa_data, in am65_cpsw_nuss_ndo_slave_set_mac_address()
1876 pm_runtime_put(common->dev); in am65_cpsw_nuss_ndo_slave_set_mac_address()
1889 return -EOPNOTSUPP; in am65_cpsw_nuss_hwtstamp_set()
1891 if (copy_from_user(&cfg, ifr->ifr_data, sizeof(cfg))) in am65_cpsw_nuss_hwtstamp_set()
1892 return -EFAULT; in am65_cpsw_nuss_hwtstamp_set()
1900 return -ERANGE; in am65_cpsw_nuss_hwtstamp_set()
1905 port->rx_ts_enabled = false; in am65_cpsw_nuss_hwtstamp_set()
1916 port->rx_ts_enabled = true; in am65_cpsw_nuss_hwtstamp_set()
1922 return -EOPNOTSUPP; in am65_cpsw_nuss_hwtstamp_set()
1924 return -ERANGE; in am65_cpsw_nuss_hwtstamp_set()
1927 port->tx_ts_enabled = (cfg.tx_type == HWTSTAMP_TX_ON); in am65_cpsw_nuss_hwtstamp_set()
1948 if (port->tx_ts_enabled) in am65_cpsw_nuss_hwtstamp_set()
1952 if (port->rx_ts_enabled) in am65_cpsw_nuss_hwtstamp_set()
1956 writel(seq_id, port->port_base + AM65_CPSW_PORTN_REG_TS_SEQ_LTYPE_REG); in am65_cpsw_nuss_hwtstamp_set()
1957 writel(ts_vlan_ltype, port->port_base + in am65_cpsw_nuss_hwtstamp_set()
1959 writel(ts_ctrl_ltype2, port->port_base + in am65_cpsw_nuss_hwtstamp_set()
1961 writel(ts_ctrl, port->port_base + AM65_CPSW_PORTN_REG_TS_CTL); in am65_cpsw_nuss_hwtstamp_set()
1963 return copy_to_user(ifr->ifr_data, &cfg, sizeof(cfg)) ? -EFAULT : 0; in am65_cpsw_nuss_hwtstamp_set()
1973 return -EOPNOTSUPP; in am65_cpsw_nuss_hwtstamp_get()
1976 cfg.tx_type = port->tx_ts_enabled ? in am65_cpsw_nuss_hwtstamp_get()
1978 cfg.rx_filter = port->rx_ts_enabled ? in am65_cpsw_nuss_hwtstamp_get()
1981 return copy_to_user(ifr->ifr_data, &cfg, sizeof(cfg)) ? -EFAULT : 0; in am65_cpsw_nuss_hwtstamp_get()
1990 return -EINVAL; in am65_cpsw_nuss_ndo_slave_ioctl()
1999 return phylink_mii_ioctl(port->slave.phylink, req, cmd); in am65_cpsw_nuss_ndo_slave_ioctl()
2005 dev_fetch_sw_netstats(stats, dev->tstats); in am65_cpsw_nuss_ndo_get_stats()
2007 stats->rx_errors = dev->stats.rx_errors; in am65_cpsw_nuss_ndo_get_stats()
2008 stats->rx_dropped = dev->stats.rx_dropped; in am65_cpsw_nuss_ndo_get_stats()
2009 stats->tx_dropped = dev->stats.tx_dropped; in am65_cpsw_nuss_ndo_get_stats()
2022 old_prog = xchg(&port->xdp_prog, prog); in am65_cpsw_xdp_prog_setup()
2034 switch (bpf->command) { in am65_cpsw_ndo_bpf()
2036 return am65_cpsw_xdp_prog_setup(ndev, bpf->prog); in am65_cpsw_ndo_bpf()
2038 return -EINVAL; in am65_cpsw_ndo_bpf()
2051 tx_chn = &common->tx_chns[cpu % common->tx_ch_num]; in am65_cpsw_ndo_xdp_xmit()
2052 netif_txq = netdev_get_tx_queue(ndev, tx_chn->id); in am65_cpsw_ndo_xdp_xmit()
2113 for (i = 0; i < common->port_num; i++) { in am65_cpsw_disable_serdes_phy()
2114 port = &common->ports[i]; in am65_cpsw_disable_serdes_phy()
2115 phy = port->slave.serdes_phy; in am65_cpsw_disable_serdes_phy()
2133 port->slave.serdes_phy = phy; in am65_cpsw_init_serdes_phy()
2152 struct am65_cpsw_common *common = port->common; in am65_cpsw_nuss_mac_config()
2154 if (common->pdata.extra_modes & BIT(state->interface)) { in am65_cpsw_nuss_mac_config()
2155 if (state->interface == PHY_INTERFACE_MODE_SGMII) { in am65_cpsw_nuss_mac_config()
2157 port->sgmii_base + AM65_CPSW_SGMII_MR_ADV_ABILITY_REG); in am65_cpsw_nuss_mac_config()
2158 cpsw_sl_ctl_set(port->slave.mac_sl, CPSW_SL_CTL_EXT_EN); in am65_cpsw_nuss_mac_config()
2160 cpsw_sl_ctl_clr(port->slave.mac_sl, CPSW_SL_CTL_EXT_EN); in am65_cpsw_nuss_mac_config()
2163 if (state->interface == PHY_INTERFACE_MODE_USXGMII) { in am65_cpsw_nuss_mac_config()
2164 cpsw_sl_ctl_set(port->slave.mac_sl, in am65_cpsw_nuss_mac_config()
2167 cpsw_sl_ctl_clr(port->slave.mac_sl, in am65_cpsw_nuss_mac_config()
2172 port->sgmii_base + AM65_CPSW_SGMII_CONTROL_REG); in am65_cpsw_nuss_mac_config()
2182 struct am65_cpsw_common *common = port->common; in am65_cpsw_nuss_mac_link_down()
2183 struct net_device *ndev = port->ndev; in am65_cpsw_nuss_mac_link_down()
2188 cpsw_ale_control_set(common->ale, port->port_id, ALE_PORT_STATE, ALE_PORT_STATE_DISABLE); in am65_cpsw_nuss_mac_link_down()
2190 cpsw_sl_ctl_set(port->slave.mac_sl, CPSW_SL_CTL_CMD_IDLE); in am65_cpsw_nuss_mac_link_down()
2192 tmo = cpsw_sl_wait_for_idle(port->slave.mac_sl, 100); in am65_cpsw_nuss_mac_link_down()
2193 dev_dbg(common->dev, "down msc_sl %08x tmo %d\n", in am65_cpsw_nuss_mac_link_down()
2194 cpsw_sl_reg_read(port->slave.mac_sl, CPSW_SL_MACSTATUS), tmo); in am65_cpsw_nuss_mac_link_down()
2203 cpsw_sl_ctl_clr(port->slave.mac_sl, mac_control); in am65_cpsw_nuss_mac_link_down()
2216 struct am65_cpsw_common *common = port->common; in am65_cpsw_nuss_mac_link_up()
2218 struct net_device *ndev = port->ndev; in am65_cpsw_nuss_mac_link_up()
2221 cpsw_sl_ctl_clr(port->slave.mac_sl, CPSW_SL_CTL_CMD_IDLE); in am65_cpsw_nuss_mac_link_up()
2225 /* TODO: Verify whether in-band is necessary for 10 Mbps RGMII */ in am65_cpsw_nuss_mac_link_up()
2241 cpsw_sl_ctl_set(port->slave.mac_sl, mac_control); in am65_cpsw_nuss_mac_link_up()
2244 cpsw_ale_control_set(common->ale, port->port_id, ALE_PORT_STATE, ALE_PORT_STATE_FORWARD); in am65_cpsw_nuss_mac_link_up()
2258 struct am65_cpsw_common *common = port->common; in am65_cpsw_nuss_slave_disable_unused()
2260 if (!port->disabled) in am65_cpsw_nuss_slave_disable_unused()
2263 cpsw_ale_control_set(common->ale, port->port_id, in am65_cpsw_nuss_slave_disable_unused()
2266 cpsw_sl_reset(port->slave.mac_sl, 100); in am65_cpsw_nuss_slave_disable_unused()
2267 cpsw_sl_ctl_reset(port->slave.mac_sl); in am65_cpsw_nuss_slave_disable_unused()
2275 for (i = 0; i < common->tx_ch_num; i++) { in am65_cpsw_nuss_free_tx_chns()
2276 struct am65_cpsw_tx_chn *tx_chn = &common->tx_chns[i]; in am65_cpsw_nuss_free_tx_chns()
2278 if (!IS_ERR_OR_NULL(tx_chn->desc_pool)) in am65_cpsw_nuss_free_tx_chns()
2279 k3_cppi_desc_pool_destroy(tx_chn->desc_pool); in am65_cpsw_nuss_free_tx_chns()
2281 if (!IS_ERR_OR_NULL(tx_chn->tx_chn)) in am65_cpsw_nuss_free_tx_chns()
2282 k3_udma_glue_release_tx_chn(tx_chn->tx_chn); in am65_cpsw_nuss_free_tx_chns()
2290 struct device *dev = common->dev; in am65_cpsw_nuss_remove_tx_chns()
2293 common->tx_ch_rate_msk = 0; in am65_cpsw_nuss_remove_tx_chns()
2294 for (i = 0; i < common->tx_ch_num; i++) { in am65_cpsw_nuss_remove_tx_chns()
2295 struct am65_cpsw_tx_chn *tx_chn = &common->tx_chns[i]; in am65_cpsw_nuss_remove_tx_chns()
2297 if (tx_chn->irq > 0) in am65_cpsw_nuss_remove_tx_chns()
2298 devm_free_irq(dev, tx_chn->irq, tx_chn); in am65_cpsw_nuss_remove_tx_chns()
2300 netif_napi_del(&tx_chn->napi_tx); in am65_cpsw_nuss_remove_tx_chns()
2308 struct device *dev = common->dev; in am65_cpsw_nuss_ndev_add_tx_napi()
2312 for (i = 0; i < common->tx_ch_num; i++) { in am65_cpsw_nuss_ndev_add_tx_napi()
2313 tx_chn = &common->tx_chns[i]; in am65_cpsw_nuss_ndev_add_tx_napi()
2315 hrtimer_init(&tx_chn->tx_hrtimer, CLOCK_MONOTONIC, HRTIMER_MODE_REL_PINNED); in am65_cpsw_nuss_ndev_add_tx_napi()
2316 tx_chn->tx_hrtimer.function = &am65_cpsw_nuss_tx_timer_callback; in am65_cpsw_nuss_ndev_add_tx_napi()
2318 netif_napi_add_tx(common->dma_ndev, &tx_chn->napi_tx, in am65_cpsw_nuss_ndev_add_tx_napi()
2321 ret = devm_request_irq(dev, tx_chn->irq, in am65_cpsw_nuss_ndev_add_tx_napi()
2324 tx_chn->tx_chn_name, tx_chn); in am65_cpsw_nuss_ndev_add_tx_napi()
2327 tx_chn->id, tx_chn->irq, ret); in am65_cpsw_nuss_ndev_add_tx_napi()
2335 netif_napi_del(&tx_chn->napi_tx); in am65_cpsw_nuss_ndev_add_tx_napi()
2336 for (--i; i >= 0; i--) { in am65_cpsw_nuss_ndev_add_tx_napi()
2337 tx_chn = &common->tx_chns[i]; in am65_cpsw_nuss_ndev_add_tx_napi()
2338 devm_free_irq(dev, tx_chn->irq, tx_chn); in am65_cpsw_nuss_ndev_add_tx_napi()
2339 netif_napi_del(&tx_chn->napi_tx); in am65_cpsw_nuss_ndev_add_tx_napi()
2349 struct device *dev = common->dev; in am65_cpsw_nuss_init_tx_chns()
2367 for (i = 0; i < common->tx_ch_num; i++) { in am65_cpsw_nuss_init_tx_chns()
2368 struct am65_cpsw_tx_chn *tx_chn = &common->tx_chns[i]; in am65_cpsw_nuss_init_tx_chns()
2370 snprintf(tx_chn->tx_chn_name, in am65_cpsw_nuss_init_tx_chns()
2371 sizeof(tx_chn->tx_chn_name), "tx%d", i); in am65_cpsw_nuss_init_tx_chns()
2373 spin_lock_init(&tx_chn->lock); in am65_cpsw_nuss_init_tx_chns()
2374 tx_chn->common = common; in am65_cpsw_nuss_init_tx_chns()
2375 tx_chn->id = i; in am65_cpsw_nuss_init_tx_chns()
2376 tx_chn->descs_num = max_desc_num; in am65_cpsw_nuss_init_tx_chns()
2378 tx_chn->tx_chn = in am65_cpsw_nuss_init_tx_chns()
2380 tx_chn->tx_chn_name, in am65_cpsw_nuss_init_tx_chns()
2382 if (IS_ERR(tx_chn->tx_chn)) { in am65_cpsw_nuss_init_tx_chns()
2383 ret = dev_err_probe(dev, PTR_ERR(tx_chn->tx_chn), in am65_cpsw_nuss_init_tx_chns()
2387 tx_chn->dma_dev = k3_udma_glue_tx_get_dma_device(tx_chn->tx_chn); in am65_cpsw_nuss_init_tx_chns()
2389 tx_chn->desc_pool = k3_cppi_desc_pool_create_name(tx_chn->dma_dev, in am65_cpsw_nuss_init_tx_chns()
2390 tx_chn->descs_num, in am65_cpsw_nuss_init_tx_chns()
2392 tx_chn->tx_chn_name); in am65_cpsw_nuss_init_tx_chns()
2393 if (IS_ERR(tx_chn->desc_pool)) { in am65_cpsw_nuss_init_tx_chns()
2394 ret = PTR_ERR(tx_chn->desc_pool); in am65_cpsw_nuss_init_tx_chns()
2399 hdesc_size_out = k3_cppi_desc_pool_desc_size(tx_chn->desc_pool); in am65_cpsw_nuss_init_tx_chns()
2400 tx_chn->dsize_log2 = __fls(hdesc_size_out); in am65_cpsw_nuss_init_tx_chns()
2401 WARN_ON(hdesc_size_out != (1 << tx_chn->dsize_log2)); in am65_cpsw_nuss_init_tx_chns()
2403 tx_chn->irq = k3_udma_glue_tx_get_irq(tx_chn->tx_chn); in am65_cpsw_nuss_init_tx_chns()
2404 if (tx_chn->irq < 0) { in am65_cpsw_nuss_init_tx_chns()
2406 tx_chn->irq); in am65_cpsw_nuss_init_tx_chns()
2407 ret = tx_chn->irq; in am65_cpsw_nuss_init_tx_chns()
2411 snprintf(tx_chn->tx_chn_name, in am65_cpsw_nuss_init_tx_chns()
2412 sizeof(tx_chn->tx_chn_name), "%s-tx%d", in am65_cpsw_nuss_init_tx_chns()
2413 dev_name(dev), tx_chn->id); in am65_cpsw_nuss_init_tx_chns()
2435 rx_chn = &common->rx_chns; in am65_cpsw_nuss_free_rx_chns()
2437 if (!IS_ERR_OR_NULL(rx_chn->desc_pool)) in am65_cpsw_nuss_free_rx_chns()
2438 k3_cppi_desc_pool_destroy(rx_chn->desc_pool); in am65_cpsw_nuss_free_rx_chns()
2440 if (!IS_ERR_OR_NULL(rx_chn->rx_chn)) in am65_cpsw_nuss_free_rx_chns()
2441 k3_udma_glue_release_rx_chn(rx_chn->rx_chn); in am65_cpsw_nuss_free_rx_chns()
2446 struct device *dev = common->dev; in am65_cpsw_nuss_remove_rx_chns()
2451 rx_chn = &common->rx_chns; in am65_cpsw_nuss_remove_rx_chns()
2452 flows = rx_chn->flows; in am65_cpsw_nuss_remove_rx_chns()
2454 for (i = 0; i < common->rx_ch_num_flows; i++) { in am65_cpsw_nuss_remove_rx_chns()
2462 common->rx_flow_id_base = -1; in am65_cpsw_nuss_remove_rx_chns()
2467 struct am65_cpsw_rx_chn *rx_chn = &common->rx_chns; in am65_cpsw_nuss_init_rx_chns()
2470 struct device *dev = common->dev; in am65_cpsw_nuss_init_rx_chns()
2480 rx_cfg.flow_id_num = common->rx_ch_num_flows; in am65_cpsw_nuss_init_rx_chns()
2481 rx_cfg.flow_id_base = common->rx_flow_id_base; in am65_cpsw_nuss_init_rx_chns()
2484 rx_chn->dev = dev; in am65_cpsw_nuss_init_rx_chns()
2485 rx_chn->descs_num = max_desc_num * rx_cfg.flow_id_num; in am65_cpsw_nuss_init_rx_chns()
2487 for (i = 0; i < common->rx_ch_num_flows; i++) { in am65_cpsw_nuss_init_rx_chns()
2488 flow = &rx_chn->flows[i]; in am65_cpsw_nuss_init_rx_chns()
2489 flow->page_pool = NULL; in am65_cpsw_nuss_init_rx_chns()
2492 rx_chn->rx_chn = k3_udma_glue_request_rx_chn(dev, "rx", &rx_cfg); in am65_cpsw_nuss_init_rx_chns()
2493 if (IS_ERR(rx_chn->rx_chn)) { in am65_cpsw_nuss_init_rx_chns()
2494 ret = dev_err_probe(dev, PTR_ERR(rx_chn->rx_chn), in am65_cpsw_nuss_init_rx_chns()
2498 rx_chn->dma_dev = k3_udma_glue_rx_get_dma_device(rx_chn->rx_chn); in am65_cpsw_nuss_init_rx_chns()
2500 rx_chn->desc_pool = k3_cppi_desc_pool_create_name(rx_chn->dma_dev, in am65_cpsw_nuss_init_rx_chns()
2501 rx_chn->descs_num, in am65_cpsw_nuss_init_rx_chns()
2503 if (IS_ERR(rx_chn->desc_pool)) { in am65_cpsw_nuss_init_rx_chns()
2504 ret = PTR_ERR(rx_chn->desc_pool); in am65_cpsw_nuss_init_rx_chns()
2509 hdesc_size_out = k3_cppi_desc_pool_desc_size(rx_chn->desc_pool); in am65_cpsw_nuss_init_rx_chns()
2510 rx_chn->dsize_log2 = __fls(hdesc_size_out); in am65_cpsw_nuss_init_rx_chns()
2511 WARN_ON(hdesc_size_out != (1 << rx_chn->dsize_log2)); in am65_cpsw_nuss_init_rx_chns()
2513 common->rx_flow_id_base = in am65_cpsw_nuss_init_rx_chns()
2514 k3_udma_glue_rx_get_flow_id_base(rx_chn->rx_chn); in am65_cpsw_nuss_init_rx_chns()
2515 dev_info(dev, "set new flow-id-base %u\n", common->rx_flow_id_base); in am65_cpsw_nuss_init_rx_chns()
2536 flow = &rx_chn->flows[i]; in am65_cpsw_nuss_init_rx_chns()
2537 flow->id = i; in am65_cpsw_nuss_init_rx_chns()
2538 flow->common = common; in am65_cpsw_nuss_init_rx_chns()
2539 flow->irq = -EINVAL; in am65_cpsw_nuss_init_rx_chns()
2545 rx_flow_cfg.rxfdq_cfg.mode = common->pdata.fdqring_mode; in am65_cpsw_nuss_init_rx_chns()
2547 ret = k3_udma_glue_rx_flow_init(rx_chn->rx_chn, in am65_cpsw_nuss_init_rx_chns()
2555 k3_udma_glue_rx_flow_get_fdq_id(rx_chn->rx_chn, in am65_cpsw_nuss_init_rx_chns()
2558 flow->irq = k3_udma_glue_rx_get_irq(rx_chn->rx_chn, i); in am65_cpsw_nuss_init_rx_chns()
2559 if (flow->irq <= 0) { in am65_cpsw_nuss_init_rx_chns()
2561 flow->irq); in am65_cpsw_nuss_init_rx_chns()
2562 ret = flow->irq; in am65_cpsw_nuss_init_rx_chns()
2566 snprintf(flow->name, in am65_cpsw_nuss_init_rx_chns()
2567 sizeof(flow->name), "%s-rx%d", in am65_cpsw_nuss_init_rx_chns()
2569 hrtimer_init(&flow->rx_hrtimer, CLOCK_MONOTONIC, in am65_cpsw_nuss_init_rx_chns()
2571 flow->rx_hrtimer.function = &am65_cpsw_nuss_rx_timer_callback; in am65_cpsw_nuss_init_rx_chns()
2573 netif_napi_add(common->dma_ndev, &flow->napi_rx, in am65_cpsw_nuss_init_rx_chns()
2576 ret = devm_request_irq(dev, flow->irq, in am65_cpsw_nuss_init_rx_chns()
2579 flow->name, flow); in am65_cpsw_nuss_init_rx_chns()
2582 i, flow->irq, ret); in am65_cpsw_nuss_init_rx_chns()
2583 flow->irq = -EINVAL; in am65_cpsw_nuss_init_rx_chns()
2588 /* setup classifier to route priorities to flows */ in am65_cpsw_nuss_init_rx_chns()
2589 cpsw_ale_classifier_setup_default(common->ale, common->rx_ch_num_flows); in am65_cpsw_nuss_init_rx_chns()
2594 netif_napi_del(&flow->napi_rx); in am65_cpsw_nuss_init_rx_chns()
2597 for (--i; i >= 0; i--) { in am65_cpsw_nuss_init_rx_chns()
2598 flow = &rx_chn->flows[i]; in am65_cpsw_nuss_init_rx_chns()
2599 devm_free_irq(dev, flow->irq, flow); in am65_cpsw_nuss_init_rx_chns()
2600 netif_napi_del(&flow->napi_rx); in am65_cpsw_nuss_init_rx_chns()
2613 host_p->common = common; in am65_cpsw_nuss_init_host_p()
2614 host_p->port_base = common->cpsw_base + AM65_CPSW_NU_PORTS_BASE; in am65_cpsw_nuss_init_host_p()
2615 host_p->stat_base = common->cpsw_base + AM65_CPSW_NU_STATS_BASE; in am65_cpsw_nuss_init_host_p()
2626 syscon = syscon_regmap_lookup_by_phandle_args(of_node, "ti,syscon-efuse", in am65_cpsw_am654_get_efuse_macid()
2629 if (PTR_ERR(syscon) == -ENODEV) in am65_cpsw_am654_get_efuse_macid()
2649 struct device *dev = common->dev; in am65_cpsw_init_cpts()
2657 node = of_get_child_by_name(dev->of_node, "cpts"); in am65_cpsw_init_cpts()
2660 return -ENOENT; in am65_cpsw_init_cpts()
2663 reg_base = common->cpsw_base + AM65_CPSW_NU_CPTS_BASE; in am65_cpsw_init_cpts()
2672 common->cpts = cpts; in am65_cpsw_init_cpts()
2674 * K3 CPSWxG modules may completely lose context during ON->OFF in am65_cpsw_init_cpts()
2687 struct device *dev = common->dev; in am65_cpsw_nuss_init_slave_ports()
2690 node = of_get_child_by_name(dev->of_node, "ethernet-ports"); in am65_cpsw_nuss_init_slave_ports()
2692 return -ENOENT; in am65_cpsw_nuss_init_slave_ports()
2699 if (strcmp(port_np->name, "port")) in am65_cpsw_nuss_init_slave_ports()
2709 if (!port_id || port_id > common->port_num) { in am65_cpsw_nuss_init_slave_ports()
2711 port_np, port_id, port_np->name); in am65_cpsw_nuss_init_slave_ports()
2712 ret = -EINVAL; in am65_cpsw_nuss_init_slave_ports()
2717 port->port_id = port_id; in am65_cpsw_nuss_init_slave_ports()
2718 port->common = common; in am65_cpsw_nuss_init_slave_ports()
2719 port->port_base = common->cpsw_base + AM65_CPSW_NU_PORTS_BASE + in am65_cpsw_nuss_init_slave_ports()
2721 if (common->pdata.extra_modes) in am65_cpsw_nuss_init_slave_ports()
2722 port->sgmii_base = common->ss_base + AM65_CPSW_SGMII_BASE * (port_id); in am65_cpsw_nuss_init_slave_ports()
2723 port->stat_base = common->cpsw_base + AM65_CPSW_NU_STATS_BASE + in am65_cpsw_nuss_init_slave_ports()
2725 port->name = of_get_property(port_np, "label", NULL); in am65_cpsw_nuss_init_slave_ports()
2726 port->fetch_ram_base = in am65_cpsw_nuss_init_slave_ports()
2727 common->cpsw_base + AM65_CPSW_NU_FRAM_BASE + in am65_cpsw_nuss_init_slave_ports()
2728 (AM65_CPSW_NU_FRAM_PORT_OFFSET * (port_id - 1)); in am65_cpsw_nuss_init_slave_ports()
2730 port->slave.mac_sl = cpsw_sl_get("am65", dev, port->port_base); in am65_cpsw_nuss_init_slave_ports()
2731 if (IS_ERR(port->slave.mac_sl)) { in am65_cpsw_nuss_init_slave_ports()
2732 ret = PTR_ERR(port->slave.mac_sl); in am65_cpsw_nuss_init_slave_ports()
2736 port->disabled = !of_device_is_available(port_np); in am65_cpsw_nuss_init_slave_ports()
2737 if (port->disabled) { in am65_cpsw_nuss_init_slave_ports()
2738 common->disabled_ports_mask |= BIT(port->port_id); in am65_cpsw_nuss_init_slave_ports()
2742 port->slave.ifphy = devm_of_phy_get(dev, port_np, NULL); in am65_cpsw_nuss_init_slave_ports()
2743 if (IS_ERR(port->slave.ifphy)) { in am65_cpsw_nuss_init_slave_ports()
2744 ret = PTR_ERR(port->slave.ifphy); in am65_cpsw_nuss_init_slave_ports()
2755 port->slave.mac_only = in am65_cpsw_nuss_init_slave_ports()
2756 of_property_read_bool(port_np, "ti,mac-only"); in am65_cpsw_nuss_init_slave_ports()
2759 port->slave.port_np = of_node_get(port_np); in am65_cpsw_nuss_init_slave_ports()
2760 ret = of_get_phy_mode(port_np, &port->slave.phy_if); in am65_cpsw_nuss_init_slave_ports()
2762 dev_err(dev, "%pOF read phy-mode err %d\n", in am65_cpsw_nuss_init_slave_ports()
2767 ret = phy_set_mode_ext(port->slave.ifphy, PHY_MODE_ETHERNET, port->slave.phy_if); in am65_cpsw_nuss_init_slave_ports()
2771 ret = of_get_mac_address(port_np, port->slave.mac_addr); in am65_cpsw_nuss_init_slave_ports()
2774 port->port_id, in am65_cpsw_nuss_init_slave_ports()
2775 port->slave.mac_addr); in am65_cpsw_nuss_init_slave_ports()
2776 if (!is_valid_ether_addr(port->slave.mac_addr)) { in am65_cpsw_nuss_init_slave_ports()
2777 eth_random_addr(port->slave.mac_addr); in am65_cpsw_nuss_init_slave_ports()
2783 writel(0, port->port_base + AM65_CPSW_PN_REG_TX_PRI_MAP); in am65_cpsw_nuss_init_slave_ports()
2788 if (!(~common->disabled_ports_mask & GENMASK(common->port_num, 1))) { in am65_cpsw_nuss_init_slave_ports()
2790 return -ENODEV; in am65_cpsw_nuss_init_slave_ports()
2806 for (i = 0; i < common->port_num; i++) { in am65_cpsw_nuss_phylink_cleanup()
2807 port = &common->ports[i]; in am65_cpsw_nuss_phylink_cleanup()
2808 if (port->slave.phylink) in am65_cpsw_nuss_phylink_cleanup()
2809 phylink_destroy(port->slave.phylink); in am65_cpsw_nuss_phylink_cleanup()
2818 for (i = 0; i < common->port_num; i++) { in am65_cpsw_remove_dt()
2819 port = &common->ports[i]; in am65_cpsw_remove_dt()
2820 of_node_put(port->slave.port_np); in am65_cpsw_remove_dt()
2828 struct device *dev = common->dev; in am65_cpsw_nuss_init_port_ndev()
2832 port = &common->ports[port_idx]; in am65_cpsw_nuss_init_port_ndev()
2834 if (port->disabled) in am65_cpsw_nuss_init_port_ndev()
2838 port->ndev = alloc_etherdev_mqs(sizeof(struct am65_cpsw_ndev_priv), in am65_cpsw_nuss_init_port_ndev()
2841 if (!port->ndev) { in am65_cpsw_nuss_init_port_ndev()
2843 port->port_id); in am65_cpsw_nuss_init_port_ndev()
2844 return -ENOMEM; in am65_cpsw_nuss_init_port_ndev()
2847 ndev_priv = netdev_priv(port->ndev); in am65_cpsw_nuss_init_port_ndev()
2848 ndev_priv->port = port; in am65_cpsw_nuss_init_port_ndev()
2849 ndev_priv->msg_enable = AM65_CPSW_DEBUG; in am65_cpsw_nuss_init_port_ndev()
2850 mutex_init(&ndev_priv->mm_lock); in am65_cpsw_nuss_init_port_ndev()
2851 port->qos.link_speed = SPEED_UNKNOWN; in am65_cpsw_nuss_init_port_ndev()
2852 SET_NETDEV_DEV(port->ndev, dev); in am65_cpsw_nuss_init_port_ndev()
2853 port->ndev->dev.of_node = port->slave.port_np; in am65_cpsw_nuss_init_port_ndev()
2855 eth_hw_addr_set(port->ndev, port->slave.mac_addr); in am65_cpsw_nuss_init_port_ndev()
2857 port->ndev->min_mtu = AM65_CPSW_MIN_PACKET_SIZE; in am65_cpsw_nuss_init_port_ndev()
2858 port->ndev->max_mtu = AM65_CPSW_MAX_PACKET_SIZE - in am65_cpsw_nuss_init_port_ndev()
2860 port->ndev->hw_features = NETIF_F_SG | in am65_cpsw_nuss_init_port_ndev()
2864 port->ndev->features = port->ndev->hw_features | in am65_cpsw_nuss_init_port_ndev()
2866 port->ndev->xdp_features = NETDEV_XDP_ACT_BASIC | in am65_cpsw_nuss_init_port_ndev()
2869 port->ndev->vlan_features |= NETIF_F_SG; in am65_cpsw_nuss_init_port_ndev()
2870 port->ndev->netdev_ops = &am65_cpsw_nuss_netdev_ops; in am65_cpsw_nuss_init_port_ndev()
2871 port->ndev->ethtool_ops = &am65_cpsw_ethtool_ops_slave; in am65_cpsw_nuss_init_port_ndev()
2874 port->slave.phylink_config.dev = &port->ndev->dev; in am65_cpsw_nuss_init_port_ndev()
2875 port->slave.phylink_config.type = PHYLINK_NETDEV; in am65_cpsw_nuss_init_port_ndev()
2876 port->slave.phylink_config.mac_capabilities = MAC_SYM_PAUSE | MAC_10 | MAC_100 | in am65_cpsw_nuss_init_port_ndev()
2878 port->slave.phylink_config.mac_managed_pm = true; /* MAC does PM */ in am65_cpsw_nuss_init_port_ndev()
2880 switch (port->slave.phy_if) { in am65_cpsw_nuss_init_port_ndev()
2885 phy_interface_set_rgmii(port->slave.phylink_config.supported_interfaces); in am65_cpsw_nuss_init_port_ndev()
2890 port->slave.phylink_config.supported_interfaces); in am65_cpsw_nuss_init_port_ndev()
2896 if (common->pdata.extra_modes & BIT(port->slave.phy_if)) { in am65_cpsw_nuss_init_port_ndev()
2897 __set_bit(port->slave.phy_if, in am65_cpsw_nuss_init_port_ndev()
2898 port->slave.phylink_config.supported_interfaces); in am65_cpsw_nuss_init_port_ndev()
2900 dev_err(dev, "selected phy-mode is not supported\n"); in am65_cpsw_nuss_init_port_ndev()
2901 return -EOPNOTSUPP; in am65_cpsw_nuss_init_port_ndev()
2906 dev_err(dev, "selected phy-mode is not supported\n"); in am65_cpsw_nuss_init_port_ndev()
2907 return -EOPNOTSUPP; in am65_cpsw_nuss_init_port_ndev()
2910 phylink = phylink_create(&port->slave.phylink_config, in am65_cpsw_nuss_init_port_ndev()
2911 of_fwnode_handle(port->slave.port_np), in am65_cpsw_nuss_init_port_ndev()
2912 port->slave.phy_if, in am65_cpsw_nuss_init_port_ndev()
2917 port->slave.phylink = phylink; in am65_cpsw_nuss_init_port_ndev()
2920 if (common->pdata.quirks & AM65_CPSW_QUIRK_I2027_NO_TX_CSUM) in am65_cpsw_nuss_init_port_ndev()
2921 port->ndev->features &= ~NETIF_F_HW_CSUM; in am65_cpsw_nuss_init_port_ndev()
2923 port->ndev->pcpu_stat_type = NETDEV_PCPU_STAT_TSTATS; in am65_cpsw_nuss_init_port_ndev()
2924 port->xdp_prog = NULL; in am65_cpsw_nuss_init_port_ndev()
2926 if (!common->dma_ndev) in am65_cpsw_nuss_init_port_ndev()
2927 common->dma_ndev = port->ndev; in am65_cpsw_nuss_init_port_ndev()
2937 for (i = 0; i < common->port_num; i++) { in am65_cpsw_nuss_init_ndevs()
2951 for (i = 0; i < common->port_num; i++) { in am65_cpsw_nuss_cleanup_ndev()
2952 port = &common->ports[i]; in am65_cpsw_nuss_cleanup_ndev()
2953 if (!port->ndev) in am65_cpsw_nuss_cleanup_ndev()
2955 if (port->ndev->reg_state == NETREG_REGISTERED) in am65_cpsw_nuss_cleanup_ndev()
2956 unregister_netdev(port->ndev); in am65_cpsw_nuss_cleanup_ndev()
2957 free_netdev(port->ndev); in am65_cpsw_nuss_cleanup_ndev()
2958 port->ndev = NULL; in am65_cpsw_nuss_cleanup_ndev()
2967 if (common->br_members == (GENMASK(common->port_num, 1) & ~common->disabled_ports_mask)) in am65_cpsw_port_offload_fwd_mark_update()
2970 dev_dbg(common->dev, "set offload_fwd_mark %d\n", set_val); in am65_cpsw_port_offload_fwd_mark_update()
2972 for (i = 1; i <= common->port_num; i++) { in am65_cpsw_port_offload_fwd_mark_update()
2976 if (!port->ndev) in am65_cpsw_port_offload_fwd_mark_update()
2979 priv = am65_ndev_to_priv(port->ndev); in am65_cpsw_port_offload_fwd_mark_update()
2980 priv->offload_fwd_mark = set_val; in am65_cpsw_port_offload_fwd_mark_update()
2986 if (ndev->netdev_ops == &am65_cpsw_nuss_netdev_ops) { in am65_cpsw_port_dev_check()
2989 return !common->is_emac_mode; in am65_cpsw_port_dev_check()
3003 if (!common->br_members) { in am65_cpsw_netdevice_port_link()
3004 common->hw_bridge_dev = br_ndev; in am65_cpsw_netdevice_port_link()
3009 if (common->hw_bridge_dev != br_ndev) in am65_cpsw_netdevice_port_link()
3010 return -EOPNOTSUPP; in am65_cpsw_netdevice_port_link()
3018 common->br_members |= BIT(priv->port->port_id); in am65_cpsw_netdevice_port_link()
3032 common->br_members &= ~BIT(priv->port->port_id); in am65_cpsw_netdevice_port_unlink()
3036 if (!common->br_members) in am65_cpsw_netdevice_port_unlink()
3037 common->hw_bridge_dev = NULL; in am65_cpsw_netdevice_port_unlink()
3056 if (netif_is_bridge_master(info->upper_dev)) { in am65_cpsw_netdevice_event()
3057 if (info->linking) in am65_cpsw_netdevice_event()
3059 info->upper_dev, in am65_cpsw_netdevice_event()
3080 cpsw->am65_cpsw_netdevice_nb.notifier_call = &am65_cpsw_netdevice_event; in am65_cpsw_register_notifiers()
3081 ret = register_netdevice_notifier(&cpsw->am65_cpsw_netdevice_nb); in am65_cpsw_register_notifiers()
3083 dev_err(cpsw->dev, "can't register netdevice notifier\n"); in am65_cpsw_register_notifiers()
3089 unregister_netdevice_notifier(&cpsw->am65_cpsw_netdevice_nb); in am65_cpsw_register_notifiers()
3101 unregister_netdevice_notifier(&cpsw->am65_cpsw_netdevice_nb); in am65_cpsw_unregister_notifiers()
3108 cpsw_ale_add_mcast(cpsw->ale, eth_stp_addr, ALE_PORT_HOST, ALE_SUPER, 0, in am65_cpsw_init_stp_ale_entry()
3116 writel(common->default_vlan, host->port_base + AM65_CPSW_PORT_VLAN_REG_OFFSET); in am65_cpsw_init_host_port_switch()
3120 cpsw_ale_control_set(common->ale, HOST_PORT_NUM, ALE_P0_UNI_FLOOD, 1); in am65_cpsw_init_host_port_switch()
3121 dev_dbg(common->dev, "Set P0_UNI_FLOOD\n"); in am65_cpsw_init_host_port_switch()
3122 cpsw_ale_control_set(common->ale, HOST_PORT_NUM, ALE_PORT_NOLEARN, 0); in am65_cpsw_init_host_port_switch()
3129 writel(0, host->port_base + AM65_CPSW_PORT_VLAN_REG_OFFSET); in am65_cpsw_init_host_port_emac()
3131 cpsw_ale_control_set(common->ale, HOST_PORT_NUM, ALE_P0_UNI_FLOOD, 0); in am65_cpsw_init_host_port_emac()
3132 dev_dbg(common->dev, "unset P0_UNI_FLOOD\n"); in am65_cpsw_init_host_port_emac()
3134 /* learning make no sense in multi-mac mode */ in am65_cpsw_init_host_port_emac()
3135 cpsw_ale_control_set(common->ale, HOST_PORT_NUM, ALE_PORT_NOLEARN, 1); in am65_cpsw_init_host_port_emac()
3142 struct am65_cpsw_common *common = dl_priv->common; in am65_cpsw_dl_switch_mode_get()
3144 dev_dbg(common->dev, "%s id:%u\n", __func__, id); in am65_cpsw_dl_switch_mode_get()
3147 return -EOPNOTSUPP; in am65_cpsw_dl_switch_mode_get()
3149 ctx->val.vbool = !common->is_emac_mode; in am65_cpsw_dl_switch_mode_get()
3156 struct am65_cpsw_slave_data *slave = &port->slave; in am65_cpsw_init_port_emac_ale()
3157 struct am65_cpsw_common *common = port->common; in am65_cpsw_init_port_emac_ale()
3160 writel(slave->port_vlan, port->port_base + AM65_CPSW_PORT_VLAN_REG_OFFSET); in am65_cpsw_init_port_emac_ale()
3162 if (slave->mac_only) in am65_cpsw_init_port_emac_ale()
3163 /* enable mac-only mode on port */ in am65_cpsw_init_port_emac_ale()
3164 cpsw_ale_control_set(common->ale, port->port_id, in am65_cpsw_init_port_emac_ale()
3167 cpsw_ale_control_set(common->ale, port->port_id, ALE_PORT_NOLEARN, 1); in am65_cpsw_init_port_emac_ale()
3169 port_mask = BIT(port->port_id) | ALE_PORT_HOST; in am65_cpsw_init_port_emac_ale()
3171 cpsw_ale_add_ucast(common->ale, port->ndev->dev_addr, in am65_cpsw_init_port_emac_ale()
3172 HOST_PORT_NUM, ALE_SECURE, slave->port_vlan); in am65_cpsw_init_port_emac_ale()
3173 cpsw_ale_add_mcast(common->ale, port->ndev->broadcast, in am65_cpsw_init_port_emac_ale()
3174 port_mask, ALE_VLAN, slave->port_vlan, ALE_MCAST_FWD_2); in am65_cpsw_init_port_emac_ale()
3179 struct am65_cpsw_slave_data *slave = &port->slave; in am65_cpsw_init_port_switch_ale()
3180 struct am65_cpsw_common *cpsw = port->common; in am65_cpsw_init_port_switch_ale()
3183 cpsw_ale_control_set(cpsw->ale, port->port_id, in am65_cpsw_init_port_switch_ale()
3186 cpsw_ale_add_ucast(cpsw->ale, port->ndev->dev_addr, in am65_cpsw_init_port_switch_ale()
3188 slave->port_vlan); in am65_cpsw_init_port_switch_ale()
3190 port_mask = BIT(port->port_id) | ALE_PORT_HOST; in am65_cpsw_init_port_switch_ale()
3192 cpsw_ale_add_mcast(cpsw->ale, port->ndev->broadcast, in am65_cpsw_init_port_switch_ale()
3193 port_mask, ALE_VLAN, slave->port_vlan, in am65_cpsw_init_port_switch_ale()
3196 writel(slave->port_vlan, port->port_base + AM65_CPSW_PORT_VLAN_REG_OFFSET); in am65_cpsw_init_port_switch_ale()
3198 cpsw_ale_control_set(cpsw->ale, port->port_id, in am65_cpsw_init_port_switch_ale()
3207 struct am65_cpsw_common *cpsw = dl_priv->common; in am65_cpsw_dl_switch_mode_set()
3208 bool switch_en = ctx->val.vbool; in am65_cpsw_dl_switch_mode_set()
3212 dev_dbg(cpsw->dev, "%s id:%u\n", __func__, id); in am65_cpsw_dl_switch_mode_set()
3215 return -EOPNOTSUPP; in am65_cpsw_dl_switch_mode_set()
3217 if (switch_en == !cpsw->is_emac_mode) in am65_cpsw_dl_switch_mode_set()
3220 if (!switch_en && cpsw->br_members) { in am65_cpsw_dl_switch_mode_set()
3221 dev_err(cpsw->dev, "Remove ports from bridge before disabling switch mode\n"); in am65_cpsw_dl_switch_mode_set()
3222 return -EINVAL; in am65_cpsw_dl_switch_mode_set()
3227 cpsw->is_emac_mode = !switch_en; in am65_cpsw_dl_switch_mode_set()
3229 for (i = 0; i < cpsw->port_num; i++) { in am65_cpsw_dl_switch_mode_set()
3230 struct net_device *sl_ndev = cpsw->ports[i].ndev; in am65_cpsw_dl_switch_mode_set()
3240 for (i = 0; i < cpsw->port_num; i++) { in am65_cpsw_dl_switch_mode_set()
3241 struct net_device *sl_ndev = cpsw->ports[i].ndev; in am65_cpsw_dl_switch_mode_set()
3249 slave->port_vlan = cpsw->default_vlan; in am65_cpsw_dl_switch_mode_set()
3251 slave->port_vlan = 0; in am65_cpsw_dl_switch_mode_set()
3257 cpsw_ale_control_set(cpsw->ale, 0, ALE_BYPASS, 1); in am65_cpsw_dl_switch_mode_set()
3259 cpsw_ale_control_set(cpsw->ale, HOST_PORT_NUM, ALE_CLEAR, 1); in am65_cpsw_dl_switch_mode_set()
3260 cpsw_ale_control_get(cpsw->ale, HOST_PORT_NUM, ALE_AGEOUT); in am65_cpsw_dl_switch_mode_set()
3263 dev_info(cpsw->dev, "Enable switch mode\n"); in am65_cpsw_dl_switch_mode_set()
3267 for (i = 0; i < cpsw->port_num; i++) { in am65_cpsw_dl_switch_mode_set()
3268 struct net_device *sl_ndev = cpsw->ports[i].ndev; in am65_cpsw_dl_switch_mode_set()
3277 slave->port_vlan = cpsw->default_vlan; in am65_cpsw_dl_switch_mode_set()
3284 dev_info(cpsw->dev, "Disable switch mode\n"); in am65_cpsw_dl_switch_mode_set()
3288 for (i = 0; i < cpsw->port_num; i++) { in am65_cpsw_dl_switch_mode_set()
3289 struct net_device *sl_ndev = cpsw->ports[i].ndev; in am65_cpsw_dl_switch_mode_set()
3296 port->slave.port_vlan = 0; in am65_cpsw_dl_switch_mode_set()
3301 cpsw_ale_control_set(cpsw->ale, HOST_PORT_NUM, ALE_BYPASS, 0); in am65_cpsw_dl_switch_mode_set()
3320 struct device *dev = common->dev; in am65_cpsw_nuss_register_devlink()
3326 common->devlink = in am65_cpsw_nuss_register_devlink()
3328 if (!common->devlink) in am65_cpsw_nuss_register_devlink()
3329 return -ENOMEM; in am65_cpsw_nuss_register_devlink()
3331 dl_priv = devlink_priv(common->devlink); in am65_cpsw_nuss_register_devlink()
3332 dl_priv->common = common; in am65_cpsw_nuss_register_devlink()
3339 ret = devlink_params_register(common->devlink, in am65_cpsw_nuss_register_devlink()
3348 for (i = 1; i <= common->port_num; i++) { in am65_cpsw_nuss_register_devlink()
3350 dl_port = &port->devlink_port; in am65_cpsw_nuss_register_devlink()
3352 if (port->ndev) in am65_cpsw_nuss_register_devlink()
3356 attrs.phys.port_number = port->port_id; in am65_cpsw_nuss_register_devlink()
3358 memcpy(attrs.switch_id.id, common->switch_id, attrs.switch_id.id_len); in am65_cpsw_nuss_register_devlink()
3361 ret = devlink_port_register(common->devlink, dl_port, port->port_id); in am65_cpsw_nuss_register_devlink()
3364 port->port_id, ret); in am65_cpsw_nuss_register_devlink()
3368 devlink_register(common->devlink); in am65_cpsw_nuss_register_devlink()
3372 for (i = i - 1; i >= 1; i--) { in am65_cpsw_nuss_register_devlink()
3374 dl_port = &port->devlink_port; in am65_cpsw_nuss_register_devlink()
3379 devlink_free(common->devlink); in am65_cpsw_nuss_register_devlink()
3389 devlink_unregister(common->devlink); in am65_cpsw_unregister_devlink()
3391 for (i = 1; i <= common->port_num; i++) { in am65_cpsw_unregister_devlink()
3393 dl_port = &port->devlink_port; in am65_cpsw_unregister_devlink()
3400 devlink_params_unregister(common->devlink, in am65_cpsw_unregister_devlink()
3404 devlink_free(common->devlink); in am65_cpsw_unregister_devlink()
3409 struct am65_cpsw_rx_chn *rx_chan = &common->rx_chns; in am65_cpsw_nuss_register_ndevs()
3410 struct am65_cpsw_tx_chn *tx_chan = common->tx_chns; in am65_cpsw_nuss_register_ndevs()
3411 struct device *dev = common->dev; in am65_cpsw_nuss_register_ndevs()
3427 for (i = 0; i < common->tx_ch_num; i++) { in am65_cpsw_nuss_register_ndevs()
3433 for (i = 0; i < common->rx_ch_num_flows; i++) in am65_cpsw_nuss_register_ndevs()
3434 k3_udma_glue_reset_rx_chn(rx_chan->rx_chn, i, in am65_cpsw_nuss_register_ndevs()
3438 k3_udma_glue_disable_rx_chn(rx_chan->rx_chn); in am65_cpsw_nuss_register_ndevs()
3444 for (i = 0; i < common->port_num; i++) { in am65_cpsw_nuss_register_ndevs()
3445 port = &common->ports[i]; in am65_cpsw_nuss_register_ndevs()
3447 if (!port->ndev) in am65_cpsw_nuss_register_ndevs()
3450 SET_NETDEV_DEVLINK_PORT(port->ndev, &port->devlink_port); in am65_cpsw_nuss_register_ndevs()
3452 ret = register_netdev(port->ndev); in am65_cpsw_nuss_register_ndevs()
3489 common->tx_ch_num = num_tx; in am65_cpsw_nuss_update_tx_rx_chns()
3490 common->rx_ch_num_flows = num_rx; in am65_cpsw_nuss_update_tx_rx_chns()
3520 .ale_dev_id = "am65x-cpsw2g",
3526 .ale_dev_id = "am65x-cpsw2g",
3532 .ale_dev_id = "am64-cpswxg",
3538 .ale_dev_id = "am64-cpswxg",
3546 .ale_dev_id = "am64-cpswxg",
3553 .ale_dev_id = "am64-cpswxg",
3560 { .compatible = "ti,am654-cpsw-nuss", .data = &am65x_sr1_0},
3561 { .compatible = "ti,j721e-cpsw-nuss", .data = &j721e_pdata},
3562 { .compatible = "ti,am642-cpsw-nuss", .data = &am64x_cpswxg_pdata},
3563 { .compatible = "ti,j7200-cpswxg-nuss", .data = &j7200_cpswxg_pdata},
3564 { .compatible = "ti,j721e-cpswxg-nuss", .data = &j721e_cpswxg_pdata},
3565 { .compatible = "ti,j784s4-cpswxg-nuss", .data = &j784s4_cpswxg_pdata},
3575 if (soc && soc->data) { in am65_cpsw_nuss_apply_socinfo()
3576 const struct am65_cpsw_soc_pdata *socdata = soc->data; in am65_cpsw_nuss_apply_socinfo()
3579 common->pdata.quirks &= ~socdata->quirks_dis; in am65_cpsw_nuss_apply_socinfo()
3587 struct device *dev = &pdev->dev; in am65_cpsw_nuss_probe()
3598 return -ENOMEM; in am65_cpsw_nuss_probe()
3599 common->dev = dev; in am65_cpsw_nuss_probe()
3603 return -EINVAL; in am65_cpsw_nuss_probe()
3604 common->pdata = *(const struct am65_cpsw_pdata *)of_id->data; in am65_cpsw_nuss_probe()
3609 common->ss_base = devm_ioremap_resource(&pdev->dev, res); in am65_cpsw_nuss_probe()
3610 if (IS_ERR(common->ss_base)) in am65_cpsw_nuss_probe()
3611 return PTR_ERR(common->ss_base); in am65_cpsw_nuss_probe()
3612 common->cpsw_base = common->ss_base + AM65_CPSW_CPSW_NU_BASE; in am65_cpsw_nuss_probe()
3614 id_temp = cpu_to_be64(res->start); in am65_cpsw_nuss_probe()
3615 memcpy(common->switch_id, &id_temp, sizeof(res->start)); in am65_cpsw_nuss_probe()
3617 node = of_get_child_by_name(dev->of_node, "ethernet-ports"); in am65_cpsw_nuss_probe()
3619 return -ENOENT; in am65_cpsw_nuss_probe()
3620 common->port_num = of_get_child_count(node); in am65_cpsw_nuss_probe()
3622 if (common->port_num < 1 || common->port_num > AM65_CPSW_MAX_PORTS) in am65_cpsw_nuss_probe()
3623 return -ENOENT; in am65_cpsw_nuss_probe()
3625 common->rx_flow_id_base = -1; in am65_cpsw_nuss_probe()
3626 init_completion(&common->tdown_complete); in am65_cpsw_nuss_probe()
3627 common->tx_ch_num = AM65_CPSW_DEFAULT_TX_CHNS; in am65_cpsw_nuss_probe()
3628 common->rx_ch_num_flows = AM65_CPSW_DEFAULT_RX_CHN_FLOWS; in am65_cpsw_nuss_probe()
3629 common->pf_p0_rx_ptype_rrobin = true; in am65_cpsw_nuss_probe()
3630 common->default_vlan = 1; in am65_cpsw_nuss_probe()
3632 common->ports = devm_kcalloc(dev, common->port_num, in am65_cpsw_nuss_probe()
3633 sizeof(*common->ports), in am65_cpsw_nuss_probe()
3635 if (!common->ports) in am65_cpsw_nuss_probe()
3636 return -ENOMEM; in am65_cpsw_nuss_probe()
3641 common->bus_freq = clk_get_rate(clk); in am65_cpsw_nuss_probe()
3650 node = of_get_child_by_name(dev->of_node, "mdio"); in am65_cpsw_nuss_probe()
3658 ret = -ENODEV; in am65_cpsw_nuss_probe()
3662 common->mdio_dev = &mdio_pdev->dev; in am65_cpsw_nuss_probe()
3679 ale_params.ale_ports = common->port_num + 1; in am65_cpsw_nuss_probe()
3680 ale_params.ale_regs = common->cpsw_base + AM65_CPSW_NU_ALE_BASE; in am65_cpsw_nuss_probe()
3681 ale_params.dev_id = common->pdata.ale_dev_id; in am65_cpsw_nuss_probe()
3682 ale_params.bus_freq = common->bus_freq; in am65_cpsw_nuss_probe()
3684 common->ale = cpsw_ale_create(&ale_params); in am65_cpsw_nuss_probe()
3685 if (IS_ERR(common->ale)) { in am65_cpsw_nuss_probe()
3687 ret = PTR_ERR(common->ale); in am65_cpsw_nuss_probe()
3691 ale_entries = common->ale->params.ale_entries; in am65_cpsw_nuss_probe()
3692 common->ale_context = devm_kzalloc(dev, in am65_cpsw_nuss_probe()
3700 for (i = 0; i < common->port_num; i++) in am65_cpsw_nuss_probe()
3701 am65_cpsw_nuss_slave_disable_unused(&common->ports[i]); in am65_cpsw_nuss_probe()
3705 common->is_emac_mode = true; in am65_cpsw_nuss_probe()
3721 am65_cpts_release(common->cpts); in am65_cpsw_nuss_probe()
3724 if (common->mdio_dev) in am65_cpsw_nuss_probe()
3725 of_platform_device_destroy(common->mdio_dev, NULL); in am65_cpsw_nuss_probe()
3734 struct device *dev = &pdev->dev; in am65_cpsw_nuss_remove()
3740 ret = pm_runtime_resume_and_get(&pdev->dev); in am65_cpsw_nuss_remove()
3745 dev_err(&pdev->dev, "Failed to resume device (%pe)\n", in am65_cpsw_nuss_remove()
3760 am65_cpts_release(common->cpts); in am65_cpsw_nuss_remove()
3764 if (common->mdio_dev) in am65_cpsw_nuss_remove()
3765 of_platform_device_destroy(common->mdio_dev, NULL); in am65_cpsw_nuss_remove()
3767 pm_runtime_put_sync(&pdev->dev); in am65_cpsw_nuss_remove()
3768 pm_runtime_disable(&pdev->dev); in am65_cpsw_nuss_remove()
3779 cpsw_ale_dump(common->ale, common->ale_context); in am65_cpsw_nuss_suspend()
3780 host_p->vid_context = readl(host_p->port_base + AM65_CPSW_PORT_VLAN_REG_OFFSET); in am65_cpsw_nuss_suspend()
3781 for (i = 0; i < common->port_num; i++) { in am65_cpsw_nuss_suspend()
3782 port = &common->ports[i]; in am65_cpsw_nuss_suspend()
3783 ndev = port->ndev; in am65_cpsw_nuss_suspend()
3788 port->vid_context = readl(port->port_base + AM65_CPSW_PORT_VLAN_REG_OFFSET); in am65_cpsw_nuss_suspend()
3801 am65_cpts_suspend(common->cpts); in am65_cpsw_nuss_suspend()
3827 for (i = 0; i < common->rx_ch_num_flows; i++) { in am65_cpsw_nuss_resume()
3828 if (common->rx_chns.flows[i].irq_disabled) in am65_cpsw_nuss_resume()
3829 disable_irq(common->rx_chns.flows[i].irq); in am65_cpsw_nuss_resume()
3832 am65_cpts_resume(common->cpts); in am65_cpsw_nuss_resume()
3834 for (i = 0; i < common->port_num; i++) { in am65_cpsw_nuss_resume()
3835 port = &common->ports[i]; in am65_cpsw_nuss_resume()
3836 ndev = port->ndev; in am65_cpsw_nuss_resume()
3852 writel(port->vid_context, port->port_base + AM65_CPSW_PORT_VLAN_REG_OFFSET); in am65_cpsw_nuss_resume()
3855 writel(host_p->vid_context, host_p->port_base + AM65_CPSW_PORT_VLAN_REG_OFFSET); in am65_cpsw_nuss_resume()
3856 cpsw_ale_restore(common->ale, common->ale_context); in am65_cpsw_nuss_resume()