|
@@ -105,18 +105,24 @@ static int bcm43xx_wx_set_channelfreq(struct net_device *net_dev,
|
|
|
struct bcm43xx_private *bcm = bcm43xx_priv(net_dev);
|
|
|
unsigned long flags;
|
|
|
u8 channel;
|
|
|
+ s8 expon;
|
|
|
int freq;
|
|
|
int err = -EINVAL;
|
|
|
|
|
|
mutex_lock(&bcm->mutex);
|
|
|
spin_lock_irqsave(&bcm->irq_lock, flags);
|
|
|
|
|
|
- if ((data->freq.m >= 0) && (data->freq.m <= 1000)) {
|
|
|
+ if ((data->freq.e == 0) &&
|
|
|
+ (data->freq.m >= 0) && (data->freq.m <= 1000)) {
|
|
|
channel = data->freq.m;
|
|
|
freq = bcm43xx_channel_to_freq(bcm, channel);
|
|
|
} else {
|
|
|
- channel = bcm43xx_freq_to_channel(bcm, data->freq.m);
|
|
|
freq = data->freq.m;
|
|
|
+ expon = 6 - data->freq.e;
|
|
|
+ while (--expon >= 0) /* scale down the frequency to MHz */
|
|
|
+ freq /= 10;
|
|
|
+ assert(freq > 1000);
|
|
|
+ channel = bcm43xx_freq_to_channel(bcm, freq);
|
|
|
}
|
|
|
if (!ieee80211_is_valid_channel(bcm->ieee, channel))
|
|
|
goto out_unlock;
|