diff options
Diffstat (limited to 'drivers/net/wireless/b43legacy/radio.c')
-rw-r--r-- | drivers/net/wireless/b43legacy/radio.c | 39 |
1 files changed, 33 insertions, 6 deletions
diff --git a/drivers/net/wireless/b43legacy/radio.c b/drivers/net/wireless/b43legacy/radio.c index 2a11ee63f400..54067f082825 100644 --- a/drivers/net/wireless/b43legacy/radio.c +++ b/drivers/net/wireless/b43legacy/radio.c | |||
@@ -1767,6 +1767,17 @@ int b43legacy_radio_selectchannel(struct b43legacy_wldev *dev, | |||
1767 | { | 1767 | { |
1768 | struct b43legacy_phy *phy = &dev->phy; | 1768 | struct b43legacy_phy *phy = &dev->phy; |
1769 | 1769 | ||
1770 | if (channel == 0xFF) { | ||
1771 | switch (phy->type) { | ||
1772 | case B43legacy_PHYTYPE_B: | ||
1773 | case B43legacy_PHYTYPE_G: | ||
1774 | channel = B43legacy_RADIO_DEFAULT_CHANNEL_BG; | ||
1775 | break; | ||
1776 | default: | ||
1777 | B43legacy_WARN_ON(1); | ||
1778 | } | ||
1779 | } | ||
1780 | |||
1770 | /* TODO: Check if channel is valid - return -EINVAL if not */ | 1781 | /* TODO: Check if channel is valid - return -EINVAL if not */ |
1771 | if (synthetic_pu_workaround) | 1782 | if (synthetic_pu_workaround) |
1772 | b43legacy_synth_pu_workaround(dev, channel); | 1783 | b43legacy_synth_pu_workaround(dev, channel); |
@@ -2070,6 +2081,7 @@ void b43legacy_radio_turn_on(struct b43legacy_wldev *dev) | |||
2070 | { | 2081 | { |
2071 | struct b43legacy_phy *phy = &dev->phy; | 2082 | struct b43legacy_phy *phy = &dev->phy; |
2072 | int err; | 2083 | int err; |
2084 | u8 channel; | ||
2073 | 2085 | ||
2074 | might_sleep(); | 2086 | might_sleep(); |
2075 | 2087 | ||
@@ -2083,15 +2095,24 @@ void b43legacy_radio_turn_on(struct b43legacy_wldev *dev) | |||
2083 | b43legacy_phy_write(dev, 0x0015, 0xCC00); | 2095 | b43legacy_phy_write(dev, 0x0015, 0xCC00); |
2084 | b43legacy_phy_write(dev, 0x0015, | 2096 | b43legacy_phy_write(dev, 0x0015, |
2085 | (phy->gmode ? 0x00C0 : 0x0000)); | 2097 | (phy->gmode ? 0x00C0 : 0x0000)); |
2098 | if (phy->radio_off_context.valid) { | ||
2099 | /* Restore the RFover values. */ | ||
2100 | b43legacy_phy_write(dev, B43legacy_PHY_RFOVER, | ||
2101 | phy->radio_off_context.rfover); | ||
2102 | b43legacy_phy_write(dev, B43legacy_PHY_RFOVERVAL, | ||
2103 | phy->radio_off_context.rfoverval); | ||
2104 | phy->radio_off_context.valid = 0; | ||
2105 | } | ||
2106 | channel = phy->channel; | ||
2086 | err = b43legacy_radio_selectchannel(dev, | 2107 | err = b43legacy_radio_selectchannel(dev, |
2087 | B43legacy_RADIO_DEFAULT_CHANNEL_BG, 1); | 2108 | B43legacy_RADIO_DEFAULT_CHANNEL_BG, 1); |
2088 | B43legacy_WARN_ON(err != 0); | 2109 | err |= b43legacy_radio_selectchannel(dev, channel, 0); |
2110 | B43legacy_WARN_ON(err); | ||
2089 | break; | 2111 | break; |
2090 | default: | 2112 | default: |
2091 | B43legacy_BUG_ON(1); | 2113 | B43legacy_BUG_ON(1); |
2092 | } | 2114 | } |
2093 | phy->radio_on = 1; | 2115 | phy->radio_on = 1; |
2094 | b43legacydbg(dev->wl, "Radio turned on\n"); | ||
2095 | b43legacy_leds_update(dev, 0); | 2116 | b43legacy_leds_update(dev, 0); |
2096 | } | 2117 | } |
2097 | 2118 | ||
@@ -2100,10 +2121,16 @@ void b43legacy_radio_turn_off(struct b43legacy_wldev *dev) | |||
2100 | struct b43legacy_phy *phy = &dev->phy; | 2121 | struct b43legacy_phy *phy = &dev->phy; |
2101 | 2122 | ||
2102 | if (phy->type == B43legacy_PHYTYPE_G && dev->dev->id.revision >= 5) { | 2123 | if (phy->type == B43legacy_PHYTYPE_G && dev->dev->id.revision >= 5) { |
2103 | b43legacy_phy_write(dev, 0x0811, b43legacy_phy_read(dev, 0x0811) | 2124 | u16 rfover, rfoverval; |
2104 | | 0x008C); | 2125 | |
2105 | b43legacy_phy_write(dev, 0x0812, b43legacy_phy_read(dev, 0x0812) | 2126 | rfover = b43legacy_phy_read(dev, B43legacy_PHY_RFOVER); |
2106 | & 0xFF73); | 2127 | rfoverval = b43legacy_phy_read(dev, B43legacy_PHY_RFOVERVAL); |
2128 | phy->radio_off_context.rfover = rfover; | ||
2129 | phy->radio_off_context.rfoverval = rfoverval; | ||
2130 | phy->radio_off_context.valid = 1; | ||
2131 | b43legacy_phy_write(dev, B43legacy_PHY_RFOVER, rfover | 0x008C); | ||
2132 | b43legacy_phy_write(dev, B43legacy_PHY_RFOVERVAL, | ||
2133 | rfoverval & 0xFF73); | ||
2107 | } else | 2134 | } else |
2108 | b43legacy_phy_write(dev, 0x0015, 0xAA00); | 2135 | b43legacy_phy_write(dev, 0x0015, 0xAA00); |
2109 | phy->radio_on = 0; | 2136 | phy->radio_on = 0; |