Commit bf3ca7f7 authored by Brian Cavagnolo's avatar Brian Cavagnolo Committed by John W. Linville

mwl8k: do not free unrequested irq

When the mwl8k driver attempts and fails to switch from sta to ap
firmware (or vice-versa) in the mwl8k_add_interface routine, the
mwl8k_stop routine will be called. This routine must not attempt
to free the irq if it was not requested.
Signed-off-by: default avatarBrian Cavagnolo <brian@cozybit.com>
Signed-off-by: default avatarNishant Sarmukadam <nishants@marvell.com>
Signed-off-by: default avatarJohn W. Linville <linville@tuxdriver.com>
parent 2845fd85
...@@ -137,6 +137,7 @@ struct mwl8k_tx_queue { ...@@ -137,6 +137,7 @@ struct mwl8k_tx_queue {
struct mwl8k_priv { struct mwl8k_priv {
struct ieee80211_hw *hw; struct ieee80211_hw *hw;
struct pci_dev *pdev; struct pci_dev *pdev;
int irq;
struct mwl8k_device_info *device_info; struct mwl8k_device_info *device_info;
...@@ -3761,9 +3762,11 @@ static int mwl8k_start(struct ieee80211_hw *hw) ...@@ -3761,9 +3762,11 @@ static int mwl8k_start(struct ieee80211_hw *hw)
rc = request_irq(priv->pdev->irq, mwl8k_interrupt, rc = request_irq(priv->pdev->irq, mwl8k_interrupt,
IRQF_SHARED, MWL8K_NAME, hw); IRQF_SHARED, MWL8K_NAME, hw);
if (rc) { if (rc) {
priv->irq = -1;
wiphy_err(hw->wiphy, "failed to register IRQ handler\n"); wiphy_err(hw->wiphy, "failed to register IRQ handler\n");
return -EIO; return -EIO;
} }
priv->irq = priv->pdev->irq;
/* Enable TX reclaim and RX tasklets. */ /* Enable TX reclaim and RX tasklets. */
tasklet_enable(&priv->poll_tx_task); tasklet_enable(&priv->poll_tx_task);
...@@ -3800,6 +3803,7 @@ static int mwl8k_start(struct ieee80211_hw *hw) ...@@ -3800,6 +3803,7 @@ static int mwl8k_start(struct ieee80211_hw *hw)
if (rc) { if (rc) {
iowrite32(0, priv->regs + MWL8K_HIU_A2H_INTERRUPT_MASK); iowrite32(0, priv->regs + MWL8K_HIU_A2H_INTERRUPT_MASK);
free_irq(priv->pdev->irq, hw); free_irq(priv->pdev->irq, hw);
priv->irq = -1;
tasklet_disable(&priv->poll_tx_task); tasklet_disable(&priv->poll_tx_task);
tasklet_disable(&priv->poll_rx_task); tasklet_disable(&priv->poll_rx_task);
} }
...@@ -3818,7 +3822,10 @@ static void mwl8k_stop(struct ieee80211_hw *hw) ...@@ -3818,7 +3822,10 @@ static void mwl8k_stop(struct ieee80211_hw *hw)
/* Disable interrupts */ /* Disable interrupts */
iowrite32(0, priv->regs + MWL8K_HIU_A2H_INTERRUPT_MASK); iowrite32(0, priv->regs + MWL8K_HIU_A2H_INTERRUPT_MASK);
free_irq(priv->pdev->irq, hw); if (priv->irq != -1) {
free_irq(priv->pdev->irq, hw);
priv->irq = -1;
}
/* Stop finalize join worker */ /* Stop finalize join worker */
cancel_work_sync(&priv->finalize_join_worker); cancel_work_sync(&priv->finalize_join_worker);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment