[PATCH] bcm43xx: Abstract the locking mechanism.

This is the starting point to make the driver out-of-order-MMIO-stores safe.
There are more mmiowb() needed.

Signed-off-by: Michael Buesch <mbuesch@freenet.de>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
diff --git a/drivers/net/wireless/bcm43xx/bcm43xx_wx.c b/drivers/net/wireless/bcm43xx/bcm43xx_wx.c
index aa2d993..2081938 100644
--- a/drivers/net/wireless/bcm43xx/bcm43xx_wx.c
+++ b/drivers/net/wireless/bcm43xx/bcm43xx_wx.c
@@ -61,7 +61,7 @@
 	char suffix[7] = { 0 };
 	int have_a = 0, have_b = 0, have_g = 0;
 
-	spin_lock_irqsave(&bcm->lock, flags);
+	bcm43xx_lock(bcm, flags);
 	nr_80211 = bcm43xx_num_80211_cores(bcm);
 	for (i = 0; i < nr_80211; i++) {
 		phy = bcm->phy + i;
@@ -78,7 +78,7 @@
 			assert(0);
 		}
 	}
-	spin_unlock_irqrestore(&bcm->lock, flags);
+	bcm43xx_unlock(bcm, flags);
 
 	i = 0;
 	if (have_a) {
@@ -113,7 +113,7 @@
 	int freq;
 	int err = -EINVAL;
 
-	spin_lock_irqsave(&bcm->lock, flags);
+	bcm43xx_lock_mmio(bcm, flags);
 	if ((data->freq.m >= 0) && (data->freq.m <= 1000)) {
 		channel = data->freq.m;
 		freq = bcm43xx_channel_to_freq(bcm, channel);
@@ -133,7 +133,7 @@
 		err = 0;
 	}
 out_unlock:
-	spin_unlock_irqrestore(&bcm->lock, flags);
+	bcm43xx_unlock_mmio(bcm, flags);
 
 	return err;
 }
@@ -148,7 +148,7 @@
 	int err = -ENODEV;
 	u16 channel;
 
-	spin_lock_irqsave(&bcm->lock, flags);
+	bcm43xx_lock(bcm, flags);
 	channel = bcm->current_core->radio->channel;
 	if (channel == 0xFF) {
 		assert(!bcm->initialized);
@@ -163,7 +163,7 @@
 
 	err = 0;
 out_unlock:
-	spin_unlock_irqrestore(&bcm->lock, flags);
+	bcm43xx_unlock(bcm, flags);
 
 	return err;
 }
@@ -181,10 +181,10 @@
 	if (mode == IW_MODE_AUTO)
 		mode = BCM43xx_INITIAL_IWMODE;
 
-	spin_lock_irqsave(&bcm->lock, flags);
+	bcm43xx_lock_mmio(bcm, flags);
 	if (bcm->ieee->iw_mode != mode)
 		bcm43xx_set_iwmode(bcm, mode);
-	spin_unlock_irqrestore(&bcm->lock, flags);
+	bcm43xx_unlock_mmio(bcm, flags);
 
 	return 0;
 }
@@ -197,9 +197,9 @@
 	struct bcm43xx_private *bcm = bcm43xx_priv(net_dev);
 	unsigned long flags;
 
-	spin_lock_irqsave(&bcm->lock, flags);
+	bcm43xx_lock(bcm, flags);
 	data->mode = bcm->ieee->iw_mode;
-	spin_unlock_irqrestore(&bcm->lock, flags);
+	bcm43xx_unlock(bcm, flags);
 
 	return 0;
 }
@@ -269,7 +269,7 @@
 			  IW_ENC_CAPA_CIPHER_TKIP |
 			  IW_ENC_CAPA_CIPHER_CCMP;
 
-	spin_lock_irqsave(&bcm->lock, flags);
+	bcm43xx_lock(bcm, flags);
 
 	range->num_bitrates = 0;
 	i = 0;
@@ -315,7 +315,7 @@
 	}
 	range->num_frequency = j;
 
-	spin_unlock_irqrestore(&bcm->lock, flags);
+	bcm43xx_unlock(bcm, flags);
 
 	return 0;
 }
@@ -329,11 +329,11 @@
 	unsigned long flags;
 	size_t len;
 
-	spin_lock_irqsave(&bcm->lock, flags);
+	bcm43xx_lock(bcm, flags);
 	len =  min((size_t)data->data.length, (size_t)IW_ESSID_MAX_SIZE);
 	memcpy(bcm->nick, extra, len);
 	bcm->nick[len] = '\0';
