Merge git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net
[linux-2.6-microblaze.git] / drivers / s390 / net / qeth_l2_main.c
index ae69c98..989935d 100644 (file)
@@ -457,10 +457,14 @@ static void qeth_l2_set_promisc_mode(struct qeth_card *card)
        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
@@ -621,6 +625,7 @@ static int qeth_l2_probe_device(struct ccwgroup_device *gdev)
        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);
@@ -779,10 +784,12 @@ static int qeth_l2_set_online(struct ccwgroup_device *gdev)
                goto out_remove;
        }
 
+       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);
 
@@ -1131,9 +1138,9 @@ static void qeth_bridge_state_change_worker(struct work_struct *work)
 
        /* 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",
@@ -1199,9 +1206,9 @@ static void qeth_bridge_host_event_worker(struct work_struct *work)
                        : (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