From: Simon Horman <horms@kernel.org>
To: Lukasz Majewski <lukma@denx.de>
Cc: Andrew Lunn <andrew+netdev@lunn.ch>,
davem@davemloft.net, Eric Dumazet <edumazet@google.com>,
Jakub Kicinski <kuba@kernel.org>, Paolo Abeni <pabeni@redhat.com>,
Rob Herring <robh@kernel.org>,
Krzysztof Kozlowski <krzk+dt@kernel.org>,
Conor Dooley <conor+dt@kernel.org>,
Shawn Guo <shawnguo@kernel.org>,
Sascha Hauer <s.hauer@pengutronix.de>,
Pengutronix Kernel Team <kernel@pengutronix.de>,
Fabio Estevam <festevam@gmail.com>,
Richard Cochran <richardcochran@gmail.com>,
netdev@vger.kernel.org, devicetree@vger.kernel.org,
linux-kernel@vger.kernel.org, imx@lists.linux.dev,
linux-arm-kernel@lists.infradead.org,
Stefan Wahren <wahrenst@gmx.net>
Subject: Re: [net-next v16 06/12] net: mtip: Add net_device_ops functions to the L2 switch driver
Date: Fri, 25 Jul 2025 16:54:40 +0100 [thread overview]
Message-ID: <20250725155440.GF1367887@horms.kernel.org> (raw)
In-Reply-To: <20250724223318.3068984-7-lukma@denx.de>
On Fri, Jul 25, 2025 at 12:33:12AM +0200, Lukasz Majewski wrote:
> This patch provides callbacks for struct net_device_ops for MTIP
> L2 switch.
>
> Signed-off-by: Lukasz Majewski <lukma@denx.de>
...
> +static netdev_tx_t mtip_start_xmit_port(struct sk_buff *skb,
> + struct net_device *dev, int port)
> +{
> + struct mtip_ndev_priv *priv = netdev_priv(dev);
> + struct switch_enet_private *fep = priv->fep;
> + unsigned short status;
> + struct cbd_t *bdp;
> + void *bufaddr;
> +
> + spin_lock_bh(&fep->hw_lock);
> +
> + if (!fep->link[0] && !fep->link[1]) {
> + /* Link is down or autonegotiation is in progress. */
> + netif_stop_queue(dev);
> + spin_unlock_bh(&fep->hw_lock);
> + return NETDEV_TX_BUSY;
> + }
> +
> + /* Fill in a Tx ring entry */
> + bdp = fep->cur_tx;
> + status = bdp->cbd_sc;
> +
> + if (status & BD_ENET_TX_READY) {
> + /* All transmit buffers are full. Bail out.
> + * This should not happen, since dev->tbusy should be set.
> + */
> + netif_stop_queue(dev);
> + dev_err_ratelimited(&fep->pdev->dev, "%s: tx queue full!.\n",
> + dev->name);
> + spin_unlock(&fep->hw_lock);
Sorry be the one to point out this needle in a haystack,
but this should be spin_unlock_bh()
Flagged by Smatch.
> + return NETDEV_TX_BUSY;
> + }
> +
> + /* Clear all of the status flags */
> + status &= ~BD_ENET_TX_STATS;
> +
> + /* Set buffer length and buffer pointer */
> + bufaddr = skb->data;
> + bdp->cbd_datlen = skb->len;
> +
> + /* On some FEC implementations data must be aligned on
> + * 4-byte boundaries. Use bounce buffers to copy data
> + * and get it aligned.spin
> + */
> + if ((unsigned long)bufaddr & MTIP_ALIGNMENT) {
> + unsigned int index;
> +
> + index = bdp - fep->tx_bd_base;
> + memcpy(fep->tx_bounce[index], skb->data, skb->len);
> + bufaddr = fep->tx_bounce[index];
> + }
> +
> + if (fep->quirks & FEC_QUIRK_SWAP_FRAME)
> + swap_buffer(bufaddr, skb->len);
> +
> + /* Push the data cache so the CPM does not get stale memory
> + * data.
> + */
> + bdp->cbd_bufaddr = dma_map_single(&fep->pdev->dev, bufaddr,
> + MTIP_SWITCH_TX_FRSIZE,
> + DMA_TO_DEVICE);
> + if (unlikely(dma_mapping_error(&fep->pdev->dev, bdp->cbd_bufaddr))) {
> + dev_err(&fep->pdev->dev,
> + "Failed to map descriptor tx buffer\n");
> + dev->stats.tx_dropped++;
> + dev_kfree_skb_any(skb);
> + goto err;
> + }
> +
> + /* Save skb pointer. */
> + fep->tx_skbuff[fep->skb_cur] = skb;
> + fep->skb_cur = (fep->skb_cur + 1) & TX_RING_MOD_MASK;
> +
> + /* Send it on its way. Tell FEC it's ready, interrupt when done,
> + * it's the last BD of the frame, and to put the CRC on the end.
> + */
> +
> + status |= (BD_ENET_TX_READY | BD_ENET_TX_INTR | BD_ENET_TX_LAST |
> + BD_ENET_TX_TC);
> +
> + /* Synchronize all descriptor writes */
> + wmb();
> + bdp->cbd_sc = status;
> +
> + skb_tx_timestamp(skb);
> +
> + /* Trigger transmission start */
> + writel(MCF_ESW_TDAR_X_DES_ACTIVE, fep->hwp + ESW_TDAR);
> +
> + dev->stats.tx_bytes += skb->len;
> + /* If this was the last BD in the ring,
> + * start at the beginning again.
> + */
> + if (status & BD_ENET_TX_WRAP)
> + bdp = fep->tx_bd_base;
> + else
> + bdp++;
> +
> + if (bdp == fep->dirty_tx) {
> + fep->tx_full = 1;
> + netif_stop_queue(dev);
> + }
> +
> + fep->cur_tx = bdp;
> + err:
> + spin_unlock_bh(&fep->hw_lock);
> +
> + return NETDEV_TX_OK;
> +}
...
next prev parent reply other threads:[~2025-07-25 15:54 UTC|newest]
Thread overview: 21+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-07-24 22:33 [net-next v16 00/12] net: mtip: Add support for MTIP imx287 L2 switch driver Lukasz Majewski
2025-07-24 22:33 ` [net-next v16 01/12] dt-bindings: net: Add MTIP L2 switch description Lukasz Majewski
2025-07-24 22:33 ` [net-next v16 02/12] ARM: dts: nxp: mxs: Adjust the imx28.dtsi " Lukasz Majewski
2025-07-24 22:33 ` [net-next v16 03/12] ARM: dts: nxp: mxs: Adjust XEA board's DTS to support L2 switch Lukasz Majewski
2025-07-24 22:33 ` [net-next v16 04/12] net: mtip: The L2 switch driver for imx287 Lukasz Majewski
2025-07-25 22:18 ` Jakub Kicinski
2025-07-26 20:13 ` Lukasz Majewski
2025-07-26 20:38 ` Jakub Kicinski
2025-07-27 8:05 ` Lukasz Majewski
2025-07-24 22:33 ` [net-next v16 05/12] net: mtip: Add buffers management functions to the L2 switch driver Lukasz Majewski
2025-07-24 22:33 ` [net-next v16 06/12] net: mtip: Add net_device_ops " Lukasz Majewski
2025-07-25 15:54 ` Simon Horman [this message]
2025-07-25 17:27 ` Lukasz Majewski
2025-07-25 22:16 ` Jakub Kicinski
2025-07-26 21:09 ` Lukasz Majewski
2025-07-24 22:33 ` [net-next v16 07/12] net: mtip: Add mtip_switch_{rx|tx} " Lukasz Majewski
2025-07-24 22:33 ` [net-next v16 08/12] net: mtip: Extend the L2 switch driver with management operations Lukasz Majewski
2025-07-24 22:33 ` [net-next v16 09/12] net: mtip: Extend the L2 switch driver for imx287 with bridge operations Lukasz Majewski
2025-07-24 22:33 ` [net-next v16 10/12] ARM: mxs_defconfig: Enable CONFIG_NFS_FSCACHE Lukasz Majewski
2025-07-24 22:33 ` [net-next v16 11/12] ARM: mxs_defconfig: Update mxs_defconfig to 6.16-rc5 Lukasz Majewski
2025-07-24 22:33 ` [net-next v16 12/12] ARM: mxs_defconfig: Enable CONFIG_FEC_MTIP_L2SW to support MTIP L2 switch Lukasz Majewski
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=20250725155440.GF1367887@horms.kernel.org \
--to=horms@kernel.org \
--cc=andrew+netdev@lunn.ch \
--cc=conor+dt@kernel.org \
--cc=davem@davemloft.net \
--cc=devicetree@vger.kernel.org \
--cc=edumazet@google.com \
--cc=festevam@gmail.com \
--cc=imx@lists.linux.dev \
--cc=kernel@pengutronix.de \
--cc=krzk+dt@kernel.org \
--cc=kuba@kernel.org \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-kernel@vger.kernel.org \
--cc=lukma@denx.de \
--cc=netdev@vger.kernel.org \
--cc=pabeni@redhat.com \
--cc=richardcochran@gmail.com \
--cc=robh@kernel.org \
--cc=s.hauer@pengutronix.de \
--cc=shawnguo@kernel.org \
--cc=wahrenst@gmx.net \
/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.