-	spin_unlock_irqrestore(&bcm->lock, flags);
+	bcm43xx_unlock(bcm, flags);
 
 	return 0;
 }
@@ -347,12 +347,12 @@
 	unsigned long flags;
 	size_t len;
 
-	spin_lock_irqsave(&bcm->lock, flags);
+	bcm43xx_lock(bcm, flags);
 	len = strlen(bcm->nick) + 1;
 	memcpy(extra, bcm->nick, len);
 	data->data.length = (__u16)len;
 	data->data.flags = 1;
-	spin_unlock_irqrestore(&bcm->lock, flags);
+	bcm43xx_unlock(bcm, flags);
 
 	return 0;
 }
@@ -366,7 +366,7 @@
 	unsigned long flags;
 	int err = -EINVAL;
 
-	spin_lock_irqsave(&bcm->lock, flags);
+	bcm43xx_lock(bcm, flags);
 	if (data->rts.disabled) {
 		bcm->rts_threshold = BCM43xx_MAX_RTS_THRESHOLD;
 		err = 0;
@@ -377,7 +377,7 @@
 			err = 0;
 		}
 	}
-	spin_unlock_irqrestore(&bcm->lock, flags);
+	bcm43xx_unlock(bcm, flags);
 
 	return err;
 }
@@ -390,11 +390,11 @@
 	struct bcm43xx_private *bcm = bcm43xx_priv(net_dev);
 	unsigned long flags;
 
-	spin_lock_irqsave(&bcm->lock, flags);
+	bcm43xx_lock(bcm, flags);
 	data->rts.value = bcm->rts_threshold;
 	data->rts.fixed = 0;
 	data->rts.disabled = (bcm->rts_threshold == BCM43xx_MAX_RTS_THRESHOLD);
-	spin_unlock_irqrestore(&bcm->lock, flags);
+	bcm43xx_unlock(bcm, flags);
 
 	return 0;
 }
@@ -408,7 +408,7 @@
 	unsigned long flags;
 	int err = -EINVAL;
 
-	spin_lock_irqsave(&bcm->lock, flags);
+	bcm43xx_lock(bcm, flags);
 	if (data->frag.disabled) {
 		bcm->ieee->fts = MAX_FRAG_THRESHOLD;
 		err = 0;
@@ -419,7 +419,7 @@
 			err = 0;
 		}
 	}
-	spin_unlock_irqrestore(&bcm->lock, flags);
+	bcm43xx_unlock(bcm, flags);
 
 	return err;
 }
@@ -432,11 +432,11 @@
 	struct bcm43xx_private *bcm = bcm43xx_priv(net_dev);
 	unsigned long flags;
 
-	spin_lock_irqsave(&bcm->lock, flags);
+	bcm43xx_lock(bcm, flags);
 	data->frag.value = bcm->ieee->fts;
 	data->frag.fixed = 0;
 	data->frag.disabled = (bcm->ieee->fts == MAX_FRAG_THRESHOLD);
-	spin_unlock_irqrestore(&bcm->lock, flags);
+	bcm43xx_unlock(bcm, flags);
 
 	return 0;
 }
@@ -458,7 +458,7 @@
 		return -EOPNOTSUPP;
 	}
 
-	spin_lock_irqsave(&bcm->lock, flags);
+	bcm43xx_lock_mmio(bcm, flags);
 	if (!bcm->initialized)
 		goto out_unlock;
 	radio = bcm->current_core->radio;
@@ -482,7 +482,7 @@
 	err = 0;
 
 out_unlock:
-	spin_unlock_irqrestore(&bcm->lock, flags);
+	bcm43xx_unlock_mmio(bcm, flags);
 
 	return err;
 }
@@ -497,7 +497,7 @@
 	unsigned long flags;
 	int err = -ENODEV;
 
-	spin_lock_irqsave(&bcm->lock, flags);
+	bcm43xx_lock(bcm, flags);
 	if (!bcm->initialized)
 		goto out_unlock;
 	radio = bcm->current_core->radio;
@@ -509,7 +509,7 @@
 
 	err = 0;
 out_unlock:
-	spin_unlock_irqrestore(&bcm->lock, flags);
+	bcm43xx_unlock(bcm, flags);
 
 	return err;
 }
@@ -632,7 +632,7 @@
 		return -EINVAL;
 	}
 
-	spin_lock_irqsave(&bcm->lock, flags);
+	bcm43xx_lock_mmio(bcm, flags);
 	if (bcm->initialized) {
 		err = bcm43xx_radio_set_interference_mitigation(bcm, mode);
 		if (err) {
@@ -647,7 +647,7 @@
 		} else
 			bcm->current_core->radio->interfmode = mode;
 	}
