[PATCH] bcm43xx: split the channel helper functions, so that they can be used without a valid running core.

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_main.c b/drivers/net/wireless/bcm43xx/bcm43xx_main.c
index b4767e4..6195c2a 100644
--- a/drivers/net/wireless/bcm43xx/bcm43xx_main.c
+++ b/drivers/net/wireless/bcm43xx/bcm43xx_main.c
@@ -1169,7 +1169,7 @@
  	if (have_a) {
 		for (i = 0, channel = 0; channel < 201; channel++) {
 			chan = &geo.a[i++];
-			chan->freq = bcm43xx_channel_to_freq(bcm, channel);
+			chan->freq = bcm43xx_channel_to_freq_a(channel);
 			chan->channel = channel;
 		}
 		geo.a_channels = i;
@@ -1177,7 +1177,7 @@
 	if (have_bg) {
 		for (i = 0, channel = 1; channel < 15; channel++) {
 			chan = &geo.bg[i++];
-			chan->freq = bcm43xx_channel_to_freq(bcm, channel);
+			chan->freq = bcm43xx_channel_to_freq_bg(channel);
 			chan->channel = channel;
 		}
 		geo.bg_channels = i;
diff --git a/drivers/net/wireless/bcm43xx/bcm43xx_main.h b/drivers/net/wireless/bcm43xx/bcm43xx_main.h
index 0a22e83..7d696d2 100644
--- a/drivers/net/wireless/bcm43xx/bcm43xx_main.h
+++ b/drivers/net/wireless/bcm43xx/bcm43xx_main.h
@@ -187,58 +187,78 @@
 
 /* Lightweight function to convert a frequency (in Mhz) to a channel number. */
 static inline
-u8 bcm43xx_freq_to_channel(struct bcm43xx_private *bcm,
-			   int freq)
+u8 bcm43xx_freq_to_channel_a(int freq)
+{
+	return ((freq - 5000) / 5);
+}
+static inline
+u8 bcm43xx_freq_to_channel_bg(int freq)
 {
 	u8 channel;
 
-	if (bcm->current_core->phy->type == BCM43xx_PHYTYPE_A) {
-		channel = (freq - 5000) / 5;
-	} else {
-		if (freq == 2484)
-			channel = 14;
-		else
-			channel = (freq - 2407) / 5;
-	}
+	if (freq == 2484)
+		channel = 14;
+	else
+		channel = (freq - 2407) / 5;
 
 	return channel;
 }
+static inline
+u8 bcm43xx_freq_to_channel(struct bcm43xx_private *bcm,
+			   int freq)
+{
+	if (bcm->current_core->phy->type == BCM43xx_PHYTYPE_A)
+		return bcm43xx_freq_to_channel_a(freq);
+	return bcm43xx_freq_to_channel_bg(freq);
+}
 
 /* Lightweight function to convert a channel number to a frequency (in Mhz). */
 static inline
-int bcm43xx_channel_to_freq(struct bcm43xx_private *bcm,
-			    u8 channel)
+int bcm43xx_channel_to_freq_a(u8 channel)
+{
+	return (5000 + (5 * channel));
+}
+static inline
+int bcm43xx_channel_to_freq_bg(u8 channel)
 {
 	int freq;
 
-	if (bcm->current_core->phy->type == BCM43xx_PHYTYPE_A) {
-		freq = 5000 + (5 * channel);
-	} else {
-		if (channel == 14)
-			freq = 2484;
-		else
-			freq = 2407 + (5 * channel);
-	}
+	if (channel == 14)
+		freq = 2484;
+	else
+		freq = 2407 + (5 * channel);
 
 	return freq;
 }
+static inline
+int bcm43xx_channel_to_freq(struct bcm43xx_private *bcm,
+			    u8 channel)
+{
+	if (bcm->current_core->phy->type == BCM43xx_PHYTYPE_A)
+		return bcm43xx_channel_to_freq_a(channel);
+	return bcm43xx_channel_to_freq_bg(channel);
+}
 
 /* Lightweight function to check if a channel number is valid.
  * Note that this does _NOT_ check for geographical restrictions!
  */
 static inline
-int bcm43xx_is_valid_channel(struct bcm43xx_private *bcm,
-			    u8 channel)
+int bcm43xx_is_valid_channel_a(u8 channel)
 {
-	if (bcm->current_core->phy->type == BCM43xx_PHYTYPE_A) {
-		if (channel <= 200)
-			return 1;
-	} else {
-		if (channel >= 1 && channel <= 14)
-			return 1;
-	}
-
-	return 0;
+	return (channel <= 200);
+}
+static inline
+int bcm43xx_is_valid_channel_bg(u8 channel)
+{
+	return (channel >= 1 && channel <= 14);
+}
+static inline
+int bcm43xx_is_valid_channel(struct bcm43xx_private *bcm,
+			     u8 channel)
+{
+	if (bcm->current_core->phy->type == BCM43xx_PHYTYPE_A)
+		return bcm43xx_is_valid_channel_a(channel);
+	return bcm43xx_is_valid_channel_bg(channel);
 }
 
 void bcm43xx_tsf_read(struct bcm43xx_private *bcm, u64 *tsf);
diff --git a/drivers/net/wireless/bcm43xx/bcm43xx_wx.c b/drivers/net/wireless/bcm43xx/bcm43xx_wx.c
index df37d28..aa2d993 100644
--- a/drivers/net/wireless/bcm43xx/bcm43xx_wx.c
+++ b/drivers/net/wireless/bcm43xx/bcm43xx_wx.c
@@ -111,8 +111,9 @@
 	unsigned long flags;
 	u8 channel;
 	int freq;
-	int err = 0;
+	int err = -EINVAL;
 
+	spin_lock_irqsave(&bcm->lock, flags);
 	if ((data->freq.m >= 0) && (data->freq.m <= 1000)) {
 		channel = data->freq.m;
 		freq = bcm43xx_channel_to_freq(bcm, channel);
@@ -121,16 +122,17 @@
 		freq = data->freq.m;
 	}
 	if (!bcm43xx_is_valid_channel(bcm, channel))
-		return -EINVAL;
-
-	spin_lock_irqsave(&bcm->lock, flags);
+		goto out_unlock;
 	if (bcm->initialized) {
 		//ieee80211softmac_disassoc(softmac, $REASON);
 		bcm43xx_mac_suspend(bcm);
 		err = bcm43xx_radio_selectchannel(bcm, channel, 0);
 		bcm43xx_mac_enable(bcm);
-	} else
+	} else {
 		bcm->current_core->radio->initial_channel = channel;
+		err = 0;
+	}
+out_unlock:
 	spin_unlock_irqrestore(&bcm->lock, flags);
 
 	return err;