if (card->info.promisc_mode == enable)
                return;
 
-       if (qeth_adp_supported(card, IPA_SETADP_SET_PROMISC_MODE))
+       if (qeth_adp_supported(card, IPA_SETADP_SET_PROMISC_MODE)) {
                qeth_setadp_promisc_mode(card, enable);
-       else if (card->options.sbp.reflect_promisc)
-               qeth_l2_promisc_to_bridge(card, enable);
+       } else {
+               mutex_lock(&card->sbp_lock);
+               if (card->options.sbp.reflect_promisc)
+                       qeth_l2_promisc_to_bridge(card, enable);
+               mutex_unlock(&card->sbp_lock);
+       }
 }
 
 /* New MAC address is added to the hash table and marked to be written on card
        int rc;
 
        qeth_l2_vnicc_set_defaults(card);
+       mutex_init(&card->sbp_lock);
 
        if (gdev->dev.type == &qeth_generic_devtype) {
                rc = qeth_l2_create_device_attributes(&gdev->dev);
        } else
                card->info.hwtrap = 0;
 
+       mutex_lock(&card->sbp_lock);
        qeth_bridgeport_query_support(card);
        if (card->options.sbp.supported_funcs)
                dev_info(&card->gdev->dev,
                "The device represents a Bridge Capable Port\n");
+       mutex_unlock(&card->sbp_lock);
 
        qeth_l2_register_dev_addr(card);
 
 
        /* Role should not change by itself, but if it did, */
        /* information from the hardware is authoritative.  */
-       mutex_lock(&data->card->conf_mutex);
+       mutex_lock(&data->card->sbp_lock);
        data->card->options.sbp.role = entry->role;
-       mutex_unlock(&data->card->conf_mutex);
+       mutex_unlock(&data->card->sbp_lock);
 
        snprintf(env_locrem, sizeof(env_locrem), "BRIDGEPORT=statechange");
        snprintf(env_role, sizeof(env_role), "ROLE=%s",
                        : (data->hostevs.lost_event_mask == 0x02)
                        ? "Bridge port state change"
                        : "Unknown reason");
-               mutex_lock(&data->card->conf_mutex);
+               mutex_lock(&data->card->sbp_lock);
                data->card->options.sbp.hostnotification = 0;
-               mutex_unlock(&data->card->conf_mutex);
+               mutex_unlock(&data->card->sbp_lock);
                qeth_bridge_emit_host_event(data->card, anev_abort,
                        0, NULL, NULL);
        } else
 
        if (qeth_l2_vnicc_is_in_use(card))
                return sprintf(buf, "n/a (VNIC characteristics)\n");
 
+       mutex_lock(&card->sbp_lock);
        if (qeth_card_hw_is_reachable(card) &&
                                        card->options.sbp.supported_funcs)
                rc = qeth_bridgeport_query_ports(card,
                else
                        rc = sprintf(buf, "%s\n", word);
        }
+       mutex_unlock(&card->sbp_lock);
 
        return rc;
 }
                return -EINVAL;
 
        mutex_lock(&card->conf_mutex);
+       mutex_lock(&card->sbp_lock);
 
        if (qeth_l2_vnicc_is_in_use(card))
                rc = -EBUSY;
        } else
                card->options.sbp.role = role;
 
+       mutex_unlock(&card->sbp_lock);
        mutex_unlock(&card->conf_mutex);
 
        return rc ? rc : count;
                return rc;
 
        mutex_lock(&card->conf_mutex);
+       mutex_lock(&card->sbp_lock);
 
        if (qeth_l2_vnicc_is_in_use(card))
                rc = -EBUSY;
        } else
                card->options.sbp.hostnotification = enable;
 
+       mutex_unlock(&card->sbp_lock);
        mutex_unlock(&card->conf_mutex);
 
        return rc ? rc : count;
                return -EINVAL;
 
        mutex_lock(&card->conf_mutex);
+       mutex_lock(&card->sbp_lock);
 
        if (qeth_l2_vnicc_is_in_use(card))
                rc = -EBUSY;
                rc = 0;
        }
 
+       mutex_unlock(&card->sbp_lock);
        mutex_unlock(&card->conf_mutex);
 
        return rc ? rc : count;
                return;
        if (!card->options.sbp.supported_funcs)
                return;
+
+       mutex_lock(&card->sbp_lock);
        if (card->options.sbp.role != QETH_SBP_ROLE_NONE) {
                /* Conditional to avoid spurious error messages */
                qeth_bridgeport_setrole(card, card->options.sbp.role);
                rc = qeth_bridgeport_an_set(card, 1);
                if (rc)
                        card->options.sbp.hostnotification = 0;
-       } else
+       } else {
                qeth_bridgeport_an_set(card, 0);
+       }
+       mutex_unlock(&card->sbp_lock);
 }
 
 /* VNIC CHARS support */