mwl8k: get rid of mwl8k_start() workqueue use
authorLennert Buytenhek <buytenh@wantstofly.org>
Fri, 17 Jul 2009 05:11:37 +0000 (07:11 +0200)
committerJohn W. Linville <linville@tuxdriver.com>
Thu, 20 Aug 2009 15:38:08 +0000 (11:38 -0400)
Signed-off-by: Lennert Buytenhek <buytenh@marvell.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
drivers/net/wireless/mwl8k.c

index 93b92680d070d5a61c412f8460420000e14d02d8..7b7007da873f8433d1a2fe71989848c384f69c98 100644 (file)
@@ -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;
+               if (!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");
 
-       rc = -EIO;
+               if (!rc)
+                       rc = mwl8k_cmd_setrateadaptmode(hw, 0);
 
-mwl8k_start_disable_irq:
-       spin_lock_irq(&priv->tx_lock);
-       iowrite32(0, priv->regs + MWL8K_HIU_A2H_INTERRUPT_MASK);
-       spin_unlock_irq(&priv->tx_lock);
-       free_irq(priv->pdev->irq, hw);
+               if (!rc)
+                       rc = mwl8k_set_wmm(hw, 0);
 
-mwl8k_start_disable_tasklet:
-       tasklet_disable(&priv->tx_reclaim_task);
+               if (!rc)
+                       rc = mwl8k_enable_sniffer(hw, 0);
+
+               mwl8k_fw_unlock(hw);
+       }
+
+       if (rc) {
+               iowrite32(0, priv->regs + MWL8K_HIU_A2H_INTERRUPT_MASK);
+               free_irq(priv->pdev->irq, hw);
+               tasklet_disable(&priv->tx_reclaim_task);
+       }
 
        return rc;
 }