diff options
Diffstat (limited to 'Documentation')
-rw-r--r-- | Documentation/RCU/rculist_nulls.txt | 167 | ||||
-rw-r--r-- | Documentation/feature-removal-schedule.txt | 7 | ||||
-rw-r--r-- | Documentation/networking/README.ipw2200 | 2 | ||||
-rw-r--r-- | Documentation/networking/bonding.txt | 68 | ||||
-rw-r--r-- | Documentation/networking/dccp.txt | 7 | ||||
-rw-r--r-- | Documentation/networking/ip-sysctl.txt | 6 | ||||
-rw-r--r-- | Documentation/networking/regulatory.txt | 22 | ||||
-rw-r--r-- | Documentation/rfkill.txt | 20 |
8 files changed, 261 insertions, 38 deletions
diff --git a/Documentation/RCU/rculist_nulls.txt b/Documentation/RCU/rculist_nulls.txt new file mode 100644 index 000000000000..239f542d48ba --- /dev/null +++ b/Documentation/RCU/rculist_nulls.txt | |||
@@ -0,0 +1,167 @@ | |||
1 | Using hlist_nulls to protect read-mostly linked lists and | ||
2 | objects using SLAB_DESTROY_BY_RCU allocations. | ||
3 | |||
4 | Please read the basics in Documentation/RCU/listRCU.txt | ||
5 | |||
6 | Using special makers (called 'nulls') is a convenient way | ||
7 | to solve following problem : | ||
8 | |||
9 | A typical RCU linked list managing objects which are | ||
10 | allocated with SLAB_DESTROY_BY_RCU kmem_cache can | ||
11 | use following algos : | ||
12 | |||
13 | 1) Lookup algo | ||
14 | -------------- | ||
15 | rcu_read_lock() | ||
16 | begin: | ||
17 | obj = lockless_lookup(key); | ||
18 | if (obj) { | ||
19 | if (!try_get_ref(obj)) // might fail for free objects | ||
20 | goto begin; | ||
21 | /* | ||
22 | * Because a writer could delete object, and a writer could | ||
23 | * reuse these object before the RCU grace period, we | ||
24 | * must check key after geting the reference on object | ||
25 | */ | ||
26 | if (obj->key != key) { // not the object we expected | ||
27 | put_ref(obj); | ||
28 | goto begin; | ||
29 | } | ||
30 | } | ||
31 | rcu_read_unlock(); | ||
32 | |||
33 | Beware that lockless_lookup(key) cannot use traditional hlist_for_each_entry_rcu() | ||
34 | but a version with an additional memory barrier (smp_rmb()) | ||
35 | |||
36 | lockless_lookup(key) | ||
37 | { | ||
38 | struct hlist_node *node, *next; | ||
39 | for (pos = rcu_dereference((head)->first); | ||
40 | pos && ({ next = pos->next; smp_rmb(); prefetch(next); 1; }) && | ||
41 | ({ tpos = hlist_entry(pos, typeof(*tpos), member); 1; }); | ||
42 | pos = rcu_dereference(next)) | ||
43 | if (obj->key == key) | ||
44 | return obj; | ||
45 | return NULL; | ||
46 | |||
47 | And note the traditional hlist_for_each_entry_rcu() misses this smp_rmb() : | ||
48 | |||
49 | struct hlist_node *node; | ||
50 | for (pos = rcu_dereference((head)->first); | ||
51 | pos && ({ prefetch(pos->next); 1; }) && | ||
52 | ({ tpos = hlist_entry(pos, typeof(*tpos), member); 1; }); | ||
53 | pos = rcu_dereference(pos->next)) | ||
54 | if (obj->key == key) | ||
55 | return obj; | ||
56 | return NULL; | ||
57 | } | ||
58 | |||
59 | Quoting Corey Minyard : | ||
60 | |||
61 | "If the object is moved from one list to another list in-between the | ||
62 | time the hash is calculated and the next field is accessed, and the | ||
63 | object has moved to the end of a new list, the traversal will not | ||
64 | complete properly on the list it should have, since the object will | ||
65 | be on the end of the new list and there's not a way to tell it's on a | ||
66 | new list and restart the list traversal. I think that this can be | ||
67 | solved by pre-fetching the "next" field (with proper barriers) before | ||
68 | checking the key." | ||
69 | |||
70 | 2) Insert algo : | ||
71 | ---------------- | ||
72 | |||
73 | We need to make sure a reader cannot read the new 'obj->obj_next' value | ||
74 | and previous value of 'obj->key'. Or else, an item could be deleted | ||
75 | from a chain, and inserted into another chain. If new chain was empty | ||
76 | before the move, 'next' pointer is NULL, and lockless reader can | ||
77 | not detect it missed following items in original chain. | ||
78 | |||
79 | /* | ||
80 | * Please note that new inserts are done at the head of list, | ||
81 | * not in the middle or end. | ||
82 | */ | ||
83 | obj = kmem_cache_alloc(...); | ||
84 | lock_chain(); // typically a spin_lock() | ||
85 | obj->key = key; | ||
86 | atomic_inc(&obj->refcnt); | ||
87 | /* | ||
88 | * we need to make sure obj->key is updated before obj->next | ||
89 | */ | ||
90 | smp_wmb(); | ||
91 | hlist_add_head_rcu(&obj->obj_node, list); | ||
92 | unlock_chain(); // typically a spin_unlock() | ||
93 | |||
94 | |||
95 | 3) Remove algo | ||
96 | -------------- | ||
97 | Nothing special here, we can use a standard RCU hlist deletion. | ||
98 | But thanks to SLAB_DESTROY_BY_RCU, beware a deleted object can be reused | ||
99 | very very fast (before the end of RCU grace period) | ||
100 | |||
101 | if (put_last_reference_on(obj) { | ||
102 | lock_chain(); // typically a spin_lock() | ||
103 | hlist_del_init_rcu(&obj->obj_node); | ||
104 | unlock_chain(); // typically a spin_unlock() | ||
105 | kmem_cache_free(cachep, obj); | ||
106 | } | ||
107 | |||
108 | |||
109 | |||
110 | -------------------------------------------------------------------------- | ||
111 | With hlist_nulls we can avoid extra smp_rmb() in lockless_lookup() | ||
112 | and extra smp_wmb() in insert function. | ||
113 | |||
114 | For example, if we choose to store the slot number as the 'nulls' | ||
115 | end-of-list marker for each slot of the hash table, we can detect | ||
116 | a race (some writer did a delete and/or a move of an object | ||
117 | to another chain) checking the final 'nulls' value if | ||
118 | the lookup met the end of chain. If final 'nulls' value | ||
119 | is not the slot number, then we must restart the lookup at | ||
120 | the begining. If the object was moved to same chain, | ||
121 | then the reader doesnt care : It might eventually | ||
122 | scan the list again without harm. | ||
123 | |||
124 | |||
125 | 1) lookup algo | ||
126 | |||
127 | head = &table[slot]; | ||
128 | rcu_read_lock(); | ||
129 | begin: | ||
130 | hlist_nulls_for_each_entry_rcu(obj, node, head, member) { | ||
131 | if (obj->key == key) { | ||
132 | if (!try_get_ref(obj)) // might fail for free objects | ||
133 | goto begin; | ||
134 | if (obj->key != key) { // not the object we expected | ||
135 | put_ref(obj); | ||
136 | goto begin; | ||
137 | } | ||
138 | goto out; | ||
139 | } | ||
140 | /* | ||
141 | * if the nulls value we got at the end of this lookup is | ||
142 | * not the expected one, we must restart lookup. | ||
143 | * We probably met an item that was moved to another chain. | ||
144 | */ | ||
145 | if (get_nulls_value(node) != slot) | ||
146 | goto begin; | ||
147 | obj = NULL; | ||
148 | |||
149 | out: | ||
150 | rcu_read_unlock(); | ||
151 | |||
152 | 2) Insert function : | ||
153 | -------------------- | ||
154 | |||
155 | /* | ||
156 | * Please note that new inserts are done at the head of list, | ||
157 | * not in the middle or end. | ||
158 | */ | ||
159 | obj = kmem_cache_alloc(cachep); | ||
160 | lock_chain(); // typically a spin_lock() | ||
161 | obj->key = key; | ||
162 | atomic_set(&obj->refcnt, 1); | ||
163 | /* | ||
164 | * insert obj in RCU way (readers might be traversing chain) | ||
165 | */ | ||
166 | hlist_nulls_add_head_rcu(&obj->obj_node, list); | ||
167 | unlock_chain(); // typically a spin_unlock() | ||
diff --git a/Documentation/feature-removal-schedule.txt b/Documentation/feature-removal-schedule.txt index c28a2ac88f9d..77eb6b129dde 100644 --- a/Documentation/feature-removal-schedule.txt +++ b/Documentation/feature-removal-schedule.txt | |||
@@ -120,13 +120,6 @@ Who: Christoph Hellwig <hch@lst.de> | |||
120 | 120 | ||
121 | --------------------------- | 121 | --------------------------- |
122 | 122 | ||
123 | What: eepro100 network driver | ||
124 | When: January 2007 | ||
125 | Why: replaced by the e100 driver | ||
126 | Who: Adrian Bunk <bunk@stusta.de> | ||
127 | |||
128 | --------------------------- | ||
129 | |||
130 | What: Unused EXPORT_SYMBOL/EXPORT_SYMBOL_GPL exports | 123 | What: Unused EXPORT_SYMBOL/EXPORT_SYMBOL_GPL exports |
131 | (temporary transition config option provided until then) | 124 | (temporary transition config option provided until then) |
132 | The transition config option will also be removed at the same time. | 125 | The transition config option will also be removed at the same time. |
diff --git a/Documentation/networking/README.ipw2200 b/Documentation/networking/README.ipw2200 index 4f2a40f1dbc6..80c728522c4c 100644 --- a/Documentation/networking/README.ipw2200 +++ b/Documentation/networking/README.ipw2200 | |||
@@ -147,7 +147,7 @@ Where the supported parameter are: | |||
147 | driver. If disabled, the driver will not attempt to scan | 147 | driver. If disabled, the driver will not attempt to scan |
148 | for and associate to a network until it has been configured with | 148 | for and associate to a network until it has been configured with |
149 | one or more properties for the target network, for example configuring | 149 | one or more properties for the target network, for example configuring |
150 | the network SSID. Default is 1 (auto-associate) | 150 | the network SSID. Default is 0 (do not auto-associate) |
151 | 151 | ||
152 | Example: % modprobe ipw2200 associate=0 | 152 | Example: % modprobe ipw2200 associate=0 |
153 | 153 | ||
diff --git a/Documentation/networking/bonding.txt b/Documentation/networking/bonding.txt index 688dfe1e6b70..5ede7473b425 100644 --- a/Documentation/networking/bonding.txt +++ b/Documentation/networking/bonding.txt | |||
@@ -194,6 +194,48 @@ or, for backwards compatibility, the option value. E.g., | |||
194 | 194 | ||
195 | The parameters are as follows: | 195 | The parameters are as follows: |
196 | 196 | ||
197 | ad_select | ||
198 | |||
199 | Specifies the 802.3ad aggregation selection logic to use. The | ||
200 | possible values and their effects are: | ||
201 | |||
202 | stable or 0 | ||
203 | |||
204 | The active aggregator is chosen by largest aggregate | ||
205 | bandwidth. | ||
206 | |||
207 | Reselection of the active aggregator occurs only when all | ||
208 | slaves of the active aggregator are down or the active | ||
209 | aggregator has no slaves. | ||
210 | |||
211 | This is the default value. | ||
212 | |||
213 | bandwidth or 1 | ||
214 | |||
215 | The active aggregator is chosen by largest aggregate | ||
216 | bandwidth. Reselection occurs if: | ||
217 | |||
218 | - A slave is added to or removed from the bond | ||
219 | |||
220 | - Any slave's link state changes | ||
221 | |||
222 | - Any slave's 802.3ad association state changes | ||
223 | |||
224 | - The bond's adminstrative state changes to up | ||
225 | |||
226 | count or 2 | ||
227 | |||
228 | The active aggregator is chosen by the largest number of | ||
229 | ports (slaves). Reselection occurs as described under the | ||
230 | "bandwidth" setting, above. | ||
231 | |||
232 | The bandwidth and count selection policies permit failover of | ||
233 | 802.3ad aggregations when partial failure of the active aggregator | ||
234 | occurs. This keeps the aggregator with the highest availability | ||
235 | (either in bandwidth or in number of ports) active at all times. | ||
236 | |||
237 | This option was added in bonding version 3.4.0. | ||
238 | |||
197 | arp_interval | 239 | arp_interval |
198 | 240 | ||
199 | Specifies the ARP link monitoring frequency in milliseconds. | 241 | Specifies the ARP link monitoring frequency in milliseconds. |
@@ -551,6 +593,16 @@ num_grat_arp | |||
551 | affects only the active-backup mode. This option was added for | 593 | affects only the active-backup mode. This option was added for |
552 | bonding version 3.3.0. | 594 | bonding version 3.3.0. |
553 | 595 | ||
596 | num_unsol_na | ||
597 | |||
598 | Specifies the number of unsolicited IPv6 Neighbor Advertisements | ||
599 | to be issued after a failover event. One unsolicited NA is issued | ||
600 | immediately after the failover. | ||
601 | |||
602 | The valid range is 0 - 255; the default value is 1. This option | ||
603 | affects only the active-backup mode. This option was added for | ||
604 | bonding version 3.4.0. | ||
605 | |||
554 | primary | 606 | primary |
555 | 607 | ||
556 | A string (eth0, eth2, etc) specifying which slave is the | 608 | A string (eth0, eth2, etc) specifying which slave is the |
@@ -922,17 +974,19 @@ USERCTL=no | |||
922 | NETMASK, NETWORK and BROADCAST) to match your network configuration. | 974 | NETMASK, NETWORK and BROADCAST) to match your network configuration. |
923 | 975 | ||
924 | For later versions of initscripts, such as that found with Fedora | 976 | For later versions of initscripts, such as that found with Fedora |
925 | 7 and Red Hat Enterprise Linux version 5 (or later), it is possible, and, | 977 | 7 (or later) and Red Hat Enterprise Linux version 5 (or later), it is possible, |
926 | indeed, preferable, to specify the bonding options in the ifcfg-bond0 | 978 | and, indeed, preferable, to specify the bonding options in the ifcfg-bond0 |
927 | file, e.g. a line of the format: | 979 | file, e.g. a line of the format: |
928 | 980 | ||
929 | BONDING_OPTS="mode=active-backup arp_interval=60 arp_ip_target=+192.168.1.254" | 981 | BONDING_OPTS="mode=active-backup arp_interval=60 arp_ip_target=192.168.1.254" |
930 | 982 | ||
931 | will configure the bond with the specified options. The options | 983 | will configure the bond with the specified options. The options |
932 | specified in BONDING_OPTS are identical to the bonding module parameters | 984 | specified in BONDING_OPTS are identical to the bonding module parameters |
933 | except for the arp_ip_target field. Each target should be included as a | 985 | except for the arp_ip_target field when using versions of initscripts older |
934 | separate option and should be preceded by a '+' to indicate it should be | 986 | than and 8.57 (Fedora 8) and 8.45.19 (Red Hat Enterprise Linux 5.2). When |
935 | added to the list of queried targets, e.g., | 987 | using older versions each target should be included as a separate option and |
988 | should be preceded by a '+' to indicate it should be added to the list of | ||
989 | queried targets, e.g., | ||
936 | 990 | ||
937 | arp_ip_target=+192.168.1.1 arp_ip_target=+192.168.1.2 | 991 | arp_ip_target=+192.168.1.1 arp_ip_target=+192.168.1.2 |
938 | 992 | ||
@@ -940,7 +994,7 @@ added to the list of queried targets, e.g., | |||
940 | options via BONDING_OPTS, it is not necessary to edit /etc/modules.conf or | 994 | options via BONDING_OPTS, it is not necessary to edit /etc/modules.conf or |
941 | /etc/modprobe.conf. | 995 | /etc/modprobe.conf. |
942 | 996 | ||
943 | For older versions of initscripts that do not support | 997 | For even older versions of initscripts that do not support |
944 | BONDING_OPTS, it is necessary to edit /etc/modules.conf (or | 998 | BONDING_OPTS, it is necessary to edit /etc/modules.conf (or |
945 | /etc/modprobe.conf, depending upon your distro) to load the bonding module | 999 | /etc/modprobe.conf, depending upon your distro) to load the bonding module |
946 | with your desired options when the bond0 interface is brought up. The | 1000 | with your desired options when the bond0 interface is brought up. The |
diff --git a/Documentation/networking/dccp.txt b/Documentation/networking/dccp.txt index 39131a3c78f8..43df4487379b 100644 --- a/Documentation/networking/dccp.txt +++ b/Documentation/networking/dccp.txt | |||
@@ -57,6 +57,10 @@ can be set before calling bind(). | |||
57 | DCCP_SOCKOPT_GET_CUR_MPS is read-only and retrieves the current maximum packet | 57 | DCCP_SOCKOPT_GET_CUR_MPS is read-only and retrieves the current maximum packet |
58 | size (application payload size) in bytes, see RFC 4340, section 14. | 58 | size (application payload size) in bytes, see RFC 4340, section 14. |
59 | 59 | ||
60 | DCCP_SOCKOPT_AVAILABLE_CCIDS is also read-only and returns the list of CCIDs | ||
61 | supported by the endpoint (see include/linux/dccp.h for symbolic constants). | ||
62 | The caller needs to provide a sufficiently large (> 2) array of type uint8_t. | ||
63 | |||
60 | DCCP_SOCKOPT_SERVER_TIMEWAIT enables the server (listening socket) to hold | 64 | DCCP_SOCKOPT_SERVER_TIMEWAIT enables the server (listening socket) to hold |
61 | timewait state when closing the connection (RFC 4340, 8.3). The usual case is | 65 | timewait state when closing the connection (RFC 4340, 8.3). The usual case is |
62 | that the closing server sends a CloseReq, whereupon the client holds timewait | 66 | that the closing server sends a CloseReq, whereupon the client holds timewait |
@@ -121,9 +125,6 @@ send_ndp = 1 | |||
121 | send_ackvec = 1 | 125 | send_ackvec = 1 |
122 | Whether or not to send Ack Vector options (sec. 11.5). | 126 | Whether or not to send Ack Vector options (sec. 11.5). |
123 | 127 | ||
124 | ack_ratio = 2 | ||
125 | The default Ack Ratio (sec. 11.3) to use. | ||
126 | |||
127 | tx_ccid = 2 | 128 | tx_ccid = 2 |
128 | Default CCID for the sender-receiver half-connection. | 129 | Default CCID for the sender-receiver half-connection. |
129 | 130 | ||
diff --git a/Documentation/networking/ip-sysctl.txt b/Documentation/networking/ip-sysctl.txt index d84932650fd3..c7712787933c 100644 --- a/Documentation/networking/ip-sysctl.txt +++ b/Documentation/networking/ip-sysctl.txt | |||
@@ -27,6 +27,12 @@ min_adv_mss - INTEGER | |||
27 | The advertised MSS depends on the first hop route MTU, but will | 27 | The advertised MSS depends on the first hop route MTU, but will |
28 | never be lower than this setting. | 28 | never be lower than this setting. |
29 | 29 | ||
30 | rt_cache_rebuild_count - INTEGER | ||
31 | The per net-namespace route cache emergency rebuild threshold. | ||
32 | Any net-namespace having its route cache rebuilt due to | ||
33 | a hash bucket chain being too long more than this many times | ||
34 | will have its route caching disabled | ||
35 | |||
30 | IP Fragmentation: | 36 | IP Fragmentation: |
31 | 37 | ||
32 | ipfrag_high_thresh - INTEGER | 38 | ipfrag_high_thresh - INTEGER |
diff --git a/Documentation/networking/regulatory.txt b/Documentation/networking/regulatory.txt index a96989a8ff35..dcf31648414a 100644 --- a/Documentation/networking/regulatory.txt +++ b/Documentation/networking/regulatory.txt | |||
@@ -131,11 +131,13 @@ are expected to do this during initialization. | |||
131 | 131 | ||
132 | r = zd_reg2alpha2(mac->regdomain, alpha2); | 132 | r = zd_reg2alpha2(mac->regdomain, alpha2); |
133 | if (!r) | 133 | if (!r) |
134 | regulatory_hint(hw->wiphy, alpha2, NULL); | 134 | regulatory_hint(hw->wiphy, alpha2); |
135 | 135 | ||
136 | Example code - drivers providing a built in regulatory domain: | 136 | Example code - drivers providing a built in regulatory domain: |
137 | -------------------------------------------------------------- | 137 | -------------------------------------------------------------- |
138 | 138 | ||
139 | [NOTE: This API is not currently available, it can be added when required] | ||
140 | |||
139 | If you have regulatory information you can obtain from your | 141 | If you have regulatory information you can obtain from your |
140 | driver and you *need* to use this we let you build a regulatory domain | 142 | driver and you *need* to use this we let you build a regulatory domain |
141 | structure and pass it to the wireless core. To do this you should | 143 | structure and pass it to the wireless core. To do this you should |
@@ -167,7 +169,6 @@ struct ieee80211_regdomain mydriver_jp_regdom = { | |||
167 | 169 | ||
168 | Then in some part of your code after your wiphy has been registered: | 170 | Then in some part of your code after your wiphy has been registered: |
169 | 171 | ||
170 | int r; | ||
171 | struct ieee80211_regdomain *rd; | 172 | struct ieee80211_regdomain *rd; |
172 | int size_of_regd; | 173 | int size_of_regd; |
173 | int num_rules = mydriver_jp_regdom.n_reg_rules; | 174 | int num_rules = mydriver_jp_regdom.n_reg_rules; |
@@ -178,17 +179,12 @@ Then in some part of your code after your wiphy has been registered: | |||
178 | 179 | ||
179 | rd = kzalloc(size_of_regd, GFP_KERNEL); | 180 | rd = kzalloc(size_of_regd, GFP_KERNEL); |
180 | if (!rd) | 181 | if (!rd) |
181 | return -ENOMEM; | 182 | return -ENOMEM; |
182 | 183 | ||
183 | memcpy(rd, &mydriver_jp_regdom, sizeof(struct ieee80211_regdomain)); | 184 | memcpy(rd, &mydriver_jp_regdom, sizeof(struct ieee80211_regdomain)); |
184 | 185 | ||
185 | for (i=0; i < num_rules; i++) { | 186 | for (i=0; i < num_rules; i++) |
186 | memcpy(&rd->reg_rules[i], &mydriver_jp_regdom.reg_rules[i], | 187 | memcpy(&rd->reg_rules[i], |
187 | sizeof(struct ieee80211_reg_rule)); | 188 | &mydriver_jp_regdom.reg_rules[i], |
188 | } | 189 | sizeof(struct ieee80211_reg_rule)); |
189 | r = regulatory_hint(hw->wiphy, NULL, rd); | 190 | regulatory_struct_hint(rd); |
190 | if (r) { | ||
191 | kfree(rd); | ||
192 | return r; | ||
193 | } | ||
194 | |||
diff --git a/Documentation/rfkill.txt b/Documentation/rfkill.txt index b65f0799df48..4d3ee317a4a3 100644 --- a/Documentation/rfkill.txt +++ b/Documentation/rfkill.txt | |||
@@ -191,12 +191,20 @@ Userspace input handlers (uevents) or kernel input handlers (rfkill-input): | |||
191 | to tell the devices registered with the rfkill class to change | 191 | to tell the devices registered with the rfkill class to change |
192 | their state (i.e. translates the input layer event into real | 192 | their state (i.e. translates the input layer event into real |
193 | action). | 193 | action). |
194 | |||
194 | * rfkill-input implements EPO by handling EV_SW SW_RFKILL_ALL 0 | 195 | * rfkill-input implements EPO by handling EV_SW SW_RFKILL_ALL 0 |
195 | (power off all transmitters) in a special way: it ignores any | 196 | (power off all transmitters) in a special way: it ignores any |
196 | overrides and local state cache and forces all transmitters to the | 197 | overrides and local state cache and forces all transmitters to the |
197 | RFKILL_STATE_SOFT_BLOCKED state (including those which are already | 198 | RFKILL_STATE_SOFT_BLOCKED state (including those which are already |
198 | supposed to be BLOCKED). Note that the opposite event (power on all | 199 | supposed to be BLOCKED). |
199 | transmitters) is handled normally. | 200 | * rfkill EPO will remain active until rfkill-input receives an |
201 | EV_SW SW_RFKILL_ALL 1 event. While the EPO is active, transmitters | ||
202 | are locked in the blocked state (rfkill will refuse to unblock them). | ||
203 | * rfkill-input implements different policies that the user can | ||
204 | select for handling EV_SW SW_RFKILL_ALL 1. It will unlock rfkill, | ||
205 | and either do nothing (leave transmitters blocked, but now unlocked), | ||
206 | restore the transmitters to their state before the EPO, or unblock | ||
207 | them all. | ||
200 | 208 | ||
201 | Userspace uevent handler or kernel platform-specific drivers hooked to the | 209 | Userspace uevent handler or kernel platform-specific drivers hooked to the |
202 | rfkill notifier chain: | 210 | rfkill notifier chain: |
@@ -331,11 +339,9 @@ class to get a sysfs interface :-) | |||
331 | correct event for your switch/button. These events are emergency power-off | 339 | correct event for your switch/button. These events are emergency power-off |
332 | events when they are trying to turn the transmitters off. An example of an | 340 | events when they are trying to turn the transmitters off. An example of an |
333 | input device which SHOULD generate *_RFKILL_ALL events is the wireless-kill | 341 | input device which SHOULD generate *_RFKILL_ALL events is the wireless-kill |
334 | switch in a laptop which is NOT a hotkey, but a real switch that kills radios | 342 | switch in a laptop which is NOT a hotkey, but a real sliding/rocker switch. |
335 | in hardware, even if the O.S. has gone to lunch. An example of an input device | 343 | An example of an input device which SHOULD NOT generate *_RFKILL_ALL events by |
336 | which SHOULD NOT generate *_RFKILL_ALL events by default, is any sort of hot | 344 | default, is any sort of hot key that is type-specific (e.g. the one for WLAN). |
337 | key that does nothing by itself, as well as any hot key that is type-specific | ||
338 | (e.g. the one for WLAN). | ||
339 | 345 | ||
340 | 346 | ||
341 | 3.1 Guidelines for wireless device drivers | 347 | 3.1 Guidelines for wireless device drivers |