netdev.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Robert Hancock <hancock@sedsystems.ca>
To: netdev@vger.kernel.org
Cc: anirudh@xilinx.com, John.Linn@xilinx.com, andrew@lunn.ch,
	Robert Hancock <hancock@sedsystems.ca>
Subject: [PATCH net-next v4 12/20] net: axienet: Add optional support for Ethernet core interrupt
Date: Wed,  5 Jun 2019 14:42:25 -0600	[thread overview]
Message-ID: <1559767353-17301-13-git-send-email-hancock@sedsystems.ca> (raw)
In-Reply-To: <1559767353-17301-1-git-send-email-hancock@sedsystems.ca>

Previously this driver only handled interrupts from the DMA RX and TX
blocks, not from the Ethernet core itself. Add optional support for
the Ethernet core interrupt, which is used to detect rx_missed and
framing errors signalled by the hardware. In order to use this
interrupt, a third interrupt needs to be specified in the device tree.

Signed-off-by: Robert Hancock <hancock@sedsystems.ca>
---
 .../devicetree/bindings/net/xilinx_axienet.txt     |  3 +-
 drivers/net/ethernet/xilinx/xilinx_axienet.h       |  1 +
 drivers/net/ethernet/xilinx/xilinx_axienet_main.c  | 49 ++++++++++++++++++++++
 3 files changed, 52 insertions(+), 1 deletion(-)

diff --git a/Documentation/devicetree/bindings/net/xilinx_axienet.txt b/Documentation/devicetree/bindings/net/xilinx_axienet.txt
index 2dea903..0be335c 100644
--- a/Documentation/devicetree/bindings/net/xilinx_axienet.txt
+++ b/Documentation/devicetree/bindings/net/xilinx_axienet.txt
@@ -18,7 +18,8 @@ Required properties:
 - compatible	: Must be one of "xlnx,axi-ethernet-1.00.a",
 		  "xlnx,axi-ethernet-1.01.a", "xlnx,axi-ethernet-2.01.a"
 - reg		: Address and length of the IO space.
-- interrupts	: Should be a list of two interrupt, TX and RX.
+- interrupts	: Should be a list of 2 or 3 interrupts: TX DMA, RX DMA,
+		  and optionally Ethernet core.
 - phy-handle	: Should point to the external phy device.
 		  See ethernet.txt file in the same directory.
 - xlnx,rxmem	: Set to allocated memory buffer for Rx/Tx in the hardware
diff --git a/drivers/net/ethernet/xilinx/xilinx_axienet.h b/drivers/net/ethernet/xilinx/xilinx_axienet.h
index 6b6d28f..8e605a8 100644
--- a/drivers/net/ethernet/xilinx/xilinx_axienet.h
+++ b/drivers/net/ethernet/xilinx/xilinx_axienet.h
@@ -435,6 +435,7 @@ struct axienet_local {
 
 	int tx_irq;
 	int rx_irq;
+	int eth_irq;
 	phy_interface_t phy_mode;
 
 	u32 options;			/* Current options word */
diff --git a/drivers/net/ethernet/xilinx/xilinx_axienet_main.c b/drivers/net/ethernet/xilinx/xilinx_axienet_main.c
index f733a7a..0758ce3 100644
--- a/drivers/net/ethernet/xilinx/xilinx_axienet_main.c
+++ b/drivers/net/ethernet/xilinx/xilinx_axienet_main.c
@@ -502,6 +502,8 @@ static void axienet_device_reset(struct net_device *ndev)
 	axienet_status = axienet_ior(lp, XAE_IP_OFFSET);
 	if (axienet_status & XAE_INT_RXRJECT_MASK)
 		axienet_iow(lp, XAE_IS_OFFSET, XAE_INT_RXRJECT_MASK);
+	axienet_iow(lp, XAE_IE_OFFSET, lp->eth_irq > 0 ?
+		    XAE_INT_RECV_ERROR_MASK : 0);
 
 	axienet_iow(lp, XAE_FCC_OFFSET, XAE_FCC_FCRX_MASK);
 
@@ -902,6 +904,35 @@ static irqreturn_t axienet_rx_irq(int irq, void *_ndev)
 	return IRQ_HANDLED;
 }
 
