brintos

brintos / linux-shallow public Read only

0
0
Text · 132.2 KiB · 29886a8 Raw
5127 lines · c
1// SPDX-License-Identifier: (GPL-2.0+ OR BSD-3-Clause)2/* Copyright 2014-2016 Freescale Semiconductor Inc.3 * Copyright 2016-2022 NXP4 */5#include <linux/init.h>6#include <linux/module.h>7#include <linux/platform_device.h>8#include <linux/etherdevice.h>9#include <linux/of_net.h>10#include <linux/interrupt.h>11#include <linux/kthread.h>12#include <linux/iommu.h>13#include <linux/fsl/mc.h>14#include <linux/bpf.h>15#include <linux/bpf_trace.h>16#include <linux/fsl/ptp_qoriq.h>17#include <linux/ptp_classify.h>18#include <net/pkt_cls.h>19#include <net/sock.h>20#include <net/tso.h>21#include <net/xdp_sock_drv.h>22 23#include "dpaa2-eth.h"24 25/* CREATE_TRACE_POINTS only needs to be defined once. Other dpa files26 * using trace events only need to #include <trace/events/sched.h>27 */28#define CREATE_TRACE_POINTS29#include "dpaa2-eth-trace.h"30 31MODULE_LICENSE("Dual BSD/GPL");32MODULE_AUTHOR("Freescale Semiconductor, Inc");33MODULE_DESCRIPTION("Freescale DPAA2 Ethernet Driver");34 35struct ptp_qoriq *dpaa2_ptp;36EXPORT_SYMBOL(dpaa2_ptp);37 38static void dpaa2_eth_detect_features(struct dpaa2_eth_priv *priv)39{40	priv->features = 0;41 42	if (dpaa2_eth_cmp_dpni_ver(priv, DPNI_PTP_ONESTEP_VER_MAJOR,43				   DPNI_PTP_ONESTEP_VER_MINOR) >= 0)44		priv->features |= DPAA2_ETH_FEATURE_ONESTEP_CFG_DIRECT;45}46 47static void dpaa2_update_ptp_onestep_indirect(struct dpaa2_eth_priv *priv,48					      u32 offset, u8 udp)49{50	struct dpni_single_step_cfg cfg;51 52	cfg.en = 1;53	cfg.ch_update = udp;54	cfg.offset = offset;55	cfg.peer_delay = 0;56 57	if (dpni_set_single_step_cfg(priv->mc_io, 0, priv->mc_token, &cfg))58		WARN_ONCE(1, "Failed to set single step register");59}60 61static void dpaa2_update_ptp_onestep_direct(struct dpaa2_eth_priv *priv,62					    u32 offset, u8 udp)63{64	u32 val = 0;65 66	val = DPAA2_PTP_SINGLE_STEP_ENABLE |67	       DPAA2_PTP_SINGLE_CORRECTION_OFF(offset);68 69	if (udp)70		val |= DPAA2_PTP_SINGLE_STEP_CH;71 72	if (priv->onestep_reg_base)73		writel(val, priv->onestep_reg_base);74}75 76static void dpaa2_ptp_onestep_reg_update_method(struct dpaa2_eth_priv *priv)77{78	struct device *dev = priv->net_dev->dev.parent;79	struct dpni_single_step_cfg ptp_cfg;80 81	priv->dpaa2_set_onestep_params_cb = dpaa2_update_ptp_onestep_indirect;82 83	if (!(priv->features & DPAA2_ETH_FEATURE_ONESTEP_CFG_DIRECT))84		return;85 86	if (dpni_get_single_step_cfg(priv->mc_io, 0,87				     priv->mc_token, &ptp_cfg)) {88		dev_err(dev, "dpni_get_single_step_cfg cannot retrieve onestep reg, falling back to indirect update\n");89		return;90	}91 92	if (!ptp_cfg.ptp_onestep_reg_base) {93		dev_err(dev, "1588 onestep reg not available, falling back to indirect update\n");94		return;95	}96 97	priv->onestep_reg_base = ioremap(ptp_cfg.ptp_onestep_reg_base,98					 sizeof(u32));99	if (!priv->onestep_reg_base) {100		dev_err(dev, "1588 onestep reg cannot be mapped, falling back to indirect update\n");101		return;102	}103 104	priv->dpaa2_set_onestep_params_cb = dpaa2_update_ptp_onestep_direct;105}106 107void *dpaa2_iova_to_virt(struct iommu_domain *domain,108			 dma_addr_t iova_addr)109{110	phys_addr_t phys_addr;111 112	phys_addr = domain ? iommu_iova_to_phys(domain, iova_addr) : iova_addr;113 114	return phys_to_virt(phys_addr);115}116 117static void dpaa2_eth_validate_rx_csum(struct dpaa2_eth_priv *priv,118				       u32 fd_status,119				       struct sk_buff *skb)120{121	skb_checksum_none_assert(skb);122 123	/* HW checksum validation is disabled, nothing to do here */124	if (!(priv->net_dev->features & NETIF_F_RXCSUM))125		return;126 127	/* Read checksum validation bits */128	if (!((fd_status & DPAA2_FAS_L3CV) &&129	      (fd_status & DPAA2_FAS_L4CV)))130		return;131 132	/* Inform the stack there's no need to compute L3/L4 csum anymore */133	skb->ip_summed = CHECKSUM_UNNECESSARY;134}135 136/* Free a received FD.137 * Not to be used for Tx conf FDs or on any other paths.138 */139static void dpaa2_eth_free_rx_fd(struct dpaa2_eth_priv *priv,140				 const struct dpaa2_fd *fd,141				 void *vaddr)142{143	struct device *dev = priv->net_dev->dev.parent;144	dma_addr_t addr = dpaa2_fd_get_addr(fd);145	u8 fd_format = dpaa2_fd_get_format(fd);146	struct dpaa2_sg_entry *sgt;147	void *sg_vaddr;148	int i;149 150	/* If single buffer frame, just free the data buffer */151	if (fd_format == dpaa2_fd_single)152		goto free_buf;153	else if (fd_format != dpaa2_fd_sg)154		/* We don't support any other format */155		return;156 157	/* For S/G frames, we first need to free all SG entries158	 * except the first one, which was taken care of already159	 */160	sgt = vaddr + dpaa2_fd_get_offset(fd);161	for (i = 1; i < DPAA2_ETH_MAX_SG_ENTRIES; i++) {162		addr = dpaa2_sg_get_addr(&sgt[i]);163		sg_vaddr = dpaa2_iova_to_virt(priv->iommu_domain, addr);164		dma_unmap_page(dev, addr, priv->rx_buf_size,165			       DMA_BIDIRECTIONAL);166 167		free_pages((unsigned long)sg_vaddr, 0);168		if (dpaa2_sg_is_final(&sgt[i]))169			break;170	}171 172free_buf:173	free_pages((unsigned long)vaddr, 0);174}175 176/* Build a linear skb based on a single-buffer frame descriptor */177static struct sk_buff *dpaa2_eth_build_linear_skb(struct dpaa2_eth_channel *ch,178						  const struct dpaa2_fd *fd,179						  void *fd_vaddr)180{181	struct sk_buff *skb = NULL;182	u16 fd_offset = dpaa2_fd_get_offset(fd);183	u32 fd_length = dpaa2_fd_get_len(fd);184 185	ch->buf_count--;186 187	skb = build_skb(fd_vaddr, DPAA2_ETH_RX_BUF_RAW_SIZE);188	if (unlikely(!skb))189		return NULL;190 191	skb_reserve(skb, fd_offset);192	skb_put(skb, fd_length);193 194	return skb;195}196 197/* Build a non linear (fragmented) skb based on a S/G table */198static struct sk_buff *dpaa2_eth_build_frag_skb(struct dpaa2_eth_priv *priv,199						struct dpaa2_eth_channel *ch,200						struct dpaa2_sg_entry *sgt)201{202	struct sk_buff *skb = NULL;203	struct device *dev = priv->net_dev->dev.parent;204	void *sg_vaddr;205	dma_addr_t sg_addr;206	u16 sg_offset;207	u32 sg_length;208	struct page *page, *head_page;209	int page_offset;210	int i;211 212	for (i = 0; i < DPAA2_ETH_MAX_SG_ENTRIES; i++) {213		struct dpaa2_sg_entry *sge = &sgt[i];214 215		/* NOTE: We only support SG entries in dpaa2_sg_single format,216		 * but this is the only format we may receive from HW anyway217		 */218 219		/* Get the address and length from the S/G entry */220		sg_addr = dpaa2_sg_get_addr(sge);221		sg_vaddr = dpaa2_iova_to_virt(priv->iommu_domain, sg_addr);222		dma_unmap_page(dev, sg_addr, priv->rx_buf_size,223			       DMA_BIDIRECTIONAL);224 225		sg_length = dpaa2_sg_get_len(sge);226 227		if (i == 0) {228			/* We build the skb around the first data buffer */229			skb = build_skb(sg_vaddr, DPAA2_ETH_RX_BUF_RAW_SIZE);230			if (unlikely(!skb)) {231				/* Free the first SG entry now, since we already232				 * unmapped it and obtained the virtual address233				 */234				free_pages((unsigned long)sg_vaddr, 0);235 236				/* We still need to subtract the buffers used237				 * by this FD from our software counter238				 */239				while (!dpaa2_sg_is_final(&sgt[i]) &&240				       i < DPAA2_ETH_MAX_SG_ENTRIES)241					i++;242				break;243			}244 245			sg_offset = dpaa2_sg_get_offset(sge);246			skb_reserve(skb, sg_offset);247			skb_put(skb, sg_length);248		} else {249			/* Rest of the data buffers are stored as skb frags */250			page = virt_to_page(sg_vaddr);251			head_page = virt_to_head_page(sg_vaddr);252 253			/* Offset in page (which may be compound).254			 * Data in subsequent SG entries is stored from the255			 * beginning of the buffer, so we don't need to add the256			 * sg_offset.257			 */258			page_offset = ((unsigned long)sg_vaddr &259				(PAGE_SIZE - 1)) +260				(page_address(page) - page_address(head_page));261 262			skb_add_rx_frag(skb, i - 1, head_page, page_offset,263					sg_length, priv->rx_buf_size);264		}265 266		if (dpaa2_sg_is_final(sge))267			break;268	}269 270	WARN_ONCE(i == DPAA2_ETH_MAX_SG_ENTRIES, "Final bit not set in SGT");271 272	/* Count all data buffers + SG table buffer */273	ch->buf_count -= i + 2;274 275	return skb;276}277 278/* Free buffers acquired from the buffer pool or which were meant to279 * be released in the pool280 */281static void dpaa2_eth_free_bufs(struct dpaa2_eth_priv *priv, u64 *buf_array,282				int count, bool xsk_zc)283{284	struct device *dev = priv->net_dev->dev.parent;285	struct dpaa2_eth_swa *swa;286	struct xdp_buff *xdp_buff;287	void *vaddr;288	int i;289 290	for (i = 0; i < count; i++) {291		vaddr = dpaa2_iova_to_virt(priv->iommu_domain, buf_array[i]);292 293		if (!xsk_zc) {294			dma_unmap_page(dev, buf_array[i], priv->rx_buf_size,295				       DMA_BIDIRECTIONAL);296			free_pages((unsigned long)vaddr, 0);297		} else {298			swa = (struct dpaa2_eth_swa *)299				(vaddr + DPAA2_ETH_RX_HWA_SIZE);300			xdp_buff = swa->xsk.xdp_buff;301			xsk_buff_free(xdp_buff);302		}303	}304}305 306void dpaa2_eth_recycle_buf(struct dpaa2_eth_priv *priv,307			   struct dpaa2_eth_channel *ch,308			   dma_addr_t addr)309{310	int retries = 0;311	int err;312 313	ch->recycled_bufs[ch->recycled_bufs_cnt++] = addr;314	if (ch->recycled_bufs_cnt < DPAA2_ETH_BUFS_PER_CMD)315		return;316 317	while ((err = dpaa2_io_service_release(ch->dpio, ch->bp->bpid,318					       ch->recycled_bufs,319					       ch->recycled_bufs_cnt)) == -EBUSY) {320		if (retries++ >= DPAA2_ETH_SWP_BUSY_RETRIES)321			break;322		cpu_relax();323	}324 325	if (err) {326		dpaa2_eth_free_bufs(priv, ch->recycled_bufs,327				    ch->recycled_bufs_cnt, ch->xsk_zc);328		ch->buf_count -= ch->recycled_bufs_cnt;329	}330 331	ch->recycled_bufs_cnt = 0;332}333 334static int dpaa2_eth_xdp_flush(struct dpaa2_eth_priv *priv,335			       struct dpaa2_eth_fq *fq,336			       struct dpaa2_eth_xdp_fds *xdp_fds)337{338	int total_enqueued = 0, retries = 0, enqueued;339	struct dpaa2_eth_drv_stats *percpu_extras;340	int num_fds, err, max_retries;341	struct dpaa2_fd *fds;342 343	percpu_extras = this_cpu_ptr(priv->percpu_extras);344 345	/* try to enqueue all the FDs until the max number of retries is hit */346	fds = xdp_fds->fds;347	num_fds = xdp_fds->num;348	max_retries = num_fds * DPAA2_ETH_ENQUEUE_RETRIES;349	while (total_enqueued < num_fds && retries < max_retries) {350		err = priv->enqueue(priv, fq, &fds[total_enqueued],351				    0, num_fds - total_enqueued, &enqueued);352		if (err == -EBUSY) {353			percpu_extras->tx_portal_busy += ++retries;354			continue;355		}356		total_enqueued += enqueued;357	}358	xdp_fds->num = 0;359 360	return total_enqueued;361}362 363static void dpaa2_eth_xdp_tx_flush(struct dpaa2_eth_priv *priv,364				   struct dpaa2_eth_channel *ch,365				   struct dpaa2_eth_fq *fq)366{367	struct rtnl_link_stats64 *percpu_stats;368	struct dpaa2_fd *fds;369	int enqueued, i;370 371	percpu_stats = this_cpu_ptr(priv->percpu_stats);372 373	// enqueue the array of XDP_TX frames374	enqueued = dpaa2_eth_xdp_flush(priv, fq, &fq->xdp_tx_fds);375 376	/* update statistics */377	percpu_stats->tx_packets += enqueued;378	fds = fq->xdp_tx_fds.fds;379	for (i = 0; i < enqueued; i++) {380		percpu_stats->tx_bytes += dpaa2_fd_get_len(&fds[i]);381		ch->stats.xdp_tx++;382	}383	for (i = enqueued; i < fq->xdp_tx_fds.num; i++) {384		dpaa2_eth_recycle_buf(priv, ch, dpaa2_fd_get_addr(&fds[i]));385		percpu_stats->tx_errors++;386		ch->stats.xdp_tx_err++;387	}388	fq->xdp_tx_fds.num = 0;389}390 391void dpaa2_eth_xdp_enqueue(struct dpaa2_eth_priv *priv,392			   struct dpaa2_eth_channel *ch,393			   struct dpaa2_fd *fd,394			   void *buf_start, u16 queue_id)395{396	struct dpaa2_faead *faead;397	struct dpaa2_fd *dest_fd;398	struct dpaa2_eth_fq *fq;399	u32 ctrl, frc;400 401	/* Mark the egress frame hardware annotation area as valid */402	frc = dpaa2_fd_get_frc(fd);403	dpaa2_fd_set_frc(fd, frc | DPAA2_FD_FRC_FAEADV);404	dpaa2_fd_set_ctrl(fd, DPAA2_FD_CTRL_ASAL);405 406	/* Instruct hardware to release the FD buffer directly into407	 * the buffer pool once transmission is completed, instead of408	 * sending a Tx confirmation frame to us409	 */410	ctrl = DPAA2_FAEAD_A4V | DPAA2_FAEAD_A2V | DPAA2_FAEAD_EBDDV;411	faead = dpaa2_get_faead(buf_start, false);412	faead->ctrl = cpu_to_le32(ctrl);413	faead->conf_fqid = 0;414 415	fq = &priv->fq[queue_id];416	dest_fd = &fq->xdp_tx_fds.fds[fq->xdp_tx_fds.num++];417	memcpy(dest_fd, fd, sizeof(*dest_fd));418 419	if (fq->xdp_tx_fds.num < DEV_MAP_BULK_SIZE)420		return;421 422	dpaa2_eth_xdp_tx_flush(priv, ch, fq);423}424 425static u32 dpaa2_eth_run_xdp(struct dpaa2_eth_priv *priv,426			     struct dpaa2_eth_channel *ch,427			     struct dpaa2_eth_fq *rx_fq,428			     struct dpaa2_fd *fd, void *vaddr)429{430	dma_addr_t addr = dpaa2_fd_get_addr(fd);431	struct bpf_prog *xdp_prog;432	struct xdp_buff xdp;433	u32 xdp_act = XDP_PASS;434	int err, offset;435 436	xdp_prog = READ_ONCE(ch->xdp.prog);437	if (!xdp_prog)438		goto out;439 440	offset = dpaa2_fd_get_offset(fd) - XDP_PACKET_HEADROOM;441	xdp_init_buff(&xdp, DPAA2_ETH_RX_BUF_RAW_SIZE - offset, &ch->xdp_rxq);442	xdp_prepare_buff(&xdp, vaddr + offset, XDP_PACKET_HEADROOM,443			 dpaa2_fd_get_len(fd), false);444 445	xdp_act = bpf_prog_run_xdp(xdp_prog, &xdp);446 447	/* xdp.data pointer may have changed */448	dpaa2_fd_set_offset(fd, xdp.data - vaddr);449	dpaa2_fd_set_len(fd, xdp.data_end - xdp.data);450 451	switch (xdp_act) {452	case XDP_PASS:453		break;454	case XDP_TX:455		dpaa2_eth_xdp_enqueue(priv, ch, fd, vaddr, rx_fq->flowid);456		break;457	default:458		bpf_warn_invalid_xdp_action(priv->net_dev, xdp_prog, xdp_act);459		fallthrough;460	case XDP_ABORTED:461		trace_xdp_exception(priv->net_dev, xdp_prog, xdp_act);462		fallthrough;463	case XDP_DROP:464		dpaa2_eth_recycle_buf(priv, ch, addr);465		ch->stats.xdp_drop++;466		break;467	case XDP_REDIRECT:468		dma_unmap_page(priv->net_dev->dev.parent, addr,469			       priv->rx_buf_size, DMA_BIDIRECTIONAL);470		ch->buf_count--;471 472		/* Allow redirect use of full headroom */473		xdp.data_hard_start = vaddr;474		xdp.frame_sz = DPAA2_ETH_RX_BUF_RAW_SIZE;475 476		err = xdp_do_redirect(priv->net_dev, &xdp, xdp_prog);477		if (unlikely(err)) {478			addr = dma_map_page(priv->net_dev->dev.parent,479					    virt_to_page(vaddr), 0,480					    priv->rx_buf_size, DMA_BIDIRECTIONAL);481			if (unlikely(dma_mapping_error(priv->net_dev->dev.parent, addr))) {482				free_pages((unsigned long)vaddr, 0);483			} else {484				ch->buf_count++;485				dpaa2_eth_recycle_buf(priv, ch, addr);486			}487			ch->stats.xdp_drop++;488		} else {489			ch->stats.xdp_redirect++;490		}491		break;492	}493 494	ch->xdp.res |= xdp_act;495out:496	return xdp_act;497}498 499struct sk_buff *dpaa2_eth_alloc_skb(struct dpaa2_eth_priv *priv,500				    struct dpaa2_eth_channel *ch,501				    const struct dpaa2_fd *fd, u32 fd_length,502				    void *fd_vaddr)503{504	u16 fd_offset = dpaa2_fd_get_offset(fd);505	struct sk_buff *skb = NULL;506	unsigned int skb_len;507 508	skb_len = fd_length + dpaa2_eth_needed_headroom(NULL);509 510	skb = napi_alloc_skb(&ch->napi, skb_len);511	if (!skb)512		return NULL;513 514	skb_reserve(skb, dpaa2_eth_needed_headroom(NULL));515	skb_put(skb, fd_length);516 517	memcpy(skb->data, fd_vaddr + fd_offset, fd_length);518 519	return skb;520}521 522static struct sk_buff *dpaa2_eth_copybreak(struct dpaa2_eth_channel *ch,523					   const struct dpaa2_fd *fd,524					   void *fd_vaddr)525{526	struct dpaa2_eth_priv *priv = ch->priv;527	u32 fd_length = dpaa2_fd_get_len(fd);528 529	if (fd_length > priv->rx_copybreak)530		return NULL;531 532	return dpaa2_eth_alloc_skb(priv, ch, fd, fd_length, fd_vaddr);533}534 535void dpaa2_eth_receive_skb(struct dpaa2_eth_priv *priv,536			   struct dpaa2_eth_channel *ch,537			   const struct dpaa2_fd *fd, void *vaddr,538			   struct dpaa2_eth_fq *fq,539			   struct rtnl_link_stats64 *percpu_stats,540			   struct sk_buff *skb)541{542	struct dpaa2_fas *fas;543	u32 status = 0;544 545	fas = dpaa2_get_fas(vaddr, false);546	prefetch(fas);547	prefetch(skb->data);548 549	/* Get the timestamp value */550	if (priv->rx_tstamp) {551		struct skb_shared_hwtstamps *shhwtstamps = skb_hwtstamps(skb);552		__le64 *ts = dpaa2_get_ts(vaddr, false);553		u64 ns;554 555		memset(shhwtstamps, 0, sizeof(*shhwtstamps));556 557		ns = DPAA2_PTP_CLK_PERIOD_NS * le64_to_cpup(ts);558		shhwtstamps->hwtstamp = ns_to_ktime(ns);559	}560 561	/* Check if we need to validate the L4 csum */562	if (likely(dpaa2_fd_get_frc(fd) & DPAA2_FD_FRC_FASV)) {563		status = le32_to_cpu(fas->status);564		dpaa2_eth_validate_rx_csum(priv, status, skb);565	}566 567	skb->protocol = eth_type_trans(skb, priv->net_dev);568	skb_record_rx_queue(skb, fq->flowid);569 570	percpu_stats->rx_packets++;571	percpu_stats->rx_bytes += dpaa2_fd_get_len(fd);572	ch->stats.bytes_per_cdan += dpaa2_fd_get_len(fd);573 574	list_add_tail(&skb->list, ch->rx_list);575}576 577/* Main Rx frame processing routine */578void dpaa2_eth_rx(struct dpaa2_eth_priv *priv,579		  struct dpaa2_eth_channel *ch,580		  const struct dpaa2_fd *fd,581		  struct dpaa2_eth_fq *fq)582{583	dma_addr_t addr = dpaa2_fd_get_addr(fd);584	u8 fd_format = dpaa2_fd_get_format(fd);585	void *vaddr;586	struct sk_buff *skb;587	struct rtnl_link_stats64 *percpu_stats;588	struct dpaa2_eth_drv_stats *percpu_extras;589	struct device *dev = priv->net_dev->dev.parent;590	bool recycle_rx_buf = false;591	void *buf_data;592	u32 xdp_act;593 594	/* Tracing point */595	trace_dpaa2_rx_fd(priv->net_dev, fd);596 597	vaddr = dpaa2_iova_to_virt(priv->iommu_domain, addr);598	dma_sync_single_for_cpu(dev, addr, priv->rx_buf_size,599				DMA_BIDIRECTIONAL);600 601	buf_data = vaddr + dpaa2_fd_get_offset(fd);602	prefetch(buf_data);603 604	percpu_stats = this_cpu_ptr(priv->percpu_stats);605	percpu_extras = this_cpu_ptr(priv->percpu_extras);606 607	if (fd_format == dpaa2_fd_single) {608		xdp_act = dpaa2_eth_run_xdp(priv, ch, fq, (struct dpaa2_fd *)fd, vaddr);609		if (xdp_act != XDP_PASS) {610			percpu_stats->rx_packets++;611			percpu_stats->rx_bytes += dpaa2_fd_get_len(fd);612			return;613		}614 615		skb = dpaa2_eth_copybreak(ch, fd, vaddr);616		if (!skb) {617			dma_unmap_page(dev, addr, priv->rx_buf_size,618				       DMA_BIDIRECTIONAL);619			skb = dpaa2_eth_build_linear_skb(ch, fd, vaddr);620		} else {621			recycle_rx_buf = true;622		}623	} else if (fd_format == dpaa2_fd_sg) {624		WARN_ON(priv->xdp_prog);625 626		dma_unmap_page(dev, addr, priv->rx_buf_size,627			       DMA_BIDIRECTIONAL);628		skb = dpaa2_eth_build_frag_skb(priv, ch, buf_data);629		free_pages((unsigned long)vaddr, 0);630		percpu_extras->rx_sg_frames++;631		percpu_extras->rx_sg_bytes += dpaa2_fd_get_len(fd);632	} else {633		/* We don't support any other format */634		goto err_frame_format;635	}636 637	if (unlikely(!skb))638		goto err_build_skb;639 640	dpaa2_eth_receive_skb(priv, ch, fd, vaddr, fq, percpu_stats, skb);641 642	if (recycle_rx_buf)643		dpaa2_eth_recycle_buf(priv, ch, dpaa2_fd_get_addr(fd));644	return;645 646err_build_skb:647	dpaa2_eth_free_rx_fd(priv, fd, vaddr);648err_frame_format:649	percpu_stats->rx_dropped++;650}651 652/* Processing of Rx frames received on the error FQ653 * We check and print the error bits and then free the frame654 */655static void dpaa2_eth_rx_err(struct dpaa2_eth_priv *priv,656			     struct dpaa2_eth_channel *ch,657			     const struct dpaa2_fd *fd,658			     struct dpaa2_eth_fq *fq __always_unused)659{660	struct device *dev = priv->net_dev->dev.parent;661	dma_addr_t addr = dpaa2_fd_get_addr(fd);662	u8 fd_format = dpaa2_fd_get_format(fd);663	struct rtnl_link_stats64 *percpu_stats;664	struct dpaa2_eth_trap_item *trap_item;665	struct dpaa2_fapr *fapr;666	struct sk_buff *skb;667	void *buf_data;668	void *vaddr;669 670	vaddr = dpaa2_iova_to_virt(priv->iommu_domain, addr);671	dma_sync_single_for_cpu(dev, addr, priv->rx_buf_size,672				DMA_BIDIRECTIONAL);673 674	buf_data = vaddr + dpaa2_fd_get_offset(fd);675 676	if (fd_format == dpaa2_fd_single) {677		dma_unmap_page(dev, addr, priv->rx_buf_size,678			       DMA_BIDIRECTIONAL);679		skb = dpaa2_eth_build_linear_skb(ch, fd, vaddr);680	} else if (fd_format == dpaa2_fd_sg) {681		dma_unmap_page(dev, addr, priv->rx_buf_size,682			       DMA_BIDIRECTIONAL);683		skb = dpaa2_eth_build_frag_skb(priv, ch, buf_data);684		free_pages((unsigned long)vaddr, 0);685	} else {686		/* We don't support any other format */687		dpaa2_eth_free_rx_fd(priv, fd, vaddr);688		goto err_frame_format;689	}690 691	fapr = dpaa2_get_fapr(vaddr, false);692	trap_item = dpaa2_eth_dl_get_trap(priv, fapr);693	if (trap_item)694		devlink_trap_report(priv->devlink, skb, trap_item->trap_ctx,695				    &priv->devlink_port, NULL);696	consume_skb(skb);697 698err_frame_format:699	percpu_stats = this_cpu_ptr(priv->percpu_stats);700	percpu_stats->rx_errors++;701	ch->buf_count--;702}703 704/* Consume all frames pull-dequeued into the store. This is the simplest way to705 * make sure we don't accidentally issue another volatile dequeue which would706 * overwrite (leak) frames already in the store.707 *708 * Observance of NAPI budget is not our concern, leaving that to the caller.709 */710static int dpaa2_eth_consume_frames(struct dpaa2_eth_channel *ch,711				    struct dpaa2_eth_fq **src)712{713	struct dpaa2_eth_priv *priv = ch->priv;714	struct dpaa2_eth_fq *fq = NULL;715	struct dpaa2_dq *dq;716	const struct dpaa2_fd *fd;717	int cleaned = 0, retries = 0;718	int is_last;719 720	do {721		dq = dpaa2_io_store_next(ch->store, &is_last);722		if (unlikely(!dq)) {723			/* If we're here, we *must* have placed a724			 * volatile dequeue comnmand, so keep reading through725			 * the store until we get some sort of valid response726			 * token (either a valid frame or an "empty dequeue")727			 */728			if (retries++ >= DPAA2_ETH_SWP_BUSY_RETRIES) {729				netdev_err_once(priv->net_dev,730						"Unable to read a valid dequeue response\n");731				return -ETIMEDOUT;732			}733			continue;734		}735 736		fd = dpaa2_dq_fd(dq);737		fq = (struct dpaa2_eth_fq *)(uintptr_t)dpaa2_dq_fqd_ctx(dq);738 739		fq->consume(priv, ch, fd, fq);740		cleaned++;741		retries = 0;742	} while (!is_last);743 744	if (!cleaned)745		return 0;746 747	fq->stats.frames += cleaned;748	ch->stats.frames += cleaned;749	ch->stats.frames_per_cdan += cleaned;750 751	/* A dequeue operation only pulls frames from a single queue752	 * into the store. Return the frame queue as an out param.753	 */754	if (src)755		*src = fq;756 757	return cleaned;758}759 760static int dpaa2_eth_ptp_parse(struct sk_buff *skb,761			       u8 *msgtype, u8 *twostep, u8 *udp,762			       u16 *correction_offset,763			       u16 *origintimestamp_offset)764{765	unsigned int ptp_class;766	struct ptp_header *hdr;767	unsigned int type;768	u8 *base;769 770	ptp_class = ptp_classify_raw(skb);771	if (ptp_class == PTP_CLASS_NONE)772		return -EINVAL;773 774	hdr = ptp_parse_header(skb, ptp_class);775	if (!hdr)776		return -EINVAL;777 778	*msgtype = ptp_get_msgtype(hdr, ptp_class);779	*twostep = hdr->flag_field[0] & 0x2;780 781	type = ptp_class & PTP_CLASS_PMASK;782	if (type == PTP_CLASS_IPV4 ||783	    type == PTP_CLASS_IPV6)784		*udp = 1;785	else786		*udp = 0;787 788	base = skb_mac_header(skb);789	*correction_offset = (u8 *)&hdr->correction - base;790	*origintimestamp_offset = (u8 *)hdr + sizeof(struct ptp_header) - base;791 792	return 0;793}794 795/* Configure the egress frame annotation for timestamp update */796static void dpaa2_eth_enable_tx_tstamp(struct dpaa2_eth_priv *priv,797				       struct dpaa2_fd *fd,798				       void *buf_start,799				       struct sk_buff *skb)800{801	struct ptp_tstamp origin_timestamp;802	u8 msgtype, twostep, udp;803	struct dpaa2_faead *faead;804	struct dpaa2_fas *fas;805	struct timespec64 ts;806	u16 offset1, offset2;807	u32 ctrl, frc;808	__le64 *ns;809	u8 *data;810 811	/* Mark the egress frame annotation area as valid */812	frc = dpaa2_fd_get_frc(fd);813	dpaa2_fd_set_frc(fd, frc | DPAA2_FD_FRC_FAEADV);814 815	/* Set hardware annotation size */816	ctrl = dpaa2_fd_get_ctrl(fd);817	dpaa2_fd_set_ctrl(fd, ctrl | DPAA2_FD_CTRL_ASAL);818 819	/* enable UPD (update prepanded data) bit in FAEAD field of820	 * hardware frame annotation area821	 */822	ctrl = DPAA2_FAEAD_A2V | DPAA2_FAEAD_UPDV | DPAA2_FAEAD_UPD;823	faead = dpaa2_get_faead(buf_start, true);824	faead->ctrl = cpu_to_le32(ctrl);825 826	if (skb->cb[0] == TX_TSTAMP_ONESTEP_SYNC) {827		if (dpaa2_eth_ptp_parse(skb, &msgtype, &twostep, &udp,828					&offset1, &offset2) ||829		    msgtype != PTP_MSGTYPE_SYNC || twostep) {830			WARN_ONCE(1, "Bad packet for one-step timestamping\n");831			return;832		}833 834		/* Mark the frame annotation status as valid */835		frc = dpaa2_fd_get_frc(fd);836		dpaa2_fd_set_frc(fd, frc | DPAA2_FD_FRC_FASV);837 838		/* Mark the PTP flag for one step timestamping */839		fas = dpaa2_get_fas(buf_start, true);840		fas->status = cpu_to_le32(DPAA2_FAS_PTP);841 842		dpaa2_ptp->caps.gettime64(&dpaa2_ptp->caps, &ts);843		ns = dpaa2_get_ts(buf_start, true);844		*ns = cpu_to_le64(timespec64_to_ns(&ts) /845				  DPAA2_PTP_CLK_PERIOD_NS);846 847		/* Update current time to PTP message originTimestamp field */848		ns_to_ptp_tstamp(&origin_timestamp, le64_to_cpup(ns));849		data = skb_mac_header(skb);850		*(__be16 *)(data + offset2) = htons(origin_timestamp.sec_msb);851		*(__be32 *)(data + offset2 + 2) =852			htonl(origin_timestamp.sec_lsb);853		*(__be32 *)(data + offset2 + 6) = htonl(origin_timestamp.nsec);854 855		if (priv->ptp_correction_off == offset1)856			return;857 858		priv->dpaa2_set_onestep_params_cb(priv, offset1, udp);859		priv->ptp_correction_off = offset1;860 861	}862}863 864void *dpaa2_eth_sgt_get(struct dpaa2_eth_priv *priv)865{866	struct dpaa2_eth_sgt_cache *sgt_cache;867	void *sgt_buf = NULL;868	int sgt_buf_size;869 870	sgt_cache = this_cpu_ptr(priv->sgt_cache);871	sgt_buf_size = priv->tx_data_offset +872		DPAA2_ETH_SG_ENTRIES_MAX * sizeof(struct dpaa2_sg_entry);873 874	if (sgt_cache->count == 0)875		sgt_buf = napi_alloc_frag_align(sgt_buf_size, DPAA2_ETH_TX_BUF_ALIGN);876	else877		sgt_buf = sgt_cache->buf[--sgt_cache->count];878	if (!sgt_buf)879		return NULL;880 881	memset(sgt_buf, 0, sgt_buf_size);882 883	return sgt_buf;884}885 886void dpaa2_eth_sgt_recycle(struct dpaa2_eth_priv *priv, void *sgt_buf)887{888	struct dpaa2_eth_sgt_cache *sgt_cache;889 890	sgt_cache = this_cpu_ptr(priv->sgt_cache);891	if (sgt_cache->count >= DPAA2_ETH_SGT_CACHE_SIZE)892		skb_free_frag(sgt_buf);893	else894		sgt_cache->buf[sgt_cache->count++] = sgt_buf;895}896 897/* Create a frame descriptor based on a fragmented skb */898static int dpaa2_eth_build_sg_fd(struct dpaa2_eth_priv *priv,899				 struct sk_buff *skb,900				 struct dpaa2_fd *fd,901				 void **swa_addr)902{903	struct device *dev = priv->net_dev->dev.parent;904	void *sgt_buf = NULL;905	dma_addr_t addr;906	int nr_frags = skb_shinfo(skb)->nr_frags;907	struct dpaa2_sg_entry *sgt;908	int i, err;909	int sgt_buf_size;910	struct scatterlist *scl, *crt_scl;911	int num_sg;912	int num_dma_bufs;913	struct dpaa2_eth_swa *swa;914 915	/* Create and map scatterlist.916	 * We don't advertise NETIF_F_FRAGLIST, so skb_to_sgvec() will not have917	 * to go beyond nr_frags+1.918	 * Note: We don't support chained scatterlists919	 */920	if (unlikely(PAGE_SIZE / sizeof(struct scatterlist) < nr_frags + 1))921		return -EINVAL;922 923	scl = kmalloc_array(nr_frags + 1, sizeof(struct scatterlist), GFP_ATOMIC);924	if (unlikely(!scl))925		return -ENOMEM;926 927	sg_init_table(scl, nr_frags + 1);928	num_sg = skb_to_sgvec(skb, scl, 0, skb->len);929	if (unlikely(num_sg < 0)) {930		err = -ENOMEM;931		goto dma_map_sg_failed;932	}933	num_dma_bufs = dma_map_sg(dev, scl, num_sg, DMA_BIDIRECTIONAL);934	if (unlikely(!num_dma_bufs)) {935		err = -ENOMEM;936		goto dma_map_sg_failed;937	}938 939	/* Prepare the HW SGT structure */940	sgt_buf_size = priv->tx_data_offset +941		       sizeof(struct dpaa2_sg_entry) *  num_dma_bufs;942	sgt_buf = dpaa2_eth_sgt_get(priv);943	if (unlikely(!sgt_buf)) {944		err = -ENOMEM;945		goto sgt_buf_alloc_failed;946	}947 948	sgt = (struct dpaa2_sg_entry *)(sgt_buf + priv->tx_data_offset);949 950	/* Fill in the HW SGT structure.951	 *952	 * sgt_buf is zeroed out, so the following fields are implicit953	 * in all sgt entries:954	 *   - offset is 0955	 *   - format is 'dpaa2_sg_single'956	 */957	for_each_sg(scl, crt_scl, num_dma_bufs, i) {958		dpaa2_sg_set_addr(&sgt[i], sg_dma_address(crt_scl));959		dpaa2_sg_set_len(&sgt[i], sg_dma_len(crt_scl));960	}961	dpaa2_sg_set_final(&sgt[i - 1], true);962 963	/* Store the skb backpointer in the SGT buffer.964	 * Fit the scatterlist and the number of buffers alongside the965	 * skb backpointer in the software annotation area. We'll need966	 * all of them on Tx Conf.967	 */968	*swa_addr = (void *)sgt_buf;969	swa = (struct dpaa2_eth_swa *)sgt_buf;970	swa->type = DPAA2_ETH_SWA_SG;971	swa->sg.skb = skb;972	swa->sg.scl = scl;973	swa->sg.num_sg = num_sg;974	swa->sg.sgt_size = sgt_buf_size;975 976	/* Separately map the SGT buffer */977	addr = dma_map_single(dev, sgt_buf, sgt_buf_size, DMA_BIDIRECTIONAL);978	if (unlikely(dma_mapping_error(dev, addr))) {979		err = -ENOMEM;980		goto dma_map_single_failed;981	}982	memset(fd, 0, sizeof(struct dpaa2_fd));983	dpaa2_fd_set_offset(fd, priv->tx_data_offset);984	dpaa2_fd_set_format(fd, dpaa2_fd_sg);985	dpaa2_fd_set_addr(fd, addr);986	dpaa2_fd_set_len(fd, skb->len);987	dpaa2_fd_set_ctrl(fd, FD_CTRL_PTA);988 989	return 0;990 991dma_map_single_failed:992	dpaa2_eth_sgt_recycle(priv, sgt_buf);993sgt_buf_alloc_failed:994	dma_unmap_sg(dev, scl, num_sg, DMA_BIDIRECTIONAL);995dma_map_sg_failed:996	kfree(scl);997	return err;998}999 1000/* Create a SG frame descriptor based on a linear skb.1001 *1002 * This function is used on the Tx path when the skb headroom is not large1003 * enough for the HW requirements, thus instead of realloc-ing the skb we1004 * create a SG frame descriptor with only one entry.1005 */1006static int dpaa2_eth_build_sg_fd_single_buf(struct dpaa2_eth_priv *priv,1007					    struct sk_buff *skb,1008					    struct dpaa2_fd *fd,1009					    void **swa_addr)1010{1011	struct device *dev = priv->net_dev->dev.parent;1012	struct dpaa2_sg_entry *sgt;1013	struct dpaa2_eth_swa *swa;1014	dma_addr_t addr, sgt_addr;1015	void *sgt_buf = NULL;1016	int sgt_buf_size;1017	int err;1018 1019	/* Prepare the HW SGT structure */1020	sgt_buf_size = priv->tx_data_offset + sizeof(struct dpaa2_sg_entry);1021	sgt_buf = dpaa2_eth_sgt_get(priv);1022	if (unlikely(!sgt_buf))1023		return -ENOMEM;1024	sgt = (struct dpaa2_sg_entry *)(sgt_buf + priv->tx_data_offset);1025 1026	addr = dma_map_single(dev, skb->data, skb->len, DMA_BIDIRECTIONAL);1027	if (unlikely(dma_mapping_error(dev, addr))) {1028		err = -ENOMEM;1029		goto data_map_failed;1030	}1031 1032	/* Fill in the HW SGT structure */1033	dpaa2_sg_set_addr(sgt, addr);1034	dpaa2_sg_set_len(sgt, skb->len);1035	dpaa2_sg_set_final(sgt, true);1036 1037	/* Store the skb backpointer in the SGT buffer */1038	*swa_addr = (void *)sgt_buf;1039	swa = (struct dpaa2_eth_swa *)sgt_buf;1040	swa->type = DPAA2_ETH_SWA_SINGLE;1041	swa->single.skb = skb;1042	swa->single.sgt_size = sgt_buf_size;1043 1044	/* Separately map the SGT buffer */1045	sgt_addr = dma_map_single(dev, sgt_buf, sgt_buf_size, DMA_BIDIRECTIONAL);1046	if (unlikely(dma_mapping_error(dev, sgt_addr))) {1047		err = -ENOMEM;1048		goto sgt_map_failed;1049	}1050 1051	memset(fd, 0, sizeof(struct dpaa2_fd));1052	dpaa2_fd_set_offset(fd, priv->tx_data_offset);1053	dpaa2_fd_set_format(fd, dpaa2_fd_sg);1054	dpaa2_fd_set_addr(fd, sgt_addr);1055	dpaa2_fd_set_len(fd, skb->len);1056	dpaa2_fd_set_ctrl(fd, FD_CTRL_PTA);1057 1058	return 0;1059 1060sgt_map_failed:1061	dma_unmap_single(dev, addr, skb->len, DMA_BIDIRECTIONAL);1062data_map_failed:1063	dpaa2_eth_sgt_recycle(priv, sgt_buf);1064 1065	return err;1066}1067 1068/* Create a frame descriptor based on a linear skb */1069static int dpaa2_eth_build_single_fd(struct dpaa2_eth_priv *priv,1070				     struct sk_buff *skb,1071				     struct dpaa2_fd *fd,1072				     void **swa_addr)1073{1074	struct device *dev = priv->net_dev->dev.parent;1075	u8 *buffer_start, *aligned_start;1076	struct dpaa2_eth_swa *swa;1077	dma_addr_t addr;1078 1079	buffer_start = skb->data - dpaa2_eth_needed_headroom(skb);1080	aligned_start = PTR_ALIGN(buffer_start - DPAA2_ETH_TX_BUF_ALIGN,1081				  DPAA2_ETH_TX_BUF_ALIGN);1082	if (aligned_start >= skb->head)1083		buffer_start = aligned_start;1084	else1085		return -ENOMEM;1086 1087	/* Store a backpointer to the skb at the beginning of the buffer1088	 * (in the private data area) such that we can release it1089	 * on Tx confirm1090	 */1091	*swa_addr = (void *)buffer_start;1092	swa = (struct dpaa2_eth_swa *)buffer_start;1093	swa->type = DPAA2_ETH_SWA_SINGLE;1094	swa->single.skb = skb;1095 1096	addr = dma_map_single(dev, buffer_start,1097			      skb_tail_pointer(skb) - buffer_start,1098			      DMA_BIDIRECTIONAL);1099	if (unlikely(dma_mapping_error(dev, addr)))1100		return -ENOMEM;1101 1102	memset(fd, 0, sizeof(struct dpaa2_fd));1103	dpaa2_fd_set_addr(fd, addr);1104	dpaa2_fd_set_offset(fd, (u16)(skb->data - buffer_start));1105	dpaa2_fd_set_len(fd, skb->len);1106	dpaa2_fd_set_format(fd, dpaa2_fd_single);1107	dpaa2_fd_set_ctrl(fd, FD_CTRL_PTA);1108 1109	return 0;1110}1111 1112/* FD freeing routine on the Tx path1113 *1114 * DMA-unmap and free FD and possibly SGT buffer allocated on Tx. The skb1115 * back-pointed to is also freed.1116 * This can be called either from dpaa2_eth_tx_conf() or on the error path of1117 * dpaa2_eth_tx().1118 */1119void dpaa2_eth_free_tx_fd(struct dpaa2_eth_priv *priv,1120			  struct dpaa2_eth_channel *ch,1121			  struct dpaa2_eth_fq *fq,1122			  const struct dpaa2_fd *fd, bool in_napi)1123{1124	struct device *dev = priv->net_dev->dev.parent;1125	dma_addr_t fd_addr, sg_addr;1126	struct sk_buff *skb = NULL;1127	unsigned char *buffer_start;1128	struct dpaa2_eth_swa *swa;1129	u8 fd_format = dpaa2_fd_get_format(fd);1130	u32 fd_len = dpaa2_fd_get_len(fd);1131	struct dpaa2_sg_entry *sgt;1132	int should_free_skb = 1;1133	void *tso_hdr;1134	int i;1135 1136	fd_addr = dpaa2_fd_get_addr(fd);1137	buffer_start = dpaa2_iova_to_virt(priv->iommu_domain, fd_addr);1138	swa = (struct dpaa2_eth_swa *)buffer_start;1139 1140	if (fd_format == dpaa2_fd_single) {1141		if (swa->type == DPAA2_ETH_SWA_SINGLE) {1142			skb = swa->single.skb;1143			/* Accessing the skb buffer is safe before dma unmap,1144			 * because we didn't map the actual skb shell.1145			 */1146			dma_unmap_single(dev, fd_addr,1147					 skb_tail_pointer(skb) - buffer_start,1148					 DMA_BIDIRECTIONAL);1149		} else {1150			WARN_ONCE(swa->type != DPAA2_ETH_SWA_XDP, "Wrong SWA type");1151			dma_unmap_single(dev, fd_addr, swa->xdp.dma_size,1152					 DMA_BIDIRECTIONAL);1153		}1154	} else if (fd_format == dpaa2_fd_sg) {1155		if (swa->type == DPAA2_ETH_SWA_SG) {1156			skb = swa->sg.skb;1157 1158			/* Unmap the scatterlist */1159			dma_unmap_sg(dev, swa->sg.scl, swa->sg.num_sg,1160				     DMA_BIDIRECTIONAL);1161			kfree(swa->sg.scl);1162 1163			/* Unmap the SGT buffer */1164			dma_unmap_single(dev, fd_addr, swa->sg.sgt_size,1165					 DMA_BIDIRECTIONAL);1166		} else if (swa->type == DPAA2_ETH_SWA_SW_TSO) {1167			skb = swa->tso.skb;1168 1169			sgt = (struct dpaa2_sg_entry *)(buffer_start +1170							priv->tx_data_offset);1171 1172			/* Unmap the SGT buffer */1173			dma_unmap_single(dev, fd_addr, swa->tso.sgt_size,1174					 DMA_BIDIRECTIONAL);1175 1176			/* Unmap and free the header */1177			tso_hdr = dpaa2_iova_to_virt(priv->iommu_domain, dpaa2_sg_get_addr(sgt));1178			dma_unmap_single(dev, dpaa2_sg_get_addr(sgt), TSO_HEADER_SIZE,1179					 DMA_TO_DEVICE);1180			kfree(tso_hdr);1181 1182			/* Unmap the other SG entries for the data */1183			for (i = 1; i < swa->tso.num_sg; i++)1184				dma_unmap_single(dev, dpaa2_sg_get_addr(&sgt[i]),1185						 dpaa2_sg_get_len(&sgt[i]), DMA_TO_DEVICE);1186 1187			if (!swa->tso.is_last_fd)1188				should_free_skb = 0;1189		} else if (swa->type == DPAA2_ETH_SWA_XSK) {1190			/* Unmap the SGT Buffer */1191			dma_unmap_single(dev, fd_addr, swa->xsk.sgt_size,1192					 DMA_BIDIRECTIONAL);1193		} else {1194			skb = swa->single.skb;1195 1196			/* Unmap the SGT Buffer */1197			dma_unmap_single(dev, fd_addr, swa->single.sgt_size,1198					 DMA_BIDIRECTIONAL);1199 1200			sgt = (struct dpaa2_sg_entry *)(buffer_start +1201							priv->tx_data_offset);1202			sg_addr = dpaa2_sg_get_addr(sgt);1203			dma_unmap_single(dev, sg_addr, skb->len, DMA_BIDIRECTIONAL);1204		}1205	} else {1206		netdev_dbg(priv->net_dev, "Invalid FD format\n");1207		return;1208	}1209 1210	if (swa->type == DPAA2_ETH_SWA_XSK) {1211		ch->xsk_tx_pkts_sent++;1212		dpaa2_eth_sgt_recycle(priv, buffer_start);1213		return;1214	}1215 1216	if (swa->type != DPAA2_ETH_SWA_XDP && in_napi) {1217		fq->dq_frames++;1218		fq->dq_bytes += fd_len;1219	}1220 1221	if (swa->type == DPAA2_ETH_SWA_XDP) {1222		xdp_return_frame(swa->xdp.xdpf);1223		return;1224	}1225 1226	/* Get the timestamp value */1227	if (swa->type != DPAA2_ETH_SWA_SW_TSO) {1228		if (skb->cb[0] == TX_TSTAMP) {1229			struct skb_shared_hwtstamps shhwtstamps;1230			__le64 *ts = dpaa2_get_ts(buffer_start, true);1231			u64 ns;1232 1233			memset(&shhwtstamps, 0, sizeof(shhwtstamps));1234 1235			ns = DPAA2_PTP_CLK_PERIOD_NS * le64_to_cpup(ts);1236			shhwtstamps.hwtstamp = ns_to_ktime(ns);1237			skb_tstamp_tx(skb, &shhwtstamps);1238		} else if (skb->cb[0] == TX_TSTAMP_ONESTEP_SYNC) {1239			mutex_unlock(&priv->onestep_tstamp_lock);1240		}1241	}1242 1243	/* Free SGT buffer allocated on tx */1244	if (fd_format != dpaa2_fd_single)1245		dpaa2_eth_sgt_recycle(priv, buffer_start);1246 1247	/* Move on with skb release. If we are just confirming multiple FDs1248	 * from the same TSO skb then only the last one will need to free the1249	 * skb.1250	 */1251	if (should_free_skb)1252		napi_consume_skb(skb, in_napi);1253}1254 1255static int dpaa2_eth_build_gso_fd(struct dpaa2_eth_priv *priv,1256				  struct sk_buff *skb, struct dpaa2_fd *fd,1257				  int *num_fds, u32 *total_fds_len)1258{1259	struct device *dev = priv->net_dev->dev.parent;1260	int hdr_len, total_len, data_left, fd_len;1261	int num_sge, err, i, sgt_buf_size;1262	struct dpaa2_fd *fd_start = fd;1263	struct dpaa2_sg_entry *sgt;1264	struct dpaa2_eth_swa *swa;1265	dma_addr_t sgt_addr, addr;1266	dma_addr_t tso_hdr_dma;1267	unsigned int index = 0;1268	struct tso_t tso;1269	char *tso_hdr;1270	void *sgt_buf;1271 1272	/* Initialize the TSO handler, and prepare the first payload */1273	hdr_len = tso_start(skb, &tso);1274	*total_fds_len = 0;1275 1276	total_len = skb->len - hdr_len;1277	while (total_len > 0) {1278		/* Prepare the HW SGT structure for this frame */1279		sgt_buf = dpaa2_eth_sgt_get(priv);1280		if (unlikely(!sgt_buf)) {1281			netdev_err(priv->net_dev, "dpaa2_eth_sgt_get() failed\n");1282			err = -ENOMEM;1283			goto err_sgt_get;1284		}1285		sgt = (struct dpaa2_sg_entry *)(sgt_buf + priv->tx_data_offset);1286 1287		/* Determine the data length of this frame */1288		data_left = min_t(int, skb_shinfo(skb)->gso_size, total_len);1289		total_len -= data_left;1290		fd_len = data_left + hdr_len;1291 1292		/* Prepare packet headers: MAC + IP + TCP */1293		tso_hdr = kmalloc(TSO_HEADER_SIZE, GFP_ATOMIC);1294		if (!tso_hdr) {1295			err =  -ENOMEM;1296			goto err_alloc_tso_hdr;1297		}1298 1299		tso_build_hdr(skb, tso_hdr, &tso, data_left, total_len == 0);1300		tso_hdr_dma = dma_map_single(dev, tso_hdr, TSO_HEADER_SIZE, DMA_TO_DEVICE);1301		if (dma_mapping_error(dev, tso_hdr_dma)) {1302			netdev_err(priv->net_dev, "dma_map_single(tso_hdr) failed\n");1303			err = -ENOMEM;1304			goto err_map_tso_hdr;1305		}1306 1307		/* Setup the SG entry for the header */1308		dpaa2_sg_set_addr(sgt, tso_hdr_dma);1309		dpaa2_sg_set_len(sgt, hdr_len);1310		dpaa2_sg_set_final(sgt, data_left <= 0);1311 1312		/* Compose the SG entries for each fragment of data */1313		num_sge = 1;1314		while (data_left > 0) {1315			int size;1316 1317			/* Move to the next SG entry */1318			sgt++;1319			size = min_t(int, tso.size, data_left);1320 1321			addr = dma_map_single(dev, tso.data, size, DMA_TO_DEVICE);1322			if (dma_mapping_error(dev, addr)) {1323				netdev_err(priv->net_dev, "dma_map_single(tso.data) failed\n");1324				err = -ENOMEM;1325				goto err_map_data;1326			}1327			dpaa2_sg_set_addr(sgt, addr);1328			dpaa2_sg_set_len(sgt, size);1329			dpaa2_sg_set_final(sgt, size == data_left);1330 1331			num_sge++;1332 1333			/* Build the data for the __next__ fragment */1334			data_left -= size;1335			tso_build_data(skb, &tso, size);1336		}1337 1338		/* Store the skb backpointer in the SGT buffer */1339		sgt_buf_size = priv->tx_data_offset + num_sge * sizeof(struct dpaa2_sg_entry);1340		swa = (struct dpaa2_eth_swa *)sgt_buf;1341		swa->type = DPAA2_ETH_SWA_SW_TSO;1342		swa->tso.skb = skb;1343		swa->tso.num_sg = num_sge;1344		swa->tso.sgt_size = sgt_buf_size;1345		swa->tso.is_last_fd = total_len == 0 ? 1 : 0;1346 1347		/* Separately map the SGT buffer */1348		sgt_addr = dma_map_single(dev, sgt_buf, sgt_buf_size, DMA_BIDIRECTIONAL);1349		if (unlikely(dma_mapping_error(dev, sgt_addr))) {1350			netdev_err(priv->net_dev, "dma_map_single(sgt_buf) failed\n");1351			err = -ENOMEM;1352			goto err_map_sgt;1353		}1354 1355		/* Setup the frame descriptor */1356		memset(fd, 0, sizeof(struct dpaa2_fd));1357		dpaa2_fd_set_offset(fd, priv->tx_data_offset);1358		dpaa2_fd_set_format(fd, dpaa2_fd_sg);1359		dpaa2_fd_set_addr(fd, sgt_addr);1360		dpaa2_fd_set_len(fd, fd_len);1361		dpaa2_fd_set_ctrl(fd, FD_CTRL_PTA);1362 1363		*total_fds_len += fd_len;1364		/* Advance to the next frame descriptor */1365		fd++;1366		index++;1367	}1368 1369	*num_fds = index;1370 1371	return 0;1372 1373err_map_sgt:1374err_map_data:1375	/* Unmap all the data S/G entries for the current FD */1376	sgt = (struct dpaa2_sg_entry *)(sgt_buf + priv->tx_data_offset);1377	for (i = 1; i < num_sge; i++)1378		dma_unmap_single(dev, dpaa2_sg_get_addr(&sgt[i]),1379				 dpaa2_sg_get_len(&sgt[i]), DMA_TO_DEVICE);1380 1381	/* Unmap the header entry */1382	dma_unmap_single(dev, tso_hdr_dma, TSO_HEADER_SIZE, DMA_TO_DEVICE);1383err_map_tso_hdr:1384	kfree(tso_hdr);1385err_alloc_tso_hdr:1386	dpaa2_eth_sgt_recycle(priv, sgt_buf);1387err_sgt_get:1388	/* Free all the other FDs that were already fully created */1389	for (i = 0; i < index; i++)1390		dpaa2_eth_free_tx_fd(priv, NULL, NULL, &fd_start[i], false);1391 1392	return err;1393}1394 1395static netdev_tx_t __dpaa2_eth_tx(struct sk_buff *skb,1396				  struct net_device *net_dev)1397{1398	struct dpaa2_eth_priv *priv = netdev_priv(net_dev);1399	int total_enqueued = 0, retries = 0, enqueued;1400	struct dpaa2_eth_drv_stats *percpu_extras;1401	struct rtnl_link_stats64 *percpu_stats;1402	unsigned int needed_headroom;1403	int num_fds = 1, max_retries;1404	struct dpaa2_eth_fq *fq;1405	struct netdev_queue *nq;1406	struct dpaa2_fd *fd;1407	u16 queue_mapping;1408	void *swa = NULL;1409	u8 prio = 0;1410	int err, i;1411	u32 fd_len;1412 1413	percpu_stats = this_cpu_ptr(priv->percpu_stats);1414	percpu_extras = this_cpu_ptr(priv->percpu_extras);1415	fd = (this_cpu_ptr(priv->fd))->array;1416 1417	needed_headroom = dpaa2_eth_needed_headroom(skb);1418 1419	/* We'll be holding a back-reference to the skb until Tx Confirmation;1420	 * we don't want that overwritten by a concurrent Tx with a cloned skb.1421	 */1422	skb = skb_unshare(skb, GFP_ATOMIC);1423	if (unlikely(!skb)) {1424		/* skb_unshare() has already freed the skb */1425		percpu_stats->tx_dropped++;1426		return NETDEV_TX_OK;1427	}1428 1429	/* Setup the FD fields */1430 1431	if (skb_is_gso(skb)) {1432		err = dpaa2_eth_build_gso_fd(priv, skb, fd, &num_fds, &fd_len);1433		percpu_extras->tx_sg_frames += num_fds;1434		percpu_extras->tx_sg_bytes += fd_len;1435		percpu_extras->tx_tso_frames += num_fds;1436		percpu_extras->tx_tso_bytes += fd_len;1437	} else if (skb_is_nonlinear(skb)) {1438		err = dpaa2_eth_build_sg_fd(priv, skb, fd, &swa);1439		percpu_extras->tx_sg_frames++;1440		percpu_extras->tx_sg_bytes += skb->len;1441		fd_len = dpaa2_fd_get_len(fd);1442	} else if (skb_headroom(skb) < needed_headroom) {1443		err = dpaa2_eth_build_sg_fd_single_buf(priv, skb, fd, &swa);1444		percpu_extras->tx_sg_frames++;1445		percpu_extras->tx_sg_bytes += skb->len;1446		percpu_extras->tx_converted_sg_frames++;1447		percpu_extras->tx_converted_sg_bytes += skb->len;1448		fd_len = dpaa2_fd_get_len(fd);1449	} else {1450		err = dpaa2_eth_build_single_fd(priv, skb, fd, &swa);1451		fd_len = dpaa2_fd_get_len(fd);1452	}1453 1454	if (unlikely(err)) {1455		percpu_stats->tx_dropped++;1456		goto err_build_fd;1457	}1458 1459	if (swa && skb->cb[0])1460		dpaa2_eth_enable_tx_tstamp(priv, fd, swa, skb);1461 1462	/* Tracing point */1463	for (i = 0; i < num_fds; i++)1464		trace_dpaa2_tx_fd(net_dev, &fd[i]);1465 1466	/* TxConf FQ selection relies on queue id from the stack.1467	 * In case of a forwarded frame from another DPNI interface, we choose1468	 * a queue affined to the same core that processed the Rx frame1469	 */1470	queue_mapping = skb_get_queue_mapping(skb);1471 1472	if (net_dev->num_tc) {1473		prio = netdev_txq_to_tc(net_dev, queue_mapping);1474		/* Hardware interprets priority level 0 as being the highest,1475		 * so we need to do a reverse mapping to the netdev tc index1476		 */1477		prio = net_dev->num_tc - prio - 1;1478		/* We have only one FQ array entry for all Tx hardware queues1479		 * with the same flow id (but different priority levels)1480		 */1481		queue_mapping %= dpaa2_eth_queue_count(priv);1482	}1483	fq = &priv->fq[queue_mapping];1484	nq = netdev_get_tx_queue(net_dev, queue_mapping);1485	netdev_tx_sent_queue(nq, fd_len);1486 1487	/* Everything that happens after this enqueues might race with1488	 * the Tx confirmation callback for this frame1489	 */1490	max_retries = num_fds * DPAA2_ETH_ENQUEUE_RETRIES;1491	while (total_enqueued < num_fds && retries < max_retries) {1492		err = priv->enqueue(priv, fq, &fd[total_enqueued],1493				    prio, num_fds - total_enqueued, &enqueued);1494		if (err == -EBUSY) {1495			retries++;1496			continue;1497		}1498 1499		total_enqueued += enqueued;1500	}1501	percpu_extras->tx_portal_busy += retries;1502 1503	if (unlikely(err < 0)) {1504		percpu_stats->tx_errors++;1505		/* Clean up everything, including freeing the skb */1506		dpaa2_eth_free_tx_fd(priv, NULL, fq, fd, false);1507		netdev_tx_completed_queue(nq, 1, fd_len);1508	} else {1509		percpu_stats->tx_packets += total_enqueued;1510		percpu_stats->tx_bytes += fd_len;1511	}1512 1513	return NETDEV_TX_OK;1514 1515err_build_fd:1516	dev_kfree_skb(skb);1517 1518	return NETDEV_TX_OK;1519}1520 1521static void dpaa2_eth_tx_onestep_tstamp(struct work_struct *work)1522{1523	struct dpaa2_eth_priv *priv = container_of(work, struct dpaa2_eth_priv,1524						   tx_onestep_tstamp);1525	struct sk_buff *skb;1526 1527	while (true) {1528		skb = skb_dequeue(&priv->tx_skbs);1529		if (!skb)1530			return;1531 1532		/* Lock just before TX one-step timestamping packet,1533		 * and release the lock in dpaa2_eth_free_tx_fd when1534		 * confirm the packet has been sent on hardware, or1535		 * when clean up during transmit failure.1536		 */1537		mutex_lock(&priv->onestep_tstamp_lock);1538		__dpaa2_eth_tx(skb, priv->net_dev);1539	}1540}1541 1542static netdev_tx_t dpaa2_eth_tx(struct sk_buff *skb, struct net_device *net_dev)1543{1544	struct dpaa2_eth_priv *priv = netdev_priv(net_dev);1545	u8 msgtype, twostep, udp;1546	u16 offset1, offset2;1547 1548	/* Utilize skb->cb[0] for timestamping request per skb */1549	skb->cb[0] = 0;1550 1551	if ((skb_shinfo(skb)->tx_flags & SKBTX_HW_TSTAMP) && dpaa2_ptp) {1552		if (priv->tx_tstamp_type == HWTSTAMP_TX_ON)1553			skb->cb[0] = TX_TSTAMP;1554		else if (priv->tx_tstamp_type == HWTSTAMP_TX_ONESTEP_SYNC)1555			skb->cb[0] = TX_TSTAMP_ONESTEP_SYNC;1556	}1557 1558	/* TX for one-step timestamping PTP Sync packet */1559	if (skb->cb[0] == TX_TSTAMP_ONESTEP_SYNC) {1560		if (!dpaa2_eth_ptp_parse(skb, &msgtype, &twostep, &udp,1561					 &offset1, &offset2))1562			if (msgtype == PTP_MSGTYPE_SYNC && twostep == 0) {1563				skb_queue_tail(&priv->tx_skbs, skb);1564				queue_work(priv->dpaa2_ptp_wq,1565					   &priv->tx_onestep_tstamp);1566				return NETDEV_TX_OK;1567			}1568		/* Use two-step timestamping if not one-step timestamping1569		 * PTP Sync packet1570		 */1571		skb->cb[0] = TX_TSTAMP;1572	}1573 1574	/* TX for other packets */1575	return __dpaa2_eth_tx(skb, net_dev);1576}1577 1578/* Tx confirmation frame processing routine */1579static void dpaa2_eth_tx_conf(struct dpaa2_eth_priv *priv,1580			      struct dpaa2_eth_channel *ch,1581			      const struct dpaa2_fd *fd,1582			      struct dpaa2_eth_fq *fq)1583{1584	struct rtnl_link_stats64 *percpu_stats;1585	struct dpaa2_eth_drv_stats *percpu_extras;1586	u32 fd_len = dpaa2_fd_get_len(fd);1587	u32 fd_errors;1588 1589	/* Tracing point */1590	trace_dpaa2_tx_conf_fd(priv->net_dev, fd);1591 1592	percpu_extras = this_cpu_ptr(priv->percpu_extras);1593	percpu_extras->tx_conf_frames++;1594	percpu_extras->tx_conf_bytes += fd_len;1595	ch->stats.bytes_per_cdan += fd_len;1596 1597	/* Check frame errors in the FD field */1598	fd_errors = dpaa2_fd_get_ctrl(fd) & DPAA2_FD_TX_ERR_MASK;1599	dpaa2_eth_free_tx_fd(priv, ch, fq, fd, true);1600 1601	if (likely(!fd_errors))1602		return;1603 1604	if (net_ratelimit())1605		netdev_dbg(priv->net_dev, "TX frame FD error: 0x%08x\n",1606			   fd_errors);1607 1608	percpu_stats = this_cpu_ptr(priv->percpu_stats);1609	/* Tx-conf logically pertains to the egress path. */1610	percpu_stats->tx_errors++;1611}1612 1613static int dpaa2_eth_set_rx_vlan_filtering(struct dpaa2_eth_priv *priv,1614					   bool enable)1615{1616	int err;1617 1618	err = dpni_enable_vlan_filter(priv->mc_io, 0, priv->mc_token, enable);1619 1620	if (err) {1621		netdev_err(priv->net_dev,1622			   "dpni_enable_vlan_filter failed\n");1623		return err;1624	}1625 1626	return 0;1627}1628 1629static int dpaa2_eth_set_rx_csum(struct dpaa2_eth_priv *priv, bool enable)1630{1631	int err;1632 1633	err = dpni_set_offload(priv->mc_io, 0, priv->mc_token,1634			       DPNI_OFF_RX_L3_CSUM, enable);1635	if (err) {1636		netdev_err(priv->net_dev,1637			   "dpni_set_offload(RX_L3_CSUM) failed\n");1638		return err;1639	}1640 1641	err = dpni_set_offload(priv->mc_io, 0, priv->mc_token,1642			       DPNI_OFF_RX_L4_CSUM, enable);1643	if (err) {1644		netdev_err(priv->net_dev,1645			   "dpni_set_offload(RX_L4_CSUM) failed\n");1646		return err;1647	}1648 1649	return 0;1650}1651 1652static int dpaa2_eth_set_tx_csum(struct dpaa2_eth_priv *priv, bool enable)1653{1654	int err;1655 1656	err = dpni_set_offload(priv->mc_io, 0, priv->mc_token,1657			       DPNI_OFF_TX_L3_CSUM, enable);1658	if (err) {1659		netdev_err(priv->net_dev, "dpni_set_offload(TX_L3_CSUM) failed\n");1660		return err;1661	}1662 1663	err = dpni_set_offload(priv->mc_io, 0, priv->mc_token,1664			       DPNI_OFF_TX_L4_CSUM, enable);1665	if (err) {1666		netdev_err(priv->net_dev, "dpni_set_offload(TX_L4_CSUM) failed\n");1667		return err;1668	}1669 1670	return 0;1671}1672 1673/* Perform a single release command to add buffers1674 * to the specified buffer pool1675 */1676static int dpaa2_eth_add_bufs(struct dpaa2_eth_priv *priv,1677			      struct dpaa2_eth_channel *ch)1678{1679	struct xdp_buff *xdp_buffs[DPAA2_ETH_BUFS_PER_CMD];1680	struct device *dev = priv->net_dev->dev.parent;1681	u64 buf_array[DPAA2_ETH_BUFS_PER_CMD];1682	struct dpaa2_eth_swa *swa;1683	struct page *page;1684	dma_addr_t addr;1685	int retries = 0;1686	int i = 0, err;1687	u32 batch;1688 1689	/* Allocate buffers visible to WRIOP */1690	if (!ch->xsk_zc) {1691		for (i = 0; i < DPAA2_ETH_BUFS_PER_CMD; i++) {1692			/* Also allocate skb shared info and alignment padding.1693			 * There is one page for each Rx buffer. WRIOP sees1694			 * the entire page except for a tailroom reserved for1695			 * skb shared info1696			 */1697			page = dev_alloc_pages(0);1698			if (!page)1699				goto err_alloc;1700 1701			addr = dma_map_page(dev, page, 0, priv->rx_buf_size,1702					    DMA_BIDIRECTIONAL);1703			if (unlikely(dma_mapping_error(dev, addr)))1704				goto err_map;1705 1706			buf_array[i] = addr;1707 1708			/* tracing point */1709			trace_dpaa2_eth_buf_seed(priv->net_dev,1710						 page_address(page),1711						 DPAA2_ETH_RX_BUF_RAW_SIZE,1712						 addr, priv->rx_buf_size,1713						 ch->bp->bpid);1714		}1715	} else if (xsk_buff_can_alloc(ch->xsk_pool, DPAA2_ETH_BUFS_PER_CMD)) {1716		/* Allocate XSK buffers for AF_XDP fast path in batches1717		 * of DPAA2_ETH_BUFS_PER_CMD. Bail out if the UMEM cannot1718		 * provide enough buffers at the moment1719		 */1720		batch = xsk_buff_alloc_batch(ch->xsk_pool, xdp_buffs,1721					     DPAA2_ETH_BUFS_PER_CMD);1722		if (!batch)1723			goto err_alloc;1724 1725		for (i = 0; i < batch; i++) {1726			swa = (struct dpaa2_eth_swa *)(xdp_buffs[i]->data_hard_start +1727						       DPAA2_ETH_RX_HWA_SIZE);1728			swa->xsk.xdp_buff = xdp_buffs[i];1729 1730			addr = xsk_buff_xdp_get_frame_dma(xdp_buffs[i]);1731			if (unlikely(dma_mapping_error(dev, addr)))1732				goto err_map;1733 1734			buf_array[i] = addr;1735 1736			trace_dpaa2_xsk_buf_seed(priv->net_dev,1737						 xdp_buffs[i]->data_hard_start,1738						 DPAA2_ETH_RX_BUF_RAW_SIZE,1739						 addr, priv->rx_buf_size,1740						 ch->bp->bpid);1741		}1742	}1743 1744release_bufs:1745	/* In case the portal is busy, retry until successful */1746	while ((err = dpaa2_io_service_release(ch->dpio, ch->bp->bpid,1747					       buf_array, i)) == -EBUSY) {1748		if (retries++ >= DPAA2_ETH_SWP_BUSY_RETRIES)1749			break;1750		cpu_relax();1751	}1752 1753	/* If release command failed, clean up and bail out;1754	 * not much else we can do about it1755	 */1756	if (err) {1757		dpaa2_eth_free_bufs(priv, buf_array, i, ch->xsk_zc);1758		return 0;1759	}1760 1761	return i;1762 1763err_map:1764	if (!ch->xsk_zc) {1765		__free_pages(page, 0);1766	} else {1767		for (; i < batch; i++)1768			xsk_buff_free(xdp_buffs[i]);1769	}1770err_alloc:1771	/* If we managed to allocate at least some buffers,1772	 * release them to hardware1773	 */1774	if (i)1775		goto release_bufs;1776 1777	return 0;1778}1779 1780static int dpaa2_eth_seed_pool(struct dpaa2_eth_priv *priv,1781			       struct dpaa2_eth_channel *ch)1782{1783	int i;1784	int new_count;1785 1786	for (i = 0; i < DPAA2_ETH_NUM_BUFS; i += DPAA2_ETH_BUFS_PER_CMD) {1787		new_count = dpaa2_eth_add_bufs(priv, ch);1788		ch->buf_count += new_count;1789 1790		if (new_count < DPAA2_ETH_BUFS_PER_CMD)1791			return -ENOMEM;1792	}1793 1794	return 0;1795}1796 1797static void dpaa2_eth_seed_pools(struct dpaa2_eth_priv *priv)1798{1799	struct net_device *net_dev = priv->net_dev;1800	struct dpaa2_eth_channel *channel;1801	int i, err = 0;1802 1803	for (i = 0; i < priv->num_channels; i++) {1804		channel = priv->channel[i];1805 1806		err = dpaa2_eth_seed_pool(priv, channel);1807 1808		/* Not much to do; the buffer pool, though not filled up,1809		 * may still contain some buffers which would enable us1810		 * to limp on.1811		 */1812		if (err)1813			netdev_err(net_dev, "Buffer seeding failed for DPBP %d (bpid=%d)\n",1814				   channel->bp->dev->obj_desc.id,1815				   channel->bp->bpid);1816	}1817}1818 1819/*1820 * Drain the specified number of buffers from one of the DPNI's private buffer1821 * pools.1822 * @count must not exceeed DPAA2_ETH_BUFS_PER_CMD1823 */1824static void dpaa2_eth_drain_bufs(struct dpaa2_eth_priv *priv, int bpid,1825				 int count)1826{1827	u64 buf_array[DPAA2_ETH_BUFS_PER_CMD];1828	bool xsk_zc = false;1829	int retries = 0;1830	int i, ret;1831 1832	for (i = 0; i < priv->num_channels; i++)1833		if (priv->channel[i]->bp->bpid == bpid)1834			xsk_zc = priv->channel[i]->xsk_zc;1835 1836	do {1837		ret = dpaa2_io_service_acquire(NULL, bpid, buf_array, count);1838		if (ret < 0) {1839			if (ret == -EBUSY &&1840			    retries++ < DPAA2_ETH_SWP_BUSY_RETRIES)1841				continue;1842			netdev_err(priv->net_dev, "dpaa2_io_service_acquire() failed\n");1843			return;1844		}1845		dpaa2_eth_free_bufs(priv, buf_array, ret, xsk_zc);1846		retries = 0;1847	} while (ret);1848}1849 1850static void dpaa2_eth_drain_pool(struct dpaa2_eth_priv *priv, int bpid)1851{1852	int i;1853 1854	/* Drain the buffer pool */1855	dpaa2_eth_drain_bufs(priv, bpid, DPAA2_ETH_BUFS_PER_CMD);1856	dpaa2_eth_drain_bufs(priv, bpid, 1);1857 1858	/* Setup to zero the buffer count of all channels which were1859	 * using this buffer pool.1860	 */1861	for (i = 0; i < priv->num_channels; i++)1862		if (priv->channel[i]->bp->bpid == bpid)1863			priv->channel[i]->buf_count = 0;1864}1865 1866static void dpaa2_eth_drain_pools(struct dpaa2_eth_priv *priv)1867{1868	int i;1869 1870	for (i = 0; i < priv->num_bps; i++)1871		dpaa2_eth_drain_pool(priv, priv->bp[i]->bpid);1872}1873 1874/* Function is called from softirq context only, so we don't need to guard1875 * the access to percpu count1876 */1877static int dpaa2_eth_refill_pool(struct dpaa2_eth_priv *priv,1878				 struct dpaa2_eth_channel *ch)1879{1880	int new_count;1881 1882	if (likely(ch->buf_count >= DPAA2_ETH_REFILL_THRESH))1883		return 0;1884 1885	do {1886		new_count = dpaa2_eth_add_bufs(priv, ch);1887		if (unlikely(!new_count)) {1888			/* Out of memory; abort for now, we'll try later on */1889			break;1890		}1891		ch->buf_count += new_count;1892	} while (ch->buf_count < DPAA2_ETH_NUM_BUFS);1893 1894	if (unlikely(ch->buf_count < DPAA2_ETH_NUM_BUFS))1895		return -ENOMEM;1896 1897	return 0;1898}1899 1900static void dpaa2_eth_sgt_cache_drain(struct dpaa2_eth_priv *priv)1901{1902	struct dpaa2_eth_sgt_cache *sgt_cache;1903	u16 count;1904	int k, i;1905 1906	for_each_possible_cpu(k) {1907		sgt_cache = per_cpu_ptr(priv->sgt_cache, k);1908		count = sgt_cache->count;1909 1910		for (i = 0; i < count; i++)1911			skb_free_frag(sgt_cache->buf[i]);1912		sgt_cache->count = 0;1913	}1914}1915 1916static int dpaa2_eth_pull_channel(struct dpaa2_eth_channel *ch)1917{1918	int err;1919	int dequeues = -1;1920 1921	/* Retry while portal is busy */1922	do {1923		err = dpaa2_io_service_pull_channel(ch->dpio, ch->ch_id,1924						    ch->store);1925		dequeues++;1926		cpu_relax();1927	} while (err == -EBUSY && dequeues < DPAA2_ETH_SWP_BUSY_RETRIES);1928 1929	ch->stats.dequeue_portal_busy += dequeues;1930	if (unlikely(err))1931		ch->stats.pull_err++;1932 1933	return err;1934}1935 1936/* NAPI poll routine1937 *1938 * Frames are dequeued from the QMan channel associated with this NAPI context.1939 * Rx, Tx confirmation and (if configured) Rx error frames all count1940 * towards the NAPI budget.1941 */1942static int dpaa2_eth_poll(struct napi_struct *napi, int budget)1943{1944	struct dpaa2_eth_channel *ch;1945	struct dpaa2_eth_priv *priv;1946	int rx_cleaned = 0, txconf_cleaned = 0;1947	struct dpaa2_eth_fq *fq, *txc_fq = NULL;1948	struct netdev_queue *nq;1949	int store_cleaned, work_done;1950	bool work_done_zc = false;1951	struct list_head rx_list;1952	int retries = 0;1953	u16 flowid;1954	int err;1955 1956	ch = container_of(napi, struct dpaa2_eth_channel, napi);1957	ch->xdp.res = 0;1958	priv = ch->priv;1959 1960	INIT_LIST_HEAD(&rx_list);1961	ch->rx_list = &rx_list;1962 1963	if (ch->xsk_zc) {1964		work_done_zc = dpaa2_xsk_tx(priv, ch);1965		/* If we reached the XSK Tx per NAPI threshold, we're done */1966		if (work_done_zc) {1967			work_done = budget;1968			goto out;1969		}1970	}1971 1972	do {1973		err = dpaa2_eth_pull_channel(ch);1974		if (unlikely(err))1975			break;1976 1977		/* Refill pool if appropriate */1978		dpaa2_eth_refill_pool(priv, ch);1979 1980		store_cleaned = dpaa2_eth_consume_frames(ch, &fq);1981		if (store_cleaned <= 0)1982			break;1983		if (fq->type == DPAA2_RX_FQ) {1984			rx_cleaned += store_cleaned;1985			flowid = fq->flowid;1986		} else {1987			txconf_cleaned += store_cleaned;1988			/* We have a single Tx conf FQ on this channel */1989			txc_fq = fq;1990		}1991 1992		/* If we either consumed the whole NAPI budget with Rx frames1993		 * or we reached the Tx confirmations threshold, we're done.1994		 */1995		if (rx_cleaned >= budget ||1996		    txconf_cleaned >= DPAA2_ETH_TXCONF_PER_NAPI) {1997			work_done = budget;1998			if (ch->xdp.res & XDP_REDIRECT)1999				xdp_do_flush();2000			goto out;2001		}2002	} while (store_cleaned);2003 2004	if (ch->xdp.res & XDP_REDIRECT)2005		xdp_do_flush();2006 2007	/* Update NET DIM with the values for this CDAN */2008	dpaa2_io_update_net_dim(ch->dpio, ch->stats.frames_per_cdan,2009				ch->stats.bytes_per_cdan);2010	ch->stats.frames_per_cdan = 0;2011	ch->stats.bytes_per_cdan = 0;2012 2013	/* We didn't consume the entire budget, so finish napi and2014	 * re-enable data availability notifications2015	 */2016	napi_complete_done(napi, rx_cleaned);2017	do {2018		err = dpaa2_io_service_rearm(ch->dpio, &ch->nctx);2019		cpu_relax();2020	} while (err == -EBUSY && retries++ < DPAA2_ETH_SWP_BUSY_RETRIES);2021	WARN_ONCE(err, "CDAN notifications rearm failed on core %d",2022		  ch->nctx.desired_cpu);2023 2024	work_done = max(rx_cleaned, 1);2025 2026out:2027	netif_receive_skb_list(ch->rx_list);2028 2029	if (ch->xsk_tx_pkts_sent) {2030		xsk_tx_completed(ch->xsk_pool, ch->xsk_tx_pkts_sent);2031		ch->xsk_tx_pkts_sent = 0;2032	}2033 2034	if (txc_fq && txc_fq->dq_frames) {2035		nq = netdev_get_tx_queue(priv->net_dev, txc_fq->flowid);2036		netdev_tx_completed_queue(nq, txc_fq->dq_frames,2037					  txc_fq->dq_bytes);2038		txc_fq->dq_frames = 0;2039		txc_fq->dq_bytes = 0;2040	}2041 2042	if (rx_cleaned && ch->xdp.res & XDP_TX)2043		dpaa2_eth_xdp_tx_flush(priv, ch, &priv->fq[flowid]);2044 2045	return work_done;2046}2047 2048static void dpaa2_eth_enable_ch_napi(struct dpaa2_eth_priv *priv)2049{2050	struct dpaa2_eth_channel *ch;2051	int i;2052 2053	for (i = 0; i < priv->num_channels; i++) {2054		ch = priv->channel[i];2055		napi_enable(&ch->napi);2056	}2057}2058 2059static void dpaa2_eth_disable_ch_napi(struct dpaa2_eth_priv *priv)2060{2061	struct dpaa2_eth_channel *ch;2062	int i;2063 2064	for (i = 0; i < priv->num_channels; i++) {2065		ch = priv->channel[i];2066		napi_disable(&ch->napi);2067	}2068}2069 2070void dpaa2_eth_set_rx_taildrop(struct dpaa2_eth_priv *priv,2071			       bool tx_pause, bool pfc)2072{2073	struct dpni_taildrop td = {0};2074	struct dpaa2_eth_fq *fq;2075	int i, err;2076 2077	/* FQ taildrop: threshold is in bytes, per frame queue. Enabled if2078	 * flow control is disabled (as it might interfere with either the2079	 * buffer pool depletion trigger for pause frames or with the group2080	 * congestion trigger for PFC frames)2081	 */2082	td.enable = !tx_pause;2083	if (priv->rx_fqtd_enabled == td.enable)2084		goto set_cgtd;2085 2086	td.threshold = DPAA2_ETH_FQ_TAILDROP_THRESH;2087	td.units = DPNI_CONGESTION_UNIT_BYTES;2088 2089	for (i = 0; i < priv->num_fqs; i++) {2090		fq = &priv->fq[i];2091		if (fq->type != DPAA2_RX_FQ)2092			continue;2093		err = dpni_set_taildrop(priv->mc_io, 0, priv->mc_token,2094					DPNI_CP_QUEUE, DPNI_QUEUE_RX,2095					fq->tc, fq->flowid, &td);2096		if (err) {2097			netdev_err(priv->net_dev,2098				   "dpni_set_taildrop(FQ) failed\n");2099			return;2100		}2101	}2102 2103	priv->rx_fqtd_enabled = td.enable;2104 2105set_cgtd:2106	/* Congestion group taildrop: threshold is in frames, per group2107	 * of FQs belonging to the same traffic class2108	 * Enabled if general Tx pause disabled or if PFCs are enabled2109	 * (congestion group threhsold for PFC generation is lower than the2110	 * CG taildrop threshold, so it won't interfere with it; we also2111	 * want frames in non-PFC enabled traffic classes to be kept in check)2112	 */2113	td.enable = !tx_pause || pfc;2114	if (priv->rx_cgtd_enabled == td.enable)2115		return;2116 2117	td.threshold = DPAA2_ETH_CG_TAILDROP_THRESH(priv);2118	td.units = DPNI_CONGESTION_UNIT_FRAMES;2119	for (i = 0; i < dpaa2_eth_tc_count(priv); i++) {2120		err = dpni_set_taildrop(priv->mc_io, 0, priv->mc_token,2121					DPNI_CP_GROUP, DPNI_QUEUE_RX,2122					i, 0, &td);2123		if (err) {2124			netdev_err(priv->net_dev,2125				   "dpni_set_taildrop(CG) failed\n");2126			return;2127		}2128	}2129 2130	priv->rx_cgtd_enabled = td.enable;2131}2132 2133static int dpaa2_eth_link_state_update(struct dpaa2_eth_priv *priv)2134{2135	struct dpni_link_state state = {0};2136	bool tx_pause;2137	int err;2138 2139	err = dpni_get_link_state(priv->mc_io, 0, priv->mc_token, &state);2140	if (unlikely(err)) {2141		netdev_err(priv->net_dev,2142			   "dpni_get_link_state() failed\n");2143		return err;2144	}2145 2146	/* If Tx pause frame settings have changed, we need to update2147	 * Rx FQ taildrop configuration as well. We configure taildrop2148	 * only when pause frame generation is disabled.2149	 */2150	tx_pause = dpaa2_eth_tx_pause_enabled(state.options);2151	dpaa2_eth_set_rx_taildrop(priv, tx_pause, priv->pfc_enabled);2152 2153	/* When we manage the MAC/PHY using phylink there is no need2154	 * to manually update the netif_carrier.2155	 * We can avoid locking because we are called from the "link changed"2156	 * IRQ handler, which is the same as the "endpoint changed" IRQ handler2157	 * (the writer to priv->mac), so we cannot race with it.2158	 */2159	if (dpaa2_mac_is_type_phy(priv->mac))2160		goto out;2161 2162	/* Chech link state; speed / duplex changes are not treated yet */2163	if (priv->link_state.up == state.up)2164		goto out;2165 2166	if (state.up) {2167		netif_carrier_on(priv->net_dev);2168		netif_tx_start_all_queues(priv->net_dev);2169	} else {2170		netif_tx_stop_all_queues(priv->net_dev);2171		netif_carrier_off(priv->net_dev);2172	}2173 2174	netdev_info(priv->net_dev, "Link Event: state %s\n",2175		    state.up ? "up" : "down");2176 2177out:2178	priv->link_state = state;2179 2180	return 0;2181}2182 2183static int dpaa2_eth_open(struct net_device *net_dev)2184{2185	struct dpaa2_eth_priv *priv = netdev_priv(net_dev);2186	int err;2187 2188	dpaa2_eth_seed_pools(priv);2189 2190	mutex_lock(&priv->mac_lock);2191 2192	if (!dpaa2_eth_is_type_phy(priv)) {2193		/* We'll only start the txqs when the link is actually ready;2194		 * make sure we don't race against the link up notification,2195		 * which may come immediately after dpni_enable();2196		 */2197		netif_tx_stop_all_queues(net_dev);2198 2199		/* Also, explicitly set carrier off, otherwise2200		 * netif_carrier_ok() will return true and cause 'ip link show'2201		 * to report the LOWER_UP flag, even though the link2202		 * notification wasn't even received.2203		 */2204		netif_carrier_off(net_dev);2205	}2206	dpaa2_eth_enable_ch_napi(priv);2207 2208	err = dpni_enable(priv->mc_io, 0, priv->mc_token);2209	if (err < 0) {2210		mutex_unlock(&priv->mac_lock);2211		netdev_err(net_dev, "dpni_enable() failed\n");2212		goto enable_err;2213	}2214 2215	if (dpaa2_eth_is_type_phy(priv))2216		dpaa2_mac_start(priv->mac);2217 2218	mutex_unlock(&priv->mac_lock);2219 2220	return 0;2221 2222enable_err:2223	dpaa2_eth_disable_ch_napi(priv);2224	dpaa2_eth_drain_pools(priv);2225	return err;2226}2227 2228/* Total number of in-flight frames on ingress queues */2229static u32 dpaa2_eth_ingress_fq_count(struct dpaa2_eth_priv *priv)2230{2231	struct dpaa2_eth_fq *fq;2232	u32 fcnt = 0, bcnt = 0, total = 0;2233	int i, err;2234 2235	for (i = 0; i < priv->num_fqs; i++) {2236		fq = &priv->fq[i];2237		err = dpaa2_io_query_fq_count(NULL, fq->fqid, &fcnt, &bcnt);2238		if (err) {2239			netdev_warn(priv->net_dev, "query_fq_count failed");2240			break;2241		}2242		total += fcnt;2243	}2244 2245	return total;2246}2247 2248static void dpaa2_eth_wait_for_ingress_fq_empty(struct dpaa2_eth_priv *priv)2249{2250	int retries = 10;2251	u32 pending;2252 2253	do {2254		pending = dpaa2_eth_ingress_fq_count(priv);2255		if (pending)2256			msleep(100);2257	} while (pending && --retries);2258}2259 2260#define DPNI_TX_PENDING_VER_MAJOR	72261#define DPNI_TX_PENDING_VER_MINOR	132262static void dpaa2_eth_wait_for_egress_fq_empty(struct dpaa2_eth_priv *priv)2263{2264	union dpni_statistics stats;2265	int retries = 10;2266	int err;2267 2268	if (dpaa2_eth_cmp_dpni_ver(priv, DPNI_TX_PENDING_VER_MAJOR,2269				   DPNI_TX_PENDING_VER_MINOR) < 0)2270		goto out;2271 2272	do {2273		err = dpni_get_statistics(priv->mc_io, 0, priv->mc_token, 6,2274					  &stats);2275		if (err)2276			goto out;2277		if (stats.page_6.tx_pending_frames == 0)2278			return;2279	} while (--retries);2280 2281out:2282	msleep(500);2283}2284 2285static int dpaa2_eth_stop(struct net_device *net_dev)2286{2287	struct dpaa2_eth_priv *priv = netdev_priv(net_dev);2288	int dpni_enabled = 0;2289	int retries = 10;2290 2291	mutex_lock(&priv->mac_lock);2292 2293	if (dpaa2_eth_is_type_phy(priv)) {2294		dpaa2_mac_stop(priv->mac);2295	} else {2296		netif_tx_stop_all_queues(net_dev);2297		netif_carrier_off(net_dev);2298	}2299 2300	mutex_unlock(&priv->mac_lock);2301 2302	/* On dpni_disable(), the MC firmware will:2303	 * - stop MAC Rx and wait for all Rx frames to be enqueued to software2304	 * - cut off WRIOP dequeues from egress FQs and wait until transmission2305	 * of all in flight Tx frames is finished (and corresponding Tx conf2306	 * frames are enqueued back to software)2307	 *2308	 * Before calling dpni_disable(), we wait for all Tx frames to arrive2309	 * on WRIOP. After it finishes, wait until all remaining frames on Rx2310	 * and Tx conf queues are consumed on NAPI poll.2311	 */2312	dpaa2_eth_wait_for_egress_fq_empty(priv);2313 2314	do {2315		dpni_disable(priv->mc_io, 0, priv->mc_token);2316		dpni_is_enabled(priv->mc_io, 0, priv->mc_token, &dpni_enabled);2317		if (dpni_enabled)2318			/* Allow the hardware some slack */2319			msleep(100);2320	} while (dpni_enabled && --retries);2321	if (!retries) {2322		netdev_warn(net_dev, "Retry count exceeded disabling DPNI\n");2323		/* Must go on and disable NAPI nonetheless, so we don't crash at2324		 * the next "ifconfig up"2325		 */2326	}2327 2328	dpaa2_eth_wait_for_ingress_fq_empty(priv);2329	dpaa2_eth_disable_ch_napi(priv);2330 2331	/* Empty the buffer pool */2332	dpaa2_eth_drain_pools(priv);2333 2334	/* Empty the Scatter-Gather Buffer cache */2335	dpaa2_eth_sgt_cache_drain(priv);2336 2337	return 0;2338}2339 2340static int dpaa2_eth_set_addr(struct net_device *net_dev, void *addr)2341{2342	struct dpaa2_eth_priv *priv = netdev_priv(net_dev);2343	struct device *dev = net_dev->dev.parent;2344	int err;2345 2346	err = eth_mac_addr(net_dev, addr);2347	if (err < 0) {2348		dev_err(dev, "eth_mac_addr() failed (%d)\n", err);2349		return err;2350	}2351 2352	err = dpni_set_primary_mac_addr(priv->mc_io, 0, priv->mc_token,2353					net_dev->dev_addr);2354	if (err) {2355		dev_err(dev, "dpni_set_primary_mac_addr() failed (%d)\n", err);2356		return err;2357	}2358 2359	return 0;2360}2361 2362/** Fill in counters maintained by the GPP driver. These may be different from2363 * the hardware counters obtained by ethtool.2364 */2365static void dpaa2_eth_get_stats(struct net_device *net_dev,2366				struct rtnl_link_stats64 *stats)2367{2368	struct dpaa2_eth_priv *priv = netdev_priv(net_dev);2369	struct rtnl_link_stats64 *percpu_stats;2370	u64 *cpustats;2371	u64 *netstats = (u64 *)stats;2372	int i, j;2373	int num = sizeof(struct rtnl_link_stats64) / sizeof(u64);2374 2375	for_each_possible_cpu(i) {2376		percpu_stats = per_cpu_ptr(priv->percpu_stats, i);2377		cpustats = (u64 *)percpu_stats;2378		for (j = 0; j < num; j++)2379			netstats[j] += cpustats[j];2380	}2381}2382 2383/* Copy mac unicast addresses from @net_dev to @priv.2384 * Its sole purpose is to make dpaa2_eth_set_rx_mode() more readable.2385 */2386static void dpaa2_eth_add_uc_hw_addr(const struct net_device *net_dev,2387				     struct dpaa2_eth_priv *priv)2388{2389	struct netdev_hw_addr *ha;2390	int err;2391 2392	netdev_for_each_uc_addr(ha, net_dev) {2393		err = dpni_add_mac_addr(priv->mc_io, 0, priv->mc_token,2394					ha->addr);2395		if (err)2396			netdev_warn(priv->net_dev,2397				    "Could not add ucast MAC %pM to the filtering table (err %d)\n",2398				    ha->addr, err);2399	}2400}2401 2402/* Copy mac multicast addresses from @net_dev to @priv2403 * Its sole purpose is to make dpaa2_eth_set_rx_mode() more readable.2404 */2405static void dpaa2_eth_add_mc_hw_addr(const struct net_device *net_dev,2406				     struct dpaa2_eth_priv *priv)2407{2408	struct netdev_hw_addr *ha;2409	int err;2410 2411	netdev_for_each_mc_addr(ha, net_dev) {2412		err = dpni_add_mac_addr(priv->mc_io, 0, priv->mc_token,2413					ha->addr);2414		if (err)2415			netdev_warn(priv->net_dev,2416				    "Could not add mcast MAC %pM to the filtering table (err %d)\n",2417				    ha->addr, err);2418	}2419}2420 2421static int dpaa2_eth_rx_add_vid(struct net_device *net_dev,2422				__be16 vlan_proto, u16 vid)2423{2424	struct dpaa2_eth_priv *priv = netdev_priv(net_dev);2425	int err;2426 2427	err = dpni_add_vlan_id(priv->mc_io, 0, priv->mc_token,2428			       vid, 0, 0, 0);2429 2430	if (err) {2431		netdev_warn(priv->net_dev,2432			    "Could not add the vlan id %u\n",2433			    vid);2434		return err;2435	}2436 2437	return 0;2438}2439 2440static int dpaa2_eth_rx_kill_vid(struct net_device *net_dev,2441				 __be16 vlan_proto, u16 vid)2442{2443	struct dpaa2_eth_priv *priv = netdev_priv(net_dev);2444	int err;2445 2446	err = dpni_remove_vlan_id(priv->mc_io, 0, priv->mc_token, vid);2447 2448	if (err) {2449		netdev_warn(priv->net_dev,2450			    "Could not remove the vlan id %u\n",2451			    vid);2452		return err;2453	}2454 2455	return 0;2456}2457 2458static void dpaa2_eth_set_rx_mode(struct net_device *net_dev)2459{2460	struct dpaa2_eth_priv *priv = netdev_priv(net_dev);2461	int uc_count = netdev_uc_count(net_dev);2462	int mc_count = netdev_mc_count(net_dev);2463	u8 max_mac = priv->dpni_attrs.mac_filter_entries;2464	u32 options = priv->dpni_attrs.options;2465	u16 mc_token = priv->mc_token;2466	struct fsl_mc_io *mc_io = priv->mc_io;2467	int err;2468 2469	/* Basic sanity checks; these probably indicate a misconfiguration */2470	if (options & DPNI_OPT_NO_MAC_FILTER && max_mac != 0)2471		netdev_info(net_dev,2472			    "mac_filter_entries=%d, DPNI_OPT_NO_MAC_FILTER option must be disabled\n",2473			    max_mac);2474 2475	/* Force promiscuous if the uc or mc counts exceed our capabilities. */2476	if (uc_count > max_mac) {2477		netdev_info(net_dev,2478			    "Unicast addr count reached %d, max allowed is %d; forcing promisc\n",2479			    uc_count, max_mac);2480		goto force_promisc;2481	}2482	if (mc_count + uc_count > max_mac) {2483		netdev_info(net_dev,2484			    "Unicast + multicast addr count reached %d, max allowed is %d; forcing promisc\n",2485			    uc_count + mc_count, max_mac);2486		goto force_mc_promisc;2487	}2488 2489	/* Adjust promisc settings due to flag combinations */2490	if (net_dev->flags & IFF_PROMISC)2491		goto force_promisc;2492	if (net_dev->flags & IFF_ALLMULTI) {2493		/* First, rebuild unicast filtering table. This should be done2494		 * in promisc mode, in order to avoid frame loss while we2495		 * progressively add entries to the table.2496		 * We don't know whether we had been in promisc already, and2497		 * making an MC call to find out is expensive; so set uc promisc2498		 * nonetheless.2499		 */2500		err = dpni_set_unicast_promisc(mc_io, 0, mc_token, 1);2501		if (err)2502			netdev_warn(net_dev, "Can't set uc promisc\n");2503 2504		/* Actual uc table reconstruction. */2505		err = dpni_clear_mac_filters(mc_io, 0, mc_token, 1, 0);2506		if (err)2507			netdev_warn(net_dev, "Can't clear uc filters\n");2508		dpaa2_eth_add_uc_hw_addr(net_dev, priv);2509 2510		/* Finally, clear uc promisc and set mc promisc as requested. */2511		err = dpni_set_unicast_promisc(mc_io, 0, mc_token, 0);2512		if (err)2513			netdev_warn(net_dev, "Can't clear uc promisc\n");2514		goto force_mc_promisc;2515	}2516 2517	/* Neither unicast, nor multicast promisc will be on... eventually.2518	 * For now, rebuild mac filtering tables while forcing both of them on.2519	 */2520	err = dpni_set_unicast_promisc(mc_io, 0, mc_token, 1);2521	if (err)2522		netdev_warn(net_dev, "Can't set uc promisc (%d)\n", err);2523	err = dpni_set_multicast_promisc(mc_io, 0, mc_token, 1);2524	if (err)2525		netdev_warn(net_dev, "Can't set mc promisc (%d)\n", err);2526 2527	/* Actual mac filtering tables reconstruction */2528	err = dpni_clear_mac_filters(mc_io, 0, mc_token, 1, 1);2529	if (err)2530		netdev_warn(net_dev, "Can't clear mac filters\n");2531	dpaa2_eth_add_mc_hw_addr(net_dev, priv);2532	dpaa2_eth_add_uc_hw_addr(net_dev, priv);2533 2534	/* Now we can clear both ucast and mcast promisc, without risking2535	 * to drop legitimate frames anymore.2536	 */2537	err = dpni_set_unicast_promisc(mc_io, 0, mc_token, 0);2538	if (err)2539		netdev_warn(net_dev, "Can't clear ucast promisc\n");2540	err = dpni_set_multicast_promisc(mc_io, 0, mc_token, 0);2541	if (err)2542		netdev_warn(net_dev, "Can't clear mcast promisc\n");2543 2544	return;2545 2546force_promisc:2547	err = dpni_set_unicast_promisc(mc_io, 0, mc_token, 1);2548	if (err)2549		netdev_warn(net_dev, "Can't set ucast promisc\n");2550force_mc_promisc:2551	err = dpni_set_multicast_promisc(mc_io, 0, mc_token, 1);2552	if (err)2553		netdev_warn(net_dev, "Can't set mcast promisc\n");2554}2555 2556static int dpaa2_eth_set_features(struct net_device *net_dev,2557				  netdev_features_t features)2558{2559	struct dpaa2_eth_priv *priv = netdev_priv(net_dev);2560	netdev_features_t changed = features ^ net_dev->features;2561	bool enable;2562	int err;2563 2564	if (changed & NETIF_F_HW_VLAN_CTAG_FILTER) {2565		enable = !!(features & NETIF_F_HW_VLAN_CTAG_FILTER);2566		err = dpaa2_eth_set_rx_vlan_filtering(priv, enable);2567		if (err)2568			return err;2569	}2570 2571	if (changed & NETIF_F_RXCSUM) {2572		enable = !!(features & NETIF_F_RXCSUM);2573		err = dpaa2_eth_set_rx_csum(priv, enable);2574		if (err)2575			return err;2576	}2577 2578	if (changed & (NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM)) {2579		enable = !!(features & (NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM));2580		err = dpaa2_eth_set_tx_csum(priv, enable);2581		if (err)2582			return err;2583	}2584 2585	return 0;2586}2587 2588static int dpaa2_eth_ts_ioctl(struct net_device *dev, struct ifreq *rq, int cmd)2589{2590	struct dpaa2_eth_priv *priv = netdev_priv(dev);2591	struct hwtstamp_config config;2592 2593	if (!dpaa2_ptp)2594		return -EINVAL;2595 2596	if (copy_from_user(&config, rq->ifr_data, sizeof(config)))2597		return -EFAULT;2598 2599	switch (config.tx_type) {2600	case HWTSTAMP_TX_OFF:2601	case HWTSTAMP_TX_ON:2602	case HWTSTAMP_TX_ONESTEP_SYNC:2603		priv->tx_tstamp_type = config.tx_type;2604		break;2605	default:2606		return -ERANGE;2607	}2608 2609	if (config.rx_filter == HWTSTAMP_FILTER_NONE) {2610		priv->rx_tstamp = false;2611	} else {2612		priv->rx_tstamp = true;2613		/* TS is set for all frame types, not only those requested */2614		config.rx_filter = HWTSTAMP_FILTER_ALL;2615	}2616 2617	if (priv->tx_tstamp_type == HWTSTAMP_TX_ONESTEP_SYNC)2618		dpaa2_ptp_onestep_reg_update_method(priv);2619 2620	return copy_to_user(rq->ifr_data, &config, sizeof(config)) ?2621			-EFAULT : 0;2622}2623 2624static int dpaa2_eth_ioctl(struct net_device *dev, struct ifreq *rq, int cmd)2625{2626	struct dpaa2_eth_priv *priv = netdev_priv(dev);2627	int err;2628 2629	if (cmd == SIOCSHWTSTAMP)2630		return dpaa2_eth_ts_ioctl(dev, rq, cmd);2631 2632	mutex_lock(&priv->mac_lock);2633 2634	if (dpaa2_eth_is_type_phy(priv)) {2635		err = phylink_mii_ioctl(priv->mac->phylink, rq, cmd);2636		mutex_unlock(&priv->mac_lock);2637		return err;2638	}2639 2640	mutex_unlock(&priv->mac_lock);2641 2642	return -EOPNOTSUPP;2643}2644 2645static bool xdp_mtu_valid(struct dpaa2_eth_priv *priv, int mtu)2646{2647	int mfl, linear_mfl;2648 2649	mfl = DPAA2_ETH_L2_MAX_FRM(mtu);2650	linear_mfl = priv->rx_buf_size - DPAA2_ETH_RX_HWA_SIZE -2651		     dpaa2_eth_rx_head_room(priv) - XDP_PACKET_HEADROOM;2652 2653	if (mfl > linear_mfl) {2654		netdev_warn(priv->net_dev, "Maximum MTU for XDP is %d\n",2655			    linear_mfl - VLAN_ETH_HLEN);2656		return false;2657	}2658 2659	return true;2660}2661 2662static int dpaa2_eth_set_rx_mfl(struct dpaa2_eth_priv *priv, int mtu, bool has_xdp)2663{2664	int mfl, err;2665 2666	/* We enforce a maximum Rx frame length based on MTU only if we have2667	 * an XDP program attached (in order to avoid Rx S/G frames).2668	 * Otherwise, we accept all incoming frames as long as they are not2669	 * larger than maximum size supported in hardware2670	 */2671	if (has_xdp)2672		mfl = DPAA2_ETH_L2_MAX_FRM(mtu);2673	else2674		mfl = DPAA2_ETH_MFL;2675 2676	err = dpni_set_max_frame_length(priv->mc_io, 0, priv->mc_token, mfl);2677	if (err) {2678		netdev_err(priv->net_dev, "dpni_set_max_frame_length failed\n");2679		return err;2680	}2681 2682	return 0;2683}2684 2685static int dpaa2_eth_change_mtu(struct net_device *dev, int new_mtu)2686{2687	struct dpaa2_eth_priv *priv = netdev_priv(dev);2688	int err;2689 2690	if (!priv->xdp_prog)2691		goto out;2692 2693	if (!xdp_mtu_valid(priv, new_mtu))2694		return -EINVAL;2695 2696	err = dpaa2_eth_set_rx_mfl(priv, new_mtu, true);2697	if (err)2698		return err;2699 2700out:2701	WRITE_ONCE(dev->mtu, new_mtu);2702	return 0;2703}2704 2705static int dpaa2_eth_update_rx_buffer_headroom(struct dpaa2_eth_priv *priv, bool has_xdp)2706{2707	struct dpni_buffer_layout buf_layout = {0};2708	int err;2709 2710	err = dpni_get_buffer_layout(priv->mc_io, 0, priv->mc_token,2711				     DPNI_QUEUE_RX, &buf_layout);2712	if (err) {2713		netdev_err(priv->net_dev, "dpni_get_buffer_layout failed\n");2714		return err;2715	}2716 2717	/* Reserve extra headroom for XDP header size changes */2718	buf_layout.data_head_room = dpaa2_eth_rx_head_room(priv) +2719				    (has_xdp ? XDP_PACKET_HEADROOM : 0);2720	buf_layout.options = DPNI_BUF_LAYOUT_OPT_DATA_HEAD_ROOM;2721	err = dpni_set_buffer_layout(priv->mc_io, 0, priv->mc_token,2722				     DPNI_QUEUE_RX, &buf_layout);2723	if (err) {2724		netdev_err(priv->net_dev, "dpni_set_buffer_layout failed\n");2725		return err;2726	}2727 2728	return 0;2729}2730 2731static int dpaa2_eth_setup_xdp(struct net_device *dev, struct bpf_prog *prog)2732{2733	struct dpaa2_eth_priv *priv = netdev_priv(dev);2734	struct dpaa2_eth_channel *ch;2735	struct bpf_prog *old;2736	bool up, need_update;2737	int i, err;2738 2739	if (prog && !xdp_mtu_valid(priv, dev->mtu))2740		return -EINVAL;2741 2742	if (prog)2743		bpf_prog_add(prog, priv->num_channels);2744 2745	up = netif_running(dev);2746	need_update = (!!priv->xdp_prog != !!prog);2747 2748	if (up)2749		dev_close(dev);2750 2751	/* While in xdp mode, enforce a maximum Rx frame size based on MTU.2752	 * Also, when switching between xdp/non-xdp modes we need to reconfigure2753	 * our Rx buffer layout. Buffer pool was drained on dpaa2_eth_stop,2754	 * so we are sure no old format buffers will be used from now on.2755	 */2756	if (need_update) {2757		err = dpaa2_eth_set_rx_mfl(priv, dev->mtu, !!prog);2758		if (err)2759			goto out_err;2760		err = dpaa2_eth_update_rx_buffer_headroom(priv, !!prog);2761		if (err)2762			goto out_err;2763	}2764 2765	old = xchg(&priv->xdp_prog, prog);2766	if (old)2767		bpf_prog_put(old);2768 2769	for (i = 0; i < priv->num_channels; i++) {2770		ch = priv->channel[i];2771		old = xchg(&ch->xdp.prog, prog);2772		if (old)2773			bpf_prog_put(old);2774	}2775 2776	if (up) {2777		err = dev_open(dev, NULL);2778		if (err)2779			return err;2780	}2781 2782	return 0;2783 2784out_err:2785	if (prog)2786		bpf_prog_sub(prog, priv->num_channels);2787	if (up)2788		dev_open(dev, NULL);2789 2790	return err;2791}2792 2793static int dpaa2_eth_xdp(struct net_device *dev, struct netdev_bpf *xdp)2794{2795	switch (xdp->command) {2796	case XDP_SETUP_PROG:2797		return dpaa2_eth_setup_xdp(dev, xdp->prog);2798	case XDP_SETUP_XSK_POOL:2799		return dpaa2_xsk_setup_pool(dev, xdp->xsk.pool, xdp->xsk.queue_id);2800	default:2801		return -EINVAL;2802	}2803 2804	return 0;2805}2806 2807static int dpaa2_eth_xdp_create_fd(struct net_device *net_dev,2808				   struct xdp_frame *xdpf,2809				   struct dpaa2_fd *fd)2810{2811	struct device *dev = net_dev->dev.parent;2812	unsigned int needed_headroom;2813	struct dpaa2_eth_swa *swa;2814	void *buffer_start, *aligned_start;2815	dma_addr_t addr;2816 2817	/* We require a minimum headroom to be able to transmit the frame.2818	 * Otherwise return an error and let the original net_device handle it2819	 */2820	needed_headroom = dpaa2_eth_needed_headroom(NULL);2821	if (xdpf->headroom < needed_headroom)2822		return -EINVAL;2823 2824	/* Setup the FD fields */2825	memset(fd, 0, sizeof(*fd));2826 2827	/* Align FD address, if possible */2828	buffer_start = xdpf->data - needed_headroom;2829	aligned_start = PTR_ALIGN(buffer_start - DPAA2_ETH_TX_BUF_ALIGN,2830				  DPAA2_ETH_TX_BUF_ALIGN);2831	if (aligned_start >= xdpf->data - xdpf->headroom)2832		buffer_start = aligned_start;2833 2834	swa = (struct dpaa2_eth_swa *)buffer_start;2835	/* fill in necessary fields here */2836	swa->type = DPAA2_ETH_SWA_XDP;2837	swa->xdp.dma_size = xdpf->data + xdpf->len - buffer_start;2838	swa->xdp.xdpf = xdpf;2839 2840	addr = dma_map_single(dev, buffer_start,2841			      swa->xdp.dma_size,2842			      DMA_BIDIRECTIONAL);2843	if (unlikely(dma_mapping_error(dev, addr)))2844		return -ENOMEM;2845 2846	dpaa2_fd_set_addr(fd, addr);2847	dpaa2_fd_set_offset(fd, xdpf->data - buffer_start);2848	dpaa2_fd_set_len(fd, xdpf->len);2849	dpaa2_fd_set_format(fd, dpaa2_fd_single);2850	dpaa2_fd_set_ctrl(fd, FD_CTRL_PTA);2851 2852	return 0;2853}2854 2855static int dpaa2_eth_xdp_xmit(struct net_device *net_dev, int n,2856			      struct xdp_frame **frames, u32 flags)2857{2858	struct dpaa2_eth_priv *priv = netdev_priv(net_dev);2859	struct dpaa2_eth_xdp_fds *xdp_redirect_fds;2860	struct rtnl_link_stats64 *percpu_stats;2861	struct dpaa2_eth_fq *fq;2862	struct dpaa2_fd *fds;2863	int enqueued, i, err;2864 2865	if (unlikely(flags & ~XDP_XMIT_FLAGS_MASK))2866		return -EINVAL;2867 2868	if (!netif_running(net_dev))2869		return -ENETDOWN;2870 2871	fq = &priv->fq[smp_processor_id()];2872	xdp_redirect_fds = &fq->xdp_redirect_fds;2873	fds = xdp_redirect_fds->fds;2874 2875	percpu_stats = this_cpu_ptr(priv->percpu_stats);2876 2877	/* create a FD for each xdp_frame in the list received */2878	for (i = 0; i < n; i++) {2879		err = dpaa2_eth_xdp_create_fd(net_dev, frames[i], &fds[i]);2880		if (err)2881			break;2882	}2883	xdp_redirect_fds->num = i;2884 2885	/* enqueue all the frame descriptors */2886	enqueued = dpaa2_eth_xdp_flush(priv, fq, xdp_redirect_fds);2887 2888	/* update statistics */2889	percpu_stats->tx_packets += enqueued;2890	for (i = 0; i < enqueued; i++)2891		percpu_stats->tx_bytes += dpaa2_fd_get_len(&fds[i]);2892 2893	return enqueued;2894}2895 2896static int update_xps(struct dpaa2_eth_priv *priv)2897{2898	struct net_device *net_dev = priv->net_dev;2899	int i, num_queues, netdev_queues;2900	struct dpaa2_eth_fq *fq;2901	cpumask_var_t xps_mask;2902	int err = 0;2903 2904	if (!alloc_cpumask_var(&xps_mask, GFP_KERNEL))2905		return -ENOMEM;2906 2907	num_queues = dpaa2_eth_queue_count(priv);2908	netdev_queues = (net_dev->num_tc ? : 1) * num_queues;2909 2910	/* The first <num_queues> entries in priv->fq array are Tx/Tx conf2911	 * queues, so only process those2912	 */2913	for (i = 0; i < netdev_queues; i++) {2914		fq = &priv->fq[i % num_queues];2915 2916		cpumask_clear(xps_mask);2917		cpumask_set_cpu(fq->target_cpu, xps_mask);2918 2919		err = netif_set_xps_queue(net_dev, xps_mask, i);2920		if (err) {2921			netdev_warn_once(net_dev, "Error setting XPS queue\n");2922			break;2923		}2924	}2925 2926	free_cpumask_var(xps_mask);2927	return err;2928}2929 2930static int dpaa2_eth_setup_mqprio(struct net_device *net_dev,2931				  struct tc_mqprio_qopt *mqprio)2932{2933	struct dpaa2_eth_priv *priv = netdev_priv(net_dev);2934	u8 num_tc, num_queues;2935	int i;2936 2937	mqprio->hw = TC_MQPRIO_HW_OFFLOAD_TCS;2938	num_queues = dpaa2_eth_queue_count(priv);2939	num_tc = mqprio->num_tc;2940 2941	if (num_tc == net_dev->num_tc)2942		return 0;2943 2944	if (num_tc  > dpaa2_eth_tc_count(priv)) {2945		netdev_err(net_dev, "Max %d traffic classes supported\n",2946			   dpaa2_eth_tc_count(priv));2947		return -EOPNOTSUPP;2948	}2949 2950	if (!num_tc) {2951		netdev_reset_tc(net_dev);2952		netif_set_real_num_tx_queues(net_dev, num_queues);2953		goto out;2954	}2955 2956	netdev_set_num_tc(net_dev, num_tc);2957	netif_set_real_num_tx_queues(net_dev, num_tc * num_queues);2958 2959	for (i = 0; i < num_tc; i++)2960		netdev_set_tc_queue(net_dev, i, num_queues, i * num_queues);2961 2962out:2963	update_xps(priv);2964 2965	return 0;2966}2967 2968#define bps_to_mbits(rate) (div_u64((rate), 1000000) * 8)2969 2970static int dpaa2_eth_setup_tbf(struct net_device *net_dev, struct tc_tbf_qopt_offload *p)2971{2972	struct tc_tbf_qopt_offload_replace_params *cfg = &p->replace_params;2973	struct dpaa2_eth_priv *priv = netdev_priv(net_dev);2974	struct dpni_tx_shaping_cfg tx_cr_shaper = { 0 };2975	struct dpni_tx_shaping_cfg tx_er_shaper = { 0 };2976	int err;2977 2978	if (p->command == TC_TBF_STATS)2979		return -EOPNOTSUPP;2980 2981	/* Only per port Tx shaping */2982	if (p->parent != TC_H_ROOT)2983		return -EOPNOTSUPP;2984 2985	if (p->command == TC_TBF_REPLACE) {2986		if (cfg->max_size > DPAA2_ETH_MAX_BURST_SIZE) {2987			netdev_err(net_dev, "burst size cannot be greater than %d\n",2988				   DPAA2_ETH_MAX_BURST_SIZE);2989			return -EINVAL;2990		}2991 2992		tx_cr_shaper.max_burst_size = cfg->max_size;2993		/* The TBF interface is in bytes/s, whereas DPAA2 expects the2994		 * rate in Mbits/s2995		 */2996		tx_cr_shaper.rate_limit = bps_to_mbits(cfg->rate.rate_bytes_ps);2997	}2998 2999	err = dpni_set_tx_shaping(priv->mc_io, 0, priv->mc_token, &tx_cr_shaper,3000				  &tx_er_shaper, 0);3001	if (err) {3002		netdev_err(net_dev, "dpni_set_tx_shaping() = %d\n", err);3003		return err;3004	}3005 3006	return 0;3007}3008 3009static int dpaa2_eth_setup_tc(struct net_device *net_dev,3010			      enum tc_setup_type type, void *type_data)3011{3012	switch (type) {3013	case TC_SETUP_QDISC_MQPRIO:3014		return dpaa2_eth_setup_mqprio(net_dev, type_data);3015	case TC_SETUP_QDISC_TBF:3016		return dpaa2_eth_setup_tbf(net_dev, type_data);3017	default:3018		return -EOPNOTSUPP;3019	}3020}3021 3022static const struct net_device_ops dpaa2_eth_ops = {3023	.ndo_open = dpaa2_eth_open,3024	.ndo_start_xmit = dpaa2_eth_tx,3025	.ndo_stop = dpaa2_eth_stop,3026	.ndo_set_mac_address = dpaa2_eth_set_addr,3027	.ndo_get_stats64 = dpaa2_eth_get_stats,3028	.ndo_set_rx_mode = dpaa2_eth_set_rx_mode,3029	.ndo_set_features = dpaa2_eth_set_features,3030	.ndo_eth_ioctl = dpaa2_eth_ioctl,3031	.ndo_change_mtu = dpaa2_eth_change_mtu,3032	.ndo_bpf = dpaa2_eth_xdp,3033	.ndo_xdp_xmit = dpaa2_eth_xdp_xmit,3034	.ndo_xsk_wakeup = dpaa2_xsk_wakeup,3035	.ndo_setup_tc = dpaa2_eth_setup_tc,3036	.ndo_vlan_rx_add_vid = dpaa2_eth_rx_add_vid,3037	.ndo_vlan_rx_kill_vid = dpaa2_eth_rx_kill_vid3038};3039 3040static void dpaa2_eth_cdan_cb(struct dpaa2_io_notification_ctx *ctx)3041{3042	struct dpaa2_eth_channel *ch;3043 3044	ch = container_of(ctx, struct dpaa2_eth_channel, nctx);3045 3046	/* Update NAPI statistics */3047	ch->stats.cdan++;3048 3049	/* NAPI can also be scheduled from the AF_XDP Tx path. Mark a missed3050	 * so that it can be rescheduled again.3051	 */3052	if (!napi_if_scheduled_mark_missed(&ch->napi))3053		napi_schedule(&ch->napi);3054}3055 3056/* Allocate and configure a DPCON object */3057static struct fsl_mc_device *dpaa2_eth_setup_dpcon(struct dpaa2_eth_priv *priv)3058{3059	struct fsl_mc_device *dpcon;3060	struct device *dev = priv->net_dev->dev.parent;3061	int err;3062 3063	err = fsl_mc_object_allocate(to_fsl_mc_device(dev),3064				     FSL_MC_POOL_DPCON, &dpcon);3065	if (err) {3066		if (err == -ENXIO) {3067			dev_dbg(dev, "Waiting for DPCON\n");3068			err = -EPROBE_DEFER;3069		} else {3070			dev_info(dev, "Not enough DPCONs, will go on as-is\n");3071		}3072		return ERR_PTR(err);3073	}3074 3075	err = dpcon_open(priv->mc_io, 0, dpcon->obj_desc.id, &dpcon->mc_handle);3076	if (err) {3077		dev_err(dev, "dpcon_open() failed\n");3078		goto free;3079	}3080 3081	err = dpcon_reset(priv->mc_io, 0, dpcon->mc_handle);3082	if (err) {3083		dev_err(dev, "dpcon_reset() failed\n");3084		goto close;3085	}3086 3087	err = dpcon_enable(priv->mc_io, 0, dpcon->mc_handle);3088	if (err) {3089		dev_err(dev, "dpcon_enable() failed\n");3090		goto close;3091	}3092 3093	return dpcon;3094 3095close:3096	dpcon_close(priv->mc_io, 0, dpcon->mc_handle);3097free:3098	fsl_mc_object_free(dpcon);3099 3100	return ERR_PTR(err);3101}3102 3103static void dpaa2_eth_free_dpcon(struct dpaa2_eth_priv *priv,3104				 struct fsl_mc_device *dpcon)3105{3106	dpcon_disable(priv->mc_io, 0, dpcon->mc_handle);3107	dpcon_close(priv->mc_io, 0, dpcon->mc_handle);3108	fsl_mc_object_free(dpcon);3109}3110 3111static struct dpaa2_eth_channel *dpaa2_eth_alloc_channel(struct dpaa2_eth_priv *priv)3112{3113	struct dpaa2_eth_channel *channel;3114	struct dpcon_attr attr;3115	struct device *dev = priv->net_dev->dev.parent;3116	int err;3117 3118	channel = kzalloc(sizeof(*channel), GFP_KERNEL);3119	if (!channel)3120		return NULL;3121 3122	channel->dpcon = dpaa2_eth_setup_dpcon(priv);3123	if (IS_ERR(channel->dpcon)) {3124		err = PTR_ERR(channel->dpcon);3125		goto err_setup;3126	}3127 3128	err = dpcon_get_attributes(priv->mc_io, 0, channel->dpcon->mc_handle,3129				   &attr);3130	if (err) {3131		dev_err(dev, "dpcon_get_attributes() failed\n");3132		goto err_get_attr;3133	}3134 3135	channel->dpcon_id = attr.id;3136	channel->ch_id = attr.qbman_ch_id;3137	channel->priv = priv;3138 3139	return channel;3140 3141err_get_attr:3142	dpaa2_eth_free_dpcon(priv, channel->dpcon);3143err_setup:3144	kfree(channel);3145	return ERR_PTR(err);3146}3147 3148static void dpaa2_eth_free_channel(struct dpaa2_eth_priv *priv,3149				   struct dpaa2_eth_channel *channel)3150{3151	dpaa2_eth_free_dpcon(priv, channel->dpcon);3152	kfree(channel);3153}3154 3155/* DPIO setup: allocate and configure QBMan channels, setup core affinity3156 * and register data availability notifications3157 */3158static int dpaa2_eth_setup_dpio(struct dpaa2_eth_priv *priv)3159{3160	struct dpaa2_io_notification_ctx *nctx;3161	struct dpaa2_eth_channel *channel;3162	struct dpcon_notification_cfg dpcon_notif_cfg;3163	struct device *dev = priv->net_dev->dev.parent;3164	int i, err;3165 3166	/* We want the ability to spread ingress traffic (RX, TX conf) to as3167	 * many cores as possible, so we need one channel for each core3168	 * (unless there's fewer queues than cores, in which case the extra3169	 * channels would be wasted).3170	 * Allocate one channel per core and register it to the core's3171	 * affine DPIO. If not enough channels are available for all cores3172	 * or if some cores don't have an affine DPIO, there will be no3173	 * ingress frame processing on those cores.3174	 */3175	cpumask_clear(&priv->dpio_cpumask);3176	for_each_online_cpu(i) {3177		/* Try to allocate a channel */3178		channel = dpaa2_eth_alloc_channel(priv);3179		if (IS_ERR_OR_NULL(channel)) {3180			err = PTR_ERR_OR_ZERO(channel);3181			if (err == -EPROBE_DEFER)3182				dev_dbg(dev, "waiting for affine channel\n");3183			else3184				dev_info(dev,3185					 "No affine channel for cpu %d and above\n", i);3186			goto err_alloc_ch;3187		}3188 3189		priv->channel[priv->num_channels] = channel;3190 3191		nctx = &channel->nctx;3192		nctx->is_cdan = 1;3193		nctx->cb = dpaa2_eth_cdan_cb;3194		nctx->id = channel->ch_id;3195		nctx->desired_cpu = i;3196 3197		/* Register the new context */3198		channel->dpio = dpaa2_io_service_select(i);3199		err = dpaa2_io_service_register(channel->dpio, nctx, dev);3200		if (err) {3201			dev_dbg(dev, "No affine DPIO for cpu %d\n", i);3202			/* If no affine DPIO for this core, there's probably3203			 * none available for next cores either. Signal we want3204			 * to retry later, in case the DPIO devices weren't3205			 * probed yet.3206			 */3207			err = -EPROBE_DEFER;3208			goto err_service_reg;3209		}3210 3211		/* Register DPCON notification with MC */3212		dpcon_notif_cfg.dpio_id = nctx->dpio_id;3213		dpcon_notif_cfg.priority = 0;3214		dpcon_notif_cfg.user_ctx = nctx->qman64;3215		err = dpcon_set_notification(priv->mc_io, 0,3216					     channel->dpcon->mc_handle,3217					     &dpcon_notif_cfg);3218		if (err) {3219			dev_err(dev, "dpcon_set_notification failed()\n");3220			goto err_set_cdan;3221		}3222 3223		/* If we managed to allocate a channel and also found an affine3224		 * DPIO for this core, add it to the final mask3225		 */3226		cpumask_set_cpu(i, &priv->dpio_cpumask);3227		priv->num_channels++;3228 3229		/* Stop if we already have enough channels to accommodate all3230		 * RX and TX conf queues3231		 */3232		if (priv->num_channels == priv->dpni_attrs.num_queues)3233			break;3234	}3235 3236	return 0;3237 3238err_set_cdan:3239	dpaa2_io_service_deregister(channel->dpio, nctx, dev);3240err_service_reg:3241	dpaa2_eth_free_channel(priv, channel);3242err_alloc_ch:3243	if (err == -EPROBE_DEFER) {3244		for (i = 0; i < priv->num_channels; i++) {3245			channel = priv->channel[i];3246			nctx = &channel->nctx;3247			dpaa2_io_service_deregister(channel->dpio, nctx, dev);3248			dpaa2_eth_free_channel(priv, channel);3249		}3250		priv->num_channels = 0;3251		return err;3252	}3253 3254	if (cpumask_empty(&priv->dpio_cpumask)) {3255		dev_err(dev, "No cpu with an affine DPIO/DPCON\n");3256		return -ENODEV;3257	}3258 3259	dev_info(dev, "Cores %*pbl available for processing ingress traffic\n",3260		 cpumask_pr_args(&priv->dpio_cpumask));3261 3262	return 0;3263}3264 3265static void dpaa2_eth_free_dpio(struct dpaa2_eth_priv *priv)3266{3267	struct device *dev = priv->net_dev->dev.parent;3268	struct dpaa2_eth_channel *ch;3269	int i;3270 3271	/* deregister CDAN notifications and free channels */3272	for (i = 0; i < priv->num_channels; i++) {3273		ch = priv->channel[i];3274		dpaa2_io_service_deregister(ch->dpio, &ch->nctx, dev);3275		dpaa2_eth_free_channel(priv, ch);3276	}3277}3278 3279static struct dpaa2_eth_channel *dpaa2_eth_get_affine_channel(struct dpaa2_eth_priv *priv,3280							      int cpu)3281{3282	struct device *dev = priv->net_dev->dev.parent;3283	int i;3284 3285	for (i = 0; i < priv->num_channels; i++)3286		if (priv->channel[i]->nctx.desired_cpu == cpu)3287			return priv->channel[i];3288 3289	/* We should never get here. Issue a warning and return3290	 * the first channel, because it's still better than nothing3291	 */3292	dev_warn(dev, "No affine channel found for cpu %d\n", cpu);3293 3294	return priv->channel[0];3295}3296 3297static void dpaa2_eth_set_fq_affinity(struct dpaa2_eth_priv *priv)3298{3299	struct device *dev = priv->net_dev->dev.parent;3300	struct dpaa2_eth_fq *fq;3301	int rx_cpu, txc_cpu;3302	int i;3303 3304	/* For each FQ, pick one channel/CPU to deliver frames to.3305	 * This may well change at runtime, either through irqbalance or3306	 * through direct user intervention.3307	 */3308	rx_cpu = txc_cpu = cpumask_first(&priv->dpio_cpumask);3309 3310	for (i = 0; i < priv->num_fqs; i++) {3311		fq = &priv->fq[i];3312		switch (fq->type) {3313		case DPAA2_RX_FQ:3314		case DPAA2_RX_ERR_FQ:3315			fq->target_cpu = rx_cpu;3316			rx_cpu = cpumask_next(rx_cpu, &priv->dpio_cpumask);3317			if (rx_cpu >= nr_cpu_ids)3318				rx_cpu = cpumask_first(&priv->dpio_cpumask);3319			break;3320		case DPAA2_TX_CONF_FQ:3321			fq->target_cpu = txc_cpu;3322			txc_cpu = cpumask_next(txc_cpu, &priv->dpio_cpumask);3323			if (txc_cpu >= nr_cpu_ids)3324				txc_cpu = cpumask_first(&priv->dpio_cpumask);3325			break;3326		default:3327			dev_err(dev, "Unknown FQ type: %d\n", fq->type);3328		}3329		fq->channel = dpaa2_eth_get_affine_channel(priv, fq->target_cpu);3330	}3331 3332	update_xps(priv);3333}3334 3335static void dpaa2_eth_setup_fqs(struct dpaa2_eth_priv *priv)3336{3337	int i, j;3338 3339	/* We have one TxConf FQ per Tx flow.3340	 * The number of Tx and Rx queues is the same.3341	 * Tx queues come first in the fq array.3342	 */3343	for (i = 0; i < dpaa2_eth_queue_count(priv); i++) {3344		priv->fq[priv->num_fqs].type = DPAA2_TX_CONF_FQ;3345		priv->fq[priv->num_fqs].consume = dpaa2_eth_tx_conf;3346		priv->fq[priv->num_fqs++].flowid = (u16)i;3347	}3348 3349	for (j = 0; j < dpaa2_eth_tc_count(priv); j++) {3350		for (i = 0; i < dpaa2_eth_queue_count(priv); i++) {3351			priv->fq[priv->num_fqs].type = DPAA2_RX_FQ;3352			priv->fq[priv->num_fqs].consume = dpaa2_eth_rx;3353			priv->fq[priv->num_fqs].tc = (u8)j;3354			priv->fq[priv->num_fqs++].flowid = (u16)i;3355		}3356	}3357 3358	/* We have exactly one Rx error queue per DPNI */3359	priv->fq[priv->num_fqs].type = DPAA2_RX_ERR_FQ;3360	priv->fq[priv->num_fqs++].consume = dpaa2_eth_rx_err;3361 3362	/* For each FQ, decide on which core to process incoming frames */3363	dpaa2_eth_set_fq_affinity(priv);3364}3365 3366/* Allocate and configure a buffer pool */3367struct dpaa2_eth_bp *dpaa2_eth_allocate_dpbp(struct dpaa2_eth_priv *priv)3368{3369	struct device *dev = priv->net_dev->dev.parent;3370	struct fsl_mc_device *dpbp_dev;3371	struct dpbp_attr dpbp_attrs;3372	struct dpaa2_eth_bp *bp;3373	int err;3374 3375	err = fsl_mc_object_allocate(to_fsl_mc_device(dev), FSL_MC_POOL_DPBP,3376				     &dpbp_dev);3377	if (err) {3378		if (err == -ENXIO)3379			err = -EPROBE_DEFER;3380		else3381			dev_err(dev, "DPBP device allocation failed\n");3382		return ERR_PTR(err);3383	}3384 3385	bp = kzalloc(sizeof(*bp), GFP_KERNEL);3386	if (!bp) {3387		err = -ENOMEM;3388		goto err_alloc;3389	}3390 3391	err = dpbp_open(priv->mc_io, 0, dpbp_dev->obj_desc.id,3392			&dpbp_dev->mc_handle);3393	if (err) {3394		dev_err(dev, "dpbp_open() failed\n");3395		goto err_open;3396	}3397 3398	err = dpbp_reset(priv->mc_io, 0, dpbp_dev->mc_handle);3399	if (err) {3400		dev_err(dev, "dpbp_reset() failed\n");3401		goto err_reset;3402	}3403 3404	err = dpbp_enable(priv->mc_io, 0, dpbp_dev->mc_handle);3405	if (err) {3406		dev_err(dev, "dpbp_enable() failed\n");3407		goto err_enable;3408	}3409 3410	err = dpbp_get_attributes(priv->mc_io, 0, dpbp_dev->mc_handle,3411				  &dpbp_attrs);3412	if (err) {3413		dev_err(dev, "dpbp_get_attributes() failed\n");3414		goto err_get_attr;3415	}3416 3417	bp->dev = dpbp_dev;3418	bp->bpid = dpbp_attrs.bpid;3419 3420	return bp;3421 3422err_get_attr:3423	dpbp_disable(priv->mc_io, 0, dpbp_dev->mc_handle);3424err_enable:3425err_reset:3426	dpbp_close(priv->mc_io, 0, dpbp_dev->mc_handle);3427err_open:3428	kfree(bp);3429err_alloc:3430	fsl_mc_object_free(dpbp_dev);3431 3432	return ERR_PTR(err);3433}3434 3435static int dpaa2_eth_setup_default_dpbp(struct dpaa2_eth_priv *priv)3436{3437	struct dpaa2_eth_bp *bp;3438	int i;3439 3440	bp = dpaa2_eth_allocate_dpbp(priv);3441	if (IS_ERR(bp))3442		return PTR_ERR(bp);3443 3444	priv->bp[DPAA2_ETH_DEFAULT_BP_IDX] = bp;3445	priv->num_bps++;3446 3447	for (i = 0; i < priv->num_channels; i++)3448		priv->channel[i]->bp = bp;3449 3450	return 0;3451}3452 3453void dpaa2_eth_free_dpbp(struct dpaa2_eth_priv *priv, struct dpaa2_eth_bp *bp)3454{3455	int idx_bp;3456 3457	/* Find the index at which this BP is stored */3458	for (idx_bp = 0; idx_bp < priv->num_bps; idx_bp++)3459		if (priv->bp[idx_bp] == bp)3460			break;3461 3462	/* Drain the pool and disable the associated MC object */3463	dpaa2_eth_drain_pool(priv, bp->bpid);3464	dpbp_disable(priv->mc_io, 0, bp->dev->mc_handle);3465	dpbp_close(priv->mc_io, 0, bp->dev->mc_handle);3466	fsl_mc_object_free(bp->dev);3467	kfree(bp);3468 3469	/* Move the last in use DPBP over in this position */3470	priv->bp[idx_bp] = priv->bp[priv->num_bps - 1];3471	priv->num_bps--;3472}3473 3474static void dpaa2_eth_free_dpbps(struct dpaa2_eth_priv *priv)3475{3476	int i;3477 3478	for (i = 0; i < priv->num_bps; i++)3479		dpaa2_eth_free_dpbp(priv, priv->bp[i]);3480}3481 3482static int dpaa2_eth_set_buffer_layout(struct dpaa2_eth_priv *priv)3483{3484	struct device *dev = priv->net_dev->dev.parent;3485	struct dpni_buffer_layout buf_layout = {0};3486	u16 rx_buf_align;3487	int err;3488 3489	/* We need to check for WRIOP version 1.0.0, but depending on the MC3490	 * version, this number is not always provided correctly on rev1.3491	 * We need to check for both alternatives in this situation.3492	 */3493	if (priv->dpni_attrs.wriop_version == DPAA2_WRIOP_VERSION(0, 0, 0) ||3494	    priv->dpni_attrs.wriop_version == DPAA2_WRIOP_VERSION(1, 0, 0))3495		rx_buf_align = DPAA2_ETH_RX_BUF_ALIGN_REV1;3496	else3497		rx_buf_align = DPAA2_ETH_RX_BUF_ALIGN;3498 3499	/* We need to ensure that the buffer size seen by WRIOP is a multiple3500	 * of 64 or 256 bytes depending on the WRIOP version.3501	 */3502	priv->rx_buf_size = ALIGN_DOWN(DPAA2_ETH_RX_BUF_SIZE, rx_buf_align);3503 3504	/* tx buffer */3505	buf_layout.private_data_size = DPAA2_ETH_SWA_SIZE;3506	buf_layout.pass_timestamp = true;3507	buf_layout.pass_frame_status = true;3508	buf_layout.options = DPNI_BUF_LAYOUT_OPT_PRIVATE_DATA_SIZE |3509			     DPNI_BUF_LAYOUT_OPT_TIMESTAMP |3510			     DPNI_BUF_LAYOUT_OPT_FRAME_STATUS;3511	err = dpni_set_buffer_layout(priv->mc_io, 0, priv->mc_token,3512				     DPNI_QUEUE_TX, &buf_layout);3513	if (err) {3514		dev_err(dev, "dpni_set_buffer_layout(TX) failed\n");3515		return err;3516	}3517 3518	/* tx-confirm buffer */3519	buf_layout.options = DPNI_BUF_LAYOUT_OPT_TIMESTAMP |3520			     DPNI_BUF_LAYOUT_OPT_FRAME_STATUS;3521	err = dpni_set_buffer_layout(priv->mc_io, 0, priv->mc_token,3522				     DPNI_QUEUE_TX_CONFIRM, &buf_layout);3523	if (err) {3524		dev_err(dev, "dpni_set_buffer_layout(TX_CONF) failed\n");3525		return err;3526	}3527 3528	/* Now that we've set our tx buffer layout, retrieve the minimum3529	 * required tx data offset.3530	 */3531	err = dpni_get_tx_data_offset(priv->mc_io, 0, priv->mc_token,3532				      &priv->tx_data_offset);3533	if (err) {3534		dev_err(dev, "dpni_get_tx_data_offset() failed\n");3535		return err;3536	}3537 3538	if ((priv->tx_data_offset % 64) != 0)3539		dev_warn(dev, "Tx data offset (%d) not a multiple of 64B\n",3540			 priv->tx_data_offset);3541 3542	/* rx buffer */3543	buf_layout.pass_frame_status = true;3544	buf_layout.pass_parser_result = true;3545	buf_layout.data_align = rx_buf_align;3546	buf_layout.data_head_room = dpaa2_eth_rx_head_room(priv);3547	buf_layout.private_data_size = 0;3548	buf_layout.options = DPNI_BUF_LAYOUT_OPT_PARSER_RESULT |3549			     DPNI_BUF_LAYOUT_OPT_FRAME_STATUS |3550			     DPNI_BUF_LAYOUT_OPT_DATA_ALIGN |3551			     DPNI_BUF_LAYOUT_OPT_DATA_HEAD_ROOM |3552			     DPNI_BUF_LAYOUT_OPT_TIMESTAMP;3553	err = dpni_set_buffer_layout(priv->mc_io, 0, priv->mc_token,3554				     DPNI_QUEUE_RX, &buf_layout);3555	if (err) {3556		dev_err(dev, "dpni_set_buffer_layout(RX) failed\n");3557		return err;3558	}3559 3560	return 0;3561}3562 3563#define DPNI_ENQUEUE_FQID_VER_MAJOR	73564#define DPNI_ENQUEUE_FQID_VER_MINOR	93565 3566static inline int dpaa2_eth_enqueue_qd(struct dpaa2_eth_priv *priv,3567				       struct dpaa2_eth_fq *fq,3568				       struct dpaa2_fd *fd, u8 prio,3569				       u32 num_frames __always_unused,3570				       int *frames_enqueued)3571{3572	int err;3573 3574	err = dpaa2_io_service_enqueue_qd(fq->channel->dpio,3575					  priv->tx_qdid, prio,3576					  fq->tx_qdbin, fd);3577	if (!err && frames_enqueued)3578		*frames_enqueued = 1;3579	return err;3580}3581 3582static inline int dpaa2_eth_enqueue_fq_multiple(struct dpaa2_eth_priv *priv,3583						struct dpaa2_eth_fq *fq,3584						struct dpaa2_fd *fd,3585						u8 prio, u32 num_frames,3586						int *frames_enqueued)3587{3588	int err;3589 3590	err = dpaa2_io_service_enqueue_multiple_fq(fq->channel->dpio,3591						   fq->tx_fqid[prio],3592						   fd, num_frames);3593 3594	if (err == 0)3595		return -EBUSY;3596 3597	if (frames_enqueued)3598		*frames_enqueued = err;3599	return 0;3600}3601 3602static void dpaa2_eth_set_enqueue_mode(struct dpaa2_eth_priv *priv)3603{3604	if (dpaa2_eth_cmp_dpni_ver(priv, DPNI_ENQUEUE_FQID_VER_MAJOR,3605				   DPNI_ENQUEUE_FQID_VER_MINOR) < 0)3606		priv->enqueue = dpaa2_eth_enqueue_qd;3607	else3608		priv->enqueue = dpaa2_eth_enqueue_fq_multiple;3609}3610 3611static int dpaa2_eth_set_pause(struct dpaa2_eth_priv *priv)3612{3613	struct device *dev = priv->net_dev->dev.parent;3614	struct dpni_link_cfg link_cfg = {0};3615	int err;3616 3617	/* Get the default link options so we don't override other flags */3618	err = dpni_get_link_cfg(priv->mc_io, 0, priv->mc_token, &link_cfg);3619	if (err) {3620		dev_err(dev, "dpni_get_link_cfg() failed\n");3621		return err;3622	}3623 3624	/* By default, enable both Rx and Tx pause frames */3625	link_cfg.options |= DPNI_LINK_OPT_PAUSE;3626	link_cfg.options &= ~DPNI_LINK_OPT_ASYM_PAUSE;3627	err = dpni_set_link_cfg(priv->mc_io, 0, priv->mc_token, &link_cfg);3628	if (err) {3629		dev_err(dev, "dpni_set_link_cfg() failed\n");3630		return err;3631	}3632 3633	priv->link_state.options = link_cfg.options;3634 3635	return 0;3636}3637 3638static void dpaa2_eth_update_tx_fqids(struct dpaa2_eth_priv *priv)3639{3640	struct dpni_queue_id qid = {0};3641	struct dpaa2_eth_fq *fq;3642	struct dpni_queue queue;3643	int i, j, err;3644 3645	/* We only use Tx FQIDs for FQID-based enqueue, so check3646	 * if DPNI version supports it before updating FQIDs3647	 */3648	if (dpaa2_eth_cmp_dpni_ver(priv, DPNI_ENQUEUE_FQID_VER_MAJOR,3649				   DPNI_ENQUEUE_FQID_VER_MINOR) < 0)3650		return;3651 3652	for (i = 0; i < priv->num_fqs; i++) {3653		fq = &priv->fq[i];3654		if (fq->type != DPAA2_TX_CONF_FQ)3655			continue;3656		for (j = 0; j < dpaa2_eth_tc_count(priv); j++) {3657			err = dpni_get_queue(priv->mc_io, 0, priv->mc_token,3658					     DPNI_QUEUE_TX, j, fq->flowid,3659					     &queue, &qid);3660			if (err)3661				goto out_err;3662 3663			fq->tx_fqid[j] = qid.fqid;3664			if (fq->tx_fqid[j] == 0)3665				goto out_err;3666		}3667	}3668 3669	priv->enqueue = dpaa2_eth_enqueue_fq_multiple;3670 3671	return;3672 3673out_err:3674	netdev_info(priv->net_dev,3675		    "Error reading Tx FQID, fallback to QDID-based enqueue\n");3676	priv->enqueue = dpaa2_eth_enqueue_qd;3677}3678 3679/* Configure ingress classification based on VLAN PCP */3680static int dpaa2_eth_set_vlan_qos(struct dpaa2_eth_priv *priv)3681{3682	struct device *dev = priv->net_dev->dev.parent;3683	struct dpkg_profile_cfg kg_cfg = {0};3684	struct dpni_qos_tbl_cfg qos_cfg = {0};3685	struct dpni_rule_cfg key_params;3686	void *dma_mem, *key, *mask;3687	u8 key_size = 2;	/* VLAN TCI field */3688	int i, pcp, err;3689 3690	/* VLAN-based classification only makes sense if we have multiple3691	 * traffic classes.3692	 * Also, we need to extract just the 3-bit PCP field from the VLAN3693	 * header and we can only do that by using a mask3694	 */3695	if (dpaa2_eth_tc_count(priv) == 1 || !dpaa2_eth_fs_mask_enabled(priv)) {3696		dev_dbg(dev, "VLAN-based QoS classification not supported\n");3697		return -EOPNOTSUPP;3698	}3699 3700	dma_mem = kzalloc(DPAA2_CLASSIFIER_DMA_SIZE, GFP_KERNEL);3701	if (!dma_mem)3702		return -ENOMEM;3703 3704	kg_cfg.num_extracts = 1;3705	kg_cfg.extracts[0].type = DPKG_EXTRACT_FROM_HDR;3706	kg_cfg.extracts[0].extract.from_hdr.prot = NET_PROT_VLAN;3707	kg_cfg.extracts[0].extract.from_hdr.type = DPKG_FULL_FIELD;3708	kg_cfg.extracts[0].extract.from_hdr.field = NH_FLD_VLAN_TCI;3709 3710	err = dpni_prepare_key_cfg(&kg_cfg, dma_mem);3711	if (err) {3712		dev_err(dev, "dpni_prepare_key_cfg failed\n");3713		goto out_free_tbl;3714	}3715 3716	/* set QoS table */3717	qos_cfg.default_tc = 0;3718	qos_cfg.discard_on_miss = 0;3719	qos_cfg.key_cfg_iova = dma_map_single(dev, dma_mem,3720					      DPAA2_CLASSIFIER_DMA_SIZE,3721					      DMA_TO_DEVICE);3722	if (dma_mapping_error(dev, qos_cfg.key_cfg_iova)) {3723		dev_err(dev, "QoS table DMA mapping failed\n");3724		err = -ENOMEM;3725		goto out_free_tbl;3726	}3727 3728	err = dpni_set_qos_table(priv->mc_io, 0, priv->mc_token, &qos_cfg);3729	if (err) {3730		dev_err(dev, "dpni_set_qos_table failed\n");3731		goto out_unmap_tbl;3732	}3733 3734	/* Add QoS table entries */3735	key = kzalloc(key_size * 2, GFP_KERNEL);3736	if (!key) {3737		err = -ENOMEM;3738		goto out_unmap_tbl;3739	}3740	mask = key + key_size;3741	*(__be16 *)mask = cpu_to_be16(VLAN_PRIO_MASK);3742 3743	key_params.key_iova = dma_map_single(dev, key, key_size * 2,3744					     DMA_TO_DEVICE);3745	if (dma_mapping_error(dev, key_params.key_iova)) {3746		dev_err(dev, "Qos table entry DMA mapping failed\n");3747		err = -ENOMEM;3748		goto out_free_key;3749	}3750 3751	key_params.mask_iova = key_params.key_iova + key_size;3752	key_params.key_size = key_size;3753 3754	/* We add rules for PCP-based distribution starting with highest3755	 * priority (VLAN PCP = 7). If this DPNI doesn't have enough traffic3756	 * classes to accommodate all priority levels, the lowest ones end up3757	 * on TC 0 which was configured as default3758	 */3759	for (i = dpaa2_eth_tc_count(priv) - 1, pcp = 7; i >= 0; i--, pcp--) {3760		*(__be16 *)key = cpu_to_be16(pcp << VLAN_PRIO_SHIFT);3761		dma_sync_single_for_device(dev, key_params.key_iova,3762					   key_size * 2, DMA_TO_DEVICE);3763 3764		err = dpni_add_qos_entry(priv->mc_io, 0, priv->mc_token,3765					 &key_params, i, i);3766		if (err) {3767			dev_err(dev, "dpni_add_qos_entry failed\n");3768			dpni_clear_qos_table(priv->mc_io, 0, priv->mc_token);3769			goto out_unmap_key;3770		}3771	}3772 3773	priv->vlan_cls_enabled = true;3774 3775	/* Table and key memory is not persistent, clean everything up after3776	 * configuration is finished3777	 */3778out_unmap_key:3779	dma_unmap_single(dev, key_params.key_iova, key_size * 2, DMA_TO_DEVICE);3780out_free_key:3781	kfree(key);3782out_unmap_tbl:3783	dma_unmap_single(dev, qos_cfg.key_cfg_iova, DPAA2_CLASSIFIER_DMA_SIZE,3784			 DMA_TO_DEVICE);3785out_free_tbl:3786	kfree(dma_mem);3787 3788	return err;3789}3790 3791/* Configure the DPNI object this interface is associated with */3792static int dpaa2_eth_setup_dpni(struct fsl_mc_device *ls_dev)3793{3794	struct device *dev = &ls_dev->dev;3795	struct dpaa2_eth_priv *priv;3796	struct net_device *net_dev;3797	int err;3798 3799	net_dev = dev_get_drvdata(dev);3800	priv = netdev_priv(net_dev);3801 3802	/* get a handle for the DPNI object */3803	err = dpni_open(priv->mc_io, 0, ls_dev->obj_desc.id, &priv->mc_token);3804	if (err) {3805		dev_err(dev, "dpni_open() failed\n");3806		return err;3807	}3808 3809	/* Check if we can work with this DPNI object */3810	err = dpni_get_api_version(priv->mc_io, 0, &priv->dpni_ver_major,3811				   &priv->dpni_ver_minor);3812	if (err) {3813		dev_err(dev, "dpni_get_api_version() failed\n");3814		goto close;3815	}3816	if (dpaa2_eth_cmp_dpni_ver(priv, DPNI_VER_MAJOR, DPNI_VER_MINOR) < 0) {3817		dev_err(dev, "DPNI version %u.%u not supported, need >= %u.%u\n",3818			priv->dpni_ver_major, priv->dpni_ver_minor,3819			DPNI_VER_MAJOR, DPNI_VER_MINOR);3820		err = -EOPNOTSUPP;3821		goto close;3822	}3823 3824	ls_dev->mc_io = priv->mc_io;3825	ls_dev->mc_handle = priv->mc_token;3826 3827	err = dpni_reset(priv->mc_io, 0, priv->mc_token);3828	if (err) {3829		dev_err(dev, "dpni_reset() failed\n");3830		goto close;3831	}3832 3833	err = dpni_get_attributes(priv->mc_io, 0, priv->mc_token,3834				  &priv->dpni_attrs);3835	if (err) {3836		dev_err(dev, "dpni_get_attributes() failed (err=%d)\n", err);3837		goto close;3838	}3839 3840	err = dpaa2_eth_set_buffer_layout(priv);3841	if (err)3842		goto close;3843 3844	dpaa2_eth_set_enqueue_mode(priv);3845 3846	/* Enable pause frame support */3847	if (dpaa2_eth_has_pause_support(priv)) {3848		err = dpaa2_eth_set_pause(priv);3849		if (err)3850			goto close;3851	}3852 3853	err = dpaa2_eth_set_vlan_qos(priv);3854	if (err && err != -EOPNOTSUPP)3855		goto close;3856 3857	priv->cls_rules = devm_kcalloc(dev, dpaa2_eth_fs_count(priv),3858				       sizeof(struct dpaa2_eth_cls_rule),3859				       GFP_KERNEL);3860	if (!priv->cls_rules) {3861		err = -ENOMEM;3862		goto close;3863	}3864 3865	return 0;3866 3867close:3868	dpni_close(priv->mc_io, 0, priv->mc_token);3869 3870	return err;3871}3872 3873static void dpaa2_eth_free_dpni(struct dpaa2_eth_priv *priv)3874{3875	int err;3876 3877	err = dpni_reset(priv->mc_io, 0, priv->mc_token);3878	if (err)3879		netdev_warn(priv->net_dev, "dpni_reset() failed (err %d)\n",3880			    err);3881 3882	dpni_close(priv->mc_io, 0, priv->mc_token);3883}3884 3885static int dpaa2_eth_setup_rx_flow(struct dpaa2_eth_priv *priv,3886				   struct dpaa2_eth_fq *fq)3887{3888	struct device *dev = priv->net_dev->dev.parent;3889	struct dpni_queue queue;3890	struct dpni_queue_id qid;3891	int err;3892 3893	err = dpni_get_queue(priv->mc_io, 0, priv->mc_token,3894			     DPNI_QUEUE_RX, fq->tc, fq->flowid, &queue, &qid);3895	if (err) {3896		dev_err(dev, "dpni_get_queue(RX) failed\n");3897		return err;3898	}3899 3900	fq->fqid = qid.fqid;3901 3902	queue.destination.id = fq->channel->dpcon_id;3903	queue.destination.type = DPNI_DEST_DPCON;3904	queue.destination.priority = 1;3905	queue.user_context = (u64)(uintptr_t)fq;3906	err = dpni_set_queue(priv->mc_io, 0, priv->mc_token,3907			     DPNI_QUEUE_RX, fq->tc, fq->flowid,3908			     DPNI_QUEUE_OPT_USER_CTX | DPNI_QUEUE_OPT_DEST,3909			     &queue);3910	if (err) {3911		dev_err(dev, "dpni_set_queue(RX) failed\n");3912		return err;3913	}3914 3915	/* xdp_rxq setup */3916	/* only once for each channel */3917	if (fq->tc > 0)3918		return 0;3919 3920	err = xdp_rxq_info_reg(&fq->channel->xdp_rxq, priv->net_dev,3921			       fq->flowid, 0);3922	if (err) {3923		dev_err(dev, "xdp_rxq_info_reg failed\n");3924		return err;3925	}3926 3927	err = xdp_rxq_info_reg_mem_model(&fq->channel->xdp_rxq,3928					 MEM_TYPE_PAGE_ORDER0, NULL);3929	if (err) {3930		dev_err(dev, "xdp_rxq_info_reg_mem_model failed\n");3931		return err;3932	}3933 3934	return 0;3935}3936 3937static int dpaa2_eth_setup_tx_flow(struct dpaa2_eth_priv *priv,3938				   struct dpaa2_eth_fq *fq)3939{3940	struct device *dev = priv->net_dev->dev.parent;3941	struct dpni_queue queue;3942	struct dpni_queue_id qid;3943	int i, err;3944 3945	for (i = 0; i < dpaa2_eth_tc_count(priv); i++) {3946		err = dpni_get_queue(priv->mc_io, 0, priv->mc_token,3947				     DPNI_QUEUE_TX, i, fq->flowid,3948				     &queue, &qid);3949		if (err) {3950			dev_err(dev, "dpni_get_queue(TX) failed\n");3951			return err;3952		}3953		fq->tx_fqid[i] = qid.fqid;3954	}3955 3956	/* All Tx queues belonging to the same flowid have the same qdbin */3957	fq->tx_qdbin = qid.qdbin;3958 3959	err = dpni_get_queue(priv->mc_io, 0, priv->mc_token,3960			     DPNI_QUEUE_TX_CONFIRM, 0, fq->flowid,3961			     &queue, &qid);3962	if (err) {3963		dev_err(dev, "dpni_get_queue(TX_CONF) failed\n");3964		return err;3965	}3966 3967	fq->fqid = qid.fqid;3968 3969	queue.destination.id = fq->channel->dpcon_id;3970	queue.destination.type = DPNI_DEST_DPCON;3971	queue.destination.priority = 0;3972	queue.user_context = (u64)(uintptr_t)fq;3973	err = dpni_set_queue(priv->mc_io, 0, priv->mc_token,3974			     DPNI_QUEUE_TX_CONFIRM, 0, fq->flowid,3975			     DPNI_QUEUE_OPT_USER_CTX | DPNI_QUEUE_OPT_DEST,3976			     &queue);3977	if (err) {3978		dev_err(dev, "dpni_set_queue(TX_CONF) failed\n");3979		return err;3980	}3981 3982	return 0;3983}3984 3985static int setup_rx_err_flow(struct dpaa2_eth_priv *priv,3986			     struct dpaa2_eth_fq *fq)3987{3988	struct device *dev = priv->net_dev->dev.parent;3989	struct dpni_queue q = { { 0 } };3990	struct dpni_queue_id qid;3991	u8 q_opt = DPNI_QUEUE_OPT_USER_CTX | DPNI_QUEUE_OPT_DEST;3992	int err;3993 3994	err = dpni_get_queue(priv->mc_io, 0, priv->mc_token,3995			     DPNI_QUEUE_RX_ERR, 0, 0, &q, &qid);3996	if (err) {3997		dev_err(dev, "dpni_get_queue() failed (%d)\n", err);3998		return err;3999	}4000 4001	fq->fqid = qid.fqid;4002 4003	q.destination.id = fq->channel->dpcon_id;4004	q.destination.type = DPNI_DEST_DPCON;4005	q.destination.priority = 1;4006	q.user_context = (u64)(uintptr_t)fq;4007	err = dpni_set_queue(priv->mc_io, 0, priv->mc_token,4008			     DPNI_QUEUE_RX_ERR, 0, 0, q_opt, &q);4009	if (err) {4010		dev_err(dev, "dpni_set_queue() failed (%d)\n", err);4011		return err;4012	}4013 4014	return 0;4015}4016 4017/* Supported header fields for Rx hash distribution key */4018static const struct dpaa2_eth_dist_fields dist_fields[] = {4019	{4020		/* L2 header */4021		.rxnfc_field = RXH_L2DA,4022		.cls_prot = NET_PROT_ETH,4023		.cls_field = NH_FLD_ETH_DA,4024		.id = DPAA2_ETH_DIST_ETHDST,4025		.size = 6,4026	}, {4027		.cls_prot = NET_PROT_ETH,4028		.cls_field = NH_FLD_ETH_SA,4029		.id = DPAA2_ETH_DIST_ETHSRC,4030		.size = 6,4031	}, {4032		/* This is the last ethertype field parsed:4033		 * depending on frame format, it can be the MAC ethertype4034		 * or the VLAN etype.4035		 */4036		.cls_prot = NET_PROT_ETH,4037		.cls_field = NH_FLD_ETH_TYPE,4038		.id = DPAA2_ETH_DIST_ETHTYPE,4039		.size = 2,4040	}, {4041		/* VLAN header */4042		.rxnfc_field = RXH_VLAN,4043		.cls_prot = NET_PROT_VLAN,4044		.cls_field = NH_FLD_VLAN_TCI,4045		.id = DPAA2_ETH_DIST_VLAN,4046		.size = 2,4047	}, {4048		/* IP header */4049		.rxnfc_field = RXH_IP_SRC,4050		.cls_prot = NET_PROT_IP,4051		.cls_field = NH_FLD_IP_SRC,4052		.id = DPAA2_ETH_DIST_IPSRC,4053		.size = 4,4054	}, {4055		.rxnfc_field = RXH_IP_DST,4056		.cls_prot = NET_PROT_IP,4057		.cls_field = NH_FLD_IP_DST,4058		.id = DPAA2_ETH_DIST_IPDST,4059		.size = 4,4060	}, {4061		.rxnfc_field = RXH_L3_PROTO,4062		.cls_prot = NET_PROT_IP,4063		.cls_field = NH_FLD_IP_PROTO,4064		.id = DPAA2_ETH_DIST_IPPROTO,4065		.size = 1,4066	}, {4067		/* Using UDP ports, this is functionally equivalent to raw4068		 * byte pairs from L4 header.4069		 */4070		.rxnfc_field = RXH_L4_B_0_1,4071		.cls_prot = NET_PROT_UDP,4072		.cls_field = NH_FLD_UDP_PORT_SRC,4073		.id = DPAA2_ETH_DIST_L4SRC,4074		.size = 2,4075	}, {4076		.rxnfc_field = RXH_L4_B_2_3,4077		.cls_prot = NET_PROT_UDP,4078		.cls_field = NH_FLD_UDP_PORT_DST,4079		.id = DPAA2_ETH_DIST_L4DST,4080		.size = 2,4081	},4082};4083 4084/* Configure the Rx hash key using the legacy API */4085static int dpaa2_eth_config_legacy_hash_key(struct dpaa2_eth_priv *priv, dma_addr_t key)4086{4087	struct device *dev = priv->net_dev->dev.parent;4088	struct dpni_rx_tc_dist_cfg dist_cfg;4089	int i, err = 0;4090 4091	memset(&dist_cfg, 0, sizeof(dist_cfg));4092 4093	dist_cfg.key_cfg_iova = key;4094	dist_cfg.dist_size = dpaa2_eth_queue_count(priv);4095	dist_cfg.dist_mode = DPNI_DIST_MODE_HASH;4096 4097	for (i = 0; i < dpaa2_eth_tc_count(priv); i++) {4098		err = dpni_set_rx_tc_dist(priv->mc_io, 0, priv->mc_token,4099					  i, &dist_cfg);4100		if (err) {4101			dev_err(dev, "dpni_set_rx_tc_dist failed\n");4102			break;4103		}4104	}4105 4106	return err;4107}4108 4109/* Configure the Rx hash key using the new API */4110static int dpaa2_eth_config_hash_key(struct dpaa2_eth_priv *priv, dma_addr_t key)4111{4112	struct device *dev = priv->net_dev->dev.parent;4113	struct dpni_rx_dist_cfg dist_cfg;4114	int i, err = 0;4115 4116	memset(&dist_cfg, 0, sizeof(dist_cfg));4117 4118	dist_cfg.key_cfg_iova = key;4119	dist_cfg.dist_size = dpaa2_eth_queue_count(priv);4120	dist_cfg.enable = 1;4121 4122	for (i = 0; i < dpaa2_eth_tc_count(priv); i++) {4123		dist_cfg.tc = i;4124		err = dpni_set_rx_hash_dist(priv->mc_io, 0, priv->mc_token,4125					    &dist_cfg);4126		if (err) {4127			dev_err(dev, "dpni_set_rx_hash_dist failed\n");4128			break;4129		}4130 4131		/* If the flow steering / hashing key is shared between all4132		 * traffic classes, install it just once4133		 */4134		if (priv->dpni_attrs.options & DPNI_OPT_SHARED_FS)4135			break;4136	}4137 4138	return err;4139}4140 4141/* Configure the Rx flow classification key */4142static int dpaa2_eth_config_cls_key(struct dpaa2_eth_priv *priv, dma_addr_t key)4143{4144	struct device *dev = priv->net_dev->dev.parent;4145	struct dpni_rx_dist_cfg dist_cfg;4146	int i, err = 0;4147 4148	memset(&dist_cfg, 0, sizeof(dist_cfg));4149 4150	dist_cfg.key_cfg_iova = key;4151	dist_cfg.dist_size = dpaa2_eth_queue_count(priv);4152	dist_cfg.enable = 1;4153 4154	for (i = 0; i < dpaa2_eth_tc_count(priv); i++) {4155		dist_cfg.tc = i;4156		err = dpni_set_rx_fs_dist(priv->mc_io, 0, priv->mc_token,4157					  &dist_cfg);4158		if (err) {4159			dev_err(dev, "dpni_set_rx_fs_dist failed\n");4160			break;4161		}4162 4163		/* If the flow steering / hashing key is shared between all4164		 * traffic classes, install it just once4165		 */4166		if (priv->dpni_attrs.options & DPNI_OPT_SHARED_FS)4167			break;4168	}4169 4170	return err;4171}4172 4173/* Size of the Rx flow classification key */4174int dpaa2_eth_cls_key_size(u64 fields)4175{4176	int i, size = 0;4177 4178	for (i = 0; i < ARRAY_SIZE(dist_fields); i++) {4179		if (!(fields & dist_fields[i].id))4180			continue;4181		size += dist_fields[i].size;4182	}4183 4184	return size;4185}4186 4187/* Offset of header field in Rx classification key */4188int dpaa2_eth_cls_fld_off(int prot, int field)4189{4190	int i, off = 0;4191 4192	for (i = 0; i < ARRAY_SIZE(dist_fields); i++) {4193		if (dist_fields[i].cls_prot == prot &&4194		    dist_fields[i].cls_field == field)4195			return off;4196		off += dist_fields[i].size;4197	}4198 4199	WARN_ONCE(1, "Unsupported header field used for Rx flow cls\n");4200	return 0;4201}4202 4203/* Prune unused fields from the classification rule.4204 * Used when masking is not supported4205 */4206void dpaa2_eth_cls_trim_rule(void *key_mem, u64 fields)4207{4208	int off = 0, new_off = 0;4209	int i, size;4210 4211	for (i = 0; i < ARRAY_SIZE(dist_fields); i++) {4212		size = dist_fields[i].size;4213		if (dist_fields[i].id & fields) {4214			memcpy(key_mem + new_off, key_mem + off, size);4215			new_off += size;4216		}4217		off += size;4218	}4219}4220 4221/* Set Rx distribution (hash or flow classification) key4222 * flags is a combination of RXH_ bits4223 */4224static int dpaa2_eth_set_dist_key(struct net_device *net_dev,4225				  enum dpaa2_eth_rx_dist type, u64 flags)4226{4227	struct device *dev = net_dev->dev.parent;4228	struct dpaa2_eth_priv *priv = netdev_priv(net_dev);4229	struct dpkg_profile_cfg cls_cfg;4230	u32 rx_hash_fields = 0;4231	dma_addr_t key_iova;4232	u8 *dma_mem;4233	int i;4234	int err = 0;4235 4236	memset(&cls_cfg, 0, sizeof(cls_cfg));4237 4238	for (i = 0; i < ARRAY_SIZE(dist_fields); i++) {4239		struct dpkg_extract *key =4240			&cls_cfg.extracts[cls_cfg.num_extracts];4241 4242		/* For both Rx hashing and classification keys4243		 * we set only the selected fields.4244		 */4245		if (!(flags & dist_fields[i].id))4246			continue;4247		if (type == DPAA2_ETH_RX_DIST_HASH)4248			rx_hash_fields |= dist_fields[i].rxnfc_field;4249 4250		if (cls_cfg.num_extracts >= DPKG_MAX_NUM_OF_EXTRACTS) {4251			dev_err(dev, "error adding key extraction rule, too many rules?\n");4252			return -E2BIG;4253		}4254 4255		key->type = DPKG_EXTRACT_FROM_HDR;4256		key->extract.from_hdr.prot = dist_fields[i].cls_prot;4257		key->extract.from_hdr.type = DPKG_FULL_FIELD;4258		key->extract.from_hdr.field = dist_fields[i].cls_field;4259		cls_cfg.num_extracts++;4260	}4261 4262	dma_mem = kzalloc(DPAA2_CLASSIFIER_DMA_SIZE, GFP_KERNEL);4263	if (!dma_mem)4264		return -ENOMEM;4265 4266	err = dpni_prepare_key_cfg(&cls_cfg, dma_mem);4267	if (err) {4268		dev_err(dev, "dpni_prepare_key_cfg error %d\n", err);4269		goto free_key;4270	}4271 4272	/* Prepare for setting the rx dist */4273	key_iova = dma_map_single(dev, dma_mem, DPAA2_CLASSIFIER_DMA_SIZE,4274				  DMA_TO_DEVICE);4275	if (dma_mapping_error(dev, key_iova)) {4276		dev_err(dev, "DMA mapping failed\n");4277		err = -ENOMEM;4278		goto free_key;4279	}4280 4281	if (type == DPAA2_ETH_RX_DIST_HASH) {4282		if (dpaa2_eth_has_legacy_dist(priv))4283			err = dpaa2_eth_config_legacy_hash_key(priv, key_iova);4284		else4285			err = dpaa2_eth_config_hash_key(priv, key_iova);4286	} else {4287		err = dpaa2_eth_config_cls_key(priv, key_iova);4288	}4289 4290	dma_unmap_single(dev, key_iova, DPAA2_CLASSIFIER_DMA_SIZE,4291			 DMA_TO_DEVICE);4292	if (!err && type == DPAA2_ETH_RX_DIST_HASH)4293		priv->rx_hash_fields = rx_hash_fields;4294 4295free_key:4296	kfree(dma_mem);4297	return err;4298}4299 4300int dpaa2_eth_set_hash(struct net_device *net_dev, u64 flags)4301{4302	struct dpaa2_eth_priv *priv = netdev_priv(net_dev);4303	u64 key = 0;4304	int i;4305 4306	if (!dpaa2_eth_hash_enabled(priv))4307		return -EOPNOTSUPP;4308 4309	for (i = 0; i < ARRAY_SIZE(dist_fields); i++)4310		if (dist_fields[i].rxnfc_field & flags)4311			key |= dist_fields[i].id;4312 4313	return dpaa2_eth_set_dist_key(net_dev, DPAA2_ETH_RX_DIST_HASH, key);4314}4315 4316int dpaa2_eth_set_cls(struct net_device *net_dev, u64 flags)4317{4318	return dpaa2_eth_set_dist_key(net_dev, DPAA2_ETH_RX_DIST_CLS, flags);4319}4320 4321static int dpaa2_eth_set_default_cls(struct dpaa2_eth_priv *priv)4322{4323	struct device *dev = priv->net_dev->dev.parent;4324	int err;4325 4326	/* Check if we actually support Rx flow classification */4327	if (dpaa2_eth_has_legacy_dist(priv)) {4328		dev_dbg(dev, "Rx cls not supported by current MC version\n");4329		return -EOPNOTSUPP;4330	}4331 4332	if (!dpaa2_eth_fs_enabled(priv)) {4333		dev_dbg(dev, "Rx cls disabled in DPNI options\n");4334		return -EOPNOTSUPP;4335	}4336 4337	if (!dpaa2_eth_hash_enabled(priv)) {4338		dev_dbg(dev, "Rx cls disabled for single queue DPNIs\n");4339		return -EOPNOTSUPP;4340	}4341 4342	/* If there is no support for masking in the classification table,4343	 * we don't set a default key, as it will depend on the rules4344	 * added by the user at runtime.4345	 */4346	if (!dpaa2_eth_fs_mask_enabled(priv))4347		goto out;4348 4349	err = dpaa2_eth_set_cls(priv->net_dev, DPAA2_ETH_DIST_ALL);4350	if (err)4351		return err;4352 4353out:4354	priv->rx_cls_enabled = 1;4355 4356	return 0;4357}4358 4359/* Bind the DPNI to its needed objects and resources: buffer pool, DPIOs,4360 * frame queues and channels4361 */4362static int dpaa2_eth_bind_dpni(struct dpaa2_eth_priv *priv)4363{4364	struct dpaa2_eth_bp *bp = priv->bp[DPAA2_ETH_DEFAULT_BP_IDX];4365	struct net_device *net_dev = priv->net_dev;4366	struct dpni_pools_cfg pools_params = { 0 };4367	struct device *dev = net_dev->dev.parent;4368	struct dpni_error_cfg err_cfg;4369	int err = 0;4370	int i;4371 4372	pools_params.num_dpbp = 1;4373	pools_params.pools[0].dpbp_id = bp->dev->obj_desc.id;4374	pools_params.pools[0].backup_pool = 0;4375	pools_params.pools[0].buffer_size = priv->rx_buf_size;4376	err = dpni_set_pools(priv->mc_io, 0, priv->mc_token, &pools_params);4377	if (err) {4378		dev_err(dev, "dpni_set_pools() failed\n");4379		return err;4380	}4381 4382	/* have the interface implicitly distribute traffic based on4383	 * the default hash key4384	 */4385	err = dpaa2_eth_set_hash(net_dev, DPAA2_RXH_DEFAULT);4386	if (err && err != -EOPNOTSUPP)4387		dev_err(dev, "Failed to configure hashing\n");4388 4389	/* Configure the flow classification key; it includes all4390	 * supported header fields and cannot be modified at runtime4391	 */4392	err = dpaa2_eth_set_default_cls(priv);4393	if (err && err != -EOPNOTSUPP)4394		dev_err(dev, "Failed to configure Rx classification key\n");4395 4396	/* Configure handling of error frames */4397	err_cfg.errors = DPAA2_FAS_RX_ERR_MASK;4398	err_cfg.set_frame_annotation = 1;4399	err_cfg.error_action = DPNI_ERROR_ACTION_DISCARD;4400	err = dpni_set_errors_behavior(priv->mc_io, 0, priv->mc_token,4401				       &err_cfg);4402	if (err) {4403		dev_err(dev, "dpni_set_errors_behavior failed\n");4404		return err;4405	}4406 4407	/* Configure Rx and Tx conf queues to generate CDANs */4408	for (i = 0; i < priv->num_fqs; i++) {4409		switch (priv->fq[i].type) {4410		case DPAA2_RX_FQ:4411			err = dpaa2_eth_setup_rx_flow(priv, &priv->fq[i]);4412			break;4413		case DPAA2_TX_CONF_FQ:4414			err = dpaa2_eth_setup_tx_flow(priv, &priv->fq[i]);4415			break;4416		case DPAA2_RX_ERR_FQ:4417			err = setup_rx_err_flow(priv, &priv->fq[i]);4418			break;4419		default:4420			dev_err(dev, "Invalid FQ type %d\n", priv->fq[i].type);4421			return -EINVAL;4422		}4423		if (err)4424			return err;4425	}4426 4427	err = dpni_get_qdid(priv->mc_io, 0, priv->mc_token,4428			    DPNI_QUEUE_TX, &priv->tx_qdid);4429	if (err) {4430		dev_err(dev, "dpni_get_qdid() failed\n");4431		return err;4432	}4433 4434	return 0;4435}4436 4437/* Allocate rings for storing incoming frame descriptors */4438static int dpaa2_eth_alloc_rings(struct dpaa2_eth_priv *priv)4439{4440	struct net_device *net_dev = priv->net_dev;4441	struct device *dev = net_dev->dev.parent;4442	int i;4443 4444	for (i = 0; i < priv->num_channels; i++) {4445		priv->channel[i]->store =4446			dpaa2_io_store_create(DPAA2_ETH_STORE_SIZE, dev);4447		if (!priv->channel[i]->store) {4448			netdev_err(net_dev, "dpaa2_io_store_create() failed\n");4449			goto err_ring;4450		}4451	}4452 4453	return 0;4454 4455err_ring:4456	for (i = 0; i < priv->num_channels; i++) {4457		if (!priv->channel[i]->store)4458			break;4459		dpaa2_io_store_destroy(priv->channel[i]->store);4460	}4461 4462	return -ENOMEM;4463}4464 4465static void dpaa2_eth_free_rings(struct dpaa2_eth_priv *priv)4466{4467	int i;4468 4469	for (i = 0; i < priv->num_channels; i++)4470		dpaa2_io_store_destroy(priv->channel[i]->store);4471}4472 4473static int dpaa2_eth_set_mac_addr(struct dpaa2_eth_priv *priv)4474{4475	struct net_device *net_dev = priv->net_dev;4476	struct device *dev = net_dev->dev.parent;4477	u8 mac_addr[ETH_ALEN], dpni_mac_addr[ETH_ALEN];4478	int err;4479 4480	/* Get firmware address, if any */4481	err = dpni_get_port_mac_addr(priv->mc_io, 0, priv->mc_token, mac_addr);4482	if (err) {4483		dev_err(dev, "dpni_get_port_mac_addr() failed\n");4484		return err;4485	}4486 4487	/* Get DPNI attributes address, if any */4488	err = dpni_get_primary_mac_addr(priv->mc_io, 0, priv->mc_token,4489					dpni_mac_addr);4490	if (err) {4491		dev_err(dev, "dpni_get_primary_mac_addr() failed\n");4492		return err;4493	}4494 4495	/* First check if firmware has any address configured by bootloader */4496	if (!is_zero_ether_addr(mac_addr)) {4497		/* If the DPMAC addr != DPNI addr, update it */4498		if (!ether_addr_equal(mac_addr, dpni_mac_addr)) {4499			err = dpni_set_primary_mac_addr(priv->mc_io, 0,4500							priv->mc_token,4501							mac_addr);4502			if (err) {4503				dev_err(dev, "dpni_set_primary_mac_addr() failed\n");4504				return err;4505			}4506		}4507		eth_hw_addr_set(net_dev, mac_addr);4508	} else if (is_zero_ether_addr(dpni_mac_addr)) {4509		/* No MAC address configured, fill in net_dev->dev_addr4510		 * with a random one4511		 */4512		eth_hw_addr_random(net_dev);4513		dev_dbg_once(dev, "device(s) have all-zero hwaddr, replaced with random\n");4514 4515		err = dpni_set_primary_mac_addr(priv->mc_io, 0, priv->mc_token,4516						net_dev->dev_addr);4517		if (err) {4518			dev_err(dev, "dpni_set_primary_mac_addr() failed\n");4519			return err;4520		}4521 4522		/* Override NET_ADDR_RANDOM set by eth_hw_addr_random(); for all4523		 * practical purposes, this will be our "permanent" mac address,4524		 * at least until the next reboot. This move will also permit4525		 * register_netdevice() to properly fill up net_dev->perm_addr.4526		 */4527		net_dev->addr_assign_type = NET_ADDR_PERM;4528	} else {4529		/* NET_ADDR_PERM is default, all we have to do is4530		 * fill in the device addr.4531		 */4532		eth_hw_addr_set(net_dev, dpni_mac_addr);4533	}4534 4535	return 0;4536}4537 4538static int dpaa2_eth_netdev_init(struct net_device *net_dev)4539{4540	struct device *dev = net_dev->dev.parent;4541	struct dpaa2_eth_priv *priv = netdev_priv(net_dev);4542	u32 options = priv->dpni_attrs.options;4543	u64 supported = 0, not_supported = 0;4544	u8 bcast_addr[ETH_ALEN];4545	u8 num_queues;4546	int err;4547 4548	net_dev->netdev_ops = &dpaa2_eth_ops;4549	net_dev->ethtool_ops = &dpaa2_ethtool_ops;4550 4551	err = dpaa2_eth_set_mac_addr(priv);4552	if (err)4553		return err;4554 4555	/* Explicitly add the broadcast address to the MAC filtering table */4556	eth_broadcast_addr(bcast_addr);4557	err = dpni_add_mac_addr(priv->mc_io, 0, priv->mc_token, bcast_addr);4558	if (err) {4559		dev_err(dev, "dpni_add_mac_addr() failed\n");4560		return err;4561	}4562 4563	/* Set MTU upper limit; lower limit is 68B (default value) */4564	net_dev->max_mtu = DPAA2_ETH_MAX_MTU;4565	err = dpni_set_max_frame_length(priv->mc_io, 0, priv->mc_token,4566					DPAA2_ETH_MFL);4567	if (err) {4568		dev_err(dev, "dpni_set_max_frame_length() failed\n");4569		return err;4570	}4571 4572	/* Set actual number of queues in the net device */4573	num_queues = dpaa2_eth_queue_count(priv);4574	err = netif_set_real_num_tx_queues(net_dev, num_queues);4575	if (err) {4576		dev_err(dev, "netif_set_real_num_tx_queues() failed\n");4577		return err;4578	}4579	err = netif_set_real_num_rx_queues(net_dev, num_queues);4580	if (err) {4581		dev_err(dev, "netif_set_real_num_rx_queues() failed\n");4582		return err;4583	}4584 4585	dpaa2_eth_detect_features(priv);4586 4587	/* Capabilities listing */4588	supported |= IFF_LIVE_ADDR_CHANGE;4589 4590	if (options & DPNI_OPT_NO_MAC_FILTER)4591		not_supported |= IFF_UNICAST_FLT;4592	else4593		supported |= IFF_UNICAST_FLT;4594 4595	net_dev->priv_flags |= supported;4596	net_dev->priv_flags &= ~not_supported;4597	net_dev->lltx = true;4598 4599	/* Features */4600	net_dev->features = NETIF_F_RXCSUM |4601			    NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM |4602			    NETIF_F_SG | NETIF_F_HIGHDMA |4603			    NETIF_F_HW_TC | NETIF_F_TSO;4604	net_dev->gso_max_segs = DPAA2_ETH_ENQUEUE_MAX_FDS;4605	net_dev->hw_features = net_dev->features;4606	net_dev->xdp_features = NETDEV_XDP_ACT_BASIC |4607				NETDEV_XDP_ACT_REDIRECT |4608				NETDEV_XDP_ACT_NDO_XMIT;4609	if (priv->dpni_attrs.wriop_version >= DPAA2_WRIOP_VERSION(3, 0, 0) &&4610	    priv->dpni_attrs.num_queues <= 8)4611		net_dev->xdp_features |= NETDEV_XDP_ACT_XSK_ZEROCOPY;4612 4613	if (priv->dpni_attrs.vlan_filter_entries)4614		net_dev->hw_features |= NETIF_F_HW_VLAN_CTAG_FILTER;4615 4616	return 0;4617}4618 4619static int dpaa2_eth_poll_link_state(void *arg)4620{4621	struct dpaa2_eth_priv *priv = (struct dpaa2_eth_priv *)arg;4622	int err;4623 4624	while (!kthread_should_stop()) {4625		err = dpaa2_eth_link_state_update(priv);4626		if (unlikely(err))4627			return err;4628 4629		msleep(DPAA2_ETH_LINK_STATE_REFRESH);4630	}4631 4632	return 0;4633}4634 4635static int dpaa2_eth_connect_mac(struct dpaa2_eth_priv *priv)4636{4637	struct fsl_mc_device *dpni_dev, *dpmac_dev;4638	struct dpaa2_mac *mac;4639	int err;4640 4641	dpni_dev = to_fsl_mc_device(priv->net_dev->dev.parent);4642	dpmac_dev = fsl_mc_get_endpoint(dpni_dev, 0);4643 4644	if (PTR_ERR(dpmac_dev) == -EPROBE_DEFER) {4645		netdev_dbg(priv->net_dev, "waiting for mac\n");4646		return PTR_ERR(dpmac_dev);4647	}4648 4649	if (IS_ERR(dpmac_dev) || dpmac_dev->dev.type != &fsl_mc_bus_dpmac_type)4650		return 0;4651 4652	mac = kzalloc(sizeof(struct dpaa2_mac), GFP_KERNEL);4653	if (!mac)4654		return -ENOMEM;4655 4656	mac->mc_dev = dpmac_dev;4657	mac->mc_io = priv->mc_io;4658	mac->net_dev = priv->net_dev;4659 4660	err = dpaa2_mac_open(mac);4661	if (err)4662		goto err_free_mac;4663 4664	if (dpaa2_mac_is_type_phy(mac)) {4665		err = dpaa2_mac_connect(mac);4666		if (err) {4667			if (err == -EPROBE_DEFER)4668				netdev_dbg(priv->net_dev,4669					   "could not connect to MAC\n");4670			else4671				netdev_err(priv->net_dev,4672					   "Error connecting to the MAC endpoint: %pe",4673					   ERR_PTR(err));4674			goto err_close_mac;4675		}4676	}4677 4678	mutex_lock(&priv->mac_lock);4679	priv->mac = mac;4680	mutex_unlock(&priv->mac_lock);4681 4682	return 0;4683 4684err_close_mac:4685	dpaa2_mac_close(mac);4686err_free_mac:4687	kfree(mac);4688	return err;4689}4690 4691static void dpaa2_eth_disconnect_mac(struct dpaa2_eth_priv *priv)4692{4693	struct dpaa2_mac *mac;4694 4695	mutex_lock(&priv->mac_lock);4696	mac = priv->mac;4697	priv->mac = NULL;4698	mutex_unlock(&priv->mac_lock);4699 4700	if (!mac)4701		return;4702 4703	if (dpaa2_mac_is_type_phy(mac))4704		dpaa2_mac_disconnect(mac);4705 4706	dpaa2_mac_close(mac);4707	kfree(mac);4708}4709 4710static irqreturn_t dpni_irq0_handler_thread(int irq_num, void *arg)4711{4712	u32 status = ~0;4713	struct device *dev = (struct device *)arg;4714	struct fsl_mc_device *dpni_dev = to_fsl_mc_device(dev);4715	struct net_device *net_dev = dev_get_drvdata(dev);4716	struct dpaa2_eth_priv *priv = netdev_priv(net_dev);4717	bool had_mac;4718	int err;4719 4720	err = dpni_get_irq_status(dpni_dev->mc_io, 0, dpni_dev->mc_handle,4721				  DPNI_IRQ_INDEX, &status);4722	if (unlikely(err)) {4723		netdev_err(net_dev, "Can't get irq status (err %d)\n", err);4724		return IRQ_HANDLED;4725	}4726 4727	if (status & DPNI_IRQ_EVENT_LINK_CHANGED)4728		dpaa2_eth_link_state_update(netdev_priv(net_dev));4729 4730	if (status & DPNI_IRQ_EVENT_ENDPOINT_CHANGED) {4731		dpaa2_eth_set_mac_addr(netdev_priv(net_dev));4732		dpaa2_eth_update_tx_fqids(priv);4733 4734		/* We can avoid locking because the "endpoint changed" IRQ4735		 * handler is the only one who changes priv->mac at runtime,4736		 * so we are not racing with anyone.4737		 */4738		had_mac = !!priv->mac;4739		if (had_mac)4740			dpaa2_eth_disconnect_mac(priv);4741		else4742			dpaa2_eth_connect_mac(priv);4743	}4744 4745	return IRQ_HANDLED;4746}4747 4748static int dpaa2_eth_setup_irqs(struct fsl_mc_device *ls_dev)4749{4750	int err = 0;4751	struct fsl_mc_device_irq *irq;4752 4753	err = fsl_mc_allocate_irqs(ls_dev);4754	if (err) {4755		dev_err(&ls_dev->dev, "MC irqs allocation failed\n");4756		return err;4757	}4758 4759	irq = ls_dev->irqs[0];4760	err = devm_request_threaded_irq(&ls_dev->dev, irq->virq,4761					NULL, dpni_irq0_handler_thread,4762					IRQF_NO_SUSPEND | IRQF_ONESHOT,4763					dev_name(&ls_dev->dev), &ls_dev->dev);4764	if (err < 0) {4765		dev_err(&ls_dev->dev, "devm_request_threaded_irq(): %d\n", err);4766		goto free_mc_irq;4767	}4768 4769	err = dpni_set_irq_mask(ls_dev->mc_io, 0, ls_dev->mc_handle,4770				DPNI_IRQ_INDEX, DPNI_IRQ_EVENT_LINK_CHANGED |4771				DPNI_IRQ_EVENT_ENDPOINT_CHANGED);4772	if (err < 0) {4773		dev_err(&ls_dev->dev, "dpni_set_irq_mask(): %d\n", err);4774		goto free_irq;4775	}4776 4777	err = dpni_set_irq_enable(ls_dev->mc_io, 0, ls_dev->mc_handle,4778				  DPNI_IRQ_INDEX, 1);4779	if (err < 0) {4780		dev_err(&ls_dev->dev, "dpni_set_irq_enable(): %d\n", err);4781		goto free_irq;4782	}4783 4784	return 0;4785 4786free_irq:4787	devm_free_irq(&ls_dev->dev, irq->virq, &ls_dev->dev);4788free_mc_irq:4789	fsl_mc_free_irqs(ls_dev);4790 4791	return err;4792}4793 4794static void dpaa2_eth_add_ch_napi(struct dpaa2_eth_priv *priv)4795{4796	int i;4797	struct dpaa2_eth_channel *ch;4798 4799	for (i = 0; i < priv->num_channels; i++) {4800		ch = priv->channel[i];4801		/* NAPI weight *MUST* be a multiple of DPAA2_ETH_STORE_SIZE */4802		netif_napi_add(priv->net_dev, &ch->napi, dpaa2_eth_poll);4803	}4804}4805 4806static void dpaa2_eth_del_ch_napi(struct dpaa2_eth_priv *priv)4807{4808	int i;4809	struct dpaa2_eth_channel *ch;4810 4811	for (i = 0; i < priv->num_channels; i++) {4812		ch = priv->channel[i];4813		netif_napi_del(&ch->napi);4814	}4815}4816 4817static int dpaa2_eth_probe(struct fsl_mc_device *dpni_dev)4818{4819	struct device *dev;4820	struct net_device *net_dev = NULL;4821	struct dpaa2_eth_priv *priv = NULL;4822	int err = 0;4823 4824	dev = &dpni_dev->dev;4825 4826	/* Net device */4827	net_dev = alloc_etherdev_mq(sizeof(*priv), DPAA2_ETH_MAX_NETDEV_QUEUES);4828	if (!net_dev) {4829		dev_err(dev, "alloc_etherdev_mq() failed\n");4830		return -ENOMEM;4831	}4832 4833	SET_NETDEV_DEV(net_dev, dev);4834	dev_set_drvdata(dev, net_dev);4835 4836	priv = netdev_priv(net_dev);4837	priv->net_dev = net_dev;4838	SET_NETDEV_DEVLINK_PORT(net_dev, &priv->devlink_port);4839 4840	mutex_init(&priv->mac_lock);4841 4842	priv->iommu_domain = iommu_get_domain_for_dev(dev);4843 4844	priv->tx_tstamp_type = HWTSTAMP_TX_OFF;4845	priv->rx_tstamp = false;4846 4847	priv->dpaa2_ptp_wq = alloc_workqueue("dpaa2_ptp_wq", 0, 0);4848	if (!priv->dpaa2_ptp_wq) {4849		err = -ENOMEM;4850		goto err_wq_alloc;4851	}4852 4853	INIT_WORK(&priv->tx_onestep_tstamp, dpaa2_eth_tx_onestep_tstamp);4854	mutex_init(&priv->onestep_tstamp_lock);4855	skb_queue_head_init(&priv->tx_skbs);4856 4857	priv->rx_copybreak = DPAA2_ETH_DEFAULT_COPYBREAK;4858 4859	/* Obtain a MC portal */4860	err = fsl_mc_portal_allocate(dpni_dev, FSL_MC_IO_ATOMIC_CONTEXT_PORTAL,4861				     &priv->mc_io);4862	if (err) {4863		if (err == -ENXIO) {4864			dev_dbg(dev, "waiting for MC portal\n");4865			err = -EPROBE_DEFER;4866		} else {4867			dev_err(dev, "MC portal allocation failed\n");4868		}4869		goto err_portal_alloc;4870	}4871 4872	/* MC objects initialization and configuration */4873	err = dpaa2_eth_setup_dpni(dpni_dev);4874	if (err)4875		goto err_dpni_setup;4876 4877	err = dpaa2_eth_setup_dpio(priv);4878	if (err)4879		goto err_dpio_setup;4880 4881	dpaa2_eth_setup_fqs(priv);4882 4883	err = dpaa2_eth_setup_default_dpbp(priv);4884	if (err)4885		goto err_dpbp_setup;4886 4887	err = dpaa2_eth_bind_dpni(priv);4888	if (err)4889		goto err_bind;4890 4891	/* Add a NAPI context for each channel */4892	dpaa2_eth_add_ch_napi(priv);4893 4894	/* Percpu statistics */4895	priv->percpu_stats = alloc_percpu(*priv->percpu_stats);4896	if (!priv->percpu_stats) {4897		dev_err(dev, "alloc_percpu(percpu_stats) failed\n");4898		err = -ENOMEM;4899		goto err_alloc_percpu_stats;4900	}4901	priv->percpu_extras = alloc_percpu(*priv->percpu_extras);4902	if (!priv->percpu_extras) {4903		dev_err(dev, "alloc_percpu(percpu_extras) failed\n");4904		err = -ENOMEM;4905		goto err_alloc_percpu_extras;4906	}4907 4908	priv->sgt_cache = alloc_percpu(*priv->sgt_cache);4909	if (!priv->sgt_cache) {4910		dev_err(dev, "alloc_percpu(sgt_cache) failed\n");4911		err = -ENOMEM;4912		goto err_alloc_sgt_cache;4913	}4914 4915	priv->fd = alloc_percpu(*priv->fd);4916	if (!priv->fd) {4917		dev_err(dev, "alloc_percpu(fds) failed\n");4918		err = -ENOMEM;4919		goto err_alloc_fds;4920	}4921 4922	err = dpaa2_eth_netdev_init(net_dev);4923	if (err)4924		goto err_netdev_init;4925 4926	/* Configure checksum offload based on current interface flags */4927	err = dpaa2_eth_set_rx_csum(priv, !!(net_dev->features & NETIF_F_RXCSUM));4928	if (err)4929		goto err_csum;4930 4931	err = dpaa2_eth_set_tx_csum(priv,4932				    !!(net_dev->features & (NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM)));4933	if (err)4934		goto err_csum;4935 4936	err = dpaa2_eth_alloc_rings(priv);4937	if (err)4938		goto err_alloc_rings;4939 4940#ifdef CONFIG_FSL_DPAA2_ETH_DCB4941	if (dpaa2_eth_has_pause_support(priv) && priv->vlan_cls_enabled) {4942		priv->dcbx_mode = DCB_CAP_DCBX_HOST | DCB_CAP_DCBX_VER_IEEE;4943		net_dev->dcbnl_ops = &dpaa2_eth_dcbnl_ops;4944	} else {4945		dev_dbg(dev, "PFC not supported\n");4946	}4947#endif4948 4949	err = dpaa2_eth_connect_mac(priv);4950	if (err)4951		goto err_connect_mac;4952 4953	err = dpaa2_eth_setup_irqs(dpni_dev);4954	if (err) {4955		netdev_warn(net_dev, "Failed to set link interrupt, fall back to polling\n");4956		priv->poll_thread = kthread_run(dpaa2_eth_poll_link_state, priv,4957						"%s_poll_link", net_dev->name);4958		if (IS_ERR(priv->poll_thread)) {4959			dev_err(dev, "Error starting polling thread\n");4960			goto err_poll_thread;4961		}4962		priv->do_link_poll = true;4963	}4964 4965	err = dpaa2_eth_dl_alloc(priv);4966	if (err)4967		goto err_dl_register;4968 4969	err = dpaa2_eth_dl_traps_register(priv);4970	if (err)4971		goto err_dl_trap_register;4972 4973	err = dpaa2_eth_dl_port_add(priv);4974	if (err)4975		goto err_dl_port_add;4976 4977	net_dev->needed_headroom = DPAA2_ETH_SWA_SIZE + DPAA2_ETH_TX_BUF_ALIGN;4978 4979	err = register_netdev(net_dev);4980	if (err < 0) {4981		dev_err(dev, "register_netdev() failed\n");4982		goto err_netdev_reg;4983	}4984 4985#ifdef CONFIG_DEBUG_FS4986	dpaa2_dbg_add(priv);4987#endif4988 4989	dpaa2_eth_dl_register(priv);4990	dev_info(dev, "Probed interface %s\n", net_dev->name);4991	return 0;4992 4993err_netdev_reg:4994	dpaa2_eth_dl_port_del(priv);4995err_dl_port_add:4996	dpaa2_eth_dl_traps_unregister(priv);4997err_dl_trap_register:4998	dpaa2_eth_dl_free(priv);4999err_dl_register:5000	if (priv->do_link_poll)5001		kthread_stop(priv->poll_thread);5002	else5003		fsl_mc_free_irqs(dpni_dev);5004err_poll_thread:5005	dpaa2_eth_disconnect_mac(priv);5006err_connect_mac:5007	dpaa2_eth_free_rings(priv);5008err_alloc_rings:5009err_csum:5010err_netdev_init:5011	free_percpu(priv->fd);5012err_alloc_fds:5013	free_percpu(priv->sgt_cache);5014err_alloc_sgt_cache:5015	free_percpu(priv->percpu_extras);5016err_alloc_percpu_extras:5017	free_percpu(priv->percpu_stats);5018err_alloc_percpu_stats:5019	dpaa2_eth_del_ch_napi(priv);5020err_bind:5021	dpaa2_eth_free_dpbps(priv);5022err_dpbp_setup:5023	dpaa2_eth_free_dpio(priv);5024err_dpio_setup:5025	dpaa2_eth_free_dpni(priv);5026err_dpni_setup:5027	fsl_mc_portal_free(priv->mc_io);5028err_portal_alloc:5029	destroy_workqueue(priv->dpaa2_ptp_wq);5030err_wq_alloc:5031	dev_set_drvdata(dev, NULL);5032	free_netdev(net_dev);5033 5034	return err;5035}5036 5037static void dpaa2_eth_remove(struct fsl_mc_device *ls_dev)5038{5039	struct device *dev;5040	struct net_device *net_dev;5041	struct dpaa2_eth_priv *priv;5042 5043	dev = &ls_dev->dev;5044	net_dev = dev_get_drvdata(dev);5045	priv = netdev_priv(net_dev);5046 5047	dpaa2_eth_dl_unregister(priv);5048 5049#ifdef CONFIG_DEBUG_FS5050	dpaa2_dbg_remove(priv);5051#endif5052 5053	unregister_netdev(net_dev);5054 5055	dpaa2_eth_dl_port_del(priv);5056	dpaa2_eth_dl_traps_unregister(priv);5057	dpaa2_eth_dl_free(priv);5058 5059	if (priv->do_link_poll)5060		kthread_stop(priv->poll_thread);5061	else5062		fsl_mc_free_irqs(ls_dev);5063 5064	dpaa2_eth_disconnect_mac(priv);5065	dpaa2_eth_free_rings(priv);5066	free_percpu(priv->fd);5067	free_percpu(priv->sgt_cache);5068	free_percpu(priv->percpu_stats);5069	free_percpu(priv->percpu_extras);5070 5071	dpaa2_eth_del_ch_napi(priv);5072	dpaa2_eth_free_dpbps(priv);5073	dpaa2_eth_free_dpio(priv);5074	dpaa2_eth_free_dpni(priv);5075	if (priv->onestep_reg_base)5076		iounmap(priv->onestep_reg_base);5077 5078	fsl_mc_portal_free(priv->mc_io);5079 5080	destroy_workqueue(priv->dpaa2_ptp_wq);5081 5082	dev_dbg(net_dev->dev.parent, "Removed interface %s\n", net_dev->name);5083 5084	free_netdev(net_dev);5085}5086 5087static const struct fsl_mc_device_id dpaa2_eth_match_id_table[] = {5088	{5089		.vendor = FSL_MC_VENDOR_FREESCALE,5090		.obj_type = "dpni",5091	},5092	{ .vendor = 0x0 }5093};5094MODULE_DEVICE_TABLE(fslmc, dpaa2_eth_match_id_table);5095 5096static struct fsl_mc_driver dpaa2_eth_driver = {5097	.driver = {5098		.name = KBUILD_MODNAME,5099	},5100	.probe = dpaa2_eth_probe,5101	.remove = dpaa2_eth_remove,5102	.match_id_table = dpaa2_eth_match_id_table5103};5104 5105static int __init dpaa2_eth_driver_init(void)5106{5107	int err;5108 5109	dpaa2_eth_dbg_init();5110	err = fsl_mc_driver_register(&dpaa2_eth_driver);5111	if (err) {5112		dpaa2_eth_dbg_exit();5113		return err;5114	}5115 5116	return 0;5117}5118 5119static void __exit dpaa2_eth_driver_exit(void)5120{5121	dpaa2_eth_dbg_exit();5122	fsl_mc_driver_unregister(&dpaa2_eth_driver);5123}5124 5125module_init(dpaa2_eth_driver_init);5126module_exit(dpaa2_eth_driver_exit);5127