net: txgbe: request MISC IRQ in ndo_open
commit cc9f7f65cd2f31150b10e6956f1f0882e1bbae49 upstream.
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: aefd013624 ("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>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
committed by
Greg Kroah-Hartman
parent
a54280b0eb
commit
e036b72d6a
@@ -68,7 +68,6 @@ free_queue_irqs:
|
|||||||
free_irq(wx->msix_q_entries[vector].vector,
|
free_irq(wx->msix_q_entries[vector].vector,
|
||||||
wx->q_vector[vector]);
|
wx->q_vector[vector]);
|
||||||
}
|
}
|
||||||
wx_reset_interrupt_capability(wx);
|
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -169,6 +168,7 @@ void txgbe_free_misc_irq(struct txgbe *txgbe)
|
|||||||
free_irq(txgbe->link_irq, txgbe);
|
free_irq(txgbe->link_irq, txgbe);
|
||||||
free_irq(txgbe->misc.irq, txgbe);
|
free_irq(txgbe->misc.irq, txgbe);
|
||||||
txgbe_del_irq_domain(txgbe);
|
txgbe_del_irq_domain(txgbe);
|
||||||
|
txgbe->wx->misc_irq_domain = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
int txgbe_setup_misc_irq(struct txgbe *txgbe)
|
int txgbe_setup_misc_irq(struct txgbe *txgbe)
|
||||||
|
|||||||
@@ -308,10 +308,14 @@ static int txgbe_open(struct net_device *netdev)
|
|||||||
|
|
||||||
wx_configure(wx);
|
wx_configure(wx);
|
||||||
|
|
||||||
err = txgbe_request_queue_irqs(wx);
|
err = txgbe_setup_misc_irq(wx->priv);
|
||||||
if (err)
|
if (err)
|
||||||
goto err_free_resources;
|
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. */
|
/* Notify the stack of the actual queue counts. */
|
||||||
err = netif_set_real_num_tx_queues(netdev, wx->num_tx_queues);
|
err = netif_set_real_num_tx_queues(netdev, wx->num_tx_queues);
|
||||||
if (err)
|
if (err)
|
||||||
@@ -327,6 +331,9 @@ static int txgbe_open(struct net_device *netdev)
|
|||||||
|
|
||||||
err_free_irq:
|
err_free_irq:
|
||||||
wx_free_irq(wx);
|
wx_free_irq(wx);
|
||||||
|
err_free_misc_irq:
|
||||||
|
txgbe_free_misc_irq(wx->priv);
|
||||||
|
wx_reset_interrupt_capability(wx);
|
||||||
err_free_resources:
|
err_free_resources:
|
||||||
wx_free_resources(wx);
|
wx_free_resources(wx);
|
||||||
err_reset:
|
err_reset:
|
||||||
@@ -365,6 +372,7 @@ static int txgbe_close(struct net_device *netdev)
|
|||||||
|
|
||||||
txgbe_down(wx);
|
txgbe_down(wx);
|
||||||
wx_free_irq(wx);
|
wx_free_irq(wx);
|
||||||
|
txgbe_free_misc_irq(wx->priv);
|
||||||
wx_free_resources(wx);
|
wx_free_resources(wx);
|
||||||
txgbe_fdir_filter_exit(wx);
|
txgbe_fdir_filter_exit(wx);
|
||||||
wx_control_hw(wx, false);
|
wx_control_hw(wx, false);
|
||||||
@@ -410,7 +418,6 @@ static void txgbe_shutdown(struct pci_dev *pdev)
|
|||||||
int txgbe_setup_tc(struct net_device *dev, u8 tc)
|
int txgbe_setup_tc(struct net_device *dev, u8 tc)
|
||||||
{
|
{
|
||||||
struct wx *wx = netdev_priv(dev);
|
struct wx *wx = netdev_priv(dev);
|
||||||
struct txgbe *txgbe = wx->priv;
|
|
||||||
|
|
||||||
/* Hardware has to reinitialize queues and interrupts to
|
/* Hardware has to reinitialize queues and interrupts to
|
||||||
* match packet buffer alignment. Unfortunately, the
|
* match packet buffer alignment. Unfortunately, the
|
||||||
@@ -421,7 +428,6 @@ int txgbe_setup_tc(struct net_device *dev, u8 tc)
|
|||||||
else
|
else
|
||||||
txgbe_reset(wx);
|
txgbe_reset(wx);
|
||||||
|
|
||||||
txgbe_free_misc_irq(txgbe);
|
|
||||||
wx_clear_interrupt_scheme(wx);
|
wx_clear_interrupt_scheme(wx);
|
||||||
|
|
||||||
if (tc)
|
if (tc)
|
||||||
@@ -430,7 +436,6 @@ int txgbe_setup_tc(struct net_device *dev, u8 tc)
|
|||||||
netdev_reset_tc(dev);
|
netdev_reset_tc(dev);
|
||||||
|
|
||||||
wx_init_interrupt_scheme(wx);
|
wx_init_interrupt_scheme(wx);
|
||||||
txgbe_setup_misc_irq(txgbe);
|
|
||||||
|
|
||||||
if (netif_running(dev))
|
if (netif_running(dev))
|
||||||
txgbe_open(dev);
|
txgbe_open(dev);
|
||||||
@@ -677,13 +682,9 @@ static int txgbe_probe(struct pci_dev *pdev,
|
|||||||
|
|
||||||
txgbe_init_fdir(txgbe);
|
txgbe_init_fdir(txgbe);
|
||||||
|
|
||||||
err = txgbe_setup_misc_irq(txgbe);
|
|
||||||
if (err)
|
|
||||||
goto err_release_hw;
|
|
||||||
|
|
||||||
err = txgbe_init_phy(txgbe);
|
err = txgbe_init_phy(txgbe);
|
||||||
if (err)
|
if (err)
|
||||||
goto err_free_misc_irq;
|
goto err_release_hw;
|
||||||
|
|
||||||
err = register_netdev(netdev);
|
err = register_netdev(netdev);
|
||||||
if (err)
|
if (err)
|
||||||
@@ -711,8 +712,6 @@ static int txgbe_probe(struct pci_dev *pdev,
|
|||||||
|
|
||||||
err_remove_phy:
|
err_remove_phy:
|
||||||
txgbe_remove_phy(txgbe);
|
txgbe_remove_phy(txgbe);
|
||||||
err_free_misc_irq:
|
|
||||||
txgbe_free_misc_irq(txgbe);
|
|
||||||
err_release_hw:
|
err_release_hw:
|
||||||
wx_clear_interrupt_scheme(wx);
|
wx_clear_interrupt_scheme(wx);
|
||||||
wx_control_hw(wx, false);
|
wx_control_hw(wx, false);
|
||||||
@@ -746,7 +745,6 @@ static void txgbe_remove(struct pci_dev *pdev)
|
|||||||
unregister_netdev(netdev);
|
unregister_netdev(netdev);
|
||||||
|
|
||||||
txgbe_remove_phy(txgbe);
|
txgbe_remove_phy(txgbe);
|
||||||
txgbe_free_misc_irq(txgbe);
|
|
||||||
wx_free_isb_resources(wx);
|
wx_free_isb_resources(wx);
|
||||||
|
|
||||||
pci_release_selected_regions(pdev,
|
pci_release_selected_regions(pdev,
|
||||||
|
|||||||
Reference in New Issue
Block a user