static void disable_MAC(struct airo_info *ai, int lock);
 static void enable_interrupts(struct airo_info*);
 static void disable_interrupts(struct airo_info*);
-static u16 issuecommand(struct airo_info*, Cmd *pCmd, Resp *pRsp);
+static u16 issuecommand(struct airo_info*, Cmd *pCmd, Resp *pRsp,
+                       bool may_sleep);
 static int bap_setup(struct airo_info*, u16 rid, u16 offset, int whichbap);
 static int aux_bap_read(struct airo_info*, __le16 *pu16Dst, int bytelen,
                        int whichbap);
 static int do_writerid(struct airo_info*, u16 rid, const void *rid_data,
                        int len, int dummy);
 static u16 transmit_allocate(struct airo_info*, int lenPayload, int raw);
-static int transmit_802_3_packet(struct airo_info*, int len, char *pPacket);
-static int transmit_802_11_packet(struct airo_info*, int len, char *pPacket);
+static int transmit_802_3_packet(struct airo_info*, int len, char *pPacket,
+                                bool may_sleep);
+static int transmit_802_11_packet(struct airo_info*, int len, char *pPacket,
+                                 bool may_sleep);
 
 static int mpi_send_packet(struct net_device *dev);
 static void mpi_unmap_card(struct pci_dev *pci);
                if (down_interruptible(&ai->sem))
                        return -ERESTARTSYS;
                ai->list_bss_task = current;
-               issuecommand(ai, &cmd, &rsp);
+               issuecommand(ai, &cmd, &rsp, true);
                up(&ai->sem);
                /* Let the command take effect */
                schedule_timeout_uninterruptible(3 * HZ);
        }
 }
 
-static void airo_end_xmit(struct net_device *dev)
+static void airo_end_xmit(struct net_device *dev, bool may_sleep)
 {
        u16 status;
        int i;
 
        clear_bit(JOB_XMIT, &priv->jobs);
        clear_bit(FLAG_PENDING_XMIT, &priv->flags);
-       status = transmit_802_3_packet (priv, fids[fid], skb->data);
+       status = transmit_802_3_packet(priv, fids[fid], skb->data, may_sleep);
        up(&priv->sem);
 
        i = 0;
                set_bit(JOB_XMIT, &priv->jobs);
                wake_up_interruptible(&priv->thr_wait);
        } else
-               airo_end_xmit(dev);
+               airo_end_xmit(dev, false);
        return NETDEV_TX_OK;
 }
 
-static void airo_end_xmit11(struct net_device *dev)
+static void airo_end_xmit11(struct net_device *dev, bool may_sleep)
 {
        u16 status;
        int i;
 
        clear_bit(JOB_XMIT11, &priv->jobs);
        clear_bit(FLAG_PENDING_XMIT11, &priv->flags);
-       status = transmit_802_11_packet (priv, fids[fid], skb->data);
+       status = transmit_802_11_packet(priv, fids[fid], skb->data, may_sleep);
        up(&priv->sem);
 
        i = MAX_FIDS / 2;
                set_bit(JOB_XMIT11, &priv->jobs);
                wake_up_interruptible(&priv->thr_wait);
        } else
-               airo_end_xmit11(dev);
+               airo_end_xmit11(dev, false);
        return NETDEV_TX_OK;
 }
 
        return &dev->stats;
 }
 
-static void airo_set_promisc(struct airo_info *ai)
+static void airo_set_promisc(struct airo_info *ai, bool may_sleep)
 {
        Cmd cmd;
        Resp rsp;
        cmd.cmd = CMD_SETMODE;
        clear_bit(JOB_PROMISC, &ai->jobs);
        cmd.parm0=(ai->flags&IFF_PROMISC) ? PROMISC : NOPROMISC;
-       issuecommand(ai, &cmd, &rsp);
+       issuecommand(ai, &cmd, &rsp, may_sleep);
        up(&ai->sem);
 }
 
                        set_bit(JOB_PROMISC, &ai->jobs);
                        wake_up_interruptible(&ai->thr_wait);
                } else
