Merge git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net
[linux-2.6-microblaze.git] / drivers / s390 / net / qeth_l2_sys.c
index d9af5fe..f70c7aa 100644 (file)
@@ -21,6 +21,7 @@ static ssize_t qeth_bridge_port_role_state_show(struct device *dev,
        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,
@@ -54,6 +55,7 @@ static ssize_t qeth_bridge_port_role_state_show(struct device *dev,
                else
                        rc = sprintf(buf, "%s\n", word);
        }
+       mutex_unlock(&card->sbp_lock);
 
        return rc;
 }
@@ -86,6 +88,7 @@ static ssize_t qeth_bridge_port_role_store(struct device *dev,
                return -EINVAL;
 
        mutex_lock(&card->conf_mutex);
+       mutex_lock(&card->sbp_lock);
 
        if (qeth_l2_vnicc_is_in_use(card))
                rc = -EBUSY;
@@ -99,6 +102,7 @@ static ssize_t qeth_bridge_port_role_store(struct device *dev,
        } else
                card->options.sbp.role = role;
 
+       mutex_unlock(&card->sbp_lock);
        mutex_unlock(&card->conf_mutex);
 
        return rc ? rc : count;
@@ -147,6 +151,7 @@ static ssize_t qeth_bridgeport_hostnotification_store(struct device *dev,
                return rc;
 
        mutex_lock(&card->conf_mutex);
+       mutex_lock(&card->sbp_lock);
 
        if (qeth_l2_vnicc_is_in_use(card))
                rc = -EBUSY;
@@ -157,6 +162,7 @@ static ssize_t qeth_bridgeport_hostnotification_store(struct device *dev,
        } else
                card->options.sbp.hostnotification = enable;
 
+       mutex_unlock(&card->sbp_lock);
        mutex_unlock(&card->conf_mutex);
 
        return rc ? rc : count;
@@ -206,6 +212,7 @@ static ssize_t qeth_bridgeport_reflect_store(struct device *dev,
                return -EINVAL;
 
        mutex_lock(&card->conf_mutex);
+       mutex_lock(&card->sbp_lock);
 
        if (qeth_l2_vnicc_is_in_use(card))
                rc = -EBUSY;
@@ -217,6 +224,7 @@ static ssize_t qeth_bridgeport_reflect_store(struct device *dev,
                rc = 0;
        }
 
+       mutex_unlock(&card->sbp_lock);
        mutex_unlock(&card->conf_mutex);
 
        return rc ? rc : count;
@@ -252,6 +260,8 @@ void qeth_l2_setup_bridgeport_attrs(struct qeth_card *card)
                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);
@@ -263,8 +273,10 @@ void qeth_l2_setup_bridgeport_attrs(struct qeth_card *card)
                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 */