* @tx_irq: Axidma TX IRQ number
* @rx_irq: Axidma RX IRQ number
* @phy_mode: Phy type to identify between MII/GMII/RGMII/SGMII/1000 Base-X
+ * @eth_irq: Axi Ethernet IRQ number
* @options: AxiEthernet option word
* @last_link: Phy link state in which the PHY was negotiated earlier
* @features: Stores the extended features supported by the axienet hw
int tx_irq;
int rx_irq;
phy_interface_t phy_mode;
+ int eth_irq;
u32 options; /* Current options word */
u32 last_link;
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);
+
+ /* Enable Receive errors */
+ axienet_iow(lp, XAE_IE_OFFSET, XAE_INT_RECV_ERROR_MASK);
}
if (lp->axienet_config->mactype == XAXIENET_10G_25G) {
return work_done;
}
+/**
+ * axienet_err_irq - Axi Ethernet error irq.
+ * @irq: irq number
+ * @_ndev: net_device pointer
+ *
+ * Return: IRQ_HANDLED for all cases.
+ *
+ * This is the Axi DMA error ISR. It updates the rx memory over run condition.
+ */
+static irqreturn_t axienet_err_irq(int irq, void *_ndev)
+{
+ unsigned int status;
+ struct net_device *ndev = _ndev;
+ struct axienet_local *lp = netdev_priv(ndev);
+
+ status = axienet_ior(lp, XAE_IS_OFFSET);
+ if (status & XAE_INT_RXFIFOOVR_MASK) {
+ ndev->stats.rx_fifo_errors++;
+ axienet_iow(lp, XAE_IS_OFFSET, XAE_INT_RXFIFOOVR_MASK);
+ }
+
+ if (status & XAE_INT_RXRJECT_MASK) {
+ axienet_iow(lp, XAE_IS_OFFSET, XAE_INT_RXRJECT_MASK);
+ axienet_device_reset(ndev);
+ }
+
+ return IRQ_HANDLED;
+}
+
/**
* axienet_tx_irq - Tx Done Isr.
* @irq: irq number
if (ret)
goto err_rx_irq;
+ if (!lp->eth_hasnobuf && (lp->axienet_config->mactype == XAXIENET_1G)) {
+ /* Enable interrupts for Axi Ethernet */
+ ret = request_irq(lp->eth_irq, axienet_err_irq, 0, 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:
free_irq(lp->tx_irq, ndev);
free_irq(lp->rx_irq, ndev);
+ if ((lp->axienet_config->mactype == XAXIENET_1G) && !lp->eth_hasnobuf)
+ free_irq(lp->eth_irq, ndev);
+
if (ndev->phydev)
phy_disconnect(ndev->phydev);
lp->eth_hasnobuf = of_property_read_bool(pdev->dev.of_node,
"xlnx,eth-hasnobuf");
+ if ((lp->axienet_config->mactype == XAXIENET_1G) && !lp->eth_hasnobuf)
+ lp->eth_irq = platform_get_irq(pdev, 0);
+
#ifdef CONFIG_XILINX_AXI_EMAC_HWTSTAMP
struct resource txtsres, rxtsres;