aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/net/wireless/b43legacy/b43legacy.h16
-rw-r--r--drivers/net/wireless/b43legacy/main.c4
-rw-r--r--drivers/net/wireless/b43legacy/phy.c35
-rw-r--r--drivers/net/wireless/b43legacy/phy.h14
-rw-r--r--drivers/net/wireless/b43legacy/radio.c7
5 files changed, 28 insertions, 48 deletions
diff --git a/drivers/net/wireless/b43legacy/b43legacy.h b/drivers/net/wireless/b43legacy/b43legacy.h
index 8352a4e1cfc9..93419adb925e 100644
--- a/drivers/net/wireless/b43legacy/b43legacy.h
+++ b/drivers/net/wireless/b43legacy/b43legacy.h
@@ -415,7 +415,6 @@ struct b43legacy_phy {
415 u8 calibrated:1; 415 u8 calibrated:1;
416 u8 radio_rev; /* Radio revision */ 416 u8 radio_rev; /* Radio revision */
417 417
418 bool locked; /* Only used in b43legacy_phy_{un}lock() */
419 bool dyn_tssi_tbl; /* tssi2dbm is kmalloc()ed. */ 418 bool dyn_tssi_tbl; /* tssi2dbm is kmalloc()ed. */
420 419
421 /* ACI (adjacent channel interference) flags. */ 420 /* ACI (adjacent channel interference) flags. */
@@ -458,11 +457,6 @@ struct b43legacy_phy {
458 s16 lna_gain; /* LNA */ 457 s16 lna_gain; /* LNA */
459 s16 pga_gain; /* PGA */ 458 s16 pga_gain; /* PGA */
460 459
461 /* PHY lock for core.rev < 3
462 * This lock is only used by b43legacy_phy_{un}lock()
463 */
464 spinlock_t lock;
465
466 /* Desired TX power level (in dBm). This is set by the user and 460 /* Desired TX power level (in dBm). This is set by the user and
467 * adjusted in b43legacy_phy_xmitpower(). */ 461 * adjusted in b43legacy_phy_xmitpower(). */
468 u8 power_level; 462 u8 power_level;
@@ -486,9 +480,6 @@ struct b43legacy_phy {
486 u16 txpwr_offset; 480 u16 txpwr_offset;
487 }; 481 };
488 482
489#ifdef CONFIG_B43LEGACY_DEBUG
490 bool manual_txpower_control; /* Manual TX-power control enabled? */
491#endif
492 /* Current Interference Mitigation mode */ 483 /* Current Interference Mitigation mode */
493 int interfmode; 484 int interfmode;
494 /* Stack of saved values from the Interference Mitigation code. 485 /* Stack of saved values from the Interference Mitigation code.
@@ -516,6 +507,13 @@ struct b43legacy_phy {
516 507
517 /* PHY TX errors counter. */ 508 /* PHY TX errors counter. */
518 atomic_t txerr_cnt; 509 atomic_t txerr_cnt;
510
511#if B43legacy_DEBUG
512 /* Manual TX-power control enabled? */
513 bool manual_txpower_control;
514 /* PHY registers locked by b43legacy_phy_lock()? */
515 bool phy_locked;
516#endif /* B43legacy_DEBUG */
519}; 517};
520 518
521/* Data structures for DMA transmission, per 80211 core. */ 519/* Data structures for DMA transmission, per 80211 core. */
diff --git a/drivers/net/wireless/b43legacy/main.c b/drivers/net/wireless/b43legacy/main.c
index 2d5735ddad8c..4ed4243feeaa 100644
--- a/drivers/net/wireless/b43legacy/main.c
+++ b/drivers/net/wireless/b43legacy/main.c
@@ -2847,8 +2847,6 @@ static void setup_struct_phy_for_init(struct b43legacy_wldev *dev,
2847 memset(phy->minlowsig, 0xFF, sizeof(phy->minlowsig)); 2847 memset(phy->minlowsig, 0xFF, sizeof(phy->minlowsig));
2848 memset(phy->minlowsigpos, 0, sizeof(phy->minlowsigpos)); 2848 memset(phy->minlowsigpos, 0, sizeof(phy->minlowsigpos));
2849 2849
2850 /* Flags */
2851 phy->locked = 0;
2852 /* Assume the radio is enabled. If it's not enabled, the state will 2850 /* Assume the radio is enabled. If it's not enabled, the state will
2853 * immediately get fixed on the first periodic work run. */ 2851 * immediately get fixed on the first periodic work run. */
2854 dev->radio_hw_enable = 1; 2852 dev->radio_hw_enable = 1;
@@ -2881,7 +2879,6 @@ static void setup_struct_phy_for_init(struct b43legacy_wldev *dev,
2881 phy->lofcal = 0xFFFF; 2879 phy->lofcal = 0xFFFF;
2882 phy->initval = 0xFFFF; 2880 phy->initval = 0xFFFF;
2883 2881
2884 spin_lock_init(&phy->lock);
2885 phy->interfmode = B43legacy_INTERFMODE_NONE; 2882 phy->interfmode = B43legacy_INTERFMODE_NONE;
2886 phy->channel = 0xFF; 2883 phy->channel = 0xFF;
2887} 2884}
@@ -3013,7 +3010,6 @@ static void prepare_phy_data_for_init(struct b43legacy_wldev *dev)
3013 3010
3014 /* Flags */ 3011 /* Flags */
3015 phy->calibrated = 0; 3012 phy->calibrated = 0;
3016 phy->locked = 0;
3017 3013
3018 if (phy->_lo_pairs) 3014 if (phy->_lo_pairs)
3019 memset(phy->_lo_pairs, 0, 3015 memset(phy->_lo_pairs, 0,
diff --git a/drivers/net/wireless/b43legacy/phy.c b/drivers/net/wireless/b43legacy/phy.c
index 57c668f575fc..c16febbdbf5d 100644
--- a/drivers/net/wireless/b43legacy/phy.c
+++ b/drivers/net/wireless/b43legacy/phy.c
@@ -91,40 +91,36 @@ void b43legacy_voluntary_preempt(void)
91#endif /* CONFIG_PREEMPT */ 91#endif /* CONFIG_PREEMPT */
92} 92}
93 93
94void b43legacy_raw_phy_lock(struct b43legacy_wldev *dev) 94/* Lock the PHY registers against concurrent access from the microcode.
95 * This lock is nonrecursive. */
96void b43legacy_phy_lock(struct b43legacy_wldev *dev)
95{ 97{
96 struct b43legacy_phy *phy = &dev->phy; 98#if B43legacy_DEBUG
99 B43legacy_WARN_ON(dev->phy.phy_locked);
100 dev->phy.phy_locked = 1;
101#endif
97 102
98 B43legacy_WARN_ON(!irqs_disabled());
99 if (b43legacy_read32(dev, B43legacy_MMIO_STATUS_BITFIELD) == 0) {
100 phy->locked = 0;
101 return;
102 }
103 if (dev->dev->id.revision < 3) { 103 if (dev->dev->id.revision < 3) {
104 b43legacy_mac_suspend(dev); 104 b43legacy_mac_suspend(dev);
105 spin_lock(&phy->lock);
106 } else { 105 } else {
107 if (!b43legacy_is_mode(dev->wl, IEEE80211_IF_TYPE_AP)) 106 if (!b43legacy_is_mode(dev->wl, IEEE80211_IF_TYPE_AP))
108 b43legacy_power_saving_ctl_bits(dev, -1, 1); 107 b43legacy_power_saving_ctl_bits(dev, -1, 1);
109 } 108 }
110 phy->locked = 1;
111} 109}
112 110
113void b43legacy_raw_phy_unlock(struct b43legacy_wldev *dev) 111void b43legacy_phy_unlock(struct b43legacy_wldev *dev)
114{ 112{
115 struct b43legacy_phy *phy = &dev->phy; 113#if B43legacy_DEBUG
114 B43legacy_WARN_ON(!dev->phy.phy_locked);
115 dev->phy.phy_locked = 0;
116#endif
116 117
117 B43legacy_WARN_ON(!irqs_disabled());
118 if (dev->dev->id.revision < 3) { 118 if (dev->dev->id.revision < 3) {
119 if (phy->locked) { 119 b43legacy_mac_enable(dev);
120 spin_unlock(&phy->lock);
121 b43legacy_mac_enable(dev);
122 }
123 } else { 120 } else {
124 if (!b43legacy_is_mode(dev->wl, IEEE80211_IF_TYPE_AP)) 121 if (!b43legacy_is_mode(dev->wl, IEEE80211_IF_TYPE_AP))
125 b43legacy_power_saving_ctl_bits(dev, -1, -1); 122 b43legacy_power_saving_ctl_bits(dev, -1, -1);
126 } 123 }
127 phy->locked = 0;
128} 124}
129 125
130u16 b43legacy_phy_read(struct b43legacy_wldev *dev, u16 offset) 126u16 b43legacy_phy_read(struct b43legacy_wldev *dev, u16 offset)
@@ -1789,7 +1785,6 @@ void b43legacy_phy_xmitpower(struct b43legacy_wldev *dev)
1789 s16 baseband_att_delta; 1785 s16 baseband_att_delta;
1790 s16 radio_attenuation; 1786 s16 radio_attenuation;
1791 s16 baseband_attenuation; 1787 s16 baseband_attenuation;
1792 unsigned long phylock_flags;
1793 1788
1794 if (phy->savedpctlreg == 0xFFFF) 1789 if (phy->savedpctlreg == 0xFFFF)
1795 return; 1790 return;
@@ -1944,13 +1939,13 @@ void b43legacy_phy_xmitpower(struct b43legacy_wldev *dev)
1944 phy->bbatt = baseband_attenuation; 1939 phy->bbatt = baseband_attenuation;
1945 1940
1946 /* Adjust the hardware */ 1941 /* Adjust the hardware */
1947 b43legacy_phy_lock(dev, phylock_flags); 1942 b43legacy_phy_lock(dev);
1948 b43legacy_radio_lock(dev); 1943 b43legacy_radio_lock(dev);
1949 b43legacy_radio_set_txpower_bg(dev, baseband_attenuation, 1944 b43legacy_radio_set_txpower_bg(dev, baseband_attenuation,
1950 radio_attenuation, txpower); 1945 radio_attenuation, txpower);
1951 b43legacy_phy_lo_mark_current_used(dev); 1946 b43legacy_phy_lo_mark_current_used(dev);
1952 b43legacy_radio_unlock(dev); 1947 b43legacy_radio_unlock(dev);
1953 b43legacy_phy_unlock(dev, phylock_flags); 1948 b43legacy_phy_unlock(dev);
1954} 1949}
1955 1950
1956static inline 1951static inline
diff --git a/drivers/net/wireless/b43legacy/phy.h b/drivers/net/wireless/b43legacy/phy.h
index efa4c5c54a86..ecbe409f9a94 100644
--- a/drivers/net/wireless/b43legacy/phy.h
+++ b/drivers/net/wireless/b43legacy/phy.h
@@ -171,18 +171,8 @@ void b43legacy_put_attenuation_into_ranges(int *_bbatt, int *_rfatt);
171 171
172struct b43legacy_wldev; 172struct b43legacy_wldev;
173 173
174void b43legacy_raw_phy_lock(struct b43legacy_wldev *dev); 174void b43legacy_phy_lock(struct b43legacy_wldev *dev);
175#define b43legacy_phy_lock(bcm, flags) \ 175void b43legacy_phy_unlock(struct b43legacy_wldev *dev);
176 do { \
177 local_irq_save(flags); \
178 b43legacy_raw_phy_lock(bcm); \
179 } while (0)
180void b43legacy_raw_phy_unlock(struct b43legacy_wldev *dev);
181#define b43legacy_phy_unlock(bcm, flags) \
182 do { \
183 b43legacy_raw_phy_unlock(bcm); \
184 local_irq_restore(flags); \
185 } while (0)
186 176
187/* Card uses the loopback gain stuff */ 177/* Card uses the loopback gain stuff */
188#define has_loopback_gain(phy) \ 178#define has_loopback_gain(phy) \
diff --git a/drivers/net/wireless/b43legacy/radio.c b/drivers/net/wireless/b43legacy/radio.c
index 1a72eb0f8f66..318a270cf9b4 100644
--- a/drivers/net/wireless/b43legacy/radio.c
+++ b/drivers/net/wireless/b43legacy/radio.c
@@ -92,6 +92,7 @@ void b43legacy_radio_lock(struct b43legacy_wldev *dev)
92 u32 status; 92 u32 status;
93 93
94 status = b43legacy_read32(dev, B43legacy_MMIO_STATUS_BITFIELD); 94 status = b43legacy_read32(dev, B43legacy_MMIO_STATUS_BITFIELD);
95 B43legacy_WARN_ON(status & B43legacy_SBF_RADIOREG_LOCK);
95 status |= B43legacy_SBF_RADIOREG_LOCK; 96 status |= B43legacy_SBF_RADIOREG_LOCK;
96 b43legacy_write32(dev, B43legacy_MMIO_STATUS_BITFIELD, status); 97 b43legacy_write32(dev, B43legacy_MMIO_STATUS_BITFIELD, status);
97 mmiowb(); 98 mmiowb();
@@ -104,6 +105,7 @@ void b43legacy_radio_unlock(struct b43legacy_wldev *dev)
104 105
105 b43legacy_read16(dev, B43legacy_MMIO_PHY_VER); /* dummy read */ 106 b43legacy_read16(dev, B43legacy_MMIO_PHY_VER); /* dummy read */
106 status = b43legacy_read32(dev, B43legacy_MMIO_STATUS_BITFIELD); 107 status = b43legacy_read32(dev, B43legacy_MMIO_STATUS_BITFIELD);
108 B43legacy_WARN_ON(!(status & B43legacy_SBF_RADIOREG_LOCK));
107 status &= ~B43legacy_SBF_RADIOREG_LOCK; 109 status &= ~B43legacy_SBF_RADIOREG_LOCK;
108 b43legacy_write32(dev, B43legacy_MMIO_STATUS_BITFIELD, status); 110 b43legacy_write32(dev, B43legacy_MMIO_STATUS_BITFIELD, status);
109 mmiowb(); 111 mmiowb();
@@ -284,12 +286,11 @@ u8 b43legacy_radio_aci_scan(struct b43legacy_wldev *dev)
284 unsigned int j; 286 unsigned int j;
285 unsigned int start; 287 unsigned int start;
286 unsigned int end; 288 unsigned int end;
287 unsigned long phylock_flags;
288 289
289 if (!((phy->type == B43legacy_PHYTYPE_G) && (phy->rev > 0))) 290 if (!((phy->type == B43legacy_PHYTYPE_G) && (phy->rev > 0)))
290 return 0; 291 return 0;
291 292
292 b43legacy_phy_lock(dev, phylock_flags); 293 b43legacy_phy_lock(dev);
293 b43legacy_radio_lock(dev); 294 b43legacy_radio_lock(dev);
294 b43legacy_phy_write(dev, 0x0802, 295 b43legacy_phy_write(dev, 0x0802,
295 b43legacy_phy_read(dev, 0x0802) & 0xFFFC); 296 b43legacy_phy_read(dev, 0x0802) & 0xFFFC);
@@ -323,7 +324,7 @@ u8 b43legacy_radio_aci_scan(struct b43legacy_wldev *dev)
323 ret[j] = 1; 324 ret[j] = 1;
324 } 325 }
325 b43legacy_radio_unlock(dev); 326 b43legacy_radio_unlock(dev);
326 b43legacy_phy_unlock(dev, phylock_flags); 327 b43legacy_phy_unlock(dev);
327 328
328 return ret[channel - 1]; 329 return ret[channel - 1];
329} 330}