-	spin_unlock_irqrestore(&bcm->lock, flags);
+	bcm43xx_unlock_mmio(bcm, flags);
 
 	return err;
 }
@@ -661,9 +661,9 @@
 	unsigned long flags;
 	int mode;
 
-	spin_lock_irqsave(&bcm->lock, flags);
+	bcm43xx_lock(bcm, flags);
 	mode = bcm->current_core->radio->interfmode;
-	spin_unlock_irqrestore(&bcm->lock, flags);
+	bcm43xx_unlock(bcm, flags);
 
 	switch (mode) {
 	case BCM43xx_RADIO_INTERFMODE_NONE:
@@ -693,9 +693,9 @@
 	int on;
 
 	on = *((int *)extra);
-	spin_lock_irqsave(&bcm->lock, flags);
+	bcm43xx_lock(bcm, flags);
 	bcm->short_preamble = !!on;
-	spin_unlock_irqrestore(&bcm->lock, flags);
+	bcm43xx_unlock(bcm, flags);
 
 	return 0;
 }
@@ -709,9 +709,9 @@
 	unsigned long flags;
 	int on;
 
-	spin_lock_irqsave(&bcm->lock, flags);
+	bcm43xx_lock(bcm, flags);
 	on = bcm->short_preamble;
-	spin_unlock_irqrestore(&bcm->lock, flags);
+	bcm43xx_unlock(bcm, flags);
 
 	if (on)
 		strncpy(extra, "1 (Short Preamble enabled)", MAX_WX_STRING);
@@ -732,13 +732,13 @@
 	int on;
 	
 	on = *((int *)extra);
-	spin_lock_irqsave(&bcm->lock, flags);
+
+	bcm43xx_lock(bcm, flags);
 	bcm->ieee->host_encrypt = !!on;
 	bcm->ieee->host_decrypt = !!on;
 	bcm->ieee->host_build_iv = !on;
-	
-	spin_unlock_irqrestore(&bcm->lock, flags);
-	
+	bcm43xx_unlock(bcm, flags);
+
 	return 0;
 }
 
@@ -750,17 +750,17 @@
 	struct bcm43xx_private *bcm = bcm43xx_priv(net_dev);
 	unsigned long flags;
 	int on;
-	
-	spin_lock_irqsave(&bcm->lock, flags);
+
+	bcm43xx_lock(bcm, flags);
 	on = bcm->ieee->host_encrypt;
-	spin_unlock_irqrestore(&bcm->lock, flags);
-	
+	bcm43xx_unlock(bcm, flags);
+
 	if (on)
 		strncpy(extra, "1 (SW encryption enabled) ", MAX_WX_STRING);
 	else
 		strncpy(extra, "0 (SW encryption disabled) ", MAX_WX_STRING);
 	data->data.length = strlen(extra + 1);
-	
+
 	return 0;
 }
 
@@ -816,17 +816,13 @@
 	if (!sprom)
 		goto out;
 
-	spin_lock_irqsave(&bcm->lock, flags);
+	bcm43xx_lock_mmio(bcm, flags);
 	err = -ENODEV;
-	if (!bcm->initialized) {
-		spin_unlock_irqrestore(&bcm->lock, flags);
-		goto out_kfree;
-	}
-	err = bcm43xx_sprom_read(bcm, sprom);
-	spin_unlock_irqrestore(&bcm->lock, flags);
+	if (bcm->initialized)
+		err = bcm43xx_sprom_read(bcm, sprom);
+	bcm43xx_unlock_mmio(bcm, flags);
 	if (!err)
 		data->data.length = sprom2hex(sprom, extra);
-out_kfree:
 	kfree(sprom);
 out:
 	return err;
@@ -865,13 +861,11 @@
 	if (err)
 		goto out_kfree;
 
-	spin_lock_irqsave(&bcm->lock, flags);
+	bcm43xx_lock_mmio(bcm, flags);
 	err = -ENODEV;
-	if (!bcm->initialized)
-		goto out_unlock;
-	err = bcm43xx_sprom_write(bcm, sprom);
-out_unlock:
-	spin_unlock_irqrestore(&bcm->lock, flags);
+	if (bcm->initialized)
+		err = bcm43xx_sprom_write(bcm, sprom);
+	bcm43xx_unlock_mmio(bcm, flags);
 out_kfree:
 	kfree(sprom);
 out: