All of lore.kernel.org
 help / color / mirror / Atom feed
From: Jakub Kicinski <kuba@kernel.org>
To: MD Danish Anwar <danishanwar@ti.com>
Cc: Randy Dunlap <rdunlap@infradead.org>,
	Roger Quadros <rogerq@kernel.org>,
	Simon Horman <simon.horman@corigine.com>,
	Vignesh Raghavendra <vigneshr@ti.com>,
	Andrew Lunn <andrew@lunn.ch>,
	Richard Cochran <richardcochran@gmail.com>,
	Conor Dooley <conor+dt@kernel.org>,
	Krzysztof Kozlowski <krzysztof.kozlowski+dt@linaro.org>,
	Rob Herring <robh+dt@kernel.org>, Paolo Abeni <pabeni@redhat.com>,
	Eric Dumazet <edumazet@google.com>,
	"David S. Miller" <davem@davemloft.net>, <nm@ti.com>,
	<srk@ti.com>, <linux-kernel@vger.kernel.org>,
	<devicetree@vger.kernel.org>, <netdev@vger.kernel.org>,
	<linux-omap@vger.kernel.org>,
	<linux-arm-kernel@lists.infradead.org>
Subject: Re: [PATCH v11 06/10] net: ti: icssg-prueth: Add ICSSG ethernet driver
Date: Tue, 25 Jul 2023 21:09:39 -0700	[thread overview]
Message-ID: <20230725210939.56d77726@kernel.org> (raw)
In-Reply-To: <20230724112934.2637802-7-danishanwar@ti.com>

On Mon, 24 Jul 2023 16:59:30 +0530 MD Danish Anwar wrote:
>  drivers/net/ethernet/ti/Kconfig        |   13 +
>  drivers/net/ethernet/ti/Makefile       |    3 +
>  drivers/net/ethernet/ti/icssg_prueth.c | 1831 ++++++++++++++++++++++++
>  drivers/net/ethernet/ti/icssg_prueth.h |   48 +

Please create a sub-directory for the driver.

> +static int prueth_ndev_add_tx_napi(struct prueth_emac *emac)
> +{
> +	struct prueth *prueth = emac->prueth;
> +	int i, ret;
> +
> +	for (i = 0; i < emac->tx_ch_num; i++) {
> +		struct prueth_tx_chn *tx_chn = &emac->tx_chns[i];
> +
> +		netif_napi_add_tx_weight(emac->ndev, &tx_chn->napi_tx,
> +					 emac_napi_tx_poll, NAPI_POLL_WEIGHT);

Skip specifying weight, please.

> +/**
> + * emac_ndo_start_xmit - EMAC Transmit function
> + * @skb: SKB pointer
> + * @ndev: EMAC network adapter
> + *
> + * Called by the system to transmit a packet  - we queue the packet in
> + * EMAC hardware transmit queue
> + * Doesn't wait for completion we'll check for TX completion in
> + * emac_tx_complete_packets().
> + *
> + * Return: enum netdev_tx
> + */
> +static enum netdev_tx emac_ndo_start_xmit(struct sk_buff *skb, struct net_device *ndev)
> +{
> +	struct cppi5_host_desc_t *first_desc, *next_desc, *cur_desc;
> +	struct prueth_emac *emac = netdev_priv(ndev);
> +	struct netdev_queue *netif_txq;
> +	struct prueth_tx_chn *tx_chn;
> +	dma_addr_t desc_dma, buf_dma;
> +	int i, ret = 0, q_idx;
> +	void **swdata;
> +	u32 pkt_len;
> +	u32 *epib;
> +
> +	pkt_len = skb_headlen(skb);
> +	q_idx = skb_get_queue_mapping(skb);
> +
> +	tx_chn = &emac->tx_chns[q_idx];
> +	netif_txq = netdev_get_tx_queue(ndev, q_idx);
> +
> +	/* Map the linear buffer */
> +	buf_dma = dma_map_single(tx_chn->dma_dev, skb->data, pkt_len, DMA_TO_DEVICE);
> +	if (dma_mapping_error(tx_chn->dma_dev, buf_dma)) {
> +		netdev_err(ndev, "tx: failed to map skb buffer\n");
> +		ret = NETDEV_TX_BUSY;

Drop it if it can't be mapped and return OK. What's going to re-enable
the queue in this case?

> +		goto drop_stop_q;
> +	}
> +
> +	first_desc = k3_cppi_desc_pool_alloc(tx_chn->desc_pool);
> +	if (!first_desc) {
> +		netdev_dbg(ndev, "tx: failed to allocate descriptor\n");
> +		dma_unmap_single(tx_chn->dma_dev, buf_dma, pkt_len, DMA_TO_DEVICE);
> +		ret = NETDEV_TX_BUSY;
> +		goto drop_stop_q_busy;
> +	}
> +
> +	cppi5_hdesc_init(first_desc, CPPI5_INFO0_HDESC_EPIB_PRESENT,
> +			 PRUETH_NAV_PS_DATA_SIZE);
> +	cppi5_hdesc_set_pkttype(first_desc, 0);
> +	epib = first_desc->epib;
> +	epib[0] = 0;
> +	epib[1] = 0;
> +
> +	/* set dst tag to indicate internal qid at the firmware which is at
> +	 * bit8..bit15. bit0..bit7 indicates port num for directed
> +	 * packets in case of switch mode operation
> +	 */
> +	cppi5_desc_set_tags_ids(&first_desc->hdr, 0, (emac->port_id | (q_idx << 8)));
> +	k3_udma_glue_tx_dma_to_cppi5_addr(tx_chn->tx_chn, &buf_dma);
> +	cppi5_hdesc_attach_buf(first_desc, buf_dma, pkt_len, buf_dma, pkt_len);
> +	swdata = cppi5_hdesc_get_swdata(first_desc);
> +	*swdata = skb;
> +
> +	if (!skb_is_nonlinear(skb))
> +		goto tx_push;

Why the goto? The loop won't be entered.

> +	/* Handle the case where skb is fragmented in pages */
> +	cur_desc = first_desc;
> +	for (i = 0; i < skb_shinfo(skb)->nr_frags; i++) {
> +		skb_frag_t *frag = &skb_shinfo(skb)->frags[i];
> +		u32 frag_size = skb_frag_size(frag);
> +
> +		next_desc = k3_cppi_desc_pool_alloc(tx_chn->desc_pool);
> +		if (!next_desc) {
> +			netdev_err(ndev,
> +				   "tx: failed to allocate frag. descriptor\n");
> +			ret = NETDEV_TX_BUSY;
> +			goto drop_free_descs;
> +		}
> +
> +		buf_dma = skb_frag_dma_map(tx_chn->dma_dev, frag, 0, frag_size,
> +					   DMA_TO_DEVICE);
> +		if (dma_mapping_error(tx_chn->dma_dev, buf_dma)) {
> +			netdev_err(ndev, "tx: Failed to map skb page\n");
> +			k3_cppi_desc_pool_free(tx_chn->desc_pool, next_desc);
> +			ret = NETDEV_TX_BUSY;
> +			goto drop_free_descs;

this label frees the skb, you can't return BUSY

> +		}
> +
> +		cppi5_hdesc_reset_hbdesc(next_desc);
> +		k3_udma_glue_tx_dma_to_cppi5_addr(tx_chn->tx_chn, &buf_dma);
> +		cppi5_hdesc_attach_buf(next_desc,
> +				       buf_dma, frag_size, buf_dma, frag_size);
> +
> +		desc_dma = k3_cppi_desc_pool_virt2dma(tx_chn->desc_pool,
> +						      next_desc);
> +		k3_udma_glue_tx_dma_to_cppi5_addr(tx_chn->tx_chn, &desc_dma);
> +		cppi5_hdesc_link_hbdesc(cur_desc, desc_dma);
> +
> +		pkt_len += frag_size;
> +		cur_desc = next_desc;
> +	}
> +	WARN_ON(pkt_len != skb->len);

WARN_ON_ONCE() if at all

> +
> +tx_push:
> +	/* report bql before sending packet */
> +	netdev_tx_sent_queue(netif_txq, pkt_len);
> +
> +	cppi5_hdesc_set_pktlen(first_desc, pkt_len);
> +	desc_dma = k3_cppi_desc_pool_virt2dma(tx_chn->desc_pool, first_desc);
> +	/* cppi5_desc_dump(first_desc, 64); */
> +
> +	skb_tx_timestamp(skb);  /* SW timestamp if SKBTX_IN_PROGRESS not set */
> +	ret = k3_udma_glue_push_tx_chn(tx_chn->tx_chn, first_desc, desc_dma);
> +	if (ret) {
> +		netdev_err(ndev, "tx: push failed: %d\n", ret);
> +		goto drop_free_descs;
> +	}
> +
> +	if (k3_cppi_desc_pool_avail(tx_chn->desc_pool) < MAX_SKB_FRAGS) {
> +		netif_tx_stop_queue(netif_txq);
> +		/* Barrier, so that stop_queue visible to other cpus */
> +		smp_mb__after_atomic();
> +
> +		if (k3_cppi_desc_pool_avail(tx_chn->desc_pool) >=
> +		    MAX_SKB_FRAGS)

MAX_FRAGS + 1?

> +			netif_tx_wake_queue(netif_txq);
> +	}
> +
> +	return NETDEV_TX_OK;


> +static int emac_napi_rx_poll(struct napi_struct *napi_rx, int budget)
> +{
> +	struct prueth_emac *emac = prueth_napi_to_emac(napi_rx);
> +	int rx_flow = PRUETH_RX_FLOW_DATA;
> +	int flow = PRUETH_MAX_RX_FLOWS;
> +	int num_rx = 0;
> +	int cur_budget;
> +	int ret;
> +
> +	while (flow--) {
> +		cur_budget = budget - num_rx;
> +
> +		while (cur_budget--) {
> +			ret = emac_rx_packet(emac, flow);
> +			if (ret)
> +				break;
> +			num_rx++;
> +		}
> +
> +		if (num_rx >= budget)
> +			break;
> +	}
> +
> +	if (num_rx < budget) {
> +		napi_complete(napi_rx);

Prefer using napi_complete_done()

> +		enable_irq(emac->rx_chns.irq[rx_flow]);
> +	}
> +
> +	return num_rx;
> +}

> +static void emac_ndo_tx_timeout(struct net_device *ndev, unsigned int txqueue)
> +{
> +	struct prueth_emac *emac = netdev_priv(ndev);
> +
> +	if (netif_msg_tx_err(emac))
> +		netdev_err(ndev, "xmit timeout");

Core already prints something, you can drop this.

> +	ndev->stats.tx_errors++;
> +}

> +static void emac_ndo_set_rx_mode_work(struct work_struct *work)
> +{
> +	struct prueth_emac *emac = container_of(work, struct prueth_emac, rx_mode_work);
> +	struct net_device *ndev = emac->ndev;
> +	bool promisc, allmulti;
> +
> +	if (!netif_running(ndev))
> +		return;
> +
> +	promisc = ndev->flags & IFF_PROMISC;
> +	allmulti = ndev->flags & IFF_ALLMULTI;
> +	emac_set_port_state(emac, ICSSG_EMAC_PORT_UC_FLOODING_DISABLE);
> +	emac_set_port_state(emac, ICSSG_EMAC_PORT_MC_FLOODING_DISABLE);
> +
> +	if (promisc) {
> +		emac_set_port_state(emac, ICSSG_EMAC_PORT_UC_FLOODING_ENABLE);
> +		emac_set_port_state(emac, ICSSG_EMAC_PORT_MC_FLOODING_ENABLE);
> +		return;
> +	}
> +
> +	if (allmulti) {
> +		emac_set_port_state(emac, ICSSG_EMAC_PORT_MC_FLOODING_ENABLE);
> +		return;
> +	}
> +
> +	if (!netdev_mc_empty(ndev)) {
> +		emac_set_port_state(emac, ICSSG_EMAC_PORT_MC_FLOODING_ENABLE);
> +		return;
> +	}
> +}

There's no need for locking in this work?

> +	netif_napi_add(ndev, &emac->napi_rx,
> +		       emac_napi_rx_poll);

nit: fits on a line

> +static struct platform_driver prueth_driver = {
> +	.probe = prueth_probe,
> +	.remove = prueth_remove,

Please use .remove_new (which has a void return).
-- 
pw-bot: cr

  reply	other threads:[~2023-07-26  4:17 UTC|newest]

Thread overview: 29+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-07-24 11:29 [PATCH v11 00/10] Introduce ICSSG based ethernet Driver MD Danish Anwar
2023-07-24 11:29 ` [PATCH v11 01/10] net: ti: icssg-prueth: Add Firmware Interface for ICSSG Ethernet driver MD Danish Anwar
2023-07-24 11:29 ` [PATCH v11 02/10] net: ti: icssg-prueth: Add mii helper apis and macros MD Danish Anwar
2023-07-24 11:29 ` [PATCH v11 03/10] net: ti: icssg-prueth: Add Firmware config and classification APIs MD Danish Anwar
2023-07-25  7:25   ` Simon Horman
2023-07-25  7:40     ` [EXTERNAL] " Md Danish Anwar
2023-07-25  7:44       ` Simon Horman
2023-07-25  7:58         ` [EXTERNAL] " Md Danish Anwar
2023-07-26  7:42           ` Simon Horman
2023-07-26 15:40             ` Jakub Kicinski
2023-07-27  8:54             ` [EXTERNAL] " Anwar, Md Danish
2023-07-27  8:54               ` Anwar, Md Danish
2023-07-24 11:29 ` [PATCH v11 04/10] net: ti: icssg-prueth: Add icssg queues APIs and macros MD Danish Anwar
2023-07-24 11:29 ` [PATCH v11 05/10] dt-bindings: net: Add ICSSG Ethernet MD Danish Anwar
2023-07-24 11:29 ` [PATCH v11 06/10] net: ti: icssg-prueth: Add ICSSG ethernet driver MD Danish Anwar
2023-07-26  4:09   ` Jakub Kicinski [this message]
2023-07-26 10:31     ` [EXTERNAL] " Md Danish Anwar
2023-07-26 15:37       ` Jakub Kicinski
2023-07-27  9:12         ` [EXTERNAL] " Anwar, Md Danish
2023-07-27  9:12           ` Anwar, Md Danish
2023-07-24 11:29 ` [PATCH v11 07/10] net: ti: icssg-prueth: Add ICSSG Stats MD Danish Anwar
2023-07-26  3:50   ` Jakub Kicinski
2023-07-26 10:36     ` [EXTERNAL] " Md Danish Anwar
2023-07-26 15:39       ` Jakub Kicinski
2023-07-27  4:51         ` [EXTERNAL] " Anwar, Md Danish
2023-07-27  4:51           ` Anwar, Md Danish
2023-07-24 11:29 ` [PATCH v11 08/10] net: ti: icssg-prueth: Add Standard network staticstics MD Danish Anwar
2023-07-24 11:29 ` [PATCH v11 09/10] net: ti: icssg-prueth: Add ethtool ops for ICSSG Ethernet driver MD Danish Anwar
2023-07-24 11:29 ` [PATCH v11 10/10] net: ti: icssg-prueth: Add Power management support MD Danish Anwar

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20230725210939.56d77726@kernel.org \
    --to=kuba@kernel.org \
    --cc=andrew@lunn.ch \
    --cc=conor+dt@kernel.org \
    --cc=danishanwar@ti.com \
    --cc=davem@davemloft.net \
    --cc=devicetree@vger.kernel.org \
    --cc=edumazet@google.com \
    --cc=krzysztof.kozlowski+dt@linaro.org \
    --cc=linux-arm-kernel@lists.infradead.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-omap@vger.kernel.org \
    --cc=netdev@vger.kernel.org \
    --cc=nm@ti.com \
    --cc=pabeni@redhat.com \
    --cc=rdunlap@infradead.org \
    --cc=richardcochran@gmail.com \
    --cc=robh+dt@kernel.org \
    --cc=rogerq@kernel.org \
    --cc=simon.horman@corigine.com \
    --cc=srk@ti.com \
    --cc=vigneshr@ti.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.