aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorMichael Buesch <mb@bu3sch.de>2008-01-09 14:15:31 -0500
committerDavid S. Miller <davem@davemloft.net>2008-01-28 18:10:42 -0500
commitbfe6a50156ab0c33729378fae7038bce3c6c5184 (patch)
tree4d29fdaa77eef7772eadab31033227e49e67c911 /drivers
parenta8bdf29c6cd117644d27677962fe832b33036c77 (diff)
b43legacy: Remove the PHY spinlock
This fixes a sparse warning about weird locking. The spinlock is not needed, so simply remove it. This also adds some sanity checks to the PHY and radio locking to protect against recursive locking. Signed-off-by: Michael Buesch <mb@bu3sch.de> Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'drivers')
-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}