]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
net: txgbe: request MISC IRQ in ndo_open
authorJiawen Wu <jiawenwu@trustnetic.com>
Tue, 1 Jul 2025 06:30:28 +0000 (14:30 +0800)
committerPaolo Abeni <pabeni@redhat.com>
Thu, 3 Jul 2025 09:51:39 +0000 (11:51 +0200)
Move the creating of irq_domain for MISC IRQ from .probe to .ndo_open,
and free it in .ndo_stop, to maintain consistency with the queue IRQs.
This it for subsequent adjustments to the IRQ vectors.

Fixes: aefd013624a1 ("net: txgbe: use irq_domain for interrupt controller")
Cc: stable@vger.kernel.org
Signed-off-by: Jiawen Wu <jiawenwu@trustnetic.com>
Reviewed-by: Michal Swiatkowski <michal.swiatkowski@linux.intel.com>
Link: https://patch.msgid.link/20250701063030.59340-2-jiawenwu@trustnetic.com
Signed-off-by: Paolo Abeni <pabeni@redhat.com>
drivers/net/ethernet/wangxun/txgbe/txgbe_irq.c
drivers/net/ethernet/wangxun/txgbe/txgbe_main.c

index 20b9a28bcb55a27fe767fe537ab980283fd267cf..dc468053bdf8268ed8fbf5a5e1a2d76e5e6956b0 100644 (file)
@@ -78,7 +78,6 @@ free_queue_irqs:
                free_irq(wx->msix_q_entries[vector].vector,
                         wx->q_vector[vector]);
        }
-       wx_reset_interrupt_capability(wx);
        return err;
 }
 
@@ -211,6 +210,7 @@ void txgbe_free_misc_irq(struct txgbe *txgbe)
        free_irq(txgbe->link_irq, txgbe);
        free_irq(txgbe->misc.irq, txgbe);
        txgbe_del_irq_domain(txgbe);
+       txgbe->wx->misc_irq_domain = false;
 }
 
 int txgbe_setup_misc_irq(struct txgbe *txgbe)
index f3d2778b8e35620c827d0e7a3dc081e8fbae4562..a5867f3c93fc313d33ee47d1763e76956864a883 100644 (file)
@@ -458,10 +458,14 @@ static int txgbe_open(struct net_device *netdev)
 
        wx_configure(wx);
 
-       err = txgbe_request_queue_irqs(wx);
+       err = txgbe_setup_misc_irq(wx->priv);
        if (err)
                goto err_free_resources;
 
+       err = txgbe_request_queue_irqs(wx);
+       if (err)
+               goto err_free_misc_irq;
+
        /* Notify the stack of the actual queue counts. */
        err = netif_set_real_num_tx_queues(netdev, wx->num_tx_queues);
        if (err)
@@ -479,6 +483,9 @@ static int txgbe_open(struct net_device *netdev)
 
 err_free_irq:
        wx_free_irq(wx);
+err_free_misc_irq:
+       txgbe_free_misc_irq(wx->priv);
+       wx_reset_interrupt_capability(wx);
 err_free_resources:
        wx_free_resources(wx);
 err_reset:
@@ -519,6 +526,7 @@ static int txgbe_close(struct net_device *netdev)
        wx_ptp_stop(wx);
        txgbe_down(wx);
        wx_free_irq(wx);
+       txgbe_free_misc_irq(wx->priv);
        wx_free_resources(wx);
        txgbe_fdir_filter_exit(wx);
        wx_control_hw(wx, false);
@@ -564,7 +572,6 @@ static void txgbe_shutdown(struct pci_dev *pdev)
 int txgbe_setup_tc(struct net_device *dev, u8 tc)
 {
        struct wx *wx = netdev_priv(dev);
-       struct txgbe *txgbe = wx->priv;
 
        /* Hardware has to reinitialize queues and interrupts to
         * match packet buffer alignment. Unfortunately, the
@@ -575,7 +582,6 @@ int txgbe_setup_tc(struct net_device *dev, u8 tc)
        else
                txgbe_reset(wx);
 
-       txgbe_free_misc_irq(txgbe);
        wx_clear_interrupt_scheme(wx);
 
        if (tc)
@@ -584,7 +590,6 @@ int txgbe_setup_tc(struct net_device *dev, u8 tc)
                netdev_reset_tc(dev);
 
        wx_init_interrupt_scheme(wx);
-       txgbe_setup_misc_irq(txgbe);
 
        if (netif_running(dev))
                txgbe_open(dev);
@@ -882,13 +887,9 @@ static int txgbe_probe(struct pci_dev *pdev,
 
        txgbe_init_fdir(txgbe);
 
-       err = txgbe_setup_misc_irq(txgbe);
-       if (err)
-               goto err_release_hw;
-
        err = txgbe_init_phy(txgbe);
        if (err)
-               goto err_free_misc_irq;
+               goto err_release_hw;
 
        err = register_netdev(netdev);
        if (err)
@@ -916,8 +917,6 @@ static int txgbe_probe(struct pci_dev *pdev,
 
 err_remove_phy:
        txgbe_remove_phy(txgbe);
-err_free_misc_irq:
-       txgbe_free_misc_irq(txgbe);
 err_release_hw:
        wx_clear_interrupt_scheme(wx);
        wx_control_hw(wx, false);
@@ -957,7 +956,6 @@ static void txgbe_remove(struct pci_dev *pdev)
        unregister_netdev(netdev);
 
        txgbe_remove_phy(txgbe);
-       txgbe_free_misc_irq(txgbe);
        wx_free_isb_resources(wx);
 
        pci_release_selected_regions(pdev,