|
@@ -3115,6 +3115,12 @@ static irqreturn_t stmmac_interrupt(int irq, void *dev_id)
|
|
|
{
|
|
|
struct net_device *dev = (struct net_device *)dev_id;
|
|
|
struct stmmac_priv *priv = netdev_priv(dev);
|
|
|
+ u32 rx_cnt = priv->plat->rx_queues_to_use;
|
|
|
+ u32 tx_cnt = priv->plat->tx_queues_to_use;
|
|
|
+ u32 queues_count;
|
|
|
+ u32 queue;
|
|
|
+
|
|
|
+ queues_count = (rx_cnt > tx_cnt) ? rx_cnt : tx_cnt;
|
|
|
|
|
|
if (priv->irq_wake)
|
|
|
pm_wakeup_event(priv->device, 0);
|
|
@@ -3129,20 +3135,26 @@ static irqreturn_t stmmac_interrupt(int irq, void *dev_id)
|
|
|
int status = priv->hw->mac->host_irq_status(priv->hw,
|
|
|
&priv->xstats);
|
|
|
|
|
|
- if (priv->synopsys_id >= DWMAC_CORE_4_00)
|
|
|
- status |= priv->hw->mac->host_mtl_irq_status(priv->hw,
|
|
|
- STMMAC_CHAN0);
|
|
|
-
|
|
|
if (unlikely(status)) {
|
|
|
/* For LPI we need to save the tx status */
|
|
|
if (status & CORE_IRQ_TX_PATH_IN_LPI_MODE)
|
|
|
priv->tx_path_in_lpi_mode = true;
|
|
|
if (status & CORE_IRQ_TX_PATH_EXIT_LPI_MODE)
|
|
|
priv->tx_path_in_lpi_mode = false;
|
|
|
- if (status & CORE_IRQ_MTL_RX_OVERFLOW && priv->hw->dma->set_rx_tail_ptr)
|
|
|
- priv->hw->dma->set_rx_tail_ptr(priv->ioaddr,
|
|
|
- priv->rx_tail_addr,
|
|
|
- STMMAC_CHAN0);
|
|
|
+ }
|
|
|
+
|
|
|
+ if (priv->synopsys_id >= DWMAC_CORE_4_00) {
|
|
|
+ for (queue = 0; queue < queues_count; queue++) {
|
|
|
+ status |=
|
|
|
+ priv->hw->mac->host_mtl_irq_status(priv->hw,
|
|
|
+ queue);
|
|
|
+
|
|
|
+ if (status & CORE_IRQ_MTL_RX_OVERFLOW &&
|
|
|
+ priv->hw->dma->set_rx_tail_ptr)
|
|
|
+ priv->hw->dma->set_rx_tail_ptr(priv->ioaddr,
|
|
|
+ priv->rx_tail_addr,
|
|
|
+ queue);
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
/* PCS link status */
|