diff options
author | Michael Buesch <mb@bu3sch.de> | 2007-09-28 08:22:33 -0400 |
---|---|---|
committer | David S. Miller <davem@sunset.davemloft.net> | 2007-10-10 19:54:13 -0400 |
commit | 42bb4cd5ae320dd46630533fecb91b940d4468e2 (patch) | |
tree | 13635dd2a2457f53f4ff09a6b429f8e4ac23c246 /drivers/net/wireless/b43/main.c | |
parent | 8e9f7529fdfe34ed519f048682eb404fbd8004e8 (diff) |
[B43]: Use input-polldev for the rfkill switch
This removes the direct call to rfkill on an rfkill event
and replaces it with an input device. This way userspace is also
notified about the event.
Signed-off-by: Michael Buesch <mb@bu3sch.de>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net/wireless/b43/main.c')
-rw-r--r-- | drivers/net/wireless/b43/main.c | 53 |
1 files changed, 12 insertions, 41 deletions
diff --git a/drivers/net/wireless/b43/main.c b/drivers/net/wireless/b43/main.c index a9f7148493f7..a603a154d496 100644 --- a/drivers/net/wireless/b43/main.c +++ b/drivers/net/wireless/b43/main.c | |||
@@ -2143,21 +2143,6 @@ static void b43_mgmtframe_txantenna(struct b43_wldev *dev, int antenna) | |||
2143 | b43_shm_write16(dev, B43_SHM_SHARED, B43_SHM_SH_PRPHYCTL, tmp); | 2143 | b43_shm_write16(dev, B43_SHM_SHARED, B43_SHM_SH_PRPHYCTL, tmp); |
2144 | } | 2144 | } |
2145 | 2145 | ||
2146 | /* Returns TRUE, if the radio is enabled in hardware. */ | ||
2147 | static bool b43_is_hw_radio_enabled(struct b43_wldev *dev) | ||
2148 | { | ||
2149 | if (dev->phy.rev >= 3) { | ||
2150 | if (!(b43_read32(dev, B43_MMIO_RADIO_HWENABLED_HI) | ||
2151 | & B43_MMIO_RADIO_HWENABLED_HI_MASK)) | ||
2152 | return 1; | ||
2153 | } else { | ||
2154 | if (b43_read16(dev, B43_MMIO_RADIO_HWENABLED_LO) | ||
2155 | & B43_MMIO_RADIO_HWENABLED_LO_MASK) | ||
2156 | return 1; | ||
2157 | } | ||
2158 | return 0; | ||
2159 | } | ||
2160 | |||
2161 | /* This is the opposite of b43_chip_init() */ | 2146 | /* This is the opposite of b43_chip_init() */ |
2162 | static void b43_chip_exit(struct b43_wldev *dev) | 2147 | static void b43_chip_exit(struct b43_wldev *dev) |
2163 | { | 2148 | { |
@@ -2350,32 +2335,18 @@ static void b43_periodic_every15sec(struct b43_wldev *dev) | |||
2350 | //TODO for APHY (temperature?) | 2335 | //TODO for APHY (temperature?) |
2351 | } | 2336 | } |
2352 | 2337 | ||
2353 | static void b43_periodic_every1sec(struct b43_wldev *dev) | ||
2354 | { | ||
2355 | bool radio_hw_enable; | ||
2356 | |||
2357 | /* check if radio hardware enabled status changed */ | ||
2358 | radio_hw_enable = b43_is_hw_radio_enabled(dev); | ||
2359 | if (unlikely(dev->radio_hw_enable != radio_hw_enable)) { | ||
2360 | dev->radio_hw_enable = radio_hw_enable; | ||
2361 | b43_rfkill_toggled(dev, radio_hw_enable); | ||
2362 | } | ||
2363 | } | ||
2364 | |||
2365 | static void do_periodic_work(struct b43_wldev *dev) | 2338 | static void do_periodic_work(struct b43_wldev *dev) |
2366 | { | 2339 | { |
2367 | unsigned int state; | 2340 | unsigned int state; |
2368 | 2341 | ||
2369 | state = dev->periodic_state; | 2342 | state = dev->periodic_state; |
2370 | if (state % 120 == 0) | 2343 | if (state % 8 == 0) |
2371 | b43_periodic_every120sec(dev); | 2344 | b43_periodic_every120sec(dev); |
2372 | if (state % 60 == 0) | 2345 | if (state % 4 == 0) |
2373 | b43_periodic_every60sec(dev); | 2346 | b43_periodic_every60sec(dev); |
2374 | if (state % 30 == 0) | 2347 | if (state % 2 == 0) |
2375 | b43_periodic_every30sec(dev); | 2348 | b43_periodic_every30sec(dev); |
2376 | if (state % 15 == 0) | 2349 | b43_periodic_every15sec(dev); |
2377 | b43_periodic_every15sec(dev); | ||
2378 | b43_periodic_every1sec(dev); | ||
2379 | } | 2350 | } |
2380 | 2351 | ||
2381 | /* Estimate a "Badness" value based on the periodic work | 2352 | /* Estimate a "Badness" value based on the periodic work |
@@ -2386,13 +2357,11 @@ static int estimate_periodic_work_badness(unsigned int state) | |||
2386 | { | 2357 | { |
2387 | int badness = 0; | 2358 | int badness = 0; |
2388 | 2359 | ||
2389 | if (state % 120 == 0) /* every 120 sec */ | 2360 | if (state % 8 == 0) /* every 120 sec */ |
2390 | badness += 10; | 2361 | badness += 10; |
2391 | if (state % 60 == 0) /* every 60 sec */ | 2362 | if (state % 4 == 0) /* every 60 sec */ |
2392 | badness += 5; | 2363 | badness += 5; |
2393 | if (state % 30 == 0) /* every 30 sec */ | 2364 | if (state % 2 == 0) /* every 30 sec */ |
2394 | badness += 1; | ||
2395 | if (state % 15 == 0) /* every 15 sec */ | ||
2396 | badness += 1; | 2365 | badness += 1; |
2397 | 2366 | ||
2398 | #define BADNESS_LIMIT 4 | 2367 | #define BADNESS_LIMIT 4 |
@@ -2443,13 +2412,13 @@ static void b43_periodic_work_handler(struct work_struct *work) | |||
2443 | spin_unlock_irqrestore(&dev->wl->irq_lock, flags); | 2412 | spin_unlock_irqrestore(&dev->wl->irq_lock, flags); |
2444 | } | 2413 | } |
2445 | dev->periodic_state++; | 2414 | dev->periodic_state++; |
2446 | out_requeue: | 2415 | out_requeue: |
2447 | if (b43_debug(dev, B43_DBG_PWORK_FAST)) | 2416 | if (b43_debug(dev, B43_DBG_PWORK_FAST)) |
2448 | delay = msecs_to_jiffies(50); | 2417 | delay = msecs_to_jiffies(50); |
2449 | else | 2418 | else |
2450 | delay = round_jiffies(HZ); | 2419 | delay = round_jiffies(HZ * 15); |
2451 | queue_delayed_work(dev->wl->hw->workqueue, &dev->periodic_work, delay); | 2420 | queue_delayed_work(dev->wl->hw->workqueue, &dev->periodic_work, delay); |
2452 | out: | 2421 | out: |
2453 | mutex_unlock(&dev->wl->mutex); | 2422 | mutex_unlock(&dev->wl->mutex); |
2454 | } | 2423 | } |
2455 | 2424 | ||
@@ -3720,6 +3689,7 @@ static int b43_setup_modes(struct b43_wldev *dev, | |||
3720 | 3689 | ||
3721 | static void b43_wireless_core_detach(struct b43_wldev *dev) | 3690 | static void b43_wireless_core_detach(struct b43_wldev *dev) |
3722 | { | 3691 | { |
3692 | b43_rfkill_free(dev); | ||
3723 | /* We release firmware that late to not be required to re-request | 3693 | /* We release firmware that late to not be required to re-request |
3724 | * is all the time when we reinit the core. */ | 3694 | * is all the time when we reinit the core. */ |
3725 | b43_release_firmware(dev); | 3695 | b43_release_firmware(dev); |
@@ -3805,6 +3775,7 @@ static int b43_wireless_core_attach(struct b43_wldev *dev) | |||
3805 | if (!wl->current_dev) | 3775 | if (!wl->current_dev) |
3806 | wl->current_dev = dev; | 3776 | wl->current_dev = dev; |
3807 | INIT_WORK(&dev->restart_work, b43_chip_reset); | 3777 | INIT_WORK(&dev->restart_work, b43_chip_reset); |
3778 | b43_rfkill_alloc(dev); | ||
3808 | 3779 | ||
3809 | b43_radio_turn_off(dev, 1); | 3780 | b43_radio_turn_off(dev, 1); |
3810 | b43_switch_analog(dev, 0); | 3781 | b43_switch_analog(dev, 0); |