Linux Kernel
3.7.1
Main Page
Related Pages
Modules
Namespaces
Data Structures
Files
File List
Globals
All
Data Structures
Namespaces
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Macros
Groups
Pages
drivers
net
wireless
b43legacy
rfkill.c
Go to the documentation of this file.
1
/*
2
3
Broadcom B43 wireless driver
4
RFKILL support
5
6
Copyright (c) 2007 Michael Buesch <
[email protected]
>
7
8
This program is free software; you can redistribute it and/or modify
9
it under the terms of the GNU General Public License as published by
10
the Free Software Foundation; either version 2 of the License, or
11
(at your option) any later version.
12
13
This program is distributed in the hope that it will be useful,
14
but WITHOUT ANY WARRANTY; without even the implied warranty of
15
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16
GNU General Public License for more details.
17
18
You should have received a copy of the GNU General Public License
19
along with this program; see the file COPYING. If not, write to
20
the Free Software Foundation, Inc., 51 Franklin Steet, Fifth Floor,
21
Boston, MA 02110-1301, USA.
22
23
*/
24
25
#include "
radio.h
"
26
#include "
b43legacy.h
"
27
28
29
/* Returns TRUE, if the radio is enabled in hardware. */
30
bool
b43legacy_is_hw_radio_enabled
(
struct
b43legacy_wldev
*
dev
)
31
{
32
if
(dev->
dev
->id.revision >= 3) {
33
if
(!(b43legacy_read32(dev,
B43legacy_MMIO_RADIO_HWENABLED_HI
)
34
&
B43legacy_MMIO_RADIO_HWENABLED_HI_MASK
))
35
return
1;
36
}
else
{
37
/* To prevent CPU fault on PPC, do not read a register
38
* unless the interface is started; however, on resume
39
* for hibernation, this routine is entered early. When
40
* that happens, unconditionally return TRUE.
41
*/
42
if
(
b43legacy_status
(dev) <
B43legacy_STAT_STARTED
)
43
return
1;
44
if
(b43legacy_read16(dev,
B43legacy_MMIO_RADIO_HWENABLED_LO
)
45
&
B43legacy_MMIO_RADIO_HWENABLED_LO_MASK
)
46
return
1;
47
}
48
return
0;
49
}
50
51
/* The poll callback for the hardware button. */
52
void
b43legacy_rfkill_poll
(
struct
ieee80211_hw
*
hw
)
53
{
54
struct
b43legacy_wl
*wl = hw_to_b43legacy_wl(hw);
55
struct
b43legacy_wldev
*
dev
= wl->
current_dev
;
56
struct
ssb_bus
*
bus
= dev->
dev
->bus;
57
bool
enabled
;
58
bool
brought_up =
false
;
59
60
mutex_lock
(&wl->
mutex
);
61
if
(
unlikely
(
b43legacy_status
(dev) <
B43legacy_STAT_INITIALIZED
)) {
62
if
(
ssb_bus_powerup
(bus, 0)) {
63
mutex_unlock
(&wl->
mutex
);
64
return
;
65
}
66
ssb_device_enable
(dev->
dev
, 0);
67
brought_up =
true
;
68
}
69
70
enabled =
b43legacy_is_hw_radio_enabled
(dev);
71
72
if
(
unlikely
(enabled != dev->
radio_hw_enable
)) {
73
dev->
radio_hw_enable
=
enabled
;
74
b43legacyinfo
(wl,
"Radio hardware status changed to %s\n"
,
75
enabled ?
"ENABLED"
:
"DISABLED"
);
76
wiphy_rfkill_set_hw_state
(hw->
wiphy
, !enabled);
77
if
(enabled != dev->
phy
.radio_on) {
78
if
(enabled)
79
b43legacy_radio_turn_on
(dev);
80
else
81
b43legacy_radio_turn_off
(dev, 0);
82
}
83
}
84
85
if
(brought_up) {
86
ssb_device_disable
(dev->
dev
, 0);
87
ssb_bus_may_powerdown
(bus);
88
}
89
90
mutex_unlock
(&wl->
mutex
);
91
}
Generated on Thu Jan 10 2013 14:08:37 for Linux Kernel by
1.8.2