-                       airo_set_promisc(ai);
+                       airo_set_promisc(ai, false);
        }
 
        if ((dev->flags&IFF_ALLMULTI) || !netdev_mc_empty(dev)) {
        cmd.parm0 = FID_RX;
        cmd.parm1 = (ai->rxfids[0].card_ram_off - ai->pciaux);
        cmd.parm2 = MPI_MAX_FIDS;
-       rc = issuecommand(ai, &cmd, &rsp);
+       rc = issuecommand(ai, &cmd, &rsp, true);
        if (rc != SUCCESS) {
                airo_print_err(ai->dev->name, "Couldn't allocate RX FID");
                return rc;
        }
        ai->txfids[i-1].tx_desc.eoc = 1; /* Last descriptor has EOC set */
 
-       rc = issuecommand(ai, &cmd, &rsp);
+       rc = issuecommand(ai, &cmd, &rsp, true);
        if (rc != SUCCESS) {
                airo_print_err(ai->dev->name, "Couldn't allocate TX FID");
                return rc;
        cmd.parm0 = RID_RW;
        cmd.parm1 = (ai->config_desc.card_ram_off - ai->pciaux);
        cmd.parm2 = 1; /* Magic number... */
-       rc = issuecommand(ai, &cmd, &rsp);
+       rc = issuecommand(ai, &cmd, &rsp, true);
        if (rc != SUCCESS) {
                airo_print_err(ai->dev->name, "Couldn't allocate RID");
                return rc;
                }
 
                if (test_bit(JOB_XMIT, &ai->jobs))
-                       airo_end_xmit(dev);
+                       airo_end_xmit(dev, true);
                else if (test_bit(JOB_XMIT11, &ai->jobs))
-                       airo_end_xmit11(dev);
+                       airo_end_xmit11(dev, true);
                else if (test_bit(JOB_STATS, &ai->jobs))
                        airo_read_stats(dev);
                else if (test_bit(JOB_PROMISC, &ai->jobs))
-                       airo_set_promisc(ai);
+                       airo_set_promisc(ai, true);
                else if (test_bit(JOB_MIC, &ai->jobs))
                        micinit(ai);
                else if (test_bit(JOB_EVENT, &ai->jobs))
        if (!test_bit(FLAG_ENABLED, &ai->flags)) {
                memset(&cmd, 0, sizeof(cmd));
                cmd.cmd = MAC_ENABLE;
-               rc = issuecommand(ai, &cmd, &rsp);
+               rc = issuecommand(ai, &cmd, &rsp, true);
                if (rc == SUCCESS)
                        set_bit(FLAG_ENABLED, &ai->flags);
        } else
                        netif_carrier_off(ai->dev);
                memset(&cmd, 0, sizeof(cmd));
                cmd.cmd = MAC_DISABLE; // disable in case already enabled
-               issuecommand(ai, &cmd, &rsp);
+               issuecommand(ai, &cmd, &rsp, true);
                clear_bit(FLAG_ENABLED, &ai->flags);
        }
        if (lock == 1)
        cmd.parm0 = cmd.parm1 = cmd.parm2 = 0;
        if (lock && down_interruptible(&ai->sem))
                return ERROR;
-       if (issuecommand(ai, &cmd, &rsp) != SUCCESS) {
+       if (issuecommand(ai, &cmd, &rsp, true) != SUCCESS) {
                if (lock)
                        up(&ai->sem);
                return ERROR;
        // Let's figure out if we need to use the AUX port
        if (!test_bit(FLAG_MPI,&ai->flags)) {
                cmd.cmd = CMD_ENABLEAUX;
-               if (issuecommand(ai, &cmd, &rsp) != SUCCESS) {
+               if (issuecommand(ai, &cmd, &rsp, true) != SUCCESS) {
                        if (lock)
                                up(&ai->sem);
                        airo_print_err(ai->dev->name, "Error checking for AUX port");
        return SUCCESS;
 }
 
-static u16 issuecommand(struct airo_info *ai, Cmd *pCmd, Resp *pRsp)
+static u16 issuecommand(struct airo_info *ai, Cmd *pCmd, Resp *pRsp,
+                       bool may_sleep)
 {
         // Im really paranoid about letting it run forever!
        int max_tries = 600000;
                if ((IN4500(ai, COMMAND)) == pCmd->cmd)
                        // PC4500 didn't notice command, try again
                        OUT4500(ai, COMMAND, pCmd->cmd);
-               if (!in_atomic() && (max_tries & 255) == 0)
-                       schedule();
+               if (may_sleep && (max_tries & 255) == 0)
+                       cond_resched();
        }
 
        if (max_tries == -1) {
        memset(&cmd, 0, sizeof(cmd));
        cmd.cmd = accmd;
        cmd.parm0 = rid;
-       status = issuecommand(ai, &cmd, &rsp);
+       status = issuecommand(ai, &cmd, &rsp, true);
        if (status != 0) return status;
        if ((rsp.status & 0x7F00) != 0) {
                return (accmd << 8) + (rsp.rsp0 & 0xFF);
                memcpy_toio(ai->config_desc.card_ram_off,
                        &ai->config_desc.rid_desc, sizeof(Rid));
 
-               rc = issuecommand(ai, &cmd, &rsp);
+               rc = issuecommand(ai, &cmd, &rsp, true);
 
                if (rsp.status & 0x7f00)
                        rc = rsp.rsp0;
                        memcpy(ai->config_desc.virtual_host_addr,
                                pBuf, len);
 
-                       rc = issuecommand(ai, &cmd, &rsp);
+                       rc = issuecommand(ai, &cmd, &rsp, true);
                        if ((rc & 0xff00) != 0) {
                                airo_print_err(ai->dev->name, "%s: Write rid Error %d",
                                                __func__, rc);
        cmd.parm0 = lenPayload;
        if (down_interruptible(&ai->sem))
                return ERROR;
-       if (issuecommand(ai, &cmd, &rsp) != SUCCESS) {
+       if (issuecommand(ai, &cmd, &rsp, true) != SUCCESS) {
                txFid = ERROR;
                goto done;
        }
 /* In general BAP1 is dedicated to transmiting packets.  However,
    since we need a BAP when accessing RIDs, we also use BAP1 for that.
    Make sure the BAP1 spinlock is held when this is called. */
-static int transmit_802_3_packet(struct airo_info *ai, int len, char *pPacket)
+static int transmit_802_3_packet(struct airo_info *ai, int len, char *pPacket,
+                                bool may_sleep)
 {
        __le16 payloadLen;
        Cmd cmd;
        memset(&cmd, 0, sizeof(cmd));
        cmd.cmd = CMD_TRANSMIT;
        cmd.parm0 = txFid;
-       if (issuecommand(ai, &cmd, &rsp) != SUCCESS) return ERROR;
+       if (issuecommand(ai, &cmd, &rsp, may_sleep) != SUCCESS)
+               return ERROR;
        if ((rsp.status & 0xFF00) != 0) return ERROR;
        return SUCCESS;
 }
 
-static int transmit_802_11_packet(struct airo_info *ai, int len, char *pPacket)
+static int transmit_802_11_packet(struct airo_info *ai, int len, char *pPacket,
+                                 bool may_sleep)
 {
        __le16 fc, payloadLen;
        Cmd cmd;
        memset(&cmd, 0, sizeof(cmd));
        cmd.cmd = CMD_TRANSMIT;
        cmd.parm0 = txFid;
-       if (issuecommand(ai, &cmd, &rsp) != SUCCESS) return ERROR;
+       if (issuecommand(ai, &cmd, &rsp, may_sleep) != SUCCESS)
+               return ERROR;
        if ((rsp.status & 0xFF00) != 0) return ERROR;
        return SUCCESS;
 }
                                kfree(file->private_data);
                                return -ERESTARTSYS;
                        }
-                       issuecommand(ai, &cmd, &rsp);
+                       issuecommand(ai, &cmd, &rsp, true);
                        up(&ai->sem);
                        data->readlen = 0;
                        return 0;
        netif_device_detach(dev);
        ai->power = PMSG_SUSPEND;
        cmd.cmd = HOSTSLEEP;
-       issuecommand(ai, &cmd, &rsp);
+       issuecommand(ai, &cmd, &rsp, true);
 
        device_wakeup_enable(dev_d);
        return 0;
                cmd.cmd = CMD_LOSE_SYNC;
                if (down_interruptible(&local->sem))
                        return -ERESTARTSYS;
-               issuecommand(local, &cmd, &rsp);
+               issuecommand(local, &cmd, &rsp, true);
                up(&local->sem);
        } else {
                memset(APList_rid, 0, sizeof(*APList_rid));
        ai->scan_timeout = RUN_AT(3*HZ);
        memset(&cmd, 0, sizeof(cmd));
        cmd.cmd = CMD_LISTBSS;
-       issuecommand(ai, &cmd, &rsp);
+       issuecommand(ai, &cmd, &rsp, true);
        wake = 1;
 
 out:
        writeConfigRid(local, 0);
        enable_MAC(local, 0);
        if (test_bit (FLAG_RESET, &local->flags))
-               airo_set_promisc(local);
+               airo_set_promisc(local, true);
        else
                up(&local->sem);