Lines Matching full:emac
44 void prueth_cleanup_rx_chns(struct prueth_emac *emac, in prueth_cleanup_rx_chns() argument
61 void prueth_cleanup_tx_chns(struct prueth_emac *emac) in prueth_cleanup_tx_chns() argument
65 for (i = 0; i < emac->tx_ch_num; i++) { in prueth_cleanup_tx_chns()
66 struct prueth_tx_chn *tx_chn = &emac->tx_chns[i]; in prueth_cleanup_tx_chns()
82 void prueth_ndev_del_tx_napi(struct prueth_emac *emac, int num) in prueth_ndev_del_tx_napi() argument
87 struct prueth_tx_chn *tx_chn = &emac->tx_chns[i]; in prueth_ndev_del_tx_napi()
143 int emac_tx_complete_packets(struct prueth_emac *emac, int chn, in emac_tx_complete_packets() argument
146 struct net_device *ndev = emac->ndev; in emac_tx_complete_packets()
157 tx_chn = &emac->tx_chns[chn]; in emac_tx_complete_packets()
166 if (atomic_dec_and_test(&emac->tdown_cnt)) in emac_tx_complete_packets()
167 complete(&emac->tdown_complete); in emac_tx_complete_packets()
232 struct prueth_emac *emac = tx_chn->emac; in emac_napi_tx_poll() local
236 num_tx_packets = emac_tx_complete_packets(emac, tx_chn->id, budget, in emac_napi_tx_poll()
265 int prueth_ndev_add_tx_napi(struct prueth_emac *emac) in prueth_ndev_add_tx_napi() argument
267 struct prueth *prueth = emac->prueth; in prueth_ndev_add_tx_napi()
270 for (i = 0; i < emac->tx_ch_num; i++) { in prueth_ndev_add_tx_napi()
271 struct prueth_tx_chn *tx_chn = &emac->tx_chns[i]; in prueth_ndev_add_tx_napi()
273 netif_napi_add_tx(emac->ndev, &tx_chn->napi_tx, emac_napi_tx_poll); in prueth_ndev_add_tx_napi()
289 prueth_ndev_del_tx_napi(emac, i); in prueth_ndev_add_tx_napi()
294 int prueth_init_tx_chns(struct prueth_emac *emac) in prueth_init_tx_chns() argument
303 struct device *dev = emac->prueth->dev; in prueth_init_tx_chns()
304 struct net_device *ndev = emac->ndev; in prueth_init_tx_chns()
308 slice = prueth_emac_slice(emac); in prueth_init_tx_chns()
312 init_completion(&emac->tdown_complete); in prueth_init_tx_chns()
321 for (i = 0; i < emac->tx_ch_num; i++) { in prueth_init_tx_chns()
322 struct prueth_tx_chn *tx_chn = &emac->tx_chns[i]; in prueth_init_tx_chns()
328 tx_chn->emac = emac; in prueth_init_tx_chns()
370 prueth_cleanup_tx_chns(emac); in prueth_init_tx_chns()
375 int prueth_init_rx_chns(struct prueth_emac *emac, in prueth_init_rx_chns() argument
381 struct device *dev = emac->prueth->dev; in prueth_init_rx_chns()
382 struct net_device *ndev = emac->ndev; in prueth_init_rx_chns()
387 slice = prueth_emac_slice(emac); in prueth_init_rx_chns()
427 if (emac->is_sr1 && !strcmp(name, "rxmgm")) { in prueth_init_rx_chns()
428 emac->rx_mgm_flow_id_base = flow_id_base; in prueth_init_rx_chns()
431 emac->rx_flow_id_base = flow_id_base; in prueth_init_rx_chns()
457 rx_flow_cfg.rxfdq_cfg.mode = emac->prueth->pdata.fdqring_mode; in prueth_init_rx_chns()
480 prueth_cleanup_rx_chns(emac, rx_chn, max_rflows); in prueth_init_rx_chns()
485 int prueth_dma_rx_push_mapped(struct prueth_emac *emac, in prueth_dma_rx_push_mapped() argument
489 struct net_device *ndev = emac->ndev; in prueth_dma_rx_push_mapped()
533 void emac_rx_timestamp(struct prueth_emac *emac, in emac_rx_timestamp() argument
539 if (emac->is_sr1) { in emac_rx_timestamp()
542 u32 hi_sw = readl(emac->prueth->shram.va + in emac_rx_timestamp()
555 * @emac: emac device
562 u32 emac_xmit_xdp_frame(struct prueth_emac *emac, in emac_xmit_xdp_frame() argument
568 struct net_device *ndev = emac->ndev; in emac_xmit_xdp_frame()
581 tx_chn = &emac->tx_chns[q_idx]; in emac_xmit_xdp_frame()
611 cppi5_desc_set_tags_ids(&first_desc->hdr, 0, (emac->port_id | (q_idx << 8))); in emac_xmit_xdp_frame()
647 * @emac: emac device
654 static u32 emac_run_xdp(struct prueth_emac *emac, struct xdp_buff *xdp, in emac_run_xdp() argument
657 struct net_device *ndev = emac->ndev; in emac_run_xdp()
666 xdp_prog = READ_ONCE(emac->xdp_prog); in emac_run_xdp()
679 q_idx = cpu % emac->tx_ch_num; in emac_run_xdp()
682 result = emac_xmit_xdp_frame(emac, xdpf, page, q_idx); in emac_run_xdp()
692 err = xdp_do_redirect(emac->ndev, xdp, xdp_prog); in emac_run_xdp()
699 bpf_warn_invalid_xdp_action(emac->ndev, xdp_prog, act); in emac_run_xdp()
703 trace_xdp_exception(emac->ndev, xdp_prog, act); in emac_run_xdp()
707 page_pool_recycle_direct(emac->rx_chns.pg_pool, page); in emac_run_xdp()
712 static int emac_rx_packet(struct prueth_emac *emac, u32 flow_id, u32 *xdp_state) in emac_rx_packet() argument
714 struct prueth_rx_chn *rx_chn = &emac->rx_chns; in emac_rx_packet()
716 struct net_device *ndev = emac->ndev; in emac_rx_packet()
770 if (emac->xdp_prog) { in emac_rx_packet()
774 *xdp_state = emac_run_xdp(emac, &xdp, page, &pkt_len); in emac_rx_packet()
796 if (emac->rx_ts_enabled) in emac_rx_packet()
797 emac_rx_timestamp(emac, skb, psdata); in emac_rx_packet()
799 if (emac->prueth->is_switch_mode) in emac_rx_packet()
800 skb->offload_fwd_mark = emac->offload_fwd_mark; in emac_rx_packet()
804 napi_gro_receive(&emac->napi_rx, skb); in emac_rx_packet()
810 ret = prueth_dma_rx_push_mapped(emac, &emac->rx_chns, new_page, in emac_rx_packet()
840 static int prueth_tx_ts_cookie_get(struct prueth_emac *emac) in prueth_tx_ts_cookie_get() argument
846 if (!emac->tx_ts_skb[i]) { in prueth_tx_ts_cookie_get()
847 emac->tx_ts_skb[i] = ERR_PTR(-EBUSY); /* reserve slot */ in prueth_tx_ts_cookie_get()
856 * icssg_ndo_start_xmit - EMAC Transmit function
858 * @ndev: EMAC network adapter
861 * EMAC hardware transmit queue
870 struct prueth_emac *emac = netdev_priv(ndev); in icssg_ndo_start_xmit() local
871 struct prueth *prueth = emac->prueth; in icssg_ndo_start_xmit()
885 tx_chn = &emac->tx_chns[q_idx]; in icssg_ndo_start_xmit()
910 emac->tx_ts_enabled) { in icssg_ndo_start_xmit()
911 tx_ts_cookie = prueth_tx_ts_cookie_get(emac); in icssg_ndo_start_xmit()
917 emac->tx_ts_skb[tx_ts_cookie] = skb_get(skb); in icssg_ndo_start_xmit()
927 dst_tag_id = emac->port_id | (q_idx << 8); in icssg_ndo_start_xmit()
997 atomic_inc(&emac->tx_ts_pending); in icssg_ndo_start_xmit()
1013 dev_kfree_skb_any(emac->tx_ts_skb[tx_ts_cookie]); in icssg_ndo_start_xmit()
1014 emac->tx_ts_skb[tx_ts_cookie] = NULL; in icssg_ndo_start_xmit()
1031 dev_kfree_skb_any(emac->tx_ts_skb[tx_ts_cookie]); in icssg_ndo_start_xmit()
1032 emac->tx_ts_skb[tx_ts_cookie] = NULL; in icssg_ndo_start_xmit()
1071 struct prueth_emac *emac = dev_id; in prueth_rx_irq() local
1074 napi_schedule(&emac->napi_rx); in prueth_rx_irq()
1080 void prueth_cleanup_tx_ts(struct prueth_emac *emac) in prueth_cleanup_tx_ts() argument
1085 if (emac->tx_ts_skb[i]) { in prueth_cleanup_tx_ts()
1086 dev_kfree_skb_any(emac->tx_ts_skb[i]); in prueth_cleanup_tx_ts()
1087 emac->tx_ts_skb[i] = NULL; in prueth_cleanup_tx_ts()
1095 struct prueth_emac *emac = prueth_napi_to_emac(napi_rx); in icssg_napi_rx_poll() local
1096 int rx_flow = emac->is_sr1 ? in icssg_napi_rx_poll()
1098 int flow = emac->is_sr1 ? in icssg_napi_rx_poll()
1110 ret = emac_rx_packet(emac, flow, &xdp_state); in icssg_napi_rx_poll()
1125 if (unlikely(emac->rx_pace_timeout_ns)) { in icssg_napi_rx_poll()
1126 hrtimer_start(&emac->rx_hrtimer, in icssg_napi_rx_poll()
1127 ns_to_ktime(emac->rx_pace_timeout_ns), in icssg_napi_rx_poll()
1130 enable_irq(emac->rx_chns.irq[rx_flow]); in icssg_napi_rx_poll()
1138 static struct page_pool *prueth_create_page_pool(struct prueth_emac *emac, in prueth_create_page_pool() argument
1148 pp_params.nid = dev_to_node(emac->prueth->dev); in prueth_create_page_pool()
1151 pp_params.napi = &emac->napi_rx; in prueth_create_page_pool()
1156 netdev_err(emac->ndev, "cannot create rx page pool\n"); in prueth_create_page_pool()
1161 int prueth_prepare_rx_chan(struct prueth_emac *emac, in prueth_prepare_rx_chan() argument
1169 pool = prueth_create_page_pool(emac, chn->dma_dev, chn->descs_num); in prueth_prepare_rx_chan()
1182 netdev_err(emac->ndev, "couldn't allocate rx page\n"); in prueth_prepare_rx_chan()
1187 ret = prueth_dma_rx_push_mapped(emac, chn, page, buf_size); in prueth_prepare_rx_chan()
1189 netdev_err(emac->ndev, in prueth_prepare_rx_chan()
1200 prueth_reset_rx_chan(&emac->rx_chns, PRUETH_MAX_RX_FLOWS, false); in prueth_prepare_rx_chan()
1206 void prueth_reset_tx_chan(struct prueth_emac *emac, int ch_num, in prueth_reset_tx_chan() argument
1213 k3_udma_glue_reset_tx_chn(emac->tx_chns[i].tx_chn, in prueth_reset_tx_chan()
1214 &emac->tx_chns[i], in prueth_reset_tx_chan()
1216 k3_udma_glue_disable_tx_chn(emac->tx_chns[i].tx_chn); in prueth_reset_tx_chan()
1242 struct prueth_emac *emac = netdev_priv(ndev); in emac_set_ts_config() local
1250 emac->tx_ts_enabled = 0; in emac_set_ts_config()
1253 emac->tx_ts_enabled = 1; in emac_set_ts_config()
1261 emac->rx_ts_enabled = 0; in emac_set_ts_config()
1278 emac->rx_ts_enabled = 1; in emac_set_ts_config()
1291 struct prueth_emac *emac = netdev_priv(ndev); in emac_get_ts_config() local
1295 config.tx_type = emac->tx_ts_enabled ? HWTSTAMP_TX_ON : HWTSTAMP_TX_OFF; in emac_get_ts_config()
1296 config.rx_filter = emac->rx_ts_enabled ? HWTSTAMP_FILTER_ALL : HWTSTAMP_FILTER_NONE; in emac_get_ts_config()
1320 struct prueth_emac *emac = netdev_priv(ndev); in icssg_ndo_get_stats64() local
1322 emac_update_hardware_stats(emac); in icssg_ndo_get_stats64()
1324 stats->rx_packets = emac_get_stat_by_name(emac, "rx_packets"); in icssg_ndo_get_stats64()
1325 stats->rx_bytes = emac_get_stat_by_name(emac, "rx_bytes"); in icssg_ndo_get_stats64()
1326 stats->tx_packets = emac_get_stat_by_name(emac, "tx_packets"); in icssg_ndo_get_stats64()
1327 stats->tx_bytes = emac_get_stat_by_name(emac, "tx_bytes"); in icssg_ndo_get_stats64()
1328 stats->rx_crc_errors = emac_get_stat_by_name(emac, "rx_crc_errors"); in icssg_ndo_get_stats64()
1329 stats->rx_over_errors = emac_get_stat_by_name(emac, "rx_over_errors"); in icssg_ndo_get_stats64()
1330 stats->multicast = emac_get_stat_by_name(emac, "rx_multicast_frames"); in icssg_ndo_get_stats64()
1342 struct prueth_emac *emac = netdev_priv(ndev); in icssg_ndo_get_phys_port_name() local
1345 ret = snprintf(name, len, "p%d", emac->port_id); in icssg_ndo_get_phys_port_name()
1394 struct prueth_emac *emac; in prueth_netdev_exit() local
1401 emac = prueth->emac[mac]; in prueth_netdev_exit()
1402 if (!emac) in prueth_netdev_exit()
1405 if (of_phy_is_fixed_link(emac->phy_node)) in prueth_netdev_exit()
1406 of_phy_deregister_fixed_link(emac->phy_node); in prueth_netdev_exit()
1408 netif_napi_del(&emac->napi_rx); in prueth_netdev_exit()
1410 pruss_release_mem_region(prueth->pruss, &emac->dram); in prueth_netdev_exit()
1411 destroy_workqueue(emac->cmd_wq); in prueth_netdev_exit()
1412 free_netdev(emac->ndev); in prueth_netdev_exit()
1413 prueth->emac[mac] = NULL; in prueth_netdev_exit()