b43legacy_set_beacon_int(dev, conf->beacon_int);
+ if (!!conf->radio_enabled != phy->radio_on) {
+ if (conf->radio_enabled) {
+ b43legacy_radio_turn_on(dev);
+ b43legacyinfo(dev->wl, "Radio turned on by software\n");
+ if (!dev->radio_hw_enable)
+ b43legacyinfo(dev->wl, "The hardware RF-kill"
+ " button still turns the radio"
+ " physically off. Press the"
+ " button to turn it on.\n");
+ } else {
+ b43legacy_radio_turn_off(dev);
+ b43legacyinfo(dev->wl, "Radio turned off by"
+ " software\n");
+ }
+ }
+
spin_lock_irqsave(&wl->irq_lock, flags);
b43legacy_interrupt_enable(dev, savedirqs);
mmiowb();
val -= 0x0202;
}
b43legacy_phy_write(dev, 0x03E4, 0x3000);
- if (phy->channel == 0xFF)
- b43legacy_radio_selectchannel(dev,
- B43legacy_RADIO_DEFAULT_CHANNEL_BG,
- 0);
- else
- b43legacy_radio_selectchannel(dev, phy->channel, 0);
+ b43legacy_radio_selectchannel(dev, phy->channel, 0);
if (phy->radio_ver != 0x2050) {
b43legacy_radio_write16(dev, 0x0075, 0x0080);
b43legacy_radio_write16(dev, 0x0079, 0x0081);
val -= 0x0202;
}
b43legacy_phy_write(dev, 0x03E4, 0x3000);
- if (phy->channel == 0xFF)
- b43legacy_radio_selectchannel(dev,
- B43legacy_RADIO_DEFAULT_CHANNEL_BG,
- 0);
- else
- b43legacy_radio_selectchannel(dev, phy->channel, 0);
+ b43legacy_radio_selectchannel(dev, phy->channel, 0);
if (phy->radio_ver != 0x2050) {
b43legacy_radio_write16(dev, 0x0075, 0x0080);
b43legacy_radio_write16(dev, 0x0079, 0x0081);
{
struct b43legacy_phy *phy = &dev->phy;
+ if (channel == 0xFF) {
+ switch (phy->type) {
+ case B43legacy_PHYTYPE_B:
+ case B43legacy_PHYTYPE_G:
+ channel = B43legacy_RADIO_DEFAULT_CHANNEL_BG;
+ break;
+ default:
+ B43legacy_WARN_ON(1);
+ }
+ }
+
/* TODO: Check if channel is valid - return -EINVAL if not */
if (synthetic_pu_workaround)
b43legacy_synth_pu_workaround(dev, channel);
{
struct b43legacy_phy *phy = &dev->phy;
int err;
+ u8 channel;
might_sleep();
b43legacy_phy_write(dev, 0x0015, 0xCC00);
b43legacy_phy_write(dev, 0x0015,
(phy->gmode ? 0x00C0 : 0x0000));
+ if (phy->radio_off_context.valid) {
+ /* Restore the RFover values. */
+ b43legacy_phy_write(dev, B43legacy_PHY_RFOVER,
+ phy->radio_off_context.rfover);
+ b43legacy_phy_write(dev, B43legacy_PHY_RFOVERVAL,
+ phy->radio_off_context.rfoverval);
+ phy->radio_off_context.valid = 0;
+ }
+ channel = phy->channel;
err = b43legacy_radio_selectchannel(dev,
B43legacy_RADIO_DEFAULT_CHANNEL_BG, 1);
- B43legacy_WARN_ON(err != 0);
+ err |= b43legacy_radio_selectchannel(dev, channel, 0);
+ B43legacy_WARN_ON(err);
break;
default:
B43legacy_BUG_ON(1);
}
phy->radio_on = 1;
- b43legacydbg(dev->wl, "Radio turned on\n");
b43legacy_leds_update(dev, 0);
}
struct b43legacy_phy *phy = &dev->phy;
if (phy->type == B43legacy_PHYTYPE_G && dev->dev->id.revision >= 5) {
- b43legacy_phy_write(dev, 0x0811, b43legacy_phy_read(dev, 0x0811)
- | 0x008C);
- b43legacy_phy_write(dev, 0x0812, b43legacy_phy_read(dev, 0x0812)
- & 0xFF73);
+ u16 rfover, rfoverval;
+
+ rfover = b43legacy_phy_read(dev, B43legacy_PHY_RFOVER);
+ rfoverval = b43legacy_phy_read(dev, B43legacy_PHY_RFOVERVAL);
+ phy->radio_off_context.rfover = rfover;
+ phy->radio_off_context.rfoverval = rfoverval;
+ phy->radio_off_context.valid = 1;
+ b43legacy_phy_write(dev, B43legacy_PHY_RFOVER, rfover | 0x008C);
+ b43legacy_phy_write(dev, B43legacy_PHY_RFOVERVAL,
+ rfoverval & 0xFF73);
} else
b43legacy_phy_write(dev, 0x0015, 0xAA00);
phy->radio_on = 0;