Hi,
the code in bcm43xx_wc.c:bcm43xx_wx_set_channelfreq() passes the value
unchanged to bcm43xx_freq_to_channel() which leads to mistakes, because
bcm43xx_freq_to_channel() expects the frequency in MHz, but the value
given to bcm43xx_wx_set_channelfreq() might be scaled somehow different.
Also passing the internal frequency value in bcm43xx_wx_get_rangeparams()
to userland is not correct. The frequency is in MHz, but the factor
passed to userland is freq*10^1.
#v+
--- /home/joerg/bcm43xx_wx.c 2007-02-07 11:25:19.000000000 +0100
+++ bcm43xx_wx.c 2007-02-07 11:09:46.000000000 +0100
@@ -108,16 +108,21 @@
u8 channel;
int freq;
int err = -EINVAL;
+ s16 ex;
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;
+ ex = 6 - data->freq.e;
+ while (--ex >= 0) /* scale down the frequency to MHz */
+ freq /= 10;
+ channel = bcm43xx_freq_to_channel(bcm, freq);
}
if (!ieee80211_is_valid_channel(bcm->ieee, channel))
goto out_unlock;
@@ -295,7 +300,7 @@
break;
range->freq[j].i = j + 1;
range->freq[j].m = geo->bg[i].freq;//FIXME?
- range->freq[j].e = 1;
+ range->freq[j].e = 6;
j++;
}
range->num_frequency = j;
@@ -439,7 +444,7 @@
u16 maxpower;
if ((data->txpower.flags & IW_TXPOW_TYPE) != IW_TXPOW_DBM) {
- printk(PFX KERN_ERR "TX power not in dBm.\n");
+ printk(KERN_ERR PFX "TX power not in dBm.\n");
return -EOPNOTSUPP;
}
#v-
linux: 2.6.20
Bye, Jörg.
--
Die Erde ist das einzigste Irrenhaus, das von seinen eigenen Insassen
verwaltet wird.
(U. Schmidt)
_______________________________________________
Bcm43xx-dev mailing list
[email protected]
https://lists.berlios.de/mailman/listinfo/bcm43xx-dev