Loading drivers/net/wireless/mwl8k.c +27 −78 Original line number Diff line number Diff line Loading @@ -2489,104 +2489,53 @@ static int mwl8k_queue_work(struct ieee80211_hw *hw, 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) { struct mwl8k_start_worker *worker; struct mwl8k_priv *priv = hw->priv; int rc; /* Enable tx reclaim tasklet */ tasklet_enable(&priv->tx_reclaim_task); rc = request_irq(priv->pdev->irq, &mwl8k_interrupt, IRQF_SHARED, MWL8K_NAME, hw); if (rc) { printk(KERN_ERR "%s: failed to register IRQ handler\n", priv->name); rc = -EIO; goto mwl8k_start_disable_tasklet; return -EIO; } /* Enable tx reclaim tasklet */ tasklet_enable(&priv->tx_reclaim_task); /* Enable interrupts */ iowrite32(MWL8K_A2H_EVENTS, priv->regs + MWL8K_HIU_A2H_INTERRUPT_MASK); worker = kzalloc(sizeof(*worker), GFP_KERNEL); if (worker == NULL) { rc = -ENOMEM; goto mwl8k_start_disable_irq; } rc = mwl8k_fw_lock(hw); if (!rc) { rc = mwl8k_cmd_802_11_radio_enable(hw); rc = mwl8k_queue_work(hw, &worker->header, mwl8k_start_wt); kfree(worker); if (!rc) return rc; rc = mwl8k_cmd_set_pre_scan(hw); if (rc == -ETIMEDOUT) printk(KERN_ERR "%s() timed out\n", __func__); if (!rc) 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: spin_lock_irq(&priv->tx_lock); mwl8k_fw_unlock(hw); } if (rc) { iowrite32(0, priv->regs + MWL8K_HIU_A2H_INTERRUPT_MASK); spin_unlock_irq(&priv->tx_lock); free_irq(priv->pdev->irq, hw); mwl8k_start_disable_tasklet: tasklet_disable(&priv->tx_reclaim_task); } return rc; } Loading Loading
drivers/net/wireless/mwl8k.c +27 −78 Original line number Diff line number Diff line Loading @@ -2489,104 +2489,53 @@ static int mwl8k_queue_work(struct ieee80211_hw *hw, 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) { struct mwl8k_start_worker *worker; struct mwl8k_priv *priv = hw->priv; int rc; /* Enable tx reclaim tasklet */ tasklet_enable(&priv->tx_reclaim_task); rc = request_irq(priv->pdev->irq, &mwl8k_interrupt, IRQF_SHARED, MWL8K_NAME, hw); if (rc) { printk(KERN_ERR "%s: failed to register IRQ handler\n", priv->name); rc = -EIO; goto mwl8k_start_disable_tasklet; return -EIO; } /* Enable tx reclaim tasklet */ tasklet_enable(&priv->tx_reclaim_task); /* Enable interrupts */ iowrite32(MWL8K_A2H_EVENTS, priv->regs + MWL8K_HIU_A2H_INTERRUPT_MASK); worker = kzalloc(sizeof(*worker), GFP_KERNEL); if (worker == NULL) { rc = -ENOMEM; goto mwl8k_start_disable_irq; } rc = mwl8k_fw_lock(hw); if (!rc) { rc = mwl8k_cmd_802_11_radio_enable(hw); rc = mwl8k_queue_work(hw, &worker->header, mwl8k_start_wt); kfree(worker); if (!rc) return rc; rc = mwl8k_cmd_set_pre_scan(hw); if (rc == -ETIMEDOUT) printk(KERN_ERR "%s() timed out\n", __func__); if (!rc) 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: spin_lock_irq(&priv->tx_lock); mwl8k_fw_unlock(hw); } if (rc) { iowrite32(0, priv->regs + MWL8K_HIU_A2H_INTERRUPT_MASK); spin_unlock_irq(&priv->tx_lock); free_irq(priv->pdev->irq, hw); mwl8k_start_disable_tasklet: tasklet_disable(&priv->tx_reclaim_task); } return rc; } Loading