+/**
+ * axienet_eth_irq - Ethernet core Isr.
+ * @irq:	irq number
+ * @_ndev:	net_device pointer
+ *
+ * Return: IRQ_HANDLED if device generated a core interrupt, IRQ_NONE otherwise.
+ *
+ * Handle miscellaneous conditions indicated by Ethernet core IRQ.
+ */
+static irqreturn_t axienet_eth_irq(int irq, void *_ndev)
+{
+	unsigned int pending;
+	struct net_device *ndev = _ndev;
+	struct axienet_local *lp = netdev_priv(ndev);
+
+	pending = axienet_ior(lp, XAE_IP_OFFSET);
+	if (!pending)
+		return IRQ_NONE;
+
+	if (pending & XAE_INT_RXFIFOOVR_MASK)
+		ndev->stats.rx_missed_errors++;
+
+	if (pending & XAE_INT_RXRJECT_MASK)
+		ndev->stats.rx_frame_errors++;
+
+	axienet_iow(lp, XAE_IS_OFFSET, pending);
+	return IRQ_HANDLED;
+}
+
 static void axienet_dma_err_handler(unsigned long data);
 
 /**
@@ -962,9 +993,18 @@ static int axienet_open(struct net_device *ndev)
 			  ndev->name, ndev);
 	if (ret)
 		goto err_rx_irq;
+	/* Enable interrupts for Axi Ethernet core (if defined) */
+	if (lp->eth_irq > 0) {
+		ret = request_irq(lp->eth_irq, axienet_eth_irq, IRQF_SHARED,
+				  ndev->name, ndev);
+		if (ret)
+			goto err_eth_irq;
+	}
 
 	return 0;
 
+err_eth_irq:
+	free_irq(lp->rx_irq, ndev);
 err_rx_irq:
 	free_irq(lp->tx_irq, ndev);
 err_tx_irq:
@@ -1028,6 +1068,8 @@ static int axienet_stop(struct net_device *ndev)
 
 	tasklet_kill(&lp->dma_err_tasklet);
 
+	if (lp->eth_irq > 0)
+		free_irq(lp->eth_irq, ndev);
 	free_irq(lp->tx_irq, ndev);
 	free_irq(lp->rx_irq, ndev);
 
@@ -1491,6 +1533,8 @@ static void axienet_dma_err_handler(unsigned long data)
 	axienet_status = axienet_ior(lp, XAE_IP_OFFSET);
 	if (axienet_status & XAE_INT_RXRJECT_MASK)
 		axienet_iow(lp, XAE_IS_OFFSET, XAE_INT_RXRJECT_MASK);
