[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>
This commit is contained in:
parent
ad3f086c49
commit
10d8dd88dc
3 changed files with 60 additions and 38 deletions
|
@ -1169,7 +1169,7 @@ static void bcm43xx_geo_init(struct bcm43xx_private *bcm)
|
|||
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 @@ static void bcm43xx_geo_init(struct bcm43xx_private *bcm)
|
|||
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;
|
||||
|
|
|
@ -187,58 +187,78 @@ struct bcm43xx_xmitstatus_queue {
|
|||
|
||||
/* 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);
|
||||
|
|
|
@ -111,8 +111,9 @@ static int bcm43xx_wx_set_channelfreq(struct net_device *net_dev,
|
|||
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 @@ static int bcm43xx_wx_set_channelfreq(struct net_device *net_dev,
|
|||
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;
|
||||
|
|
Loading…
Reference in a new issue