aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net
diff options
context:
space:
mode:
authorRafał Miłecki <zajec5@gmail.com>2014-04-05 12:08:25 -0400
committerJohn W. Linville <linville@tuxdriver.com>2014-04-09 13:55:55 -0400
commit12cd43c6ed6da7bf7c5afbd74da6959cda6d056b (patch)
tree004d53fe04ff6e60c6f08c45abd81ec3e2b01754 /drivers/net
parent5212f518ac0f5141d4da3c9c75666a2146c7e772 (diff)
b43: Fix machine check error due to improper access of B43_MMIO_PSM_PHY_HDR
Register B43_MMIO_PSM_PHY_HDR is 16 bit one, so accessing it with 32b functions isn't safe. On my machine it causes delayed (!) CPU exception: Disabling lock debugging due to kernel taint mce: [Hardware Error]: CPU 0: Machine Check Exception: 4 Bank 4: b200000000070f0f mce: [Hardware Error]: TSC 164083803dc mce: [Hardware Error]: PROCESSOR 2:20fc2 TIME 1396650505 SOCKET 0 APIC 0 microcode 0 mce: [Hardware Error]: Run the above through 'mcelog --ascii' mce: [Hardware Error]: Machine check: Processor context corrupt Kernel panic - not syncing: Fatal machine check on current CPU Kernel Offset: 0x0 from 0xffffffff81000000 (relocation range: 0xffffffff80000000-0xffffffff9fffffff) Signed-off-by: Rafał Miłecki <zajec5@gmail.com> Acked-by: Larry Finger <Larry.Finger@lwfinger.net> Cc: Stable <stable@vger.kernel.org> [2.6.35+] Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'drivers/net')
-rw-r--r--drivers/net/wireless/b43/phy_n.c14
1 files changed, 7 insertions, 7 deletions
diff --git a/drivers/net/wireless/b43/phy_n.c b/drivers/net/wireless/b43/phy_n.c
index 05ee7f10cc8f..24ccbe96e0c8 100644
--- a/drivers/net/wireless/b43/phy_n.c
+++ b/drivers/net/wireless/b43/phy_n.c
@@ -5176,22 +5176,22 @@ static void b43_nphy_channel_setup(struct b43_wldev *dev,
5176 int ch = new_channel->hw_value; 5176 int ch = new_channel->hw_value;
5177 5177
5178 u16 old_band_5ghz; 5178 u16 old_band_5ghz;
5179 u32 tmp32; 5179 u16 tmp16;
5180 5180
5181 old_band_5ghz = 5181 old_band_5ghz =
5182 b43_phy_read(dev, B43_NPHY_BANDCTL) & B43_NPHY_BANDCTL_5GHZ; 5182 b43_phy_read(dev, B43_NPHY_BANDCTL) & B43_NPHY_BANDCTL_5GHZ;
5183 if (new_channel->band == IEEE80211_BAND_5GHZ && !old_band_5ghz) { 5183 if (new_channel->band == IEEE80211_BAND_5GHZ && !old_band_5ghz) {
5184 tmp32 = b43_read32(dev, B43_MMIO_PSM_PHY_HDR); 5184 tmp16 = b43_read16(dev, B43_MMIO_PSM_PHY_HDR);
5185 b43_write32(dev, B43_MMIO_PSM_PHY_HDR, tmp32 | 4); 5185 b43_write16(dev, B43_MMIO_PSM_PHY_HDR, tmp16 | 4);
5186 b43_phy_set(dev, B43_PHY_B_BBCFG, 0xC000); 5186 b43_phy_set(dev, B43_PHY_B_BBCFG, 0xC000);
5187 b43_write32(dev, B43_MMIO_PSM_PHY_HDR, tmp32); 5187 b43_write16(dev, B43_MMIO_PSM_PHY_HDR, tmp16);
5188 b43_phy_set(dev, B43_NPHY_BANDCTL, B43_NPHY_BANDCTL_5GHZ); 5188 b43_phy_set(dev, B43_NPHY_BANDCTL, B43_NPHY_BANDCTL_5GHZ);
5189 } else if (new_channel->band == IEEE80211_BAND_2GHZ && old_band_5ghz) { 5189 } else if (new_channel->band == IEEE80211_BAND_2GHZ && old_band_5ghz) {
5190 b43_phy_mask(dev, B43_NPHY_BANDCTL, ~B43_NPHY_BANDCTL_5GHZ); 5190 b43_phy_mask(dev, B43_NPHY_BANDCTL, ~B43_NPHY_BANDCTL_5GHZ);
5191 tmp32 = b43_read32(dev, B43_MMIO_PSM_PHY_HDR); 5191 tmp16 = b43_read16(dev, B43_MMIO_PSM_PHY_HDR);
5192 b43_write32(dev, B43_MMIO_PSM_PHY_HDR, tmp32 | 4); 5192 b43_write16(dev, B43_MMIO_PSM_PHY_HDR, tmp16 | 4);
5193 b43_phy_mask(dev, B43_PHY_B_BBCFG, 0x3FFF); 5193 b43_phy_mask(dev, B43_PHY_B_BBCFG, 0x3FFF);
5194 b43_write32(dev, B43_MMIO_PSM_PHY_HDR, tmp32); 5194 b43_write16(dev, B43_MMIO_PSM_PHY_HDR, tmp16);
5195 } 5195 }
5196 5196
5197 b43_chantab_phy_upload(dev, e); 5197 b43_chantab_phy_upload(dev, e);