#include "smp.h"
 
 #define SMP_ALLOW_CMD(smp, code)       set_bit(code, &smp->allow_cmd)
-#define SMP_DISALLOW_CMD(smp, code)    clear_bit(code, &smp->allow_cmd)
 
 #define SMP_TIMEOUT    msecs_to_jiffies(30000)
 
            (auth & SMP_AUTH_BONDING))
                return SMP_PAIRING_NOTSUPP;
 
-       SMP_DISALLOW_CMD(smp, SMP_CMD_PAIRING_REQ);
-
        smp->preq[0] = SMP_CMD_PAIRING_REQ;
        memcpy(&smp->preq[1], req, sizeof(*req));
        skb_pull(skb, sizeof(*req));
        if (conn->hcon->role != HCI_ROLE_MASTER)
                return SMP_CMD_NOTSUPP;
 
-       SMP_DISALLOW_CMD(smp, SMP_CMD_PAIRING_RSP);
-
        skb_pull(skb, sizeof(*rsp));
 
        req = (void *) &smp->preq[1];
        if (skb->len < sizeof(smp->pcnf))
                return SMP_INVALID_PARAMS;
 
-       SMP_DISALLOW_CMD(smp, SMP_CMD_PAIRING_CONFIRM);
-
        memcpy(smp->pcnf, skb->data, sizeof(smp->pcnf));
        skb_pull(skb, sizeof(smp->pcnf));
 
        if (skb->len < sizeof(smp->rrnd))
                return SMP_INVALID_PARAMS;
 
-       SMP_DISALLOW_CMD(smp, SMP_CMD_PAIRING_RANDOM);
-
        memcpy(smp->rrnd, skb->data, sizeof(smp->rrnd));
        skb_pull(skb, sizeof(smp->rrnd));
 
        if (skb->len < sizeof(*rp))
                return SMP_INVALID_PARAMS;
 
-       SMP_DISALLOW_CMD(smp, SMP_CMD_ENCRYPT_INFO);
        SMP_ALLOW_CMD(smp, SMP_CMD_MASTER_IDENT);
 
        skb_pull(skb, sizeof(*rp));
        /* Mark the information as received */
        smp->remote_key_dist &= ~SMP_DIST_ENC_KEY;
 
-       SMP_DISALLOW_CMD(smp, SMP_CMD_MASTER_IDENT);
        if (smp->remote_key_dist & SMP_DIST_ID_KEY)
                SMP_ALLOW_CMD(smp, SMP_CMD_IDENT_INFO);
        else if (smp->remote_key_dist & SMP_DIST_SIGN)
        if (skb->len < sizeof(*info))
                return SMP_INVALID_PARAMS;
 
-       SMP_DISALLOW_CMD(smp, SMP_CMD_IDENT_INFO);
        SMP_ALLOW_CMD(smp, SMP_CMD_IDENT_ADDR_INFO);
 
        skb_pull(skb, sizeof(*info));
        /* Mark the information as received */
        smp->remote_key_dist &= ~SMP_DIST_ID_KEY;
 
-       SMP_DISALLOW_CMD(smp, SMP_CMD_IDENT_ADDR_INFO);
        if (smp->remote_key_dist & SMP_DIST_SIGN)
                SMP_ALLOW_CMD(smp, SMP_CMD_SIGN_INFO);
 
        /* Mark the information as received */
        smp->remote_key_dist &= ~SMP_DIST_SIGN;
 
-       SMP_DISALLOW_CMD(smp, SMP_CMD_SIGN_INFO);
-
        skb_pull(skb, sizeof(*rp));
 
        hci_dev_lock(hdev);
        if (code > SMP_CMD_MAX)
                goto drop;
 
-       if (smp && !test_bit(code, &smp->allow_cmd))
+       if (smp && !test_and_clear_bit(code, &smp->allow_cmd))
                goto drop;
 
        /* If we don't have a context the only allowed commands are