Lines Matching +full:slave +full:- +full:mode
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. */
176 static void am65_cpsw_port_set_sl_mac(struct am65_cpsw_port *slave, in am65_cpsw_port_set_sl_mac() argument
183 writel(mac_hi, slave->port_base + AM65_CPSW_PORTN_REG_SA_H); in am65_cpsw_port_set_sl_mac()
184 writel(mac_lo, slave->port_base + AM65_CPSW_PORTN_REG_SA_L); in am65_cpsw_port_set_sl_mac()
191 static int am65_cpsw_port_set_dscp_map(struct am65_cpsw_port *slave, u8 dscp, u8 pri) in am65_cpsw_port_set_dscp_map() argument
198 return -EINVAL; in am65_cpsw_port_set_dscp_map()
201 return -EINVAL; in am65_cpsw_port_set_dscp_map()
203 /* 32-bit register offset to this dscp */ in am65_cpsw_port_set_dscp_map()
208 val = readl(slave->port_base + AM65_CPSW_PORTN_REG_DSCP_MAP + reg_ofs); in am65_cpsw_port_set_dscp_map()
211 writel(val, slave->port_base + AM65_CPSW_PORTN_REG_DSCP_MAP + reg_ofs); in am65_cpsw_port_set_dscp_map()
216 static void am65_cpsw_port_enable_dscp_map(struct am65_cpsw_port *slave) in am65_cpsw_port_enable_dscp_map() argument
222 * https://datatracker.ietf.org/doc/html/rfc8325#section-4.3 in am65_cpsw_port_enable_dscp_map()
224 * https://datatracker.ietf.org/doc/html/rfc8622#section-11 in am65_cpsw_port_enable_dscp_map()
270 am65_cpsw_port_set_dscp_map(slave, dscp, pri); in am65_cpsw_port_enable_dscp_map()
274 val = readl(slave->port_base + AM65_CPSW_PORTN_REG_CTL); in am65_cpsw_port_enable_dscp_map()
277 writel(val, slave->port_base + AM65_CPSW_PORTN_REG_CTL); in am65_cpsw_port_enable_dscp_map()
282 cpsw_sl_reset(port->slave.mac_sl, 100); in am65_cpsw_sl_ctl_reset()
285 port->port_base + AM65_CPSW_PORT_REG_RX_MAXLEN); in am65_cpsw_sl_ctl_reset()
290 common->nuss_ver = readl(common->ss_base); in am65_cpsw_nuss_get_ver()
291 common->cpsw_ver = readl(common->cpsw_base); in am65_cpsw_nuss_get_ver()
292 dev_info(common->dev, in am65_cpsw_nuss_get_ver()
294 common->nuss_ver, in am65_cpsw_nuss_get_ver()
295 common->cpsw_ver, in am65_cpsw_nuss_get_ver()
296 common->port_num + 1, in am65_cpsw_nuss_get_ver()
297 common->pdata.quirks); in am65_cpsw_nuss_get_ver()
308 if (!common->is_emac_mode) in am65_cpsw_nuss_ndo_slave_add_vid()
314 ret = pm_runtime_resume_and_get(common->dev); in am65_cpsw_nuss_ndo_slave_add_vid()
318 port_mask = BIT(port->port_id) | ALE_PORT_HOST; in am65_cpsw_nuss_ndo_slave_add_vid()
321 dev_info(common->dev, "Adding vlan %d to vlan filter\n", vid); in am65_cpsw_nuss_ndo_slave_add_vid()
322 ret = cpsw_ale_vlan_add_modify(common->ale, vid, port_mask, in am65_cpsw_nuss_ndo_slave_add_vid()
325 pm_runtime_put(common->dev); in am65_cpsw_nuss_ndo_slave_add_vid()
336 if (!common->is_emac_mode) in am65_cpsw_nuss_ndo_slave_kill_vid()
342 ret = pm_runtime_resume_and_get(common->dev); in am65_cpsw_nuss_ndo_slave_kill_vid()
346 dev_info(common->dev, "Removing vlan %d from vlan filter\n", vid); in am65_cpsw_nuss_ndo_slave_kill_vid()
347 ret = cpsw_ale_del_vlan(common->ale, vid, in am65_cpsw_nuss_ndo_slave_kill_vid()
348 BIT(port->port_id) | ALE_PORT_HOST); in am65_cpsw_nuss_ndo_slave_kill_vid()
350 pm_runtime_put(common->dev); in am65_cpsw_nuss_ndo_slave_kill_vid()
357 struct am65_cpsw_common *common = port->common; in am65_cpsw_slave_set_promisc()
359 if (promisc && !common->is_emac_mode) { in am65_cpsw_slave_set_promisc()
360 dev_dbg(common->dev, "promisc mode requested in switch mode"); in am65_cpsw_slave_set_promisc()
365 /* Enable promiscuous mode */ in am65_cpsw_slave_set_promisc()
366 cpsw_ale_control_set(common->ale, port->port_id, in am65_cpsw_slave_set_promisc()
368 dev_dbg(common->dev, "promisc enabled\n"); in am65_cpsw_slave_set_promisc()
370 /* Disable promiscuous mode */ in am65_cpsw_slave_set_promisc()
371 cpsw_ale_control_set(common->ale, port->port_id, in am65_cpsw_slave_set_promisc()
373 dev_dbg(common->dev, "promisc disabled\n"); in am65_cpsw_slave_set_promisc()
384 promisc = !!(ndev->flags & IFF_PROMISC); in am65_cpsw_nuss_ndo_slave_set_rx_mode()
391 cpsw_ale_set_allmulti(common->ale, in am65_cpsw_nuss_ndo_slave_set_rx_mode()
392 ndev->flags & IFF_ALLMULTI, port->port_id); in am65_cpsw_nuss_ndo_slave_set_rx_mode()
396 cpsw_ale_flush_multicast(common->ale, port_mask, -1); in am65_cpsw_nuss_ndo_slave_set_rx_mode()
403 cpsw_ale_add_mcast(common->ale, ha->addr, in am65_cpsw_nuss_ndo_slave_set_rx_mode()
418 tx_chn = &common->tx_chns[txqueue]; in am65_cpsw_nuss_ndo_host_tx_timeout()
419 trans_start = READ_ONCE(netif_txq->trans_start); in am65_cpsw_nuss_ndo_host_tx_timeout()
424 jiffies_to_msecs(jiffies - trans_start), in am65_cpsw_nuss_ndo_host_tx_timeout()
426 k3_cppi_desc_pool_avail(tx_chn->desc_pool)); in am65_cpsw_nuss_ndo_host_tx_timeout()
438 struct am65_cpsw_rx_chn *rx_chn = &common->rx_chns; in am65_cpsw_nuss_rx_push()
440 struct device *dev = common->dev; in am65_cpsw_nuss_rx_push()
445 desc_rx = k3_cppi_desc_pool_alloc(rx_chn->desc_pool); in am65_cpsw_nuss_rx_push()
448 return -ENOMEM; in am65_cpsw_nuss_rx_push()
450 desc_dma = k3_cppi_desc_pool_virt2dma(rx_chn->desc_pool, desc_rx); in am65_cpsw_nuss_rx_push()
452 buf_dma = dma_map_single(rx_chn->dma_dev, in am65_cpsw_nuss_rx_push()
455 if (unlikely(dma_mapping_error(rx_chn->dma_dev, buf_dma))) { in am65_cpsw_nuss_rx_push()
456 k3_cppi_desc_pool_free(rx_chn->desc_pool, desc_rx); in am65_cpsw_nuss_rx_push()
458 return -EINVAL; in am65_cpsw_nuss_rx_push()
463 k3_udma_glue_rx_dma_to_cppi5_addr(rx_chn->rx_chn, &buf_dma); in am65_cpsw_nuss_rx_push()
467 swdata->page = page; in am65_cpsw_nuss_rx_push()
468 swdata->flow_id = flow_idx; in am65_cpsw_nuss_rx_push()
470 return k3_udma_glue_push_rx_chn(rx_chn->rx_chn, flow_idx, in am65_cpsw_nuss_rx_push()
480 val = readl(host_p->port_base + AM65_CPSW_PORT_REG_PRI_CTL); in am65_cpsw_nuss_set_p0_ptype()
482 if (common->pf_p0_rx_ptype_rrobin) { in am65_cpsw_nuss_set_p0_ptype()
484 /* Enet Ports fifos works in fixed priority mode only, so in am65_cpsw_nuss_set_p0_ptype()
494 writel(pri_map, host_p->port_base + AM65_CPSW_PORT_REG_RX_PRI_MAP); in am65_cpsw_nuss_set_p0_ptype()
495 writel(val, host_p->port_base + AM65_CPSW_PORT_REG_PRI_CTL); in am65_cpsw_nuss_set_p0_ptype()
510 struct am65_cpsw_rx_chn *rx_chn = &common->rx_chns; in am65_cpsw_destroy_rxq()
515 flow = &rx_chn->flows[id]; in am65_cpsw_destroy_rxq()
516 napi_disable(&flow->napi_rx); in am65_cpsw_destroy_rxq()
517 hrtimer_cancel(&flow->rx_hrtimer); in am65_cpsw_destroy_rxq()
518 k3_udma_glue_reset_rx_chn(rx_chn->rx_chn, id, rx_chn, in am65_cpsw_destroy_rxq()
521 for (port = 0; port < common->port_num; port++) { in am65_cpsw_destroy_rxq()
522 if (!common->ports[port].ndev) in am65_cpsw_destroy_rxq()
525 rxq = &common->ports[port].xdp_rxq[id]; in am65_cpsw_destroy_rxq()
531 if (flow->page_pool) { in am65_cpsw_destroy_rxq()
532 page_pool_destroy(flow->page_pool); in am65_cpsw_destroy_rxq()
533 flow->page_pool = NULL; in am65_cpsw_destroy_rxq()
539 struct am65_cpsw_rx_chn *rx_chn = &common->rx_chns; in am65_cpsw_destroy_rxqs()
542 reinit_completion(&common->tdown_complete); in am65_cpsw_destroy_rxqs()
543 k3_udma_glue_tdown_rx_chn(rx_chn->rx_chn, true); in am65_cpsw_destroy_rxqs()
545 if (common->pdata.quirks & AM64_CPSW_QUIRK_DMA_RX_TDOWN_IRQ) { in am65_cpsw_destroy_rxqs()
546 id = wait_for_completion_timeout(&common->tdown_complete, msecs_to_jiffies(1000)); in am65_cpsw_destroy_rxqs()
548 dev_err(common->dev, "rx teardown timeout\n"); in am65_cpsw_destroy_rxqs()
551 for (id = common->rx_ch_num_flows - 1; id >= 0; id--) in am65_cpsw_destroy_rxqs()
554 k3_udma_glue_disable_rx_chn(common->rx_chns.rx_chn); in am65_cpsw_destroy_rxqs()
559 struct am65_cpsw_rx_chn *rx_chn = &common->rx_chns; in am65_cpsw_create_rxq()
564 .nid = dev_to_node(common->dev), in am65_cpsw_create_rxq()
565 .dev = common->dev, in am65_cpsw_create_rxq()
575 flow = &rx_chn->flows[id]; in am65_cpsw_create_rxq()
576 pp_params.napi = &flow->napi_rx; in am65_cpsw_create_rxq()
583 flow->page_pool = pool; in am65_cpsw_create_rxq()
588 for (port = 0; port < common->port_num; port++) { in am65_cpsw_create_rxq()
589 if (!common->ports[port].ndev) in am65_cpsw_create_rxq()
593 rxq = &common->ports[port].xdp_rxq[id]; in am65_cpsw_create_rxq()
594 ret = xdp_rxq_info_reg(rxq, common->ports[port].ndev, in am65_cpsw_create_rxq()
595 id, flow->napi_rx.napi_id); in am65_cpsw_create_rxq()
607 page = page_pool_dev_alloc_pages(flow->page_pool); in am65_cpsw_create_rxq()
609 dev_err(common->dev, "cannot allocate page in flow %d\n", in am65_cpsw_create_rxq()
611 ret = -ENOMEM; in am65_cpsw_create_rxq()
617 dev_err(common->dev, in am65_cpsw_create_rxq()
625 napi_enable(&flow->napi_rx); in am65_cpsw_create_rxq()
637 for (id = 0; id < common->rx_ch_num_flows; id++) { in am65_cpsw_create_rxqs()
640 dev_err(common->dev, "couldn't create rxq %d: %d\n", in am65_cpsw_create_rxqs()
646 ret = k3_udma_glue_enable_rx_chn(common->rx_chns.rx_chn); in am65_cpsw_create_rxqs()
648 dev_err(common->dev, "couldn't enable rx chn: %d\n", ret); in am65_cpsw_create_rxqs()
655 for (--id; id >= 0; id--) in am65_cpsw_create_rxqs()
663 struct am65_cpsw_tx_chn *tx_chn = &common->tx_chns[id]; in am65_cpsw_destroy_txq()
665 napi_disable(&tx_chn->napi_tx); in am65_cpsw_destroy_txq()
666 hrtimer_cancel(&tx_chn->tx_hrtimer); in am65_cpsw_destroy_txq()
667 k3_udma_glue_reset_tx_chn(tx_chn->tx_chn, tx_chn, in am65_cpsw_destroy_txq()
669 k3_udma_glue_disable_tx_chn(tx_chn->tx_chn); in am65_cpsw_destroy_txq()
674 struct am65_cpsw_tx_chn *tx_chn = common->tx_chns; in am65_cpsw_destroy_txqs()
678 atomic_set(&common->tdown_cnt, common->tx_ch_num); in am65_cpsw_destroy_txqs()
681 reinit_completion(&common->tdown_complete); in am65_cpsw_destroy_txqs()
683 for (id = 0; id < common->tx_ch_num; id++) in am65_cpsw_destroy_txqs()
686 id = wait_for_completion_timeout(&common->tdown_complete, in am65_cpsw_destroy_txqs()
689 dev_err(common->dev, "tx teardown timeout\n"); in am65_cpsw_destroy_txqs()
691 for (id = common->tx_ch_num - 1; id >= 0; id--) in am65_cpsw_destroy_txqs()
697 struct am65_cpsw_tx_chn *tx_chn = &common->tx_chns[id]; in am65_cpsw_create_txq()
700 ret = k3_udma_glue_enable_tx_chn(tx_chn->tx_chn); in am65_cpsw_create_txq()
704 napi_enable(&tx_chn->napi_tx); in am65_cpsw_create_txq()
713 for (id = 0; id < common->tx_ch_num; id++) { in am65_cpsw_create_txqs()
716 dev_err(common->dev, "couldn't create txq %d: %d\n", in am65_cpsw_create_txqs()
725 for (--id; id >= 0; id--) in am65_cpsw_create_txqs()
737 return (desc - pool_addr) >> dsize_log2; in am65_cpsw_nuss_desc_idx()
746 desc_idx = am65_cpsw_nuss_desc_idx(tx_chn->desc_pool, desc, in am65_cpsw_nuss_set_buf_type()
747 tx_chn->dsize_log2); in am65_cpsw_nuss_set_buf_type()
748 k3_cppi_desc_pool_desc_info_set(tx_chn->desc_pool, desc_idx, in am65_cpsw_nuss_set_buf_type()
758 desc_tx = k3_cppi_desc_pool_dma2virt(tx_chn->desc_pool, desc_dma); in am65_cpsw_nuss_buf_type()
759 desc_idx = am65_cpsw_nuss_desc_idx(tx_chn->desc_pool, desc_tx, in am65_cpsw_nuss_buf_type()
760 tx_chn->dsize_log2); in am65_cpsw_nuss_buf_type()
762 return (enum am65_cpsw_tx_buf_type)k3_cppi_desc_pool_desc_info(tx_chn->desc_pool, in am65_cpsw_nuss_buf_type()
770 page_pool_put_full_page(flow->page_pool, page, allow_direct); in am65_cpsw_put_page()
783 desc_rx = k3_cppi_desc_pool_dma2virt(rx_chn->desc_pool, desc_dma); in am65_cpsw_nuss_rx_cleanup()
785 page = swdata->page; in am65_cpsw_nuss_rx_cleanup()
786 flow_id = swdata->flow_id; in am65_cpsw_nuss_rx_cleanup()
788 k3_udma_glue_rx_cppi5_to_dma_addr(rx_chn->rx_chn, &buf_dma); in am65_cpsw_nuss_rx_cleanup()
789 dma_unmap_single(rx_chn->dma_dev, buf_dma, buf_dma_len, DMA_FROM_DEVICE); in am65_cpsw_nuss_rx_cleanup()
790 k3_cppi_desc_pool_free(rx_chn->desc_pool, desc_rx); in am65_cpsw_nuss_rx_cleanup()
791 am65_cpsw_put_page(&rx_chn->flows[flow_id], page, false); in am65_cpsw_nuss_rx_cleanup()
805 k3_udma_glue_tx_cppi5_to_dma_addr(tx_chn->tx_chn, &buf_dma); in am65_cpsw_nuss_xmit_free()
807 dma_unmap_single(tx_chn->dma_dev, buf_dma, buf_dma_len, DMA_TO_DEVICE); in am65_cpsw_nuss_xmit_free()
810 k3_udma_glue_tx_cppi5_to_dma_addr(tx_chn->tx_chn, &next_desc_dma); in am65_cpsw_nuss_xmit_free()
812 next_desc = k3_cppi_desc_pool_dma2virt(tx_chn->desc_pool, in am65_cpsw_nuss_xmit_free()
815 k3_udma_glue_tx_cppi5_to_dma_addr(tx_chn->tx_chn, &buf_dma); in am65_cpsw_nuss_xmit_free()
817 dma_unmap_page(tx_chn->dma_dev, buf_dma, buf_dma_len, in am65_cpsw_nuss_xmit_free()
821 k3_udma_glue_tx_cppi5_to_dma_addr(tx_chn->tx_chn, &next_desc_dma); in am65_cpsw_nuss_xmit_free()
823 k3_cppi_desc_pool_free(tx_chn->desc_pool, next_desc); in am65_cpsw_nuss_xmit_free()
826 k3_cppi_desc_pool_free(tx_chn->desc_pool, first_desc); in am65_cpsw_nuss_xmit_free()
838 desc_tx = k3_cppi_desc_pool_dma2virt(tx_chn->desc_pool, desc_dma); in am65_cpsw_nuss_tx_cleanup()
842 skb = swdata->skb; in am65_cpsw_nuss_tx_cleanup()
845 xdpf = swdata->xdpf; in am65_cpsw_nuss_tx_cleanup()
864 skb->dev = ndev; in am65_cpsw_build_skb()
875 if (common->usage_count) in am65_cpsw_nuss_common_open()
881 common->cpsw_base + AM65_CPSW_REG_CTL); in am65_cpsw_nuss_common_open()
884 host_p->port_base + AM65_CPSW_PORT_REG_RX_MAXLEN); in am65_cpsw_nuss_common_open()
886 writel(common->rx_flow_id_base, in am65_cpsw_nuss_common_open()
887 host_p->port_base + AM65_CPSW_PORT0_REG_FLOW_ID_OFFSET); in am65_cpsw_nuss_common_open()
889 host_p->port_base + AM65_CPSW_P0_REG_CTL); in am65_cpsw_nuss_common_open()
895 for (port_idx = 0; port_idx < common->port_num; port_idx++) { in am65_cpsw_nuss_common_open()
896 struct am65_cpsw_port *port = &common->ports[port_idx]; in am65_cpsw_nuss_common_open()
898 if (!port->disabled) in am65_cpsw_nuss_common_open()
899 val |= BIT(port->port_id); in am65_cpsw_nuss_common_open()
901 writel(val, common->cpsw_base + AM65_CPSW_REG_STAT_PORT_EN); in am65_cpsw_nuss_common_open()
904 writel(0, common->cpsw_base + AM65_CPSW_REG_PTYPE); in am65_cpsw_nuss_common_open()
906 cpsw_ale_start(common->ale); in am65_cpsw_nuss_common_open()
909 cpsw_ale_control_set(common->ale, HOST_PORT_NUM, in am65_cpsw_nuss_common_open()
911 cpsw_ale_control_set(common->ale, HOST_PORT_NUM, in am65_cpsw_nuss_common_open()
913 /* switch to vlan aware mode */ in am65_cpsw_nuss_common_open()
914 cpsw_ale_control_set(common->ale, HOST_PORT_NUM, ALE_VLAN_AWARE, 1); in am65_cpsw_nuss_common_open()
915 cpsw_ale_control_set(common->ale, HOST_PORT_NUM, in am65_cpsw_nuss_common_open()
919 port_mask = GENMASK(common->port_num, 0) & in am65_cpsw_nuss_common_open()
920 ~common->disabled_ports_mask; in am65_cpsw_nuss_common_open()
922 cpsw_ale_add_vlan(common->ale, 0, port_mask, in am65_cpsw_nuss_common_open()
926 if (common->is_emac_mode) in am65_cpsw_nuss_common_open()
941 dev_dbg(common->dev, "cpsw_nuss started\n"); in am65_cpsw_nuss_common_open()
952 if (common->usage_count != 1) in am65_cpsw_nuss_common_stop()
955 cpsw_ale_control_set(common->ale, HOST_PORT_NUM, in am65_cpsw_nuss_common_stop()
960 cpsw_ale_stop(common->ale); in am65_cpsw_nuss_common_stop()
962 writel(0, common->cpsw_base + AM65_CPSW_REG_CTL); in am65_cpsw_nuss_common_stop()
963 writel(0, common->cpsw_base + AM65_CPSW_REG_STAT_PORT_EN); in am65_cpsw_nuss_common_stop()
965 dev_dbg(common->dev, "cpsw_nuss stopped\n"); in am65_cpsw_nuss_common_stop()
975 phylink_stop(port->slave.phylink); in am65_cpsw_nuss_ndo_slave_stop()
979 phylink_disconnect_phy(port->slave.phylink); in am65_cpsw_nuss_ndo_slave_stop()
985 common->usage_count--; in am65_cpsw_nuss_ndo_slave_stop()
986 pm_runtime_put(common->dev); in am65_cpsw_nuss_ndo_slave_stop()
997 return am65_cpsw_nuss_ndo_slave_add_vid(port->ndev, 0, vid); in cpsw_restore_vlans()
1007 ret = pm_runtime_resume_and_get(common->dev); in am65_cpsw_nuss_ndo_slave_open()
1012 cpsw_sl_ctl_set(port->slave.mac_sl, CPSW_SL_CTL_CMD_IDLE); in am65_cpsw_nuss_ndo_slave_open()
1013 cpsw_sl_wait_for_idle(port->slave.mac_sl, 100); in am65_cpsw_nuss_ndo_slave_open()
1014 cpsw_sl_ctl_reset(port->slave.mac_sl); in am65_cpsw_nuss_ndo_slave_open()
1017 cpsw_sl_reg_write(port->slave.mac_sl, CPSW_SL_SOFT_RESET, 1); in am65_cpsw_nuss_ndo_slave_open()
1019 reg = cpsw_sl_reg_read(port->slave.mac_sl, CPSW_SL_SOFT_RESET); in am65_cpsw_nuss_ndo_slave_open()
1021 dev_err(common->dev, "soft RESET didn't complete\n"); in am65_cpsw_nuss_ndo_slave_open()
1022 ret = -ETIMEDOUT; in am65_cpsw_nuss_ndo_slave_open()
1027 ret = netif_set_real_num_tx_queues(ndev, common->tx_ch_num); in am65_cpsw_nuss_ndo_slave_open()
1029 dev_err(common->dev, "cannot set real number of tx queues\n"); in am65_cpsw_nuss_ndo_slave_open()
1033 ret = netif_set_real_num_rx_queues(ndev, common->rx_ch_num_flows); in am65_cpsw_nuss_ndo_slave_open()
1035 dev_err(common->dev, "cannot set real number of rx queues\n"); in am65_cpsw_nuss_ndo_slave_open()
1039 for (i = 0; i < common->tx_ch_num; i++) { in am65_cpsw_nuss_ndo_slave_open()
1043 txq->tx_maxrate = common->tx_chns[i].rate_mbps; in am65_cpsw_nuss_ndo_slave_open()
1050 common->usage_count++; in am65_cpsw_nuss_ndo_slave_open()
1052 /* VLAN aware CPSW mode is incompatible with some DSA tagging schemes. in am65_cpsw_nuss_ndo_slave_open()
1053 * Therefore disable VLAN_AWARE mode if any of the ports is a DSA Port. in am65_cpsw_nuss_ndo_slave_open()
1056 reg = readl(common->cpsw_base + AM65_CPSW_REG_CTL); in am65_cpsw_nuss_ndo_slave_open()
1058 writel(reg, common->cpsw_base + AM65_CPSW_REG_CTL); in am65_cpsw_nuss_ndo_slave_open()
1061 am65_cpsw_port_set_sl_mac(port, ndev->dev_addr); in am65_cpsw_nuss_ndo_slave_open()
1064 if (common->is_emac_mode) in am65_cpsw_nuss_ndo_slave_open()
1069 /* mac_sl should be configured via phy-link interface */ in am65_cpsw_nuss_ndo_slave_open()
1072 ret = phylink_of_phy_connect(port->slave.phylink, port->slave.port_np, 0); in am65_cpsw_nuss_ndo_slave_open()
1079 phylink_start(port->slave.phylink); in am65_cpsw_nuss_ndo_slave_open()
1088 pm_runtime_put(common->dev); in am65_cpsw_nuss_ndo_slave_open()
1103 u32 pkt_len = xdpf->len; in am65_cpsw_xdp_tx_frame()
1106 host_desc = k3_cppi_desc_pool_alloc(tx_chn->desc_pool); in am65_cpsw_xdp_tx_frame()
1108 ndev->stats.tx_dropped++; in am65_cpsw_xdp_tx_frame()
1114 dma_buf = dma_map_single(tx_chn->dma_dev, xdpf->data, in am65_cpsw_xdp_tx_frame()
1116 if (unlikely(dma_mapping_error(tx_chn->dma_dev, dma_buf))) { in am65_cpsw_xdp_tx_frame()
1117 ndev->stats.tx_dropped++; in am65_cpsw_xdp_tx_frame()
1126 cppi5_desc_set_pktids(&host_desc->hdr, 0, AM65_CPSW_CPPI_TX_FLOW_ID); in am65_cpsw_xdp_tx_frame()
1127 cppi5_desc_set_tags_ids(&host_desc->hdr, 0, port->port_id); in am65_cpsw_xdp_tx_frame()
1129 k3_udma_glue_tx_dma_to_cppi5_addr(tx_chn->tx_chn, &dma_buf); in am65_cpsw_xdp_tx_frame()
1133 swdata->ndev = ndev; in am65_cpsw_xdp_tx_frame()
1134 swdata->xdpf = xdpf; 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()
1172 struct am65_cpsw_common *common = flow->common; in am65_cpsw_run_xdp()
1173 struct net_device *ndev = port->ndev; in am65_cpsw_run_xdp()
1185 prog = READ_ONCE(port->xdp_prog); in am65_cpsw_run_xdp()
1191 *len = xdp->data_end - xdp->data; in am65_cpsw_run_xdp()
1197 tx_chn = &common->tx_chns[cpu % AM65_CPSW_MAX_QUEUES]; in am65_cpsw_run_xdp()
1198 netif_txq = netdev_get_tx_queue(ndev, tx_chn->id); in am65_cpsw_run_xdp()
1202 ndev->stats.tx_dropped++; in am65_cpsw_run_xdp()
1229 ndev->stats.rx_dropped++; in am65_cpsw_run_xdp()
1235 /* RX psdata[2] word format - checksum information */
1247 * AM65_CPSW_RX_PSD_CSUM_ERR bit - indicates csum error in am65_cpsw_nuss_rx_csum()
1249 * bits - indicates IPv4/IPv6 packet in am65_cpsw_nuss_rx_csum()
1250 * AM65_CPSW_RX_PSD_IS_FRAGMENT bit - indicates fragmented packet in am65_cpsw_nuss_rx_csum()
1256 if (unlikely(!(skb->dev->features & NETIF_F_RXCSUM))) in am65_cpsw_nuss_rx_csum()
1264 skb->ip_summed = CHECKSUM_UNNECESSARY; in am65_cpsw_nuss_rx_csum()
1271 struct am65_cpsw_rx_chn *rx_chn = &flow->common->rx_chns; in am65_cpsw_nuss_rx_packets()
1273 struct am65_cpsw_common *common = flow->common; in am65_cpsw_nuss_rx_packets()
1276 struct device *dev = common->dev; in am65_cpsw_nuss_rx_packets()
1282 u32 flow_idx = flow->id; in am65_cpsw_nuss_rx_packets()
1290 ret = k3_udma_glue_pop_rx_chn(rx_chn->rx_chn, flow_idx, &desc_dma); in am65_cpsw_nuss_rx_packets()
1292 if (ret != -ENODATA) in am65_cpsw_nuss_rx_packets()
1299 if (common->pdata.quirks & AM64_CPSW_QUIRK_DMA_RX_TDOWN_IRQ) in am65_cpsw_nuss_rx_packets()
1300 complete(&common->tdown_complete); in am65_cpsw_nuss_rx_packets()
1304 desc_rx = k3_cppi_desc_pool_dma2virt(rx_chn->desc_pool, desc_dma); in am65_cpsw_nuss_rx_packets()
1309 page = swdata->page; in am65_cpsw_nuss_rx_packets()
1312 k3_udma_glue_rx_cppi5_to_dma_addr(rx_chn->rx_chn, &buf_dma); in am65_cpsw_nuss_rx_packets()
1314 cppi5_desc_get_tags_ids(&desc_rx->hdr, &port_id, NULL); in am65_cpsw_nuss_rx_packets()
1317 ndev = port->ndev; in am65_cpsw_nuss_rx_packets()
1322 dma_unmap_single(rx_chn->dma_dev, buf_dma, buf_dma_len, DMA_FROM_DEVICE); in am65_cpsw_nuss_rx_packets()
1323 k3_cppi_desc_pool_free(rx_chn->desc_pool, desc_rx); in am65_cpsw_nuss_rx_packets()
1325 if (port->xdp_prog) { in am65_cpsw_nuss_rx_packets()
1326 xdp_init_buff(&xdp, PAGE_SIZE, &port->xdp_rxq[flow->id]); in am65_cpsw_nuss_rx_packets()
1339 headroom = xdp.data - xdp.data_hard_start; in am65_cpsw_nuss_rx_packets()
1352 am65_cpsw_nuss_set_offload_fwd_mark(skb, ndev_priv->offload_fwd_mark); in am65_cpsw_nuss_rx_packets()
1354 if (port->rx_ts_enabled) in am65_cpsw_nuss_rx_packets()
1355 am65_cpts_rx_timestamp(common->cpts, skb); in am65_cpsw_nuss_rx_packets()
1357 skb->protocol = eth_type_trans(skb, ndev); in am65_cpsw_nuss_rx_packets()
1359 napi_gro_receive(&flow->napi_rx, skb); in am65_cpsw_nuss_rx_packets()
1364 new_page = page_pool_dev_alloc_pages(flow->page_pool); in am65_cpsw_nuss_rx_packets()
1367 return -ENOMEM; in am65_cpsw_nuss_rx_packets()
1372 ndev->stats.rx_dropped++; in am65_cpsw_nuss_rx_packets()
1380 ndev->stats.rx_errors++; in am65_cpsw_nuss_rx_packets()
1381 ndev->stats.rx_dropped++; in am65_cpsw_nuss_rx_packets()
1393 enable_irq(flow->irq); in am65_cpsw_nuss_rx_timer_callback()
1400 struct am65_cpsw_common *common = flow->common; in am65_cpsw_nuss_rx_poll()
1408 while (cur_budget--) { in am65_cpsw_nuss_rx_poll()
1419 dev_dbg(common->dev, "%s num_rx:%d %d\n", __func__, num_rx, budget); in am65_cpsw_nuss_rx_poll()
1422 if (flow->irq_disabled) { in am65_cpsw_nuss_rx_poll()
1423 flow->irq_disabled = false; in am65_cpsw_nuss_rx_poll()
1424 if (unlikely(flow->rx_pace_timeout)) { in am65_cpsw_nuss_rx_poll()
1425 hrtimer_start(&flow->rx_hrtimer, in am65_cpsw_nuss_rx_poll()
1426 ns_to_ktime(flow->rx_pace_timeout), in am65_cpsw_nuss_rx_poll()
1429 enable_irq(flow->irq); in am65_cpsw_nuss_rx_poll()
1447 (k3_cppi_desc_pool_avail(tx_chn->desc_pool) >= MAX_SKB_FRAGS)) in am65_cpsw_nuss_tx_wake()
1461 struct device *dev = common->dev; in am65_cpsw_nuss_tx_compl_packets()
1472 tx_chn = &common->tx_chns[chn]; in am65_cpsw_nuss_tx_compl_packets()
1476 spin_lock(&tx_chn->lock); in am65_cpsw_nuss_tx_compl_packets()
1477 res = k3_udma_glue_pop_tx_chn(tx_chn->tx_chn, &desc_dma); in am65_cpsw_nuss_tx_compl_packets()
1479 spin_unlock(&tx_chn->lock); in am65_cpsw_nuss_tx_compl_packets()
1481 if (res == -ENODATA) in am65_cpsw_nuss_tx_compl_packets()
1485 if (atomic_dec_and_test(&common->tdown_cnt)) in am65_cpsw_nuss_tx_compl_packets()
1486 complete(&common->tdown_complete); in am65_cpsw_nuss_tx_compl_packets()
1491 desc_tx = k3_cppi_desc_pool_dma2virt(tx_chn->desc_pool, in am65_cpsw_nuss_tx_compl_packets()
1494 ndev = swdata->ndev; in am65_cpsw_nuss_tx_compl_packets()
1497 skb = swdata->skb; in am65_cpsw_nuss_tx_compl_packets()
1498 am65_cpts_tx_timestamp(tx_chn->common->cpts, skb); in am65_cpsw_nuss_tx_compl_packets()
1499 pkt_len = skb->len; in am65_cpsw_nuss_tx_compl_packets()
1502 xdpf = swdata->xdpf; in am65_cpsw_nuss_tx_compl_packets()
1503 pkt_len = xdpf->len; in am65_cpsw_nuss_tx_compl_packets()
1541 enable_irq(tx_chns->irq); in am65_cpsw_nuss_tx_timer_callback()
1551 num_tx = am65_cpsw_nuss_tx_compl_packets(tx_chn->common, in am65_cpsw_nuss_tx_poll()
1552 tx_chn->id, budget, &tdown); in am65_cpsw_nuss_tx_poll()
1557 if (unlikely(tx_chn->tx_pace_timeout && !tdown)) { in am65_cpsw_nuss_tx_poll()
1558 hrtimer_start(&tx_chn->tx_hrtimer, in am65_cpsw_nuss_tx_poll()
1559 ns_to_ktime(tx_chn->tx_pace_timeout), in am65_cpsw_nuss_tx_poll()
1562 enable_irq(tx_chn->irq); in am65_cpsw_nuss_tx_poll()
1573 flow->irq_disabled = true; in am65_cpsw_nuss_rx_irq()
1575 napi_schedule(&flow->napi_rx); in am65_cpsw_nuss_rx_irq()
1585 napi_schedule(&tx_chn->napi_tx); in am65_cpsw_nuss_tx_irq()
1597 struct device *dev = common->dev; in am65_cpsw_nuss_ndo_slave_xmit()
1609 if (port->tx_ts_enabled) in am65_cpsw_nuss_ndo_slave_xmit()
1610 am65_cpts_prep_tx_timestamp(common->cpts, skb); in am65_cpsw_nuss_ndo_slave_xmit()
1615 tx_chn = &common->tx_chns[q_idx]; in am65_cpsw_nuss_ndo_slave_xmit()
1619 buf_dma = dma_map_single(tx_chn->dma_dev, skb->data, pkt_len, in am65_cpsw_nuss_ndo_slave_xmit()
1621 if (unlikely(dma_mapping_error(tx_chn->dma_dev, buf_dma))) { in am65_cpsw_nuss_ndo_slave_xmit()
1623 ndev->stats.tx_errors++; in am65_cpsw_nuss_ndo_slave_xmit()
1627 first_desc = k3_cppi_desc_pool_alloc(tx_chn->desc_pool); in am65_cpsw_nuss_ndo_slave_xmit()
1630 dma_unmap_single(tx_chn->dma_dev, buf_dma, pkt_len, in am65_cpsw_nuss_ndo_slave_xmit()
1640 cppi5_desc_set_pktids(&first_desc->hdr, 0, AM65_CPSW_CPPI_TX_FLOW_ID); in am65_cpsw_nuss_ndo_slave_xmit()
1642 cppi5_desc_set_tags_ids(&first_desc->hdr, 0, port->port_id); in am65_cpsw_nuss_ndo_slave_xmit()
1644 k3_udma_glue_tx_dma_to_cppi5_addr(tx_chn->tx_chn, &buf_dma); in am65_cpsw_nuss_ndo_slave_xmit()
1647 swdata->ndev = ndev; in am65_cpsw_nuss_ndo_slave_xmit()
1648 swdata->skb = skb; in am65_cpsw_nuss_ndo_slave_xmit()
1653 if (likely(skb->ip_summed == CHECKSUM_PARTIAL)) { in am65_cpsw_nuss_ndo_slave_xmit()
1657 cs_offset = cs_start + skb->csum_offset; in am65_cpsw_nuss_ndo_slave_xmit()
1660 ((cs_start + 1) << 16) | (skb->len - cs_start); in am65_cpsw_nuss_ndo_slave_xmit()
1671 for (i = 0; i < skb_shinfo(skb)->nr_frags; i++) { in am65_cpsw_nuss_ndo_slave_xmit()
1672 skb_frag_t *frag = &skb_shinfo(skb)->frags[i]; in am65_cpsw_nuss_ndo_slave_xmit()
1675 next_desc = k3_cppi_desc_pool_alloc(tx_chn->desc_pool); in am65_cpsw_nuss_ndo_slave_xmit()
1684 buf_dma = skb_frag_dma_map(tx_chn->dma_dev, frag, 0, frag_size, in am65_cpsw_nuss_ndo_slave_xmit()
1686 if (unlikely(dma_mapping_error(tx_chn->dma_dev, buf_dma))) { in am65_cpsw_nuss_ndo_slave_xmit()
1688 k3_cppi_desc_pool_free(tx_chn->desc_pool, next_desc); in am65_cpsw_nuss_ndo_slave_xmit()
1689 ndev->stats.tx_errors++; in am65_cpsw_nuss_ndo_slave_xmit()
1694 k3_udma_glue_tx_dma_to_cppi5_addr(tx_chn->tx_chn, &buf_dma); in am65_cpsw_nuss_ndo_slave_xmit()
1698 desc_dma = k3_cppi_desc_pool_virt2dma(tx_chn->desc_pool, in am65_cpsw_nuss_ndo_slave_xmit()
1700 k3_udma_glue_tx_dma_to_cppi5_addr(tx_chn->tx_chn, &desc_dma); in am65_cpsw_nuss_ndo_slave_xmit()
1706 WARN_ON(pkt_len != skb->len); in am65_cpsw_nuss_ndo_slave_xmit()
1715 desc_dma = k3_cppi_desc_pool_virt2dma(tx_chn->desc_pool, first_desc); in am65_cpsw_nuss_ndo_slave_xmit()
1717 ret = k3_udma_glue_push_tx_chn(tx_chn->tx_chn, first_desc, desc_dma); in am65_cpsw_nuss_ndo_slave_xmit()
1719 spin_lock_bh(&tx_chn->lock); in am65_cpsw_nuss_ndo_slave_xmit()
1720 ret = k3_udma_glue_push_tx_chn(tx_chn->tx_chn, first_desc, desc_dma); in am65_cpsw_nuss_ndo_slave_xmit()
1721 spin_unlock_bh(&tx_chn->lock); in am65_cpsw_nuss_ndo_slave_xmit()
1727 ndev->stats.tx_errors++; in am65_cpsw_nuss_ndo_slave_xmit()
1731 if (k3_cppi_desc_pool_avail(tx_chn->desc_pool) < MAX_SKB_FRAGS) { in am65_cpsw_nuss_ndo_slave_xmit()
1737 /* re-check for smp */ in am65_cpsw_nuss_ndo_slave_xmit()
1738 if (k3_cppi_desc_pool_avail(tx_chn->desc_pool) >= in am65_cpsw_nuss_ndo_slave_xmit()
1750 ndev->stats.tx_dropped++; in am65_cpsw_nuss_ndo_slave_xmit()
1773 ret = pm_runtime_resume_and_get(common->dev); in am65_cpsw_nuss_ndo_slave_set_mac_address()
1777 cpsw_ale_del_ucast(common->ale, ndev->dev_addr, in am65_cpsw_nuss_ndo_slave_set_mac_address()
1779 cpsw_ale_add_ucast(common->ale, sockaddr->sa_data, in am65_cpsw_nuss_ndo_slave_set_mac_address()
1785 pm_runtime_put(common->dev); in am65_cpsw_nuss_ndo_slave_set_mac_address()
1798 return -EOPNOTSUPP; in am65_cpsw_nuss_hwtstamp_set()
1800 if (copy_from_user(&cfg, ifr->ifr_data, sizeof(cfg))) in am65_cpsw_nuss_hwtstamp_set()
1801 return -EFAULT; in am65_cpsw_nuss_hwtstamp_set()
1809 return -ERANGE; in am65_cpsw_nuss_hwtstamp_set()
1814 port->rx_ts_enabled = false; in am65_cpsw_nuss_hwtstamp_set()
1828 port->rx_ts_enabled = true; in am65_cpsw_nuss_hwtstamp_set()
1834 return -EOPNOTSUPP; in am65_cpsw_nuss_hwtstamp_set()
1836 return -ERANGE; in am65_cpsw_nuss_hwtstamp_set()
1839 port->tx_ts_enabled = (cfg.tx_type == HWTSTAMP_TX_ON); in am65_cpsw_nuss_hwtstamp_set()
1860 if (port->tx_ts_enabled) in am65_cpsw_nuss_hwtstamp_set()
1864 if (port->rx_ts_enabled) in am65_cpsw_nuss_hwtstamp_set()
1868 writel(seq_id, port->port_base + AM65_CPSW_PORTN_REG_TS_SEQ_LTYPE_REG); in am65_cpsw_nuss_hwtstamp_set()
1869 writel(ts_vlan_ltype, port->port_base + in am65_cpsw_nuss_hwtstamp_set()
1871 writel(ts_ctrl_ltype2, port->port_base + in am65_cpsw_nuss_hwtstamp_set()
1873 writel(ts_ctrl, port->port_base + AM65_CPSW_PORTN_REG_TS_CTL); in am65_cpsw_nuss_hwtstamp_set()
1875 return copy_to_user(ifr->ifr_data, &cfg, sizeof(cfg)) ? -EFAULT : 0; in am65_cpsw_nuss_hwtstamp_set()
1885 return -EOPNOTSUPP; in am65_cpsw_nuss_hwtstamp_get()
1888 cfg.tx_type = port->tx_ts_enabled ? in am65_cpsw_nuss_hwtstamp_get()
1890 cfg.rx_filter = port->rx_ts_enabled ? HWTSTAMP_FILTER_PTP_V2_EVENT | in am65_cpsw_nuss_hwtstamp_get()
1893 return copy_to_user(ifr->ifr_data, &cfg, sizeof(cfg)) ? -EFAULT : 0; in am65_cpsw_nuss_hwtstamp_get()
1902 return -EINVAL; in am65_cpsw_nuss_ndo_slave_ioctl()
1911 return phylink_mii_ioctl(port->slave.phylink, req, cmd); in am65_cpsw_nuss_ndo_slave_ioctl()
1917 dev_fetch_sw_netstats(stats, dev->tstats); in am65_cpsw_nuss_ndo_get_stats()
1919 stats->rx_errors = dev->stats.rx_errors; in am65_cpsw_nuss_ndo_get_stats()
1920 stats->rx_dropped = dev->stats.rx_dropped; in am65_cpsw_nuss_ndo_get_stats()
1921 stats->tx_dropped = dev->stats.tx_dropped; in am65_cpsw_nuss_ndo_get_stats()
1934 old_prog = xchg(&port->xdp_prog, prog); in am65_cpsw_xdp_prog_setup()
1946 switch (bpf->command) { in am65_cpsw_ndo_bpf()
1948 return am65_cpsw_xdp_prog_setup(ndev, bpf->prog); in am65_cpsw_ndo_bpf()
1950 return -EINVAL; in am65_cpsw_ndo_bpf()
1963 tx_chn = &common->tx_chns[cpu % common->tx_ch_num]; in am65_cpsw_ndo_xdp_xmit()
1964 netif_txq = netdev_get_tx_queue(ndev, tx_chn->id); in am65_cpsw_ndo_xdp_xmit()
2025 for (i = 0; i < common->port_num; i++) { in am65_cpsw_disable_serdes_phy()
2026 port = &common->ports[i]; in am65_cpsw_disable_serdes_phy()
2027 phy = port->slave.serdes_phy; in am65_cpsw_disable_serdes_phy()
2045 port->slave.serdes_phy = phy; in am65_cpsw_init_serdes_phy()
2058 static void am65_cpsw_nuss_mac_config(struct phylink_config *config, unsigned int mode, in am65_cpsw_nuss_mac_config() argument
2061 struct am65_cpsw_slave_data *slave = container_of(config, struct am65_cpsw_slave_data, in am65_cpsw_nuss_mac_config() local
2063 struct am65_cpsw_port *port = container_of(slave, struct am65_cpsw_port, slave); in am65_cpsw_nuss_mac_config()
2064 struct am65_cpsw_common *common = port->common; in am65_cpsw_nuss_mac_config()
2066 if (common->pdata.extra_modes & BIT(state->interface)) { in am65_cpsw_nuss_mac_config()
2067 if (state->interface == PHY_INTERFACE_MODE_SGMII) { in am65_cpsw_nuss_mac_config()
2069 port->sgmii_base + AM65_CPSW_SGMII_MR_ADV_ABILITY_REG); in am65_cpsw_nuss_mac_config()
2070 cpsw_sl_ctl_set(port->slave.mac_sl, CPSW_SL_CTL_EXT_EN); in am65_cpsw_nuss_mac_config()
2072 cpsw_sl_ctl_clr(port->slave.mac_sl, CPSW_SL_CTL_EXT_EN); in am65_cpsw_nuss_mac_config()
2075 if (state->interface == PHY_INTERFACE_MODE_USXGMII) { in am65_cpsw_nuss_mac_config()
2076 cpsw_sl_ctl_set(port->slave.mac_sl, in am65_cpsw_nuss_mac_config()
2079 cpsw_sl_ctl_clr(port->slave.mac_sl, in am65_cpsw_nuss_mac_config()
2084 port->sgmii_base + AM65_CPSW_SGMII_CONTROL_REG); in am65_cpsw_nuss_mac_config()
2088 static void am65_cpsw_nuss_mac_link_down(struct phylink_config *config, unsigned int mode, in am65_cpsw_nuss_mac_link_down() argument
2091 struct am65_cpsw_slave_data *slave = container_of(config, struct am65_cpsw_slave_data, in am65_cpsw_nuss_mac_link_down() local
2093 struct am65_cpsw_port *port = container_of(slave, struct am65_cpsw_port, slave); in am65_cpsw_nuss_mac_link_down()
2094 struct am65_cpsw_common *common = port->common; in am65_cpsw_nuss_mac_link_down()
2095 struct net_device *ndev = port->ndev; in am65_cpsw_nuss_mac_link_down()
2100 cpsw_ale_control_set(common->ale, port->port_id, ALE_PORT_STATE, ALE_PORT_STATE_DISABLE); in am65_cpsw_nuss_mac_link_down()
2102 cpsw_sl_ctl_set(port->slave.mac_sl, CPSW_SL_CTL_CMD_IDLE); in am65_cpsw_nuss_mac_link_down()
2104 tmo = cpsw_sl_wait_for_idle(port->slave.mac_sl, 100); in am65_cpsw_nuss_mac_link_down()
2105 dev_dbg(common->dev, "down msc_sl %08x tmo %d\n", in am65_cpsw_nuss_mac_link_down()
2106 cpsw_sl_reg_read(port->slave.mac_sl, CPSW_SL_MACSTATUS), tmo); in am65_cpsw_nuss_mac_link_down()
2111 /* If interface mode is RGMII, CPSW_SL_CTL_EXT_EN might have been set for 10 Mbps */ in am65_cpsw_nuss_mac_link_down()
2115 cpsw_sl_ctl_clr(port->slave.mac_sl, mac_control); in am65_cpsw_nuss_mac_link_down()
2122 unsigned int mode, phy_interface_t interface, int speed, in am65_cpsw_nuss_mac_link_up() argument
2125 struct am65_cpsw_slave_data *slave = container_of(config, struct am65_cpsw_slave_data, in am65_cpsw_nuss_mac_link_up() local
2127 struct am65_cpsw_port *port = container_of(slave, struct am65_cpsw_port, slave); in am65_cpsw_nuss_mac_link_up()
2128 struct am65_cpsw_common *common = port->common; in am65_cpsw_nuss_mac_link_up()
2130 struct net_device *ndev = port->ndev; in am65_cpsw_nuss_mac_link_up()
2133 cpsw_sl_ctl_clr(port->slave.mac_sl, CPSW_SL_CTL_CMD_IDLE); in am65_cpsw_nuss_mac_link_up()
2137 /* TODO: Verify whether in-band is necessary for 10 Mbps RGMII */ in am65_cpsw_nuss_mac_link_up()
2139 /* Can be used with in band mode only */ in am65_cpsw_nuss_mac_link_up()
2153 cpsw_sl_ctl_set(port->slave.mac_sl, mac_control); in am65_cpsw_nuss_mac_link_up()
2156 cpsw_ale_control_set(common->ale, port->port_id, ALE_PORT_STATE, ALE_PORT_STATE_FORWARD); in am65_cpsw_nuss_mac_link_up()
2170 struct am65_cpsw_common *common = port->common; in am65_cpsw_nuss_slave_disable_unused()
2172 if (!port->disabled) in am65_cpsw_nuss_slave_disable_unused()
2175 cpsw_ale_control_set(common->ale, port->port_id, in am65_cpsw_nuss_slave_disable_unused()
2178 cpsw_sl_reset(port->slave.mac_sl, 100); in am65_cpsw_nuss_slave_disable_unused()
2179 cpsw_sl_ctl_reset(port->slave.mac_sl); in am65_cpsw_nuss_slave_disable_unused()
2187 for (i = 0; i < common->tx_ch_num; i++) { in am65_cpsw_nuss_free_tx_chns()
2188 struct am65_cpsw_tx_chn *tx_chn = &common->tx_chns[i]; in am65_cpsw_nuss_free_tx_chns()
2190 if (!IS_ERR_OR_NULL(tx_chn->desc_pool)) in am65_cpsw_nuss_free_tx_chns()
2191 k3_cppi_desc_pool_destroy(tx_chn->desc_pool); in am65_cpsw_nuss_free_tx_chns()
2193 if (!IS_ERR_OR_NULL(tx_chn->tx_chn)) in am65_cpsw_nuss_free_tx_chns()
2194 k3_udma_glue_release_tx_chn(tx_chn->tx_chn); in am65_cpsw_nuss_free_tx_chns()
2202 struct device *dev = common->dev; in am65_cpsw_nuss_remove_tx_chns()
2205 common->tx_ch_rate_msk = 0; in am65_cpsw_nuss_remove_tx_chns()
2206 for (i = 0; i < common->tx_ch_num; i++) { in am65_cpsw_nuss_remove_tx_chns()
2207 struct am65_cpsw_tx_chn *tx_chn = &common->tx_chns[i]; in am65_cpsw_nuss_remove_tx_chns()
2209 if (tx_chn->irq > 0) in am65_cpsw_nuss_remove_tx_chns()
2210 devm_free_irq(dev, tx_chn->irq, tx_chn); in am65_cpsw_nuss_remove_tx_chns()
2212 netif_napi_del(&tx_chn->napi_tx); in am65_cpsw_nuss_remove_tx_chns()
2220 struct device *dev = common->dev; in am65_cpsw_nuss_ndev_add_tx_napi()
2224 for (i = 0; i < common->tx_ch_num; i++) { in am65_cpsw_nuss_ndev_add_tx_napi()
2225 tx_chn = &common->tx_chns[i]; in am65_cpsw_nuss_ndev_add_tx_napi()
2227 hrtimer_setup(&tx_chn->tx_hrtimer, &am65_cpsw_nuss_tx_timer_callback, in am65_cpsw_nuss_ndev_add_tx_napi()
2230 netif_napi_add_tx(common->dma_ndev, &tx_chn->napi_tx, in am65_cpsw_nuss_ndev_add_tx_napi()
2233 ret = devm_request_irq(dev, tx_chn->irq, in am65_cpsw_nuss_ndev_add_tx_napi()
2236 tx_chn->tx_chn_name, tx_chn); in am65_cpsw_nuss_ndev_add_tx_napi()
2239 tx_chn->id, tx_chn->irq, ret); in am65_cpsw_nuss_ndev_add_tx_napi()
2247 netif_napi_del(&tx_chn->napi_tx); in am65_cpsw_nuss_ndev_add_tx_napi()
2248 for (--i; i >= 0; i--) { in am65_cpsw_nuss_ndev_add_tx_napi()
2249 tx_chn = &common->tx_chns[i]; in am65_cpsw_nuss_ndev_add_tx_napi()
2250 devm_free_irq(dev, tx_chn->irq, tx_chn); in am65_cpsw_nuss_ndev_add_tx_napi()
2251 netif_napi_del(&tx_chn->napi_tx); in am65_cpsw_nuss_ndev_add_tx_napi()
2261 struct device *dev = common->dev; in am65_cpsw_nuss_init_tx_chns()
2264 .mode = K3_RINGACC_RING_MODE_RING, in am65_cpsw_nuss_init_tx_chns()
2279 for (i = 0; i < common->tx_ch_num; i++) { in am65_cpsw_nuss_init_tx_chns()
2280 struct am65_cpsw_tx_chn *tx_chn = &common->tx_chns[i]; in am65_cpsw_nuss_init_tx_chns()
2282 snprintf(tx_chn->tx_chn_name, in am65_cpsw_nuss_init_tx_chns()
2283 sizeof(tx_chn->tx_chn_name), "tx%d", i); in am65_cpsw_nuss_init_tx_chns()
2285 spin_lock_init(&tx_chn->lock); in am65_cpsw_nuss_init_tx_chns()
2286 tx_chn->common = common; in am65_cpsw_nuss_init_tx_chns()
2287 tx_chn->id = i; in am65_cpsw_nuss_init_tx_chns()
2288 tx_chn->descs_num = max_desc_num; in am65_cpsw_nuss_init_tx_chns()
2290 tx_chn->tx_chn = in am65_cpsw_nuss_init_tx_chns()
2292 tx_chn->tx_chn_name, in am65_cpsw_nuss_init_tx_chns()
2294 if (IS_ERR(tx_chn->tx_chn)) { in am65_cpsw_nuss_init_tx_chns()
2295 ret = dev_err_probe(dev, PTR_ERR(tx_chn->tx_chn), in am65_cpsw_nuss_init_tx_chns()
2299 tx_chn->dma_dev = k3_udma_glue_tx_get_dma_device(tx_chn->tx_chn); in am65_cpsw_nuss_init_tx_chns()
2301 tx_chn->desc_pool = k3_cppi_desc_pool_create_name(tx_chn->dma_dev, in am65_cpsw_nuss_init_tx_chns()
2302 tx_chn->descs_num, in am65_cpsw_nuss_init_tx_chns()
2304 tx_chn->tx_chn_name); in am65_cpsw_nuss_init_tx_chns()
2305 if (IS_ERR(tx_chn->desc_pool)) { in am65_cpsw_nuss_init_tx_chns()
2306 ret = PTR_ERR(tx_chn->desc_pool); in am65_cpsw_nuss_init_tx_chns()
2311 hdesc_size_out = k3_cppi_desc_pool_desc_size(tx_chn->desc_pool); in am65_cpsw_nuss_init_tx_chns()
2312 tx_chn->dsize_log2 = __fls(hdesc_size_out); in am65_cpsw_nuss_init_tx_chns()
2313 WARN_ON(hdesc_size_out != (1 << tx_chn->dsize_log2)); in am65_cpsw_nuss_init_tx_chns()
2315 tx_chn->irq = k3_udma_glue_tx_get_irq(tx_chn->tx_chn); in am65_cpsw_nuss_init_tx_chns()
2316 if (tx_chn->irq < 0) { in am65_cpsw_nuss_init_tx_chns()
2318 tx_chn->irq); in am65_cpsw_nuss_init_tx_chns()
2319 ret = tx_chn->irq; in am65_cpsw_nuss_init_tx_chns()
2323 snprintf(tx_chn->tx_chn_name, in am65_cpsw_nuss_init_tx_chns()
2324 sizeof(tx_chn->tx_chn_name), "%s-tx%d", in am65_cpsw_nuss_init_tx_chns()
2325 dev_name(dev), tx_chn->id); in am65_cpsw_nuss_init_tx_chns()
2347 rx_chn = &common->rx_chns; in am65_cpsw_nuss_free_rx_chns()
2349 if (!IS_ERR_OR_NULL(rx_chn->desc_pool)) in am65_cpsw_nuss_free_rx_chns()
2350 k3_cppi_desc_pool_destroy(rx_chn->desc_pool); in am65_cpsw_nuss_free_rx_chns()
2352 if (!IS_ERR_OR_NULL(rx_chn->rx_chn)) in am65_cpsw_nuss_free_rx_chns()
2353 k3_udma_glue_release_rx_chn(rx_chn->rx_chn); in am65_cpsw_nuss_free_rx_chns()
2358 struct device *dev = common->dev; in am65_cpsw_nuss_remove_rx_chns()
2363 rx_chn = &common->rx_chns; in am65_cpsw_nuss_remove_rx_chns()
2364 flows = rx_chn->flows; in am65_cpsw_nuss_remove_rx_chns()
2366 for (i = 0; i < common->rx_ch_num_flows; i++) { in am65_cpsw_nuss_remove_rx_chns()
2374 common->rx_flow_id_base = -1; in am65_cpsw_nuss_remove_rx_chns()
2379 struct am65_cpsw_rx_chn *rx_chn = &common->rx_chns; in am65_cpsw_nuss_init_rx_chns()
2382 struct device *dev = common->dev; in am65_cpsw_nuss_init_rx_chns()
2392 rx_cfg.flow_id_num = common->rx_ch_num_flows; in am65_cpsw_nuss_init_rx_chns()
2393 rx_cfg.flow_id_base = common->rx_flow_id_base; in am65_cpsw_nuss_init_rx_chns()
2396 rx_chn->dev = dev; in am65_cpsw_nuss_init_rx_chns()
2397 rx_chn->descs_num = max_desc_num * rx_cfg.flow_id_num; in am65_cpsw_nuss_init_rx_chns()
2399 for (i = 0; i < common->rx_ch_num_flows; i++) { in am65_cpsw_nuss_init_rx_chns()
2400 flow = &rx_chn->flows[i]; in am65_cpsw_nuss_init_rx_chns()
2401 flow->page_pool = NULL; in am65_cpsw_nuss_init_rx_chns()
2404 rx_chn->rx_chn = k3_udma_glue_request_rx_chn(dev, "rx", &rx_cfg); in am65_cpsw_nuss_init_rx_chns()
2405 if (IS_ERR(rx_chn->rx_chn)) { in am65_cpsw_nuss_init_rx_chns()
2406 ret = dev_err_probe(dev, PTR_ERR(rx_chn->rx_chn), in am65_cpsw_nuss_init_rx_chns()
2410 rx_chn->dma_dev = k3_udma_glue_rx_get_dma_device(rx_chn->rx_chn); in am65_cpsw_nuss_init_rx_chns()
2412 rx_chn->desc_pool = k3_cppi_desc_pool_create_name(rx_chn->dma_dev, in am65_cpsw_nuss_init_rx_chns()
2413 rx_chn->descs_num, in am65_cpsw_nuss_init_rx_chns()
2415 if (IS_ERR(rx_chn->desc_pool)) { in am65_cpsw_nuss_init_rx_chns()
2416 ret = PTR_ERR(rx_chn->desc_pool); in am65_cpsw_nuss_init_rx_chns()
2421 hdesc_size_out = k3_cppi_desc_pool_desc_size(rx_chn->desc_pool); in am65_cpsw_nuss_init_rx_chns()
2422 rx_chn->dsize_log2 = __fls(hdesc_size_out); in am65_cpsw_nuss_init_rx_chns()
2423 WARN_ON(hdesc_size_out != (1 << rx_chn->dsize_log2)); in am65_cpsw_nuss_init_rx_chns()
2425 common->rx_flow_id_base = in am65_cpsw_nuss_init_rx_chns()
2426 k3_udma_glue_rx_get_flow_id_base(rx_chn->rx_chn); in am65_cpsw_nuss_init_rx_chns()
2427 dev_info(dev, "set new flow-id-base %u\n", common->rx_flow_id_base); in am65_cpsw_nuss_init_rx_chns()
2433 .mode = K3_RINGACC_RING_MODE_RING, in am65_cpsw_nuss_init_rx_chns()
2448 flow = &rx_chn->flows[i]; in am65_cpsw_nuss_init_rx_chns()
2449 flow->id = i; in am65_cpsw_nuss_init_rx_chns()
2450 flow->common = common; in am65_cpsw_nuss_init_rx_chns()
2451 flow->irq = -EINVAL; in am65_cpsw_nuss_init_rx_chns()
2457 rx_flow_cfg.rxfdq_cfg.mode = common->pdata.fdqring_mode; in am65_cpsw_nuss_init_rx_chns()
2459 ret = k3_udma_glue_rx_flow_init(rx_chn->rx_chn, in am65_cpsw_nuss_init_rx_chns()
2467 k3_udma_glue_rx_flow_get_fdq_id(rx_chn->rx_chn, in am65_cpsw_nuss_init_rx_chns()
2470 flow->irq = k3_udma_glue_rx_get_irq(rx_chn->rx_chn, i); in am65_cpsw_nuss_init_rx_chns()
2471 if (flow->irq <= 0) { in am65_cpsw_nuss_init_rx_chns()
2473 flow->irq); in am65_cpsw_nuss_init_rx_chns()
2474 ret = flow->irq; in am65_cpsw_nuss_init_rx_chns()
2478 snprintf(flow->name, in am65_cpsw_nuss_init_rx_chns()
2479 sizeof(flow->name), "%s-rx%d", in am65_cpsw_nuss_init_rx_chns()
2481 hrtimer_setup(&flow->rx_hrtimer, &am65_cpsw_nuss_rx_timer_callback, CLOCK_MONOTONIC, in am65_cpsw_nuss_init_rx_chns()
2484 netif_napi_add(common->dma_ndev, &flow->napi_rx, in am65_cpsw_nuss_init_rx_chns()
2487 ret = devm_request_irq(dev, flow->irq, in am65_cpsw_nuss_init_rx_chns()
2490 flow->name, flow); in am65_cpsw_nuss_init_rx_chns()
2493 i, flow->irq, ret); in am65_cpsw_nuss_init_rx_chns()
2494 flow->irq = -EINVAL; in am65_cpsw_nuss_init_rx_chns()
2500 cpsw_ale_classifier_setup_default(common->ale, common->rx_ch_num_flows); in am65_cpsw_nuss_init_rx_chns()
2505 netif_napi_del(&flow->napi_rx); in am65_cpsw_nuss_init_rx_chns()
2508 for (--i; i >= 0; i--) { in am65_cpsw_nuss_init_rx_chns()
2509 flow = &rx_chn->flows[i]; in am65_cpsw_nuss_init_rx_chns()
2510 devm_free_irq(dev, flow->irq, flow); in am65_cpsw_nuss_init_rx_chns()
2511 netif_napi_del(&flow->napi_rx); in am65_cpsw_nuss_init_rx_chns()
2524 host_p->common = common; in am65_cpsw_nuss_init_host_p()
2525 host_p->port_base = common->cpsw_base + AM65_CPSW_NU_PORTS_BASE; in am65_cpsw_nuss_init_host_p()
2526 host_p->stat_base = common->cpsw_base + AM65_CPSW_NU_STATS_BASE; in am65_cpsw_nuss_init_host_p()
2532 int slave, u8 *mac_addr) in am65_cpsw_am654_get_efuse_macid() argument
2537 syscon = syscon_regmap_lookup_by_phandle_args(of_node, "ti,syscon-efuse", in am65_cpsw_am654_get_efuse_macid()
2540 if (PTR_ERR(syscon) == -ENODEV) in am65_cpsw_am654_get_efuse_macid()
2560 struct device *dev = common->dev; in am65_cpsw_init_cpts()
2568 node = of_get_child_by_name(dev->of_node, "cpts"); in am65_cpsw_init_cpts()
2571 return -ENOENT; in am65_cpsw_init_cpts()
2574 reg_base = common->cpsw_base + AM65_CPSW_NU_CPTS_BASE; in am65_cpsw_init_cpts()
2583 common->cpts = cpts; in am65_cpsw_init_cpts()
2585 * K3 CPSWxG modules may completely lose context during ON->OFF in am65_cpsw_init_cpts()
2598 struct device *dev = common->dev; in am65_cpsw_nuss_init_slave_ports()
2601 node = of_get_child_by_name(dev->of_node, "ethernet-ports"); in am65_cpsw_nuss_init_slave_ports()
2603 return -ENOENT; in am65_cpsw_nuss_init_slave_ports()
2610 /* it is not a slave port node, continue */ in am65_cpsw_nuss_init_slave_ports()
2611 if (strcmp(port_np->name, "port")) in am65_cpsw_nuss_init_slave_ports()
2621 if (!port_id || port_id > common->port_num) { in am65_cpsw_nuss_init_slave_ports()
2623 port_np, port_id, port_np->name); in am65_cpsw_nuss_init_slave_ports()
2624 ret = -EINVAL; in am65_cpsw_nuss_init_slave_ports()
2629 port->port_id = port_id; in am65_cpsw_nuss_init_slave_ports()
2630 port->common = common; in am65_cpsw_nuss_init_slave_ports()
2631 port->port_base = common->cpsw_base + AM65_CPSW_NU_PORTS_BASE + in am65_cpsw_nuss_init_slave_ports()
2633 if (common->pdata.extra_modes) in am65_cpsw_nuss_init_slave_ports()
2634 port->sgmii_base = common->ss_base + AM65_CPSW_SGMII_BASE * (port_id); in am65_cpsw_nuss_init_slave_ports()
2635 port->stat_base = common->cpsw_base + AM65_CPSW_NU_STATS_BASE + in am65_cpsw_nuss_init_slave_ports()
2637 port->name = of_get_property(port_np, "label", NULL); in am65_cpsw_nuss_init_slave_ports()
2638 port->fetch_ram_base = in am65_cpsw_nuss_init_slave_ports()
2639 common->cpsw_base + AM65_CPSW_NU_FRAM_BASE + in am65_cpsw_nuss_init_slave_ports()
2640 (AM65_CPSW_NU_FRAM_PORT_OFFSET * (port_id - 1)); in am65_cpsw_nuss_init_slave_ports()
2642 port->slave.mac_sl = cpsw_sl_get("am65", dev, port->port_base); in am65_cpsw_nuss_init_slave_ports()
2643 if (IS_ERR(port->slave.mac_sl)) { in am65_cpsw_nuss_init_slave_ports()
2644 ret = PTR_ERR(port->slave.mac_sl); in am65_cpsw_nuss_init_slave_ports()
2648 port->disabled = !of_device_is_available(port_np); in am65_cpsw_nuss_init_slave_ports()
2649 if (port->disabled) { in am65_cpsw_nuss_init_slave_ports()
2650 common->disabled_ports_mask |= BIT(port->port_id); in am65_cpsw_nuss_init_slave_ports()
2654 port->slave.ifphy = devm_of_phy_get(dev, port_np, NULL); in am65_cpsw_nuss_init_slave_ports()
2655 if (IS_ERR(port->slave.ifphy)) { in am65_cpsw_nuss_init_slave_ports()
2656 ret = PTR_ERR(port->slave.ifphy); in am65_cpsw_nuss_init_slave_ports()
2667 port->slave.mac_only = in am65_cpsw_nuss_init_slave_ports()
2668 of_property_read_bool(port_np, "ti,mac-only"); in am65_cpsw_nuss_init_slave_ports()
2671 port->slave.port_np = of_node_get(port_np); in am65_cpsw_nuss_init_slave_ports()
2674 dev_err(dev, "%pOF read phy-mode err %d\n", in am65_cpsw_nuss_init_slave_ports()
2680 * internal TX delay in RGMII mode. Fix up PHY mode to account in am65_cpsw_nuss_init_slave_ports()
2694 "RGMII mode without internal TX delay unsupported; please fix your Device Tree\n"); in am65_cpsw_nuss_init_slave_ports()
2700 port->slave.phy_if = phy_if; in am65_cpsw_nuss_init_slave_ports()
2701 ret = phy_set_mode_ext(port->slave.ifphy, PHY_MODE_ETHERNET, phy_if); in am65_cpsw_nuss_init_slave_ports()
2705 ret = of_get_mac_address(port_np, port->slave.mac_addr); in am65_cpsw_nuss_init_slave_ports()
2706 if (ret == -EPROBE_DEFER) { in am65_cpsw_nuss_init_slave_ports()
2710 port->port_id, in am65_cpsw_nuss_init_slave_ports()
2711 port->slave.mac_addr); in am65_cpsw_nuss_init_slave_ports()
2712 if (!is_valid_ether_addr(port->slave.mac_addr)) { in am65_cpsw_nuss_init_slave_ports()
2713 eth_random_addr(port->slave.mac_addr); in am65_cpsw_nuss_init_slave_ports()
2719 writel(0, port->port_base + AM65_CPSW_PN_REG_TX_PRI_MAP); in am65_cpsw_nuss_init_slave_ports()
2724 if (!(~common->disabled_ports_mask & GENMASK(common->port_num, 1))) { in am65_cpsw_nuss_init_slave_ports()
2726 return -ENODEV; in am65_cpsw_nuss_init_slave_ports()
2742 for (i = 0; i < common->port_num; i++) { in am65_cpsw_nuss_phylink_cleanup()
2743 port = &common->ports[i]; in am65_cpsw_nuss_phylink_cleanup()
2744 if (port->slave.phylink) in am65_cpsw_nuss_phylink_cleanup()
2745 phylink_destroy(port->slave.phylink); in am65_cpsw_nuss_phylink_cleanup()
2754 for (i = 0; i < common->port_num; i++) { in am65_cpsw_remove_dt()
2755 port = &common->ports[i]; in am65_cpsw_remove_dt()
2756 of_node_put(port->slave.port_np); in am65_cpsw_remove_dt()
2764 struct device *dev = common->dev; in am65_cpsw_nuss_init_port_ndev()
2768 port = &common->ports[port_idx]; in am65_cpsw_nuss_init_port_ndev()
2770 if (port->disabled) in am65_cpsw_nuss_init_port_ndev()
2774 port->ndev = alloc_etherdev_mqs(sizeof(struct am65_cpsw_ndev_priv), in am65_cpsw_nuss_init_port_ndev()
2777 if (!port->ndev) { in am65_cpsw_nuss_init_port_ndev()
2778 dev_err(dev, "error allocating slave net_device %u\n", in am65_cpsw_nuss_init_port_ndev()
2779 port->port_id); in am65_cpsw_nuss_init_port_ndev()
2780 return -ENOMEM; in am65_cpsw_nuss_init_port_ndev()
2783 ndev_priv = netdev_priv(port->ndev); in am65_cpsw_nuss_init_port_ndev()
2784 ndev_priv->port = port; in am65_cpsw_nuss_init_port_ndev()
2785 ndev_priv->msg_enable = AM65_CPSW_DEBUG; in am65_cpsw_nuss_init_port_ndev()
2786 mutex_init(&ndev_priv->mm_lock); in am65_cpsw_nuss_init_port_ndev()
2787 port->qos.link_speed = SPEED_UNKNOWN; in am65_cpsw_nuss_init_port_ndev()
2788 SET_NETDEV_DEV(port->ndev, dev); in am65_cpsw_nuss_init_port_ndev()
2789 device_set_node(&port->ndev->dev, of_fwnode_handle(port->slave.port_np)); in am65_cpsw_nuss_init_port_ndev()
2791 eth_hw_addr_set(port->ndev, port->slave.mac_addr); in am65_cpsw_nuss_init_port_ndev()
2793 port->ndev->min_mtu = AM65_CPSW_MIN_PACKET_SIZE; in am65_cpsw_nuss_init_port_ndev()
2794 port->ndev->max_mtu = AM65_CPSW_MAX_PACKET_SIZE - in am65_cpsw_nuss_init_port_ndev()
2796 port->ndev->hw_features = NETIF_F_SG | in am65_cpsw_nuss_init_port_ndev()
2800 port->ndev->features = port->ndev->hw_features | in am65_cpsw_nuss_init_port_ndev()
2802 port->ndev->xdp_features = NETDEV_XDP_ACT_BASIC | in am65_cpsw_nuss_init_port_ndev()
2805 port->ndev->vlan_features |= NETIF_F_SG; in am65_cpsw_nuss_init_port_ndev()
2806 port->ndev->netdev_ops = &am65_cpsw_nuss_netdev_ops; in am65_cpsw_nuss_init_port_ndev()
2807 port->ndev->ethtool_ops = &am65_cpsw_ethtool_ops_slave; in am65_cpsw_nuss_init_port_ndev()
2810 port->slave.phylink_config.dev = &port->ndev->dev; in am65_cpsw_nuss_init_port_ndev()
2811 port->slave.phylink_config.type = PHYLINK_NETDEV; in am65_cpsw_nuss_init_port_ndev()
2812 port->slave.phylink_config.mac_capabilities = MAC_SYM_PAUSE | MAC_10 | MAC_100 | in am65_cpsw_nuss_init_port_ndev()
2814 port->slave.phylink_config.mac_managed_pm = true; /* MAC does PM */ in am65_cpsw_nuss_init_port_ndev()
2816 switch (port->slave.phy_if) { in am65_cpsw_nuss_init_port_ndev()
2821 phy_interface_set_rgmii(port->slave.phylink_config.supported_interfaces); in am65_cpsw_nuss_init_port_ndev()
2826 port->slave.phylink_config.supported_interfaces); in am65_cpsw_nuss_init_port_ndev()
2832 if (common->pdata.extra_modes & BIT(port->slave.phy_if)) { in am65_cpsw_nuss_init_port_ndev()
2833 __set_bit(port->slave.phy_if, in am65_cpsw_nuss_init_port_ndev()
2834 port->slave.phylink_config.supported_interfaces); in am65_cpsw_nuss_init_port_ndev()
2836 dev_err(dev, "selected phy-mode is not supported\n"); in am65_cpsw_nuss_init_port_ndev()
2837 return -EOPNOTSUPP; in am65_cpsw_nuss_init_port_ndev()
2842 dev_err(dev, "selected phy-mode is not supported\n"); in am65_cpsw_nuss_init_port_ndev()
2843 return -EOPNOTSUPP; in am65_cpsw_nuss_init_port_ndev()
2846 phylink = phylink_create(&port->slave.phylink_config, in am65_cpsw_nuss_init_port_ndev()
2847 of_fwnode_handle(port->slave.port_np), in am65_cpsw_nuss_init_port_ndev()
2848 port->slave.phy_if, in am65_cpsw_nuss_init_port_ndev()
2853 port->slave.phylink = phylink; in am65_cpsw_nuss_init_port_ndev()
2856 if (common->pdata.quirks & AM65_CPSW_QUIRK_I2027_NO_TX_CSUM) in am65_cpsw_nuss_init_port_ndev()
2857 port->ndev->features &= ~NETIF_F_HW_CSUM; in am65_cpsw_nuss_init_port_ndev()
2859 port->ndev->pcpu_stat_type = NETDEV_PCPU_STAT_TSTATS; in am65_cpsw_nuss_init_port_ndev()
2860 port->xdp_prog = NULL; in am65_cpsw_nuss_init_port_ndev()
2862 if (!common->dma_ndev) in am65_cpsw_nuss_init_port_ndev()
2863 common->dma_ndev = port->ndev; in am65_cpsw_nuss_init_port_ndev()
2873 for (i = 0; i < common->port_num; i++) { in am65_cpsw_nuss_init_ndevs()
2887 for (i = 0; i < common->port_num; i++) { in am65_cpsw_nuss_cleanup_ndev()
2888 port = &common->ports[i]; in am65_cpsw_nuss_cleanup_ndev()
2889 if (!port->ndev) in am65_cpsw_nuss_cleanup_ndev()
2891 if (port->ndev->reg_state == NETREG_REGISTERED) in am65_cpsw_nuss_cleanup_ndev()
2892 unregister_netdev(port->ndev); in am65_cpsw_nuss_cleanup_ndev()
2893 free_netdev(port->ndev); in am65_cpsw_nuss_cleanup_ndev()
2894 port->ndev = NULL; in am65_cpsw_nuss_cleanup_ndev()
2903 if (common->br_members == (GENMASK(common->port_num, 1) & ~common->disabled_ports_mask)) in am65_cpsw_port_offload_fwd_mark_update()
2906 dev_dbg(common->dev, "set offload_fwd_mark %d\n", set_val); in am65_cpsw_port_offload_fwd_mark_update()
2908 for (i = 1; i <= common->port_num; i++) { in am65_cpsw_port_offload_fwd_mark_update()
2912 if (!port->ndev) in am65_cpsw_port_offload_fwd_mark_update()
2915 priv = am65_ndev_to_priv(port->ndev); in am65_cpsw_port_offload_fwd_mark_update()
2916 priv->offload_fwd_mark = set_val; in am65_cpsw_port_offload_fwd_mark_update()
2922 if (ndev->netdev_ops == &am65_cpsw_nuss_netdev_ops) { in am65_cpsw_port_dev_check()
2925 return !common->is_emac_mode; in am65_cpsw_port_dev_check()
2939 if (!common->br_members) { in am65_cpsw_netdevice_port_link()
2940 common->hw_bridge_dev = br_ndev; in am65_cpsw_netdevice_port_link()
2945 if (common->hw_bridge_dev != br_ndev) in am65_cpsw_netdevice_port_link()
2946 return -EOPNOTSUPP; in am65_cpsw_netdevice_port_link()
2954 common->br_members |= BIT(priv->port->port_id); in am65_cpsw_netdevice_port_link()
2968 common->br_members &= ~BIT(priv->port->port_id); in am65_cpsw_netdevice_port_unlink()
2972 if (!common->br_members) in am65_cpsw_netdevice_port_unlink()
2973 common->hw_bridge_dev = NULL; in am65_cpsw_netdevice_port_unlink()
2992 if (netif_is_bridge_master(info->upper_dev)) { in am65_cpsw_netdevice_event()
2993 if (info->linking) in am65_cpsw_netdevice_event()
2995 info->upper_dev, in am65_cpsw_netdevice_event()
3016 cpsw->am65_cpsw_netdevice_nb.notifier_call = &am65_cpsw_netdevice_event; in am65_cpsw_register_notifiers()
3017 ret = register_netdevice_notifier(&cpsw->am65_cpsw_netdevice_nb); in am65_cpsw_register_notifiers()
3019 dev_err(cpsw->dev, "can't register netdevice notifier\n"); in am65_cpsw_register_notifiers()
3025 unregister_netdevice_notifier(&cpsw->am65_cpsw_netdevice_nb); in am65_cpsw_register_notifiers()
3037 unregister_netdevice_notifier(&cpsw->am65_cpsw_netdevice_nb); in am65_cpsw_unregister_notifiers()
3044 cpsw_ale_add_mcast(cpsw->ale, eth_stp_addr, ALE_PORT_HOST, ALE_SUPER, 0, in am65_cpsw_init_stp_ale_entry()
3052 writel(common->default_vlan, host->port_base + AM65_CPSW_PORT_VLAN_REG_OFFSET); in am65_cpsw_init_host_port_switch()
3056 cpsw_ale_control_set(common->ale, HOST_PORT_NUM, ALE_P0_UNI_FLOOD, 1); in am65_cpsw_init_host_port_switch()
3057 dev_dbg(common->dev, "Set P0_UNI_FLOOD\n"); in am65_cpsw_init_host_port_switch()
3058 cpsw_ale_control_set(common->ale, HOST_PORT_NUM, ALE_PORT_NOLEARN, 0); in am65_cpsw_init_host_port_switch()
3065 writel(0, host->port_base + AM65_CPSW_PORT_VLAN_REG_OFFSET); in am65_cpsw_init_host_port_emac()
3067 cpsw_ale_control_set(common->ale, HOST_PORT_NUM, ALE_P0_UNI_FLOOD, 0); in am65_cpsw_init_host_port_emac()
3068 dev_dbg(common->dev, "unset P0_UNI_FLOOD\n"); in am65_cpsw_init_host_port_emac()
3070 /* learning make no sense in multi-mac mode */ in am65_cpsw_init_host_port_emac()
3071 cpsw_ale_control_set(common->ale, HOST_PORT_NUM, ALE_PORT_NOLEARN, 1); in am65_cpsw_init_host_port_emac()
3078 struct am65_cpsw_common *common = dl_priv->common; in am65_cpsw_dl_switch_mode_get()
3080 dev_dbg(common->dev, "%s id:%u\n", __func__, id); in am65_cpsw_dl_switch_mode_get()
3083 return -EOPNOTSUPP; in am65_cpsw_dl_switch_mode_get()
3085 ctx->val.vbool = !common->is_emac_mode; in am65_cpsw_dl_switch_mode_get()
3092 struct am65_cpsw_slave_data *slave = &port->slave; in am65_cpsw_init_port_emac_ale() local
3093 struct am65_cpsw_common *common = port->common; in am65_cpsw_init_port_emac_ale()
3096 writel(slave->port_vlan, port->port_base + AM65_CPSW_PORT_VLAN_REG_OFFSET); in am65_cpsw_init_port_emac_ale()
3098 if (slave->mac_only) in am65_cpsw_init_port_emac_ale()
3099 /* enable mac-only mode on port */ in am65_cpsw_init_port_emac_ale()
3100 cpsw_ale_control_set(common->ale, port->port_id, in am65_cpsw_init_port_emac_ale()
3103 cpsw_ale_control_set(common->ale, port->port_id, ALE_PORT_NOLEARN, 1); in am65_cpsw_init_port_emac_ale()
3105 port_mask = BIT(port->port_id) | ALE_PORT_HOST; in am65_cpsw_init_port_emac_ale()
3107 cpsw_ale_add_ucast(common->ale, port->ndev->dev_addr, in am65_cpsw_init_port_emac_ale()
3108 HOST_PORT_NUM, ALE_SECURE, slave->port_vlan); in am65_cpsw_init_port_emac_ale()
3109 cpsw_ale_add_mcast(common->ale, port->ndev->broadcast, in am65_cpsw_init_port_emac_ale()
3110 port_mask, ALE_VLAN, slave->port_vlan, ALE_MCAST_FWD_2); in am65_cpsw_init_port_emac_ale()
3115 struct am65_cpsw_slave_data *slave = &port->slave; in am65_cpsw_init_port_switch_ale() local
3116 struct am65_cpsw_common *cpsw = port->common; in am65_cpsw_init_port_switch_ale()
3119 cpsw_ale_control_set(cpsw->ale, port->port_id, in am65_cpsw_init_port_switch_ale()
3122 cpsw_ale_add_ucast(cpsw->ale, port->ndev->dev_addr, in am65_cpsw_init_port_switch_ale()
3124 slave->port_vlan); in am65_cpsw_init_port_switch_ale()
3126 port_mask = BIT(port->port_id) | ALE_PORT_HOST; in am65_cpsw_init_port_switch_ale()
3128 cpsw_ale_add_mcast(cpsw->ale, port->ndev->broadcast, in am65_cpsw_init_port_switch_ale()
3129 port_mask, ALE_VLAN, slave->port_vlan, in am65_cpsw_init_port_switch_ale()
3132 writel(slave->port_vlan, port->port_base + AM65_CPSW_PORT_VLAN_REG_OFFSET); in am65_cpsw_init_port_switch_ale()
3134 cpsw_ale_control_set(cpsw->ale, port->port_id, in am65_cpsw_init_port_switch_ale()
3143 struct am65_cpsw_common *cpsw = dl_priv->common; in am65_cpsw_dl_switch_mode_set()
3144 bool switch_en = ctx->val.vbool; in am65_cpsw_dl_switch_mode_set()
3148 dev_dbg(cpsw->dev, "%s id:%u\n", __func__, id); in am65_cpsw_dl_switch_mode_set()
3151 return -EOPNOTSUPP; in am65_cpsw_dl_switch_mode_set()
3153 if (switch_en == !cpsw->is_emac_mode) in am65_cpsw_dl_switch_mode_set()
3156 if (!switch_en && cpsw->br_members) { in am65_cpsw_dl_switch_mode_set()
3157 dev_err(cpsw->dev, "Remove ports from bridge before disabling switch mode\n"); in am65_cpsw_dl_switch_mode_set()
3158 return -EINVAL; in am65_cpsw_dl_switch_mode_set()
3163 cpsw->is_emac_mode = !switch_en; in am65_cpsw_dl_switch_mode_set()
3165 for (i = 0; i < cpsw->port_num; i++) { in am65_cpsw_dl_switch_mode_set()
3166 struct net_device *sl_ndev = cpsw->ports[i].ndev; in am65_cpsw_dl_switch_mode_set()
3176 for (i = 0; i < cpsw->port_num; i++) { in am65_cpsw_dl_switch_mode_set()
3177 struct net_device *sl_ndev = cpsw->ports[i].ndev; in am65_cpsw_dl_switch_mode_set()
3178 struct am65_cpsw_slave_data *slave; in am65_cpsw_dl_switch_mode_set() local
3183 slave = am65_ndev_to_slave(sl_ndev); in am65_cpsw_dl_switch_mode_set()
3185 slave->port_vlan = cpsw->default_vlan; in am65_cpsw_dl_switch_mode_set()
3187 slave->port_vlan = 0; in am65_cpsw_dl_switch_mode_set()
3193 cpsw_ale_control_set(cpsw->ale, 0, ALE_BYPASS, 1); in am65_cpsw_dl_switch_mode_set()
3195 cpsw_ale_control_set(cpsw->ale, HOST_PORT_NUM, ALE_CLEAR, 1); in am65_cpsw_dl_switch_mode_set()
3196 cpsw_ale_control_get(cpsw->ale, HOST_PORT_NUM, ALE_AGEOUT); in am65_cpsw_dl_switch_mode_set()
3199 dev_info(cpsw->dev, "Enable switch mode\n"); in am65_cpsw_dl_switch_mode_set()
3203 for (i = 0; i < cpsw->port_num; i++) { in am65_cpsw_dl_switch_mode_set()
3204 struct net_device *sl_ndev = cpsw->ports[i].ndev; in am65_cpsw_dl_switch_mode_set()
3205 struct am65_cpsw_slave_data *slave; in am65_cpsw_dl_switch_mode_set() local
3212 slave = am65_ndev_to_slave(sl_ndev); in am65_cpsw_dl_switch_mode_set()
3213 slave->port_vlan = cpsw->default_vlan; in am65_cpsw_dl_switch_mode_set()
3220 dev_info(cpsw->dev, "Disable switch mode\n"); in am65_cpsw_dl_switch_mode_set()
3224 for (i = 0; i < cpsw->port_num; i++) { in am65_cpsw_dl_switch_mode_set()
3225 struct net_device *sl_ndev = cpsw->ports[i].ndev; in am65_cpsw_dl_switch_mode_set()
3232 port->slave.port_vlan = 0; in am65_cpsw_dl_switch_mode_set()
3237 cpsw_ale_control_set(cpsw->ale, HOST_PORT_NUM, ALE_BYPASS, 0); in am65_cpsw_dl_switch_mode_set()
3256 struct device *dev = common->dev; in am65_cpsw_nuss_register_devlink()
3262 common->devlink = in am65_cpsw_nuss_register_devlink()
3264 if (!common->devlink) in am65_cpsw_nuss_register_devlink()
3265 return -ENOMEM; in am65_cpsw_nuss_register_devlink()
3267 dl_priv = devlink_priv(common->devlink); in am65_cpsw_nuss_register_devlink()
3268 dl_priv->common = common; in am65_cpsw_nuss_register_devlink()
3270 /* Provide devlink hook to switch mode when multiple external ports in am65_cpsw_nuss_register_devlink()
3275 ret = devlink_params_register(common->devlink, in am65_cpsw_nuss_register_devlink()
3284 for (i = 1; i <= common->port_num; i++) { in am65_cpsw_nuss_register_devlink()
3286 dl_port = &port->devlink_port; in am65_cpsw_nuss_register_devlink()
3288 if (port->ndev) in am65_cpsw_nuss_register_devlink()
3292 attrs.phys.port_number = port->port_id; in am65_cpsw_nuss_register_devlink()
3294 memcpy(attrs.switch_id.id, common->switch_id, attrs.switch_id.id_len); in am65_cpsw_nuss_register_devlink()
3297 ret = devlink_port_register(common->devlink, dl_port, port->port_id); in am65_cpsw_nuss_register_devlink()
3300 port->port_id, ret); in am65_cpsw_nuss_register_devlink()
3304 devlink_register(common->devlink); in am65_cpsw_nuss_register_devlink()
3308 for (i = i - 1; i >= 1; i--) { in am65_cpsw_nuss_register_devlink()
3310 dl_port = &port->devlink_port; in am65_cpsw_nuss_register_devlink()
3315 devlink_free(common->devlink); in am65_cpsw_nuss_register_devlink()
3325 devlink_unregister(common->devlink); in am65_cpsw_unregister_devlink()
3327 for (i = 1; i <= common->port_num; i++) { in am65_cpsw_unregister_devlink()
3329 dl_port = &port->devlink_port; in am65_cpsw_unregister_devlink()
3336 devlink_params_unregister(common->devlink, in am65_cpsw_unregister_devlink()
3340 devlink_free(common->devlink); in am65_cpsw_unregister_devlink()
3345 struct am65_cpsw_rx_chn *rx_chan = &common->rx_chns; in am65_cpsw_nuss_register_ndevs()
3346 struct am65_cpsw_tx_chn *tx_chan = common->tx_chns; in am65_cpsw_nuss_register_ndevs()
3347 struct device *dev = common->dev; in am65_cpsw_nuss_register_ndevs()
3363 for (i = 0; i < common->tx_ch_num; i++) { in am65_cpsw_nuss_register_ndevs()
3369 for (i = 0; i < common->rx_ch_num_flows; i++) in am65_cpsw_nuss_register_ndevs()
3370 k3_udma_glue_reset_rx_chn(rx_chan->rx_chn, i, in am65_cpsw_nuss_register_ndevs()
3374 k3_udma_glue_disable_rx_chn(rx_chan->rx_chn); in am65_cpsw_nuss_register_ndevs()
3380 for (i = 0; i < common->port_num; i++) { in am65_cpsw_nuss_register_ndevs()
3381 port = &common->ports[i]; in am65_cpsw_nuss_register_ndevs()
3383 if (!port->ndev) in am65_cpsw_nuss_register_ndevs()
3386 SET_NETDEV_DEVLINK_PORT(port->ndev, &port->devlink_port); in am65_cpsw_nuss_register_ndevs()
3388 ret = register_netdev(port->ndev); in am65_cpsw_nuss_register_ndevs()
3390 dev_err(dev, "error registering slave net device%i %d\n", in am65_cpsw_nuss_register_ndevs()
3425 common->tx_ch_num = num_tx; in am65_cpsw_nuss_update_tx_rx_chns()
3426 common->rx_ch_num_flows = num_rx; in am65_cpsw_nuss_update_tx_rx_chns()
3456 .ale_dev_id = "am65x-cpsw2g",
3462 .ale_dev_id = "am65x-cpsw2g",
3468 .ale_dev_id = "am64-cpswxg",
3474 .ale_dev_id = "am64-cpswxg",
3482 .ale_dev_id = "am64-cpswxg",
3489 .ale_dev_id = "am64-cpswxg",
3496 { .compatible = "ti,am654-cpsw-nuss", .data = &am65x_sr1_0},
3497 { .compatible = "ti,j721e-cpsw-nuss", .data = &j721e_pdata},
3498 { .compatible = "ti,am642-cpsw-nuss", .data = &am64x_cpswxg_pdata},
3499 { .compatible = "ti,j7200-cpswxg-nuss", .data = &j7200_cpswxg_pdata},
3500 { .compatible = "ti,j721e-cpswxg-nuss", .data = &j721e_cpswxg_pdata},
3501 { .compatible = "ti,j784s4-cpswxg-nuss", .data = &j784s4_cpswxg_pdata},
3511 if (soc && soc->data) { in am65_cpsw_nuss_apply_socinfo()
3512 const struct am65_cpsw_soc_pdata *socdata = soc->data; in am65_cpsw_nuss_apply_socinfo()
3515 common->pdata.quirks &= ~socdata->quirks_dis; in am65_cpsw_nuss_apply_socinfo()
3523 struct device *dev = &pdev->dev; in am65_cpsw_nuss_probe()
3538 return -ENOMEM; in am65_cpsw_nuss_probe()
3539 common->dev = dev; in am65_cpsw_nuss_probe()
3543 return -EINVAL; in am65_cpsw_nuss_probe()
3544 common->pdata = *(const struct am65_cpsw_pdata *)of_id->data; in am65_cpsw_nuss_probe()
3549 common->ss_base = devm_ioremap_resource(&pdev->dev, res); in am65_cpsw_nuss_probe()
3550 if (IS_ERR(common->ss_base)) in am65_cpsw_nuss_probe()
3551 return PTR_ERR(common->ss_base); in am65_cpsw_nuss_probe()
3552 common->cpsw_base = common->ss_base + AM65_CPSW_CPSW_NU_BASE; in am65_cpsw_nuss_probe()
3554 id_temp = cpu_to_be64(res->start); in am65_cpsw_nuss_probe()
3555 memcpy(common->switch_id, &id_temp, sizeof(res->start)); in am65_cpsw_nuss_probe()
3557 node = of_get_child_by_name(dev->of_node, "ethernet-ports"); in am65_cpsw_nuss_probe()
3559 return -ENOENT; in am65_cpsw_nuss_probe()
3560 common->port_num = of_get_child_count(node); in am65_cpsw_nuss_probe()
3562 if (common->port_num < 1 || common->port_num > AM65_CPSW_MAX_PORTS) in am65_cpsw_nuss_probe()
3563 return -ENOENT; in am65_cpsw_nuss_probe()
3565 common->rx_flow_id_base = -1; in am65_cpsw_nuss_probe()
3566 init_completion(&common->tdown_complete); in am65_cpsw_nuss_probe()
3567 common->tx_ch_num = AM65_CPSW_DEFAULT_TX_CHNS; in am65_cpsw_nuss_probe()
3568 common->rx_ch_num_flows = AM65_CPSW_DEFAULT_RX_CHN_FLOWS; in am65_cpsw_nuss_probe()
3569 common->pf_p0_rx_ptype_rrobin = true; in am65_cpsw_nuss_probe()
3570 common->default_vlan = 1; in am65_cpsw_nuss_probe()
3572 common->ports = devm_kcalloc(dev, common->port_num, in am65_cpsw_nuss_probe()
3573 sizeof(*common->ports), in am65_cpsw_nuss_probe()
3575 if (!common->ports) in am65_cpsw_nuss_probe()
3576 return -ENOMEM; in am65_cpsw_nuss_probe()
3581 common->bus_freq = clk_get_rate(clk); in am65_cpsw_nuss_probe()
3600 node = of_get_child_by_name(dev->of_node, "mdio"); in am65_cpsw_nuss_probe()
3608 ret = -ENODEV; in am65_cpsw_nuss_probe()
3612 common->mdio_dev = &mdio_pdev->dev; in am65_cpsw_nuss_probe()
3619 ale_params.ale_ports = common->port_num + 1; in am65_cpsw_nuss_probe()
3620 ale_params.ale_regs = common->cpsw_base + AM65_CPSW_NU_ALE_BASE; in am65_cpsw_nuss_probe()
3621 ale_params.dev_id = common->pdata.ale_dev_id; in am65_cpsw_nuss_probe()
3622 ale_params.bus_freq = common->bus_freq; in am65_cpsw_nuss_probe()
3624 common->ale = cpsw_ale_create(&ale_params); in am65_cpsw_nuss_probe()
3625 if (IS_ERR(common->ale)) { in am65_cpsw_nuss_probe()
3627 ret = PTR_ERR(common->ale); in am65_cpsw_nuss_probe()
3631 ale_entries = common->ale->params.ale_entries; in am65_cpsw_nuss_probe()
3632 common->ale_context = devm_kzalloc(dev, in am65_cpsw_nuss_probe()
3640 for (i = 0; i < common->port_num; i++) in am65_cpsw_nuss_probe()
3641 am65_cpsw_nuss_slave_disable_unused(&common->ports[i]); in am65_cpsw_nuss_probe()
3645 common->is_emac_mode = true; in am65_cpsw_nuss_probe()
3661 am65_cpts_release(common->cpts); in am65_cpsw_nuss_probe()
3664 if (common->mdio_dev) in am65_cpsw_nuss_probe()
3665 of_platform_device_destroy(common->mdio_dev, NULL); in am65_cpsw_nuss_probe()
3674 struct device *dev = &pdev->dev; in am65_cpsw_nuss_remove()
3680 ret = pm_runtime_resume_and_get(&pdev->dev); in am65_cpsw_nuss_remove()
3685 dev_err(&pdev->dev, "Failed to resume device (%pe)\n", in am65_cpsw_nuss_remove()
3700 am65_cpts_release(common->cpts); in am65_cpsw_nuss_remove()
3704 if (common->mdio_dev) in am65_cpsw_nuss_remove()
3705 of_platform_device_destroy(common->mdio_dev, NULL); in am65_cpsw_nuss_remove()
3707 pm_runtime_put_sync(&pdev->dev); in am65_cpsw_nuss_remove()
3708 pm_runtime_disable(&pdev->dev); in am65_cpsw_nuss_remove()
3719 cpsw_ale_dump(common->ale, common->ale_context); in am65_cpsw_nuss_suspend()
3720 host_p->vid_context = readl(host_p->port_base + AM65_CPSW_PORT_VLAN_REG_OFFSET); in am65_cpsw_nuss_suspend()
3721 for (i = 0; i < common->port_num; i++) { in am65_cpsw_nuss_suspend()
3722 port = &common->ports[i]; in am65_cpsw_nuss_suspend()
3723 ndev = port->ndev; in am65_cpsw_nuss_suspend()
3728 port->vid_context = readl(port->port_base + AM65_CPSW_PORT_VLAN_REG_OFFSET); in am65_cpsw_nuss_suspend()
3741 am65_cpts_suspend(common->cpts); in am65_cpsw_nuss_suspend()
3767 for (i = 0; i < common->rx_ch_num_flows; i++) { in am65_cpsw_nuss_resume()
3768 if (common->rx_chns.flows[i].irq_disabled) in am65_cpsw_nuss_resume()
3769 disable_irq(common->rx_chns.flows[i].irq); in am65_cpsw_nuss_resume()
3772 am65_cpts_resume(common->cpts); in am65_cpsw_nuss_resume()
3774 for (i = 0; i < common->port_num; i++) { in am65_cpsw_nuss_resume()
3775 port = &common->ports[i]; in am65_cpsw_nuss_resume()
3776 ndev = port->ndev; in am65_cpsw_nuss_resume()
3792 writel(port->vid_context, port->port_base + AM65_CPSW_PORT_VLAN_REG_OFFSET); in am65_cpsw_nuss_resume()
3795 writel(host_p->vid_context, host_p->port_base + AM65_CPSW_PORT_VLAN_REG_OFFSET); in am65_cpsw_nuss_resume()
3796 cpsw_ale_restore(common->ale, common->ale_context); in am65_cpsw_nuss_resume()