Loading drivers/net/wireless/mwl8k.c +27 −78 Original line number Original line Diff line number Diff line Loading @@ -2489,104 +2489,53 @@ static int mwl8k_queue_work(struct ieee80211_hw *hw, return rc; return rc; } } struct mwl8k_start_worker { struct mwl8k_work_struct header; }; static int mwl8k_start_wt(struct work_struct *wt) { struct mwl8k_start_worker *worker = (struct mwl8k_start_worker *)wt; struct ieee80211_hw *hw = worker->header.hw; struct mwl8k_priv *priv = hw->priv; int rc = 0; if (priv->vif != NULL) { rc = -EIO; goto mwl8k_start_exit; } /* Turn on radio */ if (mwl8k_cmd_802_11_radio_enable(hw)) { rc = -EIO; goto mwl8k_start_exit; } /* Purge TX/RX HW queues */ if (mwl8k_cmd_set_pre_scan(hw)) { rc = -EIO; goto mwl8k_start_exit; } if (mwl8k_cmd_set_post_scan(hw, "\x00\x00\x00\x00\x00\x00")) { rc = -EIO; goto mwl8k_start_exit; } /* Enable firmware rate adaptation */ if (mwl8k_cmd_setrateadaptmode(hw, 0)) { rc = -EIO; goto mwl8k_start_exit; } /* Disable WMM. WMM gets enabled when stack sends WMM parms */ if (mwl8k_set_wmm(hw, 0)) { rc = -EIO; goto mwl8k_start_exit; } /* Disable sniffer mode */ if (mwl8k_enable_sniffer(hw, 0)) rc = -EIO; mwl8k_start_exit: return rc; } static int mwl8k_start(struct ieee80211_hw *hw) static int mwl8k_start(struct ieee80211_hw *hw) { { struct mwl8k_start_worker *worker; struct mwl8k_priv *priv = hw->priv; struct mwl8k_priv *priv = hw->priv; int rc; int rc; /* Enable tx reclaim tasklet */ tasklet_enable(&priv->tx_reclaim_task); 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) { printk(KERN_ERR "%s: failed to register IRQ handler\n", printk(KERN_ERR "%s: failed to register IRQ handler\n", priv->name); priv->name); rc = -EIO; return -EIO; goto mwl8k_start_disable_tasklet; } } /* Enable tx reclaim tasklet */ tasklet_enable(&priv->tx_reclaim_task); /* Enable interrupts */ /* Enable interrupts */ iowrite32(MWL8K_A2H_EVENTS, priv->regs + MWL8K_HIU_A2H_INTERRUPT_MASK); iowrite32(MWL8K_A2H_EVENTS, priv->regs + MWL8K_HIU_A2H_INTERRUPT_MASK); worker = kzalloc(sizeof(*worker), GFP_KERNEL); rc = mwl8k_fw_lock(hw); if (worker == NULL) { if (!rc) { rc = -ENOMEM; rc = mwl8k_cmd_802_11_radio_enable(hw); goto mwl8k_start_disable_irq; } rc = mwl8k_queue_work(hw, &worker->header, mwl8k_start_wt); kfree(worker); if (!rc) if (!rc) return rc; rc = mwl8k_cmd_set_pre_scan(hw); if (rc == -ETIMEDOUT) if (!rc) printk(KERN_ERR "%s() timed out\n", __func__); rc = mwl8k_cmd_set_post_scan(hw, "\x00\x00\x00\x00\x00\x00"); if (!rc) rc = mwl8k_cmd_setrateadaptmode(hw, 0); rc = -EIO; if (!rc) rc = mwl8k_set_wmm(hw, 0); if (!rc) rc = mwl8k_enable_sniffer(hw, 0); mwl8k_start_disable_irq: mwl8k_fw_unlock(hw); spin_lock_irq(&priv->tx_lock); } if (rc) { iowrite32(0, priv->regs + MWL8K_HIU_A2H_INTERRUPT_MASK); iowrite32(0, priv->regs + MWL8K_HIU_A2H_INTERRUPT_MASK); spin_unlock_irq(&priv->tx_lock); free_irq(priv->pdev->irq, hw); free_irq(priv->pdev->irq, hw); mwl8k_start_disable_tasklet: tasklet_disable(&priv->tx_reclaim_task); tasklet_disable(&priv->tx_reclaim_task); } return rc; return rc; } } Loading Loading
drivers/net/wireless/mwl8k.c +27 −78 Original line number Original line Diff line number Diff line Loading @@ -2489,104 +2489,53 @@ static int mwl8k_queue_work(struct ieee80211_hw *hw, return rc; return rc; } } struct mwl8k_start_worker { struct mwl8k_work_struct header; }; static int mwl8k_start_wt(struct work_struct *wt) { struct mwl8k_start_worker *worker = (struct mwl8k_start_worker *)wt; struct ieee80211_hw *hw = worker->header.hw; struct mwl8k_priv *priv = hw->priv; int rc = 0; if (priv->vif != NULL) { rc = -EIO; goto mwl8k_start_exit; } /* Turn on radio */ if (mwl8k_cmd_802_11_radio_enable(hw)) { rc = -EIO; goto mwl8k_start_exit; } /* Purge TX/RX HW queues */ if (mwl8k_cmd_set_pre_scan(hw)) { rc = -EIO; goto mwl8k_start_exit; } if (mwl8k_cmd_set_post_scan(hw, "\x00\x00\x00\x00\x00\x00")) { rc = -EIO; goto mwl8k_start_exit; } /* Enable firmware rate adaptation */ if (mwl8k_cmd_setrateadaptmode(hw, 0)) { rc = -EIO; goto mwl8k_start_exit; } /* Disable WMM. WMM gets enabled when stack sends WMM parms */ if (mwl8k_set_wmm(hw, 0)) { rc = -EIO; goto mwl8k_start_exit; } /* Disable sniffer mode */ if (mwl8k_enable_sniffer(hw, 0)) rc = -EIO; mwl8k_start_exit: return rc; } static int mwl8k_start(struct ieee80211_hw *hw) static int mwl8k_start(struct ieee80211_hw *hw) { { struct mwl8k_start_worker *worker; struct mwl8k_priv *priv = hw->priv; struct mwl8k_priv *priv = hw->priv; int rc; int rc; /* Enable tx reclaim tasklet */ tasklet_enable(&priv->tx_reclaim_task); 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) { printk(KERN_ERR "%s: failed to register IRQ handler\n", printk(KERN_ERR "%s: failed to register IRQ handler\n", priv->name); priv->name); rc = -EIO; return -EIO; goto mwl8k_start_disable_tasklet; } } /* Enable tx reclaim tasklet */ tasklet_enable(&priv->tx_reclaim_task); /* Enable interrupts */ /* Enable interrupts */ iowrite32(MWL8K_A2H_EVENTS, priv->regs + MWL8K_HIU_A2H_INTERRUPT_MASK); iowrite32(MWL8K_A2H_EVENTS, priv->regs + MWL8K_HIU_A2H_INTERRUPT_MASK); worker = kzalloc(sizeof(*worker), GFP_KERNEL); rc = mwl8k_fw_lock(hw); if (worker == NULL) { if (!rc) { rc = -ENOMEM; rc = mwl8k_cmd_802_11_radio_enable(hw); goto mwl8k_start_disable_irq; } rc = mwl8k_queue_work(hw, &worker->header, mwl8k_start_wt); kfree(worker); if (!rc) if (!rc) return rc; rc = mwl8k_cmd_set_pre_scan(hw); if (rc == -ETIMEDOUT) if (!rc) printk(KERN_ERR "%s() timed out\n", __func__); rc = mwl8k_cmd_set_post_scan(hw, "\x00\x00\x00\x00\x00\x00"); if (!rc) rc = mwl8k_cmd_setrateadaptmode(hw, 0); rc = -EIO; if (!rc) rc = mwl8k_set_wmm(hw, 0); if (!rc) rc = mwl8k_enable_sniffer(hw, 0); mwl8k_start_disable_irq: mwl8k_fw_unlock(hw); spin_lock_irq(&priv->tx_lock); } if (rc) { iowrite32(0, priv->regs + MWL8K_HIU_A2H_INTERRUPT_MASK); iowrite32(0, priv->regs + MWL8K_HIU_A2H_INTERRUPT_MASK); spin_unlock_irq(&priv->tx_lock); free_irq(priv->pdev->irq, hw); free_irq(priv->pdev->irq, hw); mwl8k_start_disable_tasklet: tasklet_disable(&priv->tx_reclaim_task); tasklet_disable(&priv->tx_reclaim_task); } return rc; return rc; } } Loading