diff options
-rw-r--r-- | Documentation/input/iforce-protocol.txt | 508 | ||||
-rw-r--r-- | Makefile | 4 | ||||
-rw-r--r-- | arch/i386/boot/header.S | 2 | ||||
-rw-r--r-- | arch/i386/boot/video.c | 14 | ||||
-rw-r--r-- | arch/i386/kernel/acpi/wakeup.S | 41 | ||||
-rw-r--r-- | arch/x86_64/kernel/acpi/wakeup.S | 47 | ||||
-rw-r--r-- | drivers/ieee1394/ieee1394_core.c | 2 | ||||
-rw-r--r-- | drivers/ieee1394/ohci1394.c | 4 | ||||
-rw-r--r-- | include/linux/sched.h | 1 | ||||
-rw-r--r-- | kernel/sched.c | 10 | ||||
-rw-r--r-- | kernel/sched_fair.c | 63 | ||||
-rw-r--r-- | kernel/sysctl.c | 8 | ||||
-rw-r--r-- | security/selinux/hooks.c | 2 |
13 files changed, 366 insertions, 340 deletions
diff --git a/Documentation/input/iforce-protocol.txt b/Documentation/input/iforce-protocol.txt index 95df4ca70e71..8777d2d321e3 100644 --- a/Documentation/input/iforce-protocol.txt +++ b/Documentation/input/iforce-protocol.txt | |||
@@ -1,254 +1,254 @@ | |||
1 | ** Introduction | 1 | ** Introduction |
2 | This document describes what I managed to discover about the protocol used to | 2 | This document describes what I managed to discover about the protocol used to |
3 | specify force effects to I-Force 2.0 devices. None of this information comes | 3 | specify force effects to I-Force 2.0 devices. None of this information comes |
4 | from Immerse. That's why you should not trust what is written in this | 4 | from Immerse. That's why you should not trust what is written in this |
5 | document. This document is intended to help understanding the protocol. | 5 | document. This document is intended to help understanding the protocol. |
6 | This is not a reference. Comments and corrections are welcome. To contact me, | 6 | This is not a reference. Comments and corrections are welcome. To contact me, |
7 | send an email to: deneux@ifrance.com | 7 | send an email to: deneux@ifrance.com |
8 | 8 | ||
9 | ** WARNING ** | 9 | ** WARNING ** |
10 | I may not be held responsible for any dammage or harm caused if you try to | 10 | I may not be held responsible for any dammage or harm caused if you try to |
11 | send data to your I-Force device based on what you read in this document. | 11 | send data to your I-Force device based on what you read in this document. |
12 | 12 | ||
13 | ** Preliminary Notes: | 13 | ** Preliminary Notes: |
14 | All values are hexadecimal with big-endian encoding (msb on the left). Beware, | 14 | All values are hexadecimal with big-endian encoding (msb on the left). Beware, |
15 | values inside packets are encoded using little-endian. Bytes whose roles are | 15 | values inside packets are encoded using little-endian. Bytes whose roles are |
16 | unknown are marked ??? Information that needs deeper inspection is marked (?) | 16 | unknown are marked ??? Information that needs deeper inspection is marked (?) |
17 | 17 | ||
18 | ** General form of a packet ** | 18 | ** General form of a packet ** |
19 | This is how packets look when the device uses the rs232 to communicate. | 19 | This is how packets look when the device uses the rs232 to communicate. |
20 | 2B OP LEN DATA CS | 20 | 2B OP LEN DATA CS |
21 | CS is the checksum. It is equal to the exclusive or of all bytes. | 21 | CS is the checksum. It is equal to the exclusive or of all bytes. |
22 | 22 | ||
23 | When using USB: | 23 | When using USB: |
24 | OP DATA | 24 | OP DATA |
25 | The 2B, LEN and CS fields have disappeared, probably because USB handles frames and | 25 | The 2B, LEN and CS fields have disappeared, probably because USB handles frames and |
26 | data corruption is handled or unsignificant. | 26 | data corruption is handled or unsignificant. |
27 | 27 | ||
28 | First, I describe effects that are sent by the device to the computer | 28 | First, I describe effects that are sent by the device to the computer |
29 | 29 | ||
30 | ** Device input state | 30 | ** Device input state |
31 | This packet is used to indicate the state of each button and the value of each | 31 | This packet is used to indicate the state of each button and the value of each |
32 | axis | 32 | axis |
33 | OP= 01 for a joystick, 03 for a wheel | 33 | OP= 01 for a joystick, 03 for a wheel |
34 | LEN= Varies from device to device | 34 | LEN= Varies from device to device |
35 | 00 X-Axis lsb | 35 | 00 X-Axis lsb |
36 | 01 X-Axis msb | 36 | 01 X-Axis msb |
37 | 02 Y-Axis lsb, or gas pedal for a wheel | 37 | 02 Y-Axis lsb, or gas pedal for a wheel |
38 | 03 Y-Axis msb, or brake pedal for a wheel | 38 | 03 Y-Axis msb, or brake pedal for a wheel |
39 | 04 Throttle | 39 | 04 Throttle |
40 | 05 Buttons | 40 | 05 Buttons |
41 | 06 Lower 4 bits: Buttons | 41 | 06 Lower 4 bits: Buttons |
42 | Upper 4 bits: Hat | 42 | Upper 4 bits: Hat |
43 | 07 Rudder | 43 | 07 Rudder |
44 | 44 | ||
45 | ** Device effects states | 45 | ** Device effects states |
46 | OP= 02 | 46 | OP= 02 |
47 | LEN= Varies | 47 | LEN= Varies |
48 | 00 ? Bit 1 (Value 2) is the value of the deadman switch | 48 | 00 ? Bit 1 (Value 2) is the value of the deadman switch |
49 | 01 Bit 8 is set if the effect is playing. Bits 0 to 7 are the effect id. | 49 | 01 Bit 8 is set if the effect is playing. Bits 0 to 7 are the effect id. |
50 | 02 ?? | 50 | 02 ?? |
51 | 03 Address of parameter block changed (lsb) | 51 | 03 Address of parameter block changed (lsb) |
52 | 04 Address of parameter block changed (msb) | 52 | 04 Address of parameter block changed (msb) |
53 | 05 Address of second parameter block changed (lsb) | 53 | 05 Address of second parameter block changed (lsb) |
54 | ... depending on the number of parameter blocks updated | 54 | ... depending on the number of parameter blocks updated |
55 | 55 | ||
56 | ** Force effect ** | 56 | ** Force effect ** |
57 | OP= 01 | 57 | OP= 01 |
58 | LEN= 0e | 58 | LEN= 0e |
59 | 00 Channel (when playing several effects at the same time, each must be assigned a channel) | 59 | 00 Channel (when playing several effects at the same time, each must be assigned a channel) |
60 | 01 Wave form | 60 | 01 Wave form |
61 | Val 00 Constant | 61 | Val 00 Constant |
62 | Val 20 Square | 62 | Val 20 Square |
63 | Val 21 Triangle | 63 | Val 21 Triangle |
64 | Val 22 Sine | 64 | Val 22 Sine |
65 | Val 23 Sawtooth up | 65 | Val 23 Sawtooth up |
66 | Val 24 Sawtooth down | 66 | Val 24 Sawtooth down |
67 | Val 40 Spring (Force = f(pos)) | 67 | Val 40 Spring (Force = f(pos)) |
68 | Val 41 Friction (Force = f(velocity)) and Inertia (Force = f(acceleration)) | 68 | Val 41 Friction (Force = f(velocity)) and Inertia (Force = f(acceleration)) |
69 | 69 | ||
70 | 70 | ||
71 | 02 Axes affected and trigger | 71 | 02 Axes affected and trigger |
72 | Bits 4-7: Val 2 = effect along one axis. Byte 05 indicates direction | 72 | Bits 4-7: Val 2 = effect along one axis. Byte 05 indicates direction |
73 | Val 4 = X axis only. Byte 05 must contain 5a | 73 | Val 4 = X axis only. Byte 05 must contain 5a |
74 | Val 8 = Y axis only. Byte 05 must contain b4 | 74 | Val 8 = Y axis only. Byte 05 must contain b4 |
75 | Val c = X and Y axes. Bytes 05 must contain 60 | 75 | Val c = X and Y axes. Bytes 05 must contain 60 |
76 | Bits 0-3: Val 0 = No trigger | 76 | Bits 0-3: Val 0 = No trigger |
77 | Val x+1 = Button x triggers the effect | 77 | Val x+1 = Button x triggers the effect |
78 | When the whole byte is 0, cancel the previously set trigger | 78 | When the whole byte is 0, cancel the previously set trigger |
79 | 79 | ||
80 | 03-04 Duration of effect (little endian encoding, in ms) | 80 | 03-04 Duration of effect (little endian encoding, in ms) |
81 | 81 | ||
82 | 05 Direction of effect, if applicable. Else, see 02 for value to assign. | 82 | 05 Direction of effect, if applicable. Else, see 02 for value to assign. |
83 | 83 | ||
84 | 06-07 Minimum time between triggering. | 84 | 06-07 Minimum time between triggering. |
85 | 85 | ||
86 | 08-09 Address of periodicity or magnitude parameters | 86 | 08-09 Address of periodicity or magnitude parameters |
87 | 0a-0b Address of attack and fade parameters, or ffff if none. | 87 | 0a-0b Address of attack and fade parameters, or ffff if none. |
88 | *or* | 88 | *or* |
89 | 08-09 Address of interactive parameters for X-axis, or ffff if not applicable | 89 | 08-09 Address of interactive parameters for X-axis, or ffff if not applicable |
90 | 0a-0b Address of interactive parameters for Y-axis, or ffff if not applicable | 90 | 0a-0b Address of interactive parameters for Y-axis, or ffff if not applicable |
91 | 91 | ||
92 | 0c-0d Delay before execution of effect (little endian encoding, in ms) | 92 | 0c-0d Delay before execution of effect (little endian encoding, in ms) |
93 | 93 | ||
94 | 94 | ||
95 | ** Time based parameters ** | 95 | ** Time based parameters ** |
96 | 96 | ||
97 | *** Attack and fade *** | 97 | *** Attack and fade *** |
98 | OP= 02 | 98 | OP= 02 |
99 | LEN= 08 | 99 | LEN= 08 |
100 | 00-01 Address where to store the parameteres | 100 | 00-01 Address where to store the parameteres |
101 | 02-03 Duration of attack (little endian encoding, in ms) | 101 | 02-03 Duration of attack (little endian encoding, in ms) |
102 | 04 Level at end of attack. Signed byte. | 102 | 04 Level at end of attack. Signed byte. |
103 | 05-06 Duration of fade. | 103 | 05-06 Duration of fade. |
104 | 07 Level at end of fade. | 104 | 07 Level at end of fade. |
105 | 105 | ||
106 | *** Magnitude *** | 106 | *** Magnitude *** |
107 | OP= 03 | 107 | OP= 03 |
108 | LEN= 03 | 108 | LEN= 03 |
109 | 00-01 Address | 109 | 00-01 Address |
110 | 02 Level. Signed byte. | 110 | 02 Level. Signed byte. |
111 | 111 | ||
112 | *** Periodicity *** | 112 | *** Periodicity *** |
113 | OP= 04 | 113 | OP= 04 |
114 | LEN= 07 | 114 | LEN= 07 |
115 | 00-01 Address | 115 | 00-01 Address |
116 | 02 Magnitude. Signed byte. | 116 | 02 Magnitude. Signed byte. |
117 | 03 Offset. Signed byte. | 117 | 03 Offset. Signed byte. |
118 | 04 Phase. Val 00 = 0 deg, Val 40 = 90 degs. | 118 | 04 Phase. Val 00 = 0 deg, Val 40 = 90 degs. |
119 | 05-06 Period (little endian encoding, in ms) | 119 | 05-06 Period (little endian encoding, in ms) |
120 | 120 | ||
121 | ** Interactive parameters ** | 121 | ** Interactive parameters ** |
122 | OP= 05 | 122 | OP= 05 |
123 | LEN= 0a | 123 | LEN= 0a |
124 | 00-01 Address | 124 | 00-01 Address |
125 | 02 Positive Coeff | 125 | 02 Positive Coeff |
126 | 03 Negative Coeff | 126 | 03 Negative Coeff |
127 | 04+05 Offset (center) | 127 | 04+05 Offset (center) |
128 | 06+07 Dead band (Val 01F4 = 5000 (decimal)) | 128 | 06+07 Dead band (Val 01F4 = 5000 (decimal)) |
129 | 08 Positive saturation (Val 0a = 1000 (decimal) Val 64 = 10000 (decimal)) | 129 | 08 Positive saturation (Val 0a = 1000 (decimal) Val 64 = 10000 (decimal)) |
130 | 09 Negative saturation | 130 | 09 Negative saturation |
131 | 131 | ||
132 | The encoding is a bit funny here: For coeffs, these are signed values. The | 132 | The encoding is a bit funny here: For coeffs, these are signed values. The |
133 | maximum value is 64 (100 decimal), the min is 9c. | 133 | maximum value is 64 (100 decimal), the min is 9c. |
134 | For the offset, the minimum value is FE0C, the maximum value is 01F4. | 134 | For the offset, the minimum value is FE0C, the maximum value is 01F4. |
135 | For the deadband, the minimum value is 0, the max is 03E8. | 135 | For the deadband, the minimum value is 0, the max is 03E8. |
136 | 136 | ||
137 | ** Controls ** | 137 | ** Controls ** |
138 | OP= 41 | 138 | OP= 41 |
139 | LEN= 03 | 139 | LEN= 03 |
140 | 00 Channel | 140 | 00 Channel |
141 | 01 Start/Stop | 141 | 01 Start/Stop |
142 | Val 00: Stop | 142 | Val 00: Stop |
143 | Val 01: Start and play once. | 143 | Val 01: Start and play once. |
144 | Val 41: Start and play n times (See byte 02 below) | 144 | Val 41: Start and play n times (See byte 02 below) |
145 | 02 Number of iterations n. | 145 | 02 Number of iterations n. |
146 | 146 | ||
147 | ** Init ** | 147 | ** Init ** |
148 | 148 | ||
149 | *** Querying features *** | 149 | *** Querying features *** |
150 | OP= ff | 150 | OP= ff |
151 | Query command. Length varies according to the query type. | 151 | Query command. Length varies according to the query type. |
152 | The general format of this packet is: | 152 | The general format of this packet is: |
153 | ff 01 QUERY [INDEX] CHECKSUM | 153 | ff 01 QUERY [INDEX] CHECKSUM |
154 | reponses are of the same form: | 154 | reponses are of the same form: |
155 | FF LEN QUERY VALUE_QUERIED CHECKSUM2 | 155 | FF LEN QUERY VALUE_QUERIED CHECKSUM2 |
156 | where LEN = 1 + length(VALUE_QUERIED) | 156 | where LEN = 1 + length(VALUE_QUERIED) |
157 | 157 | ||
158 | **** Query ram size **** | 158 | **** Query ram size **** |
159 | QUERY = 42 ('B'uffer size) | 159 | QUERY = 42 ('B'uffer size) |
160 | The device should reply with the same packet plus two additionnal bytes | 160 | The device should reply with the same packet plus two additionnal bytes |
161 | containing the size of the memory: | 161 | containing the size of the memory: |
162 | ff 03 42 03 e8 CS would mean that the device has 1000 bytes of ram available. | 162 | ff 03 42 03 e8 CS would mean that the device has 1000 bytes of ram available. |
163 | 163 | ||
164 | **** Query number of effects **** | 164 | **** Query number of effects **** |
165 | QUERY = 4e ('N'umber of effects) | 165 | QUERY = 4e ('N'umber of effects) |
166 | The device should respond by sending the number of effects that can be played | 166 | The device should respond by sending the number of effects that can be played |
167 | at the same time (one byte) | 167 | at the same time (one byte) |
168 | ff 02 4e 14 CS would stand for 20 effects. | 168 | ff 02 4e 14 CS would stand for 20 effects. |
169 | 169 | ||
170 | **** Vendor's id **** | 170 | **** Vendor's id **** |
171 | QUERY = 4d ('M'anufacturer) | 171 | QUERY = 4d ('M'anufacturer) |
172 | Query the vendors'id (2 bytes) | 172 | Query the vendors'id (2 bytes) |
173 | 173 | ||
174 | **** Product id ***** | 174 | **** Product id ***** |
175 | QUERY = 50 ('P'roduct) | 175 | QUERY = 50 ('P'roduct) |
176 | Query the product id (2 bytes) | 176 | Query the product id (2 bytes) |
177 | 177 | ||
178 | **** Open device **** | 178 | **** Open device **** |
179 | QUERY = 4f ('O'pen) | 179 | QUERY = 4f ('O'pen) |
180 | No data returned. | 180 | No data returned. |
181 | 181 | ||
182 | **** Close device ***** | 182 | **** Close device ***** |
183 | QUERY = 43 ('C')lose | 183 | QUERY = 43 ('C')lose |
184 | No data returned. | 184 | No data returned. |
185 | 185 | ||
186 | **** Query effect **** | 186 | **** Query effect **** |
187 | QUERY = 45 ('E') | 187 | QUERY = 45 ('E') |
188 | Send effect type. | 188 | Send effect type. |
189 | Returns nonzero if supported (2 bytes) | 189 | Returns nonzero if supported (2 bytes) |
190 | 190 | ||
191 | **** Firmware Version **** | 191 | **** Firmware Version **** |
192 | QUERY = 56 ('V'ersion) | 192 | QUERY = 56 ('V'ersion) |
193 | Sends back 3 bytes - major, minor, subminor | 193 | Sends back 3 bytes - major, minor, subminor |
194 | 194 | ||
195 | *** Initialisation of the device *** | 195 | *** Initialisation of the device *** |
196 | 196 | ||
197 | **** Set Control **** | 197 | **** Set Control **** |
198 | !!! Device dependent, can be different on different models !!! | 198 | !!! Device dependent, can be different on different models !!! |
199 | OP= 40 <idx> <val> [<val>] | 199 | OP= 40 <idx> <val> [<val>] |
200 | LEN= 2 or 3 | 200 | LEN= 2 or 3 |
201 | 00 Idx | 201 | 00 Idx |
202 | Idx 00 Set dead zone (0..2048) | 202 | Idx 00 Set dead zone (0..2048) |
203 | Idx 01 Ignore Deadman sensor (0..1) | 203 | Idx 01 Ignore Deadman sensor (0..1) |
204 | Idx 02 Enable comm watchdog (0..1) | 204 | Idx 02 Enable comm watchdog (0..1) |
205 | Idx 03 Set the strength of the spring (0..100) | 205 | Idx 03 Set the strength of the spring (0..100) |
206 | Idx 04 Enable or disable the spring (0/1) | 206 | Idx 04 Enable or disable the spring (0/1) |
207 | Idx 05 Set axis saturation threshold (0..2048) | 207 | Idx 05 Set axis saturation threshold (0..2048) |
208 | 208 | ||
209 | **** Set Effect State **** | 209 | **** Set Effect State **** |
210 | OP= 42 <val> | 210 | OP= 42 <val> |
211 | LEN= 1 | 211 | LEN= 1 |
212 | 00 State | 212 | 00 State |
213 | Bit 3 Pause force feedback | 213 | Bit 3 Pause force feedback |
214 | Bit 2 Enable force feedback | 214 | Bit 2 Enable force feedback |
215 | Bit 0 Stop all effects | 215 | Bit 0 Stop all effects |
216 | 216 | ||
217 | **** Set overall gain **** | 217 | **** Set overall gain **** |
218 | OP= 43 <val> | 218 | OP= 43 <val> |
219 | LEN= 1 | 219 | LEN= 1 |
220 | 00 Gain | 220 | 00 Gain |
221 | Val 00 = 0% | 221 | Val 00 = 0% |
222 | Val 40 = 50% | 222 | Val 40 = 50% |
223 | Val 80 = 100% | 223 | Val 80 = 100% |
224 | 224 | ||
225 | ** Parameter memory ** | 225 | ** Parameter memory ** |
226 | 226 | ||
227 | Each device has a certain amount of memory to store parameters of effects. | 227 | Each device has a certain amount of memory to store parameters of effects. |
228 | The amount of RAM may vary, I encountered values from 200 to 1000 bytes. Below | 228 | The amount of RAM may vary, I encountered values from 200 to 1000 bytes. Below |
229 | is the amount of memory apparently needed for every set of parameters: | 229 | is the amount of memory apparently needed for every set of parameters: |
230 | - period : 0c | 230 | - period : 0c |
231 | - magnitude : 02 | 231 | - magnitude : 02 |
232 | - attack and fade : 0e | 232 | - attack and fade : 0e |
233 | - interactive : 08 | 233 | - interactive : 08 |
234 | 234 | ||
235 | ** Appendix: How to study the protocol ? ** | 235 | ** Appendix: How to study the protocol ? ** |
236 | 236 | ||
237 | 1. Generate effects using the force editor provided with the DirectX SDK, or use Immersion Studio (freely available at their web site in the developer section: www.immersion.com) | 237 | 1. Generate effects using the force editor provided with the DirectX SDK, or use Immersion Studio (freely available at their web site in the developer section: www.immersion.com) |
238 | 2. Start a soft spying RS232 or USB (depending on where you connected your joystick/wheel). I used ComPortSpy from fCoder (alpha version!) | 238 | 2. Start a soft spying RS232 or USB (depending on where you connected your joystick/wheel). I used ComPortSpy from fCoder (alpha version!) |
239 | 3. Play the effect, and watch what happens on the spy screen. | 239 | 3. Play the effect, and watch what happens on the spy screen. |
240 | 240 | ||
241 | A few words about ComPortSpy: | 241 | A few words about ComPortSpy: |
242 | At first glance, this soft seems, hum, well... buggy. In fact, data appear with a few seconds latency. Personnaly, I restart it every time I play an effect. | 242 | At first glance, this soft seems, hum, well... buggy. In fact, data appear with a few seconds latency. Personnaly, I restart it every time I play an effect. |
243 | Remember it's free (as in free beer) and alpha! | 243 | Remember it's free (as in free beer) and alpha! |
244 | 244 | ||
245 | ** URLS ** | 245 | ** URLS ** |
246 | Check www.immerse.com for Immersion Studio, and www.fcoder.com for ComPortSpy. | 246 | Check www.immerse.com for Immersion Studio, and www.fcoder.com for ComPortSpy. |
247 | 247 | ||
248 | ** Author of this document ** | 248 | ** Author of this document ** |
249 | Johann Deneux <deneux@ifrance.com> | 249 | Johann Deneux <deneux@ifrance.com> |
250 | Home page at http://www.esil.univ-mrs.fr/~jdeneux/projects/ff/ | 250 | Home page at http://www.esil.univ-mrs.fr/~jdeneux/projects/ff/ |
251 | 251 | ||
252 | Additions by Vojtech Pavlik. | 252 | Additions by Vojtech Pavlik. |
253 | 253 | ||
254 | I-Force is trademark of Immersion Corp. | 254 | I-Force is trademark of Immersion Corp. |
@@ -1,8 +1,8 @@ | |||
1 | VERSION = 2 | 1 | VERSION = 2 |
2 | PATCHLEVEL = 6 | 2 | PATCHLEVEL = 6 |
3 | SUBLEVEL = 23 | 3 | SUBLEVEL = 23 |
4 | EXTRAVERSION =-rc6 | 4 | EXTRAVERSION =-rc7 |
5 | NAME = Pink Farting Weasel | 5 | NAME = Arr Matey! A Hairy Bilge Rat! |
6 | 6 | ||
7 | # *DOCUMENTATION* | 7 | # *DOCUMENTATION* |
8 | # To see a list of typical targets execute "make help" | 8 | # To see a list of typical targets execute "make help" |
diff --git a/arch/i386/boot/header.S b/arch/i386/boot/header.S index 7f4a2c53bd76..f3140e596d40 100644 --- a/arch/i386/boot/header.S +++ b/arch/i386/boot/header.S | |||
@@ -275,7 +275,7 @@ die: | |||
275 | hlt | 275 | hlt |
276 | jmp die | 276 | jmp die |
277 | 277 | ||
278 | .size die, .-due | 278 | .size die, .-die |
279 | 279 | ||
280 | .section ".initdata", "a" | 280 | .section ".initdata", "a" |
281 | setup_corrupt: | 281 | setup_corrupt: |
diff --git a/arch/i386/boot/video.c b/arch/i386/boot/video.c index 693f20d3102e..e4ba897bf9a3 100644 --- a/arch/i386/boot/video.c +++ b/arch/i386/boot/video.c | |||
@@ -147,7 +147,7 @@ int mode_defined(u16 mode) | |||
147 | } | 147 | } |
148 | 148 | ||
149 | /* Set mode (without recalc) */ | 149 | /* Set mode (without recalc) */ |
150 | static int raw_set_mode(u16 mode) | 150 | static int raw_set_mode(u16 mode, u16 *real_mode) |
151 | { | 151 | { |
152 | int nmode, i; | 152 | int nmode, i; |
153 | struct card_info *card; | 153 | struct card_info *card; |
@@ -165,8 +165,10 @@ static int raw_set_mode(u16 mode) | |||
165 | 165 | ||
166 | if ((mode == nmode && visible) || | 166 | if ((mode == nmode && visible) || |
167 | mode == mi->mode || | 167 | mode == mi->mode || |
168 | mode == (mi->y << 8)+mi->x) | 168 | mode == (mi->y << 8)+mi->x) { |
169 | *real_mode = mi->mode; | ||
169 | return card->set_mode(mi); | 170 | return card->set_mode(mi); |
171 | } | ||
170 | 172 | ||
171 | if (visible) | 173 | if (visible) |
172 | nmode++; | 174 | nmode++; |
@@ -178,7 +180,7 @@ static int raw_set_mode(u16 mode) | |||
178 | if (mode >= card->xmode_first && | 180 | if (mode >= card->xmode_first && |
179 | mode < card->xmode_first+card->xmode_n) { | 181 | mode < card->xmode_first+card->xmode_n) { |
180 | struct mode_info mix; | 182 | struct mode_info mix; |
181 | mix.mode = mode; | 183 | *real_mode = mix.mode = mode; |
182 | mix.x = mix.y = 0; | 184 | mix.x = mix.y = 0; |
183 | return card->set_mode(&mix); | 185 | return card->set_mode(&mix); |
184 | } | 186 | } |
@@ -223,6 +225,7 @@ static void vga_recalc_vertical(void) | |||
223 | static int set_mode(u16 mode) | 225 | static int set_mode(u16 mode) |
224 | { | 226 | { |
225 | int rv; | 227 | int rv; |
228 | u16 real_mode; | ||
226 | 229 | ||
227 | /* Very special mode numbers... */ | 230 | /* Very special mode numbers... */ |
228 | if (mode == VIDEO_CURRENT_MODE) | 231 | if (mode == VIDEO_CURRENT_MODE) |
@@ -232,13 +235,16 @@ static int set_mode(u16 mode) | |||
232 | else if (mode == EXTENDED_VGA) | 235 | else if (mode == EXTENDED_VGA) |
233 | mode = VIDEO_8POINT; | 236 | mode = VIDEO_8POINT; |
234 | 237 | ||
235 | rv = raw_set_mode(mode); | 238 | rv = raw_set_mode(mode, &real_mode); |
236 | if (rv) | 239 | if (rv) |
237 | return rv; | 240 | return rv; |
238 | 241 | ||
239 | if (mode & VIDEO_RECALC) | 242 | if (mode & VIDEO_RECALC) |
240 | vga_recalc_vertical(); | 243 | vga_recalc_vertical(); |
241 | 244 | ||
245 | /* Save the canonical mode number for the kernel, not | ||
246 | an alias, size specification or menu position */ | ||
247 | boot_params.hdr.vid_mode = real_mode; | ||
242 | return 0; | 248 | return 0; |
243 | } | 249 | } |
244 | 250 | ||
diff --git a/arch/i386/kernel/acpi/wakeup.S b/arch/i386/kernel/acpi/wakeup.S index ed0a0f2c1597..f22ba8534d26 100644 --- a/arch/i386/kernel/acpi/wakeup.S +++ b/arch/i386/kernel/acpi/wakeup.S | |||
@@ -151,51 +151,30 @@ bogus_real_magic: | |||
151 | #define VIDEO_FIRST_V7 0x0900 | 151 | #define VIDEO_FIRST_V7 0x0900 |
152 | 152 | ||
153 | # Setting of user mode (AX=mode ID) => CF=success | 153 | # Setting of user mode (AX=mode ID) => CF=success |
154 | |||
155 | # For now, we only handle VESA modes (0x0200..0x03ff). To handle other | ||
156 | # modes, we should probably compile in the video code from the boot | ||
157 | # directory. | ||
154 | mode_set: | 158 | mode_set: |
155 | movw %ax, %bx | 159 | movw %ax, %bx |
156 | #if 0 | 160 | subb $VIDEO_FIRST_VESA>>8, %bh |
157 | cmpb $0xff, %ah | 161 | cmpb $2, %bh |
158 | jz setalias | 162 | jb check_vesa |
159 | |||
160 | testb $VIDEO_RECALC>>8, %ah | ||
161 | jnz _setrec | ||
162 | |||
163 | cmpb $VIDEO_FIRST_RESOLUTION>>8, %ah | ||
164 | jnc setres | ||
165 | |||
166 | cmpb $VIDEO_FIRST_SPECIAL>>8, %ah | ||
167 | jz setspc | ||
168 | |||
169 | cmpb $VIDEO_FIRST_V7>>8, %ah | ||
170 | jz setv7 | ||
171 | #endif | ||
172 | |||
173 | cmpb $VIDEO_FIRST_VESA>>8, %ah | ||
174 | jnc check_vesa | ||
175 | #if 0 | ||
176 | orb %ah, %ah | ||
177 | jz setmenu | ||
178 | #endif | ||
179 | |||
180 | decb %ah | ||
181 | # jz setbios Add bios modes later | ||
182 | 163 | ||
183 | setbad: clc | 164 | setbad: |
165 | clc | ||
184 | ret | 166 | ret |
185 | 167 | ||
186 | check_vesa: | 168 | check_vesa: |
187 | subb $VIDEO_FIRST_VESA>>8, %bh | ||
188 | orw $0x4000, %bx # Use linear frame buffer | 169 | orw $0x4000, %bx # Use linear frame buffer |
189 | movw $0x4f02, %ax # VESA BIOS mode set call | 170 | movw $0x4f02, %ax # VESA BIOS mode set call |
190 | int $0x10 | 171 | int $0x10 |
191 | cmpw $0x004f, %ax # AL=4f if implemented | 172 | cmpw $0x004f, %ax # AL=4f if implemented |
192 | jnz _setbad # AH=0 if OK | 173 | jnz setbad # AH=0 if OK |
193 | 174 | ||
194 | stc | 175 | stc |
195 | ret | 176 | ret |
196 | 177 | ||
197 | _setbad: jmp setbad | ||
198 | |||
199 | .code32 | 178 | .code32 |
200 | ALIGN | 179 | ALIGN |
201 | 180 | ||
diff --git a/arch/x86_64/kernel/acpi/wakeup.S b/arch/x86_64/kernel/acpi/wakeup.S index 13f1480cbec9..a06f2bcabef9 100644 --- a/arch/x86_64/kernel/acpi/wakeup.S +++ b/arch/x86_64/kernel/acpi/wakeup.S | |||
@@ -81,7 +81,7 @@ wakeup_code: | |||
81 | testl $2, realmode_flags - wakeup_code | 81 | testl $2, realmode_flags - wakeup_code |
82 | jz 1f | 82 | jz 1f |
83 | mov video_mode - wakeup_code, %ax | 83 | mov video_mode - wakeup_code, %ax |
84 | call mode_seta | 84 | call mode_set |
85 | 1: | 85 | 1: |
86 | 86 | ||
87 | movw $0xb800, %ax | 87 | movw $0xb800, %ax |
@@ -291,52 +291,31 @@ no_longmode: | |||
291 | #define VIDEO_FIRST_V7 0x0900 | 291 | #define VIDEO_FIRST_V7 0x0900 |
292 | 292 | ||
293 | # Setting of user mode (AX=mode ID) => CF=success | 293 | # Setting of user mode (AX=mode ID) => CF=success |
294 | |||
295 | # For now, we only handle VESA modes (0x0200..0x03ff). To handle other | ||
296 | # modes, we should probably compile in the video code from the boot | ||
297 | # directory. | ||
294 | .code16 | 298 | .code16 |
295 | mode_seta: | 299 | mode_set: |
296 | movw %ax, %bx | 300 | movw %ax, %bx |
297 | #if 0 | 301 | subb $VIDEO_FIRST_VESA>>8, %bh |
298 | cmpb $0xff, %ah | 302 | cmpb $2, %bh |
299 | jz setalias | 303 | jb check_vesa |
300 | |||
301 | testb $VIDEO_RECALC>>8, %ah | ||
302 | jnz _setrec | ||
303 | |||
304 | cmpb $VIDEO_FIRST_RESOLUTION>>8, %ah | ||
305 | jnc setres | ||
306 | |||
307 | cmpb $VIDEO_FIRST_SPECIAL>>8, %ah | ||
308 | jz setspc | ||
309 | |||
310 | cmpb $VIDEO_FIRST_V7>>8, %ah | ||
311 | jz setv7 | ||
312 | #endif | ||
313 | |||
314 | cmpb $VIDEO_FIRST_VESA>>8, %ah | ||
315 | jnc check_vesaa | ||
316 | #if 0 | ||
317 | orb %ah, %ah | ||
318 | jz setmenu | ||
319 | #endif | ||
320 | |||
321 | decb %ah | ||
322 | # jz setbios Add bios modes later | ||
323 | 304 | ||
324 | setbada: clc | 305 | setbad: |
306 | clc | ||
325 | ret | 307 | ret |
326 | 308 | ||
327 | check_vesaa: | 309 | check_vesa: |
328 | subb $VIDEO_FIRST_VESA>>8, %bh | ||
329 | orw $0x4000, %bx # Use linear frame buffer | 310 | orw $0x4000, %bx # Use linear frame buffer |
330 | movw $0x4f02, %ax # VESA BIOS mode set call | 311 | movw $0x4f02, %ax # VESA BIOS mode set call |
331 | int $0x10 | 312 | int $0x10 |
332 | cmpw $0x004f, %ax # AL=4f if implemented | 313 | cmpw $0x004f, %ax # AL=4f if implemented |
333 | jnz _setbada # AH=0 if OK | 314 | jnz setbad # AH=0 if OK |
334 | 315 | ||
335 | stc | 316 | stc |
336 | ret | 317 | ret |
337 | 318 | ||
338 | _setbada: jmp setbada | ||
339 | |||
340 | wakeup_stack_begin: # Stack grows down | 319 | wakeup_stack_begin: # Stack grows down |
341 | 320 | ||
342 | .org 0xff0 | 321 | .org 0xff0 |
diff --git a/drivers/ieee1394/ieee1394_core.c b/drivers/ieee1394/ieee1394_core.c index ee45259573c8..98fd985a32ff 100644 --- a/drivers/ieee1394/ieee1394_core.c +++ b/drivers/ieee1394/ieee1394_core.c | |||
@@ -1273,7 +1273,7 @@ static void __exit ieee1394_cleanup(void) | |||
1273 | unregister_chrdev_region(IEEE1394_CORE_DEV, 256); | 1273 | unregister_chrdev_region(IEEE1394_CORE_DEV, 256); |
1274 | } | 1274 | } |
1275 | 1275 | ||
1276 | fs_initcall(ieee1394_init); /* same as ohci1394 */ | 1276 | module_init(ieee1394_init); |
1277 | module_exit(ieee1394_cleanup); | 1277 | module_exit(ieee1394_cleanup); |
1278 | 1278 | ||
1279 | /* Exported symbols */ | 1279 | /* Exported symbols */ |
diff --git a/drivers/ieee1394/ohci1394.c b/drivers/ieee1394/ohci1394.c index 5667c8102efc..372c5c16eb31 100644 --- a/drivers/ieee1394/ohci1394.c +++ b/drivers/ieee1394/ohci1394.c | |||
@@ -3537,7 +3537,5 @@ static int __init ohci1394_init(void) | |||
3537 | return pci_register_driver(&ohci1394_pci_driver); | 3537 | return pci_register_driver(&ohci1394_pci_driver); |
3538 | } | 3538 | } |
3539 | 3539 | ||
3540 | /* Register before most other device drivers. | 3540 | module_init(ohci1394_init); |
3541 | * Useful for remote debugging via physical DMA, e.g. using firescope. */ | ||
3542 | fs_initcall(ohci1394_init); | ||
3543 | module_exit(ohci1394_cleanup); | 3541 | module_exit(ohci1394_cleanup); |
diff --git a/include/linux/sched.h b/include/linux/sched.h index 5445eaec6908..3de79016f2a6 100644 --- a/include/linux/sched.h +++ b/include/linux/sched.h | |||
@@ -1406,6 +1406,7 @@ extern unsigned int sysctl_sched_wakeup_granularity; | |||
1406 | extern unsigned int sysctl_sched_batch_wakeup_granularity; | 1406 | extern unsigned int sysctl_sched_batch_wakeup_granularity; |
1407 | extern unsigned int sysctl_sched_stat_granularity; | 1407 | extern unsigned int sysctl_sched_stat_granularity; |
1408 | extern unsigned int sysctl_sched_runtime_limit; | 1408 | extern unsigned int sysctl_sched_runtime_limit; |
1409 | extern unsigned int sysctl_sched_compat_yield; | ||
1409 | extern unsigned int sysctl_sched_child_runs_first; | 1410 | extern unsigned int sysctl_sched_child_runs_first; |
1410 | extern unsigned int sysctl_sched_features; | 1411 | extern unsigned int sysctl_sched_features; |
1411 | 1412 | ||
diff --git a/kernel/sched.c b/kernel/sched.c index deeb1f8e0c30..6107a0cd6325 100644 --- a/kernel/sched.c +++ b/kernel/sched.c | |||
@@ -1682,6 +1682,11 @@ void fastcall wake_up_new_task(struct task_struct *p, unsigned long clone_flags) | |||
1682 | 1682 | ||
1683 | p->prio = effective_prio(p); | 1683 | p->prio = effective_prio(p); |
1684 | 1684 | ||
1685 | if (rt_prio(p->prio)) | ||
1686 | p->sched_class = &rt_sched_class; | ||
1687 | else | ||
1688 | p->sched_class = &fair_sched_class; | ||
1689 | |||
1685 | if (!p->sched_class->task_new || !sysctl_sched_child_runs_first || | 1690 | if (!p->sched_class->task_new || !sysctl_sched_child_runs_first || |
1686 | (clone_flags & CLONE_VM) || task_cpu(p) != this_cpu || | 1691 | (clone_flags & CLONE_VM) || task_cpu(p) != this_cpu || |
1687 | !current->se.on_rq) { | 1692 | !current->se.on_rq) { |
@@ -4550,10 +4555,7 @@ asmlinkage long sys_sched_yield(void) | |||
4550 | struct rq *rq = this_rq_lock(); | 4555 | struct rq *rq = this_rq_lock(); |
4551 | 4556 | ||
4552 | schedstat_inc(rq, yld_cnt); | 4557 | schedstat_inc(rq, yld_cnt); |
4553 | if (unlikely(rq->nr_running == 1)) | 4558 | current->sched_class->yield_task(rq, current); |
4554 | schedstat_inc(rq, yld_act_empty); | ||
4555 | else | ||
4556 | current->sched_class->yield_task(rq, current); | ||
4557 | 4559 | ||
4558 | /* | 4560 | /* |
4559 | * Since we are going to call schedule() anyway, there's | 4561 | * Since we are going to call schedule() anyway, there's |
diff --git a/kernel/sched_fair.c b/kernel/sched_fair.c index 892616bf2c77..c9fbe8e73a45 100644 --- a/kernel/sched_fair.c +++ b/kernel/sched_fair.c | |||
@@ -43,6 +43,14 @@ unsigned int sysctl_sched_latency __read_mostly = 20000000ULL; | |||
43 | unsigned int sysctl_sched_min_granularity __read_mostly = 2000000ULL; | 43 | unsigned int sysctl_sched_min_granularity __read_mostly = 2000000ULL; |
44 | 44 | ||
45 | /* | 45 | /* |
46 | * sys_sched_yield() compat mode | ||
47 | * | ||
48 | * This option switches the agressive yield implementation of the | ||
49 | * old scheduler back on. | ||
50 | */ | ||
51 | unsigned int __read_mostly sysctl_sched_compat_yield; | ||
52 | |||
53 | /* | ||
46 | * SCHED_BATCH wake-up granularity. | 54 | * SCHED_BATCH wake-up granularity. |
47 | * (default: 25 msec, units: nanoseconds) | 55 | * (default: 25 msec, units: nanoseconds) |
48 | * | 56 | * |
@@ -897,19 +905,62 @@ static void dequeue_task_fair(struct rq *rq, struct task_struct *p, int sleep) | |||
897 | } | 905 | } |
898 | 906 | ||
899 | /* | 907 | /* |
900 | * sched_yield() support is very simple - we dequeue and enqueue | 908 | * sched_yield() support is very simple - we dequeue and enqueue. |
909 | * | ||
910 | * If compat_yield is turned on then we requeue to the end of the tree. | ||
901 | */ | 911 | */ |
902 | static void yield_task_fair(struct rq *rq, struct task_struct *p) | 912 | static void yield_task_fair(struct rq *rq, struct task_struct *p) |
903 | { | 913 | { |
904 | struct cfs_rq *cfs_rq = task_cfs_rq(p); | 914 | struct cfs_rq *cfs_rq = task_cfs_rq(p); |
915 | struct rb_node **link = &cfs_rq->tasks_timeline.rb_node; | ||
916 | struct sched_entity *rightmost, *se = &p->se; | ||
917 | struct rb_node *parent; | ||
905 | 918 | ||
906 | __update_rq_clock(rq); | ||
907 | /* | 919 | /* |
908 | * Dequeue and enqueue the task to update its | 920 | * Are we the only task in the tree? |
909 | * position within the tree: | 921 | */ |
922 | if (unlikely(cfs_rq->nr_running == 1)) | ||
923 | return; | ||
924 | |||
925 | if (likely(!sysctl_sched_compat_yield)) { | ||
926 | __update_rq_clock(rq); | ||
927 | /* | ||
928 | * Dequeue and enqueue the task to update its | ||
929 | * position within the tree: | ||
930 | */ | ||
931 | dequeue_entity(cfs_rq, &p->se, 0); | ||
932 | enqueue_entity(cfs_rq, &p->se, 0); | ||
933 | |||
934 | return; | ||
935 | } | ||
936 | /* | ||
937 | * Find the rightmost entry in the rbtree: | ||
910 | */ | 938 | */ |
911 | dequeue_entity(cfs_rq, &p->se, 0); | 939 | do { |
912 | enqueue_entity(cfs_rq, &p->se, 0); | 940 | parent = *link; |
941 | link = &parent->rb_right; | ||
942 | } while (*link); | ||
943 | |||
944 | rightmost = rb_entry(parent, struct sched_entity, run_node); | ||
945 | /* | ||
946 | * Already in the rightmost position? | ||
947 | */ | ||
948 | if (unlikely(rightmost == se)) | ||
949 | return; | ||
950 | |||
951 | /* | ||
952 | * Minimally necessary key value to be last in the tree: | ||
953 | */ | ||
954 | se->fair_key = rightmost->fair_key + 1; | ||
955 | |||
956 | if (cfs_rq->rb_leftmost == &se->run_node) | ||
957 | cfs_rq->rb_leftmost = rb_next(&se->run_node); | ||
958 | /* | ||
959 | * Relink the task to the rightmost position: | ||
960 | */ | ||
961 | rb_erase(&se->run_node, &cfs_rq->tasks_timeline); | ||
962 | rb_link_node(&se->run_node, parent, link); | ||
963 | rb_insert_color(&se->run_node, &cfs_rq->tasks_timeline); | ||
913 | } | 964 | } |
914 | 965 | ||
915 | /* | 966 | /* |
diff --git a/kernel/sysctl.c b/kernel/sysctl.c index 6ace893c17c9..53a456ebf6d5 100644 --- a/kernel/sysctl.c +++ b/kernel/sysctl.c | |||
@@ -303,6 +303,14 @@ static ctl_table kern_table[] = { | |||
303 | .proc_handler = &proc_dointvec, | 303 | .proc_handler = &proc_dointvec, |
304 | }, | 304 | }, |
305 | #endif | 305 | #endif |
306 | { | ||
307 | .ctl_name = CTL_UNNUMBERED, | ||
308 | .procname = "sched_compat_yield", | ||
309 | .data = &sysctl_sched_compat_yield, | ||
310 | .maxlen = sizeof(unsigned int), | ||
311 | .mode = 0644, | ||
312 | .proc_handler = &proc_dointvec, | ||
313 | }, | ||
306 | #ifdef CONFIG_PROVE_LOCKING | 314 | #ifdef CONFIG_PROVE_LOCKING |
307 | { | 315 | { |
308 | .ctl_name = CTL_UNNUMBERED, | 316 | .ctl_name = CTL_UNNUMBERED, |
diff --git a/security/selinux/hooks.c b/security/selinux/hooks.c index 36946629b6ca..0753b20e23fe 100644 --- a/security/selinux/hooks.c +++ b/security/selinux/hooks.c | |||
@@ -316,6 +316,7 @@ static inline int inode_doinit(struct inode *inode) | |||
316 | } | 316 | } |
317 | 317 | ||
318 | enum { | 318 | enum { |
319 | Opt_error = -1, | ||
319 | Opt_context = 1, | 320 | Opt_context = 1, |
320 | Opt_fscontext = 2, | 321 | Opt_fscontext = 2, |
321 | Opt_defcontext = 4, | 322 | Opt_defcontext = 4, |
@@ -327,6 +328,7 @@ static match_table_t tokens = { | |||
327 | {Opt_fscontext, "fscontext=%s"}, | 328 | {Opt_fscontext, "fscontext=%s"}, |
328 | {Opt_defcontext, "defcontext=%s"}, | 329 | {Opt_defcontext, "defcontext=%s"}, |
329 | {Opt_rootcontext, "rootcontext=%s"}, | 330 | {Opt_rootcontext, "rootcontext=%s"}, |
331 | {Opt_error, NULL}, | ||
330 | }; | 332 | }; |
331 | 333 | ||
332 | #define SEL_MOUNT_FAIL_MSG "SELinux: duplicate or incompatible mount options\n" | 334 | #define SEL_MOUNT_FAIL_MSG "SELinux: duplicate or incompatible mount options\n" |