+	axienet_iow(lp, XAE_IE_OFFSET, lp->eth_irq > 0 ?
+		    XAE_INT_RECV_ERROR_MASK : 0);
 	axienet_iow(lp, XAE_FCC_OFFSET, XAE_FCC_FCRX_MASK);
 
 	/* Sync default options with HW but leave receiver and
@@ -1660,6 +1704,7 @@ static int axienet_probe(struct platform_device *pdev)
 	}
 	lp->rx_irq = irq_of_parse_and_map(np, 1);
 	lp->tx_irq = irq_of_parse_and_map(np, 0);
+	lp->eth_irq = irq_of_parse_and_map(np, 2);
 	of_node_put(np);
 	if ((lp->rx_irq <= 0) || (lp->tx_irq <= 0)) {
 		dev_err(&pdev->dev, "could not determine irqs\n");
@@ -1667,6 +1712,10 @@ static int axienet_probe(struct platform_device *pdev)
 		goto free_netdev;
 	}
 
+	/* Check for Ethernet core IRQ (optional) */
+	if (lp->eth_irq <= 0)
+		dev_info(&pdev->dev, "Ethernet core IRQ not defined\n");
+
 	/* Retrieve the MAC address */
 	mac_addr = of_get_mac_address(pdev->dev.of_node);
 	if (IS_ERR(mac_addr)) {
-- 
1.8.3.1


  parent reply	other threads:[~2019-06-05 20:43 UTC|newest]

Thread overview: 28+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-06-05 20:42 [PATCH net-next v4 00/20] Xilinx axienet driver updates (v4) Robert Hancock
2019-06-05 20:42 ` [PATCH net-next v4 01/20] net: axienet: Fix casting of pointers to u32 Robert Hancock
2019-06-05 20:42 ` [PATCH net-next v4 02/20] net: axienet: Use standard IO accessors Robert Hancock
2019-06-06 14:12   ` Andrew Lunn
2019-06-05 20:42 ` [PATCH net-next v4 03/20] net: axienet: fix MDIO bus naming Robert Hancock
2019-06-06 14:12   ` Andrew Lunn
2019-06-05 20:42 ` [PATCH net-next v4 04/20] net: axienet: add X86 and ARM as supported platforms Robert Hancock
2019-06-05 20:42 ` [PATCH net-next v4 05/20] net: axienet: Use clock framework to get device clock rate Robert Hancock
2019-06-05 20:42 ` [PATCH net-next v4 06/20] net: axienet: fix teardown order of MDIO bus Robert Hancock
2019-06-05 20:42 ` [PATCH net-next v4 07/20] net: axienet: Re-initialize MDIO registers properly after reset Robert Hancock
2019-06-06 21:05   ` David Miller
2019-06-05 20:42 ` [PATCH net-next v4 08/20] net: axienet: Cleanup DMA device reset and halt process Robert Hancock
2019-06-05 20:42 ` [PATCH net-next v4 09/20] net: axienet: Make RX/TX ring sizes configurable Robert Hancock
2019-06-05 20:42 ` [PATCH net-next v4 10/20] net: axienet: Add DMA registers to ethtool register dump Robert Hancock
2019-06-05 20:42 ` [PATCH net-next v4 11/20] net: axienet: Support shared interrupts Robert Hancock
2019-06-05 20:42 ` Robert Hancock [this message]
2019-06-06 21:06   ` [PATCH net-next v4 12/20] net: axienet: Add optional support for Ethernet core interrupt David Miller
2019-06-05 20:42 ` [PATCH net-next v4 13/20] net: axienet: Fix race condition causing TX hang Robert Hancock
2019-06-05 20:42 ` [PATCH net-next v4 14/20] net: axienet: Make missing MAC address non-fatal Robert Hancock
2019-06-05 20:42 ` [PATCH net-next v4 15/20] net: axienet: stop interface during shutdown Robert Hancock
2019-06-05 20:42 ` [PATCH net-next v4 16/20] net: axienet: document device tree mdio child node Robert Hancock
2019-06-06 14:16   ` Andrew Lunn
2019-06-05 20:42 ` [PATCH net-next v4 17/20] net: axienet: Fix MDIO bus parent node detection Robert Hancock
2019-06-05 20:42 ` [PATCH net-next v4 18/20] net: axienet: document axistream-connected attribute Robert Hancock
2019-06-05 20:42 ` [PATCH net-next v4 19/20] net: axienet: make use of axistream-connected attribute optional Robert Hancock
2019-06-05 20:42 ` [PATCH net-next v4 20/20] net: axienet: convert to phylink API Robert Hancock
2019-06-06 21:07   ` David Miller
2019-06-06 21:03 ` [PATCH net-next v4 00/20] Xilinx axienet driver updates (v4) David Miller

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=1559767353-17301-13-git-send-email-hancock@sedsystems.ca \
    --to=hancock@sedsystems.ca \
    --cc=John.Linn@xilinx.com \
    --cc=andrew@lunn.ch \
    --cc=anirudh@xilinx.com \
    --cc=netdev@vger.kernel.org \
    /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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).