diff options
361 files changed, 4164 insertions, 2060 deletions
diff --git a/Documentation/BUG-HUNTING b/Documentation/BUG-HUNTING index 65b97e1dbf70..35f5bd243336 100644 --- a/Documentation/BUG-HUNTING +++ b/Documentation/BUG-HUNTING | |||
@@ -191,6 +191,30 @@ e.g. crash dump output as shown by Dave Miller. | |||
191 | > mov 0x8(%ebp), %ebx ! %ebx = skb->sk | 191 | > mov 0x8(%ebp), %ebx ! %ebx = skb->sk |
192 | > mov 0x13c(%ebx), %eax ! %eax = inet_sk(sk)->opt | 192 | > mov 0x13c(%ebx), %eax ! %eax = inet_sk(sk)->opt |
193 | 193 | ||
194 | In addition, you can use GDB to figure out the exact file and line | ||
195 | number of the OOPS from the vmlinux file. If you have | ||
196 | CONFIG_DEBUG_INFO enabled, you can simply copy the EIP value from the | ||
197 | OOPS: | ||
198 | |||
199 | EIP: 0060:[<c021e50e>] Not tainted VLI | ||
200 | |||
201 | And use GDB to translate that to human-readable form: | ||
202 | |||
203 | gdb vmlinux | ||
204 | (gdb) l *0xc021e50e | ||
205 | |||
206 | If you don't have CONFIG_DEBUG_INFO enabled, you use the function | ||
207 | offset from the OOPS: | ||
208 | |||
209 | EIP is at vt_ioctl+0xda8/0x1482 | ||
210 | |||
211 | And recompile the kernel with CONFIG_DEBUG_INFO enabled: | ||
212 | |||
213 | make vmlinux | ||
214 | gdb vmlinux | ||
215 | (gdb) p vt_ioctl | ||
216 | (gdb) l *(0x<address of vt_ioctl> + 0xda8) | ||
217 | |||
194 | Another very useful option of the Kernel Hacking section in menuconfig is | 218 | Another very useful option of the Kernel Hacking section in menuconfig is |
195 | Debug memory allocations. This will help you see whether data has been | 219 | Debug memory allocations. This will help you see whether data has been |
196 | initialised and not set before use etc. To see the values that get assigned | 220 | initialised and not set before use etc. To see the values that get assigned |
diff --git a/Documentation/SubmitChecklist b/Documentation/SubmitChecklist index 3af3e65cf43b..6ebffb57e3db 100644 --- a/Documentation/SubmitChecklist +++ b/Documentation/SubmitChecklist | |||
@@ -84,3 +84,9 @@ kernel patches. | |||
84 | 24: Avoid whitespace damage such as indenting with spaces or whitespace | 84 | 24: Avoid whitespace damage such as indenting with spaces or whitespace |
85 | at the end of lines. You can test this by feeding the patch to | 85 | at the end of lines. You can test this by feeding the patch to |
86 | "git apply --check --whitespace=error-all" | 86 | "git apply --check --whitespace=error-all" |
87 | |||
88 | 25: Check your patch for general style as detailed in | ||
89 | Documentation/CodingStyle. Check for trivial violations with the | ||
90 | patch style checker prior to submission (scripts/checkpatch.pl). | ||
91 | You should be able to justify all violations that remain in | ||
92 | your patch. | ||
diff --git a/Documentation/SubmittingPatches b/Documentation/SubmittingPatches index a417b25fb1aa..d91125ab6f49 100644 --- a/Documentation/SubmittingPatches +++ b/Documentation/SubmittingPatches | |||
@@ -118,7 +118,20 @@ then only post say 15 or so at a time and wait for review and integration. | |||
118 | 118 | ||
119 | 119 | ||
120 | 120 | ||
121 | 4) Select e-mail destination. | 121 | 4) Style check your changes. |
122 | |||
123 | Check your patch for basic style violations, details of which can be | ||
124 | found in Documentation/CodingStyle. Failure to do so simply wastes | ||
125 | the reviewers time and will get your patch rejected, probabally | ||
126 | without even being read. | ||
127 | |||
128 | At a minimum you should check your patches with the patch style | ||
129 | checker prior to submission (scripts/patchcheck.pl). You should | ||
130 | be able to justify all violations that remain in your patch. | ||
131 | |||
132 | |||
133 | |||
134 | 5) Select e-mail destination. | ||
122 | 135 | ||
123 | Look through the MAINTAINERS file and the source code, and determine | 136 | Look through the MAINTAINERS file and the source code, and determine |
124 | if your change applies to a specific subsystem of the kernel, with | 137 | if your change applies to a specific subsystem of the kernel, with |
@@ -146,7 +159,7 @@ discussed should the patch then be submitted to Linus. | |||
146 | 159 | ||
147 | 160 | ||
148 | 161 | ||
149 | 5) Select your CC (e-mail carbon copy) list. | 162 | 6) Select your CC (e-mail carbon copy) list. |
150 | 163 | ||
151 | Unless you have a reason NOT to do so, CC linux-kernel@vger.kernel.org. | 164 | Unless you have a reason NOT to do so, CC linux-kernel@vger.kernel.org. |
152 | 165 | ||
@@ -187,8 +200,7 @@ URL: <http://www.kernel.org/pub/linux/kernel/people/bunk/trivial/> | |||
187 | 200 | ||
188 | 201 | ||
189 | 202 | ||
190 | 203 | 7) No MIME, no links, no compression, no attachments. Just plain text. | |
191 | 6) No MIME, no links, no compression, no attachments. Just plain text. | ||
192 | 204 | ||
193 | Linus and other kernel developers need to be able to read and comment | 205 | Linus and other kernel developers need to be able to read and comment |
194 | on the changes you are submitting. It is important for a kernel | 206 | on the changes you are submitting. It is important for a kernel |
@@ -223,9 +235,9 @@ pref("mailnews.display.disable_format_flowed_support", true); | |||
223 | 235 | ||
224 | 236 | ||
225 | 237 | ||
226 | 7) E-mail size. | 238 | 8) E-mail size. |
227 | 239 | ||
228 | When sending patches to Linus, always follow step #6. | 240 | When sending patches to Linus, always follow step #7. |
229 | 241 | ||
230 | Large changes are not appropriate for mailing lists, and some | 242 | Large changes are not appropriate for mailing lists, and some |
231 | maintainers. If your patch, uncompressed, exceeds 40 kB in size, | 243 | maintainers. If your patch, uncompressed, exceeds 40 kB in size, |
@@ -234,7 +246,7 @@ server, and provide instead a URL (link) pointing to your patch. | |||
234 | 246 | ||
235 | 247 | ||
236 | 248 | ||
237 | 8) Name your kernel version. | 249 | 9) Name your kernel version. |
238 | 250 | ||
239 | It is important to note, either in the subject line or in the patch | 251 | It is important to note, either in the subject line or in the patch |
240 | description, the kernel version to which this patch applies. | 252 | description, the kernel version to which this patch applies. |
@@ -244,7 +256,7 @@ Linus will not apply it. | |||
244 | 256 | ||
245 | 257 | ||
246 | 258 | ||
247 | 9) Don't get discouraged. Re-submit. | 259 | 10) Don't get discouraged. Re-submit. |
248 | 260 | ||
249 | After you have submitted your change, be patient and wait. If Linus | 261 | After you have submitted your change, be patient and wait. If Linus |
250 | likes your change and applies it, it will appear in the next version | 262 | likes your change and applies it, it will appear in the next version |
@@ -270,7 +282,7 @@ When in doubt, solicit comments on linux-kernel mailing list. | |||
270 | 282 | ||
271 | 283 | ||
272 | 284 | ||
273 | 10) Include PATCH in the subject | 285 | 11) Include PATCH in the subject |
274 | 286 | ||
275 | Due to high e-mail traffic to Linus, and to linux-kernel, it is common | 287 | Due to high e-mail traffic to Linus, and to linux-kernel, it is common |
276 | convention to prefix your subject line with [PATCH]. This lets Linus | 288 | convention to prefix your subject line with [PATCH]. This lets Linus |
@@ -279,7 +291,7 @@ e-mail discussions. | |||
279 | 291 | ||
280 | 292 | ||
281 | 293 | ||
282 | 11) Sign your work | 294 | 12) Sign your work |
283 | 295 | ||
284 | To improve tracking of who did what, especially with patches that can | 296 | To improve tracking of who did what, especially with patches that can |
285 | percolate to their final resting place in the kernel through several | 297 | percolate to their final resting place in the kernel through several |
@@ -328,7 +340,8 @@ now, but you can do this to mark internal company procedures or just | |||
328 | point out some special detail about the sign-off. | 340 | point out some special detail about the sign-off. |
329 | 341 | ||
330 | 342 | ||
331 | 12) The canonical patch format | 343 | |
344 | 13) The canonical patch format | ||
332 | 345 | ||
333 | The canonical patch subject line is: | 346 | The canonical patch subject line is: |
334 | 347 | ||
@@ -427,6 +440,10 @@ section Linus Computer Science 101. | |||
427 | Nuff said. If your code deviates too much from this, it is likely | 440 | Nuff said. If your code deviates too much from this, it is likely |
428 | to be rejected without further review, and without comment. | 441 | to be rejected without further review, and without comment. |
429 | 442 | ||
443 | Check your patches with the patch style checker prior to submission | ||
444 | (scripts/checkpatch.pl). You should be able to justify all | ||
445 | violations that remain in your patch. | ||
446 | |||
430 | 447 | ||
431 | 448 | ||
432 | 2) #ifdefs are ugly | 449 | 2) #ifdefs are ugly |
diff --git a/Documentation/feature-removal-schedule.txt b/Documentation/feature-removal-schedule.txt index 2d7ea85075ba..49ae1ea9e868 100644 --- a/Documentation/feature-removal-schedule.txt +++ b/Documentation/feature-removal-schedule.txt | |||
@@ -70,6 +70,7 @@ Who: David Miller <davem@davemloft.net> | |||
70 | 70 | ||
71 | What: Video4Linux API 1 ioctls and video_decoder.h from Video devices. | 71 | What: Video4Linux API 1 ioctls and video_decoder.h from Video devices. |
72 | When: December 2006 | 72 | When: December 2006 |
73 | Files: include/linux/video_decoder.h | ||
73 | Why: V4L1 AP1 was replaced by V4L2 API. during migration from 2.4 to 2.6 | 74 | Why: V4L1 AP1 was replaced by V4L2 API. during migration from 2.4 to 2.6 |
74 | series. The old API have lots of drawbacks and don't provide enough | 75 | series. The old API have lots of drawbacks and don't provide enough |
75 | means to work with all video and audio standards. The newer API is | 76 | means to work with all video and audio standards. The newer API is |
diff --git a/Documentation/hrtimer/timer_stats.txt b/Documentation/hrtimer/timer_stats.txt index 27f782e3593f..22b0814d0ad0 100644 --- a/Documentation/hrtimer/timer_stats.txt +++ b/Documentation/hrtimer/timer_stats.txt | |||
@@ -2,9 +2,10 @@ timer_stats - timer usage statistics | |||
2 | ------------------------------------ | 2 | ------------------------------------ |
3 | 3 | ||
4 | timer_stats is a debugging facility to make the timer (ab)usage in a Linux | 4 | timer_stats is a debugging facility to make the timer (ab)usage in a Linux |
5 | system visible to kernel and userspace developers. It is not intended for | 5 | system visible to kernel and userspace developers. If enabled in the config |
6 | production usage as it adds significant overhead to the (hr)timer code and the | 6 | but not used it has almost zero runtime overhead, and a relatively small |
7 | (hr)timer data structures. | 7 | data structure overhead. Even if collection is enabled runtime all the |
8 | locking is per-CPU and lookup is hashed. | ||
8 | 9 | ||
9 | timer_stats should be used by kernel and userspace developers to verify that | 10 | timer_stats should be used by kernel and userspace developers to verify that |
10 | their code does not make unduly use of timers. This helps to avoid unnecessary | 11 | their code does not make unduly use of timers. This helps to avoid unnecessary |
diff --git a/Documentation/ia64/aliasing-test.c b/Documentation/ia64/aliasing-test.c index 3153167b41c3..d485256ee1ce 100644 --- a/Documentation/ia64/aliasing-test.c +++ b/Documentation/ia64/aliasing-test.c | |||
@@ -197,7 +197,7 @@ skip: | |||
197 | return rc; | 197 | return rc; |
198 | } | 198 | } |
199 | 199 | ||
200 | main() | 200 | int main() |
201 | { | 201 | { |
202 | int rc; | 202 | int rc; |
203 | 203 | ||
diff --git a/Documentation/kernel-parameters.txt b/Documentation/kernel-parameters.txt index aae2282600ca..5d0283cd3a81 100644 --- a/Documentation/kernel-parameters.txt +++ b/Documentation/kernel-parameters.txt | |||
@@ -170,7 +170,10 @@ and is between 256 and 4096 characters. It is defined in the file | |||
170 | acpi_os_name= [HW,ACPI] Tell ACPI BIOS the name of the OS | 170 | acpi_os_name= [HW,ACPI] Tell ACPI BIOS the name of the OS |
171 | Format: To spoof as Windows 98: ="Microsoft Windows" | 171 | Format: To spoof as Windows 98: ="Microsoft Windows" |
172 | 172 | ||
173 | acpi_osi= [HW,ACPI] empty param disables _OSI | 173 | acpi_osi= [HW,ACPI] Modify list of supported OS interface strings |
174 | acpi_osi="string1" # add string1 -- only one string | ||
175 | acpi_osi="!string2" # remove built-in string2 | ||
176 | acpi_osi= # disable all strings | ||
174 | 177 | ||
175 | acpi_serialize [HW,ACPI] force serialization of AML methods | 178 | acpi_serialize [HW,ACPI] force serialization of AML methods |
176 | 179 | ||
@@ -1132,9 +1135,9 @@ and is between 256 and 4096 characters. It is defined in the file | |||
1132 | when set. | 1135 | when set. |
1133 | Format: <int> | 1136 | Format: <int> |
1134 | 1137 | ||
1135 | noaliencache [MM, NUMA] Disables the allcoation of alien caches in | 1138 | noaliencache [MM, NUMA, SLAB] Disables the allocation of alien |
1136 | the slab allocator. Saves per-node memory, but will | 1139 | caches in the slab allocator. Saves per-node memory, |
1137 | impact performance on real NUMA hardware. | 1140 | but will impact performance. |
1138 | 1141 | ||
1139 | noalign [KNL,ARM] | 1142 | noalign [KNL,ARM] |
1140 | 1143 | ||
@@ -1613,6 +1616,37 @@ and is between 256 and 4096 characters. It is defined in the file | |||
1613 | 1616 | ||
1614 | slram= [HW,MTD] | 1617 | slram= [HW,MTD] |
1615 | 1618 | ||
1619 | slub_debug [MM, SLUB] | ||
1620 | Enabling slub_debug allows one to determine the culprit | ||
1621 | if slab objects become corrupted. Enabling slub_debug | ||
1622 | creates guard zones around objects and poisons objects | ||
1623 | when not in use. Also tracks the last alloc / free. | ||
1624 | For more information see Documentation/vm/slub.txt. | ||
1625 | |||
1626 | slub_max_order= [MM, SLUB] | ||
1627 | Determines the maximum allowed order for slabs. Setting | ||
1628 | this too high may cause fragmentation. | ||
1629 | For more information see Documentation/vm/slub.txt. | ||
1630 | |||
1631 | slub_min_objects= [MM, SLUB] | ||
1632 | The minimum objects per slab. SLUB will increase the | ||
1633 | slab order up to slub_max_order to generate a | ||
1634 | sufficiently big slab to satisfy the number of objects. | ||
1635 | The higher the number of objects the smaller the overhead | ||
1636 | of tracking slabs. | ||
1637 | For more information see Documentation/vm/slub.txt. | ||
1638 | |||
1639 | slub_min_order= [MM, SLUB] | ||
1640 | Determines the mininum page order for slabs. Must be | ||
1641 | lower than slub_max_order | ||
1642 | For more information see Documentation/vm/slub.txt. | ||
1643 | |||
1644 | slub_nomerge [MM, SLUB] | ||
1645 | Disable merging of slabs of similar size. May be | ||
1646 | necessary if there is some reason to distinguish | ||
1647 | allocs to different slabs. | ||
1648 | For more information see Documentation/vm/slub.txt. | ||
1649 | |||
1616 | smart2= [HW] | 1650 | smart2= [HW] |
1617 | Format: <io1>[,<io2>[,...,<io8>]] | 1651 | Format: <io1>[,<io2>[,...,<io8>]] |
1618 | 1652 | ||
diff --git a/Documentation/networking/xfrm_sysctl.txt b/Documentation/networking/xfrm_sysctl.txt new file mode 100644 index 000000000000..5bbd16792fe1 --- /dev/null +++ b/Documentation/networking/xfrm_sysctl.txt | |||
@@ -0,0 +1,4 @@ | |||
1 | /proc/sys/net/core/xfrm_* Variables: | ||
2 | |||
3 | xfrm_acq_expires - INTEGER | ||
4 | default 30 - hard timeout in seconds for acquire requests | ||
diff --git a/Documentation/sound/alsa/ALSA-Configuration.txt b/Documentation/sound/alsa/ALSA-Configuration.txt index 57b878cc393c..355ff0a2bb7c 100644 --- a/Documentation/sound/alsa/ALSA-Configuration.txt +++ b/Documentation/sound/alsa/ALSA-Configuration.txt | |||
@@ -917,6 +917,7 @@ Prior to version 0.9.0rc4 options had a 'snd_' prefix. This was removed. | |||
917 | ref Reference board, base config | 917 | ref Reference board, base config |
918 | m2-2 Some Gateway MX series laptops | 918 | m2-2 Some Gateway MX series laptops |
919 | m6 Some Gateway NX series laptops | 919 | m6 Some Gateway NX series laptops |
920 | pa6 Gateway NX860 series | ||
920 | 921 | ||
921 | STAC9227/9228/9229/927x | 922 | STAC9227/9228/9229/927x |
922 | ref Reference board | 923 | ref Reference board |
diff --git a/Documentation/thinkpad-acpi.txt b/Documentation/thinkpad-acpi.txt index 2d4803359a04..9e6b94face4b 100644 --- a/Documentation/thinkpad-acpi.txt +++ b/Documentation/thinkpad-acpi.txt | |||
@@ -138,7 +138,7 @@ Hot keys | |||
138 | -------- | 138 | -------- |
139 | 139 | ||
140 | procfs: /proc/acpi/ibm/hotkey | 140 | procfs: /proc/acpi/ibm/hotkey |
141 | sysfs device attribute: hotkey/* | 141 | sysfs device attribute: hotkey_* |
142 | 142 | ||
143 | Without this driver, only the Fn-F4 key (sleep button) generates an | 143 | Without this driver, only the Fn-F4 key (sleep button) generates an |
144 | ACPI event. With the driver loaded, the hotkey feature enabled and the | 144 | ACPI event. With the driver loaded, the hotkey feature enabled and the |
@@ -196,10 +196,7 @@ The following commands can be written to the /proc/acpi/ibm/hotkey file: | |||
196 | 196 | ||
197 | sysfs notes: | 197 | sysfs notes: |
198 | 198 | ||
199 | The hot keys attributes are in a hotkey/ subdirectory off the | 199 | hotkey_bios_enabled: |
200 | thinkpad device. | ||
201 | |||
202 | bios_enabled: | ||
203 | Returns the status of the hot keys feature when | 200 | Returns the status of the hot keys feature when |
204 | thinkpad-acpi was loaded. Upon module unload, the hot | 201 | thinkpad-acpi was loaded. Upon module unload, the hot |
205 | key feature status will be restored to this value. | 202 | key feature status will be restored to this value. |
@@ -207,19 +204,19 @@ sysfs notes: | |||
207 | 0: hot keys were disabled | 204 | 0: hot keys were disabled |
208 | 1: hot keys were enabled | 205 | 1: hot keys were enabled |
209 | 206 | ||
210 | bios_mask: | 207 | hotkey_bios_mask: |
211 | Returns the hot keys mask when thinkpad-acpi was loaded. | 208 | Returns the hot keys mask when thinkpad-acpi was loaded. |
212 | Upon module unload, the hot keys mask will be restored | 209 | Upon module unload, the hot keys mask will be restored |
213 | to this value. | 210 | to this value. |
214 | 211 | ||
215 | enable: | 212 | hotkey_enable: |
216 | Enables/disables the hot keys feature, and reports | 213 | Enables/disables the hot keys feature, and reports |
217 | current status of the hot keys feature. | 214 | current status of the hot keys feature. |
218 | 215 | ||
219 | 0: disables the hot keys feature / feature disabled | 216 | 0: disables the hot keys feature / feature disabled |
220 | 1: enables the hot keys feature / feature enabled | 217 | 1: enables the hot keys feature / feature enabled |
221 | 218 | ||
222 | mask: | 219 | hotkey_mask: |
223 | bit mask to enable ACPI event generation for each hot | 220 | bit mask to enable ACPI event generation for each hot |
224 | key (see above). Returns the current status of the hot | 221 | key (see above). Returns the current status of the hot |
225 | keys mask, and allows one to modify it. | 222 | keys mask, and allows one to modify it. |
@@ -229,7 +226,7 @@ Bluetooth | |||
229 | --------- | 226 | --------- |
230 | 227 | ||
231 | procfs: /proc/acpi/ibm/bluetooth | 228 | procfs: /proc/acpi/ibm/bluetooth |
232 | sysfs device attribute: bluetooth/enable | 229 | sysfs device attribute: bluetooth_enable |
233 | 230 | ||
234 | This feature shows the presence and current state of a ThinkPad | 231 | This feature shows the presence and current state of a ThinkPad |
235 | Bluetooth device in the internal ThinkPad CDC slot. | 232 | Bluetooth device in the internal ThinkPad CDC slot. |
@@ -244,7 +241,7 @@ If Bluetooth is installed, the following commands can be used: | |||
244 | Sysfs notes: | 241 | Sysfs notes: |
245 | 242 | ||
246 | If the Bluetooth CDC card is installed, it can be enabled / | 243 | If the Bluetooth CDC card is installed, it can be enabled / |
247 | disabled through the "bluetooth/enable" thinkpad-acpi device | 244 | disabled through the "bluetooth_enable" thinkpad-acpi device |
248 | attribute, and its current status can also be queried. | 245 | attribute, and its current status can also be queried. |
249 | 246 | ||
250 | enable: | 247 | enable: |
@@ -252,7 +249,7 @@ Sysfs notes: | |||
252 | 1: enables Bluetooth / Bluetooth is enabled. | 249 | 1: enables Bluetooth / Bluetooth is enabled. |
253 | 250 | ||
254 | Note: this interface will be probably be superseeded by the | 251 | Note: this interface will be probably be superseeded by the |
255 | generic rfkill class. | 252 | generic rfkill class, so it is NOT to be considered stable yet. |
256 | 253 | ||
257 | Video output control -- /proc/acpi/ibm/video | 254 | Video output control -- /proc/acpi/ibm/video |
258 | -------------------------------------------- | 255 | -------------------------------------------- |
@@ -898,7 +895,7 @@ EXPERIMENTAL: WAN | |||
898 | ----------------- | 895 | ----------------- |
899 | 896 | ||
900 | procfs: /proc/acpi/ibm/wan | 897 | procfs: /proc/acpi/ibm/wan |
901 | sysfs device attribute: wwan/enable | 898 | sysfs device attribute: wwan_enable |
902 | 899 | ||
903 | This feature is marked EXPERIMENTAL because the implementation | 900 | This feature is marked EXPERIMENTAL because the implementation |
904 | directly accesses hardware registers and may not work as expected. USE | 901 | directly accesses hardware registers and may not work as expected. USE |
@@ -921,7 +918,7 @@ If the W-WAN card is installed, the following commands can be used: | |||
921 | Sysfs notes: | 918 | Sysfs notes: |
922 | 919 | ||
923 | If the W-WAN card is installed, it can be enabled / | 920 | If the W-WAN card is installed, it can be enabled / |
924 | disabled through the "wwan/enable" thinkpad-acpi device | 921 | disabled through the "wwan_enable" thinkpad-acpi device |
925 | attribute, and its current status can also be queried. | 922 | attribute, and its current status can also be queried. |
926 | 923 | ||
927 | enable: | 924 | enable: |
@@ -929,7 +926,7 @@ Sysfs notes: | |||
929 | 1: enables WWAN card / WWAN card is enabled. | 926 | 1: enables WWAN card / WWAN card is enabled. |
930 | 927 | ||
931 | Note: this interface will be probably be superseeded by the | 928 | Note: this interface will be probably be superseeded by the |
932 | generic rfkill class. | 929 | generic rfkill class, so it is NOT to be considered stable yet. |
933 | 930 | ||
934 | Multiple Commands, Module Parameters | 931 | Multiple Commands, Module Parameters |
935 | ------------------------------------ | 932 | ------------------------------------ |
diff --git a/Documentation/vm/slub.txt b/Documentation/vm/slub.txt index 727c8d81aeaf..1523320abd87 100644 --- a/Documentation/vm/slub.txt +++ b/Documentation/vm/slub.txt | |||
@@ -1,13 +1,9 @@ | |||
1 | Short users guide for SLUB | 1 | Short users guide for SLUB |
2 | -------------------------- | 2 | -------------------------- |
3 | 3 | ||
4 | First of all slub should transparently replace SLAB. If you enable | ||
5 | SLUB then everything should work the same (Note the word "should". | ||
6 | There is likely not much value in that word at this point). | ||
7 | |||
8 | The basic philosophy of SLUB is very different from SLAB. SLAB | 4 | The basic philosophy of SLUB is very different from SLAB. SLAB |
9 | requires rebuilding the kernel to activate debug options for all | 5 | requires rebuilding the kernel to activate debug options for all |
10 | SLABS. SLUB always includes full debugging but its off by default. | 6 | slab caches. SLUB always includes full debugging but it is off by default. |
11 | SLUB can enable debugging only for selected slabs in order to avoid | 7 | SLUB can enable debugging only for selected slabs in order to avoid |
12 | an impact on overall system performance which may make a bug more | 8 | an impact on overall system performance which may make a bug more |
13 | difficult to find. | 9 | difficult to find. |
@@ -76,13 +72,28 @@ of objects. | |||
76 | Careful with tracing: It may spew out lots of information and never stop if | 72 | Careful with tracing: It may spew out lots of information and never stop if |
77 | used on the wrong slab. | 73 | used on the wrong slab. |
78 | 74 | ||
79 | SLAB Merging | 75 | Slab merging |
80 | ------------ | 76 | ------------ |
81 | 77 | ||
82 | If no debugging is specified then SLUB may merge similar slabs together | 78 | If no debug options are specified then SLUB may merge similar slabs together |
83 | in order to reduce overhead and increase cache hotness of objects. | 79 | in order to reduce overhead and increase cache hotness of objects. |
84 | slabinfo -a displays which slabs were merged together. | 80 | slabinfo -a displays which slabs were merged together. |
85 | 81 | ||
82 | Slab validation | ||
83 | --------------- | ||
84 | |||
85 | SLUB can validate all object if the kernel was booted with slub_debug. In | ||
86 | order to do so you must have the slabinfo tool. Then you can do | ||
87 | |||
88 | slabinfo -v | ||
89 | |||
90 | which will test all objects. Output will be generated to the syslog. | ||
91 | |||
92 | This also works in a more limited way if boot was without slab debug. | ||
93 | In that case slabinfo -v simply tests all reachable objects. Usually | ||
94 | these are in the cpu slabs and the partial slabs. Full slabs are not | ||
95 | tracked by SLUB in a non debug situation. | ||
96 | |||
86 | Getting more performance | 97 | Getting more performance |
87 | ------------------------ | 98 | ------------------------ |
88 | 99 | ||
@@ -91,9 +102,9 @@ list_lock once in a while to deal with partial slabs. That overhead is | |||
91 | governed by the order of the allocation for each slab. The allocations | 102 | governed by the order of the allocation for each slab. The allocations |
92 | can be influenced by kernel parameters: | 103 | can be influenced by kernel parameters: |
93 | 104 | ||
94 | slub_min_objects=x (default 8) | 105 | slub_min_objects=x (default 4) |
95 | slub_min_order=x (default 0) | 106 | slub_min_order=x (default 0) |
96 | slub_max_order=x (default 4) | 107 | slub_max_order=x (default 1) |
97 | 108 | ||
98 | slub_min_objects allows to specify how many objects must at least fit | 109 | slub_min_objects allows to specify how many objects must at least fit |
99 | into one slab in order for the allocation order to be acceptable. | 110 | into one slab in order for the allocation order to be acceptable. |
@@ -109,5 +120,107 @@ longer be checked. This is useful to avoid SLUB trying to generate | |||
109 | super large order pages to fit slub_min_objects of a slab cache with | 120 | super large order pages to fit slub_min_objects of a slab cache with |
110 | large object sizes into one high order page. | 121 | large object sizes into one high order page. |
111 | 122 | ||
112 | 123 | SLUB Debug output | |
113 | Christoph Lameter, <clameter@sgi.com>, April 10, 2007 | 124 | ----------------- |
125 | |||
126 | Here is a sample of slub debug output: | ||
127 | |||
128 | *** SLUB kmalloc-8: Redzone Active@0xc90f6d20 slab 0xc528c530 offset=3360 flags=0x400000c3 inuse=61 freelist=0xc90f6d58 | ||
129 | Bytes b4 0xc90f6d10: 00 00 00 00 00 00 00 00 5a 5a 5a 5a 5a 5a 5a 5a ........ZZZZZZZZ | ||
130 | Object 0xc90f6d20: 31 30 31 39 2e 30 30 35 1019.005 | ||
131 | Redzone 0xc90f6d28: 00 cc cc cc . | ||
132 | FreePointer 0xc90f6d2c -> 0xc90f6d58 | ||
133 | Last alloc: get_modalias+0x61/0xf5 jiffies_ago=53 cpu=1 pid=554 | ||
134 | Filler 0xc90f6d50: 5a 5a 5a 5a 5a 5a 5a 5a ZZZZZZZZ | ||
135 | [<c010523d>] dump_trace+0x63/0x1eb | ||
136 | [<c01053df>] show_trace_log_lvl+0x1a/0x2f | ||
137 | [<c010601d>] show_trace+0x12/0x14 | ||
138 | [<c0106035>] dump_stack+0x16/0x18 | ||
139 | [<c017e0fa>] object_err+0x143/0x14b | ||
140 | [<c017e2cc>] check_object+0x66/0x234 | ||
141 | [<c017eb43>] __slab_free+0x239/0x384 | ||
142 | [<c017f446>] kfree+0xa6/0xc6 | ||
143 | [<c02e2335>] get_modalias+0xb9/0xf5 | ||
144 | [<c02e23b7>] dmi_dev_uevent+0x27/0x3c | ||
145 | [<c027866a>] dev_uevent+0x1ad/0x1da | ||
146 | [<c0205024>] kobject_uevent_env+0x20a/0x45b | ||
147 | [<c020527f>] kobject_uevent+0xa/0xf | ||
148 | [<c02779f1>] store_uevent+0x4f/0x58 | ||
149 | [<c027758e>] dev_attr_store+0x29/0x2f | ||
150 | [<c01bec4f>] sysfs_write_file+0x16e/0x19c | ||
151 | [<c0183ba7>] vfs_write+0xd1/0x15a | ||
152 | [<c01841d7>] sys_write+0x3d/0x72 | ||
153 | [<c0104112>] sysenter_past_esp+0x5f/0x99 | ||
154 | [<b7f7b410>] 0xb7f7b410 | ||
155 | ======================= | ||
156 | @@@ SLUB kmalloc-8: Restoring redzone (0xcc) from 0xc90f6d28-0xc90f6d2b | ||
157 | |||
158 | |||
159 | |||
160 | If SLUB encounters a corrupted object then it will perform the following | ||
161 | actions: | ||
162 | |||
163 | 1. Isolation and report of the issue | ||
164 | |||
165 | This will be a message in the system log starting with | ||
166 | |||
167 | *** SLUB <slab cache affected>: <What went wrong>@<object address> | ||
168 | offset=<offset of object into slab> flags=<slabflags> | ||
169 | inuse=<objects in use in this slab> freelist=<first free object in slab> | ||
170 | |||
171 | 2. Report on how the problem was dealt with in order to ensure the continued | ||
172 | operation of the system. | ||
173 | |||
174 | These are messages in the system log beginning with | ||
175 | |||
176 | @@@ SLUB <slab cache affected>: <corrective action taken> | ||
177 | |||
178 | |||
179 | In the above sample SLUB found that the Redzone of an active object has | ||
180 | been overwritten. Here a string of 8 characters was written into a slab that | ||
181 | has the length of 8 characters. However, a 8 character string needs a | ||
182 | terminating 0. That zero has overwritten the first byte of the Redzone field. | ||
183 | After reporting the details of the issue encountered the @@@ SLUB message | ||
184 | tell us that SLUB has restored the redzone to its proper value and then | ||
185 | system operations continue. | ||
186 | |||
187 | Various types of lines can follow the @@@ SLUB line: | ||
188 | |||
189 | Bytes b4 <address> : <bytes> | ||
190 | Show a few bytes before the object where the problem was detected. | ||
191 | Can be useful if the corruption does not stop with the start of the | ||
192 | object. | ||
193 | |||
194 | Object <address> : <bytes> | ||
195 | The bytes of the object. If the object is inactive then the bytes | ||
196 | typically contain poisoning values. Any non-poison value shows a | ||
197 | corruption by a write after free. | ||
198 | |||
199 | Redzone <address> : <bytes> | ||
200 | The redzone following the object. The redzone is used to detect | ||
201 | writes after the object. All bytes should always have the same | ||
202 | value. If there is any deviation then it is due to a write after | ||
203 | the object boundary. | ||
204 | |||
205 | Freepointer | ||
206 | The pointer to the next free object in the slab. May become | ||
207 | corrupted if overwriting continues after the red zone. | ||
208 | |||
209 | Last alloc: | ||
210 | Last free: | ||
211 | Shows the address from which the object was allocated/freed last. | ||
212 | We note the pid, the time and the CPU that did so. This is usually | ||
213 | the most useful information to figure out where things went wrong. | ||
214 | Here get_modalias() did an kmalloc(8) instead of a kmalloc(9). | ||
215 | |||
216 | Filler <address> : <bytes> | ||
217 | Unused data to fill up the space in order to get the next object | ||
218 | properly aligned. In the debug case we make sure that there are | ||
219 | at least 4 bytes of filler. This allow for the detection of writes | ||
220 | before the object. | ||
221 | |||
222 | Following the filler will be a stackdump. That stackdump describes the | ||
223 | location where the error was detected. The cause of the corruption is more | ||
224 | likely to be found by looking at the information about the last alloc / free. | ||
225 | |||
226 | Christoph Lameter, <clameter@sgi.com>, May 23, 2007 | ||
diff --git a/Documentation/watchdog/pcwd-watchdog.txt b/Documentation/watchdog/pcwd-watchdog.txt index d9ee6336c1d4..4f68052395c0 100644 --- a/Documentation/watchdog/pcwd-watchdog.txt +++ b/Documentation/watchdog/pcwd-watchdog.txt | |||
@@ -1,3 +1,5 @@ | |||
1 | Last reviewed: 10/05/2007 | ||
2 | |||
1 | Berkshire Products PC Watchdog Card | 3 | Berkshire Products PC Watchdog Card |
2 | Support for ISA Cards Revision A and C | 4 | Support for ISA Cards Revision A and C |
3 | Documentation and Driver by Ken Hollis <kenji@bitgate.com> | 5 | Documentation and Driver by Ken Hollis <kenji@bitgate.com> |
@@ -14,8 +16,8 @@ | |||
14 | 16 | ||
15 | The Watchdog Driver will automatically find your watchdog card, and will | 17 | The Watchdog Driver will automatically find your watchdog card, and will |
16 | attach a running driver for use with that card. After the watchdog | 18 | attach a running driver for use with that card. After the watchdog |
17 | drivers have initialized, you can then talk to the card using the PC | 19 | drivers have initialized, you can then talk to the card using a PC |
18 | Watchdog program, available from http://ftp.bitgate.com/pcwd/. | 20 | Watchdog program. |
19 | 21 | ||
20 | I suggest putting a "watchdog -d" before the beginning of an fsck, and | 22 | I suggest putting a "watchdog -d" before the beginning of an fsck, and |
21 | a "watchdog -e -t 1" immediately after the end of an fsck. (Remember | 23 | a "watchdog -e -t 1" immediately after the end of an fsck. (Remember |
@@ -62,5 +64,3 @@ | |||
62 | -- Ken Hollis | 64 | -- Ken Hollis |
63 | (kenji@bitgate.com) | 65 | (kenji@bitgate.com) |
64 | 66 | ||
65 | (This documentation may be out of date. Check | ||
66 | http://ftp.bitgate.com/pcwd/ for the absolute latest additions.) | ||
diff --git a/Documentation/watchdog/watchdog-api.txt b/Documentation/watchdog/watchdog-api.txt index 8d16f6f3c4ec..bb7cb1d31ec7 100644 --- a/Documentation/watchdog/watchdog-api.txt +++ b/Documentation/watchdog/watchdog-api.txt | |||
@@ -1,3 +1,6 @@ | |||
1 | Last reviewed: 10/05/2007 | ||
2 | |||
3 | |||
1 | The Linux Watchdog driver API. | 4 | The Linux Watchdog driver API. |
2 | 5 | ||
3 | Copyright 2002 Christer Weingel <wingel@nano-system.com> | 6 | Copyright 2002 Christer Weingel <wingel@nano-system.com> |
@@ -22,7 +25,7 @@ the system. If userspace fails (RAM error, kernel bug, whatever), the | |||
22 | notifications cease to occur, and the hardware watchdog will reset the | 25 | notifications cease to occur, and the hardware watchdog will reset the |
23 | system (causing a reboot) after the timeout occurs. | 26 | system (causing a reboot) after the timeout occurs. |
24 | 27 | ||
25 | The Linux watchdog API is a rather AD hoc construction and different | 28 | The Linux watchdog API is a rather ad-hoc construction and different |
26 | drivers implement different, and sometimes incompatible, parts of it. | 29 | drivers implement different, and sometimes incompatible, parts of it. |
27 | This file is an attempt to document the existing usage and allow | 30 | This file is an attempt to document the existing usage and allow |
28 | future driver writers to use it as a reference. | 31 | future driver writers to use it as a reference. |
@@ -46,14 +49,16 @@ some of the drivers support the configuration option "Disable watchdog | |||
46 | shutdown on close", CONFIG_WATCHDOG_NOWAYOUT. If it is set to Y when | 49 | shutdown on close", CONFIG_WATCHDOG_NOWAYOUT. If it is set to Y when |
47 | compiling the kernel, there is no way of disabling the watchdog once | 50 | compiling the kernel, there is no way of disabling the watchdog once |
48 | it has been started. So, if the watchdog daemon crashes, the system | 51 | it has been started. So, if the watchdog daemon crashes, the system |
49 | will reboot after the timeout has passed. | 52 | will reboot after the timeout has passed. Watchdog devices also usually |
53 | support the nowayout module parameter so that this option can be controlled | ||
54 | at runtime. | ||
50 | 55 | ||
51 | Some other drivers will not disable the watchdog, unless a specific | 56 | Drivers will not disable the watchdog, unless a specific magic character 'V' |
52 | magic character 'V' has been sent /dev/watchdog just before closing | 57 | has been sent /dev/watchdog just before closing the file. If the userspace |
53 | the file. If the userspace daemon closes the file without sending | 58 | daemon closes the file without sending this special character, the driver |
54 | this special character, the driver will assume that the daemon (and | 59 | will assume that the daemon (and userspace in general) died, and will stop |
55 | userspace in general) died, and will stop pinging the watchdog without | 60 | pinging the watchdog without disabling it first. This will then cause a |
56 | disabling it first. This will then cause a reboot. | 61 | reboot if the watchdog is not re-opened in sufficient time. |
57 | 62 | ||
58 | The ioctl API: | 63 | The ioctl API: |
59 | 64 | ||
@@ -227,218 +232,3 @@ The following options are available: | |||
227 | 232 | ||
228 | [FIXME -- better explanations] | 233 | [FIXME -- better explanations] |
229 | 234 | ||
230 | Implementations in the current drivers in the kernel tree: | ||
231 | |||
232 | Here I have tried to summarize what the different drivers support and | ||
233 | where they do strange things compared to the other drivers. | ||
234 | |||
235 | acquirewdt.c -- Acquire Single Board Computer | ||
236 | |||
237 | This driver has a hardcoded timeout of 1 minute | ||
238 | |||
239 | Supports CONFIG_WATCHDOG_NOWAYOUT | ||
240 | |||
241 | GETSUPPORT returns KEEPALIVEPING. GETSTATUS will return 1 if | ||
242 | the device is open, 0 if not. [FIXME -- isn't this rather | ||
243 | silly? To be able to use the ioctl, the device must be open | ||
244 | and so GETSTATUS will always return 1]. | ||
245 | |||
246 | advantechwdt.c -- Advantech Single Board Computer | ||
247 | |||
248 | Timeout that defaults to 60 seconds, supports SETTIMEOUT. | ||
249 | |||
250 | Supports CONFIG_WATCHDOG_NOWAYOUT | ||
251 | |||
252 | GETSUPPORT returns WDIOF_KEEPALIVEPING and WDIOF_SETTIMEOUT. | ||
253 | The GETSTATUS call returns if the device is open or not. | ||
254 | [FIXME -- silliness again?] | ||
255 | |||
256 | booke_wdt.c -- PowerPC BookE Watchdog Timer | ||
257 | |||
258 | Timeout default varies according to frequency, supports | ||
259 | SETTIMEOUT | ||
260 | |||
261 | Watchdog cannot be turned off, CONFIG_WATCHDOG_NOWAYOUT | ||
262 | does not make sense | ||
263 | |||
264 | GETSUPPORT returns the watchdog_info struct, and | ||
265 | GETSTATUS returns the supported options. GETBOOTSTATUS | ||
266 | returns a 1 if the last reset was caused by the | ||
267 | watchdog and a 0 otherwise. This watchdog cannot be | ||
268 | disabled once it has been started. The wdt_period kernel | ||
269 | parameter selects which bit of the time base changing | ||
270 | from 0->1 will trigger the watchdog exception. Changing | ||
271 | the timeout from the ioctl calls will change the | ||
272 | wdt_period as defined above. Finally if you would like to | ||
273 | replace the default Watchdog Handler you can implement the | ||
274 | WatchdogHandler() function in your own code. | ||
275 | |||
276 | eurotechwdt.c -- Eurotech CPU-1220/1410 | ||
277 | |||
278 | The timeout can be set using the SETTIMEOUT ioctl and defaults | ||
279 | to 60 seconds. | ||
280 | |||
281 | Also has a module parameter "ev", event type which controls | ||
282 | what should happen on a timeout, the string "int" or anything | ||
283 | else that causes a reboot. [FIXME -- better description] | ||
284 | |||
285 | Supports CONFIG_WATCHDOG_NOWAYOUT | ||
286 | |||
287 | GETSUPPORT returns CARDRESET and WDIOF_SETTIMEOUT but | ||
288 | GETSTATUS is not supported and GETBOOTSTATUS just returns 0. | ||
289 | |||
290 | i810-tco.c -- Intel 810 chipset | ||
291 | |||
292 | Also has support for a lot of other i8x0 stuff, but the | ||
293 | watchdog is one of the things. | ||
294 | |||
295 | The timeout is set using the module parameter "i810_margin", | ||
296 | which is in steps of 0.6 seconds where 2<i810_margin<64. The | ||
297 | driver supports the SETTIMEOUT ioctl. | ||
298 | |||
299 | Supports CONFIG_WATCHDOG_NOWAYOUT. | ||
300 | |||
301 | GETSUPPORT returns WDIOF_SETTIMEOUT. The GETSTATUS call | ||
302 | returns some kind of timer value which ist not compatible with | ||
303 | the other drivers. GETBOOT status returns some kind of | ||
304 | hardware specific boot status. [FIXME -- describe this] | ||
305 | |||
306 | ib700wdt.c -- IB700 Single Board Computer | ||
307 | |||
308 | Default timeout of 30 seconds and the timeout is settable | ||
309 | using the SETTIMEOUT ioctl. Note that only a few timeout | ||
310 | values are supported. | ||
311 | |||
312 | Supports CONFIG_WATCHDOG_NOWAYOUT | ||
313 | |||
314 | GETSUPPORT returns WDIOF_KEEPALIVEPING and WDIOF_SETTIMEOUT. | ||
315 | The GETSTATUS call returns if the device is open or not. | ||
316 | [FIXME -- silliness again?] | ||
317 | |||
318 | machzwd.c -- MachZ ZF-Logic | ||
319 | |||
320 | Hardcoded timeout of 10 seconds | ||
321 | |||
322 | Has a module parameter "action" that controls what happens | ||
323 | when the timeout runs out which can be 0 = RESET (default), | ||
324 | 1 = SMI, 2 = NMI, 3 = SCI. | ||
325 | |||
326 | Supports CONFIG_WATCHDOG_NOWAYOUT and the magic character | ||
327 | 'V' close handling. | ||
328 | |||
329 | GETSUPPORT returns WDIOF_KEEPALIVEPING, and the GETSTATUS call | ||
330 | returns if the device is open or not. [FIXME -- silliness | ||
331 | again?] | ||
332 | |||
333 | mixcomwd.c -- MixCom Watchdog | ||
334 | |||
335 | [FIXME -- I'm unable to tell what the timeout is] | ||
336 | |||
337 | Supports CONFIG_WATCHDOG_NOWAYOUT | ||
338 | |||
339 | GETSUPPORT returns WDIOF_KEEPALIVEPING, GETSTATUS returns if | ||
340 | the device is opened or not [FIXME -- I'm not really sure how | ||
341 | this works, there seems to be some magic connected to | ||
342 | CONFIG_WATCHDOG_NOWAYOUT] | ||
343 | |||
344 | pcwd.c -- Berkshire PC Watchdog | ||
345 | |||
346 | Hardcoded timeout of 1.5 seconds | ||
347 | |||
348 | Supports CONFIG_WATCHDOG_NOWAYOUT | ||
349 | |||
350 | GETSUPPORT returns WDIOF_OVERHEAT|WDIOF_CARDRESET and both | ||
351 | GETSTATUS and GETBOOTSTATUS return something useful. | ||
352 | |||
353 | The SETOPTIONS call can be used to enable and disable the card | ||
354 | and to ask the driver to call panic if the system overheats. | ||
355 | |||
356 | sbc60xxwdt.c -- 60xx Single Board Computer | ||
357 | |||
358 | Hardcoded timeout of 10 seconds | ||
359 | |||
360 | Does not support CONFIG_WATCHDOG_NOWAYOUT, but has the magic | ||
361 | character 'V' close handling. | ||
362 | |||
363 | No bits set in GETSUPPORT | ||
364 | |||
365 | scx200.c -- National SCx200 CPUs | ||
366 | |||
367 | Not in the kernel yet. | ||
368 | |||
369 | The timeout is set using a module parameter "margin" which | ||
370 | defaults to 60 seconds. The timeout can also be set using | ||
371 | SETTIMEOUT and read using GETTIMEOUT. | ||
372 | |||
373 | Supports a module parameter "nowayout" that is initialized | ||
374 | with the value of CONFIG_WATCHDOG_NOWAYOUT. Also supports the | ||
375 | magic character 'V' handling. | ||
376 | |||
377 | shwdt.c -- SuperH 3/4 processors | ||
378 | |||
379 | [FIXME -- I'm unable to tell what the timeout is] | ||
380 | |||
381 | Supports CONFIG_WATCHDOG_NOWAYOUT | ||
382 | |||
383 | GETSUPPORT returns WDIOF_KEEPALIVEPING, and the GETSTATUS call | ||
384 | returns if the device is open or not. [FIXME -- silliness | ||
385 | again?] | ||
386 | |||
387 | softdog.c -- Software watchdog | ||
388 | |||
389 | The timeout is set with the module parameter "soft_margin" | ||
390 | which defaults to 60 seconds, the timeout is also settable | ||
391 | using the SETTIMEOUT ioctl. | ||
392 | |||
393 | Supports CONFIG_WATCHDOG_NOWAYOUT | ||
394 | |||
395 | WDIOF_SETTIMEOUT bit set in GETSUPPORT | ||
396 | |||
397 | w83877f_wdt.c -- W83877F Computer | ||
398 | |||
399 | Hardcoded timeout of 30 seconds | ||
400 | |||
401 | Does not support CONFIG_WATCHDOG_NOWAYOUT, but has the magic | ||
402 | character 'V' close handling. | ||
403 | |||
404 | No bits set in GETSUPPORT | ||
405 | |||
406 | w83627hf_wdt.c -- w83627hf watchdog | ||
407 | |||
408 | Timeout that defaults to 60 seconds, supports SETTIMEOUT. | ||
409 | |||
410 | Supports CONFIG_WATCHDOG_NOWAYOUT | ||
411 | |||
412 | GETSUPPORT returns WDIOF_KEEPALIVEPING and WDIOF_SETTIMEOUT. | ||
413 | The GETSTATUS call returns if the device is open or not. | ||
414 | |||
415 | wdt.c -- ICS WDT500/501 ISA and | ||
416 | wdt_pci.c -- ICS WDT500/501 PCI | ||
417 | |||
418 | Default timeout of 60 seconds. The timeout is also settable | ||
419 | using the SETTIMEOUT ioctl. | ||
420 | |||
421 | Supports CONFIG_WATCHDOG_NOWAYOUT | ||
422 | |||
423 | GETSUPPORT returns with bits set depending on the actual | ||
424 | card. The WDT501 supports a lot of external monitoring, the | ||
425 | WDT500 much less. | ||
426 | |||
427 | wdt285.c -- Footbridge watchdog | ||
428 | |||
429 | The timeout is set with the module parameter "soft_margin" | ||
430 | which defaults to 60 seconds. The timeout is also settable | ||
431 | using the SETTIMEOUT ioctl. | ||
432 | |||
433 | Does not support CONFIG_WATCHDOG_NOWAYOUT | ||
434 | |||
435 | WDIOF_SETTIMEOUT bit set in GETSUPPORT | ||
436 | |||
437 | wdt977.c -- Netwinder W83977AF chip | ||
438 | |||
439 | Hardcoded timeout of 3 minutes | ||
440 | |||
441 | Supports CONFIG_WATCHDOG_NOWAYOUT | ||
442 | |||
443 | Does not support any ioctls at all. | ||
444 | |||
diff --git a/Documentation/watchdog/watchdog.txt b/Documentation/watchdog/watchdog.txt deleted file mode 100644 index 4b1ff69cc19a..000000000000 --- a/Documentation/watchdog/watchdog.txt +++ /dev/null | |||
@@ -1,94 +0,0 @@ | |||
1 | Watchdog Timer Interfaces For The Linux Operating System | ||
2 | |||
3 | Alan Cox <alan@lxorguk.ukuu.org.uk> | ||
4 | |||
5 | Custom Linux Driver And Program Development | ||
6 | |||
7 | |||
8 | The following watchdog drivers are currently implemented: | ||
9 | |||
10 | ICS WDT501-P | ||
11 | ICS WDT501-P (no fan tachometer) | ||
12 | ICS WDT500-P | ||
13 | Software Only | ||
14 | SA1100 Internal Watchdog | ||
15 | Berkshire Products PC Watchdog Revision A & C (by Ken Hollis) | ||
16 | |||
17 | |||
18 | All six interfaces provide /dev/watchdog, which when open must be written | ||
19 | to within a timeout or the machine will reboot. Each write delays the reboot | ||
20 | time another timeout. In the case of the software watchdog the ability to | ||
21 | reboot will depend on the state of the machines and interrupts. The hardware | ||
22 | boards physically pull the machine down off their own onboard timers and | ||
23 | will reboot from almost anything. | ||
24 | |||
25 | A second temperature monitoring interface is available on the WDT501P cards | ||
26 | and some Berkshire cards. This provides /dev/temperature. This is the machine | ||
27 | internal temperature in degrees Fahrenheit. Each read returns a single byte | ||
28 | giving the temperature. | ||
29 | |||
30 | The third interface logs kernel messages on additional alert events. | ||
31 | |||
32 | Both software and hardware watchdog drivers are available in the standard | ||
33 | kernel. If you are using the software watchdog, you probably also want | ||
34 | to use "panic=60" as a boot argument as well. | ||
35 | |||
36 | The wdt card cannot be safely probed for. Instead you need to pass | ||
37 | wdt=ioaddr,irq as a boot parameter - eg "wdt=0x240,11". | ||
38 | |||
39 | The SA1100 watchdog module can be configured with the "sa1100_margin" | ||
40 | commandline argument which specifies timeout value in seconds. | ||
41 | |||
42 | The i810 TCO watchdog modules can be configured with the "i810_margin" | ||
43 | commandline argument which specifies the counter initial value. The counter | ||
44 | is decremented every 0.6 seconds and default to 50 (30 seconds). Values can | ||
45 | range between 3 and 63. | ||
46 | |||
47 | The i810 TCO watchdog driver also implements the WDIOC_GETSTATUS and | ||
48 | WDIOC_GETBOOTSTATUS ioctl()s. WDIOC_GETSTATUS returns the actual counter value | ||
49 | and WDIOC_GETBOOTSTATUS returns the value of TCO2 Status Register (see Intel's | ||
50 | documentation for the 82801AA and 82801AB datasheet). | ||
51 | |||
52 | Features | ||
53 | -------- | ||
54 | WDT501P WDT500P Software Berkshire i810 TCO SA1100WD | ||
55 | Reboot Timer X X X X X X | ||
56 | External Reboot X X o o o X | ||
57 | I/O Port Monitor o o o X o o | ||
58 | Temperature X o o X o o | ||
59 | Fan Speed X o o o o o | ||
60 | Power Under X o o o o o | ||
61 | Power Over X o o o o o | ||
62 | Overheat X o o o o o | ||
63 | |||
64 | The external event interfaces on the WDT boards are not currently supported. | ||
65 | Minor numbers are however allocated for it. | ||
66 | |||
67 | |||
68 | Example Watchdog Driver: see Documentation/watchdog/src/watchdog-simple.c | ||
69 | |||
70 | |||
71 | Contact Information | ||
72 | |||
73 | People keep asking about the WDT watchdog timer hardware: The phone contacts | ||
74 | for Industrial Computer Source are: | ||
75 | |||
76 | Industrial Computer Source | ||
77 | http://www.indcompsrc.com | ||
78 | ICS Advent, San Diego | ||
79 | 6260 Sequence Dr. | ||
80 | San Diego, CA 92121-4371 | ||
81 | Phone (858) 677-0877 | ||
82 | FAX: (858) 677-0895 | ||
83 | > | ||
84 | ICS Advent Europe, UK | ||
85 | Oving Road | ||
86 | Chichester, | ||
87 | West Sussex, | ||
88 | PO19 4ET, UK | ||
89 | Phone: 00.44.1243.533900 | ||
90 | |||
91 | |||
92 | and please mention Linux when enquiring. | ||
93 | |||
94 | For full information about the PCWD cards see the pcwd-watchdog.txt document. | ||
diff --git a/Documentation/watchdog/wdt.txt b/Documentation/watchdog/wdt.txt new file mode 100644 index 000000000000..03fd756d976d --- /dev/null +++ b/Documentation/watchdog/wdt.txt | |||
@@ -0,0 +1,43 @@ | |||
1 | Last Reviewed: 10/05/2007 | ||
2 | |||
3 | WDT Watchdog Timer Interfaces For The Linux Operating System | ||
4 | Alan Cox <alan@lxorguk.ukuu.org.uk> | ||
5 | |||
6 | ICS WDT501-P | ||
7 | ICS WDT501-P (no fan tachometer) | ||
8 | ICS WDT500-P | ||
9 | |||
10 | All the interfaces provide /dev/watchdog, which when open must be written | ||
11 | to within a timeout or the machine will reboot. Each write delays the reboot | ||
12 | time another timeout. In the case of the software watchdog the ability to | ||
13 | reboot will depend on the state of the machines and interrupts. The hardware | ||
14 | boards physically pull the machine down off their own onboard timers and | ||
15 | will reboot from almost anything. | ||
16 | |||
17 | A second temperature monitoring interface is available on the WDT501P cards | ||
18 | This provides /dev/temperature. This is the machine internal temperature in | ||
19 | degrees Fahrenheit. Each read returns a single byte giving the temperature. | ||
20 | |||
21 | The third interface logs kernel messages on additional alert events. | ||
22 | |||
23 | The wdt card cannot be safely probed for. Instead you need to pass | ||
24 | wdt=ioaddr,irq as a boot parameter - eg "wdt=0x240,11". | ||
25 | |||
26 | Features | ||
27 | -------- | ||
28 | WDT501P WDT500P | ||
29 | Reboot Timer X X | ||
30 | External Reboot X X | ||
31 | I/O Port Monitor o o | ||
32 | Temperature X o | ||
33 | Fan Speed X o | ||
34 | Power Under X o | ||
35 | Power Over X o | ||
36 | Overheat X o | ||
37 | |||
38 | The external event interfaces on the WDT boards are not currently supported. | ||
39 | Minor numbers are however allocated for it. | ||
40 | |||
41 | |||
42 | Example Watchdog Driver: see Documentation/watchdog/src/watchdog-simple.c | ||
43 | |||
diff --git a/MAINTAINERS b/MAINTAINERS index 4cc17b993b6a..f3b5a391e074 100644 --- a/MAINTAINERS +++ b/MAINTAINERS | |||
@@ -30,8 +30,11 @@ trivial patch so apply some common sense. | |||
30 | job the maintainers (and especially Linus) do is to keep things | 30 | job the maintainers (and especially Linus) do is to keep things |
31 | looking the same. Sometimes this means that the clever hack in | 31 | looking the same. Sometimes this means that the clever hack in |
32 | your driver to get around a problem actually needs to become a | 32 | your driver to get around a problem actually needs to become a |
33 | generalized kernel feature ready for next time. See | 33 | generalized kernel feature ready for next time. |
34 | Documentation/CodingStyle for guidance here. | 34 | |
35 | PLEASE check your patch with the automated style checker | ||
36 | (scripts/checkpatch.pl) to catch trival style violations. | ||
37 | See Documentation/CodingStyle for guidance here. | ||
35 | 38 | ||
36 | PLEASE try to include any credit lines you want added with the | 39 | PLEASE try to include any credit lines you want added with the |
37 | patch. It avoids people being missed off by mistake and makes | 40 | patch. It avoids people being missed off by mistake and makes |
@@ -972,6 +975,15 @@ M: johannes@sipsolutions.net | |||
972 | L: linux-wireless@vger.kernel.org | 975 | L: linux-wireless@vger.kernel.org |
973 | S: Maintained | 976 | S: Maintained |
974 | 977 | ||
978 | CHECKPATCH | ||
979 | P: Andy Whitcroft | ||
980 | M: apw@shadowen.org | ||
981 | P: Randy Dunlap | ||
982 | M: rdunlap@xenotime.net | ||
983 | P: Joel Schopp | ||
984 | M: jschopp@austin.ibm.com | ||
985 | S: Supported | ||
986 | |||
975 | COMMON INTERNET FILE SYSTEM (CIFS) | 987 | COMMON INTERNET FILE SYSTEM (CIFS) |
976 | P: Steve French | 988 | P: Steve French |
977 | M: sfrench@samba.org | 989 | M: sfrench@samba.org |
@@ -1475,6 +1487,13 @@ L: linux-usb-devel@lists.sourceforge.net | |||
1475 | L: linuxppc-embedded@ozlabs.org | 1487 | L: linuxppc-embedded@ozlabs.org |
1476 | S: Maintained | 1488 | S: Maintained |
1477 | 1489 | ||
1490 | FREESCALE QUICC ENGINE UCC ETHERNET DRIVER | ||
1491 | P: Li Yang | ||
1492 | M: leoli@freescale.com | ||
1493 | L: netdev@vger.kernel.org | ||
1494 | L: linuxppc-embedded@ozlabs.org | ||
1495 | S: Maintained | ||
1496 | |||
1478 | FILE LOCKING (flock() and fcntl()/lockf()) | 1497 | FILE LOCKING (flock() and fcntl()/lockf()) |
1479 | P: Matthew Wilcox | 1498 | P: Matthew Wilcox |
1480 | M: matthew@wil.cx | 1499 | M: matthew@wil.cx |
@@ -1486,6 +1505,14 @@ P: Alexander Viro | |||
1486 | M: viro@zeniv.linux.org.uk | 1505 | M: viro@zeniv.linux.org.uk |
1487 | S: Maintained | 1506 | S: Maintained |
1488 | 1507 | ||
1508 | FIREWIRE SUBSYSTEM | ||
1509 | P: Kristian Hoegsberg, Stefan Richter | ||
1510 | M: krh@redhat.com, stefanr@s5r6.in-berlin.de | ||
1511 | L: linux1394-devel@lists.sourceforge.net | ||
1512 | W: http://www.linux1394.org/ | ||
1513 | T: git kernel.org:/pub/scm/linux/kernel/git/ieee1394/linux1394-2.6.git | ||
1514 | S: Maintained | ||
1515 | |||
1489 | FIRMWARE LOADER (request_firmware) | 1516 | FIRMWARE LOADER (request_firmware) |
1490 | L: linux-kernel@vger.kernel.org | 1517 | L: linux-kernel@vger.kernel.org |
1491 | S: Orphan | 1518 | S: Orphan |
@@ -2880,8 +2907,8 @@ W: ftp://ftp.kernel.org/pub/linux/kernel/people/rml/preempt-kernel | |||
2880 | S: Supported | 2907 | S: Supported |
2881 | 2908 | ||
2882 | PRISM54 WIRELESS DRIVER | 2909 | PRISM54 WIRELESS DRIVER |
2883 | P: Prism54 Development Team | 2910 | P: Luis R. Rodriguez |
2884 | M: developers@islsm.org | 2911 | M: mcgrof@gmail.com |
2885 | L: linux-wireless@vger.kernel.org | 2912 | L: linux-wireless@vger.kernel.org |
2886 | W: http://prism54.org | 2913 | W: http://prism54.org |
2887 | S: Maintained | 2914 | S: Maintained |
@@ -3525,7 +3552,7 @@ S: Maintained | |||
3525 | 3552 | ||
3526 | TULIP NETWORK DRIVER | 3553 | TULIP NETWORK DRIVER |
3527 | P: Valerie Henson | 3554 | P: Valerie Henson |
3528 | M: val_henson@linux.intel.com | 3555 | M: val@nmt.edu |
3529 | L: tulip-users@lists.sourceforge.net | 3556 | L: tulip-users@lists.sourceforge.net |
3530 | W: http://sourceforge.net/projects/tulip/ | 3557 | W: http://sourceforge.net/projects/tulip/ |
3531 | S: Maintained | 3558 | S: Maintained |
diff --git a/arch/alpha/Kconfig b/arch/alpha/Kconfig index 770f717bd250..79c6e5a24456 100644 --- a/arch/alpha/Kconfig +++ b/arch/alpha/Kconfig | |||
@@ -83,22 +83,20 @@ choice | |||
83 | check out the Linux/Alpha FAQ, accessible on the WWW from | 83 | check out the Linux/Alpha FAQ, accessible on the WWW from |
84 | <http://www.alphalinux.org/>. In summary: | 84 | <http://www.alphalinux.org/>. In summary: |
85 | 85 | ||
86 | Alcor/Alpha-XLT AS 600 | 86 | Alcor/Alpha-XLT AS 600, AS 500, XL-300, XL-366 |
87 | Alpha-XL XL-233, XL-266 | 87 | Alpha-XL XL-233, XL-266 |
88 | AlphaBook1 Alpha laptop | 88 | AlphaBook1 Alpha laptop |
89 | Avanti AS 200, AS 205, AS 250, AS 255, AS 300, AS 400 | 89 | Avanti AS 200, AS 205, AS 250, AS 255, AS 300, AS 400 |
90 | Cabriolet AlphaPC64, AlphaPCI64 | 90 | Cabriolet AlphaPC64, AlphaPCI64 |
91 | DP264 DP264 | 91 | DP264 DP264 / DS20 / ES40 / DS10 / DS10L |
92 | EB164 EB164 21164 evaluation board | 92 | EB164 EB164 21164 evaluation board |
93 | EB64+ EB64+ 21064 evaluation board | 93 | EB64+ EB64+ 21064 evaluation board |
94 | EB66 EB66 21066 evaluation board | 94 | EB66 EB66 21066 evaluation board |
95 | EB66+ EB66+ 21066 evaluation board | 95 | EB66+ EB66+ 21066 evaluation board |
96 | Jensen DECpc 150, DEC 2000 model 300, | 96 | Jensen DECpc 150, DEC 2000 models 300, 500 |
97 | DEC 2000 model 500 | ||
98 | LX164 AlphaPC164-LX | 97 | LX164 AlphaPC164-LX |
99 | Lynx AS 2100A | 98 | Lynx AS 2100A |
100 | Miata Personal Workstation 433a, 433au, 500a, | 99 | Miata Personal Workstation 433/500/600 a/au |
101 | 500au, 600a, or 600au | ||
102 | Marvel AlphaServer ES47 / ES80 / GS1280 | 100 | Marvel AlphaServer ES47 / ES80 / GS1280 |
103 | Mikasa AS 1000 | 101 | Mikasa AS 1000 |
104 | Noname AXPpci33, UDB (Multia) | 102 | Noname AXPpci33, UDB (Multia) |
@@ -108,9 +106,9 @@ choice | |||
108 | Ruffian RPX164-2, AlphaPC164-UX, AlphaPC164-BX | 106 | Ruffian RPX164-2, AlphaPC164-UX, AlphaPC164-BX |
109 | SX164 AlphaPC164-SX | 107 | SX164 AlphaPC164-SX |
110 | Sable AS 2000, AS 2100 | 108 | Sable AS 2000, AS 2100 |
111 | Shark DS 20L | 109 | Shark DS 20L |
112 | Takara Takara | 110 | Takara Takara (OEM) |
113 | Titan AlphaServer ES45 / DS25 | 111 | Titan AlphaServer ES45 / DS25 / DS15 |
114 | Wildfire AlphaServer GS 40/80/160/320 | 112 | Wildfire AlphaServer GS 40/80/160/320 |
115 | 113 | ||
116 | If you don't know what to do, choose "generic". | 114 | If you don't know what to do, choose "generic". |
@@ -481,6 +479,15 @@ config ALPHA_BROKEN_IRQ_MASK | |||
481 | depends on ALPHA_GENERIC || ALPHA_PC164 | 479 | depends on ALPHA_GENERIC || ALPHA_PC164 |
482 | default y | 480 | default y |
483 | 481 | ||
482 | config VGA_HOSE | ||
483 | bool | ||
484 | depends on ALPHA_GENERIC || ALPHA_TITAN || ALPHA_MARVEL || ALPHA_TSUNAMI | ||
485 | default y | ||
486 | help | ||
487 | Support VGA on an arbitrary hose; needed for several platforms | ||
488 | which always have multiple hoses, and whose consoles support it. | ||
489 | |||
490 | |||
484 | config ALPHA_SRM | 491 | config ALPHA_SRM |
485 | bool "Use SRM as bootloader" if ALPHA_CABRIOLET || ALPHA_AVANTI_CH || ALPHA_EB64P || ALPHA_PC164 || ALPHA_TAKARA || ALPHA_EB164 || ALPHA_ALCOR || ALPHA_MIATA || ALPHA_LX164 || ALPHA_SX164 || ALPHA_NAUTILUS || ALPHA_NONAME | 492 | bool "Use SRM as bootloader" if ALPHA_CABRIOLET || ALPHA_AVANTI_CH || ALPHA_EB64P || ALPHA_PC164 || ALPHA_TAKARA || ALPHA_EB164 || ALPHA_ALCOR || ALPHA_MIATA || ALPHA_LX164 || ALPHA_SX164 || ALPHA_NAUTILUS || ALPHA_NONAME |
486 | default y if ALPHA_JENSEN || ALPHA_MIKASA || ALPHA_SABLE || ALPHA_LYNX || ALPHA_NORITAKE || ALPHA_DP264 || ALPHA_RAWHIDE || ALPHA_EIGER || ALPHA_WILDFIRE || ALPHA_TITAN || ALPHA_SHARK || ALPHA_MARVEL | 493 | default y if ALPHA_JENSEN || ALPHA_MIKASA || ALPHA_SABLE || ALPHA_LYNX || ALPHA_NORITAKE || ALPHA_DP264 || ALPHA_RAWHIDE || ALPHA_EIGER || ALPHA_WILDFIRE || ALPHA_TITAN || ALPHA_SHARK || ALPHA_MARVEL |
@@ -537,10 +544,14 @@ config HAVE_DEC_LOCK | |||
537 | default y | 544 | default y |
538 | 545 | ||
539 | config NR_CPUS | 546 | config NR_CPUS |
540 | int "Maximum number of CPUs (2-64)" | 547 | int "Maximum number of CPUs (2-32)" |
541 | range 2 64 | 548 | range 2 32 |
542 | depends on SMP | 549 | depends on SMP |
543 | default "64" | 550 | default "32" if ALPHA_GENERIC || ALPHA_MARVEL |
551 | default "4" if !ALPHA_GENERIC && !ALPHA_MARVEL | ||
552 | help | ||
553 | MARVEL support can handle a maximum of 32 CPUs, all the others | ||
554 | with working support have a maximum of 4 CPUs. | ||
544 | 555 | ||
545 | config ARCH_DISCONTIGMEM_ENABLE | 556 | config ARCH_DISCONTIGMEM_ENABLE |
546 | bool "Discontiguous Memory Support (EXPERIMENTAL)" | 557 | bool "Discontiguous Memory Support (EXPERIMENTAL)" |
@@ -644,6 +655,13 @@ source "arch/alpha/oprofile/Kconfig" | |||
644 | 655 | ||
645 | source "arch/alpha/Kconfig.debug" | 656 | source "arch/alpha/Kconfig.debug" |
646 | 657 | ||
658 | # DUMMY_CONSOLE may be defined in drivers/video/console/Kconfig | ||
659 | # but we also need it if VGA_HOSE is set | ||
660 | config DUMMY_CONSOLE | ||
661 | bool | ||
662 | depends on VGA_HOSE | ||
663 | default y | ||
664 | |||
647 | source "security/Kconfig" | 665 | source "security/Kconfig" |
648 | 666 | ||
649 | source "crypto/Kconfig" | 667 | source "crypto/Kconfig" |
diff --git a/arch/alpha/boot/tools/mkbb.c b/arch/alpha/boot/tools/mkbb.c index 23c7190b047c..632a7fd6d7dc 100644 --- a/arch/alpha/boot/tools/mkbb.c +++ b/arch/alpha/boot/tools/mkbb.c | |||
@@ -81,7 +81,7 @@ typedef union __bootblock { | |||
81 | #define bootblock_label __u1.__label | 81 | #define bootblock_label __u1.__label |
82 | #define bootblock_checksum __u2.__checksum | 82 | #define bootblock_checksum __u2.__checksum |
83 | 83 | ||
84 | main(int argc, char ** argv) | 84 | int main(int argc, char ** argv) |
85 | { | 85 | { |
86 | bootblock bootblock_from_disk; | 86 | bootblock bootblock_from_disk; |
87 | bootblock bootloader_image; | 87 | bootblock bootloader_image; |
diff --git a/arch/alpha/kernel/console.c b/arch/alpha/kernel/console.c index f313b34939bb..da711e37fc97 100644 --- a/arch/alpha/kernel/console.c +++ b/arch/alpha/kernel/console.c | |||
@@ -9,16 +9,20 @@ | |||
9 | #include <linux/init.h> | 9 | #include <linux/init.h> |
10 | #include <linux/tty.h> | 10 | #include <linux/tty.h> |
11 | #include <linux/console.h> | 11 | #include <linux/console.h> |
12 | #include <linux/vt.h> | ||
12 | #include <asm/vga.h> | 13 | #include <asm/vga.h> |
13 | #include <asm/machvec.h> | 14 | #include <asm/machvec.h> |
14 | 15 | ||
16 | #include "pci_impl.h" | ||
17 | |||
15 | #ifdef CONFIG_VGA_HOSE | 18 | #ifdef CONFIG_VGA_HOSE |
16 | 19 | ||
17 | /* | 20 | struct pci_controller *pci_vga_hose; |
18 | * Externally-visible vga hose bases | 21 | static struct resource alpha_vga = { |
19 | */ | 22 | .name = "alpha-vga+", |
20 | unsigned long __vga_hose_io_base = 0; /* base for default hose */ | 23 | .start = 0x3C0, |
21 | unsigned long __vga_hose_mem_base = 0; /* base for default hose */ | 24 | .end = 0x3DF |
25 | }; | ||
22 | 26 | ||
23 | static struct pci_controller * __init | 27 | static struct pci_controller * __init |
24 | default_vga_hose_select(struct pci_controller *h1, struct pci_controller *h2) | 28 | default_vga_hose_select(struct pci_controller *h1, struct pci_controller *h2) |
@@ -30,36 +34,58 @@ default_vga_hose_select(struct pci_controller *h1, struct pci_controller *h2) | |||
30 | } | 34 | } |
31 | 35 | ||
32 | void __init | 36 | void __init |
33 | set_vga_hose(struct pci_controller *hose) | ||
34 | { | ||
35 | if (hose) { | ||
36 | __vga_hose_io_base = hose->io_space->start; | ||
37 | __vga_hose_mem_base = hose->mem_space->start; | ||
38 | } | ||
39 | } | ||
40 | |||
41 | void __init | ||
42 | locate_and_init_vga(void *(*sel_func)(void *, void *)) | 37 | locate_and_init_vga(void *(*sel_func)(void *, void *)) |
43 | { | 38 | { |
44 | struct pci_controller *hose = NULL; | 39 | struct pci_controller *hose = NULL; |
45 | struct pci_dev *dev = NULL; | 40 | struct pci_dev *dev = NULL; |
46 | 41 | ||
42 | /* Default the select function */ | ||
47 | if (!sel_func) sel_func = (void *)default_vga_hose_select; | 43 | if (!sel_func) sel_func = (void *)default_vga_hose_select; |
48 | 44 | ||
45 | /* Find the console VGA device */ | ||
49 | for(dev=NULL; (dev=pci_get_class(PCI_CLASS_DISPLAY_VGA << 8, dev));) { | 46 | for(dev=NULL; (dev=pci_get_class(PCI_CLASS_DISPLAY_VGA << 8, dev));) { |
50 | if (!hose) hose = dev->sysdata; | 47 | if (!hose) |
51 | else hose = sel_func(hose, dev->sysdata); | 48 | hose = dev->sysdata; |
49 | else | ||
50 | hose = sel_func(hose, dev->sysdata); | ||
52 | } | 51 | } |
53 | 52 | ||
54 | /* Did we already inititialize the correct one? */ | 53 | /* Did we already initialize the correct one? Is there one? */ |
55 | if (conswitchp == &vga_con && | 54 | if (!hose || (conswitchp == &vga_con && pci_vga_hose == hose)) |
56 | __vga_hose_io_base == hose->io_space->start && | ||
57 | __vga_hose_mem_base == hose->mem_space->start) | ||
58 | return; | 55 | return; |
59 | 56 | ||
60 | /* Set the VGA hose and init the new console */ | 57 | /* Create a new VGA ioport resource WRT the hose it is on. */ |
61 | set_vga_hose(hose); | 58 | alpha_vga.start += hose->io_space->start; |
59 | alpha_vga.end += hose->io_space->start; | ||
60 | request_resource(hose->io_space, &alpha_vga); | ||
61 | |||
62 | /* Set the VGA hose and init the new console. */ | ||
63 | pci_vga_hose = hose; | ||
62 | take_over_console(&vga_con, 0, MAX_NR_CONSOLES-1, 1); | 64 | take_over_console(&vga_con, 0, MAX_NR_CONSOLES-1, 1); |
63 | } | 65 | } |
64 | 66 | ||
67 | void __init | ||
68 | find_console_vga_hose(void) | ||
69 | { | ||
70 | u64 *pu64 = (u64 *)((u64)hwrpb + hwrpb->ctbt_offset); | ||
71 | |||
72 | if (pu64[7] == 3) { /* TERM_TYPE == graphics */ | ||
73 | struct pci_controller *hose; | ||
74 | int h = (pu64[30] >> 24) & 0xff; /* console hose # */ | ||
75 | |||
76 | /* | ||
77 | * Our hose numbering DOES match the console's, so find | ||
78 | * the right one... | ||
79 | */ | ||
80 | for (hose = hose_head; hose; hose = hose->next) { | ||
81 | if (hose->index == h) break; | ||
82 | } | ||
83 | |||
84 | if (hose) { | ||
85 | printk("Console graphics on hose %d\n", h); | ||
86 | pci_vga_hose = hose; | ||
87 | } | ||
88 | } | ||
89 | } | ||
90 | |||
65 | #endif | 91 | #endif |
diff --git a/arch/alpha/kernel/core_marvel.c b/arch/alpha/kernel/core_marvel.c index 7f6a98455e74..f10d2eddd2c3 100644 --- a/arch/alpha/kernel/core_marvel.c +++ b/arch/alpha/kernel/core_marvel.c | |||
@@ -25,6 +25,7 @@ | |||
25 | #include <asm/pgalloc.h> | 25 | #include <asm/pgalloc.h> |
26 | #include <asm/tlbflush.h> | 26 | #include <asm/tlbflush.h> |
27 | #include <asm/rtc.h> | 27 | #include <asm/rtc.h> |
28 | #include <asm/vga.h> | ||
28 | 29 | ||
29 | #include "proto.h" | 30 | #include "proto.h" |
30 | #include "pci_impl.h" | 31 | #include "pci_impl.h" |
@@ -367,9 +368,8 @@ marvel_io7_present(gct6_node *node) | |||
367 | } | 368 | } |
368 | 369 | ||
369 | static void __init | 370 | static void __init |
370 | marvel_init_vga_hose(void) | 371 | marvel_find_console_vga_hose(void) |
371 | { | 372 | { |
372 | #ifdef CONFIG_VGA_HOSE | ||
373 | u64 *pu64 = (u64 *)((u64)hwrpb + hwrpb->ctbt_offset); | 373 | u64 *pu64 = (u64 *)((u64)hwrpb + hwrpb->ctbt_offset); |
374 | 374 | ||
375 | if (pu64[7] == 3) { /* TERM_TYPE == graphics */ | 375 | if (pu64[7] == 3) { /* TERM_TYPE == graphics */ |
@@ -403,7 +403,6 @@ marvel_init_vga_hose(void) | |||
403 | pci_vga_hose = hose; | 403 | pci_vga_hose = hose; |
404 | } | 404 | } |
405 | } | 405 | } |
406 | #endif /* CONFIG_VGA_HOSE */ | ||
407 | } | 406 | } |
408 | 407 | ||
409 | gct6_search_struct gct_wanted_node_list[] = { | 408 | gct6_search_struct gct_wanted_node_list[] = { |
@@ -459,7 +458,7 @@ marvel_init_arch(void) | |||
459 | marvel_init_io7(io7); | 458 | marvel_init_io7(io7); |
460 | 459 | ||
461 | /* Check for graphic console location (if any). */ | 460 | /* Check for graphic console location (if any). */ |
462 | marvel_init_vga_hose(); | 461 | marvel_find_console_vga_hose(); |
463 | } | 462 | } |
464 | 463 | ||
465 | void | 464 | void |
@@ -684,9 +683,6 @@ __marvel_rtc_io(u8 b, unsigned long addr, int write) | |||
684 | /* | 683 | /* |
685 | * IO map support. | 684 | * IO map support. |
686 | */ | 685 | */ |
687 | |||
688 | #define __marvel_is_mem_vga(a) (((a) >= 0xa0000) && ((a) <= 0xc0000)) | ||
689 | |||
690 | void __iomem * | 686 | void __iomem * |
691 | marvel_ioremap(unsigned long addr, unsigned long size) | 687 | marvel_ioremap(unsigned long addr, unsigned long size) |
692 | { | 688 | { |
@@ -698,13 +694,9 @@ marvel_ioremap(unsigned long addr, unsigned long size) | |||
698 | unsigned long pfn; | 694 | unsigned long pfn; |
699 | 695 | ||
700 | /* | 696 | /* |
701 | * Adjust the addr. | 697 | * Adjust the address. |
702 | */ | 698 | */ |
703 | #ifdef CONFIG_VGA_HOSE | 699 | FIXUP_MEMADDR_VGA(addr); |
704 | if (pci_vga_hose && __marvel_is_mem_vga(addr)) { | ||
705 | addr += pci_vga_hose->mem_space->start; | ||
706 | } | ||
707 | #endif | ||
708 | 700 | ||
709 | /* | 701 | /* |
710 | * Find the hose. | 702 | * Find the hose. |
@@ -781,7 +773,9 @@ marvel_ioremap(unsigned long addr, unsigned long size) | |||
781 | return (void __iomem *) vaddr; | 773 | return (void __iomem *) vaddr; |
782 | } | 774 | } |
783 | 775 | ||
784 | return NULL; | 776 | /* Assume it was already a reasonable address */ |
777 | vaddr = baddr + hose->mem_space->start; | ||
778 | return (void __iomem *) vaddr; | ||
785 | } | 779 | } |
786 | 780 | ||
787 | void | 781 | void |
@@ -803,21 +797,12 @@ marvel_is_mmio(const volatile void __iomem *xaddr) | |||
803 | return (addr & 0xFF000000UL) == 0; | 797 | return (addr & 0xFF000000UL) == 0; |
804 | } | 798 | } |
805 | 799 | ||
806 | #define __marvel_is_port_vga(a) \ | ||
807 | (((a) >= 0x3b0) && ((a) < 0x3e0) && ((a) != 0x3b3) && ((a) != 0x3d3)) | ||
808 | #define __marvel_is_port_kbd(a) (((a) == 0x60) || ((a) == 0x64)) | 800 | #define __marvel_is_port_kbd(a) (((a) == 0x60) || ((a) == 0x64)) |
809 | #define __marvel_is_port_rtc(a) (((a) == 0x70) || ((a) == 0x71)) | 801 | #define __marvel_is_port_rtc(a) (((a) == 0x70) || ((a) == 0x71)) |
810 | 802 | ||
811 | void __iomem *marvel_ioportmap (unsigned long addr) | 803 | void __iomem *marvel_ioportmap (unsigned long addr) |
812 | { | 804 | { |
813 | if (__marvel_is_port_rtc (addr) || __marvel_is_port_kbd(addr)) | 805 | FIXUP_IOADDR_VGA(addr); |
814 | ; | ||
815 | #ifdef CONFIG_VGA_HOSE | ||
816 | else if (__marvel_is_port_vga (addr) && pci_vga_hose) | ||
817 | addr += pci_vga_hose->io_space->start; | ||
818 | #endif | ||
819 | else | ||
820 | return NULL; | ||
821 | return (void __iomem *)addr; | 806 | return (void __iomem *)addr; |
822 | } | 807 | } |
823 | 808 | ||
@@ -829,8 +814,14 @@ marvel_ioread8(void __iomem *xaddr) | |||
829 | return 0; | 814 | return 0; |
830 | else if (__marvel_is_port_rtc(addr)) | 815 | else if (__marvel_is_port_rtc(addr)) |
831 | return __marvel_rtc_io(0, addr, 0); | 816 | return __marvel_rtc_io(0, addr, 0); |
832 | else | 817 | else if (marvel_is_ioaddr(addr)) |
833 | return __kernel_ldbu(*(vucp)addr); | 818 | return __kernel_ldbu(*(vucp)addr); |
819 | else | ||
820 | /* this should catch other legacy addresses | ||
821 | that would normally fail on MARVEL, | ||
822 | because there really is nothing there... | ||
823 | */ | ||
824 | return ~0; | ||
834 | } | 825 | } |
835 | 826 | ||
836 | void | 827 | void |
@@ -841,7 +832,7 @@ marvel_iowrite8(u8 b, void __iomem *xaddr) | |||
841 | return; | 832 | return; |
842 | else if (__marvel_is_port_rtc(addr)) | 833 | else if (__marvel_is_port_rtc(addr)) |
843 | __marvel_rtc_io(b, addr, 1); | 834 | __marvel_rtc_io(b, addr, 1); |
844 | else | 835 | else if (marvel_is_ioaddr(addr)) |
845 | __kernel_stb(b, *(vucp)addr); | 836 | __kernel_stb(b, *(vucp)addr); |
846 | } | 837 | } |
847 | 838 | ||
diff --git a/arch/alpha/kernel/core_titan.c b/arch/alpha/kernel/core_titan.c index 3662fef7db9a..819326627b96 100644 --- a/arch/alpha/kernel/core_titan.c +++ b/arch/alpha/kernel/core_titan.c | |||
@@ -21,6 +21,7 @@ | |||
21 | #include <asm/smp.h> | 21 | #include <asm/smp.h> |
22 | #include <asm/pgalloc.h> | 22 | #include <asm/pgalloc.h> |
23 | #include <asm/tlbflush.h> | 23 | #include <asm/tlbflush.h> |
24 | #include <asm/vga.h> | ||
24 | 25 | ||
25 | #include "proto.h" | 26 | #include "proto.h" |
26 | #include "pci_impl.h" | 27 | #include "pci_impl.h" |
@@ -35,6 +36,11 @@ struct | |||
35 | } saved_config[4] __attribute__((common)); | 36 | } saved_config[4] __attribute__((common)); |
36 | 37 | ||
37 | /* | 38 | /* |
39 | * Is PChip 1 present? No need to query it more than once. | ||
40 | */ | ||
41 | static int titan_pchip1_present; | ||
42 | |||
43 | /* | ||
38 | * BIOS32-style PCI interface: | 44 | * BIOS32-style PCI interface: |
39 | */ | 45 | */ |
40 | 46 | ||
@@ -344,43 +350,17 @@ titan_init_one_pachip_port(titan_pachip_port *port, int index) | |||
344 | static void __init | 350 | static void __init |
345 | titan_init_pachips(titan_pachip *pachip0, titan_pachip *pachip1) | 351 | titan_init_pachips(titan_pachip *pachip0, titan_pachip *pachip1) |
346 | { | 352 | { |
347 | int pchip1_present = TITAN_cchip->csc.csr & 1L<<14; | 353 | titan_pchip1_present = TITAN_cchip->csc.csr & 1L<<14; |
348 | 354 | ||
349 | /* Init the ports in hose order... */ | 355 | /* Init the ports in hose order... */ |
350 | titan_init_one_pachip_port(&pachip0->g_port, 0); /* hose 0 */ | 356 | titan_init_one_pachip_port(&pachip0->g_port, 0); /* hose 0 */ |
351 | if (pchip1_present) | 357 | if (titan_pchip1_present) |
352 | titan_init_one_pachip_port(&pachip1->g_port, 1);/* hose 1 */ | 358 | titan_init_one_pachip_port(&pachip1->g_port, 1);/* hose 1 */ |
353 | titan_init_one_pachip_port(&pachip0->a_port, 2); /* hose 2 */ | 359 | titan_init_one_pachip_port(&pachip0->a_port, 2); /* hose 2 */ |
354 | if (pchip1_present) | 360 | if (titan_pchip1_present) |
355 | titan_init_one_pachip_port(&pachip1->a_port, 3);/* hose 3 */ | 361 | titan_init_one_pachip_port(&pachip1->a_port, 3);/* hose 3 */ |
356 | } | 362 | } |
357 | 363 | ||
358 | static void __init | ||
359 | titan_init_vga_hose(void) | ||
360 | { | ||
361 | #ifdef CONFIG_VGA_HOSE | ||
362 | u64 *pu64 = (u64 *)((u64)hwrpb + hwrpb->ctbt_offset); | ||
363 | |||
364 | if (pu64[7] == 3) { /* TERM_TYPE == graphics */ | ||
365 | struct pci_controller *hose; | ||
366 | int h = (pu64[30] >> 24) & 0xff; /* console hose # */ | ||
367 | |||
368 | /* | ||
369 | * Our hose numbering matches the console's, so just find | ||
370 | * the right one... | ||
371 | */ | ||
372 | for (hose = hose_head; hose; hose = hose->next) { | ||
373 | if (hose->index == h) break; | ||
374 | } | ||
375 | |||
376 | if (hose) { | ||
377 | printk("Console graphics on hose %d\n", hose->index); | ||
378 | pci_vga_hose = hose; | ||
379 | } | ||
380 | } | ||
381 | #endif /* CONFIG_VGA_HOSE */ | ||
382 | } | ||
383 | |||
384 | void __init | 364 | void __init |
385 | titan_init_arch(void) | 365 | titan_init_arch(void) |
386 | { | 366 | { |
@@ -406,6 +386,7 @@ titan_init_arch(void) | |||
406 | 386 | ||
407 | /* With multiple PCI busses, we play with I/O as physical addrs. */ | 387 | /* With multiple PCI busses, we play with I/O as physical addrs. */ |
408 | ioport_resource.end = ~0UL; | 388 | ioport_resource.end = ~0UL; |
389 | iomem_resource.end = ~0UL; | ||
409 | 390 | ||
410 | /* PCI DMA Direct Mapping is 1GB at 2GB. */ | 391 | /* PCI DMA Direct Mapping is 1GB at 2GB. */ |
411 | __direct_map_base = 0x80000000; | 392 | __direct_map_base = 0x80000000; |
@@ -415,7 +396,7 @@ titan_init_arch(void) | |||
415 | titan_init_pachips(TITAN_pachip0, TITAN_pachip1); | 396 | titan_init_pachips(TITAN_pachip0, TITAN_pachip1); |
416 | 397 | ||
417 | /* Check for graphic console location (if any). */ | 398 | /* Check for graphic console location (if any). */ |
418 | titan_init_vga_hose(); | 399 | find_console_vga_hose(); |
419 | } | 400 | } |
420 | 401 | ||
421 | static void | 402 | static void |
@@ -441,9 +422,7 @@ titan_kill_one_pachip_port(titan_pachip_port *port, int index) | |||
441 | static void | 422 | static void |
442 | titan_kill_pachips(titan_pachip *pachip0, titan_pachip *pachip1) | 423 | titan_kill_pachips(titan_pachip *pachip0, titan_pachip *pachip1) |
443 | { | 424 | { |
444 | int pchip1_present = TITAN_cchip->csc.csr & 1L<<14; | 425 | if (titan_pchip1_present) { |
445 | |||
446 | if (pchip1_present) { | ||
447 | titan_kill_one_pachip_port(&pachip1->g_port, 1); | 426 | titan_kill_one_pachip_port(&pachip1->g_port, 1); |
448 | titan_kill_one_pachip_port(&pachip1->a_port, 3); | 427 | titan_kill_one_pachip_port(&pachip1->a_port, 3); |
449 | } | 428 | } |
@@ -463,6 +442,14 @@ titan_kill_arch(int mode) | |||
463 | */ | 442 | */ |
464 | 443 | ||
465 | void __iomem * | 444 | void __iomem * |
445 | titan_ioportmap(unsigned long addr) | ||
446 | { | ||
447 | FIXUP_IOADDR_VGA(addr); | ||
448 | return (void __iomem *)(addr + TITAN_IO_BIAS); | ||
449 | } | ||
450 | |||
451 | |||
452 | void __iomem * | ||
466 | titan_ioremap(unsigned long addr, unsigned long size) | 453 | titan_ioremap(unsigned long addr, unsigned long size) |
467 | { | 454 | { |
468 | int h = (addr & TITAN_HOSE_MASK) >> TITAN_HOSE_SHIFT; | 455 | int h = (addr & TITAN_HOSE_MASK) >> TITAN_HOSE_SHIFT; |
@@ -475,14 +462,12 @@ titan_ioremap(unsigned long addr, unsigned long size) | |||
475 | unsigned long pfn; | 462 | unsigned long pfn; |
476 | 463 | ||
477 | /* | 464 | /* |
478 | * Adjust the addr. | 465 | * Adjust the address and hose, if necessary. |
479 | */ | 466 | */ |
480 | #ifdef CONFIG_VGA_HOSE | 467 | if (pci_vga_hose && __is_mem_vga(addr)) { |
481 | if (pci_vga_hose && __titan_is_mem_vga(addr)) { | ||
482 | h = pci_vga_hose->index; | 468 | h = pci_vga_hose->index; |
483 | addr += pci_vga_hose->mem_space->start; | 469 | addr += pci_vga_hose->mem_space->start; |
484 | } | 470 | } |
485 | #endif | ||
486 | 471 | ||
487 | /* | 472 | /* |
488 | * Find the hose. | 473 | * Find the hose. |
@@ -521,8 +506,10 @@ titan_ioremap(unsigned long addr, unsigned long size) | |||
521 | * Map it | 506 | * Map it |
522 | */ | 507 | */ |
523 | area = get_vm_area(size, VM_IOREMAP); | 508 | area = get_vm_area(size, VM_IOREMAP); |
524 | if (!area) | 509 | if (!area) { |
510 | printk("ioremap failed... no vm_area...\n"); | ||
525 | return NULL; | 511 | return NULL; |
512 | } | ||
526 | 513 | ||
527 | ptes = hose->sg_pci->ptes; | 514 | ptes = hose->sg_pci->ptes; |
528 | for (vaddr = (unsigned long)area->addr; | 515 | for (vaddr = (unsigned long)area->addr; |
@@ -539,7 +526,7 @@ titan_ioremap(unsigned long addr, unsigned long size) | |||
539 | if (__alpha_remap_area_pages(vaddr, | 526 | if (__alpha_remap_area_pages(vaddr, |
540 | pfn << PAGE_SHIFT, | 527 | pfn << PAGE_SHIFT, |
541 | PAGE_SIZE, 0)) { | 528 | PAGE_SIZE, 0)) { |
542 | printk("FAILED to map...\n"); | 529 | printk("FAILED to remap_area_pages...\n"); |
543 | vfree(area->addr); | 530 | vfree(area->addr); |
544 | return NULL; | 531 | return NULL; |
545 | } | 532 | } |
@@ -551,7 +538,8 @@ titan_ioremap(unsigned long addr, unsigned long size) | |||
551 | return (void __iomem *) vaddr; | 538 | return (void __iomem *) vaddr; |
552 | } | 539 | } |
553 | 540 | ||
554 | return NULL; | 541 | /* Assume a legacy (read: VGA) address, and return appropriately. */ |
542 | return (void __iomem *)(addr + TITAN_MEM_BIAS); | ||
555 | } | 543 | } |
556 | 544 | ||
557 | void | 545 | void |
@@ -574,6 +562,7 @@ titan_is_mmio(const volatile void __iomem *xaddr) | |||
574 | } | 562 | } |
575 | 563 | ||
576 | #ifndef CONFIG_ALPHA_GENERIC | 564 | #ifndef CONFIG_ALPHA_GENERIC |
565 | EXPORT_SYMBOL(titan_ioportmap); | ||
577 | EXPORT_SYMBOL(titan_ioremap); | 566 | EXPORT_SYMBOL(titan_ioremap); |
578 | EXPORT_SYMBOL(titan_iounmap); | 567 | EXPORT_SYMBOL(titan_iounmap); |
579 | EXPORT_SYMBOL(titan_is_mmio); | 568 | EXPORT_SYMBOL(titan_is_mmio); |
@@ -750,6 +739,7 @@ titan_agp_info(void) | |||
750 | if (titan_query_agp(port)) | 739 | if (titan_query_agp(port)) |
751 | hosenum = 2; | 740 | hosenum = 2; |
752 | if (hosenum < 0 && | 741 | if (hosenum < 0 && |
742 | titan_pchip1_present && | ||
753 | titan_query_agp(port = &TITAN_pachip1->a_port)) | 743 | titan_query_agp(port = &TITAN_pachip1->a_port)) |
754 | hosenum = 3; | 744 | hosenum = 3; |
755 | 745 | ||
diff --git a/arch/alpha/kernel/core_tsunami.c b/arch/alpha/kernel/core_tsunami.c index ce623c6e55e1..ef91e09590d4 100644 --- a/arch/alpha/kernel/core_tsunami.c +++ b/arch/alpha/kernel/core_tsunami.c | |||
@@ -19,6 +19,7 @@ | |||
19 | 19 | ||
20 | #include <asm/ptrace.h> | 20 | #include <asm/ptrace.h> |
21 | #include <asm/smp.h> | 21 | #include <asm/smp.h> |
22 | #include <asm/vga.h> | ||
22 | 23 | ||
23 | #include "proto.h" | 24 | #include "proto.h" |
24 | #include "pci_impl.h" | 25 | #include "pci_impl.h" |
@@ -349,6 +350,26 @@ tsunami_init_one_pchip(tsunami_pchip *pchip, int index) | |||
349 | tsunami_pci_tbi(hose, 0, -1); | 350 | tsunami_pci_tbi(hose, 0, -1); |
350 | } | 351 | } |
351 | 352 | ||
353 | |||
354 | void __iomem * | ||
355 | tsunami_ioportmap(unsigned long addr) | ||
356 | { | ||
357 | FIXUP_IOADDR_VGA(addr); | ||
358 | return (void __iomem *)(addr + TSUNAMI_IO_BIAS); | ||
359 | } | ||
360 | |||
361 | void __iomem * | ||
362 | tsunami_ioremap(unsigned long addr, unsigned long size) | ||
363 | { | ||
364 | FIXUP_MEMADDR_VGA(addr); | ||
365 | return (void __iomem *)(addr + TSUNAMI_MEM_BIAS); | ||
366 | } | ||
367 | |||
368 | #ifndef CONFIG_ALPHA_GENERIC | ||
369 | EXPORT_SYMBOL(tsunami_ioportmap); | ||
370 | EXPORT_SYMBOL(tsunami_ioremap); | ||
371 | #endif | ||
372 | |||
352 | void __init | 373 | void __init |
353 | tsunami_init_arch(void) | 374 | tsunami_init_arch(void) |
354 | { | 375 | { |
@@ -393,6 +414,9 @@ tsunami_init_arch(void) | |||
393 | tsunami_init_one_pchip(TSUNAMI_pchip0, 0); | 414 | tsunami_init_one_pchip(TSUNAMI_pchip0, 0); |
394 | if (TSUNAMI_cchip->csc.csr & 1L<<14) | 415 | if (TSUNAMI_cchip->csc.csr & 1L<<14) |
395 | tsunami_init_one_pchip(TSUNAMI_pchip1, 1); | 416 | tsunami_init_one_pchip(TSUNAMI_pchip1, 1); |
417 | |||
418 | /* Check for graphic console location (if any). */ | ||
419 | find_console_vga_hose(); | ||
396 | } | 420 | } |
397 | 421 | ||
398 | static void | 422 | static void |
diff --git a/arch/alpha/kernel/entry.S b/arch/alpha/kernel/entry.S index c95e95e1ab04..debc8f03886c 100644 --- a/arch/alpha/kernel/entry.S +++ b/arch/alpha/kernel/entry.S | |||
@@ -391,11 +391,10 @@ $work_resched: | |||
391 | bne $2, $work_resched | 391 | bne $2, $work_resched |
392 | 392 | ||
393 | $work_notifysig: | 393 | $work_notifysig: |
394 | mov $sp, $17 | 394 | mov $sp, $16 |
395 | br $1, do_switch_stack | 395 | br $1, do_switch_stack |
396 | mov $5, $21 | 396 | mov $sp, $17 |
397 | mov $sp, $18 | 397 | mov $5, $18 |
398 | mov $31, $16 | ||
399 | jsr $26, do_notify_resume | 398 | jsr $26, do_notify_resume |
400 | bsr $1, undo_switch_stack | 399 | bsr $1, undo_switch_stack |
401 | br restore_all | 400 | br restore_all |
diff --git a/arch/alpha/kernel/pci_iommu.c b/arch/alpha/kernel/pci_iommu.c index 6e7d1fe6e935..28c84e55feb9 100644 --- a/arch/alpha/kernel/pci_iommu.c +++ b/arch/alpha/kernel/pci_iommu.c | |||
@@ -7,6 +7,7 @@ | |||
7 | #include <linux/pci.h> | 7 | #include <linux/pci.h> |
8 | #include <linux/slab.h> | 8 | #include <linux/slab.h> |
9 | #include <linux/bootmem.h> | 9 | #include <linux/bootmem.h> |
10 | #include <linux/log2.h> | ||
10 | 11 | ||
11 | #include <asm/io.h> | 12 | #include <asm/io.h> |
12 | #include <asm/hwrpb.h> | 13 | #include <asm/hwrpb.h> |
@@ -53,7 +54,7 @@ size_for_memory(unsigned long max) | |||
53 | { | 54 | { |
54 | unsigned long mem = max_low_pfn << PAGE_SHIFT; | 55 | unsigned long mem = max_low_pfn << PAGE_SHIFT; |
55 | if (mem < max) | 56 | if (mem < max) |
56 | max = 1UL << ceil_log2(mem); | 57 | max = roundup_pow_of_two(mem); |
57 | return max; | 58 | return max; |
58 | } | 59 | } |
59 | 60 | ||
diff --git a/arch/alpha/kernel/proto.h b/arch/alpha/kernel/proto.h index 95912ecc65e1..708d5ca87782 100644 --- a/arch/alpha/kernel/proto.h +++ b/arch/alpha/kernel/proto.h | |||
@@ -108,6 +108,15 @@ extern int wildfire_cpuid_to_nid(int); | |||
108 | extern unsigned long wildfire_node_mem_start(int); | 108 | extern unsigned long wildfire_node_mem_start(int); |
109 | extern unsigned long wildfire_node_mem_size(int); | 109 | extern unsigned long wildfire_node_mem_size(int); |
110 | 110 | ||
111 | /* console.c */ | ||
112 | #ifdef CONFIG_VGA_HOSE | ||
113 | extern void find_console_vga_hose(void); | ||
114 | extern void locate_and_init_vga(void *(*)(void *, void *)); | ||
115 | #else | ||
116 | static inline void find_console_vga_hose(void) { } | ||
117 | static inline void locate_and_init_vga(void *(*sel_func)(void *, void *)) { } | ||
118 | #endif | ||
119 | |||
111 | /* setup.c */ | 120 | /* setup.c */ |
112 | extern unsigned long srm_hae; | 121 | extern unsigned long srm_hae; |
113 | extern int boot_cpuid; | 122 | extern int boot_cpuid; |
diff --git a/arch/alpha/kernel/setup.c b/arch/alpha/kernel/setup.c index 915f26345c45..bd5e68cd61e8 100644 --- a/arch/alpha/kernel/setup.c +++ b/arch/alpha/kernel/setup.c | |||
@@ -43,6 +43,7 @@ | |||
43 | #include <linux/notifier.h> | 43 | #include <linux/notifier.h> |
44 | #include <asm/setup.h> | 44 | #include <asm/setup.h> |
45 | #include <asm/io.h> | 45 | #include <asm/io.h> |
46 | #include <linux/log2.h> | ||
46 | 47 | ||
47 | extern struct atomic_notifier_head panic_notifier_list; | 48 | extern struct atomic_notifier_head panic_notifier_list; |
48 | static int alpha_panic_event(struct notifier_block *, unsigned long, void *); | 49 | static int alpha_panic_event(struct notifier_block *, unsigned long, void *); |
@@ -1303,7 +1304,7 @@ external_cache_probe(int minsize, int width) | |||
1303 | long size = minsize, maxsize = MAX_BCACHE_SIZE * 2; | 1304 | long size = minsize, maxsize = MAX_BCACHE_SIZE * 2; |
1304 | 1305 | ||
1305 | if (maxsize > (max_low_pfn + 1) << PAGE_SHIFT) | 1306 | if (maxsize > (max_low_pfn + 1) << PAGE_SHIFT) |
1306 | maxsize = 1 << (floor_log2(max_low_pfn + 1) + PAGE_SHIFT); | 1307 | maxsize = 1 << (ilog2(max_low_pfn + 1) + PAGE_SHIFT); |
1307 | 1308 | ||
1308 | /* Get the first block cached. */ | 1309 | /* Get the first block cached. */ |
1309 | read_mem_block(__va(0), stride, size); | 1310 | read_mem_block(__va(0), stride, size); |
diff --git a/arch/alpha/kernel/signal.c b/arch/alpha/kernel/signal.c index 7f64aa767d5a..410af4f3140e 100644 --- a/arch/alpha/kernel/signal.c +++ b/arch/alpha/kernel/signal.c | |||
@@ -32,8 +32,8 @@ | |||
32 | #define _BLOCKABLE (~(sigmask(SIGKILL) | sigmask(SIGSTOP))) | 32 | #define _BLOCKABLE (~(sigmask(SIGKILL) | sigmask(SIGSTOP))) |
33 | 33 | ||
34 | asmlinkage void ret_from_sys_call(void); | 34 | asmlinkage void ret_from_sys_call(void); |
35 | static int do_signal(sigset_t *, struct pt_regs *, struct switch_stack *, | 35 | static void do_signal(struct pt_regs *, struct switch_stack *, |
36 | unsigned long, unsigned long); | 36 | unsigned long, unsigned long); |
37 | 37 | ||
38 | 38 | ||
39 | /* | 39 | /* |
@@ -146,11 +146,9 @@ sys_rt_sigaction(int sig, const struct sigaction __user *act, | |||
146 | asmlinkage int | 146 | asmlinkage int |
147 | do_sigsuspend(old_sigset_t mask, struct pt_regs *regs, struct switch_stack *sw) | 147 | do_sigsuspend(old_sigset_t mask, struct pt_regs *regs, struct switch_stack *sw) |
148 | { | 148 | { |
149 | sigset_t oldset; | ||
150 | |||
151 | mask &= _BLOCKABLE; | 149 | mask &= _BLOCKABLE; |
152 | spin_lock_irq(¤t->sighand->siglock); | 150 | spin_lock_irq(¤t->sighand->siglock); |
153 | oldset = current->blocked; | 151 | current->saved_sigmask = current->blocked; |
154 | siginitset(¤t->blocked, mask); | 152 | siginitset(¤t->blocked, mask); |
155 | recalc_sigpending(); | 153 | recalc_sigpending(); |
156 | spin_unlock_irq(¤t->sighand->siglock); | 154 | spin_unlock_irq(¤t->sighand->siglock); |
@@ -160,19 +158,17 @@ do_sigsuspend(old_sigset_t mask, struct pt_regs *regs, struct switch_stack *sw) | |||
160 | regs->r0 = EINTR; | 158 | regs->r0 = EINTR; |
161 | regs->r19 = 1; | 159 | regs->r19 = 1; |
162 | 160 | ||
163 | while (1) { | 161 | current->state = TASK_INTERRUPTIBLE; |
164 | current->state = TASK_INTERRUPTIBLE; | 162 | schedule(); |
165 | schedule(); | 163 | set_thread_flag(TIF_RESTORE_SIGMASK); |
166 | if (do_signal(&oldset, regs, sw, 0, 0)) | 164 | return -ERESTARTNOHAND; |
167 | return -EINTR; | ||
168 | } | ||
169 | } | 165 | } |
170 | 166 | ||
171 | asmlinkage int | 167 | asmlinkage int |
172 | do_rt_sigsuspend(sigset_t __user *uset, size_t sigsetsize, | 168 | do_rt_sigsuspend(sigset_t __user *uset, size_t sigsetsize, |
173 | struct pt_regs *regs, struct switch_stack *sw) | 169 | struct pt_regs *regs, struct switch_stack *sw) |
174 | { | 170 | { |
175 | sigset_t oldset, set; | 171 | sigset_t set; |
176 | 172 | ||
177 | /* XXX: Don't preclude handling different sized sigset_t's. */ | 173 | /* XXX: Don't preclude handling different sized sigset_t's. */ |
178 | if (sigsetsize != sizeof(sigset_t)) | 174 | if (sigsetsize != sizeof(sigset_t)) |
@@ -182,7 +178,7 @@ do_rt_sigsuspend(sigset_t __user *uset, size_t sigsetsize, | |||
182 | 178 | ||
183 | sigdelsetmask(&set, ~_BLOCKABLE); | 179 | sigdelsetmask(&set, ~_BLOCKABLE); |
184 | spin_lock_irq(¤t->sighand->siglock); | 180 | spin_lock_irq(¤t->sighand->siglock); |
185 | oldset = current->blocked; | 181 | current->saved_sigmask = current->blocked; |
186 | current->blocked = set; | 182 | current->blocked = set; |
187 | recalc_sigpending(); | 183 | recalc_sigpending(); |
188 | spin_unlock_irq(¤t->sighand->siglock); | 184 | spin_unlock_irq(¤t->sighand->siglock); |
@@ -192,12 +188,10 @@ do_rt_sigsuspend(sigset_t __user *uset, size_t sigsetsize, | |||
192 | regs->r0 = EINTR; | 188 | regs->r0 = EINTR; |
193 | regs->r19 = 1; | 189 | regs->r19 = 1; |
194 | 190 | ||
195 | while (1) { | 191 | current->state = TASK_INTERRUPTIBLE; |
196 | current->state = TASK_INTERRUPTIBLE; | 192 | schedule(); |
197 | schedule(); | 193 | set_thread_flag(TIF_RESTORE_SIGMASK); |
198 | if (do_signal(&oldset, regs, sw, 0, 0)) | 194 | return -ERESTARTNOHAND; |
199 | return -EINTR; | ||
200 | } | ||
201 | } | 195 | } |
202 | 196 | ||
203 | asmlinkage int | 197 | asmlinkage int |
@@ -436,7 +430,7 @@ setup_sigcontext(struct sigcontext __user *sc, struct pt_regs *regs, | |||
436 | return err; | 430 | return err; |
437 | } | 431 | } |
438 | 432 | ||
439 | static void | 433 | static int |
440 | setup_frame(int sig, struct k_sigaction *ka, sigset_t *set, | 434 | setup_frame(int sig, struct k_sigaction *ka, sigset_t *set, |
441 | struct pt_regs *regs, struct switch_stack * sw) | 435 | struct pt_regs *regs, struct switch_stack * sw) |
442 | { | 436 | { |
@@ -481,13 +475,14 @@ setup_frame(int sig, struct k_sigaction *ka, sigset_t *set, | |||
481 | current->comm, current->pid, frame, regs->pc, regs->r26); | 475 | current->comm, current->pid, frame, regs->pc, regs->r26); |
482 | #endif | 476 | #endif |
483 | 477 | ||
484 | return; | 478 | return 0; |
485 | 479 | ||
486 | give_sigsegv: | 480 | give_sigsegv: |
487 | force_sigsegv(sig, current); | 481 | force_sigsegv(sig, current); |
482 | return -EFAULT; | ||
488 | } | 483 | } |
489 | 484 | ||
490 | static void | 485 | static int |
491 | setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info, | 486 | setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info, |
492 | sigset_t *set, struct pt_regs *regs, struct switch_stack * sw) | 487 | sigset_t *set, struct pt_regs *regs, struct switch_stack * sw) |
493 | { | 488 | { |
@@ -543,34 +538,38 @@ setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info, | |||
543 | current->comm, current->pid, frame, regs->pc, regs->r26); | 538 | current->comm, current->pid, frame, regs->pc, regs->r26); |
544 | #endif | 539 | #endif |
545 | 540 | ||
546 | return; | 541 | return 0; |
547 | 542 | ||
548 | give_sigsegv: | 543 | give_sigsegv: |
549 | force_sigsegv(sig, current); | 544 | force_sigsegv(sig, current); |
545 | return -EFAULT; | ||
550 | } | 546 | } |
551 | 547 | ||
552 | 548 | ||
553 | /* | 549 | /* |
554 | * OK, we're invoking a handler. | 550 | * OK, we're invoking a handler. |
555 | */ | 551 | */ |
556 | static inline void | 552 | static inline int |
557 | handle_signal(int sig, struct k_sigaction *ka, siginfo_t *info, | 553 | handle_signal(int sig, struct k_sigaction *ka, siginfo_t *info, |
558 | sigset_t *oldset, struct pt_regs * regs, struct switch_stack *sw) | 554 | sigset_t *oldset, struct pt_regs * regs, struct switch_stack *sw) |
559 | { | 555 | { |
556 | int ret; | ||
557 | |||
560 | if (ka->sa.sa_flags & SA_SIGINFO) | 558 | if (ka->sa.sa_flags & SA_SIGINFO) |
561 | setup_rt_frame(sig, ka, info, oldset, regs, sw); | 559 | ret = setup_rt_frame(sig, ka, info, oldset, regs, sw); |
562 | else | 560 | else |
563 | setup_frame(sig, ka, oldset, regs, sw); | 561 | ret = setup_frame(sig, ka, oldset, regs, sw); |
564 | 562 | ||
565 | if (ka->sa.sa_flags & SA_RESETHAND) | 563 | if (ret == 0) { |
566 | ka->sa.sa_handler = SIG_DFL; | 564 | spin_lock_irq(¤t->sighand->siglock); |
565 | sigorsets(¤t->blocked,¤t->blocked,&ka->sa.sa_mask); | ||
566 | if (!(ka->sa.sa_flags & SA_NODEFER)) | ||
567 | sigaddset(¤t->blocked,sig); | ||
568 | recalc_sigpending(); | ||
569 | spin_unlock_irq(¤t->sighand->siglock); | ||
570 | } | ||
567 | 571 | ||
568 | spin_lock_irq(¤t->sighand->siglock); | 572 | return ret; |
569 | sigorsets(¤t->blocked,¤t->blocked,&ka->sa.sa_mask); | ||
570 | if (!(ka->sa.sa_flags & SA_NODEFER)) | ||
571 | sigaddset(¤t->blocked,sig); | ||
572 | recalc_sigpending(); | ||
573 | spin_unlock_irq(¤t->sighand->siglock); | ||
574 | } | 573 | } |
575 | 574 | ||
576 | static inline void | 575 | static inline void |
@@ -611,30 +610,42 @@ syscall_restart(unsigned long r0, unsigned long r19, | |||
611 | * restart. "r0" is also used as an indicator whether we can restart at | 610 | * restart. "r0" is also used as an indicator whether we can restart at |
612 | * all (if we get here from anything but a syscall return, it will be 0) | 611 | * all (if we get here from anything but a syscall return, it will be 0) |
613 | */ | 612 | */ |
614 | static int | 613 | static void |
615 | do_signal(sigset_t *oldset, struct pt_regs * regs, struct switch_stack * sw, | 614 | do_signal(struct pt_regs * regs, struct switch_stack * sw, |
616 | unsigned long r0, unsigned long r19) | 615 | unsigned long r0, unsigned long r19) |
617 | { | 616 | { |
618 | siginfo_t info; | 617 | siginfo_t info; |
619 | int signr; | 618 | int signr; |
620 | unsigned long single_stepping = ptrace_cancel_bpt(current); | 619 | unsigned long single_stepping = ptrace_cancel_bpt(current); |
621 | struct k_sigaction ka; | 620 | struct k_sigaction ka; |
621 | sigset_t *oldset; | ||
622 | 622 | ||
623 | if (!oldset) | 623 | if (test_thread_flag(TIF_RESTORE_SIGMASK)) |
624 | oldset = ¤t->saved_sigmask; | ||
625 | else | ||
624 | oldset = ¤t->blocked; | 626 | oldset = ¤t->blocked; |
625 | 627 | ||
626 | /* This lets the debugger run, ... */ | 628 | /* This lets the debugger run, ... */ |
627 | signr = get_signal_to_deliver(&info, &ka, regs, NULL); | 629 | signr = get_signal_to_deliver(&info, &ka, regs, NULL); |
630 | |||
628 | /* ... so re-check the single stepping. */ | 631 | /* ... so re-check the single stepping. */ |
629 | single_stepping |= ptrace_cancel_bpt(current); | 632 | single_stepping |= ptrace_cancel_bpt(current); |
630 | 633 | ||
631 | if (signr > 0) { | 634 | if (signr > 0) { |
632 | /* Whee! Actually deliver the signal. */ | 635 | /* Whee! Actually deliver the signal. */ |
633 | if (r0) syscall_restart(r0, r19, regs, &ka); | 636 | if (r0) |
634 | handle_signal(signr, &ka, &info, oldset, regs, sw); | 637 | syscall_restart(r0, r19, regs, &ka); |
638 | if (handle_signal(signr, &ka, &info, oldset, regs, sw) == 0) { | ||
639 | /* A signal was successfully delivered, and the | ||
640 | saved sigmask was stored on the signal frame, | ||
641 | and will be restored by sigreturn. So we can | ||
642 | simply clear the restore sigmask flag. */ | ||
643 | if (test_thread_flag(TIF_RESTORE_SIGMASK)) | ||
644 | clear_thread_flag(TIF_RESTORE_SIGMASK); | ||
645 | } | ||
635 | if (single_stepping) | 646 | if (single_stepping) |
636 | ptrace_set_bpt(current); /* re-set bpt */ | 647 | ptrace_set_bpt(current); /* re-set bpt */ |
637 | return 1; | 648 | return; |
638 | } | 649 | } |
639 | 650 | ||
640 | if (r0) { | 651 | if (r0) { |
@@ -654,17 +665,22 @@ do_signal(sigset_t *oldset, struct pt_regs * regs, struct switch_stack * sw, | |||
654 | break; | 665 | break; |
655 | } | 666 | } |
656 | } | 667 | } |
668 | |||
669 | /* If there's no signal to deliver, we just restore the saved mask. */ | ||
670 | if (test_thread_flag(TIF_RESTORE_SIGMASK)) { | ||
671 | clear_thread_flag(TIF_RESTORE_SIGMASK); | ||
672 | sigprocmask(SIG_SETMASK, ¤t->saved_sigmask, NULL); | ||
673 | } | ||
674 | |||
657 | if (single_stepping) | 675 | if (single_stepping) |
658 | ptrace_set_bpt(current); /* re-set breakpoint */ | 676 | ptrace_set_bpt(current); /* re-set breakpoint */ |
659 | |||
660 | return 0; | ||
661 | } | 677 | } |
662 | 678 | ||
663 | void | 679 | void |
664 | do_notify_resume(sigset_t *oldset, struct pt_regs *regs, | 680 | do_notify_resume(struct pt_regs *regs, struct switch_stack *sw, |
665 | struct switch_stack *sw, unsigned long r0, | 681 | unsigned long thread_info_flags, |
666 | unsigned long r19, unsigned long thread_info_flags) | 682 | unsigned long r0, unsigned long r19) |
667 | { | 683 | { |
668 | if (thread_info_flags & _TIF_SIGPENDING) | 684 | if (thread_info_flags & (_TIF_SIGPENDING | _TIF_RESTORE_SIGMASK)) |
669 | do_signal(oldset, regs, sw, r0, r19); | 685 | do_signal(regs, sw, r0, r19); |
670 | } | 686 | } |
diff --git a/arch/alpha/kernel/sys_dp264.c b/arch/alpha/kernel/sys_dp264.c index 85d2f933dd07..c71b0fd7a61f 100644 --- a/arch/alpha/kernel/sys_dp264.c +++ b/arch/alpha/kernel/sys_dp264.c | |||
@@ -543,6 +543,7 @@ dp264_init_pci(void) | |||
543 | { | 543 | { |
544 | common_init_pci(); | 544 | common_init_pci(); |
545 | SMC669_Init(0); | 545 | SMC669_Init(0); |
546 | locate_and_init_vga(NULL); | ||
546 | } | 547 | } |
547 | 548 | ||
548 | static void __init | 549 | static void __init |
@@ -551,6 +552,14 @@ monet_init_pci(void) | |||
551 | common_init_pci(); | 552 | common_init_pci(); |
552 | SMC669_Init(1); | 553 | SMC669_Init(1); |
553 | es1888_init(); | 554 | es1888_init(); |
555 | locate_and_init_vga(NULL); | ||
556 | } | ||
557 | |||
558 | static void __init | ||
559 | clipper_init_pci(void) | ||
560 | { | ||
561 | common_init_pci(); | ||
562 | locate_and_init_vga(NULL); | ||
554 | } | 563 | } |
555 | 564 | ||
556 | static void __init | 565 | static void __init |
@@ -655,7 +664,7 @@ struct alpha_machine_vector clipper_mv __initmv = { | |||
655 | .init_arch = tsunami_init_arch, | 664 | .init_arch = tsunami_init_arch, |
656 | .init_irq = clipper_init_irq, | 665 | .init_irq = clipper_init_irq, |
657 | .init_rtc = common_init_rtc, | 666 | .init_rtc = common_init_rtc, |
658 | .init_pci = common_init_pci, | 667 | .init_pci = clipper_init_pci, |
659 | .kill_arch = tsunami_kill_arch, | 668 | .kill_arch = tsunami_kill_arch, |
660 | .pci_map_irq = clipper_map_irq, | 669 | .pci_map_irq = clipper_map_irq, |
661 | .pci_swizzle = common_swizzle, | 670 | .pci_swizzle = common_swizzle, |
diff --git a/arch/alpha/kernel/sys_marvel.c b/arch/alpha/kernel/sys_marvel.c index e349f03b830e..0bcb968cb60a 100644 --- a/arch/alpha/kernel/sys_marvel.c +++ b/arch/alpha/kernel/sys_marvel.c | |||
@@ -22,6 +22,7 @@ | |||
22 | #include <asm/core_marvel.h> | 22 | #include <asm/core_marvel.h> |
23 | #include <asm/hwrpb.h> | 23 | #include <asm/hwrpb.h> |
24 | #include <asm/tlbflush.h> | 24 | #include <asm/tlbflush.h> |
25 | #include <asm/vga.h> | ||
25 | 26 | ||
26 | #include "proto.h" | 27 | #include "proto.h" |
27 | #include "err_impl.h" | 28 | #include "err_impl.h" |
@@ -412,10 +413,7 @@ marvel_init_pci(void) | |||
412 | 413 | ||
413 | pci_probe_only = 1; | 414 | pci_probe_only = 1; |
414 | common_init_pci(); | 415 | common_init_pci(); |
415 | |||
416 | #ifdef CONFIG_VGA_HOSE | ||
417 | locate_and_init_vga(NULL); | 416 | locate_and_init_vga(NULL); |
418 | #endif | ||
419 | 417 | ||
420 | /* Clear any io7 errors. */ | 418 | /* Clear any io7 errors. */ |
421 | for (io7 = NULL; (io7 = marvel_next_io7(io7)) != NULL; ) | 419 | for (io7 = NULL; (io7 = marvel_next_io7(io7)) != NULL; ) |
diff --git a/arch/alpha/kernel/sys_titan.c b/arch/alpha/kernel/sys_titan.c index f009b7bc0943..1d3c1398c428 100644 --- a/arch/alpha/kernel/sys_titan.c +++ b/arch/alpha/kernel/sys_titan.c | |||
@@ -331,9 +331,7 @@ titan_init_pci(void) | |||
331 | pci_probe_only = 1; | 331 | pci_probe_only = 1; |
332 | common_init_pci(); | 332 | common_init_pci(); |
333 | SMC669_Init(0); | 333 | SMC669_Init(0); |
334 | #ifdef CONFIG_VGA_HOSE | ||
335 | locate_and_init_vga(NULL); | 334 | locate_and_init_vga(NULL); |
336 | #endif | ||
337 | } | 335 | } |
338 | 336 | ||
339 | 337 | ||
diff --git a/arch/alpha/kernel/systbls.S b/arch/alpha/kernel/systbls.S index f6cfe8ce3f96..79de99e32c35 100644 --- a/arch/alpha/kernel/systbls.S +++ b/arch/alpha/kernel/systbls.S | |||
@@ -465,6 +465,38 @@ sys_call_table: | |||
465 | .quad sys_inotify_init | 465 | .quad sys_inotify_init |
466 | .quad sys_inotify_add_watch /* 445 */ | 466 | .quad sys_inotify_add_watch /* 445 */ |
467 | .quad sys_inotify_rm_watch | 467 | .quad sys_inotify_rm_watch |
468 | .quad sys_fdatasync | ||
469 | .quad sys_kexec_load | ||
470 | .quad sys_migrate_pages | ||
471 | .quad sys_openat /* 450 */ | ||
472 | .quad sys_mkdirat | ||
473 | .quad sys_mknodat | ||
474 | .quad sys_fchownat | ||
475 | .quad sys_futimesat | ||
476 | .quad sys_fstatat64 /* 455 */ | ||
477 | .quad sys_unlinkat | ||
478 | .quad sys_renameat | ||
479 | .quad sys_linkat | ||
480 | .quad sys_symlinkat | ||
481 | .quad sys_readlinkat /* 460 */ | ||
482 | .quad sys_fchmodat | ||
483 | .quad sys_faccessat | ||
484 | .quad sys_pselect6 | ||
485 | .quad sys_ppoll | ||
486 | .quad sys_unshare /* 465 */ | ||
487 | .quad sys_set_robust_list | ||
488 | .quad sys_get_robust_list | ||
489 | .quad sys_splice | ||
490 | .quad sys_sync_file_range | ||
491 | .quad sys_tee /* 470 */ | ||
492 | .quad sys_vmsplice | ||
493 | .quad sys_move_pages | ||
494 | .quad sys_getcpu | ||
495 | .quad sys_epoll_pwait | ||
496 | .quad sys_utimensat /* 475 */ | ||
497 | .quad sys_signalfd | ||
498 | .quad sys_timerfd | ||
499 | .quad sys_eventfd | ||
468 | 500 | ||
469 | .size sys_call_table, . - sys_call_table | 501 | .size sys_call_table, . - sys_call_table |
470 | .type sys_call_table, @object | 502 | .type sys_call_table, @object |
diff --git a/arch/alpha/lib/Makefile b/arch/alpha/lib/Makefile index ea098f3b629f..266f78e13076 100644 --- a/arch/alpha/lib/Makefile +++ b/arch/alpha/lib/Makefile | |||
@@ -37,7 +37,8 @@ lib-y = __divqu.o __remqu.o __divlu.o __remlu.o \ | |||
37 | $(ev6-y)clear_page.o \ | 37 | $(ev6-y)clear_page.o \ |
38 | $(ev6-y)copy_page.o \ | 38 | $(ev6-y)copy_page.o \ |
39 | fpreg.o \ | 39 | fpreg.o \ |
40 | callback_srm.o srm_puts.o srm_printk.o | 40 | callback_srm.o srm_puts.o srm_printk.o \ |
41 | fls.o | ||
41 | 42 | ||
42 | lib-$(CONFIG_SMP) += dec_and_lock.o | 43 | lib-$(CONFIG_SMP) += dec_and_lock.o |
43 | 44 | ||
diff --git a/arch/alpha/lib/fls.c b/arch/alpha/lib/fls.c new file mode 100644 index 000000000000..7ad84ea0acf8 --- /dev/null +++ b/arch/alpha/lib/fls.c | |||
@@ -0,0 +1,38 @@ | |||
1 | /* | ||
2 | * arch/alpha/lib/fls.c | ||
3 | */ | ||
4 | |||
5 | #include <linux/module.h> | ||
6 | #include <asm/bitops.h> | ||
7 | |||
8 | /* This is fls(x)-1, except zero is held to zero. This allows most | ||
9 | efficent input into extbl, plus it allows easy handling of fls(0)=0. */ | ||
10 | |||
11 | const unsigned char __flsm1_tab[256] = | ||
12 | { | ||
13 | 0, | ||
14 | 0, | ||
15 | 1, 1, | ||
16 | 2, 2, 2, 2, | ||
17 | 3, 3, 3, 3, 3, 3, 3, 3, | ||
18 | 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, | ||
19 | |||
20 | 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, | ||
21 | 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, | ||
22 | |||
23 | 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, | ||
24 | 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, | ||
25 | 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, | ||
26 | 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, | ||
27 | |||
28 | 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, | ||
29 | 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, | ||
30 | 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, | ||
31 | 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, | ||
32 | 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, | ||
33 | 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, | ||
34 | 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, | ||
35 | 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, | ||
36 | }; | ||
37 | |||
38 | EXPORT_SYMBOL(__flsm1_tab); | ||
diff --git a/arch/arm/kernel/armksyms.c b/arch/arm/kernel/armksyms.c index 9179e8220314..f73d62e8ab60 100644 --- a/arch/arm/kernel/armksyms.c +++ b/arch/arm/kernel/armksyms.c | |||
@@ -57,7 +57,7 @@ extern void fp_enter(void); | |||
57 | #define EXPORT_SYMBOL_ALIAS(sym,orig) \ | 57 | #define EXPORT_SYMBOL_ALIAS(sym,orig) \ |
58 | EXPORT_CRC_ALIAS(sym) \ | 58 | EXPORT_CRC_ALIAS(sym) \ |
59 | static const struct kernel_symbol __ksymtab_##sym \ | 59 | static const struct kernel_symbol __ksymtab_##sym \ |
60 | __attribute_used__ __attribute__((section("__ksymtab"))) = \ | 60 | __used __attribute__((section("__ksymtab"))) = \ |
61 | { (unsigned long)&orig, #sym }; | 61 | { (unsigned long)&orig, #sym }; |
62 | 62 | ||
63 | /* | 63 | /* |
diff --git a/arch/arm/kernel/stacktrace.c b/arch/arm/kernel/stacktrace.c index 8b63ad89d0a8..ae31deb2d065 100644 --- a/arch/arm/kernel/stacktrace.c +++ b/arch/arm/kernel/stacktrace.c | |||
@@ -13,7 +13,7 @@ int walk_stackframe(unsigned long fp, unsigned long low, unsigned long high, | |||
13 | /* | 13 | /* |
14 | * Check current frame pointer is within bounds | 14 | * Check current frame pointer is within bounds |
15 | */ | 15 | */ |
16 | if ((fp - 12) < low || fp + 4 >= high) | 16 | if (fp < (low + 12) || fp + 4 >= high) |
17 | break; | 17 | break; |
18 | 18 | ||
19 | frame = (struct stackframe *)(fp - 12); | 19 | frame = (struct stackframe *)(fp - 12); |
diff --git a/arch/arm/mach-at91/board-dk.c b/arch/arm/mach-at91/board-dk.c index 6043c38c0a9e..af497896a96c 100644 --- a/arch/arm/mach-at91/board-dk.c +++ b/arch/arm/mach-at91/board-dk.c | |||
@@ -132,7 +132,7 @@ static struct mtd_partition __initdata dk_nand_partition[] = { | |||
132 | }, | 132 | }, |
133 | }; | 133 | }; |
134 | 134 | ||
135 | static struct mtd_partition *nand_partitions(int size, int *num_partitions) | 135 | static struct mtd_partition * __init nand_partitions(int size, int *num_partitions) |
136 | { | 136 | { |
137 | *num_partitions = ARRAY_SIZE(dk_nand_partition); | 137 | *num_partitions = ARRAY_SIZE(dk_nand_partition); |
138 | return dk_nand_partition; | 138 | return dk_nand_partition; |
diff --git a/arch/arm/mach-at91/board-kb9202.c b/arch/arm/mach-at91/board-kb9202.c index 76f6e1e553ea..7d9b1a278fd6 100644 --- a/arch/arm/mach-at91/board-kb9202.c +++ b/arch/arm/mach-at91/board-kb9202.c | |||
@@ -96,7 +96,7 @@ static struct mtd_partition __initdata kb9202_nand_partition[] = { | |||
96 | }, | 96 | }, |
97 | }; | 97 | }; |
98 | 98 | ||
99 | static struct mtd_partition *nand_partitions(int size, int *num_partitions) | 99 | static struct mtd_partition * __init nand_partitions(int size, int *num_partitions) |
100 | { | 100 | { |
101 | *num_partitions = ARRAY_SIZE(kb9202_nand_partition); | 101 | *num_partitions = ARRAY_SIZE(kb9202_nand_partition); |
102 | return kb9202_nand_partition; | 102 | return kb9202_nand_partition; |
diff --git a/arch/arm/mach-at91/board-sam9261ek.c b/arch/arm/mach-at91/board-sam9261ek.c index 1f0c8a400b3a..26ca8ab3f62a 100644 --- a/arch/arm/mach-at91/board-sam9261ek.c +++ b/arch/arm/mach-at91/board-sam9261ek.c | |||
@@ -178,7 +178,7 @@ static struct mtd_partition __initdata ek_nand_partition[] = { | |||
178 | }, | 178 | }, |
179 | }; | 179 | }; |
180 | 180 | ||
181 | static struct mtd_partition *nand_partitions(int size, int *num_partitions) | 181 | static struct mtd_partition * __init nand_partitions(int size, int *num_partitions) |
182 | { | 182 | { |
183 | *num_partitions = ARRAY_SIZE(ek_nand_partition); | 183 | *num_partitions = ARRAY_SIZE(ek_nand_partition); |
184 | return ek_nand_partition; | 184 | return ek_nand_partition; |
diff --git a/arch/arm/mach-at91/board-sam9263ek.c b/arch/arm/mach-at91/board-sam9263ek.c index f57458559fb6..c164c8e58ae6 100644 --- a/arch/arm/mach-at91/board-sam9263ek.c +++ b/arch/arm/mach-at91/board-sam9263ek.c | |||
@@ -180,7 +180,7 @@ static struct mtd_partition __initdata ek_nand_partition[] = { | |||
180 | }, | 180 | }, |
181 | }; | 181 | }; |
182 | 182 | ||
183 | static struct mtd_partition *nand_partitions(int size, int *num_partitions) | 183 | static struct mtd_partition * __init nand_partitions(int size, int *num_partitions) |
184 | { | 184 | { |
185 | *num_partitions = ARRAY_SIZE(ek_nand_partition); | 185 | *num_partitions = ARRAY_SIZE(ek_nand_partition); |
186 | return ek_nand_partition; | 186 | return ek_nand_partition; |
diff --git a/arch/arm/mach-at91/board-sam9rlek.c b/arch/arm/mach-at91/board-sam9rlek.c index 30c79aca84d4..9b61320f295a 100644 --- a/arch/arm/mach-at91/board-sam9rlek.c +++ b/arch/arm/mach-at91/board-sam9rlek.c | |||
@@ -87,7 +87,7 @@ static struct mtd_partition __initdata ek_nand_partition[] = { | |||
87 | }, | 87 | }, |
88 | }; | 88 | }; |
89 | 89 | ||
90 | static struct mtd_partition *nand_partitions(int size, int *num_partitions) | 90 | static struct mtd_partition * __init nand_partitions(int size, int *num_partitions) |
91 | { | 91 | { |
92 | *num_partitions = ARRAY_SIZE(ek_nand_partition); | 92 | *num_partitions = ARRAY_SIZE(ek_nand_partition); |
93 | return ek_nand_partition; | 93 | return ek_nand_partition; |
diff --git a/arch/arm/mach-footbridge/cats-pci.c b/arch/arm/mach-footbridge/cats-pci.c index 4f984fde7375..35eb232a649a 100644 --- a/arch/arm/mach-footbridge/cats-pci.c +++ b/arch/arm/mach-footbridge/cats-pci.c | |||
@@ -45,7 +45,7 @@ static struct hw_pci cats_pci __initdata = { | |||
45 | .postinit = dc21285_postinit, | 45 | .postinit = dc21285_postinit, |
46 | }; | 46 | }; |
47 | 47 | ||
48 | static int cats_pci_init(void) | 48 | static int __init cats_pci_init(void) |
49 | { | 49 | { |
50 | if (machine_is_cats()) | 50 | if (machine_is_cats()) |
51 | pci_common_init(&cats_pci); | 51 | pci_common_init(&cats_pci); |
diff --git a/arch/arm/mach-imx/generic.c b/arch/arm/mach-imx/generic.c index 7a7fa51ec62c..1c474cf709ca 100644 --- a/arch/arm/mach-imx/generic.c +++ b/arch/arm/mach-imx/generic.c | |||
@@ -201,7 +201,6 @@ void __init imx_set_mmc_info(struct imxmmc_platform_data *info) | |||
201 | { | 201 | { |
202 | imx_mmc_device.dev.platform_data = info; | 202 | imx_mmc_device.dev.platform_data = info; |
203 | } | 203 | } |
204 | EXPORT_SYMBOL(imx_set_mmc_info); | ||
205 | 204 | ||
206 | static struct imxfb_mach_info imx_fb_info; | 205 | static struct imxfb_mach_info imx_fb_info; |
207 | 206 | ||
diff --git a/arch/arm/mach-ixp2000/ixdp2400.c b/arch/arm/mach-ixp2000/ixdp2400.c index 0fdd03ab36e6..ce7c15c73004 100644 --- a/arch/arm/mach-ixp2000/ixdp2400.c +++ b/arch/arm/mach-ixp2000/ixdp2400.c | |||
@@ -164,7 +164,7 @@ int __init ixdp2400_pci_init(void) | |||
164 | 164 | ||
165 | subsys_initcall(ixdp2400_pci_init); | 165 | subsys_initcall(ixdp2400_pci_init); |
166 | 166 | ||
167 | void ixdp2400_init_irq(void) | 167 | void __init ixdp2400_init_irq(void) |
168 | { | 168 | { |
169 | ixdp2x00_init_irq(IXDP2400_CPLD_INT_STAT, IXDP2400_CPLD_INT_MASK, IXDP2400_NR_IRQS); | 169 | ixdp2x00_init_irq(IXDP2400_CPLD_INT_STAT, IXDP2400_CPLD_INT_MASK, IXDP2400_NR_IRQS); |
170 | } | 170 | } |
diff --git a/arch/arm/mach-ixp2000/ixdp2800.c b/arch/arm/mach-ixp2000/ixdp2800.c index 70d247f09a7e..14f09b80ab77 100644 --- a/arch/arm/mach-ixp2000/ixdp2800.c +++ b/arch/arm/mach-ixp2000/ixdp2800.c | |||
@@ -279,7 +279,7 @@ int __init ixdp2800_pci_init(void) | |||
279 | 279 | ||
280 | subsys_initcall(ixdp2800_pci_init); | 280 | subsys_initcall(ixdp2800_pci_init); |
281 | 281 | ||
282 | void ixdp2800_init_irq(void) | 282 | void __init ixdp2800_init_irq(void) |
283 | { | 283 | { |
284 | ixdp2x00_init_irq(IXDP2800_CPLD_INT_STAT, IXDP2800_CPLD_INT_MASK, IXDP2800_NR_IRQS); | 284 | ixdp2x00_init_irq(IXDP2800_CPLD_INT_STAT, IXDP2800_CPLD_INT_MASK, IXDP2800_NR_IRQS); |
285 | } | 285 | } |
diff --git a/arch/arm/mach-ixp2000/ixdp2x00.c b/arch/arm/mach-ixp2000/ixdp2x00.c index 011065b967b4..73c651e83d92 100644 --- a/arch/arm/mach-ixp2000/ixdp2x00.c +++ b/arch/arm/mach-ixp2000/ixdp2x00.c | |||
@@ -145,7 +145,7 @@ static struct irq_chip ixdp2x00_cpld_irq_chip = { | |||
145 | .unmask = ixdp2x00_irq_unmask | 145 | .unmask = ixdp2x00_irq_unmask |
146 | }; | 146 | }; |
147 | 147 | ||
148 | void ixdp2x00_init_irq(volatile unsigned long *stat_reg, volatile unsigned long *mask_reg, unsigned long nr_irqs) | 148 | void __init ixdp2x00_init_irq(volatile unsigned long *stat_reg, volatile unsigned long *mask_reg, unsigned long nr_irqs) |
149 | { | 149 | { |
150 | unsigned int irq; | 150 | unsigned int irq; |
151 | 151 | ||
diff --git a/arch/arm/mach-ixp23xx/ixdp2351.c b/arch/arm/mach-ixp23xx/ixdp2351.c index 7a86a2516eaa..c41a6b5a0acc 100644 --- a/arch/arm/mach-ixp23xx/ixdp2351.c +++ b/arch/arm/mach-ixp23xx/ixdp2351.c | |||
@@ -124,7 +124,7 @@ static struct irq_chip ixdp2351_intb_chip = { | |||
124 | .unmask = ixdp2351_intb_unmask | 124 | .unmask = ixdp2351_intb_unmask |
125 | }; | 125 | }; |
126 | 126 | ||
127 | void ixdp2351_init_irq(void) | 127 | void __init ixdp2351_init_irq(void) |
128 | { | 128 | { |
129 | int irq; | 129 | int irq; |
130 | 130 | ||
diff --git a/arch/arm/mach-ixp23xx/pci.c b/arch/arm/mach-ixp23xx/pci.c index ac7d43d23c28..227f808dc0ec 100644 --- a/arch/arm/mach-ixp23xx/pci.c +++ b/arch/arm/mach-ixp23xx/pci.c | |||
@@ -284,7 +284,7 @@ int ixp23xx_pci_setup(int nr, struct pci_sys_data *sys) | |||
284 | return 1; | 284 | return 1; |
285 | } | 285 | } |
286 | 286 | ||
287 | void ixp23xx_pci_slave_init(void) | 287 | void __init ixp23xx_pci_slave_init(void) |
288 | { | 288 | { |
289 | ixp23xx_pci_common_init(); | 289 | ixp23xx_pci_common_init(); |
290 | } | 290 | } |
diff --git a/arch/arm/mach-ixp23xx/roadrunner.c b/arch/arm/mach-ixp23xx/roadrunner.c index d06e21b70de5..e35644961aa4 100644 --- a/arch/arm/mach-ixp23xx/roadrunner.c +++ b/arch/arm/mach-ixp23xx/roadrunner.c | |||
@@ -110,7 +110,7 @@ static int __init roadrunner_map_irq(struct pci_dev *dev, u8 idsel, u8 pin) | |||
110 | return NO_IRQ; | 110 | return NO_IRQ; |
111 | } | 111 | } |
112 | 112 | ||
113 | static void roadrunner_pci_preinit(void) | 113 | static void __init roadrunner_pci_preinit(void) |
114 | { | 114 | { |
115 | set_irq_type(IRQ_ROADRUNNER_PCI_INTC, IRQT_LOW); | 115 | set_irq_type(IRQ_ROADRUNNER_PCI_INTC, IRQT_LOW); |
116 | set_irq_type(IRQ_ROADRUNNER_PCI_INTD, IRQT_LOW); | 116 | set_irq_type(IRQ_ROADRUNNER_PCI_INTD, IRQT_LOW); |
diff --git a/arch/arm/mach-ixp4xx/Kconfig b/arch/arm/mach-ixp4xx/Kconfig index 9715ef506c24..060909870b50 100644 --- a/arch/arm/mach-ixp4xx/Kconfig +++ b/arch/arm/mach-ixp4xx/Kconfig | |||
@@ -104,9 +104,6 @@ config MACH_DSMG600 | |||
104 | DSM-G600 RevA device. For more information on this platform, | 104 | DSM-G600 RevA device. For more information on this platform, |
105 | see http://www.nslu2-linux.org/wiki/DSMG600/HomePage | 105 | see http://www.nslu2-linux.org/wiki/DSMG600/HomePage |
106 | 106 | ||
107 | # | ||
108 | # Avila and IXDP share the same source for now. Will change in future | ||
109 | # | ||
110 | config ARCH_IXDP4XX | 107 | config ARCH_IXDP4XX |
111 | bool | 108 | bool |
112 | depends on ARCH_IXDP425 || MACH_IXDP465 || MACH_KIXRP435 | 109 | depends on ARCH_IXDP425 || MACH_IXDP465 || MACH_KIXRP435 |
diff --git a/arch/arm/mach-ixp4xx/common.c b/arch/arm/mach-ixp4xx/common.c index 64685da1462d..8112f726ffa0 100644 --- a/arch/arm/mach-ixp4xx/common.c +++ b/arch/arm/mach-ixp4xx/common.c | |||
@@ -283,7 +283,7 @@ static struct irqaction ixp4xx_timer_irq = { | |||
283 | .handler = ixp4xx_timer_interrupt, | 283 | .handler = ixp4xx_timer_interrupt, |
284 | }; | 284 | }; |
285 | 285 | ||
286 | static void __init ixp4xx_timer_init(void) | 286 | void __init ixp4xx_timer_init(void) |
287 | { | 287 | { |
288 | /* Reset/disable counter */ | 288 | /* Reset/disable counter */ |
289 | *IXP4XX_OSRT1 = 0; | 289 | *IXP4XX_OSRT1 = 0; |
diff --git a/arch/arm/mach-ixp4xx/coyote-pci.c b/arch/arm/mach-ixp4xx/coyote-pci.c index 7bc94f3def1c..ad2e5b97966e 100644 --- a/arch/arm/mach-ixp4xx/coyote-pci.c +++ b/arch/arm/mach-ixp4xx/coyote-pci.c | |||
@@ -25,10 +25,6 @@ | |||
25 | 25 | ||
26 | #include <asm/mach/pci.h> | 26 | #include <asm/mach/pci.h> |
27 | 27 | ||
28 | extern void ixp4xx_pci_preinit(void); | ||
29 | extern int ixp4xx_setup(int nr, struct pci_sys_data *sys); | ||
30 | extern struct pci_bus *ixp4xx_scan_bus(int nr, struct pci_sys_data *sys); | ||
31 | |||
32 | void __init coyote_pci_preinit(void) | 28 | void __init coyote_pci_preinit(void) |
33 | { | 29 | { |
34 | set_irq_type(IRQ_COYOTE_PCI_SLOT0, IRQT_LOW); | 30 | set_irq_type(IRQ_COYOTE_PCI_SLOT0, IRQT_LOW); |
diff --git a/arch/arm/mach-ixp4xx/dsmg600-setup.c b/arch/arm/mach-ixp4xx/dsmg600-setup.c index 1caff65e22cc..1e75e105c4f7 100644 --- a/arch/arm/mach-ixp4xx/dsmg600-setup.c +++ b/arch/arm/mach-ixp4xx/dsmg600-setup.c | |||
@@ -18,6 +18,7 @@ | |||
18 | #include <asm/mach-types.h> | 18 | #include <asm/mach-types.h> |
19 | #include <asm/mach/arch.h> | 19 | #include <asm/mach/arch.h> |
20 | #include <asm/mach/flash.h> | 20 | #include <asm/mach/flash.h> |
21 | #include <asm/mach/time.h> | ||
21 | 22 | ||
22 | static struct flash_platform_data dsmg600_flash_data = { | 23 | static struct flash_platform_data dsmg600_flash_data = { |
23 | .map_name = "cfi_probe", | 24 | .map_name = "cfi_probe", |
@@ -128,6 +129,19 @@ static void dsmg600_power_off(void) | |||
128 | gpio_line_set(DSMG600_PO_GPIO, IXP4XX_GPIO_HIGH); | 129 | gpio_line_set(DSMG600_PO_GPIO, IXP4XX_GPIO_HIGH); |
129 | } | 130 | } |
130 | 131 | ||
132 | static void __init dsmg600_timer_init(void) | ||
133 | { | ||
134 | /* The xtal on this machine is non-standard. */ | ||
135 | ixp4xx_timer_freq = DSMG600_FREQ; | ||
136 | |||
137 | /* Call standard timer_init function. */ | ||
138 | ixp4xx_timer_init(); | ||
139 | } | ||
140 | |||
141 | static struct sys_timer dsmg600_timer = { | ||
142 | .init = dsmg600_timer_init, | ||
143 | }; | ||
144 | |||
131 | static void __init dsmg600_init(void) | 145 | static void __init dsmg600_init(void) |
132 | { | 146 | { |
133 | ixp4xx_sys_init(); | 147 | ixp4xx_sys_init(); |
@@ -155,21 +169,13 @@ static void __init dsmg600_init(void) | |||
155 | #endif | 169 | #endif |
156 | } | 170 | } |
157 | 171 | ||
158 | static void __init dsmg600_fixup(struct machine_desc *desc, | ||
159 | struct tag *tags, char **cmdline, struct meminfo *mi) | ||
160 | { | ||
161 | /* The xtal on this machine is non-standard. */ | ||
162 | ixp4xx_timer_freq = DSMG600_FREQ; | ||
163 | } | ||
164 | |||
165 | MACHINE_START(DSMG600, "D-Link DSM-G600 RevA") | 172 | MACHINE_START(DSMG600, "D-Link DSM-G600 RevA") |
166 | /* Maintainer: www.nslu2-linux.org */ | 173 | /* Maintainer: www.nslu2-linux.org */ |
167 | .phys_io = IXP4XX_PERIPHERAL_BASE_PHYS, | 174 | .phys_io = IXP4XX_PERIPHERAL_BASE_PHYS, |
168 | .io_pg_offst = ((IXP4XX_PERIPHERAL_BASE_VIRT) >> 18) & 0xFFFC, | 175 | .io_pg_offst = ((IXP4XX_PERIPHERAL_BASE_VIRT) >> 18) & 0xFFFC, |
169 | .boot_params = 0x00000100, | 176 | .boot_params = 0x00000100, |
170 | .fixup = dsmg600_fixup, | ||
171 | .map_io = ixp4xx_map_io, | 177 | .map_io = ixp4xx_map_io, |
172 | .init_irq = ixp4xx_init_irq, | 178 | .init_irq = ixp4xx_init_irq, |
173 | .timer = &ixp4xx_timer, | 179 | .timer = &dsmg600_timer, |
174 | .init_machine = dsmg600_init, | 180 | .init_machine = dsmg600_init, |
175 | MACHINE_END | 181 | MACHINE_END |
diff --git a/arch/arm/mach-ixp4xx/ixdpg425-pci.c b/arch/arm/mach-ixp4xx/ixdpg425-pci.c index 509a95a692a4..d1e75b7dc3b1 100644 --- a/arch/arm/mach-ixp4xx/ixdpg425-pci.c +++ b/arch/arm/mach-ixp4xx/ixdpg425-pci.c | |||
@@ -23,10 +23,6 @@ | |||
23 | 23 | ||
24 | #include <asm/mach/pci.h> | 24 | #include <asm/mach/pci.h> |
25 | 25 | ||
26 | extern void ixp4xx_pci_preinit(void); | ||
27 | extern int ixp4xx_setup(int nr, struct pci_sys_data *sys); | ||
28 | extern struct pci_bus *ixp4xx_scan_bus(int nr, struct pci_sys_data *sys); | ||
29 | |||
30 | void __init ixdpg425_pci_preinit(void) | 26 | void __init ixdpg425_pci_preinit(void) |
31 | { | 27 | { |
32 | set_irq_type(IRQ_IXP4XX_GPIO6, IRQT_LOW); | 28 | set_irq_type(IRQ_IXP4XX_GPIO6, IRQT_LOW); |
diff --git a/arch/arm/mach-ixp4xx/nas100d-setup.c b/arch/arm/mach-ixp4xx/nas100d-setup.c index 9a31444d9214..78a17413ceca 100644 --- a/arch/arm/mach-ixp4xx/nas100d-setup.c +++ b/arch/arm/mach-ixp4xx/nas100d-setup.c | |||
@@ -155,7 +155,8 @@ static void __init nas100d_init(void) | |||
155 | 155 | ||
156 | pm_power_off = nas100d_power_off; | 156 | pm_power_off = nas100d_power_off; |
157 | 157 | ||
158 | /* This is only useful on a modified machine, but it is valuable | 158 | /* |
159 | * This is only useful on a modified machine, but it is valuable | ||
159 | * to have it first in order to see debug messages, and so that | 160 | * to have it first in order to see debug messages, and so that |
160 | * it does *not* get removed if platform_add_devices fails! | 161 | * it does *not* get removed if platform_add_devices fails! |
161 | */ | 162 | */ |
diff --git a/arch/arm/mach-ixp4xx/nslu2-setup.c b/arch/arm/mach-ixp4xx/nslu2-setup.c index 162c266e5f8f..9bf8ccbcaccf 100644 --- a/arch/arm/mach-ixp4xx/nslu2-setup.c +++ b/arch/arm/mach-ixp4xx/nslu2-setup.c | |||
@@ -22,6 +22,7 @@ | |||
22 | #include <asm/mach-types.h> | 22 | #include <asm/mach-types.h> |
23 | #include <asm/mach/arch.h> | 23 | #include <asm/mach/arch.h> |
24 | #include <asm/mach/flash.h> | 24 | #include <asm/mach/flash.h> |
25 | #include <asm/mach/time.h> | ||
25 | 26 | ||
26 | static struct flash_platform_data nslu2_flash_data = { | 27 | static struct flash_platform_data nslu2_flash_data = { |
27 | .map_name = "cfi_probe", | 28 | .map_name = "cfi_probe", |
@@ -49,26 +50,26 @@ static struct ixp4xx_i2c_pins nslu2_i2c_gpio_pins = { | |||
49 | static struct resource nslu2_led_resources[] = { | 50 | static struct resource nslu2_led_resources[] = { |
50 | { | 51 | { |
51 | .name = "ready", /* green led */ | 52 | .name = "ready", /* green led */ |
52 | .start = NSLU2_LED_GRN, | 53 | .start = NSLU2_LED_GRN_GPIO, |
53 | .end = NSLU2_LED_GRN, | 54 | .end = NSLU2_LED_GRN_GPIO, |
54 | .flags = IXP4XX_GPIO_HIGH, | 55 | .flags = IXP4XX_GPIO_HIGH, |
55 | }, | 56 | }, |
56 | { | 57 | { |
57 | .name = "status", /* red led */ | 58 | .name = "status", /* red led */ |
58 | .start = NSLU2_LED_RED, | 59 | .start = NSLU2_LED_RED_GPIO, |
59 | .end = NSLU2_LED_RED, | 60 | .end = NSLU2_LED_RED_GPIO, |
60 | .flags = IXP4XX_GPIO_HIGH, | 61 | .flags = IXP4XX_GPIO_HIGH, |
61 | }, | 62 | }, |
62 | { | 63 | { |
63 | .name = "disk-1", | 64 | .name = "disk-1", |
64 | .start = NSLU2_LED_DISK1, | 65 | .start = NSLU2_LED_DISK1_GPIO, |
65 | .end = NSLU2_LED_DISK1, | 66 | .end = NSLU2_LED_DISK1_GPIO, |
66 | .flags = IXP4XX_GPIO_LOW, | 67 | .flags = IXP4XX_GPIO_LOW, |
67 | }, | 68 | }, |
68 | { | 69 | { |
69 | .name = "disk-2", | 70 | .name = "disk-2", |
70 | .start = NSLU2_LED_DISK2, | 71 | .start = NSLU2_LED_DISK2_GPIO, |
71 | .end = NSLU2_LED_DISK2, | 72 | .end = NSLU2_LED_DISK2_GPIO, |
72 | .flags = IXP4XX_GPIO_LOW, | 73 | .flags = IXP4XX_GPIO_LOW, |
73 | }, | 74 | }, |
74 | }; | 75 | }; |
@@ -157,10 +158,21 @@ static void nslu2_power_off(void) | |||
157 | gpio_line_set(NSLU2_PO_GPIO, IXP4XX_GPIO_HIGH); | 158 | gpio_line_set(NSLU2_PO_GPIO, IXP4XX_GPIO_HIGH); |
158 | } | 159 | } |
159 | 160 | ||
160 | static void __init nslu2_init(void) | 161 | static void __init nslu2_timer_init(void) |
161 | { | 162 | { |
162 | ixp4xx_timer_freq = NSLU2_FREQ; | 163 | /* The xtal on this machine is non-standard. */ |
164 | ixp4xx_timer_freq = NSLU2_FREQ; | ||
165 | |||
166 | /* Call standard timer_init function. */ | ||
167 | ixp4xx_timer_init(); | ||
168 | } | ||
163 | 169 | ||
170 | static struct sys_timer nslu2_timer = { | ||
171 | .init = nslu2_timer_init, | ||
172 | }; | ||
173 | |||
174 | static void __init nslu2_init(void) | ||
175 | { | ||
164 | ixp4xx_sys_init(); | 176 | ixp4xx_sys_init(); |
165 | 177 | ||
166 | nslu2_flash_resource.start = IXP4XX_EXP_BUS_BASE(0); | 178 | nslu2_flash_resource.start = IXP4XX_EXP_BUS_BASE(0); |
@@ -169,7 +181,8 @@ static void __init nslu2_init(void) | |||
169 | 181 | ||
170 | pm_power_off = nslu2_power_off; | 182 | pm_power_off = nslu2_power_off; |
171 | 183 | ||
172 | /* This is only useful on a modified machine, but it is valuable | 184 | /* |
185 | * This is only useful on a modified machine, but it is valuable | ||
173 | * to have it first in order to see debug messages, and so that | 186 | * to have it first in order to see debug messages, and so that |
174 | * it does *not* get removed if platform_add_devices fails! | 187 | * it does *not* get removed if platform_add_devices fails! |
175 | */ | 188 | */ |
@@ -185,6 +198,6 @@ MACHINE_START(NSLU2, "Linksys NSLU2") | |||
185 | .boot_params = 0x00000100, | 198 | .boot_params = 0x00000100, |
186 | .map_io = ixp4xx_map_io, | 199 | .map_io = ixp4xx_map_io, |
187 | .init_irq = ixp4xx_init_irq, | 200 | .init_irq = ixp4xx_init_irq, |
188 | .timer = &ixp4xx_timer, | 201 | .timer = &nslu2_timer, |
189 | .init_machine = nslu2_init, | 202 | .init_machine = nslu2_init, |
190 | MACHINE_END | 203 | MACHINE_END |
diff --git a/arch/arm/mach-s3c2410/bast.h b/arch/arm/mach-s3c2410/bast.h deleted file mode 100644 index e98543742eb9..000000000000 --- a/arch/arm/mach-s3c2410/bast.h +++ /dev/null | |||
@@ -1,2 +0,0 @@ | |||
1 | /* linux/arch/arm/mach-s3c2410/bast.h | ||
2 | extern void bast_init_irq(void); | ||
diff --git a/arch/arm/mach-s3c2410/mach-amlm5900.c b/arch/arm/mach-s3c2410/mach-amlm5900.c index bc308ceb91c3..435adcce6482 100644 --- a/arch/arm/mach-s3c2410/mach-amlm5900.c +++ b/arch/arm/mach-s3c2410/mach-amlm5900.c | |||
@@ -160,7 +160,7 @@ static struct platform_device *amlm5900_devices[] __initdata = { | |||
160 | #endif | 160 | #endif |
161 | }; | 161 | }; |
162 | 162 | ||
163 | void __init amlm5900_map_io(void) | 163 | static void __init amlm5900_map_io(void) |
164 | { | 164 | { |
165 | s3c24xx_init_io(amlm5900_iodesc, ARRAY_SIZE(amlm5900_iodesc)); | 165 | s3c24xx_init_io(amlm5900_iodesc, ARRAY_SIZE(amlm5900_iodesc)); |
166 | s3c24xx_init_clocks(0); | 166 | s3c24xx_init_clocks(0); |
diff --git a/arch/arm/mach-s3c2412/s3c2412.c b/arch/arm/mach-s3c2412/s3c2412.c index c602aa39f9c4..782b5814ced2 100644 --- a/arch/arm/mach-s3c2412/s3c2412.c +++ b/arch/arm/mach-s3c2412/s3c2412.c | |||
@@ -16,6 +16,7 @@ | |||
16 | #include <linux/list.h> | 16 | #include <linux/list.h> |
17 | #include <linux/timer.h> | 17 | #include <linux/timer.h> |
18 | #include <linux/init.h> | 18 | #include <linux/init.h> |
19 | #include <linux/delay.h> | ||
19 | #include <linux/sysdev.h> | 20 | #include <linux/sysdev.h> |
20 | #include <linux/serial_core.h> | 21 | #include <linux/serial_core.h> |
21 | #include <linux/platform_device.h> | 22 | #include <linux/platform_device.h> |
@@ -29,6 +30,7 @@ | |||
29 | #include <asm/io.h> | 30 | #include <asm/io.h> |
30 | #include <asm/irq.h> | 31 | #include <asm/irq.h> |
31 | 32 | ||
33 | #include <asm/arch/reset.h> | ||
32 | #include <asm/arch/idle.h> | 34 | #include <asm/arch/idle.h> |
33 | 35 | ||
34 | #include <asm/arch/regs-clock.h> | 36 | #include <asm/arch/regs-clock.h> |
@@ -38,6 +40,7 @@ | |||
38 | #include <asm/arch/regs-gpioj.h> | 40 | #include <asm/arch/regs-gpioj.h> |
39 | #include <asm/arch/regs-dsc.h> | 41 | #include <asm/arch/regs-dsc.h> |
40 | #include <asm/arch/regs-spi.h> | 42 | #include <asm/arch/regs-spi.h> |
43 | #include <asm/arch/regs-s3c2412.h> | ||
41 | 44 | ||
42 | #include <asm/plat-s3c24xx/s3c2412.h> | 45 | #include <asm/plat-s3c24xx/s3c2412.h> |
43 | #include <asm/plat-s3c24xx/cpu.h> | 46 | #include <asm/plat-s3c24xx/cpu.h> |
@@ -106,6 +109,23 @@ static void s3c2412_idle(void) | |||
106 | cpu_do_idle(); | 109 | cpu_do_idle(); |
107 | } | 110 | } |
108 | 111 | ||
112 | static void s3c2412_hard_reset(void) | ||
113 | { | ||
114 | /* errata "Watch-dog/Software Reset Problem" specifies that | ||
115 | * this reset must be done with the SYSCLK sourced from | ||
116 | * EXTCLK instead of FOUT to avoid a glitch in the reset | ||
117 | * mechanism. | ||
118 | * | ||
119 | * See the watchdog section of the S3C2412 manual for more | ||
120 | * information on this fix. | ||
121 | */ | ||
122 | |||
123 | __raw_writel(0x00, S3C2412_CLKSRC); | ||
124 | __raw_writel(S3C2412_SWRST_RESET, S3C2412_SWRST); | ||
125 | |||
126 | mdelay(1); | ||
127 | } | ||
128 | |||
109 | /* s3c2412_map_io | 129 | /* s3c2412_map_io |
110 | * | 130 | * |
111 | * register the standard cpu IO areas, and any passed in from the | 131 | * register the standard cpu IO areas, and any passed in from the |
@@ -122,6 +142,10 @@ void __init s3c2412_map_io(struct map_desc *mach_desc, int mach_size) | |||
122 | 142 | ||
123 | s3c24xx_idle = s3c2412_idle; | 143 | s3c24xx_idle = s3c2412_idle; |
124 | 144 | ||
145 | /* set custom reset hook */ | ||
146 | |||
147 | s3c24xx_reset_hook = s3c2412_hard_reset; | ||
148 | |||
125 | /* register our io-tables */ | 149 | /* register our io-tables */ |
126 | 150 | ||
127 | iotable_init(s3c2412_iodesc, ARRAY_SIZE(s3c2412_iodesc)); | 151 | iotable_init(s3c2412_iodesc, ARRAY_SIZE(s3c2412_iodesc)); |
diff --git a/arch/arm/mach-s3c2443/clock.c b/arch/arm/mach-s3c2443/clock.c index 5955efb5de8d..58402948c47c 100644 --- a/arch/arm/mach-s3c2443/clock.c +++ b/arch/arm/mach-s3c2443/clock.c | |||
@@ -394,7 +394,7 @@ static int s3c2443_setrate_usbhost(struct clk *clk, unsigned long rate) | |||
394 | return 0; | 394 | return 0; |
395 | } | 395 | } |
396 | 396 | ||
397 | struct clk clk_usb_bus_host = { | 397 | static struct clk clk_usb_bus_host = { |
398 | .name = "usb-bus-host-parent", | 398 | .name = "usb-bus-host-parent", |
399 | .id = -1, | 399 | .id = -1, |
400 | .parent = &clk_esysclk, | 400 | .parent = &clk_esysclk, |
@@ -758,7 +758,6 @@ static struct clk init_clocks[] = { | |||
758 | .parent = &clk_h, | 758 | .parent = &clk_h, |
759 | .enable = s3c2443_clkcon_enable_h, | 759 | .enable = s3c2443_clkcon_enable_h, |
760 | .ctrlbit = S3C2443_HCLKCON_CFC, | 760 | .ctrlbit = S3C2443_HCLKCON_CFC, |
761 | .ctrlbit = S3C2443_HCLKCON_HSMMC, | ||
762 | }, { | 761 | }, { |
763 | .name = "ssmc", | 762 | .name = "ssmc", |
764 | .id = -1, | 763 | .id = -1, |
diff --git a/arch/arm/mach-sa1100/neponset.c b/arch/arm/mach-sa1100/neponset.c index d7c038a0256b..4cbf9468f654 100644 --- a/arch/arm/mach-sa1100/neponset.c +++ b/arch/arm/mach-sa1100/neponset.c | |||
@@ -139,12 +139,12 @@ static u_int neponset_get_mctrl(struct uart_port *port) | |||
139 | return ret; | 139 | return ret; |
140 | } | 140 | } |
141 | 141 | ||
142 | static struct sa1100_port_fns neponset_port_fns __initdata = { | 142 | static struct sa1100_port_fns neponset_port_fns __devinitdata = { |
143 | .set_mctrl = neponset_set_mctrl, | 143 | .set_mctrl = neponset_set_mctrl, |
144 | .get_mctrl = neponset_get_mctrl, | 144 | .get_mctrl = neponset_get_mctrl, |
145 | }; | 145 | }; |
146 | 146 | ||
147 | static int neponset_probe(struct platform_device *dev) | 147 | static int __devinit neponset_probe(struct platform_device *dev) |
148 | { | 148 | { |
149 | sa1100_register_uart_fns(&neponset_port_fns); | 149 | sa1100_register_uart_fns(&neponset_port_fns); |
150 | 150 | ||
diff --git a/arch/arm/mm/Kconfig b/arch/arm/mm/Kconfig index 5f472a8b406a..e7904bc92c73 100644 --- a/arch/arm/mm/Kconfig +++ b/arch/arm/mm/Kconfig | |||
@@ -379,7 +379,7 @@ config CPU_V7 | |||
379 | select CPU_CP15_MMU | 379 | select CPU_CP15_MMU |
380 | select CPU_HAS_ASID | 380 | select CPU_HAS_ASID |
381 | select CPU_COPY_V6 if MMU | 381 | select CPU_COPY_V6 if MMU |
382 | select CPU_TLB_V6 if MMU | 382 | select CPU_TLB_V7 if MMU |
383 | 383 | ||
384 | # Figure out what processor architecture version we should be using. | 384 | # Figure out what processor architecture version we should be using. |
385 | # This defines the compiler instruction set which depends on the machine type. | 385 | # This defines the compiler instruction set which depends on the machine type. |
@@ -498,6 +498,9 @@ config CPU_TLB_V4WBI | |||
498 | config CPU_TLB_V6 | 498 | config CPU_TLB_V6 |
499 | bool | 499 | bool |
500 | 500 | ||
501 | config CPU_TLB_V7 | ||
502 | bool | ||
503 | |||
501 | endif | 504 | endif |
502 | 505 | ||
503 | config CPU_HAS_ASID | 506 | config CPU_HAS_ASID |
diff --git a/arch/arm/mm/Makefile b/arch/arm/mm/Makefile index b5bd335ff14a..762702765fc3 100644 --- a/arch/arm/mm/Makefile +++ b/arch/arm/mm/Makefile | |||
@@ -46,6 +46,7 @@ obj-$(CONFIG_CPU_TLB_V4WT) += tlb-v4.o | |||
46 | obj-$(CONFIG_CPU_TLB_V4WB) += tlb-v4wb.o | 46 | obj-$(CONFIG_CPU_TLB_V4WB) += tlb-v4wb.o |
47 | obj-$(CONFIG_CPU_TLB_V4WBI) += tlb-v4wbi.o | 47 | obj-$(CONFIG_CPU_TLB_V4WBI) += tlb-v4wbi.o |
48 | obj-$(CONFIG_CPU_TLB_V6) += tlb-v6.o | 48 | obj-$(CONFIG_CPU_TLB_V6) += tlb-v6.o |
49 | obj-$(CONFIG_CPU_TLB_V7) += tlb-v7.o | ||
49 | 50 | ||
50 | obj-$(CONFIG_CPU_ARM610) += proc-arm6_7.o | 51 | obj-$(CONFIG_CPU_ARM610) += proc-arm6_7.o |
51 | obj-$(CONFIG_CPU_ARM710) += proc-arm6_7.o | 52 | obj-$(CONFIG_CPU_ARM710) += proc-arm6_7.o |
diff --git a/arch/arm/mm/alignment.c b/arch/arm/mm/alignment.c index 36440c899583..074b7cb07743 100644 --- a/arch/arm/mm/alignment.c +++ b/arch/arm/mm/alignment.c | |||
@@ -630,7 +630,7 @@ do_alignment(unsigned long addr, unsigned int fsr, struct pt_regs *regs) | |||
630 | 630 | ||
631 | fs = get_fs(); | 631 | fs = get_fs(); |
632 | set_fs(KERNEL_DS); | 632 | set_fs(KERNEL_DS); |
633 | if thumb_mode(regs) { | 633 | if (thumb_mode(regs)) { |
634 | fault = __get_user(tinstr, (u16 *)(instrptr & ~1)); | 634 | fault = __get_user(tinstr, (u16 *)(instrptr & ~1)); |
635 | if (!(fault)) | 635 | if (!(fault)) |
636 | instr = thumb2arm(tinstr); | 636 | instr = thumb2arm(tinstr); |
diff --git a/arch/arm/mm/proc-v7.S b/arch/arm/mm/proc-v7.S index dd823dd4a374..718f4782ee8b 100644 --- a/arch/arm/mm/proc-v7.S +++ b/arch/arm/mm/proc-v7.S | |||
@@ -256,7 +256,7 @@ __v7_proc_info: | |||
256 | .long HWCAP_SWP|HWCAP_HALF|HWCAP_THUMB|HWCAP_FAST_MULT|HWCAP_EDSP | 256 | .long HWCAP_SWP|HWCAP_HALF|HWCAP_THUMB|HWCAP_FAST_MULT|HWCAP_EDSP |
257 | .long cpu_v7_name | 257 | .long cpu_v7_name |
258 | .long v7_processor_functions | 258 | .long v7_processor_functions |
259 | .long v6wbi_tlb_fns | 259 | .long v7wbi_tlb_fns |
260 | .long v6_user_fns | 260 | .long v6_user_fns |
261 | .long v7_cache_fns | 261 | .long v7_cache_fns |
262 | .size __v7_proc_info, . - __v7_proc_info | 262 | .size __v7_proc_info, . - __v7_proc_info |
diff --git a/arch/arm/mm/tlb-v7.S b/arch/arm/mm/tlb-v7.S new file mode 100644 index 000000000000..b56dda8052f7 --- /dev/null +++ b/arch/arm/mm/tlb-v7.S | |||
@@ -0,0 +1,88 @@ | |||
1 | /* | ||
2 | * linux/arch/arm/mm/tlb-v7.S | ||
3 | * | ||
4 | * Copyright (C) 1997-2002 Russell King | ||
5 | * Modified for ARMv7 by Catalin Marinas | ||
6 | * | ||
7 | * This program is free software; you can redistribute it and/or modify | ||
8 | * it under the terms of the GNU General Public License version 2 as | ||
9 | * published by the Free Software Foundation. | ||
10 | * | ||
11 | * ARM architecture version 6 TLB handling functions. | ||
12 | * These assume a split I/D TLB. | ||
13 | */ | ||
14 | #include <linux/linkage.h> | ||
15 | #include <asm/asm-offsets.h> | ||
16 | #include <asm/page.h> | ||
17 | #include <asm/tlbflush.h> | ||
18 | #include "proc-macros.S" | ||
19 | |||
20 | /* | ||
21 | * v7wbi_flush_user_tlb_range(start, end, vma) | ||
22 | * | ||
23 | * Invalidate a range of TLB entries in the specified address space. | ||
24 | * | ||
25 | * - start - start address (may not be aligned) | ||
26 | * - end - end address (exclusive, may not be aligned) | ||
27 | * - vma - vma_struct describing address range | ||
28 | * | ||
29 | * It is assumed that: | ||
30 | * - the "Invalidate single entry" instruction will invalidate | ||
31 | * both the I and the D TLBs on Harvard-style TLBs | ||
32 | */ | ||
33 | ENTRY(v7wbi_flush_user_tlb_range) | ||
34 | vma_vm_mm r3, r2 @ get vma->vm_mm | ||
35 | mmid r3, r3 @ get vm_mm->context.id | ||
36 | dsb | ||
37 | mov r0, r0, lsr #PAGE_SHIFT @ align address | ||
38 | mov r1, r1, lsr #PAGE_SHIFT | ||
39 | asid r3, r3 @ mask ASID | ||
40 | orr r0, r3, r0, lsl #PAGE_SHIFT @ Create initial MVA | ||
41 | mov r1, r1, lsl #PAGE_SHIFT | ||
42 | vma_vm_flags r2, r2 @ get vma->vm_flags | ||
43 | 1: | ||
44 | mcr p15, 0, r0, c8, c6, 1 @ TLB invalidate D MVA (was 1) | ||
45 | tst r2, #VM_EXEC @ Executable area ? | ||
46 | mcrne p15, 0, r0, c8, c5, 1 @ TLB invalidate I MVA (was 1) | ||
47 | add r0, r0, #PAGE_SZ | ||
48 | cmp r0, r1 | ||
49 | blo 1b | ||
50 | mov ip, #0 | ||
51 | mcr p15, 0, ip, c7, c5, 6 @ flush BTAC/BTB | ||
52 | dsb | ||
53 | mov pc, lr | ||
54 | |||
55 | /* | ||
56 | * v7wbi_flush_kern_tlb_range(start,end) | ||
57 | * | ||
58 | * Invalidate a range of kernel TLB entries | ||
59 | * | ||
60 | * - start - start address (may not be aligned) | ||
61 | * - end - end address (exclusive, may not be aligned) | ||
62 | */ | ||
63 | ENTRY(v7wbi_flush_kern_tlb_range) | ||
64 | dsb | ||
65 | mov r0, r0, lsr #PAGE_SHIFT @ align address | ||
66 | mov r1, r1, lsr #PAGE_SHIFT | ||
67 | mov r0, r0, lsl #PAGE_SHIFT | ||
68 | mov r1, r1, lsl #PAGE_SHIFT | ||
69 | 1: | ||
70 | mcr p15, 0, r0, c8, c6, 1 @ TLB invalidate D MVA | ||
71 | mcr p15, 0, r0, c8, c5, 1 @ TLB invalidate I MVA | ||
72 | add r0, r0, #PAGE_SZ | ||
73 | cmp r0, r1 | ||
74 | blo 1b | ||
75 | mov r2, #0 | ||
76 | mcr p15, 0, r2, c7, c5, 6 @ flush BTAC/BTB | ||
77 | dsb | ||
78 | isb | ||
79 | mov pc, lr | ||
80 | |||
81 | .section ".text.init", #alloc, #execinstr | ||
82 | |||
83 | .type v7wbi_tlb_fns, #object | ||
84 | ENTRY(v7wbi_tlb_fns) | ||
85 | .long v7wbi_flush_user_tlb_range | ||
86 | .long v7wbi_flush_kern_tlb_range | ||
87 | .long v6wbi_tlb_flags | ||
88 | .size v7wbi_tlb_fns, . - v7wbi_tlb_fns | ||
diff --git a/arch/arm/nwfpe/softfloat.h b/arch/arm/nwfpe/softfloat.h index 0a3067452cd2..260fe29d73f5 100644 --- a/arch/arm/nwfpe/softfloat.h +++ b/arch/arm/nwfpe/softfloat.h | |||
@@ -273,4 +273,7 @@ static inline flag float64_lt_nocheck(float64 a, float64 b) | |||
273 | extern flag float32_is_nan( float32 a ); | 273 | extern flag float32_is_nan( float32 a ); |
274 | extern flag float64_is_nan( float64 a ); | 274 | extern flag float64_is_nan( float64 a ); |
275 | 275 | ||
276 | extern int32 float64_to_uint32( struct roundingData *roundData, float64 a ); | ||
277 | extern int32 float64_to_uint32_round_to_zero( float64 a ); | ||
278 | |||
276 | #endif | 279 | #endif |
diff --git a/arch/arm/oprofile/op_model_mpcore.c b/arch/arm/oprofile/op_model_mpcore.c index 898500718249..7791da791f5f 100644 --- a/arch/arm/oprofile/op_model_mpcore.c +++ b/arch/arm/oprofile/op_model_mpcore.c | |||
@@ -257,8 +257,13 @@ static void em_stop(void) | |||
257 | */ | 257 | */ |
258 | static void em_route_irq(int irq, unsigned int cpu) | 258 | static void em_route_irq(int irq, unsigned int cpu) |
259 | { | 259 | { |
260 | irq_desc[irq].affinity = cpumask_of_cpu(cpu); | 260 | struct irq_desc *desc = irq_desc + irq; |
261 | irq_desc[irq].chip->set_affinity(irq, cpumask_of_cpu(cpu)); | 261 | cpumask_t mask = cpumask_of_cpu(cpu); |
262 | |||
263 | spin_lock_irq(&desc->lock); | ||
264 | desc->affinity = mask; | ||
265 | desc->chip->set_affinity(irq, mask); | ||
266 | spin_unlock_irq(&desc->lock); | ||
262 | } | 267 | } |
263 | 268 | ||
264 | static int em_setup(void) | 269 | static int em_setup(void) |
diff --git a/arch/h8300/kernel/sys_h8300.c b/arch/h8300/kernel/sys_h8300.c index 11ba75a05220..de7688cfd573 100644 --- a/arch/h8300/kernel/sys_h8300.c +++ b/arch/h8300/kernel/sys_h8300.c | |||
@@ -288,9 +288,9 @@ asmlinkage void syscall_print(void *dummy,...) | |||
288 | int kernel_execve(const char *filename, char *const argv[], char *const envp[]) | 288 | int kernel_execve(const char *filename, char *const argv[], char *const envp[]) |
289 | { | 289 | { |
290 | register long res __asm__("er0"); | 290 | register long res __asm__("er0"); |
291 | register char *const *_c __asm__("er3") = envp; | ||
292 | register char *const *_b __asm__("er2") = argv; | ||
291 | register const char * _a __asm__("er1") = filename; | 293 | register const char * _a __asm__("er1") = filename; |
292 | register void *_b __asm__("er2") = argv; | ||
293 | register void *_c __asm__("er3") = envp; | ||
294 | __asm__ __volatile__ ("mov.l %1,er0\n\t" | 294 | __asm__ __volatile__ ("mov.l %1,er0\n\t" |
295 | "trapa #0\n\t" | 295 | "trapa #0\n\t" |
296 | : "=r" (res) | 296 | : "=r" (res) |
diff --git a/arch/h8300/kernel/traps.c b/arch/h8300/kernel/traps.c index 300e3279ca5a..f97183011c2c 100644 --- a/arch/h8300/kernel/traps.c +++ b/arch/h8300/kernel/traps.c | |||
@@ -136,7 +136,7 @@ void show_stack(struct task_struct *task, unsigned long *esp) | |||
136 | printk("\nCall Trace:"); | 136 | printk("\nCall Trace:"); |
137 | i = 0; | 137 | i = 0; |
138 | stack = esp; | 138 | stack = esp; |
139 | while (((unsigned long)stack & (THREAD_SIZE - 1)) == 0) { | 139 | while (((unsigned long)stack & (THREAD_SIZE - 1)) != 0) { |
140 | addr = *stack++; | 140 | addr = *stack++; |
141 | /* | 141 | /* |
142 | * If the address is either in the text segment of the | 142 | * If the address is either in the text segment of the |
diff --git a/arch/i386/kernel/cpu/mtrr/main.c b/arch/i386/kernel/cpu/mtrr/main.c index 1cf466df330a..7202b98aac4f 100644 --- a/arch/i386/kernel/cpu/mtrr/main.c +++ b/arch/i386/kernel/cpu/mtrr/main.c | |||
@@ -734,10 +734,13 @@ void mtrr_ap_init(void) | |||
734 | */ | 734 | */ |
735 | void mtrr_save_state(void) | 735 | void mtrr_save_state(void) |
736 | { | 736 | { |
737 | if (smp_processor_id() == 0) | 737 | int cpu = get_cpu(); |
738 | |||
739 | if (cpu == 0) | ||
738 | mtrr_save_fixed_ranges(NULL); | 740 | mtrr_save_fixed_ranges(NULL); |
739 | else | 741 | else |
740 | smp_call_function_single(0, mtrr_save_fixed_ranges, NULL, 1, 1); | 742 | smp_call_function_single(0, mtrr_save_fixed_ranges, NULL, 1, 1); |
743 | put_cpu(); | ||
741 | } | 744 | } |
742 | 745 | ||
743 | static int __init mtrr_init_finialize(void) | 746 | static int __init mtrr_init_finialize(void) |
diff --git a/arch/i386/kernel/microcode.c b/arch/i386/kernel/microcode.c index 83f825f2e2d7..d865d041bea1 100644 --- a/arch/i386/kernel/microcode.c +++ b/arch/i386/kernel/microcode.c | |||
@@ -478,7 +478,7 @@ static int __init microcode_dev_init (void) | |||
478 | return 0; | 478 | return 0; |
479 | } | 479 | } |
480 | 480 | ||
481 | static void __exit microcode_dev_exit (void) | 481 | static void microcode_dev_exit (void) |
482 | { | 482 | { |
483 | misc_deregister(µcode_dev); | 483 | misc_deregister(µcode_dev); |
484 | } | 484 | } |
diff --git a/arch/i386/kernel/reboot.c b/arch/i386/kernel/reboot.c index 50dfc65319cd..5513f8d5b5be 100644 --- a/arch/i386/kernel/reboot.c +++ b/arch/i386/kernel/reboot.c | |||
@@ -89,6 +89,14 @@ static int __init set_bios_reboot(struct dmi_system_id *d) | |||
89 | } | 89 | } |
90 | 90 | ||
91 | static struct dmi_system_id __initdata reboot_dmi_table[] = { | 91 | static struct dmi_system_id __initdata reboot_dmi_table[] = { |
92 | { /* Handle problems with rebooting on Dell E520's */ | ||
93 | .callback = set_bios_reboot, | ||
94 | .ident = "Dell E520", | ||
95 | .matches = { | ||
96 | DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), | ||
97 | DMI_MATCH(DMI_PRODUCT_NAME, "Dell DM061"), | ||
98 | }, | ||
99 | }, | ||
92 | { /* Handle problems with rebooting on Dell 1300's */ | 100 | { /* Handle problems with rebooting on Dell 1300's */ |
93 | .callback = set_bios_reboot, | 101 | .callback = set_bios_reboot, |
94 | .ident = "Dell PowerEdge 1300", | 102 | .ident = "Dell PowerEdge 1300", |
diff --git a/arch/i386/kernel/smpboot.c b/arch/i386/kernel/smpboot.c index 08f07a74a9d3..88baed1e7e83 100644 --- a/arch/i386/kernel/smpboot.c +++ b/arch/i386/kernel/smpboot.c | |||
@@ -943,10 +943,9 @@ exit: | |||
943 | 943 | ||
944 | static void smp_tune_scheduling(void) | 944 | static void smp_tune_scheduling(void) |
945 | { | 945 | { |
946 | unsigned long cachesize; /* kB */ | ||
947 | |||
948 | if (cpu_khz) { | 946 | if (cpu_khz) { |
949 | cachesize = boot_cpu_data.x86_cache_size; | 947 | /* cache size in kB */ |
948 | long cachesize = boot_cpu_data.x86_cache_size; | ||
950 | 949 | ||
951 | if (cachesize > 0) | 950 | if (cachesize > 0) |
952 | max_cache_size = cachesize * 1024; | 951 | max_cache_size = cachesize * 1024; |
diff --git a/arch/i386/kernel/vmi.c b/arch/i386/kernel/vmi.c index c8726c424b35..c12720d7cbc5 100644 --- a/arch/i386/kernel/vmi.c +++ b/arch/i386/kernel/vmi.c | |||
@@ -27,6 +27,7 @@ | |||
27 | #include <linux/bootmem.h> | 27 | #include <linux/bootmem.h> |
28 | #include <linux/mm.h> | 28 | #include <linux/mm.h> |
29 | #include <linux/highmem.h> | 29 | #include <linux/highmem.h> |
30 | #include <linux/sched.h> | ||
30 | #include <asm/vmi.h> | 31 | #include <asm/vmi.h> |
31 | #include <asm/io.h> | 32 | #include <asm/io.h> |
32 | #include <asm/fixmap.h> | 33 | #include <asm/fixmap.h> |
diff --git a/arch/i386/oprofile/nmi_int.c b/arch/i386/oprofile/nmi_int.c index a7c0783b269a..11b7a51566a8 100644 --- a/arch/i386/oprofile/nmi_int.c +++ b/arch/i386/oprofile/nmi_int.c | |||
@@ -154,7 +154,7 @@ static int allocate_msrs(void) | |||
154 | size_t counters_size = sizeof(struct op_msr) * model->num_counters; | 154 | size_t counters_size = sizeof(struct op_msr) * model->num_counters; |
155 | 155 | ||
156 | int i; | 156 | int i; |
157 | for_each_online_cpu(i) { | 157 | for_each_possible_cpu(i) { |
158 | cpu_msrs[i].counters = kmalloc(counters_size, GFP_KERNEL); | 158 | cpu_msrs[i].counters = kmalloc(counters_size, GFP_KERNEL); |
159 | if (!cpu_msrs[i].counters) { | 159 | if (!cpu_msrs[i].counters) { |
160 | success = 0; | 160 | success = 0; |
@@ -211,8 +211,14 @@ static int nmi_setup(void) | |||
211 | /* Assume saved/restored counters are the same on all CPUs */ | 211 | /* Assume saved/restored counters are the same on all CPUs */ |
212 | model->fill_in_addresses(&cpu_msrs[0]); | 212 | model->fill_in_addresses(&cpu_msrs[0]); |
213 | for_each_possible_cpu (cpu) { | 213 | for_each_possible_cpu (cpu) { |
214 | if (cpu != 0) | 214 | if (cpu != 0) { |
215 | cpu_msrs[cpu] = cpu_msrs[0]; | 215 | memcpy(cpu_msrs[cpu].counters, cpu_msrs[0].counters, |
216 | sizeof(struct op_msr) * model->num_counters); | ||
217 | |||
218 | memcpy(cpu_msrs[cpu].controls, cpu_msrs[0].controls, | ||
219 | sizeof(struct op_msr) * model->num_controls); | ||
220 | } | ||
221 | |||
216 | } | 222 | } |
217 | on_each_cpu(nmi_save_registers, NULL, 0, 1); | 223 | on_each_cpu(nmi_save_registers, NULL, 0, 1); |
218 | on_each_cpu(nmi_cpu_setup, NULL, 0, 1); | 224 | on_each_cpu(nmi_cpu_setup, NULL, 0, 1); |
diff --git a/arch/i386/pci/fixup.c b/arch/i386/pci/fixup.c index b62eafb997bc..b95b42950ed4 100644 --- a/arch/i386/pci/fixup.c +++ b/arch/i386/pci/fixup.c | |||
@@ -436,3 +436,14 @@ DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_CYRIX, PCI_DEVICE_ID_CYRIX_5530_LEGACY, | |||
436 | pci_early_fixup_cyrix_5530); | 436 | pci_early_fixup_cyrix_5530); |
437 | DECLARE_PCI_FIXUP_RESUME(PCI_VENDOR_ID_CYRIX, PCI_DEVICE_ID_CYRIX_5530_LEGACY, | 437 | DECLARE_PCI_FIXUP_RESUME(PCI_VENDOR_ID_CYRIX, PCI_DEVICE_ID_CYRIX_5530_LEGACY, |
438 | pci_early_fixup_cyrix_5530); | 438 | pci_early_fixup_cyrix_5530); |
439 | |||
440 | /* | ||
441 | * Siemens Nixdorf AG FSC Multiprocessor Interrupt Controller: | ||
442 | * prevent update of the BAR0, which doesn't look like a normal BAR. | ||
443 | */ | ||
444 | static void __devinit pci_siemens_interrupt_controller(struct pci_dev *dev) | ||
445 | { | ||
446 | dev->resource[0].flags |= IORESOURCE_PCI_FIXED; | ||
447 | } | ||
448 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_SIEMENS, 0x0015, | ||
449 | pci_siemens_interrupt_controller); | ||
diff --git a/arch/m68k/Kconfig b/arch/m68k/Kconfig index b8536c7c0877..85cdd23b0447 100644 --- a/arch/m68k/Kconfig +++ b/arch/m68k/Kconfig | |||
@@ -355,8 +355,9 @@ config RMW_INSNS | |||
355 | adventurous. | 355 | adventurous. |
356 | 356 | ||
357 | config SINGLE_MEMORY_CHUNK | 357 | config SINGLE_MEMORY_CHUNK |
358 | bool "Use one physical chunk of memory only" | 358 | bool "Use one physical chunk of memory only" if ADVANCED && !SUN3 |
359 | depends on ADVANCED && !SUN3 | 359 | default y if SUN3 |
360 | select NEED_MULTIPLE_NODES | ||
360 | help | 361 | help |
361 | Ignore all but the first contiguous chunk of physical memory for VM | 362 | Ignore all but the first contiguous chunk of physical memory for VM |
362 | purposes. This will save a few bytes kernel size and may speed up | 363 | purposes. This will save a few bytes kernel size and may speed up |
@@ -377,6 +378,14 @@ config 060_WRITETHROUGH | |||
377 | is hardwired on. The 53c710 SCSI driver is known to suffer from | 378 | is hardwired on. The 53c710 SCSI driver is known to suffer from |
378 | this problem. | 379 | this problem. |
379 | 380 | ||
381 | config ARCH_DISCONTIGMEM_ENABLE | ||
382 | def_bool !SINGLE_MEMORY_CHUNK | ||
383 | |||
384 | config NODES_SHIFT | ||
385 | int | ||
386 | default "3" | ||
387 | depends on !SINGLE_MEMORY_CHUNK | ||
388 | |||
380 | source "mm/Kconfig" | 389 | source "mm/Kconfig" |
381 | 390 | ||
382 | endmenu | 391 | endmenu |
diff --git a/arch/m68k/Makefile b/arch/m68k/Makefile index c20831a7e1a9..aa383a5ea7ac 100644 --- a/arch/m68k/Makefile +++ b/arch/m68k/Makefile | |||
@@ -19,6 +19,7 @@ COMPILE_ARCH = $(shell uname -m) | |||
19 | # override top level makefile | 19 | # override top level makefile |
20 | AS += -m68020 | 20 | AS += -m68020 |
21 | LDFLAGS := -m m68kelf | 21 | LDFLAGS := -m m68kelf |
22 | LDFLAGS_MODULE += -T $(srctree)/arch/m68k/kernel/module.lds | ||
22 | ifneq ($(COMPILE_ARCH),$(ARCH)) | 23 | ifneq ($(COMPILE_ARCH),$(ARCH)) |
23 | # prefix for cross-compiling binaries | 24 | # prefix for cross-compiling binaries |
24 | CROSS_COMPILE = m68k-linux-gnu- | 25 | CROSS_COMPILE = m68k-linux-gnu- |
diff --git a/arch/m68k/kernel/Makefile b/arch/m68k/kernel/Makefile index 0b68ab8d63d1..a806208c7fb5 100644 --- a/arch/m68k/kernel/Makefile +++ b/arch/m68k/kernel/Makefile | |||
@@ -9,13 +9,12 @@ else | |||
9 | endif | 9 | endif |
10 | extra-y += vmlinux.lds | 10 | extra-y += vmlinux.lds |
11 | 11 | ||
12 | obj-y := entry.o process.o traps.o ints.o signal.o ptrace.o \ | 12 | obj-y := entry.o process.o traps.o ints.o signal.o ptrace.o module.o \ |
13 | sys_m68k.o time.o semaphore.o setup.o m68k_ksyms.o devres.o | 13 | sys_m68k.o time.o semaphore.o setup.o m68k_ksyms.o devres.o |
14 | 14 | ||
15 | devres-y = ../../../kernel/irq/devres.o | 15 | devres-y = ../../../kernel/irq/devres.o |
16 | 16 | ||
17 | obj-$(CONFIG_PCI) += bios32.o | 17 | obj-$(CONFIG_PCI) += bios32.o |
18 | obj-$(CONFIG_MODULES) += module.o | ||
19 | obj-y$(CONFIG_MMU_SUN3) += dma.o # no, it's not a typo | 18 | obj-y$(CONFIG_MMU_SUN3) += dma.o # no, it's not a typo |
20 | 19 | ||
21 | EXTRA_AFLAGS := -traditional | 20 | EXTRA_AFLAGS := -traditional |
diff --git a/arch/m68k/kernel/module.c b/arch/m68k/kernel/module.c index 3b1a2ff61ddc..774862bc6977 100644 --- a/arch/m68k/kernel/module.c +++ b/arch/m68k/kernel/module.c | |||
@@ -1,3 +1,9 @@ | |||
1 | /* | ||
2 | * This file is subject to the terms and conditions of the GNU General Public | ||
3 | * License. See the file COPYING in the main directory of this archive | ||
4 | * for more details. | ||
5 | */ | ||
6 | |||
1 | #include <linux/moduleloader.h> | 7 | #include <linux/moduleloader.h> |
2 | #include <linux/elf.h> | 8 | #include <linux/elf.h> |
3 | #include <linux/vmalloc.h> | 9 | #include <linux/vmalloc.h> |
@@ -11,6 +17,8 @@ | |||
11 | #define DEBUGP(fmt...) | 17 | #define DEBUGP(fmt...) |
12 | #endif | 18 | #endif |
13 | 19 | ||
20 | #ifdef CONFIG_MODULES | ||
21 | |||
14 | void *module_alloc(unsigned long size) | 22 | void *module_alloc(unsigned long size) |
15 | { | 23 | { |
16 | if (size == 0) | 24 | if (size == 0) |
@@ -118,11 +126,32 @@ int apply_relocate_add(Elf32_Shdr *sechdrs, | |||
118 | 126 | ||
119 | int module_finalize(const Elf_Ehdr *hdr, | 127 | int module_finalize(const Elf_Ehdr *hdr, |
120 | const Elf_Shdr *sechdrs, | 128 | const Elf_Shdr *sechdrs, |
121 | struct module *me) | 129 | struct module *mod) |
122 | { | 130 | { |
131 | module_fixup(mod, mod->arch.fixup_start, mod->arch.fixup_end); | ||
132 | |||
123 | return 0; | 133 | return 0; |
124 | } | 134 | } |
125 | 135 | ||
126 | void module_arch_cleanup(struct module *mod) | 136 | void module_arch_cleanup(struct module *mod) |
127 | { | 137 | { |
128 | } | 138 | } |
139 | |||
140 | #endif /* CONFIG_MODULES */ | ||
141 | |||
142 | void module_fixup(struct module *mod, struct m68k_fixup_info *start, | ||
143 | struct m68k_fixup_info *end) | ||
144 | { | ||
145 | struct m68k_fixup_info *fixup; | ||
146 | |||
147 | for (fixup = start; fixup < end; fixup++) { | ||
148 | switch (fixup->type) { | ||
149 | case m68k_fixup_memoffset: | ||
150 | *(u32 *)fixup->addr = m68k_memoffset; | ||
151 | break; | ||
152 | case m68k_fixup_vnode_shift: | ||
153 | *(u16 *)fixup->addr += m68k_virt_to_node_shift; | ||
154 | break; | ||
155 | } | ||
156 | } | ||
157 | } | ||
diff --git a/arch/m68k/kernel/module.lds b/arch/m68k/kernel/module.lds new file mode 100644 index 000000000000..fda94fa38243 --- /dev/null +++ b/arch/m68k/kernel/module.lds | |||
@@ -0,0 +1,7 @@ | |||
1 | SECTIONS { | ||
2 | .m68k_fixup : { | ||
3 | __start_fixup = .; | ||
4 | *(.m68k_fixup) | ||
5 | __stop_fixup = .; | ||
6 | } | ||
7 | } | ||
diff --git a/arch/m68k/kernel/setup.c b/arch/m68k/kernel/setup.c index 610319356691..215c7bd43924 100644 --- a/arch/m68k/kernel/setup.c +++ b/arch/m68k/kernel/setup.c | |||
@@ -60,14 +60,12 @@ extern unsigned long availmem; | |||
60 | int m68k_num_memory; | 60 | int m68k_num_memory; |
61 | int m68k_realnum_memory; | 61 | int m68k_realnum_memory; |
62 | EXPORT_SYMBOL(m68k_realnum_memory); | 62 | EXPORT_SYMBOL(m68k_realnum_memory); |
63 | #ifdef CONFIG_SINGLE_MEMORY_CHUNK | ||
64 | unsigned long m68k_memoffset; | 63 | unsigned long m68k_memoffset; |
65 | EXPORT_SYMBOL(m68k_memoffset); | 64 | EXPORT_SYMBOL(m68k_memoffset); |
66 | #endif | ||
67 | struct mem_info m68k_memory[NUM_MEMINFO]; | 65 | struct mem_info m68k_memory[NUM_MEMINFO]; |
68 | EXPORT_SYMBOL(m68k_memory); | 66 | EXPORT_SYMBOL(m68k_memory); |
69 | 67 | ||
70 | static struct mem_info m68k_ramdisk; | 68 | struct mem_info m68k_ramdisk; |
71 | 69 | ||
72 | static char m68k_command_line[CL_SIZE]; | 70 | static char m68k_command_line[CL_SIZE]; |
73 | 71 | ||
@@ -208,9 +206,6 @@ static void __init m68k_parse_bootinfo(const struct bi_record *record) | |||
208 | void __init setup_arch(char **cmdline_p) | 206 | void __init setup_arch(char **cmdline_p) |
209 | { | 207 | { |
210 | extern int _etext, _edata, _end; | 208 | extern int _etext, _edata, _end; |
211 | #ifndef CONFIG_SUN3 | ||
212 | unsigned long endmem, startmem; | ||
213 | #endif | ||
214 | int i; | 209 | int i; |
215 | 210 | ||
216 | /* The bootinfo is located right after the kernel bss */ | 211 | /* The bootinfo is located right after the kernel bss */ |
@@ -320,30 +315,16 @@ void __init setup_arch(char **cmdline_p) | |||
320 | panic("No configuration setup"); | 315 | panic("No configuration setup"); |
321 | } | 316 | } |
322 | 317 | ||
323 | #ifndef CONFIG_SUN3 | 318 | paging_init(); |
324 | startmem= m68k_memory[0].addr; | ||
325 | endmem = startmem + m68k_memory[0].size; | ||
326 | high_memory = (void *)PAGE_OFFSET; | ||
327 | for (i = 0; i < m68k_num_memory; i++) { | ||
328 | m68k_memory[i].size &= MASK_256K; | ||
329 | if (m68k_memory[i].addr < startmem) | ||
330 | startmem = m68k_memory[i].addr; | ||
331 | if (m68k_memory[i].addr+m68k_memory[i].size > endmem) | ||
332 | endmem = m68k_memory[i].addr+m68k_memory[i].size; | ||
333 | high_memory += m68k_memory[i].size; | ||
334 | } | ||
335 | |||
336 | availmem += init_bootmem_node(NODE_DATA(0), availmem >> PAGE_SHIFT, | ||
337 | startmem >> PAGE_SHIFT, endmem >> PAGE_SHIFT); | ||
338 | |||
339 | for (i = 0; i < m68k_num_memory; i++) | ||
340 | free_bootmem(m68k_memory[i].addr, m68k_memory[i].size); | ||
341 | |||
342 | reserve_bootmem(m68k_memory[0].addr, availmem - m68k_memory[0].addr); | ||
343 | 319 | ||
320 | #ifndef CONFIG_SUN3 | ||
321 | for (i = 1; i < m68k_num_memory; i++) | ||
322 | free_bootmem_node(NODE_DATA(i), m68k_memory[i].addr, | ||
323 | m68k_memory[i].size); | ||
344 | #ifdef CONFIG_BLK_DEV_INITRD | 324 | #ifdef CONFIG_BLK_DEV_INITRD |
345 | if (m68k_ramdisk.size) { | 325 | if (m68k_ramdisk.size) { |
346 | reserve_bootmem(m68k_ramdisk.addr, m68k_ramdisk.size); | 326 | reserve_bootmem_node(__virt_to_node(phys_to_virt(m68k_ramdisk.addr)), |
327 | m68k_ramdisk.addr, m68k_ramdisk.size); | ||
347 | initrd_start = (unsigned long)phys_to_virt(m68k_ramdisk.addr); | 328 | initrd_start = (unsigned long)phys_to_virt(m68k_ramdisk.addr); |
348 | initrd_end = initrd_start + m68k_ramdisk.size; | 329 | initrd_end = initrd_start + m68k_ramdisk.size; |
349 | printk("initrd: %08lx - %08lx\n", initrd_start, initrd_end); | 330 | printk("initrd: %08lx - %08lx\n", initrd_start, initrd_end); |
@@ -362,8 +343,6 @@ void __init setup_arch(char **cmdline_p) | |||
362 | 343 | ||
363 | #endif /* !CONFIG_SUN3 */ | 344 | #endif /* !CONFIG_SUN3 */ |
364 | 345 | ||
365 | paging_init(); | ||
366 | |||
367 | /* set ISA defs early as possible */ | 346 | /* set ISA defs early as possible */ |
368 | #if defined(CONFIG_ISA) && defined(MULTI_ISA) | 347 | #if defined(CONFIG_ISA) && defined(MULTI_ISA) |
369 | #if defined(CONFIG_Q40) | 348 | #if defined(CONFIG_Q40) |
diff --git a/arch/m68k/kernel/vmlinux-std.lds b/arch/m68k/kernel/vmlinux-std.lds index 78f139226a1b..40f02b128f22 100644 --- a/arch/m68k/kernel/vmlinux-std.lds +++ b/arch/m68k/kernel/vmlinux-std.lds | |||
@@ -60,6 +60,11 @@ SECTIONS | |||
60 | __con_initcall_start = .; | 60 | __con_initcall_start = .; |
61 | .con_initcall.init : { *(.con_initcall.init) } | 61 | .con_initcall.init : { *(.con_initcall.init) } |
62 | __con_initcall_end = .; | 62 | __con_initcall_end = .; |
63 | .m68k_fixup : { | ||
64 | __start_fixup = .; | ||
65 | *(.m68k_fixup) | ||
66 | __stop_fixup = .; | ||
67 | } | ||
63 | SECURITY_INIT | 68 | SECURITY_INIT |
64 | #ifdef CONFIG_BLK_DEV_INITRD | 69 | #ifdef CONFIG_BLK_DEV_INITRD |
65 | . = ALIGN(8192); | 70 | . = ALIGN(8192); |
diff --git a/arch/m68k/kernel/vmlinux-sun3.lds b/arch/m68k/kernel/vmlinux-sun3.lds index c8999b2db23b..f06425b6d206 100644 --- a/arch/m68k/kernel/vmlinux-sun3.lds +++ b/arch/m68k/kernel/vmlinux-sun3.lds | |||
@@ -54,6 +54,11 @@ __init_begin = .; | |||
54 | __con_initcall_start = .; | 54 | __con_initcall_start = .; |
55 | .con_initcall.init : { *(.con_initcall.init) } | 55 | .con_initcall.init : { *(.con_initcall.init) } |
56 | __con_initcall_end = .; | 56 | __con_initcall_end = .; |
57 | .m68k_fixup : { | ||
58 | __start_fixup = .; | ||
59 | *(.m68k_fixup) | ||
60 | __stop_fixup = .; | ||
61 | } | ||
57 | SECURITY_INIT | 62 | SECURITY_INIT |
58 | #ifdef CONFIG_BLK_DEV_INITRD | 63 | #ifdef CONFIG_BLK_DEV_INITRD |
59 | . = ALIGN(8192); | 64 | . = ALIGN(8192); |
diff --git a/arch/m68k/mac/debug.c b/arch/m68k/mac/debug.c index 7a5bed5bdc57..e8a57138b4a6 100644 --- a/arch/m68k/mac/debug.c +++ b/arch/m68k/mac/debug.c | |||
@@ -71,7 +71,7 @@ void mac_debugging_short(int pos, short num) | |||
71 | 71 | ||
72 | /* calculate current offset */ | 72 | /* calculate current offset */ |
73 | pengoffset = (unsigned char *)mac_videobase + | 73 | pengoffset = (unsigned char *)mac_videobase + |
74 | (150+line*2) * mac_rowbytes) + 80 * peng; | 74 | (150+line*2) * mac_rowbytes + 80 * peng; |
75 | 75 | ||
76 | pptr = pengoffset; | 76 | pptr = pengoffset; |
77 | 77 | ||
diff --git a/arch/m68k/mm/init.c b/arch/m68k/mm/init.c index ab90213e5c54..f1de19e1dde6 100644 --- a/arch/m68k/mm/init.c +++ b/arch/m68k/mm/init.c | |||
@@ -7,6 +7,7 @@ | |||
7 | * to motorola.c and sun3mmu.c | 7 | * to motorola.c and sun3mmu.c |
8 | */ | 8 | */ |
9 | 9 | ||
10 | #include <linux/module.h> | ||
10 | #include <linux/signal.h> | 11 | #include <linux/signal.h> |
11 | #include <linux/sched.h> | 12 | #include <linux/sched.h> |
12 | #include <linux/mm.h> | 13 | #include <linux/mm.h> |
@@ -31,6 +32,37 @@ | |||
31 | 32 | ||
32 | DEFINE_PER_CPU(struct mmu_gather, mmu_gathers); | 33 | DEFINE_PER_CPU(struct mmu_gather, mmu_gathers); |
33 | 34 | ||
35 | static bootmem_data_t __initdata bootmem_data[MAX_NUMNODES]; | ||
36 | |||
37 | pg_data_t pg_data_map[MAX_NUMNODES]; | ||
38 | EXPORT_SYMBOL(pg_data_map); | ||
39 | |||
40 | int m68k_virt_to_node_shift; | ||
41 | |||
42 | #ifndef CONFIG_SINGLE_MEMORY_CHUNK | ||
43 | pg_data_t *pg_data_table[65]; | ||
44 | EXPORT_SYMBOL(pg_data_table); | ||
45 | #endif | ||
46 | |||
47 | void m68k_setup_node(int node) | ||
48 | { | ||
49 | #ifndef CONFIG_SINGLE_MEMORY_CHUNK | ||
50 | struct mem_info *info = m68k_memory + node; | ||
51 | int i, end; | ||
52 | |||
53 | i = (unsigned long)phys_to_virt(info->addr) >> __virt_to_node_shift(); | ||
54 | end = (unsigned long)phys_to_virt(info->addr + info->size - 1) >> __virt_to_node_shift(); | ||
55 | for (; i <= end; i++) { | ||
56 | if (pg_data_table[i]) | ||
57 | printk("overlap at %u for chunk %u\n", i, node); | ||
58 | pg_data_table[i] = pg_data_map + node; | ||
59 | } | ||
60 | #endif | ||
61 | pg_data_map[node].bdata = bootmem_data + node; | ||
62 | node_set_online(node); | ||
63 | } | ||
64 | |||
65 | |||
34 | /* | 66 | /* |
35 | * ZERO_PAGE is a special page that is used for zero-initialized | 67 | * ZERO_PAGE is a special page that is used for zero-initialized |
36 | * data and COW. | 68 | * data and COW. |
@@ -40,52 +72,51 @@ void *empty_zero_page; | |||
40 | 72 | ||
41 | void show_mem(void) | 73 | void show_mem(void) |
42 | { | 74 | { |
43 | unsigned long i; | 75 | pg_data_t *pgdat; |
44 | int free = 0, total = 0, reserved = 0, shared = 0; | 76 | int free = 0, total = 0, reserved = 0, shared = 0; |
45 | int cached = 0; | 77 | int cached = 0; |
46 | 78 | int i; | |
47 | printk("\nMem-info:\n"); | 79 | |
48 | show_free_areas(); | 80 | printk("\nMem-info:\n"); |
49 | printk("Free swap: %6ldkB\n", nr_swap_pages<<(PAGE_SHIFT-10)); | 81 | show_free_areas(); |
50 | i = max_mapnr; | 82 | printk("Free swap: %6ldkB\n", nr_swap_pages<<(PAGE_SHIFT-10)); |
51 | while (i-- > 0) { | 83 | for_each_online_pgdat(pgdat) { |
52 | total++; | 84 | for (i = 0; i < pgdat->node_spanned_pages; i++) { |
53 | if (PageReserved(mem_map+i)) | 85 | struct page *page = pgdat->node_mem_map + i; |
54 | reserved++; | 86 | total++; |
55 | else if (PageSwapCache(mem_map+i)) | 87 | if (PageReserved(page)) |
56 | cached++; | 88 | reserved++; |
57 | else if (!page_count(mem_map+i)) | 89 | else if (PageSwapCache(page)) |
58 | free++; | 90 | cached++; |
59 | else | 91 | else if (!page_count(page)) |
60 | shared += page_count(mem_map+i) - 1; | 92 | free++; |
61 | } | 93 | else |
62 | printk("%d pages of RAM\n",total); | 94 | shared += page_count(page) - 1; |
63 | printk("%d free pages\n",free); | 95 | } |
64 | printk("%d reserved pages\n",reserved); | 96 | } |
65 | printk("%d pages shared\n",shared); | 97 | printk("%d pages of RAM\n",total); |
66 | printk("%d pages swap cached\n",cached); | 98 | printk("%d free pages\n",free); |
99 | printk("%d reserved pages\n",reserved); | ||
100 | printk("%d pages shared\n",shared); | ||
101 | printk("%d pages swap cached\n",cached); | ||
67 | } | 102 | } |
68 | 103 | ||
69 | extern void init_pointer_table(unsigned long ptable); | 104 | extern void init_pointer_table(unsigned long ptable); |
70 | 105 | ||
71 | /* References to section boundaries */ | 106 | /* References to section boundaries */ |
72 | 107 | ||
73 | extern char _text, _etext, _edata, __bss_start, _end; | 108 | extern char _text[], _etext[]; |
74 | extern char __init_begin, __init_end; | 109 | extern char __init_begin[], __init_end[]; |
75 | 110 | ||
76 | extern pmd_t *zero_pgtable; | 111 | extern pmd_t *zero_pgtable; |
77 | 112 | ||
78 | void __init mem_init(void) | 113 | void __init mem_init(void) |
79 | { | 114 | { |
115 | pg_data_t *pgdat; | ||
80 | int codepages = 0; | 116 | int codepages = 0; |
81 | int datapages = 0; | 117 | int datapages = 0; |
82 | int initpages = 0; | 118 | int initpages = 0; |
83 | unsigned long tmp; | ||
84 | #ifndef CONFIG_SUN3 | ||
85 | int i; | 119 | int i; |
86 | #endif | ||
87 | |||
88 | max_mapnr = num_physpages = (((unsigned long)high_memory - PAGE_OFFSET) >> PAGE_SHIFT); | ||
89 | 120 | ||
90 | #ifdef CONFIG_ATARI | 121 | #ifdef CONFIG_ATARI |
91 | if (MACH_IS_ATARI) | 122 | if (MACH_IS_ATARI) |
@@ -93,19 +124,25 @@ void __init mem_init(void) | |||
93 | #endif | 124 | #endif |
94 | 125 | ||
95 | /* this will put all memory onto the freelists */ | 126 | /* this will put all memory onto the freelists */ |
96 | totalram_pages = free_all_bootmem(); | 127 | totalram_pages = num_physpages = 0; |
97 | 128 | for_each_online_pgdat(pgdat) { | |
98 | for (tmp = PAGE_OFFSET ; tmp < (unsigned long)high_memory; tmp += PAGE_SIZE) { | 129 | num_physpages += pgdat->node_present_pages; |
99 | if (PageReserved(virt_to_page(tmp))) { | 130 | |
100 | if (tmp >= (unsigned long)&_text | 131 | totalram_pages += free_all_bootmem_node(pgdat); |
101 | && tmp < (unsigned long)&_etext) | 132 | for (i = 0; i < pgdat->node_spanned_pages; i++) { |
133 | struct page *page = pgdat->node_mem_map + i; | ||
134 | char *addr = page_to_virt(page); | ||
135 | |||
136 | if (!PageReserved(page)) | ||
137 | continue; | ||
138 | if (addr >= _text && | ||
139 | addr < _etext) | ||
102 | codepages++; | 140 | codepages++; |
103 | else if (tmp >= (unsigned long) &__init_begin | 141 | else if (addr >= __init_begin && |
104 | && tmp < (unsigned long) &__init_end) | 142 | addr < __init_end) |
105 | initpages++; | 143 | initpages++; |
106 | else | 144 | else |
107 | datapages++; | 145 | datapages++; |
108 | continue; | ||
109 | } | 146 | } |
110 | } | 147 | } |
111 | 148 | ||
@@ -124,7 +161,7 @@ void __init mem_init(void) | |||
124 | 161 | ||
125 | printk("Memory: %luk/%luk available (%dk kernel code, %dk data, %dk init)\n", | 162 | printk("Memory: %luk/%luk available (%dk kernel code, %dk data, %dk init)\n", |
126 | (unsigned long)nr_free_pages() << (PAGE_SHIFT-10), | 163 | (unsigned long)nr_free_pages() << (PAGE_SHIFT-10), |
127 | max_mapnr << (PAGE_SHIFT-10), | 164 | totalram_pages << (PAGE_SHIFT-10), |
128 | codepages << (PAGE_SHIFT-10), | 165 | codepages << (PAGE_SHIFT-10), |
129 | datapages << (PAGE_SHIFT-10), | 166 | datapages << (PAGE_SHIFT-10), |
130 | initpages << (PAGE_SHIFT-10)); | 167 | initpages << (PAGE_SHIFT-10)); |
diff --git a/arch/m68k/mm/memory.c b/arch/m68k/mm/memory.c index 13c0b4ad01eb..b7473525b431 100644 --- a/arch/m68k/mm/memory.c +++ b/arch/m68k/mm/memory.c | |||
@@ -127,67 +127,6 @@ int free_pointer_table (pmd_t *ptable) | |||
127 | return 0; | 127 | return 0; |
128 | } | 128 | } |
129 | 129 | ||
130 | #ifdef DEBUG_INVALID_PTOV | ||
131 | int mm_inv_cnt = 5; | ||
132 | #endif | ||
133 | |||
134 | #ifndef CONFIG_SINGLE_MEMORY_CHUNK | ||
135 | /* | ||
136 | * The following two routines map from a physical address to a kernel | ||
137 | * virtual address and vice versa. | ||
138 | */ | ||
139 | unsigned long mm_vtop(unsigned long vaddr) | ||
140 | { | ||
141 | int i=0; | ||
142 | unsigned long voff = (unsigned long)vaddr - PAGE_OFFSET; | ||
143 | |||
144 | do { | ||
145 | if (voff < m68k_memory[i].size) { | ||
146 | #ifdef DEBUGPV | ||
147 | printk ("VTOP(%p)=%lx\n", vaddr, | ||
148 | m68k_memory[i].addr + voff); | ||
149 | #endif | ||
150 | return m68k_memory[i].addr + voff; | ||
151 | } | ||
152 | voff -= m68k_memory[i].size; | ||
153 | } while (++i < m68k_num_memory); | ||
154 | |||
155 | /* As a special case allow `__pa(high_memory)'. */ | ||
156 | if (voff == 0) | ||
157 | return m68k_memory[i-1].addr + m68k_memory[i-1].size; | ||
158 | |||
159 | return -1; | ||
160 | } | ||
161 | EXPORT_SYMBOL(mm_vtop); | ||
162 | |||
163 | unsigned long mm_ptov (unsigned long paddr) | ||
164 | { | ||
165 | int i = 0; | ||
166 | unsigned long poff, voff = PAGE_OFFSET; | ||
167 | |||
168 | do { | ||
169 | poff = paddr - m68k_memory[i].addr; | ||
170 | if (poff < m68k_memory[i].size) { | ||
171 | #ifdef DEBUGPV | ||
172 | printk ("PTOV(%lx)=%lx\n", paddr, poff + voff); | ||
173 | #endif | ||
174 | return poff + voff; | ||
175 | } | ||
176 | voff += m68k_memory[i].size; | ||
177 | } while (++i < m68k_num_memory); | ||
178 | |||
179 | #ifdef DEBUG_INVALID_PTOV | ||
180 | if (mm_inv_cnt > 0) { | ||
181 | mm_inv_cnt--; | ||
182 | printk("Invalid use of phys_to_virt(0x%lx) at 0x%p!\n", | ||
183 | paddr, __builtin_return_address(0)); | ||
184 | } | ||
185 | #endif | ||
186 | return -1; | ||
187 | } | ||
188 | EXPORT_SYMBOL(mm_ptov); | ||
189 | #endif | ||
190 | |||
191 | /* invalidate page in both caches */ | 130 | /* invalidate page in both caches */ |
192 | static inline void clear040(unsigned long paddr) | 131 | static inline void clear040(unsigned long paddr) |
193 | { | 132 | { |
@@ -354,15 +293,3 @@ void cache_push (unsigned long paddr, int len) | |||
354 | } | 293 | } |
355 | EXPORT_SYMBOL(cache_push); | 294 | EXPORT_SYMBOL(cache_push); |
356 | 295 | ||
357 | #ifndef CONFIG_SINGLE_MEMORY_CHUNK | ||
358 | int mm_end_of_chunk (unsigned long addr, int len) | ||
359 | { | ||
360 | int i; | ||
361 | |||
362 | for (i = 0; i < m68k_num_memory; i++) | ||
363 | if (m68k_memory[i].addr + m68k_memory[i].size == addr + len) | ||
364 | return 1; | ||
365 | return 0; | ||
366 | } | ||
367 | EXPORT_SYMBOL(mm_end_of_chunk); | ||
368 | #endif | ||
diff --git a/arch/m68k/mm/motorola.c b/arch/m68k/mm/motorola.c index afcccdc6ad45..7d571a2b44dd 100644 --- a/arch/m68k/mm/motorola.c +++ b/arch/m68k/mm/motorola.c | |||
@@ -43,6 +43,11 @@ unsigned long mm_cachebits; | |||
43 | EXPORT_SYMBOL(mm_cachebits); | 43 | EXPORT_SYMBOL(mm_cachebits); |
44 | #endif | 44 | #endif |
45 | 45 | ||
46 | /* size of memory already mapped in head.S */ | ||
47 | #define INIT_MAPPED_SIZE (4UL<<20) | ||
48 | |||
49 | extern unsigned long availmem; | ||
50 | |||
46 | static pte_t * __init kernel_page_table(void) | 51 | static pte_t * __init kernel_page_table(void) |
47 | { | 52 | { |
48 | pte_t *ptablep; | 53 | pte_t *ptablep; |
@@ -98,19 +103,20 @@ static pmd_t * __init kernel_ptr_table(void) | |||
98 | return last_pgtable; | 103 | return last_pgtable; |
99 | } | 104 | } |
100 | 105 | ||
101 | static unsigned long __init | 106 | static void __init map_node(int node) |
102 | map_chunk (unsigned long addr, long size) | ||
103 | { | 107 | { |
104 | #define PTRTREESIZE (256*1024) | 108 | #define PTRTREESIZE (256*1024) |
105 | #define ROOTTREESIZE (32*1024*1024) | 109 | #define ROOTTREESIZE (32*1024*1024) |
106 | static unsigned long virtaddr = PAGE_OFFSET; | 110 | unsigned long physaddr, virtaddr, size; |
107 | unsigned long physaddr; | ||
108 | pgd_t *pgd_dir; | 111 | pgd_t *pgd_dir; |
109 | pmd_t *pmd_dir; | 112 | pmd_t *pmd_dir; |
110 | pte_t *pte_dir; | 113 | pte_t *pte_dir; |
111 | 114 | ||
112 | physaddr = (addr | m68k_supervisor_cachemode | | 115 | size = m68k_memory[node].size; |
113 | _PAGE_PRESENT | _PAGE_ACCESSED | _PAGE_DIRTY); | 116 | physaddr = m68k_memory[node].addr; |
117 | virtaddr = (unsigned long)phys_to_virt(physaddr); | ||
118 | physaddr |= m68k_supervisor_cachemode | | ||
119 | _PAGE_PRESENT | _PAGE_ACCESSED | _PAGE_DIRTY; | ||
114 | if (CPU_IS_040_OR_060) | 120 | if (CPU_IS_040_OR_060) |
115 | physaddr |= _PAGE_GLOBAL040; | 121 | physaddr |= _PAGE_GLOBAL040; |
116 | 122 | ||
@@ -190,8 +196,6 @@ map_chunk (unsigned long addr, long size) | |||
190 | #ifdef DEBUG | 196 | #ifdef DEBUG |
191 | printk("\n"); | 197 | printk("\n"); |
192 | #endif | 198 | #endif |
193 | |||
194 | return virtaddr; | ||
195 | } | 199 | } |
196 | 200 | ||
197 | /* | 201 | /* |
@@ -200,15 +204,16 @@ map_chunk (unsigned long addr, long size) | |||
200 | */ | 204 | */ |
201 | void __init paging_init(void) | 205 | void __init paging_init(void) |
202 | { | 206 | { |
203 | int chunk; | ||
204 | unsigned long mem_avail = 0; | ||
205 | unsigned long zones_size[MAX_NR_ZONES] = { 0, }; | 207 | unsigned long zones_size[MAX_NR_ZONES] = { 0, }; |
208 | unsigned long min_addr, max_addr; | ||
209 | unsigned long addr, size, end; | ||
210 | int i; | ||
206 | 211 | ||
207 | #ifdef DEBUG | 212 | #ifdef DEBUG |
208 | { | 213 | { |
209 | extern unsigned long availmem; | 214 | extern unsigned long availmem; |
210 | printk ("start of paging_init (%p, %lx, %lx, %lx)\n", | 215 | printk ("start of paging_init (%p, %lx)\n", |
211 | kernel_pg_dir, availmem, start_mem, end_mem); | 216 | kernel_pg_dir, availmem); |
212 | } | 217 | } |
213 | #endif | 218 | #endif |
214 | 219 | ||
@@ -222,24 +227,62 @@ void __init paging_init(void) | |||
222 | pgprot_val(protection_map[i]) |= _PAGE_CACHE040; | 227 | pgprot_val(protection_map[i]) |= _PAGE_CACHE040; |
223 | } | 228 | } |
224 | 229 | ||
230 | min_addr = m68k_memory[0].addr; | ||
231 | max_addr = min_addr + m68k_memory[0].size; | ||
232 | for (i = 1; i < m68k_num_memory;) { | ||
233 | if (m68k_memory[i].addr < min_addr) { | ||
234 | printk("Ignoring memory chunk at 0x%lx:0x%lx before the first chunk\n", | ||
235 | m68k_memory[i].addr, m68k_memory[i].size); | ||
236 | printk("Fix your bootloader or use a memfile to make use of this area!\n"); | ||
237 | m68k_num_memory--; | ||
238 | memmove(m68k_memory + i, m68k_memory + i + 1, | ||
239 | (m68k_num_memory - i) * sizeof(struct mem_info)); | ||
240 | continue; | ||
241 | } | ||
242 | addr = m68k_memory[i].addr + m68k_memory[i].size; | ||
243 | if (addr > max_addr) | ||
244 | max_addr = addr; | ||
245 | i++; | ||
246 | } | ||
247 | m68k_memoffset = min_addr - PAGE_OFFSET; | ||
248 | m68k_virt_to_node_shift = fls(max_addr - min_addr - 1) - 6; | ||
249 | |||
250 | module_fixup(NULL, __start_fixup, __stop_fixup); | ||
251 | flush_icache(); | ||
252 | |||
253 | high_memory = phys_to_virt(max_addr); | ||
254 | |||
255 | min_low_pfn = availmem >> PAGE_SHIFT; | ||
256 | max_low_pfn = max_addr >> PAGE_SHIFT; | ||
257 | |||
258 | for (i = 0; i < m68k_num_memory; i++) { | ||
259 | addr = m68k_memory[i].addr; | ||
260 | end = addr + m68k_memory[i].size; | ||
261 | m68k_setup_node(i); | ||
262 | availmem = PAGE_ALIGN(availmem); | ||
263 | availmem += init_bootmem_node(NODE_DATA(i), | ||
264 | availmem >> PAGE_SHIFT, | ||
265 | addr >> PAGE_SHIFT, | ||
266 | end >> PAGE_SHIFT); | ||
267 | } | ||
268 | |||
225 | /* | 269 | /* |
226 | * Map the physical memory available into the kernel virtual | 270 | * Map the physical memory available into the kernel virtual |
227 | * address space. It may allocate some memory for page | 271 | * address space. First initialize the bootmem allocator with |
228 | * tables and thus modify availmem. | 272 | * the memory we already mapped, so map_node() has something |
273 | * to allocate. | ||
229 | */ | 274 | */ |
275 | addr = m68k_memory[0].addr; | ||
276 | size = m68k_memory[0].size; | ||
277 | free_bootmem_node(NODE_DATA(0), availmem, min(INIT_MAPPED_SIZE, size) - (availmem - addr)); | ||
278 | map_node(0); | ||
279 | if (size > INIT_MAPPED_SIZE) | ||
280 | free_bootmem_node(NODE_DATA(0), addr + INIT_MAPPED_SIZE, size - INIT_MAPPED_SIZE); | ||
230 | 281 | ||
231 | for (chunk = 0; chunk < m68k_num_memory; chunk++) { | 282 | for (i = 1; i < m68k_num_memory; i++) |
232 | mem_avail = map_chunk (m68k_memory[chunk].addr, | 283 | map_node(i); |
233 | m68k_memory[chunk].size); | ||
234 | |||
235 | } | ||
236 | 284 | ||
237 | flush_tlb_all(); | 285 | flush_tlb_all(); |
238 | #ifdef DEBUG | ||
239 | printk ("memory available is %ldKB\n", mem_avail >> 10); | ||
240 | printk ("start_mem is %#lx\nvirtual_end is %#lx\n", | ||
241 | start_mem, end_mem); | ||
242 | #endif | ||
243 | 286 | ||
244 | /* | 287 | /* |
245 | * initialize the bad page table and bad page to point | 288 | * initialize the bad page table and bad page to point |
@@ -256,14 +299,11 @@ void __init paging_init(void) | |||
256 | #ifdef DEBUG | 299 | #ifdef DEBUG |
257 | printk ("before free_area_init\n"); | 300 | printk ("before free_area_init\n"); |
258 | #endif | 301 | #endif |
259 | zones_size[ZONE_DMA] = (mach_max_dma_address < (unsigned long)high_memory ? | 302 | for (i = 0; i < m68k_num_memory; i++) { |
260 | (mach_max_dma_address+1) : (unsigned long)high_memory); | 303 | zones_size[ZONE_DMA] = m68k_memory[i].size >> PAGE_SHIFT; |
261 | zones_size[ZONE_NORMAL] = (unsigned long)high_memory - zones_size[0]; | 304 | free_area_init_node(i, pg_data_map + i, zones_size, |
262 | 305 | m68k_memory[i].addr >> PAGE_SHIFT, NULL); | |
263 | zones_size[ZONE_DMA] = (zones_size[ZONE_DMA] - PAGE_OFFSET) >> PAGE_SHIFT; | 306 | } |
264 | zones_size[ZONE_NORMAL] >>= PAGE_SHIFT; | ||
265 | |||
266 | free_area_init(zones_size); | ||
267 | } | 307 | } |
268 | 308 | ||
269 | extern char __init_begin, __init_end; | 309 | extern char __init_begin, __init_end; |
diff --git a/arch/m68k/sun3/config.c b/arch/m68k/sun3/config.c index 4851b8437a87..c0fbd278fbb1 100644 --- a/arch/m68k/sun3/config.c +++ b/arch/m68k/sun3/config.c | |||
@@ -21,6 +21,7 @@ | |||
21 | #include <asm/contregs.h> | 21 | #include <asm/contregs.h> |
22 | #include <asm/movs.h> | 22 | #include <asm/movs.h> |
23 | #include <asm/pgtable.h> | 23 | #include <asm/pgtable.h> |
24 | #include <asm/pgalloc.h> | ||
24 | #include <asm/sun3-head.h> | 25 | #include <asm/sun3-head.h> |
25 | #include <asm/sun3mmu.h> | 26 | #include <asm/sun3mmu.h> |
26 | #include <asm/rtc.h> | 27 | #include <asm/rtc.h> |
@@ -127,6 +128,7 @@ void __init sun3_bootmem_alloc(unsigned long memory_start, unsigned long memory_ | |||
127 | high_memory = (void *)memory_end; | 128 | high_memory = (void *)memory_end; |
128 | availmem = memory_start; | 129 | availmem = memory_start; |
129 | 130 | ||
131 | m68k_setup_node(0); | ||
130 | availmem += init_bootmem_node(NODE_DATA(0), start_page, 0, num_pages); | 132 | availmem += init_bootmem_node(NODE_DATA(0), start_page, 0, num_pages); |
131 | availmem = (availmem + (PAGE_SIZE-1)) & PAGE_MASK; | 133 | availmem = (availmem + (PAGE_SIZE-1)) & PAGE_MASK; |
132 | 134 | ||
diff --git a/arch/mips/jmr3927/rbhma3100/kgdb_io.c b/arch/mips/jmr3927/rbhma3100/kgdb_io.c index 2604f2c9a96e..342579cfdc01 100644 --- a/arch/mips/jmr3927/rbhma3100/kgdb_io.c +++ b/arch/mips/jmr3927/rbhma3100/kgdb_io.c | |||
@@ -36,7 +36,7 @@ | |||
36 | #define TIMEOUT 0xffffff | 36 | #define TIMEOUT 0xffffff |
37 | 37 | ||
38 | static int remoteDebugInitialized = 0; | 38 | static int remoteDebugInitialized = 0; |
39 | static void debugInit(int baud) | 39 | static void debugInit(int baud); |
40 | 40 | ||
41 | int putDebugChar(unsigned char c) | 41 | int putDebugChar(unsigned char c) |
42 | { | 42 | { |
diff --git a/arch/mips/pci/pci-ocelot.c b/arch/mips/pci/pci-ocelot.c index 7f94f26d35ae..1421d34535ef 100644 --- a/arch/mips/pci/pci-ocelot.c +++ b/arch/mips/pci/pci-ocelot.c | |||
@@ -71,19 +71,19 @@ static inline void pci0WriteConfigReg(unsigned int offset, unsigned int data) | |||
71 | } | 71 | } |
72 | 72 | ||
73 | static struct resource ocelot_mem_resource = { | 73 | static struct resource ocelot_mem_resource = { |
74 | start = GT_PCI_MEM_BASE; | 74 | .start = GT_PCI_MEM_BASE, |
75 | end = GT_PCI_MEM_BASE + GT_PCI_MEM_BASE - 1; | 75 | .end = GT_PCI_MEM_BASE + GT_PCI_MEM_BASE - 1, |
76 | }; | 76 | }; |
77 | 77 | ||
78 | static struct resource ocelot_io_resource = { | 78 | static struct resource ocelot_io_resource = { |
79 | start = GT_PCI_IO_BASE; | 79 | .start = GT_PCI_IO_BASE, |
80 | end = GT_PCI_IO_BASE + GT_PCI_IO_SIZE - 1; | 80 | .end = GT_PCI_IO_BASE + GT_PCI_IO_SIZE - 1, |
81 | }; | 81 | }; |
82 | 82 | ||
83 | static struct pci_controller ocelot_pci_controller = { | 83 | static struct pci_controller ocelot_pci_controller = { |
84 | .pci_ops = gt64xxx_pci0_ops; | 84 | .pci_ops = gt64xxx_pci0_ops, |
85 | .mem_resource = &ocelot_mem_resource; | 85 | .mem_resource = &ocelot_mem_resource, |
86 | .io_resource = &ocelot_io_resource; | 86 | .io_resource = &ocelot_io_resource, |
87 | }; | 87 | }; |
88 | 88 | ||
89 | static int __init ocelot_pcibios_init(void) | 89 | static int __init ocelot_pcibios_init(void) |
diff --git a/arch/powerpc/Makefile b/arch/powerpc/Makefile index 6238b5875fd1..fbafd965dcd2 100644 --- a/arch/powerpc/Makefile +++ b/arch/powerpc/Makefile | |||
@@ -142,7 +142,6 @@ drivers-$(CONFIG_OPROFILE) += arch/powerpc/oprofile/ | |||
142 | 142 | ||
143 | # Default to zImage, override when needed | 143 | # Default to zImage, override when needed |
144 | defaultimage-y := zImage | 144 | defaultimage-y := zImage |
145 | defaultimage-$(CONFIG_PPC_ISERIES) := vmlinux | ||
146 | defaultimage-$(CONFIG_DEFAULT_UIMAGE) := uImage | 145 | defaultimage-$(CONFIG_DEFAULT_UIMAGE) := uImage |
147 | KBUILD_IMAGE := $(defaultimage-y) | 146 | KBUILD_IMAGE := $(defaultimage-y) |
148 | all: $(KBUILD_IMAGE) | 147 | all: $(KBUILD_IMAGE) |
diff --git a/arch/powerpc/boot/Makefile b/arch/powerpc/boot/Makefile index 83788986b93b..ff2701949ee1 100644 --- a/arch/powerpc/boot/Makefile +++ b/arch/powerpc/boot/Makefile | |||
@@ -11,20 +11,18 @@ | |||
11 | # bootloader and increase compatibility with OpenFirmware. | 11 | # bootloader and increase compatibility with OpenFirmware. |
12 | # | 12 | # |
13 | # To this end we need to define BOOTCC, etc, as the tools | 13 | # To this end we need to define BOOTCC, etc, as the tools |
14 | # needed to build the 32 bit image. These are normally HOSTCC, | 14 | # needed to build the 32 bit image. That's normally the same |
15 | # but may be a third compiler if, for example, you are cross | 15 | # compiler for the rest of the kernel, with the -m32 flag added. |
16 | # compiling from an intel box. Once the 64bit ppc gcc is | ||
17 | # stable it will probably simply be a compiler switch to | ||
18 | # compile for 32bit mode. | ||
19 | # To make it easier to setup a cross compiler, | 16 | # To make it easier to setup a cross compiler, |
20 | # CROSS32_COMPILE is setup as a prefix just like CROSS_COMPILE | 17 | # CROSS32_COMPILE is setup as a prefix just like CROSS_COMPILE |
21 | # in the toplevel makefile. | 18 | # in the toplevel makefile. |
22 | 19 | ||
23 | all: $(obj)/zImage | 20 | all: $(obj)/zImage |
24 | 21 | ||
25 | HOSTCC := gcc | 22 | BOOTCFLAGS := -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs \ |
26 | BOOTCFLAGS := $(HOSTCFLAGS) -fno-builtin -nostdinc -isystem \ | 23 | -fno-strict-aliasing -Os -msoft-float -pipe \ |
27 | $(shell $(CROSS32CC) -print-file-name=include) -fPIC | 24 | -fomit-frame-pointer -fno-builtin -fPIC -nostdinc \ |
25 | -isystem $(shell $(CROSS32CC) -print-file-name=include) | ||
28 | BOOTAFLAGS := -D__ASSEMBLY__ $(BOOTCFLAGS) -traditional -nostdinc | 26 | BOOTAFLAGS := -D__ASSEMBLY__ $(BOOTCFLAGS) -traditional -nostdinc |
29 | 27 | ||
30 | ifeq ($(call cc-option-yn, -fstack-protector),y) | 28 | ifeq ($(call cc-option-yn, -fstack-protector),y) |
@@ -33,8 +31,8 @@ endif | |||
33 | 31 | ||
34 | BOOTCFLAGS += -I$(obj) -I$(srctree)/$(obj) | 32 | BOOTCFLAGS += -I$(obj) -I$(srctree)/$(obj) |
35 | 33 | ||
36 | $(obj)/44x.o: BOOTCFLAGS += -Wa,-mbooke | 34 | $(obj)/44x.o: BOOTCFLAGS += -mcpu=440 |
37 | $(obj)/ebony.o: BOOTCFLAGS += -Wa,-mbooke | 35 | $(obj)/ebony.o: BOOTCFLAGS += -mcpu=440 |
38 | 36 | ||
39 | zlib := inffast.c inflate.c inftrees.c | 37 | zlib := inffast.c inflate.c inftrees.c |
40 | zlibheader := inffast.h inffixed.h inflate.h inftrees.h infutil.h | 38 | zlibheader := inffast.h inffixed.h inflate.h inftrees.h infutil.h |
@@ -136,6 +134,7 @@ image-$(CONFIG_PPC_EFIKA) += zImage.chrp | |||
136 | image-$(CONFIG_PPC_PMAC) += zImage.pmac | 134 | image-$(CONFIG_PPC_PMAC) += zImage.pmac |
137 | image-$(CONFIG_PPC_HOLLY) += zImage.holly-elf | 135 | image-$(CONFIG_PPC_HOLLY) += zImage.holly-elf |
138 | image-$(CONFIG_PPC_PRPMC2800) += zImage.prpmc2800 | 136 | image-$(CONFIG_PPC_PRPMC2800) += zImage.prpmc2800 |
137 | image-$(CONFIG_PPC_ISERIES) += zImage.iseries | ||
139 | image-$(CONFIG_DEFAULT_UIMAGE) += uImage | 138 | image-$(CONFIG_DEFAULT_UIMAGE) += uImage |
140 | 139 | ||
141 | ifneq ($(CONFIG_DEVICE_TREE),"") | 140 | ifneq ($(CONFIG_DEVICE_TREE),"") |
@@ -185,6 +184,9 @@ $(obj)/zImage.initrd.%: vmlinux $(wrapperbits) | |||
185 | $(obj)/zImage.%: vmlinux $(wrapperbits) | 184 | $(obj)/zImage.%: vmlinux $(wrapperbits) |
186 | $(call if_changed,wrap,$*) | 185 | $(call if_changed,wrap,$*) |
187 | 186 | ||
187 | $(obj)/zImage.iseries: vmlinux | ||
188 | $(STRIP) -s -R .comment $< -o $@ | ||
189 | |||
188 | $(obj)/zImage.ps3: vmlinux | 190 | $(obj)/zImage.ps3: vmlinux |
189 | $(STRIP) -s -R .comment $< -o $@ | 191 | $(STRIP) -s -R .comment $< -o $@ |
190 | 192 | ||
diff --git a/arch/powerpc/boot/wrapper b/arch/powerpc/boot/wrapper index 2ed8b8b3f0ec..da77adc73078 100755 --- a/arch/powerpc/boot/wrapper +++ b/arch/powerpc/boot/wrapper | |||
@@ -129,7 +129,7 @@ case "$platform" in | |||
129 | pmac|pseries|chrp) | 129 | pmac|pseries|chrp) |
130 | platformo=$object/of.o | 130 | platformo=$object/of.o |
131 | ;; | 131 | ;; |
132 | pmaccoff) | 132 | coff) |
133 | platformo=$object/of.o | 133 | platformo=$object/of.o |
134 | lds=$object/zImage.coff.lds | 134 | lds=$object/zImage.coff.lds |
135 | ;; | 135 | ;; |
@@ -220,7 +220,7 @@ case "$platform" in | |||
220 | pseries|chrp) | 220 | pseries|chrp) |
221 | $object/addnote "$ofile" | 221 | $object/addnote "$ofile" |
222 | ;; | 222 | ;; |
223 | pmaccoff) | 223 | coff) |
224 | ${CROSS}objcopy -O aixcoff-rs6000 --set-start "$entry" "$ofile" | 224 | ${CROSS}objcopy -O aixcoff-rs6000 --set-start "$entry" "$ofile" |
225 | $object/hack-coff "$ofile" | 225 | $object/hack-coff "$ofile" |
226 | ;; | 226 | ;; |
diff --git a/arch/powerpc/kernel/irq.c b/arch/powerpc/kernel/irq.c index 068377a2a8dc..42c8ed6ed528 100644 --- a/arch/powerpc/kernel/irq.c +++ b/arch/powerpc/kernel/irq.c | |||
@@ -489,7 +489,7 @@ struct irq_host *irq_alloc_host(unsigned int revmap_type, | |||
489 | case IRQ_HOST_MAP_LINEAR: | 489 | case IRQ_HOST_MAP_LINEAR: |
490 | rmap = (unsigned int *)(host + 1); | 490 | rmap = (unsigned int *)(host + 1); |
491 | for (i = 0; i < revmap_arg; i++) | 491 | for (i = 0; i < revmap_arg; i++) |
492 | rmap[i] = IRQ_NONE; | 492 | rmap[i] = NO_IRQ; |
493 | host->revmap_data.linear.size = revmap_arg; | 493 | host->revmap_data.linear.size = revmap_arg; |
494 | smp_wmb(); | 494 | smp_wmb(); |
495 | host->revmap_data.linear.revmap = rmap; | 495 | host->revmap_data.linear.revmap = rmap; |
@@ -614,7 +614,7 @@ unsigned int irq_create_mapping(struct irq_host *host, | |||
614 | * host->ops->map() to update the flags | 614 | * host->ops->map() to update the flags |
615 | */ | 615 | */ |
616 | virq = irq_find_mapping(host, hwirq); | 616 | virq = irq_find_mapping(host, hwirq); |
617 | if (virq != IRQ_NONE) { | 617 | if (virq != NO_IRQ) { |
618 | if (host->ops->remap) | 618 | if (host->ops->remap) |
619 | host->ops->remap(host, virq, hwirq); | 619 | host->ops->remap(host, virq, hwirq); |
620 | pr_debug("irq: -> existing mapping on virq %d\n", virq); | 620 | pr_debug("irq: -> existing mapping on virq %d\n", virq); |
@@ -741,7 +741,7 @@ void irq_dispose_mapping(unsigned int virq) | |||
741 | switch(host->revmap_type) { | 741 | switch(host->revmap_type) { |
742 | case IRQ_HOST_MAP_LINEAR: | 742 | case IRQ_HOST_MAP_LINEAR: |
743 | if (hwirq < host->revmap_data.linear.size) | 743 | if (hwirq < host->revmap_data.linear.size) |
744 | host->revmap_data.linear.revmap[hwirq] = IRQ_NONE; | 744 | host->revmap_data.linear.revmap[hwirq] = NO_IRQ; |
745 | break; | 745 | break; |
746 | case IRQ_HOST_MAP_TREE: | 746 | case IRQ_HOST_MAP_TREE: |
747 | /* Check if radix tree allocated yet */ | 747 | /* Check if radix tree allocated yet */ |
diff --git a/arch/powerpc/kernel/prom.c b/arch/powerpc/kernel/prom.c index 066a6a7a25b8..af42ddab3ab4 100644 --- a/arch/powerpc/kernel/prom.c +++ b/arch/powerpc/kernel/prom.c | |||
@@ -1171,11 +1171,12 @@ EXPORT_SYMBOL(of_find_node_by_name); | |||
1171 | 1171 | ||
1172 | /** | 1172 | /** |
1173 | * of_find_node_by_type - Find a node by its "device_type" property | 1173 | * of_find_node_by_type - Find a node by its "device_type" property |
1174 | * @from: The node to start searching from or NULL, the node | 1174 | * @from: The node to start searching from, or NULL to start searching |
1175 | * you pass will not be searched, only the next one | 1175 | * the entire device tree. The node you pass will not be |
1176 | * will; typically, you pass what the previous call | 1176 | * searched, only the next one will; typically, you pass |
1177 | * returned. of_node_put() will be called on it | 1177 | * what the previous call returned. of_node_put() will be |
1178 | * @name: The type string to match against | 1178 | * called on from for you. |
1179 | * @type: The type string to match against | ||
1179 | * | 1180 | * |
1180 | * Returns a node pointer with refcount incremented, use | 1181 | * Returns a node pointer with refcount incremented, use |
1181 | * of_node_put() on it when done. | 1182 | * of_node_put() on it when done. |
diff --git a/arch/powerpc/kernel/ptrace.c b/arch/powerpc/kernel/ptrace.c index f4f391cdd8f5..bf76562167c3 100644 --- a/arch/powerpc/kernel/ptrace.c +++ b/arch/powerpc/kernel/ptrace.c | |||
@@ -218,6 +218,7 @@ set_single_step(struct task_struct *task) | |||
218 | regs->msr |= MSR_SE; | 218 | regs->msr |= MSR_SE; |
219 | #endif | 219 | #endif |
220 | } | 220 | } |
221 | set_tsk_thread_flag(task, TIF_SINGLESTEP); | ||
221 | } | 222 | } |
222 | 223 | ||
223 | static inline void | 224 | static inline void |
@@ -233,6 +234,7 @@ clear_single_step(struct task_struct *task) | |||
233 | regs->msr &= ~MSR_SE; | 234 | regs->msr &= ~MSR_SE; |
234 | #endif | 235 | #endif |
235 | } | 236 | } |
237 | clear_tsk_thread_flag(task, TIF_SINGLESTEP); | ||
236 | } | 238 | } |
237 | #endif /* CONFIG_PPC32 */ | 239 | #endif /* CONFIG_PPC32 */ |
238 | 240 | ||
diff --git a/arch/powerpc/platforms/pasemi/idle.c b/arch/powerpc/platforms/pasemi/idle.c index 03cd45d8fefa..3c962d5757be 100644 --- a/arch/powerpc/platforms/pasemi/idle.c +++ b/arch/powerpc/platforms/pasemi/idle.c | |||
@@ -26,6 +26,7 @@ | |||
26 | 26 | ||
27 | #include <asm/machdep.h> | 27 | #include <asm/machdep.h> |
28 | #include <asm/reg.h> | 28 | #include <asm/reg.h> |
29 | #include <asm/smp.h> | ||
29 | 30 | ||
30 | #include "pasemi.h" | 31 | #include "pasemi.h" |
31 | 32 | ||
diff --git a/arch/powerpc/platforms/ps3/interrupt.c b/arch/powerpc/platforms/ps3/interrupt.c index 9da82c266ba9..ec9030dbb5f1 100644 --- a/arch/powerpc/platforms/ps3/interrupt.c +++ b/arch/powerpc/platforms/ps3/interrupt.c | |||
@@ -25,6 +25,7 @@ | |||
25 | #include <asm/machdep.h> | 25 | #include <asm/machdep.h> |
26 | #include <asm/udbg.h> | 26 | #include <asm/udbg.h> |
27 | #include <asm/lv1call.h> | 27 | #include <asm/lv1call.h> |
28 | #include <asm/smp.h> | ||
28 | 29 | ||
29 | #include "platform.h" | 30 | #include "platform.h" |
30 | 31 | ||
diff --git a/arch/powerpc/platforms/pseries/xics.c b/arch/powerpc/platforms/pseries/xics.c index b854e7f1001c..f1df942072bb 100644 --- a/arch/powerpc/platforms/pseries/xics.c +++ b/arch/powerpc/platforms/pseries/xics.c | |||
@@ -752,6 +752,7 @@ skip_gserver_check: | |||
752 | void xics_request_IPIs(void) | 752 | void xics_request_IPIs(void) |
753 | { | 753 | { |
754 | unsigned int ipi; | 754 | unsigned int ipi; |
755 | int rc; | ||
755 | 756 | ||
756 | ipi = irq_create_mapping(xics_host, XICS_IPI); | 757 | ipi = irq_create_mapping(xics_host, XICS_IPI); |
757 | BUG_ON(ipi == NO_IRQ); | 758 | BUG_ON(ipi == NO_IRQ); |
@@ -762,11 +763,12 @@ void xics_request_IPIs(void) | |||
762 | */ | 763 | */ |
763 | set_irq_handler(ipi, handle_percpu_irq); | 764 | set_irq_handler(ipi, handle_percpu_irq); |
764 | if (firmware_has_feature(FW_FEATURE_LPAR)) | 765 | if (firmware_has_feature(FW_FEATURE_LPAR)) |
765 | request_irq(ipi, xics_ipi_action_lpar, IRQF_DISABLED, | 766 | rc = request_irq(ipi, xics_ipi_action_lpar, IRQF_DISABLED, |
766 | "IPI", NULL); | 767 | "IPI", NULL); |
767 | else | 768 | else |
768 | request_irq(ipi, xics_ipi_action_direct, IRQF_DISABLED, | 769 | rc = request_irq(ipi, xics_ipi_action_direct, IRQF_DISABLED, |
769 | "IPI", NULL); | 770 | "IPI", NULL); |
771 | BUG_ON(rc); | ||
770 | } | 772 | } |
771 | #endif /* CONFIG_SMP */ | 773 | #endif /* CONFIG_SMP */ |
772 | 774 | ||
diff --git a/arch/ppc/syslib/ibm_ocp.c b/arch/ppc/syslib/ibm_ocp.c index 3f6e55c79181..2ee176610e7c 100644 --- a/arch/ppc/syslib/ibm_ocp.c +++ b/arch/ppc/syslib/ibm_ocp.c | |||
@@ -1,4 +1,5 @@ | |||
1 | #include <linux/module.h> | 1 | #include <linux/module.h> |
2 | #include <asm/ibm4xx.h> | ||
2 | #include <asm/ocp.h> | 3 | #include <asm/ocp.h> |
3 | 4 | ||
4 | struct ocp_sys_info_data ocp_sys_info = { | 5 | struct ocp_sys_info_data ocp_sys_info = { |
diff --git a/arch/s390/hypfs/hypfs_diag.c b/arch/s390/hypfs/hypfs_diag.c index 2782cf9da5b4..b9a1ce1f28e4 100644 --- a/arch/s390/hypfs/hypfs_diag.c +++ b/arch/s390/hypfs/hypfs_diag.c | |||
@@ -481,9 +481,17 @@ out: | |||
481 | 481 | ||
482 | /* Diagnose 224 functions */ | 482 | /* Diagnose 224 functions */ |
483 | 483 | ||
484 | static void diag224(void *ptr) | 484 | static int diag224(void *ptr) |
485 | { | 485 | { |
486 | asm volatile("diag %0,%1,0x224" : :"d" (0), "d"(ptr) : "memory"); | 486 | int rc = -ENOTSUPP; |
487 | |||
488 | asm volatile( | ||
489 | " diag %1,%2,0x224\n" | ||
490 | "0: lhi %0,0x0\n" | ||
491 | "1:\n" | ||
492 | EX_TABLE(0b,1b) | ||
493 | : "+d" (rc) :"d" (0), "d" (ptr) : "memory"); | ||
494 | return rc; | ||
487 | } | 495 | } |
488 | 496 | ||
489 | static int diag224_get_name_table(void) | 497 | static int diag224_get_name_table(void) |
@@ -492,7 +500,10 @@ static int diag224_get_name_table(void) | |||
492 | diag224_cpu_names = kmalloc(PAGE_SIZE, GFP_KERNEL | GFP_DMA); | 500 | diag224_cpu_names = kmalloc(PAGE_SIZE, GFP_KERNEL | GFP_DMA); |
493 | if (!diag224_cpu_names) | 501 | if (!diag224_cpu_names) |
494 | return -ENOMEM; | 502 | return -ENOMEM; |
495 | diag224(diag224_cpu_names); | 503 | if (diag224(diag224_cpu_names)) { |
504 | kfree(diag224_cpu_names); | ||
505 | return -ENOTSUPP; | ||
506 | } | ||
496 | EBCASC(diag224_cpu_names + 16, (*diag224_cpu_names + 1) * 16); | 507 | EBCASC(diag224_cpu_names + 16, (*diag224_cpu_names + 1) * 16); |
497 | return 0; | 508 | return 0; |
498 | } | 509 | } |
diff --git a/arch/s390/kernel/debug.c b/arch/s390/kernel/debug.c index dca6eaf82c80..1b2f5ce45320 100644 --- a/arch/s390/kernel/debug.c +++ b/arch/s390/kernel/debug.c | |||
@@ -163,7 +163,7 @@ unsigned int debug_feature_version = __DEBUG_FEATURE_VERSION; | |||
163 | 163 | ||
164 | static debug_info_t *debug_area_first = NULL; | 164 | static debug_info_t *debug_area_first = NULL; |
165 | static debug_info_t *debug_area_last = NULL; | 165 | static debug_info_t *debug_area_last = NULL; |
166 | static DECLARE_MUTEX(debug_lock); | 166 | static DEFINE_MUTEX(debug_mutex); |
167 | 167 | ||
168 | static int initialized; | 168 | static int initialized; |
169 | 169 | ||
@@ -576,7 +576,7 @@ debug_input(struct file *file, const char __user *user_buf, size_t length, | |||
576 | int rc = 0; | 576 | int rc = 0; |
577 | file_private_info_t *p_info; | 577 | file_private_info_t *p_info; |
578 | 578 | ||
579 | down(&debug_lock); | 579 | mutex_lock(&debug_mutex); |
580 | p_info = ((file_private_info_t *) file->private_data); | 580 | p_info = ((file_private_info_t *) file->private_data); |
581 | if (p_info->view->input_proc) | 581 | if (p_info->view->input_proc) |
582 | rc = p_info->view->input_proc(p_info->debug_info_org, | 582 | rc = p_info->view->input_proc(p_info->debug_info_org, |
@@ -584,7 +584,7 @@ debug_input(struct file *file, const char __user *user_buf, size_t length, | |||
584 | length, offset); | 584 | length, offset); |
585 | else | 585 | else |
586 | rc = -EPERM; | 586 | rc = -EPERM; |
587 | up(&debug_lock); | 587 | mutex_unlock(&debug_mutex); |
588 | return rc; /* number of input characters */ | 588 | return rc; /* number of input characters */ |
589 | } | 589 | } |
590 | 590 | ||
@@ -602,7 +602,7 @@ debug_open(struct inode *inode, struct file *file) | |||
602 | file_private_info_t *p_info; | 602 | file_private_info_t *p_info; |
603 | debug_info_t *debug_info, *debug_info_snapshot; | 603 | debug_info_t *debug_info, *debug_info_snapshot; |
604 | 604 | ||
605 | down(&debug_lock); | 605 | mutex_lock(&debug_mutex); |
606 | debug_info = file->f_path.dentry->d_inode->i_private; | 606 | debug_info = file->f_path.dentry->d_inode->i_private; |
607 | /* find debug view */ | 607 | /* find debug view */ |
608 | for (i = 0; i < DEBUG_MAX_VIEWS; i++) { | 608 | for (i = 0; i < DEBUG_MAX_VIEWS; i++) { |
@@ -653,7 +653,7 @@ found: | |||
653 | file->private_data = p_info; | 653 | file->private_data = p_info; |
654 | debug_info_get(debug_info); | 654 | debug_info_get(debug_info); |
655 | out: | 655 | out: |
656 | up(&debug_lock); | 656 | mutex_unlock(&debug_mutex); |
657 | return rc; | 657 | return rc; |
658 | } | 658 | } |
659 | 659 | ||
@@ -688,7 +688,7 @@ debug_register (char *name, int pages_per_area, int nr_areas, int buf_size) | |||
688 | 688 | ||
689 | if (!initialized) | 689 | if (!initialized) |
690 | BUG(); | 690 | BUG(); |
691 | down(&debug_lock); | 691 | mutex_lock(&debug_mutex); |
692 | 692 | ||
693 | /* create new debug_info */ | 693 | /* create new debug_info */ |
694 | 694 | ||
@@ -702,7 +702,7 @@ out: | |||
702 | if (!rc){ | 702 | if (!rc){ |
703 | printk(KERN_ERR "debug: debug_register failed for %s\n",name); | 703 | printk(KERN_ERR "debug: debug_register failed for %s\n",name); |
704 | } | 704 | } |
705 | up(&debug_lock); | 705 | mutex_unlock(&debug_mutex); |
706 | return rc; | 706 | return rc; |
707 | } | 707 | } |
708 | 708 | ||
@@ -716,9 +716,9 @@ debug_unregister(debug_info_t * id) | |||
716 | { | 716 | { |
717 | if (!id) | 717 | if (!id) |
718 | goto out; | 718 | goto out; |
719 | down(&debug_lock); | 719 | mutex_lock(&debug_mutex); |
720 | debug_info_put(id); | 720 | debug_info_put(id); |
721 | up(&debug_lock); | 721 | mutex_unlock(&debug_mutex); |
722 | 722 | ||
723 | out: | 723 | out: |
724 | return; | 724 | return; |
@@ -1054,11 +1054,11 @@ __init debug_init(void) | |||
1054 | int rc = 0; | 1054 | int rc = 0; |
1055 | 1055 | ||
1056 | s390dbf_sysctl_header = register_sysctl_table(s390dbf_dir_table); | 1056 | s390dbf_sysctl_header = register_sysctl_table(s390dbf_dir_table); |
1057 | down(&debug_lock); | 1057 | mutex_lock(&debug_mutex); |
1058 | debug_debugfs_root_entry = debugfs_create_dir(DEBUG_DIR_ROOT,NULL); | 1058 | debug_debugfs_root_entry = debugfs_create_dir(DEBUG_DIR_ROOT,NULL); |
1059 | printk(KERN_INFO "debug: Initialization complete\n"); | 1059 | printk(KERN_INFO "debug: Initialization complete\n"); |
1060 | initialized = 1; | 1060 | initialized = 1; |
1061 | up(&debug_lock); | 1061 | mutex_unlock(&debug_mutex); |
1062 | 1062 | ||
1063 | return rc; | 1063 | return rc; |
1064 | } | 1064 | } |
diff --git a/arch/s390/kernel/setup.c b/arch/s390/kernel/setup.c index 6bfb0889eb10..51d6309e7f3b 100644 --- a/arch/s390/kernel/setup.c +++ b/arch/s390/kernel/setup.c | |||
@@ -102,7 +102,7 @@ static struct resource data_resource = { | |||
102 | /* | 102 | /* |
103 | * cpu_init() initializes state that is per-CPU. | 103 | * cpu_init() initializes state that is per-CPU. |
104 | */ | 104 | */ |
105 | void __devinit cpu_init (void) | 105 | void __cpuinit cpu_init(void) |
106 | { | 106 | { |
107 | int addr = hard_smp_processor_id(); | 107 | int addr = hard_smp_processor_id(); |
108 | 108 | ||
@@ -915,7 +915,7 @@ setup_arch(char **cmdline_p) | |||
915 | setup_zfcpdump(console_devno); | 915 | setup_zfcpdump(console_devno); |
916 | } | 916 | } |
917 | 917 | ||
918 | void print_cpu_info(struct cpuinfo_S390 *cpuinfo) | 918 | void __cpuinit print_cpu_info(struct cpuinfo_S390 *cpuinfo) |
919 | { | 919 | { |
920 | printk("cpu %d " | 920 | printk("cpu %d " |
921 | #ifdef CONFIG_SMP | 921 | #ifdef CONFIG_SMP |
diff --git a/arch/s390/kernel/smp.c b/arch/s390/kernel/smp.c index 09f028a3266b..8ff2feaf9b00 100644 --- a/arch/s390/kernel/smp.c +++ b/arch/s390/kernel/smp.c | |||
@@ -492,7 +492,7 @@ static unsigned int __init smp_count_cpus(void) | |||
492 | /* | 492 | /* |
493 | * Activate a secondary processor. | 493 | * Activate a secondary processor. |
494 | */ | 494 | */ |
495 | int __devinit start_secondary(void *cpuvoid) | 495 | int __cpuinit start_secondary(void *cpuvoid) |
496 | { | 496 | { |
497 | /* Setup the cpu */ | 497 | /* Setup the cpu */ |
498 | cpu_init(); | 498 | cpu_init(); |
@@ -741,7 +741,7 @@ void __init smp_prepare_cpus(unsigned int max_cpus) | |||
741 | smp_create_idle(cpu); | 741 | smp_create_idle(cpu); |
742 | } | 742 | } |
743 | 743 | ||
744 | void __devinit smp_prepare_boot_cpu(void) | 744 | void __init smp_prepare_boot_cpu(void) |
745 | { | 745 | { |
746 | BUG_ON(smp_processor_id() != 0); | 746 | BUG_ON(smp_processor_id() != 0); |
747 | 747 | ||
@@ -750,7 +750,7 @@ void __devinit smp_prepare_boot_cpu(void) | |||
750 | current_set[0] = current; | 750 | current_set[0] = current; |
751 | } | 751 | } |
752 | 752 | ||
753 | void smp_cpus_done(unsigned int max_cpus) | 753 | void __init smp_cpus_done(unsigned int max_cpus) |
754 | { | 754 | { |
755 | cpu_present_map = cpu_possible_map; | 755 | cpu_present_map = cpu_possible_map; |
756 | } | 756 | } |
diff --git a/arch/sh/Makefile b/arch/sh/Makefile index 7b1122417050..883b03b040c4 100644 --- a/arch/sh/Makefile +++ b/arch/sh/Makefile | |||
@@ -39,7 +39,7 @@ cflags-$(CONFIG_CPU_SH2A) := -m2a $(call cc-option,-m2a-nofpu,) | |||
39 | cflags-$(CONFIG_CPU_SH3) := -m3 | 39 | cflags-$(CONFIG_CPU_SH3) := -m3 |
40 | cflags-$(CONFIG_CPU_SH4) := -m4 \ | 40 | cflags-$(CONFIG_CPU_SH4) := -m4 \ |
41 | $(call cc-option,-mno-implicit-fp,-m4-nofpu) | 41 | $(call cc-option,-mno-implicit-fp,-m4-nofpu) |
42 | cflags-$(CONFIG_CPU_SH4A) := -m4a $(call cc-option,-m4a-nofpu,) | 42 | cflags-$(CONFIG_CPU_SH4A) := $(call cc-option,-m4a,) $(call cc-option,-m4a-nofpu,) |
43 | 43 | ||
44 | cflags-$(CONFIG_CPU_BIG_ENDIAN) += -mb | 44 | cflags-$(CONFIG_CPU_BIG_ENDIAN) += -mb |
45 | cflags-$(CONFIG_CPU_LITTLE_ENDIAN) += -ml | 45 | cflags-$(CONFIG_CPU_LITTLE_ENDIAN) += -ml |
diff --git a/arch/sh/drivers/dma/dma-api.c b/arch/sh/drivers/dma/dma-api.c index 8057a27a1bc6..cf8e11994330 100644 --- a/arch/sh/drivers/dma/dma-api.c +++ b/arch/sh/drivers/dma/dma-api.c | |||
@@ -16,6 +16,7 @@ | |||
16 | #include <linux/list.h> | 16 | #include <linux/list.h> |
17 | #include <linux/platform_device.h> | 17 | #include <linux/platform_device.h> |
18 | #include <linux/mm.h> | 18 | #include <linux/mm.h> |
19 | #include <linux/sched.h> | ||
19 | #include <asm/dma.h> | 20 | #include <asm/dma.h> |
20 | 21 | ||
21 | DEFINE_SPINLOCK(dma_spin_lock); | 22 | DEFINE_SPINLOCK(dma_spin_lock); |
diff --git a/arch/sh/kernel/cf-enabler.c b/arch/sh/kernel/cf-enabler.c index 849a9e191391..ebc73b85094a 100644 --- a/arch/sh/kernel/cf-enabler.c +++ b/arch/sh/kernel/cf-enabler.c | |||
@@ -12,6 +12,7 @@ | |||
12 | #include <linux/init.h> | 12 | #include <linux/init.h> |
13 | #include <linux/mm.h> | 13 | #include <linux/mm.h> |
14 | #include <linux/vmalloc.h> | 14 | #include <linux/vmalloc.h> |
15 | #include <linux/interrupt.h> | ||
15 | #include <asm/io.h> | 16 | #include <asm/io.h> |
16 | #include <asm/irq.h> | 17 | #include <asm/irq.h> |
17 | 18 | ||
@@ -149,6 +150,11 @@ static int __init cf_init_se(void) | |||
149 | ctrl_outb(0x42, PA_MRSHPC_MW2 + 0x200); | 150 | ctrl_outb(0x42, PA_MRSHPC_MW2 + 0x200); |
150 | return 0; | 151 | return 0; |
151 | } | 152 | } |
153 | #else | ||
154 | static int __init cf_init_se(void) | ||
155 | { | ||
156 | return -1; | ||
157 | } | ||
152 | #endif | 158 | #endif |
153 | 159 | ||
154 | int __init cf_init(void) | 160 | int __init cf_init(void) |
diff --git a/arch/sh/kernel/cpu/sh3/entry.S b/arch/sh/kernel/cpu/sh3/entry.S index 832c0b4a1e6c..659cc081e5e7 100644 --- a/arch/sh/kernel/cpu/sh3/entry.S +++ b/arch/sh/kernel/cpu/sh3/entry.S | |||
@@ -320,6 +320,7 @@ skip_restore: | |||
320 | 320 | ||
321 | .align 2 | 321 | .align 2 |
322 | 5: .long 0x00001000 ! DSP | 322 | 5: .long 0x00001000 ! DSP |
323 | 6: .long in_nmi | ||
323 | 7: .long 0x30000000 | 324 | 7: .long 0x30000000 |
324 | 325 | ||
325 | ! common exception handler | 326 | ! common exception handler |
diff --git a/arch/sh/kernel/cpu/sh4/probe.c b/arch/sh/kernel/cpu/sh4/probe.c index 8cd04904c77a..fab2eb07196b 100644 --- a/arch/sh/kernel/cpu/sh4/probe.c +++ b/arch/sh/kernel/cpu/sh4/probe.c | |||
@@ -12,6 +12,7 @@ | |||
12 | */ | 12 | */ |
13 | #include <linux/init.h> | 13 | #include <linux/init.h> |
14 | #include <linux/io.h> | 14 | #include <linux/io.h> |
15 | #include <linux/smp.h> | ||
15 | #include <asm/processor.h> | 16 | #include <asm/processor.h> |
16 | #include <asm/cache.h> | 17 | #include <asm/cache.h> |
17 | 18 | ||
diff --git a/arch/sh/kernel/smp.c b/arch/sh/kernel/smp.c index dbebaddcfe39..283e1425ced5 100644 --- a/arch/sh/kernel/smp.c +++ b/arch/sh/kernel/smp.c | |||
@@ -10,6 +10,8 @@ | |||
10 | * Free Software Foundation; either version 2 of the License, or (at your | 10 | * Free Software Foundation; either version 2 of the License, or (at your |
11 | * option) any later version. | 11 | * option) any later version. |
12 | */ | 12 | */ |
13 | |||
14 | #include <linux/err.h> | ||
13 | #include <linux/cache.h> | 15 | #include <linux/cache.h> |
14 | #include <linux/cpumask.h> | 16 | #include <linux/cpumask.h> |
15 | #include <linux/delay.h> | 17 | #include <linux/delay.h> |
diff --git a/arch/sh/kernel/timers/timer.c b/arch/sh/kernel/timers/timer.c index a6bcc913d25e..4e7e747d1b69 100644 --- a/arch/sh/kernel/timers/timer.c +++ b/arch/sh/kernel/timers/timer.c | |||
@@ -13,7 +13,7 @@ | |||
13 | #include <linux/string.h> | 13 | #include <linux/string.h> |
14 | #include <asm/timer.h> | 14 | #include <asm/timer.h> |
15 | 15 | ||
16 | static struct sys_timer *sys_timers[] __initdata = { | 16 | static struct sys_timer *sys_timers[] = { |
17 | #ifdef CONFIG_SH_TMU | 17 | #ifdef CONFIG_SH_TMU |
18 | &tmu_timer, | 18 | &tmu_timer, |
19 | #endif | 19 | #endif |
@@ -26,7 +26,7 @@ static struct sys_timer *sys_timers[] __initdata = { | |||
26 | NULL, | 26 | NULL, |
27 | }; | 27 | }; |
28 | 28 | ||
29 | static char timer_override[10] __initdata; | 29 | static char timer_override[10]; |
30 | static int __init timer_setup(char *str) | 30 | static int __init timer_setup(char *str) |
31 | { | 31 | { |
32 | if (str) | 32 | if (str) |
@@ -53,4 +53,3 @@ struct sys_timer *get_sys_timer(void) | |||
53 | 53 | ||
54 | return NULL; | 54 | return NULL; |
55 | } | 55 | } |
56 | |||
diff --git a/arch/sh/kernel/vsyscall/vsyscall.c b/arch/sh/kernel/vsyscall/vsyscall.c index e146bafcd14f..2aa9438361bc 100644 --- a/arch/sh/kernel/vsyscall/vsyscall.c +++ b/arch/sh/kernel/vsyscall/vsyscall.c | |||
@@ -17,6 +17,7 @@ | |||
17 | #include <linux/gfp.h> | 17 | #include <linux/gfp.h> |
18 | #include <linux/module.h> | 18 | #include <linux/module.h> |
19 | #include <linux/elf.h> | 19 | #include <linux/elf.h> |
20 | #include <linux/sched.h> | ||
20 | 21 | ||
21 | /* | 22 | /* |
22 | * Should the kernel map a VDSO page into processes and pass its | 23 | * Should the kernel map a VDSO page into processes and pass its |
diff --git a/arch/sparc/lib/atomic32.c b/arch/sparc/lib/atomic32.c index 617d29832e19..cbddeb38ffda 100644 --- a/arch/sparc/lib/atomic32.c +++ b/arch/sparc/lib/atomic32.c | |||
@@ -124,10 +124,10 @@ unsigned long __cmpxchg_u32(volatile u32 *ptr, u32 old, u32 new) | |||
124 | unsigned long flags; | 124 | unsigned long flags; |
125 | u32 prev; | 125 | u32 prev; |
126 | 126 | ||
127 | spin_lock_irqsave(ATOMIC_HASH(addr), flags); | 127 | spin_lock_irqsave(ATOMIC_HASH(ptr), flags); |
128 | if ((prev = *ptr) == old) | 128 | if ((prev = *ptr) == old) |
129 | *ptr = new; | 129 | *ptr = new; |
130 | spin_unlock_irqrestore(ATOMIC_HASH(addr), flags); | 130 | spin_unlock_irqrestore(ATOMIC_HASH(ptr), flags); |
131 | 131 | ||
132 | return (unsigned long)prev; | 132 | return (unsigned long)prev; |
133 | } | 133 | } |
diff --git a/arch/sparc64/kernel/entry.S b/arch/sparc64/kernel/entry.S index 8f10dda0f5c0..ed712e0b3372 100644 --- a/arch/sparc64/kernel/entry.S +++ b/arch/sparc64/kernel/entry.S | |||
@@ -2498,3 +2498,75 @@ sun4v_vintr_set_target: | |||
2498 | retl | 2498 | retl |
2499 | nop | 2499 | nop |
2500 | .size sun4v_vintr_set_target, .-sun4v_vintr_set_target | 2500 | .size sun4v_vintr_set_target, .-sun4v_vintr_set_target |
2501 | |||
2502 | /* %o0: NCS sub-function | ||
2503 | * %o1: sub-function arg real-address | ||
2504 | * %o2: sub-function arg size | ||
2505 | * | ||
2506 | * returns %o0: status | ||
2507 | */ | ||
2508 | .globl sun4v_ncs_request | ||
2509 | .type sun4v_ncs_request,#function | ||
2510 | sun4v_ncs_request: | ||
2511 | mov HV_FAST_NCS_REQUEST, %o5 | ||
2512 | ta HV_FAST_TRAP | ||
2513 | retl | ||
2514 | nop | ||
2515 | .size sun4v_ncs_request, .-sun4v_ncs_request | ||
2516 | |||
2517 | .globl sun4v_scv_send | ||
2518 | .type sun4v_scv_send,#function | ||
2519 | sun4v_scv_send: | ||
2520 | save %sp, -192, %sp | ||
2521 | mov %i0, %o0 | ||
2522 | mov %i1, %o1 | ||
2523 | mov %i2, %o2 | ||
2524 | mov HV_FAST_SVC_SEND, %o5 | ||
2525 | ta HV_FAST_TRAP | ||
2526 | stx %o1, [%i3] | ||
2527 | ret | ||
2528 | restore | ||
2529 | .size sun4v_scv_send, .-sun4v_scv_send | ||
2530 | |||
2531 | .globl sun4v_scv_recv | ||
2532 | .type sun4v_scv_recv,#function | ||
2533 | sun4v_scv_recv: | ||
2534 | save %sp, -192, %sp | ||
2535 | mov %i0, %o0 | ||
2536 | mov %i1, %o1 | ||
2537 | mov %i2, %o2 | ||
2538 | mov HV_FAST_SVC_RECV, %o5 | ||
2539 | ta HV_FAST_TRAP | ||
2540 | stx %o1, [%i3] | ||
2541 | ret | ||
2542 | restore | ||
2543 | .size sun4v_scv_recv, .-sun4v_scv_recv | ||
2544 | |||
2545 | .globl sun4v_scv_getstatus | ||
2546 | .type sun4v_scv_getstatus,#function | ||
2547 | sun4v_scv_getstatus: | ||
2548 | mov HV_FAST_SVC_GETSTATUS, %o5 | ||
2549 | mov %o1, %o4 | ||
2550 | ta HV_FAST_TRAP | ||
2551 | stx %o1, [%o4] | ||
2552 | retl | ||
2553 | nop | ||
2554 | .size sun4v_scv_getstatus, .-sun4v_scv_getstatus | ||
2555 | |||
2556 | .globl sun4v_scv_setstatus | ||
2557 | .type sun4v_scv_setstatus,#function | ||
2558 | sun4v_scv_setstatus: | ||
2559 | mov HV_FAST_SVC_SETSTATUS, %o5 | ||
2560 | ta HV_FAST_TRAP | ||
2561 | retl | ||
2562 | nop | ||
2563 | .size sun4v_scv_setstatus, .-sun4v_scv_setstatus | ||
2564 | |||
2565 | .globl sun4v_scv_clrstatus | ||
2566 | .type sun4v_scv_clrstatus,#function | ||
2567 | sun4v_scv_clrstatus: | ||
2568 | mov HV_FAST_SVC_CLRSTATUS, %o5 | ||
2569 | ta HV_FAST_TRAP | ||
2570 | retl | ||
2571 | nop | ||
2572 | .size sun4v_scv_clrstatus, .-sun4v_scv_clrstatus | ||
diff --git a/arch/sparc64/kernel/vmlinux.lds.S b/arch/sparc64/kernel/vmlinux.lds.S index fb648de18a8d..3ad10f3027e4 100644 --- a/arch/sparc64/kernel/vmlinux.lds.S +++ b/arch/sparc64/kernel/vmlinux.lds.S | |||
@@ -1,5 +1,6 @@ | |||
1 | /* ld script to make UltraLinux kernel */ | 1 | /* ld script to make UltraLinux kernel */ |
2 | 2 | ||
3 | #include <asm/page.h> | ||
3 | #include <asm-generic/vmlinux.lds.h> | 4 | #include <asm-generic/vmlinux.lds.h> |
4 | 5 | ||
5 | OUTPUT_FORMAT("elf64-sparc", "elf64-sparc", "elf64-sparc") | 6 | OUTPUT_FORMAT("elf64-sparc", "elf64-sparc", "elf64-sparc") |
@@ -23,7 +24,7 @@ SECTIONS | |||
23 | _etext = .; | 24 | _etext = .; |
24 | PROVIDE (etext = .); | 25 | PROVIDE (etext = .); |
25 | 26 | ||
26 | RODATA | 27 | RO_DATA(PAGE_SIZE) |
27 | 28 | ||
28 | .data : | 29 | .data : |
29 | { | 30 | { |
@@ -44,7 +45,7 @@ SECTIONS | |||
44 | __ex_table : { *(__ex_table) } | 45 | __ex_table : { *(__ex_table) } |
45 | __stop___ex_table = .; | 46 | __stop___ex_table = .; |
46 | 47 | ||
47 | . = ALIGN(8192); | 48 | . = ALIGN(PAGE_SIZE); |
48 | __init_begin = .; | 49 | __init_begin = .; |
49 | .init.text : { | 50 | .init.text : { |
50 | _sinittext = .; | 51 | _sinittext = .; |
@@ -83,17 +84,17 @@ SECTIONS | |||
83 | __sun4v_2insn_patch_end = .; | 84 | __sun4v_2insn_patch_end = .; |
84 | 85 | ||
85 | #ifdef CONFIG_BLK_DEV_INITRD | 86 | #ifdef CONFIG_BLK_DEV_INITRD |
86 | . = ALIGN(8192); | 87 | . = ALIGN(PAGE_SIZE); |
87 | __initramfs_start = .; | 88 | __initramfs_start = .; |
88 | .init.ramfs : { *(.init.ramfs) } | 89 | .init.ramfs : { *(.init.ramfs) } |
89 | __initramfs_end = .; | 90 | __initramfs_end = .; |
90 | #endif | 91 | #endif |
91 | 92 | ||
92 | . = ALIGN(8192); | 93 | . = ALIGN(PAGE_SIZE); |
93 | __per_cpu_start = .; | 94 | __per_cpu_start = .; |
94 | .data.percpu : { *(.data.percpu) } | 95 | .data.percpu : { *(.data.percpu) } |
95 | __per_cpu_end = .; | 96 | __per_cpu_end = .; |
96 | . = ALIGN(8192); | 97 | . = ALIGN(PAGE_SIZE); |
97 | __init_end = .; | 98 | __init_end = .; |
98 | __bss_start = .; | 99 | __bss_start = .; |
99 | .sbss : { *(.sbss) *(.scommon) } | 100 | .sbss : { *(.sbss) *(.scommon) } |
diff --git a/arch/x86_64/mm/init.c b/arch/x86_64/mm/init.c index 1336da8bdee1..1ad5111aec38 100644 --- a/arch/x86_64/mm/init.c +++ b/arch/x86_64/mm/init.c | |||
@@ -761,3 +761,9 @@ int in_gate_area_no_task(unsigned long addr) | |||
761 | { | 761 | { |
762 | return (addr >= VSYSCALL_START) && (addr < VSYSCALL_END); | 762 | return (addr >= VSYSCALL_START) && (addr < VSYSCALL_END); |
763 | } | 763 | } |
764 | |||
765 | void *alloc_bootmem_high_node(pg_data_t *pgdat, unsigned long size) | ||
766 | { | ||
767 | return __alloc_bootmem_core(pgdat->bdata, size, | ||
768 | SMP_CACHE_BYTES, (4UL*1024*1024*1024), 0); | ||
769 | } | ||
diff --git a/crypto/cryptd.c b/crypto/cryptd.c index 3ff4e1f0f032..ac6dce2e7596 100644 --- a/crypto/cryptd.c +++ b/crypto/cryptd.c | |||
@@ -298,7 +298,7 @@ static inline int cryptd_create_thread(struct cryptd_state *state, | |||
298 | mutex_init(&state->mutex); | 298 | mutex_init(&state->mutex); |
299 | crypto_init_queue(&state->queue, CRYPTD_MAX_QLEN); | 299 | crypto_init_queue(&state->queue, CRYPTD_MAX_QLEN); |
300 | 300 | ||
301 | state->task = kthread_create(fn, state, name); | 301 | state->task = kthread_run(fn, state, name); |
302 | if (IS_ERR(state->task)) | 302 | if (IS_ERR(state->task)) |
303 | return PTR_ERR(state->task); | 303 | return PTR_ERR(state->task); |
304 | 304 | ||
@@ -316,6 +316,8 @@ static int cryptd_thread(void *data) | |||
316 | struct cryptd_state *state = data; | 316 | struct cryptd_state *state = data; |
317 | int stop; | 317 | int stop; |
318 | 318 | ||
319 | current->flags |= PF_NOFREEZE; | ||
320 | |||
319 | do { | 321 | do { |
320 | struct crypto_async_request *req, *backlog; | 322 | struct crypto_async_request *req, *backlog; |
321 | 323 | ||
diff --git a/drivers/acpi/asus_acpi.c b/drivers/acpi/asus_acpi.c index b770deab968c..6d7d4157e049 100644 --- a/drivers/acpi/asus_acpi.c +++ b/drivers/acpi/asus_acpi.c | |||
@@ -1357,7 +1357,7 @@ static struct backlight_ops asus_backlight_data = { | |||
1357 | .update_status = set_brightness_status, | 1357 | .update_status = set_brightness_status, |
1358 | }; | 1358 | }; |
1359 | 1359 | ||
1360 | static void __exit asus_acpi_exit(void) | 1360 | static void asus_acpi_exit(void) |
1361 | { | 1361 | { |
1362 | if (asus_backlight_device) | 1362 | if (asus_backlight_device) |
1363 | backlight_device_unregister(asus_backlight_device); | 1363 | backlight_device_unregister(asus_backlight_device); |
diff --git a/drivers/acpi/numa.c b/drivers/acpi/numa.c index a2efae8a4c4e..0c9f15c54e8c 100644 --- a/drivers/acpi/numa.c +++ b/drivers/acpi/numa.c | |||
@@ -59,7 +59,7 @@ int node_to_pxm(int node) | |||
59 | return node_to_pxm_map[node]; | 59 | return node_to_pxm_map[node]; |
60 | } | 60 | } |
61 | 61 | ||
62 | int __cpuinit acpi_map_pxm_to_node(int pxm) | 62 | int acpi_map_pxm_to_node(int pxm) |
63 | { | 63 | { |
64 | int node = pxm_to_node_map[pxm]; | 64 | int node = pxm_to_node_map[pxm]; |
65 | 65 | ||
diff --git a/drivers/acpi/osl.c b/drivers/acpi/osl.c index b998340e23d4..58ceb18ec997 100644 --- a/drivers/acpi/osl.c +++ b/drivers/acpi/osl.c | |||
@@ -33,6 +33,7 @@ | |||
33 | #include <linux/interrupt.h> | 33 | #include <linux/interrupt.h> |
34 | #include <linux/kmod.h> | 34 | #include <linux/kmod.h> |
35 | #include <linux/delay.h> | 35 | #include <linux/delay.h> |
36 | #include <linux/dmi.h> | ||
36 | #include <linux/workqueue.h> | 37 | #include <linux/workqueue.h> |
37 | #include <linux/nmi.h> | 38 | #include <linux/nmi.h> |
38 | #include <linux/acpi.h> | 39 | #include <linux/acpi.h> |
@@ -73,6 +74,21 @@ static void *acpi_irq_context; | |||
73 | static struct workqueue_struct *kacpid_wq; | 74 | static struct workqueue_struct *kacpid_wq; |
74 | static struct workqueue_struct *kacpi_notify_wq; | 75 | static struct workqueue_struct *kacpi_notify_wq; |
75 | 76 | ||
77 | #define OSI_STRING_LENGTH_MAX 64 /* arbitrary */ | ||
78 | static char osi_additional_string[OSI_STRING_LENGTH_MAX]; | ||
79 | |||
80 | #define OSI_LINUX_ENABLED | ||
81 | #ifdef OSI_LINUX_ENABLED | ||
82 | int osi_linux = 1; /* enable _OSI(Linux) by default */ | ||
83 | #else | ||
84 | int osi_linux; /* disable _OSI(Linux) by default */ | ||
85 | #endif | ||
86 | |||
87 | |||
88 | #ifdef CONFIG_DMI | ||
89 | static struct __initdata dmi_system_id acpi_osl_dmi_table[]; | ||
90 | #endif | ||
91 | |||
76 | static void __init acpi_request_region (struct acpi_generic_address *addr, | 92 | static void __init acpi_request_region (struct acpi_generic_address *addr, |
77 | unsigned int length, char *desc) | 93 | unsigned int length, char *desc) |
78 | { | 94 | { |
@@ -121,8 +137,9 @@ static int __init acpi_reserve_resources(void) | |||
121 | } | 137 | } |
122 | device_initcall(acpi_reserve_resources); | 138 | device_initcall(acpi_reserve_resources); |
123 | 139 | ||
124 | acpi_status acpi_os_initialize(void) | 140 | acpi_status __init acpi_os_initialize(void) |
125 | { | 141 | { |
142 | dmi_check_system(acpi_osl_dmi_table); | ||
126 | return AE_OK; | 143 | return AE_OK; |
127 | } | 144 | } |
128 | 145 | ||
@@ -960,20 +977,38 @@ static int __init acpi_os_name_setup(char *str) | |||
960 | 977 | ||
961 | __setup("acpi_os_name=", acpi_os_name_setup); | 978 | __setup("acpi_os_name=", acpi_os_name_setup); |
962 | 979 | ||
980 | static void enable_osi_linux(int enable) { | ||
981 | |||
982 | if (osi_linux != enable) | ||
983 | printk(KERN_INFO PREFIX "%sabled _OSI(Linux)\n", | ||
984 | enable ? "En": "Dis"); | ||
985 | |||
986 | osi_linux = enable; | ||
987 | return; | ||
988 | } | ||
989 | |||
963 | /* | 990 | /* |
964 | * _OSI control | 991 | * Modify the list of "OS Interfaces" reported to BIOS via _OSI |
992 | * | ||
965 | * empty string disables _OSI | 993 | * empty string disables _OSI |
966 | * TBD additional string adds to _OSI | 994 | * string starting with '!' disables that string |
995 | * otherwise string is added to list, augmenting built-in strings | ||
967 | */ | 996 | */ |
968 | static int __init acpi_osi_setup(char *str) | 997 | static int __init acpi_osi_setup(char *str) |
969 | { | 998 | { |
970 | if (str == NULL || *str == '\0') { | 999 | if (str == NULL || *str == '\0') { |
971 | printk(KERN_INFO PREFIX "_OSI method disabled\n"); | 1000 | printk(KERN_INFO PREFIX "_OSI method disabled\n"); |
972 | acpi_gbl_create_osi_method = FALSE; | 1001 | acpi_gbl_create_osi_method = FALSE; |
973 | } else { | 1002 | } else if (*str == '!') { |
974 | /* TBD */ | 1003 | if (acpi_osi_invalidate(++str) == AE_OK) |
975 | printk(KERN_ERR PREFIX "_OSI additional string ignored -- %s\n", | 1004 | printk(KERN_INFO PREFIX "Deleted _OSI(%s)\n", str); |
976 | str); | 1005 | } else if (!strcmp("!Linux", str)) { |
1006 | enable_osi_linux(0); | ||
1007 | } else if (!strcmp("Linux", str)) { | ||
1008 | enable_osi_linux(1); | ||
1009 | } else if (*osi_additional_string == '\0') { | ||
1010 | strncpy(osi_additional_string, str, OSI_STRING_LENGTH_MAX); | ||
1011 | printk(KERN_INFO PREFIX "Added _OSI(%s)\n", str); | ||
977 | } | 1012 | } |
978 | 1013 | ||
979 | return 1; | 1014 | return 1; |
@@ -1143,11 +1178,28 @@ acpi_status acpi_os_release_object(acpi_cache_t * cache, void *object) | |||
1143 | acpi_status | 1178 | acpi_status |
1144 | acpi_os_validate_interface (char *interface) | 1179 | acpi_os_validate_interface (char *interface) |
1145 | { | 1180 | { |
1146 | 1181 | if (!strncmp(osi_additional_string, interface, OSI_STRING_LENGTH_MAX)) | |
1147 | return AE_SUPPORT; | 1182 | return AE_OK; |
1183 | if (!strcmp("Linux", interface)) { | ||
1184 | printk(KERN_WARNING PREFIX | ||
1185 | "System BIOS is requesting _OSI(Linux)\n"); | ||
1186 | #ifdef OSI_LINUX_ENABLED | ||
1187 | printk(KERN_WARNING PREFIX | ||
1188 | "Please test with \"acpi_osi=!Linux\"\n" | ||
1189 | "Please send dmidecode " | ||
1190 | "to linux-acpi@vger.kernel.org\n"); | ||
1191 | #else | ||
1192 | printk(KERN_WARNING PREFIX | ||
1193 | "If \"acpi_osi=Linux\" works better,\n" | ||
1194 | "Please send dmidecode " | ||
1195 | "to linux-acpi@vger.kernel.org\n"); | ||
1196 | #endif | ||
1197 | if(osi_linux) | ||
1198 | return AE_OK; | ||
1199 | } | ||
1200 | return AE_SUPPORT; | ||
1148 | } | 1201 | } |
1149 | 1202 | ||
1150 | |||
1151 | /****************************************************************************** | 1203 | /****************************************************************************** |
1152 | * | 1204 | * |
1153 | * FUNCTION: acpi_os_validate_address | 1205 | * FUNCTION: acpi_os_validate_address |
@@ -1174,5 +1226,51 @@ acpi_os_validate_address ( | |||
1174 | return AE_OK; | 1226 | return AE_OK; |
1175 | } | 1227 | } |
1176 | 1228 | ||
1229 | #ifdef CONFIG_DMI | ||
1230 | #ifdef OSI_LINUX_ENABLED | ||
1231 | static int dmi_osi_not_linux(struct dmi_system_id *d) | ||
1232 | { | ||
1233 | printk(KERN_NOTICE "%s detected: requires not _OSI(Linux)\n", d->ident); | ||
1234 | enable_osi_linux(0); | ||
1235 | return 0; | ||
1236 | } | ||
1237 | #else | ||
1238 | static int dmi_osi_linux(struct dmi_system_id *d) | ||
1239 | { | ||
1240 | printk(KERN_NOTICE "%s detected: requires _OSI(Linux)\n", d->ident); | ||
1241 | enable_osi_linux(1); | ||
1242 | return 0; | ||
1243 | } | ||
1244 | #endif | ||
1245 | |||
1246 | static struct dmi_system_id acpi_osl_dmi_table[] __initdata = { | ||
1247 | #ifdef OSI_LINUX_ENABLED | ||
1248 | /* | ||
1249 | * Boxes that need NOT _OSI(Linux) | ||
1250 | */ | ||
1251 | { | ||
1252 | .callback = dmi_osi_not_linux, | ||
1253 | .ident = "Toshiba Satellite P100", | ||
1254 | .matches = { | ||
1255 | DMI_MATCH(DMI_BOARD_VENDOR, "TOSHIBA"), | ||
1256 | DMI_MATCH(DMI_BOARD_NAME, "Satellite P100"), | ||
1257 | }, | ||
1258 | }, | ||
1259 | #else | ||
1260 | /* | ||
1261 | * Boxes that need _OSI(Linux) | ||
1262 | */ | ||
1263 | { | ||
1264 | .callback = dmi_osi_linux, | ||
1265 | .ident = "Intel Napa CRB", | ||
1266 | .matches = { | ||
1267 | DMI_MATCH(DMI_BOARD_VENDOR, "Intel Corporation"), | ||
1268 | DMI_MATCH(DMI_BOARD_NAME, "MPAD-MSAE Customer Reference Boards"), | ||
1269 | }, | ||
1270 | }, | ||
1271 | #endif | ||
1272 | {} | ||
1273 | }; | ||
1274 | #endif /* CONFIG_DMI */ | ||
1177 | 1275 | ||
1178 | #endif | 1276 | #endif |
diff --git a/drivers/acpi/tables/tbinstal.c b/drivers/acpi/tables/tbinstal.c index 0e7b121a99ce..3bc0c67a9283 100644 --- a/drivers/acpi/tables/tbinstal.c +++ b/drivers/acpi/tables/tbinstal.c | |||
@@ -123,14 +123,14 @@ acpi_tb_add_table(struct acpi_table_desc *table_desc, | |||
123 | } | 123 | } |
124 | } | 124 | } |
125 | 125 | ||
126 | /* The table must be either an SSDT or a PSDT */ | 126 | /* The table must be either an SSDT or a PSDT or an OEMx */ |
127 | 127 | ||
128 | if ((!ACPI_COMPARE_NAME(table_desc->pointer->signature, ACPI_SIG_PSDT)) | 128 | if ((!ACPI_COMPARE_NAME(table_desc->pointer->signature, ACPI_SIG_PSDT)) |
129 | && | 129 | && |
130 | (!ACPI_COMPARE_NAME(table_desc->pointer->signature, ACPI_SIG_SSDT))) | 130 | (!ACPI_COMPARE_NAME(table_desc->pointer->signature, ACPI_SIG_SSDT)) |
131 | { | 131 | && (strncmp(table_desc->pointer->signature, "OEM", 3))) { |
132 | ACPI_ERROR((AE_INFO, | 132 | ACPI_ERROR((AE_INFO, |
133 | "Table has invalid signature [%4.4s], must be SSDT or PSDT", | 133 | "Table has invalid signature [%4.4s], must be SSDT, PSDT or OEMx", |
134 | table_desc->pointer->signature)); | 134 | table_desc->pointer->signature)); |
135 | return_ACPI_STATUS(AE_BAD_SIGNATURE); | 135 | return_ACPI_STATUS(AE_BAD_SIGNATURE); |
136 | } | 136 | } |
diff --git a/drivers/acpi/thermal.c b/drivers/acpi/thermal.c index 1ada017d01ef..194ecfe8b360 100644 --- a/drivers/acpi/thermal.c +++ b/drivers/acpi/thermal.c | |||
@@ -827,6 +827,7 @@ static int acpi_thermal_temp_open_fs(struct inode *inode, struct file *file) | |||
827 | static int acpi_thermal_trip_seq_show(struct seq_file *seq, void *offset) | 827 | static int acpi_thermal_trip_seq_show(struct seq_file *seq, void *offset) |
828 | { | 828 | { |
829 | struct acpi_thermal *tz = seq->private; | 829 | struct acpi_thermal *tz = seq->private; |
830 | struct acpi_device *device; | ||
830 | int i = 0; | 831 | int i = 0; |
831 | int j = 0; | 832 | int j = 0; |
832 | 833 | ||
@@ -849,9 +850,8 @@ static int acpi_thermal_trip_seq_show(struct seq_file *seq, void *offset) | |||
849 | tz->trips.passive.tc1, tz->trips.passive.tc2, | 850 | tz->trips.passive.tc1, tz->trips.passive.tc2, |
850 | tz->trips.passive.tsp); | 851 | tz->trips.passive.tsp); |
851 | for (j = 0; j < tz->trips.passive.devices.count; j++) { | 852 | for (j = 0; j < tz->trips.passive.devices.count; j++) { |
852 | 853 | acpi_bus_get_device(tz->trips.passive.devices.handles[j], &device); | |
853 | seq_printf(seq, "0x%p ", | 854 | seq_printf(seq, "%4.4s ", acpi_device_bid(device)); |
854 | tz->trips.passive.devices.handles[j]); | ||
855 | } | 855 | } |
856 | seq_puts(seq, "\n"); | 856 | seq_puts(seq, "\n"); |
857 | } | 857 | } |
@@ -862,9 +862,10 @@ static int acpi_thermal_trip_seq_show(struct seq_file *seq, void *offset) | |||
862 | seq_printf(seq, "active[%d]: %ld C: devices=", | 862 | seq_printf(seq, "active[%d]: %ld C: devices=", |
863 | i, | 863 | i, |
864 | KELVIN_TO_CELSIUS(tz->trips.active[i].temperature)); | 864 | KELVIN_TO_CELSIUS(tz->trips.active[i].temperature)); |
865 | for (j = 0; j < tz->trips.active[i].devices.count; j++) | 865 | for (j = 0; j < tz->trips.active[i].devices.count; j++){ |
866 | seq_printf(seq, "0x%p ", | 866 | acpi_bus_get_device(tz->trips.active[i].devices.handles[j], &device); |
867 | tz->trips.active[i].devices.handles[j]); | 867 | seq_printf(seq, "%4.4s ", acpi_device_bid(device)); |
868 | } | ||
868 | seq_puts(seq, "\n"); | 869 | seq_puts(seq, "\n"); |
869 | } | 870 | } |
870 | 871 | ||
diff --git a/drivers/acpi/toshiba_acpi.c b/drivers/acpi/toshiba_acpi.c index 3906d47b9783..1cfbecb0ac10 100644 --- a/drivers/acpi/toshiba_acpi.c +++ b/drivers/acpi/toshiba_acpi.c | |||
@@ -538,7 +538,7 @@ static struct backlight_ops toshiba_backlight_data = { | |||
538 | .update_status = set_lcd_status, | 538 | .update_status = set_lcd_status, |
539 | }; | 539 | }; |
540 | 540 | ||
541 | static void __exit toshiba_acpi_exit(void) | 541 | static void toshiba_acpi_exit(void) |
542 | { | 542 | { |
543 | if (toshiba_backlight_device) | 543 | if (toshiba_backlight_device) |
544 | backlight_device_unregister(toshiba_backlight_device); | 544 | backlight_device_unregister(toshiba_backlight_device); |
diff --git a/drivers/acpi/utilities/utcopy.c b/drivers/acpi/utilities/utcopy.c index 4c1e00874dff..879eaa10d3ae 100644 --- a/drivers/acpi/utilities/utcopy.c +++ b/drivers/acpi/utilities/utcopy.c | |||
@@ -68,6 +68,10 @@ acpi_ut_copy_esimple_to_isimple(union acpi_object *user_obj, | |||
68 | union acpi_operand_object **return_obj); | 68 | union acpi_operand_object **return_obj); |
69 | 69 | ||
70 | static acpi_status | 70 | static acpi_status |
71 | acpi_ut_copy_epackage_to_ipackage(union acpi_object *external_object, | ||
72 | union acpi_operand_object **internal_object); | ||
73 | |||
74 | static acpi_status | ||
71 | acpi_ut_copy_simple_object(union acpi_operand_object *source_desc, | 75 | acpi_ut_copy_simple_object(union acpi_operand_object *source_desc, |
72 | union acpi_operand_object *dest_desc); | 76 | union acpi_operand_object *dest_desc); |
73 | 77 | ||
@@ -518,77 +522,73 @@ acpi_ut_copy_esimple_to_isimple(union acpi_object *external_object, | |||
518 | return_ACPI_STATUS(AE_NO_MEMORY); | 522 | return_ACPI_STATUS(AE_NO_MEMORY); |
519 | } | 523 | } |
520 | 524 | ||
521 | #ifdef ACPI_FUTURE_IMPLEMENTATION | ||
522 | /* Code to convert packages that are parameters to control methods */ | ||
523 | |||
524 | /******************************************************************************* | 525 | /******************************************************************************* |
525 | * | 526 | * |
526 | * FUNCTION: acpi_ut_copy_epackage_to_ipackage | 527 | * FUNCTION: acpi_ut_copy_epackage_to_ipackage |
527 | * | 528 | * |
528 | * PARAMETERS: *internal_object - Pointer to the object we are returning | 529 | * PARAMETERS: external_object - The external object to be converted |
529 | * *Buffer - Where the object is returned | 530 | * internal_object - Where the internal object is returned |
530 | * *space_used - Where the length of the object is returned | ||
531 | * | 531 | * |
532 | * RETURN: Status | 532 | * RETURN: Status |
533 | * | 533 | * |
534 | * DESCRIPTION: This function is called to place a package object in a user | 534 | * DESCRIPTION: Copy an external package object to an internal package. |
535 | * buffer. A package object by definition contains other objects. | 535 | * Handles nested packages. |
536 | * | ||
537 | * The buffer is assumed to have sufficient space for the object. | ||
538 | * The caller must have verified the buffer length needed using the | ||
539 | * acpi_ut_get_object_size function before calling this function. | ||
540 | * | 536 | * |
541 | ******************************************************************************/ | 537 | ******************************************************************************/ |
542 | 538 | ||
543 | static acpi_status | 539 | static acpi_status |
544 | acpi_ut_copy_epackage_to_ipackage(union acpi_operand_object *internal_object, | 540 | acpi_ut_copy_epackage_to_ipackage(union acpi_object *external_object, |
545 | u8 * buffer, u32 * space_used) | 541 | union acpi_operand_object **internal_object) |
546 | { | 542 | { |
547 | u8 *free_space; | 543 | acpi_status status = AE_OK; |
548 | union acpi_object *external_object; | 544 | union acpi_operand_object *package_object; |
549 | u32 length = 0; | 545 | union acpi_operand_object **package_elements; |
550 | u32 this_index; | 546 | acpi_native_uint i; |
551 | u32 object_space = 0; | ||
552 | union acpi_operand_object *this_internal_obj; | ||
553 | union acpi_object *this_external_obj; | ||
554 | 547 | ||
555 | ACPI_FUNCTION_TRACE(ut_copy_epackage_to_ipackage); | 548 | ACPI_FUNCTION_TRACE(ut_copy_epackage_to_ipackage); |
556 | 549 | ||
557 | /* | 550 | /* Create the package object */ |
558 | * First package at head of the buffer | ||
559 | */ | ||
560 | external_object = (union acpi_object *)buffer; | ||
561 | 551 | ||
562 | /* | 552 | package_object = |
563 | * Free space begins right after the first package | 553 | acpi_ut_create_package_object(external_object->package.count); |
564 | */ | 554 | if (!package_object) { |
565 | free_space = buffer + sizeof(union acpi_object); | 555 | return_ACPI_STATUS(AE_NO_MEMORY); |
556 | } | ||
566 | 557 | ||
567 | external_object->type = ACPI_GET_OBJECT_TYPE(internal_object); | 558 | package_elements = package_object->package.elements; |
568 | external_object->package.count = internal_object->package.count; | ||
569 | external_object->package.elements = (union acpi_object *)free_space; | ||
570 | 559 | ||
571 | /* | 560 | /* |
572 | * Build an array of ACPI_OBJECTS in the buffer | 561 | * Recursive implementation. Probably ok, since nested external packages |
573 | * and move the free space past it | 562 | * as parameters should be very rare. |
574 | */ | 563 | */ |
575 | free_space += | 564 | for (i = 0; i < external_object->package.count; i++) { |
576 | external_object->package.count * sizeof(union acpi_object); | 565 | status = |
566 | acpi_ut_copy_eobject_to_iobject(&external_object->package. | ||
567 | elements[i], | ||
568 | &package_elements[i]); | ||
569 | if (ACPI_FAILURE(status)) { | ||
577 | 570 | ||
578 | /* Call walk_package */ | 571 | /* Truncate package and delete it */ |
579 | 572 | ||
580 | } | 573 | package_object->package.count = i; |
574 | package_elements[i] = NULL; | ||
575 | acpi_ut_remove_reference(package_object); | ||
576 | return_ACPI_STATUS(status); | ||
577 | } | ||
578 | } | ||
581 | 579 | ||
582 | #endif /* Future implementation */ | 580 | *internal_object = package_object; |
581 | return_ACPI_STATUS(status); | ||
582 | } | ||
583 | 583 | ||
584 | /******************************************************************************* | 584 | /******************************************************************************* |
585 | * | 585 | * |
586 | * FUNCTION: acpi_ut_copy_eobject_to_iobject | 586 | * FUNCTION: acpi_ut_copy_eobject_to_iobject |
587 | * | 587 | * |
588 | * PARAMETERS: *internal_object - The external object to be converted | 588 | * PARAMETERS: external_object - The external object to be converted |
589 | * *buffer_ptr - Where the internal object is returned | 589 | * internal_object - Where the internal object is returned |
590 | * | 590 | * |
591 | * RETURN: Status - the status of the call | 591 | * RETURN: Status - the status of the call |
592 | * | 592 | * |
593 | * DESCRIPTION: Converts an external object to an internal object. | 593 | * DESCRIPTION: Converts an external object to an internal object. |
594 | * | 594 | * |
@@ -603,16 +603,10 @@ acpi_ut_copy_eobject_to_iobject(union acpi_object *external_object, | |||
603 | ACPI_FUNCTION_TRACE(ut_copy_eobject_to_iobject); | 603 | ACPI_FUNCTION_TRACE(ut_copy_eobject_to_iobject); |
604 | 604 | ||
605 | if (external_object->type == ACPI_TYPE_PACKAGE) { | 605 | if (external_object->type == ACPI_TYPE_PACKAGE) { |
606 | /* | 606 | status = |
607 | * Packages as external input to control methods are not supported, | 607 | acpi_ut_copy_epackage_to_ipackage(external_object, |
608 | */ | 608 | internal_object); |
609 | ACPI_ERROR((AE_INFO, | 609 | } else { |
610 | "Packages as parameters not implemented!")); | ||
611 | |||
612 | return_ACPI_STATUS(AE_NOT_IMPLEMENTED); | ||
613 | } | ||
614 | |||
615 | else { | ||
616 | /* | 610 | /* |
617 | * Build a simple object (no nested objects) | 611 | * Build a simple object (no nested objects) |
618 | */ | 612 | */ |
@@ -803,33 +797,19 @@ acpi_ut_copy_ielement_to_ielement(u8 object_type, | |||
803 | * Create and build the package object | 797 | * Create and build the package object |
804 | */ | 798 | */ |
805 | target_object = | 799 | target_object = |
806 | acpi_ut_create_internal_object(ACPI_TYPE_PACKAGE); | 800 | acpi_ut_create_package_object(source_object->package.count); |
807 | if (!target_object) { | 801 | if (!target_object) { |
808 | return (AE_NO_MEMORY); | 802 | return (AE_NO_MEMORY); |
809 | } | 803 | } |
810 | 804 | ||
811 | target_object->package.count = source_object->package.count; | ||
812 | target_object->common.flags = source_object->common.flags; | 805 | target_object->common.flags = source_object->common.flags; |
813 | 806 | ||
814 | /* | 807 | /* Pass the new package object back to the package walk routine */ |
815 | * Create the object array | ||
816 | */ | ||
817 | target_object->package.elements = | ||
818 | ACPI_ALLOCATE_ZEROED(((acpi_size) source_object->package. | ||
819 | count + 1) * sizeof(void *)); | ||
820 | if (!target_object->package.elements) { | ||
821 | status = AE_NO_MEMORY; | ||
822 | goto error_exit; | ||
823 | } | ||
824 | 808 | ||
825 | /* | ||
826 | * Pass the new package object back to the package walk routine | ||
827 | */ | ||
828 | state->pkg.this_target_obj = target_object; | 809 | state->pkg.this_target_obj = target_object; |
829 | 810 | ||
830 | /* | 811 | /* Store the object pointer in the parent package object */ |
831 | * Store the object pointer in the parent package object | 812 | |
832 | */ | ||
833 | *this_target_ptr = target_object; | 813 | *this_target_ptr = target_object; |
834 | break; | 814 | break; |
835 | 815 | ||
diff --git a/drivers/acpi/utilities/uteval.c b/drivers/acpi/utilities/uteval.c index 13d5879cd98b..8ec6f8e48138 100644 --- a/drivers/acpi/utilities/uteval.c +++ b/drivers/acpi/utilities/uteval.c | |||
@@ -59,10 +59,9 @@ acpi_ut_translate_one_cid(union acpi_operand_object *obj_desc, | |||
59 | /* | 59 | /* |
60 | * Strings supported by the _OSI predefined (internal) method. | 60 | * Strings supported by the _OSI predefined (internal) method. |
61 | */ | 61 | */ |
62 | static const char *acpi_interfaces_supported[] = { | 62 | static char *acpi_interfaces_supported[] = { |
63 | /* Operating System Vendor Strings */ | 63 | /* Operating System Vendor Strings */ |
64 | 64 | ||
65 | "Linux", | ||
66 | "Windows 2000", | 65 | "Windows 2000", |
67 | "Windows 2001", | 66 | "Windows 2001", |
68 | "Windows 2001 SP0", | 67 | "Windows 2001 SP0", |
@@ -158,6 +157,31 @@ acpi_status acpi_ut_osi_implementation(struct acpi_walk_state *walk_state) | |||
158 | 157 | ||
159 | /******************************************************************************* | 158 | /******************************************************************************* |
160 | * | 159 | * |
160 | * FUNCTION: acpi_osi_invalidate | ||
161 | * | ||
162 | * PARAMETERS: interface_string | ||
163 | * | ||
164 | * RETURN: Status | ||
165 | * | ||
166 | * DESCRIPTION: invalidate string in pre-defiend _OSI string list | ||
167 | * | ||
168 | ******************************************************************************/ | ||
169 | |||
170 | acpi_status acpi_osi_invalidate(char *interface) | ||
171 | { | ||
172 | int i; | ||
173 | |||
174 | for (i = 0; i < ACPI_ARRAY_LENGTH(acpi_interfaces_supported); i++) { | ||
175 | if (!ACPI_STRCMP(interface, acpi_interfaces_supported[i])) { | ||
176 | *acpi_interfaces_supported[i] = '\0'; | ||
177 | return AE_OK; | ||
178 | } | ||
179 | } | ||
180 | return AE_NOT_FOUND; | ||
181 | } | ||
182 | |||
183 | /******************************************************************************* | ||
184 | * | ||
161 | * FUNCTION: acpi_ut_evaluate_object | 185 | * FUNCTION: acpi_ut_evaluate_object |
162 | * | 186 | * |
163 | * PARAMETERS: prefix_node - Starting node | 187 | * PARAMETERS: prefix_node - Starting node |
diff --git a/drivers/acpi/utilities/utobject.c b/drivers/acpi/utilities/utobject.c index 4696124759e1..db0b9bac7945 100644 --- a/drivers/acpi/utilities/utobject.c +++ b/drivers/acpi/utilities/utobject.c | |||
@@ -146,6 +146,48 @@ union acpi_operand_object *acpi_ut_create_internal_object_dbg(char *module_name, | |||
146 | 146 | ||
147 | /******************************************************************************* | 147 | /******************************************************************************* |
148 | * | 148 | * |
149 | * FUNCTION: acpi_ut_create_package_object | ||
150 | * | ||
151 | * PARAMETERS: Count - Number of package elements | ||
152 | * | ||
153 | * RETURN: Pointer to a new Package object, null on failure | ||
154 | * | ||
155 | * DESCRIPTION: Create a fully initialized package object | ||
156 | * | ||
157 | ******************************************************************************/ | ||
158 | |||
159 | union acpi_operand_object *acpi_ut_create_package_object(u32 count) | ||
160 | { | ||
161 | union acpi_operand_object *package_desc; | ||
162 | union acpi_operand_object **package_elements; | ||
163 | |||
164 | ACPI_FUNCTION_TRACE_U32(ut_create_package_object, count); | ||
165 | |||
166 | /* Create a new Package object */ | ||
167 | |||
168 | package_desc = acpi_ut_create_internal_object(ACPI_TYPE_PACKAGE); | ||
169 | if (!package_desc) { | ||
170 | return_PTR(NULL); | ||
171 | } | ||
172 | |||
173 | /* | ||
174 | * Create the element array. Count+1 allows the array to be null | ||
175 | * terminated. | ||
176 | */ | ||
177 | package_elements = ACPI_ALLOCATE_ZEROED((acpi_size) | ||
178 | (count + 1) * sizeof(void *)); | ||
179 | if (!package_elements) { | ||
180 | ACPI_FREE(package_desc); | ||
181 | return_PTR(NULL); | ||
182 | } | ||
183 | |||
184 | package_desc->package.count = count; | ||
185 | package_desc->package.elements = package_elements; | ||
186 | return_PTR(package_desc); | ||
187 | } | ||
188 | |||
189 | /******************************************************************************* | ||
190 | * | ||
149 | * FUNCTION: acpi_ut_create_buffer_object | 191 | * FUNCTION: acpi_ut_create_buffer_object |
150 | * | 192 | * |
151 | * PARAMETERS: buffer_size - Size of buffer to be created | 193 | * PARAMETERS: buffer_size - Size of buffer to be created |
diff --git a/drivers/acpi/utilities/utxface.c b/drivers/acpi/utilities/utxface.c index e9a57806cd34..2d496918b3cd 100644 --- a/drivers/acpi/utilities/utxface.c +++ b/drivers/acpi/utilities/utxface.c | |||
@@ -61,7 +61,7 @@ ACPI_MODULE_NAME("utxface") | |||
61 | * called, so any early initialization belongs here. | 61 | * called, so any early initialization belongs here. |
62 | * | 62 | * |
63 | ******************************************************************************/ | 63 | ******************************************************************************/ |
64 | acpi_status acpi_initialize_subsystem(void) | 64 | acpi_status __init acpi_initialize_subsystem(void) |
65 | { | 65 | { |
66 | acpi_status status; | 66 | acpi_status status; |
67 | 67 | ||
@@ -108,8 +108,6 @@ acpi_status acpi_initialize_subsystem(void) | |||
108 | return_ACPI_STATUS(status); | 108 | return_ACPI_STATUS(status); |
109 | } | 109 | } |
110 | 110 | ||
111 | ACPI_EXPORT_SYMBOL(acpi_initialize_subsystem) | ||
112 | |||
113 | /******************************************************************************* | 111 | /******************************************************************************* |
114 | * | 112 | * |
115 | * FUNCTION: acpi_enable_subsystem | 113 | * FUNCTION: acpi_enable_subsystem |
diff --git a/drivers/ata/Kconfig b/drivers/ata/Kconfig index b4a8d6030e48..7d893a60f994 100644 --- a/drivers/ata/Kconfig +++ b/drivers/ata/Kconfig | |||
@@ -8,6 +8,7 @@ menuconfig ATA | |||
8 | depends on BLOCK | 8 | depends on BLOCK |
9 | depends on !(M32R || M68K) || BROKEN | 9 | depends on !(M32R || M68K) || BROKEN |
10 | depends on !SUN4 || BROKEN | 10 | depends on !SUN4 || BROKEN |
11 | depends on !(SPARC64 && !PCI) | ||
11 | select SCSI | 12 | select SCSI |
12 | ---help--- | 13 | ---help--- |
13 | If you want to use a ATA hard disk, ATA tape drive, ATA CD-ROM or | 14 | If you want to use a ATA hard disk, ATA tape drive, ATA CD-ROM or |
diff --git a/drivers/ata/libata-core.c b/drivers/ata/libata-core.c index 3ca9c610c110..af625147df62 100644 --- a/drivers/ata/libata-core.c +++ b/drivers/ata/libata-core.c | |||
@@ -3783,6 +3783,7 @@ static const struct ata_blacklist_entry ata_device_blacklist [] = { | |||
3783 | { "FUJITSU MHT2060BH", NULL, ATA_HORKAGE_NONCQ }, | 3783 | { "FUJITSU MHT2060BH", NULL, ATA_HORKAGE_NONCQ }, |
3784 | /* NCQ is broken */ | 3784 | /* NCQ is broken */ |
3785 | { "Maxtor 6L250S0", "BANC1G10", ATA_HORKAGE_NONCQ }, | 3785 | { "Maxtor 6L250S0", "BANC1G10", ATA_HORKAGE_NONCQ }, |
3786 | { "Maxtor 6B200M0", "BANC1B10", ATA_HORKAGE_NONCQ }, | ||
3786 | /* NCQ hard hangs device under heavier load, needs hard power cycle */ | 3787 | /* NCQ hard hangs device under heavier load, needs hard power cycle */ |
3787 | { "Maxtor 6B250S0", "BANC1B70", ATA_HORKAGE_NONCQ }, | 3788 | { "Maxtor 6B250S0", "BANC1B70", ATA_HORKAGE_NONCQ }, |
3788 | /* Blacklist entries taken from Silicon Image 3124/3132 | 3789 | /* Blacklist entries taken from Silicon Image 3124/3132 |
diff --git a/drivers/atm/firestream.c b/drivers/atm/firestream.c index 9c67df5ccfa4..7f6d02ce1b5f 100644 --- a/drivers/atm/firestream.c +++ b/drivers/atm/firestream.c | |||
@@ -1475,6 +1475,7 @@ static void top_off_fp (struct fs_dev *dev, struct freepool *fp, | |||
1475 | struct FS_BPENTRY *qe, *ne; | 1475 | struct FS_BPENTRY *qe, *ne; |
1476 | struct sk_buff *skb; | 1476 | struct sk_buff *skb; |
1477 | int n = 0; | 1477 | int n = 0; |
1478 | u32 qe_tmp; | ||
1478 | 1479 | ||
1479 | fs_dprintk (FS_DEBUG_QUEUE, "Topping off queue at %x (%d-%d/%d)\n", | 1480 | fs_dprintk (FS_DEBUG_QUEUE, "Topping off queue at %x (%d-%d/%d)\n", |
1480 | fp->offset, read_fs (dev, FP_CNT (fp->offset)), fp->n, | 1481 | fp->offset, read_fs (dev, FP_CNT (fp->offset)), fp->n, |
@@ -1502,10 +1503,16 @@ static void top_off_fp (struct fs_dev *dev, struct freepool *fp, | |||
1502 | ne->skb = skb; | 1503 | ne->skb = skb; |
1503 | ne->fp = fp; | 1504 | ne->fp = fp; |
1504 | 1505 | ||
1505 | qe = (struct FS_BPENTRY *) (read_fs (dev, FP_EA(fp->offset))); | 1506 | /* |
1506 | fs_dprintk (FS_DEBUG_QUEUE, "link at %p\n", qe); | 1507 | * FIXME: following code encodes and decodes |
1507 | if (qe) { | 1508 | * machine pointers (could be 64-bit) into a |
1508 | qe = bus_to_virt ((long) qe); | 1509 | * 32-bit register. |
1510 | */ | ||
1511 | |||
1512 | qe_tmp = read_fs (dev, FP_EA(fp->offset)); | ||
1513 | fs_dprintk (FS_DEBUG_QUEUE, "link at %x\n", qe_tmp); | ||
1514 | if (qe_tmp) { | ||
1515 | qe = bus_to_virt ((long) qe_tmp); | ||
1509 | qe->next = virt_to_bus(ne); | 1516 | qe->next = virt_to_bus(ne); |
1510 | qe->flags &= ~FP_FLAGS_EPI; | 1517 | qe->flags &= ~FP_FLAGS_EPI; |
1511 | } else | 1518 | } else |
diff --git a/drivers/auxdisplay/Kconfig b/drivers/auxdisplay/Kconfig index 2e18a63ead36..ea4fe3e48f33 100644 --- a/drivers/auxdisplay/Kconfig +++ b/drivers/auxdisplay/Kconfig | |||
@@ -68,6 +68,10 @@ config CFAG12864B | |||
68 | depends on X86 | 68 | depends on X86 |
69 | depends on FB | 69 | depends on FB |
70 | depends on KS0108 | 70 | depends on KS0108 |
71 | select FB_SYS_FILLRECT | ||
72 | select FB_SYS_COPYAREA | ||
73 | select FB_SYS_IMAGEBLIT | ||
74 | select FB_SYS_FOPS | ||
71 | default n | 75 | default n |
72 | ---help--- | 76 | ---help--- |
73 | If you have a Crystalfontz 128x64 2-color LCD, cfag12864b Series, | 77 | If you have a Crystalfontz 128x64 2-color LCD, cfag12864b Series, |
diff --git a/drivers/auxdisplay/cfag12864bfb.c b/drivers/auxdisplay/cfag12864bfb.c index 66fafbb1d087..307c190699e0 100644 --- a/drivers/auxdisplay/cfag12864bfb.c +++ b/drivers/auxdisplay/cfag12864bfb.c | |||
@@ -73,9 +73,11 @@ static int cfag12864bfb_mmap(struct fb_info *info, struct vm_area_struct *vma) | |||
73 | 73 | ||
74 | static struct fb_ops cfag12864bfb_ops = { | 74 | static struct fb_ops cfag12864bfb_ops = { |
75 | .owner = THIS_MODULE, | 75 | .owner = THIS_MODULE, |
76 | .fb_fillrect = cfb_fillrect, | 76 | .fb_read = fb_sys_read, |
77 | .fb_copyarea = cfb_copyarea, | 77 | .fb_write = fb_sys_write, |
78 | .fb_imageblit = cfb_imageblit, | 78 | .fb_fillrect = sys_fillrect, |
79 | .fb_copyarea = sys_copyarea, | ||
80 | .fb_imageblit = sys_imageblit, | ||
79 | .fb_mmap = cfag12864bfb_mmap, | 81 | .fb_mmap = cfag12864bfb_mmap, |
80 | }; | 82 | }; |
81 | 83 | ||
diff --git a/drivers/char/drm/drm_drawable.c b/drivers/char/drm/drm_drawable.c index de37d5f74563..b33313be2547 100644 --- a/drivers/char/drm/drm_drawable.c +++ b/drivers/char/drm/drm_drawable.c | |||
@@ -172,38 +172,49 @@ int drm_rmdraw(DRM_IOCTL_ARGS) | |||
172 | 172 | ||
173 | bitfield_length = idx + 1; | 173 | bitfield_length = idx + 1; |
174 | 174 | ||
175 | if (idx != id / (8 * sizeof(*bitfield))) | 175 | bitfield = NULL; |
176 | bitfield = drm_alloc(bitfield_length * | ||
177 | sizeof(*bitfield), DRM_MEM_BUFS); | ||
178 | 176 | ||
179 | if (!bitfield && bitfield_length) { | 177 | if (bitfield_length) { |
180 | bitfield = dev->drw_bitfield; | 178 | if (bitfield_length != dev->drw_bitfield_length) |
181 | bitfield_length = dev->drw_bitfield_length; | 179 | bitfield = drm_alloc(bitfield_length * |
180 | sizeof(*bitfield), | ||
181 | DRM_MEM_BUFS); | ||
182 | |||
183 | if (!bitfield) { | ||
184 | bitfield = dev->drw_bitfield; | ||
185 | bitfield_length = dev->drw_bitfield_length; | ||
186 | } | ||
182 | } | 187 | } |
183 | } | 188 | } |
184 | 189 | ||
185 | if (bitfield != dev->drw_bitfield) { | 190 | if (bitfield != dev->drw_bitfield) { |
186 | info_length = 8 * sizeof(*bitfield) * bitfield_length; | 191 | info_length = 8 * sizeof(*bitfield) * bitfield_length; |
187 | 192 | ||
188 | info = drm_alloc(info_length * sizeof(*info), DRM_MEM_BUFS); | 193 | if (info_length) { |
194 | info = drm_alloc(info_length * sizeof(*info), | ||
195 | DRM_MEM_BUFS); | ||
189 | 196 | ||
190 | if (!info && info_length) { | 197 | if (!info) { |
191 | info = dev->drw_info; | 198 | info = dev->drw_info; |
192 | info_length = dev->drw_info_length; | 199 | info_length = dev->drw_info_length; |
193 | } | 200 | } |
201 | } else | ||
202 | info = NULL; | ||
194 | 203 | ||
195 | spin_lock_irqsave(&dev->drw_lock, irqflags); | 204 | spin_lock_irqsave(&dev->drw_lock, irqflags); |
196 | 205 | ||
197 | memcpy(bitfield, dev->drw_bitfield, bitfield_length * | 206 | if (bitfield) |
198 | sizeof(*bitfield)); | 207 | memcpy(bitfield, dev->drw_bitfield, bitfield_length * |
208 | sizeof(*bitfield)); | ||
199 | drm_free(dev->drw_bitfield, sizeof(*bitfield) * | 209 | drm_free(dev->drw_bitfield, sizeof(*bitfield) * |
200 | dev->drw_bitfield_length, DRM_MEM_BUFS); | 210 | dev->drw_bitfield_length, DRM_MEM_BUFS); |
201 | dev->drw_bitfield = bitfield; | 211 | dev->drw_bitfield = bitfield; |
202 | dev->drw_bitfield_length = bitfield_length; | 212 | dev->drw_bitfield_length = bitfield_length; |
203 | 213 | ||
204 | if (info != dev->drw_info) { | 214 | if (info != dev->drw_info) { |
205 | memcpy(info, dev->drw_info, info_length * | 215 | if (info) |
206 | sizeof(*info)); | 216 | memcpy(info, dev->drw_info, info_length * |
217 | sizeof(*info)); | ||
207 | drm_free(dev->drw_info, sizeof(*info) * | 218 | drm_free(dev->drw_info, sizeof(*info) * |
208 | dev->drw_info_length, DRM_MEM_BUFS); | 219 | dev->drw_info_length, DRM_MEM_BUFS); |
209 | dev->drw_info = info; | 220 | dev->drw_info = info; |
diff --git a/drivers/char/drm/drm_pciids.h b/drivers/char/drm/drm_pciids.h index 31cdde83713b..177ccc07f968 100644 --- a/drivers/char/drm/drm_pciids.h +++ b/drivers/char/drm/drm_pciids.h | |||
@@ -102,13 +102,20 @@ | |||
102 | {0x1002, 0x5653, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV410|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \ | 102 | {0x1002, 0x5653, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV410|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \ |
103 | {0x1002, 0x5834, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RS300|RADEON_IS_IGP}, \ | 103 | {0x1002, 0x5834, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RS300|RADEON_IS_IGP}, \ |
104 | {0x1002, 0x5835, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RS300|RADEON_IS_IGP|RADEON_IS_MOBILITY}, \ | 104 | {0x1002, 0x5835, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RS300|RADEON_IS_IGP|RADEON_IS_MOBILITY}, \ |
105 | {0x1002, 0x5954, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RS400|RADEON_IS_IGP|RADEON_IS_MOBILITY|RADEON_IS_IGPGART}, \ | ||
105 | {0x1002, 0x5955, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RS400|RADEON_IS_IGP|RADEON_IS_MOBILITY|RADEON_IS_IGPGART}, \ | 106 | {0x1002, 0x5955, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RS400|RADEON_IS_IGP|RADEON_IS_MOBILITY|RADEON_IS_IGPGART}, \ |
107 | {0x1002, 0x5974, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RS400|RADEON_IS_IGP|RADEON_IS_MOBILITY|RADEON_IS_IGPGART}, \ | ||
108 | {0x1002, 0x5975, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RS400|RADEON_IS_IGP|RADEON_IS_MOBILITY|RADEON_IS_IGPGART}, \ | ||
106 | {0x1002, 0x5960, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV280}, \ | 109 | {0x1002, 0x5960, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV280}, \ |
107 | {0x1002, 0x5961, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV280}, \ | 110 | {0x1002, 0x5961, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV280}, \ |
108 | {0x1002, 0x5962, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV280}, \ | 111 | {0x1002, 0x5962, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV280}, \ |
109 | {0x1002, 0x5964, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV280}, \ | 112 | {0x1002, 0x5964, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV280}, \ |
110 | {0x1002, 0x5965, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV280}, \ | 113 | {0x1002, 0x5965, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV280}, \ |
111 | {0x1002, 0x5969, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV100}, \ | 114 | {0x1002, 0x5969, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV100}, \ |
115 | {0x1002, 0x5a41, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RS400|RADEON_IS_IGP|RADEON_IS_MOBILITY|RADEON_IS_IGPGART}, \ | ||
116 | {0x1002, 0x5a42, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RS400|RADEON_IS_IGP|RADEON_IS_MOBILITY|RADEON_IS_IGPGART}, \ | ||
117 | {0x1002, 0x5a61, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RS400|RADEON_IS_IGP|RADEON_IS_MOBILITY|RADEON_IS_IGPGART}, \ | ||
118 | {0x1002, 0x5a62, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RS400|RADEON_IS_IGP|RADEON_IS_MOBILITY|RADEON_IS_IGPGART}, \ | ||
112 | {0x1002, 0x5b60, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV380|RADEON_NEW_MEMMAP}, \ | 119 | {0x1002, 0x5b60, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV380|RADEON_NEW_MEMMAP}, \ |
113 | {0x1002, 0x5b62, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV380|RADEON_NEW_MEMMAP}, \ | 120 | {0x1002, 0x5b62, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV380|RADEON_NEW_MEMMAP}, \ |
114 | {0x1002, 0x5b63, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV380|RADEON_NEW_MEMMAP}, \ | 121 | {0x1002, 0x5b63, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV380|RADEON_NEW_MEMMAP}, \ |
diff --git a/drivers/char/drm/i915_irq.c b/drivers/char/drm/i915_irq.c index 78c1ae28f17c..b92062a239f1 100644 --- a/drivers/char/drm/i915_irq.c +++ b/drivers/char/drm/i915_irq.c | |||
@@ -582,7 +582,7 @@ void i915_driver_irq_postinstall(drm_device_t * dev) | |||
582 | { | 582 | { |
583 | drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private; | 583 | drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private; |
584 | 584 | ||
585 | dev_priv->swaps_lock = SPIN_LOCK_UNLOCKED; | 585 | spin_lock_init(&dev_priv->swaps_lock); |
586 | INIT_LIST_HEAD(&dev_priv->vbl_swaps.head); | 586 | INIT_LIST_HEAD(&dev_priv->vbl_swaps.head); |
587 | dev_priv->swaps_pending = 0; | 587 | dev_priv->swaps_pending = 0; |
588 | 588 | ||
diff --git a/drivers/char/n_tty.c b/drivers/char/n_tty.c index b3d4ccc33a47..154f42203b05 100644 --- a/drivers/char/n_tty.c +++ b/drivers/char/n_tty.c | |||
@@ -1191,6 +1191,7 @@ static int job_control(struct tty_struct *tty, struct file *file) | |||
1191 | is_current_pgrp_orphaned()) | 1191 | is_current_pgrp_orphaned()) |
1192 | return -EIO; | 1192 | return -EIO; |
1193 | kill_pgrp(task_pgrp(current), SIGTTIN, 1); | 1193 | kill_pgrp(task_pgrp(current), SIGTTIN, 1); |
1194 | set_thread_flag(TIF_SIGPENDING); | ||
1194 | return -ERESTARTSYS; | 1195 | return -ERESTARTSYS; |
1195 | } | 1196 | } |
1196 | } | 1197 | } |
diff --git a/drivers/char/tty_io.c b/drivers/char/tty_io.c index 75d2a46e106f..3752edc30c36 100644 --- a/drivers/char/tty_io.c +++ b/drivers/char/tty_io.c | |||
@@ -1148,7 +1148,8 @@ int tty_check_change(struct tty_struct * tty) | |||
1148 | return 0; | 1148 | return 0; |
1149 | if (is_current_pgrp_orphaned()) | 1149 | if (is_current_pgrp_orphaned()) |
1150 | return -EIO; | 1150 | return -EIO; |
1151 | (void) kill_pgrp(task_pgrp(current), SIGTTOU, 1); | 1151 | kill_pgrp(task_pgrp(current), SIGTTOU, 1); |
1152 | set_thread_flag(TIF_SIGPENDING); | ||
1152 | return -ERESTARTSYS; | 1153 | return -ERESTARTSYS; |
1153 | } | 1154 | } |
1154 | 1155 | ||
diff --git a/drivers/char/watchdog/Kconfig b/drivers/char/watchdog/Kconfig index 1cad32c62ed3..53f5538c0c05 100644 --- a/drivers/char/watchdog/Kconfig +++ b/drivers/char/watchdog/Kconfig | |||
@@ -115,6 +115,13 @@ config IXP4XX_WATCHDOG | |||
115 | 115 | ||
116 | Say N if you are unsure. | 116 | Say N if you are unsure. |
117 | 117 | ||
118 | config KS8695_WATCHDOG | ||
119 | tristate "KS8695 watchdog" | ||
120 | depends on ARCH_KS8695 | ||
121 | help | ||
122 | Watchdog timer embedded into KS8695 processor. This will reboot your | ||
123 | system when the timeout is reached. | ||
124 | |||
118 | config S3C2410_WATCHDOG | 125 | config S3C2410_WATCHDOG |
119 | tristate "S3C2410 Watchdog" | 126 | tristate "S3C2410 Watchdog" |
120 | depends on ARCH_S3C2410 | 127 | depends on ARCH_S3C2410 |
diff --git a/drivers/char/watchdog/Makefile b/drivers/char/watchdog/Makefile index 8bfc00cc7c2b..d90f649038c2 100644 --- a/drivers/char/watchdog/Makefile +++ b/drivers/char/watchdog/Makefile | |||
@@ -29,6 +29,7 @@ obj-$(CONFIG_21285_WATCHDOG) += wdt285.o | |||
29 | obj-$(CONFIG_977_WATCHDOG) += wdt977.o | 29 | obj-$(CONFIG_977_WATCHDOG) += wdt977.o |
30 | obj-$(CONFIG_IXP2000_WATCHDOG) += ixp2000_wdt.o | 30 | obj-$(CONFIG_IXP2000_WATCHDOG) += ixp2000_wdt.o |
31 | obj-$(CONFIG_IXP4XX_WATCHDOG) += ixp4xx_wdt.o | 31 | obj-$(CONFIG_IXP4XX_WATCHDOG) += ixp4xx_wdt.o |
32 | obj-$(CONFIG_KS8695_WATCHDOG) += ks8695_wdt.o | ||
32 | obj-$(CONFIG_S3C2410_WATCHDOG) += s3c2410_wdt.o | 33 | obj-$(CONFIG_S3C2410_WATCHDOG) += s3c2410_wdt.o |
33 | obj-$(CONFIG_SA1100_WATCHDOG) += sa1100_wdt.o | 34 | obj-$(CONFIG_SA1100_WATCHDOG) += sa1100_wdt.o |
34 | obj-$(CONFIG_MPCORE_WATCHDOG) += mpcore_wdt.o | 35 | obj-$(CONFIG_MPCORE_WATCHDOG) += mpcore_wdt.o |
diff --git a/drivers/char/watchdog/ixp2000_wdt.c b/drivers/char/watchdog/ixp2000_wdt.c index fd955dbd588c..dc7548dcaf35 100644 --- a/drivers/char/watchdog/ixp2000_wdt.c +++ b/drivers/char/watchdog/ixp2000_wdt.c | |||
@@ -205,7 +205,7 @@ static void __exit ixp2000_wdt_exit(void) | |||
205 | module_init(ixp2000_wdt_init); | 205 | module_init(ixp2000_wdt_init); |
206 | module_exit(ixp2000_wdt_exit); | 206 | module_exit(ixp2000_wdt_exit); |
207 | 207 | ||
208 | MODULE_AUTHOR("Deepak Saxena <dsaxena@plexity.net">); | 208 | MODULE_AUTHOR("Deepak Saxena <dsaxena@plexity.net>"); |
209 | MODULE_DESCRIPTION("IXP2000 Network Processor Watchdog"); | 209 | MODULE_DESCRIPTION("IXP2000 Network Processor Watchdog"); |
210 | 210 | ||
211 | module_param(heartbeat, int, 0); | 211 | module_param(heartbeat, int, 0); |
diff --git a/drivers/char/watchdog/ks8695_wdt.c b/drivers/char/watchdog/ks8695_wdt.c new file mode 100644 index 000000000000..7150fb945eaf --- /dev/null +++ b/drivers/char/watchdog/ks8695_wdt.c | |||
@@ -0,0 +1,308 @@ | |||
1 | /* | ||
2 | * Watchdog driver for Kendin/Micrel KS8695. | ||
3 | * | ||
4 | * (C) 2007 Andrew Victor | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or modify | ||
7 | * it under the terms of the GNU General Public License version 2 as | ||
8 | * published by the Free Software Foundation. | ||
9 | */ | ||
10 | |||
11 | #include <linux/errno.h> | ||
12 | #include <linux/fs.h> | ||
13 | #include <linux/init.h> | ||
14 | #include <linux/kernel.h> | ||
15 | #include <linux/miscdevice.h> | ||
16 | #include <linux/module.h> | ||
17 | #include <linux/moduleparam.h> | ||
18 | #include <linux/platform_device.h> | ||
19 | #include <linux/types.h> | ||
20 | #include <linux/watchdog.h> | ||
21 | #include <asm/bitops.h> | ||
22 | #include <asm/io.h> | ||
23 | #include <asm/uaccess.h> | ||
24 | #include <asm/arch/regs-timer.h> | ||
25 | |||
26 | |||
27 | #define WDT_DEFAULT_TIME 5 /* seconds */ | ||
28 | #define WDT_MAX_TIME 171 /* seconds */ | ||
29 | |||
30 | static int wdt_time = WDT_DEFAULT_TIME; | ||
31 | static int nowayout = WATCHDOG_NOWAYOUT; | ||
32 | |||
33 | module_param(wdt_time, int, 0); | ||
34 | MODULE_PARM_DESC(wdt_time, "Watchdog time in seconds. (default="__MODULE_STRING(WDT_DEFAULT_TIME) ")"); | ||
35 | |||
36 | #ifdef CONFIG_WATCHDOG_NOWAYOUT | ||
37 | module_param(nowayout, int, 0); | ||
38 | MODULE_PARM_DESC(nowayout, "Watchdog cannot be stopped once started (default=" __MODULE_STRING(WATCHDOG_NOWAYOUT) ")"); | ||
39 | #endif | ||
40 | |||
41 | |||
42 | static unsigned long ks8695wdt_busy; | ||
43 | |||
44 | /* ......................................................................... */ | ||
45 | |||
46 | /* | ||
47 | * Disable the watchdog. | ||
48 | */ | ||
49 | static void inline ks8695_wdt_stop(void) | ||
50 | { | ||
51 | unsigned long tmcon; | ||
52 | |||
53 | /* disable timer0 */ | ||
54 | tmcon = __raw_readl(KS8695_TMR_VA + KS8695_TMCON); | ||
55 | __raw_writel(tmcon & ~TMCON_T0EN, KS8695_TMR_VA + KS8695_TMCON); | ||
56 | } | ||
57 | |||
58 | /* | ||
59 | * Enable and reset the watchdog. | ||
60 | */ | ||
61 | static void inline ks8695_wdt_start(void) | ||
62 | { | ||
63 | unsigned long tmcon; | ||
64 | unsigned long tval = wdt_time * CLOCK_TICK_RATE; | ||
65 | |||
66 | /* disable timer0 */ | ||
67 | tmcon = __raw_readl(KS8695_TMR_VA + KS8695_TMCON); | ||
68 | __raw_writel(tmcon & ~TMCON_T0EN, KS8695_TMR_VA + KS8695_TMCON); | ||
69 | |||
70 | /* program timer0 */ | ||
71 | __raw_writel(tval | T0TC_WATCHDOG, KS8695_TMR_VA + KS8695_T0TC); | ||
72 | |||
73 | /* re-enable timer0 */ | ||
74 | tmcon = __raw_readl(KS8695_TMR_VA + KS8695_TMCON); | ||
75 | __raw_writel(tmcon | TMCON_T0EN, KS8695_TMR_VA + KS8695_TMCON); | ||
76 | } | ||
77 | |||
78 | /* | ||
79 | * Reload the watchdog timer. (ie, pat the watchdog) | ||
80 | */ | ||
81 | static void inline ks8695_wdt_reload(void) | ||
82 | { | ||
83 | unsigned long tmcon; | ||
84 | |||
85 | /* disable, then re-enable timer0 */ | ||
86 | tmcon = __raw_readl(KS8695_TMR_VA + KS8695_TMCON); | ||
87 | __raw_writel(tmcon & ~TMCON_T0EN, KS8695_TMR_VA + KS8695_TMCON); | ||
88 | __raw_writel(tmcon | TMCON_T0EN, KS8695_TMR_VA + KS8695_TMCON); | ||
89 | } | ||
90 | |||
91 | /* | ||
92 | * Change the watchdog time interval. | ||
93 | */ | ||
94 | static int ks8695_wdt_settimeout(int new_time) | ||
95 | { | ||
96 | /* | ||
97 | * All counting occurs at SLOW_CLOCK / 128 = 0.256 Hz | ||
98 | * | ||
99 | * Since WDV is a 16-bit counter, the maximum period is | ||
100 | * 65536 / 0.256 = 256 seconds. | ||
101 | */ | ||
102 | if ((new_time <= 0) || (new_time > WDT_MAX_TIME)) | ||
103 | return -EINVAL; | ||
104 | |||
105 | /* Set new watchdog time. It will be used when ks8695_wdt_start() is called. */ | ||
106 | wdt_time = new_time; | ||
107 | return 0; | ||
108 | } | ||
109 | |||
110 | /* ......................................................................... */ | ||
111 | |||
112 | /* | ||
113 | * Watchdog device is opened, and watchdog starts running. | ||
114 | */ | ||
115 | static int ks8695_wdt_open(struct inode *inode, struct file *file) | ||
116 | { | ||
117 | if (test_and_set_bit(0, &ks8695wdt_busy)) | ||
118 | return -EBUSY; | ||
119 | |||
120 | ks8695_wdt_start(); | ||
121 | return nonseekable_open(inode, file); | ||
122 | } | ||
123 | |||
124 | /* | ||
125 | * Close the watchdog device. | ||
126 | * If CONFIG_WATCHDOG_NOWAYOUT is NOT defined then the watchdog is also | ||
127 | * disabled. | ||
128 | */ | ||
129 | static int ks8695_wdt_close(struct inode *inode, struct file *file) | ||
130 | { | ||
131 | if (!nowayout) | ||
132 | ks8695_wdt_stop(); /* Disable the watchdog when file is closed */ | ||
133 | |||
134 | clear_bit(0, &ks8695wdt_busy); | ||
135 | return 0; | ||
136 | } | ||
137 | |||
138 | static struct watchdog_info ks8695_wdt_info = { | ||
139 | .identity = "ks8695 watchdog", | ||
140 | .options = WDIOF_SETTIMEOUT | WDIOF_KEEPALIVEPING, | ||
141 | }; | ||
142 | |||
143 | /* | ||
144 | * Handle commands from user-space. | ||
145 | */ | ||
146 | static int ks8695_wdt_ioctl(struct inode *inode, struct file *file, | ||
147 | unsigned int cmd, unsigned long arg) | ||
148 | { | ||
149 | void __user *argp = (void __user *)arg; | ||
150 | int __user *p = argp; | ||
151 | int new_value; | ||
152 | |||
153 | switch(cmd) { | ||
154 | case WDIOC_KEEPALIVE: | ||
155 | ks8695_wdt_reload(); /* pat the watchdog */ | ||
156 | return 0; | ||
157 | |||
158 | case WDIOC_GETSUPPORT: | ||
159 | return copy_to_user(argp, &ks8695_wdt_info, sizeof(ks8695_wdt_info)) ? -EFAULT : 0; | ||
160 | |||
161 | case WDIOC_SETTIMEOUT: | ||
162 | if (get_user(new_value, p)) | ||
163 | return -EFAULT; | ||
164 | |||
165 | if (ks8695_wdt_settimeout(new_value)) | ||
166 | return -EINVAL; | ||
167 | |||
168 | /* Enable new time value */ | ||
169 | ks8695_wdt_start(); | ||
170 | |||
171 | /* Return current value */ | ||
172 | return put_user(wdt_time, p); | ||
173 | |||
174 | case WDIOC_GETTIMEOUT: | ||
175 | return put_user(wdt_time, p); | ||
176 | |||
177 | case WDIOC_GETSTATUS: | ||
178 | case WDIOC_GETBOOTSTATUS: | ||
179 | return put_user(0, p); | ||
180 | |||
181 | case WDIOC_SETOPTIONS: | ||
182 | if (get_user(new_value, p)) | ||
183 | return -EFAULT; | ||
184 | |||
185 | if (new_value & WDIOS_DISABLECARD) | ||
186 | ks8695_wdt_stop(); | ||
187 | if (new_value & WDIOS_ENABLECARD) | ||
188 | ks8695_wdt_start(); | ||
189 | return 0; | ||
190 | |||
191 | default: | ||
192 | return -ENOTTY; | ||
193 | } | ||
194 | } | ||
195 | |||
196 | /* | ||
197 | * Pat the watchdog whenever device is written to. | ||
198 | */ | ||
199 | static ssize_t ks8695_wdt_write(struct file *file, const char *data, size_t len, loff_t *ppos) | ||
200 | { | ||
201 | ks8695_wdt_reload(); /* pat the watchdog */ | ||
202 | return len; | ||
203 | } | ||
204 | |||
205 | /* ......................................................................... */ | ||
206 | |||
207 | static const struct file_operations ks8695wdt_fops = { | ||
208 | .owner = THIS_MODULE, | ||
209 | .llseek = no_llseek, | ||
210 | .ioctl = ks8695_wdt_ioctl, | ||
211 | .open = ks8695_wdt_open, | ||
212 | .release = ks8695_wdt_close, | ||
213 | .write = ks8695_wdt_write, | ||
214 | }; | ||
215 | |||
216 | static struct miscdevice ks8695wdt_miscdev = { | ||
217 | .minor = WATCHDOG_MINOR, | ||
218 | .name = "watchdog", | ||
219 | .fops = &ks8695wdt_fops, | ||
220 | }; | ||
221 | |||
222 | static int __init ks8695wdt_probe(struct platform_device *pdev) | ||
223 | { | ||
224 | int res; | ||
225 | |||
226 | if (ks8695wdt_miscdev.parent) | ||
227 | return -EBUSY; | ||
228 | ks8695wdt_miscdev.parent = &pdev->dev; | ||
229 | |||
230 | res = misc_register(&ks8695wdt_miscdev); | ||
231 | if (res) | ||
232 | return res; | ||
233 | |||
234 | printk("KS8695 Watchdog Timer enabled (%d seconds%s)\n", wdt_time, nowayout ? ", nowayout" : ""); | ||
235 | return 0; | ||
236 | } | ||
237 | |||
238 | static int __exit ks8695wdt_remove(struct platform_device *pdev) | ||
239 | { | ||
240 | int res; | ||
241 | |||
242 | res = misc_deregister(&ks8695wdt_miscdev); | ||
243 | if (!res) | ||
244 | ks8695wdt_miscdev.parent = NULL; | ||
245 | |||
246 | return res; | ||
247 | } | ||
248 | |||
249 | static void ks8695wdt_shutdown(struct platform_device *pdev) | ||
250 | { | ||
251 | ks8695_wdt_stop(); | ||
252 | } | ||
253 | |||
254 | #ifdef CONFIG_PM | ||
255 | |||
256 | static int ks8695wdt_suspend(struct platform_device *pdev, pm_message_t message) | ||
257 | { | ||
258 | ks8695_wdt_stop(); | ||
259 | return 0; | ||
260 | } | ||
261 | |||
262 | static int ks8695wdt_resume(struct platform_device *pdev) | ||
263 | { | ||
264 | if (ks8695wdt_busy) | ||
265 | ks8695_wdt_start(); | ||
266 | return 0; | ||
267 | } | ||
268 | |||
269 | #else | ||
270 | #define ks8695wdt_suspend NULL | ||
271 | #define ks8695wdt_resume NULL | ||
272 | #endif | ||
273 | |||
274 | static struct platform_driver ks8695wdt_driver = { | ||
275 | .probe = ks8695wdt_probe, | ||
276 | .remove = __exit_p(ks8695wdt_remove), | ||
277 | .shutdown = ks8695wdt_shutdown, | ||
278 | .suspend = ks8695wdt_suspend, | ||
279 | .resume = ks8695wdt_resume, | ||
280 | .driver = { | ||
281 | .name = "ks8695_wdt", | ||
282 | .owner = THIS_MODULE, | ||
283 | }, | ||
284 | }; | ||
285 | |||
286 | static int __init ks8695_wdt_init(void) | ||
287 | { | ||
288 | /* Check that the heartbeat value is within range; if not reset to the default */ | ||
289 | if (ks8695_wdt_settimeout(wdt_time)) { | ||
290 | ks8695_wdt_settimeout(WDT_DEFAULT_TIME); | ||
291 | pr_info("ks8695_wdt: wdt_time value must be 1 <= wdt_time <= %i, using %d\n", wdt_time, WDT_MAX_TIME); | ||
292 | } | ||
293 | |||
294 | return platform_driver_register(&ks8695wdt_driver); | ||
295 | } | ||
296 | |||
297 | static void __exit ks8695_wdt_exit(void) | ||
298 | { | ||
299 | platform_driver_unregister(&ks8695wdt_driver); | ||
300 | } | ||
301 | |||
302 | module_init(ks8695_wdt_init); | ||
303 | module_exit(ks8695_wdt_exit); | ||
304 | |||
305 | MODULE_AUTHOR("Andrew Victor"); | ||
306 | MODULE_DESCRIPTION("Watchdog driver for KS8695"); | ||
307 | MODULE_LICENSE("GPL"); | ||
308 | MODULE_ALIAS_MISCDEV(WATCHDOG_MINOR); | ||
diff --git a/drivers/firewire/fw-card.c b/drivers/firewire/fw-card.c index 636151a64add..9eb1edacd825 100644 --- a/drivers/firewire/fw-card.c +++ b/drivers/firewire/fw-card.c | |||
@@ -407,11 +407,6 @@ fw_card_add(struct fw_card *card, | |||
407 | card->link_speed = link_speed; | 407 | card->link_speed = link_speed; |
408 | card->guid = guid; | 408 | card->guid = guid; |
409 | 409 | ||
410 | /* Activate link_on bit and contender bit in our self ID packets.*/ | ||
411 | if (card->driver->update_phy_reg(card, 4, 0, | ||
412 | PHY_LINK_ACTIVE | PHY_CONTENDER) < 0) | ||
413 | return -EIO; | ||
414 | |||
415 | /* | 410 | /* |
416 | * The subsystem grabs a reference when the card is added and | 411 | * The subsystem grabs a reference when the card is added and |
417 | * drops it when the driver calls fw_core_remove_card. | 412 | * drops it when the driver calls fw_core_remove_card. |
diff --git a/drivers/firewire/fw-cdev.c b/drivers/firewire/fw-cdev.c index 3ab3585d3601..5d402d63799f 100644 --- a/drivers/firewire/fw-cdev.c +++ b/drivers/firewire/fw-cdev.c | |||
@@ -677,12 +677,21 @@ static int ioctl_create_iso_context(struct client *client, void *buffer) | |||
677 | return 0; | 677 | return 0; |
678 | } | 678 | } |
679 | 679 | ||
680 | /* Macros for decoding the iso packet control header. */ | ||
681 | #define GET_PAYLOAD_LENGTH(v) ((v) & 0xffff) | ||
682 | #define GET_INTERRUPT(v) (((v) >> 16) & 0x01) | ||
683 | #define GET_SKIP(v) (((v) >> 17) & 0x01) | ||
684 | #define GET_TAG(v) (((v) >> 18) & 0x02) | ||
685 | #define GET_SY(v) (((v) >> 20) & 0x04) | ||
686 | #define GET_HEADER_LENGTH(v) (((v) >> 24) & 0xff) | ||
687 | |||
680 | static int ioctl_queue_iso(struct client *client, void *buffer) | 688 | static int ioctl_queue_iso(struct client *client, void *buffer) |
681 | { | 689 | { |
682 | struct fw_cdev_queue_iso *request = buffer; | 690 | struct fw_cdev_queue_iso *request = buffer; |
683 | struct fw_cdev_iso_packet __user *p, *end, *next; | 691 | struct fw_cdev_iso_packet __user *p, *end, *next; |
684 | struct fw_iso_context *ctx = client->iso_context; | 692 | struct fw_iso_context *ctx = client->iso_context; |
685 | unsigned long payload, buffer_end, header_length; | 693 | unsigned long payload, buffer_end, header_length; |
694 | u32 control; | ||
686 | int count; | 695 | int count; |
687 | struct { | 696 | struct { |
688 | struct fw_iso_packet packet; | 697 | struct fw_iso_packet packet; |
@@ -717,8 +726,14 @@ static int ioctl_queue_iso(struct client *client, void *buffer) | |||
717 | end = (void __user *)p + request->size; | 726 | end = (void __user *)p + request->size; |
718 | count = 0; | 727 | count = 0; |
719 | while (p < end) { | 728 | while (p < end) { |
720 | if (__copy_from_user(&u.packet, p, sizeof(*p))) | 729 | if (get_user(control, &p->control)) |
721 | return -EFAULT; | 730 | return -EFAULT; |
731 | u.packet.payload_length = GET_PAYLOAD_LENGTH(control); | ||
732 | u.packet.interrupt = GET_INTERRUPT(control); | ||
733 | u.packet.skip = GET_SKIP(control); | ||
734 | u.packet.tag = GET_TAG(control); | ||
735 | u.packet.sy = GET_SY(control); | ||
736 | u.packet.header_length = GET_HEADER_LENGTH(control); | ||
722 | 737 | ||
723 | if (ctx->type == FW_ISO_CONTEXT_TRANSMIT) { | 738 | if (ctx->type == FW_ISO_CONTEXT_TRANSMIT) { |
724 | header_length = u.packet.header_length; | 739 | header_length = u.packet.header_length; |
diff --git a/drivers/firewire/fw-device.h b/drivers/firewire/fw-device.h index 0ba9d64ccf4c..af1723eae4ba 100644 --- a/drivers/firewire/fw-device.h +++ b/drivers/firewire/fw-device.h | |||
@@ -99,6 +99,7 @@ fw_unit(struct device *dev) | |||
99 | #define CSR_DEPENDENT_INFO 0x14 | 99 | #define CSR_DEPENDENT_INFO 0x14 |
100 | #define CSR_MODEL 0x17 | 100 | #define CSR_MODEL 0x17 |
101 | #define CSR_INSTANCE 0x18 | 101 | #define CSR_INSTANCE 0x18 |
102 | #define CSR_DIRECTORY_ID 0x20 | ||
102 | 103 | ||
103 | #define SBP2_COMMAND_SET_SPECIFIER 0x38 | 104 | #define SBP2_COMMAND_SET_SPECIFIER 0x38 |
104 | #define SBP2_COMMAND_SET 0x39 | 105 | #define SBP2_COMMAND_SET 0x39 |
diff --git a/drivers/firewire/fw-ohci.c b/drivers/firewire/fw-ohci.c index 2e4cfa57126d..0d08bf9b78c2 100644 --- a/drivers/firewire/fw-ohci.c +++ b/drivers/firewire/fw-ohci.c | |||
@@ -417,12 +417,21 @@ ar_context_init(struct ar_context *ctx, struct fw_ohci *ohci, u32 regs) | |||
417 | ctx->current_buffer = ab.next; | 417 | ctx->current_buffer = ab.next; |
418 | ctx->pointer = ctx->current_buffer->data; | 418 | ctx->pointer = ctx->current_buffer->data; |
419 | 419 | ||
420 | reg_write(ctx->ohci, COMMAND_PTR(ctx->regs), | 420 | return 0; |
421 | le32_to_cpu(ab.descriptor.branch_address)); | 421 | } |
422 | |||
423 | static void ar_context_run(struct ar_context *ctx) | ||
424 | { | ||
425 | struct ar_buffer *ab = ctx->current_buffer; | ||
426 | dma_addr_t ab_bus; | ||
427 | size_t offset; | ||
428 | |||
429 | offset = offsetof(struct ar_buffer, data); | ||
430 | ab_bus = ab->descriptor.data_address - offset; | ||
431 | |||
432 | reg_write(ctx->ohci, COMMAND_PTR(ctx->regs), ab_bus | 1); | ||
422 | reg_write(ctx->ohci, CONTROL_SET(ctx->regs), CONTEXT_RUN); | 433 | reg_write(ctx->ohci, CONTROL_SET(ctx->regs), CONTEXT_RUN); |
423 | flush_writes(ctx->ohci); | 434 | flush_writes(ctx->ohci); |
424 | |||
425 | return 0; | ||
426 | } | 435 | } |
427 | 436 | ||
428 | static void context_tasklet(unsigned long data) | 437 | static void context_tasklet(unsigned long data) |
@@ -1039,11 +1048,78 @@ static irqreturn_t irq_handler(int irq, void *data) | |||
1039 | return IRQ_HANDLED; | 1048 | return IRQ_HANDLED; |
1040 | } | 1049 | } |
1041 | 1050 | ||
1051 | static int software_reset(struct fw_ohci *ohci) | ||
1052 | { | ||
1053 | int i; | ||
1054 | |||
1055 | reg_write(ohci, OHCI1394_HCControlSet, OHCI1394_HCControl_softReset); | ||
1056 | |||
1057 | for (i = 0; i < OHCI_LOOP_COUNT; i++) { | ||
1058 | if ((reg_read(ohci, OHCI1394_HCControlSet) & | ||
1059 | OHCI1394_HCControl_softReset) == 0) | ||
1060 | return 0; | ||
1061 | msleep(1); | ||
1062 | } | ||
1063 | |||
1064 | return -EBUSY; | ||
1065 | } | ||
1066 | |||
1042 | static int ohci_enable(struct fw_card *card, u32 *config_rom, size_t length) | 1067 | static int ohci_enable(struct fw_card *card, u32 *config_rom, size_t length) |
1043 | { | 1068 | { |
1044 | struct fw_ohci *ohci = fw_ohci(card); | 1069 | struct fw_ohci *ohci = fw_ohci(card); |
1045 | struct pci_dev *dev = to_pci_dev(card->device); | 1070 | struct pci_dev *dev = to_pci_dev(card->device); |
1046 | 1071 | ||
1072 | if (software_reset(ohci)) { | ||
1073 | fw_error("Failed to reset ohci card.\n"); | ||
1074 | return -EBUSY; | ||
1075 | } | ||
1076 | |||
1077 | /* | ||
1078 | * Now enable LPS, which we need in order to start accessing | ||
1079 | * most of the registers. In fact, on some cards (ALI M5251), | ||
1080 | * accessing registers in the SClk domain without LPS enabled | ||
1081 | * will lock up the machine. Wait 50msec to make sure we have | ||
1082 | * full link enabled. | ||
1083 | */ | ||
1084 | reg_write(ohci, OHCI1394_HCControlSet, | ||
1085 | OHCI1394_HCControl_LPS | | ||
1086 | OHCI1394_HCControl_postedWriteEnable); | ||
1087 | flush_writes(ohci); | ||
1088 | msleep(50); | ||
1089 | |||
1090 | reg_write(ohci, OHCI1394_HCControlClear, | ||
1091 | OHCI1394_HCControl_noByteSwapData); | ||
1092 | |||
1093 | reg_write(ohci, OHCI1394_LinkControlSet, | ||
1094 | OHCI1394_LinkControl_rcvSelfID | | ||
1095 | OHCI1394_LinkControl_cycleTimerEnable | | ||
1096 | OHCI1394_LinkControl_cycleMaster); | ||
1097 | |||
1098 | reg_write(ohci, OHCI1394_ATRetries, | ||
1099 | OHCI1394_MAX_AT_REQ_RETRIES | | ||
1100 | (OHCI1394_MAX_AT_RESP_RETRIES << 4) | | ||
1101 | (OHCI1394_MAX_PHYS_RESP_RETRIES << 8)); | ||
1102 | |||
1103 | ar_context_run(&ohci->ar_request_ctx); | ||
1104 | ar_context_run(&ohci->ar_response_ctx); | ||
1105 | |||
1106 | reg_write(ohci, OHCI1394_SelfIDBuffer, ohci->self_id_bus); | ||
1107 | reg_write(ohci, OHCI1394_PhyUpperBound, 0x00010000); | ||
1108 | reg_write(ohci, OHCI1394_IntEventClear, ~0); | ||
1109 | reg_write(ohci, OHCI1394_IntMaskClear, ~0); | ||
1110 | reg_write(ohci, OHCI1394_IntMaskSet, | ||
1111 | OHCI1394_selfIDComplete | | ||
1112 | OHCI1394_RQPkt | OHCI1394_RSPkt | | ||
1113 | OHCI1394_reqTxComplete | OHCI1394_respTxComplete | | ||
1114 | OHCI1394_isochRx | OHCI1394_isochTx | | ||
1115 | OHCI1394_masterIntEnable | | ||
1116 | OHCI1394_cycle64Seconds); | ||
1117 | |||
1118 | /* Activate link_on bit and contender bit in our self ID packets.*/ | ||
1119 | if (ohci_update_phy_reg(card, 4, 0, | ||
1120 | PHY_LINK_ACTIVE | PHY_CONTENDER) < 0) | ||
1121 | return -EIO; | ||
1122 | |||
1047 | /* | 1123 | /* |
1048 | * When the link is not yet enabled, the atomic config rom | 1124 | * When the link is not yet enabled, the atomic config rom |
1049 | * update mechanism described below in ohci_set_config_rom() | 1125 | * update mechanism described below in ohci_set_config_rom() |
@@ -1701,22 +1777,6 @@ static const struct fw_card_driver ohci_driver = { | |||
1701 | .stop_iso = ohci_stop_iso, | 1777 | .stop_iso = ohci_stop_iso, |
1702 | }; | 1778 | }; |
1703 | 1779 | ||
1704 | static int software_reset(struct fw_ohci *ohci) | ||
1705 | { | ||
1706 | int i; | ||
1707 | |||
1708 | reg_write(ohci, OHCI1394_HCControlSet, OHCI1394_HCControl_softReset); | ||
1709 | |||
1710 | for (i = 0; i < OHCI_LOOP_COUNT; i++) { | ||
1711 | if ((reg_read(ohci, OHCI1394_HCControlSet) & | ||
1712 | OHCI1394_HCControl_softReset) == 0) | ||
1713 | return 0; | ||
1714 | msleep(1); | ||
1715 | } | ||
1716 | |||
1717 | return -EBUSY; | ||
1718 | } | ||
1719 | |||
1720 | static int __devinit | 1780 | static int __devinit |
1721 | pci_probe(struct pci_dev *dev, const struct pci_device_id *ent) | 1781 | pci_probe(struct pci_dev *dev, const struct pci_device_id *ent) |
1722 | { | 1782 | { |
@@ -1762,33 +1822,6 @@ pci_probe(struct pci_dev *dev, const struct pci_device_id *ent) | |||
1762 | goto fail_iomem; | 1822 | goto fail_iomem; |
1763 | } | 1823 | } |
1764 | 1824 | ||
1765 | if (software_reset(ohci)) { | ||
1766 | fw_error("Failed to reset ohci card.\n"); | ||
1767 | err = -EBUSY; | ||
1768 | goto fail_registers; | ||
1769 | } | ||
1770 | |||
1771 | /* | ||
1772 | * Now enable LPS, which we need in order to start accessing | ||
1773 | * most of the registers. In fact, on some cards (ALI M5251), | ||
1774 | * accessing registers in the SClk domain without LPS enabled | ||
1775 | * will lock up the machine. Wait 50msec to make sure we have | ||
1776 | * full link enabled. | ||
1777 | */ | ||
1778 | reg_write(ohci, OHCI1394_HCControlSet, | ||
1779 | OHCI1394_HCControl_LPS | | ||
1780 | OHCI1394_HCControl_postedWriteEnable); | ||
1781 | flush_writes(ohci); | ||
1782 | msleep(50); | ||
1783 | |||
1784 | reg_write(ohci, OHCI1394_HCControlClear, | ||
1785 | OHCI1394_HCControl_noByteSwapData); | ||
1786 | |||
1787 | reg_write(ohci, OHCI1394_LinkControlSet, | ||
1788 | OHCI1394_LinkControl_rcvSelfID | | ||
1789 | OHCI1394_LinkControl_cycleTimerEnable | | ||
1790 | OHCI1394_LinkControl_cycleMaster); | ||
1791 | |||
1792 | ar_context_init(&ohci->ar_request_ctx, ohci, | 1825 | ar_context_init(&ohci->ar_request_ctx, ohci, |
1793 | OHCI1394_AsReqRcvContextControlSet); | 1826 | OHCI1394_AsReqRcvContextControlSet); |
1794 | 1827 | ||
@@ -1801,11 +1834,6 @@ pci_probe(struct pci_dev *dev, const struct pci_device_id *ent) | |||
1801 | context_init(&ohci->at_response_ctx, ohci, AT_BUFFER_SIZE, | 1834 | context_init(&ohci->at_response_ctx, ohci, AT_BUFFER_SIZE, |
1802 | OHCI1394_AsRspTrContextControlSet, handle_at_packet); | 1835 | OHCI1394_AsRspTrContextControlSet, handle_at_packet); |
1803 | 1836 | ||
1804 | reg_write(ohci, OHCI1394_ATRetries, | ||
1805 | OHCI1394_MAX_AT_REQ_RETRIES | | ||
1806 | (OHCI1394_MAX_AT_RESP_RETRIES << 4) | | ||
1807 | (OHCI1394_MAX_PHYS_RESP_RETRIES << 8)); | ||
1808 | |||
1809 | reg_write(ohci, OHCI1394_IsoRecvIntMaskSet, ~0); | 1837 | reg_write(ohci, OHCI1394_IsoRecvIntMaskSet, ~0); |
1810 | ohci->it_context_mask = reg_read(ohci, OHCI1394_IsoRecvIntMaskSet); | 1838 | ohci->it_context_mask = reg_read(ohci, OHCI1394_IsoRecvIntMaskSet); |
1811 | reg_write(ohci, OHCI1394_IsoRecvIntMaskClear, ~0); | 1839 | reg_write(ohci, OHCI1394_IsoRecvIntMaskClear, ~0); |
@@ -1835,18 +1863,6 @@ pci_probe(struct pci_dev *dev, const struct pci_device_id *ent) | |||
1835 | goto fail_registers; | 1863 | goto fail_registers; |
1836 | } | 1864 | } |
1837 | 1865 | ||
1838 | reg_write(ohci, OHCI1394_SelfIDBuffer, ohci->self_id_bus); | ||
1839 | reg_write(ohci, OHCI1394_PhyUpperBound, 0x00010000); | ||
1840 | reg_write(ohci, OHCI1394_IntEventClear, ~0); | ||
1841 | reg_write(ohci, OHCI1394_IntMaskClear, ~0); | ||
1842 | reg_write(ohci, OHCI1394_IntMaskSet, | ||
1843 | OHCI1394_selfIDComplete | | ||
1844 | OHCI1394_RQPkt | OHCI1394_RSPkt | | ||
1845 | OHCI1394_reqTxComplete | OHCI1394_respTxComplete | | ||
1846 | OHCI1394_isochRx | OHCI1394_isochTx | | ||
1847 | OHCI1394_masterIntEnable | | ||
1848 | OHCI1394_cycle64Seconds); | ||
1849 | |||
1850 | bus_options = reg_read(ohci, OHCI1394_BusOptions); | 1866 | bus_options = reg_read(ohci, OHCI1394_BusOptions); |
1851 | max_receive = (bus_options >> 12) & 0xf; | 1867 | max_receive = (bus_options >> 12) & 0xf; |
1852 | link_speed = bus_options & 0x7; | 1868 | link_speed = bus_options & 0x7; |
@@ -1908,6 +1924,45 @@ static void pci_remove(struct pci_dev *dev) | |||
1908 | fw_notify("Removed fw-ohci device.\n"); | 1924 | fw_notify("Removed fw-ohci device.\n"); |
1909 | } | 1925 | } |
1910 | 1926 | ||
1927 | #ifdef CONFIG_PM | ||
1928 | static int pci_suspend(struct pci_dev *pdev, pm_message_t state) | ||
1929 | { | ||
1930 | struct fw_ohci *ohci = pci_get_drvdata(pdev); | ||
1931 | int err; | ||
1932 | |||
1933 | software_reset(ohci); | ||
1934 | free_irq(pdev->irq, ohci); | ||
1935 | err = pci_save_state(pdev); | ||
1936 | if (err) { | ||
1937 | fw_error("pci_save_state failed with %d", err); | ||
1938 | return err; | ||
1939 | } | ||
1940 | err = pci_set_power_state(pdev, pci_choose_state(pdev, state)); | ||
1941 | if (err) { | ||
1942 | fw_error("pci_set_power_state failed with %d", err); | ||
1943 | return err; | ||
1944 | } | ||
1945 | |||
1946 | return 0; | ||
1947 | } | ||
1948 | |||
1949 | static int pci_resume(struct pci_dev *pdev) | ||
1950 | { | ||
1951 | struct fw_ohci *ohci = pci_get_drvdata(pdev); | ||
1952 | int err; | ||
1953 | |||
1954 | pci_set_power_state(pdev, PCI_D0); | ||
1955 | pci_restore_state(pdev); | ||
1956 | err = pci_enable_device(pdev); | ||
1957 | if (err) { | ||
1958 | fw_error("pci_enable_device failed with %d", err); | ||
1959 | return err; | ||
1960 | } | ||
1961 | |||
1962 | return ohci_enable(&ohci->card, ohci->config_rom, CONFIG_ROM_SIZE); | ||
1963 | } | ||
1964 | #endif | ||
1965 | |||
1911 | static struct pci_device_id pci_table[] = { | 1966 | static struct pci_device_id pci_table[] = { |
1912 | { PCI_DEVICE_CLASS(PCI_CLASS_SERIAL_FIREWIRE_OHCI, ~0) }, | 1967 | { PCI_DEVICE_CLASS(PCI_CLASS_SERIAL_FIREWIRE_OHCI, ~0) }, |
1913 | { } | 1968 | { } |
@@ -1920,6 +1975,10 @@ static struct pci_driver fw_ohci_pci_driver = { | |||
1920 | .id_table = pci_table, | 1975 | .id_table = pci_table, |
1921 | .probe = pci_probe, | 1976 | .probe = pci_probe, |
1922 | .remove = pci_remove, | 1977 | .remove = pci_remove, |
1978 | #ifdef CONFIG_PM | ||
1979 | .resume = pci_resume, | ||
1980 | .suspend = pci_suspend, | ||
1981 | #endif | ||
1923 | }; | 1982 | }; |
1924 | 1983 | ||
1925 | MODULE_AUTHOR("Kristian Hoegsberg <krh@bitplanet.net>"); | 1984 | MODULE_AUTHOR("Kristian Hoegsberg <krh@bitplanet.net>"); |
diff --git a/drivers/firewire/fw-sbp2.c b/drivers/firewire/fw-sbp2.c index 68300414e5f4..a98d3915e26f 100644 --- a/drivers/firewire/fw-sbp2.c +++ b/drivers/firewire/fw-sbp2.c | |||
@@ -1108,6 +1108,58 @@ static int sbp2_scsi_abort(struct scsi_cmnd *cmd) | |||
1108 | return SUCCESS; | 1108 | return SUCCESS; |
1109 | } | 1109 | } |
1110 | 1110 | ||
1111 | /* | ||
1112 | * Format of /sys/bus/scsi/devices/.../ieee1394_id: | ||
1113 | * u64 EUI-64 : u24 directory_ID : u16 LUN (all printed in hexadecimal) | ||
1114 | * | ||
1115 | * This is the concatenation of target port identifier and logical unit | ||
1116 | * identifier as per SAM-2...SAM-4 annex A. | ||
1117 | */ | ||
1118 | static ssize_t | ||
1119 | sbp2_sysfs_ieee1394_id_show(struct device *dev, struct device_attribute *attr, | ||
1120 | char *buf) | ||
1121 | { | ||
1122 | struct scsi_device *sdev = to_scsi_device(dev); | ||
1123 | struct sbp2_device *sd; | ||
1124 | struct fw_unit *unit; | ||
1125 | struct fw_device *device; | ||
1126 | u32 directory_id; | ||
1127 | struct fw_csr_iterator ci; | ||
1128 | int key, value, lun; | ||
1129 | |||
1130 | if (!sdev) | ||
1131 | return 0; | ||
1132 | sd = (struct sbp2_device *)sdev->host->hostdata; | ||
1133 | unit = sd->unit; | ||
1134 | device = fw_device(unit->device.parent); | ||
1135 | |||
1136 | /* implicit directory ID */ | ||
1137 | directory_id = ((unit->directory - device->config_rom) * 4 | ||
1138 | + CSR_CONFIG_ROM) & 0xffffff; | ||
1139 | |||
1140 | /* explicit directory ID, overrides implicit ID if present */ | ||
1141 | fw_csr_iterator_init(&ci, unit->directory); | ||
1142 | while (fw_csr_iterator_next(&ci, &key, &value)) | ||
1143 | if (key == CSR_DIRECTORY_ID) { | ||
1144 | directory_id = value; | ||
1145 | break; | ||
1146 | } | ||
1147 | |||
1148 | /* FIXME: Make this work for multi-lun devices. */ | ||
1149 | lun = 0; | ||
1150 | |||
1151 | return sprintf(buf, "%08x%08x:%06x:%04x\n", | ||
1152 | device->config_rom[3], device->config_rom[4], | ||
1153 | directory_id, lun); | ||
1154 | } | ||
1155 | |||
1156 | static DEVICE_ATTR(ieee1394_id, S_IRUGO, sbp2_sysfs_ieee1394_id_show, NULL); | ||
1157 | |||
1158 | static struct device_attribute *sbp2_scsi_sysfs_attrs[] = { | ||
1159 | &dev_attr_ieee1394_id, | ||
1160 | NULL | ||
1161 | }; | ||
1162 | |||
1111 | static struct scsi_host_template scsi_driver_template = { | 1163 | static struct scsi_host_template scsi_driver_template = { |
1112 | .module = THIS_MODULE, | 1164 | .module = THIS_MODULE, |
1113 | .name = "SBP-2 IEEE-1394", | 1165 | .name = "SBP-2 IEEE-1394", |
@@ -1121,6 +1173,7 @@ static struct scsi_host_template scsi_driver_template = { | |||
1121 | .use_clustering = ENABLE_CLUSTERING, | 1173 | .use_clustering = ENABLE_CLUSTERING, |
1122 | .cmd_per_lun = 1, | 1174 | .cmd_per_lun = 1, |
1123 | .can_queue = 1, | 1175 | .can_queue = 1, |
1176 | .sdev_attrs = sbp2_scsi_sysfs_attrs, | ||
1124 | }; | 1177 | }; |
1125 | 1178 | ||
1126 | MODULE_AUTHOR("Kristian Hoegsberg <krh@bitplanet.net>"); | 1179 | MODULE_AUTHOR("Kristian Hoegsberg <krh@bitplanet.net>"); |
diff --git a/drivers/i2c/busses/i2c-pxa.c b/drivers/i2c/busses/i2c-pxa.c index 8a0a99b93641..28e7b91a4553 100644 --- a/drivers/i2c/busses/i2c-pxa.c +++ b/drivers/i2c/busses/i2c-pxa.c | |||
@@ -837,20 +837,10 @@ static const struct i2c_algorithm i2c_pxa_algorithm = { | |||
837 | .functionality = i2c_pxa_functionality, | 837 | .functionality = i2c_pxa_functionality, |
838 | }; | 838 | }; |
839 | 839 | ||
840 | static struct pxa_i2c i2c_pxa = { | ||
841 | .lock = __SPIN_LOCK_UNLOCKED(i2c_pxa.lock), | ||
842 | .adap = { | ||
843 | .owner = THIS_MODULE, | ||
844 | .algo = &i2c_pxa_algorithm, | ||
845 | .name = "pxa2xx-i2c.0", | ||
846 | .retries = 5, | ||
847 | }, | ||
848 | }; | ||
849 | |||
850 | #define res_len(r) ((r)->end - (r)->start + 1) | 840 | #define res_len(r) ((r)->end - (r)->start + 1) |
851 | static int i2c_pxa_probe(struct platform_device *dev) | 841 | static int i2c_pxa_probe(struct platform_device *dev) |
852 | { | 842 | { |
853 | struct pxa_i2c *i2c = &i2c_pxa; | 843 | struct pxa_i2c *i2c; |
854 | struct resource *res; | 844 | struct resource *res; |
855 | struct i2c_pxa_platform_data *plat = dev->dev.platform_data; | 845 | struct i2c_pxa_platform_data *plat = dev->dev.platform_data; |
856 | int ret; | 846 | int ret; |
@@ -864,15 +854,20 @@ static int i2c_pxa_probe(struct platform_device *dev) | |||
864 | if (!request_mem_region(res->start, res_len(res), res->name)) | 854 | if (!request_mem_region(res->start, res_len(res), res->name)) |
865 | return -ENOMEM; | 855 | return -ENOMEM; |
866 | 856 | ||
867 | i2c = kmalloc(sizeof(struct pxa_i2c), GFP_KERNEL); | 857 | i2c = kzalloc(sizeof(struct pxa_i2c), GFP_KERNEL); |
868 | if (!i2c) { | 858 | if (!i2c) { |
869 | ret = -ENOMEM; | 859 | ret = -ENOMEM; |
870 | goto emalloc; | 860 | goto emalloc; |
871 | } | 861 | } |
872 | 862 | ||
873 | memcpy(i2c, &i2c_pxa, sizeof(struct pxa_i2c)); | 863 | i2c->adap.owner = THIS_MODULE; |
864 | i2c->adap.algo = &i2c_pxa_algorithm; | ||
865 | i2c->adap.retries = 5; | ||
866 | |||
867 | spin_lock_init(&i2c->lock); | ||
874 | init_waitqueue_head(&i2c->wait); | 868 | init_waitqueue_head(&i2c->wait); |
875 | i2c->adap.name[strlen(i2c->adap.name) - 1] = '0' + dev->id % 10; | 869 | |
870 | sprintf(i2c->adap.name, "pxa_i2c-i2c.%u", dev->id); | ||
876 | 871 | ||
877 | i2c->reg_base = ioremap(res->start, res_len(res)); | 872 | i2c->reg_base = ioremap(res->start, res_len(res)); |
878 | if (!i2c->reg_base) { | 873 | if (!i2c->reg_base) { |
diff --git a/drivers/ieee1394/nodemgr.c b/drivers/ieee1394/nodemgr.c index 835937e38529..81b3864d2ba7 100644 --- a/drivers/ieee1394/nodemgr.c +++ b/drivers/ieee1394/nodemgr.c | |||
@@ -976,7 +976,8 @@ static struct unit_directory *nodemgr_process_unit_directory | |||
976 | 976 | ||
977 | ud->ne = ne; | 977 | ud->ne = ne; |
978 | ud->ignore_driver = ignore_drivers; | 978 | ud->ignore_driver = ignore_drivers; |
979 | ud->address = ud_kv->offset + CSR1212_CONFIG_ROM_SPACE_BASE; | 979 | ud->address = ud_kv->offset + CSR1212_REGISTER_SPACE_BASE; |
980 | ud->directory_id = ud->address & 0xffffff; | ||
980 | ud->ud_kv = ud_kv; | 981 | ud->ud_kv = ud_kv; |
981 | ud->id = (*id)++; | 982 | ud->id = (*id)++; |
982 | 983 | ||
@@ -1085,6 +1086,10 @@ static struct unit_directory *nodemgr_process_unit_directory | |||
1085 | 1086 | ||
1086 | break; | 1087 | break; |
1087 | 1088 | ||
1089 | case CSR1212_KV_ID_DIRECTORY_ID: | ||
1090 | ud->directory_id = kv->value.immediate; | ||
1091 | break; | ||
1092 | |||
1088 | default: | 1093 | default: |
1089 | break; | 1094 | break; |
1090 | } | 1095 | } |
diff --git a/drivers/ieee1394/nodemgr.h b/drivers/ieee1394/nodemgr.h index e7ac683c72c7..4530b29d941c 100644 --- a/drivers/ieee1394/nodemgr.h +++ b/drivers/ieee1394/nodemgr.h | |||
@@ -75,6 +75,7 @@ struct unit_directory { | |||
75 | struct csr1212_keyval *model_name_kv; | 75 | struct csr1212_keyval *model_name_kv; |
76 | quadlet_t specifier_id; | 76 | quadlet_t specifier_id; |
77 | quadlet_t version; | 77 | quadlet_t version; |
78 | quadlet_t directory_id; | ||
78 | 79 | ||
79 | unsigned int id; | 80 | unsigned int id; |
80 | 81 | ||
diff --git a/drivers/ieee1394/sbp2.c b/drivers/ieee1394/sbp2.c index 875eadd5e8f5..3f873cc7e247 100644 --- a/drivers/ieee1394/sbp2.c +++ b/drivers/ieee1394/sbp2.c | |||
@@ -194,6 +194,27 @@ MODULE_PARM_DESC(workarounds, "Work around device bugs (default = 0" | |||
194 | ", override internal blacklist = " __stringify(SBP2_WORKAROUND_OVERRIDE) | 194 | ", override internal blacklist = " __stringify(SBP2_WORKAROUND_OVERRIDE) |
195 | ", or a combination)"); | 195 | ", or a combination)"); |
196 | 196 | ||
197 | /* | ||
198 | * This influences the format of the sysfs attribute | ||
199 | * /sys/bus/scsi/devices/.../ieee1394_id. | ||
200 | * | ||
201 | * The default format is like in older kernels: %016Lx:%d:%d | ||
202 | * It contains the target's EUI-64, a number given to the logical unit by | ||
203 | * the ieee1394 driver's nodemgr (starting at 0), and the LUN. | ||
204 | * | ||
205 | * The long format is: %016Lx:%06x:%04x | ||
206 | * It contains the target's EUI-64, the unit directory's directory_ID as per | ||
207 | * IEEE 1212 clause 7.7.19, and the LUN. This format comes closest to the | ||
208 | * format of SBP(-3) target port and logical unit identifier as per SAM (SCSI | ||
209 | * Architecture Model) rev.2 to 4 annex A. Therefore and because it is | ||
210 | * independent of the implementation of the ieee1394 nodemgr, the longer format | ||
211 | * is recommended for future use. | ||
212 | */ | ||
213 | static int sbp2_long_sysfs_ieee1394_id; | ||
214 | module_param_named(long_ieee1394_id, sbp2_long_sysfs_ieee1394_id, bool, 0644); | ||
215 | MODULE_PARM_DESC(long_ieee1394_id, "8+3+2 bytes format of ieee1394_id in sysfs " | ||
216 | "(default = backwards-compatible = N, SAM-conforming = Y)"); | ||
217 | |||
197 | 218 | ||
198 | #define SBP2_INFO(fmt, args...) HPSB_INFO("sbp2: "fmt, ## args) | 219 | #define SBP2_INFO(fmt, args...) HPSB_INFO("sbp2: "fmt, ## args) |
199 | #define SBP2_ERR(fmt, args...) HPSB_ERR("sbp2: "fmt, ## args) | 220 | #define SBP2_ERR(fmt, args...) HPSB_ERR("sbp2: "fmt, ## args) |
@@ -2100,8 +2121,14 @@ static ssize_t sbp2_sysfs_ieee1394_id_show(struct device *dev, | |||
2100 | if (!(lu = (struct sbp2_lu *)sdev->host->hostdata[0])) | 2121 | if (!(lu = (struct sbp2_lu *)sdev->host->hostdata[0])) |
2101 | return 0; | 2122 | return 0; |
2102 | 2123 | ||
2103 | return sprintf(buf, "%016Lx:%d:%d\n", (unsigned long long)lu->ne->guid, | 2124 | if (sbp2_long_sysfs_ieee1394_id) |
2104 | lu->ud->id, ORB_SET_LUN(lu->lun)); | 2125 | return sprintf(buf, "%016Lx:%06x:%04x\n", |
2126 | (unsigned long long)lu->ne->guid, | ||
2127 | lu->ud->directory_id, ORB_SET_LUN(lu->lun)); | ||
2128 | else | ||
2129 | return sprintf(buf, "%016Lx:%d:%d\n", | ||
2130 | (unsigned long long)lu->ne->guid, | ||
2131 | lu->ud->id, ORB_SET_LUN(lu->lun)); | ||
2105 | } | 2132 | } |
2106 | 2133 | ||
2107 | MODULE_AUTHOR("Ben Collins <bcollins@debian.org>"); | 2134 | MODULE_AUTHOR("Ben Collins <bcollins@debian.org>"); |
diff --git a/drivers/input/evdev.c b/drivers/input/evdev.c index b234729706be..be6b93c20f60 100644 --- a/drivers/input/evdev.c +++ b/drivers/input/evdev.c | |||
@@ -699,9 +699,9 @@ static void evdev_disconnect(struct input_handle *handle) | |||
699 | if (evdev->open) { | 699 | if (evdev->open) { |
700 | input_flush_device(handle, NULL); | 700 | input_flush_device(handle, NULL); |
701 | input_close_device(handle); | 701 | input_close_device(handle); |
702 | wake_up_interruptible(&evdev->wait); | ||
703 | list_for_each_entry(client, &evdev->client_list, node) | 702 | list_for_each_entry(client, &evdev->client_list, node) |
704 | kill_fasync(&client->fasync, SIGIO, POLL_HUP); | 703 | kill_fasync(&client->fasync, SIGIO, POLL_HUP); |
704 | wake_up_interruptible(&evdev->wait); | ||
705 | } else | 705 | } else |
706 | evdev_free(evdev); | 706 | evdev_free(evdev); |
707 | } | 707 | } |
diff --git a/drivers/input/joydev.c b/drivers/input/joydev.c index 06f0541b24da..10e3b7bc925f 100644 --- a/drivers/input/joydev.c +++ b/drivers/input/joydev.c | |||
@@ -594,9 +594,9 @@ static void joydev_disconnect(struct input_handle *handle) | |||
594 | 594 | ||
595 | if (joydev->open) { | 595 | if (joydev->open) { |
596 | input_close_device(handle); | 596 | input_close_device(handle); |
597 | wake_up_interruptible(&joydev->wait); | ||
598 | list_for_each_entry(client, &joydev->client_list, node) | 597 | list_for_each_entry(client, &joydev->client_list, node) |
599 | kill_fasync(&client->fasync, SIGIO, POLL_HUP); | 598 | kill_fasync(&client->fasync, SIGIO, POLL_HUP); |
599 | wake_up_interruptible(&joydev->wait); | ||
600 | } else | 600 | } else |
601 | joydev_free(joydev); | 601 | joydev_free(joydev); |
602 | } | 602 | } |
diff --git a/drivers/input/joystick/db9.c b/drivers/input/joystick/db9.c index 86ad1027e12a..b069ee18e353 100644 --- a/drivers/input/joystick/db9.c +++ b/drivers/input/joystick/db9.c | |||
@@ -54,7 +54,7 @@ static struct db9_config db9_cfg[DB9_MAX_PORTS] __initdata; | |||
54 | 54 | ||
55 | module_param_array_named(dev, db9_cfg[0].args, int, &db9_cfg[0].nargs, 0); | 55 | module_param_array_named(dev, db9_cfg[0].args, int, &db9_cfg[0].nargs, 0); |
56 | MODULE_PARM_DESC(dev, "Describes first attached device (<parport#>,<type>)"); | 56 | MODULE_PARM_DESC(dev, "Describes first attached device (<parport#>,<type>)"); |
57 | module_param_array_named(dev2, db9_cfg[1].args, int, &db9_cfg[0].nargs, 0); | 57 | module_param_array_named(dev2, db9_cfg[1].args, int, &db9_cfg[1].nargs, 0); |
58 | MODULE_PARM_DESC(dev2, "Describes second attached device (<parport#>,<type>)"); | 58 | MODULE_PARM_DESC(dev2, "Describes second attached device (<parport#>,<type>)"); |
59 | module_param_array_named(dev3, db9_cfg[2].args, int, &db9_cfg[2].nargs, 0); | 59 | module_param_array_named(dev3, db9_cfg[2].args, int, &db9_cfg[2].nargs, 0); |
60 | MODULE_PARM_DESC(dev3, "Describes third attached device (<parport#>,<type>)"); | 60 | MODULE_PARM_DESC(dev3, "Describes third attached device (<parport#>,<type>)"); |
diff --git a/drivers/input/mouse/Kconfig b/drivers/input/mouse/Kconfig index eb0167e9f0cb..50e06e8dd05d 100644 --- a/drivers/input/mouse/Kconfig +++ b/drivers/input/mouse/Kconfig | |||
@@ -48,7 +48,7 @@ config MOUSE_PS2_ALPS | |||
48 | If unsure, say Y. | 48 | If unsure, say Y. |
49 | 49 | ||
50 | config MOUSE_PS2_LOGIPS2PP | 50 | config MOUSE_PS2_LOGIPS2PP |
51 | bool "Logictech PS/2++ mouse protocol extension" if EMBEDDED | 51 | bool "Logitech PS/2++ mouse protocol extension" if EMBEDDED |
52 | default y | 52 | default y |
53 | depends on MOUSE_PS2 | 53 | depends on MOUSE_PS2 |
54 | help | 54 | help |
diff --git a/drivers/input/mousedev.c b/drivers/input/mousedev.c index 8675f9509393..3f4866d8d18c 100644 --- a/drivers/input/mousedev.c +++ b/drivers/input/mousedev.c | |||
@@ -766,9 +766,9 @@ static void mousedev_disconnect(struct input_handle *handle) | |||
766 | 766 | ||
767 | if (mousedev->open) { | 767 | if (mousedev->open) { |
768 | input_close_device(handle); | 768 | input_close_device(handle); |
769 | wake_up_interruptible(&mousedev->wait); | ||
770 | list_for_each_entry(client, &mousedev->client_list, node) | 769 | list_for_each_entry(client, &mousedev->client_list, node) |
771 | kill_fasync(&client->fasync, SIGIO, POLL_HUP); | 770 | kill_fasync(&client->fasync, SIGIO, POLL_HUP); |
771 | wake_up_interruptible(&mousedev->wait); | ||
772 | } else | 772 | } else |
773 | mousedev_free(mousedev); | 773 | mousedev_free(mousedev); |
774 | } | 774 | } |
diff --git a/drivers/input/serio/sa1111ps2.c b/drivers/input/serio/sa1111ps2.c index 559508795af1..d31ece8f68e9 100644 --- a/drivers/input/serio/sa1111ps2.c +++ b/drivers/input/serio/sa1111ps2.c | |||
@@ -170,7 +170,7 @@ static void ps2_close(struct serio *io) | |||
170 | /* | 170 | /* |
171 | * Clear the input buffer. | 171 | * Clear the input buffer. |
172 | */ | 172 | */ |
173 | static void __init ps2_clear_input(struct ps2if *ps2if) | 173 | static void __devinit ps2_clear_input(struct ps2if *ps2if) |
174 | { | 174 | { |
175 | int maxread = 100; | 175 | int maxread = 100; |
176 | 176 | ||
@@ -228,7 +228,7 @@ static int __init ps2_test(struct ps2if *ps2if) | |||
228 | /* | 228 | /* |
229 | * Add one device to this driver. | 229 | * Add one device to this driver. |
230 | */ | 230 | */ |
231 | static int ps2_probe(struct sa1111_dev *dev) | 231 | static int __devinit ps2_probe(struct sa1111_dev *dev) |
232 | { | 232 | { |
233 | struct ps2if *ps2if; | 233 | struct ps2if *ps2if; |
234 | struct serio *serio; | 234 | struct serio *serio; |
diff --git a/drivers/input/tsdev.c b/drivers/input/tsdev.c index 8238b13874c2..2db364898e15 100644 --- a/drivers/input/tsdev.c +++ b/drivers/input/tsdev.c | |||
@@ -476,9 +476,9 @@ static void tsdev_disconnect(struct input_handle *handle) | |||
476 | 476 | ||
477 | if (tsdev->open) { | 477 | if (tsdev->open) { |
478 | input_close_device(handle); | 478 | input_close_device(handle); |
479 | wake_up_interruptible(&tsdev->wait); | ||
480 | list_for_each_entry(client, &tsdev->client_list, node) | 479 | list_for_each_entry(client, &tsdev->client_list, node) |
481 | kill_fasync(&client->fasync, SIGIO, POLL_HUP); | 480 | kill_fasync(&client->fasync, SIGIO, POLL_HUP); |
481 | wake_up_interruptible(&tsdev->wait); | ||
482 | } else | 482 | } else |
483 | tsdev_free(tsdev); | 483 | tsdev_free(tsdev); |
484 | } | 484 | } |
diff --git a/drivers/isdn/Kconfig b/drivers/isdn/Kconfig index d42fe89cddf6..3e088c42b222 100644 --- a/drivers/isdn/Kconfig +++ b/drivers/isdn/Kconfig | |||
@@ -26,9 +26,9 @@ menu "Old ISDN4Linux" | |||
26 | depends on NET && ISDN | 26 | depends on NET && ISDN |
27 | 27 | ||
28 | config ISDN_I4L | 28 | config ISDN_I4L |
29 | tristate "Old ISDN4Linux (obsolete)" | 29 | tristate "Old ISDN4Linux (deprecated)" |
30 | ---help--- | 30 | ---help--- |
31 | This driver allows you to use an ISDN-card for networking | 31 | This driver allows you to use an ISDN adapter for networking |
32 | connections and as dialin/out device. The isdn-tty's have a built | 32 | connections and as dialin/out device. The isdn-tty's have a built |
33 | in AT-compatible modem emulator. Network devices support autodial, | 33 | in AT-compatible modem emulator. Network devices support autodial, |
34 | channel-bundling, callback and caller-authentication without having | 34 | channel-bundling, callback and caller-authentication without having |
@@ -39,8 +39,9 @@ config ISDN_I4L | |||
39 | 39 | ||
40 | ISDN support in the linux kernel is moving towards a new API, | 40 | ISDN support in the linux kernel is moving towards a new API, |
41 | called CAPI (Common ISDN Application Programming Interface). | 41 | called CAPI (Common ISDN Application Programming Interface). |
42 | Therefore the old ISDN4Linux layer is becoming obsolete. It is | 42 | Therefore the old ISDN4Linux layer will eventually become obsolete. |
43 | still usable, though, if you select this option. | 43 | It is still available, though, for use with adapters that are not |
44 | supported by the new CAPI subsystem yet. | ||
44 | 45 | ||
45 | if ISDN_I4L | 46 | if ISDN_I4L |
46 | source "drivers/isdn/i4l/Kconfig" | 47 | source "drivers/isdn/i4l/Kconfig" |
diff --git a/drivers/isdn/hardware/eicon/diva_didd.c b/drivers/isdn/hardware/eicon/diva_didd.c index 14298b8c835f..d755d904e62c 100644 --- a/drivers/isdn/hardware/eicon/diva_didd.c +++ b/drivers/isdn/hardware/eicon/diva_didd.c | |||
@@ -99,7 +99,7 @@ static int DIVA_INIT_FUNCTION create_proc(void) | |||
99 | return (0); | 99 | return (0); |
100 | } | 100 | } |
101 | 101 | ||
102 | static void DIVA_EXIT_FUNCTION remove_proc(void) | 102 | static void remove_proc(void) |
103 | { | 103 | { |
104 | remove_proc_entry(DRIVERLNAME, proc_net_eicon); | 104 | remove_proc_entry(DRIVERLNAME, proc_net_eicon); |
105 | remove_proc_entry("net/eicon", NULL); | 105 | remove_proc_entry("net/eicon", NULL); |
diff --git a/drivers/isdn/hardware/eicon/divasfunc.c b/drivers/isdn/hardware/eicon/divasfunc.c index df61e510a28b..46fc21a3f8ff 100644 --- a/drivers/isdn/hardware/eicon/divasfunc.c +++ b/drivers/isdn/hardware/eicon/divasfunc.c | |||
@@ -231,7 +231,7 @@ int DIVA_INIT_FUNCTION divasfunc_init(int dbgmask) | |||
231 | /* | 231 | /* |
232 | * exit | 232 | * exit |
233 | */ | 233 | */ |
234 | void DIVA_EXIT_FUNCTION divasfunc_exit(void) | 234 | void divasfunc_exit(void) |
235 | { | 235 | { |
236 | divasa_xdi_driver_unload(); | 236 | divasa_xdi_driver_unload(); |
237 | disconnect_didd(); | 237 | disconnect_didd(); |
diff --git a/drivers/isdn/i4l/isdn_tty.c b/drivers/isdn/i4l/isdn_tty.c index ea5f30d4a5a2..4e5f87c1e714 100644 --- a/drivers/isdn/i4l/isdn_tty.c +++ b/drivers/isdn/i4l/isdn_tty.c | |||
@@ -2693,8 +2693,9 @@ isdn_tty_getdial(char *p, char *q,int cnt) | |||
2693 | int limit = ISDN_MSNLEN - 1; /* MUST match the size of interface var to avoid | 2693 | int limit = ISDN_MSNLEN - 1; /* MUST match the size of interface var to avoid |
2694 | buffer overflow */ | 2694 | buffer overflow */ |
2695 | 2695 | ||
2696 | while (strchr(" 0123456789,#.*WPTS-", *p) && *p && --cnt>0) { | 2696 | while (strchr(" 0123456789,#.*WPTSR-", *p) && *p && --cnt>0) { |
2697 | if ((*p >= '0' && *p <= '9') || ((*p == 'S') && first) || | 2697 | if ((*p >= '0' && *p <= '9') || ((*p == 'S') && first) || |
2698 | ((*p == 'R') && first) || | ||
2698 | (*p == '*') || (*p == '#')) { | 2699 | (*p == '*') || (*p == '#')) { |
2699 | *q++ = *p; | 2700 | *q++ = *p; |
2700 | limit--; | 2701 | limit--; |
diff --git a/drivers/kvm/vmx.c b/drivers/kvm/vmx.c index e6e4d240b2a6..184238e2ece4 100644 --- a/drivers/kvm/vmx.c +++ b/drivers/kvm/vmx.c | |||
@@ -639,7 +639,7 @@ static void free_vmcs(struct vmcs *vmcs) | |||
639 | free_pages((unsigned long)vmcs, vmcs_descriptor.order); | 639 | free_pages((unsigned long)vmcs, vmcs_descriptor.order); |
640 | } | 640 | } |
641 | 641 | ||
642 | static __exit void free_kvm_area(void) | 642 | static void free_kvm_area(void) |
643 | { | 643 | { |
644 | int cpu; | 644 | int cpu; |
645 | 645 | ||
diff --git a/drivers/macintosh/Kconfig b/drivers/macintosh/Kconfig index f44c94abd883..ee699a7d6214 100644 --- a/drivers/macintosh/Kconfig +++ b/drivers/macintosh/Kconfig | |||
@@ -114,7 +114,7 @@ config PMAC_SMU | |||
114 | config PMAC_APM_EMU | 114 | config PMAC_APM_EMU |
115 | tristate "APM emulation" | 115 | tristate "APM emulation" |
116 | select APM_EMULATION | 116 | select APM_EMULATION |
117 | depends on ADB_PMU && PM | 117 | depends on ADB_PMU && PM && PPC32 |
118 | 118 | ||
119 | config PMAC_MEDIABAY | 119 | config PMAC_MEDIABAY |
120 | bool "Support PowerBook hotswap media bay" | 120 | bool "Support PowerBook hotswap media bay" |
diff --git a/drivers/mfd/ucb1x00-ts.c b/drivers/mfd/ucb1x00-ts.c index 7772bd1d92b4..38e815a2e871 100644 --- a/drivers/mfd/ucb1x00-ts.c +++ b/drivers/mfd/ucb1x00-ts.c | |||
@@ -291,7 +291,7 @@ static void ucb1x00_ts_irq(int idx, void *id) | |||
291 | 291 | ||
292 | static int ucb1x00_ts_open(struct input_dev *idev) | 292 | static int ucb1x00_ts_open(struct input_dev *idev) |
293 | { | 293 | { |
294 | struct ucb1x00_ts *ts = idev->private; | 294 | struct ucb1x00_ts *ts = input_get_drvdata(idev); |
295 | int ret = 0; | 295 | int ret = 0; |
296 | 296 | ||
297 | BUG_ON(ts->rtask); | 297 | BUG_ON(ts->rtask); |
@@ -328,7 +328,7 @@ static int ucb1x00_ts_open(struct input_dev *idev) | |||
328 | */ | 328 | */ |
329 | static void ucb1x00_ts_close(struct input_dev *idev) | 329 | static void ucb1x00_ts_close(struct input_dev *idev) |
330 | { | 330 | { |
331 | struct ucb1x00_ts *ts = idev->private; | 331 | struct ucb1x00_ts *ts = input_get_drvdata(idev); |
332 | 332 | ||
333 | if (ts->rtask) | 333 | if (ts->rtask) |
334 | kthread_stop(ts->rtask); | 334 | kthread_stop(ts->rtask); |
@@ -380,7 +380,6 @@ static int ucb1x00_ts_add(struct ucb1x00_dev *dev) | |||
380 | ts->idev = idev; | 380 | ts->idev = idev; |
381 | ts->adcsync = adcsync ? UCB_SYNC : UCB_NOSYNC; | 381 | ts->adcsync = adcsync ? UCB_SYNC : UCB_NOSYNC; |
382 | 382 | ||
383 | idev->private = ts; | ||
384 | idev->name = "Touchscreen panel"; | 383 | idev->name = "Touchscreen panel"; |
385 | idev->id.product = ts->ucb->id; | 384 | idev->id.product = ts->ucb->id; |
386 | idev->open = ucb1x00_ts_open; | 385 | idev->open = ucb1x00_ts_open; |
@@ -391,6 +390,8 @@ static int ucb1x00_ts_add(struct ucb1x00_dev *dev) | |||
391 | __set_bit(ABS_Y, idev->absbit); | 390 | __set_bit(ABS_Y, idev->absbit); |
392 | __set_bit(ABS_PRESSURE, idev->absbit); | 391 | __set_bit(ABS_PRESSURE, idev->absbit); |
393 | 392 | ||
393 | input_set_drvdata(idev, ts); | ||
394 | |||
394 | err = input_register_device(idev); | 395 | err = input_register_device(idev); |
395 | if (err) | 396 | if (err) |
396 | goto fail; | 397 | goto fail; |
diff --git a/drivers/misc/thinkpad_acpi.c b/drivers/misc/thinkpad_acpi.c index 6c36a55cb3d1..95c0b96e83f2 100644 --- a/drivers/misc/thinkpad_acpi.c +++ b/drivers/misc/thinkpad_acpi.c | |||
@@ -740,7 +740,7 @@ static ssize_t hotkey_enable_store(struct device *dev, | |||
740 | } | 740 | } |
741 | 741 | ||
742 | static struct device_attribute dev_attr_hotkey_enable = | 742 | static struct device_attribute dev_attr_hotkey_enable = |
743 | __ATTR(enable, S_IWUSR | S_IRUGO, | 743 | __ATTR(hotkey_enable, S_IWUSR | S_IRUGO, |
744 | hotkey_enable_show, hotkey_enable_store); | 744 | hotkey_enable_show, hotkey_enable_store); |
745 | 745 | ||
746 | /* sysfs hotkey mask --------------------------------------------------- */ | 746 | /* sysfs hotkey mask --------------------------------------------------- */ |
@@ -775,7 +775,7 @@ static ssize_t hotkey_mask_store(struct device *dev, | |||
775 | } | 775 | } |
776 | 776 | ||
777 | static struct device_attribute dev_attr_hotkey_mask = | 777 | static struct device_attribute dev_attr_hotkey_mask = |
778 | __ATTR(mask, S_IWUSR | S_IRUGO, | 778 | __ATTR(hotkey_mask, S_IWUSR | S_IRUGO, |
779 | hotkey_mask_show, hotkey_mask_store); | 779 | hotkey_mask_show, hotkey_mask_store); |
780 | 780 | ||
781 | /* sysfs hotkey bios_enabled ------------------------------------------- */ | 781 | /* sysfs hotkey bios_enabled ------------------------------------------- */ |
@@ -787,7 +787,7 @@ static ssize_t hotkey_bios_enabled_show(struct device *dev, | |||
787 | } | 787 | } |
788 | 788 | ||
789 | static struct device_attribute dev_attr_hotkey_bios_enabled = | 789 | static struct device_attribute dev_attr_hotkey_bios_enabled = |
790 | __ATTR(bios_enabled, S_IRUGO, hotkey_bios_enabled_show, NULL); | 790 | __ATTR(hotkey_bios_enabled, S_IRUGO, hotkey_bios_enabled_show, NULL); |
791 | 791 | ||
792 | /* sysfs hotkey bios_mask ---------------------------------------------- */ | 792 | /* sysfs hotkey bios_mask ---------------------------------------------- */ |
793 | static ssize_t hotkey_bios_mask_show(struct device *dev, | 793 | static ssize_t hotkey_bios_mask_show(struct device *dev, |
@@ -798,7 +798,7 @@ static ssize_t hotkey_bios_mask_show(struct device *dev, | |||
798 | } | 798 | } |
799 | 799 | ||
800 | static struct device_attribute dev_attr_hotkey_bios_mask = | 800 | static struct device_attribute dev_attr_hotkey_bios_mask = |
801 | __ATTR(bios_mask, S_IRUGO, hotkey_bios_mask_show, NULL); | 801 | __ATTR(hotkey_bios_mask, S_IRUGO, hotkey_bios_mask_show, NULL); |
802 | 802 | ||
803 | /* --------------------------------------------------------------------- */ | 803 | /* --------------------------------------------------------------------- */ |
804 | 804 | ||
@@ -824,8 +824,7 @@ static int __init hotkey_init(struct ibm_init_struct *iibm) | |||
824 | str_supported(tp_features.hotkey)); | 824 | str_supported(tp_features.hotkey)); |
825 | 825 | ||
826 | if (tp_features.hotkey) { | 826 | if (tp_features.hotkey) { |
827 | hotkey_dev_attributes = create_attr_set(4, | 827 | hotkey_dev_attributes = create_attr_set(4, NULL); |
828 | TPACPI_HOTKEY_SYSFS_GROUP); | ||
829 | if (!hotkey_dev_attributes) | 828 | if (!hotkey_dev_attributes) |
830 | return -ENOMEM; | 829 | return -ENOMEM; |
831 | res = add_to_attr_set(hotkey_dev_attributes, | 830 | res = add_to_attr_set(hotkey_dev_attributes, |
@@ -1050,7 +1049,7 @@ static ssize_t bluetooth_enable_store(struct device *dev, | |||
1050 | } | 1049 | } |
1051 | 1050 | ||
1052 | static struct device_attribute dev_attr_bluetooth_enable = | 1051 | static struct device_attribute dev_attr_bluetooth_enable = |
1053 | __ATTR(enable, S_IWUSR | S_IRUGO, | 1052 | __ATTR(bluetooth_enable, S_IWUSR | S_IRUGO, |
1054 | bluetooth_enable_show, bluetooth_enable_store); | 1053 | bluetooth_enable_show, bluetooth_enable_store); |
1055 | 1054 | ||
1056 | /* --------------------------------------------------------------------- */ | 1055 | /* --------------------------------------------------------------------- */ |
@@ -1061,7 +1060,6 @@ static struct attribute *bluetooth_attributes[] = { | |||
1061 | }; | 1060 | }; |
1062 | 1061 | ||
1063 | static const struct attribute_group bluetooth_attr_group = { | 1062 | static const struct attribute_group bluetooth_attr_group = { |
1064 | .name = TPACPI_BLUETH_SYSFS_GROUP, | ||
1065 | .attrs = bluetooth_attributes, | 1063 | .attrs = bluetooth_attributes, |
1066 | }; | 1064 | }; |
1067 | 1065 | ||
@@ -1215,7 +1213,7 @@ static ssize_t wan_enable_store(struct device *dev, | |||
1215 | } | 1213 | } |
1216 | 1214 | ||
1217 | static struct device_attribute dev_attr_wan_enable = | 1215 | static struct device_attribute dev_attr_wan_enable = |
1218 | __ATTR(enable, S_IWUSR | S_IRUGO, | 1216 | __ATTR(wwan_enable, S_IWUSR | S_IRUGO, |
1219 | wan_enable_show, wan_enable_store); | 1217 | wan_enable_show, wan_enable_store); |
1220 | 1218 | ||
1221 | /* --------------------------------------------------------------------- */ | 1219 | /* --------------------------------------------------------------------- */ |
@@ -1226,7 +1224,6 @@ static struct attribute *wan_attributes[] = { | |||
1226 | }; | 1224 | }; |
1227 | 1225 | ||
1228 | static const struct attribute_group wan_attr_group = { | 1226 | static const struct attribute_group wan_attr_group = { |
1229 | .name = TPACPI_WAN_SYSFS_GROUP, | ||
1230 | .attrs = wan_attributes, | 1227 | .attrs = wan_attributes, |
1231 | }; | 1228 | }; |
1232 | 1229 | ||
diff --git a/drivers/misc/thinkpad_acpi.h b/drivers/misc/thinkpad_acpi.h index 440145a02617..72d62f2dabb9 100644 --- a/drivers/misc/thinkpad_acpi.h +++ b/drivers/misc/thinkpad_acpi.h | |||
@@ -278,8 +278,6 @@ static int beep_write(char *buf); | |||
278 | * Bluetooth subdriver | 278 | * Bluetooth subdriver |
279 | */ | 279 | */ |
280 | 280 | ||
281 | #define TPACPI_BLUETH_SYSFS_GROUP "bluetooth" | ||
282 | |||
283 | enum { | 281 | enum { |
284 | /* ACPI GBDC/SBDC bits */ | 282 | /* ACPI GBDC/SBDC bits */ |
285 | TP_ACPI_BLUETOOTH_HWPRESENT = 0x01, /* Bluetooth hw available */ | 283 | TP_ACPI_BLUETOOTH_HWPRESENT = 0x01, /* Bluetooth hw available */ |
@@ -416,8 +414,6 @@ static int fan_write_cmd_watchdog(const char *cmd, int *rc); | |||
416 | * Hotkey subdriver | 414 | * Hotkey subdriver |
417 | */ | 415 | */ |
418 | 416 | ||
419 | #define TPACPI_HOTKEY_SYSFS_GROUP "hotkey" | ||
420 | |||
421 | static int hotkey_orig_status; | 417 | static int hotkey_orig_status; |
422 | static int hotkey_orig_mask; | 418 | static int hotkey_orig_mask; |
423 | 419 | ||
@@ -553,8 +549,6 @@ static int volume_write(char *buf); | |||
553 | * Wan subdriver | 549 | * Wan subdriver |
554 | */ | 550 | */ |
555 | 551 | ||
556 | #define TPACPI_WAN_SYSFS_GROUP "wwan" | ||
557 | |||
558 | enum { | 552 | enum { |
559 | /* ACPI GWAN/SWAN bits */ | 553 | /* ACPI GWAN/SWAN bits */ |
560 | TP_ACPI_WANCARD_HWPRESENT = 0x01, /* Wan hw available */ | 554 | TP_ACPI_WANCARD_HWPRESENT = 0x01, /* Wan hw available */ |
diff --git a/drivers/misc/tifm_7xx1.c b/drivers/misc/tifm_7xx1.c index c08ad8f823d2..2d1b3df95c5b 100644 --- a/drivers/misc/tifm_7xx1.c +++ b/drivers/misc/tifm_7xx1.c | |||
@@ -343,7 +343,7 @@ static int tifm_7xx1_probe(struct pci_dev *dev, | |||
343 | if (!fm->addr) | 343 | if (!fm->addr) |
344 | goto err_out_free; | 344 | goto err_out_free; |
345 | 345 | ||
346 | rc = request_irq(dev->irq, tifm_7xx1_isr, SA_SHIRQ, DRIVER_NAME, fm); | 346 | rc = request_irq(dev->irq, tifm_7xx1_isr, IRQF_SHARED, DRIVER_NAME, fm); |
347 | if (rc) | 347 | if (rc) |
348 | goto err_out_unmap; | 348 | goto err_out_unmap; |
349 | 349 | ||
diff --git a/drivers/mtd/devices/pmc551.c b/drivers/mtd/devices/pmc551.c index a4873ab84e6b..e8f686f7a357 100644 --- a/drivers/mtd/devices/pmc551.c +++ b/drivers/mtd/devices/pmc551.c | |||
@@ -650,7 +650,7 @@ MODULE_DESCRIPTION(PMC551_VERSION); | |||
650 | */ | 650 | */ |
651 | static int msize = 0; | 651 | static int msize = 0; |
652 | #if defined(CONFIG_MTD_PMC551_APERTURE_SIZE) | 652 | #if defined(CONFIG_MTD_PMC551_APERTURE_SIZE) |
653 | static int asize = CONFIG_MTD_PMC551_APERTURE_SIZE | 653 | static int asize = CONFIG_MTD_PMC551_APERTURE_SIZE; |
654 | #else | 654 | #else |
655 | static int asize = 0; | 655 | static int asize = 0; |
656 | #endif | 656 | #endif |
diff --git a/drivers/mtd/nand/autcpu12.c b/drivers/mtd/nand/autcpu12.c index fe94ae9ae1f2..e3744eb8eccb 100644 --- a/drivers/mtd/nand/autcpu12.c +++ b/drivers/mtd/nand/autcpu12.c | |||
@@ -101,7 +101,7 @@ static void autcpu12_hwcontrol(struct mtd_info *mtd, int cmd, | |||
101 | struct nand_chip *chip = mtd->priv; | 101 | struct nand_chip *chip = mtd->priv; |
102 | 102 | ||
103 | if (ctrl & NAND_CTRL_CHANGE) { | 103 | if (ctrl & NAND_CTRL_CHANGE) { |
104 | void __iomem *addr | 104 | void __iomem *addr; |
105 | unsigned char bits; | 105 | unsigned char bits; |
106 | 106 | ||
107 | addr = CS89712_VIRT_BASE + AUTCPU12_SMC_PORT_OFFSET; | 107 | addr = CS89712_VIRT_BASE + AUTCPU12_SMC_PORT_OFFSET; |
diff --git a/drivers/mtd/nand/ppchameleonevb.c b/drivers/mtd/nand/ppchameleonevb.c index eb7d4d443deb..082073acf20f 100644 --- a/drivers/mtd/nand/ppchameleonevb.c +++ b/drivers/mtd/nand/ppchameleonevb.c | |||
@@ -81,7 +81,7 @@ __setup("ppchameleonevb_fio_pbase=", ppchameleonevb_fio_pbase); | |||
81 | */ | 81 | */ |
82 | static struct mtd_partition partition_info_hi[] = { | 82 | static struct mtd_partition partition_info_hi[] = { |
83 | { .name = "PPChameleon HI Nand Flash", | 83 | { .name = "PPChameleon HI Nand Flash", |
84 | offset = 0, | 84 | .offset = 0, |
85 | .size = 128 * 1024 * 1024 | 85 | .size = 128 * 1024 * 1024 |
86 | } | 86 | } |
87 | }; | 87 | }; |
@@ -424,9 +424,9 @@ static void __exit ppchameleonevb_cleanup(void) | |||
424 | 424 | ||
425 | /* Release iomaps */ | 425 | /* Release iomaps */ |
426 | this = (struct nand_chip *) &ppchameleon_mtd[1]; | 426 | this = (struct nand_chip *) &ppchameleon_mtd[1]; |
427 | iounmap((void *) this->IO_ADDR_R; | 427 | iounmap((void *) this->IO_ADDR_R); |
428 | this = (struct nand_chip *) &ppchameleonevb_mtd[1]; | 428 | this = (struct nand_chip *) &ppchameleonevb_mtd[1]; |
429 | iounmap((void *) this->IO_ADDR_R; | 429 | iounmap((void *) this->IO_ADDR_R); |
430 | 430 | ||
431 | /* Free the MTD device structure */ | 431 | /* Free the MTD device structure */ |
432 | kfree (ppchameleon_mtd); | 432 | kfree (ppchameleon_mtd); |
diff --git a/drivers/net/8139cp.c b/drivers/net/8139cp.c index e8c9f27817b0..a804965e6542 100644 --- a/drivers/net/8139cp.c +++ b/drivers/net/8139cp.c | |||
@@ -435,20 +435,12 @@ static void cp_vlan_rx_register(struct net_device *dev, struct vlan_group *grp) | |||
435 | 435 | ||
436 | spin_lock_irqsave(&cp->lock, flags); | 436 | spin_lock_irqsave(&cp->lock, flags); |
437 | cp->vlgrp = grp; | 437 | cp->vlgrp = grp; |
438 | cp->cpcmd |= RxVlanOn; | 438 | if (grp) |
439 | cpw16(CpCmd, cp->cpcmd); | 439 | cp->cpcmd |= RxVlanOn; |
440 | spin_unlock_irqrestore(&cp->lock, flags); | 440 | else |
441 | } | 441 | cp->cpcmd &= ~RxVlanOn; |
442 | |||
443 | static void cp_vlan_rx_kill_vid(struct net_device *dev, unsigned short vid) | ||
444 | { | ||
445 | struct cp_private *cp = netdev_priv(dev); | ||
446 | unsigned long flags; | ||
447 | 442 | ||
448 | spin_lock_irqsave(&cp->lock, flags); | ||
449 | cp->cpcmd &= ~RxVlanOn; | ||
450 | cpw16(CpCmd, cp->cpcmd); | 443 | cpw16(CpCmd, cp->cpcmd); |
451 | vlan_group_set_device(cp->vlgrp, vid, NULL); | ||
452 | spin_unlock_irqrestore(&cp->lock, flags); | 444 | spin_unlock_irqrestore(&cp->lock, flags); |
453 | } | 445 | } |
454 | #endif /* CP_VLAN_TAG_USED */ | 446 | #endif /* CP_VLAN_TAG_USED */ |
@@ -1944,7 +1936,6 @@ static int cp_init_one (struct pci_dev *pdev, const struct pci_device_id *ent) | |||
1944 | #if CP_VLAN_TAG_USED | 1936 | #if CP_VLAN_TAG_USED |
1945 | dev->features |= NETIF_F_HW_VLAN_TX | NETIF_F_HW_VLAN_RX; | 1937 | dev->features |= NETIF_F_HW_VLAN_TX | NETIF_F_HW_VLAN_RX; |
1946 | dev->vlan_rx_register = cp_vlan_rx_register; | 1938 | dev->vlan_rx_register = cp_vlan_rx_register; |
1947 | dev->vlan_rx_kill_vid = cp_vlan_rx_kill_vid; | ||
1948 | #endif | 1939 | #endif |
1949 | 1940 | ||
1950 | if (pci_using_dac) | 1941 | if (pci_using_dac) |
diff --git a/drivers/net/Kconfig b/drivers/net/Kconfig index 1798a9f9fb25..7d57f4a25dc1 100644 --- a/drivers/net/Kconfig +++ b/drivers/net/Kconfig | |||
@@ -2280,6 +2280,7 @@ config GFAR_NAPI | |||
2280 | config UCC_GETH | 2280 | config UCC_GETH |
2281 | tristate "Freescale QE Gigabit Ethernet" | 2281 | tristate "Freescale QE Gigabit Ethernet" |
2282 | depends on QUICC_ENGINE | 2282 | depends on QUICC_ENGINE |
2283 | select PHYLIB | ||
2283 | help | 2284 | help |
2284 | This driver supports the Gigabit Ethernet mode of the QUICC Engine, | 2285 | This driver supports the Gigabit Ethernet mode of the QUICC Engine, |
2285 | which is available on some Freescale SOCs. | 2286 | which is available on some Freescale SOCs. |
diff --git a/drivers/net/acenic.c b/drivers/net/acenic.c index 7122b7ba8d61..04382f979c99 100644 --- a/drivers/net/acenic.c +++ b/drivers/net/acenic.c | |||
@@ -480,12 +480,10 @@ static int __devinit acenic_probe_one(struct pci_dev *pdev, | |||
480 | #if ACENIC_DO_VLAN | 480 | #if ACENIC_DO_VLAN |
481 | dev->features |= NETIF_F_HW_VLAN_TX | NETIF_F_HW_VLAN_RX; | 481 | dev->features |= NETIF_F_HW_VLAN_TX | NETIF_F_HW_VLAN_RX; |
482 | dev->vlan_rx_register = ace_vlan_rx_register; | 482 | dev->vlan_rx_register = ace_vlan_rx_register; |
483 | dev->vlan_rx_kill_vid = ace_vlan_rx_kill_vid; | ||
484 | #endif | 483 | #endif |
485 | if (1) { | 484 | |
486 | dev->tx_timeout = &ace_watchdog; | 485 | dev->tx_timeout = &ace_watchdog; |
487 | dev->watchdog_timeo = 5*HZ; | 486 | dev->watchdog_timeo = 5*HZ; |
488 | } | ||
489 | 487 | ||
490 | dev->open = &ace_open; | 488 | dev->open = &ace_open; |
491 | dev->stop = &ace_close; | 489 | dev->stop = &ace_close; |
@@ -2283,19 +2281,6 @@ static void ace_vlan_rx_register(struct net_device *dev, struct vlan_group *grp) | |||
2283 | ace_unmask_irq(dev); | 2281 | ace_unmask_irq(dev); |
2284 | local_irq_restore(flags); | 2282 | local_irq_restore(flags); |
2285 | } | 2283 | } |
2286 | |||
2287 | |||
2288 | static void ace_vlan_rx_kill_vid(struct net_device *dev, unsigned short vid) | ||
2289 | { | ||
2290 | struct ace_private *ap = netdev_priv(dev); | ||
2291 | unsigned long flags; | ||
2292 | |||
2293 | local_irq_save(flags); | ||
2294 | ace_mask_irq(dev); | ||
2295 | vlan_group_set_device(ap->vlgrp, vid, NULL); | ||
2296 | ace_unmask_irq(dev); | ||
2297 | local_irq_restore(flags); | ||
2298 | } | ||
2299 | #endif /* ACENIC_DO_VLAN */ | 2284 | #endif /* ACENIC_DO_VLAN */ |
2300 | 2285 | ||
2301 | 2286 | ||
diff --git a/drivers/net/acenic.h b/drivers/net/acenic.h index 8ca8534d70bf..60ed1837fa8f 100644 --- a/drivers/net/acenic.h +++ b/drivers/net/acenic.h | |||
@@ -787,7 +787,6 @@ static struct net_device_stats *ace_get_stats(struct net_device *dev); | |||
787 | static int read_eeprom_byte(struct net_device *dev, unsigned long offset); | 787 | static int read_eeprom_byte(struct net_device *dev, unsigned long offset); |
788 | #if ACENIC_DO_VLAN | 788 | #if ACENIC_DO_VLAN |
789 | static void ace_vlan_rx_register(struct net_device *dev, struct vlan_group *grp); | 789 | static void ace_vlan_rx_register(struct net_device *dev, struct vlan_group *grp); |
790 | static void ace_vlan_rx_kill_vid(struct net_device *dev, unsigned short vid); | ||
791 | #endif | 790 | #endif |
792 | 791 | ||
793 | #endif /* _ACENIC_H_ */ | 792 | #endif /* _ACENIC_H_ */ |
diff --git a/drivers/net/amd8111e.c b/drivers/net/amd8111e.c index 675fe918421b..a61b2f89fc33 100644 --- a/drivers/net/amd8111e.c +++ b/drivers/net/amd8111e.c | |||
@@ -155,7 +155,7 @@ This function will write into PHY registers. | |||
155 | */ | 155 | */ |
156 | static int amd8111e_write_phy(struct amd8111e_priv* lp,int phy_id, int reg, u32 val) | 156 | static int amd8111e_write_phy(struct amd8111e_priv* lp,int phy_id, int reg, u32 val) |
157 | { | 157 | { |
158 | unsigned int repeat = REPEAT_CNT | 158 | unsigned int repeat = REPEAT_CNT; |
159 | void __iomem *mmio = lp->mmio; | 159 | void __iomem *mmio = lp->mmio; |
160 | unsigned int reg_val; | 160 | unsigned int reg_val; |
161 | 161 | ||
@@ -1728,15 +1728,8 @@ static void amd8111e_vlan_rx_register(struct net_device *dev, struct vlan_group | |||
1728 | lp->vlgrp = grp; | 1728 | lp->vlgrp = grp; |
1729 | spin_unlock_irq(&lp->lock); | 1729 | spin_unlock_irq(&lp->lock); |
1730 | } | 1730 | } |
1731 | |||
1732 | static void amd8111e_vlan_rx_kill_vid(struct net_device *dev, unsigned short vid) | ||
1733 | { | ||
1734 | struct amd8111e_priv *lp = netdev_priv(dev); | ||
1735 | spin_lock_irq(&lp->lock); | ||
1736 | vlan_group_set_device(lp->vlgrp, vid, NULL); | ||
1737 | spin_unlock_irq(&lp->lock); | ||
1738 | } | ||
1739 | #endif | 1731 | #endif |
1732 | |||
1740 | static int amd8111e_enable_magicpkt(struct amd8111e_priv* lp) | 1733 | static int amd8111e_enable_magicpkt(struct amd8111e_priv* lp) |
1741 | { | 1734 | { |
1742 | writel( VAL1|MPPLBA, lp->mmio + CMD3); | 1735 | writel( VAL1|MPPLBA, lp->mmio + CMD3); |
@@ -1996,7 +1989,6 @@ static int __devinit amd8111e_probe_one(struct pci_dev *pdev, | |||
1996 | #if AMD8111E_VLAN_TAG_USED | 1989 | #if AMD8111E_VLAN_TAG_USED |
1997 | dev->features |= NETIF_F_HW_VLAN_TX | NETIF_F_HW_VLAN_RX ; | 1990 | dev->features |= NETIF_F_HW_VLAN_TX | NETIF_F_HW_VLAN_RX ; |
1998 | dev->vlan_rx_register =amd8111e_vlan_rx_register; | 1991 | dev->vlan_rx_register =amd8111e_vlan_rx_register; |
1999 | dev->vlan_rx_kill_vid = amd8111e_vlan_rx_kill_vid; | ||
2000 | #endif | 1992 | #endif |
2001 | 1993 | ||
2002 | lp = netdev_priv(dev); | 1994 | lp = netdev_priv(dev); |
@@ -2049,7 +2041,6 @@ static int __devinit amd8111e_probe_one(struct pci_dev *pdev, | |||
2049 | #if AMD8111E_VLAN_TAG_USED | 2041 | #if AMD8111E_VLAN_TAG_USED |
2050 | dev->features |= NETIF_F_HW_VLAN_TX | NETIF_F_HW_VLAN_RX; | 2042 | dev->features |= NETIF_F_HW_VLAN_TX | NETIF_F_HW_VLAN_RX; |
2051 | dev->vlan_rx_register =amd8111e_vlan_rx_register; | 2043 | dev->vlan_rx_register =amd8111e_vlan_rx_register; |
2052 | dev->vlan_rx_kill_vid = amd8111e_vlan_rx_kill_vid; | ||
2053 | #endif | 2044 | #endif |
2054 | /* Probe the external PHY */ | 2045 | /* Probe the external PHY */ |
2055 | amd8111e_probe_ext_phy(dev); | 2046 | amd8111e_probe_ext_phy(dev); |
diff --git a/drivers/net/amd8111e.h b/drivers/net/amd8111e.h index 2007510c4eb6..e65080a5994a 100644 --- a/drivers/net/amd8111e.h +++ b/drivers/net/amd8111e.h | |||
@@ -615,7 +615,7 @@ typedef enum { | |||
615 | #define SSTATE 2 | 615 | #define SSTATE 2 |
616 | 616 | ||
617 | /* Assume contoller gets data 10 times the maximum processing time */ | 617 | /* Assume contoller gets data 10 times the maximum processing time */ |
618 | #define REPEAT_CNT 10; | 618 | #define REPEAT_CNT 10 |
619 | 619 | ||
620 | /* amd8111e decriptor flag definitions */ | 620 | /* amd8111e decriptor flag definitions */ |
621 | typedef enum { | 621 | typedef enum { |
diff --git a/drivers/net/atl1/atl1_main.c b/drivers/net/atl1/atl1_main.c index 78cf00ff3d38..6862c11ff864 100644 --- a/drivers/net/atl1/atl1_main.c +++ b/drivers/net/atl1/atl1_main.c | |||
@@ -1229,39 +1229,9 @@ static void atl1_vlan_rx_register(struct net_device *netdev, | |||
1229 | spin_unlock_irqrestore(&adapter->lock, flags); | 1229 | spin_unlock_irqrestore(&adapter->lock, flags); |
1230 | } | 1230 | } |
1231 | 1231 | ||
1232 | /* FIXME: justify or remove -- CHS */ | ||
1233 | static void atl1_vlan_rx_add_vid(struct net_device *netdev, u16 vid) | ||
1234 | { | ||
1235 | /* We don't do Vlan filtering */ | ||
1236 | return; | ||
1237 | } | ||
1238 | |||
1239 | /* FIXME: this looks wrong too -- CHS */ | ||
1240 | static void atl1_vlan_rx_kill_vid(struct net_device *netdev, u16 vid) | ||
1241 | { | ||
1242 | struct atl1_adapter *adapter = netdev_priv(netdev); | ||
1243 | unsigned long flags; | ||
1244 | |||
1245 | spin_lock_irqsave(&adapter->lock, flags); | ||
1246 | /* atl1_irq_disable(adapter); */ | ||
1247 | vlan_group_set_device(adapter->vlgrp, vid, NULL); | ||
1248 | /* atl1_irq_enable(adapter); */ | ||
1249 | spin_unlock_irqrestore(&adapter->lock, flags); | ||
1250 | /* We don't do Vlan filtering */ | ||
1251 | return; | ||
1252 | } | ||
1253 | |||
1254 | static void atl1_restore_vlan(struct atl1_adapter *adapter) | 1232 | static void atl1_restore_vlan(struct atl1_adapter *adapter) |
1255 | { | 1233 | { |
1256 | atl1_vlan_rx_register(adapter->netdev, adapter->vlgrp); | 1234 | atl1_vlan_rx_register(adapter->netdev, adapter->vlgrp); |
1257 | if (adapter->vlgrp) { | ||
1258 | u16 vid; | ||
1259 | for (vid = 0; vid < VLAN_GROUP_ARRAY_LEN; vid++) { | ||
1260 | if (!vlan_group_get_device(adapter->vlgrp, vid)) | ||
1261 | continue; | ||
1262 | atl1_vlan_rx_add_vid(adapter->netdev, vid); | ||
1263 | } | ||
1264 | } | ||
1265 | } | 1235 | } |
1266 | 1236 | ||
1267 | static u16 tpd_avail(struct atl1_tpd_ring *tpd_ring) | 1237 | static u16 tpd_avail(struct atl1_tpd_ring *tpd_ring) |
@@ -2203,8 +2173,7 @@ static int __devinit atl1_probe(struct pci_dev *pdev, | |||
2203 | netdev->poll_controller = atl1_poll_controller; | 2173 | netdev->poll_controller = atl1_poll_controller; |
2204 | #endif | 2174 | #endif |
2205 | netdev->vlan_rx_register = atl1_vlan_rx_register; | 2175 | netdev->vlan_rx_register = atl1_vlan_rx_register; |
2206 | netdev->vlan_rx_add_vid = atl1_vlan_rx_add_vid; | 2176 | |
2207 | netdev->vlan_rx_kill_vid = atl1_vlan_rx_kill_vid; | ||
2208 | netdev->ethtool_ops = &atl1_ethtool_ops; | 2177 | netdev->ethtool_ops = &atl1_ethtool_ops; |
2209 | adapter->bd_number = cards_found; | 2178 | adapter->bd_number = cards_found; |
2210 | adapter->pci_using_64 = pci_using_64; | 2179 | adapter->pci_using_64 = pci_using_64; |
diff --git a/drivers/net/bnx2.c b/drivers/net/bnx2.c index 88b33c6ddda8..da7c3b0c533c 100644 --- a/drivers/net/bnx2.c +++ b/drivers/net/bnx2.c | |||
@@ -4786,19 +4786,6 @@ bnx2_vlan_rx_register(struct net_device *dev, struct vlan_group *vlgrp) | |||
4786 | 4786 | ||
4787 | bnx2_netif_start(bp); | 4787 | bnx2_netif_start(bp); |
4788 | } | 4788 | } |
4789 | |||
4790 | /* Called with rtnl_lock */ | ||
4791 | static void | ||
4792 | bnx2_vlan_rx_kill_vid(struct net_device *dev, uint16_t vid) | ||
4793 | { | ||
4794 | struct bnx2 *bp = netdev_priv(dev); | ||
4795 | |||
4796 | bnx2_netif_stop(bp); | ||
4797 | vlan_group_set_device(bp->vlgrp, vid, NULL); | ||
4798 | bnx2_set_rx_mode(dev); | ||
4799 | |||
4800 | bnx2_netif_start(bp); | ||
4801 | } | ||
4802 | #endif | 4789 | #endif |
4803 | 4790 | ||
4804 | /* Called with netif_tx_lock. | 4791 | /* Called with netif_tx_lock. |
@@ -6453,7 +6440,6 @@ bnx2_init_one(struct pci_dev *pdev, const struct pci_device_id *ent) | |||
6453 | dev->watchdog_timeo = TX_TIMEOUT; | 6440 | dev->watchdog_timeo = TX_TIMEOUT; |
6454 | #ifdef BCM_VLAN | 6441 | #ifdef BCM_VLAN |
6455 | dev->vlan_rx_register = bnx2_vlan_rx_register; | 6442 | dev->vlan_rx_register = bnx2_vlan_rx_register; |
6456 | dev->vlan_rx_kill_vid = bnx2_vlan_rx_kill_vid; | ||
6457 | #endif | 6443 | #endif |
6458 | dev->poll = bnx2_poll; | 6444 | dev->poll = bnx2_poll; |
6459 | dev->ethtool_ops = &bnx2_ethtool_ops; | 6445 | dev->ethtool_ops = &bnx2_ethtool_ops; |
diff --git a/drivers/net/cassini.c b/drivers/net/cassini.c index 9fe3a38883ee..59b9943b077d 100644 --- a/drivers/net/cassini.c +++ b/drivers/net/cassini.c | |||
@@ -4920,7 +4920,7 @@ static int __devinit cas_init_one(struct pci_dev *pdev, | |||
4920 | pci_cmd |= PCI_COMMAND_PARITY; | 4920 | pci_cmd |= PCI_COMMAND_PARITY; |
4921 | pci_write_config_word(pdev, PCI_COMMAND, pci_cmd); | 4921 | pci_write_config_word(pdev, PCI_COMMAND, pci_cmd); |
4922 | if (pci_set_mwi(pdev)) | 4922 | if (pci_set_mwi(pdev)) |
4923 | printk(KERN_WARNING PFX "Could enable MWI for %s\n", | 4923 | printk(KERN_WARNING PFX "Could not enable MWI for %s\n", |
4924 | pci_name(pdev)); | 4924 | pci_name(pdev)); |
4925 | 4925 | ||
4926 | /* | 4926 | /* |
diff --git a/drivers/net/chelsio/cxgb2.c b/drivers/net/chelsio/cxgb2.c index 125c9b105869..231ce43b97cf 100644 --- a/drivers/net/chelsio/cxgb2.c +++ b/drivers/net/chelsio/cxgb2.c | |||
@@ -883,15 +883,6 @@ static void vlan_rx_register(struct net_device *dev, | |||
883 | t1_set_vlan_accel(adapter, grp != NULL); | 883 | t1_set_vlan_accel(adapter, grp != NULL); |
884 | spin_unlock_irq(&adapter->async_lock); | 884 | spin_unlock_irq(&adapter->async_lock); |
885 | } | 885 | } |
886 | |||
887 | static void vlan_rx_kill_vid(struct net_device *dev, unsigned short vid) | ||
888 | { | ||
889 | struct adapter *adapter = dev->priv; | ||
890 | |||
891 | spin_lock_irq(&adapter->async_lock); | ||
892 | vlan_group_set_device(adapter->vlan_grp, vid, NULL); | ||
893 | spin_unlock_irq(&adapter->async_lock); | ||
894 | } | ||
895 | #endif | 886 | #endif |
896 | 887 | ||
897 | #ifdef CONFIG_NET_POLL_CONTROLLER | 888 | #ifdef CONFIG_NET_POLL_CONTROLLER |
@@ -1099,7 +1090,6 @@ static int __devinit init_one(struct pci_dev *pdev, | |||
1099 | netdev->features |= | 1090 | netdev->features |= |
1100 | NETIF_F_HW_VLAN_TX | NETIF_F_HW_VLAN_RX; | 1091 | NETIF_F_HW_VLAN_TX | NETIF_F_HW_VLAN_RX; |
1101 | netdev->vlan_rx_register = vlan_rx_register; | 1092 | netdev->vlan_rx_register = vlan_rx_register; |
1102 | netdev->vlan_rx_kill_vid = vlan_rx_kill_vid; | ||
1103 | #endif | 1093 | #endif |
1104 | 1094 | ||
1105 | /* T204: disable TSO */ | 1095 | /* T204: disable TSO */ |
diff --git a/drivers/net/cxgb3/cxgb3_main.c b/drivers/net/cxgb3/cxgb3_main.c index 67b4b219d927..1b20f4060e2d 100644 --- a/drivers/net/cxgb3/cxgb3_main.c +++ b/drivers/net/cxgb3/cxgb3_main.c | |||
@@ -2067,11 +2067,6 @@ static void vlan_rx_register(struct net_device *dev, struct vlan_group *grp) | |||
2067 | t3_synchronize_rx(adapter, pi); | 2067 | t3_synchronize_rx(adapter, pi); |
2068 | } | 2068 | } |
2069 | 2069 | ||
2070 | static void vlan_rx_kill_vid(struct net_device *dev, unsigned short vid) | ||
2071 | { | ||
2072 | /* nothing */ | ||
2073 | } | ||
2074 | |||
2075 | #ifdef CONFIG_NET_POLL_CONTROLLER | 2070 | #ifdef CONFIG_NET_POLL_CONTROLLER |
2076 | static void cxgb_netpoll(struct net_device *dev) | 2071 | static void cxgb_netpoll(struct net_device *dev) |
2077 | { | 2072 | { |
@@ -2409,7 +2404,6 @@ static int __devinit init_one(struct pci_dev *pdev, | |||
2409 | 2404 | ||
2410 | netdev->features |= NETIF_F_HW_VLAN_TX | NETIF_F_HW_VLAN_RX; | 2405 | netdev->features |= NETIF_F_HW_VLAN_TX | NETIF_F_HW_VLAN_RX; |
2411 | netdev->vlan_rx_register = vlan_rx_register; | 2406 | netdev->vlan_rx_register = vlan_rx_register; |
2412 | netdev->vlan_rx_kill_vid = vlan_rx_kill_vid; | ||
2413 | 2407 | ||
2414 | netdev->open = cxgb_open; | 2408 | netdev->open = cxgb_open; |
2415 | netdev->stop = cxgb_close; | 2409 | netdev->stop = cxgb_close; |
diff --git a/drivers/net/defxx.c b/drivers/net/defxx.c index 571d82f8008c..7df23dc28190 100644 --- a/drivers/net/defxx.c +++ b/drivers/net/defxx.c | |||
@@ -566,6 +566,7 @@ static int __devinit dfx_register(struct device *bdev) | |||
566 | bp->base.mem = ioremap_nocache(bar_start, bar_len); | 566 | bp->base.mem = ioremap_nocache(bar_start, bar_len); |
567 | if (!bp->base.mem) { | 567 | if (!bp->base.mem) { |
568 | printk(KERN_ERR "%s: Cannot map MMIO\n", print_name); | 568 | printk(KERN_ERR "%s: Cannot map MMIO\n", print_name); |
569 | err = -ENOMEM; | ||
569 | goto err_out_region; | 570 | goto err_out_region; |
570 | } | 571 | } |
571 | } else { | 572 | } else { |
diff --git a/drivers/net/e1000/e1000_main.c b/drivers/net/e1000/e1000_main.c index cbc7febe9cdc..cf8af928a69c 100644 --- a/drivers/net/e1000/e1000_main.c +++ b/drivers/net/e1000/e1000_main.c | |||
@@ -1142,13 +1142,16 @@ e1000_probe(struct pci_dev *pdev, | |||
1142 | !e1000_check_mng_mode(&adapter->hw)) | 1142 | !e1000_check_mng_mode(&adapter->hw)) |
1143 | e1000_get_hw_control(adapter); | 1143 | e1000_get_hw_control(adapter); |
1144 | 1144 | ||
1145 | strcpy(netdev->name, "eth%d"); | ||
1146 | if ((err = register_netdev(netdev))) | ||
1147 | goto err_register; | ||
1148 | |||
1149 | /* tell the stack to leave us alone until e1000_open() is called */ | 1145 | /* tell the stack to leave us alone until e1000_open() is called */ |
1150 | netif_carrier_off(netdev); | 1146 | netif_carrier_off(netdev); |
1151 | netif_stop_queue(netdev); | 1147 | netif_stop_queue(netdev); |
1148 | #ifdef CONFIG_E1000_NAPI | ||
1149 | netif_poll_disable(netdev); | ||
1150 | #endif | ||
1151 | |||
1152 | strcpy(netdev->name, "eth%d"); | ||
1153 | if ((err = register_netdev(netdev))) | ||
1154 | goto err_register; | ||
1152 | 1155 | ||
1153 | DPRINTK(PROBE, INFO, "Intel(R) PRO/1000 Network Connection\n"); | 1156 | DPRINTK(PROBE, INFO, "Intel(R) PRO/1000 Network Connection\n"); |
1154 | 1157 | ||
@@ -1325,7 +1328,10 @@ e1000_sw_init(struct e1000_adapter *adapter) | |||
1325 | spin_lock_init(&adapter->tx_queue_lock); | 1328 | spin_lock_init(&adapter->tx_queue_lock); |
1326 | #endif | 1329 | #endif |
1327 | 1330 | ||
1328 | atomic_set(&adapter->irq_sem, 1); | 1331 | /* Explicitly disable IRQ since the NIC can be in any state. */ |
1332 | atomic_set(&adapter->irq_sem, 0); | ||
1333 | e1000_irq_disable(adapter); | ||
1334 | |||
1329 | spin_lock_init(&adapter->stats_lock); | 1335 | spin_lock_init(&adapter->stats_lock); |
1330 | 1336 | ||
1331 | set_bit(__E1000_DOWN, &adapter->flags); | 1337 | set_bit(__E1000_DOWN, &adapter->flags); |
@@ -1431,6 +1437,10 @@ e1000_open(struct net_device *netdev) | |||
1431 | /* From here on the code is the same as e1000_up() */ | 1437 | /* From here on the code is the same as e1000_up() */ |
1432 | clear_bit(__E1000_DOWN, &adapter->flags); | 1438 | clear_bit(__E1000_DOWN, &adapter->flags); |
1433 | 1439 | ||
1440 | #ifdef CONFIG_E1000_NAPI | ||
1441 | netif_poll_enable(netdev); | ||
1442 | #endif | ||
1443 | |||
1434 | e1000_irq_enable(adapter); | 1444 | e1000_irq_enable(adapter); |
1435 | 1445 | ||
1436 | /* fire a link status change interrupt to start the watchdog */ | 1446 | /* fire a link status change interrupt to start the watchdog */ |
diff --git a/drivers/net/ehea/ehea.h b/drivers/net/ehea/ehea.h index 602872dbe15f..e85a933a4762 100644 --- a/drivers/net/ehea/ehea.h +++ b/drivers/net/ehea/ehea.h | |||
@@ -39,7 +39,7 @@ | |||
39 | #include <asm/io.h> | 39 | #include <asm/io.h> |
40 | 40 | ||
41 | #define DRV_NAME "ehea" | 41 | #define DRV_NAME "ehea" |
42 | #define DRV_VERSION "EHEA_0058" | 42 | #define DRV_VERSION "EHEA_0061" |
43 | 43 | ||
44 | #define EHEA_MSG_DEFAULT (NETIF_MSG_LINK | NETIF_MSG_TIMER \ | 44 | #define EHEA_MSG_DEFAULT (NETIF_MSG_LINK | NETIF_MSG_TIMER \ |
45 | | NETIF_MSG_RX_ERR | NETIF_MSG_TX_ERR) | 45 | | NETIF_MSG_RX_ERR | NETIF_MSG_TX_ERR) |
diff --git a/drivers/net/ehea/ehea_main.c b/drivers/net/ehea/ehea_main.c index f6e0cb1ada1f..152bb2016a2c 100644 --- a/drivers/net/ehea/ehea_main.c +++ b/drivers/net/ehea/ehea_main.c | |||
@@ -428,7 +428,7 @@ static struct ehea_cqe *ehea_proc_rwqes(struct net_device *dev, | |||
428 | } | 428 | } |
429 | skb_copy_to_linear_data(skb, ((char*)cqe) + 64, | 429 | skb_copy_to_linear_data(skb, ((char*)cqe) + 64, |
430 | cqe->num_bytes_transfered - 4); | 430 | cqe->num_bytes_transfered - 4); |
431 | ehea_fill_skb(dev, skb, cqe); | 431 | ehea_fill_skb(port->netdev, skb, cqe); |
432 | } else if (rq == 2) { /* RQ2 */ | 432 | } else if (rq == 2) { /* RQ2 */ |
433 | skb = get_skb_by_index(skb_arr_rq2, | 433 | skb = get_skb_by_index(skb_arr_rq2, |
434 | skb_arr_rq2_len, cqe); | 434 | skb_arr_rq2_len, cqe); |
diff --git a/drivers/net/fec_8xx/fec_main.c b/drivers/net/fec_8xx/fec_main.c index 88efe9731bab..e5502af5b8e2 100644 --- a/drivers/net/fec_8xx/fec_main.c +++ b/drivers/net/fec_8xx/fec_main.c | |||
@@ -550,7 +550,7 @@ static int fec_enet_rx_common(struct net_device *dev, int *budget) | |||
550 | skbn = dev_alloc_skb(pkt_len + 2); | 550 | skbn = dev_alloc_skb(pkt_len + 2); |
551 | if (skbn != NULL) { | 551 | if (skbn != NULL) { |
552 | skb_reserve(skbn, 2); /* align IP header */ | 552 | skb_reserve(skbn, 2); /* align IP header */ |
553 | skb_copy_from_linear_data(skb | 553 | skb_copy_from_linear_data(skb, |
554 | skbn->data, | 554 | skbn->data, |
555 | pkt_len); | 555 | pkt_len); |
556 | /* swap */ | 556 | /* swap */ |
diff --git a/drivers/net/forcedeth.c b/drivers/net/forcedeth.c index 4154fd000746..32788ca40d25 100644 --- a/drivers/net/forcedeth.c +++ b/drivers/net/forcedeth.c | |||
@@ -4605,12 +4605,7 @@ static void nv_vlan_rx_register(struct net_device *dev, struct vlan_group *grp) | |||
4605 | writel(np->txrxctl_bits, get_hwbase(dev) + NvRegTxRxControl); | 4605 | writel(np->txrxctl_bits, get_hwbase(dev) + NvRegTxRxControl); |
4606 | 4606 | ||
4607 | spin_unlock_irq(&np->lock); | 4607 | spin_unlock_irq(&np->lock); |
4608 | }; | 4608 | } |
4609 | |||
4610 | static void nv_vlan_rx_kill_vid(struct net_device *dev, unsigned short vid) | ||
4611 | { | ||
4612 | /* nothing to do */ | ||
4613 | }; | ||
4614 | 4609 | ||
4615 | /* The mgmt unit and driver use a semaphore to access the phy during init */ | 4610 | /* The mgmt unit and driver use a semaphore to access the phy during init */ |
4616 | static int nv_mgmt_acquire_sema(struct net_device *dev) | 4611 | static int nv_mgmt_acquire_sema(struct net_device *dev) |
@@ -4956,7 +4951,6 @@ static int __devinit nv_probe(struct pci_dev *pci_dev, const struct pci_device_i | |||
4956 | np->vlanctl_bits = NVREG_VLANCONTROL_ENABLE; | 4951 | np->vlanctl_bits = NVREG_VLANCONTROL_ENABLE; |
4957 | dev->features |= NETIF_F_HW_VLAN_RX | NETIF_F_HW_VLAN_TX; | 4952 | dev->features |= NETIF_F_HW_VLAN_RX | NETIF_F_HW_VLAN_TX; |
4958 | dev->vlan_rx_register = nv_vlan_rx_register; | 4953 | dev->vlan_rx_register = nv_vlan_rx_register; |
4959 | dev->vlan_rx_kill_vid = nv_vlan_rx_kill_vid; | ||
4960 | } | 4954 | } |
4961 | 4955 | ||
4962 | np->msi_flags = 0; | 4956 | np->msi_flags = 0; |
diff --git a/drivers/net/gianfar.c b/drivers/net/gianfar.c index f5b3cba23fc5..6822bf14267b 100644 --- a/drivers/net/gianfar.c +++ b/drivers/net/gianfar.c | |||
@@ -140,7 +140,6 @@ int gfar_clean_rx_ring(struct net_device *dev, int rx_work_limit); | |||
140 | static int gfar_process_frame(struct net_device *dev, struct sk_buff *skb, int length); | 140 | static int gfar_process_frame(struct net_device *dev, struct sk_buff *skb, int length); |
141 | static void gfar_vlan_rx_register(struct net_device *netdev, | 141 | static void gfar_vlan_rx_register(struct net_device *netdev, |
142 | struct vlan_group *grp); | 142 | struct vlan_group *grp); |
143 | static void gfar_vlan_rx_kill_vid(struct net_device *netdev, uint16_t vid); | ||
144 | void gfar_halt(struct net_device *dev); | 143 | void gfar_halt(struct net_device *dev); |
145 | void gfar_start(struct net_device *dev); | 144 | void gfar_start(struct net_device *dev); |
146 | static void gfar_clear_exact_match(struct net_device *dev); | 145 | static void gfar_clear_exact_match(struct net_device *dev); |
@@ -284,7 +283,6 @@ static int gfar_probe(struct platform_device *pdev) | |||
284 | 283 | ||
285 | if (priv->einfo->device_flags & FSL_GIANFAR_DEV_HAS_VLAN) { | 284 | if (priv->einfo->device_flags & FSL_GIANFAR_DEV_HAS_VLAN) { |
286 | dev->vlan_rx_register = gfar_vlan_rx_register; | 285 | dev->vlan_rx_register = gfar_vlan_rx_register; |
287 | dev->vlan_rx_kill_vid = gfar_vlan_rx_kill_vid; | ||
288 | 286 | ||
289 | dev->features |= NETIF_F_HW_VLAN_TX | NETIF_F_HW_VLAN_RX; | 287 | dev->features |= NETIF_F_HW_VLAN_TX | NETIF_F_HW_VLAN_RX; |
290 | 288 | ||
@@ -1133,20 +1131,6 @@ static void gfar_vlan_rx_register(struct net_device *dev, | |||
1133 | spin_unlock_irqrestore(&priv->rxlock, flags); | 1131 | spin_unlock_irqrestore(&priv->rxlock, flags); |
1134 | } | 1132 | } |
1135 | 1133 | ||
1136 | |||
1137 | static void gfar_vlan_rx_kill_vid(struct net_device *dev, uint16_t vid) | ||
1138 | { | ||
1139 | struct gfar_private *priv = netdev_priv(dev); | ||
1140 | unsigned long flags; | ||
1141 | |||
1142 | spin_lock_irqsave(&priv->rxlock, flags); | ||
1143 | |||
1144 | vlan_group_set_device(priv->vlgrp, vid, NULL); | ||
1145 | |||
1146 | spin_unlock_irqrestore(&priv->rxlock, flags); | ||
1147 | } | ||
1148 | |||
1149 | |||
1150 | static int gfar_change_mtu(struct net_device *dev, int new_mtu) | 1134 | static int gfar_change_mtu(struct net_device *dev, int new_mtu) |
1151 | { | 1135 | { |
1152 | int tempsize, tempval; | 1136 | int tempsize, tempval; |
diff --git a/drivers/net/hp100.c b/drivers/net/hp100.c index 8118a6750b61..8caa591c5649 100644 --- a/drivers/net/hp100.c +++ b/drivers/net/hp100.c | |||
@@ -3005,7 +3005,7 @@ static int __init hp100_isa_init(void) | |||
3005 | return cards > 0 ? 0 : -ENODEV; | 3005 | return cards > 0 ? 0 : -ENODEV; |
3006 | } | 3006 | } |
3007 | 3007 | ||
3008 | static void __exit hp100_isa_cleanup(void) | 3008 | static void hp100_isa_cleanup(void) |
3009 | { | 3009 | { |
3010 | int i; | 3010 | int i; |
3011 | 3011 | ||
diff --git a/drivers/net/myri10ge/myri10ge.c b/drivers/net/myri10ge/myri10ge.c index 5d14be7405a3..b53b7ad999bc 100644 --- a/drivers/net/myri10ge/myri10ge.c +++ b/drivers/net/myri10ge/myri10ge.c | |||
@@ -1472,6 +1472,7 @@ static const struct ethtool_ops myri10ge_ethtool_ops = { | |||
1472 | .set_sg = ethtool_op_set_sg, | 1472 | .set_sg = ethtool_op_set_sg, |
1473 | .get_tso = ethtool_op_get_tso, | 1473 | .get_tso = ethtool_op_get_tso, |
1474 | .set_tso = ethtool_op_set_tso, | 1474 | .set_tso = ethtool_op_set_tso, |
1475 | .get_link = ethtool_op_get_link, | ||
1475 | .get_strings = myri10ge_get_strings, | 1476 | .get_strings = myri10ge_get_strings, |
1476 | .get_stats_count = myri10ge_get_stats_count, | 1477 | .get_stats_count = myri10ge_get_stats_count, |
1477 | .get_ethtool_stats = myri10ge_get_ethtool_stats, | 1478 | .get_ethtool_stats = myri10ge_get_ethtool_stats, |
diff --git a/drivers/net/netxen/netxen_nic_main.c b/drivers/net/netxen/netxen_nic_main.c index 2c5c6d20e6e9..c61181f23bd5 100644 --- a/drivers/net/netxen/netxen_nic_main.c +++ b/drivers/net/netxen/netxen_nic_main.c | |||
@@ -654,8 +654,6 @@ static void __devexit netxen_nic_remove(struct pci_dev *pdev) | |||
654 | if (adapter->portnum == 0) | 654 | if (adapter->portnum == 0) |
655 | netxen_free_adapter_offload(adapter); | 655 | netxen_free_adapter_offload(adapter); |
656 | 656 | ||
657 | if (adapter->irq) | ||
658 | free_irq(adapter->irq, adapter); | ||
659 | if(adapter->portnum == 0) { | 657 | if(adapter->portnum == 0) { |
660 | /* leave the hw in the same state as reboot */ | 658 | /* leave the hw in the same state as reboot */ |
661 | writel(0, NETXEN_CRB_NORMALIZE(adapter, CRB_CMDPEG_STATE)); | 659 | writel(0, NETXEN_CRB_NORMALIZE(adapter, CRB_CMDPEG_STATE)); |
diff --git a/drivers/net/ns83820.c b/drivers/net/ns83820.c index 3439f8c649f9..717d8e9b9833 100644 --- a/drivers/net/ns83820.c +++ b/drivers/net/ns83820.c | |||
@@ -506,17 +506,6 @@ static void ns83820_vlan_rx_register(struct net_device *ndev, struct vlan_group | |||
506 | spin_unlock(&dev->tx_lock); | 506 | spin_unlock(&dev->tx_lock); |
507 | spin_unlock_irq(&dev->misc_lock); | 507 | spin_unlock_irq(&dev->misc_lock); |
508 | } | 508 | } |
509 | |||
510 | static void ns83820_vlan_rx_kill_vid(struct net_device *ndev, unsigned short vid) | ||
511 | { | ||
512 | struct ns83820 *dev = PRIV(ndev); | ||
513 | |||
514 | spin_lock_irq(&dev->misc_lock); | ||
515 | spin_lock(&dev->tx_lock); | ||
516 | vlan_group_set_device(dev->vlgrp, vid, NULL); | ||
517 | spin_unlock(&dev->tx_lock); | ||
518 | spin_unlock_irq(&dev->misc_lock); | ||
519 | } | ||
520 | #endif | 509 | #endif |
521 | 510 | ||
522 | /* Packet Receiver | 511 | /* Packet Receiver |
@@ -2083,7 +2072,6 @@ static int __devinit ns83820_init_one(struct pci_dev *pci_dev, const struct pci_ | |||
2083 | /* We also support hardware vlan acceleration */ | 2072 | /* We also support hardware vlan acceleration */ |
2084 | ndev->features |= NETIF_F_HW_VLAN_TX | NETIF_F_HW_VLAN_RX; | 2073 | ndev->features |= NETIF_F_HW_VLAN_TX | NETIF_F_HW_VLAN_RX; |
2085 | ndev->vlan_rx_register = ns83820_vlan_rx_register; | 2074 | ndev->vlan_rx_register = ns83820_vlan_rx_register; |
2086 | ndev->vlan_rx_kill_vid = ns83820_vlan_rx_kill_vid; | ||
2087 | #endif | 2075 | #endif |
2088 | 2076 | ||
2089 | if (using_dac) { | 2077 | if (using_dac) { |
diff --git a/drivers/net/qla3xxx.c b/drivers/net/qla3xxx.c index d8766c0e8255..585be044ebbb 100755 --- a/drivers/net/qla3xxx.c +++ b/drivers/net/qla3xxx.c | |||
@@ -4044,7 +4044,7 @@ static int __devinit ql3xxx_probe(struct pci_dev *pdev, | |||
4044 | if (pci_using_dac) | 4044 | if (pci_using_dac) |
4045 | ndev->features |= NETIF_F_HIGHDMA; | 4045 | ndev->features |= NETIF_F_HIGHDMA; |
4046 | if (qdev->device_id == QL3032_DEVICE_ID) | 4046 | if (qdev->device_id == QL3032_DEVICE_ID) |
4047 | ndev->features |= (NETIF_F_HW_CSUM | NETIF_F_SG); | 4047 | ndev->features |= NETIF_F_IP_CSUM | NETIF_F_SG; |
4048 | 4048 | ||
4049 | qdev->mem_map_registers = | 4049 | qdev->mem_map_registers = |
4050 | ioremap_nocache(pci_resource_start(pdev, 1), | 4050 | ioremap_nocache(pci_resource_start(pdev, 1), |
diff --git a/drivers/net/r8169.c b/drivers/net/r8169.c index 45876a854f00..5ec7752caa48 100644 --- a/drivers/net/r8169.c +++ b/drivers/net/r8169.c | |||
@@ -886,16 +886,6 @@ static void rtl8169_vlan_rx_register(struct net_device *dev, | |||
886 | spin_unlock_irqrestore(&tp->lock, flags); | 886 | spin_unlock_irqrestore(&tp->lock, flags); |
887 | } | 887 | } |
888 | 888 | ||
889 | static void rtl8169_vlan_rx_kill_vid(struct net_device *dev, unsigned short vid) | ||
890 | { | ||
891 | struct rtl8169_private *tp = netdev_priv(dev); | ||
892 | unsigned long flags; | ||
893 | |||
894 | spin_lock_irqsave(&tp->lock, flags); | ||
895 | vlan_group_set_device(tp->vlgrp, vid, NULL); | ||
896 | spin_unlock_irqrestore(&tp->lock, flags); | ||
897 | } | ||
898 | |||
899 | static int rtl8169_rx_vlan_skb(struct rtl8169_private *tp, struct RxDesc *desc, | 889 | static int rtl8169_rx_vlan_skb(struct rtl8169_private *tp, struct RxDesc *desc, |
900 | struct sk_buff *skb) | 890 | struct sk_buff *skb) |
901 | { | 891 | { |
@@ -1671,7 +1661,6 @@ rtl8169_init_one(struct pci_dev *pdev, const struct pci_device_id *ent) | |||
1671 | #ifdef CONFIG_R8169_VLAN | 1661 | #ifdef CONFIG_R8169_VLAN |
1672 | dev->features |= NETIF_F_HW_VLAN_TX | NETIF_F_HW_VLAN_RX; | 1662 | dev->features |= NETIF_F_HW_VLAN_TX | NETIF_F_HW_VLAN_RX; |
1673 | dev->vlan_rx_register = rtl8169_vlan_rx_register; | 1663 | dev->vlan_rx_register = rtl8169_vlan_rx_register; |
1674 | dev->vlan_rx_kill_vid = rtl8169_vlan_rx_kill_vid; | ||
1675 | #endif | 1664 | #endif |
1676 | 1665 | ||
1677 | #ifdef CONFIG_NET_POLL_CONTROLLER | 1666 | #ifdef CONFIG_NET_POLL_CONTROLLER |
diff --git a/drivers/net/s2io.c b/drivers/net/s2io.c index e3e6d410d72c..c6ba3dee8ae0 100644 --- a/drivers/net/s2io.c +++ b/drivers/net/s2io.c | |||
@@ -340,17 +340,6 @@ static void s2io_vlan_rx_register(struct net_device *dev, | |||
340 | /* A flag indicating whether 'RX_PA_CFG_STRIP_VLAN_TAG' bit is set or not */ | 340 | /* A flag indicating whether 'RX_PA_CFG_STRIP_VLAN_TAG' bit is set or not */ |
341 | static int vlan_strip_flag; | 341 | static int vlan_strip_flag; |
342 | 342 | ||
343 | /* Unregister the vlan */ | ||
344 | static void s2io_vlan_rx_kill_vid(struct net_device *dev, unsigned long vid) | ||
345 | { | ||
346 | struct s2io_nic *nic = dev->priv; | ||
347 | unsigned long flags; | ||
348 | |||
349 | spin_lock_irqsave(&nic->tx_lock, flags); | ||
350 | vlan_group_set_device(nic->vlgrp, vid, NULL); | ||
351 | spin_unlock_irqrestore(&nic->tx_lock, flags); | ||
352 | } | ||
353 | |||
354 | /* | 343 | /* |
355 | * Constants to be programmed into the Xena's registers, to configure | 344 | * Constants to be programmed into the Xena's registers, to configure |
356 | * the XAUI. | 345 | * the XAUI. |
@@ -7412,7 +7401,6 @@ s2io_init_nic(struct pci_dev *pdev, const struct pci_device_id *pre) | |||
7412 | SET_ETHTOOL_OPS(dev, &netdev_ethtool_ops); | 7401 | SET_ETHTOOL_OPS(dev, &netdev_ethtool_ops); |
7413 | dev->features |= NETIF_F_HW_VLAN_TX | NETIF_F_HW_VLAN_RX; | 7402 | dev->features |= NETIF_F_HW_VLAN_TX | NETIF_F_HW_VLAN_RX; |
7414 | dev->vlan_rx_register = s2io_vlan_rx_register; | 7403 | dev->vlan_rx_register = s2io_vlan_rx_register; |
7415 | dev->vlan_rx_kill_vid = (void *)s2io_vlan_rx_kill_vid; | ||
7416 | 7404 | ||
7417 | /* | 7405 | /* |
7418 | * will use eth_mac_addr() for dev->set_mac_address | 7406 | * will use eth_mac_addr() for dev->set_mac_address |
diff --git a/drivers/net/skfp/smt.c b/drivers/net/skfp/smt.c index fe847800acdc..75afc1f07ba0 100644 --- a/drivers/net/skfp/smt.c +++ b/drivers/net/skfp/smt.c | |||
@@ -1748,7 +1748,7 @@ char *addr_to_string(struct fddi_addr *addr) | |||
1748 | #endif | 1748 | #endif |
1749 | 1749 | ||
1750 | #ifdef AM29K | 1750 | #ifdef AM29K |
1751 | smt_ifconfig(int argc, char *argv[]) | 1751 | int smt_ifconfig(int argc, char *argv[]) |
1752 | { | 1752 | { |
1753 | if (argc >= 2 && !strcmp(argv[0],"opt_bypass") && | 1753 | if (argc >= 2 && !strcmp(argv[0],"opt_bypass") && |
1754 | !strcmp(argv[1],"yes")) { | 1754 | !strcmp(argv[1],"yes")) { |
diff --git a/drivers/net/sky2.c b/drivers/net/sky2.c index 832fd69a0e59..fe01b961b597 100644 --- a/drivers/net/sky2.c +++ b/drivers/net/sky2.c | |||
@@ -364,7 +364,7 @@ static void sky2_phy_init(struct sky2_hw *hw, unsigned port) | |||
364 | /* for SFP-module set SIGDET polarity to low */ | 364 | /* for SFP-module set SIGDET polarity to low */ |
365 | ctrl = gm_phy_read(hw, port, PHY_MARV_PHY_CTRL); | 365 | ctrl = gm_phy_read(hw, port, PHY_MARV_PHY_CTRL); |
366 | ctrl |= PHY_M_FIB_SIGD_POL; | 366 | ctrl |= PHY_M_FIB_SIGD_POL; |
367 | gm_phy_write(hw, port, PHY_MARV_CTRL, ctrl); | 367 | gm_phy_write(hw, port, PHY_MARV_PHY_CTRL, ctrl); |
368 | } | 368 | } |
369 | 369 | ||
370 | gm_phy_write(hw, port, PHY_MARV_EXT_ADR, pg); | 370 | gm_phy_write(hw, port, PHY_MARV_EXT_ADR, pg); |
@@ -658,7 +658,7 @@ static void sky2_mac_init(struct sky2_hw *hw, unsigned port) | |||
658 | const u8 *addr = hw->dev[port]->dev_addr; | 658 | const u8 *addr = hw->dev[port]->dev_addr; |
659 | 659 | ||
660 | sky2_write32(hw, SK_REG(port, GPHY_CTRL), GPC_RST_SET); | 660 | sky2_write32(hw, SK_REG(port, GPHY_CTRL), GPC_RST_SET); |
661 | sky2_write32(hw, SK_REG(port, GPHY_CTRL), GPC_RST_CLR|GPC_ENA_PAUSE); | 661 | sky2_write32(hw, SK_REG(port, GPHY_CTRL), GPC_RST_CLR); |
662 | 662 | ||
663 | sky2_write8(hw, SK_REG(port, GMAC_CTRL), GMC_RST_CLR); | 663 | sky2_write8(hw, SK_REG(port, GMAC_CTRL), GMC_RST_CLR); |
664 | 664 | ||
@@ -1049,26 +1049,22 @@ static void sky2_vlan_rx_register(struct net_device *dev, struct vlan_group *grp | |||
1049 | u16 port = sky2->port; | 1049 | u16 port = sky2->port; |
1050 | 1050 | ||
1051 | netif_tx_lock_bh(dev); | 1051 | netif_tx_lock_bh(dev); |
1052 | netif_poll_disable(sky2->hw->dev[0]); | ||
1052 | 1053 | ||
1053 | sky2_write32(hw, SK_REG(port, RX_GMF_CTRL_T), RX_VLAN_STRIP_ON); | ||
1054 | sky2_write32(hw, SK_REG(port, TX_GMF_CTRL_T), TX_VLAN_TAG_ON); | ||
1055 | sky2->vlgrp = grp; | 1054 | sky2->vlgrp = grp; |
1055 | if (grp) { | ||
1056 | sky2_write32(hw, SK_REG(port, RX_GMF_CTRL_T), | ||
1057 | RX_VLAN_STRIP_ON); | ||
1058 | sky2_write32(hw, SK_REG(port, TX_GMF_CTRL_T), | ||
1059 | TX_VLAN_TAG_ON); | ||
1060 | } else { | ||
1061 | sky2_write32(hw, SK_REG(port, RX_GMF_CTRL_T), | ||
1062 | RX_VLAN_STRIP_OFF); | ||
1063 | sky2_write32(hw, SK_REG(port, TX_GMF_CTRL_T), | ||
1064 | TX_VLAN_TAG_OFF); | ||
1065 | } | ||
1056 | 1066 | ||
1057 | netif_tx_unlock_bh(dev); | 1067 | netif_poll_enable(sky2->hw->dev[0]); |
1058 | } | ||
1059 | |||
1060 | static void sky2_vlan_rx_kill_vid(struct net_device *dev, unsigned short vid) | ||
1061 | { | ||
1062 | struct sky2_port *sky2 = netdev_priv(dev); | ||
1063 | struct sky2_hw *hw = sky2->hw; | ||
1064 | u16 port = sky2->port; | ||
1065 | |||
1066 | netif_tx_lock_bh(dev); | ||
1067 | |||
1068 | sky2_write32(hw, SK_REG(port, RX_GMF_CTRL_T), RX_VLAN_STRIP_OFF); | ||
1069 | sky2_write32(hw, SK_REG(port, TX_GMF_CTRL_T), TX_VLAN_TAG_OFF); | ||
1070 | vlan_group_set_device(sky2->vlgrp, vid, NULL); | ||
1071 | |||
1072 | netif_tx_unlock_bh(dev); | 1068 | netif_tx_unlock_bh(dev); |
1073 | } | 1069 | } |
1074 | #endif | 1070 | #endif |
@@ -1432,7 +1428,7 @@ static int sky2_xmit_frame(struct sk_buff *skb, struct net_device *dev) | |||
1432 | tcpsum = offset << 16; /* sum start */ | 1428 | tcpsum = offset << 16; /* sum start */ |
1433 | tcpsum |= offset + skb->csum_offset; /* sum write */ | 1429 | tcpsum |= offset + skb->csum_offset; /* sum write */ |
1434 | 1430 | ||
1435 | ctrl = CALSUM | WR_SUM | INIT_SUM | LOCK_SUM; | 1431 | ctrl |= CALSUM | WR_SUM | INIT_SUM | LOCK_SUM; |
1436 | if (ip_hdr(skb)->protocol == IPPROTO_UDP) | 1432 | if (ip_hdr(skb)->protocol == IPPROTO_UDP) |
1437 | ctrl |= UDPTCP; | 1433 | ctrl |= UDPTCP; |
1438 | 1434 | ||
@@ -3484,7 +3480,6 @@ static __devinit struct net_device *sky2_init_netdev(struct sky2_hw *hw, | |||
3484 | #ifdef SKY2_VLAN_TAG_USED | 3480 | #ifdef SKY2_VLAN_TAG_USED |
3485 | dev->features |= NETIF_F_HW_VLAN_TX | NETIF_F_HW_VLAN_RX; | 3481 | dev->features |= NETIF_F_HW_VLAN_TX | NETIF_F_HW_VLAN_RX; |
3486 | dev->vlan_rx_register = sky2_vlan_rx_register; | 3482 | dev->vlan_rx_register = sky2_vlan_rx_register; |
3487 | dev->vlan_rx_kill_vid = sky2_vlan_rx_kill_vid; | ||
3488 | #endif | 3483 | #endif |
3489 | 3484 | ||
3490 | /* read the mac address */ | 3485 | /* read the mac address */ |
diff --git a/drivers/net/sky2.h b/drivers/net/sky2.h index 5efb5afc45ba..b8c4a3b5eadf 100644 --- a/drivers/net/sky2.h +++ b/drivers/net/sky2.h | |||
@@ -1149,7 +1149,7 @@ enum { | |||
1149 | PHY_M_IS_JABBER = 1<<0, /* Jabber */ | 1149 | PHY_M_IS_JABBER = 1<<0, /* Jabber */ |
1150 | 1150 | ||
1151 | PHY_M_DEF_MSK = PHY_M_IS_LSP_CHANGE | PHY_M_IS_LST_CHANGE | 1151 | PHY_M_DEF_MSK = PHY_M_IS_LSP_CHANGE | PHY_M_IS_LST_CHANGE |
1152 | | PHY_M_IS_FIFO_ERROR, | 1152 | | PHY_M_IS_DUP_CHANGE, |
1153 | PHY_M_AN_MSK = PHY_M_IS_AN_ERROR | PHY_M_IS_AN_COMPL, | 1153 | PHY_M_AN_MSK = PHY_M_IS_AN_ERROR | PHY_M_IS_AN_COMPL, |
1154 | }; | 1154 | }; |
1155 | 1155 | ||
@@ -1732,28 +1732,6 @@ enum { | |||
1732 | 1732 | ||
1733 | /* GPHY_CTRL 32 bit GPHY Control Reg (YUKON only) */ | 1733 | /* GPHY_CTRL 32 bit GPHY Control Reg (YUKON only) */ |
1734 | enum { | 1734 | enum { |
1735 | GPC_SEL_BDT = 1<<28, /* Select Bi-Dir. Transfer for MDC/MDIO */ | ||
1736 | GPC_INT_POL_HI = 1<<27, /* IRQ Polarity is Active HIGH */ | ||
1737 | GPC_75_OHM = 1<<26, /* Use 75 Ohm Termination instead of 50 */ | ||
1738 | GPC_DIS_FC = 1<<25, /* Disable Automatic Fiber/Copper Detection */ | ||
1739 | GPC_DIS_SLEEP = 1<<24, /* Disable Energy Detect */ | ||
1740 | GPC_HWCFG_M_3 = 1<<23, /* HWCFG_MODE[3] */ | ||
1741 | GPC_HWCFG_M_2 = 1<<22, /* HWCFG_MODE[2] */ | ||
1742 | GPC_HWCFG_M_1 = 1<<21, /* HWCFG_MODE[1] */ | ||
1743 | GPC_HWCFG_M_0 = 1<<20, /* HWCFG_MODE[0] */ | ||
1744 | GPC_ANEG_0 = 1<<19, /* ANEG[0] */ | ||
1745 | GPC_ENA_XC = 1<<18, /* Enable MDI crossover */ | ||
1746 | GPC_DIS_125 = 1<<17, /* Disable 125 MHz clock */ | ||
1747 | GPC_ANEG_3 = 1<<16, /* ANEG[3] */ | ||
1748 | GPC_ANEG_2 = 1<<15, /* ANEG[2] */ | ||
1749 | GPC_ANEG_1 = 1<<14, /* ANEG[1] */ | ||
1750 | GPC_ENA_PAUSE = 1<<13, /* Enable Pause (SYM_OR_REM) */ | ||
1751 | GPC_PHYADDR_4 = 1<<12, /* Bit 4 of Phy Addr */ | ||
1752 | GPC_PHYADDR_3 = 1<<11, /* Bit 3 of Phy Addr */ | ||
1753 | GPC_PHYADDR_2 = 1<<10, /* Bit 2 of Phy Addr */ | ||
1754 | GPC_PHYADDR_1 = 1<<9, /* Bit 1 of Phy Addr */ | ||
1755 | GPC_PHYADDR_0 = 1<<8, /* Bit 0 of Phy Addr */ | ||
1756 | /* Bits 7..2: reserved */ | ||
1757 | GPC_RST_CLR = 1<<1, /* Clear GPHY Reset */ | 1735 | GPC_RST_CLR = 1<<1, /* Clear GPHY Reset */ |
1758 | GPC_RST_SET = 1<<0, /* Set GPHY Reset */ | 1736 | GPC_RST_SET = 1<<0, /* Set GPHY Reset */ |
1759 | }; | 1737 | }; |
diff --git a/drivers/net/smc91x.h b/drivers/net/smc91x.h index 111f23d05764..506bffcbc6dc 100644 --- a/drivers/net/smc91x.h +++ b/drivers/net/smc91x.h | |||
@@ -281,17 +281,14 @@ SMC_outw(u16 val, void __iomem *ioaddr, int reg) | |||
281 | 281 | ||
282 | #elif defined(CONFIG_SUPERH) | 282 | #elif defined(CONFIG_SUPERH) |
283 | 283 | ||
284 | #if defined(CONFIG_SH_7780_SOLUTION_ENGINE) || defined(CONFIG_SH_7722_SOLUTION_ENGINE) | 284 | #ifdef CONFIG_SOLUTION_ENGINE |
285 | #define SMC_CAN_USE_8BIT 0 | 285 | #define SMC_CAN_USE_8BIT 0 |
286 | #define SMC_CAN_USE_16BIT 1 | 286 | #define SMC_CAN_USE_16BIT 1 |
287 | #define SMC_CAN_USE_32BIT 0 | 287 | #define SMC_CAN_USE_32BIT 0 |
288 | #define SMC_IO_SHIFT 0 | 288 | #define SMC_IO_SHIFT 0 |
289 | #define SMC_NOWAIT 1 | 289 | #define SMC_NOWAIT 1 |
290 | 290 | ||
291 | #define SMC_inb(a, r) (inw((a) + ((r)&~1)) >> (8*(r%2)))&0xff | ||
292 | #define SMC_inw(a, r) inw((a) + (r)) | 291 | #define SMC_inw(a, r) inw((a) + (r)) |
293 | #define SMC_outb(v, a, r) outw(((inw((a)+((r)&~1))*(0xff<<8*(r%2)))) | ((v)<<(8*(r&2)))), (a) + ((r)&~1)) | ||
294 | |||
295 | #define SMC_outw(v, a, r) outw(v, (a) + (r)) | 292 | #define SMC_outw(v, a, r) outw(v, (a) + (r)) |
296 | #define SMC_insw(a, r, p, l) insw((a) + (r), p, l) | 293 | #define SMC_insw(a, r, p, l) insw((a) + (r), p, l) |
297 | #define SMC_outsw(a, r, p, l) outsw((a) + (r), p, l) | 294 | #define SMC_outsw(a, r, p, l) outsw((a) + (r), p, l) |
diff --git a/drivers/net/spider_net.c b/drivers/net/spider_net.c index ef84d7c757a0..b47ad1df2e0c 100644 --- a/drivers/net/spider_net.c +++ b/drivers/net/spider_net.c | |||
@@ -1191,43 +1191,6 @@ spider_net_poll(struct net_device *netdev, int *budget) | |||
1191 | } | 1191 | } |
1192 | 1192 | ||
1193 | /** | 1193 | /** |
1194 | * spider_net_vlan_rx_reg - initializes VLAN structures in the driver and card | ||
1195 | * @netdev: interface device structure | ||
1196 | * @grp: vlan_group structure that is registered (NULL on destroying interface) | ||
1197 | */ | ||
1198 | static void | ||
1199 | spider_net_vlan_rx_reg(struct net_device *netdev, struct vlan_group *grp) | ||
1200 | { | ||
1201 | /* further enhancement... yet to do */ | ||
1202 | return; | ||
1203 | } | ||
1204 | |||
1205 | /** | ||
1206 | * spider_net_vlan_rx_add - adds VLAN id to the card filter | ||
1207 | * @netdev: interface device structure | ||
1208 | * @vid: VLAN id to add | ||
1209 | */ | ||
1210 | static void | ||
1211 | spider_net_vlan_rx_add(struct net_device *netdev, uint16_t vid) | ||
1212 | { | ||
1213 | /* further enhancement... yet to do */ | ||
1214 | /* add vid to card's VLAN filter table */ | ||
1215 | return; | ||
1216 | } | ||
1217 | |||
1218 | /** | ||
1219 | * spider_net_vlan_rx_kill - removes VLAN id to the card filter | ||
1220 | * @netdev: interface device structure | ||
1221 | * @vid: VLAN id to remove | ||
1222 | */ | ||
1223 | static void | ||
1224 | spider_net_vlan_rx_kill(struct net_device *netdev, uint16_t vid) | ||
1225 | { | ||
1226 | /* further enhancement... yet to do */ | ||
1227 | /* remove vid from card's VLAN filter table */ | ||
1228 | } | ||
1229 | |||
1230 | /** | ||
1231 | * spider_net_get_stats - get interface statistics | 1194 | * spider_net_get_stats - get interface statistics |
1232 | * @netdev: interface device structure | 1195 | * @netdev: interface device structure |
1233 | * | 1196 | * |
@@ -2177,9 +2140,6 @@ spider_net_setup_netdev_ops(struct net_device *netdev) | |||
2177 | netdev->poll = &spider_net_poll; | 2140 | netdev->poll = &spider_net_poll; |
2178 | netdev->weight = SPIDER_NET_NAPI_WEIGHT; | 2141 | netdev->weight = SPIDER_NET_NAPI_WEIGHT; |
2179 | /* HW VLAN */ | 2142 | /* HW VLAN */ |
2180 | netdev->vlan_rx_register = &spider_net_vlan_rx_reg; | ||
2181 | netdev->vlan_rx_add_vid = &spider_net_vlan_rx_add; | ||
2182 | netdev->vlan_rx_kill_vid = &spider_net_vlan_rx_kill; | ||
2183 | #ifdef CONFIG_NET_POLL_CONTROLLER | 2143 | #ifdef CONFIG_NET_POLL_CONTROLLER |
2184 | /* poll controller */ | 2144 | /* poll controller */ |
2185 | netdev->poll_controller = &spider_net_poll_controller; | 2145 | netdev->poll_controller = &spider_net_poll_controller; |
diff --git a/drivers/net/tg3.c b/drivers/net/tg3.c index 923b9c725cc3..2f3184184ad9 100644 --- a/drivers/net/tg3.c +++ b/drivers/net/tg3.c | |||
@@ -64,8 +64,8 @@ | |||
64 | 64 | ||
65 | #define DRV_MODULE_NAME "tg3" | 65 | #define DRV_MODULE_NAME "tg3" |
66 | #define PFX DRV_MODULE_NAME ": " | 66 | #define PFX DRV_MODULE_NAME ": " |
67 | #define DRV_MODULE_VERSION "3.76" | 67 | #define DRV_MODULE_VERSION "3.77" |
68 | #define DRV_MODULE_RELDATE "May 5, 2007" | 68 | #define DRV_MODULE_RELDATE "May 31, 2007" |
69 | 69 | ||
70 | #define TG3_DEF_MAC_MODE 0 | 70 | #define TG3_DEF_MAC_MODE 0 |
71 | #define TG3_DEF_RX_MODE 0 | 71 | #define TG3_DEF_RX_MODE 0 |
@@ -9121,21 +9121,6 @@ static void tg3_vlan_rx_register(struct net_device *dev, struct vlan_group *grp) | |||
9121 | if (netif_running(dev)) | 9121 | if (netif_running(dev)) |
9122 | tg3_netif_start(tp); | 9122 | tg3_netif_start(tp); |
9123 | } | 9123 | } |
9124 | |||
9125 | static void tg3_vlan_rx_kill_vid(struct net_device *dev, unsigned short vid) | ||
9126 | { | ||
9127 | struct tg3 *tp = netdev_priv(dev); | ||
9128 | |||
9129 | if (netif_running(dev)) | ||
9130 | tg3_netif_stop(tp); | ||
9131 | |||
9132 | tg3_full_lock(tp, 0); | ||
9133 | vlan_group_set_device(tp->vlgrp, vid, NULL); | ||
9134 | tg3_full_unlock(tp); | ||
9135 | |||
9136 | if (netif_running(dev)) | ||
9137 | tg3_netif_start(tp); | ||
9138 | } | ||
9139 | #endif | 9124 | #endif |
9140 | 9125 | ||
9141 | static int tg3_get_coalesce(struct net_device *dev, struct ethtool_coalesce *ec) | 9126 | static int tg3_get_coalesce(struct net_device *dev, struct ethtool_coalesce *ec) |
@@ -10976,6 +10961,7 @@ static int __devinit tg3_get_invariants(struct tg3 *tp) | |||
10976 | * upon subsystem IDs. | 10961 | * upon subsystem IDs. |
10977 | */ | 10962 | */ |
10978 | if (tp->pdev->subsystem_vendor == PCI_VENDOR_ID_DELL && | 10963 | if (tp->pdev->subsystem_vendor == PCI_VENDOR_ID_DELL && |
10964 | GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5701 && | ||
10979 | !(tp->tg3_flags2 & TG3_FLG2_PHY_SERDES)) { | 10965 | !(tp->tg3_flags2 & TG3_FLG2_PHY_SERDES)) { |
10980 | tp->tg3_flags |= (TG3_FLAG_USE_MI_INTERRUPT | | 10966 | tp->tg3_flags |= (TG3_FLAG_USE_MI_INTERRUPT | |
10981 | TG3_FLAG_USE_LINKCHG_REG); | 10967 | TG3_FLAG_USE_LINKCHG_REG); |
@@ -11778,7 +11764,6 @@ static int __devinit tg3_init_one(struct pci_dev *pdev, | |||
11778 | #if TG3_VLAN_TAG_USED | 11764 | #if TG3_VLAN_TAG_USED |
11779 | dev->features |= NETIF_F_HW_VLAN_TX | NETIF_F_HW_VLAN_RX; | 11765 | dev->features |= NETIF_F_HW_VLAN_TX | NETIF_F_HW_VLAN_RX; |
11780 | dev->vlan_rx_register = tg3_vlan_rx_register; | 11766 | dev->vlan_rx_register = tg3_vlan_rx_register; |
11781 | dev->vlan_rx_kill_vid = tg3_vlan_rx_kill_vid; | ||
11782 | #endif | 11767 | #endif |
11783 | 11768 | ||
11784 | tp = netdev_priv(dev); | 11769 | tp = netdev_priv(dev); |
diff --git a/drivers/net/typhoon.c b/drivers/net/typhoon.c index f72573594121..15b2fb8aa492 100644 --- a/drivers/net/typhoon.c +++ b/drivers/net/typhoon.c | |||
@@ -741,15 +741,6 @@ typhoon_vlan_rx_register(struct net_device *dev, struct vlan_group *grp) | |||
741 | spin_unlock_bh(&tp->state_lock); | 741 | spin_unlock_bh(&tp->state_lock); |
742 | } | 742 | } |
743 | 743 | ||
744 | static void | ||
745 | typhoon_vlan_rx_kill_vid(struct net_device *dev, unsigned short vid) | ||
746 | { | ||
747 | struct typhoon *tp = netdev_priv(dev); | ||
748 | spin_lock_bh(&tp->state_lock); | ||
749 | vlan_group_set_device(tp->vlgrp, vid, NULL); | ||
750 | spin_unlock_bh(&tp->state_lock); | ||
751 | } | ||
752 | |||
753 | static inline void | 744 | static inline void |
754 | typhoon_tso_fill(struct sk_buff *skb, struct transmit_ring *txRing, | 745 | typhoon_tso_fill(struct sk_buff *skb, struct transmit_ring *txRing, |
755 | u32 ring_dma) | 746 | u32 ring_dma) |
@@ -2542,7 +2533,7 @@ typhoon_init_one(struct pci_dev *pdev, const struct pci_device_id *ent) | |||
2542 | dev->get_stats = typhoon_get_stats; | 2533 | dev->get_stats = typhoon_get_stats; |
2543 | dev->set_mac_address = typhoon_set_mac_address; | 2534 | dev->set_mac_address = typhoon_set_mac_address; |
2544 | dev->vlan_rx_register = typhoon_vlan_rx_register; | 2535 | dev->vlan_rx_register = typhoon_vlan_rx_register; |
2545 | dev->vlan_rx_kill_vid = typhoon_vlan_rx_kill_vid; | 2536 | |
2546 | SET_ETHTOOL_OPS(dev, &typhoon_ethtool_ops); | 2537 | SET_ETHTOOL_OPS(dev, &typhoon_ethtool_ops); |
2547 | 2538 | ||
2548 | /* We can handle scatter gather, up to 16 entries, and | 2539 | /* We can handle scatter gather, up to 16 entries, and |
diff --git a/drivers/net/wireless/hostap/hostap_80211_tx.c b/drivers/net/wireless/hostap/hostap_80211_tx.c index 246fac0e8001..3df3c60263d4 100644 --- a/drivers/net/wireless/hostap/hostap_80211_tx.c +++ b/drivers/net/wireless/hostap/hostap_80211_tx.c | |||
@@ -311,7 +311,7 @@ static struct sk_buff * hostap_tx_encrypt(struct sk_buff *skb, | |||
311 | local_info_t *local; | 311 | local_info_t *local; |
312 | struct ieee80211_hdr_4addr *hdr; | 312 | struct ieee80211_hdr_4addr *hdr; |
313 | u16 fc; | 313 | u16 fc; |
314 | int hdr_len, res; | 314 | int prefix_len, postfix_len, hdr_len, res; |
315 | 315 | ||
316 | iface = netdev_priv(skb->dev); | 316 | iface = netdev_priv(skb->dev); |
317 | local = iface->local; | 317 | local = iface->local; |
@@ -337,10 +337,13 @@ static struct sk_buff * hostap_tx_encrypt(struct sk_buff *skb, | |||
337 | if (skb == NULL) | 337 | if (skb == NULL) |
338 | return NULL; | 338 | return NULL; |
339 | 339 | ||
340 | if ((skb_headroom(skb) < crypt->ops->extra_mpdu_prefix_len || | 340 | prefix_len = crypt->ops->extra_mpdu_prefix_len + |
341 | skb_tailroom(skb) < crypt->ops->extra_mpdu_postfix_len) && | 341 | crypt->ops->extra_msdu_prefix_len; |
342 | pskb_expand_head(skb, crypt->ops->extra_mpdu_prefix_len, | 342 | postfix_len = crypt->ops->extra_mpdu_postfix_len + |
343 | crypt->ops->extra_mpdu_postfix_len, GFP_ATOMIC)) { | 343 | crypt->ops->extra_msdu_postfix_len; |
344 | if ((skb_headroom(skb) < prefix_len || | ||
345 | skb_tailroom(skb) < postfix_len) && | ||
346 | pskb_expand_head(skb, prefix_len, postfix_len, GFP_ATOMIC)) { | ||
344 | kfree_skb(skb); | 347 | kfree_skb(skb); |
345 | return NULL; | 348 | return NULL; |
346 | } | 349 | } |
diff --git a/drivers/net/wireless/prism54/islpci_eth.c b/drivers/net/wireless/prism54/islpci_eth.c index dd070cccf324..f49eb068c7d0 100644 --- a/drivers/net/wireless/prism54/islpci_eth.c +++ b/drivers/net/wireless/prism54/islpci_eth.c | |||
@@ -378,9 +378,10 @@ islpci_eth_receive(islpci_private *priv) | |||
378 | display_buffer((char *) skb->data, skb->len); | 378 | display_buffer((char *) skb->data, skb->len); |
379 | #endif | 379 | #endif |
380 | /* take care of monitor mode and spy monitoring. */ | 380 | /* take care of monitor mode and spy monitoring. */ |
381 | if (unlikely(priv->iw_mode == IW_MODE_MONITOR)) | 381 | if (unlikely(priv->iw_mode == IW_MODE_MONITOR)) { |
382 | skb->dev = ndev; | ||
382 | discard = islpci_monitor_rx(priv, &skb); | 383 | discard = islpci_monitor_rx(priv, &skb); |
383 | else { | 384 | } else { |
384 | if (unlikely(skb->data[2 * ETH_ALEN] == 0)) { | 385 | if (unlikely(skb->data[2 * ETH_ALEN] == 0)) { |
385 | /* The packet has a rx_annex. Read it for spy monitoring, Then | 386 | /* The packet has a rx_annex. Read it for spy monitoring, Then |
386 | * remove it, while keeping the 2 leading MAC addr. | 387 | * remove it, while keeping the 2 leading MAC addr. |
diff --git a/drivers/pci/msi.c b/drivers/pci/msi.c index d9cbd586ae4b..be1df85e5e2d 100644 --- a/drivers/pci/msi.c +++ b/drivers/pci/msi.c | |||
@@ -15,10 +15,10 @@ | |||
15 | #include <linux/pci.h> | 15 | #include <linux/pci.h> |
16 | #include <linux/proc_fs.h> | 16 | #include <linux/proc_fs.h> |
17 | #include <linux/msi.h> | 17 | #include <linux/msi.h> |
18 | #include <linux/smp.h> | ||
18 | 19 | ||
19 | #include <asm/errno.h> | 20 | #include <asm/errno.h> |
20 | #include <asm/io.h> | 21 | #include <asm/io.h> |
21 | #include <asm/smp.h> | ||
22 | 22 | ||
23 | #include "pci.h" | 23 | #include "pci.h" |
24 | #include "msi.h" | 24 | #include "msi.h" |
@@ -333,7 +333,7 @@ static int msi_capability_init(struct pci_dev *dev) | |||
333 | msi_mask_bits_reg(pos, is_64bit_address(control)), | 333 | msi_mask_bits_reg(pos, is_64bit_address(control)), |
334 | maskbits); | 334 | maskbits); |
335 | } | 335 | } |
336 | list_add(&entry->list, &dev->msi_list); | 336 | list_add_tail(&entry->list, &dev->msi_list); |
337 | 337 | ||
338 | /* Configure MSI capability structure */ | 338 | /* Configure MSI capability structure */ |
339 | ret = arch_setup_msi_irqs(dev, 1, PCI_CAP_ID_MSI); | 339 | ret = arch_setup_msi_irqs(dev, 1, PCI_CAP_ID_MSI); |
@@ -404,7 +404,7 @@ static int msix_capability_init(struct pci_dev *dev, | |||
404 | entry->dev = dev; | 404 | entry->dev = dev; |
405 | entry->mask_base = base; | 405 | entry->mask_base = base; |
406 | 406 | ||
407 | list_add(&entry->list, &dev->msi_list); | 407 | list_add_tail(&entry->list, &dev->msi_list); |
408 | } | 408 | } |
409 | 409 | ||
410 | ret = arch_setup_msi_irqs(dev, nvec, PCI_CAP_ID_MSIX); | 410 | ret = arch_setup_msi_irqs(dev, nvec, PCI_CAP_ID_MSIX); |
@@ -558,12 +558,12 @@ static int msi_free_irqs(struct pci_dev* dev) | |||
558 | 558 | ||
559 | list_for_each_entry_safe(entry, tmp, &dev->msi_list, list) { | 559 | list_for_each_entry_safe(entry, tmp, &dev->msi_list, list) { |
560 | if (entry->msi_attrib.type == PCI_CAP_ID_MSIX) { | 560 | if (entry->msi_attrib.type == PCI_CAP_ID_MSIX) { |
561 | if (list_is_last(&entry->list, &dev->msi_list)) | ||
562 | iounmap(entry->mask_base); | ||
563 | |||
564 | writel(1, entry->mask_base + entry->msi_attrib.entry_nr | 561 | writel(1, entry->mask_base + entry->msi_attrib.entry_nr |
565 | * PCI_MSIX_ENTRY_SIZE | 562 | * PCI_MSIX_ENTRY_SIZE |
566 | + PCI_MSIX_ENTRY_VECTOR_CTRL_OFFSET); | 563 | + PCI_MSIX_ENTRY_VECTOR_CTRL_OFFSET); |
564 | |||
565 | if (list_is_last(&entry->list, &dev->msi_list)) | ||
566 | iounmap(entry->mask_base); | ||
567 | } | 567 | } |
568 | list_del(&entry->list); | 568 | list_del(&entry->list); |
569 | kfree(entry); | 569 | kfree(entry); |
diff --git a/drivers/pci/quirks.c b/drivers/pci/quirks.c index 6ccc2e95930a..01d8f8a8843c 100644 --- a/drivers/pci/quirks.c +++ b/drivers/pci/quirks.c | |||
@@ -1625,18 +1625,22 @@ DECLARE_PCI_FIXUP_RESUME(PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_CK804_PCIE, | |||
1625 | quirk_nvidia_ck804_pcie_aer_ext_cap); | 1625 | quirk_nvidia_ck804_pcie_aer_ext_cap); |
1626 | 1626 | ||
1627 | #ifdef CONFIG_PCI_MSI | 1627 | #ifdef CONFIG_PCI_MSI |
1628 | /* The Serverworks PCI-X chipset does not support MSI. We cannot easily rely | 1628 | /* Some chipsets do not support MSI. We cannot easily rely on setting |
1629 | * on setting PCI_BUS_FLAGS_NO_MSI in its bus flags because there are actually | 1629 | * PCI_BUS_FLAGS_NO_MSI in its bus flags because there are actually |
1630 | * some other busses controlled by the chipset even if Linux is not aware of it. | 1630 | * some other busses controlled by the chipset even if Linux is not |
1631 | * Instead of setting the flag on all busses in the machine, simply disable MSI | 1631 | * aware of it. Instead of setting the flag on all busses in the |
1632 | * globally. | 1632 | * machine, simply disable MSI globally. |
1633 | */ | 1633 | */ |
1634 | static void __init quirk_svw_msi(struct pci_dev *dev) | 1634 | static void __init quirk_disable_all_msi(struct pci_dev *dev) |
1635 | { | 1635 | { |
1636 | pci_no_msi(); | 1636 | pci_no_msi(); |
1637 | printk(KERN_WARNING "PCI: MSI quirk detected. MSI deactivated.\n"); | 1637 | printk(KERN_WARNING "PCI: MSI quirk detected. MSI deactivated.\n"); |
1638 | } | 1638 | } |
1639 | DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_SERVERWORKS, PCI_DEVICE_ID_SERVERWORKS_GCNB_LE, quirk_svw_msi); | 1639 | DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_SERVERWORKS, PCI_DEVICE_ID_SERVERWORKS_GCNB_LE, quirk_disable_all_msi); |
1640 | DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_SERVERWORKS, PCI_DEVICE_ID_SERVERWORKS_HT1000_PCIX, quirk_disable_all_msi); | ||
1641 | DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_ATI, PCI_DEVICE_ID_ATI_RS400_200, quirk_disable_all_msi); | ||
1642 | DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_ATI, PCI_DEVICE_ID_ATI_RS480, quirk_disable_all_msi); | ||
1643 | DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_VT3351, quirk_disable_all_msi); | ||
1640 | 1644 | ||
1641 | /* Disable MSI on chipsets that are known to not support it */ | 1645 | /* Disable MSI on chipsets that are known to not support it */ |
1642 | static void __devinit quirk_disable_msi(struct pci_dev *dev) | 1646 | static void __devinit quirk_disable_msi(struct pci_dev *dev) |
@@ -1649,8 +1653,6 @@ static void __devinit quirk_disable_msi(struct pci_dev *dev) | |||
1649 | } | 1653 | } |
1650 | } | 1654 | } |
1651 | DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_8131_BRIDGE, quirk_disable_msi); | 1655 | DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_8131_BRIDGE, quirk_disable_msi); |
1652 | DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_ATI, PCI_DEVICE_ID_ATI_RS400_200, quirk_disable_msi); | ||
1653 | DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_ATI, PCI_DEVICE_ID_ATI_RS480, quirk_disable_msi); | ||
1654 | 1656 | ||
1655 | /* Go through the list of Hypertransport capabilities and | 1657 | /* Go through the list of Hypertransport capabilities and |
1656 | * return 1 if a HT MSI capability is found and enabled */ | 1658 | * return 1 if a HT MSI capability is found and enabled */ |
diff --git a/drivers/pci/search.c b/drivers/pci/search.c index b137a27472c7..c13232435dc0 100644 --- a/drivers/pci/search.c +++ b/drivers/pci/search.c | |||
@@ -403,10 +403,11 @@ const struct pci_device_id *pci_find_present(const struct pci_device_id *ids) | |||
403 | while (ids->vendor || ids->subvendor || ids->class_mask) { | 403 | while (ids->vendor || ids->subvendor || ids->class_mask) { |
404 | list_for_each_entry(dev, &pci_devices, global_list) { | 404 | list_for_each_entry(dev, &pci_devices, global_list) { |
405 | if ((found = pci_match_one_device(ids, dev)) != NULL) | 405 | if ((found = pci_match_one_device(ids, dev)) != NULL) |
406 | break; | 406 | goto exit; |
407 | } | 407 | } |
408 | ids++; | 408 | ids++; |
409 | } | 409 | } |
410 | exit: | ||
410 | up_read(&pci_bus_sem); | 411 | up_read(&pci_bus_sem); |
411 | return found; | 412 | return found; |
412 | } | 413 | } |
diff --git a/drivers/pcmcia/at91_cf.c b/drivers/pcmcia/at91_cf.c index 948efc775a78..eb6abd3f9221 100644 --- a/drivers/pcmcia/at91_cf.c +++ b/drivers/pcmcia/at91_cf.c | |||
@@ -336,16 +336,21 @@ static int at91_cf_suspend(struct platform_device *pdev, pm_message_t mesg) | |||
336 | enable_irq_wake(board->det_pin); | 336 | enable_irq_wake(board->det_pin); |
337 | if (board->irq_pin) | 337 | if (board->irq_pin) |
338 | enable_irq_wake(board->irq_pin); | 338 | enable_irq_wake(board->irq_pin); |
339 | } else { | ||
340 | disable_irq_wake(board->det_pin); | ||
341 | if (board->irq_pin) | ||
342 | disable_irq_wake(board->irq_pin); | ||
343 | } | 339 | } |
344 | return 0; | 340 | return 0; |
345 | } | 341 | } |
346 | 342 | ||
347 | static int at91_cf_resume(struct platform_device *pdev) | 343 | static int at91_cf_resume(struct platform_device *pdev) |
348 | { | 344 | { |
345 | struct at91_cf_socket *cf = platform_get_drvdata(pdev); | ||
346 | struct at91_cf_data *board = cf->board; | ||
347 | |||
348 | if (device_may_wakeup(&pdev->dev)) { | ||
349 | disable_irq_wake(board->det_pin); | ||
350 | if (board->irq_pin) | ||
351 | disable_irq_wake(board->irq_pin); | ||
352 | } | ||
353 | |||
349 | pcmcia_socket_dev_resume(&pdev->dev); | 354 | pcmcia_socket_dev_resume(&pdev->dev); |
350 | return 0; | 355 | return 0; |
351 | } | 356 | } |
diff --git a/drivers/rtc/rtc-cmos.c b/drivers/rtc/rtc-cmos.c index 6085261aa2c1..e24ea82dc35b 100644 --- a/drivers/rtc/rtc-cmos.c +++ b/drivers/rtc/rtc-cmos.c | |||
@@ -641,9 +641,16 @@ cmos_pnp_probe(struct pnp_dev *pnp, const struct pnp_device_id *id) | |||
641 | * drivers can't provide shutdown() methods to disable IRQs. | 641 | * drivers can't provide shutdown() methods to disable IRQs. |
642 | * Or better yet, fix PNP to allow those methods... | 642 | * Or better yet, fix PNP to allow those methods... |
643 | */ | 643 | */ |
644 | return cmos_do_probe(&pnp->dev, | 644 | if (pnp_port_start(pnp,0) == 0x70 && !pnp_irq_valid(pnp,0)) |
645 | &pnp->res.port_resource[0], | 645 | /* Some machines contain a PNP entry for the RTC, but |
646 | pnp->res.irq_resource[0].start); | 646 | * don't define the IRQ. It should always be safe to |
647 | * hardcode it in these cases | ||
648 | */ | ||
649 | return cmos_do_probe(&pnp->dev, &pnp->res.port_resource[0], 8); | ||
650 | else | ||
651 | return cmos_do_probe(&pnp->dev, | ||
652 | &pnp->res.port_resource[0], | ||
653 | pnp->res.irq_resource[0].start); | ||
647 | } | 654 | } |
648 | 655 | ||
649 | static void __exit cmos_pnp_remove(struct pnp_dev *pnp) | 656 | static void __exit cmos_pnp_remove(struct pnp_dev *pnp) |
diff --git a/drivers/s390/block/dasd_eer.c b/drivers/s390/block/dasd_eer.c index a1dc8c466ec9..0c081a664ee8 100644 --- a/drivers/s390/block/dasd_eer.c +++ b/drivers/s390/block/dasd_eer.c | |||
@@ -14,9 +14,9 @@ | |||
14 | #include <linux/moduleparam.h> | 14 | #include <linux/moduleparam.h> |
15 | #include <linux/device.h> | 15 | #include <linux/device.h> |
16 | #include <linux/poll.h> | 16 | #include <linux/poll.h> |
17 | #include <linux/mutex.h> | ||
17 | 18 | ||
18 | #include <asm/uaccess.h> | 19 | #include <asm/uaccess.h> |
19 | #include <asm/semaphore.h> | ||
20 | #include <asm/atomic.h> | 20 | #include <asm/atomic.h> |
21 | #include <asm/ebcdic.h> | 21 | #include <asm/ebcdic.h> |
22 | 22 | ||
@@ -514,7 +514,7 @@ void dasd_eer_disable(struct dasd_device *device) | |||
514 | * to transfer in a readbuffer, which is protected by the readbuffer_mutex. | 514 | * to transfer in a readbuffer, which is protected by the readbuffer_mutex. |
515 | */ | 515 | */ |
516 | static char readbuffer[PAGE_SIZE]; | 516 | static char readbuffer[PAGE_SIZE]; |
517 | static DECLARE_MUTEX(readbuffer_mutex); | 517 | static DEFINE_MUTEX(readbuffer_mutex); |
518 | 518 | ||
519 | static int dasd_eer_open(struct inode *inp, struct file *filp) | 519 | static int dasd_eer_open(struct inode *inp, struct file *filp) |
520 | { | 520 | { |
@@ -579,7 +579,7 @@ static ssize_t dasd_eer_read(struct file *filp, char __user *buf, | |||
579 | struct eerbuffer *eerb; | 579 | struct eerbuffer *eerb; |
580 | 580 | ||
581 | eerb = (struct eerbuffer *) filp->private_data; | 581 | eerb = (struct eerbuffer *) filp->private_data; |
582 | if (down_interruptible(&readbuffer_mutex)) | 582 | if (mutex_lock_interruptible(&readbuffer_mutex)) |
583 | return -ERESTARTSYS; | 583 | return -ERESTARTSYS; |
584 | 584 | ||
585 | spin_lock_irqsave(&bufferlock, flags); | 585 | spin_lock_irqsave(&bufferlock, flags); |
@@ -588,7 +588,7 @@ static ssize_t dasd_eer_read(struct file *filp, char __user *buf, | |||
588 | /* has been deleted */ | 588 | /* has been deleted */ |
589 | eerb->residual = 0; | 589 | eerb->residual = 0; |
590 | spin_unlock_irqrestore(&bufferlock, flags); | 590 | spin_unlock_irqrestore(&bufferlock, flags); |
591 | up(&readbuffer_mutex); | 591 | mutex_unlock(&readbuffer_mutex); |
592 | return -EIO; | 592 | return -EIO; |
593 | } else if (eerb->residual > 0) { | 593 | } else if (eerb->residual > 0) { |
594 | /* OK we still have a second half of a record to deliver */ | 594 | /* OK we still have a second half of a record to deliver */ |
@@ -602,7 +602,7 @@ static ssize_t dasd_eer_read(struct file *filp, char __user *buf, | |||
602 | if (!tc) { | 602 | if (!tc) { |
603 | /* no data available */ | 603 | /* no data available */ |
604 | spin_unlock_irqrestore(&bufferlock, flags); | 604 | spin_unlock_irqrestore(&bufferlock, flags); |
605 | up(&readbuffer_mutex); | 605 | mutex_unlock(&readbuffer_mutex); |
606 | if (filp->f_flags & O_NONBLOCK) | 606 | if (filp->f_flags & O_NONBLOCK) |
607 | return -EAGAIN; | 607 | return -EAGAIN; |
608 | rc = wait_event_interruptible( | 608 | rc = wait_event_interruptible( |
@@ -610,7 +610,7 @@ static ssize_t dasd_eer_read(struct file *filp, char __user *buf, | |||
610 | eerb->head != eerb->tail); | 610 | eerb->head != eerb->tail); |
611 | if (rc) | 611 | if (rc) |
612 | return rc; | 612 | return rc; |
613 | if (down_interruptible(&readbuffer_mutex)) | 613 | if (mutex_lock_interruptible(&readbuffer_mutex)) |
614 | return -ERESTARTSYS; | 614 | return -ERESTARTSYS; |
615 | spin_lock_irqsave(&bufferlock, flags); | 615 | spin_lock_irqsave(&bufferlock, flags); |
616 | } | 616 | } |
@@ -626,11 +626,11 @@ static ssize_t dasd_eer_read(struct file *filp, char __user *buf, | |||
626 | spin_unlock_irqrestore(&bufferlock, flags); | 626 | spin_unlock_irqrestore(&bufferlock, flags); |
627 | 627 | ||
628 | if (copy_to_user(buf, readbuffer, effective_count)) { | 628 | if (copy_to_user(buf, readbuffer, effective_count)) { |
629 | up(&readbuffer_mutex); | 629 | mutex_unlock(&readbuffer_mutex); |
630 | return -EFAULT; | 630 | return -EFAULT; |
631 | } | 631 | } |
632 | 632 | ||
633 | up(&readbuffer_mutex); | 633 | mutex_unlock(&readbuffer_mutex); |
634 | return effective_count; | 634 | return effective_count; |
635 | } | 635 | } |
636 | 636 | ||
diff --git a/drivers/s390/char/raw3270.c b/drivers/s390/char/raw3270.c index f6ef90ee3e7d..743944ad61ec 100644 --- a/drivers/s390/char/raw3270.c +++ b/drivers/s390/char/raw3270.c | |||
@@ -487,7 +487,7 @@ struct raw3270_ua { /* Query Reply structure for Usable Area */ | |||
487 | } __attribute__ ((packed)); | 487 | } __attribute__ ((packed)); |
488 | 488 | ||
489 | static struct diag210 raw3270_init_diag210; | 489 | static struct diag210 raw3270_init_diag210; |
490 | static DECLARE_MUTEX(raw3270_init_sem); | 490 | static DEFINE_MUTEX(raw3270_init_mutex); |
491 | 491 | ||
492 | static int | 492 | static int |
493 | raw3270_init_irq(struct raw3270_view *view, struct raw3270_request *rq, | 493 | raw3270_init_irq(struct raw3270_view *view, struct raw3270_request *rq, |
@@ -713,7 +713,7 @@ raw3270_size_device(struct raw3270 *rp) | |||
713 | { | 713 | { |
714 | int rc; | 714 | int rc; |
715 | 715 | ||
716 | down(&raw3270_init_sem); | 716 | mutex_lock(&raw3270_init_mutex); |
717 | rp->view = &raw3270_init_view; | 717 | rp->view = &raw3270_init_view; |
718 | raw3270_init_view.dev = rp; | 718 | raw3270_init_view.dev = rp; |
719 | if (MACHINE_IS_VM) | 719 | if (MACHINE_IS_VM) |
@@ -722,7 +722,7 @@ raw3270_size_device(struct raw3270 *rp) | |||
722 | rc = __raw3270_size_device(rp); | 722 | rc = __raw3270_size_device(rp); |
723 | raw3270_init_view.dev = NULL; | 723 | raw3270_init_view.dev = NULL; |
724 | rp->view = NULL; | 724 | rp->view = NULL; |
725 | up(&raw3270_init_sem); | 725 | mutex_unlock(&raw3270_init_mutex); |
726 | if (rc == 0) { /* Found something. */ | 726 | if (rc == 0) { /* Found something. */ |
727 | /* Try to find a model. */ | 727 | /* Try to find a model. */ |
728 | rp->model = 0; | 728 | rp->model = 0; |
@@ -749,7 +749,7 @@ raw3270_reset_device(struct raw3270 *rp) | |||
749 | { | 749 | { |
750 | int rc; | 750 | int rc; |
751 | 751 | ||
752 | down(&raw3270_init_sem); | 752 | mutex_lock(&raw3270_init_mutex); |
753 | memset(&rp->init_request, 0, sizeof(rp->init_request)); | 753 | memset(&rp->init_request, 0, sizeof(rp->init_request)); |
754 | memset(&rp->init_data, 0, sizeof(rp->init_data)); | 754 | memset(&rp->init_data, 0, sizeof(rp->init_data)); |
755 | /* Store reset data stream to init_data/init_request */ | 755 | /* Store reset data stream to init_data/init_request */ |
@@ -764,7 +764,7 @@ raw3270_reset_device(struct raw3270 *rp) | |||
764 | rc = raw3270_start_init(rp, &raw3270_init_view, &rp->init_request); | 764 | rc = raw3270_start_init(rp, &raw3270_init_view, &rp->init_request); |
765 | raw3270_init_view.dev = NULL; | 765 | raw3270_init_view.dev = NULL; |
766 | rp->view = NULL; | 766 | rp->view = NULL; |
767 | up(&raw3270_init_sem); | 767 | mutex_unlock(&raw3270_init_mutex); |
768 | return rc; | 768 | return rc; |
769 | } | 769 | } |
770 | 770 | ||
diff --git a/drivers/s390/cio/device.c b/drivers/s390/cio/device.c index a8b373f69cf0..6b264bdb5bfb 100644 --- a/drivers/s390/cio/device.c +++ b/drivers/s390/cio/device.c | |||
@@ -296,30 +296,57 @@ static void ccw_device_unregister(struct ccw_device *cdev) | |||
296 | device_del(&cdev->dev); | 296 | device_del(&cdev->dev); |
297 | } | 297 | } |
298 | 298 | ||
299 | static void ccw_device_remove_orphan_cb(struct device *dev) | ||
300 | { | ||
301 | struct ccw_device *cdev = to_ccwdev(dev); | ||
302 | |||
303 | ccw_device_unregister(cdev); | ||
304 | put_device(&cdev->dev); | ||
305 | } | ||
306 | |||
307 | static void ccw_device_remove_sch_cb(struct device *dev) | ||
308 | { | ||
309 | struct subchannel *sch; | ||
310 | |||
311 | sch = to_subchannel(dev); | ||
312 | css_sch_device_unregister(sch); | ||
313 | /* Reset intparm to zeroes. */ | ||
314 | sch->schib.pmcw.intparm = 0; | ||
315 | cio_modify(sch); | ||
316 | put_device(&sch->dev); | ||
317 | } | ||
318 | |||
299 | static void | 319 | static void |
300 | ccw_device_remove_disconnected(struct ccw_device *cdev) | 320 | ccw_device_remove_disconnected(struct ccw_device *cdev) |
301 | { | 321 | { |
302 | struct subchannel *sch; | ||
303 | unsigned long flags; | 322 | unsigned long flags; |
323 | int rc; | ||
324 | |||
304 | /* | 325 | /* |
305 | * Forced offline in disconnected state means | 326 | * Forced offline in disconnected state means |
306 | * 'throw away device'. | 327 | * 'throw away device'. |
307 | */ | 328 | */ |
308 | if (ccw_device_is_orphan(cdev)) { | 329 | if (ccw_device_is_orphan(cdev)) { |
309 | /* Deregister ccw device. */ | 330 | /* |
331 | * Deregister ccw device. | ||
332 | * Unfortunately, we cannot do this directly from the | ||
333 | * attribute method. | ||
334 | */ | ||
310 | spin_lock_irqsave(cdev->ccwlock, flags); | 335 | spin_lock_irqsave(cdev->ccwlock, flags); |
311 | cdev->private->state = DEV_STATE_NOT_OPER; | 336 | cdev->private->state = DEV_STATE_NOT_OPER; |
312 | spin_unlock_irqrestore(cdev->ccwlock, flags); | 337 | spin_unlock_irqrestore(cdev->ccwlock, flags); |
313 | ccw_device_unregister(cdev); | 338 | rc = device_schedule_callback(&cdev->dev, |
314 | put_device(&cdev->dev); | 339 | ccw_device_remove_orphan_cb); |
315 | return ; | 340 | if (rc) |
341 | dev_info(&cdev->dev, "Couldn't unregister orphan\n"); | ||
342 | return; | ||
316 | } | 343 | } |
317 | sch = to_subchannel(cdev->dev.parent); | 344 | /* Deregister subchannel, which will kill the ccw device. */ |
318 | css_sch_device_unregister(sch); | 345 | rc = device_schedule_callback(cdev->dev.parent, |
319 | /* Reset intparm to zeroes. */ | 346 | ccw_device_remove_sch_cb); |
320 | sch->schib.pmcw.intparm = 0; | 347 | if (rc) |
321 | cio_modify(sch); | 348 | dev_info(&cdev->dev, |
322 | put_device(&sch->dev); | 349 | "Couldn't unregister disconnected device\n"); |
323 | } | 350 | } |
324 | 351 | ||
325 | int | 352 | int |
diff --git a/drivers/s390/cio/device_fsm.c b/drivers/s390/cio/device_fsm.c index 898ec3b2bebb..6bba80929577 100644 --- a/drivers/s390/cio/device_fsm.c +++ b/drivers/s390/cio/device_fsm.c | |||
@@ -688,6 +688,12 @@ ccw_device_disband_done(struct ccw_device *cdev, int err) | |||
688 | ccw_device_done(cdev, DEV_STATE_BOXED); | 688 | ccw_device_done(cdev, DEV_STATE_BOXED); |
689 | break; | 689 | break; |
690 | default: | 690 | default: |
691 | cdev->private->flags.donotify = 0; | ||
692 | if (get_device(&cdev->dev)) { | ||
693 | PREPARE_WORK(&cdev->private->kick_work, | ||
694 | ccw_device_call_sch_unregister); | ||
695 | queue_work(ccw_device_work, &cdev->private->kick_work); | ||
696 | } | ||
691 | ccw_device_done(cdev, DEV_STATE_NOT_OPER); | 697 | ccw_device_done(cdev, DEV_STATE_NOT_OPER); |
692 | break; | 698 | break; |
693 | } | 699 | } |
diff --git a/drivers/sbus/char/flash.c b/drivers/sbus/char/flash.c index 262f01e68592..44e039865aa9 100644 --- a/drivers/sbus/char/flash.c +++ b/drivers/sbus/char/flash.c | |||
@@ -14,6 +14,7 @@ | |||
14 | #include <linux/init.h> | 14 | #include <linux/init.h> |
15 | #include <linux/smp_lock.h> | 15 | #include <linux/smp_lock.h> |
16 | #include <linux/spinlock.h> | 16 | #include <linux/spinlock.h> |
17 | #include <linux/mm.h> | ||
17 | 18 | ||
18 | #include <asm/system.h> | 19 | #include <asm/system.h> |
19 | #include <asm/uaccess.h> | 20 | #include <asm/uaccess.h> |
diff --git a/drivers/scsi/NCR5380.c b/drivers/scsi/NCR5380.c index bb3cb3360541..88ea5a1fb606 100644 --- a/drivers/scsi/NCR5380.c +++ b/drivers/scsi/NCR5380.c | |||
@@ -2625,7 +2625,7 @@ static void NCR5380_reselect(struct Scsi_Host *instance) { | |||
2625 | #ifdef REAL_DMA | 2625 | #ifdef REAL_DMA |
2626 | static void NCR5380_dma_complete(NCR5380_instance * instance) { | 2626 | static void NCR5380_dma_complete(NCR5380_instance * instance) { |
2627 | NCR5380_local_declare(); | 2627 | NCR5380_local_declare(); |
2628 | struct NCR5380_hostdata *hostdata = (struct NCR5380_hostdata * instance->hostdata); | 2628 | struct NCR5380_hostdata *hostdata = (struct NCR5380_hostdata *) instance->hostdata; |
2629 | int transferred; | 2629 | int transferred; |
2630 | NCR5380_setup(instance); | 2630 | NCR5380_setup(instance); |
2631 | 2631 | ||
diff --git a/drivers/scsi/aic7xxx/aic79xx_core.c b/drivers/scsi/aic7xxx/aic79xx_core.c index 9ddc6e4a74b0..05f692bd0adc 100644 --- a/drivers/scsi/aic7xxx/aic79xx_core.c +++ b/drivers/scsi/aic7xxx/aic79xx_core.c | |||
@@ -5180,7 +5180,7 @@ ahd_handle_devreset(struct ahd_softc *ahd, struct ahd_devinfo *devinfo, | |||
5180 | cur_lun = lun; | 5180 | cur_lun = lun; |
5181 | max_lun = lun; | 5181 | max_lun = lun; |
5182 | } | 5182 | } |
5183 | for (cur_lun <= max_lun; cur_lun++) { | 5183 | for (;cur_lun <= max_lun; cur_lun++) { |
5184 | struct ahd_tmode_lstate* lstate; | 5184 | struct ahd_tmode_lstate* lstate; |
5185 | 5185 | ||
5186 | lstate = tstate->enabled_luns[cur_lun]; | 5186 | lstate = tstate->enabled_luns[cur_lun]; |
diff --git a/drivers/serial/amba-pl010.c b/drivers/serial/amba-pl010.c index 1a9a24b82636..00d1255e4c12 100644 --- a/drivers/serial/amba-pl010.c +++ b/drivers/serial/amba-pl010.c | |||
@@ -167,8 +167,9 @@ static void pl010_rx_chars(struct uart_amba_port *uap) | |||
167 | ignore_char: | 167 | ignore_char: |
168 | status = readb(uap->port.membase + UART01x_FR); | 168 | status = readb(uap->port.membase + UART01x_FR); |
169 | } | 169 | } |
170 | spin_unlock(&port->lock); | ||
170 | tty_flip_buffer_push(tty); | 171 | tty_flip_buffer_push(tty); |
171 | return; | 172 | spin_lock(&port->lock); |
172 | } | 173 | } |
173 | 174 | ||
174 | static void pl010_tx_chars(struct uart_amba_port *uap) | 175 | static void pl010_tx_chars(struct uart_amba_port *uap) |
diff --git a/drivers/serial/amba-pl011.c b/drivers/serial/amba-pl011.c index 44639e71372a..954073c6ce3a 100644 --- a/drivers/serial/amba-pl011.c +++ b/drivers/serial/amba-pl011.c | |||
@@ -153,8 +153,9 @@ static void pl011_rx_chars(struct uart_amba_port *uap) | |||
153 | ignore_char: | 153 | ignore_char: |
154 | status = readw(uap->port.membase + UART01x_FR); | 154 | status = readw(uap->port.membase + UART01x_FR); |
155 | } | 155 | } |
156 | spin_unlock(&uap->port.lock); | ||
156 | tty_flip_buffer_push(tty); | 157 | tty_flip_buffer_push(tty); |
157 | return; | 158 | spin_lock(&uap->port.lock); |
158 | } | 159 | } |
159 | 160 | ||
160 | static void pl011_tx_chars(struct uart_amba_port *uap) | 161 | static void pl011_tx_chars(struct uart_amba_port *uap) |
diff --git a/drivers/serial/serial_ks8695.c b/drivers/serial/serial_ks8695.c index 698763b28ddd..8721afe1ae4f 100644 --- a/drivers/serial/serial_ks8695.c +++ b/drivers/serial/serial_ks8695.c | |||
@@ -589,7 +589,7 @@ static int __init ks8695_console_setup(struct console *co, char *options) | |||
589 | return uart_set_options(port, co, baud, parity, bits, flow); | 589 | return uart_set_options(port, co, baud, parity, bits, flow); |
590 | } | 590 | } |
591 | 591 | ||
592 | extern struct uart_driver ks8695_reg; | 592 | static struct uart_driver ks8695_reg; |
593 | 593 | ||
594 | static struct console ks8695_console = { | 594 | static struct console ks8695_console = { |
595 | .name = SERIAL_KS8695_DEVNAME, | 595 | .name = SERIAL_KS8695_DEVNAME, |
diff --git a/drivers/spi/atmel_spi.c b/drivers/spi/atmel_spi.c index 1d8a2f6bb8eb..8b2601de3630 100644 --- a/drivers/spi/atmel_spi.c +++ b/drivers/spi/atmel_spi.c | |||
@@ -113,16 +113,16 @@ static void atmel_spi_next_xfer(struct spi_master *master, | |||
113 | 113 | ||
114 | len = as->remaining_bytes; | 114 | len = as->remaining_bytes; |
115 | 115 | ||
116 | tx_dma = xfer->tx_dma; | 116 | tx_dma = xfer->tx_dma + xfer->len - len; |
117 | rx_dma = xfer->rx_dma; | 117 | rx_dma = xfer->rx_dma + xfer->len - len; |
118 | 118 | ||
119 | /* use scratch buffer only when rx or tx data is unspecified */ | 119 | /* use scratch buffer only when rx or tx data is unspecified */ |
120 | if (rx_dma == INVALID_DMA_ADDRESS) { | 120 | if (!xfer->rx_buf) { |
121 | rx_dma = as->buffer_dma; | 121 | rx_dma = as->buffer_dma; |
122 | if (len > BUFFER_SIZE) | 122 | if (len > BUFFER_SIZE) |
123 | len = BUFFER_SIZE; | 123 | len = BUFFER_SIZE; |
124 | } | 124 | } |
125 | if (tx_dma == INVALID_DMA_ADDRESS) { | 125 | if (!xfer->tx_buf) { |
126 | tx_dma = as->buffer_dma; | 126 | tx_dma = as->buffer_dma; |
127 | if (len > BUFFER_SIZE) | 127 | if (len > BUFFER_SIZE) |
128 | len = BUFFER_SIZE; | 128 | len = BUFFER_SIZE; |
diff --git a/drivers/spi/spi.c b/drivers/spi/spi.c index c3219b29b5ac..4831edbae2d5 100644 --- a/drivers/spi/spi.c +++ b/drivers/spi/spi.c | |||
@@ -411,7 +411,7 @@ EXPORT_SYMBOL_GPL(spi_alloc_master); | |||
411 | */ | 411 | */ |
412 | int spi_register_master(struct spi_master *master) | 412 | int spi_register_master(struct spi_master *master) |
413 | { | 413 | { |
414 | static atomic_t dyn_bus_id = ATOMIC_INIT((1<<16) - 1); | 414 | static atomic_t dyn_bus_id = ATOMIC_INIT((1<<15) - 1); |
415 | struct device *dev = master->cdev.dev; | 415 | struct device *dev = master->cdev.dev; |
416 | int status = -ENODEV; | 416 | int status = -ENODEV; |
417 | int dynamic = 0; | 417 | int dynamic = 0; |
diff --git a/drivers/spi/spi_imx.c b/drivers/spi/spi_imx.c index 51daa212c6b7..656be4a5094a 100644 --- a/drivers/spi/spi_imx.c +++ b/drivers/spi/spi_imx.c | |||
@@ -121,7 +121,7 @@ | |||
121 | 32.768 KHz Clock */ | 121 | 32.768 KHz Clock */ |
122 | 122 | ||
123 | /* SPI DMA Register Bit Fields & Masks */ | 123 | /* SPI DMA Register Bit Fields & Masks */ |
124 | #define SPI_DMA_RHDMA (0xF << 4) /* RXFIFO Half Status */ | 124 | #define SPI_DMA_RHDMA (0x1 << 4) /* RXFIFO Half Status */ |
125 | #define SPI_DMA_RFDMA (0x1 << 5) /* RXFIFO Full Status */ | 125 | #define SPI_DMA_RFDMA (0x1 << 5) /* RXFIFO Full Status */ |
126 | #define SPI_DMA_TEDMA (0x1 << 6) /* TXFIFO Empty Status */ | 126 | #define SPI_DMA_TEDMA (0x1 << 6) /* TXFIFO Empty Status */ |
127 | #define SPI_DMA_THDMA (0x1 << 7) /* TXFIFO Half Status */ | 127 | #define SPI_DMA_THDMA (0x1 << 7) /* TXFIFO Half Status */ |
@@ -1355,6 +1355,7 @@ static int setup(struct spi_device *spi) | |||
1355 | spi->bits_per_word, | 1355 | spi->bits_per_word, |
1356 | spi_speed_hz(SPI_CONTROL_DATARATE_MIN), | 1356 | spi_speed_hz(SPI_CONTROL_DATARATE_MIN), |
1357 | spi->max_speed_hz); | 1357 | spi->max_speed_hz); |
1358 | return status; | ||
1358 | 1359 | ||
1359 | err_first_setup: | 1360 | err_first_setup: |
1360 | kfree(chip); | 1361 | kfree(chip); |
diff --git a/drivers/video/Kconfig b/drivers/video/Kconfig index 6e1f1ea21b38..403dac787ebf 100644 --- a/drivers/video/Kconfig +++ b/drivers/video/Kconfig | |||
@@ -755,7 +755,7 @@ config FB_LEO | |||
755 | 755 | ||
756 | config FB_IGA | 756 | config FB_IGA |
757 | bool "IGA 168x display support" | 757 | bool "IGA 168x display support" |
758 | depends on FB && SPARC32 | 758 | depends on (FB = y) && SPARC32 |
759 | select FB_CFB_FILLRECT | 759 | select FB_CFB_FILLRECT |
760 | select FB_CFB_COPYAREA | 760 | select FB_CFB_COPYAREA |
761 | select FB_CFB_IMAGEBLIT | 761 | select FB_CFB_IMAGEBLIT |
@@ -765,7 +765,7 @@ config FB_IGA | |||
765 | 765 | ||
766 | config FB_XVR500 | 766 | config FB_XVR500 |
767 | bool "Sun XVR-500 3DLABS Wildcat support" | 767 | bool "Sun XVR-500 3DLABS Wildcat support" |
768 | depends on FB && PCI && SPARC64 | 768 | depends on (FB = y) && PCI && SPARC64 |
769 | select FB_CFB_FILLRECT | 769 | select FB_CFB_FILLRECT |
770 | select FB_CFB_COPYAREA | 770 | select FB_CFB_COPYAREA |
771 | select FB_CFB_IMAGEBLIT | 771 | select FB_CFB_IMAGEBLIT |
@@ -778,7 +778,7 @@ config FB_XVR500 | |||
778 | 778 | ||
779 | config FB_XVR2500 | 779 | config FB_XVR2500 |
780 | bool "Sun XVR-2500 3DLABS Wildcat support" | 780 | bool "Sun XVR-2500 3DLABS Wildcat support" |
781 | depends on FB && PCI && SPARC64 | 781 | depends on (FB = y) && PCI && SPARC64 |
782 | select FB_CFB_FILLRECT | 782 | select FB_CFB_FILLRECT |
783 | select FB_CFB_COPYAREA | 783 | select FB_CFB_COPYAREA |
784 | select FB_CFB_IMAGEBLIT | 784 | select FB_CFB_IMAGEBLIT |
diff --git a/drivers/video/arkfb.c b/drivers/video/arkfb.c index ba6fede5c466..8a1b07c74394 100644 --- a/drivers/video/arkfb.c +++ b/drivers/video/arkfb.c | |||
@@ -1055,9 +1055,10 @@ err_enable_device: | |||
1055 | static void __devexit ark_pci_remove(struct pci_dev *dev) | 1055 | static void __devexit ark_pci_remove(struct pci_dev *dev) |
1056 | { | 1056 | { |
1057 | struct fb_info *info = pci_get_drvdata(dev); | 1057 | struct fb_info *info = pci_get_drvdata(dev); |
1058 | struct arkfb_info *par = info->par; | ||
1059 | 1058 | ||
1060 | if (info) { | 1059 | if (info) { |
1060 | struct arkfb_info *par = info->par; | ||
1061 | |||
1061 | #ifdef CONFIG_MTRR | 1062 | #ifdef CONFIG_MTRR |
1062 | if (par->mtrr_reg >= 0) { | 1063 | if (par->mtrr_reg >= 0) { |
1063 | mtrr_del(par->mtrr_reg, 0, 0); | 1064 | mtrr_del(par->mtrr_reg, 0, 0); |
diff --git a/drivers/video/console/fbcon.h b/drivers/video/console/fbcon.h index 71f24e00fcd0..8e6ef4bc7a5c 100644 --- a/drivers/video/console/fbcon.h +++ b/drivers/video/console/fbcon.h | |||
@@ -176,7 +176,6 @@ extern void fbcon_set_tileops(struct vc_data *vc, struct fb_info *info); | |||
176 | #endif | 176 | #endif |
177 | extern void fbcon_set_bitops(struct fbcon_ops *ops); | 177 | extern void fbcon_set_bitops(struct fbcon_ops *ops); |
178 | extern int soft_cursor(struct fb_info *info, struct fb_cursor *cursor); | 178 | extern int soft_cursor(struct fb_info *info, struct fb_cursor *cursor); |
179 | extern struct class *fb_class; | ||
180 | 179 | ||
181 | #define FBCON_ATTRIBUTE_UNDERLINE 1 | 180 | #define FBCON_ATTRIBUTE_UNDERLINE 1 |
182 | #define FBCON_ATTRIBUTE_REVERSE 2 | 181 | #define FBCON_ATTRIBUTE_REVERSE 2 |
diff --git a/drivers/video/neofb.c b/drivers/video/neofb.c index bd30aba242d0..731d7a5c5aa2 100644 --- a/drivers/video/neofb.c +++ b/drivers/video/neofb.c | |||
@@ -1286,34 +1286,36 @@ static int neofb_setcolreg(u_int regno, u_int red, u_int green, u_int blue, | |||
1286 | if (regno >= fb->cmap.len || regno > 255) | 1286 | if (regno >= fb->cmap.len || regno > 255) |
1287 | return -EINVAL; | 1287 | return -EINVAL; |
1288 | 1288 | ||
1289 | switch (fb->var.bits_per_pixel) { | 1289 | if (fb->var.bits_per_pixel <= 8) { |
1290 | case 8: | ||
1291 | outb(regno, 0x3c8); | 1290 | outb(regno, 0x3c8); |
1292 | 1291 | ||
1293 | outb(red >> 10, 0x3c9); | 1292 | outb(red >> 10, 0x3c9); |
1294 | outb(green >> 10, 0x3c9); | 1293 | outb(green >> 10, 0x3c9); |
1295 | outb(blue >> 10, 0x3c9); | 1294 | outb(blue >> 10, 0x3c9); |
1296 | break; | 1295 | } else if (regno < 16) { |
1297 | case 16: | 1296 | switch (fb->var.bits_per_pixel) { |
1298 | ((u32 *) fb->pseudo_palette)[regno] = | 1297 | case 16: |
1298 | ((u32 *) fb->pseudo_palette)[regno] = | ||
1299 | ((red & 0xf800)) | ((green & 0xfc00) >> 5) | | 1299 | ((red & 0xf800)) | ((green & 0xfc00) >> 5) | |
1300 | ((blue & 0xf800) >> 11); | 1300 | ((blue & 0xf800) >> 11); |
1301 | break; | 1301 | break; |
1302 | case 24: | 1302 | case 24: |
1303 | ((u32 *) fb->pseudo_palette)[regno] = | 1303 | ((u32 *) fb->pseudo_palette)[regno] = |
1304 | ((red & 0xff00) << 8) | ((green & 0xff00)) | | 1304 | ((red & 0xff00) << 8) | ((green & 0xff00)) | |
1305 | ((blue & 0xff00) >> 8); | 1305 | ((blue & 0xff00) >> 8); |
1306 | break; | 1306 | break; |
1307 | #ifdef NO_32BIT_SUPPORT_YET | 1307 | #ifdef NO_32BIT_SUPPORT_YET |
1308 | case 32: | 1308 | case 32: |
1309 | ((u32 *) fb->pseudo_palette)[regno] = | 1309 | ((u32 *) fb->pseudo_palette)[regno] = |
1310 | ((transp & 0xff00) << 16) | ((red & 0xff00) << 8) | | 1310 | ((transp & 0xff00) << 16) | ((red & 0xff00) << 8) | |
1311 | ((green & 0xff00)) | ((blue & 0xff00) >> 8); | 1311 | ((green & 0xff00)) | ((blue & 0xff00) >> 8); |
1312 | break; | 1312 | break; |
1313 | #endif | 1313 | #endif |
1314 | default: | 1314 | default: |
1315 | return 1; | 1315 | return 1; |
1316 | } | ||
1316 | } | 1317 | } |
1318 | |||
1317 | return 0; | 1319 | return 0; |
1318 | } | 1320 | } |
1319 | 1321 | ||
diff --git a/drivers/video/pm3fb.c b/drivers/video/pm3fb.c index 616a0c08e30c..b52e883f0a52 100644 --- a/drivers/video/pm3fb.c +++ b/drivers/video/pm3fb.c | |||
@@ -498,7 +498,7 @@ static int pm3fb_set_par(struct fb_info *info) | |||
498 | else | 498 | else |
499 | par->video |= PM3VideoControl_LINE_DOUBLE_OFF; | 499 | par->video |= PM3VideoControl_LINE_DOUBLE_OFF; |
500 | 500 | ||
501 | if (info->var.activate == FB_ACTIVATE_NOW) | 501 | if ((info->var.activate & FB_ACTIVATE_MASK) == FB_ACTIVATE_NOW) |
502 | par->video |= PM3VideoControl_ENABLE; | 502 | par->video |= PM3VideoControl_ENABLE; |
503 | else { | 503 | else { |
504 | par->video |= PM3VideoControl_DISABLE; | 504 | par->video |= PM3VideoControl_DISABLE; |
diff --git a/drivers/video/skeletonfb.c b/drivers/video/skeletonfb.c index 836a612af977..64779e70408f 100644 --- a/drivers/video/skeletonfb.c +++ b/drivers/video/skeletonfb.c | |||
@@ -132,7 +132,6 @@ static struct fb_info info; | |||
132 | static struct xxx_par __initdata current_par; | 132 | static struct xxx_par __initdata current_par; |
133 | 133 | ||
134 | int xxxfb_init(void); | 134 | int xxxfb_init(void); |
135 | int xxxfb_setup(char*); | ||
136 | 135 | ||
137 | /** | 136 | /** |
138 | * xxxfb_open - Optional function. Called when the framebuffer is | 137 | * xxxfb_open - Optional function. Called when the framebuffer is |
@@ -975,6 +974,21 @@ static struct platform_device xxxfb_device = { | |||
975 | .name = "xxxfb", | 974 | .name = "xxxfb", |
976 | }; | 975 | }; |
977 | 976 | ||
977 | #ifndef MODULE | ||
978 | /* | ||
979 | * Setup | ||
980 | */ | ||
981 | |||
982 | /* | ||
983 | * Only necessary if your driver takes special options, | ||
984 | * otherwise we fall back on the generic fb_setup(). | ||
985 | */ | ||
986 | int __init xxxfb_setup(char *options) | ||
987 | { | ||
988 | /* Parse user speficied options (`video=xxxfb:') */ | ||
989 | } | ||
990 | #endif /* MODULE */ | ||
991 | |||
978 | static int __init xxxfb_init(void) | 992 | static int __init xxxfb_init(void) |
979 | { | 993 | { |
980 | int ret; | 994 | int ret; |
@@ -1006,21 +1020,6 @@ static void __exit xxxfb_exit(void) | |||
1006 | } | 1020 | } |
1007 | #endif /* CONFIG_PCI */ | 1021 | #endif /* CONFIG_PCI */ |
1008 | 1022 | ||
1009 | #ifdef MODULE | ||
1010 | /* | ||
1011 | * Setup | ||
1012 | */ | ||
1013 | |||
1014 | /* | ||
1015 | * Only necessary if your driver takes special options, | ||
1016 | * otherwise we fall back on the generic fb_setup(). | ||
1017 | */ | ||
1018 | int __init xxxfb_setup(char *options) | ||
1019 | { | ||
1020 | /* Parse user speficied options (`video=xxxfb:') */ | ||
1021 | } | ||
1022 | #endif /* MODULE */ | ||
1023 | |||
1024 | /* ------------------------------------------------------------------------- */ | 1023 | /* ------------------------------------------------------------------------- */ |
1025 | 1024 | ||
1026 | 1025 | ||
diff --git a/drivers/video/vt8623fb.c b/drivers/video/vt8623fb.c index 5e9755e464a1..30c0b948852b 100644 --- a/drivers/video/vt8623fb.c +++ b/drivers/video/vt8623fb.c | |||
@@ -778,9 +778,10 @@ err_enable_device: | |||
778 | static void __devexit vt8623_pci_remove(struct pci_dev *dev) | 778 | static void __devexit vt8623_pci_remove(struct pci_dev *dev) |
779 | { | 779 | { |
780 | struct fb_info *info = pci_get_drvdata(dev); | 780 | struct fb_info *info = pci_get_drvdata(dev); |
781 | struct vt8623fb_info *par = info->par; | ||
782 | 781 | ||
783 | if (info) { | 782 | if (info) { |
783 | struct vt8623fb_info *par = info->par; | ||
784 | |||
784 | #ifdef CONFIG_MTRR | 785 | #ifdef CONFIG_MTRR |
785 | if (par->mtrr_reg >= 0) { | 786 | if (par->mtrr_reg >= 0) { |
786 | mtrr_del(par->mtrr_reg, 0, 0); | 787 | mtrr_del(par->mtrr_reg, 0, 0); |
diff --git a/fs/afs/internal.h b/fs/afs/internal.h index 2dac3ad2c44b..2c55dd94a1de 100644 --- a/fs/afs/internal.h +++ b/fs/afs/internal.h | |||
@@ -17,6 +17,8 @@ | |||
17 | #include <linux/rxrpc.h> | 17 | #include <linux/rxrpc.h> |
18 | #include <linux/key.h> | 18 | #include <linux/key.h> |
19 | #include <linux/workqueue.h> | 19 | #include <linux/workqueue.h> |
20 | #include <linux/sched.h> | ||
21 | |||
20 | #include "afs.h" | 22 | #include "afs.h" |
21 | #include "afs_vl.h" | 23 | #include "afs_vl.h" |
22 | 24 | ||
diff --git a/fs/ext4/balloc.c b/fs/ext4/balloc.c index 8a23483ca8d0..3b64bb16c727 100644 --- a/fs/ext4/balloc.c +++ b/fs/ext4/balloc.c | |||
@@ -30,15 +30,15 @@ | |||
30 | void ext4_get_group_no_and_offset(struct super_block *sb, ext4_fsblk_t blocknr, | 30 | void ext4_get_group_no_and_offset(struct super_block *sb, ext4_fsblk_t blocknr, |
31 | unsigned long *blockgrpp, ext4_grpblk_t *offsetp) | 31 | unsigned long *blockgrpp, ext4_grpblk_t *offsetp) |
32 | { | 32 | { |
33 | struct ext4_super_block *es = EXT4_SB(sb)->s_es; | 33 | struct ext4_super_block *es = EXT4_SB(sb)->s_es; |
34 | ext4_grpblk_t offset; | 34 | ext4_grpblk_t offset; |
35 | 35 | ||
36 | blocknr = blocknr - le32_to_cpu(es->s_first_data_block); | 36 | blocknr = blocknr - le32_to_cpu(es->s_first_data_block); |
37 | offset = do_div(blocknr, EXT4_BLOCKS_PER_GROUP(sb)); | 37 | offset = do_div(blocknr, EXT4_BLOCKS_PER_GROUP(sb)); |
38 | if (offsetp) | 38 | if (offsetp) |
39 | *offsetp = offset; | 39 | *offsetp = offset; |
40 | if (blockgrpp) | 40 | if (blockgrpp) |
41 | *blockgrpp = blocknr; | 41 | *blockgrpp = blocknr; |
42 | 42 | ||
43 | } | 43 | } |
44 | 44 | ||
diff --git a/fs/ext4/extents.c b/fs/ext4/extents.c index a0f0c04e79b2..b9ce24129070 100644 --- a/fs/ext4/extents.c +++ b/fs/ext4/extents.c | |||
@@ -374,7 +374,7 @@ ext4_ext_binsearch_idx(struct inode *inode, struct ext4_ext_path *path, int bloc | |||
374 | le32_to_cpu(ix[-1].ei_block)); | 374 | le32_to_cpu(ix[-1].ei_block)); |
375 | } | 375 | } |
376 | BUG_ON(k && le32_to_cpu(ix->ei_block) | 376 | BUG_ON(k && le32_to_cpu(ix->ei_block) |
377 | <= le32_to_cpu(ix[-1].ei_block)); | 377 | <= le32_to_cpu(ix[-1].ei_block)); |
378 | if (block < le32_to_cpu(ix->ei_block)) | 378 | if (block < le32_to_cpu(ix->ei_block)) |
379 | break; | 379 | break; |
380 | chix = ix; | 380 | chix = ix; |
@@ -423,8 +423,8 @@ ext4_ext_binsearch(struct inode *inode, struct ext4_ext_path *path, int block) | |||
423 | 423 | ||
424 | path->p_ext = l - 1; | 424 | path->p_ext = l - 1; |
425 | ext_debug(" -> %d:%llu:%d ", | 425 | ext_debug(" -> %d:%llu:%d ", |
426 | le32_to_cpu(path->p_ext->ee_block), | 426 | le32_to_cpu(path->p_ext->ee_block), |
427 | ext_pblock(path->p_ext), | 427 | ext_pblock(path->p_ext), |
428 | le16_to_cpu(path->p_ext->ee_len)); | 428 | le16_to_cpu(path->p_ext->ee_len)); |
429 | 429 | ||
430 | #ifdef CHECK_BINSEARCH | 430 | #ifdef CHECK_BINSEARCH |
@@ -435,7 +435,7 @@ ext4_ext_binsearch(struct inode *inode, struct ext4_ext_path *path, int block) | |||
435 | chex = ex = EXT_FIRST_EXTENT(eh); | 435 | chex = ex = EXT_FIRST_EXTENT(eh); |
436 | for (k = 0; k < le16_to_cpu(eh->eh_entries); k++, ex++) { | 436 | for (k = 0; k < le16_to_cpu(eh->eh_entries); k++, ex++) { |
437 | BUG_ON(k && le32_to_cpu(ex->ee_block) | 437 | BUG_ON(k && le32_to_cpu(ex->ee_block) |
438 | <= le32_to_cpu(ex[-1].ee_block)); | 438 | <= le32_to_cpu(ex[-1].ee_block)); |
439 | if (block < le32_to_cpu(ex->ee_block)) | 439 | if (block < le32_to_cpu(ex->ee_block)) |
440 | break; | 440 | break; |
441 | chex = ex; | 441 | chex = ex; |
@@ -577,7 +577,7 @@ static int ext4_ext_insert_index(handle_t *handle, struct inode *inode, | |||
577 | curp->p_hdr->eh_entries = cpu_to_le16(le16_to_cpu(curp->p_hdr->eh_entries)+1); | 577 | curp->p_hdr->eh_entries = cpu_to_le16(le16_to_cpu(curp->p_hdr->eh_entries)+1); |
578 | 578 | ||
579 | BUG_ON(le16_to_cpu(curp->p_hdr->eh_entries) | 579 | BUG_ON(le16_to_cpu(curp->p_hdr->eh_entries) |
580 | > le16_to_cpu(curp->p_hdr->eh_max)); | 580 | > le16_to_cpu(curp->p_hdr->eh_max)); |
581 | BUG_ON(ix > EXT_LAST_INDEX(curp->p_hdr)); | 581 | BUG_ON(ix > EXT_LAST_INDEX(curp->p_hdr)); |
582 | 582 | ||
583 | err = ext4_ext_dirty(handle, inode, curp); | 583 | err = ext4_ext_dirty(handle, inode, curp); |
@@ -621,12 +621,12 @@ static int ext4_ext_split(handle_t *handle, struct inode *inode, | |||
621 | border = path[depth].p_ext[1].ee_block; | 621 | border = path[depth].p_ext[1].ee_block; |
622 | ext_debug("leaf will be split." | 622 | ext_debug("leaf will be split." |
623 | " next leaf starts at %d\n", | 623 | " next leaf starts at %d\n", |
624 | le32_to_cpu(border)); | 624 | le32_to_cpu(border)); |
625 | } else { | 625 | } else { |
626 | border = newext->ee_block; | 626 | border = newext->ee_block; |
627 | ext_debug("leaf will be added." | 627 | ext_debug("leaf will be added." |
628 | " next leaf starts at %d\n", | 628 | " next leaf starts at %d\n", |
629 | le32_to_cpu(border)); | 629 | le32_to_cpu(border)); |
630 | } | 630 | } |
631 | 631 | ||
632 | /* | 632 | /* |
@@ -684,9 +684,9 @@ static int ext4_ext_split(handle_t *handle, struct inode *inode, | |||
684 | while (path[depth].p_ext <= | 684 | while (path[depth].p_ext <= |
685 | EXT_MAX_EXTENT(path[depth].p_hdr)) { | 685 | EXT_MAX_EXTENT(path[depth].p_hdr)) { |
686 | ext_debug("move %d:%llu:%d in new leaf %llu\n", | 686 | ext_debug("move %d:%llu:%d in new leaf %llu\n", |
687 | le32_to_cpu(path[depth].p_ext->ee_block), | 687 | le32_to_cpu(path[depth].p_ext->ee_block), |
688 | ext_pblock(path[depth].p_ext), | 688 | ext_pblock(path[depth].p_ext), |
689 | le16_to_cpu(path[depth].p_ext->ee_len), | 689 | le16_to_cpu(path[depth].p_ext->ee_len), |
690 | newblock); | 690 | newblock); |
691 | /*memmove(ex++, path[depth].p_ext++, | 691 | /*memmove(ex++, path[depth].p_ext++, |
692 | sizeof(struct ext4_extent)); | 692 | sizeof(struct ext4_extent)); |
@@ -765,9 +765,9 @@ static int ext4_ext_split(handle_t *handle, struct inode *inode, | |||
765 | EXT_LAST_INDEX(path[i].p_hdr)); | 765 | EXT_LAST_INDEX(path[i].p_hdr)); |
766 | while (path[i].p_idx <= EXT_MAX_INDEX(path[i].p_hdr)) { | 766 | while (path[i].p_idx <= EXT_MAX_INDEX(path[i].p_hdr)) { |
767 | ext_debug("%d: move %d:%d in new index %llu\n", i, | 767 | ext_debug("%d: move %d:%d in new index %llu\n", i, |
768 | le32_to_cpu(path[i].p_idx->ei_block), | 768 | le32_to_cpu(path[i].p_idx->ei_block), |
769 | idx_pblock(path[i].p_idx), | 769 | idx_pblock(path[i].p_idx), |
770 | newblock); | 770 | newblock); |
771 | /*memmove(++fidx, path[i].p_idx++, | 771 | /*memmove(++fidx, path[i].p_idx++, |
772 | sizeof(struct ext4_extent_idx)); | 772 | sizeof(struct ext4_extent_idx)); |
773 | neh->eh_entries++; | 773 | neh->eh_entries++; |
@@ -1128,6 +1128,55 @@ ext4_can_extents_be_merged(struct inode *inode, struct ext4_extent *ex1, | |||
1128 | } | 1128 | } |
1129 | 1129 | ||
1130 | /* | 1130 | /* |
1131 | * check if a portion of the "newext" extent overlaps with an | ||
1132 | * existing extent. | ||
1133 | * | ||
1134 | * If there is an overlap discovered, it updates the length of the newext | ||
1135 | * such that there will be no overlap, and then returns 1. | ||
1136 | * If there is no overlap found, it returns 0. | ||
1137 | */ | ||
1138 | unsigned int ext4_ext_check_overlap(struct inode *inode, | ||
1139 | struct ext4_extent *newext, | ||
1140 | struct ext4_ext_path *path) | ||
1141 | { | ||
1142 | unsigned long b1, b2; | ||
1143 | unsigned int depth, len1; | ||
1144 | unsigned int ret = 0; | ||
1145 | |||
1146 | b1 = le32_to_cpu(newext->ee_block); | ||
1147 | len1 = le16_to_cpu(newext->ee_len); | ||
1148 | depth = ext_depth(inode); | ||
1149 | if (!path[depth].p_ext) | ||
1150 | goto out; | ||
1151 | b2 = le32_to_cpu(path[depth].p_ext->ee_block); | ||
1152 | |||
1153 | /* | ||
1154 | * get the next allocated block if the extent in the path | ||
1155 | * is before the requested block(s) | ||
1156 | */ | ||
1157 | if (b2 < b1) { | ||
1158 | b2 = ext4_ext_next_allocated_block(path); | ||
1159 | if (b2 == EXT_MAX_BLOCK) | ||
1160 | goto out; | ||
1161 | } | ||
1162 | |||
1163 | /* check for wrap through zero */ | ||
1164 | if (b1 + len1 < b1) { | ||
1165 | len1 = EXT_MAX_BLOCK - b1; | ||
1166 | newext->ee_len = cpu_to_le16(len1); | ||
1167 | ret = 1; | ||
1168 | } | ||
1169 | |||
1170 | /* check for overlap */ | ||
1171 | if (b1 + len1 > b2) { | ||
1172 | newext->ee_len = cpu_to_le16(b2 - b1); | ||
1173 | ret = 1; | ||
1174 | } | ||
1175 | out: | ||
1176 | return ret; | ||
1177 | } | ||
1178 | |||
1179 | /* | ||
1131 | * ext4_ext_insert_extent: | 1180 | * ext4_ext_insert_extent: |
1132 | * tries to merge requsted extent into the existing extent or | 1181 | * tries to merge requsted extent into the existing extent or |
1133 | * inserts requested extent as new one into the tree, | 1182 | * inserts requested extent as new one into the tree, |
@@ -1212,12 +1261,12 @@ has_space: | |||
1212 | if (!nearex) { | 1261 | if (!nearex) { |
1213 | /* there is no extent in this leaf, create first one */ | 1262 | /* there is no extent in this leaf, create first one */ |
1214 | ext_debug("first extent in the leaf: %d:%llu:%d\n", | 1263 | ext_debug("first extent in the leaf: %d:%llu:%d\n", |
1215 | le32_to_cpu(newext->ee_block), | 1264 | le32_to_cpu(newext->ee_block), |
1216 | ext_pblock(newext), | 1265 | ext_pblock(newext), |
1217 | le16_to_cpu(newext->ee_len)); | 1266 | le16_to_cpu(newext->ee_len)); |
1218 | path[depth].p_ext = EXT_FIRST_EXTENT(eh); | 1267 | path[depth].p_ext = EXT_FIRST_EXTENT(eh); |
1219 | } else if (le32_to_cpu(newext->ee_block) | 1268 | } else if (le32_to_cpu(newext->ee_block) |
1220 | > le32_to_cpu(nearex->ee_block)) { | 1269 | > le32_to_cpu(nearex->ee_block)) { |
1221 | /* BUG_ON(newext->ee_block == nearex->ee_block); */ | 1270 | /* BUG_ON(newext->ee_block == nearex->ee_block); */ |
1222 | if (nearex != EXT_LAST_EXTENT(eh)) { | 1271 | if (nearex != EXT_LAST_EXTENT(eh)) { |
1223 | len = EXT_MAX_EXTENT(eh) - nearex; | 1272 | len = EXT_MAX_EXTENT(eh) - nearex; |
@@ -1225,9 +1274,9 @@ has_space: | |||
1225 | len = len < 0 ? 0 : len; | 1274 | len = len < 0 ? 0 : len; |
1226 | ext_debug("insert %d:%llu:%d after: nearest 0x%p, " | 1275 | ext_debug("insert %d:%llu:%d after: nearest 0x%p, " |
1227 | "move %d from 0x%p to 0x%p\n", | 1276 | "move %d from 0x%p to 0x%p\n", |
1228 | le32_to_cpu(newext->ee_block), | 1277 | le32_to_cpu(newext->ee_block), |
1229 | ext_pblock(newext), | 1278 | ext_pblock(newext), |
1230 | le16_to_cpu(newext->ee_len), | 1279 | le16_to_cpu(newext->ee_len), |
1231 | nearex, len, nearex + 1, nearex + 2); | 1280 | nearex, len, nearex + 1, nearex + 2); |
1232 | memmove(nearex + 2, nearex + 1, len); | 1281 | memmove(nearex + 2, nearex + 1, len); |
1233 | } | 1282 | } |
@@ -1358,9 +1407,9 @@ int ext4_ext_walk_space(struct inode *inode, unsigned long block, | |||
1358 | cbex.ec_start = 0; | 1407 | cbex.ec_start = 0; |
1359 | cbex.ec_type = EXT4_EXT_CACHE_GAP; | 1408 | cbex.ec_type = EXT4_EXT_CACHE_GAP; |
1360 | } else { | 1409 | } else { |
1361 | cbex.ec_block = le32_to_cpu(ex->ee_block); | 1410 | cbex.ec_block = le32_to_cpu(ex->ee_block); |
1362 | cbex.ec_len = le16_to_cpu(ex->ee_len); | 1411 | cbex.ec_len = le16_to_cpu(ex->ee_len); |
1363 | cbex.ec_start = ext_pblock(ex); | 1412 | cbex.ec_start = ext_pblock(ex); |
1364 | cbex.ec_type = EXT4_EXT_CACHE_EXTENT; | 1413 | cbex.ec_type = EXT4_EXT_CACHE_EXTENT; |
1365 | } | 1414 | } |
1366 | 1415 | ||
@@ -1431,16 +1480,16 @@ ext4_ext_put_gap_in_cache(struct inode *inode, struct ext4_ext_path *path, | |||
1431 | len = le32_to_cpu(ex->ee_block) - block; | 1480 | len = le32_to_cpu(ex->ee_block) - block; |
1432 | ext_debug("cache gap(before): %lu [%lu:%lu]", | 1481 | ext_debug("cache gap(before): %lu [%lu:%lu]", |
1433 | (unsigned long) block, | 1482 | (unsigned long) block, |
1434 | (unsigned long) le32_to_cpu(ex->ee_block), | 1483 | (unsigned long) le32_to_cpu(ex->ee_block), |
1435 | (unsigned long) le16_to_cpu(ex->ee_len)); | 1484 | (unsigned long) le16_to_cpu(ex->ee_len)); |
1436 | } else if (block >= le32_to_cpu(ex->ee_block) | 1485 | } else if (block >= le32_to_cpu(ex->ee_block) |
1437 | + le16_to_cpu(ex->ee_len)) { | 1486 | + le16_to_cpu(ex->ee_len)) { |
1438 | lblock = le32_to_cpu(ex->ee_block) | 1487 | lblock = le32_to_cpu(ex->ee_block) |
1439 | + le16_to_cpu(ex->ee_len); | 1488 | + le16_to_cpu(ex->ee_len); |
1440 | len = ext4_ext_next_allocated_block(path); | 1489 | len = ext4_ext_next_allocated_block(path); |
1441 | ext_debug("cache gap(after): [%lu:%lu] %lu", | 1490 | ext_debug("cache gap(after): [%lu:%lu] %lu", |
1442 | (unsigned long) le32_to_cpu(ex->ee_block), | 1491 | (unsigned long) le32_to_cpu(ex->ee_block), |
1443 | (unsigned long) le16_to_cpu(ex->ee_len), | 1492 | (unsigned long) le16_to_cpu(ex->ee_len), |
1444 | (unsigned long) block); | 1493 | (unsigned long) block); |
1445 | BUG_ON(len == lblock); | 1494 | BUG_ON(len == lblock); |
1446 | len = len - lblock; | 1495 | len = len - lblock; |
@@ -1468,9 +1517,9 @@ ext4_ext_in_cache(struct inode *inode, unsigned long block, | |||
1468 | BUG_ON(cex->ec_type != EXT4_EXT_CACHE_GAP && | 1517 | BUG_ON(cex->ec_type != EXT4_EXT_CACHE_GAP && |
1469 | cex->ec_type != EXT4_EXT_CACHE_EXTENT); | 1518 | cex->ec_type != EXT4_EXT_CACHE_EXTENT); |
1470 | if (block >= cex->ec_block && block < cex->ec_block + cex->ec_len) { | 1519 | if (block >= cex->ec_block && block < cex->ec_block + cex->ec_len) { |
1471 | ex->ee_block = cpu_to_le32(cex->ec_block); | 1520 | ex->ee_block = cpu_to_le32(cex->ec_block); |
1472 | ext4_ext_store_pblock(ex, cex->ec_start); | 1521 | ext4_ext_store_pblock(ex, cex->ec_start); |
1473 | ex->ee_len = cpu_to_le16(cex->ec_len); | 1522 | ex->ee_len = cpu_to_le16(cex->ec_len); |
1474 | ext_debug("%lu cached by %lu:%lu:%llu\n", | 1523 | ext_debug("%lu cached by %lu:%lu:%llu\n", |
1475 | (unsigned long) block, | 1524 | (unsigned long) block, |
1476 | (unsigned long) cex->ec_block, | 1525 | (unsigned long) cex->ec_block, |
@@ -1956,9 +2005,9 @@ int ext4_ext_get_blocks(handle_t *handle, struct inode *inode, | |||
1956 | /* we should allocate requested block */ | 2005 | /* we should allocate requested block */ |
1957 | } else if (goal == EXT4_EXT_CACHE_EXTENT) { | 2006 | } else if (goal == EXT4_EXT_CACHE_EXTENT) { |
1958 | /* block is already allocated */ | 2007 | /* block is already allocated */ |
1959 | newblock = iblock | 2008 | newblock = iblock |
1960 | - le32_to_cpu(newex.ee_block) | 2009 | - le32_to_cpu(newex.ee_block) |
1961 | + ext_pblock(&newex); | 2010 | + ext_pblock(&newex); |
1962 | /* number of remaining blocks in the extent */ | 2011 | /* number of remaining blocks in the extent */ |
1963 | allocated = le16_to_cpu(newex.ee_len) - | 2012 | allocated = le16_to_cpu(newex.ee_len) - |
1964 | (iblock - le32_to_cpu(newex.ee_block)); | 2013 | (iblock - le32_to_cpu(newex.ee_block)); |
@@ -1987,7 +2036,7 @@ int ext4_ext_get_blocks(handle_t *handle, struct inode *inode, | |||
1987 | 2036 | ||
1988 | ex = path[depth].p_ext; | 2037 | ex = path[depth].p_ext; |
1989 | if (ex) { | 2038 | if (ex) { |
1990 | unsigned long ee_block = le32_to_cpu(ex->ee_block); | 2039 | unsigned long ee_block = le32_to_cpu(ex->ee_block); |
1991 | ext4_fsblk_t ee_start = ext_pblock(ex); | 2040 | ext4_fsblk_t ee_start = ext_pblock(ex); |
1992 | unsigned short ee_len = le16_to_cpu(ex->ee_len); | 2041 | unsigned short ee_len = le16_to_cpu(ex->ee_len); |
1993 | 2042 | ||
@@ -2000,7 +2049,7 @@ int ext4_ext_get_blocks(handle_t *handle, struct inode *inode, | |||
2000 | if (ee_len > EXT_MAX_LEN) | 2049 | if (ee_len > EXT_MAX_LEN) |
2001 | goto out2; | 2050 | goto out2; |
2002 | /* if found extent covers block, simply return it */ | 2051 | /* if found extent covers block, simply return it */ |
2003 | if (iblock >= ee_block && iblock < ee_block + ee_len) { | 2052 | if (iblock >= ee_block && iblock < ee_block + ee_len) { |
2004 | newblock = iblock - ee_block + ee_start; | 2053 | newblock = iblock - ee_block + ee_start; |
2005 | /* number of remaining blocks in the extent */ | 2054 | /* number of remaining blocks in the extent */ |
2006 | allocated = ee_len - (iblock - ee_block); | 2055 | allocated = ee_len - (iblock - ee_block); |
@@ -2031,7 +2080,15 @@ int ext4_ext_get_blocks(handle_t *handle, struct inode *inode, | |||
2031 | 2080 | ||
2032 | /* allocate new block */ | 2081 | /* allocate new block */ |
2033 | goal = ext4_ext_find_goal(inode, path, iblock); | 2082 | goal = ext4_ext_find_goal(inode, path, iblock); |
2034 | allocated = max_blocks; | 2083 | |
2084 | /* Check if we can really insert (iblock)::(iblock+max_blocks) extent */ | ||
2085 | newex.ee_block = cpu_to_le32(iblock); | ||
2086 | newex.ee_len = cpu_to_le16(max_blocks); | ||
2087 | err = ext4_ext_check_overlap(inode, &newex, path); | ||
2088 | if (err) | ||
2089 | allocated = le16_to_cpu(newex.ee_len); | ||
2090 | else | ||
2091 | allocated = max_blocks; | ||
2035 | newblock = ext4_new_blocks(handle, inode, goal, &allocated, &err); | 2092 | newblock = ext4_new_blocks(handle, inode, goal, &allocated, &err); |
2036 | if (!newblock) | 2093 | if (!newblock) |
2037 | goto out2; | 2094 | goto out2; |
@@ -2039,12 +2096,15 @@ int ext4_ext_get_blocks(handle_t *handle, struct inode *inode, | |||
2039 | goal, newblock, allocated); | 2096 | goal, newblock, allocated); |
2040 | 2097 | ||
2041 | /* try to insert new extent into found leaf and return */ | 2098 | /* try to insert new extent into found leaf and return */ |
2042 | newex.ee_block = cpu_to_le32(iblock); | ||
2043 | ext4_ext_store_pblock(&newex, newblock); | 2099 | ext4_ext_store_pblock(&newex, newblock); |
2044 | newex.ee_len = cpu_to_le16(allocated); | 2100 | newex.ee_len = cpu_to_le16(allocated); |
2045 | err = ext4_ext_insert_extent(handle, inode, path, &newex); | 2101 | err = ext4_ext_insert_extent(handle, inode, path, &newex); |
2046 | if (err) | 2102 | if (err) { |
2103 | /* free data blocks we just allocated */ | ||
2104 | ext4_free_blocks(handle, inode, ext_pblock(&newex), | ||
2105 | le16_to_cpu(newex.ee_len)); | ||
2047 | goto out2; | 2106 | goto out2; |
2107 | } | ||
2048 | 2108 | ||
2049 | if (extend_disksize && inode->i_size > EXT4_I(inode)->i_disksize) | 2109 | if (extend_disksize && inode->i_size > EXT4_I(inode)->i_disksize) |
2050 | EXT4_I(inode)->i_disksize = inode->i_size; | 2110 | EXT4_I(inode)->i_disksize = inode->i_size; |
@@ -2157,11 +2217,3 @@ int ext4_ext_writepage_trans_blocks(struct inode *inode, int num) | |||
2157 | 2217 | ||
2158 | return needed; | 2218 | return needed; |
2159 | } | 2219 | } |
2160 | |||
2161 | EXPORT_SYMBOL(ext4_mark_inode_dirty); | ||
2162 | EXPORT_SYMBOL(ext4_ext_invalidate_cache); | ||
2163 | EXPORT_SYMBOL(ext4_ext_insert_extent); | ||
2164 | EXPORT_SYMBOL(ext4_ext_walk_space); | ||
2165 | EXPORT_SYMBOL(ext4_ext_find_goal); | ||
2166 | EXPORT_SYMBOL(ext4_ext_calc_credits_for_insert); | ||
2167 | |||
diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c index b34182b6ee4d..0bcf62a750ff 100644 --- a/fs/ext4/inode.c +++ b/fs/ext4/inode.c | |||
@@ -255,8 +255,8 @@ static int verify_chain(Indirect *from, Indirect *to) | |||
255 | * @inode: inode in question (we are only interested in its superblock) | 255 | * @inode: inode in question (we are only interested in its superblock) |
256 | * @i_block: block number to be parsed | 256 | * @i_block: block number to be parsed |
257 | * @offsets: array to store the offsets in | 257 | * @offsets: array to store the offsets in |
258 | * @boundary: set this non-zero if the referred-to block is likely to be | 258 | * @boundary: set this non-zero if the referred-to block is likely to be |
259 | * followed (on disk) by an indirect block. | 259 | * followed (on disk) by an indirect block. |
260 | * | 260 | * |
261 | * To store the locations of file's data ext4 uses a data structure common | 261 | * To store the locations of file's data ext4 uses a data structure common |
262 | * for UNIX filesystems - tree of pointers anchored in the inode, with | 262 | * for UNIX filesystems - tree of pointers anchored in the inode, with |
diff --git a/fs/ext4/namei.c b/fs/ext4/namei.c index 4ec57be5baf5..2811e5720ad0 100644 --- a/fs/ext4/namei.c +++ b/fs/ext4/namei.c | |||
@@ -46,7 +46,7 @@ | |||
46 | */ | 46 | */ |
47 | #define NAMEI_RA_CHUNKS 2 | 47 | #define NAMEI_RA_CHUNKS 2 |
48 | #define NAMEI_RA_BLOCKS 4 | 48 | #define NAMEI_RA_BLOCKS 4 |
49 | #define NAMEI_RA_SIZE (NAMEI_RA_CHUNKS * NAMEI_RA_BLOCKS) | 49 | #define NAMEI_RA_SIZE (NAMEI_RA_CHUNKS * NAMEI_RA_BLOCKS) |
50 | #define NAMEI_RA_INDEX(c,b) (((c) * NAMEI_RA_BLOCKS) + (b)) | 50 | #define NAMEI_RA_INDEX(c,b) (((c) * NAMEI_RA_BLOCKS) + (b)) |
51 | 51 | ||
52 | static struct buffer_head *ext4_append(handle_t *handle, | 52 | static struct buffer_head *ext4_append(handle_t *handle, |
@@ -241,7 +241,7 @@ static inline unsigned dx_node_limit (struct inode *dir) | |||
241 | static void dx_show_index (char * label, struct dx_entry *entries) | 241 | static void dx_show_index (char * label, struct dx_entry *entries) |
242 | { | 242 | { |
243 | int i, n = dx_get_count (entries); | 243 | int i, n = dx_get_count (entries); |
244 | printk("%s index ", label); | 244 | printk("%s index ", label); |
245 | for (i = 0; i < n; i++) { | 245 | for (i = 0; i < n; i++) { |
246 | printk("%x->%u ", i? dx_get_hash(entries + i) : | 246 | printk("%x->%u ", i? dx_get_hash(entries + i) : |
247 | 0, dx_get_block(entries + i)); | 247 | 0, dx_get_block(entries + i)); |
diff --git a/fs/ext4/super.c b/fs/ext4/super.c index cb9afdd0e26e..175b68c60968 100644 --- a/fs/ext4/super.c +++ b/fs/ext4/super.c | |||
@@ -1985,7 +1985,7 @@ static journal_t *ext4_get_dev_journal(struct super_block *sb, | |||
1985 | 1985 | ||
1986 | if (bd_claim(bdev, sb)) { | 1986 | if (bd_claim(bdev, sb)) { |
1987 | printk(KERN_ERR | 1987 | printk(KERN_ERR |
1988 | "EXT4: failed to claim external journal device.\n"); | 1988 | "EXT4: failed to claim external journal device.\n"); |
1989 | blkdev_put(bdev); | 1989 | blkdev_put(bdev); |
1990 | return NULL; | 1990 | return NULL; |
1991 | } | 1991 | } |
diff --git a/fs/ioctl.c b/fs/ioctl.c index 479c1038ed4a..8c90cbc903fa 100644 --- a/fs/ioctl.c +++ b/fs/ioctl.c | |||
@@ -12,6 +12,7 @@ | |||
12 | #include <linux/fs.h> | 12 | #include <linux/fs.h> |
13 | #include <linux/security.h> | 13 | #include <linux/security.h> |
14 | #include <linux/module.h> | 14 | #include <linux/module.h> |
15 | #include <linux/kallsyms.h> | ||
15 | 16 | ||
16 | #include <asm/uaccess.h> | 17 | #include <asm/uaccess.h> |
17 | #include <asm/ioctls.h> | 18 | #include <asm/ioctls.h> |
@@ -20,6 +21,7 @@ static long do_ioctl(struct file *filp, unsigned int cmd, | |||
20 | unsigned long arg) | 21 | unsigned long arg) |
21 | { | 22 | { |
22 | int error = -ENOTTY; | 23 | int error = -ENOTTY; |
24 | void *f; | ||
23 | 25 | ||
24 | if (!filp->f_op) | 26 | if (!filp->f_op) |
25 | goto out; | 27 | goto out; |
@@ -29,10 +31,16 @@ static long do_ioctl(struct file *filp, unsigned int cmd, | |||
29 | if (error == -ENOIOCTLCMD) | 31 | if (error == -ENOIOCTLCMD) |
30 | error = -EINVAL; | 32 | error = -EINVAL; |
31 | goto out; | 33 | goto out; |
32 | } else if (filp->f_op->ioctl) { | 34 | } else if ((f = filp->f_op->ioctl)) { |
33 | lock_kernel(); | 35 | lock_kernel(); |
34 | error = filp->f_op->ioctl(filp->f_path.dentry->d_inode, | 36 | if (!filp->f_op->ioctl) { |
35 | filp, cmd, arg); | 37 | printk("%s: ioctl %p disappeared\n", __FUNCTION__, f); |
38 | print_symbol("symbol: %s\n", (unsigned long)f); | ||
39 | dump_stack(); | ||
40 | } else { | ||
41 | error = filp->f_op->ioctl(filp->f_path.dentry->d_inode, | ||
42 | filp, cmd, arg); | ||
43 | } | ||
36 | unlock_kernel(); | 44 | unlock_kernel(); |
37 | } | 45 | } |
38 | 46 | ||
diff --git a/fs/nfs/direct.c b/fs/nfs/direct.c index 0c542ec92d5b..00eee87510fe 100644 --- a/fs/nfs/direct.c +++ b/fs/nfs/direct.c | |||
@@ -168,7 +168,7 @@ static inline struct nfs_direct_req *nfs_direct_req_alloc(void) | |||
168 | return dreq; | 168 | return dreq; |
169 | } | 169 | } |
170 | 170 | ||
171 | static void nfs_direct_req_release(struct kref *kref) | 171 | static void nfs_direct_req_free(struct kref *kref) |
172 | { | 172 | { |
173 | struct nfs_direct_req *dreq = container_of(kref, struct nfs_direct_req, kref); | 173 | struct nfs_direct_req *dreq = container_of(kref, struct nfs_direct_req, kref); |
174 | 174 | ||
@@ -177,6 +177,11 @@ static void nfs_direct_req_release(struct kref *kref) | |||
177 | kmem_cache_free(nfs_direct_cachep, dreq); | 177 | kmem_cache_free(nfs_direct_cachep, dreq); |
178 | } | 178 | } |
179 | 179 | ||
180 | static void nfs_direct_req_release(struct nfs_direct_req *dreq) | ||
181 | { | ||
182 | kref_put(&dreq->kref, nfs_direct_req_free); | ||
183 | } | ||
184 | |||
180 | /* | 185 | /* |
181 | * Collects and returns the final error value/byte-count. | 186 | * Collects and returns the final error value/byte-count. |
182 | */ | 187 | */ |
@@ -196,7 +201,6 @@ static ssize_t nfs_direct_wait(struct nfs_direct_req *dreq) | |||
196 | result = dreq->count; | 201 | result = dreq->count; |
197 | 202 | ||
198 | out: | 203 | out: |
199 | kref_put(&dreq->kref, nfs_direct_req_release); | ||
200 | return (ssize_t) result; | 204 | return (ssize_t) result; |
201 | } | 205 | } |
202 | 206 | ||
@@ -214,7 +218,7 @@ static void nfs_direct_complete(struct nfs_direct_req *dreq) | |||
214 | } | 218 | } |
215 | complete_all(&dreq->completion); | 219 | complete_all(&dreq->completion); |
216 | 220 | ||
217 | kref_put(&dreq->kref, nfs_direct_req_release); | 221 | nfs_direct_req_release(dreq); |
218 | } | 222 | } |
219 | 223 | ||
220 | /* | 224 | /* |
@@ -369,6 +373,7 @@ static ssize_t nfs_direct_read(struct kiocb *iocb, unsigned long user_addr, size | |||
369 | if (!result) | 373 | if (!result) |
370 | result = nfs_direct_wait(dreq); | 374 | result = nfs_direct_wait(dreq); |
371 | rpc_clnt_sigunmask(clnt, &oldset); | 375 | rpc_clnt_sigunmask(clnt, &oldset); |
376 | nfs_direct_req_release(dreq); | ||
372 | 377 | ||
373 | return result; | 378 | return result; |
374 | } | 379 | } |
@@ -716,6 +721,7 @@ static ssize_t nfs_direct_write(struct kiocb *iocb, unsigned long user_addr, siz | |||
716 | if (!result) | 721 | if (!result) |
717 | result = nfs_direct_wait(dreq); | 722 | result = nfs_direct_wait(dreq); |
718 | rpc_clnt_sigunmask(clnt, &oldset); | 723 | rpc_clnt_sigunmask(clnt, &oldset); |
724 | nfs_direct_req_release(dreq); | ||
719 | 725 | ||
720 | return result; | 726 | return result; |
721 | } | 727 | } |
diff --git a/fs/ntfs/inode.c b/fs/ntfs/inode.c index 074791ce4ab2..b532a730cec2 100644 --- a/fs/ntfs/inode.c +++ b/fs/ntfs/inode.c | |||
@@ -140,7 +140,7 @@ static int ntfs_init_locked_inode(struct inode *vi, ntfs_attr *na) | |||
140 | if (!ni->name) | 140 | if (!ni->name) |
141 | return -ENOMEM; | 141 | return -ENOMEM; |
142 | memcpy(ni->name, na->name, i); | 142 | memcpy(ni->name, na->name, i); |
143 | ni->name[i] = 0; | 143 | ni->name[na->name_len] = 0; |
144 | } | 144 | } |
145 | return 0; | 145 | return 0; |
146 | } | 146 | } |
diff --git a/fs/ramfs/file-nommu.c b/fs/ramfs/file-nommu.c index 3b481d557edb..9345a46ffb32 100644 --- a/fs/ramfs/file-nommu.c +++ b/fs/ramfs/file-nommu.c | |||
@@ -179,7 +179,7 @@ static int ramfs_nommu_resize(struct inode *inode, loff_t newsize, loff_t size) | |||
179 | return ret; | 179 | return ret; |
180 | } | 180 | } |
181 | 181 | ||
182 | ret = vmtruncate(inode, size); | 182 | ret = vmtruncate(inode, newsize); |
183 | 183 | ||
184 | return ret; | 184 | return ret; |
185 | } | 185 | } |
diff --git a/fs/udf/inode.c b/fs/udf/inode.c index c8461551e108..1f0129405cf4 100644 --- a/fs/udf/inode.c +++ b/fs/udf/inode.c | |||
@@ -460,8 +460,8 @@ static struct buffer_head * inode_getblk(struct inode * inode, sector_t block, | |||
460 | kernel_long_ad laarr[EXTENT_MERGE_SIZE]; | 460 | kernel_long_ad laarr[EXTENT_MERGE_SIZE]; |
461 | struct extent_position prev_epos, cur_epos, next_epos; | 461 | struct extent_position prev_epos, cur_epos, next_epos; |
462 | int count = 0, startnum = 0, endnum = 0; | 462 | int count = 0, startnum = 0, endnum = 0; |
463 | uint32_t elen = 0; | 463 | uint32_t elen = 0, tmpelen; |
464 | kernel_lb_addr eloc; | 464 | kernel_lb_addr eloc, tmpeloc; |
465 | int c = 1; | 465 | int c = 1; |
466 | loff_t lbcount = 0, b_off = 0; | 466 | loff_t lbcount = 0, b_off = 0; |
467 | uint32_t newblocknum, newblock; | 467 | uint32_t newblocknum, newblock; |
@@ -520,8 +520,12 @@ static struct buffer_head * inode_getblk(struct inode * inode, sector_t block, | |||
520 | 520 | ||
521 | b_off -= lbcount; | 521 | b_off -= lbcount; |
522 | offset = b_off >> inode->i_sb->s_blocksize_bits; | 522 | offset = b_off >> inode->i_sb->s_blocksize_bits; |
523 | /* Move into indirect extent if we are at a pointer to it */ | 523 | /* |
524 | udf_next_aext(inode, &prev_epos, &eloc, &elen, 0); | 524 | * Move prev_epos and cur_epos into indirect extent if we are at |
525 | * the pointer to it | ||
526 | */ | ||
527 | udf_next_aext(inode, &prev_epos, &tmpeloc, &tmpelen, 0); | ||
528 | udf_next_aext(inode, &cur_epos, &tmpeloc, &tmpelen, 0); | ||
525 | 529 | ||
526 | /* if the extent is allocated and recorded, return the block | 530 | /* if the extent is allocated and recorded, return the block |
527 | if the extent is not a multiple of the blocksize, round up */ | 531 | if the extent is not a multiple of the blocksize, round up */ |
diff --git a/fs/udf/super.c b/fs/udf/super.c index 3a743d854c17..6658afb41cc7 100644 --- a/fs/udf/super.c +++ b/fs/udf/super.c | |||
@@ -1351,7 +1351,7 @@ udf_load_partition(struct super_block *sb, kernel_lb_addr *fileset) | |||
1351 | 1351 | ||
1352 | for (i=0; i<UDF_SB_NUMPARTS(sb); i++) | 1352 | for (i=0; i<UDF_SB_NUMPARTS(sb); i++) |
1353 | { | 1353 | { |
1354 | switch UDF_SB_PARTTYPE(sb, i) | 1354 | switch (UDF_SB_PARTTYPE(sb, i)) |
1355 | { | 1355 | { |
1356 | case UDF_VIRTUAL_MAP15: | 1356 | case UDF_VIRTUAL_MAP15: |
1357 | case UDF_VIRTUAL_MAP20: | 1357 | case UDF_VIRTUAL_MAP20: |
diff --git a/fs/xfs/linux-2.6/xfs_aops.c b/fs/xfs/linux-2.6/xfs_aops.c index 4475588e973a..7361861e3aac 100644 --- a/fs/xfs/linux-2.6/xfs_aops.c +++ b/fs/xfs/linux-2.6/xfs_aops.c | |||
@@ -701,7 +701,7 @@ xfs_is_delayed_page( | |||
701 | else if (buffer_delay(bh)) | 701 | else if (buffer_delay(bh)) |
702 | acceptable = (type == IOMAP_DELAY); | 702 | acceptable = (type == IOMAP_DELAY); |
703 | else if (buffer_dirty(bh) && buffer_mapped(bh)) | 703 | else if (buffer_dirty(bh) && buffer_mapped(bh)) |
704 | acceptable = (type == 0); | 704 | acceptable = (type == IOMAP_NEW); |
705 | else | 705 | else |
706 | break; | 706 | break; |
707 | } while ((bh = bh->b_this_page) != head); | 707 | } while ((bh = bh->b_this_page) != head); |
@@ -810,7 +810,7 @@ xfs_convert_page( | |||
810 | page_dirty--; | 810 | page_dirty--; |
811 | count++; | 811 | count++; |
812 | } else { | 812 | } else { |
813 | type = 0; | 813 | type = IOMAP_NEW; |
814 | if (buffer_mapped(bh) && all_bh && startio) { | 814 | if (buffer_mapped(bh) && all_bh && startio) { |
815 | lock_buffer(bh); | 815 | lock_buffer(bh); |
816 | xfs_add_to_ioend(inode, bh, offset, | 816 | xfs_add_to_ioend(inode, bh, offset, |
@@ -968,8 +968,8 @@ xfs_page_state_convert( | |||
968 | 968 | ||
969 | bh = head = page_buffers(page); | 969 | bh = head = page_buffers(page); |
970 | offset = page_offset(page); | 970 | offset = page_offset(page); |
971 | flags = -1; | 971 | flags = BMAPI_READ; |
972 | type = IOMAP_READ; | 972 | type = IOMAP_NEW; |
973 | 973 | ||
974 | /* TODO: cleanup count and page_dirty */ | 974 | /* TODO: cleanup count and page_dirty */ |
975 | 975 | ||
@@ -999,14 +999,14 @@ xfs_page_state_convert( | |||
999 | * | 999 | * |
1000 | * Third case, an unmapped buffer was found, and we are | 1000 | * Third case, an unmapped buffer was found, and we are |
1001 | * in a path where we need to write the whole page out. | 1001 | * in a path where we need to write the whole page out. |
1002 | */ | 1002 | */ |
1003 | if (buffer_unwritten(bh) || buffer_delay(bh) || | 1003 | if (buffer_unwritten(bh) || buffer_delay(bh) || |
1004 | ((buffer_uptodate(bh) || PageUptodate(page)) && | 1004 | ((buffer_uptodate(bh) || PageUptodate(page)) && |
1005 | !buffer_mapped(bh) && (unmapped || startio))) { | 1005 | !buffer_mapped(bh) && (unmapped || startio))) { |
1006 | /* | 1006 | /* |
1007 | * Make sure we don't use a read-only iomap | 1007 | * Make sure we don't use a read-only iomap |
1008 | */ | 1008 | */ |
1009 | if (flags == BMAPI_READ) | 1009 | if (flags == BMAPI_READ) |
1010 | iomap_valid = 0; | 1010 | iomap_valid = 0; |
1011 | 1011 | ||
1012 | if (buffer_unwritten(bh)) { | 1012 | if (buffer_unwritten(bh)) { |
@@ -1055,7 +1055,7 @@ xfs_page_state_convert( | |||
1055 | * That means it must already have extents allocated | 1055 | * That means it must already have extents allocated |
1056 | * underneath it. Map the extent by reading it. | 1056 | * underneath it. Map the extent by reading it. |
1057 | */ | 1057 | */ |
1058 | if (!iomap_valid || type != IOMAP_READ) { | 1058 | if (!iomap_valid || flags != BMAPI_READ) { |
1059 | flags = BMAPI_READ; | 1059 | flags = BMAPI_READ; |
1060 | size = xfs_probe_cluster(inode, page, bh, | 1060 | size = xfs_probe_cluster(inode, page, bh, |
1061 | head, 1); | 1061 | head, 1); |
@@ -1066,7 +1066,15 @@ xfs_page_state_convert( | |||
1066 | iomap_valid = xfs_iomap_valid(&iomap, offset); | 1066 | iomap_valid = xfs_iomap_valid(&iomap, offset); |
1067 | } | 1067 | } |
1068 | 1068 | ||
1069 | type = IOMAP_READ; | 1069 | /* |
1070 | * We set the type to IOMAP_NEW in case we are doing a | ||
1071 | * small write at EOF that is extending the file but | ||
1072 | * without needing an allocation. We need to update the | ||
1073 | * file size on I/O completion in this case so it is | ||
1074 | * the same case as having just allocated a new extent | ||
1075 | * that we are writing into for the first time. | ||
1076 | */ | ||
1077 | type = IOMAP_NEW; | ||
1070 | if (!test_and_set_bit(BH_Lock, &bh->b_state)) { | 1078 | if (!test_and_set_bit(BH_Lock, &bh->b_state)) { |
1071 | ASSERT(buffer_mapped(bh)); | 1079 | ASSERT(buffer_mapped(bh)); |
1072 | if (iomap_valid) | 1080 | if (iomap_valid) |
diff --git a/include/acpi/acpi_numa.h b/include/acpi/acpi_numa.h index b62cd36ff324..e2fcee2b340d 100644 --- a/include/acpi/acpi_numa.h +++ b/include/acpi/acpi_numa.h | |||
@@ -13,7 +13,7 @@ | |||
13 | 13 | ||
14 | extern int pxm_to_node(int); | 14 | extern int pxm_to_node(int); |
15 | extern int node_to_pxm(int); | 15 | extern int node_to_pxm(int); |
16 | extern int __cpuinit acpi_map_pxm_to_node(int); | 16 | extern int acpi_map_pxm_to_node(int); |
17 | extern void __cpuinit acpi_unmap_pxm_to_node(int); | 17 | extern void __cpuinit acpi_unmap_pxm_to_node(int); |
18 | 18 | ||
19 | #endif /* CONFIG_ACPI_NUMA */ | 19 | #endif /* CONFIG_ACPI_NUMA */ |
diff --git a/include/acpi/acpiosxf.h b/include/acpi/acpiosxf.h index 5e07db0d46e9..ca882b8e7d10 100644 --- a/include/acpi/acpiosxf.h +++ b/include/acpi/acpiosxf.h | |||
@@ -78,7 +78,7 @@ struct acpi_signal_fatal_info { | |||
78 | /* | 78 | /* |
79 | * OSL Initialization and shutdown primitives | 79 | * OSL Initialization and shutdown primitives |
80 | */ | 80 | */ |
81 | acpi_status acpi_os_initialize(void); | 81 | acpi_status __initdata acpi_os_initialize(void); |
82 | 82 | ||
83 | acpi_status acpi_os_terminate(void); | 83 | acpi_status acpi_os_terminate(void); |
84 | 84 | ||
@@ -236,6 +236,7 @@ acpi_os_derive_pci_id(acpi_handle rhandle, | |||
236 | * Miscellaneous | 236 | * Miscellaneous |
237 | */ | 237 | */ |
238 | acpi_status acpi_os_validate_interface(char *interface); | 238 | acpi_status acpi_os_validate_interface(char *interface); |
239 | acpi_status acpi_osi_invalidate(char* interface); | ||
239 | 240 | ||
240 | acpi_status | 241 | acpi_status |
241 | acpi_os_validate_address(u8 space_id, | 242 | acpi_os_validate_address(u8 space_id, |
diff --git a/include/acpi/acpixf.h b/include/acpi/acpixf.h index e08f7df85a4f..b5cca5daa348 100644 --- a/include/acpi/acpixf.h +++ b/include/acpi/acpixf.h | |||
@@ -55,7 +55,7 @@ acpi_status | |||
55 | acpi_initialize_tables(struct acpi_table_desc *initial_storage, | 55 | acpi_initialize_tables(struct acpi_table_desc *initial_storage, |
56 | u32 initial_table_count, u8 allow_resize); | 56 | u32 initial_table_count, u8 allow_resize); |
57 | 57 | ||
58 | acpi_status acpi_initialize_subsystem(void); | 58 | acpi_status __init acpi_initialize_subsystem(void); |
59 | 59 | ||
60 | acpi_status acpi_enable_subsystem(u32 flags); | 60 | acpi_status acpi_enable_subsystem(u32 flags); |
61 | 61 | ||
diff --git a/include/acpi/acutils.h b/include/acpi/acutils.h index 15a838862cd4..a87ef1c8d46b 100644 --- a/include/acpi/acutils.h +++ b/include/acpi/acutils.h | |||
@@ -390,6 +390,8 @@ void acpi_ut_delete_object_desc(union acpi_operand_object *object); | |||
390 | 390 | ||
391 | u8 acpi_ut_valid_internal_object(void *object); | 391 | u8 acpi_ut_valid_internal_object(void *object); |
392 | 392 | ||
393 | union acpi_operand_object *acpi_ut_create_package_object(u32 count); | ||
394 | |||
393 | union acpi_operand_object *acpi_ut_create_buffer_object(acpi_size buffer_size); | 395 | union acpi_operand_object *acpi_ut_create_buffer_object(acpi_size buffer_size); |
394 | 396 | ||
395 | union acpi_operand_object *acpi_ut_create_string_object(acpi_size string_size); | 397 | union acpi_operand_object *acpi_ut_create_string_object(acpi_size string_size); |
diff --git a/include/asm-alpha/bitops.h b/include/asm-alpha/bitops.h index 4b6ef7f21b93..3a0cbeb03fa1 100644 --- a/include/asm-alpha/bitops.h +++ b/include/asm-alpha/bitops.h | |||
@@ -313,32 +313,29 @@ static inline int ffs(int word) | |||
313 | * fls: find last bit set. | 313 | * fls: find last bit set. |
314 | */ | 314 | */ |
315 | #if defined(CONFIG_ALPHA_EV6) && defined(CONFIG_ALPHA_EV67) | 315 | #if defined(CONFIG_ALPHA_EV6) && defined(CONFIG_ALPHA_EV67) |
316 | static inline int fls(int word) | 316 | static inline int fls64(unsigned long word) |
317 | { | 317 | { |
318 | return 64 - __kernel_ctlz(word & 0xffffffff); | 318 | return 64 - __kernel_ctlz(word); |
319 | } | 319 | } |
320 | #else | 320 | #else |
321 | #include <asm-generic/bitops/fls.h> | 321 | extern const unsigned char __flsm1_tab[256]; |
322 | #endif | ||
323 | #include <asm-generic/bitops/fls64.h> | ||
324 | 322 | ||
325 | /* Compute powers of two for the given integer. */ | 323 | static inline int fls64(unsigned long x) |
326 | static inline long floor_log2(unsigned long word) | ||
327 | { | 324 | { |
328 | #if defined(CONFIG_ALPHA_EV6) && defined(CONFIG_ALPHA_EV67) | 325 | unsigned long t, a, r; |
329 | return 63 - __kernel_ctlz(word); | 326 | |
330 | #else | 327 | t = __kernel_cmpbge (x, 0x0101010101010101); |
331 | long bit; | 328 | a = __flsm1_tab[t]; |
332 | for (bit = -1; word ; bit++) | 329 | t = __kernel_extbl (x, a); |
333 | word >>= 1; | 330 | r = a*8 + __flsm1_tab[t] + (x != 0); |
334 | return bit; | 331 | |
335 | #endif | 332 | return r; |
336 | } | 333 | } |
334 | #endif | ||
337 | 335 | ||
338 | static inline long ceil_log2(unsigned long word) | 336 | static inline int fls(int x) |
339 | { | 337 | { |
340 | long bit = floor_log2(word); | 338 | return fls64((unsigned int) x); |
341 | return bit + (word > (1UL << bit)); | ||
342 | } | 339 | } |
343 | 340 | ||
344 | /* | 341 | /* |
@@ -353,9 +350,20 @@ static inline unsigned long hweight64(unsigned long w) | |||
353 | return __kernel_ctpop(w); | 350 | return __kernel_ctpop(w); |
354 | } | 351 | } |
355 | 352 | ||
356 | #define hweight32(x) (unsigned int) hweight64((x) & 0xfffffffful) | 353 | static inline unsigned int hweight32(unsigned int w) |
357 | #define hweight16(x) (unsigned int) hweight64((x) & 0xfffful) | 354 | { |
358 | #define hweight8(x) (unsigned int) hweight64((x) & 0xfful) | 355 | return hweight64(w); |
356 | } | ||
357 | |||
358 | static inline unsigned int hweight16(unsigned int w) | ||
359 | { | ||
360 | return hweight64(w & 0xffff); | ||
361 | } | ||
362 | |||
363 | static inline unsigned int hweight8(unsigned int w) | ||
364 | { | ||
365 | return hweight64(w & 0xff); | ||
366 | } | ||
359 | #else | 367 | #else |
360 | #include <asm-generic/bitops/hweight.h> | 368 | #include <asm-generic/bitops/hweight.h> |
361 | #endif | 369 | #endif |
diff --git a/include/asm-alpha/core_t2.h b/include/asm-alpha/core_t2.h index 457c34b6eb09..90e6b5d6c214 100644 --- a/include/asm-alpha/core_t2.h +++ b/include/asm-alpha/core_t2.h | |||
@@ -437,9 +437,15 @@ static inline void t2_outl(u32 b, unsigned long addr) | |||
437 | 437 | ||
438 | static DEFINE_SPINLOCK(t2_hae_lock); | 438 | static DEFINE_SPINLOCK(t2_hae_lock); |
439 | 439 | ||
440 | /* | ||
441 | * NOTE: take T2_DENSE_MEM off in each readX/writeX routine, since | ||
442 | * they may be called directly, rather than through the | ||
443 | * ioreadNN/iowriteNN routines. | ||
444 | */ | ||
445 | |||
440 | __EXTERN_INLINE u8 t2_readb(const volatile void __iomem *xaddr) | 446 | __EXTERN_INLINE u8 t2_readb(const volatile void __iomem *xaddr) |
441 | { | 447 | { |
442 | unsigned long addr = (unsigned long) xaddr; | 448 | unsigned long addr = (unsigned long) xaddr - T2_DENSE_MEM; |
443 | unsigned long result, msb; | 449 | unsigned long result, msb; |
444 | unsigned long flags; | 450 | unsigned long flags; |
445 | spin_lock_irqsave(&t2_hae_lock, flags); | 451 | spin_lock_irqsave(&t2_hae_lock, flags); |
@@ -453,7 +459,7 @@ __EXTERN_INLINE u8 t2_readb(const volatile void __iomem *xaddr) | |||
453 | 459 | ||
454 | __EXTERN_INLINE u16 t2_readw(const volatile void __iomem *xaddr) | 460 | __EXTERN_INLINE u16 t2_readw(const volatile void __iomem *xaddr) |
455 | { | 461 | { |
456 | unsigned long addr = (unsigned long) xaddr; | 462 | unsigned long addr = (unsigned long) xaddr - T2_DENSE_MEM; |
457 | unsigned long result, msb; | 463 | unsigned long result, msb; |
458 | unsigned long flags; | 464 | unsigned long flags; |
459 | spin_lock_irqsave(&t2_hae_lock, flags); | 465 | spin_lock_irqsave(&t2_hae_lock, flags); |
@@ -471,7 +477,7 @@ __EXTERN_INLINE u16 t2_readw(const volatile void __iomem *xaddr) | |||
471 | */ | 477 | */ |
472 | __EXTERN_INLINE u32 t2_readl(const volatile void __iomem *xaddr) | 478 | __EXTERN_INLINE u32 t2_readl(const volatile void __iomem *xaddr) |
473 | { | 479 | { |
474 | unsigned long addr = (unsigned long) xaddr; | 480 | unsigned long addr = (unsigned long) xaddr - T2_DENSE_MEM; |
475 | unsigned long result, msb; | 481 | unsigned long result, msb; |
476 | unsigned long flags; | 482 | unsigned long flags; |
477 | spin_lock_irqsave(&t2_hae_lock, flags); | 483 | spin_lock_irqsave(&t2_hae_lock, flags); |
@@ -485,7 +491,7 @@ __EXTERN_INLINE u32 t2_readl(const volatile void __iomem *xaddr) | |||
485 | 491 | ||
486 | __EXTERN_INLINE u64 t2_readq(const volatile void __iomem *xaddr) | 492 | __EXTERN_INLINE u64 t2_readq(const volatile void __iomem *xaddr) |
487 | { | 493 | { |
488 | unsigned long addr = (unsigned long) xaddr; | 494 | unsigned long addr = (unsigned long) xaddr - T2_DENSE_MEM; |
489 | unsigned long r0, r1, work, msb; | 495 | unsigned long r0, r1, work, msb; |
490 | unsigned long flags; | 496 | unsigned long flags; |
491 | spin_lock_irqsave(&t2_hae_lock, flags); | 497 | spin_lock_irqsave(&t2_hae_lock, flags); |
@@ -501,7 +507,7 @@ __EXTERN_INLINE u64 t2_readq(const volatile void __iomem *xaddr) | |||
501 | 507 | ||
502 | __EXTERN_INLINE void t2_writeb(u8 b, volatile void __iomem *xaddr) | 508 | __EXTERN_INLINE void t2_writeb(u8 b, volatile void __iomem *xaddr) |
503 | { | 509 | { |
504 | unsigned long addr = (unsigned long) xaddr; | 510 | unsigned long addr = (unsigned long) xaddr - T2_DENSE_MEM; |
505 | unsigned long msb, w; | 511 | unsigned long msb, w; |
506 | unsigned long flags; | 512 | unsigned long flags; |
507 | spin_lock_irqsave(&t2_hae_lock, flags); | 513 | spin_lock_irqsave(&t2_hae_lock, flags); |
@@ -515,7 +521,7 @@ __EXTERN_INLINE void t2_writeb(u8 b, volatile void __iomem *xaddr) | |||
515 | 521 | ||
516 | __EXTERN_INLINE void t2_writew(u16 b, volatile void __iomem *xaddr) | 522 | __EXTERN_INLINE void t2_writew(u16 b, volatile void __iomem *xaddr) |
517 | { | 523 | { |
518 | unsigned long addr = (unsigned long) xaddr; | 524 | unsigned long addr = (unsigned long) xaddr - T2_DENSE_MEM; |
519 | unsigned long msb, w; | 525 | unsigned long msb, w; |
520 | unsigned long flags; | 526 | unsigned long flags; |
521 | spin_lock_irqsave(&t2_hae_lock, flags); | 527 | spin_lock_irqsave(&t2_hae_lock, flags); |
@@ -533,7 +539,7 @@ __EXTERN_INLINE void t2_writew(u16 b, volatile void __iomem *xaddr) | |||
533 | */ | 539 | */ |
534 | __EXTERN_INLINE void t2_writel(u32 b, volatile void __iomem *xaddr) | 540 | __EXTERN_INLINE void t2_writel(u32 b, volatile void __iomem *xaddr) |
535 | { | 541 | { |
536 | unsigned long addr = (unsigned long) xaddr; | 542 | unsigned long addr = (unsigned long) xaddr - T2_DENSE_MEM; |
537 | unsigned long msb; | 543 | unsigned long msb; |
538 | unsigned long flags; | 544 | unsigned long flags; |
539 | spin_lock_irqsave(&t2_hae_lock, flags); | 545 | spin_lock_irqsave(&t2_hae_lock, flags); |
@@ -546,7 +552,7 @@ __EXTERN_INLINE void t2_writel(u32 b, volatile void __iomem *xaddr) | |||
546 | 552 | ||
547 | __EXTERN_INLINE void t2_writeq(u64 b, volatile void __iomem *xaddr) | 553 | __EXTERN_INLINE void t2_writeq(u64 b, volatile void __iomem *xaddr) |
548 | { | 554 | { |
549 | unsigned long addr = (unsigned long) xaddr; | 555 | unsigned long addr = (unsigned long) xaddr - T2_DENSE_MEM; |
550 | unsigned long msb, work; | 556 | unsigned long msb, work; |
551 | unsigned long flags; | 557 | unsigned long flags; |
552 | spin_lock_irqsave(&t2_hae_lock, flags); | 558 | spin_lock_irqsave(&t2_hae_lock, flags); |
@@ -587,14 +593,14 @@ __EXTERN_INLINE int t2_is_mmio(const volatile void __iomem *addr) | |||
587 | __EXTERN_INLINE unsigned int t2_ioread##NS(void __iomem *xaddr) \ | 593 | __EXTERN_INLINE unsigned int t2_ioread##NS(void __iomem *xaddr) \ |
588 | { \ | 594 | { \ |
589 | if (t2_is_mmio(xaddr)) \ | 595 | if (t2_is_mmio(xaddr)) \ |
590 | return t2_read##OS(xaddr - T2_DENSE_MEM); \ | 596 | return t2_read##OS(xaddr); \ |
591 | else \ | 597 | else \ |
592 | return t2_in##OS((unsigned long)xaddr - T2_IO); \ | 598 | return t2_in##OS((unsigned long)xaddr - T2_IO); \ |
593 | } \ | 599 | } \ |
594 | __EXTERN_INLINE void t2_iowrite##NS(u##NS b, void __iomem *xaddr) \ | 600 | __EXTERN_INLINE void t2_iowrite##NS(u##NS b, void __iomem *xaddr) \ |
595 | { \ | 601 | { \ |
596 | if (t2_is_mmio(xaddr)) \ | 602 | if (t2_is_mmio(xaddr)) \ |
597 | t2_write##OS(b, xaddr - T2_DENSE_MEM); \ | 603 | t2_write##OS(b, xaddr); \ |
598 | else \ | 604 | else \ |
599 | t2_out##OS(b, (unsigned long)xaddr - T2_IO); \ | 605 | t2_out##OS(b, (unsigned long)xaddr - T2_IO); \ |
600 | } | 606 | } |
diff --git a/include/asm-alpha/core_titan.h b/include/asm-alpha/core_titan.h index a64ccbff7d98..a17f6f33b68e 100644 --- a/include/asm-alpha/core_titan.h +++ b/include/asm-alpha/core_titan.h | |||
@@ -380,12 +380,7 @@ struct el_PRIVATEER_envdata_mcheck { | |||
380 | /* | 380 | /* |
381 | * Memory functions. all accesses are done through linear space. | 381 | * Memory functions. all accesses are done through linear space. |
382 | */ | 382 | */ |
383 | 383 | extern void __iomem *titan_ioportmap(unsigned long addr); | |
384 | __EXTERN_INLINE void __iomem *titan_ioportmap(unsigned long addr) | ||
385 | { | ||
386 | return (void __iomem *)(addr + TITAN_IO_BIAS); | ||
387 | } | ||
388 | |||
389 | extern void __iomem *titan_ioremap(unsigned long addr, unsigned long size); | 384 | extern void __iomem *titan_ioremap(unsigned long addr, unsigned long size); |
390 | extern void titan_iounmap(volatile void __iomem *addr); | 385 | extern void titan_iounmap(volatile void __iomem *addr); |
391 | 386 | ||
diff --git a/include/asm-alpha/core_tsunami.h b/include/asm-alpha/core_tsunami.h index 44e635d2c571..58d4fe48742c 100644 --- a/include/asm-alpha/core_tsunami.h +++ b/include/asm-alpha/core_tsunami.h | |||
@@ -2,6 +2,7 @@ | |||
2 | #define __ALPHA_TSUNAMI__H__ | 2 | #define __ALPHA_TSUNAMI__H__ |
3 | 3 | ||
4 | #include <linux/types.h> | 4 | #include <linux/types.h> |
5 | #include <linux/pci.h> | ||
5 | #include <asm/compiler.h> | 6 | #include <asm/compiler.h> |
6 | 7 | ||
7 | /* | 8 | /* |
@@ -302,18 +303,8 @@ struct el_TSUNAMI_sysdata_mcheck { | |||
302 | /* | 303 | /* |
303 | * Memory functions. all accesses are done through linear space. | 304 | * Memory functions. all accesses are done through linear space. |
304 | */ | 305 | */ |
305 | 306 | extern void __iomem *tsunami_ioportmap(unsigned long addr); | |
306 | __EXTERN_INLINE void __iomem *tsunami_ioportmap(unsigned long addr) | 307 | extern void __iomem *tsunami_ioremap(unsigned long addr, unsigned long size); |
307 | { | ||
308 | return (void __iomem *)(addr + TSUNAMI_IO_BIAS); | ||
309 | } | ||
310 | |||
311 | __EXTERN_INLINE void __iomem *tsunami_ioremap(unsigned long addr, | ||
312 | unsigned long size) | ||
313 | { | ||
314 | return (void __iomem *)(addr + TSUNAMI_MEM_BIAS); | ||
315 | } | ||
316 | |||
317 | __EXTERN_INLINE int tsunami_is_ioaddr(unsigned long addr) | 308 | __EXTERN_INLINE int tsunami_is_ioaddr(unsigned long addr) |
318 | { | 309 | { |
319 | return addr >= TSUNAMI_BASE; | 310 | return addr >= TSUNAMI_BASE; |
diff --git a/include/asm-alpha/core_wildfire.h b/include/asm-alpha/core_wildfire.h index 12af803d445a..cd562f544ba2 100644 --- a/include/asm-alpha/core_wildfire.h +++ b/include/asm-alpha/core_wildfire.h | |||
@@ -295,7 +295,7 @@ __EXTERN_INLINE int wildfire_is_ioaddr(unsigned long addr) | |||
295 | 295 | ||
296 | __EXTERN_INLINE int wildfire_is_mmio(const volatile void __iomem *xaddr) | 296 | __EXTERN_INLINE int wildfire_is_mmio(const volatile void __iomem *xaddr) |
297 | { | 297 | { |
298 | unsigned long addr = (unsigned long)addr; | 298 | unsigned long addr = (unsigned long)xaddr; |
299 | return (addr & 0x100000000UL) == 0; | 299 | return (addr & 0x100000000UL) == 0; |
300 | } | 300 | } |
301 | 301 | ||
diff --git a/include/asm-alpha/thread_info.h b/include/asm-alpha/thread_info.h index f4defc2bd3fb..48a22e3e6f32 100644 --- a/include/asm-alpha/thread_info.h +++ b/include/asm-alpha/thread_info.h | |||
@@ -76,12 +76,14 @@ register struct thread_info *__current_thread_info __asm__("$8"); | |||
76 | #define TIF_UAC_NOFIX 7 | 76 | #define TIF_UAC_NOFIX 7 |
77 | #define TIF_UAC_SIGBUS 8 | 77 | #define TIF_UAC_SIGBUS 8 |
78 | #define TIF_MEMDIE 9 | 78 | #define TIF_MEMDIE 9 |
79 | #define TIF_RESTORE_SIGMASK 10 /* restore signal mask in do_signal */ | ||
79 | 80 | ||
80 | #define _TIF_SYSCALL_TRACE (1<<TIF_SYSCALL_TRACE) | 81 | #define _TIF_SYSCALL_TRACE (1<<TIF_SYSCALL_TRACE) |
81 | #define _TIF_NOTIFY_RESUME (1<<TIF_NOTIFY_RESUME) | 82 | #define _TIF_NOTIFY_RESUME (1<<TIF_NOTIFY_RESUME) |
82 | #define _TIF_SIGPENDING (1<<TIF_SIGPENDING) | 83 | #define _TIF_SIGPENDING (1<<TIF_SIGPENDING) |
83 | #define _TIF_NEED_RESCHED (1<<TIF_NEED_RESCHED) | 84 | #define _TIF_NEED_RESCHED (1<<TIF_NEED_RESCHED) |
84 | #define _TIF_POLLING_NRFLAG (1<<TIF_POLLING_NRFLAG) | 85 | #define _TIF_POLLING_NRFLAG (1<<TIF_POLLING_NRFLAG) |
86 | #define _TIF_RESTORE_SIGMASK (1<<TIF_RESTORE_SIGMASK) | ||
85 | 87 | ||
86 | /* Work to do on interrupt/exception return. */ | 88 | /* Work to do on interrupt/exception return. */ |
87 | #define _TIF_WORK_MASK (_TIF_NOTIFY_RESUME \ | 89 | #define _TIF_WORK_MASK (_TIF_NOTIFY_RESUME \ |
diff --git a/include/asm-alpha/unistd.h b/include/asm-alpha/unistd.h index e58a427012dd..29bf2fdc91c0 100644 --- a/include/asm-alpha/unistd.h +++ b/include/asm-alpha/unistd.h | |||
@@ -233,6 +233,20 @@ | |||
233 | #define __NR_osf_memcntl 260 /* not implemented */ | 233 | #define __NR_osf_memcntl 260 /* not implemented */ |
234 | #define __NR_osf_fdatasync 261 /* not implemented */ | 234 | #define __NR_osf_fdatasync 261 /* not implemented */ |
235 | 235 | ||
236 | /* | ||
237 | * Ignore legacy syscalls that we don't use. | ||
238 | */ | ||
239 | #define __IGNORE_alarm | ||
240 | #define __IGNORE_creat | ||
241 | #define __IGNORE_getegid | ||
242 | #define __IGNORE_geteuid | ||
243 | #define __IGNORE_getgid | ||
244 | #define __IGNORE_getpid | ||
245 | #define __IGNORE_getppid | ||
246 | #define __IGNORE_getuid | ||
247 | #define __IGNORE_pause | ||
248 | #define __IGNORE_time | ||
249 | #define __IGNORE_utime | ||
236 | 250 | ||
237 | /* | 251 | /* |
238 | * Linux-specific system calls begin at 300 | 252 | * Linux-specific system calls begin at 300 |
@@ -387,10 +401,42 @@ | |||
387 | #define __NR_inotify_init 444 | 401 | #define __NR_inotify_init 444 |
388 | #define __NR_inotify_add_watch 445 | 402 | #define __NR_inotify_add_watch 445 |
389 | #define __NR_inotify_rm_watch 446 | 403 | #define __NR_inotify_rm_watch 446 |
404 | #define __NR_fdatasync 447 | ||
405 | #define __NR_kexec_load 448 | ||
406 | #define __NR_migrate_pages 449 | ||
407 | #define __NR_openat 450 | ||
408 | #define __NR_mkdirat 451 | ||
409 | #define __NR_mknodat 452 | ||
410 | #define __NR_fchownat 453 | ||
411 | #define __NR_futimesat 454 | ||
412 | #define __NR_fstatat64 455 | ||
413 | #define __NR_unlinkat 456 | ||
414 | #define __NR_renameat 457 | ||
415 | #define __NR_linkat 458 | ||
416 | #define __NR_symlinkat 459 | ||
417 | #define __NR_readlinkat 460 | ||
418 | #define __NR_fchmodat 461 | ||
419 | #define __NR_faccessat 462 | ||
420 | #define __NR_pselect6 463 | ||
421 | #define __NR_ppoll 464 | ||
422 | #define __NR_unshare 465 | ||
423 | #define __NR_set_robust_list 466 | ||
424 | #define __NR_get_robust_list 467 | ||
425 | #define __NR_splice 468 | ||
426 | #define __NR_sync_file_range 469 | ||
427 | #define __NR_tee 470 | ||
428 | #define __NR_vmsplice 471 | ||
429 | #define __NR_move_pages 472 | ||
430 | #define __NR_getcpu 473 | ||
431 | #define __NR_epoll_pwait 474 | ||
432 | #define __NR_utimensat 475 | ||
433 | #define __NR_signalfd 476 | ||
434 | #define __NR_timerfd 477 | ||
435 | #define __NR_eventfd 478 | ||
390 | 436 | ||
391 | #ifdef __KERNEL__ | 437 | #ifdef __KERNEL__ |
392 | 438 | ||
393 | #define NR_SYSCALLS 447 | 439 | #define NR_SYSCALLS 479 |
394 | 440 | ||
395 | #define __ARCH_WANT_IPC_PARSE_VERSION | 441 | #define __ARCH_WANT_IPC_PARSE_VERSION |
396 | #define __ARCH_WANT_OLD_READDIR | 442 | #define __ARCH_WANT_OLD_READDIR |
diff --git a/include/asm-alpha/vga.h b/include/asm-alpha/vga.h index ed06f59b544d..e8df1e7aae6b 100644 --- a/include/asm-alpha/vga.h +++ b/include/asm-alpha/vga.h | |||
@@ -46,6 +46,37 @@ extern void scr_memcpyw(u16 *d, const u16 *s, unsigned int count); | |||
46 | #define vga_readb(a) readb((u8 __iomem *)(a)) | 46 | #define vga_readb(a) readb((u8 __iomem *)(a)) |
47 | #define vga_writeb(v,a) writeb(v, (u8 __iomem *)(a)) | 47 | #define vga_writeb(v,a) writeb(v, (u8 __iomem *)(a)) |
48 | 48 | ||
49 | #ifdef CONFIG_VGA_HOSE | ||
50 | #include <linux/ioport.h> | ||
51 | #include <linux/pci.h> | ||
52 | |||
53 | extern struct pci_controller *pci_vga_hose; | ||
54 | |||
55 | # define __is_port_vga(a) \ | ||
56 | (((a) >= 0x3b0) && ((a) < 0x3e0) && \ | ||
57 | ((a) != 0x3b3) && ((a) != 0x3d3)) | ||
58 | |||
59 | # define __is_mem_vga(a) \ | ||
60 | (((a) >= 0xa0000) && ((a) <= 0xc0000)) | ||
61 | |||
62 | # define FIXUP_IOADDR_VGA(a) do { \ | ||
63 | if (pci_vga_hose && __is_port_vga(a)) \ | ||
64 | (a) += pci_vga_hose->io_space->start; \ | ||
65 | } while(0) | ||
66 | |||
67 | # define FIXUP_MEMADDR_VGA(a) do { \ | ||
68 | if (pci_vga_hose && __is_mem_vga(a)) \ | ||
69 | (a) += pci_vga_hose->mem_space->start; \ | ||
70 | } while(0) | ||
71 | |||
72 | #else /* CONFIG_VGA_HOSE */ | ||
73 | # define pci_vga_hose 0 | ||
74 | # define __is_port_vga(a) 0 | ||
75 | # define __is_mem_vga(a) 0 | ||
76 | # define FIXUP_IOADDR_VGA(a) | ||
77 | # define FIXUP_MEMADDR_VGA(a) | ||
78 | #endif /* CONFIG_VGA_HOSE */ | ||
79 | |||
49 | #define VGA_MAP_MEM(x,s) ((unsigned long) ioremap(x, s)) | 80 | #define VGA_MAP_MEM(x,s) ((unsigned long) ioremap(x, s)) |
50 | 81 | ||
51 | #endif | 82 | #endif |
diff --git a/include/asm-arm/arch-ixp4xx/nas100d.h b/include/asm-arm/arch-ixp4xx/nas100d.h index 84467a5190d0..131e0a1d0df3 100644 --- a/include/asm-arm/arch-ixp4xx/nas100d.h +++ b/include/asm-arm/arch-ixp4xx/nas100d.h | |||
@@ -10,7 +10,7 @@ | |||
10 | * based on ixdp425.h: | 10 | * based on ixdp425.h: |
11 | * Copyright 2004 (c) MontaVista, Software, Inc. | 11 | * Copyright 2004 (c) MontaVista, Software, Inc. |
12 | * | 12 | * |
13 | * This file is licensed under the terms of the GNU General Public | 13 | * This file is licensed under the terms of the GNU General Public |
14 | * License version 2. This program is licensed "as is" without any | 14 | * License version 2. This program is licensed "as is" without any |
15 | * warranty of any kind, whether express or implied. | 15 | * warranty of any kind, whether express or implied. |
16 | */ | 16 | */ |
@@ -36,31 +36,11 @@ | |||
36 | #define NAS100D_PCI_INTD_PIN 8 | 36 | #define NAS100D_PCI_INTD_PIN 8 |
37 | #define NAS100D_PCI_INTE_PIN 7 | 37 | #define NAS100D_PCI_INTE_PIN 7 |
38 | 38 | ||
39 | /* GPIO */ | ||
40 | |||
41 | #define NAS100D_GPIO0 0 | ||
42 | #define NAS100D_GPIO1 1 | ||
43 | #define NAS100D_GPIO2 2 | ||
44 | #define NAS100D_GPIO3 3 | ||
45 | #define NAS100D_GPIO4 4 | ||
46 | #define NAS100D_GPIO5 5 | ||
47 | #define NAS100D_GPIO6 6 | ||
48 | #define NAS100D_GPIO7 7 | ||
49 | #define NAS100D_GPIO8 8 | ||
50 | #define NAS100D_GPIO9 9 | ||
51 | #define NAS100D_GPIO10 10 | ||
52 | #define NAS100D_GPIO11 11 | ||
53 | #define NAS100D_GPIO12 12 | ||
54 | #define NAS100D_GPIO13 13 | ||
55 | #define NAS100D_GPIO14 14 | ||
56 | #define NAS100D_GPIO15 15 | ||
57 | |||
58 | |||
59 | /* Buttons */ | 39 | /* Buttons */ |
60 | 40 | ||
61 | #define NAS100D_PB_GPIO NAS100D_GPIO14 | 41 | #define NAS100D_PB_GPIO 14 |
62 | #define NAS100D_RB_GPIO NAS100D_GPIO4 | 42 | #define NAS100D_RB_GPIO 4 |
63 | #define NAS100D_PO_GPIO NAS100D_GPIO12 /* power off */ | 43 | #define NAS100D_PO_GPIO 12 /* power off */ |
64 | 44 | ||
65 | #define NAS100D_PB_IRQ IRQ_IXP4XX_GPIO14 | 45 | #define NAS100D_PB_IRQ IRQ_IXP4XX_GPIO14 |
66 | #define NAS100D_RB_IRQ IRQ_IXP4XX_GPIO4 | 46 | #define NAS100D_RB_IRQ IRQ_IXP4XX_GPIO4 |
diff --git a/include/asm-arm/arch-ixp4xx/nslu2.h b/include/asm-arm/arch-ixp4xx/nslu2.h index 6b437f7c9955..850fdc5b45da 100644 --- a/include/asm-arm/arch-ixp4xx/nslu2.h +++ b/include/asm-arm/arch-ixp4xx/nslu2.h | |||
@@ -9,7 +9,7 @@ | |||
9 | * based on ixdp425.h: | 9 | * based on ixdp425.h: |
10 | * Copyright 2004 (c) MontaVista, Software, Inc. | 10 | * Copyright 2004 (c) MontaVista, Software, Inc. |
11 | * | 11 | * |
12 | * This file is licensed under the terms of the GNU General Public | 12 | * This file is licensed under the terms of the GNU General Public |
13 | * License version 2. This program is licensed "as is" without any | 13 | * License version 2. This program is licensed "as is" without any |
14 | * warranty of any kind, whether express or implied. | 14 | * warranty of any kind, whether express or implied. |
15 | */ | 15 | */ |
@@ -34,36 +34,14 @@ | |||
34 | #define NSLU2_PCI_INTC_PIN 9 | 34 | #define NSLU2_PCI_INTC_PIN 9 |
35 | #define NSLU2_PCI_INTD_PIN 8 | 35 | #define NSLU2_PCI_INTD_PIN 8 |
36 | 36 | ||
37 | |||
38 | /* NSLU2 Timer */ | 37 | /* NSLU2 Timer */ |
39 | #define NSLU2_FREQ 66000000 | 38 | #define NSLU2_FREQ 66000000 |
40 | #define NSLU2_CLOCK_TICK_RATE (((NSLU2_FREQ / HZ & ~IXP4XX_OST_RELOAD_MASK) + 1) * HZ) | ||
41 | #define NSLU2_CLOCK_TICKS_PER_USEC ((NSLU2_CLOCK_TICK_RATE + USEC_PER_SEC/2) / USEC_PER_SEC) | ||
42 | |||
43 | /* GPIO */ | ||
44 | |||
45 | #define NSLU2_GPIO0 0 | ||
46 | #define NSLU2_GPIO1 1 | ||
47 | #define NSLU2_GPIO2 2 | ||
48 | #define NSLU2_GPIO3 3 | ||
49 | #define NSLU2_GPIO4 4 | ||
50 | #define NSLU2_GPIO5 5 | ||
51 | #define NSLU2_GPIO6 6 | ||
52 | #define NSLU2_GPIO7 7 | ||
53 | #define NSLU2_GPIO8 8 | ||
54 | #define NSLU2_GPIO9 9 | ||
55 | #define NSLU2_GPIO10 10 | ||
56 | #define NSLU2_GPIO11 11 | ||
57 | #define NSLU2_GPIO12 12 | ||
58 | #define NSLU2_GPIO13 13 | ||
59 | #define NSLU2_GPIO14 14 | ||
60 | #define NSLU2_GPIO15 15 | ||
61 | 39 | ||
62 | /* Buttons */ | 40 | /* Buttons */ |
63 | 41 | ||
64 | #define NSLU2_PB_GPIO NSLU2_GPIO5 | 42 | #define NSLU2_PB_GPIO 5 |
65 | #define NSLU2_PO_GPIO NSLU2_GPIO8 /* power off */ | 43 | #define NSLU2_PO_GPIO 8 /* power off */ |
66 | #define NSLU2_RB_GPIO NSLU2_GPIO12 | 44 | #define NSLU2_RB_GPIO 12 |
67 | 45 | ||
68 | #define NSLU2_PB_IRQ IRQ_IXP4XX_GPIO5 | 46 | #define NSLU2_PB_IRQ IRQ_IXP4XX_GPIO5 |
69 | #define NSLU2_RB_IRQ IRQ_IXP4XX_GPIO12 | 47 | #define NSLU2_RB_IRQ IRQ_IXP4XX_GPIO12 |
@@ -79,16 +57,16 @@ | |||
79 | 57 | ||
80 | /* LEDs */ | 58 | /* LEDs */ |
81 | 59 | ||
82 | #define NSLU2_LED_RED NSLU2_GPIO0 | 60 | #define NSLU2_LED_RED_GPIO 0 |
83 | #define NSLU2_LED_GRN NSLU2_GPIO1 | 61 | #define NSLU2_LED_GRN_GPIO 1 |
84 | 62 | ||
85 | #define NSLU2_LED_RED_BM (1L << NSLU2_LED_RED) | 63 | #define NSLU2_LED_RED_BM (1L << NSLU2_LED_RED_GPIO) |
86 | #define NSLU2_LED_GRN_BM (1L << NSLU2_LED_GRN) | 64 | #define NSLU2_LED_GRN_BM (1L << NSLU2_LED_GRN_GPIO) |
87 | 65 | ||
88 | #define NSLU2_LED_DISK1 NSLU2_GPIO3 | 66 | #define NSLU2_LED_DISK1_GPIO 3 |
89 | #define NSLU2_LED_DISK2 NSLU2_GPIO2 | 67 | #define NSLU2_LED_DISK2_GPIO 2 |
90 | 68 | ||
91 | #define NSLU2_LED_DISK1_BM (1L << NSLU2_GPIO2) | 69 | #define NSLU2_LED_DISK1_BM (1L << NSLU2_LED_DISK1_GPIO) |
92 | #define NSLU2_LED_DISK2_BM (1L << NSLU2_GPIO3) | 70 | #define NSLU2_LED_DISK2_BM (1L << NSLU2_LED_DISK2_GPIO) |
93 | 71 | ||
94 | 72 | ||
diff --git a/include/asm-arm/arch-ixp4xx/platform.h b/include/asm-arm/arch-ixp4xx/platform.h index ab194e5f6653..2a44d3d67980 100644 --- a/include/asm-arm/arch-ixp4xx/platform.h +++ b/include/asm-arm/arch-ixp4xx/platform.h | |||
@@ -113,6 +113,7 @@ extern unsigned long ixp4xx_timer_freq; | |||
113 | extern void ixp4xx_map_io(void); | 113 | extern void ixp4xx_map_io(void); |
114 | extern void ixp4xx_init_irq(void); | 114 | extern void ixp4xx_init_irq(void); |
115 | extern void ixp4xx_sys_init(void); | 115 | extern void ixp4xx_sys_init(void); |
116 | extern void ixp4xx_timer_init(void); | ||
116 | extern struct sys_timer ixp4xx_timer; | 117 | extern struct sys_timer ixp4xx_timer; |
117 | extern void ixp4xx_pci_preinit(void); | 118 | extern void ixp4xx_pci_preinit(void); |
118 | struct pci_sys_data; | 119 | struct pci_sys_data; |
diff --git a/include/asm-arm/arch-s3c2410/map.h b/include/asm-arm/arch-s3c2410/map.h index 4505aefbad17..19e77f038042 100644 --- a/include/asm-arm/arch-s3c2410/map.h +++ b/include/asm-arm/arch-s3c2410/map.h | |||
@@ -153,6 +153,10 @@ | |||
153 | #define S3C2440_PA_AC97 (0x5B000000) | 153 | #define S3C2440_PA_AC97 (0x5B000000) |
154 | #define S3C2440_SZ_AC97 SZ_1M | 154 | #define S3C2440_SZ_AC97 SZ_1M |
155 | 155 | ||
156 | /* S3C2443 High-speed SD/MMC */ | ||
157 | #define S3C2443_PA_HSMMC (0x4A800000) | ||
158 | #define S3C2443_SZ_HSMMC (256) | ||
159 | |||
156 | /* ISA style IO, for each machine to sort out mappings for, if it | 160 | /* ISA style IO, for each machine to sort out mappings for, if it |
157 | * implements it. We reserve two 16M regions for ISA. | 161 | * implements it. We reserve two 16M regions for ISA. |
158 | */ | 162 | */ |
diff --git a/include/asm-arm/arch-s3c2410/regs-gpioj.h b/include/asm-arm/arch-s3c2410/regs-gpioj.h index 02131a5a1d3a..0362332faaf0 100644 --- a/include/asm-arm/arch-s3c2410/regs-gpioj.h +++ b/include/asm-arm/arch-s3c2410/regs-gpioj.h | |||
@@ -98,5 +98,9 @@ | |||
98 | #define S3C2440_GPJ12_OUTP (0x01 << 24) | 98 | #define S3C2440_GPJ12_OUTP (0x01 << 24) |
99 | #define S3C2440_GPJ12_CAMRESET (0x02 << 24) | 99 | #define S3C2440_GPJ12_CAMRESET (0x02 << 24) |
100 | 100 | ||
101 | #define S3C2443_GPJ13 S3C2410_GPIONO(S3C2440_GPIO_BANKJ, 13) | ||
102 | #define S3C2443_GPJ14 S3C2410_GPIONO(S3C2440_GPIO_BANKJ, 14) | ||
103 | #define S3C2443_GPJ15 S3C2410_GPIONO(S3C2440_GPIO_BANKJ, 15) | ||
104 | |||
101 | #endif /* __ASM_ARCH_REGS_GPIOJ_H */ | 105 | #endif /* __ASM_ARCH_REGS_GPIOJ_H */ |
102 | 106 | ||
diff --git a/include/asm-arm/arch-s3c2410/regs-s3c2412.h b/include/asm-arm/arch-s3c2410/regs-s3c2412.h new file mode 100644 index 000000000000..8ca6a3bc8555 --- /dev/null +++ b/include/asm-arm/arch-s3c2410/regs-s3c2412.h | |||
@@ -0,0 +1,21 @@ | |||
1 | /* linux/include/asm-arm/arch-s3c2410/regs-s3c2412.h | ||
2 | * | ||
3 | * Copyright 2007 Simtec Electronics | ||
4 | * http://armlinux.simtec.co.uk/ | ||
5 | * Ben Dooks <ben@simtec.co.uk> | ||
6 | * | ||
7 | * This program is free software; you can redistribute it and/or modify | ||
8 | * it under the terms of the GNU General Public License version 2 as | ||
9 | * published by the Free Software Foundation. | ||
10 | * | ||
11 | * S3C2412 specific register definitions | ||
12 | */ | ||
13 | |||
14 | #ifndef __ASM_ARCH_REGS_S3C2412_H | ||
15 | #define __ASM_ARCH_REGS_S3C2412_H "s3c2412" | ||
16 | |||
17 | #define S3C2412_SWRST (S3C24XX_VA_CLKPWR + 0x30) | ||
18 | #define S3C2412_SWRST_RESET (0x533C2412) | ||
19 | |||
20 | #endif /* __ASM_ARCH_REGS_S3C2412_H */ | ||
21 | |||
diff --git a/include/asm-arm/ioctls.h b/include/asm-arm/ioctls.h index bb9a7aa10c12..a91d8a1523cf 100644 --- a/include/asm-arm/ioctls.h +++ b/include/asm-arm/ioctls.h | |||
@@ -46,6 +46,10 @@ | |||
46 | #define TIOCSBRK 0x5427 /* BSD compatibility */ | 46 | #define TIOCSBRK 0x5427 /* BSD compatibility */ |
47 | #define TIOCCBRK 0x5428 /* BSD compatibility */ | 47 | #define TIOCCBRK 0x5428 /* BSD compatibility */ |
48 | #define TIOCGSID 0x5429 /* Return the session ID of FD */ | 48 | #define TIOCGSID 0x5429 /* Return the session ID of FD */ |
49 | #define TCGETS2 _IOR('T',0x2A, struct termios2) | ||
50 | #define TCSETS2 _IOW('T',0x2B, struct termios2) | ||
51 | #define TCSETSW2 _IOW('T',0x2C, struct termios2) | ||
52 | #define TCSETSF2 _IOW('T',0x2D, struct termios2) | ||
49 | #define TIOCGPTN _IOR('T',0x30, unsigned int) /* Get Pty Number (of pty-mux device) */ | 53 | #define TIOCGPTN _IOR('T',0x30, unsigned int) /* Get Pty Number (of pty-mux device) */ |
50 | #define TIOCSPTLCK _IOW('T',0x31, int) /* Lock/unlock Pty */ | 54 | #define TIOCSPTLCK _IOW('T',0x31, int) /* Lock/unlock Pty */ |
51 | 55 | ||
diff --git a/include/asm-arm/mach/arch.h b/include/asm-arm/mach/arch.h index fd2f9bf4dcc6..c59fad18e73b 100644 --- a/include/asm-arm/mach/arch.h +++ b/include/asm-arm/mach/arch.h | |||
@@ -49,7 +49,7 @@ struct machine_desc { | |||
49 | */ | 49 | */ |
50 | #define MACHINE_START(_type,_name) \ | 50 | #define MACHINE_START(_type,_name) \ |
51 | static const struct machine_desc __mach_desc_##_type \ | 51 | static const struct machine_desc __mach_desc_##_type \ |
52 | __attribute_used__ \ | 52 | __used \ |
53 | __attribute__((__section__(".arch.info.init"))) = { \ | 53 | __attribute__((__section__(".arch.info.init"))) = { \ |
54 | .nr = MACH_TYPE_##_type, \ | 54 | .nr = MACH_TYPE_##_type, \ |
55 | .name = _name, | 55 | .name = _name, |
diff --git a/include/asm-arm/setup.h b/include/asm-arm/setup.h index e5407392afca..7bbf105463f1 100644 --- a/include/asm-arm/setup.h +++ b/include/asm-arm/setup.h | |||
@@ -185,7 +185,7 @@ struct tagtable { | |||
185 | 185 | ||
186 | #ifdef __KERNEL__ | 186 | #ifdef __KERNEL__ |
187 | 187 | ||
188 | #define __tag __attribute_used__ __attribute__((__section__(".taglist.init"))) | 188 | #define __tag __used __attribute__((__section__(".taglist.init"))) |
189 | #define __tagtable(tag, fn) \ | 189 | #define __tagtable(tag, fn) \ |
190 | static struct tagtable __tagtable_##fn __tag = { tag, fn } | 190 | static struct tagtable __tagtable_##fn __tag = { tag, fn } |
191 | 191 | ||
@@ -218,7 +218,7 @@ struct early_params { | |||
218 | }; | 218 | }; |
219 | 219 | ||
220 | #define __early_param(name,fn) \ | 220 | #define __early_param(name,fn) \ |
221 | static struct early_params __early_##fn __attribute_used__ \ | 221 | static struct early_params __early_##fn __used \ |
222 | __attribute__((__section__(".early_param.init"))) = { name, fn } | 222 | __attribute__((__section__(".early_param.init"))) = { name, fn } |
223 | 223 | ||
224 | #endif /* __KERNEL__ */ | 224 | #endif /* __KERNEL__ */ |
diff --git a/include/asm-arm/termbits.h b/include/asm-arm/termbits.h index a3f4fe1742d0..f784d11f40b5 100644 --- a/include/asm-arm/termbits.h +++ b/include/asm-arm/termbits.h | |||
@@ -15,6 +15,17 @@ struct termios { | |||
15 | cc_t c_cc[NCCS]; /* control characters */ | 15 | cc_t c_cc[NCCS]; /* control characters */ |
16 | }; | 16 | }; |
17 | 17 | ||
18 | struct termios2 { | ||
19 | tcflag_t c_iflag; /* input mode flags */ | ||
20 | tcflag_t c_oflag; /* output mode flags */ | ||
21 | tcflag_t c_cflag; /* control mode flags */ | ||
22 | tcflag_t c_lflag; /* local mode flags */ | ||
23 | cc_t c_line; /* line discipline */ | ||
24 | cc_t c_cc[NCCS]; /* control characters */ | ||
25 | speed_t c_ispeed; /* input speed */ | ||
26 | speed_t c_ospeed; /* output speed */ | ||
27 | }; | ||
28 | |||
18 | struct ktermios { | 29 | struct ktermios { |
19 | tcflag_t c_iflag; /* input mode flags */ | 30 | tcflag_t c_iflag; /* input mode flags */ |
20 | tcflag_t c_oflag; /* output mode flags */ | 31 | tcflag_t c_oflag; /* output mode flags */ |
@@ -128,6 +139,7 @@ struct ktermios { | |||
128 | #define HUPCL 0002000 | 139 | #define HUPCL 0002000 |
129 | #define CLOCAL 0004000 | 140 | #define CLOCAL 0004000 |
130 | #define CBAUDEX 0010000 | 141 | #define CBAUDEX 0010000 |
142 | #define BOTHER 0010000 | ||
131 | #define B57600 0010001 | 143 | #define B57600 0010001 |
132 | #define B115200 0010002 | 144 | #define B115200 0010002 |
133 | #define B230400 0010003 | 145 | #define B230400 0010003 |
@@ -143,10 +155,12 @@ struct ktermios { | |||
143 | #define B3000000 0010015 | 155 | #define B3000000 0010015 |
144 | #define B3500000 0010016 | 156 | #define B3500000 0010016 |
145 | #define B4000000 0010017 | 157 | #define B4000000 0010017 |
146 | #define CIBAUD 002003600000 /* input baud rate (not used) */ | 158 | #define CIBAUD 002003600000 /* input baud rate */ |
147 | #define CMSPAR 010000000000 /* mark or space (stick) parity */ | 159 | #define CMSPAR 010000000000 /* mark or space (stick) parity */ |
148 | #define CRTSCTS 020000000000 /* flow control */ | 160 | #define CRTSCTS 020000000000 /* flow control */ |
149 | 161 | ||
162 | #define IBSHIFT 16 | ||
163 | |||
150 | /* c_lflag bits */ | 164 | /* c_lflag bits */ |
151 | #define ISIG 0000001 | 165 | #define ISIG 0000001 |
152 | #define ICANON 0000002 | 166 | #define ICANON 0000002 |
diff --git a/include/asm-arm/termios.h b/include/asm-arm/termios.h index 329c324c4040..293e3f1bc3f2 100644 --- a/include/asm-arm/termios.h +++ b/include/asm-arm/termios.h | |||
@@ -82,8 +82,10 @@ struct termio { | |||
82 | copy_to_user((termio)->c_cc, (termios)->c_cc, NCC); \ | 82 | copy_to_user((termio)->c_cc, (termios)->c_cc, NCC); \ |
83 | }) | 83 | }) |
84 | 84 | ||
85 | #define user_termios_to_kernel_termios(k, u) copy_from_user(k, u, sizeof(struct termios)) | 85 | #define user_termios_to_kernel_termios(k, u) copy_from_user(k, u, sizeof(struct termios2)) |
86 | #define kernel_termios_to_user_termios(u, k) copy_to_user(u, k, sizeof(struct termios)) | 86 | #define kernel_termios_to_user_termios(u, k) copy_to_user(u, k, sizeof(struct termios2)) |
87 | #define user_termios_to_kernel_termios_1(k, u) copy_from_user(k, u, sizeof(struct termios)) | ||
88 | #define kernel_termios_to_user_termios_1(u, k) copy_to_user(u, k, sizeof(struct termios)) | ||
87 | 89 | ||
88 | #endif /* __KERNEL__ */ | 90 | #endif /* __KERNEL__ */ |
89 | 91 | ||
diff --git a/include/asm-arm/tlbflush.h b/include/asm-arm/tlbflush.h index ccd0de010e81..71be4fded7e2 100644 --- a/include/asm-arm/tlbflush.h +++ b/include/asm-arm/tlbflush.h | |||
@@ -138,6 +138,19 @@ | |||
138 | # define v6wbi_always_flags (-1UL) | 138 | # define v6wbi_always_flags (-1UL) |
139 | #endif | 139 | #endif |
140 | 140 | ||
141 | #ifdef CONFIG_CPU_TLB_V7 | ||
142 | # define v7wbi_possible_flags v6wbi_tlb_flags | ||
143 | # define v7wbi_always_flags v6wbi_tlb_flags | ||
144 | # ifdef _TLB | ||
145 | # define MULTI_TLB 1 | ||
146 | # else | ||
147 | # define _TLB v7wbi | ||
148 | # endif | ||
149 | #else | ||
150 | # define v7wbi_possible_flags 0 | ||
151 | # define v7wbi_always_flags (-1UL) | ||
152 | #endif | ||
153 | |||
141 | #ifndef _TLB | 154 | #ifndef _TLB |
142 | #error Unknown TLB model | 155 | #error Unknown TLB model |
143 | #endif | 156 | #endif |
diff --git a/include/asm-arm26/setup.h b/include/asm-arm26/setup.h index 10fd07c76662..e82562306475 100644 --- a/include/asm-arm26/setup.h +++ b/include/asm-arm26/setup.h | |||
@@ -173,7 +173,7 @@ struct tagtable { | |||
173 | int (*parse)(const struct tag *); | 173 | int (*parse)(const struct tag *); |
174 | }; | 174 | }; |
175 | 175 | ||
176 | #define __tag __attribute_used__ __attribute__((__section__(".taglist"))) | 176 | #define __tag __used __attribute__((__section__(".taglist"))) |
177 | #define __tagtable(tag, fn) \ | 177 | #define __tagtable(tag, fn) \ |
178 | static struct tagtable __tagtable_##fn __tag = { tag, fn } | 178 | static struct tagtable __tagtable_##fn __tag = { tag, fn } |
179 | 179 | ||
diff --git a/include/asm-generic/vmlinux.lds.h b/include/asm-generic/vmlinux.lds.h index 8307b1bb337a..84155eb67f1d 100644 --- a/include/asm-generic/vmlinux.lds.h +++ b/include/asm-generic/vmlinux.lds.h | |||
@@ -14,8 +14,8 @@ | |||
14 | *(.data) \ | 14 | *(.data) \ |
15 | *(.data.init.refok) | 15 | *(.data.init.refok) |
16 | 16 | ||
17 | #define RODATA \ | 17 | #define RO_DATA(align) \ |
18 | . = ALIGN(4096); \ | 18 | . = ALIGN((align)); \ |
19 | .rodata : AT(ADDR(.rodata) - LOAD_OFFSET) { \ | 19 | .rodata : AT(ADDR(.rodata) - LOAD_OFFSET) { \ |
20 | VMLINUX_SYMBOL(__start_rodata) = .; \ | 20 | VMLINUX_SYMBOL(__start_rodata) = .; \ |
21 | *(.rodata) *(.rodata.*) \ | 21 | *(.rodata) *(.rodata.*) \ |
@@ -135,7 +135,11 @@ | |||
135 | VMLINUX_SYMBOL(__end_rodata) = .; \ | 135 | VMLINUX_SYMBOL(__end_rodata) = .; \ |
136 | } \ | 136 | } \ |
137 | \ | 137 | \ |
138 | . = ALIGN(4096); | 138 | . = ALIGN((align)); |
139 | |||
140 | /* RODATA provided for backward compatibility. | ||
141 | * All archs are supposed to use RO_DATA() */ | ||
142 | #define RODATA RO_DATA(4096) | ||
139 | 143 | ||
140 | #define SECURITY_INIT \ | 144 | #define SECURITY_INIT \ |
141 | .security_initcall.init : AT(ADDR(.security_initcall.init) - LOAD_OFFSET) { \ | 145 | .security_initcall.init : AT(ADDR(.security_initcall.init) - LOAD_OFFSET) { \ |
diff --git a/include/asm-h8300/processor.h b/include/asm-h8300/processor.h index 99b664aa2083..49fc886a6232 100644 --- a/include/asm-h8300/processor.h +++ b/include/asm-h8300/processor.h | |||
@@ -78,7 +78,7 @@ struct thread_struct { | |||
78 | do { \ | 78 | do { \ |
79 | set_fs(USER_DS); /* reads from user space */ \ | 79 | set_fs(USER_DS); /* reads from user space */ \ |
80 | (_regs)->pc = (_pc); \ | 80 | (_regs)->pc = (_pc); \ |
81 | (_regs)->ccr &= 0x00; /* clear kernel flag */ \ | 81 | (_regs)->ccr = 0x00; /* clear all flags */ \ |
82 | (_regs)->er5 = current->mm->start_data; /* GOT base */ \ | 82 | (_regs)->er5 = current->mm->start_data; /* GOT base */ \ |
83 | wrusp((unsigned long)(_usp) - sizeof(unsigned long)*3); \ | 83 | wrusp((unsigned long)(_usp) - sizeof(unsigned long)*3); \ |
84 | } while(0) | 84 | } while(0) |
diff --git a/include/asm-m68k/mmzone.h b/include/asm-m68k/mmzone.h new file mode 100644 index 000000000000..e1f1ec7b7006 --- /dev/null +++ b/include/asm-m68k/mmzone.h | |||
@@ -0,0 +1,9 @@ | |||
1 | #ifndef _ASM_M68K_MMZONE_H_ | ||
2 | #define _ASM_M68K_MMZONE_H_ | ||
3 | |||
4 | extern pg_data_t pg_data_map[]; | ||
5 | |||
6 | #define NODE_DATA(nid) (&pg_data_map[nid]) | ||
7 | #define NODE_MEM_MAP(nid) (NODE_DATA(nid)->node_mem_map) | ||
8 | |||
9 | #endif /* _ASM_M68K_MMZONE_H_ */ | ||
diff --git a/include/asm-m68k/module.h b/include/asm-m68k/module.h index c6d75af2d8d3..382d20a6fc18 100644 --- a/include/asm-m68k/module.h +++ b/include/asm-m68k/module.h | |||
@@ -1,7 +1,39 @@ | |||
1 | #ifndef _ASM_M68K_MODULE_H | 1 | #ifndef _ASM_M68K_MODULE_H |
2 | #define _ASM_M68K_MODULE_H | 2 | #define _ASM_M68K_MODULE_H |
3 | struct mod_arch_specific { }; | 3 | |
4 | struct mod_arch_specific { | ||
5 | struct m68k_fixup_info *fixup_start, *fixup_end; | ||
6 | }; | ||
7 | |||
8 | #define MODULE_ARCH_INIT { \ | ||
9 | .fixup_start = __start_fixup, \ | ||
10 | .fixup_end = __stop_fixup, \ | ||
11 | } | ||
12 | |||
4 | #define Elf_Shdr Elf32_Shdr | 13 | #define Elf_Shdr Elf32_Shdr |
5 | #define Elf_Sym Elf32_Sym | 14 | #define Elf_Sym Elf32_Sym |
6 | #define Elf_Ehdr Elf32_Ehdr | 15 | #define Elf_Ehdr Elf32_Ehdr |
16 | |||
17 | |||
18 | enum m68k_fixup_type { | ||
19 | m68k_fixup_memoffset, | ||
20 | m68k_fixup_vnode_shift, | ||
21 | }; | ||
22 | |||
23 | struct m68k_fixup_info { | ||
24 | enum m68k_fixup_type type; | ||
25 | void *addr; | ||
26 | }; | ||
27 | |||
28 | #define m68k_fixup(type, addr) \ | ||
29 | " .section \".m68k_fixup\",\"aw\"\n" \ | ||
30 | " .long " #type "," #addr "\n" \ | ||
31 | " .previous\n" | ||
32 | |||
33 | extern struct m68k_fixup_info __start_fixup[], __stop_fixup[]; | ||
34 | |||
35 | struct module; | ||
36 | extern void module_fixup(struct module *mod, struct m68k_fixup_info *start, | ||
37 | struct m68k_fixup_info *end); | ||
38 | |||
7 | #endif /* _ASM_M68K_MODULE_H */ | 39 | #endif /* _ASM_M68K_MODULE_H */ |
diff --git a/include/asm-m68k/motorola_pgtable.h b/include/asm-m68k/motorola_pgtable.h index 61e4406ed96a..b5b78c01eb6c 100644 --- a/include/asm-m68k/motorola_pgtable.h +++ b/include/asm-m68k/motorola_pgtable.h | |||
@@ -130,7 +130,7 @@ static inline void pgd_set(pgd_t *pgdp, pmd_t *pmdp) | |||
130 | #define pte_present(pte) (pte_val(pte) & (_PAGE_PRESENT | _PAGE_PROTNONE)) | 130 | #define pte_present(pte) (pte_val(pte) & (_PAGE_PRESENT | _PAGE_PROTNONE)) |
131 | #define pte_clear(mm,addr,ptep) ({ pte_val(*(ptep)) = 0; }) | 131 | #define pte_clear(mm,addr,ptep) ({ pte_val(*(ptep)) = 0; }) |
132 | 132 | ||
133 | #define pte_page(pte) (mem_map + ((unsigned long)(__va(pte_val(pte)) - PAGE_OFFSET) >> PAGE_SHIFT)) | 133 | #define pte_page(pte) virt_to_page(__va(pte_val(pte))) |
134 | #define pte_pfn(pte) (pte_val(pte) >> PAGE_SHIFT) | 134 | #define pte_pfn(pte) (pte_val(pte) >> PAGE_SHIFT) |
135 | #define pfn_pte(pfn, prot) __pte(((pfn) << PAGE_SHIFT) | pgprot_val(prot)) | 135 | #define pfn_pte(pfn, prot) __pte(((pfn) << PAGE_SHIFT) | pgprot_val(prot)) |
136 | 136 | ||
@@ -143,7 +143,7 @@ static inline void pgd_set(pgd_t *pgdp, pmd_t *pmdp) | |||
143 | while (--__i >= 0) \ | 143 | while (--__i >= 0) \ |
144 | *__ptr++ = 0; \ | 144 | *__ptr++ = 0; \ |
145 | }) | 145 | }) |
146 | #define pmd_page(pmd) (mem_map + ((unsigned long)(__va(pmd_val(pmd)) - PAGE_OFFSET) >> PAGE_SHIFT)) | 146 | #define pmd_page(pmd) virt_to_page(__va(pmd_val(pmd))) |
147 | 147 | ||
148 | 148 | ||
149 | #define pgd_none(pgd) (!pgd_val(pgd)) | 149 | #define pgd_none(pgd) (!pgd_val(pgd)) |
@@ -223,10 +223,10 @@ static inline pte_t *pte_offset_kernel(pmd_t *pmdp, unsigned long address) | |||
223 | return (pte_t *)__pmd_page(*pmdp) + ((address >> PAGE_SHIFT) & (PTRS_PER_PTE - 1)); | 223 | return (pte_t *)__pmd_page(*pmdp) + ((address >> PAGE_SHIFT) & (PTRS_PER_PTE - 1)); |
224 | } | 224 | } |
225 | 225 | ||
226 | #define pte_offset_map(pmdp,address) ((pte_t *)kmap(pmd_page(*pmdp)) + ((address >> PAGE_SHIFT) & (PTRS_PER_PTE - 1))) | 226 | #define pte_offset_map(pmdp,address) ((pte_t *)__pmd_page(*pmdp) + (((address) >> PAGE_SHIFT) & (PTRS_PER_PTE - 1))) |
227 | #define pte_offset_map_nested(pmdp, address) pte_offset_map(pmdp, address) | 227 | #define pte_offset_map_nested(pmdp, address) pte_offset_map(pmdp, address) |
228 | #define pte_unmap(pte) kunmap(pte) | 228 | #define pte_unmap(pte) ((void)0) |
229 | #define pte_unmap_nested(pte) kunmap(pte) | 229 | #define pte_unmap_nested(pte) ((void)0) |
230 | 230 | ||
231 | /* | 231 | /* |
232 | * Allocate and free page tables. The xxx_kernel() versions are | 232 | * Allocate and free page tables. The xxx_kernel() versions are |
diff --git a/include/asm-m68k/page.h b/include/asm-m68k/page.h index fcc165ddd09e..9e6d0d6debdb 100644 --- a/include/asm-m68k/page.h +++ b/include/asm-m68k/page.h | |||
@@ -27,6 +27,8 @@ | |||
27 | 27 | ||
28 | #ifndef __ASSEMBLY__ | 28 | #ifndef __ASSEMBLY__ |
29 | 29 | ||
30 | #include <asm/module.h> | ||
31 | |||
30 | #define get_user_page(vaddr) __get_free_page(GFP_KERNEL) | 32 | #define get_user_page(vaddr) __get_free_page(GFP_KERNEL) |
31 | #define free_user_page(page, addr) free_page(addr) | 33 | #define free_user_page(page, addr) free_page(addr) |
32 | 34 | ||
@@ -114,18 +116,33 @@ typedef struct { unsigned long pgprot; } pgprot_t; | |||
114 | 116 | ||
115 | #ifndef __ASSEMBLY__ | 117 | #ifndef __ASSEMBLY__ |
116 | 118 | ||
119 | extern unsigned long m68k_memoffset; | ||
120 | |||
117 | #ifndef CONFIG_SUN3 | 121 | #ifndef CONFIG_SUN3 |
118 | 122 | ||
119 | #define WANT_PAGE_VIRTUAL | 123 | #define WANT_PAGE_VIRTUAL |
120 | #ifdef CONFIG_SINGLE_MEMORY_CHUNK | ||
121 | extern unsigned long m68k_memoffset; | ||
122 | 124 | ||
123 | #define __pa(vaddr) ((unsigned long)(vaddr)+m68k_memoffset) | 125 | static inline unsigned long ___pa(void *vaddr) |
124 | #define __va(paddr) ((void *)((unsigned long)(paddr)-m68k_memoffset)) | 126 | { |
125 | #else | 127 | unsigned long paddr; |
126 | #define __pa(vaddr) virt_to_phys((void *)(vaddr)) | 128 | asm ( |
127 | #define __va(paddr) phys_to_virt((unsigned long)(paddr)) | 129 | "1: addl #0,%0\n" |
128 | #endif | 130 | m68k_fixup(%c2, 1b+2) |
131 | : "=r" (paddr) | ||
132 | : "0" (vaddr), "i" (m68k_fixup_memoffset)); | ||
133 | return paddr; | ||
134 | } | ||
135 | #define __pa(vaddr) ___pa((void *)(vaddr)) | ||
136 | static inline void *__va(unsigned long paddr) | ||
137 | { | ||
138 | void *vaddr; | ||
139 | asm ( | ||
140 | "1: subl #0,%0\n" | ||
141 | m68k_fixup(%c2, 1b+2) | ||
142 | : "=r" (vaddr) | ||
143 | : "0" (paddr), "i" (m68k_fixup_memoffset)); | ||
144 | return vaddr; | ||
145 | } | ||
129 | 146 | ||
130 | #else /* !CONFIG_SUN3 */ | 147 | #else /* !CONFIG_SUN3 */ |
131 | /* This #define is a horrible hack to suppress lots of warnings. --m */ | 148 | /* This #define is a horrible hack to suppress lots of warnings. --m */ |
@@ -161,11 +178,47 @@ static inline void *__va(unsigned long x) | |||
161 | #define virt_to_pfn(kaddr) (__pa(kaddr) >> PAGE_SHIFT) | 178 | #define virt_to_pfn(kaddr) (__pa(kaddr) >> PAGE_SHIFT) |
162 | #define pfn_to_virt(pfn) __va((pfn) << PAGE_SHIFT) | 179 | #define pfn_to_virt(pfn) __va((pfn) << PAGE_SHIFT) |
163 | 180 | ||
164 | #define virt_to_page(kaddr) (mem_map + (((unsigned long)(kaddr)-PAGE_OFFSET) >> PAGE_SHIFT)) | 181 | extern int m68k_virt_to_node_shift; |
165 | #define page_to_virt(page) ((((page) - mem_map) << PAGE_SHIFT) + PAGE_OFFSET) | 182 | |
183 | #ifdef CONFIG_SINGLE_MEMORY_CHUNK | ||
184 | #define __virt_to_node(addr) (&pg_data_map[0]) | ||
185 | #else | ||
186 | extern struct pglist_data *pg_data_table[]; | ||
187 | |||
188 | static inline __attribute_const__ int __virt_to_node_shift(void) | ||
189 | { | ||
190 | int shift; | ||
191 | |||
192 | asm ( | ||
193 | "1: moveq #0,%0\n" | ||
194 | m68k_fixup(%c1, 1b) | ||
195 | : "=d" (shift) | ||
196 | : "i" (m68k_fixup_vnode_shift)); | ||
197 | return shift; | ||
198 | } | ||
199 | |||
200 | #define __virt_to_node(addr) (pg_data_table[(unsigned long)(addr) >> __virt_to_node_shift()]) | ||
201 | #endif | ||
166 | 202 | ||
167 | #define pfn_to_page(pfn) virt_to_page(pfn_to_virt(pfn)) | 203 | #define virt_to_page(addr) ({ \ |
168 | #define page_to_pfn(page) virt_to_pfn(page_to_virt(page)) | 204 | pfn_to_page(virt_to_pfn(addr)); \ |
205 | }) | ||
206 | #define page_to_virt(page) ({ \ | ||
207 | pfn_to_virt(page_to_pfn(page)); \ | ||
208 | }) | ||
209 | |||
210 | #define pfn_to_page(pfn) ({ \ | ||
211 | unsigned long __pfn = (pfn); \ | ||
212 | struct pglist_data *pgdat; \ | ||
213 | pgdat = __virt_to_node((unsigned long)pfn_to_virt(__pfn)); \ | ||
214 | pgdat->node_mem_map + (__pfn - pgdat->node_start_pfn); \ | ||
215 | }) | ||
216 | #define page_to_pfn(_page) ({ \ | ||
217 | struct page *__p = (_page); \ | ||
218 | struct pglist_data *pgdat; \ | ||
219 | pgdat = &pg_data_map[page_to_nid(__p)]; \ | ||
220 | ((__p) - pgdat->node_mem_map) + pgdat->node_start_pfn; \ | ||
221 | }) | ||
169 | 222 | ||
170 | #define virt_addr_valid(kaddr) ((void *)(kaddr) >= (void *)PAGE_OFFSET && (void *)(kaddr) < high_memory) | 223 | #define virt_addr_valid(kaddr) ((void *)(kaddr) >= (void *)PAGE_OFFSET && (void *)(kaddr) < high_memory) |
171 | #define pfn_valid(pfn) virt_addr_valid(pfn_to_virt(pfn)) | 224 | #define pfn_valid(pfn) virt_addr_valid(pfn_to_virt(pfn)) |
diff --git a/include/asm-m68k/pgalloc.h b/include/asm-m68k/pgalloc.h index a9cfb4b99d88..4cb1a57ab763 100644 --- a/include/asm-m68k/pgalloc.h +++ b/include/asm-m68k/pgalloc.h | |||
@@ -8,11 +8,12 @@ | |||
8 | #include <asm/virtconvert.h> | 8 | #include <asm/virtconvert.h> |
9 | 9 | ||
10 | 10 | ||
11 | |||
12 | #ifdef CONFIG_SUN3 | 11 | #ifdef CONFIG_SUN3 |
13 | #include <asm/sun3_pgalloc.h> | 12 | #include <asm/sun3_pgalloc.h> |
14 | #else | 13 | #else |
15 | #include <asm/motorola_pgalloc.h> | 14 | #include <asm/motorola_pgalloc.h> |
16 | #endif | 15 | #endif |
17 | 16 | ||
17 | extern void m68k_setup_node(int node); | ||
18 | |||
18 | #endif /* M68K_PGALLOC_H */ | 19 | #endif /* M68K_PGALLOC_H */ |
diff --git a/include/asm-m68k/pgtable.h b/include/asm-m68k/pgtable.h index 555b87a1f7e3..778a4c538eb2 100644 --- a/include/asm-m68k/pgtable.h +++ b/include/asm-m68k/pgtable.h | |||
@@ -107,22 +107,7 @@ extern void *empty_zero_page; | |||
107 | /* 64-bit machines, beware! SRB. */ | 107 | /* 64-bit machines, beware! SRB. */ |
108 | #define SIZEOF_PTR_LOG2 2 | 108 | #define SIZEOF_PTR_LOG2 2 |
109 | 109 | ||
110 | /* | 110 | #define mm_end_of_chunk(addr, len) 0 |
111 | * Check if the addr/len goes up to the end of a physical | ||
112 | * memory chunk. Used for DMA functions. | ||
113 | */ | ||
114 | #ifdef CONFIG_SINGLE_MEMORY_CHUNK | ||
115 | /* | ||
116 | * It makes no sense to consider whether we cross a memory boundary if | ||
117 | * we support just one physical chunk of memory. | ||
118 | */ | ||
119 | static inline int mm_end_of_chunk(unsigned long addr, int len) | ||
120 | { | ||
121 | return 0; | ||
122 | } | ||
123 | #else | ||
124 | int mm_end_of_chunk (unsigned long addr, int len); | ||
125 | #endif | ||
126 | 111 | ||
127 | extern void kernel_set_cachemode(void *addr, unsigned long size, int cmode); | 112 | extern void kernel_set_cachemode(void *addr, unsigned long size, int cmode); |
128 | 113 | ||
diff --git a/include/asm-m68k/sun3_pgtable.h b/include/asm-m68k/sun3_pgtable.h index 5156a28a18d8..b9e62c1e7ae3 100644 --- a/include/asm-m68k/sun3_pgtable.h +++ b/include/asm-m68k/sun3_pgtable.h | |||
@@ -132,8 +132,8 @@ static inline void pte_clear (struct mm_struct *mm, unsigned long addr, pte_t *p | |||
132 | #define pfn_pte(pfn, pgprot) \ | 132 | #define pfn_pte(pfn, pgprot) \ |
133 | ({ pte_t __pte; pte_val(__pte) = pfn | pgprot_val(pgprot); __pte; }) | 133 | ({ pte_t __pte; pte_val(__pte) = pfn | pgprot_val(pgprot); __pte; }) |
134 | 134 | ||
135 | #define pte_page(pte) (mem_map+((__pte_page(pte) - PAGE_OFFSET) >> PAGE_SHIFT)) | 135 | #define pte_page(pte) virt_to_page(__pte_page(pte)) |
136 | #define pmd_page(pmd) (mem_map+((__pmd_page(pmd) - PAGE_OFFSET) >> PAGE_SHIFT)) | 136 | #define pmd_page(pmd) virt_to_page(__pmd_page(pmd)) |
137 | 137 | ||
138 | 138 | ||
139 | static inline int pmd_none2 (pmd_t *pmd) { return !pmd_val (*pmd); } | 139 | static inline int pmd_none2 (pmd_t *pmd) { return !pmd_val (*pmd); } |
diff --git a/include/asm-m68k/virtconvert.h b/include/asm-m68k/virtconvert.h index 83a87c9b1a16..dea32fbc7e51 100644 --- a/include/asm-m68k/virtconvert.h +++ b/include/asm-m68k/virtconvert.h | |||
@@ -8,56 +8,35 @@ | |||
8 | #ifdef __KERNEL__ | 8 | #ifdef __KERNEL__ |
9 | 9 | ||
10 | #include <linux/compiler.h> | 10 | #include <linux/compiler.h> |
11 | #include <linux/mmzone.h> | ||
11 | #include <asm/setup.h> | 12 | #include <asm/setup.h> |
12 | #include <asm/page.h> | 13 | #include <asm/page.h> |
13 | 14 | ||
14 | #ifdef CONFIG_AMIGA | ||
15 | #include <asm/amigahw.h> | ||
16 | #endif | ||
17 | |||
18 | /* | 15 | /* |
19 | * Change virtual addresses to physical addresses and vv. | 16 | * Change virtual addresses to physical addresses and vv. |
20 | */ | 17 | */ |
21 | #ifndef CONFIG_SUN3 | ||
22 | extern unsigned long mm_vtop(unsigned long addr) __attribute_const__; | ||
23 | extern unsigned long mm_ptov(unsigned long addr) __attribute_const__; | ||
24 | #else | ||
25 | static inline unsigned long mm_vtop(unsigned long vaddr) | ||
26 | { | ||
27 | return __pa(vaddr); | ||
28 | } | ||
29 | |||
30 | static inline unsigned long mm_ptov(unsigned long paddr) | ||
31 | { | ||
32 | return (unsigned long)__va(paddr); | ||
33 | } | ||
34 | #endif | ||
35 | |||
36 | #ifdef CONFIG_SINGLE_MEMORY_CHUNK | ||
37 | static inline unsigned long virt_to_phys(void *vaddr) | ||
38 | { | ||
39 | return (unsigned long)vaddr - PAGE_OFFSET + m68k_memory[0].addr; | ||
40 | } | ||
41 | |||
42 | static inline void * phys_to_virt(unsigned long paddr) | ||
43 | { | ||
44 | return (void *)(paddr - m68k_memory[0].addr + PAGE_OFFSET); | ||
45 | } | ||
46 | #else | ||
47 | static inline unsigned long virt_to_phys(void *address) | 18 | static inline unsigned long virt_to_phys(void *address) |
48 | { | 19 | { |
49 | return mm_vtop((unsigned long)address); | 20 | return __pa(address); |
50 | } | 21 | } |
51 | 22 | ||
52 | static inline void *phys_to_virt(unsigned long address) | 23 | static inline void *phys_to_virt(unsigned long address) |
53 | { | 24 | { |
54 | return (void *) mm_ptov(address); | 25 | return __va(address); |
55 | } | 26 | } |
56 | #endif | ||
57 | 27 | ||
58 | /* Permanent address of a page. */ | 28 | /* Permanent address of a page. */ |
59 | #define __page_address(page) (PAGE_OFFSET + (((page) - mem_map) << PAGE_SHIFT)) | 29 | #ifdef CONFIG_SINGLE_MEMORY_CHUNK |
60 | #define page_to_phys(page) virt_to_phys((void *)__page_address(page)) | 30 | #define page_to_phys(page) \ |
31 | __pa(PAGE_OFFSET + (((page) - pg_data_map[0].node_mem_map) << PAGE_SHIFT)) | ||
32 | #else | ||
33 | #define page_to_phys(_page) ({ \ | ||
34 | struct page *__page = _page; \ | ||
35 | struct pglist_data *pgdat; \ | ||
36 | pgdat = pg_data_table[page_to_nid(__page)]; \ | ||
37 | page_to_pfn(__page) << PAGE_SHIFT; \ | ||
38 | }) | ||
39 | #endif | ||
61 | 40 | ||
62 | /* | 41 | /* |
63 | * IO bus memory addresses are 1:1 with the physical address, | 42 | * IO bus memory addresses are 1:1 with the physical address, |
diff --git a/include/asm-powerpc/pgalloc-64.h b/include/asm-powerpc/pgalloc-64.h index d9a3a8ca58a1..94d0294341d6 100644 --- a/include/asm-powerpc/pgalloc-64.h +++ b/include/asm-powerpc/pgalloc-64.h | |||
@@ -90,7 +90,8 @@ static inline pte_t *pte_alloc_one_kernel(struct mm_struct *mm, | |||
90 | static inline struct page *pte_alloc_one(struct mm_struct *mm, | 90 | static inline struct page *pte_alloc_one(struct mm_struct *mm, |
91 | unsigned long address) | 91 | unsigned long address) |
92 | { | 92 | { |
93 | return virt_to_page(pte_alloc_one_kernel(mm, address)); | 93 | pte_t *pte = pte_alloc_one_kernel(mm, address); |
94 | return pte ? virt_to_page(pte) : NULL; | ||
94 | } | 95 | } |
95 | 96 | ||
96 | static inline void pte_free_kernel(pte_t *pte) | 97 | static inline void pte_free_kernel(pte_t *pte) |
diff --git a/include/asm-powerpc/tlb.h b/include/asm-powerpc/tlb.h index 0a17682663d8..66714042e438 100644 --- a/include/asm-powerpc/tlb.h +++ b/include/asm-powerpc/tlb.h | |||
@@ -38,6 +38,15 @@ extern void pte_free_finish(void); | |||
38 | 38 | ||
39 | static inline void tlb_flush(struct mmu_gather *tlb) | 39 | static inline void tlb_flush(struct mmu_gather *tlb) |
40 | { | 40 | { |
41 | struct ppc64_tlb_batch *tlbbatch = &__get_cpu_var(ppc64_tlb_batch); | ||
42 | |||
43 | /* If there's a TLB batch pending, then we must flush it because the | ||
44 | * pages are going to be freed and we really don't want to have a CPU | ||
45 | * access a freed page because it has a stale TLB | ||
46 | */ | ||
47 | if (tlbbatch->index) | ||
48 | __flush_tlb_pending(tlbbatch); | ||
49 | |||
41 | pte_free_finish(); | 50 | pte_free_finish(); |
42 | } | 51 | } |
43 | 52 | ||
diff --git a/include/asm-sh/cpu-sh4/freq.h b/include/asm-sh/cpu-sh4/freq.h index 86564e7a26ae..39f41fcd509d 100644 --- a/include/asm-sh/cpu-sh4/freq.h +++ b/include/asm-sh/cpu-sh4/freq.h | |||
@@ -24,6 +24,9 @@ | |||
24 | #define FRQMR1 0xffc80014 | 24 | #define FRQMR1 0xffc80014 |
25 | #else | 25 | #else |
26 | #define FRQCR 0xffc00000 | 26 | #define FRQCR 0xffc00000 |
27 | #define FRQCR_PSTBY 0x0200 | ||
28 | #define FRQCR_PLLEN 0x0400 | ||
29 | #define FRQCR_CKOEN 0x0800 | ||
27 | #endif | 30 | #endif |
28 | #define MIN_DIVISOR_NR 0 | 31 | #define MIN_DIVISOR_NR 0 |
29 | #define MAX_DIVISOR_NR 3 | 32 | #define MAX_DIVISOR_NR 3 |
diff --git a/include/asm-sh/dma.h b/include/asm-sh/dma.h index faf3051cd429..6034d4a29e73 100644 --- a/include/asm-sh/dma.h +++ b/include/asm-sh/dma.h | |||
@@ -13,6 +13,7 @@ | |||
13 | 13 | ||
14 | #include <linux/spinlock.h> | 14 | #include <linux/spinlock.h> |
15 | #include <linux/wait.h> | 15 | #include <linux/wait.h> |
16 | #include <linux/sched.h> | ||
16 | #include <linux/sysdev.h> | 17 | #include <linux/sysdev.h> |
17 | #include <asm/cpu/dma.h> | 18 | #include <asm/cpu/dma.h> |
18 | 19 | ||
diff --git a/include/asm-sh/io.h b/include/asm-sh/io.h index a0e55b09e4fd..aa80930ce8e4 100644 --- a/include/asm-sh/io.h +++ b/include/asm-sh/io.h | |||
@@ -116,13 +116,13 @@ void __raw_readsl(unsigned long addr, void *data, int longlen); | |||
116 | * redefined by userlevel programs. | 116 | * redefined by userlevel programs. |
117 | */ | 117 | */ |
118 | #ifdef __readb | 118 | #ifdef __readb |
119 | # define readb(a) ({ unsigned long r_ = __raw_readb(a); mb(); r_; }) | 119 | # define readb(a) ({ unsigned int r_ = __raw_readb(a); mb(); r_; }) |
120 | #endif | 120 | #endif |
121 | #ifdef __raw_readw | 121 | #ifdef __raw_readw |
122 | # define readw(a) ({ unsigned long r_ = __raw_readw(a); mb(); r_; }) | 122 | # define readw(a) ({ unsigned int r_ = __raw_readw(a); mb(); r_; }) |
123 | #endif | 123 | #endif |
124 | #ifdef __raw_readl | 124 | #ifdef __raw_readl |
125 | # define readl(a) ({ unsigned long r_ = __raw_readl(a); mb(); r_; }) | 125 | # define readl(a) ({ unsigned int r_ = __raw_readl(a); mb(); r_; }) |
126 | #endif | 126 | #endif |
127 | 127 | ||
128 | #ifdef __raw_writeb | 128 | #ifdef __raw_writeb |
diff --git a/include/asm-sh/smp.h b/include/asm-sh/smp.h index 71ecddf70db3..caa7b93f1bce 100644 --- a/include/asm-sh/smp.h +++ b/include/asm-sh/smp.h | |||
@@ -15,7 +15,7 @@ | |||
15 | 15 | ||
16 | #ifdef CONFIG_SMP | 16 | #ifdef CONFIG_SMP |
17 | 17 | ||
18 | #include <asm/spinlock.h> | 18 | #include <linux/spinlock.h> |
19 | #include <asm/atomic.h> | 19 | #include <asm/atomic.h> |
20 | #include <asm/current.h> | 20 | #include <asm/current.h> |
21 | 21 | ||
diff --git a/include/asm-sh/spinlock.h b/include/asm-sh/spinlock.h index 2586eef07d57..92f6e2008b2e 100644 --- a/include/asm-sh/spinlock.h +++ b/include/asm-sh/spinlock.h | |||
@@ -11,6 +11,7 @@ | |||
11 | #define __ASM_SH_SPINLOCK_H | 11 | #define __ASM_SH_SPINLOCK_H |
12 | 12 | ||
13 | #include <asm/atomic.h> | 13 | #include <asm/atomic.h> |
14 | #include <asm/spinlock_types.h> | ||
14 | 15 | ||
15 | /* | 16 | /* |
16 | * Your basic SMP spinlocks, allowing only a single CPU anywhere | 17 | * Your basic SMP spinlocks, allowing only a single CPU anywhere |
@@ -42,7 +43,7 @@ static inline void __raw_spin_lock(raw_spinlock_t *lock) | |||
42 | 43 | ||
43 | static inline void __raw_spin_unlock(raw_spinlock_t *lock) | 44 | static inline void __raw_spin_unlock(raw_spinlock_t *lock) |
44 | { | 45 | { |
45 | assert_spin_locked(lock); | 46 | //assert_spin_locked(lock); |
46 | 47 | ||
47 | lock->lock = 0; | 48 | lock->lock = 0; |
48 | } | 49 | } |
@@ -88,6 +89,11 @@ static inline void __raw_write_unlock(raw_rwlock_t *rw) | |||
88 | __raw_spin_unlock(&rw->lock); | 89 | __raw_spin_unlock(&rw->lock); |
89 | } | 90 | } |
90 | 91 | ||
92 | static inline int __raw_write_can_lock(raw_rwlock_t *rw) | ||
93 | { | ||
94 | return (atomic_read(&rw->counter) == RW_LOCK_BIAS); | ||
95 | } | ||
96 | |||
91 | static inline int __raw_read_trylock(raw_rwlock_t *lock) | 97 | static inline int __raw_read_trylock(raw_rwlock_t *lock) |
92 | { | 98 | { |
93 | atomic_t *count = (atomic_t*)lock; | 99 | atomic_t *count = (atomic_t*)lock; |
diff --git a/include/asm-sh/spinlock_types.h b/include/asm-sh/spinlock_types.h index 8c41b6c3aac8..5c58134f2c4e 100644 --- a/include/asm-sh/spinlock_types.h +++ b/include/asm-sh/spinlock_types.h | |||
@@ -9,7 +9,9 @@ typedef struct { | |||
9 | volatile unsigned long lock; | 9 | volatile unsigned long lock; |
10 | } raw_spinlock_t; | 10 | } raw_spinlock_t; |
11 | 11 | ||
12 | #define __SPIN_LOCK_UNLOCKED { 0 } | 12 | #define __RAW_SPIN_LOCK_UNLOCKED { 1 } |
13 | |||
14 | #include <asm/atomic.h> | ||
13 | 15 | ||
14 | typedef struct { | 16 | typedef struct { |
15 | raw_spinlock_t lock; | 17 | raw_spinlock_t lock; |
diff --git a/include/asm-sparc64/hypervisor.h b/include/asm-sparc64/hypervisor.h index 5cdb1ff04838..4a43075a0619 100644 --- a/include/asm-sparc64/hypervisor.h +++ b/include/asm-sparc64/hypervisor.h | |||
@@ -1097,6 +1097,80 @@ extern unsigned long sun4v_mach_set_soft_state(unsigned long soft_state, | |||
1097 | */ | 1097 | */ |
1098 | #define HV_FAST_MACH_GET_SOFT_STATE 0x71 | 1098 | #define HV_FAST_MACH_GET_SOFT_STATE 0x71 |
1099 | 1099 | ||
1100 | /* svc_send() | ||
1101 | * TRAP: HV_FAST_TRAP | ||
1102 | * FUNCTION: HV_FAST_SVC_SEND | ||
1103 | * ARG0: service ID | ||
1104 | * ARG1: buffer real address | ||
1105 | * ARG2: buffer size | ||
1106 | * RET0: STATUS | ||
1107 | * RET1: sent_bytes | ||
1108 | * | ||
1109 | * Be careful, all output registers are clobbered by this operation, | ||
1110 | * so for example it is not possible to save away a value in %o4 | ||
1111 | * across the trap. | ||
1112 | */ | ||
1113 | #define HV_FAST_SVC_SEND 0x80 | ||
1114 | |||
1115 | /* svc_recv() | ||
1116 | * TRAP: HV_FAST_TRAP | ||
1117 | * FUNCTION: HV_FAST_SVC_RECV | ||
1118 | * ARG0: service ID | ||
1119 | * ARG1: buffer real address | ||
1120 | * ARG2: buffer size | ||
1121 | * RET0: STATUS | ||
1122 | * RET1: recv_bytes | ||
1123 | * | ||
1124 | * Be careful, all output registers are clobbered by this operation, | ||
1125 | * so for example it is not possible to save away a value in %o4 | ||
1126 | * across the trap. | ||
1127 | */ | ||
1128 | #define HV_FAST_SVC_RECV 0x81 | ||
1129 | |||
1130 | /* svc_getstatus() | ||
1131 | * TRAP: HV_FAST_TRAP | ||
1132 | * FUNCTION: HV_FAST_SVC_GETSTATUS | ||
1133 | * ARG0: service ID | ||
1134 | * RET0: STATUS | ||
1135 | * RET1: status bits | ||
1136 | */ | ||
1137 | #define HV_FAST_SVC_GETSTATUS 0x82 | ||
1138 | |||
1139 | /* svc_setstatus() | ||
1140 | * TRAP: HV_FAST_TRAP | ||
1141 | * FUNCTION: HV_FAST_SVC_SETSTATUS | ||
1142 | * ARG0: service ID | ||
1143 | * ARG1: bits to set | ||
1144 | * RET0: STATUS | ||
1145 | */ | ||
1146 | #define HV_FAST_SVC_SETSTATUS 0x83 | ||
1147 | |||
1148 | /* svc_clrstatus() | ||
1149 | * TRAP: HV_FAST_TRAP | ||
1150 | * FUNCTION: HV_FAST_SVC_CLRSTATUS | ||
1151 | * ARG0: service ID | ||
1152 | * ARG1: bits to clear | ||
1153 | * RET0: STATUS | ||
1154 | */ | ||
1155 | #define HV_FAST_SVC_CLRSTATUS 0x84 | ||
1156 | |||
1157 | #ifndef __ASSEMBLY__ | ||
1158 | extern unsigned long sun4v_svc_send(unsigned long svc_id, | ||
1159 | unsigned long buffer, | ||
1160 | unsigned long buffer_size, | ||
1161 | unsigned long *sent_bytes); | ||
1162 | extern unsigned long sun4v_svc_recv(unsigned long svc_id, | ||
1163 | unsigned long buffer, | ||
1164 | unsigned long buffer_size, | ||
1165 | unsigned long *recv_bytes); | ||
1166 | extern unsigned long sun4v_svc_getstatus(unsigned long svc_id, | ||
1167 | unsigned long *status_bits); | ||
1168 | extern unsigned long sun4v_svc_setstatus(unsigned long svc_id, | ||
1169 | unsigned long status_bits); | ||
1170 | extern unsigned long sun4v_svc_clrstatus(unsigned long svc_id, | ||
1171 | unsigned long status_bits); | ||
1172 | #endif | ||
1173 | |||
1100 | /* Trap trace services. | 1174 | /* Trap trace services. |
1101 | * | 1175 | * |
1102 | * The hypervisor provides a trap tracing capability for privileged | 1176 | * The hypervisor provides a trap tracing capability for privileged |
@@ -2724,6 +2798,100 @@ struct hv_mmu_statistics { | |||
2724 | */ | 2798 | */ |
2725 | #define HV_FAST_MMUSTAT_INFO 0x103 | 2799 | #define HV_FAST_MMUSTAT_INFO 0x103 |
2726 | 2800 | ||
2801 | /* NCS crypto services */ | ||
2802 | |||
2803 | /* ncs_request() sub-function numbers */ | ||
2804 | #define HV_NCS_QCONF 0x01 | ||
2805 | #define HV_NCS_QTAIL_UPDATE 0x02 | ||
2806 | |||
2807 | #ifndef __ASSEMBLY__ | ||
2808 | struct hv_ncs_queue_entry { | ||
2809 | /* MAU Control Register */ | ||
2810 | unsigned long mau_control; | ||
2811 | #define MAU_CONTROL_INV_PARITY 0x0000000000002000 | ||
2812 | #define MAU_CONTROL_STRAND 0x0000000000001800 | ||
2813 | #define MAU_CONTROL_BUSY 0x0000000000000400 | ||
2814 | #define MAU_CONTROL_INT 0x0000000000000200 | ||
2815 | #define MAU_CONTROL_OP 0x00000000000001c0 | ||
2816 | #define MAU_CONTROL_OP_SHIFT 6 | ||
2817 | #define MAU_OP_LOAD_MA_MEMORY 0x0 | ||
2818 | #define MAU_OP_STORE_MA_MEMORY 0x1 | ||
2819 | #define MAU_OP_MODULAR_MULT 0x2 | ||
2820 | #define MAU_OP_MODULAR_REDUCE 0x3 | ||
2821 | #define MAU_OP_MODULAR_EXP_LOOP 0x4 | ||
2822 | #define MAU_CONTROL_LEN 0x000000000000003f | ||
2823 | #define MAU_CONTROL_LEN_SHIFT 0 | ||
2824 | |||
2825 | /* Real address of bytes to load or store bytes | ||
2826 | * into/out-of the MAU. | ||
2827 | */ | ||
2828 | unsigned long mau_mpa; | ||
2829 | |||
2830 | /* Modular Arithmetic MA Offset Register. */ | ||
2831 | unsigned long mau_ma; | ||
2832 | |||
2833 | /* Modular Arithmetic N Prime Register. */ | ||
2834 | unsigned long mau_np; | ||
2835 | }; | ||
2836 | |||
2837 | struct hv_ncs_qconf_arg { | ||
2838 | unsigned long mid; /* MAU ID, 1 per core on Niagara */ | ||
2839 | unsigned long base; /* Real address base of queue */ | ||
2840 | unsigned long end; /* Real address end of queue */ | ||
2841 | unsigned long num_ents; /* Number of entries in queue */ | ||
2842 | }; | ||
2843 | |||
2844 | struct hv_ncs_qtail_update_arg { | ||
2845 | unsigned long mid; /* MAU ID, 1 per core on Niagara */ | ||
2846 | unsigned long tail; /* New tail index to use */ | ||
2847 | unsigned long syncflag; /* only SYNCFLAG_SYNC is implemented */ | ||
2848 | #define HV_NCS_SYNCFLAG_SYNC 0x00 | ||
2849 | #define HV_NCS_SYNCFLAG_ASYNC 0x01 | ||
2850 | }; | ||
2851 | #endif | ||
2852 | |||
2853 | /* ncs_request() | ||
2854 | * TRAP: HV_FAST_TRAP | ||
2855 | * FUNCTION: HV_FAST_NCS_REQUEST | ||
2856 | * ARG0: NCS sub-function | ||
2857 | * ARG1: sub-function argument real address | ||
2858 | * ARG2: size in bytes of sub-function argument | ||
2859 | * RET0: status | ||
2860 | * | ||
2861 | * The MAU chip of the Niagara processor is not directly accessible | ||
2862 | * to privileged code, instead it is programmed indirectly via this | ||
2863 | * hypervisor API. | ||
2864 | * | ||
2865 | * The interfaces defines a queue of MAU operations to perform. | ||
2866 | * Privileged code registers a queue with the hypervisor by invoking | ||
2867 | * this HVAPI with the HV_NCS_QCONF sub-function, which defines the | ||
2868 | * base, end, and number of entries of the queue. Each queue entry | ||
2869 | * contains a MAU register struct block. | ||
2870 | * | ||
2871 | * The privileged code then proceeds to add entries to the queue and | ||
2872 | * then invoke the HV_NCS_QTAIL_UPDATE sub-function. Since only | ||
2873 | * synchronous operations are supported by the current hypervisor, | ||
2874 | * HV_NCS_QTAIL_UPDATE will run all the pending queue entries to | ||
2875 | * completion and return HV_EOK, or return an error code. | ||
2876 | * | ||
2877 | * The real address of the sub-function argument must be aligned on at | ||
2878 | * least an 8-byte boundary. | ||
2879 | * | ||
2880 | * The tail argument of HV_NCS_QTAIL_UPDATE is an index, not a byte | ||
2881 | * offset, into the queue and must be less than or equal the 'num_ents' | ||
2882 | * argument given in the HV_NCS_QCONF call. | ||
2883 | */ | ||
2884 | #define HV_FAST_NCS_REQUEST 0x110 | ||
2885 | |||
2886 | #ifndef __ASSEMBLY__ | ||
2887 | extern unsigned long sun4v_ncs_request(unsigned long request, | ||
2888 | unsigned long arg_ra, | ||
2889 | unsigned long arg_size); | ||
2890 | #endif | ||
2891 | |||
2892 | #define HV_FAST_FIRE_GET_PERFREG 0x120 | ||
2893 | #define HV_FAST_FIRE_SET_PERFREG 0x121 | ||
2894 | |||
2727 | /* Function numbers for HV_CORE_TRAP. */ | 2895 | /* Function numbers for HV_CORE_TRAP. */ |
2728 | #define HV_CORE_SET_VER 0x00 | 2896 | #define HV_CORE_SET_VER 0x00 |
2729 | #define HV_CORE_PUTCHAR 0x01 | 2897 | #define HV_CORE_PUTCHAR 0x01 |
diff --git a/include/linux/Kbuild b/include/linux/Kbuild index e1013156c25e..f317c270d4bf 100644 --- a/include/linux/Kbuild +++ b/include/linux/Kbuild | |||
@@ -62,6 +62,8 @@ header-y += fadvise.h | |||
62 | header-y += fd.h | 62 | header-y += fd.h |
63 | header-y += fdreg.h | 63 | header-y += fdreg.h |
64 | header-y += fib_rules.h | 64 | header-y += fib_rules.h |
65 | header-y += firewire-cdev.h | ||
66 | header-y += firewire-constants.h | ||
65 | header-y += fuse.h | 67 | header-y += fuse.h |
66 | header-y += genetlink.h | 68 | header-y += genetlink.h |
67 | header-y += gen_stats.h | 69 | header-y += gen_stats.h |
diff --git a/include/linux/bootmem.h b/include/linux/bootmem.h index 0365ec9fc0c9..c83534ee1e79 100644 --- a/include/linux/bootmem.h +++ b/include/linux/bootmem.h | |||
@@ -59,6 +59,7 @@ extern void *__alloc_bootmem_core(struct bootmem_data *bdata, | |||
59 | unsigned long align, | 59 | unsigned long align, |
60 | unsigned long goal, | 60 | unsigned long goal, |
61 | unsigned long limit); | 61 | unsigned long limit); |
62 | extern void *alloc_bootmem_high_node(pg_data_t *pgdat, unsigned long size); | ||
62 | 63 | ||
63 | #ifndef CONFIG_HAVE_ARCH_BOOTMEM_NODE | 64 | #ifndef CONFIG_HAVE_ARCH_BOOTMEM_NODE |
64 | extern void reserve_bootmem(unsigned long addr, unsigned long size); | 65 | extern void reserve_bootmem(unsigned long addr, unsigned long size); |
diff --git a/include/linux/errno.h b/include/linux/errno.h index d90b80f9b28c..46685832ed99 100644 --- a/include/linux/errno.h +++ b/include/linux/errno.h | |||
@@ -5,7 +5,12 @@ | |||
5 | 5 | ||
6 | #ifdef __KERNEL__ | 6 | #ifdef __KERNEL__ |
7 | 7 | ||
8 | /* Should never be seen by user programs */ | 8 | /* |
9 | * These should never be seen by user programs. To return one of ERESTART* | ||
10 | * codes, signal_pending() MUST be set. Note that ptrace can observe these | ||
11 | * at syscall exit tracing, but they will never be left for the debugged user | ||
12 | * process to see. | ||
13 | */ | ||
9 | #define ERESTARTSYS 512 | 14 | #define ERESTARTSYS 512 |
10 | #define ERESTARTNOINTR 513 | 15 | #define ERESTARTNOINTR 513 |
11 | #define ERESTARTNOHAND 514 /* restart if no handler.. */ | 16 | #define ERESTARTNOHAND 514 /* restart if no handler.. */ |
diff --git a/include/linux/ext4_fs.h b/include/linux/ext4_fs.h index 54c576d414c3..de1f9f78625a 100644 --- a/include/linux/ext4_fs.h +++ b/include/linux/ext4_fs.h | |||
@@ -32,9 +32,9 @@ | |||
32 | /* | 32 | /* |
33 | * Define EXT4_RESERVATION to reserve data blocks for expanding files | 33 | * Define EXT4_RESERVATION to reserve data blocks for expanding files |
34 | */ | 34 | */ |
35 | #define EXT4_DEFAULT_RESERVE_BLOCKS 8 | 35 | #define EXT4_DEFAULT_RESERVE_BLOCKS 8 |
36 | /*max window size: 1024(direct blocks) + 3([t,d]indirect blocks) */ | 36 | /*max window size: 1024(direct blocks) + 3([t,d]indirect blocks) */ |
37 | #define EXT4_MAX_RESERVE_BLOCKS 1027 | 37 | #define EXT4_MAX_RESERVE_BLOCKS 1027 |
38 | #define EXT4_RESERVE_WINDOW_NOT_ALLOCATED 0 | 38 | #define EXT4_RESERVE_WINDOW_NOT_ALLOCATED 0 |
39 | /* | 39 | /* |
40 | * Always enable hashed directories | 40 | * Always enable hashed directories |
@@ -204,12 +204,12 @@ struct ext4_group_desc | |||
204 | 204 | ||
205 | /* Used to pass group descriptor data when online resize is done */ | 205 | /* Used to pass group descriptor data when online resize is done */ |
206 | struct ext4_new_group_input { | 206 | struct ext4_new_group_input { |
207 | __u32 group; /* Group number for this data */ | 207 | __u32 group; /* Group number for this data */ |
208 | __u64 block_bitmap; /* Absolute block number of block bitmap */ | 208 | __u64 block_bitmap; /* Absolute block number of block bitmap */ |
209 | __u64 inode_bitmap; /* Absolute block number of inode bitmap */ | 209 | __u64 inode_bitmap; /* Absolute block number of inode bitmap */ |
210 | __u64 inode_table; /* Absolute block number of inode table start */ | 210 | __u64 inode_table; /* Absolute block number of inode table start */ |
211 | __u32 blocks_count; /* Total number of blocks in this group */ | 211 | __u32 blocks_count; /* Total number of blocks in this group */ |
212 | __u16 reserved_blocks; /* Number of reserved blocks in this group */ | 212 | __u16 reserved_blocks; /* Number of reserved blocks in this group */ |
213 | __u16 unused; | 213 | __u16 unused; |
214 | }; | 214 | }; |
215 | 215 | ||
@@ -310,7 +310,7 @@ struct ext4_inode { | |||
310 | __u8 l_i_frag; /* Fragment number */ | 310 | __u8 l_i_frag; /* Fragment number */ |
311 | __u8 l_i_fsize; /* Fragment size */ | 311 | __u8 l_i_fsize; /* Fragment size */ |
312 | __le16 l_i_file_acl_high; | 312 | __le16 l_i_file_acl_high; |
313 | __le16 l_i_uid_high; /* these 2 fields */ | 313 | __le16 l_i_uid_high; /* these 2 fields */ |
314 | __le16 l_i_gid_high; /* were reserved2[0] */ | 314 | __le16 l_i_gid_high; /* were reserved2[0] */ |
315 | __u32 l_i_reserved2; | 315 | __u32 l_i_reserved2; |
316 | } linux2; | 316 | } linux2; |
@@ -513,7 +513,14 @@ struct ext4_super_block { | |||
513 | /*150*/ __le32 s_blocks_count_hi; /* Blocks count */ | 513 | /*150*/ __le32 s_blocks_count_hi; /* Blocks count */ |
514 | __le32 s_r_blocks_count_hi; /* Reserved blocks count */ | 514 | __le32 s_r_blocks_count_hi; /* Reserved blocks count */ |
515 | __le32 s_free_blocks_count_hi; /* Free blocks count */ | 515 | __le32 s_free_blocks_count_hi; /* Free blocks count */ |
516 | __u32 s_reserved[169]; /* Padding to the end of the block */ | 516 | __u16 s_min_extra_isize; /* All inodes have at least # bytes */ |
517 | __u16 s_want_extra_isize; /* New inodes should reserve # bytes */ | ||
518 | __u32 s_flags; /* Miscellaneous flags */ | ||
519 | __u16 s_raid_stride; /* RAID stride */ | ||
520 | __u16 s_mmp_interval; /* # seconds to wait in MMP checking */ | ||
521 | __u64 s_mmp_block; /* Block for multi-mount protection */ | ||
522 | __u32 s_raid_stripe_width; /* blocks on all data disks (N*stride)*/ | ||
523 | __u32 s_reserved[163]; /* Padding to the end of the block */ | ||
517 | }; | 524 | }; |
518 | 525 | ||
519 | #ifdef __KERNEL__ | 526 | #ifdef __KERNEL__ |
@@ -780,9 +787,9 @@ void ext4_get_group_no_and_offset(struct super_block *sb, ext4_fsblk_t blocknr, | |||
780 | * Ok, these declarations are also in <linux/kernel.h> but none of the | 787 | * Ok, these declarations are also in <linux/kernel.h> but none of the |
781 | * ext4 source programs needs to include it so they are duplicated here. | 788 | * ext4 source programs needs to include it so they are duplicated here. |
782 | */ | 789 | */ |
783 | # define NORET_TYPE /**/ | 790 | # define NORET_TYPE /**/ |
784 | # define ATTRIB_NORET __attribute__((noreturn)) | 791 | # define ATTRIB_NORET __attribute__((noreturn)) |
785 | # define NORET_AND noreturn, | 792 | # define NORET_AND noreturn, |
786 | 793 | ||
787 | /* balloc.c */ | 794 | /* balloc.c */ |
788 | extern unsigned int ext4_block_group(struct super_block *sb, | 795 | extern unsigned int ext4_block_group(struct super_block *sb, |
diff --git a/include/linux/ext4_fs_extents.h b/include/linux/ext4_fs_extents.h index 7eb1d73fc5d1..acfe59740b03 100644 --- a/include/linux/ext4_fs_extents.h +++ b/include/linux/ext4_fs_extents.h | |||
@@ -151,8 +151,8 @@ typedef int (*ext_prepare_callback)(struct inode *, struct ext4_ext_path *, | |||
151 | ((struct ext4_extent_idx *) (((char *) (__hdr__)) + \ | 151 | ((struct ext4_extent_idx *) (((char *) (__hdr__)) + \ |
152 | sizeof(struct ext4_extent_header))) | 152 | sizeof(struct ext4_extent_header))) |
153 | #define EXT_HAS_FREE_INDEX(__path__) \ | 153 | #define EXT_HAS_FREE_INDEX(__path__) \ |
154 | (le16_to_cpu((__path__)->p_hdr->eh_entries) \ | 154 | (le16_to_cpu((__path__)->p_hdr->eh_entries) \ |
155 | < le16_to_cpu((__path__)->p_hdr->eh_max)) | 155 | < le16_to_cpu((__path__)->p_hdr->eh_max)) |
156 | #define EXT_LAST_EXTENT(__hdr__) \ | 156 | #define EXT_LAST_EXTENT(__hdr__) \ |
157 | (EXT_FIRST_EXTENT((__hdr__)) + le16_to_cpu((__hdr__)->eh_entries) - 1) | 157 | (EXT_FIRST_EXTENT((__hdr__)) + le16_to_cpu((__hdr__)->eh_entries) - 1) |
158 | #define EXT_LAST_INDEX(__hdr__) \ | 158 | #define EXT_LAST_INDEX(__hdr__) \ |
@@ -190,6 +190,7 @@ ext4_ext_invalidate_cache(struct inode *inode) | |||
190 | 190 | ||
191 | extern int ext4_extent_tree_init(handle_t *, struct inode *); | 191 | extern int ext4_extent_tree_init(handle_t *, struct inode *); |
192 | extern int ext4_ext_calc_credits_for_insert(struct inode *, struct ext4_ext_path *); | 192 | extern int ext4_ext_calc_credits_for_insert(struct inode *, struct ext4_ext_path *); |
193 | extern unsigned int ext4_ext_check_overlap(struct inode *, struct ext4_extent *, struct ext4_ext_path *); | ||
193 | extern int ext4_ext_insert_extent(handle_t *, struct inode *, struct ext4_ext_path *, struct ext4_extent *); | 194 | extern int ext4_ext_insert_extent(handle_t *, struct inode *, struct ext4_ext_path *, struct ext4_extent *); |
194 | extern int ext4_ext_walk_space(struct inode *, unsigned long, unsigned long, ext_prepare_callback, void *); | 195 | extern int ext4_ext_walk_space(struct inode *, unsigned long, unsigned long, ext_prepare_callback, void *); |
195 | extern struct ext4_ext_path * ext4_ext_find_extent(struct inode *, int, struct ext4_ext_path *); | 196 | extern struct ext4_ext_path * ext4_ext_find_extent(struct inode *, int, struct ext4_ext_path *); |
diff --git a/include/linux/ext4_fs_i.h b/include/linux/ext4_fs_i.h index d5b177e5b395..9de494406995 100644 --- a/include/linux/ext4_fs_i.h +++ b/include/linux/ext4_fs_i.h | |||
@@ -41,14 +41,14 @@ struct ext4_reserve_window_node { | |||
41 | 41 | ||
42 | struct ext4_block_alloc_info { | 42 | struct ext4_block_alloc_info { |
43 | /* information about reservation window */ | 43 | /* information about reservation window */ |
44 | struct ext4_reserve_window_node rsv_window_node; | 44 | struct ext4_reserve_window_node rsv_window_node; |
45 | /* | 45 | /* |
46 | * was i_next_alloc_block in ext4_inode_info | 46 | * was i_next_alloc_block in ext4_inode_info |
47 | * is the logical (file-relative) number of the | 47 | * is the logical (file-relative) number of the |
48 | * most-recently-allocated block in this file. | 48 | * most-recently-allocated block in this file. |
49 | * We use this for detecting linearly ascending allocation requests. | 49 | * We use this for detecting linearly ascending allocation requests. |
50 | */ | 50 | */ |
51 | __u32 last_alloc_logical_block; | 51 | __u32 last_alloc_logical_block; |
52 | /* | 52 | /* |
53 | * Was i_next_alloc_goal in ext4_inode_info | 53 | * Was i_next_alloc_goal in ext4_inode_info |
54 | * is the *physical* companion to i_next_alloc_block. | 54 | * is the *physical* companion to i_next_alloc_block. |
@@ -56,7 +56,7 @@ struct ext4_block_alloc_info { | |||
56 | * allocated to this file. This give us the goal (target) for the next | 56 | * allocated to this file. This give us the goal (target) for the next |
57 | * allocation when we detect linearly ascending requests. | 57 | * allocation when we detect linearly ascending requests. |
58 | */ | 58 | */ |
59 | ext4_fsblk_t last_alloc_physical_block; | 59 | ext4_fsblk_t last_alloc_physical_block; |
60 | }; | 60 | }; |
61 | 61 | ||
62 | #define rsv_start rsv_window._rsv_start | 62 | #define rsv_start rsv_window._rsv_start |
diff --git a/include/linux/fb.h b/include/linux/fb.h index c654d0e9ce33..66226824ab68 100644 --- a/include/linux/fb.h +++ b/include/linux/fb.h | |||
@@ -942,6 +942,7 @@ extern int fb_new_modelist(struct fb_info *info); | |||
942 | 942 | ||
943 | extern struct fb_info *registered_fb[FB_MAX]; | 943 | extern struct fb_info *registered_fb[FB_MAX]; |
944 | extern int num_registered_fb; | 944 | extern int num_registered_fb; |
945 | extern struct class *fb_class; | ||
945 | 946 | ||
946 | static inline void __fb_pad_aligned_buffer(u8 *dst, u32 d_pitch, | 947 | static inline void __fb_pad_aligned_buffer(u8 *dst, u32 d_pitch, |
947 | u8 *src, u32 s_pitch, u32 height) | 948 | u8 *src, u32 s_pitch, u32 height) |
diff --git a/include/linux/firewire-cdev.h b/include/linux/firewire-cdev.h index d4455eb2ae35..efbe1fda1a22 100644 --- a/include/linux/firewire-cdev.h +++ b/include/linux/firewire-cdev.h | |||
@@ -198,13 +198,15 @@ struct fw_cdev_create_iso_context { | |||
198 | __u32 handle; | 198 | __u32 handle; |
199 | }; | 199 | }; |
200 | 200 | ||
201 | #define FW_CDEV_ISO_PAYLOAD_LENGTH(v) (v) | ||
202 | #define FW_CDEV_ISO_INTERRUPT (1 << 16) | ||
203 | #define FW_CDEV_ISO_SKIP (1 << 17) | ||
204 | #define FW_CDEV_ISO_TAG(v) ((v) << 18) | ||
205 | #define FW_CDEV_ISO_SY(v) ((v) << 20) | ||
206 | #define FW_CDEV_ISO_HEADER_LENGTH(v) ((v) << 24) | ||
207 | |||
201 | struct fw_cdev_iso_packet { | 208 | struct fw_cdev_iso_packet { |
202 | __u16 payload_length; /* Length of indirect payload. */ | 209 | __u32 control; |
203 | __u32 interrupt : 1; /* Generate interrupt on this packet */ | ||
204 | __u32 skip : 1; /* Set to not send packet at all. */ | ||
205 | __u32 tag : 2; | ||
206 | __u32 sy : 4; | ||
207 | __u32 header_length : 8; /* Length of immediate header. */ | ||
208 | __u32 header[0]; | 210 | __u32 header[0]; |
209 | }; | 211 | }; |
210 | 212 | ||
diff --git a/include/linux/ipv6.h b/include/linux/ipv6.h index 09ea01a8a99c..648bd1f0912d 100644 --- a/include/linux/ipv6.h +++ b/include/linux/ipv6.h | |||
@@ -209,9 +209,8 @@ enum { | |||
209 | DEVCONF_RTR_PROBE_INTERVAL, | 209 | DEVCONF_RTR_PROBE_INTERVAL, |
210 | DEVCONF_ACCEPT_RA_RT_INFO_MAX_PLEN, | 210 | DEVCONF_ACCEPT_RA_RT_INFO_MAX_PLEN, |
211 | DEVCONF_PROXY_NDP, | 211 | DEVCONF_PROXY_NDP, |
212 | __DEVCONF_OPTIMISTIC_DAD, | ||
213 | DEVCONF_ACCEPT_SOURCE_ROUTE, | ||
214 | DEVCONF_OPTIMISTIC_DAD, | 212 | DEVCONF_OPTIMISTIC_DAD, |
213 | DEVCONF_ACCEPT_SOURCE_ROUTE, | ||
215 | DEVCONF_MAX | 214 | DEVCONF_MAX |
216 | }; | 215 | }; |
217 | 216 | ||
diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h index f671cd2f133f..3a70f553b28f 100644 --- a/include/linux/netdevice.h +++ b/include/linux/netdevice.h | |||
@@ -910,6 +910,17 @@ static inline int netif_rx_reschedule(struct net_device *dev, int undo) | |||
910 | return 0; | 910 | return 0; |
911 | } | 911 | } |
912 | 912 | ||
913 | /* same as netif_rx_complete, except that local_irq_save(flags) | ||
914 | * has already been issued | ||
915 | */ | ||
916 | static inline void __netif_rx_complete(struct net_device *dev) | ||
917 | { | ||
918 | BUG_ON(!test_bit(__LINK_STATE_RX_SCHED, &dev->state)); | ||
919 | list_del(&dev->poll_list); | ||
920 | smp_mb__before_clear_bit(); | ||
921 | clear_bit(__LINK_STATE_RX_SCHED, &dev->state); | ||
922 | } | ||
923 | |||
913 | /* Remove interface from poll list: it must be in the poll list | 924 | /* Remove interface from poll list: it must be in the poll list |
914 | * on current cpu. This primitive is called by dev->poll(), when | 925 | * on current cpu. This primitive is called by dev->poll(), when |
915 | * it completes the work. The device cannot be out of poll list at this | 926 | * it completes the work. The device cannot be out of poll list at this |
@@ -920,10 +931,7 @@ static inline void netif_rx_complete(struct net_device *dev) | |||
920 | unsigned long flags; | 931 | unsigned long flags; |
921 | 932 | ||
922 | local_irq_save(flags); | 933 | local_irq_save(flags); |
923 | BUG_ON(!test_bit(__LINK_STATE_RX_SCHED, &dev->state)); | 934 | __netif_rx_complete(dev); |
924 | list_del(&dev->poll_list); | ||
925 | smp_mb__before_clear_bit(); | ||
926 | clear_bit(__LINK_STATE_RX_SCHED, &dev->state); | ||
927 | local_irq_restore(flags); | 935 | local_irq_restore(flags); |
928 | } | 936 | } |
929 | 937 | ||
@@ -940,17 +948,6 @@ static inline void netif_poll_enable(struct net_device *dev) | |||
940 | clear_bit(__LINK_STATE_RX_SCHED, &dev->state); | 948 | clear_bit(__LINK_STATE_RX_SCHED, &dev->state); |
941 | } | 949 | } |
942 | 950 | ||
943 | /* same as netif_rx_complete, except that local_irq_save(flags) | ||
944 | * has already been issued | ||
945 | */ | ||
946 | static inline void __netif_rx_complete(struct net_device *dev) | ||
947 | { | ||
948 | BUG_ON(!test_bit(__LINK_STATE_RX_SCHED, &dev->state)); | ||
949 | list_del(&dev->poll_list); | ||
950 | smp_mb__before_clear_bit(); | ||
951 | clear_bit(__LINK_STATE_RX_SCHED, &dev->state); | ||
952 | } | ||
953 | |||
954 | static inline void netif_tx_lock(struct net_device *dev) | 951 | static inline void netif_tx_lock(struct net_device *dev) |
955 | { | 952 | { |
956 | spin_lock(&dev->_xmit_lock); | 953 | spin_lock(&dev->_xmit_lock); |
diff --git a/include/linux/pci_ids.h b/include/linux/pci_ids.h index 4712e269d8d3..6a115cffea34 100644 --- a/include/linux/pci_ids.h +++ b/include/linux/pci_ids.h | |||
@@ -1292,6 +1292,7 @@ | |||
1292 | #define PCI_DEVICE_ID_VIA_P4M890 0x0327 | 1292 | #define PCI_DEVICE_ID_VIA_P4M890 0x0327 |
1293 | #define PCI_DEVICE_ID_VIA_VT3324 0x0324 | 1293 | #define PCI_DEVICE_ID_VIA_VT3324 0x0324 |
1294 | #define PCI_DEVICE_ID_VIA_VT3336 0x0336 | 1294 | #define PCI_DEVICE_ID_VIA_VT3336 0x0336 |
1295 | #define PCI_DEVICE_ID_VIA_VT3351 0x0351 | ||
1295 | #define PCI_DEVICE_ID_VIA_8371_0 0x0391 | 1296 | #define PCI_DEVICE_ID_VIA_8371_0 0x0391 |
1296 | #define PCI_DEVICE_ID_VIA_8501_0 0x0501 | 1297 | #define PCI_DEVICE_ID_VIA_8501_0 0x0501 |
1297 | #define PCI_DEVICE_ID_VIA_82C561 0x0561 | 1298 | #define PCI_DEVICE_ID_VIA_82C561 0x0561 |
@@ -1437,6 +1438,7 @@ | |||
1437 | #define PCI_DEVICE_ID_SERVERWORKS_LE 0x0009 | 1438 | #define PCI_DEVICE_ID_SERVERWORKS_LE 0x0009 |
1438 | #define PCI_DEVICE_ID_SERVERWORKS_GCNB_LE 0x0017 | 1439 | #define PCI_DEVICE_ID_SERVERWORKS_GCNB_LE 0x0017 |
1439 | #define PCI_DEVICE_ID_SERVERWORKS_EPB 0x0103 | 1440 | #define PCI_DEVICE_ID_SERVERWORKS_EPB 0x0103 |
1441 | #define PCI_DEVICE_ID_SERVERWORKS_HT1000_PCIX 0x0104 | ||
1440 | #define PCI_DEVICE_ID_SERVERWORKS_HT2000_PCIE 0x0132 | 1442 | #define PCI_DEVICE_ID_SERVERWORKS_HT2000_PCIE 0x0132 |
1441 | #define PCI_DEVICE_ID_SERVERWORKS_OSB4 0x0200 | 1443 | #define PCI_DEVICE_ID_SERVERWORKS_OSB4 0x0200 |
1442 | #define PCI_DEVICE_ID_SERVERWORKS_CSB5 0x0201 | 1444 | #define PCI_DEVICE_ID_SERVERWORKS_CSB5 0x0201 |
@@ -2267,11 +2269,11 @@ | |||
2267 | #define PCI_DEVICE_ID_INTEL_ICH8_5 0x283e | 2269 | #define PCI_DEVICE_ID_INTEL_ICH8_5 0x283e |
2268 | #define PCI_DEVICE_ID_INTEL_ICH8_6 0x2850 | 2270 | #define PCI_DEVICE_ID_INTEL_ICH8_6 0x2850 |
2269 | #define PCI_DEVICE_ID_INTEL_ICH9_0 0x2910 | 2271 | #define PCI_DEVICE_ID_INTEL_ICH9_0 0x2910 |
2270 | #define PCI_DEVICE_ID_INTEL_ICH9_1 0x2911 | 2272 | #define PCI_DEVICE_ID_INTEL_ICH9_1 0x2917 |
2271 | #define PCI_DEVICE_ID_INTEL_ICH9_2 0x2912 | 2273 | #define PCI_DEVICE_ID_INTEL_ICH9_2 0x2912 |
2272 | #define PCI_DEVICE_ID_INTEL_ICH9_3 0x2913 | 2274 | #define PCI_DEVICE_ID_INTEL_ICH9_3 0x2913 |
2273 | #define PCI_DEVICE_ID_INTEL_ICH9_4 0x2914 | 2275 | #define PCI_DEVICE_ID_INTEL_ICH9_4 0x2914 |
2274 | #define PCI_DEVICE_ID_INTEL_ICH9_5 0x2915 | 2276 | #define PCI_DEVICE_ID_INTEL_ICH9_5 0x2919 |
2275 | #define PCI_DEVICE_ID_INTEL_ICH9_6 0x2930 | 2277 | #define PCI_DEVICE_ID_INTEL_ICH9_6 0x2930 |
2276 | #define PCI_DEVICE_ID_INTEL_82855PM_HB 0x3340 | 2278 | #define PCI_DEVICE_ID_INTEL_82855PM_HB 0x3340 |
2277 | #define PCI_DEVICE_ID_INTEL_82830_HB 0x3575 | 2279 | #define PCI_DEVICE_ID_INTEL_82830_HB 0x3575 |
diff --git a/include/linux/serial_core.h b/include/linux/serial_core.h index a3ac4c896831..7f2c99d66e9d 100644 --- a/include/linux/serial_core.h +++ b/include/linux/serial_core.h | |||
@@ -152,6 +152,7 @@ | |||
152 | #include <linux/sched.h> | 152 | #include <linux/sched.h> |
153 | #include <linux/tty.h> | 153 | #include <linux/tty.h> |
154 | #include <linux/mutex.h> | 154 | #include <linux/mutex.h> |
155 | #include <linux/sysrq.h> | ||
155 | 156 | ||
156 | struct uart_port; | 157 | struct uart_port; |
157 | struct uart_info; | 158 | struct uart_info; |
diff --git a/include/net/af_unix.h b/include/net/af_unix.h index c0398f5a8cb9..65f49fd7deff 100644 --- a/include/net/af_unix.h +++ b/include/net/af_unix.h | |||
@@ -62,13 +62,11 @@ struct unix_skb_parms { | |||
62 | #define UNIXCREDS(skb) (&UNIXCB((skb)).creds) | 62 | #define UNIXCREDS(skb) (&UNIXCB((skb)).creds) |
63 | #define UNIXSID(skb) (&UNIXCB((skb)).secid) | 63 | #define UNIXSID(skb) (&UNIXCB((skb)).secid) |
64 | 64 | ||
65 | #define unix_state_rlock(s) spin_lock(&unix_sk(s)->lock) | 65 | #define unix_state_lock(s) spin_lock(&unix_sk(s)->lock) |
66 | #define unix_state_runlock(s) spin_unlock(&unix_sk(s)->lock) | 66 | #define unix_state_unlock(s) spin_unlock(&unix_sk(s)->lock) |
67 | #define unix_state_wlock(s) spin_lock(&unix_sk(s)->lock) | 67 | #define unix_state_lock_nested(s) \ |
68 | #define unix_state_wlock_nested(s) \ | ||
69 | spin_lock_nested(&unix_sk(s)->lock, \ | 68 | spin_lock_nested(&unix_sk(s)->lock, \ |
70 | SINGLE_DEPTH_NESTING) | 69 | SINGLE_DEPTH_NESTING) |
71 | #define unix_state_wunlock(s) spin_unlock(&unix_sk(s)->lock) | ||
72 | 70 | ||
73 | #ifdef __KERNEL__ | 71 | #ifdef __KERNEL__ |
74 | /* The AF_UNIX socket */ | 72 | /* The AF_UNIX socket */ |
diff --git a/include/net/sock.h b/include/net/sock.h index 689b886038da..dfeb8b13024f 100644 --- a/include/net/sock.h +++ b/include/net/sock.h | |||
@@ -218,13 +218,13 @@ struct sock { | |||
218 | atomic_t sk_rmem_alloc; | 218 | atomic_t sk_rmem_alloc; |
219 | atomic_t sk_wmem_alloc; | 219 | atomic_t sk_wmem_alloc; |
220 | atomic_t sk_omem_alloc; | 220 | atomic_t sk_omem_alloc; |
221 | int sk_sndbuf; | ||
221 | struct sk_buff_head sk_receive_queue; | 222 | struct sk_buff_head sk_receive_queue; |
222 | struct sk_buff_head sk_write_queue; | 223 | struct sk_buff_head sk_write_queue; |
223 | struct sk_buff_head sk_async_wait_queue; | 224 | struct sk_buff_head sk_async_wait_queue; |
224 | int sk_wmem_queued; | 225 | int sk_wmem_queued; |
225 | int sk_forward_alloc; | 226 | int sk_forward_alloc; |
226 | gfp_t sk_allocation; | 227 | gfp_t sk_allocation; |
227 | int sk_sndbuf; | ||
228 | int sk_route_caps; | 228 | int sk_route_caps; |
229 | int sk_gso_type; | 229 | int sk_gso_type; |
230 | int sk_rcvlowat; | 230 | int sk_rcvlowat; |
diff --git a/include/net/tcp.h b/include/net/tcp.h index e22b4f0305a3..a8af9ae00177 100644 --- a/include/net/tcp.h +++ b/include/net/tcp.h | |||
@@ -254,6 +254,12 @@ static inline int between(__u32 seq1, __u32 seq2, __u32 seq3) | |||
254 | return seq3 - seq2 >= seq1 - seq2; | 254 | return seq3 - seq2 >= seq1 - seq2; |
255 | } | 255 | } |
256 | 256 | ||
257 | static inline int tcp_too_many_orphans(struct sock *sk, int num) | ||
258 | { | ||
259 | return (num > sysctl_tcp_max_orphans) || | ||
260 | (sk->sk_wmem_queued > SOCK_MIN_SNDBUF && | ||
261 | atomic_read(&tcp_memory_allocated) > sysctl_tcp_mem[2]); | ||
262 | } | ||
257 | 263 | ||
258 | extern struct proto tcp_prot; | 264 | extern struct proto tcp_prot; |
259 | 265 | ||
diff --git a/include/net/xfrm.h b/include/net/xfrm.h index 39ef925d39dd..90185e8b335e 100644 --- a/include/net/xfrm.h +++ b/include/net/xfrm.h | |||
@@ -237,7 +237,6 @@ extern int xfrm_policy_register_afinfo(struct xfrm_policy_afinfo *afinfo); | |||
237 | extern int xfrm_policy_unregister_afinfo(struct xfrm_policy_afinfo *afinfo); | 237 | extern int xfrm_policy_unregister_afinfo(struct xfrm_policy_afinfo *afinfo); |
238 | extern void km_policy_notify(struct xfrm_policy *xp, int dir, struct km_event *c); | 238 | extern void km_policy_notify(struct xfrm_policy *xp, int dir, struct km_event *c); |
239 | extern void km_state_notify(struct xfrm_state *x, struct km_event *c); | 239 | extern void km_state_notify(struct xfrm_state *x, struct km_event *c); |
240 | #define XFRM_ACQ_EXPIRES 30 | ||
241 | 240 | ||
242 | struct xfrm_tmpl; | 241 | struct xfrm_tmpl; |
243 | extern int km_query(struct xfrm_state *x, struct xfrm_tmpl *t, struct xfrm_policy *pol); | 242 | extern int km_query(struct xfrm_state *x, struct xfrm_tmpl *t, struct xfrm_policy *pol); |
diff --git a/include/sound/version.h b/include/sound/version.h index 50ee4fd420fa..8e5b2f0f5946 100644 --- a/include/sound/version.h +++ b/include/sound/version.h | |||
@@ -1,3 +1,3 @@ | |||
1 | /* include/version.h. Generated by alsa/ksync script. */ | 1 | /* include/version.h. Generated by alsa/ksync script. */ |
2 | #define CONFIG_SND_VERSION "1.0.14rc4" | 2 | #define CONFIG_SND_VERSION "1.0.14" |
3 | #define CONFIG_SND_DATE " (Wed May 16 09:45:46 2007 UTC)" | 3 | #define CONFIG_SND_DATE " (Thu May 31 09:03:25 2007 UTC)" |
diff --git a/kernel/futex_compat.c b/kernel/futex_compat.c index 338a9b489fbc..27478948b318 100644 --- a/kernel/futex_compat.c +++ b/kernel/futex_compat.c | |||
@@ -144,20 +144,21 @@ asmlinkage long compat_sys_futex(u32 __user *uaddr, int op, u32 val, | |||
144 | struct timespec ts; | 144 | struct timespec ts; |
145 | ktime_t t, *tp = NULL; | 145 | ktime_t t, *tp = NULL; |
146 | int val2 = 0; | 146 | int val2 = 0; |
147 | int cmd = op & FUTEX_CMD_MASK; | ||
147 | 148 | ||
148 | if (utime && (op == FUTEX_WAIT || op == FUTEX_LOCK_PI)) { | 149 | if (utime && (cmd == FUTEX_WAIT || cmd == FUTEX_LOCK_PI)) { |
149 | if (get_compat_timespec(&ts, utime)) | 150 | if (get_compat_timespec(&ts, utime)) |
150 | return -EFAULT; | 151 | return -EFAULT; |
151 | if (!timespec_valid(&ts)) | 152 | if (!timespec_valid(&ts)) |
152 | return -EINVAL; | 153 | return -EINVAL; |
153 | 154 | ||
154 | t = timespec_to_ktime(ts); | 155 | t = timespec_to_ktime(ts); |
155 | if (op == FUTEX_WAIT) | 156 | if (cmd == FUTEX_WAIT) |
156 | t = ktime_add(ktime_get(), t); | 157 | t = ktime_add(ktime_get(), t); |
157 | tp = &t; | 158 | tp = &t; |
158 | } | 159 | } |
159 | if (op == FUTEX_REQUEUE || op == FUTEX_CMP_REQUEUE | 160 | if (cmd == FUTEX_REQUEUE || cmd == FUTEX_CMP_REQUEUE |
160 | || op == FUTEX_CMP_REQUEUE_PI) | 161 | || cmd == FUTEX_CMP_REQUEUE_PI) |
161 | val2 = (int) (unsigned long) utime; | 162 | val2 = (int) (unsigned long) utime; |
162 | 163 | ||
163 | return do_futex(uaddr, op, val, tp, uaddr2, val2, val3); | 164 | return do_futex(uaddr, op, val, tp, uaddr2, val2, val3); |
diff --git a/kernel/kallsyms.c b/kernel/kallsyms.c index f1bda23140b2..fed54418626c 100644 --- a/kernel/kallsyms.c +++ b/kernel/kallsyms.c | |||
@@ -257,7 +257,8 @@ const char *kallsyms_lookup(unsigned long addr, | |||
257 | pos = get_symbol_pos(addr, symbolsize, offset); | 257 | pos = get_symbol_pos(addr, symbolsize, offset); |
258 | /* Grab name */ | 258 | /* Grab name */ |
259 | kallsyms_expand_symbol(get_symbol_offset(pos), namebuf); | 259 | kallsyms_expand_symbol(get_symbol_offset(pos), namebuf); |
260 | *modname = NULL; | 260 | if (modname) |
261 | *modname = NULL; | ||
261 | return namebuf; | 262 | return namebuf; |
262 | } | 263 | } |
263 | 264 | ||
diff --git a/kernel/time/timer_stats.c b/kernel/time/timer_stats.c index 868f1bceb07f..321693724ad7 100644 --- a/kernel/time/timer_stats.c +++ b/kernel/time/timer_stats.c | |||
@@ -117,21 +117,6 @@ static struct entry entries[MAX_ENTRIES]; | |||
117 | 117 | ||
118 | static atomic_t overflow_count; | 118 | static atomic_t overflow_count; |
119 | 119 | ||
120 | static void reset_entries(void) | ||
121 | { | ||
122 | nr_entries = 0; | ||
123 | memset(entries, 0, sizeof(entries)); | ||
124 | atomic_set(&overflow_count, 0); | ||
125 | } | ||
126 | |||
127 | static struct entry *alloc_entry(void) | ||
128 | { | ||
129 | if (nr_entries >= MAX_ENTRIES) | ||
130 | return NULL; | ||
131 | |||
132 | return entries + nr_entries++; | ||
133 | } | ||
134 | |||
135 | /* | 120 | /* |
136 | * The entries are in a hash-table, for fast lookup: | 121 | * The entries are in a hash-table, for fast lookup: |
137 | */ | 122 | */ |
@@ -149,6 +134,22 @@ static struct entry *alloc_entry(void) | |||
149 | 134 | ||
150 | static struct entry *tstat_hash_table[TSTAT_HASH_SIZE] __read_mostly; | 135 | static struct entry *tstat_hash_table[TSTAT_HASH_SIZE] __read_mostly; |
151 | 136 | ||
137 | static void reset_entries(void) | ||
138 | { | ||
139 | nr_entries = 0; | ||
140 | memset(entries, 0, sizeof(entries)); | ||
141 | memset(tstat_hash_table, 0, sizeof(tstat_hash_table)); | ||
142 | atomic_set(&overflow_count, 0); | ||
143 | } | ||
144 | |||
145 | static struct entry *alloc_entry(void) | ||
146 | { | ||
147 | if (nr_entries >= MAX_ENTRIES) | ||
148 | return NULL; | ||
149 | |||
150 | return entries + nr_entries++; | ||
151 | } | ||
152 | |||
152 | static int match_entries(struct entry *entry1, struct entry *entry2) | 153 | static int match_entries(struct entry *entry1, struct entry *entry2) |
153 | { | 154 | { |
154 | return entry1->timer == entry2->timer && | 155 | return entry1->timer == entry2->timer && |
@@ -202,12 +203,15 @@ static struct entry *tstat_lookup(struct entry *entry, char *comm) | |||
202 | if (curr) { | 203 | if (curr) { |
203 | *curr = *entry; | 204 | *curr = *entry; |
204 | curr->count = 0; | 205 | curr->count = 0; |
206 | curr->next = NULL; | ||
205 | memcpy(curr->comm, comm, TASK_COMM_LEN); | 207 | memcpy(curr->comm, comm, TASK_COMM_LEN); |
208 | |||
209 | smp_mb(); /* Ensure that curr is initialized before insert */ | ||
210 | |||
206 | if (prev) | 211 | if (prev) |
207 | prev->next = curr; | 212 | prev->next = curr; |
208 | else | 213 | else |
209 | *head = curr; | 214 | *head = curr; |
210 | curr->next = NULL; | ||
211 | } | 215 | } |
212 | out_unlock: | 216 | out_unlock: |
213 | spin_unlock(&table_lock); | 217 | spin_unlock(&table_lock); |
@@ -232,10 +236,15 @@ void timer_stats_update_stats(void *timer, pid_t pid, void *startf, | |||
232 | /* | 236 | /* |
233 | * It doesnt matter which lock we take: | 237 | * It doesnt matter which lock we take: |
234 | */ | 238 | */ |
235 | spinlock_t *lock = &per_cpu(lookup_lock, raw_smp_processor_id()); | 239 | spinlock_t *lock; |
236 | struct entry *entry, input; | 240 | struct entry *entry, input; |
237 | unsigned long flags; | 241 | unsigned long flags; |
238 | 242 | ||
243 | if (likely(!active)) | ||
244 | return; | ||
245 | |||
246 | lock = &per_cpu(lookup_lock, raw_smp_processor_id()); | ||
247 | |||
239 | input.timer = timer; | 248 | input.timer = timer; |
240 | input.start_func = startf; | 249 | input.start_func = startf; |
241 | input.expire_func = timerf; | 250 | input.expire_func = timerf; |
@@ -360,6 +369,7 @@ static ssize_t tstats_write(struct file *file, const char __user *buf, | |||
360 | if (!active) { | 369 | if (!active) { |
361 | reset_entries(); | 370 | reset_entries(); |
362 | time_start = ktime_get(); | 371 | time_start = ktime_get(); |
372 | smp_mb(); | ||
363 | active = 1; | 373 | active = 1; |
364 | } | 374 | } |
365 | break; | 375 | break; |
diff --git a/lib/Kconfig.debug b/lib/Kconfig.debug index 1ba77ca7d165..da95e10cfd70 100644 --- a/lib/Kconfig.debug +++ b/lib/Kconfig.debug | |||
@@ -126,7 +126,10 @@ config TIMER_STATS | |||
126 | reprogrammed. The statistics can be read from /proc/timer_stats. | 126 | reprogrammed. The statistics can be read from /proc/timer_stats. |
127 | The statistics collection is started by writing 1 to /proc/timer_stats, | 127 | The statistics collection is started by writing 1 to /proc/timer_stats, |
128 | writing 0 stops it. This feature is useful to collect information | 128 | writing 0 stops it. This feature is useful to collect information |
129 | about timer usage patterns in kernel and userspace. | 129 | about timer usage patterns in kernel and userspace. This feature |
130 | is lightweight if enabled in the kernel config but not activated | ||
131 | (it defaults to deactivated on bootup and will only be activated | ||
132 | if some application like powertop activates it explicitly). | ||
130 | 133 | ||
131 | config DEBUG_SLAB | 134 | config DEBUG_SLAB |
132 | bool "Debug slab memory allocations" | 135 | bool "Debug slab memory allocations" |
diff --git a/mm/memory_hotplug.c b/mm/memory_hotplug.c index 84279127fcd3..df9d554bea30 100644 --- a/mm/memory_hotplug.c +++ b/mm/memory_hotplug.c | |||
@@ -65,7 +65,7 @@ static int __add_zone(struct zone *zone, unsigned long phys_start_pfn) | |||
65 | int zone_type; | 65 | int zone_type; |
66 | 66 | ||
67 | zone_type = zone - pgdat->node_zones; | 67 | zone_type = zone - pgdat->node_zones; |
68 | if (!populated_zone(zone)) { | 68 | if (!zone->wait_table) { |
69 | int ret = 0; | 69 | int ret = 0; |
70 | ret = init_currently_empty_zone(zone, phys_start_pfn, | 70 | ret = init_currently_empty_zone(zone, phys_start_pfn, |
71 | nr_pages, MEMMAP_HOTPLUG); | 71 | nr_pages, MEMMAP_HOTPLUG); |
diff --git a/mm/page_alloc.c b/mm/page_alloc.c index d8970623c566..bd8e33582d25 100644 --- a/mm/page_alloc.c +++ b/mm/page_alloc.c | |||
@@ -2689,7 +2689,7 @@ static void __init_refok alloc_node_mem_map(struct pglist_data *pgdat) | |||
2689 | map = alloc_bootmem_node(pgdat, size); | 2689 | map = alloc_bootmem_node(pgdat, size); |
2690 | pgdat->node_mem_map = map + (pgdat->node_start_pfn - start); | 2690 | pgdat->node_mem_map = map + (pgdat->node_start_pfn - start); |
2691 | } | 2691 | } |
2692 | #ifdef CONFIG_FLATMEM | 2692 | #ifndef CONFIG_NEED_MULTIPLE_NODES |
2693 | /* | 2693 | /* |
2694 | * With no DISCONTIG, the global mem_map is just set as node 0's | 2694 | * With no DISCONTIG, the global mem_map is just set as node 0's |
2695 | */ | 2695 | */ |
@@ -2435,6 +2435,7 @@ void __init kmem_cache_init(void) | |||
2435 | */ | 2435 | */ |
2436 | create_kmalloc_cache(&kmalloc_caches[0], "kmem_cache_node", | 2436 | create_kmalloc_cache(&kmalloc_caches[0], "kmem_cache_node", |
2437 | sizeof(struct kmem_cache_node), GFP_KERNEL); | 2437 | sizeof(struct kmem_cache_node), GFP_KERNEL); |
2438 | kmalloc_caches[0].refcount = -1; | ||
2438 | #endif | 2439 | #endif |
2439 | 2440 | ||
2440 | /* Able to allocate the per node structures */ | 2441 | /* Able to allocate the per node structures */ |
@@ -2482,6 +2483,12 @@ static int slab_unmergeable(struct kmem_cache *s) | |||
2482 | if (s->ctor) | 2483 | if (s->ctor) |
2483 | return 1; | 2484 | return 1; |
2484 | 2485 | ||
2486 | /* | ||
2487 | * We may have set a slab to be unmergeable during bootstrap. | ||
2488 | */ | ||
2489 | if (s->refcount < 0) | ||
2490 | return 1; | ||
2491 | |||
2485 | return 0; | 2492 | return 0; |
2486 | } | 2493 | } |
2487 | 2494 | ||
@@ -2601,6 +2608,19 @@ static void for_all_slabs(void (*func)(struct kmem_cache *, int), int cpu) | |||
2601 | } | 2608 | } |
2602 | 2609 | ||
2603 | /* | 2610 | /* |
2611 | * Version of __flush_cpu_slab for the case that interrupts | ||
2612 | * are enabled. | ||
2613 | */ | ||
2614 | static void cpu_slab_flush(struct kmem_cache *s, int cpu) | ||
2615 | { | ||
2616 | unsigned long flags; | ||
2617 | |||
2618 | local_irq_save(flags); | ||
2619 | __flush_cpu_slab(s, cpu); | ||
2620 | local_irq_restore(flags); | ||
2621 | } | ||
2622 | |||
2623 | /* | ||
2604 | * Use the cpu notifier to insure that the cpu slabs are flushed when | 2624 | * Use the cpu notifier to insure that the cpu slabs are flushed when |
2605 | * necessary. | 2625 | * necessary. |
2606 | */ | 2626 | */ |
@@ -2614,7 +2634,7 @@ static int __cpuinit slab_cpuup_callback(struct notifier_block *nfb, | |||
2614 | case CPU_UP_CANCELED_FROZEN: | 2634 | case CPU_UP_CANCELED_FROZEN: |
2615 | case CPU_DEAD: | 2635 | case CPU_DEAD: |
2616 | case CPU_DEAD_FROZEN: | 2636 | case CPU_DEAD_FROZEN: |
2617 | for_all_slabs(__flush_cpu_slab, cpu); | 2637 | for_all_slabs(cpu_slab_flush, cpu); |
2618 | break; | 2638 | break; |
2619 | default: | 2639 | default: |
2620 | break; | 2640 | break; |
diff --git a/mm/sparse.c b/mm/sparse.c index 1302f8348d51..545e4d3afcdf 100644 --- a/mm/sparse.c +++ b/mm/sparse.c | |||
@@ -209,6 +209,12 @@ static int __meminit sparse_init_one_section(struct mem_section *ms, | |||
209 | return 1; | 209 | return 1; |
210 | } | 210 | } |
211 | 211 | ||
212 | __attribute__((weak)) | ||
213 | void *alloc_bootmem_high_node(pg_data_t *pgdat, unsigned long size) | ||
214 | { | ||
215 | return NULL; | ||
216 | } | ||
217 | |||
212 | static struct page __init *sparse_early_mem_map_alloc(unsigned long pnum) | 218 | static struct page __init *sparse_early_mem_map_alloc(unsigned long pnum) |
213 | { | 219 | { |
214 | struct page *map; | 220 | struct page *map; |
@@ -219,6 +225,11 @@ static struct page __init *sparse_early_mem_map_alloc(unsigned long pnum) | |||
219 | if (map) | 225 | if (map) |
220 | return map; | 226 | return map; |
221 | 227 | ||
228 | map = alloc_bootmem_high_node(NODE_DATA(nid), | ||
229 | sizeof(struct page) * PAGES_PER_SECTION); | ||
230 | if (map) | ||
231 | return map; | ||
232 | |||
222 | map = alloc_bootmem_node(NODE_DATA(nid), | 233 | map = alloc_bootmem_node(NODE_DATA(nid), |
223 | sizeof(struct page) * PAGES_PER_SECTION); | 234 | sizeof(struct page) * PAGES_PER_SECTION); |
224 | if (map) | 235 | if (map) |
diff --git a/net/8021q/vlan.c b/net/8021q/vlan.c index bd93c45778d4..de78c9dd713b 100644 --- a/net/8021q/vlan.c +++ b/net/8021q/vlan.c | |||
@@ -240,10 +240,8 @@ static int unregister_vlan_dev(struct net_device *real_dev, | |||
240 | * interlock with HW accelerating devices or SW vlan | 240 | * interlock with HW accelerating devices or SW vlan |
241 | * input packet processing. | 241 | * input packet processing. |
242 | */ | 242 | */ |
243 | if (real_dev->features & | 243 | if (real_dev->features & NETIF_F_HW_VLAN_FILTER) |
244 | (NETIF_F_HW_VLAN_RX | NETIF_F_HW_VLAN_FILTER)) { | ||
245 | real_dev->vlan_rx_kill_vid(real_dev, vlan_id); | 244 | real_dev->vlan_rx_kill_vid(real_dev, vlan_id); |
246 | } | ||
247 | 245 | ||
248 | vlan_group_set_device(grp, vlan_id, NULL); | 246 | vlan_group_set_device(grp, vlan_id, NULL); |
249 | synchronize_net(); | 247 | synchronize_net(); |
@@ -409,16 +407,14 @@ static struct net_device *register_vlan_device(const char *eth_IF_name, | |||
409 | } | 407 | } |
410 | 408 | ||
411 | if ((real_dev->features & NETIF_F_HW_VLAN_RX) && | 409 | if ((real_dev->features & NETIF_F_HW_VLAN_RX) && |
412 | (real_dev->vlan_rx_register == NULL || | 410 | !real_dev->vlan_rx_register) { |
413 | real_dev->vlan_rx_kill_vid == NULL)) { | ||
414 | printk(VLAN_DBG "%s: Device %s has buggy VLAN hw accel.\n", | 411 | printk(VLAN_DBG "%s: Device %s has buggy VLAN hw accel.\n", |
415 | __FUNCTION__, real_dev->name); | 412 | __FUNCTION__, real_dev->name); |
416 | goto out_put_dev; | 413 | goto out_put_dev; |
417 | } | 414 | } |
418 | 415 | ||
419 | if ((real_dev->features & NETIF_F_HW_VLAN_FILTER) && | 416 | if ((real_dev->features & NETIF_F_HW_VLAN_FILTER) && |
420 | (real_dev->vlan_rx_add_vid == NULL || | 417 | (!real_dev->vlan_rx_add_vid || !real_dev->vlan_rx_kill_vid)) { |
421 | real_dev->vlan_rx_kill_vid == NULL)) { | ||
422 | printk(VLAN_DBG "%s: Device %s has buggy VLAN hw accel.\n", | 418 | printk(VLAN_DBG "%s: Device %s has buggy VLAN hw accel.\n", |
423 | __FUNCTION__, real_dev->name); | 419 | __FUNCTION__, real_dev->name); |
424 | goto out_put_dev; | 420 | goto out_put_dev; |
@@ -740,8 +736,7 @@ static int vlan_ioctl_handler(void __user *arg) | |||
740 | case SET_VLAN_NAME_TYPE_CMD: | 736 | case SET_VLAN_NAME_TYPE_CMD: |
741 | if (!capable(CAP_NET_ADMIN)) | 737 | if (!capable(CAP_NET_ADMIN)) |
742 | return -EPERM; | 738 | return -EPERM; |
743 | if ((args.u.name_type >= 0) && | 739 | if (args.u.name_type < VLAN_NAME_TYPE_HIGHEST) { |
744 | (args.u.name_type < VLAN_NAME_TYPE_HIGHEST)) { | ||
745 | vlan_name_type = args.u.name_type; | 740 | vlan_name_type = args.u.name_type; |
746 | err = 0; | 741 | err = 0; |
747 | } else { | 742 | } else { |
diff --git a/net/bridge/br_fdb.c b/net/bridge/br_fdb.c index 91b017016d5b..3fc697293819 100644 --- a/net/bridge/br_fdb.c +++ b/net/bridge/br_fdb.c | |||
@@ -121,6 +121,7 @@ void br_fdb_cleanup(unsigned long _data) | |||
121 | { | 121 | { |
122 | struct net_bridge *br = (struct net_bridge *)_data; | 122 | struct net_bridge *br = (struct net_bridge *)_data; |
123 | unsigned long delay = hold_time(br); | 123 | unsigned long delay = hold_time(br); |
124 | unsigned long next_timer = jiffies + br->forward_delay; | ||
124 | int i; | 125 | int i; |
125 | 126 | ||
126 | spin_lock_bh(&br->hash_lock); | 127 | spin_lock_bh(&br->hash_lock); |
@@ -129,14 +130,21 @@ void br_fdb_cleanup(unsigned long _data) | |||
129 | struct hlist_node *h, *n; | 130 | struct hlist_node *h, *n; |
130 | 131 | ||
131 | hlist_for_each_entry_safe(f, h, n, &br->hash[i], hlist) { | 132 | hlist_for_each_entry_safe(f, h, n, &br->hash[i], hlist) { |
132 | if (!f->is_static && | 133 | unsigned long this_timer; |
133 | time_before_eq(f->ageing_timer + delay, jiffies)) | 134 | if (f->is_static) |
135 | continue; | ||
136 | this_timer = f->ageing_timer + delay; | ||
137 | if (time_before_eq(this_timer, jiffies)) | ||
134 | fdb_delete(f); | 138 | fdb_delete(f); |
139 | else if (this_timer < next_timer) | ||
140 | next_timer = this_timer; | ||
135 | } | 141 | } |
136 | } | 142 | } |
137 | spin_unlock_bh(&br->hash_lock); | 143 | spin_unlock_bh(&br->hash_lock); |
138 | 144 | ||
139 | mod_timer(&br->gc_timer, jiffies + HZ/10); | 145 | /* Add HZ/4 to ensure we round the jiffies upwards to be after the next |
146 | * timer, otherwise we might round down and will have no-op run. */ | ||
147 | mod_timer(&br->gc_timer, round_jiffies(next_timer + HZ/4)); | ||
140 | } | 148 | } |
141 | 149 | ||
142 | /* Completely flush all dynamic entries in forwarding database.*/ | 150 | /* Completely flush all dynamic entries in forwarding database.*/ |
diff --git a/net/bridge/br_stp.c b/net/bridge/br_stp.c index 0e035d6162cc..e38034aa56f5 100644 --- a/net/bridge/br_stp.c +++ b/net/bridge/br_stp.c | |||
@@ -178,7 +178,8 @@ void br_transmit_config(struct net_bridge_port *p) | |||
178 | br_send_config_bpdu(p, &bpdu); | 178 | br_send_config_bpdu(p, &bpdu); |
179 | p->topology_change_ack = 0; | 179 | p->topology_change_ack = 0; |
180 | p->config_pending = 0; | 180 | p->config_pending = 0; |
181 | mod_timer(&p->hold_timer, jiffies + BR_HOLD_TIME); | 181 | mod_timer(&p->hold_timer, |
182 | round_jiffies(jiffies + BR_HOLD_TIME)); | ||
182 | } | 183 | } |
183 | } | 184 | } |
184 | 185 | ||
diff --git a/net/bridge/br_stp_timer.c b/net/bridge/br_stp_timer.c index 24e0ca4a3131..77f5255e6915 100644 --- a/net/bridge/br_stp_timer.c +++ b/net/bridge/br_stp_timer.c | |||
@@ -42,7 +42,7 @@ static void br_hello_timer_expired(unsigned long arg) | |||
42 | if (br->dev->flags & IFF_UP) { | 42 | if (br->dev->flags & IFF_UP) { |
43 | br_config_bpdu_generation(br); | 43 | br_config_bpdu_generation(br); |
44 | 44 | ||
45 | mod_timer(&br->hello_timer, jiffies + br->hello_time); | 45 | mod_timer(&br->hello_timer, round_jiffies(jiffies + br->hello_time)); |
46 | } | 46 | } |
47 | spin_unlock(&br->lock); | 47 | spin_unlock(&br->lock); |
48 | } | 48 | } |
diff --git a/net/core/sock.c b/net/core/sock.c index 7e51d3a5e4f6..c14ce0198d25 100644 --- a/net/core/sock.c +++ b/net/core/sock.c | |||
@@ -998,7 +998,7 @@ void sk_setup_caps(struct sock *sk, struct dst_entry *dst) | |||
998 | __sk_dst_set(sk, dst); | 998 | __sk_dst_set(sk, dst); |
999 | sk->sk_route_caps = dst->dev->features; | 999 | sk->sk_route_caps = dst->dev->features; |
1000 | if (sk->sk_route_caps & NETIF_F_GSO) | 1000 | if (sk->sk_route_caps & NETIF_F_GSO) |
1001 | sk->sk_route_caps |= NETIF_F_GSO_MASK; | 1001 | sk->sk_route_caps |= NETIF_F_GSO_SOFTWARE; |
1002 | if (sk_can_gso(sk)) { | 1002 | if (sk_can_gso(sk)) { |
1003 | if (dst->header_len) | 1003 | if (dst->header_len) |
1004 | sk->sk_route_caps &= ~NETIF_F_GSO_MASK; | 1004 | sk->sk_route_caps &= ~NETIF_F_GSO_MASK; |
diff --git a/net/core/sysctl_net_core.c b/net/core/sysctl_net_core.c index f34aca041a25..6d5ea9762040 100644 --- a/net/core/sysctl_net_core.c +++ b/net/core/sysctl_net_core.c | |||
@@ -25,6 +25,7 @@ extern int sysctl_core_destroy_delay; | |||
25 | extern u32 sysctl_xfrm_aevent_etime; | 25 | extern u32 sysctl_xfrm_aevent_etime; |
26 | extern u32 sysctl_xfrm_aevent_rseqth; | 26 | extern u32 sysctl_xfrm_aevent_rseqth; |
27 | extern int sysctl_xfrm_larval_drop; | 27 | extern int sysctl_xfrm_larval_drop; |
28 | extern u32 sysctl_xfrm_acq_expires; | ||
28 | #endif | 29 | #endif |
29 | 30 | ||
30 | ctl_table core_table[] = { | 31 | ctl_table core_table[] = { |
@@ -127,6 +128,14 @@ ctl_table core_table[] = { | |||
127 | .mode = 0644, | 128 | .mode = 0644, |
128 | .proc_handler = &proc_dointvec | 129 | .proc_handler = &proc_dointvec |
129 | }, | 130 | }, |
131 | { | ||
132 | .ctl_name = CTL_UNNUMBERED, | ||
133 | .procname = "xfrm_acq_expires", | ||
134 | .data = &sysctl_xfrm_acq_expires, | ||
135 | .maxlen = sizeof(int), | ||
136 | .mode = 0644, | ||
137 | .proc_handler = &proc_dointvec | ||
138 | }, | ||
130 | #endif /* CONFIG_XFRM */ | 139 | #endif /* CONFIG_XFRM */ |
131 | #endif /* CONFIG_NET */ | 140 | #endif /* CONFIG_NET */ |
132 | { | 141 | { |
diff --git a/net/core/utils.c b/net/core/utils.c index adecfd281ae9..2030bb8c2d30 100644 --- a/net/core/utils.c +++ b/net/core/utils.c | |||
@@ -139,16 +139,16 @@ int in4_pton(const char *src, int srclen, | |||
139 | while(1) { | 139 | while(1) { |
140 | int c; | 140 | int c; |
141 | c = xdigit2bin(srclen > 0 ? *s : '\0', delim); | 141 | c = xdigit2bin(srclen > 0 ? *s : '\0', delim); |
142 | if (!(c & (IN6PTON_DIGIT | IN6PTON_DOT | IN6PTON_DELIM))) { | 142 | if (!(c & (IN6PTON_DIGIT | IN6PTON_DOT | IN6PTON_DELIM | IN6PTON_COLON_MASK))) { |
143 | goto out; | 143 | goto out; |
144 | } | 144 | } |
145 | if (c & (IN6PTON_DOT | IN6PTON_DELIM)) { | 145 | if (c & (IN6PTON_DOT | IN6PTON_DELIM | IN6PTON_COLON_MASK)) { |
146 | if (w == 0) | 146 | if (w == 0) |
147 | goto out; | 147 | goto out; |
148 | *d++ = w & 0xff; | 148 | *d++ = w & 0xff; |
149 | w = 0; | 149 | w = 0; |
150 | i++; | 150 | i++; |
151 | if (c & IN6PTON_DELIM) { | 151 | if (c & (IN6PTON_DELIM | IN6PTON_COLON_MASK)) { |
152 | if (i != 4) | 152 | if (i != 4) |
153 | goto out; | 153 | goto out; |
154 | break; | 154 | break; |
diff --git a/net/dccp/probe.c b/net/dccp/probe.c index 1f5e3ba62065..43a3adb027e7 100644 --- a/net/dccp/probe.c +++ b/net/dccp/probe.c | |||
@@ -128,7 +128,7 @@ static ssize_t dccpprobe_read(struct file *file, char __user *buf, | |||
128 | int error = 0, cnt = 0; | 128 | int error = 0, cnt = 0; |
129 | unsigned char *tbuf; | 129 | unsigned char *tbuf; |
130 | 130 | ||
131 | if (!buf || len < 0) | 131 | if (!buf) |
132 | return -EINVAL; | 132 | return -EINVAL; |
133 | 133 | ||
134 | if (len == 0) | 134 | if (len == 0) |
diff --git a/net/ieee80211/ieee80211_module.c b/net/ieee80211/ieee80211_module.c index 7ec6610841ba..17ad278696ed 100644 --- a/net/ieee80211/ieee80211_module.c +++ b/net/ieee80211/ieee80211_module.c | |||
@@ -140,7 +140,7 @@ struct net_device *alloc_ieee80211(int sizeof_priv) | |||
140 | 140 | ||
141 | dev = alloc_etherdev(sizeof(struct ieee80211_device) + sizeof_priv); | 141 | dev = alloc_etherdev(sizeof(struct ieee80211_device) + sizeof_priv); |
142 | if (!dev) { | 142 | if (!dev) { |
143 | IEEE80211_ERROR("Unable to network device.\n"); | 143 | IEEE80211_ERROR("Unable to allocate network device.\n"); |
144 | goto failed; | 144 | goto failed; |
145 | } | 145 | } |
146 | ieee = netdev_priv(dev); | 146 | ieee = netdev_priv(dev); |
diff --git a/net/ieee80211/softmac/ieee80211softmac_module.c b/net/ieee80211/softmac/ieee80211softmac_module.c index e9cdc6615ddc..c308756c2f9d 100644 --- a/net/ieee80211/softmac/ieee80211softmac_module.c +++ b/net/ieee80211/softmac/ieee80211softmac_module.c | |||
@@ -33,7 +33,10 @@ struct net_device *alloc_ieee80211softmac(int sizeof_priv) | |||
33 | struct ieee80211softmac_device *softmac; | 33 | struct ieee80211softmac_device *softmac; |
34 | struct net_device *dev; | 34 | struct net_device *dev; |
35 | 35 | ||
36 | dev = alloc_ieee80211(sizeof(struct ieee80211softmac_device) + sizeof_priv); | 36 | dev = alloc_ieee80211(sizeof(*softmac) + sizeof_priv); |
37 | if (!dev) | ||
38 | return NULL; | ||
39 | |||
37 | softmac = ieee80211_priv(dev); | 40 | softmac = ieee80211_priv(dev); |
38 | softmac->dev = dev; | 41 | softmac->dev = dev; |
39 | softmac->ieee = netdev_priv(dev); | 42 | softmac->ieee = netdev_priv(dev); |
diff --git a/net/ipv4/datagram.c b/net/ipv4/datagram.c index dd02a45d0f67..0301dd468cf4 100644 --- a/net/ipv4/datagram.c +++ b/net/ipv4/datagram.c | |||
@@ -50,8 +50,12 @@ int ip4_datagram_connect(struct sock *sk, struct sockaddr *uaddr, int addr_len) | |||
50 | RT_CONN_FLAGS(sk), oif, | 50 | RT_CONN_FLAGS(sk), oif, |
51 | sk->sk_protocol, | 51 | sk->sk_protocol, |
52 | inet->sport, usin->sin_port, sk, 1); | 52 | inet->sport, usin->sin_port, sk, 1); |
53 | if (err) | 53 | if (err) { |
54 | if (err == -ENETUNREACH) | ||
55 | IP_INC_STATS_BH(IPSTATS_MIB_OUTNOROUTES); | ||
54 | return err; | 56 | return err; |
57 | } | ||
58 | |||
55 | if ((rt->rt_flags & RTCF_BROADCAST) && !sock_flag(sk, SOCK_BROADCAST)) { | 59 | if ((rt->rt_flags & RTCF_BROADCAST) && !sock_flag(sk, SOCK_BROADCAST)) { |
56 | ip_rt_put(rt); | 60 | ip_rt_put(rt); |
57 | return -EACCES; | 61 | return -EACCES; |
diff --git a/net/ipv4/fib_frontend.c b/net/ipv4/fib_frontend.c index 837f2957fa83..9ad1f6252a97 100644 --- a/net/ipv4/fib_frontend.c +++ b/net/ipv4/fib_frontend.c | |||
@@ -250,8 +250,6 @@ e_inval: | |||
250 | return -EINVAL; | 250 | return -EINVAL; |
251 | } | 251 | } |
252 | 252 | ||
253 | #ifndef CONFIG_IP_NOSIOCRT | ||
254 | |||
255 | static inline __be32 sk_extract_addr(struct sockaddr *addr) | 253 | static inline __be32 sk_extract_addr(struct sockaddr *addr) |
256 | { | 254 | { |
257 | return ((struct sockaddr_in *) addr)->sin_addr.s_addr; | 255 | return ((struct sockaddr_in *) addr)->sin_addr.s_addr; |
@@ -443,15 +441,6 @@ int ip_rt_ioctl(unsigned int cmd, void __user *arg) | |||
443 | return -EINVAL; | 441 | return -EINVAL; |
444 | } | 442 | } |
445 | 443 | ||
446 | #else | ||
447 | |||
448 | int ip_rt_ioctl(unsigned int cmd, void *arg) | ||
449 | { | ||
450 | return -EINVAL; | ||
451 | } | ||
452 | |||
453 | #endif | ||
454 | |||
455 | struct nla_policy rtm_ipv4_policy[RTA_MAX+1] __read_mostly = { | 444 | struct nla_policy rtm_ipv4_policy[RTA_MAX+1] __read_mostly = { |
456 | [RTA_DST] = { .type = NLA_U32 }, | 445 | [RTA_DST] = { .type = NLA_U32 }, |
457 | [RTA_SRC] = { .type = NLA_U32 }, | 446 | [RTA_SRC] = { .type = NLA_U32 }, |
diff --git a/net/ipv4/icmp.c b/net/ipv4/icmp.c index e238b17f554c..02a899bec196 100644 --- a/net/ipv4/icmp.c +++ b/net/ipv4/icmp.c | |||
@@ -514,12 +514,15 @@ void icmp_send(struct sk_buff *skb_in, int type, int code, __be32 info) | |||
514 | 514 | ||
515 | saddr = iph->daddr; | 515 | saddr = iph->daddr; |
516 | if (!(rt->rt_flags & RTCF_LOCAL)) { | 516 | if (!(rt->rt_flags & RTCF_LOCAL)) { |
517 | /* This is broken, skb_in->dev points to the outgoing device | 517 | struct net_device *dev = NULL; |
518 | * after the packet passes through ip_output(). | 518 | |
519 | */ | 519 | if (rt->fl.iif && sysctl_icmp_errors_use_inbound_ifaddr) |
520 | if (skb_in->dev && sysctl_icmp_errors_use_inbound_ifaddr) | 520 | dev = dev_get_by_index(rt->fl.iif); |
521 | saddr = inet_select_addr(skb_in->dev, 0, RT_SCOPE_LINK); | 521 | |
522 | else | 522 | if (dev) { |
523 | saddr = inet_select_addr(dev, 0, RT_SCOPE_LINK); | ||
524 | dev_put(dev); | ||
525 | } else | ||
523 | saddr = 0; | 526 | saddr = 0; |
524 | } | 527 | } |
525 | 528 | ||
diff --git a/net/ipv4/inet_connection_sock.c b/net/ipv4/inet_connection_sock.c index 43fb1600f1f0..fbe7714f21d0 100644 --- a/net/ipv4/inet_connection_sock.c +++ b/net/ipv4/inet_connection_sock.c | |||
@@ -31,10 +31,8 @@ EXPORT_SYMBOL(inet_csk_timer_bug_msg); | |||
31 | 31 | ||
32 | /* | 32 | /* |
33 | * This array holds the first and last local port number. | 33 | * This array holds the first and last local port number. |
34 | * For high-usage systems, use sysctl to change this to | ||
35 | * 32768-61000 | ||
36 | */ | 34 | */ |
37 | int sysctl_local_port_range[2] = { 1024, 4999 }; | 35 | int sysctl_local_port_range[2] = { 32768, 61000 }; |
38 | 36 | ||
39 | int inet_csk_bind_conflict(const struct sock *sk, | 37 | int inet_csk_bind_conflict(const struct sock *sk, |
40 | const struct inet_bind_bucket *tb) | 38 | const struct inet_bind_bucket *tb) |
diff --git a/net/ipv4/tcp.c b/net/ipv4/tcp.c index bd4c295f5d79..cd3c7e95de9e 100644 --- a/net/ipv4/tcp.c +++ b/net/ipv4/tcp.c | |||
@@ -1674,9 +1674,8 @@ adjudge_to_death: | |||
1674 | } | 1674 | } |
1675 | if (sk->sk_state != TCP_CLOSE) { | 1675 | if (sk->sk_state != TCP_CLOSE) { |
1676 | sk_stream_mem_reclaim(sk); | 1676 | sk_stream_mem_reclaim(sk); |
1677 | if (atomic_read(sk->sk_prot->orphan_count) > sysctl_tcp_max_orphans || | 1677 | if (tcp_too_many_orphans(sk, |
1678 | (sk->sk_wmem_queued > SOCK_MIN_SNDBUF && | 1678 | atomic_read(sk->sk_prot->orphan_count))) { |
1679 | atomic_read(&tcp_memory_allocated) > sysctl_tcp_mem[2])) { | ||
1680 | if (net_ratelimit()) | 1679 | if (net_ratelimit()) |
1681 | printk(KERN_INFO "TCP: too many of orphaned " | 1680 | printk(KERN_INFO "TCP: too many of orphaned " |
1682 | "sockets\n"); | 1681 | "sockets\n"); |
@@ -2465,13 +2464,10 @@ void __init tcp_init(void) | |||
2465 | order++) | 2464 | order++) |
2466 | ; | 2465 | ; |
2467 | if (order >= 4) { | 2466 | if (order >= 4) { |
2468 | sysctl_local_port_range[0] = 32768; | ||
2469 | sysctl_local_port_range[1] = 61000; | ||
2470 | tcp_death_row.sysctl_max_tw_buckets = 180000; | 2467 | tcp_death_row.sysctl_max_tw_buckets = 180000; |
2471 | sysctl_tcp_max_orphans = 4096 << (order - 4); | 2468 | sysctl_tcp_max_orphans = 4096 << (order - 4); |
2472 | sysctl_max_syn_backlog = 1024; | 2469 | sysctl_max_syn_backlog = 1024; |
2473 | } else if (order < 3) { | 2470 | } else if (order < 3) { |
2474 | sysctl_local_port_range[0] = 1024 * (3 - order); | ||
2475 | tcp_death_row.sysctl_max_tw_buckets >>= (3 - order); | 2471 | tcp_death_row.sysctl_max_tw_buckets >>= (3 - order); |
2476 | sysctl_tcp_max_orphans >>= (3 - order); | 2472 | sysctl_tcp_max_orphans >>= (3 - order); |
2477 | sysctl_max_syn_backlog = 128; | 2473 | sysctl_max_syn_backlog = 128; |
diff --git a/net/ipv4/tcp_input.c b/net/ipv4/tcp_input.c index 38cb25b48bf3..74683d81c3f1 100644 --- a/net/ipv4/tcp_input.c +++ b/net/ipv4/tcp_input.c | |||
@@ -2407,8 +2407,8 @@ static int tcp_clean_rtx_queue(struct sock *sk, __s32 *seq_rtt_p) | |||
2407 | struct sk_buff *skb; | 2407 | struct sk_buff *skb; |
2408 | __u32 now = tcp_time_stamp; | 2408 | __u32 now = tcp_time_stamp; |
2409 | int acked = 0; | 2409 | int acked = 0; |
2410 | int prior_packets = tp->packets_out; | ||
2410 | __s32 seq_rtt = -1; | 2411 | __s32 seq_rtt = -1; |
2411 | u32 pkts_acked = 0; | ||
2412 | ktime_t last_ackt = ktime_set(0,0); | 2412 | ktime_t last_ackt = ktime_set(0,0); |
2413 | 2413 | ||
2414 | while ((skb = tcp_write_queue_head(sk)) && | 2414 | while ((skb = tcp_write_queue_head(sk)) && |
@@ -2437,7 +2437,6 @@ static int tcp_clean_rtx_queue(struct sock *sk, __s32 *seq_rtt_p) | |||
2437 | */ | 2437 | */ |
2438 | if (!(scb->flags & TCPCB_FLAG_SYN)) { | 2438 | if (!(scb->flags & TCPCB_FLAG_SYN)) { |
2439 | acked |= FLAG_DATA_ACKED; | 2439 | acked |= FLAG_DATA_ACKED; |
2440 | ++pkts_acked; | ||
2441 | } else { | 2440 | } else { |
2442 | acked |= FLAG_SYN_ACKED; | 2441 | acked |= FLAG_SYN_ACKED; |
2443 | tp->retrans_stamp = 0; | 2442 | tp->retrans_stamp = 0; |
@@ -2481,6 +2480,7 @@ static int tcp_clean_rtx_queue(struct sock *sk, __s32 *seq_rtt_p) | |||
2481 | } | 2480 | } |
2482 | 2481 | ||
2483 | if (acked&FLAG_ACKED) { | 2482 | if (acked&FLAG_ACKED) { |
2483 | u32 pkts_acked = prior_packets - tp->packets_out; | ||
2484 | const struct tcp_congestion_ops *ca_ops | 2484 | const struct tcp_congestion_ops *ca_ops |
2485 | = inet_csk(sk)->icsk_ca_ops; | 2485 | = inet_csk(sk)->icsk_ca_ops; |
2486 | 2486 | ||
diff --git a/net/ipv4/tcp_ipv4.c b/net/ipv4/tcp_ipv4.c index 5a3e7f839fc5..47c61055eb60 100644 --- a/net/ipv4/tcp_ipv4.c +++ b/net/ipv4/tcp_ipv4.c | |||
@@ -192,8 +192,11 @@ int tcp_v4_connect(struct sock *sk, struct sockaddr *uaddr, int addr_len) | |||
192 | RT_CONN_FLAGS(sk), sk->sk_bound_dev_if, | 192 | RT_CONN_FLAGS(sk), sk->sk_bound_dev_if, |
193 | IPPROTO_TCP, | 193 | IPPROTO_TCP, |
194 | inet->sport, usin->sin_port, sk, 1); | 194 | inet->sport, usin->sin_port, sk, 1); |
195 | if (tmp < 0) | 195 | if (tmp < 0) { |
196 | if (tmp == -ENETUNREACH) | ||
197 | IP_INC_STATS_BH(IPSTATS_MIB_OUTNOROUTES); | ||
196 | return tmp; | 198 | return tmp; |
199 | } | ||
197 | 200 | ||
198 | if (rt->rt_flags & (RTCF_MULTICAST | RTCF_BROADCAST)) { | 201 | if (rt->rt_flags & (RTCF_MULTICAST | RTCF_BROADCAST)) { |
199 | ip_rt_put(rt); | 202 | ip_rt_put(rt); |
diff --git a/net/ipv4/tcp_probe.c b/net/ipv4/tcp_probe.c index 3938d5dbdf20..760165a0800c 100644 --- a/net/ipv4/tcp_probe.c +++ b/net/ipv4/tcp_probe.c | |||
@@ -80,7 +80,8 @@ static void printl(const char *fmt, ...) | |||
80 | 80 | ||
81 | kfifo_put(tcpw.fifo, tbuf, len); | 81 | kfifo_put(tcpw.fifo, tbuf, len); |
82 | wake_up(&tcpw.wait); | 82 | wake_up(&tcpw.wait); |
83 | } | 83 | } __attribute__ ((format (printf, 1, 2))); |
84 | |||
84 | 85 | ||
85 | /* | 86 | /* |
86 | * Hook inserted to be called before each receive packet. | 87 | * Hook inserted to be called before each receive packet. |
@@ -95,7 +96,7 @@ static int jtcp_rcv_established(struct sock *sk, struct sk_buff *skb, | |||
95 | /* Only update if port matches */ | 96 | /* Only update if port matches */ |
96 | if ((port == 0 || ntohs(inet->dport) == port || ntohs(inet->sport) == port) | 97 | if ((port == 0 || ntohs(inet->dport) == port || ntohs(inet->sport) == port) |
97 | && (full || tp->snd_cwnd != tcpw.lastcwnd)) { | 98 | && (full || tp->snd_cwnd != tcpw.lastcwnd)) { |
98 | printl("%d.%d.%d.%d:%u %d.%d.%d.%d:%u %d %#x %#x %u %u %u\n", | 99 | printl("%d.%d.%d.%d:%u %d.%d.%d.%d:%u %d %#x %#x %u %u %u %u\n", |
99 | NIPQUAD(inet->saddr), ntohs(inet->sport), | 100 | NIPQUAD(inet->saddr), ntohs(inet->sport), |
100 | NIPQUAD(inet->daddr), ntohs(inet->dport), | 101 | NIPQUAD(inet->daddr), ntohs(inet->dport), |
101 | skb->len, tp->snd_nxt, tp->snd_una, | 102 | skb->len, tp->snd_nxt, tp->snd_una, |
diff --git a/net/ipv4/tcp_timer.c b/net/ipv4/tcp_timer.c index 2ca97b20929d..e61340150ba6 100644 --- a/net/ipv4/tcp_timer.c +++ b/net/ipv4/tcp_timer.c | |||
@@ -78,9 +78,7 @@ static int tcp_out_of_resources(struct sock *sk, int do_reset) | |||
78 | if (sk->sk_err_soft) | 78 | if (sk->sk_err_soft) |
79 | orphans <<= 1; | 79 | orphans <<= 1; |
80 | 80 | ||
81 | if (orphans >= sysctl_tcp_max_orphans || | 81 | if (tcp_too_many_orphans(sk, orphans)) { |
82 | (sk->sk_wmem_queued > SOCK_MIN_SNDBUF && | ||
83 | atomic_read(&tcp_memory_allocated) > sysctl_tcp_mem[2])) { | ||
84 | if (net_ratelimit()) | 82 | if (net_ratelimit()) |
85 | printk(KERN_INFO "Out of socket memory\n"); | 83 | printk(KERN_INFO "Out of socket memory\n"); |
86 | 84 | ||
diff --git a/net/ipv4/udp.c b/net/ipv4/udp.c index 4c7e95fa090d..5da703e699da 100644 --- a/net/ipv4/udp.c +++ b/net/ipv4/udp.c | |||
@@ -722,8 +722,11 @@ int udp_sendmsg(struct kiocb *iocb, struct sock *sk, struct msghdr *msg, | |||
722 | .dport = dport } } }; | 722 | .dport = dport } } }; |
723 | security_sk_classify_flow(sk, &fl); | 723 | security_sk_classify_flow(sk, &fl); |
724 | err = ip_route_output_flow(&rt, &fl, sk, 1); | 724 | err = ip_route_output_flow(&rt, &fl, sk, 1); |
725 | if (err) | 725 | if (err) { |
726 | if (err == -ENETUNREACH) | ||
727 | IP_INC_STATS_BH(IPSTATS_MIB_OUTNOROUTES); | ||
726 | goto out; | 728 | goto out; |
729 | } | ||
727 | 730 | ||
728 | err = -EACCES; | 731 | err = -EACCES; |
729 | if ((rt->rt_flags & RTCF_BROADCAST) && | 732 | if ((rt->rt_flags & RTCF_BROADCAST) && |
diff --git a/net/ipv4/xfrm4_input.c b/net/ipv4/xfrm4_input.c index 5ceca951d73f..fa1902dc81b8 100644 --- a/net/ipv4/xfrm4_input.c +++ b/net/ipv4/xfrm4_input.c | |||
@@ -139,10 +139,8 @@ int xfrm4_rcv_encap(struct sk_buff *skb, __u16 encap_type) | |||
139 | nf_reset(skb); | 139 | nf_reset(skb); |
140 | 140 | ||
141 | if (decaps) { | 141 | if (decaps) { |
142 | if (!(skb->dev->flags&IFF_LOOPBACK)) { | 142 | dst_release(skb->dst); |
143 | dst_release(skb->dst); | 143 | skb->dst = NULL; |
144 | skb->dst = NULL; | ||
145 | } | ||
146 | netif_rx(skb); | 144 | netif_rx(skb); |
147 | return 0; | 145 | return 0; |
148 | } else { | 146 | } else { |
diff --git a/net/ipv4/xfrm4_mode_tunnel.c b/net/ipv4/xfrm4_mode_tunnel.c index a2f2e6a5ec5d..9963700e74c1 100644 --- a/net/ipv4/xfrm4_mode_tunnel.c +++ b/net/ipv4/xfrm4_mode_tunnel.c | |||
@@ -85,6 +85,8 @@ static int xfrm4_tunnel_output(struct xfrm_state *x, struct sk_buff *skb) | |||
85 | top_iph->saddr = x->props.saddr.a4; | 85 | top_iph->saddr = x->props.saddr.a4; |
86 | top_iph->daddr = x->id.daddr.a4; | 86 | top_iph->daddr = x->id.daddr.a4; |
87 | 87 | ||
88 | skb->protocol = htons(ETH_P_IP); | ||
89 | |||
88 | memset(&(IPCB(skb)->opt), 0, sizeof(struct ip_options)); | 90 | memset(&(IPCB(skb)->opt), 0, sizeof(struct ip_options)); |
89 | return 0; | 91 | return 0; |
90 | } | 92 | } |
diff --git a/net/ipv6/ah6.c b/net/ipv6/ah6.c index b696c8401200..128f94c79c64 100644 --- a/net/ipv6/ah6.c +++ b/net/ipv6/ah6.c | |||
@@ -247,7 +247,7 @@ static int ah6_output(struct xfrm_state *x, struct sk_buff *skb) | |||
247 | memcpy(tmp_base, top_iph, sizeof(tmp_base)); | 247 | memcpy(tmp_base, top_iph, sizeof(tmp_base)); |
248 | 248 | ||
249 | tmp_ext = NULL; | 249 | tmp_ext = NULL; |
250 | extlen = skb_transport_offset(skb) + sizeof(struct ipv6hdr); | 250 | extlen = skb_transport_offset(skb) - sizeof(struct ipv6hdr); |
251 | if (extlen) { | 251 | if (extlen) { |
252 | extlen += sizeof(*tmp_ext); | 252 | extlen += sizeof(*tmp_ext); |
253 | tmp_ext = kmalloc(extlen, GFP_ATOMIC); | 253 | tmp_ext = kmalloc(extlen, GFP_ATOMIC); |
diff --git a/net/ipv6/ip6_fib.c b/net/ipv6/ip6_fib.c index ca08ee88d07f..662a7d9681fd 100644 --- a/net/ipv6/ip6_fib.c +++ b/net/ipv6/ip6_fib.c | |||
@@ -619,14 +619,6 @@ static int fib6_add_rt2node(struct fib6_node *fn, struct rt6_info *rt, | |||
619 | 619 | ||
620 | ins = &fn->leaf; | 620 | ins = &fn->leaf; |
621 | 621 | ||
622 | if (fn->fn_flags&RTN_TL_ROOT && | ||
623 | fn->leaf == &ip6_null_entry && | ||
624 | !(rt->rt6i_flags & (RTF_DEFAULT | RTF_ADDRCONF)) ){ | ||
625 | fn->leaf = rt; | ||
626 | rt->u.dst.rt6_next = NULL; | ||
627 | goto out; | ||
628 | } | ||
629 | |||
630 | for (iter = fn->leaf; iter; iter=iter->u.dst.rt6_next) { | 622 | for (iter = fn->leaf; iter; iter=iter->u.dst.rt6_next) { |
631 | /* | 623 | /* |
632 | * Search for duplicates | 624 | * Search for duplicates |
@@ -666,7 +658,6 @@ static int fib6_add_rt2node(struct fib6_node *fn, struct rt6_info *rt, | |||
666 | * insert node | 658 | * insert node |
667 | */ | 659 | */ |
668 | 660 | ||
669 | out: | ||
670 | rt->u.dst.rt6_next = iter; | 661 | rt->u.dst.rt6_next = iter; |
671 | *ins = rt; | 662 | *ins = rt; |
672 | rt->rt6i_node = fn; | 663 | rt->rt6i_node = fn; |
diff --git a/net/ipv6/netfilter/nf_conntrack_l3proto_ipv6.c b/net/ipv6/netfilter/nf_conntrack_l3proto_ipv6.c index 6d2a08205111..dc442fb791b0 100644 --- a/net/ipv6/netfilter/nf_conntrack_l3proto_ipv6.c +++ b/net/ipv6/netfilter/nf_conntrack_l3proto_ipv6.c | |||
@@ -177,8 +177,7 @@ static unsigned int ipv6_confirm(unsigned int hooknum, | |||
177 | 177 | ||
178 | protoff = nf_ct_ipv6_skip_exthdr(*pskb, extoff, &pnum, | 178 | protoff = nf_ct_ipv6_skip_exthdr(*pskb, extoff, &pnum, |
179 | (*pskb)->len - extoff); | 179 | (*pskb)->len - extoff); |
180 | if (protoff < 0 || protoff > (*pskb)->len || | 180 | if (protoff > (*pskb)->len || pnum == NEXTHDR_FRAGMENT) { |
181 | pnum == NEXTHDR_FRAGMENT) { | ||
182 | DEBUGP("proto header not found\n"); | 181 | DEBUGP("proto header not found\n"); |
183 | return NF_ACCEPT; | 182 | return NF_ACCEPT; |
184 | } | 183 | } |
diff --git a/net/ipv6/netfilter/nf_conntrack_proto_icmpv6.c b/net/ipv6/netfilter/nf_conntrack_proto_icmpv6.c index 0be790d250f9..8814b95b2326 100644 --- a/net/ipv6/netfilter/nf_conntrack_proto_icmpv6.c +++ b/net/ipv6/netfilter/nf_conntrack_proto_icmpv6.c | |||
@@ -168,8 +168,7 @@ icmpv6_error_message(struct sk_buff *skb, | |||
168 | skb->len - inip6off | 168 | skb->len - inip6off |
169 | - sizeof(struct ipv6hdr)); | 169 | - sizeof(struct ipv6hdr)); |
170 | 170 | ||
171 | if ((inprotoff < 0) || (inprotoff > skb->len) || | 171 | if ((inprotoff > skb->len) || (inprotonum == NEXTHDR_FRAGMENT)) { |
172 | (inprotonum == NEXTHDR_FRAGMENT)) { | ||
173 | DEBUGP("icmpv6_error: Can't get protocol header in ICMPv6 payload.\n"); | 172 | DEBUGP("icmpv6_error: Can't get protocol header in ICMPv6 payload.\n"); |
174 | return -NF_ACCEPT; | 173 | return -NF_ACCEPT; |
175 | } | 174 | } |
diff --git a/net/ipv6/xfrm6_input.c b/net/ipv6/xfrm6_input.c index d7ed8aa56ec1..c858537cec4b 100644 --- a/net/ipv6/xfrm6_input.c +++ b/net/ipv6/xfrm6_input.c | |||
@@ -104,10 +104,8 @@ int xfrm6_rcv_spi(struct sk_buff *skb, __be32 spi) | |||
104 | nf_reset(skb); | 104 | nf_reset(skb); |
105 | 105 | ||
106 | if (decaps) { | 106 | if (decaps) { |
107 | if (!(skb->dev->flags&IFF_LOOPBACK)) { | 107 | dst_release(skb->dst); |
108 | dst_release(skb->dst); | 108 | skb->dst = NULL; |
109 | skb->dst = NULL; | ||
110 | } | ||
111 | netif_rx(skb); | 109 | netif_rx(skb); |
112 | return -1; | 110 | return -1; |
113 | } else { | 111 | } else { |
diff --git a/net/ipv6/xfrm6_mode_tunnel.c b/net/ipv6/xfrm6_mode_tunnel.c index a6c0cdf46ad6..9fc95bc6509f 100644 --- a/net/ipv6/xfrm6_mode_tunnel.c +++ b/net/ipv6/xfrm6_mode_tunnel.c | |||
@@ -80,6 +80,7 @@ static int xfrm6_tunnel_output(struct xfrm_state *x, struct sk_buff *skb) | |||
80 | top_iph->hop_limit = dst_metric(dst->child, RTAX_HOPLIMIT); | 80 | top_iph->hop_limit = dst_metric(dst->child, RTAX_HOPLIMIT); |
81 | ipv6_addr_copy(&top_iph->saddr, (struct in6_addr *)&x->props.saddr); | 81 | ipv6_addr_copy(&top_iph->saddr, (struct in6_addr *)&x->props.saddr); |
82 | ipv6_addr_copy(&top_iph->daddr, (struct in6_addr *)&x->id.daddr); | 82 | ipv6_addr_copy(&top_iph->daddr, (struct in6_addr *)&x->id.daddr); |
83 | skb->protocol = htons(ETH_P_IPV6); | ||
83 | return 0; | 84 | return 0; |
84 | } | 85 | } |
85 | 86 | ||
diff --git a/net/mac80211/ieee80211.c b/net/mac80211/ieee80211.c index 6e36df67f8d5..4e84f24fd439 100644 --- a/net/mac80211/ieee80211.c +++ b/net/mac80211/ieee80211.c | |||
@@ -2474,6 +2474,8 @@ static int ieee80211_open(struct net_device *dev) | |||
2474 | if (sdata->type == IEEE80211_IF_TYPE_STA && | 2474 | if (sdata->type == IEEE80211_IF_TYPE_STA && |
2475 | !local->user_space_mlme) | 2475 | !local->user_space_mlme) |
2476 | netif_carrier_off(dev); | 2476 | netif_carrier_off(dev); |
2477 | else | ||
2478 | netif_carrier_on(dev); | ||
2477 | 2479 | ||
2478 | netif_start_queue(dev); | 2480 | netif_start_queue(dev); |
2479 | return 0; | 2481 | return 0; |
@@ -3278,8 +3280,10 @@ ieee80211_rx_h_defragment(struct ieee80211_txrx_data *rx) | |||
3278 | return TXRX_DROP; | 3280 | return TXRX_DROP; |
3279 | } | 3281 | } |
3280 | } | 3282 | } |
3281 | while ((skb = __skb_dequeue(&entry->skb_list))) | 3283 | while ((skb = __skb_dequeue(&entry->skb_list))) { |
3282 | memcpy(skb_put(rx->skb, skb->len), skb->data, skb->len); | 3284 | memcpy(skb_put(rx->skb, skb->len), skb->data, skb->len); |
3285 | dev_kfree_skb(skb); | ||
3286 | } | ||
3283 | 3287 | ||
3284 | /* Complete frame has been reassembled - process it now */ | 3288 | /* Complete frame has been reassembled - process it now */ |
3285 | rx->fragmented = 1; | 3289 | rx->fragmented = 1; |
diff --git a/net/mac80211/ieee80211_sta.c b/net/mac80211/ieee80211_sta.c index 3e07e9d6fa42..9f30ae4c2ab3 100644 --- a/net/mac80211/ieee80211_sta.c +++ b/net/mac80211/ieee80211_sta.c | |||
@@ -1155,6 +1155,8 @@ static void ieee80211_rx_mgmt_assoc_resp(struct net_device *dev, | |||
1155 | if (status_code != WLAN_STATUS_SUCCESS) { | 1155 | if (status_code != WLAN_STATUS_SUCCESS) { |
1156 | printk(KERN_DEBUG "%s: AP denied association (code=%d)\n", | 1156 | printk(KERN_DEBUG "%s: AP denied association (code=%d)\n", |
1157 | dev->name, status_code); | 1157 | dev->name, status_code); |
1158 | if (status_code == WLAN_STATUS_REASSOC_NO_ASSOC) | ||
1159 | ifsta->prev_bssid_set = 0; | ||
1158 | return; | 1160 | return; |
1159 | } | 1161 | } |
1160 | 1162 | ||
@@ -2995,7 +2997,7 @@ struct sta_info * ieee80211_ibss_add_sta(struct net_device *dev, | |||
2995 | { | 2997 | { |
2996 | struct ieee80211_local *local = wdev_priv(dev->ieee80211_ptr); | 2998 | struct ieee80211_local *local = wdev_priv(dev->ieee80211_ptr); |
2997 | struct sta_info *sta; | 2999 | struct sta_info *sta; |
2998 | struct ieee80211_sub_if_data *sdata = NULL; | 3000 | struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev); |
2999 | 3001 | ||
3000 | /* TODO: Could consider removing the least recently used entry and | 3002 | /* TODO: Could consider removing the least recently used entry and |
3001 | * allow new one to be added. */ | 3003 | * allow new one to be added. */ |
diff --git a/net/packet/af_packet.c b/net/packet/af_packet.c index 02e401cd683f..f8b83014ccca 100644 --- a/net/packet/af_packet.c +++ b/net/packet/af_packet.c | |||
@@ -83,22 +83,6 @@ | |||
83 | #include <net/inet_common.h> | 83 | #include <net/inet_common.h> |
84 | #endif | 84 | #endif |
85 | 85 | ||
86 | #define CONFIG_SOCK_PACKET 1 | ||
87 | |||
88 | /* | ||
89 | Proposed replacement for SIOC{ADD,DEL}MULTI and | ||
90 | IFF_PROMISC, IFF_ALLMULTI flags. | ||
91 | |||
92 | It is more expensive, but I believe, | ||
93 | it is really correct solution: reentereble, safe and fault tolerant. | ||
94 | |||
95 | IFF_PROMISC/IFF_ALLMULTI/SIOC{ADD/DEL}MULTI are faked by keeping | ||
96 | reference count and global flag, so that real status is | ||
97 | (gflag|(count != 0)), so that we can use obsolete faulty interface | ||
98 | not harming clever users. | ||
99 | */ | ||
100 | #define CONFIG_PACKET_MULTICAST 1 | ||
101 | |||
102 | /* | 86 | /* |
103 | Assumptions: | 87 | Assumptions: |
104 | - if device has no dev->hard_header routine, it adds and removes ll header | 88 | - if device has no dev->hard_header routine, it adds and removes ll header |
@@ -159,7 +143,6 @@ static atomic_t packet_socks_nr; | |||
159 | 143 | ||
160 | /* Private packet socket structures. */ | 144 | /* Private packet socket structures. */ |
161 | 145 | ||
162 | #ifdef CONFIG_PACKET_MULTICAST | ||
163 | struct packet_mclist | 146 | struct packet_mclist |
164 | { | 147 | { |
165 | struct packet_mclist *next; | 148 | struct packet_mclist *next; |
@@ -179,7 +162,7 @@ struct packet_mreq_max | |||
179 | unsigned short mr_alen; | 162 | unsigned short mr_alen; |
180 | unsigned char mr_address[MAX_ADDR_LEN]; | 163 | unsigned char mr_address[MAX_ADDR_LEN]; |
181 | }; | 164 | }; |
182 | #endif | 165 | |
183 | #ifdef CONFIG_PACKET_MMAP | 166 | #ifdef CONFIG_PACKET_MMAP |
184 | static int packet_set_ring(struct sock *sk, struct tpacket_req *req, int closing); | 167 | static int packet_set_ring(struct sock *sk, struct tpacket_req *req, int closing); |
185 | #endif | 168 | #endif |
@@ -205,9 +188,7 @@ struct packet_sock { | |||
205 | origdev:1; | 188 | origdev:1; |
206 | int ifindex; /* bound device */ | 189 | int ifindex; /* bound device */ |
207 | __be16 num; | 190 | __be16 num; |
208 | #ifdef CONFIG_PACKET_MULTICAST | ||
209 | struct packet_mclist *mclist; | 191 | struct packet_mclist *mclist; |
210 | #endif | ||
211 | #ifdef CONFIG_PACKET_MMAP | 192 | #ifdef CONFIG_PACKET_MMAP |
212 | atomic_t mapped; | 193 | atomic_t mapped; |
213 | unsigned int pg_vec_order; | 194 | unsigned int pg_vec_order; |
@@ -263,7 +244,6 @@ static void packet_sock_destruct(struct sock *sk) | |||
263 | 244 | ||
264 | static const struct proto_ops packet_ops; | 245 | static const struct proto_ops packet_ops; |
265 | 246 | ||
266 | #ifdef CONFIG_SOCK_PACKET | ||
267 | static const struct proto_ops packet_ops_spkt; | 247 | static const struct proto_ops packet_ops_spkt; |
268 | 248 | ||
269 | static int packet_rcv_spkt(struct sk_buff *skb, struct net_device *dev, struct packet_type *pt, struct net_device *orig_dev) | 249 | static int packet_rcv_spkt(struct sk_buff *skb, struct net_device *dev, struct packet_type *pt, struct net_device *orig_dev) |
@@ -435,7 +415,6 @@ out_unlock: | |||
435 | dev_put(dev); | 415 | dev_put(dev); |
436 | return err; | 416 | return err; |
437 | } | 417 | } |
438 | #endif | ||
439 | 418 | ||
440 | static inline unsigned int run_filter(struct sk_buff *skb, struct sock *sk, | 419 | static inline unsigned int run_filter(struct sk_buff *skb, struct sock *sk, |
441 | unsigned int res) | 420 | unsigned int res) |
@@ -851,9 +830,7 @@ static int packet_release(struct socket *sock) | |||
851 | __sock_put(sk); | 830 | __sock_put(sk); |
852 | } | 831 | } |
853 | 832 | ||
854 | #ifdef CONFIG_PACKET_MULTICAST | ||
855 | packet_flush_mclist(sk); | 833 | packet_flush_mclist(sk); |
856 | #endif | ||
857 | 834 | ||
858 | #ifdef CONFIG_PACKET_MMAP | 835 | #ifdef CONFIG_PACKET_MMAP |
859 | if (po->pg_vec) { | 836 | if (po->pg_vec) { |
@@ -936,8 +913,6 @@ out_unlock: | |||
936 | * Bind a packet socket to a device | 913 | * Bind a packet socket to a device |
937 | */ | 914 | */ |
938 | 915 | ||
939 | #ifdef CONFIG_SOCK_PACKET | ||
940 | |||
941 | static int packet_bind_spkt(struct socket *sock, struct sockaddr *uaddr, int addr_len) | 916 | static int packet_bind_spkt(struct socket *sock, struct sockaddr *uaddr, int addr_len) |
942 | { | 917 | { |
943 | struct sock *sk=sock->sk; | 918 | struct sock *sk=sock->sk; |
@@ -960,7 +935,6 @@ static int packet_bind_spkt(struct socket *sock, struct sockaddr *uaddr, int add | |||
960 | } | 935 | } |
961 | return err; | 936 | return err; |
962 | } | 937 | } |
963 | #endif | ||
964 | 938 | ||
965 | static int packet_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len) | 939 | static int packet_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len) |
966 | { | 940 | { |
@@ -1012,11 +986,8 @@ static int packet_create(struct socket *sock, int protocol) | |||
1012 | 986 | ||
1013 | if (!capable(CAP_NET_RAW)) | 987 | if (!capable(CAP_NET_RAW)) |
1014 | return -EPERM; | 988 | return -EPERM; |
1015 | if (sock->type != SOCK_DGRAM && sock->type != SOCK_RAW | 989 | if (sock->type != SOCK_DGRAM && sock->type != SOCK_RAW && |
1016 | #ifdef CONFIG_SOCK_PACKET | 990 | sock->type != SOCK_PACKET) |
1017 | && sock->type != SOCK_PACKET | ||
1018 | #endif | ||
1019 | ) | ||
1020 | return -ESOCKTNOSUPPORT; | 991 | return -ESOCKTNOSUPPORT; |
1021 | 992 | ||
1022 | sock->state = SS_UNCONNECTED; | 993 | sock->state = SS_UNCONNECTED; |
@@ -1027,10 +998,9 @@ static int packet_create(struct socket *sock, int protocol) | |||
1027 | goto out; | 998 | goto out; |
1028 | 999 | ||
1029 | sock->ops = &packet_ops; | 1000 | sock->ops = &packet_ops; |
1030 | #ifdef CONFIG_SOCK_PACKET | ||
1031 | if (sock->type == SOCK_PACKET) | 1001 | if (sock->type == SOCK_PACKET) |
1032 | sock->ops = &packet_ops_spkt; | 1002 | sock->ops = &packet_ops_spkt; |
1033 | #endif | 1003 | |
1034 | sock_init_data(sock, sk); | 1004 | sock_init_data(sock, sk); |
1035 | 1005 | ||
1036 | po = pkt_sk(sk); | 1006 | po = pkt_sk(sk); |
@@ -1046,10 +1016,10 @@ static int packet_create(struct socket *sock, int protocol) | |||
1046 | 1016 | ||
1047 | spin_lock_init(&po->bind_lock); | 1017 | spin_lock_init(&po->bind_lock); |
1048 | po->prot_hook.func = packet_rcv; | 1018 | po->prot_hook.func = packet_rcv; |
1049 | #ifdef CONFIG_SOCK_PACKET | 1019 | |
1050 | if (sock->type == SOCK_PACKET) | 1020 | if (sock->type == SOCK_PACKET) |
1051 | po->prot_hook.func = packet_rcv_spkt; | 1021 | po->prot_hook.func = packet_rcv_spkt; |
1052 | #endif | 1022 | |
1053 | po->prot_hook.af_packet_priv = sk; | 1023 | po->prot_hook.af_packet_priv = sk; |
1054 | 1024 | ||
1055 | if (proto) { | 1025 | if (proto) { |
@@ -1169,7 +1139,6 @@ out: | |||
1169 | return err; | 1139 | return err; |
1170 | } | 1140 | } |
1171 | 1141 | ||
1172 | #ifdef CONFIG_SOCK_PACKET | ||
1173 | static int packet_getname_spkt(struct socket *sock, struct sockaddr *uaddr, | 1142 | static int packet_getname_spkt(struct socket *sock, struct sockaddr *uaddr, |
1174 | int *uaddr_len, int peer) | 1143 | int *uaddr_len, int peer) |
1175 | { | 1144 | { |
@@ -1190,7 +1159,6 @@ static int packet_getname_spkt(struct socket *sock, struct sockaddr *uaddr, | |||
1190 | 1159 | ||
1191 | return 0; | 1160 | return 0; |
1192 | } | 1161 | } |
1193 | #endif | ||
1194 | 1162 | ||
1195 | static int packet_getname(struct socket *sock, struct sockaddr *uaddr, | 1163 | static int packet_getname(struct socket *sock, struct sockaddr *uaddr, |
1196 | int *uaddr_len, int peer) | 1164 | int *uaddr_len, int peer) |
@@ -1221,7 +1189,6 @@ static int packet_getname(struct socket *sock, struct sockaddr *uaddr, | |||
1221 | return 0; | 1189 | return 0; |
1222 | } | 1190 | } |
1223 | 1191 | ||
1224 | #ifdef CONFIG_PACKET_MULTICAST | ||
1225 | static void packet_dev_mc(struct net_device *dev, struct packet_mclist *i, int what) | 1192 | static void packet_dev_mc(struct net_device *dev, struct packet_mclist *i, int what) |
1226 | { | 1193 | { |
1227 | switch (i->type) { | 1194 | switch (i->type) { |
@@ -1349,7 +1316,6 @@ static void packet_flush_mclist(struct sock *sk) | |||
1349 | } | 1316 | } |
1350 | rtnl_unlock(); | 1317 | rtnl_unlock(); |
1351 | } | 1318 | } |
1352 | #endif | ||
1353 | 1319 | ||
1354 | static int | 1320 | static int |
1355 | packet_setsockopt(struct socket *sock, int level, int optname, char __user *optval, int optlen) | 1321 | packet_setsockopt(struct socket *sock, int level, int optname, char __user *optval, int optlen) |
@@ -1362,7 +1328,6 @@ packet_setsockopt(struct socket *sock, int level, int optname, char __user *optv | |||
1362 | return -ENOPROTOOPT; | 1328 | return -ENOPROTOOPT; |
1363 | 1329 | ||
1364 | switch(optname) { | 1330 | switch(optname) { |
1365 | #ifdef CONFIG_PACKET_MULTICAST | ||
1366 | case PACKET_ADD_MEMBERSHIP: | 1331 | case PACKET_ADD_MEMBERSHIP: |
1367 | case PACKET_DROP_MEMBERSHIP: | 1332 | case PACKET_DROP_MEMBERSHIP: |
1368 | { | 1333 | { |
@@ -1383,7 +1348,7 @@ packet_setsockopt(struct socket *sock, int level, int optname, char __user *optv | |||
1383 | ret = packet_mc_drop(sk, &mreq); | 1348 | ret = packet_mc_drop(sk, &mreq); |
1384 | return ret; | 1349 | return ret; |
1385 | } | 1350 | } |
1386 | #endif | 1351 | |
1387 | #ifdef CONFIG_PACKET_MMAP | 1352 | #ifdef CONFIG_PACKET_MMAP |
1388 | case PACKET_RX_RING: | 1353 | case PACKET_RX_RING: |
1389 | { | 1354 | { |
@@ -1506,11 +1471,10 @@ static int packet_notifier(struct notifier_block *this, unsigned long msg, void | |||
1506 | 1471 | ||
1507 | switch (msg) { | 1472 | switch (msg) { |
1508 | case NETDEV_UNREGISTER: | 1473 | case NETDEV_UNREGISTER: |
1509 | #ifdef CONFIG_PACKET_MULTICAST | ||
1510 | if (po->mclist) | 1474 | if (po->mclist) |
1511 | packet_dev_mclist(dev, po->mclist, -1); | 1475 | packet_dev_mclist(dev, po->mclist, -1); |
1512 | // fallthrough | 1476 | /* fallthrough */ |
1513 | #endif | 1477 | |
1514 | case NETDEV_DOWN: | 1478 | case NETDEV_DOWN: |
1515 | if (dev->ifindex == po->ifindex) { | 1479 | if (dev->ifindex == po->ifindex) { |
1516 | spin_lock(&po->bind_lock); | 1480 | spin_lock(&po->bind_lock); |
@@ -1856,7 +1820,6 @@ out: | |||
1856 | #endif | 1820 | #endif |
1857 | 1821 | ||
1858 | 1822 | ||
1859 | #ifdef CONFIG_SOCK_PACKET | ||
1860 | static const struct proto_ops packet_ops_spkt = { | 1823 | static const struct proto_ops packet_ops_spkt = { |
1861 | .family = PF_PACKET, | 1824 | .family = PF_PACKET, |
1862 | .owner = THIS_MODULE, | 1825 | .owner = THIS_MODULE, |
@@ -1877,7 +1840,6 @@ static const struct proto_ops packet_ops_spkt = { | |||
1877 | .mmap = sock_no_mmap, | 1840 | .mmap = sock_no_mmap, |
1878 | .sendpage = sock_no_sendpage, | 1841 | .sendpage = sock_no_sendpage, |
1879 | }; | 1842 | }; |
1880 | #endif | ||
1881 | 1843 | ||
1882 | static const struct proto_ops packet_ops = { | 1844 | static const struct proto_ops packet_ops = { |
1883 | .family = PF_PACKET, | 1845 | .family = PF_PACKET, |
diff --git a/net/sched/act_pedit.c b/net/sched/act_pedit.c index 45b3cda86a21..6f8684b5617e 100644 --- a/net/sched/act_pedit.c +++ b/net/sched/act_pedit.c | |||
@@ -164,8 +164,7 @@ static int tcf_pedit(struct sk_buff *skb, struct tc_action *a, | |||
164 | printk("offset must be on 32 bit boundaries\n"); | 164 | printk("offset must be on 32 bit boundaries\n"); |
165 | goto bad; | 165 | goto bad; |
166 | } | 166 | } |
167 | if (skb->len < 0 || | 167 | if (offset > 0 && offset > skb->len) { |
168 | (offset > 0 && offset > skb->len)) { | ||
169 | printk("offset %d cant exceed pkt length %d\n", | 168 | printk("offset %d cant exceed pkt length %d\n", |
170 | offset, skb->len); | 169 | offset, skb->len); |
171 | goto bad; | 170 | goto bad; |
diff --git a/net/sched/sch_generic.c b/net/sched/sch_generic.c index cbefe225581e..f4d34480a093 100644 --- a/net/sched/sch_generic.c +++ b/net/sched/sch_generic.c | |||
@@ -224,7 +224,8 @@ void __netdev_watchdog_up(struct net_device *dev) | |||
224 | if (dev->tx_timeout) { | 224 | if (dev->tx_timeout) { |
225 | if (dev->watchdog_timeo <= 0) | 225 | if (dev->watchdog_timeo <= 0) |
226 | dev->watchdog_timeo = 5*HZ; | 226 | dev->watchdog_timeo = 5*HZ; |
227 | if (!mod_timer(&dev->watchdog_timer, jiffies + dev->watchdog_timeo)) | 227 | if (!mod_timer(&dev->watchdog_timer, |
228 | round_jiffies(jiffies + dev->watchdog_timeo))) | ||
228 | dev_hold(dev); | 229 | dev_hold(dev); |
229 | } | 230 | } |
230 | } | 231 | } |
diff --git a/net/sctp/debug.c b/net/sctp/debug.c index e8c0f7435d7f..80f70aa53386 100644 --- a/net/sctp/debug.c +++ b/net/sctp/debug.c | |||
@@ -77,8 +77,6 @@ static const char *sctp_cid_tbl[SCTP_NUM_BASE_CHUNK_TYPES] = { | |||
77 | /* Lookup "chunk type" debug name. */ | 77 | /* Lookup "chunk type" debug name. */ |
78 | const char *sctp_cname(const sctp_subtype_t cid) | 78 | const char *sctp_cname(const sctp_subtype_t cid) |
79 | { | 79 | { |
80 | if (cid.chunk < 0) | ||
81 | return "illegal chunk id"; | ||
82 | if (cid.chunk <= SCTP_CID_BASE_MAX) | 80 | if (cid.chunk <= SCTP_CID_BASE_MAX) |
83 | return sctp_cid_tbl[cid.chunk]; | 81 | return sctp_cid_tbl[cid.chunk]; |
84 | 82 | ||
@@ -146,8 +144,6 @@ static const char *sctp_primitive_tbl[SCTP_NUM_PRIMITIVE_TYPES] = { | |||
146 | /* Lookup primitive debug name. */ | 144 | /* Lookup primitive debug name. */ |
147 | const char *sctp_pname(const sctp_subtype_t id) | 145 | const char *sctp_pname(const sctp_subtype_t id) |
148 | { | 146 | { |
149 | if (id.primitive < 0) | ||
150 | return "illegal primitive"; | ||
151 | if (id.primitive <= SCTP_EVENT_PRIMITIVE_MAX) | 147 | if (id.primitive <= SCTP_EVENT_PRIMITIVE_MAX) |
152 | return sctp_primitive_tbl[id.primitive]; | 148 | return sctp_primitive_tbl[id.primitive]; |
153 | return "unknown_primitive"; | 149 | return "unknown_primitive"; |
@@ -161,8 +157,6 @@ static const char *sctp_other_tbl[] = { | |||
161 | /* Lookup "other" debug name. */ | 157 | /* Lookup "other" debug name. */ |
162 | const char *sctp_oname(const sctp_subtype_t id) | 158 | const char *sctp_oname(const sctp_subtype_t id) |
163 | { | 159 | { |
164 | if (id.other < 0) | ||
165 | return "illegal 'other' event"; | ||
166 | if (id.other <= SCTP_EVENT_OTHER_MAX) | 160 | if (id.other <= SCTP_EVENT_OTHER_MAX) |
167 | return sctp_other_tbl[id.other]; | 161 | return sctp_other_tbl[id.other]; |
168 | return "unknown 'other' event"; | 162 | return "unknown 'other' event"; |
@@ -184,8 +178,6 @@ static const char *sctp_timer_tbl[] = { | |||
184 | /* Lookup timer debug name. */ | 178 | /* Lookup timer debug name. */ |
185 | const char *sctp_tname(const sctp_subtype_t id) | 179 | const char *sctp_tname(const sctp_subtype_t id) |
186 | { | 180 | { |
187 | if (id.timeout < 0) | ||
188 | return "illegal 'timer' event"; | ||
189 | if (id.timeout <= SCTP_EVENT_TIMEOUT_MAX) | 181 | if (id.timeout <= SCTP_EVENT_TIMEOUT_MAX) |
190 | return sctp_timer_tbl[id.timeout]; | 182 | return sctp_timer_tbl[id.timeout]; |
191 | return "unknown_timer"; | 183 | return "unknown_timer"; |
diff --git a/net/sctp/sm_statetable.c b/net/sctp/sm_statetable.c index 523071c7902f..70a91ece3c49 100644 --- a/net/sctp/sm_statetable.c +++ b/net/sctp/sm_statetable.c | |||
@@ -960,7 +960,7 @@ static const sctp_sm_table_entry_t *sctp_chunk_event_lookup(sctp_cid_t cid, | |||
960 | if (state > SCTP_STATE_MAX) | 960 | if (state > SCTP_STATE_MAX) |
961 | return &bug; | 961 | return &bug; |
962 | 962 | ||
963 | if (cid >= 0 && cid <= SCTP_CID_BASE_MAX) | 963 | if (cid <= SCTP_CID_BASE_MAX) |
964 | return &chunk_event_table[cid][state]; | 964 | return &chunk_event_table[cid][state]; |
965 | 965 | ||
966 | if (sctp_prsctp_enable) { | 966 | if (sctp_prsctp_enable) { |
diff --git a/net/unix/af_unix.c b/net/unix/af_unix.c index fc12ba51c1fc..87c794d8fa2d 100644 --- a/net/unix/af_unix.c +++ b/net/unix/af_unix.c | |||
@@ -174,11 +174,11 @@ static struct sock *unix_peer_get(struct sock *s) | |||
174 | { | 174 | { |
175 | struct sock *peer; | 175 | struct sock *peer; |
176 | 176 | ||
177 | unix_state_rlock(s); | 177 | unix_state_lock(s); |
178 | peer = unix_peer(s); | 178 | peer = unix_peer(s); |
179 | if (peer) | 179 | if (peer) |
180 | sock_hold(peer); | 180 | sock_hold(peer); |
181 | unix_state_runlock(s); | 181 | unix_state_unlock(s); |
182 | return peer; | 182 | return peer; |
183 | } | 183 | } |
184 | 184 | ||
@@ -369,7 +369,7 @@ static int unix_release_sock (struct sock *sk, int embrion) | |||
369 | unix_remove_socket(sk); | 369 | unix_remove_socket(sk); |
370 | 370 | ||
371 | /* Clear state */ | 371 | /* Clear state */ |
372 | unix_state_wlock(sk); | 372 | unix_state_lock(sk); |
373 | sock_orphan(sk); | 373 | sock_orphan(sk); |
374 | sk->sk_shutdown = SHUTDOWN_MASK; | 374 | sk->sk_shutdown = SHUTDOWN_MASK; |
375 | dentry = u->dentry; | 375 | dentry = u->dentry; |
@@ -378,7 +378,7 @@ static int unix_release_sock (struct sock *sk, int embrion) | |||
378 | u->mnt = NULL; | 378 | u->mnt = NULL; |
379 | state = sk->sk_state; | 379 | state = sk->sk_state; |
380 | sk->sk_state = TCP_CLOSE; | 380 | sk->sk_state = TCP_CLOSE; |
381 | unix_state_wunlock(sk); | 381 | unix_state_unlock(sk); |
382 | 382 | ||
383 | wake_up_interruptible_all(&u->peer_wait); | 383 | wake_up_interruptible_all(&u->peer_wait); |
384 | 384 | ||
@@ -386,12 +386,12 @@ static int unix_release_sock (struct sock *sk, int embrion) | |||
386 | 386 | ||
387 | if (skpair!=NULL) { | 387 | if (skpair!=NULL) { |
388 | if (sk->sk_type == SOCK_STREAM || sk->sk_type == SOCK_SEQPACKET) { | 388 | if (sk->sk_type == SOCK_STREAM || sk->sk_type == SOCK_SEQPACKET) { |
389 | unix_state_wlock(skpair); | 389 | unix_state_lock(skpair); |
390 | /* No more writes */ | 390 | /* No more writes */ |
391 | skpair->sk_shutdown = SHUTDOWN_MASK; | 391 | skpair->sk_shutdown = SHUTDOWN_MASK; |
392 | if (!skb_queue_empty(&sk->sk_receive_queue) || embrion) | 392 | if (!skb_queue_empty(&sk->sk_receive_queue) || embrion) |
393 | skpair->sk_err = ECONNRESET; | 393 | skpair->sk_err = ECONNRESET; |
394 | unix_state_wunlock(skpair); | 394 | unix_state_unlock(skpair); |
395 | skpair->sk_state_change(skpair); | 395 | skpair->sk_state_change(skpair); |
396 | read_lock(&skpair->sk_callback_lock); | 396 | read_lock(&skpair->sk_callback_lock); |
397 | sk_wake_async(skpair,1,POLL_HUP); | 397 | sk_wake_async(skpair,1,POLL_HUP); |
@@ -448,7 +448,7 @@ static int unix_listen(struct socket *sock, int backlog) | |||
448 | err = -EINVAL; | 448 | err = -EINVAL; |
449 | if (!u->addr) | 449 | if (!u->addr) |
450 | goto out; /* No listens on an unbound socket */ | 450 | goto out; /* No listens on an unbound socket */ |
451 | unix_state_wlock(sk); | 451 | unix_state_lock(sk); |
452 | if (sk->sk_state != TCP_CLOSE && sk->sk_state != TCP_LISTEN) | 452 | if (sk->sk_state != TCP_CLOSE && sk->sk_state != TCP_LISTEN) |
453 | goto out_unlock; | 453 | goto out_unlock; |
454 | if (backlog > sk->sk_max_ack_backlog) | 454 | if (backlog > sk->sk_max_ack_backlog) |
@@ -462,7 +462,7 @@ static int unix_listen(struct socket *sock, int backlog) | |||
462 | err = 0; | 462 | err = 0; |
463 | 463 | ||
464 | out_unlock: | 464 | out_unlock: |
465 | unix_state_wunlock(sk); | 465 | unix_state_unlock(sk); |
466 | out: | 466 | out: |
467 | return err; | 467 | return err; |
468 | } | 468 | } |
@@ -858,6 +858,31 @@ out_mknod_parent: | |||
858 | goto out_up; | 858 | goto out_up; |
859 | } | 859 | } |
860 | 860 | ||
861 | static void unix_state_double_lock(struct sock *sk1, struct sock *sk2) | ||
862 | { | ||
863 | if (unlikely(sk1 == sk2) || !sk2) { | ||
864 | unix_state_lock(sk1); | ||
865 | return; | ||
866 | } | ||
867 | if (sk1 < sk2) { | ||
868 | unix_state_lock(sk1); | ||
869 | unix_state_lock_nested(sk2); | ||
870 | } else { | ||
871 | unix_state_lock(sk2); | ||
872 | unix_state_lock_nested(sk1); | ||
873 | } | ||
874 | } | ||
875 | |||
876 | static void unix_state_double_unlock(struct sock *sk1, struct sock *sk2) | ||
877 | { | ||
878 | if (unlikely(sk1 == sk2) || !sk2) { | ||
879 | unix_state_unlock(sk1); | ||
880 | return; | ||
881 | } | ||
882 | unix_state_unlock(sk1); | ||
883 | unix_state_unlock(sk2); | ||
884 | } | ||
885 | |||
861 | static int unix_dgram_connect(struct socket *sock, struct sockaddr *addr, | 886 | static int unix_dgram_connect(struct socket *sock, struct sockaddr *addr, |
862 | int alen, int flags) | 887 | int alen, int flags) |
863 | { | 888 | { |
@@ -877,11 +902,19 @@ static int unix_dgram_connect(struct socket *sock, struct sockaddr *addr, | |||
877 | !unix_sk(sk)->addr && (err = unix_autobind(sock)) != 0) | 902 | !unix_sk(sk)->addr && (err = unix_autobind(sock)) != 0) |
878 | goto out; | 903 | goto out; |
879 | 904 | ||
905 | restart: | ||
880 | other=unix_find_other(sunaddr, alen, sock->type, hash, &err); | 906 | other=unix_find_other(sunaddr, alen, sock->type, hash, &err); |
881 | if (!other) | 907 | if (!other) |
882 | goto out; | 908 | goto out; |
883 | 909 | ||
884 | unix_state_wlock(sk); | 910 | unix_state_double_lock(sk, other); |
911 | |||
912 | /* Apparently VFS overslept socket death. Retry. */ | ||
913 | if (sock_flag(other, SOCK_DEAD)) { | ||
914 | unix_state_double_unlock(sk, other); | ||
915 | sock_put(other); | ||
916 | goto restart; | ||
917 | } | ||
885 | 918 | ||
886 | err = -EPERM; | 919 | err = -EPERM; |
887 | if (!unix_may_send(sk, other)) | 920 | if (!unix_may_send(sk, other)) |
@@ -896,7 +929,7 @@ static int unix_dgram_connect(struct socket *sock, struct sockaddr *addr, | |||
896 | * 1003.1g breaking connected state with AF_UNSPEC | 929 | * 1003.1g breaking connected state with AF_UNSPEC |
897 | */ | 930 | */ |
898 | other = NULL; | 931 | other = NULL; |
899 | unix_state_wlock(sk); | 932 | unix_state_double_lock(sk, other); |
900 | } | 933 | } |
901 | 934 | ||
902 | /* | 935 | /* |
@@ -905,19 +938,19 @@ static int unix_dgram_connect(struct socket *sock, struct sockaddr *addr, | |||
905 | if (unix_peer(sk)) { | 938 | if (unix_peer(sk)) { |
906 | struct sock *old_peer = unix_peer(sk); | 939 | struct sock *old_peer = unix_peer(sk); |
907 | unix_peer(sk)=other; | 940 | unix_peer(sk)=other; |
908 | unix_state_wunlock(sk); | 941 | unix_state_double_unlock(sk, other); |
909 | 942 | ||
910 | if (other != old_peer) | 943 | if (other != old_peer) |
911 | unix_dgram_disconnected(sk, old_peer); | 944 | unix_dgram_disconnected(sk, old_peer); |
912 | sock_put(old_peer); | 945 | sock_put(old_peer); |
913 | } else { | 946 | } else { |
914 | unix_peer(sk)=other; | 947 | unix_peer(sk)=other; |
915 | unix_state_wunlock(sk); | 948 | unix_state_double_unlock(sk, other); |
916 | } | 949 | } |
917 | return 0; | 950 | return 0; |
918 | 951 | ||
919 | out_unlock: | 952 | out_unlock: |
920 | unix_state_wunlock(sk); | 953 | unix_state_double_unlock(sk, other); |
921 | sock_put(other); | 954 | sock_put(other); |
922 | out: | 955 | out: |
923 | return err; | 956 | return err; |
@@ -936,7 +969,7 @@ static long unix_wait_for_peer(struct sock *other, long timeo) | |||
936 | (skb_queue_len(&other->sk_receive_queue) > | 969 | (skb_queue_len(&other->sk_receive_queue) > |
937 | other->sk_max_ack_backlog); | 970 | other->sk_max_ack_backlog); |
938 | 971 | ||
939 | unix_state_runlock(other); | 972 | unix_state_unlock(other); |
940 | 973 | ||
941 | if (sched) | 974 | if (sched) |
942 | timeo = schedule_timeout(timeo); | 975 | timeo = schedule_timeout(timeo); |
@@ -994,11 +1027,11 @@ restart: | |||
994 | goto out; | 1027 | goto out; |
995 | 1028 | ||
996 | /* Latch state of peer */ | 1029 | /* Latch state of peer */ |
997 | unix_state_rlock(other); | 1030 | unix_state_lock(other); |
998 | 1031 | ||
999 | /* Apparently VFS overslept socket death. Retry. */ | 1032 | /* Apparently VFS overslept socket death. Retry. */ |
1000 | if (sock_flag(other, SOCK_DEAD)) { | 1033 | if (sock_flag(other, SOCK_DEAD)) { |
1001 | unix_state_runlock(other); | 1034 | unix_state_unlock(other); |
1002 | sock_put(other); | 1035 | sock_put(other); |
1003 | goto restart; | 1036 | goto restart; |
1004 | } | 1037 | } |
@@ -1048,18 +1081,18 @@ restart: | |||
1048 | goto out_unlock; | 1081 | goto out_unlock; |
1049 | } | 1082 | } |
1050 | 1083 | ||
1051 | unix_state_wlock_nested(sk); | 1084 | unix_state_lock_nested(sk); |
1052 | 1085 | ||
1053 | if (sk->sk_state != st) { | 1086 | if (sk->sk_state != st) { |
1054 | unix_state_wunlock(sk); | 1087 | unix_state_unlock(sk); |
1055 | unix_state_runlock(other); | 1088 | unix_state_unlock(other); |
1056 | sock_put(other); | 1089 | sock_put(other); |
1057 | goto restart; | 1090 | goto restart; |
1058 | } | 1091 | } |
1059 | 1092 | ||
1060 | err = security_unix_stream_connect(sock, other->sk_socket, newsk); | 1093 | err = security_unix_stream_connect(sock, other->sk_socket, newsk); |
1061 | if (err) { | 1094 | if (err) { |
1062 | unix_state_wunlock(sk); | 1095 | unix_state_unlock(sk); |
1063 | goto out_unlock; | 1096 | goto out_unlock; |
1064 | } | 1097 | } |
1065 | 1098 | ||
@@ -1096,7 +1129,7 @@ restart: | |||
1096 | smp_mb__after_atomic_inc(); /* sock_hold() does an atomic_inc() */ | 1129 | smp_mb__after_atomic_inc(); /* sock_hold() does an atomic_inc() */ |
1097 | unix_peer(sk) = newsk; | 1130 | unix_peer(sk) = newsk; |
1098 | 1131 | ||
1099 | unix_state_wunlock(sk); | 1132 | unix_state_unlock(sk); |
1100 | 1133 | ||
1101 | /* take ten and and send info to listening sock */ | 1134 | /* take ten and and send info to listening sock */ |
1102 | spin_lock(&other->sk_receive_queue.lock); | 1135 | spin_lock(&other->sk_receive_queue.lock); |
@@ -1105,14 +1138,14 @@ restart: | |||
1105 | * is installed to listening socket. */ | 1138 | * is installed to listening socket. */ |
1106 | atomic_inc(&newu->inflight); | 1139 | atomic_inc(&newu->inflight); |
1107 | spin_unlock(&other->sk_receive_queue.lock); | 1140 | spin_unlock(&other->sk_receive_queue.lock); |
1108 | unix_state_runlock(other); | 1141 | unix_state_unlock(other); |
1109 | other->sk_data_ready(other, 0); | 1142 | other->sk_data_ready(other, 0); |
1110 | sock_put(other); | 1143 | sock_put(other); |
1111 | return 0; | 1144 | return 0; |
1112 | 1145 | ||
1113 | out_unlock: | 1146 | out_unlock: |
1114 | if (other) | 1147 | if (other) |
1115 | unix_state_runlock(other); | 1148 | unix_state_unlock(other); |
1116 | 1149 | ||
1117 | out: | 1150 | out: |
1118 | if (skb) | 1151 | if (skb) |
@@ -1178,10 +1211,10 @@ static int unix_accept(struct socket *sock, struct socket *newsock, int flags) | |||
1178 | wake_up_interruptible(&unix_sk(sk)->peer_wait); | 1211 | wake_up_interruptible(&unix_sk(sk)->peer_wait); |
1179 | 1212 | ||
1180 | /* attach accepted sock to socket */ | 1213 | /* attach accepted sock to socket */ |
1181 | unix_state_wlock(tsk); | 1214 | unix_state_lock(tsk); |
1182 | newsock->state = SS_CONNECTED; | 1215 | newsock->state = SS_CONNECTED; |
1183 | sock_graft(tsk, newsock); | 1216 | sock_graft(tsk, newsock); |
1184 | unix_state_wunlock(tsk); | 1217 | unix_state_unlock(tsk); |
1185 | return 0; | 1218 | return 0; |
1186 | 1219 | ||
1187 | out: | 1220 | out: |
@@ -1208,7 +1241,7 @@ static int unix_getname(struct socket *sock, struct sockaddr *uaddr, int *uaddr_ | |||
1208 | } | 1241 | } |
1209 | 1242 | ||
1210 | u = unix_sk(sk); | 1243 | u = unix_sk(sk); |
1211 | unix_state_rlock(sk); | 1244 | unix_state_lock(sk); |
1212 | if (!u->addr) { | 1245 | if (!u->addr) { |
1213 | sunaddr->sun_family = AF_UNIX; | 1246 | sunaddr->sun_family = AF_UNIX; |
1214 | sunaddr->sun_path[0] = 0; | 1247 | sunaddr->sun_path[0] = 0; |
@@ -1219,7 +1252,7 @@ static int unix_getname(struct socket *sock, struct sockaddr *uaddr, int *uaddr_ | |||
1219 | *uaddr_len = addr->len; | 1252 | *uaddr_len = addr->len; |
1220 | memcpy(sunaddr, addr->name, *uaddr_len); | 1253 | memcpy(sunaddr, addr->name, *uaddr_len); |
1221 | } | 1254 | } |
1222 | unix_state_runlock(sk); | 1255 | unix_state_unlock(sk); |
1223 | sock_put(sk); | 1256 | sock_put(sk); |
1224 | out: | 1257 | out: |
1225 | return err; | 1258 | return err; |
@@ -1337,7 +1370,7 @@ restart: | |||
1337 | goto out_free; | 1370 | goto out_free; |
1338 | } | 1371 | } |
1339 | 1372 | ||
1340 | unix_state_rlock(other); | 1373 | unix_state_lock(other); |
1341 | err = -EPERM; | 1374 | err = -EPERM; |
1342 | if (!unix_may_send(sk, other)) | 1375 | if (!unix_may_send(sk, other)) |
1343 | goto out_unlock; | 1376 | goto out_unlock; |
@@ -1347,20 +1380,20 @@ restart: | |||
1347 | * Check with 1003.1g - what should | 1380 | * Check with 1003.1g - what should |
1348 | * datagram error | 1381 | * datagram error |
1349 | */ | 1382 | */ |
1350 | unix_state_runlock(other); | 1383 | unix_state_unlock(other); |
1351 | sock_put(other); | 1384 | sock_put(other); |
1352 | 1385 | ||
1353 | err = 0; | 1386 | err = 0; |
1354 | unix_state_wlock(sk); | 1387 | unix_state_lock(sk); |
1355 | if (unix_peer(sk) == other) { | 1388 | if (unix_peer(sk) == other) { |
1356 | unix_peer(sk)=NULL; | 1389 | unix_peer(sk)=NULL; |
1357 | unix_state_wunlock(sk); | 1390 | unix_state_unlock(sk); |
1358 | 1391 | ||
1359 | unix_dgram_disconnected(sk, other); | 1392 | unix_dgram_disconnected(sk, other); |
1360 | sock_put(other); | 1393 | sock_put(other); |
1361 | err = -ECONNREFUSED; | 1394 | err = -ECONNREFUSED; |
1362 | } else { | 1395 | } else { |
1363 | unix_state_wunlock(sk); | 1396 | unix_state_unlock(sk); |
1364 | } | 1397 | } |
1365 | 1398 | ||
1366 | other = NULL; | 1399 | other = NULL; |
@@ -1397,14 +1430,14 @@ restart: | |||
1397 | } | 1430 | } |
1398 | 1431 | ||
1399 | skb_queue_tail(&other->sk_receive_queue, skb); | 1432 | skb_queue_tail(&other->sk_receive_queue, skb); |
1400 | unix_state_runlock(other); | 1433 | unix_state_unlock(other); |
1401 | other->sk_data_ready(other, len); | 1434 | other->sk_data_ready(other, len); |
1402 | sock_put(other); | 1435 | sock_put(other); |
1403 | scm_destroy(siocb->scm); | 1436 | scm_destroy(siocb->scm); |
1404 | return len; | 1437 | return len; |
1405 | 1438 | ||
1406 | out_unlock: | 1439 | out_unlock: |
1407 | unix_state_runlock(other); | 1440 | unix_state_unlock(other); |
1408 | out_free: | 1441 | out_free: |
1409 | kfree_skb(skb); | 1442 | kfree_skb(skb); |
1410 | out: | 1443 | out: |
@@ -1494,14 +1527,14 @@ static int unix_stream_sendmsg(struct kiocb *kiocb, struct socket *sock, | |||
1494 | goto out_err; | 1527 | goto out_err; |
1495 | } | 1528 | } |
1496 | 1529 | ||
1497 | unix_state_rlock(other); | 1530 | unix_state_lock(other); |
1498 | 1531 | ||
1499 | if (sock_flag(other, SOCK_DEAD) || | 1532 | if (sock_flag(other, SOCK_DEAD) || |
1500 | (other->sk_shutdown & RCV_SHUTDOWN)) | 1533 | (other->sk_shutdown & RCV_SHUTDOWN)) |
1501 | goto pipe_err_free; | 1534 | goto pipe_err_free; |
1502 | 1535 | ||
1503 | skb_queue_tail(&other->sk_receive_queue, skb); | 1536 | skb_queue_tail(&other->sk_receive_queue, skb); |
1504 | unix_state_runlock(other); | 1537 | unix_state_unlock(other); |
1505 | other->sk_data_ready(other, size); | 1538 | other->sk_data_ready(other, size); |
1506 | sent+=size; | 1539 | sent+=size; |
1507 | } | 1540 | } |
@@ -1512,7 +1545,7 @@ static int unix_stream_sendmsg(struct kiocb *kiocb, struct socket *sock, | |||
1512 | return sent; | 1545 | return sent; |
1513 | 1546 | ||
1514 | pipe_err_free: | 1547 | pipe_err_free: |
1515 | unix_state_runlock(other); | 1548 | unix_state_unlock(other); |
1516 | kfree_skb(skb); | 1549 | kfree_skb(skb); |
1517 | pipe_err: | 1550 | pipe_err: |
1518 | if (sent==0 && !(msg->msg_flags&MSG_NOSIGNAL)) | 1551 | if (sent==0 && !(msg->msg_flags&MSG_NOSIGNAL)) |
@@ -1641,7 +1674,7 @@ static long unix_stream_data_wait(struct sock * sk, long timeo) | |||
1641 | { | 1674 | { |
1642 | DEFINE_WAIT(wait); | 1675 | DEFINE_WAIT(wait); |
1643 | 1676 | ||
1644 | unix_state_rlock(sk); | 1677 | unix_state_lock(sk); |
1645 | 1678 | ||
1646 | for (;;) { | 1679 | for (;;) { |
1647 | prepare_to_wait(sk->sk_sleep, &wait, TASK_INTERRUPTIBLE); | 1680 | prepare_to_wait(sk->sk_sleep, &wait, TASK_INTERRUPTIBLE); |
@@ -1654,14 +1687,14 @@ static long unix_stream_data_wait(struct sock * sk, long timeo) | |||
1654 | break; | 1687 | break; |
1655 | 1688 | ||
1656 | set_bit(SOCK_ASYNC_WAITDATA, &sk->sk_socket->flags); | 1689 | set_bit(SOCK_ASYNC_WAITDATA, &sk->sk_socket->flags); |
1657 | unix_state_runlock(sk); | 1690 | unix_state_unlock(sk); |
1658 | timeo = schedule_timeout(timeo); | 1691 | timeo = schedule_timeout(timeo); |
1659 | unix_state_rlock(sk); | 1692 | unix_state_lock(sk); |
1660 | clear_bit(SOCK_ASYNC_WAITDATA, &sk->sk_socket->flags); | 1693 | clear_bit(SOCK_ASYNC_WAITDATA, &sk->sk_socket->flags); |
1661 | } | 1694 | } |
1662 | 1695 | ||
1663 | finish_wait(sk->sk_sleep, &wait); | 1696 | finish_wait(sk->sk_sleep, &wait); |
1664 | unix_state_runlock(sk); | 1697 | unix_state_unlock(sk); |
1665 | return timeo; | 1698 | return timeo; |
1666 | } | 1699 | } |
1667 | 1700 | ||
@@ -1816,12 +1849,12 @@ static int unix_shutdown(struct socket *sock, int mode) | |||
1816 | mode = (mode+1)&(RCV_SHUTDOWN|SEND_SHUTDOWN); | 1849 | mode = (mode+1)&(RCV_SHUTDOWN|SEND_SHUTDOWN); |
1817 | 1850 | ||
1818 | if (mode) { | 1851 | if (mode) { |
1819 | unix_state_wlock(sk); | 1852 | unix_state_lock(sk); |
1820 | sk->sk_shutdown |= mode; | 1853 | sk->sk_shutdown |= mode; |
1821 | other=unix_peer(sk); | 1854 | other=unix_peer(sk); |
1822 | if (other) | 1855 | if (other) |
1823 | sock_hold(other); | 1856 | sock_hold(other); |
1824 | unix_state_wunlock(sk); | 1857 | unix_state_unlock(sk); |
1825 | sk->sk_state_change(sk); | 1858 | sk->sk_state_change(sk); |
1826 | 1859 | ||
1827 | if (other && | 1860 | if (other && |
@@ -1833,9 +1866,9 @@ static int unix_shutdown(struct socket *sock, int mode) | |||
1833 | peer_mode |= SEND_SHUTDOWN; | 1866 | peer_mode |= SEND_SHUTDOWN; |
1834 | if (mode&SEND_SHUTDOWN) | 1867 | if (mode&SEND_SHUTDOWN) |
1835 | peer_mode |= RCV_SHUTDOWN; | 1868 | peer_mode |= RCV_SHUTDOWN; |
1836 | unix_state_wlock(other); | 1869 | unix_state_lock(other); |
1837 | other->sk_shutdown |= peer_mode; | 1870 | other->sk_shutdown |= peer_mode; |
1838 | unix_state_wunlock(other); | 1871 | unix_state_unlock(other); |
1839 | other->sk_state_change(other); | 1872 | other->sk_state_change(other); |
1840 | read_lock(&other->sk_callback_lock); | 1873 | read_lock(&other->sk_callback_lock); |
1841 | if (peer_mode == SHUTDOWN_MASK) | 1874 | if (peer_mode == SHUTDOWN_MASK) |
@@ -1973,7 +2006,7 @@ static int unix_seq_show(struct seq_file *seq, void *v) | |||
1973 | else { | 2006 | else { |
1974 | struct sock *s = v; | 2007 | struct sock *s = v; |
1975 | struct unix_sock *u = unix_sk(s); | 2008 | struct unix_sock *u = unix_sk(s); |
1976 | unix_state_rlock(s); | 2009 | unix_state_lock(s); |
1977 | 2010 | ||
1978 | seq_printf(seq, "%p: %08X %08X %08X %04X %02X %5lu", | 2011 | seq_printf(seq, "%p: %08X %08X %08X %04X %02X %5lu", |
1979 | s, | 2012 | s, |
@@ -2001,7 +2034,7 @@ static int unix_seq_show(struct seq_file *seq, void *v) | |||
2001 | for ( ; i < len; i++) | 2034 | for ( ; i < len; i++) |
2002 | seq_putc(seq, u->addr->name->sun_path[i]); | 2035 | seq_putc(seq, u->addr->name->sun_path[i]); |
2003 | } | 2036 | } |
2004 | unix_state_runlock(s); | 2037 | unix_state_unlock(s); |
2005 | seq_putc(seq, '\n'); | 2038 | seq_putc(seq, '\n'); |
2006 | } | 2039 | } |
2007 | 2040 | ||
diff --git a/net/wanrouter/wanmain.c b/net/wanrouter/wanmain.c index 7a19e0ede289..849cc06bd914 100644 --- a/net/wanrouter/wanmain.c +++ b/net/wanrouter/wanmain.c | |||
@@ -454,7 +454,7 @@ static int wanrouter_device_setup(struct wan_device *wandev, | |||
454 | } | 454 | } |
455 | 455 | ||
456 | if (conf->data_size && conf->data) { | 456 | if (conf->data_size && conf->data) { |
457 | if (conf->data_size > 128000 || conf->data_size < 0) { | 457 | if (conf->data_size > 128000) { |
458 | printk(KERN_INFO | 458 | printk(KERN_INFO |
459 | "%s: ERROR, Invalid firmware data size %i !\n", | 459 | "%s: ERROR, Invalid firmware data size %i !\n", |
460 | wandev->name, conf->data_size); | 460 | wandev->name, conf->data_size); |
diff --git a/net/xfrm/xfrm_policy.c b/net/xfrm/xfrm_policy.c index b8bab89616a0..64a375178c5f 100644 --- a/net/xfrm/xfrm_policy.c +++ b/net/xfrm/xfrm_policy.c | |||
@@ -26,10 +26,11 @@ | |||
26 | #include <net/xfrm.h> | 26 | #include <net/xfrm.h> |
27 | #include <net/ip.h> | 27 | #include <net/ip.h> |
28 | #include <linux/audit.h> | 28 | #include <linux/audit.h> |
29 | #include <linux/cache.h> | ||
29 | 30 | ||
30 | #include "xfrm_hash.h" | 31 | #include "xfrm_hash.h" |
31 | 32 | ||
32 | int sysctl_xfrm_larval_drop; | 33 | int sysctl_xfrm_larval_drop __read_mostly; |
33 | 34 | ||
34 | DEFINE_MUTEX(xfrm_cfg_mutex); | 35 | DEFINE_MUTEX(xfrm_cfg_mutex); |
35 | EXPORT_SYMBOL(xfrm_cfg_mutex); | 36 | EXPORT_SYMBOL(xfrm_cfg_mutex); |
diff --git a/net/xfrm/xfrm_state.c b/net/xfrm/xfrm_state.c index 9955ff4da0a2..372f06eb8bb7 100644 --- a/net/xfrm/xfrm_state.c +++ b/net/xfrm/xfrm_state.c | |||
@@ -21,18 +21,21 @@ | |||
21 | #include <linux/cache.h> | 21 | #include <linux/cache.h> |
22 | #include <asm/uaccess.h> | 22 | #include <asm/uaccess.h> |
23 | #include <linux/audit.h> | 23 | #include <linux/audit.h> |
24 | #include <linux/cache.h> | ||
24 | 25 | ||
25 | #include "xfrm_hash.h" | 26 | #include "xfrm_hash.h" |
26 | 27 | ||
27 | struct sock *xfrm_nl; | 28 | struct sock *xfrm_nl; |
28 | EXPORT_SYMBOL(xfrm_nl); | 29 | EXPORT_SYMBOL(xfrm_nl); |
29 | 30 | ||
30 | u32 sysctl_xfrm_aevent_etime = XFRM_AE_ETIME; | 31 | u32 sysctl_xfrm_aevent_etime __read_mostly = XFRM_AE_ETIME; |
31 | EXPORT_SYMBOL(sysctl_xfrm_aevent_etime); | 32 | EXPORT_SYMBOL(sysctl_xfrm_aevent_etime); |
32 | 33 | ||
33 | u32 sysctl_xfrm_aevent_rseqth = XFRM_AE_SEQT_SIZE; | 34 | u32 sysctl_xfrm_aevent_rseqth __read_mostly = XFRM_AE_SEQT_SIZE; |
34 | EXPORT_SYMBOL(sysctl_xfrm_aevent_rseqth); | 35 | EXPORT_SYMBOL(sysctl_xfrm_aevent_rseqth); |
35 | 36 | ||
37 | u32 sysctl_xfrm_acq_expires __read_mostly = 30; | ||
38 | |||
36 | /* Each xfrm_state may be linked to two tables: | 39 | /* Each xfrm_state may be linked to two tables: |
37 | 40 | ||
38 | 1. Hash table by (spi,daddr,ah/esp) to find SA by SPI. (input,ctl) | 41 | 1. Hash table by (spi,daddr,ah/esp) to find SA by SPI. (input,ctl) |
@@ -622,8 +625,8 @@ xfrm_state_find(xfrm_address_t *daddr, xfrm_address_t *saddr, | |||
622 | h = xfrm_spi_hash(&x->id.daddr, x->id.spi, x->id.proto, family); | 625 | h = xfrm_spi_hash(&x->id.daddr, x->id.spi, x->id.proto, family); |
623 | hlist_add_head(&x->byspi, xfrm_state_byspi+h); | 626 | hlist_add_head(&x->byspi, xfrm_state_byspi+h); |
624 | } | 627 | } |
625 | x->lft.hard_add_expires_seconds = XFRM_ACQ_EXPIRES; | 628 | x->lft.hard_add_expires_seconds = sysctl_xfrm_acq_expires; |
626 | x->timer.expires = jiffies + XFRM_ACQ_EXPIRES*HZ; | 629 | x->timer.expires = jiffies + sysctl_xfrm_acq_expires*HZ; |
627 | add_timer(&x->timer); | 630 | add_timer(&x->timer); |
628 | xfrm_state_num++; | 631 | xfrm_state_num++; |
629 | xfrm_hash_grow_check(x->bydst.next != NULL); | 632 | xfrm_hash_grow_check(x->bydst.next != NULL); |
@@ -772,9 +775,9 @@ static struct xfrm_state *__find_acq_core(unsigned short family, u8 mode, u32 re | |||
772 | x->props.family = family; | 775 | x->props.family = family; |
773 | x->props.mode = mode; | 776 | x->props.mode = mode; |
774 | x->props.reqid = reqid; | 777 | x->props.reqid = reqid; |
775 | x->lft.hard_add_expires_seconds = XFRM_ACQ_EXPIRES; | 778 | x->lft.hard_add_expires_seconds = sysctl_xfrm_acq_expires; |
776 | xfrm_state_hold(x); | 779 | xfrm_state_hold(x); |
777 | x->timer.expires = jiffies + XFRM_ACQ_EXPIRES*HZ; | 780 | x->timer.expires = jiffies + sysctl_xfrm_acq_expires*HZ; |
778 | add_timer(&x->timer); | 781 | add_timer(&x->timer); |
779 | hlist_add_head(&x->bydst, xfrm_state_bydst+h); | 782 | hlist_add_head(&x->bydst, xfrm_state_bydst+h); |
780 | h = xfrm_src_hash(daddr, saddr, family); | 783 | h = xfrm_src_hash(daddr, saddr, family); |
diff --git a/scripts/checkpatch.pl b/scripts/checkpatch.pl new file mode 100644 index 000000000000..e216d49624b7 --- /dev/null +++ b/scripts/checkpatch.pl | |||
@@ -0,0 +1,595 @@ | |||
1 | #!/usr/bin/perl -w | ||
2 | # (c) 2001, Dave Jones. <davej@codemonkey.org.uk> (the file handling bit) | ||
3 | # (c) 2005, Joel Scohpp <jschopp@austin.ibm.com> (the ugly bit) | ||
4 | # (c) 2007, Andy Whitcroft <apw@uk.ibm.com> (new conditions, test suite, etc) | ||
5 | # Licensed under the terms of the GNU GPL License version 2 | ||
6 | |||
7 | use strict; | ||
8 | |||
9 | my $P = $0; | ||
10 | |||
11 | my $V = '0.01'; | ||
12 | |||
13 | use Getopt::Long qw(:config no_auto_abbrev); | ||
14 | |||
15 | my $quiet = 0; | ||
16 | my $tree = 1; | ||
17 | my $chk_signoff = 1; | ||
18 | my $chk_patch = 1; | ||
19 | GetOptions( | ||
20 | 'q|quiet' => \$quiet, | ||
21 | 'tree!' => \$tree, | ||
22 | 'signoff!' => \$chk_signoff, | ||
23 | 'patch!' => \$chk_patch, | ||
24 | ) or exit; | ||
25 | |||
26 | my $exit = 0; | ||
27 | |||
28 | if ($#ARGV < 0) { | ||
29 | print "usage: patchstylecheckemail.pl [options] patchfile\n"; | ||
30 | print "version: $V\n"; | ||
31 | print "options: -q => quiet\n"; | ||
32 | print " --no-tree => run without a kernel tree\n"; | ||
33 | exit(1); | ||
34 | } | ||
35 | |||
36 | if ($tree && !top_of_kernel_tree()) { | ||
37 | print "Must be run from the top-level dir. of a kernel tree\n"; | ||
38 | exit(2); | ||
39 | } | ||
40 | |||
41 | my @deprecated = (); | ||
42 | my $removal = 'Documentation/feature-removal-schedule.txt'; | ||
43 | if ($tree && -f $removal) { | ||
44 | open(REMOVE, "<$removal") || die "$P: $removal: open failed - $!\n"; | ||
45 | while (<REMOVE>) { | ||
46 | if (/^Files:\s+(.*\S)/) { | ||
47 | for my $file (split(/[, ]+/, $1)) { | ||
48 | if ($file =~ m@include/(.*)@) { | ||
49 | push(@deprecated, $1); | ||
50 | } | ||
51 | } | ||
52 | } | ||
53 | } | ||
54 | } | ||
55 | |||
56 | my @lines = (); | ||
57 | while (<>) { | ||
58 | chomp; | ||
59 | push(@lines, $_); | ||
60 | if (eof(ARGV)) { | ||
61 | if (!process($ARGV, @lines)) { | ||
62 | $exit = 1; | ||
63 | } | ||
64 | @lines = (); | ||
65 | } | ||
66 | } | ||
67 | |||
68 | exit($exit); | ||
69 | |||
70 | sub top_of_kernel_tree { | ||
71 | if ((-f "COPYING") && (-f "CREDITS") && (-f "Kbuild") && | ||
72 | (-f "MAINTAINERS") && (-f "Makefile") && (-f "README") && | ||
73 | (-d "Documentation") && (-d "arch") && (-d "include") && | ||
74 | (-d "drivers") && (-d "fs") && (-d "init") && (-d "ipc") && | ||
75 | (-d "kernel") && (-d "lib") && (-d "scripts")) { | ||
76 | return 1; | ||
77 | } | ||
78 | return 0; | ||
79 | } | ||
80 | |||
81 | sub expand_tabs { | ||
82 | my ($str) = @_; | ||
83 | |||
84 | my $res = ''; | ||
85 | my $n = 0; | ||
86 | for my $c (split(//, $str)) { | ||
87 | if ($c eq "\t") { | ||
88 | $res .= ' '; | ||
89 | $n++; | ||
90 | for (; ($n % 8) != 0; $n++) { | ||
91 | $res .= ' '; | ||
92 | } | ||
93 | next; | ||
94 | } | ||
95 | $res .= $c; | ||
96 | $n++; | ||
97 | } | ||
98 | |||
99 | return $res; | ||
100 | } | ||
101 | |||
102 | sub cat_vet { | ||
103 | my ($vet) = @_; | ||
104 | |||
105 | $vet =~ s/\t/^I/; | ||
106 | $vet =~ s/$/\$/; | ||
107 | |||
108 | return $vet; | ||
109 | } | ||
110 | |||
111 | sub process { | ||
112 | my $filename = shift; | ||
113 | my @lines = @_; | ||
114 | |||
115 | my $linenr=0; | ||
116 | my $prevline=""; | ||
117 | my $stashline=""; | ||
118 | |||
119 | my $lineforcounting=''; | ||
120 | my $indent; | ||
121 | my $previndent=0; | ||
122 | my $stashindent=0; | ||
123 | |||
124 | my $clean = 1; | ||
125 | my $signoff = 0; | ||
126 | my $is_patch = 0; | ||
127 | |||
128 | # Trace the real file/line as we go. | ||
129 | my $realfile = ''; | ||
130 | my $realline = 0; | ||
131 | my $realcnt = 0; | ||
132 | my $here = ''; | ||
133 | my $in_comment = 0; | ||
134 | my $first_line = 0; | ||
135 | |||
136 | foreach my $line (@lines) { | ||
137 | $linenr++; | ||
138 | |||
139 | #extract the filename as it passes | ||
140 | if ($line=~/^\+\+\+\s+(\S+)/) { | ||
141 | $realfile=$1; | ||
142 | $in_comment = 0; | ||
143 | next; | ||
144 | } | ||
145 | #extract the line range in the file after the patch is applied | ||
146 | if ($line=~/^\@\@ -\d+,\d+ \+(\d+)(,(\d+))? \@\@/) { | ||
147 | $is_patch = 1; | ||
148 | $first_line = 1; | ||
149 | $in_comment = 0; | ||
150 | $realline=$1-1; | ||
151 | if (defined $2) { | ||
152 | $realcnt=$3+1; | ||
153 | } else { | ||
154 | $realcnt=1+1; | ||
155 | } | ||
156 | next; | ||
157 | } | ||
158 | |||
159 | #track the line number as we move through the hunk | ||
160 | if ($line=~/^[ \+]/) { | ||
161 | $realline++; | ||
162 | $realcnt-- if ($realcnt != 0); | ||
163 | |||
164 | # track any sort of multi-line comment. Obviously if | ||
165 | # the added text or context do not include the whole | ||
166 | # comment we will not see it. Such is life. | ||
167 | # | ||
168 | # Guestimate if this is a continuing comment. If this | ||
169 | # is the start of a diff block and this line starts | ||
170 | # ' *' then it is very likely a comment. | ||
171 | if ($first_line and $line =~ m@^.\s*\*@) { | ||
172 | $in_comment = 1; | ||
173 | } | ||
174 | if ($line =~ m@/\*@) { | ||
175 | $in_comment = 1; | ||
176 | } | ||
177 | if ($line =~ m@\*/@) { | ||
178 | $in_comment = 0; | ||
179 | } | ||
180 | |||
181 | $lineforcounting = $line; | ||
182 | $lineforcounting =~ s/^\+//; | ||
183 | $lineforcounting = expand_tabs($lineforcounting); | ||
184 | |||
185 | my ($white) = ($lineforcounting =~ /^(\s*)/); | ||
186 | $indent = length($white); | ||
187 | |||
188 | # Track the previous line. | ||
189 | ($prevline, $stashline) = ($stashline, $line); | ||
190 | ($previndent, $stashindent) = ($stashindent, $indent); | ||
191 | $first_line = 0; | ||
192 | } | ||
193 | |||
194 | #make up the handle for any error we report on this line | ||
195 | $here = "PATCH: $ARGV:$linenr:"; | ||
196 | $here .= "\nFILE: $realfile:$realline:" if ($realcnt != 0); | ||
197 | |||
198 | my $herecurr = "$here\n$line\n\n"; | ||
199 | my $hereprev = "$here\n$prevline\n$line\n\n"; | ||
200 | |||
201 | #check the patch for a signoff: | ||
202 | if ($line =~ /^\s*Signed-off-by:\s/) { | ||
203 | $signoff++; | ||
204 | |||
205 | } elsif ($line =~ /^\s*signed-off-by:/i) { | ||
206 | if (!($line =~ /^\s*Signed-off-by:/)) { | ||
207 | print "use Signed-off-by:\n"; | ||
208 | print "$herecurr"; | ||
209 | $clean = 0; | ||
210 | } | ||
211 | if ($line =~ /^\s*signed-off-by:\S/i) { | ||
212 | print "need space after Signed-off-by:\n"; | ||
213 | print "$herecurr"; | ||
214 | $clean = 0; | ||
215 | } | ||
216 | } | ||
217 | |||
218 | #ignore lines not being added | ||
219 | if ($line=~/^[^\+]/) {next;} | ||
220 | |||
221 | # check we are in a valid source file *.[hcsS] if not then ignore this hunk | ||
222 | next if ($realfile !~ /\.[hcsS]$/); | ||
223 | |||
224 | #trailing whitespace | ||
225 | if ($line=~/\S\s+$/) { | ||
226 | my $herevet = "$here\n" . cat_vet($line) . "\n\n"; | ||
227 | print "trailing whitespace\n"; | ||
228 | print "$herevet"; | ||
229 | $clean = 0; | ||
230 | } | ||
231 | #80 column limit | ||
232 | if (!($prevline=~/\/\*\*/) && length($lineforcounting) > 80) { | ||
233 | print "line over 80 characters\n"; | ||
234 | print "$herecurr"; | ||
235 | $clean = 0; | ||
236 | } | ||
237 | |||
238 | # check we are in a valid source file *.[hc] if not then ignore this hunk | ||
239 | next if ($realfile !~ /\.[hc]$/); | ||
240 | |||
241 | # at the beginning of a line any tabs must come first and anything | ||
242 | # more than 8 must use tabs. | ||
243 | if ($line=~/^\+\s* \t\s*\S/ or $line=~/^\+\s* \s*/) { | ||
244 | my $herevet = "$here\n" . cat_vet($line) . "\n\n"; | ||
245 | print "use tabs not spaces\n"; | ||
246 | print "$herevet"; | ||
247 | $clean = 0; | ||
248 | } | ||
249 | |||
250 | # | ||
251 | # The rest of our checks refer specifically to C style | ||
252 | # only apply those _outside_ comments. | ||
253 | # | ||
254 | next if ($in_comment); | ||
255 | |||
256 | # no C99 // comments | ||
257 | if ($line =~ m@//@ and !($line =~ m@\".*//.*\"@)) { | ||
258 | print "do not use C99 // comments\n"; | ||
259 | print "$herecurr"; | ||
260 | $clean = 0; | ||
261 | } | ||
262 | |||
263 | # Remove comments from the line before processing. | ||
264 | $line =~ s@/\*.*\*/@@g; | ||
265 | $line =~ s@/\*.*@@; | ||
266 | $line =~ s@.*\*/@@; | ||
267 | $line =~ s@//.*@@; | ||
268 | |||
269 | #EXPORT_SYMBOL should immediately follow its function closing }. | ||
270 | if (($line =~ /EXPORT_SYMBOL.*\(.*\)/) || | ||
271 | ($line =~ /EXPORT_UNUSED_SYMBOL.*\(.*\)/)) { | ||
272 | if (($prevline !~ /^}/) && | ||
273 | ($prevline !~ /^\+}/) && | ||
274 | ($prevline !~ /^ }/)) { | ||
275 | print "EXPORT_SYMBOL(func); should immediately follow its function\n"; | ||
276 | print "$herecurr"; | ||
277 | $clean = 0; | ||
278 | } | ||
279 | } | ||
280 | |||
281 | # check for static initialisers. | ||
282 | if ($line=~/\s*static\s.*=\s+(0|NULL);/) { | ||
283 | print "do not initialise statics to 0 or NULL\n"; | ||
284 | print "$herecurr"; | ||
285 | $clean = 0; | ||
286 | } | ||
287 | |||
288 | # check for new typedefs. | ||
289 | if ($line=~/\s*typedef\s/) { | ||
290 | print "do not add new typedefs\n"; | ||
291 | print "$herecurr"; | ||
292 | $clean = 0; | ||
293 | } | ||
294 | |||
295 | # * goes on variable not on type | ||
296 | if ($line=~/[A-Za-z\d_]+\* [A-Za-z\d_]+/) { | ||
297 | print "\"foo* bar\" should be \"foo *bar\"\n"; | ||
298 | print "$herecurr"; | ||
299 | $clean = 0; | ||
300 | } | ||
301 | |||
302 | # # no BUG() or BUG_ON() | ||
303 | # if ($line =~ /\b(BUG|BUG_ON)\b/) { | ||
304 | # print "Try to use WARN_ON & Recovery code rather than BUG() or BUG_ON()\n"; | ||
305 | # print "$herecurr"; | ||
306 | # $clean = 0; | ||
307 | # } | ||
308 | |||
309 | # printk should use KERN_* levels | ||
310 | if ($line =~ /\bprintk\((?!KERN_)/) { | ||
311 | print "printk() should include KERN_ facility level\n"; | ||
312 | print "$herecurr"; | ||
313 | $clean = 0; | ||
314 | } | ||
315 | |||
316 | #function brace can't be on same line, except for #defines of do while, or if closed on same line | ||
317 | if (($line=~/[A-Za-z\d_]+\**\s+\**[A-Za-z\d_]+\(.*\).* {/) and | ||
318 | !($line=~/\#define.*do\s{/) and !($line=~/}/)) { | ||
319 | print "braces following function declarations go on the next line\n"; | ||
320 | print "$herecurr"; | ||
321 | $clean = 0; | ||
322 | } | ||
323 | my $opline = $line; | ||
324 | $opline =~ s/^.//; | ||
325 | if (!($line=~/\#\s*include/)) { | ||
326 | # Check operator spacing. | ||
327 | my @elements = split(/(<<=|>>=|<=|>=|==|!=|\+=|-=|\*=|\/=|%=|\^=|\|=|&=|->|<<|>>|<|>|=|!|~|&&|\|\||,|\^|\+\+|--|;|&|\||\+|-|\*|\/\/|\/)/, $opline); | ||
328 | for (my $n = 0; $n < $#elements; $n += 2) { | ||
329 | # $wN says we have white-space before or after | ||
330 | # $sN says we have a separator before or after | ||
331 | # $oN says we have another operator before or after | ||
332 | my $w1 = $elements[$n] =~ /\s$/; | ||
333 | my $s1 = $elements[$n] =~ /(\[|\(|\s)$/; | ||
334 | my $o1 = $elements[$n] eq ''; | ||
335 | my $op = $elements[$n + 1]; | ||
336 | my $w2 = 1; | ||
337 | my $s2 = 1; | ||
338 | my $o2 = 0; | ||
339 | # If we have something after the operator handle it. | ||
340 | if (defined $elements[$n + 2]) { | ||
341 | $w2 = $elements[$n + 2] =~ /^\s/; | ||
342 | $s2 = $elements[$n + 2] =~ /^(\s|\)|\]|;)/; | ||
343 | $o2 = $elements[$n + 2] eq ''; | ||
344 | } | ||
345 | |||
346 | # Generate the context. | ||
347 | my $at = "here: "; | ||
348 | for (my $m = $n; $m >= 0; $m--) { | ||
349 | if ($elements[$m] ne '') { | ||
350 | $at .= $elements[$m]; | ||
351 | last; | ||
352 | } | ||
353 | } | ||
354 | $at .= $op; | ||
355 | for (my $m = $n + 2; defined $elements[$m]; $m++) { | ||
356 | if ($elements[$m] ne '') { | ||
357 | $at .= $elements[$m]; | ||
358 | last; | ||
359 | } | ||
360 | } | ||
361 | |||
362 | ##print "<$s1:$op:$s2> <$elements[$n]:$elements[$n + 1]:$elements[$n + 2]>\n"; | ||
363 | # Skip things apparently in quotes. | ||
364 | next if ($line=~/\".*\Q$op\E.*\"/ or $line=~/\'\Q$op\E\'/); | ||
365 | |||
366 | # We need ; as an operator. // is a comment. | ||
367 | if ($op eq ';' or $op eq '//') { | ||
368 | |||
369 | # -> should have no spaces | ||
370 | } elsif ($op eq '->') { | ||
371 | if ($s1 or $s2) { | ||
372 | print "no spaces around that '$op' $at\n"; | ||
373 | print "$herecurr"; | ||
374 | $clean = 0; | ||
375 | } | ||
376 | |||
377 | # , must have a space on the right. | ||
378 | } elsif ($op eq ',') { | ||
379 | if (!$s2) { | ||
380 | print "need space after that '$op' $at\n"; | ||
381 | print "$herecurr"; | ||
382 | $clean = 0; | ||
383 | } | ||
384 | |||
385 | # unary ! and unary ~ are allowed no space on the right | ||
386 | } elsif ($op eq '!' or $op eq '~') { | ||
387 | if (!$s1 && !$o1) { | ||
388 | print "need space before that '$op' $at\n"; | ||
389 | print "$herecurr"; | ||
390 | $clean = 0; | ||
391 | } | ||
392 | if ($s2) { | ||
393 | print "no space after that '$op' $at\n"; | ||
394 | print "$herecurr"; | ||
395 | $clean = 0; | ||
396 | } | ||
397 | |||
398 | # unary ++ and unary -- are allowed no space on one side. | ||
399 | } elsif ($op eq '++' or $op eq '--') { | ||
400 | if (($s1 && $s2) || ((!$s1 && !$o1) && (!$s2 && !$o2))) { | ||
401 | print "need space one side of that '$op' $at\n"; | ||
402 | print "$herecurr"; | ||
403 | $clean = 0; | ||
404 | } | ||
405 | |||
406 | # & is both unary and binary | ||
407 | # unary: | ||
408 | # a &b | ||
409 | # binary (consistent spacing): | ||
410 | # a&b OK | ||
411 | # a & b OK | ||
412 | # | ||
413 | # boiling down to: if there is a space on the right then there | ||
414 | # should be one on the left. | ||
415 | # | ||
416 | # - is the same | ||
417 | # | ||
418 | # * is the same only adding: | ||
419 | # type: | ||
420 | # (foo *) | ||
421 | # (foo **) | ||
422 | # | ||
423 | } elsif ($op eq '&' or $op eq '-' or $op eq '*') { | ||
424 | if ($w2 and !$w1) { | ||
425 | print "need space before that '$op' $at\n"; | ||
426 | print "$herecurr"; | ||
427 | $clean = 0; | ||
428 | } | ||
429 | |||
430 | # << and >> may either have or not have spaces both sides | ||
431 | } elsif ($op eq '<<' or $op eq '>>' or $op eq '+' or $op eq '/' or | ||
432 | $op eq '^' or $op eq '|') | ||
433 | { | ||
434 | if ($s1 != $s2) { | ||
435 | print "need consistent spacing around '$op' $at\n"; | ||
436 | print "$herecurr"; | ||
437 | $clean = 0; | ||
438 | } | ||
439 | |||
440 | # All the others need spaces both sides. | ||
441 | } elsif (!$s1 or !$s2) { | ||
442 | print "need spaces around that '$op' $at\n"; | ||
443 | print "$herecurr"; | ||
444 | $clean = 0; | ||
445 | } | ||
446 | } | ||
447 | } | ||
448 | |||
449 | #need space before brace following if, while, etc | ||
450 | if ($line=~/\(.*\){/) { | ||
451 | print "need a space before the brace\n"; | ||
452 | print "$herecurr"; | ||
453 | $clean = 0; | ||
454 | } | ||
455 | |||
456 | #goto labels aren't indented, allow a single space however | ||
457 | if ($line=~/^.\s+[A-Za-z\d_]+:/ and | ||
458 | !($line=~/^. [A-Za-z\d_]+:/) and !($line=~/^.\s+default:/)) { | ||
459 | print "labels should not be indented\n"; | ||
460 | print "$herecurr"; | ||
461 | $clean = 0; | ||
462 | } | ||
463 | |||
464 | # Need a space before open parenthesis after if, while etc | ||
465 | if ($line=~/(if|while|for|switch)\(/) { | ||
466 | print "need a space before the open parenthesis\n"; | ||
467 | print "$herecurr"; | ||
468 | $clean = 0; | ||
469 | } | ||
470 | |||
471 | # Check for illegal assignment in if conditional. | ||
472 | if ($line=~/(if|while)\s*\(.*[^<>!=]=[^=].*\)/) { | ||
473 | print "do not use assignment in if condition\n"; | ||
474 | print "$herecurr"; | ||
475 | $clean = 0; | ||
476 | } | ||
477 | |||
478 | # Check for }<nl>else {, these must be at the same | ||
479 | # indent level to be relevant to each other. | ||
480 | if ($prevline=~/}\s*$/ and $line=~/^.\s*else\s*/ and | ||
481 | $previndent == $indent) { | ||
482 | print "else should follow close brace\n"; | ||
483 | print "$hereprev"; | ||
484 | $clean = 0; | ||
485 | } | ||
486 | |||
487 | # Check for switch () {<nl>case, these must be at the | ||
488 | # same indent. We will only catch the first one, as our | ||
489 | # context is very small but people tend to be consistent | ||
490 | # so we will catch them out more often than not. | ||
491 | if ($prevline=~/\s*switch\s*\(.*\)/ and $line=~/\s*case\s+/ | ||
492 | and $previndent != $indent) { | ||
493 | print "switch and case should be at the same indent\n"; | ||
494 | print "$hereprev"; | ||
495 | $clean = 0; | ||
496 | } | ||
497 | |||
498 | #studly caps, commented out until figure out how to distinguish between use of existing and adding new | ||
499 | # if (($line=~/[\w_][a-z\d]+[A-Z]/) and !($line=~/print/)) { | ||
500 | # print "No studly caps, use _\n"; | ||
501 | # print "$herecurr"; | ||
502 | # $clean = 0; | ||
503 | # } | ||
504 | |||
505 | #no spaces allowed after \ in define | ||
506 | if ($line=~/\#define.*\\\s$/) { | ||
507 | print("Whitepspace after \\ makes next lines useless\n"); | ||
508 | print "$herecurr"; | ||
509 | $clean = 0; | ||
510 | } | ||
511 | |||
512 | #warn if <asm/foo.h> is #included and <linux/foo.h> is available. | ||
513 | if ($tree && $line =~ qr|\s*\#\s*include\s*\<asm\/(.*)\.h\>|) { | ||
514 | my $checkfile = "include/linux/$1.h"; | ||
515 | if (-f $checkfile) { | ||
516 | print "Use #include <linux/$1.h> instead of <asm/$1.h>\n"; | ||
517 | print $herecurr; | ||
518 | $clean = 0; | ||
519 | } | ||
520 | } | ||
521 | |||
522 | #if/while/etc brace do not go on next line, unless #defining a do while loop, or if that brace on the next line is for something else | ||
523 | if ($prevline=~/(if|while|for|switch)\s*\(/) { | ||
524 | my @opened = $prevline=~/\(/g; | ||
525 | my @closed = $prevline=~/\)/g; | ||
526 | my $nr_line = $linenr; | ||
527 | my $remaining = $realcnt; | ||
528 | my $next_line = $line; | ||
529 | my $extra_lines = 0; | ||
530 | my $display_segment = $prevline; | ||
531 | |||
532 | while ($remaining > 0 && scalar @opened > scalar @closed) { | ||
533 | $prevline .= $next_line; | ||
534 | $display_segment .= "\n" . $next_line; | ||
535 | $next_line = $lines[$nr_line]; | ||
536 | $nr_line++; | ||
537 | $remaining--; | ||
538 | |||
539 | @opened = $prevline=~/\(/g; | ||
540 | @closed = $prevline=~/\)/g; | ||
541 | } | ||
542 | |||
543 | if (($prevline=~/(if|while|for|switch)\s*\(.*\)\s*$/) and ($next_line=~/{/) and | ||
544 | !($next_line=~/(if|while|for)/) and !($next_line=~/\#define.*do.*while/)) { | ||
545 | print "That { should be on the previous line\n"; | ||
546 | print "$display_segment\n$next_line\n\n"; | ||
547 | $clean = 0; | ||
548 | } | ||
549 | } | ||
550 | |||
551 | #multiline macros should be enclosed in a do while loop | ||
552 | if (($prevline=~/\#define.*\\/) and !($prevline=~/do\s+{/) and | ||
553 | !($prevline=~/\(\{/) and ($line=~/;\s*\\/) and | ||
554 | !($line=~/do.*{/) and !($line=~/\(\{/)) { | ||
555 | print "Macros with multiple statements should be enclosed in a do - while loop\n"; | ||
556 | print "$hereprev"; | ||
557 | $clean = 0; | ||
558 | } | ||
559 | |||
560 | # don't include deprecated include files | ||
561 | for my $inc (@deprecated) { | ||
562 | if ($line =~ m@\#\s*include\s*\<$inc>@) { | ||
563 | print "Don't use <$inc>: see Documentation/feature-removal-schedule.txt\n"; | ||
564 | print "$herecurr"; | ||
565 | $clean = 0; | ||
566 | } | ||
567 | } | ||
568 | |||
569 | # don't use kernel_thread() | ||
570 | if ($line =~ /\bkernel_thread\b/) { | ||
571 | print "Don't use kernel_thread(), use kthread(): see Documentation/feature-removal-schedule.txt\n"; | ||
572 | print "$herecurr"; | ||
573 | $clean = 0; | ||
574 | } | ||
575 | } | ||
576 | |||
577 | if ($chk_patch && !$is_patch) { | ||
578 | $clean = 0; | ||
579 | print "Does not appear to be a unified-diff format patch\n"; | ||
580 | } | ||
581 | if ($is_patch && $chk_signoff && $signoff == 0) { | ||
582 | $clean = 0; | ||
583 | print "Missing Signed-off-by: line(s)\n"; | ||
584 | } | ||
585 | |||
586 | if ($clean == 1 && $quiet == 0) { | ||
587 | print "Your patch has no obvious style problems and is ready for submission.\n" | ||
588 | } | ||
589 | if ($clean == 0 && $quiet == 0) { | ||
590 | print "Your patch has style problems, please review. If any of these errors\n"; | ||
591 | print "are false positives report them to the maintainer, see\n"; | ||
592 | print "CHECKPATCH in MAINTAINERS.\n"; | ||
593 | } | ||
594 | return $clean; | ||
595 | } | ||
diff --git a/sound/arm/sa11xx-uda1341.c b/sound/arm/sa11xx-uda1341.c index c7e1b2646193..e7ed868fa7c0 100644 --- a/sound/arm/sa11xx-uda1341.c +++ b/sound/arm/sa11xx-uda1341.c | |||
@@ -987,7 +987,7 @@ static int __init sa11xx_uda1341_init(void) | |||
987 | if (platform_get_drvdata(device)) | 987 | if (platform_get_drvdata(device)) |
988 | return 0; | 988 | return 0; |
989 | platform_device_unregister(device); | 989 | platform_device_unregister(device); |
990 | err = -ENODEV | 990 | err = -ENODEV; |
991 | } else | 991 | } else |
992 | err = PTR_ERR(device); | 992 | err = PTR_ERR(device); |
993 | platform_driver_unregister(&sa11xx_uda1341_driver); | 993 | platform_driver_unregister(&sa11xx_uda1341_driver); |
diff --git a/sound/pci/ali5451/ali5451.c b/sound/pci/ali5451/ali5451.c index e1ed59549c50..cb59f994c68f 100644 --- a/sound/pci/ali5451/ali5451.c +++ b/sound/pci/ali5451/ali5451.c | |||
@@ -1250,7 +1250,7 @@ static int snd_ali_playback_hw_params(struct snd_pcm_substream *substream, | |||
1250 | evoice->substream = substream; | 1250 | evoice->substream = substream; |
1251 | } | 1251 | } |
1252 | } else { | 1252 | } else { |
1253 | if (!evoice) { | 1253 | if (evoice) { |
1254 | snd_ali_free_voice(codec, evoice); | 1254 | snd_ali_free_voice(codec, evoice); |
1255 | pvoice->extra = evoice = NULL; | 1255 | pvoice->extra = evoice = NULL; |
1256 | } | 1256 | } |
@@ -1267,7 +1267,7 @@ static int snd_ali_playback_hw_free(struct snd_pcm_substream *substream) | |||
1267 | struct snd_ali_voice *evoice = pvoice ? pvoice->extra : NULL; | 1267 | struct snd_ali_voice *evoice = pvoice ? pvoice->extra : NULL; |
1268 | 1268 | ||
1269 | snd_pcm_lib_free_pages(substream); | 1269 | snd_pcm_lib_free_pages(substream); |
1270 | if (!evoice) { | 1270 | if (evoice) { |
1271 | snd_ali_free_voice(codec, evoice); | 1271 | snd_ali_free_voice(codec, evoice); |
1272 | pvoice->extra = NULL; | 1272 | pvoice->extra = NULL; |
1273 | } | 1273 | } |
@@ -1356,7 +1356,7 @@ static int snd_ali_playback_prepare(struct snd_pcm_substream *substream) | |||
1356 | VOL, | 1356 | VOL, |
1357 | CTRL, | 1357 | CTRL, |
1358 | EC); | 1358 | EC); |
1359 | if (!evoice) { | 1359 | if (evoice) { |
1360 | evoice->count = pvoice->count; | 1360 | evoice->count = pvoice->count; |
1361 | evoice->eso = pvoice->count << 1; | 1361 | evoice->eso = pvoice->count << 1; |
1362 | ESO = evoice->eso - 1; | 1362 | ESO = evoice->eso - 1; |
diff --git a/sound/pci/hda/hda_codec.c b/sound/pci/hda/hda_codec.c index 8e89d56b6400..f87f8f088956 100644 --- a/sound/pci/hda/hda_codec.c +++ b/sound/pci/hda/hda_codec.c | |||
@@ -713,6 +713,19 @@ static u32 query_amp_caps(struct hda_codec *codec, hda_nid_t nid, int direction) | |||
713 | return info->amp_caps; | 713 | return info->amp_caps; |
714 | } | 714 | } |
715 | 715 | ||
716 | int snd_hda_override_amp_caps(struct hda_codec *codec, hda_nid_t nid, int dir, | ||
717 | unsigned int caps) | ||
718 | { | ||
719 | struct hda_amp_info *info; | ||
720 | |||
721 | info = get_alloc_amp_hash(codec, HDA_HASH_KEY(nid, dir, 0)); | ||
722 | if (!info) | ||
723 | return -EINVAL; | ||
724 | info->amp_caps = caps; | ||
725 | info->status |= INFO_AMP_CAPS; | ||
726 | return 0; | ||
727 | } | ||
728 | |||
716 | /* | 729 | /* |
717 | * read the current volume to info | 730 | * read the current volume to info |
718 | * if the cache exists, read the cache value. | 731 | * if the cache exists, read the cache value. |
diff --git a/sound/pci/hda/hda_local.h b/sound/pci/hda/hda_local.h index be12b8814c39..f91ea5ec9f6d 100644 --- a/sound/pci/hda/hda_local.h +++ b/sound/pci/hda/hda_local.h | |||
@@ -277,5 +277,7 @@ static inline u32 get_wcaps(struct hda_codec *codec, hda_nid_t nid) | |||
277 | return codec->wcaps[nid - codec->start_nid]; | 277 | return codec->wcaps[nid - codec->start_nid]; |
278 | } | 278 | } |
279 | 279 | ||
280 | int snd_hda_override_amp_caps(struct hda_codec *codec, hda_nid_t nid, int dir, | ||
281 | unsigned int caps); | ||
280 | 282 | ||
281 | #endif /* __SOUND_HDA_LOCAL_H */ | 283 | #endif /* __SOUND_HDA_LOCAL_H */ |
diff --git a/sound/pci/hda/patch_conexant.c b/sound/pci/hda/patch_conexant.c index a5a4b2bddf20..bef214bcdddf 100644 --- a/sound/pci/hda/patch_conexant.c +++ b/sound/pci/hda/patch_conexant.c | |||
@@ -705,6 +705,17 @@ static struct snd_kcontrol_new cxt5045_test_mixer[] = { | |||
705 | .get = conexant_mux_enum_get, | 705 | .get = conexant_mux_enum_get, |
706 | .put = conexant_mux_enum_put, | 706 | .put = conexant_mux_enum_put, |
707 | }, | 707 | }, |
708 | /* Audio input controls */ | ||
709 | HDA_CODEC_VOLUME("Input-1 Volume", 0x1a, 0x0, HDA_INPUT), | ||
710 | HDA_CODEC_MUTE("Input-1 Switch", 0x1a, 0x0, HDA_INPUT), | ||
711 | HDA_CODEC_VOLUME("Input-2 Volume", 0x1a, 0x1, HDA_INPUT), | ||
712 | HDA_CODEC_MUTE("Input-2 Switch", 0x1a, 0x1, HDA_INPUT), | ||
713 | HDA_CODEC_VOLUME("Input-3 Volume", 0x1a, 0x2, HDA_INPUT), | ||
714 | HDA_CODEC_MUTE("Input-3 Switch", 0x1a, 0x2, HDA_INPUT), | ||
715 | HDA_CODEC_VOLUME("Input-4 Volume", 0x1a, 0x3, HDA_INPUT), | ||
716 | HDA_CODEC_MUTE("Input-4 Switch", 0x1a, 0x3, HDA_INPUT), | ||
717 | HDA_CODEC_VOLUME("Input-5 Volume", 0x1a, 0x4, HDA_INPUT), | ||
718 | HDA_CODEC_MUTE("Input-5 Switch", 0x1a, 0x4, HDA_INPUT), | ||
708 | { } /* end */ | 719 | { } /* end */ |
709 | }; | 720 | }; |
710 | 721 | ||
@@ -947,6 +958,23 @@ static void cxt5047_hp_automute(struct hda_codec *codec) | |||
947 | snd_hda_codec_amp_update(codec, 0x1c, 1, HDA_OUTPUT, 0, 0x80, bits); | 958 | snd_hda_codec_amp_update(codec, 0x1c, 1, HDA_OUTPUT, 0, 0x80, bits); |
948 | } | 959 | } |
949 | 960 | ||
961 | /* mute internal speaker if HP is plugged */ | ||
962 | static void cxt5047_hp2_automute(struct hda_codec *codec) | ||
963 | { | ||
964 | struct conexant_spec *spec = codec->spec; | ||
965 | unsigned int bits; | ||
966 | |||
967 | spec->hp_present = snd_hda_codec_read(codec, 0x13, 0, | ||
968 | AC_VERB_GET_PIN_SENSE, 0) & 0x80000000; | ||
969 | |||
970 | bits = spec->hp_present ? 0x80 : 0; | ||
971 | snd_hda_codec_amp_update(codec, 0x1d, 0, HDA_OUTPUT, 0, 0x80, bits); | ||
972 | snd_hda_codec_amp_update(codec, 0x1d, 1, HDA_OUTPUT, 0, 0x80, bits); | ||
973 | /* Mute/Unmute PCM 2 for good measure - some systems need this */ | ||
974 | snd_hda_codec_amp_update(codec, 0x1c, 0, HDA_OUTPUT, 0, 0x80, bits); | ||
975 | snd_hda_codec_amp_update(codec, 0x1c, 1, HDA_OUTPUT, 0, 0x80, bits); | ||
976 | } | ||
977 | |||
950 | /* toggle input of built-in and mic jack appropriately */ | 978 | /* toggle input of built-in and mic jack appropriately */ |
951 | static void cxt5047_hp_automic(struct hda_codec *codec) | 979 | static void cxt5047_hp_automic(struct hda_codec *codec) |
952 | { | 980 | { |
@@ -985,6 +1013,21 @@ static void cxt5047_hp_unsol_event(struct hda_codec *codec, | |||
985 | } | 1013 | } |
986 | } | 1014 | } |
987 | 1015 | ||
1016 | /* unsolicited event for HP jack sensing - non-EAPD systems */ | ||
1017 | static void cxt5047_hp2_unsol_event(struct hda_codec *codec, | ||
1018 | unsigned int res) | ||
1019 | { | ||
1020 | res >>= 26; | ||
1021 | switch (res) { | ||
1022 | case CONEXANT_HP_EVENT: | ||
1023 | cxt5047_hp2_automute(codec); | ||
1024 | break; | ||
1025 | case CONEXANT_MIC_EVENT: | ||
1026 | cxt5047_hp_automic(codec); | ||
1027 | break; | ||
1028 | } | ||
1029 | } | ||
1030 | |||
988 | static struct snd_kcontrol_new cxt5047_mixers[] = { | 1031 | static struct snd_kcontrol_new cxt5047_mixers[] = { |
989 | HDA_CODEC_VOLUME("Mic Bypass Capture Volume", 0x19, 0x02, HDA_INPUT), | 1032 | HDA_CODEC_VOLUME("Mic Bypass Capture Volume", 0x19, 0x02, HDA_INPUT), |
990 | HDA_CODEC_MUTE("Mic Bypass Capture Switch", 0x19, 0x02, HDA_INPUT), | 1033 | HDA_CODEC_MUTE("Mic Bypass Capture Switch", 0x19, 0x02, HDA_INPUT), |
@@ -1300,19 +1343,20 @@ static int patch_cxt5047(struct hda_codec *codec) | |||
1300 | spec->channel_mode = cxt5047_modes, | 1343 | spec->channel_mode = cxt5047_modes, |
1301 | 1344 | ||
1302 | codec->patch_ops = conexant_patch_ops; | 1345 | codec->patch_ops = conexant_patch_ops; |
1303 | codec->patch_ops.unsol_event = cxt5047_hp_unsol_event; | ||
1304 | 1346 | ||
1305 | board_config = snd_hda_check_board_config(codec, CXT5047_MODELS, | 1347 | board_config = snd_hda_check_board_config(codec, CXT5047_MODELS, |
1306 | cxt5047_models, | 1348 | cxt5047_models, |
1307 | cxt5047_cfg_tbl); | 1349 | cxt5047_cfg_tbl); |
1308 | switch (board_config) { | 1350 | switch (board_config) { |
1309 | case CXT5047_LAPTOP: | 1351 | case CXT5047_LAPTOP: |
1352 | codec->patch_ops.unsol_event = cxt5047_hp2_unsol_event; | ||
1310 | break; | 1353 | break; |
1311 | case CXT5047_LAPTOP_HP: | 1354 | case CXT5047_LAPTOP_HP: |
1312 | spec->input_mux = &cxt5047_hp_capture_source; | 1355 | spec->input_mux = &cxt5047_hp_capture_source; |
1313 | spec->num_init_verbs = 2; | 1356 | spec->num_init_verbs = 2; |
1314 | spec->init_verbs[1] = cxt5047_hp_init_verbs; | 1357 | spec->init_verbs[1] = cxt5047_hp_init_verbs; |
1315 | spec->mixers[0] = cxt5047_hp_mixers; | 1358 | spec->mixers[0] = cxt5047_hp_mixers; |
1359 | codec->patch_ops.unsol_event = cxt5047_hp_unsol_event; | ||
1316 | codec->patch_ops.init = cxt5047_hp_init; | 1360 | codec->patch_ops.init = cxt5047_hp_init; |
1317 | break; | 1361 | break; |
1318 | case CXT5047_LAPTOP_EAPD: | 1362 | case CXT5047_LAPTOP_EAPD: |
@@ -1320,12 +1364,14 @@ static int patch_cxt5047(struct hda_codec *codec) | |||
1320 | spec->num_init_verbs = 2; | 1364 | spec->num_init_verbs = 2; |
1321 | spec->init_verbs[1] = cxt5047_toshiba_init_verbs; | 1365 | spec->init_verbs[1] = cxt5047_toshiba_init_verbs; |
1322 | spec->mixers[0] = cxt5047_toshiba_mixers; | 1366 | spec->mixers[0] = cxt5047_toshiba_mixers; |
1367 | codec->patch_ops.unsol_event = cxt5047_hp_unsol_event; | ||
1323 | break; | 1368 | break; |
1324 | #ifdef CONFIG_SND_DEBUG | 1369 | #ifdef CONFIG_SND_DEBUG |
1325 | case CXT5047_TEST: | 1370 | case CXT5047_TEST: |
1326 | spec->input_mux = &cxt5047_test_capture_source; | 1371 | spec->input_mux = &cxt5047_test_capture_source; |
1327 | spec->mixers[0] = cxt5047_test_mixer; | 1372 | spec->mixers[0] = cxt5047_test_mixer; |
1328 | spec->init_verbs[0] = cxt5047_test_init_verbs; | 1373 | spec->init_verbs[0] = cxt5047_test_init_verbs; |
1374 | codec->patch_ops.unsol_event = cxt5047_hp_unsol_event; | ||
1329 | #endif | 1375 | #endif |
1330 | } | 1376 | } |
1331 | return 0; | 1377 | return 0; |
diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c index 34ac63469532..4776de93928b 100644 --- a/sound/pci/hda/patch_realtek.c +++ b/sound/pci/hda/patch_realtek.c | |||
@@ -6379,8 +6379,10 @@ static struct snd_pci_quirk alc883_cfg_tbl[] = { | |||
6379 | SND_PCI_QUIRK(0x1458, 0xa002, "MSI", ALC883_6ST_DIG), | 6379 | SND_PCI_QUIRK(0x1458, 0xa002, "MSI", ALC883_6ST_DIG), |
6380 | SND_PCI_QUIRK(0x1462, 0x6668, "MSI", ALC883_6ST_DIG), | 6380 | SND_PCI_QUIRK(0x1462, 0x6668, "MSI", ALC883_6ST_DIG), |
6381 | SND_PCI_QUIRK(0x1462, 0x7187, "MSI", ALC883_6ST_DIG), | 6381 | SND_PCI_QUIRK(0x1462, 0x7187, "MSI", ALC883_6ST_DIG), |
6382 | SND_PCI_QUIRK(0x1462, 0x7250, "MSI", ALC883_6ST_DIG), | ||
6382 | SND_PCI_QUIRK(0x1462, 0x7280, "MSI", ALC883_6ST_DIG), | 6383 | SND_PCI_QUIRK(0x1462, 0x7280, "MSI", ALC883_6ST_DIG), |
6383 | SND_PCI_QUIRK(0x1462, 0x0579, "MSI", ALC883_TARGA_2ch_DIG), | 6384 | SND_PCI_QUIRK(0x1462, 0x0579, "MSI", ALC883_TARGA_2ch_DIG), |
6385 | SND_PCI_QUIRK(0x1462, 0x3729, "MSI S420", ALC883_TARGA_DIG), | ||
6384 | SND_PCI_QUIRK(0x1462, 0x3ef9, "MSI", ALC883_TARGA_DIG), | 6386 | SND_PCI_QUIRK(0x1462, 0x3ef9, "MSI", ALC883_TARGA_DIG), |
6385 | SND_PCI_QUIRK(0x1462, 0x3b7f, "MSI", ALC883_TARGA_2ch_DIG), | 6387 | SND_PCI_QUIRK(0x1462, 0x3b7f, "MSI", ALC883_TARGA_2ch_DIG), |
6386 | SND_PCI_QUIRK(0x1462, 0x3fcc, "MSI", ALC883_TARGA_DIG), | 6388 | SND_PCI_QUIRK(0x1462, 0x3fcc, "MSI", ALC883_TARGA_DIG), |
@@ -6391,6 +6393,7 @@ static struct snd_pci_quirk alc883_cfg_tbl[] = { | |||
6391 | SND_PCI_QUIRK(0x1462, 0x4324, "MSI", ALC883_TARGA_DIG), | 6393 | SND_PCI_QUIRK(0x1462, 0x4324, "MSI", ALC883_TARGA_DIG), |
6392 | SND_PCI_QUIRK(0x1462, 0xa422, "MSI", ALC883_TARGA_2ch_DIG), | 6394 | SND_PCI_QUIRK(0x1462, 0xa422, "MSI", ALC883_TARGA_2ch_DIG), |
6393 | SND_PCI_QUIRK(0x1025, 0, "Acer laptop", ALC883_ACER), | 6395 | SND_PCI_QUIRK(0x1025, 0, "Acer laptop", ALC883_ACER), |
6396 | SND_PCI_QUIRK(0x15d9, 0x8780, "Supermicro PDSBA", ALC883_3ST_6ch), | ||
6394 | SND_PCI_QUIRK(0x161f, 0x2054, "Medion laptop", ALC883_MEDION), | 6397 | SND_PCI_QUIRK(0x161f, 0x2054, "Medion laptop", ALC883_MEDION), |
6395 | SND_PCI_QUIRK(0x1071, 0x8258, "Evesham Voyaeger", ALC883_LAPTOP_EAPD), | 6398 | SND_PCI_QUIRK(0x1071, 0x8258, "Evesham Voyaeger", ALC883_LAPTOP_EAPD), |
6396 | SND_PCI_QUIRK(0x8086, 0xd601, "D102GGC", ALC883_3ST_6ch), | 6399 | SND_PCI_QUIRK(0x8086, 0xd601, "D102GGC", ALC883_3ST_6ch), |
@@ -8765,7 +8768,6 @@ static struct snd_pci_quirk alc861_cfg_tbl[] = { | |||
8765 | SND_PCI_QUIRK(0x1043, 0x1338, "ASUS F2/3", ALC861_ASUS_LAPTOP), | 8768 | SND_PCI_QUIRK(0x1043, 0x1338, "ASUS F2/3", ALC861_ASUS_LAPTOP), |
8766 | SND_PCI_QUIRK(0x1043, 0x13d7, "ASUS A9rp", ALC861_ASUS_LAPTOP), | 8769 | SND_PCI_QUIRK(0x1043, 0x13d7, "ASUS A9rp", ALC861_ASUS_LAPTOP), |
8767 | SND_PCI_QUIRK(0x1043, 0x1393, "ASUS", ALC861_ASUS), | 8770 | SND_PCI_QUIRK(0x1043, 0x1393, "ASUS", ALC861_ASUS), |
8768 | SND_PCI_QUIRK(0x1043, 0x81e7, "ASUS", ALC660_3ST), | ||
8769 | SND_PCI_QUIRK(0x1179, 0xff00, "Toshiba", ALC861_TOSHIBA), | 8771 | SND_PCI_QUIRK(0x1179, 0xff00, "Toshiba", ALC861_TOSHIBA), |
8770 | SND_PCI_QUIRK(0x1179, 0xff10, "Toshiba", ALC861_TOSHIBA), | 8772 | SND_PCI_QUIRK(0x1179, 0xff10, "Toshiba", ALC861_TOSHIBA), |
8771 | SND_PCI_QUIRK(0x1584, 0x9072, "Uniwill m31", ALC861_UNIWILL_M31), | 8773 | SND_PCI_QUIRK(0x1584, 0x9072, "Uniwill m31", ALC861_UNIWILL_M31), |
@@ -9473,6 +9475,7 @@ static const char *alc861vd_models[ALC861VD_MODEL_LAST] = { | |||
9473 | static struct snd_pci_quirk alc861vd_cfg_tbl[] = { | 9475 | static struct snd_pci_quirk alc861vd_cfg_tbl[] = { |
9474 | SND_PCI_QUIRK(0x1043, 0x12e2, "Asus z35m", ALC660VD_3ST), | 9476 | SND_PCI_QUIRK(0x1043, 0x12e2, "Asus z35m", ALC660VD_3ST), |
9475 | SND_PCI_QUIRK(0x1043, 0x1339, "Asus G1", ALC660VD_3ST), | 9477 | SND_PCI_QUIRK(0x1043, 0x1339, "Asus G1", ALC660VD_3ST), |
9478 | SND_PCI_QUIRK(0x1043, 0x81e7, "ASUS", ALC660VD_3ST), | ||
9476 | SND_PCI_QUIRK(0x10de, 0x03f0, "Realtek ALC660 demo", ALC660VD_3ST), | 9479 | SND_PCI_QUIRK(0x10de, 0x03f0, "Realtek ALC660 demo", ALC660VD_3ST), |
9477 | SND_PCI_QUIRK(0x1019, 0xa88d, "Realtek ALC660 demo", ALC660VD_3ST), | 9480 | SND_PCI_QUIRK(0x1019, 0xa88d, "Realtek ALC660 demo", ALC660VD_3ST), |
9478 | 9481 | ||
diff --git a/sound/pci/hda/patch_si3054.c b/sound/pci/hda/patch_si3054.c index 6fcda9bcf0cf..43f537ef40bf 100644 --- a/sound/pci/hda/patch_si3054.c +++ b/sound/pci/hda/patch_si3054.c | |||
@@ -304,6 +304,8 @@ struct hda_codec_preset snd_hda_preset_si3054[] = { | |||
304 | { .id = 0x10573055, .name = "Si3054", .patch = patch_si3054 }, | 304 | { .id = 0x10573055, .name = "Si3054", .patch = patch_si3054 }, |
305 | { .id = 0x10573057, .name = "Si3054", .patch = patch_si3054 }, | 305 | { .id = 0x10573057, .name = "Si3054", .patch = patch_si3054 }, |
306 | { .id = 0x10573155, .name = "Si3054", .patch = patch_si3054 }, | 306 | { .id = 0x10573155, .name = "Si3054", .patch = patch_si3054 }, |
307 | /* Asus A8J Modem (SM56) */ | ||
308 | { .id = 0x15433155, .name = "Si3054", .patch = patch_si3054 }, | ||
307 | {} | 309 | {} |
308 | }; | 310 | }; |
309 | 311 | ||
diff --git a/sound/pci/hda/patch_sigmatel.c b/sound/pci/hda/patch_sigmatel.c index a6a0a80edc3b..e3964fc4c405 100644 --- a/sound/pci/hda/patch_sigmatel.c +++ b/sound/pci/hda/patch_sigmatel.c | |||
@@ -51,6 +51,7 @@ enum { | |||
51 | STAC_925x_REF, | 51 | STAC_925x_REF, |
52 | STAC_M2_2, | 52 | STAC_M2_2, |
53 | STAC_MA6, | 53 | STAC_MA6, |
54 | STAC_PA6, | ||
54 | STAC_925x_MODELS | 55 | STAC_925x_MODELS |
55 | }; | 56 | }; |
56 | 57 | ||
@@ -152,6 +153,10 @@ static hda_nid_t stac925x_dac_nids[1] = { | |||
152 | 0x02, | 153 | 0x02, |
153 | }; | 154 | }; |
154 | 155 | ||
156 | static hda_nid_t stac925x_dmic_nids[1] = { | ||
157 | 0x15, | ||
158 | }; | ||
159 | |||
155 | static hda_nid_t stac922x_adc_nids[2] = { | 160 | static hda_nid_t stac922x_adc_nids[2] = { |
156 | 0x06, 0x07, | 161 | 0x06, 0x07, |
157 | }; | 162 | }; |
@@ -469,6 +474,14 @@ static struct snd_pci_quirk stac9200_cfg_tbl[] = { | |||
469 | "Dell Precision M90", STAC_REF), | 474 | "Dell Precision M90", STAC_REF), |
470 | SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01d6, | 475 | SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01d6, |
471 | "unknown Dell", STAC_REF), | 476 | "unknown Dell", STAC_REF), |
477 | SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01d8, | ||
478 | "Dell Inspiron 640m", STAC_REF), | ||
479 | SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01f5, | ||
480 | "Dell Inspiron 1501", STAC_REF), | ||
481 | |||
482 | /* Panasonic */ | ||
483 | SND_PCI_QUIRK(0x10f7, 0x8338, "Panasonic CF-74", STAC_REF), | ||
484 | |||
472 | {} /* terminator */ | 485 | {} /* terminator */ |
473 | }; | 486 | }; |
474 | 487 | ||
@@ -482,29 +495,38 @@ static unsigned int stac925x_MA6_pin_configs[8] = { | |||
482 | 0x90a70320, 0x90100211, 0x400003f1, 0x9033032e, | 495 | 0x90a70320, 0x90100211, 0x400003f1, 0x9033032e, |
483 | }; | 496 | }; |
484 | 497 | ||
498 | static unsigned int stac925x_PA6_pin_configs[8] = { | ||
499 | 0x40c003f0, 0x424503f2, 0x01813022, 0x02a19021, | ||
500 | 0x50a103f0, 0x90100211, 0x400003f1, 0x9033032e, | ||
501 | }; | ||
502 | |||
485 | static unsigned int stac925xM2_2_pin_configs[8] = { | 503 | static unsigned int stac925xM2_2_pin_configs[8] = { |
486 | 0x40c003f3, 0x424503f2, 0x041800f4, 0x02a19020, | 504 | 0x40c003f3, 0x424503f2, 0x04180011, 0x02a19020, |
487 | 0x50a103F0, 0x90100210, 0x400003f1, 0x9033032e, | 505 | 0x50a103f0, 0x90100212, 0x400003f1, 0x9033032e, |
488 | }; | 506 | }; |
489 | 507 | ||
490 | static unsigned int *stac925x_brd_tbl[STAC_925x_MODELS] = { | 508 | static unsigned int *stac925x_brd_tbl[STAC_925x_MODELS] = { |
491 | [STAC_REF] = ref925x_pin_configs, | 509 | [STAC_REF] = ref925x_pin_configs, |
492 | [STAC_M2_2] = stac925xM2_2_pin_configs, | 510 | [STAC_M2_2] = stac925xM2_2_pin_configs, |
493 | [STAC_MA6] = stac925x_MA6_pin_configs, | 511 | [STAC_MA6] = stac925x_MA6_pin_configs, |
512 | [STAC_PA6] = stac925x_PA6_pin_configs, | ||
494 | }; | 513 | }; |
495 | 514 | ||
496 | static const char *stac925x_models[STAC_925x_MODELS] = { | 515 | static const char *stac925x_models[STAC_925x_MODELS] = { |
497 | [STAC_REF] = "ref", | 516 | [STAC_REF] = "ref", |
498 | [STAC_M2_2] = "m2-2", | 517 | [STAC_M2_2] = "m2-2", |
499 | [STAC_MA6] = "m6", | 518 | [STAC_MA6] = "m6", |
519 | [STAC_PA6] = "pa6", | ||
500 | }; | 520 | }; |
501 | 521 | ||
502 | static struct snd_pci_quirk stac925x_cfg_tbl[] = { | 522 | static struct snd_pci_quirk stac925x_cfg_tbl[] = { |
503 | /* SigmaTel reference board */ | 523 | /* SigmaTel reference board */ |
504 | SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2668, "DFI LanParty", STAC_REF), | 524 | SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2668, "DFI LanParty", STAC_REF), |
525 | SND_PCI_QUIRK(0x8384, 0x7632, "Stac9202 Reference Board", STAC_REF), | ||
505 | SND_PCI_QUIRK(0x107b, 0x0316, "Gateway M255", STAC_REF), | 526 | SND_PCI_QUIRK(0x107b, 0x0316, "Gateway M255", STAC_REF), |
506 | SND_PCI_QUIRK(0x107b, 0x0366, "Gateway MP6954", STAC_REF), | 527 | SND_PCI_QUIRK(0x107b, 0x0366, "Gateway MP6954", STAC_REF), |
507 | SND_PCI_QUIRK(0x107b, 0x0461, "Gateway NX560XL", STAC_MA6), | 528 | SND_PCI_QUIRK(0x107b, 0x0461, "Gateway NX560XL", STAC_MA6), |
529 | SND_PCI_QUIRK(0x107b, 0x0681, "Gateway NX860", STAC_PA6), | ||
508 | SND_PCI_QUIRK(0x1002, 0x437b, "Gateway MX6453", STAC_M2_2), | 530 | SND_PCI_QUIRK(0x1002, 0x437b, "Gateway MX6453", STAC_M2_2), |
509 | {} /* terminator */ | 531 | {} /* terminator */ |
510 | }; | 532 | }; |
@@ -1742,6 +1764,21 @@ static void stac92xx_set_pinctl(struct hda_codec *codec, hda_nid_t nid, | |||
1742 | unsigned int pin_ctl = snd_hda_codec_read(codec, nid, | 1764 | unsigned int pin_ctl = snd_hda_codec_read(codec, nid, |
1743 | 0, AC_VERB_GET_PIN_WIDGET_CONTROL, 0x00); | 1765 | 0, AC_VERB_GET_PIN_WIDGET_CONTROL, 0x00); |
1744 | 1766 | ||
1767 | if (pin_ctl & AC_PINCTL_IN_EN) { | ||
1768 | /* | ||
1769 | * we need to check the current set-up direction of | ||
1770 | * shared input pins since they can be switched via | ||
1771 | * "xxx as Output" mixer switch | ||
1772 | */ | ||
1773 | struct sigmatel_spec *spec = codec->spec; | ||
1774 | struct auto_pin_cfg *cfg = &spec->autocfg; | ||
1775 | if ((nid == cfg->input_pins[AUTO_PIN_LINE] && | ||
1776 | spec->line_switch) || | ||
1777 | (nid == cfg->input_pins[AUTO_PIN_MIC] && | ||
1778 | spec->mic_switch)) | ||
1779 | return; | ||
1780 | } | ||
1781 | |||
1745 | /* if setting pin direction bits, clear the current | 1782 | /* if setting pin direction bits, clear the current |
1746 | direction bits first */ | 1783 | direction bits first */ |
1747 | if (flag & (AC_PINCTL_IN_EN | AC_PINCTL_OUT_EN)) | 1784 | if (flag & (AC_PINCTL_IN_EN | AC_PINCTL_OUT_EN)) |
@@ -1911,7 +1948,8 @@ static int patch_stac925x(struct hda_codec *codec) | |||
1911 | stac925x_cfg_tbl); | 1948 | stac925x_cfg_tbl); |
1912 | again: | 1949 | again: |
1913 | if (spec->board_config < 0) { | 1950 | if (spec->board_config < 0) { |
1914 | snd_printdd(KERN_INFO "hda_codec: Unknown model for STAC925x, using BIOS defaults\n"); | 1951 | snd_printdd(KERN_INFO "hda_codec: Unknown model for STAC925x," |
1952 | "using BIOS defaults\n"); | ||
1915 | err = stac92xx_save_bios_config_regs(codec); | 1953 | err = stac92xx_save_bios_config_regs(codec); |
1916 | if (err < 0) { | 1954 | if (err < 0) { |
1917 | stac92xx_free(codec); | 1955 | stac92xx_free(codec); |
@@ -1929,7 +1967,18 @@ static int patch_stac925x(struct hda_codec *codec) | |||
1929 | spec->adc_nids = stac925x_adc_nids; | 1967 | spec->adc_nids = stac925x_adc_nids; |
1930 | spec->mux_nids = stac925x_mux_nids; | 1968 | spec->mux_nids = stac925x_mux_nids; |
1931 | spec->num_muxes = 1; | 1969 | spec->num_muxes = 1; |
1932 | spec->num_dmics = 0; | 1970 | switch (codec->vendor_id) { |
1971 | case 0x83847632: /* STAC9202 */ | ||
1972 | case 0x83847633: /* STAC9202D */ | ||
1973 | case 0x83847636: /* STAC9251 */ | ||
1974 | case 0x83847637: /* STAC9251D */ | ||
1975 | spec->num_dmics = 1; | ||
1976 | spec->dmic_nids = stac925x_dmic_nids; | ||
1977 | break; | ||
1978 | default: | ||
1979 | spec->num_dmics = 0; | ||
1980 | break; | ||
1981 | } | ||
1933 | 1982 | ||
1934 | spec->init = stac925x_core_init; | 1983 | spec->init = stac925x_core_init; |
1935 | spec->mixer = stac925x_mixer; | 1984 | spec->mixer = stac925x_mixer; |
@@ -2110,6 +2159,13 @@ static int patch_stac927x(struct hda_codec *codec) | |||
2110 | 2159 | ||
2111 | codec->patch_ops = stac92xx_patch_ops; | 2160 | codec->patch_ops = stac92xx_patch_ops; |
2112 | 2161 | ||
2162 | /* Fix Mux capture level; max to 2 */ | ||
2163 | snd_hda_override_amp_caps(codec, 0x12, HDA_OUTPUT, | ||
2164 | (0 << AC_AMPCAP_OFFSET_SHIFT) | | ||
2165 | (2 << AC_AMPCAP_NUM_STEPS_SHIFT) | | ||
2166 | (0x27 << AC_AMPCAP_STEP_SIZE_SHIFT) | | ||
2167 | (0 << AC_AMPCAP_MUTE_SHIFT)); | ||
2168 | |||
2113 | return 0; | 2169 | return 0; |
2114 | } | 2170 | } |
2115 | 2171 | ||
diff --git a/sound/soc/s3c24xx/s3c24xx-pcm.c b/sound/soc/s3c24xx/s3c24xx-pcm.c index 21dc6974d6a3..bfbdc3cbd43b 100644 --- a/sound/soc/s3c24xx/s3c24xx-pcm.c +++ b/sound/soc/s3c24xx/s3c24xx-pcm.c | |||
@@ -337,6 +337,8 @@ static int s3c24xx_pcm_open(struct snd_pcm_substream *substream) | |||
337 | if (prtd == NULL) | 337 | if (prtd == NULL) |
338 | return -ENOMEM; | 338 | return -ENOMEM; |
339 | 339 | ||
340 | spin_lock_init(&prtd->lock); | ||
341 | |||
340 | runtime->private_data = prtd; | 342 | runtime->private_data = prtd; |
341 | return 0; | 343 | return 0; |
342 | } | 344 | } |