aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMichael Buesch <mb@bu3sch.de>2008-01-09 13:08:49 -0500
committerDavid S. Miller <davem@davemloft.net>2008-01-28 18:09:32 -0500
commitf31800d8b79bc42e495070aa6e6425841b7bdcbf (patch)
tree65f26267ae5b6d3876079913330634392654af00
parent5250703e3144e50fbeceb4d1fc01ea2fd159fd4a (diff)
b43: 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>
-rw-r--r--drivers/net/wireless/b43/b43.h17
-rw-r--r--drivers/net/wireless/b43/debugfs.c6
-rw-r--r--drivers/net/wireless/b43/main.c4
-rw-r--r--drivers/net/wireless/b43/phy.c60
-rw-r--r--drivers/net/wireless/b43/phy.h14
5 files changed, 36 insertions, 65 deletions
diff --git a/drivers/net/wireless/b43/b43.h b/drivers/net/wireless/b43/b43.h
index 086a9c6c2b07..5a1a790a105b 100644
--- a/drivers/net/wireless/b43/b43.h
+++ b/drivers/net/wireless/b43/b43.h
@@ -476,7 +476,6 @@ struct b43_phy {
476 u16 radio_ver; /* Radio version */ 476 u16 radio_ver; /* Radio version */
477 u8 radio_rev; /* Radio revision */ 477 u8 radio_rev; /* Radio revision */
478 478
479 bool locked; /* Only used in b43_phy_{un}lock() */
480 bool dyn_tssi_tbl; /* tssi2dbm is kmalloc()ed. */ 479 bool dyn_tssi_tbl; /* tssi2dbm is kmalloc()ed. */
481 480
482 /* ACI (adjacent channel interference) flags. */ 481 /* ACI (adjacent channel interference) flags. */
@@ -513,11 +512,6 @@ struct b43_phy {
513 s16 lna_gain; /* LNA */ 512 s16 lna_gain; /* LNA */
514 s16 pga_gain; /* PGA */ 513 s16 pga_gain; /* PGA */
515 514
516 /* PHY lock for core.rev < 3
517 * This lock is only used by b43_phy_{un}lock()
518 */
519 spinlock_t lock;
520
521 /* Desired TX power level (in dBm). 515 /* Desired TX power level (in dBm).
522 * This is set by the user and adjusted in b43_phy_xmitpower(). */ 516 * This is set by the user and adjusted in b43_phy_xmitpower(). */
523 u8 power_level; 517 u8 power_level;
@@ -528,9 +522,7 @@ struct b43_phy {
528 struct b43_bbatt bbatt; 522 struct b43_bbatt bbatt;
529 struct b43_rfatt rfatt; 523 struct b43_rfatt rfatt;
530 u8 tx_control; /* B43_TXCTL_XXX */ 524 u8 tx_control; /* B43_TXCTL_XXX */
531#ifdef CONFIG_B43_DEBUG 525
532 bool manual_txpower_control; /* Manual TX-power control enabled? */
533#endif
534 /* Hardware Power Control enabled? */ 526 /* Hardware Power Control enabled? */
535 bool hardware_power_control; 527 bool hardware_power_control;
536 528
@@ -571,6 +563,13 @@ struct b43_phy {
571 B43_OFDMTAB_DIRECTION_READ, 563 B43_OFDMTAB_DIRECTION_READ,
572 B43_OFDMTAB_DIRECTION_WRITE, 564 B43_OFDMTAB_DIRECTION_WRITE,
573 } ofdmtab_addr_direction; 565 } ofdmtab_addr_direction;
566
567#if B43_DEBUG
568 /* Manual TX-power control enabled? */
569 bool manual_txpower_control;
570 /* PHY registers locked by b43_phy_lock()? */
571 bool phy_locked;
572#endif /* B43_DEBUG */
574}; 573};
575 574
576/* Data structures for DMA transmission, per 80211 core. */ 575/* Data structures for DMA transmission, per 80211 core. */
diff --git a/drivers/net/wireless/b43/debugfs.c b/drivers/net/wireless/b43/debugfs.c
index 93e5030aa6c3..e38ed0fe72e9 100644
--- a/drivers/net/wireless/b43/debugfs.c
+++ b/drivers/net/wireless/b43/debugfs.c
@@ -222,8 +222,6 @@ out:
222static int txpower_g_write_file(struct b43_wldev *dev, 222static int txpower_g_write_file(struct b43_wldev *dev,
223 const char *buf, size_t count) 223 const char *buf, size_t count)
224{ 224{
225 unsigned long phy_flags;
226
227 if (dev->phy.type != B43_PHYTYPE_G) 225 if (dev->phy.type != B43_PHYTYPE_G)
228 return -ENODEV; 226 return -ENODEV;
229 if ((count >= 4) && (memcmp(buf, "auto", 4) == 0)) { 227 if ((count >= 4) && (memcmp(buf, "auto", 4) == 0)) {
@@ -247,12 +245,12 @@ static int txpower_g_write_file(struct b43_wldev *dev,
247 dev->phy.tx_control |= B43_TXCTL_PA2DB; 245 dev->phy.tx_control |= B43_TXCTL_PA2DB;
248 if (pa3db) 246 if (pa3db)
249 dev->phy.tx_control |= B43_TXCTL_PA3DB; 247 dev->phy.tx_control |= B43_TXCTL_PA3DB;
250 b43_phy_lock(dev, phy_flags); 248 b43_phy_lock(dev);
251 b43_radio_lock(dev); 249 b43_radio_lock(dev);
252 b43_set_txpower_g(dev, &dev->phy.bbatt, 250 b43_set_txpower_g(dev, &dev->phy.bbatt,
253 &dev->phy.rfatt, dev->phy.tx_control); 251 &dev->phy.rfatt, dev->phy.tx_control);
254 b43_radio_unlock(dev); 252 b43_radio_unlock(dev);
255 b43_phy_unlock(dev, phy_flags); 253 b43_phy_unlock(dev);
256 } 254 }
257 255
258 return 0; 256 return 0;
diff --git a/drivers/net/wireless/b43/main.c b/drivers/net/wireless/b43/main.c
index 7125af6f242a..ea63a9928803 100644
--- a/drivers/net/wireless/b43/main.c
+++ b/drivers/net/wireless/b43/main.c
@@ -3146,9 +3146,6 @@ static void setup_struct_phy_for_init(struct b43_wldev *dev,
3146 memset(phy->minlowsig, 0xFF, sizeof(phy->minlowsig)); 3146 memset(phy->minlowsig, 0xFF, sizeof(phy->minlowsig));
3147 memset(phy->minlowsigpos, 0, sizeof(phy->minlowsigpos)); 3147 memset(phy->minlowsigpos, 0, sizeof(phy->minlowsigpos));
3148 3148
3149 /* Flags */
3150 phy->locked = 0;
3151
3152 phy->aci_enable = 0; 3149 phy->aci_enable = 0;
3153 phy->aci_wlan_automatic = 0; 3150 phy->aci_wlan_automatic = 0;
3154 phy->aci_hw_rssi = 0; 3151 phy->aci_hw_rssi = 0;
@@ -3175,7 +3172,6 @@ static void setup_struct_phy_for_init(struct b43_wldev *dev,
3175 phy->lofcal = 0xFFFF; 3172 phy->lofcal = 0xFFFF;
3176 phy->initval = 0xFFFF; 3173 phy->initval = 0xFFFF;
3177 3174
3178 spin_lock_init(&phy->lock);
3179 phy->interfmode = B43_INTERFMODE_NONE; 3175 phy->interfmode = B43_INTERFMODE_NONE;
3180 phy->channel = 0xFF; 3176 phy->channel = 0xFF;
3181 3177
diff --git a/drivers/net/wireless/b43/phy.c b/drivers/net/wireless/b43/phy.c
index 67b8a922b337..2abf125aa2cf 100644
--- a/drivers/net/wireless/b43/phy.c
+++ b/drivers/net/wireless/b43/phy.c
@@ -228,42 +228,30 @@ static void b43_shm_clear_tssi(struct b43_wldev *dev)
228 } 228 }
229} 229}
230 230
231void b43_raw_phy_lock(struct b43_wldev *dev) 231/* Lock the PHY registers against concurrent access from the microcode.
232 * This lock is nonrecursive. */
233void b43_phy_lock(struct b43_wldev *dev)
232{ 234{
233 struct b43_phy *phy = &dev->phy; 235#if B43_DEBUG
234 236 B43_WARN_ON(dev->phy.phy_locked);
235 B43_WARN_ON(!irqs_disabled()); 237 dev->phy.phy_locked = 1;
236 238#endif
237 /* We had a check for MACCTL==0 here, but I think that doesn't 239 B43_WARN_ON(dev->dev->id.revision < 3);
238 * make sense, as MACCTL is never 0 when this is called.
239 * --mb */
240 B43_WARN_ON(b43_read32(dev, B43_MMIO_MACCTL) == 0);
241 240
242 if (dev->dev->id.revision < 3) { 241 if (!b43_is_mode(dev->wl, IEEE80211_IF_TYPE_AP))
243 b43_mac_suspend(dev); 242 b43_power_saving_ctl_bits(dev, B43_PS_AWAKE);
244 spin_lock(&phy->lock);
245 } else {
246 if (!b43_is_mode(dev->wl, IEEE80211_IF_TYPE_AP))
247 b43_power_saving_ctl_bits(dev, B43_PS_AWAKE);
248 }
249 phy->locked = 1;
250} 243}
251 244
252void b43_raw_phy_unlock(struct b43_wldev *dev) 245void b43_phy_unlock(struct b43_wldev *dev)
253{ 246{
254 struct b43_phy *phy = &dev->phy; 247#if B43_DEBUG
248 B43_WARN_ON(!dev->phy.phy_locked);
249 dev->phy.phy_locked = 0;
250#endif
251 B43_WARN_ON(dev->dev->id.revision < 3);
255 252
256 B43_WARN_ON(!irqs_disabled()); 253 if (!b43_is_mode(dev->wl, IEEE80211_IF_TYPE_AP))
257 if (dev->dev->id.revision < 3) { 254 b43_power_saving_ctl_bits(dev, 0);
258 if (phy->locked) {
259 spin_unlock(&phy->lock);
260 b43_mac_enable(dev);
261 }
262 } else {
263 if (!b43_is_mode(dev->wl, IEEE80211_IF_TYPE_AP))
264 b43_power_saving_ctl_bits(dev, 0);
265 }
266 phy->locked = 0;
267} 255}
268 256
269/* Different PHYs require different register routing flags. 257/* Different PHYs require different register routing flags.
@@ -1730,7 +1718,6 @@ void b43_phy_xmitpower(struct b43_wldev *dev)
1730 int rfatt_delta, bbatt_delta; 1718 int rfatt_delta, bbatt_delta;
1731 int rfatt, bbatt; 1719 int rfatt, bbatt;
1732 u8 tx_control; 1720 u8 tx_control;
1733 unsigned long phylock_flags;
1734 1721
1735 tmp = b43_shm_read16(dev, B43_SHM_SHARED, 0x0058); 1722 tmp = b43_shm_read16(dev, B43_SHM_SHARED, 0x0058);
1736 v0 = (s8) (tmp & 0x00FF); 1723 v0 = (s8) (tmp & 0x00FF);
@@ -1861,13 +1848,13 @@ void b43_phy_xmitpower(struct b43_wldev *dev)
1861 phy->bbatt.att = bbatt; 1848 phy->bbatt.att = bbatt;
1862 1849
1863 /* Adjust the hardware */ 1850 /* Adjust the hardware */
1864 b43_phy_lock(dev, phylock_flags); 1851 b43_phy_lock(dev);
1865 b43_radio_lock(dev); 1852 b43_radio_lock(dev);
1866 b43_set_txpower_g(dev, &phy->bbatt, &phy->rfatt, 1853 b43_set_txpower_g(dev, &phy->bbatt, &phy->rfatt,
1867 phy->tx_control); 1854 phy->tx_control);
1868 b43_lo_g_ctl_mark_cur_used(dev); 1855 b43_lo_g_ctl_mark_cur_used(dev);
1869 b43_radio_unlock(dev); 1856 b43_radio_unlock(dev);
1870 b43_phy_unlock(dev, phylock_flags); 1857 b43_phy_unlock(dev);
1871 break; 1858 break;
1872 } 1859 }
1873 default: 1860 default:
@@ -2158,6 +2145,7 @@ void b43_radio_lock(struct b43_wldev *dev)
2158 u32 macctl; 2145 u32 macctl;
2159 2146
2160 macctl = b43_read32(dev, B43_MMIO_MACCTL); 2147 macctl = b43_read32(dev, B43_MMIO_MACCTL);
2148 B43_WARN_ON(macctl & B43_MACCTL_RADIOLOCK);
2161 macctl |= B43_MACCTL_RADIOLOCK; 2149 macctl |= B43_MACCTL_RADIOLOCK;
2162 b43_write32(dev, B43_MMIO_MACCTL, macctl); 2150 b43_write32(dev, B43_MMIO_MACCTL, macctl);
2163 /* Commit the write and wait for the device 2151 /* Commit the write and wait for the device
@@ -2174,6 +2162,7 @@ void b43_radio_unlock(struct b43_wldev *dev)
2174 b43_read16(dev, B43_MMIO_PHY_VER); 2162 b43_read16(dev, B43_MMIO_PHY_VER);
2175 /* unlock */ 2163 /* unlock */
2176 macctl = b43_read32(dev, B43_MMIO_MACCTL); 2164 macctl = b43_read32(dev, B43_MMIO_MACCTL);
2165 B43_WARN_ON(!(macctl & B43_MACCTL_RADIOLOCK));
2177 macctl &= ~B43_MACCTL_RADIOLOCK; 2166 macctl &= ~B43_MACCTL_RADIOLOCK;
2178 b43_write32(dev, B43_MMIO_MACCTL, macctl); 2167 b43_write32(dev, B43_MMIO_MACCTL, macctl);
2179} 2168}
@@ -2355,12 +2344,11 @@ u8 b43_radio_aci_scan(struct b43_wldev * dev)
2355 u8 ret[13]; 2344 u8 ret[13];
2356 unsigned int channel = phy->channel; 2345 unsigned int channel = phy->channel;
2357 unsigned int i, j, start, end; 2346 unsigned int i, j, start, end;
2358 unsigned long phylock_flags;
2359 2347
2360 if (!((phy->type == B43_PHYTYPE_G) && (phy->rev > 0))) 2348 if (!((phy->type == B43_PHYTYPE_G) && (phy->rev > 0)))
2361 return 0; 2349 return 0;
2362 2350
2363 b43_phy_lock(dev, phylock_flags); 2351 b43_phy_lock(dev);
2364 b43_radio_lock(dev); 2352 b43_radio_lock(dev);
2365 b43_phy_write(dev, 0x0802, b43_phy_read(dev, 0x0802) & 0xFFFC); 2353 b43_phy_write(dev, 0x0802, b43_phy_read(dev, 0x0802) & 0xFFFC);
2366 b43_phy_write(dev, B43_PHY_G_CRS, 2354 b43_phy_write(dev, B43_PHY_G_CRS,
@@ -2389,7 +2377,7 @@ u8 b43_radio_aci_scan(struct b43_wldev * dev)
2389 ret[j] = 1; 2377 ret[j] = 1;
2390 } 2378 }
2391 b43_radio_unlock(dev); 2379 b43_radio_unlock(dev);
2392 b43_phy_unlock(dev, phylock_flags); 2380 b43_phy_unlock(dev);
2393 2381
2394 return ret[channel - 1]; 2382 return ret[channel - 1];
2395} 2383}
diff --git a/drivers/net/wireless/b43/phy.h b/drivers/net/wireless/b43/phy.h
index 4ee01d534ba1..31bd4d87b404 100644
--- a/drivers/net/wireless/b43/phy.h
+++ b/drivers/net/wireless/b43/phy.h
@@ -199,18 +199,8 @@ enum {
199#define B43_PHYVER_TYPE_SHIFT 8 199#define B43_PHYVER_TYPE_SHIFT 8
200#define B43_PHYVER_VERSION 0x00FF 200#define B43_PHYVER_VERSION 0x00FF
201 201
202void b43_raw_phy_lock(struct b43_wldev *dev); 202void b43_phy_lock(struct b43_wldev *dev);
203#define b43_phy_lock(dev, flags) \ 203void b43_phy_unlock(struct b43_wldev *dev);
204 do { \
205 local_irq_save(flags); \
206 b43_raw_phy_lock(dev); \
207 } while (0)
208void b43_raw_phy_unlock(struct b43_wldev *dev);
209#define b43_phy_unlock(dev, flags) \
210 do { \
211 b43_raw_phy_unlock(dev); \
212 local_irq_restore(flags); \
213 } while (0)
214 204
215u16 b43_phy_read(struct b43_wldev *dev, u16 offset); 205u16 b43_phy_read(struct b43_wldev *dev, u16 offset);
216void b43_phy_write(struct b43_wldev *dev, u16 offset, u16 val); 206void b43_phy_write(struct b43_wldev *dev, u16 offset, u16 val);